From 70e52019561639ac9da1668f142d6c3a8a24cede Mon Sep 17 00:00:00 2001 From: Stephan Dilly Date: Tue, 12 May 2020 13:22:55 +0200 Subject: [PATCH] allow all draw calls to mutate self --- src/app.rs | 3 +- src/components/changes.rs | 2 +- src/components/commit.rs | 2 +- src/components/diff.rs | 6 +-- src/components/help.rs | 2 +- src/components/mod.rs | 2 +- src/components/msg.rs | 2 +- src/components/reset.rs | 2 +- src/tabs/revlog/mod.rs | 89 +++++++++++++++++++-------------------- src/tabs/status.rs | 2 +- 10 files changed, 55 insertions(+), 57 deletions(-) diff --git a/src/app.rs b/src/app.rs index 620b8f8f..d7e0f1ed 100644 --- a/src/app.rs +++ b/src/app.rs @@ -86,7 +86,6 @@ impl App { if self.tab == 0 { self.status_tab.draw(f, chunks_main[1]); } else { - self.revlog.prepare_draw(chunks_main[1]); self.revlog.draw(f, chunks_main[1]); } @@ -311,7 +310,7 @@ impl App { || self.msg.is_visible() } - fn draw_popups(&self, f: &mut Frame) { + fn draw_popups(&mut self, f: &mut Frame) { let size = f.size(); self.commit.draw(f, size); diff --git a/src/components/changes.rs b/src/components/changes.rs index 7e9b74e1..8c8a229d 100644 --- a/src/components/changes.rs +++ b/src/components/changes.rs @@ -255,7 +255,7 @@ impl ChangesComponent { } impl DrawableComponent for ChangesComponent { - fn draw(&self, f: &mut Frame, r: Rect) { + fn draw(&mut self, f: &mut Frame, r: Rect) { let selection_offset = self.tree.tree.items().iter().enumerate().fold( 0, diff --git a/src/components/commit.rs b/src/components/commit.rs index 9c826283..c6e4ffbe 100644 --- a/src/components/commit.rs +++ b/src/components/commit.rs @@ -27,7 +27,7 @@ pub struct CommitComponent { } impl DrawableComponent for CommitComponent { - fn draw(&self, f: &mut Frame, _rect: Rect) { + fn draw(&mut self, f: &mut Frame, _rect: Rect) { if self.visible { let txt = if self.msg.is_empty() { [Text::Styled( diff --git a/src/components/diff.rs b/src/components/diff.rs index db35d861..fbf1927a 100644 --- a/src/components/diff.rs +++ b/src/components/diff.rs @@ -104,8 +104,8 @@ impl DiffComponent { } ScrollType::Home => self.scroll = 0, ScrollType::End => self.scroll = scroll_max, - //TODO: - _ => (), + ScrollType::PageDown => (), + ScrollType::PageUp => (), } if old != self.scroll { @@ -296,7 +296,7 @@ impl DiffComponent { } impl DrawableComponent for DiffComponent { - fn draw(&self, f: &mut Frame, r: Rect) { + fn draw(&mut self, f: &mut Frame, r: Rect) { let mut style_border = Style::default().fg(Color::DarkGray); let mut style_title = Style::default(); if self.focused { diff --git a/src/components/help.rs b/src/components/help.rs index 7441d57b..43e0305d 100644 --- a/src/components/help.rs +++ b/src/components/help.rs @@ -25,7 +25,7 @@ pub struct HelpComponent { } impl DrawableComponent for HelpComponent { - fn draw(&self, f: &mut Frame, _rect: Rect) { + fn draw(&mut self, f: &mut Frame, _rect: Rect) { if self.visible { let (txt, selected_line) = self.get_text(); diff --git a/src/components/mod.rs b/src/components/mod.rs index 56b33768..77e6cafe 100644 --- a/src/components/mod.rs +++ b/src/components/mod.rs @@ -82,7 +82,7 @@ pub fn visibility_blocking( /// pub trait DrawableComponent { /// - fn draw(&self, f: &mut Frame, rect: Rect); + fn draw(&mut self, f: &mut Frame, rect: Rect); } /// base component trait diff --git a/src/components/msg.rs b/src/components/msg.rs index d944ab54..78847a89 100644 --- a/src/components/msg.rs +++ b/src/components/msg.rs @@ -20,7 +20,7 @@ pub struct MsgComponent { } impl DrawableComponent for MsgComponent { - fn draw(&self, f: &mut Frame, _rect: Rect) { + fn draw(&mut self, f: &mut Frame, _rect: Rect) { if self.visible { let txt = vec![Text::Raw(Cow::from(self.msg.as_str()))]; diff --git a/src/components/reset.rs b/src/components/reset.rs index 491a7c08..e116ec8c 100644 --- a/src/components/reset.rs +++ b/src/components/reset.rs @@ -26,7 +26,7 @@ pub struct ResetComponent { } impl DrawableComponent for ResetComponent { - fn draw(&self, f: &mut Frame, _rect: Rect) { + fn draw(&mut self, f: &mut Frame, _rect: Rect) { if self.visible { let mut txt = Vec::new(); txt.push(Text::Styled( diff --git a/src/tabs/revlog/mod.rs b/src/tabs/revlog/mod.rs index 7945514b..f284585f 100644 --- a/src/tabs/revlog/mod.rs +++ b/src/tabs/revlog/mod.rs @@ -2,7 +2,8 @@ mod utils; use crate::{ components::{ - CommandBlocking, CommandInfo, Component, ScrollType, + CommandBlocking, CommandInfo, Component, DrawableComponent, + ScrollType, }, keys, strings::commands, @@ -72,50 +73,6 @@ impl Revlog { } } - /// - pub fn prepare_draw(&mut self, area: Rect) { - self.current_height = area.height.saturating_sub(2); - } - - /// - pub fn draw(&self, f: &mut Frame, area: Rect) { - let height = area.height as usize; - let selection = - self.selection.saturating_sub(self.items.index_offset); - let height_d2 = height as usize / 2; - let min = selection.saturating_sub(height_d2); - - let mut txt = Vec::new(); - for (idx, e) in self.items.items.iter().enumerate() { - let tag = if let Some(tag_name) = self.tags.get(&e.hash) { - tag_name.as_str() - } else { - "" - }; - Self::add_entry(e, idx == selection, &mut txt, tag); - } - - let title = format!( - "commit {}/{}", - self.selection, self.selection_max - ); - - f.render_widget( - Paragraph::new( - txt.iter() - .skip(min * ELEMENTS_PER_LINE) - .take(height * ELEMENTS_PER_LINE), - ) - .block( - Block::default() - .borders(Borders::ALL) - .title(title.as_str()), - ) - .alignment(Alignment::Left), - area, - ); - } - /// pub fn any_work_pending(&self) -> bool { self.git_log.is_pending() @@ -273,6 +230,48 @@ impl Revlog { } } +impl DrawableComponent for Revlog { + fn draw(&mut self, f: &mut Frame, area: Rect) { + self.current_height = area.height.saturating_sub(2); + + let height = area.height as usize; + let selection = + self.selection.saturating_sub(self.items.index_offset); + let height_d2 = height as usize / 2; + let min = selection.saturating_sub(height_d2); + + let mut txt = Vec::new(); + for (idx, e) in self.items.items.iter().enumerate() { + let tag = if let Some(tag_name) = self.tags.get(&e.hash) { + tag_name.as_str() + } else { + "" + }; + Self::add_entry(e, idx == selection, &mut txt, tag); + } + + let title = format!( + "commit {}/{}", + self.selection, self.selection_max + ); + + f.render_widget( + Paragraph::new( + txt.iter() + .skip(min * ELEMENTS_PER_LINE) + .take(height * ELEMENTS_PER_LINE), + ) + .block( + Block::default() + .borders(Borders::ALL) + .title(title.as_str()), + ) + .alignment(Alignment::Left), + area, + ); + } +} + impl Component for Revlog { fn event(&mut self, ev: Event) -> bool { if self.visible { diff --git a/src/tabs/status.rs b/src/tabs/status.rs index f065cc80..7a4f7fcf 100644 --- a/src/tabs/status.rs +++ b/src/tabs/status.rs @@ -46,7 +46,7 @@ pub struct Status { impl DrawableComponent for Status { fn draw( - &self, + &mut self, f: &mut tui::Frame, rect: tui::layout::Rect, ) {