mirror of
https://github.com/extrawurst/gitui.git
synced 2024-11-23 20:52:54 +03:00
confirm destive command: reset file
This commit is contained in:
parent
c838721544
commit
923f7a46d6
@ -59,7 +59,6 @@ GITUI_LOGGING=true gitui
|
|||||||
# todo for 0.1 (first release)
|
# todo for 0.1 (first release)
|
||||||
|
|
||||||
* [ ] fix: run in non-git folder -> crash
|
* [ ] fix: run in non-git folder -> crash
|
||||||
* [ ] confirm destructive commands (revert/reset)
|
|
||||||
* [ ] (un)staging selected hunks
|
* [ ] (un)staging selected hunks
|
||||||
* [ ] publish as homebrew-tap
|
* [ ] publish as homebrew-tap
|
||||||
|
|
||||||
|
16
src/app.rs
16
src/app.rs
@ -2,7 +2,7 @@ use crate::{
|
|||||||
components::{
|
components::{
|
||||||
ChangesComponent, CommandBlocking, CommandInfo,
|
ChangesComponent, CommandBlocking, CommandInfo,
|
||||||
CommitComponent, Component, DiffComponent, DrawableComponent,
|
CommitComponent, Component, DiffComponent, DrawableComponent,
|
||||||
EventUpdate, HelpComponent,
|
EventUpdate, HelpComponent, ResetComponent,
|
||||||
},
|
},
|
||||||
keys,
|
keys,
|
||||||
queue::{InternalEvent, Queue},
|
queue::{InternalEvent, Queue},
|
||||||
@ -46,6 +46,7 @@ pub struct App {
|
|||||||
focus: Focus,
|
focus: Focus,
|
||||||
diff_target: DiffTarget,
|
diff_target: DiffTarget,
|
||||||
do_quit: bool,
|
do_quit: bool,
|
||||||
|
reset: ResetComponent,
|
||||||
commit: CommitComponent,
|
commit: CommitComponent,
|
||||||
help: HelpComponent,
|
help: HelpComponent,
|
||||||
index: ChangesComponent,
|
index: ChangesComponent,
|
||||||
@ -66,6 +67,7 @@ impl App {
|
|||||||
focus: Focus::WorkDir,
|
focus: Focus::WorkDir,
|
||||||
diff_target: DiffTarget::WorkingDir,
|
diff_target: DiffTarget::WorkingDir,
|
||||||
do_quit: false,
|
do_quit: false,
|
||||||
|
reset: ResetComponent::new(queue.clone()),
|
||||||
commit: CommitComponent::default(),
|
commit: CommitComponent::default(),
|
||||||
help: HelpComponent::default(),
|
help: HelpComponent::default(),
|
||||||
index_wd: ChangesComponent::new(
|
index_wd: ChangesComponent::new(
|
||||||
@ -151,6 +153,7 @@ impl App {
|
|||||||
|
|
||||||
self.commit.draw(f, f.size());
|
self.commit.draw(f, f.size());
|
||||||
self.help.draw(f, f.size());
|
self.help.draw(f, f.size());
|
||||||
|
self.reset.draw(f, f.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
@ -277,6 +280,10 @@ impl App {
|
|||||||
self.update();
|
self.update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
InternalEvent::ConfirmResetFile(p) => {
|
||||||
|
self.reset.open_for_path(p);
|
||||||
|
self.update_commands();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -292,8 +299,9 @@ impl App {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let main_cmds_available =
|
let main_cmds_available = !self.commit.is_visible()
|
||||||
!self.commit.is_visible() && !self.help.is_visible();
|
&& !self.help.is_visible()
|
||||||
|
&& !self.reset.is_visible();
|
||||||
|
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@ -349,6 +357,7 @@ impl App {
|
|||||||
|
|
||||||
fn components(&self) -> Vec<&dyn Component> {
|
fn components(&self) -> Vec<&dyn Component> {
|
||||||
vec![
|
vec![
|
||||||
|
&self.reset,
|
||||||
&self.commit,
|
&self.commit,
|
||||||
&self.help,
|
&self.help,
|
||||||
&self.index,
|
&self.index,
|
||||||
@ -359,6 +368,7 @@ impl App {
|
|||||||
|
|
||||||
fn components_mut(&mut self) -> Vec<&mut dyn Component> {
|
fn components_mut(&mut self) -> Vec<&mut dyn Component> {
|
||||||
vec![
|
vec![
|
||||||
|
&mut self.reset,
|
||||||
&mut self.commit,
|
&mut self.commit,
|
||||||
&mut self.help,
|
&mut self.help,
|
||||||
&mut self.index,
|
&mut self.index,
|
||||||
|
@ -124,7 +124,7 @@ impl ChangesComponent {
|
|||||||
if let Some(i) = self.selection() {
|
if let Some(i) = self.selection() {
|
||||||
self.queue
|
self.queue
|
||||||
.borrow_mut()
|
.borrow_mut()
|
||||||
.push_back(InternalEvent::ResetFile(i.path));
|
.push_back(InternalEvent::ConfirmResetFile(i.path));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -6,11 +6,13 @@ mod command;
|
|||||||
mod commit;
|
mod commit;
|
||||||
mod diff;
|
mod diff;
|
||||||
mod help;
|
mod help;
|
||||||
|
mod reset;
|
||||||
pub use changes::ChangesComponent;
|
pub use changes::ChangesComponent;
|
||||||
pub use command::{CommandInfo, CommandText};
|
pub use command::{CommandInfo, CommandText};
|
||||||
pub use commit::CommitComponent;
|
pub use commit::CommitComponent;
|
||||||
pub use diff::DiffComponent;
|
pub use diff::DiffComponent;
|
||||||
pub use help::HelpComponent;
|
pub use help::HelpComponent;
|
||||||
|
pub use reset::ResetComponent;
|
||||||
|
|
||||||
///
|
///
|
||||||
pub enum EventUpdate {
|
pub enum EventUpdate {
|
||||||
|
124
src/components/reset.rs
Normal file
124
src/components/reset.rs
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
use super::{
|
||||||
|
visibility_blocking, CommandBlocking, CommandInfo, Component,
|
||||||
|
DrawableComponent, EventUpdate,
|
||||||
|
};
|
||||||
|
use crate::{
|
||||||
|
queue::{InternalEvent, Queue},
|
||||||
|
strings, ui,
|
||||||
|
};
|
||||||
|
|
||||||
|
use crossterm::event::{Event, KeyCode};
|
||||||
|
use std::borrow::Cow;
|
||||||
|
use strings::commands;
|
||||||
|
use tui::{
|
||||||
|
backend::Backend,
|
||||||
|
layout::{Alignment, Rect},
|
||||||
|
style::{Color, Style},
|
||||||
|
widgets::{Block, Borders, Paragraph, Text, Widget},
|
||||||
|
Frame,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub struct ResetComponent {
|
||||||
|
path: String,
|
||||||
|
visible: bool,
|
||||||
|
queue: Queue,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DrawableComponent for ResetComponent {
|
||||||
|
fn draw<B: Backend>(&self, f: &mut Frame<B>, _rect: Rect) {
|
||||||
|
if self.visible {
|
||||||
|
let mut txt = Vec::new();
|
||||||
|
txt.push(Text::Styled(
|
||||||
|
Cow::from(strings::RESET_MSG),
|
||||||
|
Style::default().fg(Color::Red),
|
||||||
|
));
|
||||||
|
|
||||||
|
ui::Clear::new(
|
||||||
|
Paragraph::new(txt.iter())
|
||||||
|
.block(
|
||||||
|
Block::default()
|
||||||
|
.title(strings::RESET_TITLE)
|
||||||
|
.borders(Borders::ALL),
|
||||||
|
)
|
||||||
|
.alignment(Alignment::Left),
|
||||||
|
)
|
||||||
|
.render(f, ui::centered_rect(30, 20, f.size()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Component for ResetComponent {
|
||||||
|
fn commands(
|
||||||
|
&self,
|
||||||
|
out: &mut Vec<CommandInfo>,
|
||||||
|
_force_all: bool,
|
||||||
|
) -> CommandBlocking {
|
||||||
|
out.push(CommandInfo::new(
|
||||||
|
commands::RESET_CONFIRM,
|
||||||
|
true,
|
||||||
|
self.visible,
|
||||||
|
));
|
||||||
|
out.push(CommandInfo::new(
|
||||||
|
commands::CLOSE_POPUP,
|
||||||
|
true,
|
||||||
|
self.visible,
|
||||||
|
));
|
||||||
|
|
||||||
|
visibility_blocking(self)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn event(&mut self, ev: Event) -> Option<EventUpdate> {
|
||||||
|
if self.visible {
|
||||||
|
if let Event::Key(e) = ev {
|
||||||
|
return Some(match e.code {
|
||||||
|
KeyCode::Esc => {
|
||||||
|
self.hide();
|
||||||
|
EventUpdate::Commands
|
||||||
|
}
|
||||||
|
KeyCode::Enter => {
|
||||||
|
self.confirm();
|
||||||
|
EventUpdate::None
|
||||||
|
}
|
||||||
|
|
||||||
|
_ => EventUpdate::None,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_visible(&self) -> bool {
|
||||||
|
self.visible
|
||||||
|
}
|
||||||
|
|
||||||
|
fn hide(&mut self) {
|
||||||
|
self.visible = false
|
||||||
|
}
|
||||||
|
|
||||||
|
fn show(&mut self) {
|
||||||
|
self.visible = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ResetComponent {
|
||||||
|
///
|
||||||
|
pub fn new(queue: Queue) -> Self {
|
||||||
|
Self {
|
||||||
|
path: String::default(),
|
||||||
|
visible: false,
|
||||||
|
queue,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
///
|
||||||
|
pub fn open_for_path(&mut self, path: &str) {
|
||||||
|
self.path = path.to_string();
|
||||||
|
self.show();
|
||||||
|
}
|
||||||
|
///
|
||||||
|
pub fn confirm(&mut self) {
|
||||||
|
self.hide();
|
||||||
|
self.queue
|
||||||
|
.borrow_mut()
|
||||||
|
.push_back(InternalEvent::ResetFile(self.path.clone()));
|
||||||
|
}
|
||||||
|
}
|
@ -2,6 +2,8 @@ use std::{cell::RefCell, collections::VecDeque, rc::Rc};
|
|||||||
|
|
||||||
///
|
///
|
||||||
pub enum InternalEvent {
|
pub enum InternalEvent {
|
||||||
|
///
|
||||||
|
ConfirmResetFile(String),
|
||||||
///
|
///
|
||||||
ResetFile(String),
|
ResetFile(String),
|
||||||
}
|
}
|
||||||
|
@ -6,10 +6,11 @@ pub static TAB_STATUS: &str = "Status";
|
|||||||
pub static TAB_DIVIDER: &str = " | ";
|
pub static TAB_DIVIDER: &str = " | ";
|
||||||
|
|
||||||
pub static CMD_SPLITTER: &str = " ";
|
pub static CMD_SPLITTER: &str = " ";
|
||||||
// pub static CMD_SCROLL: &str = "Scroll [\u{2191}\u{2193}]"; //↑↓
|
|
||||||
|
|
||||||
pub static COMMIT_TITLE: &str = "Commit";
|
pub static COMMIT_TITLE: &str = "Commit";
|
||||||
pub static COMMIT_MSG: &str = "type commit message..";
|
pub static COMMIT_MSG: &str = "type commit message..";
|
||||||
|
pub static RESET_TITLE: &str = "Reset";
|
||||||
|
pub static RESET_MSG: &str = "confirm file reset?";
|
||||||
|
|
||||||
pub static HELP_TITLE: &str = "Help";
|
pub static HELP_TITLE: &str = "Help";
|
||||||
|
|
||||||
@ -98,4 +99,10 @@ pub mod commands {
|
|||||||
"quit gitui application",
|
"quit gitui application",
|
||||||
CMD_GROUP_GENERAL,
|
CMD_GROUP_GENERAL,
|
||||||
);
|
);
|
||||||
|
///
|
||||||
|
pub static RESET_CONFIRM: CommandText = CommandText::new(
|
||||||
|
"Confirm [enter]",
|
||||||
|
"resets the file in question",
|
||||||
|
CMD_GROUP_GENERAL,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user