diff options
Diffstat (limited to 'src/tabs/stashing.rs')
-rw-r--r-- | src/tabs/stashing.rs | 438 |
1 files changed, 219 insertions, 219 deletions
diff --git a/src/tabs/stashing.rs b/src/tabs/stashing.rs index 9cd1bde0..bbbc513d 100644 --- a/src/tabs/stashing.rs +++ b/src/tabs/stashing.rs @@ -1,269 +1,269 @@ use crate::{ - accessors, - components::{ - command_pump, event_pump, visibility_blocking, - CommandBlocking, CommandInfo, Component, DrawableComponent, - EventState, FileTreeComponent, - }, - keys::SharedKeyConfig, - queue::{InternalEvent, Queue}, - strings, - ui::style::SharedTheme, + accessors, + components::{ + command_pump, event_pump, visibility_blocking, + CommandBlocking, CommandInfo, Component, DrawableComponent, + EventState, FileTreeComponent, + }, + keys::SharedKeyConfig, + queue::{InternalEvent, Queue}, + strings, + ui::style::SharedTheme, }; use anyhow::Result; use asyncgit::{ - sync::{self, status::StatusType}, - AsyncGitNotification, AsyncStatus, StatusParams, CWD, + sync::{self, status::StatusType}, + AsyncGitNotification, AsyncStatus, StatusParams, CWD, }; use crossbeam_channel::Sender; use crossterm::event::Event; use std::borrow::Cow; use tui::{ - layout::{Alignment, Constraint, Direction, Layout}, - text::{Span, Spans}, - widgets::{Block, Borders, Paragraph}, + layout::{Alignment, Constraint, Direction, Layout}, + text::{Span, Spans}, + widgets::{Block, Borders, Paragraph}, }; #[derive(Default, Clone, Copy, Debug)] pub struct StashingOptions { - pub stash_untracked: bool, - pub keep_index: bool, + pub stash_untracked: bool, + pub keep_index: bool, } pub struct Stashing { - index: FileTreeComponent, - visible: bool, - options: StashingOptions, - theme: SharedTheme, - git_status: AsyncStatus, - queue: Queue, - key_config: SharedKeyConfig, + index: FileTreeComponent, + visible: bool, + options: StashingOptions, + theme: SharedTheme, + git_status: AsyncStatus, + queue: Queue, + key_config: SharedKeyConfig, } impl Stashing { - accessors!(self, [index]); + accessors!(self, [index]); - /// - pub fn new( - sender: &Sender<AsyncGitNotification>, - queue: &Queue, - theme: SharedTheme, - key_config: SharedKeyConfig, - ) -> Self { - Self { - index: FileTreeComponent::new( - &strings::stashing_files_title(&key_config), - true, - Some(queue.clone()), - theme.clone(), - key_config.clone(), - ), - visible: false, - options: StashingOptions { - keep_index: false, - stash_untracked: true, - }, - theme, - git_status: AsyncStatus::new(sender.clone()), - queue: queue.clone(), - key_config, - } - } + /// + pub fn new( + sender: &Sender<AsyncGitNotification>, + queue: &Queue, + theme: SharedTheme, + key_config: SharedKeyConfig, + ) -> Self { + Self { + index: FileTreeComponent::new( + &strings::stashing_files_title(&key_config), + true, + Some(queue.clone()), + theme.clone(), + key_config.clone(), + ), + visible: false, + options: StashingOptions { + keep_index: false, + stash_untracked: true, + }, + theme, + git_status: AsyncStatus::new(sender.clone()), + queue: queue.clone(), + key_config, + } + } - /// - pub fn update(&mut self) -> Result<()> { - if self.is_visible() { - self.git_status - .fetch(&StatusParams::new(StatusType::Both))?; - } + /// + pub fn update(&mut self) -> Result<()> { + if self.is_visible() { + self.git_status + .fetch(&StatusParams::new(StatusType::Both))?; + } - Ok(()) - } + Ok(()) + } - /// - pub fn anything_pending(&self) -> bool { - self.git_status.is_pending() - } + /// + pub fn anything_pending(&self) -> bool { + self.git_status.is_pending() + } - /// - pub fn update_git( - &mut self, - ev: AsyncGitNotification, - ) -> Result<()> { - if self.is_visible() { - if let AsyncGitNotification::Status = ev { - let status = self.git_status.last()?; - self.index.update(&status.items)?; - } - } + /// + pub fn update_git( + &mut self, + ev: AsyncGitNotification, + ) -> Result<()> { + if self.is_visible() { + if let AsyncGitNotification::Status = ev { + let status = self.git_status.last()?; + self.index.update(&status.items)?; + } + } - Ok(()) - } + Ok(()) + } - fn get_option_text(&self) -> Vec<Spans> { - let bracket_open = Span::raw(Cow::from("[")); - let bracket_close = Span::raw(Cow::from("]")); - let option_on = - Span::styled(Cow::from("x"), self.theme.option(true)); + fn get_option_text(&self) -> Vec<Spans> { + let bracket_open = Span::raw(Cow::from("[")); + let bracket_close = Span::raw(Cow::from("]")); + let option_on = + Span::styled(Cow::from("x"), self.theme.option(true)); - let option_off = - Span::styled(Cow::from("_"), self.theme.option(false)); + let option_off = + Span::styled(Cow::from("_"), self.theme.option(false)); - vec![ - Spans::from(vec![ - bracket_open.clone(), - if self.options.stash_untracked { - option_on.clone() - } else { - option_off.clone() - }, - bracket_close.clone(), - Span::raw(Cow::from(" stash untracked")), - ]), - Spans::from(vec![ - bracket_open, - if self.options.keep_index { - option_on.clone() - } else { - option_off.clone() - }, - bracket_close, - Span::raw(Cow::from(" keep index")), - ]), - ] - } + vec![ + Spans::from(vec![ + bracket_open.clone(), + if self.options.stash_untracked { + option_on.clone() + } else { + option_off.clone() + }, + bracket_close.clone(), + Span::raw(Cow::from(" stash untracked")), + ]), + Spans::from(vec![ + bracket_open, + if self.options.keep_index { + option_on.clone() + } else { + option_off.clone() + }, + bracket_close, + Span::raw(Cow::from(" keep index")), + ]), + ] + } } impl DrawableComponent for Stashing { - fn draw<B: tui::backend::Backend>( - &self, - f: &mut tui::Frame<B>, - rect: tui::layout::Rect, - ) -> Result<()> { - let chunks = Layout::default() - .direction(Direction::Horizontal) - .constraints( - [Constraint::Min(1), Constraint::Length(22)].as_ref(), - ) - .split(rect); + fn draw<B: tui::backend::Backend>( + &self, + f: &mut tui::Frame<B>, + rect: tui::layout::Rect, + ) -> Result<()> { + let chunks = Layout::default() + .direction(Direction::Horizontal) + .constraints( + [Constraint::Min(1), Constraint::Length(22)].as_ref(), + ) + .split(rect); - let right_chunks = Layout::default() - .direction(Direction::Vertical) - .constraints( - [Constraint::Length(4), Constraint::Min(1)].as_ref(), - ) - .split(chunks[1]); + let right_chunks = Layout::default() + .direction(Direction::Vertical) + .constraints( + [Constraint::Length(4), Constraint::Min(1)].as_ref(), + ) + .split(chunks[1]); - f.render_widget( - Paragraph::new(self.get_option_text()) - .block(Block::default().borders(Borders::ALL).title( - strings::stashing_options_title(&self.key_config), - )) - .alignment(Alignment::Left), - right_chunks[0], - ); + f.render_widget( + Paragraph::new(self.get_option_text()) + .block(Block::default().borders(Borders::ALL).title( + strings::stashing_options_title(&self.key_config), + )) + .alignment(Alignment::Left), + right_chunks[0], + ); - self.index.draw(f, chunks[0])?; + self.index.draw(f, chunks[0])?; - Ok(()) - } + Ok(()) + } } impl Component for Stashing { - fn commands( - &self, - out: &mut Vec<CommandInfo>, - force_all: bool, - ) -> CommandBlocking { - if self.visible || force_all { - command_pump( - out, - force_all, - self.components().as_slice(), - ); + fn commands( + &self, + out: &mut Vec<CommandInfo>, + force_all: bool, + ) -> CommandBlocking { + if self.visible || force_all { + command_pump( + out, + force_all, + self.components().as_slice(), + ); - out.push(CommandInfo::new( - strings::commands::stashing_save(&self.key_config), - self.visible && !self.index.is_empty(), - self.visible || force_all, - )); - out.push(CommandInfo::new( - strings::commands::stashing_toggle_indexed( - &self.key_config, - ), - self.visible, - self.visible || force_all, - )); - out.push(CommandInfo::new( - strings::commands::stashing_toggle_untracked( - &self.key_config, - ), - self.visible, - self.visible || force_all, - )); - } + out.push(CommandInfo::new( + strings::commands::stashing_save(&self.key_config), + self.visible && !self.index.is_empty(), + self.visible || force_all, + )); + out.push(CommandInfo::new( + strings::commands::stashing_toggle_indexed( + &self.key_config, + ), + self.visible, + self.visible || force_all, + )); + out.push(CommandInfo::new( + strings::commands::stashing_toggle_untracked( + &self.key_config, + ), + self.visible, + self.visible || force_all, + )); + } - visibility_blocking(self) - } + visibility_blocking(self) + } - fn event( - &mut self, - ev: crossterm::event::Event, - ) -> Result<EventState> { - if self.visible { - if event_pump(ev, self.components_mut().as_mut_slice())? - .is_consumed() - { - return Ok(EventState::Consumed); - } + fn event( + &mut self, + ev: crossterm::event::Event, + ) -> Result<EventState> { + if self.visible { + if event_pump(ev, self.components_mut().as_mut_slice())? + .is_consumed() + { + return Ok(EventState::Consumed); + } - if let Event::Key(k) = ev { - return if k == self.key_config.stashing_save - && !self.index.is_empty() - { - self.queue.push(InternalEvent::PopupStashing( - self.options, - )); + if let Event::Key(k) = ev { + return if k == self.key_config.stashing_save + && !self.index.is_empty() + { + self.queue.push(InternalEvent::PopupStashing( + self.options, + )); - Ok(EventState::Consumed) - } else if k == self.key_config.stashing_toggle_index { - self.options.keep_index = - !self.options.keep_index; - self.update()?; - Ok(EventState::Consumed) - } else if k - == self.key_config.stashing_toggle_untracked - { - self.options.stash_untracked = - !self.options.stash_untracked; - self.update()?; - Ok(EventState::Consumed) - } else { - Ok(EventState::NotConsumed) - }; - }; - } + Ok(EventState::Consumed) + } else if k == self.key_config.stashing_toggle_index { + self.options.keep_index = + !self.options.keep_index; + self.update()?; + Ok(EventState::Consumed) + } else if k + == self.key_config.stashing_toggle_untracked + { + self.options.stash_untracked = + !self.options.stash_untracked; + self.update()?; + Ok(EventState::Consumed) + } else { + Ok(EventState::NotConsumed) + }; + }; + } - Ok(EventState::NotConsumed) - } + Ok(EventState::NotConsumed) + } - fn is_visible(&self) -> bool { - self.visible - } + fn is_visible(&self) -> bool { + self.visible + } - fn hide(&mut self) { - self.visible = false; - } + fn hide(&mut self) { + self.visible = false; + } - fn show(&mut self) -> Result<()> { - let config_untracked_files = - sync::untracked_files_config(CWD)?; + fn show(&mut self) -> Result<()> { + let config_untracked_files = + sync::untracked_files_config(CWD)?; - self.options.stash_untracked = - !config_untracked_files.include_none(); + self.options.stash_untracked = + !config_untracked_files.include_none(); - self.visible = true; - self.update()?; - Ok(()) - } + self.visible = true; + self.update()?; + Ok(()) + } } |