From 8f7b89bf656b046269a0a40baa3df670b886d5e6 Mon Sep 17 00:00:00 2001 From: Joe Carstairs Date: Sun, 1 Feb 2026 21:14:37 +0000 Subject: BucketsView expands and collapses groups --- .../src/gui/components/buckets_view.rs | 55 +++++++++++++++++++++- .../src/gui/screens/main_screen/main_screen.rs | 38 +++++++++++++++ 2 files changed, 92 insertions(+), 1 deletion(-) 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), + ExpandGroup(String, Vec), + 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, + }, } } } -- cgit v1.2.3