diff options
| author | Joe Carstairs <me@joeac.net> | 2025-08-25 16:35:45 +0000 |
|---|---|---|
| committer | joeac <me@joeac.net> | 2025-08-25 16:35:45 +0000 |
| commit | fe85652e4d3e8906824baddaafd05d19105579b8 (patch) | |
| tree | 31b56e31cbf289a34ec1d6707becf3c60933b56f /schist_desktop_gui/src/gui/components | |
| parent | d082a30de6a0cbd1fbe2ab5a4316db0891004129 (diff) | |
task-072
Co-authored-by: Joe Carstairs <jcarstairs@scottlogic.com>
Reviewed-on: https://git.joeac.net/joeac/schist/pulls/3
Co-authored-by: Joe Carstairs <me@joeac.net>
Co-committed-by: Joe Carstairs <me@joeac.net>
Diffstat (limited to 'schist_desktop_gui/src/gui/components')
7 files changed, 137 insertions, 40 deletions
diff --git a/schist_desktop_gui/src/gui/components/balances_view/view_balances_view.rs b/schist_desktop_gui/src/gui/components/balances_view/view_balances_view.rs index e8a1e46..6a64508 100644 --- a/schist_desktop_gui/src/gui/components/balances_view/view_balances_view.rs +++ b/schist_desktop_gui/src/gui/components/balances_view/view_balances_view.rs @@ -1,6 +1,7 @@ use iced::widget::{column, row, Container}; use iced::{alignment, Element, Length}; +use crate::gui::components::Text; use crate::gui::components::{balances_view::Message, BalancesView}; use crate::style::SPACING_LG; use crate::traits::Viewable; @@ -10,7 +11,7 @@ pub fn view_balances_view<'a>(balances_view: &'a BalancesView) -> Element<'a, Me .navigation .view() .map(Message::NavigationMessage); - let main_content = column![iced::widget::text(balances_view.greeting.clone())]; + let main_content = column![Text::default(&balances_view.greeting).as_element()]; row![ Container::new(navigation).width(Length::FillPortion(1)), Container::new(main_content).width(Length::FillPortion(3)), diff --git a/schist_desktop_gui/src/gui/components/balances_view/view_group_names.rs b/schist_desktop_gui/src/gui/components/balances_view/view_group_names.rs index 271e76c..18ddf0b 100644 --- a/schist_desktop_gui/src/gui/components/balances_view/view_group_names.rs +++ b/schist_desktop_gui/src/gui/components/balances_view/view_group_names.rs @@ -6,7 +6,7 @@ use crate::gui::components::Text; pub fn view_group_names(buckets: Vec<Bucket>) -> Vec<Text> { buckets .iter() - .map(|b| b.group.clone()) + .map(|b| b.group.as_str()) .unique() .map(Text::new) .collect() @@ -96,23 +96,23 @@ mod test { ]; let group_names = view_group_names(buckets); assert_eq!(17, group_names.len()); - assert_eq!(group_names[0], Text::new(String::from("hydrogen"))); - assert_eq!(group_names[1], Text::new(String::from("helium"))); - assert_eq!(group_names[2], Text::new(String::from("lithium"))); - assert_eq!(group_names[3], Text::new(String::from("beryllium"))); - assert_eq!(group_names[4], Text::new(String::from("boron"))); - assert_eq!(group_names[5], Text::new(String::from("carbon"))); - assert_eq!(group_names[6], Text::new(String::from("nitrogen"))); - assert_eq!(group_names[7], Text::new(String::from("oxygen"))); - assert_eq!(group_names[8], Text::new(String::from("flourine"))); - assert_eq!(group_names[9], Text::new(String::from("neon"))); - assert_eq!(group_names[10], Text::new(String::from("magnesium"))); - assert_eq!(group_names[11], Text::new(String::from("aluminium"))); - assert_eq!(group_names[12], Text::new(String::from("silicon"))); - assert_eq!(group_names[13], Text::new(String::from("phosphorus"))); - assert_eq!(group_names[14], Text::new(String::from("sulphur"))); - assert_eq!(group_names[15], Text::new(String::from("chlorine"))); - assert_eq!(group_names[16], Text::new(String::from("argon"))); + assert_eq!(group_names[0], Text::new("hydrogen")); + assert_eq!(group_names[1], Text::new("helium")); + assert_eq!(group_names[2], Text::new("lithium")); + assert_eq!(group_names[3], Text::new("beryllium")); + assert_eq!(group_names[4], Text::new("boron")); + assert_eq!(group_names[5], Text::new("carbon")); + assert_eq!(group_names[6], Text::new("nitrogen")); + assert_eq!(group_names[7], Text::new("oxygen")); + assert_eq!(group_names[8], Text::new("flourine")); + assert_eq!(group_names[9], Text::new("neon")); + assert_eq!(group_names[10], Text::new("magnesium")); + assert_eq!(group_names[11], Text::new("aluminium")); + assert_eq!(group_names[12], Text::new("silicon")); + assert_eq!(group_names[13], Text::new("phosphorus")); + assert_eq!(group_names[14], Text::new("sulphur")); + assert_eq!(group_names[15], Text::new("chlorine")); + assert_eq!(group_names[16], Text::new("argon")); } #[test] @@ -134,8 +134,8 @@ mod test { let group_names = view_group_names(buckets); assert_eq!( vec![ - Text::new(String::from("hydrogen")), - Text::new(String::from("helium")), + Text::new("hydrogen"), + Text::new("helium"), ], group_names ); diff --git a/schist_desktop_gui/src/gui/components/bucket_name_and_balance.rs b/schist_desktop_gui/src/gui/components/bucket_name_and_balance.rs index db3fc2e..24a3952 100644 --- a/schist_desktop_gui/src/gui/components/bucket_name_and_balance.rs +++ b/schist_desktop_gui/src/gui/components/bucket_name_and_balance.rs @@ -1,10 +1,7 @@ -use iced::{ - widget::{row, text}, - Element, -}; +use iced::{widget::row, Element}; use schist_models::Bucket; -use crate::gui::components::navigation; +use crate::gui::components::{navigation, Text}; #[derive(Clone, Debug, PartialEq)] pub struct BucketNameAndBalance { @@ -20,8 +17,8 @@ impl BucketNameAndBalance { impl<'a> Into<Element<'a, navigation::Message<BucketNameAndBalance>>> for BucketNameAndBalance { fn into(self) -> Element<'a, navigation::Message<BucketNameAndBalance>> { row![ - text(self.bucket.name.clone()), - text(self.bucket.balance.unwrap_or(0)) + Text::new(&self.bucket.name).as_element(), + Text::new(&self.bucket.balance.unwrap_or(0).to_string()).as_element(), ] .into() } diff --git a/schist_desktop_gui/src/gui/components/buckets_view.rs b/schist_desktop_gui/src/gui/components/buckets_view.rs index bb4dbb4..e513a35 100644 --- a/schist_desktop_gui/src/gui/components/buckets_view.rs +++ b/schist_desktop_gui/src/gui/components/buckets_view.rs @@ -6,7 +6,7 @@ use iced::{ use schist_models::Bucket; use crate::{ - gui::components::{navigation, BucketNameAndBalance, Navigation}, + gui::components::{navigation, BucketNameAndBalance, Navigation, Text}, style::SPACING_LG, traits::{Component, Viewable}, }; @@ -53,7 +53,7 @@ impl<'a> Viewable<'a, Message> for BucketsView { Message: 'a, { let navigation = self.navigation.view().map(Message::NavigationMessage); - let main_content = column![iced::widget::text(self.greeting.clone())]; + let main_content = column![Text::default(&self.greeting).as_element()]; row![ Container::new(navigation).width(Length::FillPortion(1)), Container::new(main_content).width(Length::FillPortion(3)), diff --git a/schist_desktop_gui/src/gui/components/button.rs b/schist_desktop_gui/src/gui/components/button.rs index bc9e5f9..e071f33 100644 --- a/schist_desktop_gui/src/gui/components/button.rs +++ b/schist_desktop_gui/src/gui/components/button.rs @@ -1,5 +1,7 @@ use iced::{widget::Button, Element}; +use crate::style::*; + pub fn active_button<'a, Content: Into<Element<'a, Message>>, Message>( content: Content, ) -> Button<'a, Message> { @@ -22,3 +24,22 @@ pub fn inactive_button<'a, Content: Into<Element<'a, Message>>, Message>( .on_press(on_press) .width(iced::Length::Fill) } + +pub fn panel_button<'a, Content: Into<Element<'a, Message>>, Message>( + content: Content, + on_press: Message, +) -> Button<'a, Message> { + iced::widget::button(content) + .on_press(on_press) + .style(|theme: &iced::Theme, _status| iced::widget::button::Style { + background: None, + border: iced::Border { + color: theme.extended_palette().primary.base.text, + radius: iced::border::Radius::new(0), + width: 2.0, + }, + ..Default::default() + }) + .width(iced::Length::Fill) + .padding(iced::Padding::new(SPACING_MD.into())) +} diff --git a/schist_desktop_gui/src/gui/components/text.rs b/schist_desktop_gui/src/gui/components/text.rs index d334de3..90cd7bc 100644 --- a/schist_desktop_gui/src/gui/components/text.rs +++ b/schist_desktop_gui/src/gui/components/text.rs @@ -1,22 +1,100 @@ -use iced::Element; - -use crate::gui::components::navigation; +use crate::style::*; #[derive(Clone, Debug, PartialEq)] pub struct Text { pub content: String, + colour: Option<Colour>, + size: Option<Size>, + strength: Option<Strength>, +} + +#[derive(Clone, Debug, PartialEq)] +enum Colour { + Danger, + Primary, +} + +#[derive(Clone, Debug, PartialEq)] +enum Strength { + Base, + Weak, +} + +#[derive(Clone, Debug, PartialEq)] +enum Size { + Small, + Base, } impl Text { - pub fn new(group_name: String) -> Self { + pub fn default(content: &str) -> Self { + Self { + content: String::from(content), + colour: Some(Colour::Primary), + size: Some(Size::Base), + strength: Some(Strength::Base), + } + } + + pub fn new(content: &str) -> Self { + Self { + content: String::from(content), + colour: None, + size: None, + strength: None, + } + } + + pub fn as_element<'a, Message>(self) -> iced::Element<'a, Message> { + <Self as Into<iced::Element<'a, Message>>>::into(self) + } + + pub fn small(&self) -> Self { + Self { + size: Some(Size::Small), + ..self.clone() + } + } + + pub fn danger(&self) -> Self { + Self { + colour: Some(Colour::Danger), + ..self.clone() + } + } + + pub fn weak(&self) -> Self { Self { - content: group_name.clone(), + strength: Some(Strength::Weak), + ..self.clone() } } } -impl<'a> Into<Element<'a, navigation::Message<Text>>> for Text { - fn into(self) -> Element<'a, navigation::Message<Text>> { - iced::widget::text(self.content.clone()).into() +impl<'a, Message> Into<iced::Element<'a, Message>> for Text { + fn into(self) -> iced::Element<'a, Message> { + iced::widget::text(self.content.clone()) + .size(match self.size { + Some(Size::Small) => TEXT_SIZE_SM, + Some(Size::Base) | None => TEXT_SIZE_BASE, + }) + .style(move |theme: &iced::Theme| iced::widget::text::Style { + color: match (&self.colour, &self.strength) { + (Some(Colour::Danger), Some(Strength::Base) | None) => { + Some(theme.extended_palette().danger.base.text) + } + (Some(Colour::Danger), Some(Strength::Weak)) => { + Some(theme.extended_palette().danger.weak.text) + } + (Some(Colour::Primary), Some(Strength::Base) | None) => { + Some(theme.extended_palette().primary.base.text) + } + (Some(Colour::Primary), Some(Strength::Weak)) => { + Some(theme.extended_palette().primary.weak.text) + } + (None, _) => None, + }, + }) + .into() } } diff --git a/schist_desktop_gui/src/gui/components/transactions_view.rs b/schist_desktop_gui/src/gui/components/transactions_view.rs index 88532a9..1956d38 100644 --- a/schist_desktop_gui/src/gui/components/transactions_view.rs +++ b/schist_desktop_gui/src/gui/components/transactions_view.rs @@ -45,7 +45,7 @@ impl TransactionsView { impl<'a> Viewable<'a, Message> for TransactionsView { fn view(&'a self) -> Element<'a, Message> { let navigation = self.navigation.view().map(Message::NavigationMessage); - let main_content = column![iced::widget::text(self.greeting.clone())]; + let main_content = column![Text::default(&self.greeting).as_element()]; row