diff options
author | extrawurst <776816+extrawurst@users.noreply.github.com> | 2024-02-20 11:56:37 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-20 11:56:37 +0100 |
commit | 45c34e5675e83285f99db77309dd1c6b78fc245f (patch) | |
tree | c22e39eb9b63e35c4db1ec8e12ba0cf23afb33f8 /src | |
parent | 1a6f82b71b69cea614071fdde88842ca2f7d8da6 (diff) |
fix infinite spinner (#2075)
af9da95 introduced pending work to always be true
Diffstat (limited to 'src')
-rw-r--r-- | src/popups/blame_file.rs | 184 |
1 files changed, 100 insertions, 84 deletions
diff --git a/src/popups/blame_file.rs b/src/popups/blame_file.rs index cd36e023..26366e75 100644 --- a/src/popups/blame_file.rs +++ b/src/popups/blame_file.rs @@ -94,11 +94,12 @@ pub struct BlameFilePopup { table_state: std::cell::Cell<TableState>, key_config: SharedKeyConfig, current_height: std::cell::Cell<usize>, - blame: BlameProcess, + blame: Option<BlameProcess>, app_sender: Sender<AsyncAppNotification>, git_sender: Sender<AsyncGitNotification>, repo: RepoPathRef, } + impl DrawableComponent for BlameFilePopup { fn draw<B: Backend>( &self, @@ -126,16 +127,16 @@ impl DrawableComponent for BlameFilePopup { Constraint::Percentage(100), ]; - let number_of_rows = rows.len(); + let number_of_rows: usize = rows.len(); let syntax_highlight_progress = match self.blame { - BlameProcess::SyntaxHighlighting { - ref job, .. - } => job + Some(BlameProcess::SyntaxHighlighting { + ref job, + .. + }) => job .progress() .map(|p| format!(" ({}%)", p.progress)) .unwrap_or_default(), - BlameProcess::GettingBlame(_) - | BlameProcess::Result(_) => String::new(), + _ => String::new(), }; let title_with_highlight_progress = format!("{title}{syntax_highlight_progress}"); @@ -198,7 +199,11 @@ impl Component for BlameFilePopup { out: &mut Vec<CommandInfo>, force_all: bool, ) -> CommandBlocking { - let file_blame = self.blame.result(); + let has_result = self + .blame + .as_ref() + .map(|blame| blame.result().is_some()) + .unwrap_or_default(); if self.is_visible() || force_all { out.push( CommandInfo::new( @@ -212,7 +217,7 @@ impl Component for BlameFilePopup { CommandInfo::new( strings::commands::scroll(&self.key_config), true, - file_blame.is_some(), + has_result, ) .order(1), ); @@ -222,7 +227,7 @@ impl Component for BlameFilePopup { &self.key_config, ), true, - file_blame.is_some(), + has_result, ) .order(1), ); @@ -232,7 +237,7 @@ impl Component for BlameFilePopup { &self.key_config, ), true, - file_blame.is_some(), + has_result, ) .order(1), ); @@ -344,10 +349,7 @@ impl BlameFilePopup { current_height: std::cell::Cell::new(0), app_sender: env.sender_app.clone(), git_sender: env.sender_git.clone(), - blame: BlameProcess::GettingBlame(AsyncBlame::new( - env.repo.borrow().clone(), - &env.sender_git, - )), + blame: None, repo: env.repo.clone(), } } @@ -376,10 +378,11 @@ impl BlameFilePopup { file_path: open.file_path, commit_id: open.commit_id, }); - self.blame = BlameProcess::GettingBlame(AsyncBlame::new( - self.repo.borrow().clone(), - &self.git_sender, - )); + self.blame = + Some(BlameProcess::GettingBlame(AsyncBlame::new( + self.repo.borrow().clone(), + &self.git_sender, + ))); self.table_state.get_mut().select(Some(0)); self.visible = true; self.update()?; @@ -389,7 +392,8 @@ impl BlameFilePopup { /// pub fn any_work_pending(&self) -> bool { - !matches!(self.blame, BlameProcess::Result(_)) + self.blame.is_some() + && !matches!(self.blame, Some(BlameProcess::Result(_))) } pub fn update_async( @@ -417,35 +421,38 @@ impl BlameFilePopup { fn update(&mut self) -> Result<()> { if self.is_visible() { - match self.blame { - BlameProcess::Result(_) - | BlameProcess::SyntaxHighlighting { .. } => {} - BlameProcess::GettingBlame(ref mut async_blame) => { - if let Some(params) = &self.params { - if let Some(( - previous_blame_params, - last_file_blame, - )) = async_blame.last()? - { - if previous_blame_params == *params { - self.blame = BlameProcess::SyntaxHighlighting { - unstyled_file_blame: SyntaxFileBlame { - file_blame: last_file_blame, - styled_text: None, - }, - job: AsyncSingleJob::new( - self.app_sender.clone(), - ) - }; - self.set_open_selection(); - self.highlight_blame_lines(); - - return Ok(()); - } + if let Some(BlameProcess::GettingBlame( + ref mut async_blame, + )) = self.blame + { + if let Some(params) = &self.params { + if let Some(( + previous_blame_params, + last_file_blame, + )) = async_blame.last()? + { + if previous_blame_params == *params { + self.blame = Some( + BlameProcess::SyntaxHighlighting { + unstyled_file_blame: + SyntaxFileBlame { + file_blame: + last_file_blame, + styled_text: None, + }, + job: AsyncSingleJob::new( + self.app_sender.clone(), + ), + }, + ); + self.set_open_selection(); + self.highlight_blame_lines(); + + return Ok(()); } - - async_blame.request(params.clone())?; } + + async_blame.request(params.clone())?; } } } @@ -454,10 +461,10 @@ impl BlameFilePopup { } fn update_syntax(&mut self, ev: AsyncNotification) { - let BlameProcess::SyntaxHighlighting { + let Some(BlameProcess::SyntaxHighlighting { ref unstyled_file_blame, ref job, - } = self.blame + }) = self.blame else { return; }; @@ -474,15 +481,16 @@ impl BlameFilePopup { == Path::new( unstyled_file_blame.path(), ) { - self.blame = BlameProcess::Result( - SyntaxFileBlame { - file_blame: - unstyled_file_blame - .file_blame - .clone(), - styled_text: Some(syntax), - }, - ); + self.blame = + Some(BlameProcess::Result( + SyntaxFileBlame { + file_blame: + unstyled_file_blame + .file_blame + .clone(), + styled_text: Some(syntax), + }, + )); } } } @@ -497,7 +505,7 @@ impl BlameFilePopup { match ( self.any_work_pending(), self.params.as_ref(), - self.blame.result(), + self.blame.as_ref().and_then(|blame| blame.result()), ) { (true, Some(params), _) => { format!( @@ -525,9 +533,9 @@ impl BlameFilePopup { /// fn get_rows(&self, width: usize) -> Vec<Row> { - let file_blame = self.blame.result(); - - file_blame + self.blame + .as_ref() + .and_then(|blame| blame.result()) .map(|file_blame| { let styled_text: Option<Text<'_>> = file_blame .styled_text @@ -552,10 +560,10 @@ impl BlameFilePopup { } fn highlight_blame_lines(&mut self) { - let BlameProcess::SyntaxHighlighting { + let Some(BlameProcess::SyntaxHighlighting { ref unstyled_file_blame, ref mut job, - } = self.blame + }) = self.blame else { return; }; @@ -651,7 +659,8 @@ impl BlameFilePopup { time_to_string(hunk.time, true) }); - let file_blame = self.blame.result(); + let file_blame = + self.blame.as_ref().and_then(|blame| blame.result()); let is_blamed_commit = file_blame .and_then(|file_blame| { blame_hunk.map(|hunk| { @@ -671,7 +680,8 @@ impl BlameFilePopup { fn get_max_line_number(&self) -> usize { self.blame - .result() + .as_ref() + .and_then(|blame| blame.result()) .map_or(0, |file_blame| file_blame.lines().len() - 1) } @@ -723,33 +733,39 @@ impl BlameFilePopup { } fn get_selection(&self) -> Option<usize> { - self.blame.result().as_ref().and_then(|_| { - let table_state = self.table_state.take(); + self.blame + .as_ref() + .and_then(|blame| blame.result()) + .and_then(|_| { + let table_state = self.table_state.take(); - let selection = table_state.selected(); + let selection = table_state.selected(); - self.table_state.set(table_state); + self.table_state.set(table_state); - selection - }) + selection + }) } fn selected_commit(&self) -> Option<CommitId> { - self.blame.result().as_ref().and_then(|file_blame| { - let table_state = self.table_state.take(); + self.blame + .as_ref() + .and_then(|blame| blame.result()) + .and_then(|file_blame| { + let table_state = self.table_state.take(); - let commit_id = - table_state.selected().and_then(|selected| { - file_blame.lines()[selected] - .0 - .as_ref() - .map(|hunk| hunk.commit_id) - }); + let commit_id = + table_state.selected().and_then(|selected| { + file_blame.lines()[selected] + .0 + .as_ref() + .map(|hunk| hunk.commit_id) + }); - self.table_state.set(table_state); + self.table_state.set(table_state); - commit_id - }) + commit_id + }) } } |