diff --git a/src/app.rs b/src/app.rs index a120aa7a..1b1bb402 100644 --- a/src/app.rs +++ b/src/app.rs @@ -14,6 +14,7 @@ use crate::{ input::{Input, InputEvent, InputState}, keys::{KeyConfig, SharedKeyConfig}, queue::{Action, InternalEvent, NeedsUpdate, Queue}, + setup_popups, strings::{self, order}, tabs::{Revlog, StashList, Stashing, Status}, ui::style::{SharedTheme, Theme}, @@ -412,6 +413,29 @@ impl App { ] ); + setup_popups!( + self, + [ + commit, + help, + reset, + msg, + stashmsg_popup, + inspect_commit_popup, + blame_file_popup, + external_editor_popup, + tag_commit_popup, + create_branch_popup, + push_popup, + push_tags_popup, + pull_popup, + select_branch_popup, + tags_popup, + rename_branch_popup, + revision_files_popup + ] + ); + fn check_quit_key(&mut self, ev: Event) -> bool { if let Event::Key(e) = ev { if e == self.key_config.exit { @@ -714,63 +738,6 @@ impl App { res } - //TODO: make this automatic, i keep forgetting to add popups here - fn any_popup_visible(&self) -> bool { - self.commit.is_visible() - || self.help.is_visible() - || self.reset.is_visible() - || self.msg.is_visible() - || self.stashmsg_popup.is_visible() - || self.inspect_commit_popup.is_visible() - || self.blame_file_popup.is_visible() - || self.external_editor_popup.is_visible() - || self.tag_commit_popup.is_visible() - || self.create_branch_popup.is_visible() - || self.push_popup.is_visible() - || self.push_tags_popup.is_visible() - || self.pull_popup.is_visible() - || self.select_branch_popup.is_visible() - || self.tags_popup.is_visible() - || self.rename_branch_popup.is_visible() - || self.revision_files_popup.is_visible() - } - - fn draw_popups( - &self, - f: &mut Frame, - ) -> Result<()> { - let size = Layout::default() - .direction(Direction::Vertical) - .constraints( - [ - Constraint::Min(1), - Constraint::Length(self.cmdbar.borrow().height()), - ] - .as_ref(), - ) - .split(f.size())[0]; - - self.commit.draw(f, size)?; - self.stashmsg_popup.draw(f, size)?; - self.help.draw(f, size)?; - self.inspect_commit_popup.draw(f, size)?; - self.blame_file_popup.draw(f, size)?; - self.external_editor_popup.draw(f, size)?; - self.tag_commit_popup.draw(f, size)?; - self.select_branch_popup.draw(f, size)?; - self.tags_popup.draw(f, size)?; - self.create_branch_popup.draw(f, size)?; - self.rename_branch_popup.draw(f, size)?; - self.revision_files_popup.draw(f, size)?; - self.push_popup.draw(f, size)?; - self.push_tags_popup.draw(f, size)?; - self.pull_popup.draw(f, size)?; - self.reset.draw(f, size)?; - self.msg.draw(f, size)?; - - Ok(()) - } - //TODO: make this dynamic fn draw_tabs(&self, f: &mut Frame, r: Rect) { let r = r.inner(&Margin { diff --git a/src/components/mod.rs b/src/components/mod.rs index d6e93276..ef775ac4 100644 --- a/src/components/mod.rs +++ b/src/components/mod.rs @@ -86,6 +86,49 @@ macro_rules! accessors { }; } +/// creates a function to determine if any popup is visible +#[macro_export] +macro_rules! any_popup_visible { + ($self:ident, [$($element:ident),+]) => { + fn any_popup_visible(& $self) -> bool{ + ($($self.$element.is_visible()) || +) + } + }; +} + +/// creates the draw popup function +#[macro_export] +macro_rules! draw_popups { + ($self:ident, [$($element:ident),+]) => { + fn draw_popups(& $self, mut f: &mut Frame) -> Result<()>{ + let size = Layout::default() + .direction(Direction::Vertical) + .constraints( + [ + Constraint::Min(1), + Constraint::Length($self.cmdbar.borrow().height()), + ] + .as_ref(), + ) + .split(f.size())[0]; + + ($($self.$element.draw(&mut f, size)?) , +); + + return Ok(()); + } + }; +} + +/// simply calls +/// any_popup_visible!() and draw_popups!() macros +#[macro_export] +macro_rules! setup_popups { + ($self:ident, [$($element:ident),+]) => { + crate::any_popup_visible!($self, [$($element),+]); + crate::draw_popups!($self, [ $($element),+ ]); + }; +} + /// returns `true` if event was consumed pub fn event_pump( ev: Event,