1#![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 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}