tui: Fix incorrect component focus

Signed-off-by: Erik Kundt <erik@zirkular.io>
This commit is contained in:
Erik Kundt 2023-04-03 17:07:27 +02:00
parent a0695005f5
commit 594b63197c
2 changed files with 53 additions and 42 deletions

View File

@ -4,12 +4,12 @@ use anyhow::Result;
use tui_realm_stdlib::Phantom;
use tuirealm::application::PollStrategy;
use tuirealm::command::{Cmd, Direction as MoveDirection};
use tuirealm::command::{Cmd, CmdResult, Direction as MoveDirection};
use tuirealm::event::{Event, Key, KeyEvent, KeyModifiers};
use tuirealm::props::{AttrValue, Attribute};
use tuirealm::tui::layout::{Constraint, Direction, Layout};
use tuirealm::{
Application, Component, Frame, MockComponent, NoUserEvent, StateValue, Sub, SubClause,
Application, Component, Frame, MockComponent, NoUserEvent, State, StateValue, Sub, SubClause,
SubEventClause,
};
@ -32,6 +32,7 @@ use radicle::profile::Profile;
/// Messages handled by this application.
#[derive(Debug, Eq, PartialEq)]
pub enum Message {
NavigationChanged(u16),
Quit,
}
@ -52,6 +53,7 @@ pub struct App {
id: Id,
project: Project,
patches: Vec<(PatchId, Patch)>,
active: ComponentId,
quit: bool,
}
@ -65,6 +67,7 @@ impl App {
profile,
project,
patches,
active: ComponentId::Dashboard,
quit: false,
}
}
@ -89,30 +92,27 @@ impl Tui<ComponentId, Message> for App {
)
.to_boxed();
app.mount(ComponentId::Navigation, navigation, vec![])?;
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),
),
),
)],
)?;
app.mount(ComponentId::Dashboard, dashboard, vec![])?;
app.mount(ComponentId::IssueBrowser, issue_browser, vec![])?;
app.mount(
ComponentId::PatchBrowser,
patch_browser,
vec![
Sub::new(
SubEventClause::Keyboard(KeyEvent {
code: Key::Up,
modifiers: KeyModifiers::NONE,
}),
SubClause::Always,
),
Sub::new(
SubEventClause::Keyboard(KeyEvent {
code: Key::Down,
modifiers: KeyModifiers::NONE,
}),
SubClause::Always,
),
],
)?;
app.mount(ComponentId::PatchBrowser, patch_browser, vec![])?;
app.mount(ComponentId::Shortcuts, shortcuts, vec![])?;
@ -130,7 +130,7 @@ impl Tui<ComponentId, Message> for App {
)?;
// We need to give focus to a component then
app.active(&ComponentId::Navigation)?;
app.active(&ComponentId::Dashboard)?;
Ok(())
}
@ -168,31 +168,34 @@ impl Tui<ComponentId, Message> for App {
)
.split(area);
let workspace = app
.state(&ComponentId::Navigation)
.unwrap_or(tuirealm::State::One(StateValue::U16(0)))
.unwrap_one();
let component = match workspace {
StateValue::U16(0) => ComponentId::Dashboard,
StateValue::U16(1) => ComponentId::IssueBrowser,
StateValue::U16(2) => ComponentId::PatchBrowser,
_ => ComponentId::Dashboard,
};
app.view(&ComponentId::Navigation, frame, layout[0]);
app.view(&component, frame, layout[1]);
app.view(&self.active, frame, layout[1]);
app.view(&ComponentId::Shortcuts, frame, layout[2]);
}
fn update(&mut self, app: &mut Application<ComponentId, Message, NoUserEvent>, interval: u64) {
fn update(
&mut self,
app: &mut Application<ComponentId, Message, NoUserEvent>,
interval: u64,
) -> Result<()> {
if let Ok(messages) = app.tick(PollStrategy::TryFor(Duration::from_millis(interval))) {
for message in messages {
match message {
Message::NavigationChanged(index) => {
self.active = match index {
0 => ComponentId::Dashboard,
1 => ComponentId::IssueBrowser,
2 => ComponentId::PatchBrowser,
_ => ComponentId::Dashboard,
};
app.active(&self.active)?;
}
Message::Quit => self.quit = true,
}
}
}
Ok(())
}
fn quit(&self) -> bool {
@ -219,8 +222,12 @@ impl Component<Message, NoUserEvent> for Widget<Tabs> {
fn on(&mut self, event: Event<NoUserEvent>) -> Option<Message> {
match event {
Event::Keyboard(KeyEvent { code: Key::Tab, .. }) => {
self.perform(Cmd::Move(MoveDirection::Right));
None
match self.perform(Cmd::Move(MoveDirection::Right)) {
CmdResult::Changed(State::One(StateValue::U16(index))) => {
Some(Message::NavigationChanged(index))
}
_ => None,
}
}
_ => None,
}

View File

@ -25,7 +25,11 @@ where
fn init(&mut self, app: &mut Application<Id, Message, NoUserEvent>) -> Result<()>;
/// Should update the current state by handling a message from the view.
fn update(&mut self, app: &mut Application<Id, Message, NoUserEvent>, interval: u64);
fn update(
&mut self,
app: &mut Application<Id, Message, NoUserEvent>,
interval: u64,
) -> Result<()>;
/// Should draw the application to a frame.
fn view(&mut self, app: &mut Application<Id, Message, NoUserEvent>, frame: &mut Frame);
@ -77,7 +81,7 @@ impl Window {
tui.init(&mut app)?;
while !tui.quit() {
tui.update(&mut app, interval);
tui.update(&mut app, interval)?;
self.terminal.raw_mut().draw(|frame| {
tui.view(&mut app, frame);