switch to new command texts

This commit is contained in:
Stephan Dilly 2020-04-03 16:24:52 +02:00
parent ed5668c4c8
commit 2282305e7c
8 changed files with 169 additions and 97 deletions

View file

@ -15,6 +15,7 @@ use crossterm::event::Event;
use itertools::Itertools;
use log::trace;
use std::borrow::Cow;
use strings::commands;
use tui::{
backend::Backend,
layout::{Alignment, Constraint, Direction, Layout, Rect},
@ -256,7 +257,8 @@ impl App {
let mut res = Vec::new();
for c in self.components() {
if c.commands(&mut res) != CommandBlocking::PassingOn
if c.commands(&mut res, force_all)
!= CommandBlocking::PassingOn
&& !force_all
{
break;
@ -271,9 +273,8 @@ impl App {
let focus_on_stage = self.focus == Focus::Stage;
let focus_not_diff = self.focus != Focus::Diff;
res.push(
CommandInfo::new(
strings::CMD_STATUS_FOCUS_UNSTAGED,
strings::CMD_GROUP_GENERAL,
CommandInfo::new_new(
commands::STATUS_FOCUS_UNSTAGED,
true,
main_cmds_available
&& focus_on_stage
@ -282,9 +283,8 @@ impl App {
.hidden(),
);
res.push(
CommandInfo::new(
strings::CMD_STATUS_FOCUS_STAGED,
strings::CMD_GROUP_GENERAL,
CommandInfo::new_new(
commands::STATUS_FOCUS_STAGED,
true,
main_cmds_available
&& !focus_on_stage
@ -295,24 +295,21 @@ impl App {
}
{
let focus_on_diff = self.focus == Focus::Diff;
res.push(CommandInfo::new(
strings::CMD_STATUS_LEFT,
strings::CMD_GROUP_GENERAL,
res.push(CommandInfo::new_new(
commands::STATUS_FOCUS_LEFT,
true,
main_cmds_available && focus_on_diff,
));
res.push(CommandInfo::new(
strings::CMD_STATUS_RIGHT,
strings::CMD_GROUP_GENERAL,
res.push(CommandInfo::new_new(
commands::STATUS_FOCUS_RIGHT,
true,
main_cmds_available && !focus_on_diff,
));
}
res.push(
CommandInfo::new(
strings::CMD_STATUS_QUIT,
strings::CMD_GROUP_GENERAL,
CommandInfo::new_new(
commands::QUIT,
true,
main_cmds_available,
)
@ -376,7 +373,7 @@ impl App {
.filter_map(|c| {
if c.show_in_quickbar() {
Some(Text::Styled(
Cow::from(c.name.clone()),
Cow::from(c.text.name.clone()),
if c.enabled {
style_enabled
} else {

View file

@ -11,6 +11,7 @@ use std::{
convert::{From, TryFrom},
path::Path,
};
use strings::commands;
use tui::{
backend::Backend,
layout::Rect,
@ -173,33 +174,30 @@ impl Component for ChangesComponent {
fn commands(
&self,
out: &mut Vec<CommandInfo>,
_force_all: bool,
) -> CommandBlocking {
let some_selection = self.selection().is_some();
if self.is_working_dir {
out.push(CommandInfo::new(
strings::CMD_STATUS_STAGE,
strings::CMD_GROUP_CHANGES,
out.push(CommandInfo::new_new(
commands::STAGE_FILE,
some_selection,
self.focused,
));
out.push(CommandInfo::new(
strings::CMD_STATUS_RESET,
strings::CMD_GROUP_CHANGES,
out.push(CommandInfo::new_new(
commands::RESET_FILE,
some_selection,
self.focused,
));
} else {
out.push(CommandInfo::new(
strings::CMD_STATUS_UNSTAGE,
strings::CMD_GROUP_CHANGES,
out.push(CommandInfo::new_new(
commands::UNSTAGE_FILE,
some_selection,
self.focused,
));
}
out.push(CommandInfo::new(
strings::CMD_SCROLL,
strings::CMD_GROUP_GENERAL,
out.push(CommandInfo::new_new(
commands::SCROLL,
self.items.len() > 1,
self.focused,
));

View file

@ -1,13 +1,28 @@
///
#[derive(Copy, Clone)]
pub struct CommandText {
///
pub name: &'static str,
///
pub desc: &'static str,
///
pub group: &'static str,
}
impl CommandText {
pub const fn new(
name: &'static str,
desc: &'static str,
group: &'static str,
) -> Self {
Self { name, desc, group }
}
}
///
pub struct CommandInfo {
///
pub name: String,
///
pub group: String,
///
pub desc: String,
///
// pub keys:
pub text: CommandText,
/// available but not active in the context
pub enabled: bool,
/// will show up in the quick bar
@ -20,16 +35,13 @@ pub struct CommandInfo {
impl CommandInfo {
///
pub fn new(
name: &str,
group: &str,
pub fn new_new(
text: CommandText,
enabled: bool,
available: bool,
) -> Self {
Self {
name: name.to_string(),
group: group.to_string(),
desc: String::default(),
text,
enabled,
quick_bar: true,
available,
@ -43,12 +55,6 @@ impl CommandInfo {
res
}
///
pub fn desc(self, txt: &str) -> Self {
let mut res = self;
res.desc = txt.to_string();
res
}
///
pub fn hidden(self) -> Self {
let mut res = self;
res.quick_bar = false;
@ -56,7 +62,7 @@ impl CommandInfo {
}
///
pub fn print(&self, out: &mut String) {
out.push_str(self.name.as_str());
out.push_str(self.text.name);
}
///
pub fn show_in_quickbar(&self) -> bool {

View file

@ -6,6 +6,7 @@ use crate::{keys, strings, ui};
use asyncgit::{sync, CWD};
use crossterm::event::{Event, KeyCode};
use std::borrow::Cow;
use strings::commands;
use tui::{
backend::Backend,
layout::{Alignment, Rect},
@ -17,7 +18,6 @@ use tui::{
#[derive(Default)]
pub struct CommitComponent {
msg: String,
// focused: bool,
visible: bool,
stage_empty: bool,
}
@ -52,22 +52,20 @@ impl Component for CommitComponent {
fn commands(
&self,
out: &mut Vec<CommandInfo>,
_force_all: bool,
) -> CommandBlocking {
out.push(CommandInfo::new(
strings::COMMIT_CMD_OPEN,
strings::CMD_GROUP_COMMIT,
out.push(CommandInfo::new_new(
commands::COMMIT_OPEN,
!self.stage_empty,
!self.visible,
));
out.push(CommandInfo::new(
strings::COMMIT_CMD_ENTER,
strings::CMD_GROUP_COMMIT,
out.push(CommandInfo::new_new(
commands::COMMIT_ENTER,
self.can_commit(),
self.visible,
));
out.push(CommandInfo::new(
strings::COMMIT_CMD_CLOSE,
strings::CMD_GROUP_COMMIT,
out.push(CommandInfo::new_new(
commands::CLOSE_POPUP,
true,
self.visible,
));

View file

@ -6,6 +6,7 @@ use crate::{
use asyncgit::{hash, Diff, DiffLine, DiffLineType};
use crossterm::event::{Event, KeyCode};
use std::{borrow::Cow, cmp, convert::TryFrom};
use strings::commands;
use tui::{
backend::Backend,
layout::{Alignment, Rect},
@ -245,10 +246,10 @@ impl Component for DiffComponent {
fn commands(
&self,
out: &mut Vec<CommandInfo>,
_force_all: bool,
) -> CommandBlocking {
out.push(CommandInfo::new(
strings::CMD_SCROLL,
strings::CMD_GROUP_DIFF,
out.push(CommandInfo::new_new(
commands::SCROLL,
self.can_scroll(),
self.focused,
));

View file

@ -7,6 +7,7 @@ use asyncgit::hash;
use crossterm::event::Event;
use itertools::Itertools;
use std::{borrow::Cow, cmp, convert::TryFrom};
use strings::commands;
use tui::{
backend::Backend,
layout::{Alignment, Rect},
@ -58,33 +59,30 @@ impl Component for HelpComponent {
fn commands(
&self,
out: &mut Vec<CommandInfo>,
force_all: bool,
) -> CommandBlocking {
// only if help is open we have no other commands available
if self.visible {
if self.visible && !force_all {
out.clear();
}
out.push(
CommandInfo::new(
strings::CMD_STATUS_HELP,
strings::CMD_GROUP_GENERAL,
CommandInfo::new_new(
commands::HELP_OPEN,
true,
!self.visible,
)
.desc("open this help screen")
.order(99),
);
out.push(CommandInfo::new(
strings::CMD_SCROLL,
strings::CMD_GROUP_GENERAL,
out.push(CommandInfo::new_new(
commands::SCROLL,
true,
self.visible,
));
out.push(CommandInfo::new(
strings::COMMIT_CMD_CLOSE,
strings::CMD_GROUP_GENERAL,
out.push(CommandInfo::new_new(
commands::CLOSE_POPUP,
true,
self.visible,
));
@ -129,7 +127,7 @@ impl HelpComponent {
///
pub fn set_cmds(&mut self, cmds: Vec<CommandInfo>) {
self.cmds = cmds;
self.cmds.sort_by_key(|e| hash(&e.group));
self.cmds.sort_by_key(|e| hash(&e.text.group));
}
fn move_selection(&mut self, inc: bool) {
@ -154,7 +152,7 @@ impl HelpComponent {
let mut selected_line = 0_u16;
for (key, group) in
&self.cmds.iter().group_by(|e| e.group.clone())
&self.cmds.iter().group_by(|e| e.text.group.clone())
{
txt.push(Text::Styled(
Cow::from(format!(" {}\n", key)),
@ -182,7 +180,8 @@ impl HelpComponent {
if is_selected {
out.push_str(
format!(" {}\n", e.desc).as_str(),
format!(" {}\n", e.text.desc)
.as_str(),
);
}

View file

@ -7,7 +7,7 @@ mod commit;
mod diff;
mod help;
pub use changes::ChangesComponent;
pub use command::CommandInfo;
pub use command::{CommandInfo, CommandText};
pub use commit::CommitComponent;
pub use diff::DiffComponent;
pub use help::HelpComponent;
@ -45,8 +45,11 @@ pub trait DrawableComponent {
///
pub trait Component {
///
fn commands(&self, out: &mut Vec<CommandInfo>)
-> CommandBlocking;
fn commands(
&self,
out: &mut Vec<CommandInfo>,
force_all: bool,
) -> CommandBlocking;
///
fn event(&mut self, ev: Event) -> Option<EventUpdate>;
///

View file

@ -5,27 +5,97 @@ pub static TITLE_INDEX: &str = "Staged Changes [2]";
pub static TAB_STATUS: &str = "Status";
pub static TAB_DIVIDER: &str = " | ";
pub static CMD_GROUP_GENERAL: &str = "General";
pub static CMD_GROUP_DIFF: &str = "Diff";
pub static CMD_GROUP_CHANGES: &str = "Changes";
pub static CMD_GROUP_COMMIT: &str = "Commit";
pub static CMD_STATUS_FOCUS_UNSTAGED: &str = "Unstaged [1]";
pub static CMD_STATUS_FOCUS_STAGED: &str = "Staged [2]";
pub static CMD_STATUS_STAGE: &str = "Stage File [enter]";
pub static CMD_STATUS_UNSTAGE: &str = "Unstage File [enter]";
pub static CMD_STATUS_RESET: &str = "Reset File [D]";
pub static CMD_STATUS_QUIT: &str = "Quit [esc,q]";
pub static CMD_STATUS_HELP: &str = "Help [h]";
pub static CMD_STATUS_LEFT: &str = "Back [\u{2190}]"; //←
pub static CMD_STATUS_RIGHT: &str = "Diff [\u{2192}]"; //→
pub static CMD_SPLITTER: &str = " ";
pub static CMD_SCROLL: &str = "Scroll [\u{2191}\u{2193}]"; //↑↓
// pub static CMD_SCROLL: &str = "Scroll [\u{2191}\u{2193}]"; //↑↓
pub static COMMIT_TITLE: &str = "Commit";
pub static COMMIT_MSG: &str = "type commit message..";
pub static COMMIT_CMD_OPEN: &str = "Commit [c]";
pub static COMMIT_CMD_ENTER: &str = "Commit [enter]";
pub static COMMIT_CMD_CLOSE: &str = "Close [esc]";
pub static HELP_TITLE: &str = "Help";
pub mod commands {
use crate::components::CommandText;
static CMD_GROUP_GENERAL: &str = "General";
static CMD_GROUP_CHANGES: &str = "Changes";
static CMD_GROUP_COMMIT: &str = "Commit";
///
pub static HELP_OPEN: CommandText = CommandText::new(
"Help [h]",
"open this help screen",
CMD_GROUP_GENERAL,
);
///
pub static SCROLL: CommandText = CommandText::new(
"Scroll [\u{2191}\u{2193}]",
"scroll up or down in focused view",
CMD_GROUP_GENERAL,
);
///
pub static CLOSE_POPUP: CommandText = CommandText::new(
"Close [esc]",
"close popup",
CMD_GROUP_GENERAL,
);
///
pub static COMMIT_OPEN: CommandText = CommandText::new(
"Commit [c]",
"open commit view (available in non-empty stage)",
CMD_GROUP_COMMIT,
);
///
pub static COMMIT_ENTER: CommandText = CommandText::new(
"Commit [enter]",
"commit (available when commit message is non-empty)",
CMD_GROUP_COMMIT,
);
///
pub static STAGE_FILE: CommandText = CommandText::new(
"Stage File [enter]",
"stage currently selected file",
CMD_GROUP_CHANGES,
);
///
pub static UNSTAGE_FILE: CommandText = CommandText::new(
"Unstage File [enter]",
"remove currently selected file from stage",
CMD_GROUP_CHANGES,
);
///
pub static RESET_FILE: CommandText = CommandText::new(
"Reset File [D]",
"revert changes in selected file",
CMD_GROUP_CHANGES,
);
///
pub static STATUS_FOCUS_UNSTAGED: CommandText = CommandText::new(
"Unstaged [1]",
"view changes in working dir",
CMD_GROUP_GENERAL,
);
///
pub static STATUS_FOCUS_STAGED: CommandText = CommandText::new(
"Staged [2]",
"view staged changes",
CMD_GROUP_GENERAL,
);
///
pub static STATUS_FOCUS_LEFT: CommandText = CommandText::new(
"Back [\u{2190}]", //←
"view staged changes",
CMD_GROUP_GENERAL,
);
///
pub static STATUS_FOCUS_RIGHT: CommandText = CommandText::new(
"Diff [\u{2192}]", //→
"inspect file diff",
CMD_GROUP_GENERAL,
);
///
pub static QUIT: CommandText = CommandText::new(
"Quit [esc,q]",
"quit gitui application",
CMD_GROUP_GENERAL,
);
}