summaryrefslogtreecommitdiff
path: root/schist_desktop_gui/src/gui/components
diff options
context:
space:
mode:
authorJoe Carstairs <me@joeac.net>2025-08-25 16:35:45 +0000
committerjoeac <me@joeac.net>2025-08-25 16:35:45 +0000
commitfe85652e4d3e8906824baddaafd05d19105579b8 (patch)
tree31b56e31cbf289a34ec1d6707becf3c60933b56f /schist_desktop_gui/src/gui/components
parentd082a30de6a0cbd1fbe2ab5a4316db0891004129 (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')
-rw-r--r--schist_desktop_gui/src/gui/components/balances_view/view_balances_view.rs3
-rw-r--r--schist_desktop_gui/src/gui/components/balances_view/view_group_names.rs40
-rw-r--r--schist_desktop_gui/src/gui/components/bucket_name_and_balance.rs11
-rw-r--r--schist_desktop_gui/src/gui/components/buckets_view.rs4
-rw-r--r--schist_desktop_gui/src/gui/components/button.rs21
-rw-r--r--schist_desktop_gui/src/gui/components/text.rs94
-rw-r--r--schist_desktop_gui/src/gui/components/transactions_view.rs4
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![
Container::new(navigation).width(Length::FillPortion(1)),
Container::new(main_content).width(Length::FillPortion(3)),
@@ -113,6 +113,6 @@ fn make_greeting(account_name: Text) -> String {
fn view_account_names(accounts: Vec<Account>) -> Vec<Text> {
accounts
.iter()
- .map(|acc| Text::new(acc.name.clone()))
+ .map(|acc| Text::new(acc.name.as_str()))
.collect()
}