From a4be8f4fa967f87ce8f724cf7449b69ee7200a5b Mon Sep 17 00:00:00 2001 From: Erik Kundt Date: Thu, 25 May 2023 11:29:15 +0200 Subject: [PATCH] tui: Consolidate widgets and components --- radicle-tui/src/app/event.rs | 14 +- radicle-tui/src/ui.rs | 1 - radicle-tui/src/ui/cob/patch.rs | 2 +- radicle-tui/src/ui/components.rs | 3 - radicle-tui/src/ui/components/common.rs | 55 -------- radicle-tui/src/ui/components/home.rs | 83 ------------ radicle-tui/src/ui/components/patch.rs | 118 ---------------- radicle-tui/src/ui/widget/common.rs | 65 +++++++-- .../common/container.rs | 3 +- .../{components => widget}/common/context.rs | 3 +- .../ui/{components => widget}/common/label.rs | 0 .../ui/{components => widget}/common/list.rs | 2 +- radicle-tui/src/ui/widget/home.rs | 89 +++++++++++- radicle-tui/src/ui/widget/patch.rs | 127 +++++++++++++++++- 14 files changed, 274 insertions(+), 291 deletions(-) delete mode 100644 radicle-tui/src/ui/components.rs delete mode 100644 radicle-tui/src/ui/components/common.rs delete mode 100644 radicle-tui/src/ui/components/home.rs delete mode 100644 radicle-tui/src/ui/components/patch.rs rename radicle-tui/src/ui/{components => widget}/common/container.rs (99%) rename radicle-tui/src/ui/{components => widget}/common/context.rs (99%) rename radicle-tui/src/ui/{components => widget}/common/label.rs (100%) rename radicle-tui/src/ui/{components => widget}/common/list.rs (99%) diff --git a/radicle-tui/src/app/event.rs b/radicle-tui/src/app/event.rs index 5bcd188f..3239341a 100644 --- a/radicle-tui/src/app/event.rs +++ b/radicle-tui/src/app/event.rs @@ -4,12 +4,14 @@ use tuirealm::command::{Cmd, CmdResult, Direction as MoveDirection}; use tuirealm::event::{Event, Key, KeyEvent}; use tuirealm::{MockComponent, NoUserEvent, State, StateValue}; -use radicle_tui::ui::components::common::container::{GlobalListener, LabeledContainer, Tabs}; -use radicle_tui::ui::components::common::context::{ContextBar, Shortcuts}; -use radicle_tui::ui::components::common::list::PropertyList; -use radicle_tui::ui::components::common::Browser; -use radicle_tui::ui::components::home::{Dashboard, IssueBrowser}; -use radicle_tui::ui::components::patch; +use radicle_tui::ui::widget::common::container::{GlobalListener, LabeledContainer, Tabs}; +use radicle_tui::ui::widget::common::context::{ContextBar, Shortcuts}; + +use radicle_tui::ui::widget::common::list::PropertyList; + +use radicle_tui::ui::widget::common::Browser; +use radicle_tui::ui::widget::home::{Dashboard, IssueBrowser}; +use radicle_tui::ui::widget::patch; use radicle_tui::ui::widget::Widget; diff --git a/radicle-tui/src/ui.rs b/radicle-tui/src/ui.rs index 10b9f833..f0ed1024 100644 --- a/radicle-tui/src/ui.rs +++ b/radicle-tui/src/ui.rs @@ -1,5 +1,4 @@ pub mod cob; -pub mod components; pub mod ext; pub mod layout; pub mod state; diff --git a/radicle-tui/src/ui/cob/patch.rs b/radicle-tui/src/ui/cob/patch.rs index c9c348e9..3b0d342c 100644 --- a/radicle-tui/src/ui/cob/patch.rs +++ b/radicle-tui/src/ui/cob/patch.rs @@ -7,8 +7,8 @@ use radicle::cob::patch::{Patch, PatchId}; use tuirealm::props::{Color, TextSpan}; -use crate::ui::components::common::list::List; use crate::ui::theme::Theme; +use crate::ui::widget::common::list::List; pub fn format_status(_patch: &Patch) -> String { String::from(" ⏺ ") diff --git a/radicle-tui/src/ui/components.rs b/radicle-tui/src/ui/components.rs deleted file mode 100644 index 433f9306..00000000 --- a/radicle-tui/src/ui/components.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod common; -pub mod home; -pub mod patch; diff --git a/radicle-tui/src/ui/components/common.rs b/radicle-tui/src/ui/components/common.rs deleted file mode 100644 index 9f45ee5b..00000000 --- a/radicle-tui/src/ui/components/common.rs +++ /dev/null @@ -1,55 +0,0 @@ -pub mod container; -pub mod context; -pub mod label; -pub mod list; - -use std::marker::PhantomData; - -use tuirealm::command::{Cmd, CmdResult}; -use tuirealm::props::Props; -use tuirealm::tui::layout::Rect; -use tuirealm::{AttrValue, Attribute, Frame, MockComponent, State}; - -use crate::ui::layout; -use crate::ui::widget::{Widget, WidgetComponent}; - -use context::Shortcuts; -use list::{List, Table}; - -pub struct Browser { - list: Widget, - shortcuts: Widget, - phantom: PhantomData, -} - -impl Browser { - pub fn new(list: Widget
, shortcuts: Widget) -> Self { - Self { - list, - shortcuts, - phantom: PhantomData, - } - } -} - -impl WidgetComponent for Browser { - fn view(&mut self, _properties: &Props, frame: &mut Frame, area: Rect) { - let shortcuts_h = self - .shortcuts - .query(Attribute::Height) - .unwrap_or(AttrValue::Size(0)) - .unwrap_size(); - let layout = layout::root_component(area, shortcuts_h); - - self.list.view(frame, layout[0]); - self.shortcuts.view(frame, layout[1]); - } - - fn state(&self) -> State { - State::None - } - - fn perform(&mut self, _properties: &Props, cmd: Cmd) -> CmdResult { - self.list.perform(cmd) - } -} diff --git a/radicle-tui/src/ui/components/home.rs b/radicle-tui/src/ui/components/home.rs deleted file mode 100644 index a35b96c8..00000000 --- a/radicle-tui/src/ui/components/home.rs +++ /dev/null @@ -1,83 +0,0 @@ -use tuirealm::command::{Cmd, CmdResult}; -use tuirealm::props::Props; -use tuirealm::tui::layout::Rect; -use tuirealm::{AttrValue, Attribute, Frame, MockComponent, State}; - -use crate::ui::layout; -use crate::ui::widget::{Widget, WidgetComponent}; - -use super::common::container::LabeledContainer; -use super::common::context::Shortcuts; -use super::common::label::Label; - -pub struct Dashboard { - about: Widget, - shortcuts: Widget, -} - -impl Dashboard { - pub fn new(about: Widget, shortcuts: Widget) -> Self { - Self { about, shortcuts } - } -} - -impl WidgetComponent for Dashboard { - fn view(&mut self, _properties: &Props, frame: &mut Frame, area: Rect) { - let shortcuts_h = self - .shortcuts - .query(Attribute::Height) - .unwrap_or(AttrValue::Size(0)) - .unwrap_size(); - let layout = layout::root_component(area, shortcuts_h); - - self.about.view(frame, layout[0]); - self.shortcuts.view(frame, layout[1]); - } - - fn state(&self) -> State { - State::None - } - - fn perform(&mut self, _properties: &Props, _cmd: Cmd) -> CmdResult { - CmdResult::None - } -} - -pub struct IssueBrowser { - label: Widget
, + shortcuts: Widget, + phantom: PhantomData, +} + +impl Browser { + pub fn new(list: Widget
, shortcuts: Widget) -> Self { + Self { + list, + shortcuts, + phantom: PhantomData, + } + } +} + +impl WidgetComponent for Browser { + fn view(&mut self, _properties: &Props, frame: &mut Frame, area: Rect) { + let shortcuts_h = self + .shortcuts + .query(Attribute::Height) + .unwrap_or(AttrValue::Size(0)) + .unwrap_size(); + let layout = layout::root_component(area, shortcuts_h); + + self.list.view(frame, layout[0]); + self.shortcuts.view(frame, layout[1]); + } + + fn state(&self) -> State { + State::None + } + + fn perform(&mut self, _properties: &Props, cmd: Cmd) -> CmdResult { + self.list.perform(cmd) + } +} pub fn global_listener() -> Widget { Widget::new(GlobalListener::default()) diff --git a/radicle-tui/src/ui/components/common/container.rs b/radicle-tui/src/ui/widget/common/container.rs similarity index 99% rename from radicle-tui/src/ui/components/common/container.rs rename to radicle-tui/src/ui/widget/common/container.rs index 5087b90c..16653fd3 100644 --- a/radicle-tui/src/ui/components/common/container.rs +++ b/radicle-tui/src/ui/widget/common/container.rs @@ -7,12 +7,13 @@ use tuirealm::tui::layout::{Constraint, Direction, Layout, Rect}; use tuirealm::tui::widgets::{Block, Cell, Row}; use tuirealm::{Frame, MockComponent, State, StateValue}; -use crate::ui::components::common::label::Label; use crate::ui::ext::HeaderBlock; use crate::ui::layout; use crate::ui::state::TabState; use crate::ui::widget::{Widget, WidgetComponent}; +use super::label::Label; + /// Some user events need to be handled globally (e.g. user presses key `q` to quit /// the application). This component can be used in conjunction with SubEventClause /// to handle those events. diff --git a/radicle-tui/src/ui/components/common/context.rs b/radicle-tui/src/ui/widget/common/context.rs similarity index 99% rename from radicle-tui/src/ui/components/common/context.rs rename to radicle-tui/src/ui/widget/common/context.rs index 9325e1ab..8f01a356 100644 --- a/radicle-tui/src/ui/components/common/context.rs +++ b/radicle-tui/src/ui/widget/common/context.rs @@ -3,7 +3,8 @@ use tuirealm::props::{AttrValue, Attribute, Props}; use tuirealm::tui::layout::Rect; use tuirealm::{Frame, MockComponent, State}; -use crate::ui::components::common::label::Label; +use super::label::Label; + use crate::ui::layout; use crate::ui::widget::{Widget, WidgetComponent}; diff --git a/radicle-tui/src/ui/components/common/label.rs b/radicle-tui/src/ui/widget/common/label.rs similarity index 100% rename from radicle-tui/src/ui/components/common/label.rs rename to radicle-tui/src/ui/widget/common/label.rs diff --git a/radicle-tui/src/ui/components/common/list.rs b/radicle-tui/src/ui/widget/common/list.rs similarity index 99% rename from radicle-tui/src/ui/components/common/list.rs rename to radicle-tui/src/ui/widget/common/list.rs index 54ccc48a..9e1d9138 100644 --- a/radicle-tui/src/ui/components/common/list.rs +++ b/radicle-tui/src/ui/widget/common/list.rs @@ -8,12 +8,12 @@ use tuirealm::tui::layout::{Constraint, Direction, Layout, Rect}; use tuirealm::tui::widgets::{Block, Cell, Row, TableState}; use tuirealm::{Frame, MockComponent, State, StateValue}; -use crate::ui::components::common::label::Label; use crate::ui::layout; use crate::ui::theme::Theme; use crate::ui::widget::{Widget, WidgetComponent}; use super::container::Header; +use super::label::Label; pub trait List { fn row(&self, theme: &Theme, profile: &Profile) -> Vec; diff --git a/radicle-tui/src/ui/widget/home.rs b/radicle-tui/src/ui/widget/home.rs index f2628061..1f6b5d98 100644 --- a/radicle-tui/src/ui/widget/home.rs +++ b/radicle-tui/src/ui/widget/home.rs @@ -1,13 +1,92 @@ use radicle::cob::patch::{Patch, PatchId}; -use radicle::identity::{Id, Project}; use radicle::Profile; -use crate::ui::components::common::container::Tabs; -use crate::ui::components::common::Browser; -use crate::ui::components::home::{Dashboard, IssueBrowser}; +use radicle::prelude::{Id, Project}; +use tuirealm::command::{Cmd, CmdResult}; +use tuirealm::tui::layout::Rect; +use tuirealm::{AttrValue, Attribute, Frame, MockComponent, Props, State}; + +use super::{Widget, WidgetComponent}; + +use super::common::container::{LabeledContainer, Tabs}; +use super::common::context::Shortcuts; +use super::common::label::Label; +use super::common::{self, Browser}; + +use crate::ui::layout; use crate::ui::theme::Theme; -use super::{common, Widget}; +pub struct Dashboard { + about: Widget, + shortcuts: Widget, +} + +impl Dashboard { + pub fn new(about: Widget, shortcuts: Widget) -> Self { + Self { about, shortcuts } + } +} + +impl WidgetComponent for Dashboard { + fn view(&mut self, _properties: &Props, frame: &mut Frame, area: Rect) { + let shortcuts_h = self + .shortcuts + .query(Attribute::Height) + .unwrap_or(AttrValue::Size(0)) + .unwrap_size(); + let layout = layout::root_component(area, shortcuts_h); + + self.about.view(frame, layout[0]); + self.shortcuts.view(frame, layout[1]); + } + + fn state(&self) -> State { + State::None + } + + fn perform(&mut self, _properties: &Props, _cmd: Cmd) -> CmdResult { + CmdResult::None + } +} + +pub struct IssueBrowser { + label: Widget