Skip to content

Commit de5cedb

Browse files
author
Stephan Dilly
committed
new update flags system
1 parent c0f0883 commit de5cedb

File tree

4 files changed

+65
-19
lines changed

4 files changed

+65
-19
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ simplelog = { version = "0.7", default-features=false }
2727
dirs = "2.0"
2828
crossbeam-channel = "0.4"
2929
scopeguard = "1.1"
30+
bitflags = "1.2"
3031
backtrace = { version = "0.3" }
3132
scopetime = { path = "./scopetime", version = "0.1" }
3233
asyncgit = { path = "./asyncgit", version = "0.1" }

src/app.rs

Lines changed: 50 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ use crate::{
22
components::{
33
ChangesComponent, CommandBlocking, CommandInfo,
44
CommitComponent, Component, DiffComponent, DrawableComponent,
5-
EventUpdate, HelpComponent, MsgComponent, ResetComponent,
5+
EventUpdate, HelpComponent, MsgComponent, NeedsUpdate,
6+
ResetComponent,
67
},
78
keys,
89
queue::{InternalEvent, Queue},
@@ -160,18 +161,25 @@ impl App {
160161
pub fn event(&mut self, ev: Event) {
161162
trace!("event: {:?}", ev);
162163

164+
let mut flags = NeedsUpdate::empty();
165+
163166
if let Some(e) =
164167
Self::event_pump(ev, self.components_mut().as_mut_slice())
165168
{
166169
match e {
167-
EventUpdate::All => self.update(),
168-
EventUpdate::Commands => self.update_commands(),
169-
EventUpdate::Diff => self.update_diff(),
170+
EventUpdate::All => flags.insert(NeedsUpdate::ALL),
171+
EventUpdate::Commands => {
172+
flags.insert(NeedsUpdate::COMMANDS)
173+
}
174+
EventUpdate::Diff => flags.insert(NeedsUpdate::DIFF),
170175
_ => (),
171176
}
172177
} else if let Event::Key(k) = ev {
173-
match k {
174-
keys::EXIT_1 | keys::EXIT_2 => self.do_quit = true,
178+
let new_flags = match k {
179+
keys::EXIT_1 | keys::EXIT_2 => {
180+
self.do_quit = true;
181+
NeedsUpdate::empty()
182+
}
175183
keys::FOCUS_WORKDIR => {
176184
self.switch_focus(Focus::WorkDir)
177185
}
@@ -183,11 +191,24 @@ impl App {
183191
DiffTarget::WorkingDir => Focus::WorkDir,
184192
})
185193
}
186-
_ => (),
194+
_ => NeedsUpdate::empty(),
187195
};
196+
197+
flags.insert(new_flags);
188198
}
189199

190-
self.process_queue();
200+
let new_flags = self.process_queue();
201+
flags.insert(new_flags);
202+
203+
if flags.contains(NeedsUpdate::ALL) {
204+
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+
}
211+
}
191212
}
192213

193214
///
@@ -268,45 +289,54 @@ impl App {
268289
self.update_commands();
269290
}
270291

271-
fn process_queue(&mut self) {
292+
fn process_queue(&mut self) -> NeedsUpdate {
293+
let mut flags = NeedsUpdate::empty();
272294
loop {
273295
let front = self.queue.borrow_mut().pop_front();
274296
if let Some(e) = front {
275-
self.process_internal_event(&e);
297+
flags.insert(self.process_internal_event(&e));
276298
} else {
277299
break;
278300
}
279301
}
280302
self.queue.borrow_mut().clear();
303+
304+
flags
281305
}
282306

283-
fn process_internal_event(&mut self, ev: &InternalEvent) {
307+
fn process_internal_event(
308+
&mut self,
309+
ev: &InternalEvent,
310+
) -> NeedsUpdate {
311+
let mut flags = NeedsUpdate::empty();
284312
match ev {
285313
InternalEvent::ResetFile(p) => {
286314
if sync::reset_workdir(CWD, Path::new(p.as_str())) {
287-
self.update();
315+
flags.insert(NeedsUpdate::ALL);
288316
}
289317
}
290318
InternalEvent::ConfirmResetFile(p) => {
291319
self.reset.open_for_path(p);
292-
self.update_commands();
320+
flags.insert(NeedsUpdate::COMMANDS);
293321
}
294322
InternalEvent::AddHunk(hash) => {
295323
if let Some((path, is_stage)) = self.selected_path() {
296324
if is_stage {
297325
if sync::unstage_hunk(CWD, path, *hash) {
298-
self.update();
326+
flags.insert(NeedsUpdate::ALL);
299327
}
300328
} else if sync::stage_hunk(CWD, path, *hash) {
301-
self.update();
329+
flags.insert(NeedsUpdate::ALL);
302330
}
303331
}
304332
}
305333
InternalEvent::ShowMsg(msg) => {
306334
self.msg.show_msg(msg);
307-
self.update();
335+
flags.insert(NeedsUpdate::ALL);
308336
}
309337
};
338+
339+
flags
310340
}
311341

312342
fn commands(&self, force_all: bool) -> Vec<CommandInfo> {
@@ -466,7 +496,7 @@ impl App {
466496
.render(f, r);
467497
}
468498

469-
fn switch_focus(&mut self, f: Focus) {
499+
fn switch_focus(&mut self, f: Focus) -> NeedsUpdate {
470500
if self.focus != f {
471501
self.focus = f;
472502

@@ -487,8 +517,9 @@ impl App {
487517
}
488518
};
489519

490-
self.update_diff();
491-
self.update_commands();
520+
NeedsUpdate::DIFF | NeedsUpdate::COMMANDS
521+
} else {
522+
NeedsUpdate::empty()
492523
}
493524
}
494525

src/components/mod.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ mod diff;
88
mod help;
99
mod msg;
1010
mod reset;
11+
use bitflags::bitflags;
1112
pub use changes::ChangesComponent;
1213
pub use command::{CommandInfo, CommandText};
1314
pub use commit::CommitComponent;
@@ -24,6 +25,18 @@ pub enum EventUpdate {
2425
Commands,
2526
}
2627

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+
2740
///
2841
#[derive(PartialEq)]
2942
pub enum CommandBlocking {

0 commit comments

Comments
 (0)