utilities/widgets: ensure ProgressSpinner is cleaned up
parent
0e2641f7ed
commit
f83df69d2f
|
@ -663,7 +663,7 @@ impl StatusBar {
|
|||
height: 1,
|
||||
id: ComponentId::new_v4(),
|
||||
auto_complete: AutoComplete::new(Vec::new()),
|
||||
progress_spinner: ProgressSpinner::new(3),
|
||||
progress_spinner: ProgressSpinner::new(1),
|
||||
in_progress_jobs: HashSet::default(),
|
||||
done_jobs: HashSet::default(),
|
||||
cmd_history: crate::command::history::old_cmd_history(),
|
||||
|
@ -1182,8 +1182,8 @@ impl Component for StatusBar {
|
|||
self.in_progress_jobs.remove(job_id);
|
||||
if self.in_progress_jobs.is_empty() {
|
||||
self.progress_spinner.stop();
|
||||
self.set_dirty(true);
|
||||
}
|
||||
self.progress_spinner.set_dirty(true);
|
||||
}
|
||||
UIEvent::StatusEvent(StatusEvent::NewJob(ref job_id))
|
||||
if !self.done_jobs.contains(job_id) =>
|
||||
|
@ -1191,6 +1191,7 @@ impl Component for StatusBar {
|
|||
if self.in_progress_jobs.is_empty() {
|
||||
self.progress_spinner.start();
|
||||
}
|
||||
self.progress_spinner.set_dirty(true);
|
||||
self.in_progress_jobs.insert(*job_id);
|
||||
}
|
||||
UIEvent::Timer(_) => {
|
||||
|
|
|
@ -996,12 +996,13 @@ pub struct ProgressSpinner {
|
|||
timer: crate::timer::PosixTimer,
|
||||
stage: usize,
|
||||
kind: usize,
|
||||
active: bool,
|
||||
dirty: bool,
|
||||
id: ComponentId,
|
||||
}
|
||||
|
||||
impl ProgressSpinner {
|
||||
const KINDS: &'static [&'static [&'static str]] = &[
|
||||
const KINDS: [&'static [&'static str]; 15] = [
|
||||
&["▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"],
|
||||
&["⣀", "⣄", "⣤", "⣦", "⣶", "⣷", "⣿"],
|
||||
&["⣀", "⣄", "⣆", "⣇", "⣧", "⣷", "⣿"],
|
||||
|
@ -1029,16 +1030,19 @@ impl ProgressSpinner {
|
|||
nix::sys::signal::Signal::SIGALRM,
|
||||
)
|
||||
.unwrap();
|
||||
debug!("Requested timer {:?} for ProgressSpinner", timer.si_value);
|
||||
ProgressSpinner {
|
||||
timer,
|
||||
stage: 0,
|
||||
kind: kind % Self::KINDS.len(),
|
||||
dirty: true,
|
||||
active: false,
|
||||
id: ComponentId::new_v4(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn start(&mut self) {
|
||||
self.active = true;
|
||||
self.timer
|
||||
.set_interval(Self::INTERVAL)
|
||||
.set_value(Self::VALUE)
|
||||
|
@ -1046,6 +1050,8 @@ impl ProgressSpinner {
|
|||
}
|
||||
|
||||
pub fn stop(&mut self) {
|
||||
self.active = false;
|
||||
self.stage = 0;
|
||||
self.timer
|
||||
.set_interval(std::time::Duration::from_millis(0))
|
||||
.set_value(std::time::Duration::from_millis(0))
|
||||
|
@ -1064,6 +1070,7 @@ impl Component for ProgressSpinner {
|
|||
if self.dirty {
|
||||
let theme_attr = crate::conf::value(context, "status.bar");
|
||||
clear_area(grid, area, theme_attr);
|
||||
if self.active {
|
||||
let stage = self.stage;
|
||||
self.stage = (self.stage + 1).wrapping_rem(Self::KINDS[self.kind].len());
|
||||
write_string_to_grid(
|
||||
|
@ -1075,6 +1082,7 @@ impl Component for ProgressSpinner {
|
|||
area,
|
||||
None,
|
||||
);
|
||||
}
|
||||
context.dirty_areas.push_back(area);
|
||||
self.dirty = false;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue