1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
use super::{
make_balances_view_greeting::make_balances_view_greeting, view_group_names::view_group_names,
Action, BalancesView, Message,
};
use crate::{
gui::components::{navigation, Text},
traits::Component,
};
impl<'a> Component<'a, Message, Action> for BalancesView {
fn update(&mut self, message: Message) -> Action {
match message {
Message::NavigationMessage(message) => {
update_navigation(self, message);
Action::None
}
Message::SetBuckets(buckets) => {
set_buckets(self, buckets);
Action::None
}
Message::SelectNextBucket => {
select_next_bucket(self);
Action::None
}
Message::SelectPrevBucket => {
select_prev_bucket(self);
Action::None
}
}
}
}
fn select_prev_bucket(balances_view: &mut BalancesView) -> () {
match balances_view
.navigation
.update(navigation::Message::SelectPrev)
{
navigation::Action::ActivateOption(option) | navigation::Action::SelectOption(option) => {
balances_view.greeting = make_balances_view_greeting(Some(option));
}
navigation::Action::None => {}
};
}
fn select_next_bucket(balances_view: &mut BalancesView) -> () {
match balances_view
.navigation
.update(navigation::Message::SelectNext)
{
navigation::Action::ActivateOption(option) | navigation::Action::SelectOption(option) => {
balances_view.greeting = make_balances_view_greeting(Some(option));
}
navigation::Action::None => {}
};
}
fn set_buckets(balances_view: &mut BalancesView, buckets: Vec<schist_models::Bucket>) -> () {
balances_view.buckets = buckets.clone();
match balances_view
.navigation
.update(navigation::Message::SetOptions(view_group_names(buckets)))
{
navigation::Action::ActivateOption(option) | navigation::Action::SelectOption(option) => {
balances_view.greeting = make_balances_view_greeting(Some(option));
}
navigation::Action::None => {}
};
}
fn update_navigation(balances_view: &mut BalancesView, message: navigation::Message<Text>) -> () {
match balances_view.navigation.update(message) {
navigation::Action::ActivateOption(group_name)
| navigation::Action::SelectOption(group_name) => {
balances_view.greeting = make_balances_view_greeting(Some(group_name));
}
navigation::Action::None => {}
};
}
#[cfg(test)]
mod test {
use schist_fakes::bucket::make_fake_bucket_builder;
use crate::{
gui::components::{
balances_view::{BalancesView, Message},
navigation,
},
traits::Component,
};
#[test]
fn update_navigation_updates_greeting() {
let groceries = make_fake_bucket_builder(0)
.group(String::from("normal expenses"))
.build()
.unwrap();
let fragrance = make_fake_bucket_builder(1)
.group(String::from("luxuries"))
.build()
.unwrap();
let maps = make_fake_bucket_builder(2)
.group(String::from("outdoors"))
.build()
.unwrap();
let buckets = vec![groceries, fragrance.clone(), maps];
let mut balances_view = BalancesView::new(buckets);
assert_eq!("Hello, normal expenses balances!", balances_view.greeting);
balances_view.update(Message::NavigationMessage(navigation::Message::SelectPrev));
assert_eq!("Hello, normal expenses balances!", balances_view.greeting);
balances_view.update(Message::NavigationMessage(navigation::Message::SelectPrev));
assert_eq!("Hello, normal expenses balances!", balances_view.greeting);
balances_view.update(Message::NavigationMessage(navigation::Message::SelectNext));
assert_eq!("Hello, luxuries balances!", balances_view.greeting);
balances_view.update(Message::NavigationMessage(navigation::Message::SelectNext));
assert_eq!("Hello, outdoors balances!", balances_view.greeting);
balances_view.update(Message::NavigationMessage(navigation::Message::SelectNext));
assert_eq!("Hello, outdoors balances!", balances_view.greeting);
}
}
|