Skip to main content

gitwig/components/
mod.rs

1//! Stateless UI widgets package module declaration.
2
3#![allow(dead_code, unused_imports)]
4pub mod cmd_bar;
5use crossterm::event::Event;
6use ratatui::Frame;
7use ratatui::layout::Rect;
8use std::io::Result;
9
10pub enum EventState {
11    Consumed,
12    NotConsumed,
13}
14
15impl EventState {
16    pub fn is_consumed(&self) -> bool {
17        matches!(self, Self::Consumed)
18    }
19}
20
21pub enum CommandBlocking {
22    Blocking,
23    PassingOn,
24}
25
26pub trait DrawableComponent {
27    fn draw(&self, f: &mut Frame, rect: Rect) -> Result<()>;
28}
29
30pub trait Component: DrawableComponent {
31    fn event(
32        &mut self,
33        ev: &Event,
34        keys: &crate::keybindings::KeybindingsConfig,
35    ) -> Result<EventState>;
36    // fn commands(&self, out: &mut Vec<CommandInfo>, force_all: bool) -> CommandBlocking;
37    fn focused(&self) -> bool {
38        false
39    }
40    fn focus(&mut self, _focus: bool) {}
41    fn is_visible(&self) -> bool {
42        true
43    }
44    fn hide(&mut self) {}
45    fn show(&mut self) -> Result<()> {
46        Ok(())
47    }
48}
49
50pub mod branch_list;
51pub mod commit_list;
52pub mod diff;
53pub mod file_tree;
54pub mod forge_list;
55pub mod forge_pr_list;
56pub mod reflog_list;
57pub mod stash_list;
58pub mod status_list;
59pub mod submodule_list;
60pub mod tag_list;
61pub mod worktree_list;
62
63#[cfg(test)]
64mod tests {
65    use super::*;
66
67    struct DummyComponent;
68    impl DrawableComponent for DummyComponent {
69        fn draw(&self, _f: &mut Frame, _rect: Rect) -> Result<()> {
70            Ok(())
71        }
72    }
73    impl Component for DummyComponent {
74        fn event(
75            &mut self,
76            _ev: &Event,
77            _keys: &crate::keybindings::KeybindingsConfig,
78        ) -> Result<EventState> {
79            Ok(EventState::NotConsumed)
80        }
81    }
82
83    #[test]
84    fn test_component_defaults() {
85        let mut c = DummyComponent;
86        assert!(!c.focused());
87        c.focus(true);
88        assert!(c.is_visible());
89        c.hide();
90        assert!(c.show().is_ok());
91
92        assert!(EventState::Consumed.is_consumed());
93        assert!(!EventState::NotConsumed.is_consumed());
94    }
95}