Radish alpha
r
Radicle terminal user interface
Radicle
Git (anonymous pull)
Log in to clone via SSH
Message processing can return more messages
Erik Kundt committed 2 years ago
commit 930f27792a4379a889baa55943c741d96d436e4d
parent 0ba4b81347a2ae7cf072bfd4493dfecc21571335
2 files changed +44 -27
modified src/app.rs
@@ -151,6 +151,40 @@ impl App {
            ))
        }
    }
+

+
    fn process(
+
        &mut self,
+
        app: &mut Application<Cid, Message, NoUserEvent>,
+
        message: Message,
+
    ) -> Result<Option<Message>> {
+
        let theme = theme::default_dark();
+
        match message {
+
            Message::Issue(IssueMessage::Show(id)) => {
+
                self.view_issue(app, id, &theme)?;
+
                Ok(None)
+
            }
+
            Message::Issue(IssueMessage::Leave) => {
+
                self.pages.pop(app)?;
+
                Ok(None)
+
            }
+
            Message::Patch(PatchMessage::Show(id)) => {
+
                self.view_patch(app, id, &theme)?;
+
                Ok(None)
+
            }
+
            Message::Patch(PatchMessage::Leave) => {
+
                self.pages.pop(app)?;
+
                Ok(None)
+
            }
+
            Message::Quit => {
+
                self.quit = true;
+
                Ok(None)
+
            }
+
            _ => self
+
                .pages
+
                .peek_mut()?
+
                .update(app, &self.context, &theme, message),
+
        }
+
    }
}

impl Tui<Cid, Message> for App {
@@ -173,27 +207,10 @@ impl Tui<Cid, Message> for App {
    fn update(&mut self, app: &mut Application<Cid, Message, NoUserEvent>) -> Result<bool> {
        match app.tick(PollStrategy::Once) {
            Ok(messages) if !messages.is_empty() => {
-
                let theme = theme::default_dark();
                for message in messages {
-
                    match message {
-
                        Message::Issue(IssueMessage::Show(id)) => {
-
                            self.view_issue(app, id, &theme)?;
-
                        }
-
                        Message::Issue(IssueMessage::Leave) => {
-
                            self.pages.pop(app)?;
-
                        }
-
                        Message::Patch(PatchMessage::Show(id)) => {
-
                            self.view_patch(app, id, &theme)?;
-
                        }
-
                        Message::Patch(PatchMessage::Leave) => {
-
                            self.pages.pop(app)?;
-
                        }
-
                        Message::Quit => self.quit = true,
-
                        _ => {
-
                            self.pages
-
                                .peek_mut()?
-
                                .update(app, &self.context, &theme, message)?;
-
                        }
+
                    let mut msg = Some(message);
+
                    while msg.is_some() {
+
                        msg = self.process(app, msg.unwrap())?;
                    }
                }
                Ok(true)
modified src/app/page.rs
@@ -40,7 +40,7 @@ pub trait ViewPage {
        context: &Context,
        theme: &Theme,
        message: Message,
-
    ) -> Result<()>;
+
    ) -> Result<Option<Message>>;

    /// Will be called whenever a view page is on top of the page stack and needs to be rendered.
    fn view(&mut self, app: &mut Application<Cid, Message, NoUserEvent>, frame: &mut Frame);
@@ -108,13 +108,13 @@ impl ViewPage for HomeView {
        _context: &Context,
        _theme: &Theme,
        message: Message,
-
    ) -> Result<()> {
+
    ) -> Result<Option<Message>> {
        if let Message::NavigationChanged(index) = message {
            self.active_component = Cid::Home(HomeCid::from(index as usize));
            app.active(&self.active_component)?;
        }

-
        Ok(())
+
        Ok(None)
    }

    fn view(&mut self, app: &mut Application<Cid, Message, NoUserEvent>, frame: &mut Frame) {
@@ -201,7 +201,7 @@ impl ViewPage for IssuePage {
        context: &Context,
        theme: &Theme,
        message: Message,
-
    ) -> Result<()> {
+
    ) -> Result<Option<Message>> {
        match message {
            Message::Issue(IssueMessage::Changed(id)) => {
                let repo = context.repository();
@@ -216,7 +216,7 @@ impl ViewPage for IssuePage {
            _ => {}
        }

-
        Ok(())
+
        Ok(None)
    }

    fn view(&mut self, app: &mut Application<Cid, Message, NoUserEvent>, frame: &mut Frame) {
@@ -292,13 +292,13 @@ impl ViewPage for PatchView {
        _context: &Context,
        _theme: &Theme,
        message: Message,
-
    ) -> Result<()> {
+
    ) -> Result<Option<Message>> {
        if let Message::NavigationChanged(index) = message {
            self.active_component = Cid::Patch(PatchCid::from(index as usize));
        }
        app.active(&self.active_component)?;

-
        Ok(())
+
        Ok(None)
    }

    fn view(&mut self, app: &mut Application<Cid, Message, NoUserEvent>, frame: &mut Frame) {