new update flags system

This commit is contained in:
Stephan Dilly 2020-04-13 00:29:36 +02:00
parent c0f0883f1b
commit de5cedb05a
4 changed files with 65 additions and 19 deletions

1
Cargo.lock generated
View file

@ -312,6 +312,7 @@ version = "0.1.4"
dependencies = [ dependencies = [
"asyncgit", "asyncgit",
"backtrace", "backtrace",
"bitflags",
"crossbeam-channel", "crossbeam-channel",
"crossterm 0.16.0", "crossterm 0.16.0",
"dirs", "dirs",

View file

@ -27,6 +27,7 @@ simplelog = { version = "0.7", default-features=false }
dirs = "2.0" dirs = "2.0"
crossbeam-channel = "0.4" crossbeam-channel = "0.4"
scopeguard = "1.1" scopeguard = "1.1"
bitflags = "1.2"
backtrace = { version = "0.3" } backtrace = { version = "0.3" }
scopetime = { path = "./scopetime", version = "0.1" } scopetime = { path = "./scopetime", version = "0.1" }
asyncgit = { path = "./asyncgit", version = "0.1" } asyncgit = { path = "./asyncgit", version = "0.1" }

View file

@ -2,7 +2,8 @@ use crate::{
components::{ components::{
ChangesComponent, CommandBlocking, CommandInfo, ChangesComponent, CommandBlocking, CommandInfo,
CommitComponent, Component, DiffComponent, DrawableComponent, CommitComponent, Component, DiffComponent, DrawableComponent,
EventUpdate, HelpComponent, MsgComponent, ResetComponent, EventUpdate, HelpComponent, MsgComponent, NeedsUpdate,
ResetComponent,
}, },
keys, keys,
queue::{InternalEvent, Queue}, queue::{InternalEvent, Queue},
@ -160,18 +161,25 @@ impl App {
pub fn event(&mut self, ev: Event) { pub fn event(&mut self, ev: Event) {
trace!("event: {:?}", ev); trace!("event: {:?}", ev);
let mut flags = NeedsUpdate::empty();
if let Some(e) = if let Some(e) =
Self::event_pump(ev, self.components_mut().as_mut_slice()) Self::event_pump(ev, self.components_mut().as_mut_slice())
{ {
match e { match e {
EventUpdate::All => self.update(), EventUpdate::All => flags.insert(NeedsUpdate::ALL),
EventUpdate::Commands => self.update_commands(), EventUpdate::Commands => {
EventUpdate::Diff => self.update_diff(), flags.insert(NeedsUpdate::COMMANDS)
}
EventUpdate::Diff => flags.insert(NeedsUpdate::DIFF),
_ => (), _ => (),
} }
} else if let Event::Key(k) = ev { } else if let Event::Key(k) = ev {
match k { let new_flags = match k {
keys::EXIT_1 | keys::EXIT_2 => self.do_quit = true, keys::EXIT_1 | keys::EXIT_2 => {
self.do_quit = true;
NeedsUpdate::empty()
}
keys::FOCUS_WORKDIR => { keys::FOCUS_WORKDIR => {
self.switch_focus(Focus::WorkDir) self.switch_focus(Focus::WorkDir)
} }
@ -183,11 +191,24 @@ impl App {
DiffTarget::WorkingDir => Focus::WorkDir, DiffTarget::WorkingDir => Focus::WorkDir,
}) })
} }
_ => (), _ => NeedsUpdate::empty(),
}; };
flags.insert(new_flags);
} }
self.process_queue(); let new_flags = self.process_queue();
flags.insert(new_flags);
if flags.contains(NeedsUpdate::ALL) {
self.update();
} else {
if flags.contains(NeedsUpdate::DIFF) {
self.update_diff();
} else if flags.contains(NeedsUpdate::COMMANDS) {
self.update_commands();
}
}
} }
/// ///
@ -268,45 +289,54 @@ impl App {
self.update_commands(); self.update_commands();
} }
fn process_queue(&mut self) { fn process_queue(&mut self) -> NeedsUpdate {
let mut flags = NeedsUpdate::empty();
loop { loop {
let front = self.queue.borrow_mut().pop_front(); let front = self.queue.borrow_mut().pop_front();
if let Some(e) = front { if let Some(e) = front {
self.process_internal_event(&e); flags.insert(self.process_internal_event(&e));
} else { } else {
break; break;
} }
} }
self.queue.borrow_mut().clear(); self.queue.borrow_mut().clear();
flags
} }
fn process_internal_event(&mut self, ev: &InternalEvent) { fn process_internal_event(
&mut self,
ev: &InternalEvent,
) -> NeedsUpdate {
let mut flags = NeedsUpdate::empty();
match ev { match ev {
InternalEvent::ResetFile(p) => { InternalEvent::ResetFile(p) => {
if sync::reset_workdir(CWD, Path::new(p.as_str())) { if sync::reset_workdir(CWD, Path::new(p.as_str())) {
self.update(); flags.insert(NeedsUpdate::ALL);
} }
} }
InternalEvent::ConfirmResetFile(p) => { InternalEvent::ConfirmResetFile(p) => {
self.reset.open_for_path(p); self.reset.open_for_path(p);
self.update_commands(); flags.insert(NeedsUpdate::COMMANDS);
} }
InternalEvent::AddHunk(hash) => { InternalEvent::AddHunk(hash) => {
if let Some((path, is_stage)) = self.selected_path() { if let Some((path, is_stage)) = self.selected_path() {
if is_stage { if is_stage {
if sync::unstage_hunk(CWD, path, *hash) { if sync::unstage_hunk(CWD, path, *hash) {
self.update(); flags.insert(NeedsUpdate::ALL);
} }
} else if sync::stage_hunk(CWD, path, *hash) { } else if sync::stage_hunk(CWD, path, *hash) {
self.update(); flags.insert(NeedsUpdate::ALL);
} }
} }
} }
InternalEvent::ShowMsg(msg) => { InternalEvent::ShowMsg(msg) => {
self.msg.show_msg(msg); self.msg.show_msg(msg);
self.update(); flags.insert(NeedsUpdate::ALL);
} }
}; };
flags
} }
fn commands(&self, force_all: bool) -> Vec<CommandInfo> { fn commands(&self, force_all: bool) -> Vec<CommandInfo> {
@ -466,7 +496,7 @@ impl App {
.render(f, r); .render(f, r);
} }
fn switch_focus(&mut self, f: Focus) { fn switch_focus(&mut self, f: Focus) -> NeedsUpdate {
if self.focus != f { if self.focus != f {
self.focus = f; self.focus = f;
@ -487,8 +517,9 @@ impl App {
} }
}; };
self.update_diff(); NeedsUpdate::DIFF | NeedsUpdate::COMMANDS
self.update_commands(); } else {
NeedsUpdate::empty()
} }
} }

View file

@ -8,6 +8,7 @@ mod diff;
mod help; mod help;
mod msg; mod msg;
mod reset; mod reset;
use bitflags::bitflags;
pub use changes::ChangesComponent; pub use changes::ChangesComponent;
pub use command::{CommandInfo, CommandText}; pub use command::{CommandInfo, CommandText};
pub use commit::CommitComponent; pub use commit::CommitComponent;
@ -24,6 +25,18 @@ pub enum EventUpdate {
Commands, Commands,
} }
bitflags! {
///
pub struct NeedsUpdate: u32 {
///
const ALL = 0b001;
///
const DIFF = 0b010;
///
const COMMANDS = 0b100;
}
}
/// ///
#[derive(PartialEq)] #[derive(PartialEq)]
pub enum CommandBlocking { pub enum CommandBlocking {