}
}
+#[derive(Debug, PartialEq, Eq, Clone, Copy)]
+enum FollowRequestResponse {
+ Accept,
+ Reject,
+ Undecided,
+}
+
struct OtherUserOptionsMenu {
title: FileHeader,
normal_status: FileStatusLineFinal,
cl_follow: CyclingMenuLine<bool>,
cl_boosts: CyclingMenuLine<Boosts>,
el_languages: EditableMenuLine<LanguageVector>,
+ cl_follow_request: Option<CyclingMenuLine<FollowRequestResponse>>,
cl_block: CyclingMenuLine<bool>,
cl_mute: CyclingMenuLine<bool>,
id: String,
),
);
+ let cl_follow_request = if rel.requested_by {
+ Some(CyclingMenuLine::new(
+ Pr('R'),
+ ColouredString::plain(
+ "Approve user's request to follow you: ",
+ ),
+ &[
+ (
+ FollowRequestResponse::Undecided,
+ ColouredString::plain("no action"),
+ ),
+ (
+ FollowRequestResponse::Accept,
+ ColouredString::uniform("accept", 'f'),
+ ),
+ (
+ FollowRequestResponse::Reject,
+ ColouredString::uniform("reject", 'r'),
+ ),
+ ],
+ FollowRequestResponse::Undecided,
+ ))
+ } else {
+ None
+ };
+
let cl_block = CyclingMenuLine::new(
Ctrl('B'),
ColouredString::plain("Block this user: "),
cl_follow,
cl_boosts,
el_languages,
+ cl_follow_request,
cl_block,
cl_mute,
id: id.to_owned(),
self.cl_follow.check_widths(&mut lmaxwid, &mut rmaxwid);
self.cl_boosts.check_widths(&mut lmaxwid, &mut rmaxwid);
self.el_languages.check_widths(&mut lmaxwid, &mut rmaxwid);
+ self.cl_follow_request
+ .check_widths(&mut lmaxwid, &mut rmaxwid);
self.cl_block.check_widths(&mut lmaxwid, &mut rmaxwid);
self.cl_mute.check_widths(&mut lmaxwid, &mut rmaxwid);
self.cl_follow.reset_widths();
self.cl_boosts.reset_widths();
self.el_languages.reset_widths();
+ self.cl_follow_request.reset_widths();
self.cl_block.reset_widths();
self.cl_mute.reset_widths();
self.cl_follow.ensure_widths(lmaxwid, rmaxwid);
self.cl_boosts.ensure_widths(lmaxwid, rmaxwid);
self.el_languages.ensure_widths(lmaxwid, rmaxwid);
+ self.cl_follow_request.ensure_widths(lmaxwid, rmaxwid);
self.cl_block.ensure_widths(lmaxwid, rmaxwid);
self.cl_mute.ensure_widths(lmaxwid, rmaxwid);
}
}
+ if let Some(ref cl) = self.cl_follow_request {
+ let action = cl.get_value();
+ let result = match action {
+ FollowRequestResponse::Accept
+ | FollowRequestResponse::Reject => client
+ .respond_to_follow_request(
+ &self.id,
+ action == FollowRequestResponse::Accept,
+ ),
+ FollowRequestResponse::Undecided => Ok(()),
+ };
+ if result.is_err() {
+ return LogicalAction::Beep; // FIXME: report the error!
+ }
+ }
+
LogicalAction::Pop
}
}
lines.extend_from_slice(&self.cl_boosts.render(w));
lines.push(self.el_languages.render(w, &mut cursorpos, lines.len()));
lines.extend_from_slice(&BlankLine::render_static());
+ lines.extend_from_slice(&self.cl_follow_request.render(w));
lines.extend_from_slice(&self.cl_block.render(w));
lines.extend_from_slice(&self.cl_mute.render(w));
Pr('l') | Pr('L') => self.el_languages.start_editing(),
Ctrl('B') => self.cl_block.cycle(),
Ctrl('U') => self.cl_mute.cycle(),
+ Pr('r') | Pr('R') => {
+ if let Some(ref mut cl) = self.cl_follow_request {
+ cl.cycle()
+ } else {
+ LogicalAction::Nothing
+ }
+ }
_ => LogicalAction::Nothing,
}
}
fn ensure_widths(&mut self, lmaxwid: usize, rmaxwid: usize);
}
+impl<T: MenuKeypressLineGeneral> MenuKeypressLineGeneral for Option<T> {
+ fn check_widths(&self, lmaxwid: &mut usize, rmaxwid: &mut usize) {
+ if let Some(inner) = self {
+ inner.check_widths(lmaxwid, rmaxwid);
+ }
+ }
+ fn reset_widths(&mut self) {
+ if let Some(inner) = self {
+ inner.reset_widths();
+ }
+ }
+ fn ensure_widths(&mut self, lmaxwid: usize, rmaxwid: usize) {
+ if let Some(inner) = self {
+ inner.ensure_widths(lmaxwid, rmaxwid);
+ }
+ }
+}
+
impl MenuKeypressLine {
pub fn new(key: OurKey, description: ColouredString) -> Self {
// +2 for [] around the key name