summaryrefslogtreecommitdiff
path: root/schist_desktop_gui/src/gui
diff options
context:
space:
mode:
authorJoe Carstairs <me@joeac.net>2026-02-01 21:14:37 +0000
committerJoe Carstairs <me@joeac.net>2026-02-01 21:14:37 +0000
commit8f7b89bf656b046269a0a40baa3df670b886d5e6 (patch)
tree5bc8ad5d387a81927df036b8254de5d47788210d /schist_desktop_gui/src/gui
parent7623882a24e5e72d10109fe549f241bde6a31274 (diff)
BucketsView expands and collapses groups
Diffstat (limited to 'schist_desktop_gui/src/gui')
-rw-r--r--schist_desktop_gui/src/gui/components/buckets_view.rs55
-rw-r--r--schist_desktop_gui/src/gui/screens/main_screen/main_screen.rs38
2 files changed, 92 insertions, 1 deletions
diff --git a/schist_desktop_gui/src/gui/components/buckets_view.rs b/schist_desktop_gui/src/gui/components/buckets_view.rs
index b908fb3..8cbaa22 100644
--- a/schist_desktop_gui/src/gui/components/buckets_view.rs
+++ b/schist_desktop_gui/src/gui/components/buckets_view.rs
@@ -3,10 +3,14 @@ use iced::{
widget::{column, row, Container},
Length,
};
+use itertools::Itertools;
use schist_models::Bucket;
use crate::{
- gui::components::{navigation, BucketNavigationEntry, Navigation, Text},
+ gui::components::{
+ navigation::{self, InsertOptionResult},
+ BucketNavigationEntry, Navigation, Text,
+ },
style::SPACING_LG,
traits::{Component, Viewable},
};
@@ -23,6 +27,8 @@ pub enum Message {
SelectNext,
SelectPrev,
SetBuckets(Vec<Bucket>),
+ ExpandGroup(String, Vec<Bucket>),
+ CollapseGroup(String),
}
pub enum Action {
@@ -122,6 +128,53 @@ impl<'a> Component<'a, Message, Action> for BucketsView {
}
navigation::Action::None => Action::None,
},
+
+ Message::ExpandGroup(group, buckets) => {
+ match self.navigation.insert_after_first(
+ |bucket_navigation_entry| {
+ bucket_navigation_entry.is_group_and(|bucket_group_name| {
+ !bucket_group_name.is_open && bucket_group_name.group.eq(group.as_str())
+ })
+ },
+ &buckets
+ .iter()
+ .map(BucketNavigationEntry::from_bucket)
+ .collect(),
+ ) {
+ InsertOptionResult::InsertedOptions => {
+ self.navigation.replace_first(
+ |bucket_navigation_entry| {
+ bucket_navigation_entry.is_group_and(|g| {
+ println!(
+ "{} = {}? {}",
+ g.group,
+ group.as_str(),
+ g.group.eq(group.as_str())
+ );
+ g.group.eq(group.as_str())
+ })
+ },
+ &vec![BucketNavigationEntry::from_group_open(&group)],
+ );
+ Action::None
+ }
+ InsertOptionResult::NoSuchOption => Action::None,
+ }
+ }
+
+ Message::CollapseGroup(group) => {
+ self.navigation
+ .remove_options_where(|bucket_navigation_entry| {
+ bucket_navigation_entry.is_bucket_and(|bucket| bucket.group.eq(&group))
+ });
+ self.navigation.replace_first(
+ |bucket_navigation_entry| {
+ bucket_navigation_entry.is_group_and(|g| g.group.eq(&group))
+ },
+ &vec![BucketNavigationEntry::from_group_closed(&group)],
+ );
+ Action::None
+ }
}
}
}
diff --git a/schist_desktop_gui/src/gui/screens/main_screen/main_screen.rs b/schist_desktop_gui/src/gui/screens/main_screen/main_screen.rs
index 6347914..cddec32 100644
--- a/schist_desktop_gui/src/gui/screens/main_screen/main_screen.rs
+++ b/schist_desktop_gui/src/gui/screens/main_screen/main_screen.rs
@@ -28,6 +28,8 @@ pub struct MainScreen {
pub enum Message {
BalancesViewMessage(balances_view::Message),
BucketsViewMessage(buckets_view::Message),
+ ExpandItem,
+ CollapseItem,
NextItem,
PrevItem,
TransactionsViewMessage(transactions_view::Message),
@@ -148,6 +150,42 @@ impl<'a> Component<'a, Message, Action> for MainScreen {
Action::None
}
},
+
+ Message::ExpandItem => match self.active_view {
+ View::Balances => Action::None,
+ View::Buckets => match self.buckets_view.active_group() {
+ Some(active_group) => {
+ match self.buckets_view.update(buckets_view::Message::ExpandGroup(
+ active_group.clone(),
+ self.buckets
+ .iter()
+ .filter(|bucket| bucket.group.eq(&active_group))
+ .cloned()
+ .collect(),
+ )) {
+ buckets_view::Action::None => Action::None,
+ }
+ }
+ None => Action::None,
+ },
+ View::Transactions => Action::None,
+ },
+
+ Message::CollapseItem => match self.active_view {
+ View::Balances => Action::None,
+ View::Buckets => match self.buckets_view.active_group() {
+ Some(active_group) => {
+ match self
+ .buckets_view
+ .update(buckets_view::Message::CollapseGroup(active_group))
+ {
+ buckets_view::Action::None => Action::None,
+ }
+ }
+ None => Action::None,
+ },
+ View::Transactions => Action::None,
+ },
}
}
}