From 6ad4cbf4649ebfc7cfdaab4fba539701ea25556c Mon Sep 17 00:00:00 2001 From: ClementTsang Date: Fri, 24 Dec 2021 17:07:54 -0500 Subject: [PATCH] Add flex event handling --- src/app.rs | 16 ++++++---------- src/tuine/component/base/flex.rs | 17 ++++++++++++----- src/tuine/component/base/text_table.rs | 12 +++++------- 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/src/app.rs b/src/app.rs index ab328452..b8581381 100644 --- a/src/app.rs +++ b/src/app.rs @@ -132,7 +132,7 @@ pub enum AppMessages { KillProcess { to_kill: Vec }, ToggleFreeze, Clean, - Stop, + Quit, } pub struct AppState { @@ -203,10 +203,6 @@ impl AppState { // TODO: Redraw } } - - fn quit(&mut self) { - self.terminator.store(true, SeqCst); - } } impl Application for AppState { @@ -228,7 +224,7 @@ impl Application for AppState { self.data_collection .clean_data(constants::STALE_MAX_MILLISECONDS); } - AppMessages::Stop => { + AppMessages::Quit => { self.terminator.store(true, SeqCst); } } @@ -265,7 +261,7 @@ impl Application for AppState { } fn global_event_handler( - &mut self, event: crate::tuine::Event, _messages: &mut Vec, + &mut self, event: crate::tuine::Event, messages: &mut Vec, ) { use crate::tuine::Event; use crossterm::event::{KeyCode, KeyModifiers}; @@ -275,20 +271,20 @@ impl Application for AppState { if event.modifiers.is_empty() { match event.code { KeyCode::Char('q') | KeyCode::Char('Q') => { - self.quit(); + messages.push(AppMessages::Quit); } _ => {} } } else if let KeyModifiers::CONTROL = event.modifiers { match event.code { KeyCode::Char('c') | KeyCode::Char('C') => { - self.quit(); + messages.push(AppMessages::Quit); } _ => {} } } } - Event::Mouse(event) => {} + Event::Mouse(_event) => {} } } } diff --git a/src/tuine/component/base/flex.rs b/src/tuine/component/base/flex.rs index 043c5f3e..4fb0d505 100644 --- a/src/tuine/component/base/flex.rs +++ b/src/tuine/component/base/flex.rs @@ -95,18 +95,25 @@ impl<'a, Message> TmpComponent for Flex<'a, Message> { self.children .iter_mut() .zip(draw_ctx.children()) - .for_each(|(child, child_node)| { - if child_node.should_draw() { - child.draw(state_ctx, child_node, frame); + .for_each(|(child, child_draw_ctx)| { + if child_draw_ctx.should_draw() { + child.draw(state_ctx, child_draw_ctx, frame); } }); } fn on_event( - &mut self, _state_ctx: &mut StateContext<'_>, _draw_ctx: DrawContext<'_>, event: Event, + &mut self, state_ctx: &mut StateContext<'_>, draw_ctx: DrawContext<'_>, event: Event, messages: &mut Vec, ) -> Status { - // FIXME: On event for flex + for (child, child_draw_ctx) in self.children.iter_mut().zip(draw_ctx.children()) { + match child.on_event(state_ctx, child_draw_ctx, event, messages) { + Status::Captured => { + return Status::Captured; + } + Status::Ignored => {} + } + } Status::Ignored } diff --git a/src/tuine/component/base/text_table.rs b/src/tuine/component/base/text_table.rs index 60464b84..91f7e8f6 100644 --- a/src/tuine/component/base/text_table.rs +++ b/src/tuine/component/base/text_table.rs @@ -30,7 +30,6 @@ pub struct StyleSheet { /// A sortable, scrollable table for text data. pub struct TextTable<'a, Message> { key: Key, - state: TextTableState, column_widths: Vec, columns: Vec, show_gap: bool, @@ -48,7 +47,6 @@ impl<'a, Message> TextTable<'a, Message> { pub fn new>>(ctx: &mut ViewContext<'_>, columns: Vec) -> Self { Self { key: ctx.register_component(Location::caller()), - state: TextTableState::default(), column_widths: vec![0; columns.len()], columns: columns .into_iter() @@ -251,22 +249,22 @@ impl<'a, Message> TmpComponent for TextTable<'a, Message> { todo!() } else if y > self.table_gap { let visual_index = usize::from(y - self.table_gap); - self.state.set_visual_index(visual_index) + state.set_visual_index(visual_index) } else { Status::Ignored } } MouseEventKind::ScrollDown => { - let status = self.state.move_down(1); + let status = state.move_down(1); if let Some(on_select) = &self.on_select { - messages.push(on_select(self.state.current_index())); + messages.push(on_select(state.current_index())); } status } MouseEventKind::ScrollUp => { - let status = self.state.move_up(1); + let status = state.move_up(1); if let Some(on_select) = &self.on_select { - messages.push(on_select(self.state.current_index())); + messages.push(on_select(state.current_index())); } status }