Skip to content

Commit 6bcdee4

Browse files
author
Stephan Dilly
committed
more clean update messaging
1 parent c190787 commit 6bcdee4

File tree

9 files changed

+95
-107
lines changed

9 files changed

+95
-107
lines changed

src/app.rs

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,10 @@ use crate::{
22
components::{
33
ChangesComponent, CommandBlocking, CommandInfo,
44
CommitComponent, Component, DiffComponent, DrawableComponent,
5-
EventUpdate, HelpComponent, MsgComponent, NeedsUpdate,
6-
ResetComponent,
5+
HelpComponent, MsgComponent, ResetComponent,
76
},
87
keys,
9-
queue::{InternalEvent, Queue},
8+
queue::{InternalEvent, NeedsUpdate, Queue},
109
strings,
1110
};
1211
use asyncgit::{
@@ -163,17 +162,9 @@ impl App {
163162

164163
let mut flags = NeedsUpdate::empty();
165164

166-
if let Some(e) =
167-
Self::event_pump(ev, self.components_mut().as_mut_slice())
165+
if Self::event_pump(ev, self.components_mut().as_mut_slice())
168166
{
169-
match e {
170-
EventUpdate::All => flags.insert(NeedsUpdate::ALL),
171-
EventUpdate::Commands => {
172-
flags.insert(NeedsUpdate::COMMANDS)
173-
}
174-
EventUpdate::Diff => flags.insert(NeedsUpdate::DIFF),
175-
_ => (),
176-
}
167+
flags.insert(NeedsUpdate::COMMANDS);
177168
} else if let Event::Key(k) = ev {
178169
let new_flags = match k {
179170
keys::EXIT_1 | keys::EXIT_2 => {
@@ -202,12 +193,12 @@ impl App {
202193

203194
if flags.contains(NeedsUpdate::ALL) {
204195
self.update();
205-
} else {
206-
if flags.contains(NeedsUpdate::DIFF) {
207-
self.update_diff();
208-
} else if flags.contains(NeedsUpdate::COMMANDS) {
209-
self.update_commands();
210-
}
196+
}
197+
if flags.contains(NeedsUpdate::DIFF) {
198+
self.update_diff();
199+
}
200+
if flags.contains(NeedsUpdate::COMMANDS) {
201+
self.update_commands();
211202
}
212203
}
213204

@@ -334,6 +325,7 @@ impl App {
334325
self.msg.show_msg(msg);
335326
flags.insert(NeedsUpdate::ALL);
336327
}
328+
InternalEvent::Update(u) => flags.insert(*u),
337329
};
338330

339331
flags
@@ -432,14 +424,14 @@ impl App {
432424
fn event_pump(
433425
ev: Event,
434426
components: &mut [&mut dyn Component],
435-
) -> Option<EventUpdate> {
427+
) -> bool {
436428
for c in components {
437-
if let Some(u) = c.event(ev) {
438-
return Some(u);
429+
if c.event(ev) {
430+
return true;
439431
}
440432
}
441433

442-
None
434+
false
443435
}
444436

445437
fn any_popup_visible(&self) -> bool {

src/components/changes.rs

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
use super::{CommandBlocking, DrawableComponent, EventUpdate};
1+
use super::{CommandBlocking, DrawableComponent};
22
use crate::{
33
components::{CommandInfo, Component},
44
keys,
5-
queue::{InternalEvent, Queue},
5+
queue::{InternalEvent, NeedsUpdate, Queue},
66
strings, ui,
77
};
88
use asyncgit::{hash, sync, StatusItem, StatusItemType, CWD};
@@ -86,7 +86,7 @@ impl ChangesComponent {
8686
self.items.is_empty()
8787
}
8888

89-
fn move_selection(&mut self, delta: i32) {
89+
fn move_selection(&mut self, delta: i32) -> bool {
9090
let items_len = self.items.len();
9191
if items_len > 0 {
9292
if let Some(i) = self.selection {
@@ -97,11 +97,18 @@ impl ChangesComponent {
9797

9898
if let Ok(i) = usize::try_from(i) {
9999
self.selection = Some(i);
100+
self.queue.borrow_mut().push_back(
101+
InternalEvent::Update(
102+
NeedsUpdate::DIFF,
103+
),
104+
);
105+
return true;
100106
}
101107
}
102108
}
103109
}
104110
}
111+
false
105112
}
106113

107114
fn index_add_remove(&mut self) -> bool {
@@ -210,40 +217,32 @@ impl Component for ChangesComponent {
210217
CommandBlocking::PassingOn
211218
}
212219

213-
fn event(&mut self, ev: Event) -> Option<EventUpdate> {
220+
fn event(&mut self, ev: Event) -> bool {
214221
if self.focused {
215222
if let Event::Key(e) = ev {
216223
return match e {
217224
keys::STATUS_STAGE_FILE => {
218225
if self.index_add_remove() {
219-
Some(EventUpdate::All)
220-
} else {
221-
Some(EventUpdate::None)
226+
self.queue.borrow_mut().push_back(
227+
InternalEvent::Update(
228+
NeedsUpdate::ALL,
229+
),
230+
);
222231
}
232+
true
223233
}
224234
keys::STATUS_RESET_FILE => {
225-
if self.is_working_dir
235+
self.is_working_dir
226236
&& self.dispatch_reset_workdir()
227-
{
228-
Some(EventUpdate::None)
229-
} else {
230-
None
231-
}
232-
}
233-
keys::MOVE_DOWN => {
234-
self.move_selection(1);
235-
Some(EventUpdate::Diff)
236237
}
237-
keys::MOVE_UP => {
238-
self.move_selection(-1);
239-
Some(EventUpdate::Diff)
240-
}
241-
_ => None,
238+
keys::MOVE_DOWN => self.move_selection(1),
239+
keys::MOVE_UP => self.move_selection(-1),
240+
_ => false,
242241
};
243242
}
244243
}
245244

246-
None
245+
false
247246
}
248247

249248
fn focused(&self) -> bool {

src/components/commit.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
use super::{
22
visibility_blocking, CommandBlocking, CommandInfo, Component,
3-
DrawableComponent, EventUpdate,
3+
DrawableComponent,
44
};
55
use crate::{
66
keys,
7-
queue::{InternalEvent, Queue},
7+
queue::{InternalEvent, NeedsUpdate, Queue},
88
strings, ui,
99
};
1010
use asyncgit::{sync, CWD};
@@ -78,38 +78,35 @@ impl Component for CommitComponent {
7878
visibility_blocking(self)
7979
}
8080

81-
fn event(&mut self, ev: Event) -> Option<EventUpdate> {
81+
fn event(&mut self, ev: Event) -> bool {
8282
if self.visible {
8383
if let Event::Key(e) = ev {
84-
return Some(match e.code {
84+
match e.code {
8585
KeyCode::Esc => {
8686
self.hide();
87-
EventUpdate::Commands
8887
}
8988
KeyCode::Char(c) => {
9089
self.msg.push(c);
91-
EventUpdate::Commands
9290
}
9391
KeyCode::Enter if self.can_commit() => {
9492
self.commit();
95-
EventUpdate::All
9693
}
9794
KeyCode::Backspace if !self.msg.is_empty() => {
9895
self.msg.pop().unwrap();
99-
EventUpdate::Commands
10096
}
101-
_ => EventUpdate::None,
102-
});
97+
_ => (),
98+
};
99+
return true;
103100
}
104101
} else if let Event::Key(e) = ev {
105102
if let keys::OPEN_COMMIT = e {
106103
if !self.stage_empty {
107104
self.show();
108-
return Some(EventUpdate::All);
105+
return true;
109106
}
110107
}
111108
}
112-
None
109+
false
113110
}
114111

115112
fn is_visible(&self) -> bool {
@@ -162,8 +159,11 @@ impl CommitComponent {
162159
}
163160

164161
self.msg.clear();
165-
166162
self.hide();
163+
164+
self.queue
165+
.borrow_mut()
166+
.push_back(InternalEvent::Update(NeedsUpdate::ALL));
167167
}
168168

169169
fn can_commit(&self) -> bool {

src/components/diff.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use super::{CommandBlocking, DrawableComponent, EventUpdate};
1+
use super::{CommandBlocking, DrawableComponent};
22
use crate::{
33
components::{CommandInfo, Component},
44
queue::{InternalEvent, Queue},
@@ -337,28 +337,28 @@ impl Component for DiffComponent {
337337
CommandBlocking::PassingOn
338338
}
339339

340-
fn event(&mut self, ev: Event) -> Option<EventUpdate> {
340+
fn event(&mut self, ev: Event) -> bool {
341341
if self.focused {
342342
if let Event::Key(e) = ev {
343343
return match e.code {
344344
KeyCode::Down => {
345345
self.scroll(true);
346-
Some(EventUpdate::None)
346+
true
347347
}
348348
KeyCode::Up => {
349349
self.scroll(false);
350-
Some(EventUpdate::None)
350+
true
351351
}
352352
KeyCode::Enter => {
353353
self.add_hunk();
354-
Some(EventUpdate::None)
354+
true
355355
}
356-
_ => None,
356+
_ => false,
357357
};
358358
}
359359
}
360360

361-
None
361+
false
362362
}
363363

364364
fn focused(&self) -> bool {

src/components/help.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use super::{
22
visibility_blocking, CommandBlocking, CommandInfo, Component,
3-
DrawableComponent, EventUpdate,
3+
DrawableComponent,
44
};
55
use crate::{keys, strings, ui, version::Version};
66
use asyncgit::hash;
@@ -111,7 +111,7 @@ impl Component for HelpComponent {
111111
visibility_blocking(self)
112112
}
113113

114-
fn event(&mut self, ev: Event) -> Option<EventUpdate> {
114+
fn event(&mut self, ev: Event) -> bool {
115115
if self.visible {
116116
if let Event::Key(e) = ev {
117117
match e {
@@ -122,12 +122,12 @@ impl Component for HelpComponent {
122122
}
123123
}
124124

125-
Some(EventUpdate::Commands)
125+
true
126126
} else if let Event::Key(keys::OPEN_HELP) = ev {
127127
self.show();
128-
Some(EventUpdate::Commands)
128+
true
129129
} else {
130-
None
130+
false
131131
}
132132
}
133133

src/components/mod.rs

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ mod diff;
88
mod help;
99
mod msg;
1010
mod reset;
11-
use bitflags::bitflags;
1211
pub use changes::ChangesComponent;
1312
pub use command::{CommandInfo, CommandText};
1413
pub use commit::CommitComponent;
@@ -17,26 +16,6 @@ pub use help::HelpComponent;
1716
pub use msg::MsgComponent;
1817
pub use reset::ResetComponent;
1918

20-
///
21-
pub enum EventUpdate {
22-
None,
23-
All,
24-
Diff,
25-
Commands,
26-
}
27-
28-
bitflags! {
29-
///
30-
pub struct NeedsUpdate: u32 {
31-
///
32-
const ALL = 0b001;
33-
///
34-
const DIFF = 0b010;
35-
///
36-
const COMMANDS = 0b100;
37-
}
38-
}
39-
4019
///
4120
#[derive(PartialEq)]
4221
pub enum CommandBlocking {
@@ -61,16 +40,18 @@ pub trait DrawableComponent {
6140
fn draw<B: Backend>(&self, f: &mut Frame<B>, rect: Rect);
6241
}
6342

64-
///
43+
/// base component trait
6544
pub trait Component {
6645
///
6746
fn commands(
6847
&self,
6948
out: &mut Vec<CommandInfo>,
7049
force_all: bool,
7150
) -> CommandBlocking;
72-
///
73-
fn event(&mut self, ev: Event) -> Option<EventUpdate>;
51+
52+
/// returns true if event propagation needs to end (event was consumed)
53+
fn event(&mut self, ev: Event) -> bool;
54+
7455
///
7556
fn focused(&self) -> bool {
7657
false

0 commit comments

Comments
 (0)