LoginMenu,
}
+#[derive(PartialEq, Eq, Debug, Clone, Hash)]
+pub enum ComposeActivity {
+ ComposeToplevel,
+ PostComposeMenu,
+ ComposeReply(String),
+ PostReplyMenu(String),
+}
+
#[derive(PartialEq, Eq, Debug, Clone, Hash)]
pub enum UtilityActivity {
UtilsMenu,
InfoStatus(String),
ListStatusFavouriters(String),
ListStatusBoosters(String),
- ComposeToplevel,
- PostComposeMenu,
- ComposeReply(String),
- PostReplyMenu(String),
UserOptions(String),
InstanceRules,
}
#[derive(PartialEq, Eq, Debug, Clone, Hash)]
pub enum Activity {
NonUtil(NonUtilityActivity),
+ Compose(ComposeActivity),
Util(UtilityActivity),
Overlay(OverlayActivity),
}
Activity::NonUtil(value)
}
}
+impl From<ComposeActivity> for Activity {
+ fn from(value: ComposeActivity) -> Self {
+ Activity::Compose(value)
+ }
+}
impl From<UtilityActivity> for Activity {
fn from(value: UtilityActivity) -> Self {
Activity::Util(value)
#[derive(PartialEq, Eq, Debug)]
pub struct ActivityStack {
nonutil: Vec<NonUtilityActivity>,
+ compose: Option<ComposeActivity>,
+ initial_compose: Option<ComposeActivity>,
util: Option<UtilityActivity>,
initial_util: Option<UtilityActivity>,
overlay: Option<OverlayActivity>,
// gets reinitialised, because that's the simplest way to jump
// you down to the new message.
match self {
- Activity::Util(UtilityActivity::ComposeToplevel)
- | Activity::Util(UtilityActivity::PostComposeMenu)
- | Activity::Util(UtilityActivity::ComposeReply(..))
- | Activity::Util(UtilityActivity::PostReplyMenu(..)) => false,
+ Activity::Compose(_) => false,
_ => true,
}
}
nonutil: vec![top],
util: None,
initial_util: None,
+ compose: None,
+ initial_compose: None,
overlay: None,
}
}
pub fn pop(&mut self) {
if self.util.is_some() {
self.util = None;
+ } else if self.compose.is_some() {
+ self.compose = None;
} else if self.nonutil.len() > 1 {
// never pop the topmost activity
self.nonutil.pop();
self.overlay = None;
self.util = Some(x);
}
+ Activity::Compose(x) => {
+ self.overlay = None;
+ self.util = None;
+ self.compose = Some(x);
+ }
Activity::NonUtil(NonUtilityActivity::MainMenu) => {
// Special case: going to the Main Menu replaces the
// topmost activity on the stack _even_ if it was not
pub fn top(&self) -> Activity {
match &self.util {
Some(x) => Activity::Util(x.clone()),
- _ => match self.nonutil.last() {
- Some(y) => Activity::NonUtil(y.clone()),
- _ => Activity::NonUtil(NonUtilityActivity::MainMenu),
+ _ => match &self.compose {
+ Some(x) => Activity::Compose(x.clone()),
+ _ => match self.nonutil.last() {
+ Some(y) => Activity::NonUtil(y.clone()),
+ _ => Activity::NonUtil(NonUtilityActivity::MainMenu),
+ },
},
}
}
.iter()
.cloned()
.map(Activity::NonUtil)
+ .chain(self.compose.iter().cloned().map(Activity::Compose))
+ .chain(self.initial_compose.iter().cloned().map(Activity::Compose))
.chain(self.util.iter().cloned().map(Activity::Util))
.chain(self.initial_util.iter().cloned().map(Activity::Util))
.chain(self.overlay.iter().cloned().map(Activity::Overlay))
nonutil: vec! {NonUtilityActivity::MainMenu},
util: None,
initial_util: None,
+ compose: None,
+ initial_compose: None,
overlay: None,
}
);
},
util: None,
initial_util: None,
+ compose: None,
+ initial_compose: None,
overlay: None,
}
);
},
util: None,
initial_util: None,
+ compose: None,
+ initial_compose: None,
overlay: None,
}
);
nonutil: vec! {NonUtilityActivity::MainMenu},
util: None,
initial_util: None,
+ compose: None,
+ initial_compose: None,
overlay: None,
}
);
},
util: None,
initial_util: None,
+ compose: None,
+ initial_compose: None,
overlay: None,
}
);
},
util: Some(UtilityActivity::UtilsMenu),
initial_util: None,
+ compose: None,
+ initial_compose: None,
overlay: None,
}
);
},
util: Some(UtilityActivity::ReadMentions),
initial_util: None,
+ compose: None,
+ initial_compose: None,
overlay: None,
}
);
},
util: None,
initial_util: None,
+ compose: None,
+ initial_compose: None,
overlay: None,
}
);
},
util: Some(UtilityActivity::ReadMentions),
initial_util: None,
+ compose: None,
+ initial_compose: None,
overlay: None,
}
);
},
util: None,
initial_util: None,
+ compose: None,
+ initial_compose: None,
overlay: None,
}
);
nonutil: vec! {NonUtilityActivity::MainMenu},
util: None,
initial_util: None,
+ compose: None,
+ initial_compose: None,
overlay: None,
}
);
nonutil: vec! {NonUtilityActivity::MainMenu},
util: None,
initial_util: None,
+ compose: None,
+ initial_compose: None,
overlay: None,
}
);
use std::rc::Rc;
use super::activity_stack::{
- NonUtilityActivity, OverlayActivity, UtilityActivity,
+ NonUtilityActivity, OverlayActivity, UtilityActivity, ComposeActivity,
};
use super::client::{
Boosts, Client, ClientError, FeedExtend, FeedId, Replies,
LogicalAction::Nothing
}
SelectionPurpose::Reply => LogicalAction::Goto(
- UtilityActivity::ComposeReply(id).into(),
+ ComposeActivity::ComposeReply(id).into(),
),
SelectionPurpose::Thread => LogicalAction::Goto(
NonUtilityActivity::ThreadFile(id, alt).into(),
LogicalAction::Error(_) => break PhysicalAction::Beep, // FIXME: Error Log
LogicalAction::PostComposed(post) => {
let newact = match self.activity_stack.top() {
- Activity::Util(UtilityActivity::ComposeToplevel) => {
- UtilityActivity::PostComposeMenu.into()
+ Activity::Compose(ComposeActivity::ComposeToplevel) => {
+ ComposeActivity::PostComposeMenu.into()
}
- Activity::Util(UtilityActivity::ComposeReply(id)) => {
- UtilityActivity::PostReplyMenu(id).into()
+ Activity::Compose(ComposeActivity::ComposeReply(id)) => {
+ ComposeActivity::PostReplyMenu(id).into()
}
act => panic!("can't postcompose {act:?}"),
};
}
LogicalAction::PostReEdit(post) => {
let newact = match self.activity_stack.top() {
- Activity::Util(UtilityActivity::PostComposeMenu) => {
- UtilityActivity::ComposeToplevel.into()
+ Activity::Compose(ComposeActivity::PostComposeMenu) => {
+ ComposeActivity::ComposeToplevel.into()
}
- Activity::Util(UtilityActivity::PostReplyMenu(id)) => {
- UtilityActivity::ComposeReply(id).into()
+ Activity::Compose(ComposeActivity::PostReplyMenu(id)) => {
+ ComposeActivity::ComposeReply(id).into()
}
act => panic!("can't reedit {act:?}"),
};
Activity::Util(UtilityActivity::InfoStatus(ref id)) => {
view_single_post(self.unfolded_posts.clone(), client, id)
}
- Activity::Util(UtilityActivity::ComposeToplevel) => (|| {
+ Activity::Compose(ComposeActivity::ComposeToplevel) => (|| {
let post = match post {
Some(post) => post,
None => Post::new(client)?,
compose_post(client, post)
})(
),
- Activity::Util(UtilityActivity::PostComposeMenu) => Ok(post_menu(
+ Activity::Compose(ComposeActivity::PostComposeMenu) => Ok(post_menu(
post.expect("how did we get here without a Post?"),
)),
- Activity::Util(UtilityActivity::ComposeReply(ref id)) => {
+ Activity::Compose(ComposeActivity::ComposeReply(ref id)) => {
let post = match post {
Some(post) => Ok(post),
None => Post::reply_to(id, client),
Err(e) => Err(e),
}
}
- Activity::Util(UtilityActivity::PostReplyMenu(_)) => Ok(
+ Activity::Compose(ComposeActivity::PostReplyMenu(_)) => Ok(
post_menu(post.expect("how did we get here without a Post?")),
),
Activity::NonUtil(NonUtilityActivity::ThreadFile(