From 52222939ae0e732c96b530287a99db79efe59411 Mon Sep 17 00:00:00 2001 From: Erik Kundt Date: Tue, 4 Apr 2023 14:44:57 +0200 Subject: [PATCH] tui: Introduce subscription module Signed-off-by: Erik Kundt --- radicle-tui/src/app.rs | 35 +++++++++-------------------------- radicle-tui/src/lib.rs | 1 + radicle-tui/src/subs.rs | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 26 deletions(-) create mode 100644 radicle-tui/src/subs.rs diff --git a/radicle-tui/src/app.rs b/radicle-tui/src/app.rs index 96f155bf..d7ead958 100644 --- a/radicle-tui/src/app.rs +++ b/radicle-tui/src/app.rs @@ -5,13 +5,10 @@ use anyhow::Result; use tui_realm_stdlib::Phantom; use tuirealm::application::PollStrategy; use tuirealm::command::{Cmd, CmdResult, Direction as MoveDirection}; -use tuirealm::event::{Event, Key, KeyEvent, KeyModifiers}; +use tuirealm::event::{Event, Key, KeyEvent}; use tuirealm::props::{AttrValue, Attribute}; use tuirealm::tui::layout::{Constraint, Direction, Layout}; -use tuirealm::{ - Application, Component, Frame, MockComponent, NoUserEvent, State, StateValue, Sub, SubClause, - SubEventClause, -}; +use tuirealm::{Application, Component, Frame, MockComponent, NoUserEvent, State, StateValue}; use radicle_tui::cob::patch::{self}; @@ -23,6 +20,8 @@ use radicle_tui::ui::components::workspace::Browser; use radicle_tui::ui::theme; use radicle_tui::ui::widget::Widget; +use radicle_tui::subs; + use radicle_tui::Tui; use radicle::cob::patch::{Patch, PatchId}; @@ -83,6 +82,8 @@ impl Tui for App { let issue_browser = Box::::default(); let patch_browser = ui::patch_browser(&theme, &self.patches, &self.profile).to_boxed(); + let global_listener = ui::global_listener().to_boxed(); + let shortcuts = ui::shortcuts( &theme, vec![ @@ -95,19 +96,7 @@ impl Tui for App { app.mount( ComponentId::Navigation, navigation, - vec![Sub::new( - SubEventClause::Keyboard(KeyEvent { - code: Key::Tab, - modifiers: KeyModifiers::NONE, - }), - SubClause::and( - SubClause::IsMounted(ComponentId::Dashboard), - SubClause::and( - SubClause::IsMounted(ComponentId::IssueBrowser), - SubClause::IsMounted(ComponentId::PatchBrowser), - ), - ), - )], + vec![subs::navigation()], )?; app.mount(ComponentId::Dashboard, dashboard, vec![])?; @@ -119,14 +108,8 @@ impl Tui for App { // Add global key listener and subscribe to key events app.mount( ComponentId::GlobalListener, - ui::global_listener().to_boxed(), - vec![Sub::new( - SubEventClause::Keyboard(KeyEvent { - code: Key::Char('q'), - modifiers: KeyModifiers::NONE, - }), - SubClause::Always, - )], + global_listener, + vec![subs::global()], )?; // We need to give focus to a component then diff --git a/radicle-tui/src/lib.rs b/radicle-tui/src/lib.rs index e0042a22..73b5a1af 100644 --- a/radicle-tui/src/lib.rs +++ b/radicle-tui/src/lib.rs @@ -8,6 +8,7 @@ use tuirealm::Frame; use tuirealm::{Application, EventListenerCfg, NoUserEvent}; pub mod cob; +pub mod subs; pub mod ui; /// Trait that must be implemented by client applications in order to be run diff --git a/radicle-tui/src/subs.rs b/radicle-tui/src/subs.rs new file mode 100644 index 00000000..bdc6e65a --- /dev/null +++ b/radicle-tui/src/subs.rs @@ -0,0 +1,32 @@ +use std::hash::Hash; + +use tuirealm::event::{Key, KeyEvent, KeyModifiers}; +use tuirealm::{Sub, SubClause, SubEventClause}; + +pub fn navigation() -> Sub +where + Id: Clone + Hash + Eq + PartialEq, + UserEvent: Clone + Eq + PartialEq + PartialOrd, +{ + Sub::new( + SubEventClause::Keyboard(KeyEvent { + code: Key::Tab, + modifiers: KeyModifiers::NONE, + }), + SubClause::Always, + ) +} + +pub fn global() -> Sub +where + Id: Clone + Hash + Eq + PartialEq, + UserEvent: Clone + Eq + PartialEq + PartialOrd, +{ + Sub::new( + SubEventClause::Keyboard(KeyEvent { + code: Key::Char('q'), + modifiers: KeyModifiers::NONE, + }), + SubClause::Always, + ) +}