From 18fa349a36949e7e723f531cda84cc461cf35948 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Tue, 14 Jan 2025 22:22:03 +0000 Subject: [PATCH 01/50] compiles --- Cargo.lock | 1 + Cargo.toml | 1 + src/app.rs | 16 +- src/keys/key_list.rs | 4 + src/popups/conventional_commit.rs | 350 ++++++++++++++++++++++++++++++ src/popups/mod.rs | 2 + src/queue.rs | 2 + src/strings.rs | 12 + src/tabs/status.rs | 25 ++- 9 files changed, 406 insertions(+), 7 deletions(-) create mode 100644 src/popups/conventional_commit.rs diff --git a/Cargo.lock b/Cargo.lock index 2a23fcee0a..230ca3378b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1193,6 +1193,7 @@ dependencies = [ "shellexpand", "simplelog", "struct-patch", + "strum", "syntect", "tempfile", "tui-textarea", diff --git a/Cargo.toml b/Cargo.toml index ca38b6f5a5..666539beef 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -51,6 +51,7 @@ serde = "1.0" shellexpand = "3.1" simplelog = { version = "0.12", default-features = false } struct-patch = "0.8" +strum = "0.26.3" syntect = { version = "5.2", default-features = false, features = [ "parsing", "default-syntaxes", diff --git a/src/app.rs b/src/app.rs index 45037f048f..1206e61c20 100644 --- a/src/app.rs +++ b/src/app.rs @@ -11,9 +11,9 @@ use crate::{ popup_stack::PopupStack, popups::{ AppOption, BlameFilePopup, BranchListPopup, CommitPopup, - CompareCommitsPopup, ConfirmPopup, CreateBranchPopup, - CreateRemotePopup, ExternalEditorPopup, FetchPopup, - FileRevlogPopup, FuzzyFindPopup, HelpPopup, + CompareCommitsPopup, ConfirmPopup, ConventionalCommitPopup, + CreateBranchPopup, CreateRemotePopup, ExternalEditorPopup, + FetchPopup, FileRevlogPopup, FuzzyFindPopup, HelpPopup, InspectCommitPopup, LogSearchPopupPopup, MsgPopup, OptionsPopup, PullPopup, PushPopup, PushTagsPopup, RemoteListPopup, RenameBranchPopup, RenameRemotePopup, @@ -93,6 +93,7 @@ pub struct App { update_remote_url_popup: UpdateRemoteUrlPopup, remotes_popup: RemoteListPopup, rename_branch_popup: RenameBranchPopup, + conventional_commit_popup: ConventionalCommitPopup, select_branch_popup: BranchListPopup, options_popup: OptionsPopup, submodule_popup: SubmodulesListPopup, @@ -200,6 +201,9 @@ impl App { update_remote_url_popup: UpdateRemoteUrlPopup::new(&env), remotes_popup: RemoteListPopup::new(&env), rename_branch_popup: RenameBranchPopup::new(&env), + conventional_commit_popup: ConventionalCommitPopup::new( + &env, + ), select_branch_popup: BranchListPopup::new(&env), tags_popup: TagListPopup::new(&env), options_popup: OptionsPopup::new(&env), @@ -458,6 +462,7 @@ impl App { || self.fetch_popup.any_work_pending() || self.revision_files_popup.any_work_pending() || self.tags_popup.any_work_pending() + || self.conventional_commit_popup.any_work_pending() } /// @@ -481,6 +486,7 @@ impl App { msg_popup, confirm_popup, commit_popup, + conventional_commit_popup, blame_file_popup, file_revlog_popup, stashmsg_popup, @@ -520,6 +526,7 @@ impl App { stashmsg_popup, help_popup, inspect_commit_popup, + conventional_commit_popup, compare_commits_popup, blame_file_popup, file_revlog_popup, @@ -738,6 +745,9 @@ impl App { } InternalEvent::Update(u) => flags.insert(u), InternalEvent::OpenCommit => self.commit_popup.show()?, + InternalEvent::OpenConventionalCommit => { + self.conventional_commit_popup.show()? + } InternalEvent::RewordCommit(id) => { self.commit_popup.open(Some(id))?; } diff --git a/src/keys/key_list.rs b/src/keys/key_list.rs index 0f2909a2fe..2433bdeca1 100644 --- a/src/keys/key_list.rs +++ b/src/keys/key_list.rs @@ -49,6 +49,7 @@ pub struct KeysList { pub quit: GituiKeyEvent, pub exit_popup: GituiKeyEvent, pub open_commit: GituiKeyEvent, + pub open_conventional_commit: GituiKeyEvent, pub open_commit_editor: GituiKeyEvent, pub open_help: GituiKeyEvent, pub open_options: GituiKeyEvent, @@ -128,6 +129,7 @@ pub struct KeysList { pub commit_history_next: GituiKeyEvent, pub commit: GituiKeyEvent, pub newline: GituiKeyEvent, + pub insert: GituiKeyEvent, } #[rustfmt::skip] @@ -146,6 +148,7 @@ impl Default for KeysList { quit: GituiKeyEvent::new(KeyCode::Char('q'), KeyModifiers::empty()), exit_popup: GituiKeyEvent::new(KeyCode::Esc, KeyModifiers::empty()), open_commit: GituiKeyEvent::new(KeyCode::Char('c'), KeyModifiers::empty()), + open_conventional_commit: GituiKeyEvent::new(KeyCode::Char('C'), KeyModifiers::empty()), open_commit_editor: GituiKeyEvent::new(KeyCode::Char('e'), KeyModifiers::CONTROL), open_help: GituiKeyEvent::new(KeyCode::Char('h'), KeyModifiers::empty()), open_options: GituiKeyEvent::new(KeyCode::Char('o'), KeyModifiers::empty()), @@ -175,6 +178,7 @@ impl Default for KeysList { stashing_save: GituiKeyEvent::new(KeyCode::Char('s'), KeyModifiers::empty()), stashing_toggle_untracked: GituiKeyEvent::new(KeyCode::Char('u'), KeyModifiers::empty()), stashing_toggle_index: GituiKeyEvent::new(KeyCode::Char('i'), KeyModifiers::empty()), + insert: GituiKeyEvent::new(KeyCode::Char('i'), KeyModifiers::empty()), stash_apply: GituiKeyEvent::new(KeyCode::Char('a'), KeyModifiers::empty()), stash_open: GituiKeyEvent::new(KeyCode::Right, KeyModifiers::empty()), stash_drop: GituiKeyEvent::new(KeyCode::Char('D'), KeyModifiers::SHIFT), diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs new file mode 100644 index 0000000000..a59a6387a6 --- /dev/null +++ b/src/popups/conventional_commit.rs @@ -0,0 +1,350 @@ +use std::borrow::Cow; + +use anyhow::Result; +use crossterm::event::{Event, KeyCode}; +use itertools::Itertools; +use ratatui::text::Line; +use ratatui::Frame; +use ratatui::{ + layout::{Constraint, Direction, Layout, Margin, Rect}, + text::Span, + widgets::{Block, Borders, Clear}, +}; +use strum::{Display, EnumIter, IntoEnumIterator}; +use unicode_segmentation::UnicodeSegmentation; + +use crate::components::visibility_blocking; +use crate::string_utils::trim_length_left; +use crate::ui::style::SharedTheme; +use crate::{ + app::Environment, + components::{ + CommandBlocking, CommandInfo, Component, DrawableComponent, + EventState, InputType, ScrollType, TextInputComponent, + }, + keys::{key_match, SharedKeyConfig}, + ui, +}; + +#[derive(EnumIter, Display, Clone)] +enum CommitType {} + +pub struct ConventionalCommitPopup { + key_config: SharedKeyConfig, + is_visible: bool, + is_insert: bool, + query: Option, + selected_index: usize, + options: Vec, + query_results: Vec, + input: TextInputComponent, + theme: SharedTheme, +} + +impl ConventionalCommitPopup { + /// + // pub fn new(env: &Environment) -> Self { + pub fn new(env: &Environment) -> Self { + let mut input = + TextInputComponent::new(env, "", "Filter ", false) + .with_input_type(InputType::Singleline); + input.embed(); + + Self { + selected_index: 0, + input, + options: CommitType::iter().collect_vec(), + query_results: CommitType::iter().collect_vec(), + is_insert: false, + query: None, + is_visible: false, + key_config: env.key_config.clone(), + theme: env.theme.clone(), + } + } + + #[inline] + fn draw_matches_list(&self, f: &mut Frame, mut area: Rect) { + { + // Block has two lines up and down which need to be considered + const HEIGHT_BLOCK_MARGIN: usize = 2; + + let title = + format!("Results: {}", self.query_results.len()); + + let height = usize::from(area.height); + let width = usize::from(area.width); + + let list_height = + height.saturating_sub(HEIGHT_BLOCK_MARGIN); + + let scroll_skip = + self.selected_index.saturating_sub(list_height); + let quick_shortcuts = self.quick_shortcuts(); + + let items = self + .query_results + .iter() + .enumerate() + .take(height) + .map(|(idx, commit_type)| { + let selected = self.selected_index == idx; + let commit_type_string = commit_type.to_string(); + let text = trim_length_left( + commit_type_string.as_str(), + width - 4, // ` [k]` + ); + let text = format!( + "{:w$} [{}]", + text, + quick_shortcuts[idx], + w = width, + ); + + Line::from( + text.graphemes(true) + .enumerate() + .map(|(c_idx, c)| { + Span::styled( + Cow::from(c.to_string()), + self.theme + .text(selected, selected), + ) + }) + .collect::>(), + ) + }); + + ui::draw_list_block( + f, + area, + Block::default() + .title(Span::styled( + title, + self.theme.title(true), + )) + .borders(Borders::TOP), + items, + ); + } + } + + pub fn quick_shortcuts(&self) -> Vec { + // Missing `i`, because `i` is mapped to insert sorry~ + let default = "qwertyuopasdfghjklmzxcvbn"; + + let dont_map_keys = [ + self.key_config.keys.move_down, + self.key_config.keys.move_up, + self.key_config.keys.exit_popup, + self.key_config.keys.exit, + self.key_config.keys.insert, + ] + .into_iter() + .filter_map(|k| { + if let KeyCode::Char(c) = k.code { + Some(c) + } else { + None + } + }) + .collect_vec(); + + default + .chars() + .filter(|c| !dont_map_keys.contains(c)) + .take(self.query_results.len()) + .collect_vec() + } + + pub fn move_selection(&mut self, direction: ScrollType) { + let new_selection = match direction { + ScrollType::Up => self.selected_index.saturating_sub(1), + ScrollType::Down => self.selected_index.saturating_add(1), + _ => self.selected_index, + }; + + // println!("{} {}", self.query, self.input); + + let new_selection = new_selection.clamp(0, todo!()); + // .clamp(0, self.filtered.len().saturating_sub(1)); + // .clamp(0, self.filtered.len().saturating_sub(1)); + + // if new_selection != self.selection { + self.selected_index = new_selection; + // return true; + // } + // + // false + } + + pub fn any_work_pending(&self) -> bool { + false + } + + fn update_query(&mut self) { + if self + .query + .as_ref() + .map_or(true, |q| q != self.input.get_text()) + { + self.set_query(self.input.get_text().to_string()); + } + } + + fn set_query(&mut self, query: String) { + self.query = Some(query.clone()); + self.query_results = self + .options + .iter() + .filter(|option| option.to_string() == query) + .cloned() + .collect_vec(); + } +} + +impl DrawableComponent for ConventionalCommitPopup { + fn draw(&self, f: &mut Frame, area: Rect) -> Result<()> { + // if self.is_visible() { + // self.input.draw(f, rect)?; + // self.draw_warnings(f); + // } + // + // Ok(()) + if self.is_visible { + const MAX_SIZE: (u16, u16) = (50, 20); + + let area = ui::centered_rect_absolute( + MAX_SIZE.0, MAX_SIZE.1, area, + ); + + f.render_widget(Clear, area); + f.render_widget( + Block::default() + .borders(Borders::all()) + .style(self.theme.title(true)) + .title(Span::styled( + "owo", + self.theme.title(true), + )), + area, + ); + + let chunks = Layout::default() + .direction(Direction::Vertical) + .constraints( + [ + Constraint::Length(1), + Constraint::Percentage(100), + ] + .as_ref(), + ) + .split(area.inner(Margin { + horizontal: 1, + vertical: 1, + })); + + self.input.draw(f, chunks[0])?; + + self.draw_matches_list(f, chunks[1]); + } + + Ok(()) + } +} + +impl Component for ConventionalCommitPopup { + fn commands( + &self, + out: &mut Vec, + force_all: bool, + ) -> CommandBlocking { + // if self.is_visible() || force_all { + // self.input.commands(out, force_all); + // + // out.push(CommandInfo::new( + // strings::commands::create_branch_confirm_msg( + // &self.key_config, + // ), + // true, + // true, + // )); + // } + // + if self.is_visible() || force_all { + // out.push(CommandInfo::new( + // strings::commands::scroll_popup(&self.key_config), + // true, + // true, + // )); + // + // out.push(CommandInfo::new( + // strings::commands::close_fuzzy_finder( + // &self.key_config, + // ), + // true, + // true, + // )); + } + + visibility_blocking(self) + + // todo!() + } + + fn event( + &mut self, + event: &crossterm::event::Event, + ) -> Result { + if self.is_visible() { + if self.is_insert { + println!("lol"); + } + if let Event::Key(key) = event { + if key_match(key, self.key_config.keys.exit_popup) + || key_match(key, self.key_config.keys.enter) + { + self.hide(); + } else if key_match(key, self.key_config.keys.insert) + { + self.is_insert = true; + } else if key_match( + key, + self.key_config.keys.popup_down, + ) { + self.move_selection(ScrollType::Down); + } else if key_match( + key, + self.key_config.keys.popup_up, + ) { + self.move_selection(ScrollType::Up); + } else { + if self.input.event(event)?.is_consumed() { + self.update_query(); + } + } + } + + // if self.find_text.event(event)?.is_consumed() { + // self.update_query(); + // } + + return Ok(EventState::Consumed); + } + + Ok(EventState::NotConsumed) + } + + fn is_visible(&self) -> bool { + self.is_visible + } + + fn hide(&mut self) { + self.is_visible = false; + } + + fn show(&mut self) -> Result<()> { + self.is_visible = true; + Ok(()) + } +} diff --git a/src/popups/mod.rs b/src/popups/mod.rs index cb3ae1af74..3d1e5139db 100644 --- a/src/popups/mod.rs +++ b/src/popups/mod.rs @@ -3,6 +3,7 @@ mod branchlist; mod commit; mod compare_commits; mod confirm; +mod conventional_commit; mod create_branch; mod create_remote; mod externaleditor; @@ -33,6 +34,7 @@ pub use branchlist::BranchListPopup; pub use commit::CommitPopup; pub use compare_commits::CompareCommitsPopup; pub use confirm::ConfirmPopup; +pub use conventional_commit::ConventionalCommitPopup; pub use create_branch::CreateBranchPopup; pub use create_remote::CreateRemotePopup; pub use externaleditor::ExternalEditorPopup; diff --git a/src/queue.rs b/src/queue.rs index 44268a851d..b9f7459860 100644 --- a/src/queue.rs +++ b/src/queue.rs @@ -97,6 +97,8 @@ pub enum InternalEvent { StatusLastFileMoved, /// open commit msg input OpenCommit, + /// open conventional commit + OpenConventionalCommit, /// PopupStashing(StashingOptions), /// diff --git a/src/strings.rs b/src/strings.rs index c4cff10f70..0a3aafc984 100644 --- a/src/strings.rs +++ b/src/strings.rs @@ -1087,6 +1087,18 @@ pub mod commands { CMD_GROUP_GENERAL, ) } + pub fn commit_emoji_open( + key_config: &SharedKeyConfig, + ) -> CommandText { + CommandText::new( + format!( + "Commit emoji [{}]", + key_config.get_hint(key_config.keys.open_commit), + ), + "open commit emoji popups (available in non-empty stage)", + CMD_GROUP_GENERAL, + ) + } pub fn commit_open_editor( key_config: &SharedKeyConfig, ) -> CommandText { diff --git a/src/tabs/status.rs b/src/tabs/status.rs index 034ffe39e6..605604e154 100644 --- a/src/tabs/status.rs +++ b/src/tabs/status.rs @@ -686,8 +686,7 @@ impl Status { strings::commands::select_staging(&self.key_config), !focus_on_diff, (self.visible - && !focus_on_diff - && self.focus == Focus::WorkDir) + && !focus_on_diff && self.focus == Focus::WorkDir) || force_all, ) .order(strings::order::NAV), @@ -697,8 +696,7 @@ impl Status { strings::commands::select_unstaged(&self.key_config), !focus_on_diff, (self.visible - && !focus_on_diff - && self.focus == Focus::Stage) + && !focus_on_diff && self.focus == Focus::Stage) || force_all, ) .order(strings::order::NAV), @@ -736,6 +734,17 @@ impl Component for Status { .order(-1), ); + out.push( + CommandInfo::new( + strings::commands::commit_emoji_open( + &self.key_config, + ), + true, + self.can_commit() || force_all, + ) + .order(-1), + ); + out.push(CommandInfo::new( strings::commands::open_branch_select_popup( &self.key_config, @@ -832,6 +841,14 @@ impl Component for Status { { self.queue.push(InternalEvent::OpenCommit); Ok(EventState::Consumed) + } else if key_match( + k, + self.key_config.keys.open_conventional_commit, + ) && self.can_commit() + { + self.queue + .push(InternalEvent::OpenConventionalCommit); + Ok(EventState::Consumed) } else if key_match( k, self.key_config.keys.toggle_workarea, From 24998b2d0f57d77a582bf7b7479b11fe595ef2a7 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Tue, 14 Jan 2025 23:05:07 +0000 Subject: [PATCH 02/50] wip --- src/app.rs | 1 + src/keys/key_list.rs | 2 +- src/popups/conventional_commit.rs | 119 +++++++++++++++++++++++++++++- src/strings.rs | 4 +- 4 files changed, 121 insertions(+), 5 deletions(-) diff --git a/src/app.rs b/src/app.rs index 1206e61c20..fd6ad8ca96 100644 --- a/src/app.rs +++ b/src/app.rs @@ -289,6 +289,7 @@ impl App { /// pub fn event(&mut self, ev: InputEvent) -> Result<()> { + //println!("event: {:?}", ev); log::trace!("event: {:?}", ev); if let InputEvent::Input(ev) = ev { diff --git a/src/keys/key_list.rs b/src/keys/key_list.rs index 2433bdeca1..94262f5798 100644 --- a/src/keys/key_list.rs +++ b/src/keys/key_list.rs @@ -148,7 +148,7 @@ impl Default for KeysList { quit: GituiKeyEvent::new(KeyCode::Char('q'), KeyModifiers::empty()), exit_popup: GituiKeyEvent::new(KeyCode::Esc, KeyModifiers::empty()), open_commit: GituiKeyEvent::new(KeyCode::Char('c'), KeyModifiers::empty()), - open_conventional_commit: GituiKeyEvent::new(KeyCode::Char('C'), KeyModifiers::empty()), + open_conventional_commit: GituiKeyEvent::new(KeyCode::Char('C'), KeyModifiers::SHIFT), open_commit_editor: GituiKeyEvent::new(KeyCode::Char('e'), KeyModifiers::CONTROL), open_help: GituiKeyEvent::new(KeyCode::Char('h'), KeyModifiers::empty()), open_options: GituiKeyEvent::new(KeyCode::Char('o'), KeyModifiers::empty()), diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index a59a6387a6..91044080ee 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -27,7 +27,122 @@ use crate::{ }; #[derive(EnumIter, Display, Clone)] -enum CommitType {} +enum CommitType { + Refactor, + #[strum(to_string = "feat")] + Feature, + Fix, + Docs, + Style, + #[strum(to_string = "perf")] + Performance, + Test, + Build, + CI, + Chore, + Revert, + Initial, + Bump, + Wip, + Debug, +} + +enum MoreInfoCommit { + // 🎨 + Structure, + // ⚑️ + Performance, + // πŸ› + Bug, + // πŸš‘οΈ + CriticalBug, + // ✨ + Feature, + // πŸ“ + Documentation, + // πŸ’„:lipstick: + UI, + // πŸŽ‰ + Initial, + // βœ…:white_check_mark: + TestsPassing, + // βž•Add + Add, + // βž–Remove + Remove, + // πŸ”’οΈ + Security, + // πŸ”– + Release, + // ⚠️ + Warning, + // 🚧 + Wip, + // ⬇️ + Down, + // ⬆️ + Up, + // πŸ‘· + CI, + // ♻️ + Refactor, + // πŸ“ˆ + TrackCode, + // ✏️ + Typo, + // 🌐 + Internationalization, + // βͺ️ + Revert, + // πŸ“¦οΈ + Package, + // πŸ‘½οΈ + ExternalDependencyChange, + // 🚚 + RenameResources, + // ♿️:wheelchair: + Accessibility, + // πŸ“œ + Readme, + // βš–οΈ + License, + // πŸ’¬ + TextLiteral, + // ⛃ + DatabaseRelated, + // πŸ”Š + AddLogs, + // πŸ”‡ + RemoveLogs, + // 🚸 + ImproveExperience, + // πŸ—οΈ + ArchitecturalChanges, + // 🀑 + WrittingReallyBadCode, + // πŸ™ˆ + GitIgnore, + // βš—οΈ + Experimentations, + // 🚩 + Flag, + // πŸ—‘οΈ + Trash, + // πŸ›‚ + Authorization, + // 🩹 + QuickFix, + // ⚰️ + RemoveDeadCode, + // πŸ‘” + Business, + // 🩺 + HealthCheck, + // 🧱 + Infra, + // 🦺 + Validation, +} pub struct ConventionalCommitPopup { key_config: SharedKeyConfig, @@ -288,8 +403,6 @@ impl Component for ConventionalCommitPopup { } visibility_blocking(self) - - // todo!() } fn event( diff --git a/src/strings.rs b/src/strings.rs index 0a3aafc984..ce7acba8f1 100644 --- a/src/strings.rs +++ b/src/strings.rs @@ -1093,7 +1093,9 @@ pub mod commands { CommandText::new( format!( "Commit emoji [{}]", - key_config.get_hint(key_config.keys.open_commit), + key_config.get_hint( + key_config.keys.open_conventional_commit + ) ), "open commit emoji popups (available in non-empty stage)", CMD_GROUP_GENERAL, From 8461184b9f851ef3c36c27d1735b3706705ad8b6 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Tue, 14 Jan 2025 23:07:01 +0000 Subject: [PATCH 03/50] CodeStyle --- src/popups/conventional_commit.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 91044080ee..9c48331022 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -49,7 +49,7 @@ enum CommitType { enum MoreInfoCommit { // 🎨 - Structure, + CodeStyle, // ⚑️ Performance, // πŸ› From 4fe9878b3ba2828f0d142f6c8fef308652a274e8 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Tue, 14 Jan 2025 23:45:45 +0000 Subject: [PATCH 04/50] wip --- src/popups/conventional_commit.rs | 228 +++++++++++++++++++++++++++++- 1 file changed, 223 insertions(+), 5 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 9c48331022..8467e12461 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -60,15 +60,15 @@ enum MoreInfoCommit { Feature, // πŸ“ Documentation, - // πŸ’„:lipstick: + // πŸ’„ UI, // πŸŽ‰ Initial, - // βœ…:white_check_mark: + // βœ… TestsPassing, - // βž•Add + // βž• Add, - // βž–Remove + // βž– Remove, // πŸ”’οΈ Security, @@ -100,7 +100,7 @@ enum MoreInfoCommit { ExternalDependencyChange, // 🚚 RenameResources, - // ♿️:wheelchair: + // ♿️ Accessibility, // πŸ“œ Readme, @@ -144,6 +144,224 @@ enum MoreInfoCommit { Validation, } +impl MoreInfoCommit { + fn strings(&self) -> (&'static str, &'static str, &'static str) { + match *self { + MoreInfoCommit::UI => ("πŸ’„", "UI", "UI related"), + MoreInfoCommit::CodeStyle => { + ("🎨", "style", "Style of the code") + } + MoreInfoCommit::Performance => ("⚑️", "", "Performance"), + MoreInfoCommit::Bug => ("πŸ›", "bug", "Normal bug"), + MoreInfoCommit::CriticalBug => { + ("πŸš‘οΈ", "critical bug", "Critical Bug") + } + MoreInfoCommit::Feature => ("✨", "", "Feature"), + MoreInfoCommit::Documentation => { + ("πŸ“", "", "Documentation") + } + MoreInfoCommit::Initial => ("πŸŽ‰", "", "Initial commit!"), + MoreInfoCommit::TestsPassing => { + ("βœ…", "passing", "Test are now passing!") + } + MoreInfoCommit::Add => ("βž•", "add", "Added"), + MoreInfoCommit::Remove => ("βž–", "remove", "Removed"), + MoreInfoCommit::Security => { + ("πŸ”’οΈ", "security", "Secutiry related") + } + MoreInfoCommit::Release => { + ("πŸ”–", "release", "A new relase") + } + MoreInfoCommit::Warning => ("⚠️", "warning", "Warning"), + MoreInfoCommit::Wip => ("🚧", "", "WIP"), + MoreInfoCommit::Down => ("⬇️", "downgrade", "Down"), + MoreInfoCommit::Up => ("⬆️", "upgrade", "Up"), + MoreInfoCommit::CI => ("πŸ‘·", "", "CI related"), + MoreInfoCommit::Refactor => ("♻️", "", "Refactor related"), + MoreInfoCommit::TrackCode => { + ("πŸ“ˆ", "track", "Tracking code") + } + MoreInfoCommit::Typo => ("✏️", "typo", "Typo"), + MoreInfoCommit::Internationalization => { + ("🌐", "i18n", "Internationalization") + } + MoreInfoCommit::Revert => ("βͺ️", "", "Revert"), + MoreInfoCommit::Package => ("πŸ“¦οΈ", "", "Package related"), + MoreInfoCommit::ExternalDependencyChange => ( + "πŸ‘½οΈ", + "change due to external dep update", + "Code related to change of ext dep", + ), + MoreInfoCommit::RenameResources => { + ("🚚", "rename", "Rename some resources") + } + MoreInfoCommit::Accessibility => { + ("♿️", "accessibility", "Improved accessibility") + } + MoreInfoCommit::Readme => ("πŸ“œ", "README", "README"), + MoreInfoCommit::License => ("βš–οΈ", "LICENSE", "LICENSE"), + MoreInfoCommit::TextLiteral => { + ("πŸ’¬", "raw value", "Modified literal value") + } + MoreInfoCommit::DatabaseRelated => { + ("⛃", "db", "Database related") + } + MoreInfoCommit::AddLogs => ("πŸ”Š", "add logs", "Add logs"), + MoreInfoCommit::RemoveLogs => { + ("πŸ”‡", "remove logs", "Remove logs") + } + MoreInfoCommit::ImproveExperience => { + ("🚸", "experience", "Improve experience") + } + MoreInfoCommit::ArchitecturalChanges => { + ("πŸ—οΈ", "architecture", "Architectural Changes") + } + MoreInfoCommit::WrittingReallyBadCode => ( + "🀑", + "really bad code", + "This is some REALLY bad code", + ), + MoreInfoCommit::GitIgnore => { + ("πŸ™ˆ", "gitignore", "GitIgnore") + } + MoreInfoCommit::Experimentations => { + ("βš—οΈ", "experimentations", "Experimentations") + } + MoreInfoCommit::Flag => ("🚩", "flag", "Flag"), + MoreInfoCommit::Trash => ("πŸ—‘οΈ", "", "Trash"), + MoreInfoCommit::Authorization => { + ("πŸ›‚", "authorization", "Authorization") + } + MoreInfoCommit::QuickFix => { + ("🩹", "quick-fix", "QuickFix") + } + MoreInfoCommit::RemoveDeadCode => { + ("⚰️", "remove dead code", "RemoveDeadCode") + } + MoreInfoCommit::Business => { + ("πŸ‘”", "business", "Business related") + } + MoreInfoCommit::HealthCheck => { + ("🩺", "healthcheck", "HealthCheck") + } + MoreInfoCommit::Infra => ("🧱", "infra", "Infra"), + MoreInfoCommit::Validation => { + ("🦺", "validation", "Validation") + } + } + } +} + +impl CommitType { + fn more_info(&self) -> Vec { + match *self { + CommitType::Fix => { + vec![ + MoreInfoCommit::Bug, + MoreInfoCommit::CriticalBug, + MoreInfoCommit::Security, + MoreInfoCommit::Warning, + MoreInfoCommit::TrackCode, + MoreInfoCommit::Typo, + MoreInfoCommit::TextLiteral, + MoreInfoCommit::ExternalDependencyChange, + MoreInfoCommit::DatabaseRelated, + MoreInfoCommit::Authorization, + MoreInfoCommit::QuickFix, + MoreInfoCommit::HealthCheck, + MoreInfoCommit::Business, + MoreInfoCommit::Infra, + ] + } + CommitType::Feature => vec![ + MoreInfoCommit::Feature, + MoreInfoCommit::Security, + MoreInfoCommit::TrackCode, + MoreInfoCommit::Internationalization, + MoreInfoCommit::Package, + MoreInfoCommit::Accessibility, + MoreInfoCommit::Readme, + MoreInfoCommit::License, + MoreInfoCommit::DatabaseRelated, + MoreInfoCommit::Flag, + MoreInfoCommit::Authorization, + MoreInfoCommit::Business, + MoreInfoCommit::Validation, + ], + CommitType::Chore | CommitType::Refactor => vec![ + MoreInfoCommit::Security, + MoreInfoCommit::Refactor, + MoreInfoCommit::TrackCode, + MoreInfoCommit::Internationalization, + MoreInfoCommit::RenameResources, + MoreInfoCommit::Accessibility, + MoreInfoCommit::Readme, + MoreInfoCommit::License, + MoreInfoCommit::TextLiteral, + MoreInfoCommit::DatabaseRelated, + MoreInfoCommit::RemoveLogs, + MoreInfoCommit::ImproveExperience, + MoreInfoCommit::ArchitecturalChanges, + MoreInfoCommit::GitIgnore, + MoreInfoCommit::Flag, + MoreInfoCommit::Trash, + MoreInfoCommit::Authorization, + MoreInfoCommit::RemoveDeadCode, + MoreInfoCommit::Business, + MoreInfoCommit::Infra, + MoreInfoCommit::Validation, + ], + CommitType::CI => vec![MoreInfoCommit::CI], + CommitType::Initial => vec![MoreInfoCommit::Initial], + CommitType::Performance => { + vec![ + MoreInfoCommit::Performance, + MoreInfoCommit::DatabaseRelated, + ] + } + CommitType::Wip => vec![ + MoreInfoCommit::Wip, + MoreInfoCommit::WrittingReallyBadCode, + MoreInfoCommit::Experimentations, + ], + CommitType::Docs => vec![MoreInfoCommit::Documentation], + CommitType::Test => vec![ + MoreInfoCommit::TestsPassing, + MoreInfoCommit::Add, + MoreInfoCommit::Remove, + MoreInfoCommit::Experimentations, + MoreInfoCommit::HealthCheck, + MoreInfoCommit::Validation, + ], + CommitType::Bump => { + vec![ + MoreInfoCommit::Add, + MoreInfoCommit::Remove, + MoreInfoCommit::Down, + MoreInfoCommit::Up, + MoreInfoCommit::Release, + MoreInfoCommit::Package, + ] + } + CommitType::Style => { + vec![ + MoreInfoCommit::CodeStyle, + MoreInfoCommit::UI, + MoreInfoCommit::ImproveExperience, + ] + } + CommitType::Build => vec![MoreInfoCommit::CI], + CommitType::Debug => vec![ + MoreInfoCommit::TrackCode, + MoreInfoCommit::AddLogs, + MoreInfoCommit::HealthCheck, + MoreInfoCommit::RemoveLogs, + ], + CommitType::Revert => vec![MoreInfoCommit::Revert], + } + } +} + pub struct ConventionalCommitPopup { key_config: SharedKeyConfig, is_visible: bool, From 451d25c7725d4d70040ddcee97987c97bb49cb94 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 00:35:23 +0000 Subject: [PATCH 05/50] =?UTF-8?q?=F0=9F=9A=A7=20wip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app.rs | 3 + src/main.rs | 1 - src/popups/commit.rs | 4 ++ src/popups/conventional_commit.rs | 114 +++++++++++++++++++++--------- src/queue.rs | 2 + 5 files changed, 89 insertions(+), 35 deletions(-) diff --git a/src/app.rs b/src/app.rs index fd6ad8ca96..164296ed83 100644 --- a/src/app.rs +++ b/src/app.rs @@ -746,6 +746,9 @@ impl App { } InternalEvent::Update(u) => flags.insert(u), InternalEvent::OpenCommit => self.commit_popup.show()?, + InternalEvent::AddCommitMessage(s) => { + self.commit_popup.set_msg(s) + } InternalEvent::OpenConventionalCommit => { self.conventional_commit_popup.show()? } diff --git a/src/main.rs b/src/main.rs index e85dca8530..cd1c862a63 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,7 +2,6 @@ #![deny( unused_imports, unused_must_use, - dead_code, unstable_name_collisions, unused_assignments )] diff --git a/src/popups/commit.rs b/src/popups/commit.rs index 0b9a1958fe..d10ab369cc 100644 --- a/src/popups/commit.rs +++ b/src/popups/commit.rs @@ -90,6 +90,10 @@ impl CommitPopup { } } + pub fn set_msg(&mut self, msg: String) { + self.input.set_text(msg); + } + /// pub fn update(&mut self) { self.git_branch_name.lookup().ok(); diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 8467e12461..f8c8feacdc 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -14,6 +14,7 @@ use strum::{Display, EnumIter, IntoEnumIterator}; use unicode_segmentation::UnicodeSegmentation; use crate::components::visibility_blocking; +use crate::queue::Queue; use crate::string_utils::trim_length_left; use crate::ui::style::SharedTheme; use crate::{ @@ -27,6 +28,7 @@ use crate::{ }; #[derive(EnumIter, Display, Clone)] +#[strum(serialize_all = "lowercase")] enum CommitType { Refactor, #[strum(to_string = "feat")] @@ -372,6 +374,8 @@ pub struct ConventionalCommitPopup { query_results: Vec, input: TextInputComponent, theme: SharedTheme, + seleted_commit_type: Option, + queue: Queue, } impl ConventionalCommitPopup { @@ -392,7 +396,9 @@ impl ConventionalCommitPopup { query: None, is_visible: false, key_config: env.key_config.clone(), + seleted_commit_type: None, theme: env.theme.clone(), + queue: env.queue.clone(), } } @@ -411,29 +417,61 @@ impl ConventionalCommitPopup { let list_height = height.saturating_sub(HEIGHT_BLOCK_MARGIN); + let a = self.query_results[0].more_info()[0].strings(); + assert!(a.0 != ""); + let scroll_skip = self.selected_index.saturating_sub(list_height); let quick_shortcuts = self.quick_shortcuts(); - let items = self - .query_results - .iter() - .enumerate() - .take(height) - .map(|(idx, commit_type)| { - let selected = self.selected_index == idx; - let commit_type_string = commit_type.to_string(); - let text = trim_length_left( - commit_type_string.as_str(), - width - 4, // ` [k]` - ); - let text = format!( - "{:w$} [{}]", - text, - quick_shortcuts[idx], - w = width, - ); - + let iter_over = if let Some(commit_type) = + &self.seleted_commit_type + { + commit_type + .more_info() + .iter() + .enumerate() + .take(height) + .map(|(idx, more_info)| { + let (emoji, _, long_name) = + more_info.strings(); + let text_string = + format!("{emoji} {long_name}"); + let text = trim_length_left( + &text_string, + width - 4, // ` [k]` + ); + (self.selected_index == idx, text.to_owned()) + }) + .collect_vec() + } else { + self.query_results + .iter() + .enumerate() + .take(height) + .map(|(idx, commit_type)| { + let commit_type_string = + commit_type.to_string(); + let text = trim_length_left( + commit_type_string.as_str(), + width - 4, // ` [k]` + ); + //FIXME: not working + ( + self.selected_index == idx, + format!( + "{:w$} [{}]", + text, + quick_shortcuts[idx], + w = width, + ), + ) + }) + .collect_vec() + }; + + let items = + iter_over.into_iter().map(|(selected, text)| { Line::from( text.graphemes(true) .enumerate() @@ -497,18 +535,10 @@ impl ConventionalCommitPopup { _ => self.selected_index, }; - // println!("{} {}", self.query, self.input); - - let new_selection = new_selection.clamp(0, todo!()); - // .clamp(0, self.filtered.len().saturating_sub(1)); - // .clamp(0, self.filtered.len().saturating_sub(1)); + let new_selection = new_selection + .clamp(0, self.query_results.len().saturating_sub(1)); - // if new_selection != self.selection { self.selected_index = new_selection; - // return true; - // } - // - // false } pub fn any_work_pending(&self) -> bool { @@ -635,7 +665,27 @@ impl Component for ConventionalCommitPopup { if key_match(key, self.key_config.keys.exit_popup) || key_match(key, self.key_config.keys.enter) { - self.hide(); + if let Some(commit_type) = + &self.seleted_commit_type + { + let (emoji, short_msg, _) = commit_type.more_info()[self.selected_index].strings(); + self.queue.push( + crate::queue::InternalEvent::OpenCommit, + ); + self.queue.push( + crate::queue::InternalEvent::AddCommitMessage( + + format!("{emoji} {commit_type}: {short_msg}"), + ), + ); + self.hide(); + } else { + self.seleted_commit_type = self + .query_results + .get(self.selected_index) + .cloned(); + self.selected_index = 0; + } } else if key_match(key, self.key_config.keys.insert) { self.is_insert = true; @@ -656,10 +706,6 @@ impl Component for ConventionalCommitPopup { } } - // if self.find_text.event(event)?.is_consumed() { - // self.update_query(); - // } - return Ok(EventState::Consumed); } diff --git a/src/queue.rs b/src/queue.rs index b9f7459860..5a043060b6 100644 --- a/src/queue.rs +++ b/src/queue.rs @@ -97,6 +97,8 @@ pub enum InternalEvent { StatusLastFileMoved, /// open commit msg input OpenCommit, + /// + AddCommitMessage(String), /// open conventional commit OpenConventionalCommit, /// From 6149b736ce65a14d274c05cfd047c6bc59264e33 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 00:46:41 +0000 Subject: [PATCH 06/50] =?UTF-8?q?=E2=9C=A8=20feat:=20move=20cursor=20to=20?= =?UTF-8?q?end?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/textinput.rs | 8 ++++++++ src/popups/commit.rs | 1 + src/popups/conventional_commit.rs | 5 ++--- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/components/textinput.rs b/src/components/textinput.rs index e6586b8355..13fc80d3b0 100644 --- a/src/components/textinput.rs +++ b/src/components/textinput.rs @@ -79,6 +79,14 @@ impl TextInputComponent { } } + pub fn move_cursor_to_end(&mut self) { + if let Some(ta) = &mut self.textarea { + for _ in 0..100 { + ta.move_cursor(CursorMove::Forward); + } + } + } + /// pub const fn with_input_type( mut self, diff --git a/src/popups/commit.rs b/src/popups/commit.rs index d10ab369cc..6fd0835ac9 100644 --- a/src/popups/commit.rs +++ b/src/popups/commit.rs @@ -92,6 +92,7 @@ impl CommitPopup { pub fn set_msg(&mut self, msg: String) { self.input.set_text(msg); + self.input.move_cursor_to_end(); } /// diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index f8c8feacdc..6a42249fa7 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -417,9 +417,6 @@ impl ConventionalCommitPopup { let list_height = height.saturating_sub(HEIGHT_BLOCK_MARGIN); - let a = self.query_results[0].more_info()[0].strings(); - assert!(a.0 != ""); - let scroll_skip = self.selected_index.saturating_sub(list_height); let quick_shortcuts = self.quick_shortcuts(); @@ -679,6 +676,8 @@ impl Component for ConventionalCommitPopup { ), ); self.hide(); + self.selected_index = 0; + self.seleted_commit_type = None; } else { self.seleted_commit_type = self .query_results From 656306d8963ea530c1c8ab711b547f9b86d9b2c1 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 00:54:20 +0000 Subject: [PATCH 07/50] =?UTF-8?q?=E2=9C=A8=20feat:=20when=201=20possible?= =?UTF-8?q?=20value=20=3D>=20next?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 43 +++++++++++++++++++------------ 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 6a42249fa7..b95c9c22a3 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -561,6 +561,20 @@ impl ConventionalCommitPopup { .cloned() .collect_vec(); } + + fn validate_escape(&mut self, commit_type: CommitType) { + let (emoji, short_msg, _) = + commit_type.more_info()[self.selected_index].strings(); + self.queue.push(crate::queue::InternalEvent::OpenCommit); + self.queue.push( + crate::queue::InternalEvent::AddCommitMessage(format!( + "{emoji} {commit_type}: {short_msg}" + )), + ); + self.hide(); + self.selected_index = 0; + self.seleted_commit_type = None; + } } impl DrawableComponent for ConventionalCommitPopup { @@ -649,7 +663,6 @@ impl Component for ConventionalCommitPopup { visibility_blocking(self) } - fn event( &mut self, event: &crossterm::event::Event, @@ -663,27 +676,25 @@ impl Component for ConventionalCommitPopup { || key_match(key, self.key_config.keys.enter) { if let Some(commit_type) = - &self.seleted_commit_type + self.seleted_commit_type.clone() { - let (emoji, short_msg, _) = commit_type.more_info()[self.selected_index].strings(); - self.queue.push( - crate::queue::InternalEvent::OpenCommit, - ); - self.queue.push( - crate::queue::InternalEvent::AddCommitMessage( - - format!("{emoji} {commit_type}: {short_msg}"), - ), - ); - self.hide(); - self.selected_index = 0; - self.seleted_commit_type = None; + self.validate_escape(commit_type); } else { - self.seleted_commit_type = self + let commit = self .query_results .get(self.selected_index) .cloned(); + + self.seleted_commit_type = commit.clone(); self.selected_index = 0; + + if let Some(more_infos) = + commit.as_ref().map(|c| c.more_info()) + { + if more_infos.len() == 1 { + self.validate_escape(commit.unwrap()); + } + } } } else if key_match(key, self.key_config.keys.insert) { From 7f01b0a0ec7dfa9db134206d4e114d14f377a3b8 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 00:58:17 +0000 Subject: [PATCH 08/50] =?UTF-8?q?=F0=9F=90=9B=20fix:=20when=20there=20are?= =?UTF-8?q?=20no=20default=20msg=20=3D>=20no=20`:`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index b95c9c22a3..d4746fccb0 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -34,19 +34,19 @@ enum CommitType { #[strum(to_string = "feat")] Feature, Fix, + Wip, + Debug, + Test, Docs, Style, #[strum(to_string = "perf")] Performance, - Test, - Build, - CI, Chore, Revert, Initial, Bump, - Wip, - Debug, + Build, + CI, } enum MoreInfoCommit { @@ -568,7 +568,8 @@ impl ConventionalCommitPopup { self.queue.push(crate::queue::InternalEvent::OpenCommit); self.queue.push( crate::queue::InternalEvent::AddCommitMessage(format!( - "{emoji} {commit_type}: {short_msg}" + "{emoji} {commit_type}{} {short_msg}", + if short_msg.is_empty() { "" } else { ":" }, )), ); self.hide(); From 0da40255e3ca37627d2eb0b455bfe7917c99b670 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 09:02:42 +0000 Subject: [PATCH 09/50] =?UTF-8?q?=F0=9F=92=AC=20fix:=20appropriate=20title?= =?UTF-8?q?=20for=20widget?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index d4746fccb0..c633dec1b8 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -599,7 +599,11 @@ impl DrawableComponent for ConventionalCommitPopup { .borders(Borders::all()) .style(self.theme.title(true)) .title(Span::styled( - "owo", + if self.seleted_commit_type.is_some() { + "Emoji of commit" + } else { + "Type of commit" + }, self.theme.title(true), )), area, From 491bebba84d53bbe44616d6fe22f4e2e4f203fd6 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 09:11:15 +0000 Subject: [PATCH 10/50] =?UTF-8?q?=F0=9F=90=9B=20fix:=20bad=20display=20for?= =?UTF-8?q?=20selection=20of=20commit=20type?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index c633dec1b8..19f9419a67 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -442,6 +442,12 @@ impl ConventionalCommitPopup { }) .collect_vec() } else { + let max_len = self + .query_results + .iter() + .map(|s| s.to_string().len()) + .max(); + self.query_results .iter() .enumerate() @@ -453,14 +459,14 @@ impl ConventionalCommitPopup { commit_type_string.as_str(), width - 4, // ` [k]` ); - //FIXME: not working + ( self.selected_index == idx, format!( "{:w$} [{}]", text, quick_shortcuts[idx], - w = width, + w = max_len.unwrap_or_default(), ), ) }) From b112792520080b8634c1249f33077e6201115c23 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 17:59:18 +0000 Subject: [PATCH 11/50] =?UTF-8?q?=E2=9C=A8=20feat:=20use=20proper=20char?= =?UTF-8?q?=20for=20shortcut=20char?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 40 ++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 19f9419a67..4110c7f5a5 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -505,9 +505,10 @@ impl ConventionalCommitPopup { pub fn quick_shortcuts(&self) -> Vec { // Missing `i`, because `i` is mapped to insert sorry~ - let default = "qwertyuopasdfghjklmzxcvbn"; + let mut available_chars = + ('a'..='z').into_iter().collect_vec(); - let dont_map_keys = [ + [ self.key_config.keys.move_down, self.key_config.keys.move_up, self.key_config.keys.exit_popup, @@ -515,20 +516,30 @@ impl ConventionalCommitPopup { self.key_config.keys.insert, ] .into_iter() - .filter_map(|k| { + .for_each(|k| { if let KeyCode::Char(c) = k.code { - Some(c) - } else { - None + if let Some(char_to_remove_index) = + available_chars.iter().position(|&ch| ch == c) + { + available_chars.remove(char_to_remove_index); + } } - }) - .collect_vec(); - - default - .chars() - .filter(|c| !dont_map_keys.contains(c)) - .take(self.query_results.len()) - .collect_vec() + }); + + self.query_results + .iter() + .map(|commit_type| commit_type.to_string()) + .map(|s| { + if let Some(ch) = s.chars() + .into_iter() + .find(|c| available_chars.contains(&c)) { + available_chars.retain(|&c| c != ch); + ch + } else { + *available_chars.first().expect("Should already have at least one letter available") + } + }) + .collect_vec() } pub fn move_selection(&mut self, direction: ScrollType) { @@ -682,6 +693,7 @@ impl Component for ConventionalCommitPopup { if self.is_insert { println!("lol"); } + if let Event::Key(key) = event { if key_match(key, self.key_config.keys.exit_popup) || key_match(key, self.key_config.keys.enter) From 637f8343050e5269d9ad75ba2fbdfa462e93ff84 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 18:07:25 +0000 Subject: [PATCH 12/50] =?UTF-8?q?=F0=9F=90=9B=20fix:=20made=20shortcuts=20?= =?UTF-8?q?work?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 4110c7f5a5..65c618e51d 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -719,9 +719,6 @@ impl Component for ConventionalCommitPopup { } } } - } else if key_match(key, self.key_config.keys.insert) - { - self.is_insert = true; } else if key_match( key, self.key_config.keys.popup_down, @@ -733,8 +730,27 @@ impl Component for ConventionalCommitPopup { ) { self.move_selection(ScrollType::Up); } else { - if self.input.event(event)?.is_consumed() { - self.update_query(); + if self.is_insert { + if self.input.event(event)?.is_consumed() { + self.update_query(); + } + } else if key_match( + key, + self.key_config.keys.insert, + ) { + self.is_insert = true; + } else { + if let KeyCode::Char(c) = key.code { + if let Some(idx) = self + .quick_shortcuts() + .into_iter() + .position(|ch| ch == c) + { + self.seleted_commit_type = Some( + self.query_results[idx].clone(), + ); + } + } } } } From b79e6cb2e9d1565818f8b89e70a61fd63cdc7558 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 18:07:58 +0000 Subject: [PATCH 13/50] =?UTF-8?q?=F0=9F=94=87=20debug:=20remove=20logs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 65c618e51d..9736c9e78c 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -690,10 +690,6 @@ impl Component for ConventionalCommitPopup { event: &crossterm::event::Event, ) -> Result { if self.is_visible() { - if self.is_insert { - println!("lol"); - } - if let Event::Key(key) = event { if key_match(key, self.key_config.keys.exit_popup) || key_match(key, self.key_config.keys.enter) From 562b21041f29b3b8971028baa0e4c4b62c49ab28 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 18:10:26 +0000 Subject: [PATCH 14/50] =?UTF-8?q?=F0=9F=90=9B=20fix:=20close=20instead=20o?= =?UTF-8?q?f=20enter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 9736c9e78c..21408b9544 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -691,9 +691,11 @@ impl Component for ConventionalCommitPopup { ) -> Result { if self.is_visible() { if let Event::Key(key) = event { - if key_match(key, self.key_config.keys.exit_popup) - || key_match(key, self.key_config.keys.enter) - { + if key_match(key, self.key_config.keys.exit_popup) { + self.hide(); + self.selected_index = 0; + self.seleted_commit_type = None; + } else if key_match(key, self.key_config.keys.enter) { if let Some(commit_type) = self.seleted_commit_type.clone() { From 557bc881b9de29720ceaa4f55a5b6fbb0a960b88 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 18:11:28 +0000 Subject: [PATCH 15/50] =?UTF-8?q?=F0=9F=94=87=20refactor:=20remove=20doc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 21408b9544..c50828c253 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -504,7 +504,6 @@ impl ConventionalCommitPopup { } pub fn quick_shortcuts(&self) -> Vec { - // Missing `i`, because `i` is mapped to insert sorry~ let mut available_chars = ('a'..='z').into_iter().collect_vec(); From d00ffdac902eaf486a3d3ddce8561cfc6ccdcdfd Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 20:58:10 +0000 Subject: [PATCH 16/50] =?UTF-8?q?=E2=9C=A8=20feat:=20filtering=20on=20quer?= =?UTF-8?q?y=20working?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 260 ++++++++++++++++-------------- 1 file changed, 142 insertions(+), 118 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index c50828c253..8c54c04e16 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -49,6 +49,7 @@ enum CommitType { CI, } +#[derive(Clone)] enum MoreInfoCommit { // 🎨 CodeStyle, @@ -371,7 +372,8 @@ pub struct ConventionalCommitPopup { query: Option, selected_index: usize, options: Vec, - query_results: Vec, + query_results_type: Vec, + query_results_more_info: Vec, input: TextInputComponent, theme: SharedTheme, seleted_commit_type: Option, @@ -379,8 +381,6 @@ pub struct ConventionalCommitPopup { } impl ConventionalCommitPopup { - /// - // pub fn new(env: &Environment) -> Self { pub fn new(env: &Environment) -> Self { let mut input = TextInputComponent::new(env, "", "Filter ", false) @@ -391,7 +391,8 @@ impl ConventionalCommitPopup { selected_index: 0, input, options: CommitType::iter().collect_vec(), - query_results: CommitType::iter().collect_vec(), + query_results_type: CommitType::iter().collect_vec(), + query_results_more_info: Vec::new(), is_insert: false, query: None, is_visible: false, @@ -404,103 +405,95 @@ impl ConventionalCommitPopup { #[inline] fn draw_matches_list(&self, f: &mut Frame, mut area: Rect) { - { - // Block has two lines up and down which need to be considered - const HEIGHT_BLOCK_MARGIN: usize = 2; - - let title = - format!("Results: {}", self.query_results.len()); + // Block has two lines up and down which need to be considered + const HEIGHT_BLOCK_MARGIN: usize = 2; - let height = usize::from(area.height); - let width = usize::from(area.width); + let height = usize::from(area.height); + let width = usize::from(area.width); - let list_height = - height.saturating_sub(HEIGHT_BLOCK_MARGIN); + let list_height = height.saturating_sub(HEIGHT_BLOCK_MARGIN); - let scroll_skip = - self.selected_index.saturating_sub(list_height); - let quick_shortcuts = self.quick_shortcuts(); + let scroll_skip = + self.selected_index.saturating_sub(list_height); + let quick_shortcuts = self.quick_shortcuts(); - let iter_over = if let Some(commit_type) = - &self.seleted_commit_type - { - commit_type - .more_info() - .iter() - .enumerate() - .take(height) - .map(|(idx, more_info)| { - let (emoji, _, long_name) = - more_info.strings(); - let text_string = - format!("{emoji} {long_name}"); - let text = trim_length_left( - &text_string, - width - 4, // ` [k]` - ); - (self.selected_index == idx, text.to_owned()) - }) - .collect_vec() + let title = format!( + "Results: {}", + if self.seleted_commit_type.is_some() { + self.query_results_more_info.len() } else { - let max_len = self - .query_results - .iter() - .map(|s| s.to_string().len()) - .max(); - - self.query_results - .iter() + self.query_results_type.len() + } + ); + + let iter_over = if let Some(commit_type) = + &self.seleted_commit_type + { + self.query_results_more_info + .iter() + .enumerate() + .take(height) + .map(|(idx, more_info)| { + let (emoji, _, long_name) = more_info.strings(); + let text_string = format!("{emoji} {long_name}"); + let text = + trim_length_left(&text_string, width - 4); + (self.selected_index == idx, text.to_owned()) + }) + .collect_vec() + } else { + let max_len = self + .query_results_type + .iter() + .map(|s| s.to_string().len()) + .max(); + + self.query_results_type + .iter() + .enumerate() + .take(height) + .map(|(idx, commit_type)| { + let commit_type_string = commit_type.to_string(); + let text = trim_length_left( + commit_type_string.as_str(), + width - 4, // ` [k]` + ); + + ( + self.selected_index == idx, + format!( + "{:w$} [{}]", + text, + quick_shortcuts[idx], + w = max_len.unwrap_or_default(), + ), + ) + }) + .collect_vec() + }; + + let items = iter_over.into_iter().map(|(selected, text)| { + Line::from( + text.graphemes(true) .enumerate() - .take(height) - .map(|(idx, commit_type)| { - let commit_type_string = - commit_type.to_string(); - let text = trim_length_left( - commit_type_string.as_str(), - width - 4, // ` [k]` - ); - - ( - self.selected_index == idx, - format!( - "{:w$} [{}]", - text, - quick_shortcuts[idx], - w = max_len.unwrap_or_default(), - ), + .map(|(c_idx, c)| { + Span::styled( + Cow::from(c.to_string()), + self.theme.text(selected, selected), ) }) - .collect_vec() - }; - - let items = - iter_over.into_iter().map(|(selected, text)| { - Line::from( - text.graphemes(true) - .enumerate() - .map(|(c_idx, c)| { - Span::styled( - Cow::from(c.to_string()), - self.theme - .text(selected, selected), - ) - }) - .collect::>(), - ) - }); + .collect::>(), + ) + }); - ui::draw_list_block( - f, - area, - Block::default() - .title(Span::styled( - title, - self.theme.title(true), - )) - .borders(Borders::TOP), - items, - ); - } + ui::draw_list_block( + f, + area, + Block::default() + .title(Span::styled(title, self.theme.title(true))) + .borders(Borders::TOP), + items, + ); } pub fn quick_shortcuts(&self) -> Vec { @@ -525,7 +518,7 @@ impl ConventionalCommitPopup { } }); - self.query_results + self.query_results_type .iter() .map(|commit_type| commit_type.to_string()) .map(|s| { @@ -548,8 +541,10 @@ impl ConventionalCommitPopup { _ => self.selected_index, }; - let new_selection = new_selection - .clamp(0, self.query_results.len().saturating_sub(1)); + let new_selection = new_selection.clamp( + 0, + self.query_results_type.len().saturating_sub(1), + ); self.selected_index = new_selection; } @@ -562,25 +557,45 @@ impl ConventionalCommitPopup { if self .query .as_ref() - .map_or(true, |q| q != self.input.get_text()) + .is_none_or(|q| q != self.input.get_text()) { self.set_query(self.input.get_text().to_string()); } } fn set_query(&mut self, query: String) { + let query = query.to_lowercase(); self.query = Some(query.clone()); - self.query_results = self - .options - .iter() - .filter(|option| option.to_string() == query) - .cloned() - .collect_vec(); + + if let Some(commit_type) = &self.seleted_commit_type { + self.query_results_more_info = commit_type + .more_info() + .iter() + .filter(|more_info_commit| { + more_info_commit + .strings() + .2 + .to_lowercase() + .contains(&query) + }) + .cloned() + .collect_vec(); + } else { + self.query_results_type = self + .options + .iter() + .filter(|option| { + option.to_string().to_lowercase().contains(&query) + }) + .cloned() + .collect_vec(); + } } fn validate_escape(&mut self, commit_type: CommitType) { - let (emoji, short_msg, _) = - commit_type.more_info()[self.selected_index].strings(); + let (emoji, short_msg, _) = self.query_results_more_info + [self.selected_index] + .strings(); self.queue.push(crate::queue::InternalEvent::OpenCommit); self.queue.push( crate::queue::InternalEvent::AddCommitMessage(format!( @@ -589,19 +604,11 @@ impl ConventionalCommitPopup { )), ); self.hide(); - self.selected_index = 0; - self.seleted_commit_type = None; } } impl DrawableComponent for ConventionalCommitPopup { fn draw(&self, f: &mut Frame, area: Rect) -> Result<()> { - // if self.is_visible() { - // self.input.draw(f, rect)?; - // self.draw_warnings(f); - // } - // - // Ok(()) if self.is_visible { const MAX_SIZE: (u16, u16) = (50, 20); @@ -691,9 +698,11 @@ impl Component for ConventionalCommitPopup { if self.is_visible() { if let Event::Key(key) = event { if key_match(key, self.key_config.keys.exit_popup) { - self.hide(); - self.selected_index = 0; - self.seleted_commit_type = None; + if self.is_insert { + self.is_insert = false; + } else { + self.hide(); + } } else if key_match(key, self.key_config.keys.enter) { if let Some(commit_type) = self.seleted_commit_type.clone() @@ -701,12 +710,17 @@ impl Component for ConventionalCommitPopup { self.validate_escape(commit_type); } else { let commit = self - .query_results + .query_results_type .get(self.selected_index) .cloned(); self.seleted_commit_type = commit.clone(); self.selected_index = 0; + self.is_insert = false; + self.query = None; + self.input.clear(); + + self.update_query(); if let Some(more_infos) = commit.as_ref().map(|c| c.more_info()) @@ -728,7 +742,7 @@ impl Component for ConventionalCommitPopup { self.move_selection(ScrollType::Up); } else { if self.is_insert { - if self.input.event(event)?.is_consumed() { + if self.input.event(&event)?.is_consumed() { self.update_query(); } } else if key_match( @@ -744,7 +758,8 @@ impl Component for ConventionalCommitPopup { .position(|ch| ch == c) { self.seleted_commit_type = Some( - self.query_results[idx].clone(), + self.query_results_type[idx] + .clone(), ); } } @@ -764,10 +779,19 @@ impl Component for ConventionalCommitPopup { fn hide(&mut self) { self.is_visible = false; + self.is_insert = false; + self.selected_index = 0; + self.seleted_commit_type = None; + self.query = None; + self.query_results_type = CommitType::iter().collect_vec(); + self.query_results_more_info = Vec::new(); + self.input.clear(); } fn show(&mut self) -> Result<()> { self.is_visible = true; + self.input.show()?; + self.input.set_text(String::new()); Ok(()) } } From 732e0b9298f6bc132ca8d50a09d78c75e29387af Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 21:19:35 +0000 Subject: [PATCH 17/50] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20ref:=20make=20select?= =?UTF-8?q?ed=20lines=20take=20100%=20width?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 52 +++++++++++++++++-------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 8c54c04e16..65eefdc87b 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -404,17 +404,10 @@ impl ConventionalCommitPopup { } #[inline] - fn draw_matches_list(&self, f: &mut Frame, mut area: Rect) { - // Block has two lines up and down which need to be considered - const HEIGHT_BLOCK_MARGIN: usize = 2; - + fn draw_matches_list(&self, f: &mut Frame, area: Rect) { let height = usize::from(area.height); let width = usize::from(area.width); - let list_height = height.saturating_sub(HEIGHT_BLOCK_MARGIN); - - let scroll_skip = - self.selected_index.saturating_sub(list_height); let quick_shortcuts = self.quick_shortcuts(); let title = format!( @@ -426,9 +419,7 @@ impl ConventionalCommitPopup { } ); - let iter_over = if let Some(commit_type) = - &self.seleted_commit_type - { + let iter_over = if self.seleted_commit_type.is_some() { self.query_results_more_info .iter() .enumerate() @@ -436,9 +427,11 @@ impl ConventionalCommitPopup { .map(|(idx, more_info)| { let (emoji, _, long_name) = more_info.strings(); let text_string = format!("{emoji} {long_name}"); - let text = - trim_length_left(&text_string, width - 4); - (self.selected_index == idx, text.to_owned()) + let text = trim_length_left(&text_string, width); + ( + self.selected_index == idx, + format!("{text}{:width$}", " "), + ) }) .collect_vec() } else { @@ -453,20 +446,17 @@ impl ConventionalCommitPopup { .enumerate() .take(height) .map(|(idx, commit_type)| { - let commit_type_string = commit_type.to_string(); - let text = trim_length_left( - commit_type_string.as_str(), - width - 4, // ` [k]` + let text_string = format!( + "{:w$} [{}]", + commit_type, + quick_shortcuts[idx], + w = max_len.unwrap_or_default(), ); + let text = trim_length_left(&text_string, width); ( self.selected_index == idx, - format!( - "{:w$} [{}]", - text, - quick_shortcuts[idx], - w = max_len.unwrap_or_default(), - ), + format!("{text}{:width$}", " "), ) }) .collect_vec() @@ -580,6 +570,15 @@ impl ConventionalCommitPopup { }) .cloned() .collect_vec(); + + if self.selected_index + >= self.query_results_more_info.len() + { + self.selected_index = self + .query_results_more_info + .len() + .saturating_sub(1); + } } else { self.query_results_type = self .options @@ -589,6 +588,11 @@ impl ConventionalCommitPopup { }) .cloned() .collect_vec(); + + if self.selected_index >= self.query_results_type.len() { + self.selected_index = + self.query_results_type.len().saturating_sub(1); + } } } From ca041d7a679b199ccc78e159d0b892dbaffde187 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 21:33:14 +0000 Subject: [PATCH 18/50] =?UTF-8?q?=E2=9C=A8=20feat:=20add=20commands=20indi?= =?UTF-8?q?cation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 61 ++++++++++++++++++------------- src/strings.rs | 22 +++++++++++ 2 files changed, 57 insertions(+), 26 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 65eefdc87b..8c347519e7 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -16,6 +16,7 @@ use unicode_segmentation::UnicodeSegmentation; use crate::components::visibility_blocking; use crate::queue::Queue; use crate::string_utils::trim_length_left; +use crate::strings; use crate::ui::style::SharedTheme; use crate::{ app::Environment, @@ -466,7 +467,7 @@ impl ConventionalCommitPopup { Line::from( text.graphemes(true) .enumerate() - .map(|(c_idx, c)| { + .map(|(_, c)| { Span::styled( Cow::from(c.to_string()), self.theme.text(selected, selected), @@ -665,32 +666,40 @@ impl Component for ConventionalCommitPopup { out: &mut Vec, force_all: bool, ) -> CommandBlocking { - // if self.is_visible() || force_all { - // self.input.commands(out, force_all); - // - // out.push(CommandInfo::new( - // strings::commands::create_branch_confirm_msg( - // &self.key_config, - // ), - // true, - // true, - // )); - // } - // if self.is_visible() || force_all { - // out.push(CommandInfo::new( - // strings::commands::scroll_popup(&self.key_config), - // true, - // true, - // )); - // - // out.push(CommandInfo::new( - // strings::commands::close_fuzzy_finder( - // &self.key_config, - // ), - // true, - // true, - // )); + if self.is_insert { + out.push(CommandInfo::new( + strings::commands::exit_insert(&self.key_config), + true, + true, + )); + } else { + out.push(CommandInfo::new( + strings::commands::insert(&self.key_config), + true, + true, + )); + + out.push(CommandInfo::new( + strings::commands::close_fuzzy_finder( + &self.key_config, + ), + true, + true, + )); + } + + out.push(CommandInfo::new( + strings::commands::scroll(&self.key_config), + true, + true, + )); + + out.push(CommandInfo::new( + strings::commands::open_submodule(&self.key_config), + true, + true, + )); } visibility_blocking(self) diff --git a/src/strings.rs b/src/strings.rs index ce7acba8f1..80cb7a6c4a 100644 --- a/src/strings.rs +++ b/src/strings.rs @@ -1884,4 +1884,26 @@ pub mod commands { CMD_GROUP_LOG, ) } + + pub fn insert(key_config: &SharedKeyConfig) -> CommandText { + CommandText::new( + format!( + "Insert [{}]", + key_config.get_hint(key_config.keys.insert), + ), + "enter in insert mode", + CMD_GROUP_LOG, + ) + } + + pub fn exit_insert(key_config: &SharedKeyConfig) -> CommandText { + CommandText::new( + format!( + "Exit Insert [{}]", + key_config.get_hint(key_config.keys.exit_popup), + ), + "exit in insert mode", + CMD_GROUP_LOG, + ) + } } From 66d3b59f146bb6ad93f57c1c4aa324b65bd1d488 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 21:38:38 +0000 Subject: [PATCH 19/50] =?UTF-8?q?=E2=9C=A8=20feat:=20"INSERT"=20text=20whe?= =?UTF-8?q?n=20in=20insert=20mode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 8c347519e7..01041f085f 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -633,7 +633,16 @@ impl DrawableComponent for ConventionalCommitPopup { "Type of commit" }, self.theme.title(true), - )), + )) + .title(if self.is_insert { + Span::styled( + "[INSERT]", + self.theme.title(true), + ) + .into_right_aligned_line() + } else { + "".into() + }), area, ); From 736263e7366f267b7b326e1ea77768eafed27778 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 21:44:56 +0000 Subject: [PATCH 20/50] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20put=20ne?= =?UTF-8?q?xt=5Fstep=20actions=20in=20fn?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 01041f085f..909db4ab62 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -610,12 +610,20 @@ impl ConventionalCommitPopup { ); self.hide(); } + + fn next_step(&mut self) { + self.selected_index = 0; + self.is_insert = false; + self.query = None; + self.input.clear(); + self.update_query(); + } } impl DrawableComponent for ConventionalCommitPopup { fn draw(&self, f: &mut Frame, area: Rect) -> Result<()> { if self.is_visible { - const MAX_SIZE: (u16, u16) = (50, 20); + const MAX_SIZE: (u16, u16) = (50, 25); let area = ui::centered_rect_absolute( MAX_SIZE.0, MAX_SIZE.1, area, @@ -737,12 +745,7 @@ impl Component for ConventionalCommitPopup { .cloned(); self.seleted_commit_type = commit.clone(); - self.selected_index = 0; - self.is_insert = false; - self.query = None; - self.input.clear(); - - self.update_query(); + self.next_step(); if let Some(more_infos) = commit.as_ref().map(|c| c.more_info()) @@ -783,6 +786,7 @@ impl Component for ConventionalCommitPopup { self.query_results_type[idx] .clone(), ); + self.next_step(); } } } @@ -800,14 +804,11 @@ impl Component for ConventionalCommitPopup { } fn hide(&mut self) { + self.next_step(); self.is_visible = false; - self.is_insert = false; - self.selected_index = 0; self.seleted_commit_type = None; - self.query = None; self.query_results_type = CommitType::iter().collect_vec(); self.query_results_more_info = Vec::new(); - self.input.clear(); } fn show(&mut self) -> Result<()> { From d3d75b65985978f5d18b19b6fd7a017869ba10f5 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 21:47:41 +0000 Subject: [PATCH 21/50] =?UTF-8?q?=F0=9F=8E=A8=20style:=20style?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 4 +++- src/tabs/status.rs | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 909db4ab62..8f52f6b4e7 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -181,7 +181,9 @@ impl MoreInfoCommit { MoreInfoCommit::Down => ("⬇️", "downgrade", "Down"), MoreInfoCommit::Up => ("⬆️", "upgrade", "Up"), MoreInfoCommit::CI => ("πŸ‘·", "", "CI related"), - MoreInfoCommit::Refactor => ("♻️", "", "Refactor related"), + MoreInfoCommit::Refactor => { + ("♻️", "", "Refactor related") + } MoreInfoCommit::TrackCode => { ("πŸ“ˆ", "track", "Tracking code") } diff --git a/src/tabs/status.rs b/src/tabs/status.rs index 605604e154..6af9df41a5 100644 --- a/src/tabs/status.rs +++ b/src/tabs/status.rs @@ -686,7 +686,8 @@ impl Status { strings::commands::select_staging(&self.key_config), !focus_on_diff, (self.visible - && !focus_on_diff && self.focus == Focus::WorkDir) + && !focus_on_diff + && self.focus == Focus::WorkDir) || force_all, ) .order(strings::order::NAV), @@ -696,7 +697,8 @@ impl Status { strings::commands::select_unstaged(&self.key_config), !focus_on_diff, (self.visible - && !focus_on_diff && self.focus == Focus::Stage) + && !focus_on_diff + && self.focus == Focus::Stage) || force_all, ) .order(strings::order::NAV), From fe22a15697b70393e4c8bfdcb96c3541f229ba5a Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 21:55:28 +0000 Subject: [PATCH 22/50] =?UTF-8?q?=E2=9C=A8=20feat:=20new=20more=5Finfo=20(?= =?UTF-8?q?Formatted)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 34 ++++++++++++++++--------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 8f52f6b4e7..8515340dfd 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -54,6 +54,8 @@ enum CommitType { enum MoreInfoCommit { // 🎨 CodeStyle, + // πŸ’… + Formatted, // ⚑️ Performance, // πŸ› @@ -181,9 +183,7 @@ impl MoreInfoCommit { MoreInfoCommit::Down => ("⬇️", "downgrade", "Down"), MoreInfoCommit::Up => ("⬆️", "upgrade", "Up"), MoreInfoCommit::CI => ("πŸ‘·", "", "CI related"), - MoreInfoCommit::Refactor => { - ("♻️", "", "Refactor related") - } + MoreInfoCommit::Refactor => ("♻️", "", "Refactor related"), MoreInfoCommit::TrackCode => { ("πŸ“ˆ", "track", "Tracking code") } @@ -254,6 +254,7 @@ impl MoreInfoCommit { MoreInfoCommit::Validation => { ("🦺", "validation", "Validation") } + MoreInfoCommit::Formatted => ("πŸ’…", "fmt", "Formatted"), } } } @@ -265,15 +266,15 @@ impl CommitType { vec![ MoreInfoCommit::Bug, MoreInfoCommit::CriticalBug, - MoreInfoCommit::Security, + MoreInfoCommit::QuickFix, MoreInfoCommit::Warning, - MoreInfoCommit::TrackCode, MoreInfoCommit::Typo, MoreInfoCommit::TextLiteral, + MoreInfoCommit::Security, + MoreInfoCommit::TrackCode, MoreInfoCommit::ExternalDependencyChange, MoreInfoCommit::DatabaseRelated, MoreInfoCommit::Authorization, - MoreInfoCommit::QuickFix, MoreInfoCommit::HealthCheck, MoreInfoCommit::Business, MoreInfoCommit::Infra, @@ -295,24 +296,24 @@ impl CommitType { MoreInfoCommit::Validation, ], CommitType::Chore | CommitType::Refactor => vec![ - MoreInfoCommit::Security, MoreInfoCommit::Refactor, - MoreInfoCommit::TrackCode, - MoreInfoCommit::Internationalization, + MoreInfoCommit::ArchitecturalChanges, MoreInfoCommit::RenameResources, - MoreInfoCommit::Accessibility, - MoreInfoCommit::Readme, - MoreInfoCommit::License, + MoreInfoCommit::RemoveLogs, MoreInfoCommit::TextLiteral, + MoreInfoCommit::RemoveDeadCode, MoreInfoCommit::DatabaseRelated, - MoreInfoCommit::RemoveLogs, + MoreInfoCommit::Security, + MoreInfoCommit::Readme, + MoreInfoCommit::License, MoreInfoCommit::ImproveExperience, - MoreInfoCommit::ArchitecturalChanges, + MoreInfoCommit::TrackCode, + MoreInfoCommit::Internationalization, + MoreInfoCommit::Accessibility, MoreInfoCommit::GitIgnore, MoreInfoCommit::Flag, MoreInfoCommit::Trash, MoreInfoCommit::Authorization, - MoreInfoCommit::RemoveDeadCode, MoreInfoCommit::Business, MoreInfoCommit::Infra, MoreInfoCommit::Validation, @@ -351,6 +352,7 @@ impl CommitType { } CommitType::Style => { vec![ + MoreInfoCommit::Formatted, MoreInfoCommit::CodeStyle, MoreInfoCommit::UI, MoreInfoCommit::ImproveExperience, @@ -358,8 +360,8 @@ impl CommitType { } CommitType::Build => vec![MoreInfoCommit::CI], CommitType::Debug => vec![ - MoreInfoCommit::TrackCode, MoreInfoCommit::AddLogs, + MoreInfoCommit::TrackCode, MoreInfoCommit::HealthCheck, MoreInfoCommit::RemoveLogs, ], From 0ee224250388fad77daea65708b2b0e3acdb47b7 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 22:20:37 +0000 Subject: [PATCH 23/50] =?UTF-8?q?=E2=9C=A8=20feat!:=20add=20breaking=20cha?= =?UTF-8?q?nges?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/keys/key_list.rs | 2 ++ src/popups/conventional_commit.rs | 19 ++++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/keys/key_list.rs b/src/keys/key_list.rs index 94262f5798..db8d0fa140 100644 --- a/src/keys/key_list.rs +++ b/src/keys/key_list.rs @@ -51,6 +51,7 @@ pub struct KeysList { pub open_commit: GituiKeyEvent, pub open_conventional_commit: GituiKeyEvent, pub open_commit_editor: GituiKeyEvent, + pub breaking: GituiKeyEvent, pub open_help: GituiKeyEvent, pub open_options: GituiKeyEvent, pub move_left: GituiKeyEvent, @@ -150,6 +151,7 @@ impl Default for KeysList { open_commit: GituiKeyEvent::new(KeyCode::Char('c'), KeyModifiers::empty()), open_conventional_commit: GituiKeyEvent::new(KeyCode::Char('C'), KeyModifiers::SHIFT), open_commit_editor: GituiKeyEvent::new(KeyCode::Char('e'), KeyModifiers::CONTROL), + breaking: GituiKeyEvent::new(KeyCode::Char('b'), KeyModifiers::empty()), open_help: GituiKeyEvent::new(KeyCode::Char('h'), KeyModifiers::empty()), open_options: GituiKeyEvent::new(KeyCode::Char('o'), KeyModifiers::empty()), move_left: GituiKeyEvent::new(KeyCode::Left, KeyModifiers::empty()), diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 8515340dfd..32942e9135 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -374,6 +374,7 @@ pub struct ConventionalCommitPopup { key_config: SharedKeyConfig, is_visible: bool, is_insert: bool, + is_breaking: bool, query: Option, selected_index: usize, options: Vec, @@ -399,6 +400,7 @@ impl ConventionalCommitPopup { query_results_type: CommitType::iter().collect_vec(), query_results_more_info: Vec::new(), is_insert: false, + is_breaking: false, query: None, is_visible: false, key_config: env.key_config.clone(), @@ -499,6 +501,7 @@ impl ConventionalCommitPopup { self.key_config.keys.move_down, self.key_config.keys.move_up, self.key_config.keys.exit_popup, + self.key_config.keys.breaking, self.key_config.keys.exit, self.key_config.keys.insert, ] @@ -608,7 +611,8 @@ impl ConventionalCommitPopup { self.queue.push(crate::queue::InternalEvent::OpenCommit); self.queue.push( crate::queue::InternalEvent::AddCommitMessage(format!( - "{emoji} {commit_type}{} {short_msg}", + "{emoji} {commit_type}{}{} {short_msg}", + if self.is_breaking { "!" } else { "" }, if short_msg.is_empty() { "" } else { ":" }, )), ); @@ -646,6 +650,14 @@ impl DrawableComponent for ConventionalCommitPopup { }, self.theme.title(true), )) + .title(if self.is_breaking { + Span::styled( + "[BREAKING]", + self.theme.title(true), + ) + } else { + "".into() + }) .title(if self.is_insert { Span::styled( "[INSERT]", @@ -759,6 +771,11 @@ impl Component for ConventionalCommitPopup { } } } + } else if key_match( + key, + self.key_config.keys.breaking, + ) { + self.is_breaking = !self.is_breaking; } else if key_match( key, self.key_config.keys.popup_down, From 366f08e5a15d2206956b6edf57a05d8374f8f2ae Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 22:25:14 +0000 Subject: [PATCH 24/50] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20remove?= =?UTF-8?q?=20.unwrap()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 32942e9135..1a0d18b4ec 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -28,7 +28,7 @@ use crate::{ ui, }; -#[derive(EnumIter, Display, Clone)] +#[derive(EnumIter, Display, Copy, Clone)] #[strum(serialize_all = "lowercase")] enum CommitType { Refactor, @@ -755,19 +755,15 @@ impl Component for ConventionalCommitPopup { { self.validate_escape(commit_type); } else { - let commit = self + if let Some(&commit) = self .query_results_type .get(self.selected_index) - .cloned(); - - self.seleted_commit_type = commit.clone(); - self.next_step(); - - if let Some(more_infos) = - commit.as_ref().map(|c| c.more_info()) { - if more_infos.len() == 1 { - self.validate_escape(commit.unwrap()); + self.seleted_commit_type = Some(commit); + self.next_step(); + + if commit.more_info().len() == 1 { + self.validate_escape(commit); } } } From 580e28f6910ab45900c3c95db70a244a3e97f03e Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 22:31:43 +0000 Subject: [PATCH 25/50] =?UTF-8?q?=E2=9A=A0=EF=B8=8F=20fix:=20warning=20/?= =?UTF-8?q?=20clippy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app.rs | 5 +- src/popups/conventional_commit.rs | 247 +++++++++++++----------------- 2 files changed, 106 insertions(+), 146 deletions(-) diff --git a/src/app.rs b/src/app.rs index 164296ed83..99901155ec 100644 --- a/src/app.rs +++ b/src/app.rs @@ -463,7 +463,6 @@ impl App { || self.fetch_popup.any_work_pending() || self.revision_files_popup.any_work_pending() || self.tags_popup.any_work_pending() - || self.conventional_commit_popup.any_work_pending() } /// @@ -747,10 +746,10 @@ impl App { InternalEvent::Update(u) => flags.insert(u), InternalEvent::OpenCommit => self.commit_popup.show()?, InternalEvent::AddCommitMessage(s) => { - self.commit_popup.set_msg(s) + self.commit_popup.set_msg(s); } InternalEvent::OpenConventionalCommit => { - self.conventional_commit_popup.show()? + self.conventional_commit_popup.show()?; } InternalEvent::RewordCommit(id) => { self.commit_popup.open(Some(id))?; diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 1a0d18b4ec..3fb23999a4 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -151,118 +151,97 @@ enum MoreInfoCommit { } impl MoreInfoCommit { - fn strings(&self) -> (&'static str, &'static str, &'static str) { + const fn strings( + &self, + ) -> (&'static str, &'static str, &'static str) { match *self { - MoreInfoCommit::UI => ("πŸ’„", "UI", "UI related"), - MoreInfoCommit::CodeStyle => { - ("🎨", "style", "Style of the code") - } - MoreInfoCommit::Performance => ("⚑️", "", "Performance"), - MoreInfoCommit::Bug => ("πŸ›", "bug", "Normal bug"), - MoreInfoCommit::CriticalBug => { + Self::UI => ("πŸ’„", "UI", "UI related"), + Self::CodeStyle => ("🎨", "style", "Style of the code"), + Self::Performance => ("⚑️", "", "Performance"), + Self::Bug => ("πŸ›", "bug", "Normal bug"), + Self::CriticalBug => { ("πŸš‘οΈ", "critical bug", "Critical Bug") } - MoreInfoCommit::Feature => ("✨", "", "Feature"), - MoreInfoCommit::Documentation => { - ("πŸ“", "", "Documentation") - } - MoreInfoCommit::Initial => ("πŸŽ‰", "", "Initial commit!"), - MoreInfoCommit::TestsPassing => { + Self::Feature => ("✨", "", "Feature"), + Self::Documentation => ("πŸ“", "", "Documentation"), + Self::Initial => ("πŸŽ‰", "", "Initial commit!"), + Self::TestsPassing => { ("βœ…", "passing", "Test are now passing!") } - MoreInfoCommit::Add => ("βž•", "add", "Added"), - MoreInfoCommit::Remove => ("βž–", "remove", "Removed"), - MoreInfoCommit::Security => { - ("πŸ”’οΈ", "security", "Secutiry related") - } - MoreInfoCommit::Release => { - ("πŸ”–", "release", "A new relase") - } - MoreInfoCommit::Warning => ("⚠️", "warning", "Warning"), - MoreInfoCommit::Wip => ("🚧", "", "WIP"), - MoreInfoCommit::Down => ("⬇️", "downgrade", "Down"), - MoreInfoCommit::Up => ("⬆️", "upgrade", "Up"), - MoreInfoCommit::CI => ("πŸ‘·", "", "CI related"), - MoreInfoCommit::Refactor => ("♻️", "", "Refactor related"), - MoreInfoCommit::TrackCode => { - ("πŸ“ˆ", "track", "Tracking code") - } - MoreInfoCommit::Typo => ("✏️", "typo", "Typo"), - MoreInfoCommit::Internationalization => { + Self::Add => ("βž•", "add", "Added"), + Self::Remove => ("βž–", "remove", "Removed"), + Self::Security => ("πŸ”’οΈ", "security", "Secutiry related"), + Self::Release => ("πŸ”–", "release", "A new relase"), + Self::Warning => ("⚠️", "warning", "Warning"), + Self::Wip => ("🚧", "", "WIP"), + Self::Down => ("⬇️", "downgrade", "Down"), + Self::Up => ("⬆️", "upgrade", "Up"), + Self::CI => ("πŸ‘·", "", "CI related"), + Self::Refactor => ("♻️", "", "Refactor related"), + Self::TrackCode => ("πŸ“ˆ", "track", "Tracking code"), + Self::Typo => ("✏️", "typo", "Typo"), + Self::Internationalization => { ("🌐", "i18n", "Internationalization") } - MoreInfoCommit::Revert => ("βͺ️", "", "Revert"), - MoreInfoCommit::Package => ("πŸ“¦οΈ", "", "Package related"), - MoreInfoCommit::ExternalDependencyChange => ( + Self::Revert => ("βͺ️", "", "Revert"), + Self::Package => ("πŸ“¦οΈ", "", "Package related"), + Self::ExternalDependencyChange => ( "πŸ‘½οΈ", "change due to external dep update", "Code related to change of ext dep", ), - MoreInfoCommit::RenameResources => { + Self::RenameResources => { ("🚚", "rename", "Rename some resources") } - MoreInfoCommit::Accessibility => { + Self::Accessibility => { ("♿️", "accessibility", "Improved accessibility") } - MoreInfoCommit::Readme => ("πŸ“œ", "README", "README"), - MoreInfoCommit::License => ("βš–οΈ", "LICENSE", "LICENSE"), - MoreInfoCommit::TextLiteral => { + Self::Readme => ("πŸ“œ", "README", "README"), + Self::License => ("βš–οΈ", "LICENSE", "LICENSE"), + Self::TextLiteral => { ("πŸ’¬", "raw value", "Modified literal value") } - MoreInfoCommit::DatabaseRelated => { - ("⛃", "db", "Database related") - } - MoreInfoCommit::AddLogs => ("πŸ”Š", "add logs", "Add logs"), - MoreInfoCommit::RemoveLogs => { - ("πŸ”‡", "remove logs", "Remove logs") - } - MoreInfoCommit::ImproveExperience => { + Self::DatabaseRelated => ("⛃", "db", "Database related"), + Self::AddLogs => ("πŸ”Š", "add logs", "Add logs"), + Self::RemoveLogs => ("πŸ”‡", "remove logs", "Remove logs"), + Self::ImproveExperience => { ("🚸", "experience", "Improve experience") } - MoreInfoCommit::ArchitecturalChanges => { + Self::ArchitecturalChanges => { ("πŸ—οΈ", "architecture", "Architectural Changes") } - MoreInfoCommit::WrittingReallyBadCode => ( + Self::WrittingReallyBadCode => ( "🀑", "really bad code", "This is some REALLY bad code", ), - MoreInfoCommit::GitIgnore => { - ("πŸ™ˆ", "gitignore", "GitIgnore") - } - MoreInfoCommit::Experimentations => { + Self::GitIgnore => ("πŸ™ˆ", "gitignore", "GitIgnore"), + Self::Experimentations => { ("βš—οΈ", "experimentations", "Experimentations") } - MoreInfoCommit::Flag => ("🚩", "flag", "Flag"), - MoreInfoCommit::Trash => ("πŸ—‘οΈ", "", "Trash"), - MoreInfoCommit::Authorization => { + Self::Flag => ("🚩", "flag", "Flag"), + Self::Trash => ("πŸ—‘οΈ", "", "Trash"), + Self::Authorization => { ("πŸ›‚", "authorization", "Authorization") } - MoreInfoCommit::QuickFix => { - ("🩹", "quick-fix", "QuickFix") - } - MoreInfoCommit::RemoveDeadCode => { + Self::QuickFix => ("🩹", "quick-fix", "QuickFix"), + Self::RemoveDeadCode => { ("⚰️", "remove dead code", "RemoveDeadCode") } - MoreInfoCommit::Business => { - ("πŸ‘”", "business", "Business related") - } - MoreInfoCommit::HealthCheck => { - ("🩺", "healthcheck", "HealthCheck") - } - MoreInfoCommit::Infra => ("🧱", "infra", "Infra"), - MoreInfoCommit::Validation => { - ("🦺", "validation", "Validation") - } - MoreInfoCommit::Formatted => ("πŸ’…", "fmt", "Formatted"), + Self::Business => ("πŸ‘”", "business", "Business related"), + Self::HealthCheck => ("🩺", "healthcheck", "HealthCheck"), + Self::Infra => ("🧱", "infra", "Infra"), + Self::Validation => ("🦺", "validation", "Validation"), + Self::Formatted => ("πŸ’…", "fmt", "Formatted"), } } } impl CommitType { + #[allow(clippy::pedantic)] fn more_info(&self) -> Vec { match *self { - CommitType::Fix => { + Self::Fix => { vec![ MoreInfoCommit::Bug, MoreInfoCommit::CriticalBug, @@ -280,7 +259,7 @@ impl CommitType { MoreInfoCommit::Infra, ] } - CommitType::Feature => vec![ + Self::Feature => vec![ MoreInfoCommit::Feature, MoreInfoCommit::Security, MoreInfoCommit::TrackCode, @@ -295,7 +274,7 @@ impl CommitType { MoreInfoCommit::Business, MoreInfoCommit::Validation, ], - CommitType::Chore | CommitType::Refactor => vec![ + Self::Chore | Self::Refactor => vec![ MoreInfoCommit::Refactor, MoreInfoCommit::ArchitecturalChanges, MoreInfoCommit::RenameResources, @@ -318,21 +297,21 @@ impl CommitType { MoreInfoCommit::Infra, MoreInfoCommit::Validation, ], - CommitType::CI => vec![MoreInfoCommit::CI], - CommitType::Initial => vec![MoreInfoCommit::Initial], - CommitType::Performance => { + Self::CI => vec![MoreInfoCommit::CI], + Self::Initial => vec![MoreInfoCommit::Initial], + Self::Performance => { vec![ MoreInfoCommit::Performance, MoreInfoCommit::DatabaseRelated, ] } - CommitType::Wip => vec![ + Self::Wip => vec![ MoreInfoCommit::Wip, MoreInfoCommit::WrittingReallyBadCode, MoreInfoCommit::Experimentations, ], - CommitType::Docs => vec![MoreInfoCommit::Documentation], - CommitType::Test => vec![ + Self::Docs => vec![MoreInfoCommit::Documentation], + Self::Test => vec![ MoreInfoCommit::TestsPassing, MoreInfoCommit::Add, MoreInfoCommit::Remove, @@ -340,7 +319,7 @@ impl CommitType { MoreInfoCommit::HealthCheck, MoreInfoCommit::Validation, ], - CommitType::Bump => { + Self::Bump => { vec![ MoreInfoCommit::Add, MoreInfoCommit::Remove, @@ -350,7 +329,7 @@ impl CommitType { MoreInfoCommit::Package, ] } - CommitType::Style => { + Self::Style => { vec![ MoreInfoCommit::Formatted, MoreInfoCommit::CodeStyle, @@ -358,14 +337,14 @@ impl CommitType { MoreInfoCommit::ImproveExperience, ] } - CommitType::Build => vec![MoreInfoCommit::CI], - CommitType::Debug => vec![ + Self::Build => vec![MoreInfoCommit::CI], + Self::Debug => vec![ MoreInfoCommit::AddLogs, MoreInfoCommit::TrackCode, MoreInfoCommit::HealthCheck, MoreInfoCommit::RemoveLogs, ], - CommitType::Revert => vec![MoreInfoCommit::Revert], + Self::Revert => vec![MoreInfoCommit::Revert], } } } @@ -472,8 +451,7 @@ impl ConventionalCommitPopup { let items = iter_over.into_iter().map(|(selected, text)| { Line::from( text.graphemes(true) - .enumerate() - .map(|(_, c)| { + .map(|c| { Span::styled( Cow::from(c.to_string()), self.theme.text(selected, selected), @@ -494,19 +472,16 @@ impl ConventionalCommitPopup { } pub fn quick_shortcuts(&self) -> Vec { - let mut available_chars = - ('a'..='z').into_iter().collect_vec(); + let mut available_chars = ('a'..='z').collect_vec(); - [ + for k in [ self.key_config.keys.move_down, self.key_config.keys.move_up, self.key_config.keys.exit_popup, self.key_config.keys.breaking, self.key_config.keys.exit, self.key_config.keys.insert, - ] - .into_iter() - .for_each(|k| { + ] { if let KeyCode::Char(c) = k.code { if let Some(char_to_remove_index) = available_chars.iter().position(|&ch| ch == c) @@ -514,15 +489,14 @@ impl ConventionalCommitPopup { available_chars.remove(char_to_remove_index); } } - }); + } self.query_results_type .iter() - .map(|commit_type| commit_type.to_string()) + .map(std::string::ToString::to_string) .map(|s| { if let Some(ch) = s.chars() - .into_iter() - .find(|c| available_chars.contains(&c)) { + .find(|c| available_chars.contains(c)) { available_chars.retain(|&c| c != ch); ch } else { @@ -547,21 +521,18 @@ impl ConventionalCommitPopup { self.selected_index = new_selection; } - pub fn any_work_pending(&self) -> bool { - false - } - fn update_query(&mut self) { if self .query .as_ref() - .is_none_or(|q| q != self.input.get_text()) + .map_or(true, |q| q != self.input.get_text()) { - self.set_query(self.input.get_text().to_string()); + let text = self.input.get_text(); + self.set_query(text.to_owned().as_str()); } } - fn set_query(&mut self, query: String) { + fn set_query(&mut self, query: &str) { let query = query.to_lowercase(); self.query = Some(query.clone()); @@ -594,7 +565,7 @@ impl ConventionalCommitPopup { .filter(|option| { option.to_string().to_lowercase().contains(&query) }) - .cloned() + .copied() .collect_vec(); if self.selected_index >= self.query_results_type.len() { @@ -751,20 +722,18 @@ impl Component for ConventionalCommitPopup { } } else if key_match(key, self.key_config.keys.enter) { if let Some(commit_type) = - self.seleted_commit_type.clone() + self.seleted_commit_type { self.validate_escape(commit_type); - } else { - if let Some(&commit) = self - .query_results_type - .get(self.selected_index) - { - self.seleted_commit_type = Some(commit); - self.next_step(); - - if commit.more_info().len() == 1 { - self.validate_escape(commit); - } + } else if let Some(&commit) = self + .query_results_type + .get(self.selected_index) + { + self.seleted_commit_type = Some(commit); + self.next_step(); + + if commit.more_info().len() == 1 { + self.validate_escape(commit); } } } else if key_match( @@ -782,30 +751,22 @@ impl Component for ConventionalCommitPopup { self.key_config.keys.popup_up, ) { self.move_selection(ScrollType::Up); - } else { - if self.is_insert { - if self.input.event(&event)?.is_consumed() { - self.update_query(); - } - } else if key_match( - key, - self.key_config.keys.insert, - ) { - self.is_insert = true; - } else { - if let KeyCode::Char(c) = key.code { - if let Some(idx) = self - .quick_shortcuts() - .into_iter() - .position(|ch| ch == c) - { - self.seleted_commit_type = Some( - self.query_results_type[idx] - .clone(), - ); - self.next_step(); - } - } + } else if self.is_insert { + if self.input.event(event)?.is_consumed() { + self.update_query(); + } + } else if key_match(key, self.key_config.keys.insert) + { + self.is_insert = true; + } else if let KeyCode::Char(c) = key.code { + if let Some(idx) = self + .quick_shortcuts() + .into_iter() + .position(|ch| ch == c) + { + self.seleted_commit_type = + Some(self.query_results_type[idx]); + self.next_step(); } } } From 96000cb280a14028e385c5bfb916e89d241719d5 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 22:52:53 +0000 Subject: [PATCH 26/50] =?UTF-8?q?=E2=9C=A8=20feat:=20optional=20gitmojis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 3 +- src/popups/conventional_commit.rs | 66 +++++++++++++++++++++---------- 2 files changed, 48 insertions(+), 21 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 666539beef..d433f72091 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -77,8 +77,9 @@ chrono = { version = "0.4", default-features = false, features = ["clock"] } maintenance = { status = "actively-developed" } [features] -default = ["ghemoji", "regex-fancy", "trace-libgit", "vendor-openssl"] +default = ["ghemoji", "regex-fancy", "trace-libgit", "vendor-openssl", "gitmoji"] ghemoji = ["gh-emoji"] +gitmoji = [] # regex-* features are mutually exclusive. regex-fancy = ["syntect/regex-fancy", "two-face/syntect-fancy"] regex-onig = ["syntect/regex-onig", "two-face/syntect-onig"] diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 3fb23999a4..fda6176ff5 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -576,18 +576,36 @@ impl ConventionalCommitPopup { } fn validate_escape(&mut self, commit_type: CommitType) { - let (emoji, short_msg, _) = self.query_results_more_info - [self.selected_index] - .strings(); - self.queue.push(crate::queue::InternalEvent::OpenCommit); - self.queue.push( - crate::queue::InternalEvent::AddCommitMessage(format!( - "{emoji} {commit_type}{}{} {short_msg}", - if self.is_breaking { "!" } else { "" }, - if short_msg.is_empty() { "" } else { ":" }, - )), - ); - self.hide(); + #[cfg(not(feature = "gitmoji"))] + { + self.queue.push(crate::queue::InternalEvent::OpenCommit); + self.queue.push( + crate::queue::InternalEvent::AddCommitMessage( + format!( + "{commit_type}{}:", + if self.is_breaking { "!" } else { "" }, + ), + ), + ); + self.hide(); + } + #[cfg(feature = "gitmoji")] + { + let (emoji, short_msg, _) = self.query_results_more_info + [self.selected_index] + .strings(); + self.queue.push(crate::queue::InternalEvent::OpenCommit); + self.queue.push( + crate::queue::InternalEvent::AddCommitMessage( + format!( + "{emoji} {commit_type}{}{} {short_msg}", + if self.is_breaking { "!" } else { "" }, + if short_msg.is_empty() { "" } else { ":" }, + ), + ), + ); + self.hide(); + } } fn next_step(&mut self) { @@ -725,14 +743,22 @@ impl Component for ConventionalCommitPopup { self.seleted_commit_type { self.validate_escape(commit_type); - } else if let Some(&commit) = self - .query_results_type - .get(self.selected_index) - { - self.seleted_commit_type = Some(commit); - self.next_step(); - - if commit.more_info().len() == 1 { + } else { + if let Some(&commit) = self + .query_results_type + .get(self.selected_index) + { + self.seleted_commit_type = Some(commit); + + #[cfg(feature = "gitmoji")] + { + self.next_step(); + + if commit.more_info().len() == 1 { + self.validate_escape(commit); + } + } + #[cfg(not(feature = "gitmoji"))] self.validate_escape(commit); } } From f811413cac478827161170251f4561aacaaf77f2 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 22:56:34 +0000 Subject: [PATCH 27/50] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20fix:=20s/Commit=20em?= =?UTF-8?q?oji/Conventional=20commit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/strings.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings.rs b/src/strings.rs index 80cb7a6c4a..7fc3e51eae 100644 --- a/src/strings.rs +++ b/src/strings.rs @@ -1092,7 +1092,7 @@ pub mod commands { ) -> CommandText { CommandText::new( format!( - "Commit emoji [{}]", + "Conventional commit [{}]", key_config.get_hint( key_config.keys.open_conventional_commit ) From a3284e5eb97b600869c5488e54412abb6b63a3cb Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 23:01:35 +0000 Subject: [PATCH 28/50] =?UTF-8?q?=F0=9F=A9=B9=20fix:=20cursor=20to=20end?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/textinput.rs | 4 +--- src/popups/conventional_commit.rs | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/components/textinput.rs b/src/components/textinput.rs index 13fc80d3b0..c38df185e0 100644 --- a/src/components/textinput.rs +++ b/src/components/textinput.rs @@ -81,9 +81,7 @@ impl TextInputComponent { pub fn move_cursor_to_end(&mut self) { if let Some(ta) = &mut self.textarea { - for _ in 0..100 { - ta.move_cursor(CursorMove::Forward); - } + ta.move_cursor(CursorMove::End); } } diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index fda6176ff5..9bfdf1543d 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -598,9 +598,9 @@ impl ConventionalCommitPopup { self.queue.push( crate::queue::InternalEvent::AddCommitMessage( format!( - "{emoji} {commit_type}{}{} {short_msg}", + "{emoji} {commit_type}{}{}{short_msg}", if self.is_breaking { "!" } else { "" }, - if short_msg.is_empty() { "" } else { ":" }, + if short_msg.is_empty() { "" } else { ": " }, ), ), ); From 2d7cc74576c579d5f384c6adc71506f1dc70b471 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 23:03:59 +0000 Subject: [PATCH 29/50] =?UTF-8?q?=F0=9F=94=8A=20debug:=20add=20logs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/app.rs b/src/app.rs index 99901155ec..65679fcf9a 100644 --- a/src/app.rs +++ b/src/app.rs @@ -289,7 +289,6 @@ impl App { /// pub fn event(&mut self, ev: InputEvent) -> Result<()> { - //println!("event: {:?}", ev); log::trace!("event: {:?}", ev); if let InputEvent::Input(ev) = ev { From 20d5a2cde491e32ae5800d9043b039e66da7c589 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 23:05:22 +0000 Subject: [PATCH 30/50] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20add=20de?= =?UTF-8?q?ad=5Fcode=20back?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main.rs b/src/main.rs index cd1c862a63..e85dca8530 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,6 +2,7 @@ #![deny( unused_imports, unused_must_use, + dead_code, unstable_name_collisions, unused_assignments )] From 8d72f28b83a893beb0456dc548c5a339a54d4904 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 23:07:00 +0000 Subject: [PATCH 31/50] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20fix:=20s/commit=5Fem?= =?UTF-8?q?oij/conventional=5Fcommit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/strings.rs | 2 +- src/tabs/status.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strings.rs b/src/strings.rs index 7fc3e51eae..3e283882ad 100644 --- a/src/strings.rs +++ b/src/strings.rs @@ -1087,7 +1087,7 @@ pub mod commands { CMD_GROUP_GENERAL, ) } - pub fn commit_emoji_open( + pub fn conventional_commit_open( key_config: &SharedKeyConfig, ) -> CommandText { CommandText::new( diff --git a/src/tabs/status.rs b/src/tabs/status.rs index 6af9df41a5..f0782951fb 100644 --- a/src/tabs/status.rs +++ b/src/tabs/status.rs @@ -738,7 +738,7 @@ impl Component for Status { out.push( CommandInfo::new( - strings::commands::commit_emoji_open( + strings::commands::conventional_commit_open( &self.key_config, ), true, From 15ad7d0ef88e81f1266cb783f3cab983c426b1ea Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 23:07:49 +0000 Subject: [PATCH 32/50] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20fix:=20typo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/strings.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings.rs b/src/strings.rs index 3e283882ad..076448e454 100644 --- a/src/strings.rs +++ b/src/strings.rs @@ -1097,7 +1097,7 @@ pub mod commands { key_config.keys.open_conventional_commit ) ), - "open commit emoji popups (available in non-empty stage)", + "open conventional commit popup (available in non-empty stage)", CMD_GROUP_GENERAL, ) } From 4c59e636e156469b43a5d828504ade0e06e5215f Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 23:08:17 +0000 Subject: [PATCH 33/50] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20fix:=20typo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/strings.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings.rs b/src/strings.rs index 076448e454..c943d484fe 100644 --- a/src/strings.rs +++ b/src/strings.rs @@ -1902,7 +1902,7 @@ pub mod commands { "Exit Insert [{}]", key_config.get_hint(key_config.keys.exit_popup), ), - "exit in insert mode", + "exit of insert mode", CMD_GROUP_LOG, ) } From 57dc1ae05b264a75ec02ee76457e1965f00371ba Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 23:12:44 +0000 Subject: [PATCH 34/50] =?UTF-8?q?=F0=9F=8F=97=EF=B8=8F=20refactor:=20move?= =?UTF-8?q?=20"Conventional=20Commit"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tabs/status.rs | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/src/tabs/status.rs b/src/tabs/status.rs index f0782951fb..6b14f589ad 100644 --- a/src/tabs/status.rs +++ b/src/tabs/status.rs @@ -686,8 +686,7 @@ impl Status { strings::commands::select_staging(&self.key_config), !focus_on_diff, (self.visible - && !focus_on_diff - && self.focus == Focus::WorkDir) + && !focus_on_diff && self.focus == Focus::WorkDir) || force_all, ) .order(strings::order::NAV), @@ -697,8 +696,7 @@ impl Status { strings::commands::select_unstaged(&self.key_config), !focus_on_diff, (self.visible - && !focus_on_diff - && self.focus == Focus::Stage) + && !focus_on_diff && self.focus == Focus::Stage) || force_all, ) .order(strings::order::NAV), @@ -736,17 +734,6 @@ impl Component for Status { .order(-1), ); - out.push( - CommandInfo::new( - strings::commands::conventional_commit_open( - &self.key_config, - ), - true, - self.can_commit() || force_all, - ) - .order(-1), - ); - out.push(CommandInfo::new( strings::commands::open_branch_select_popup( &self.key_config, @@ -815,6 +802,14 @@ impl Component for Status { true, true, )); + + out.push(CommandInfo::new( + strings::commands::conventional_commit_open( + &self.key_config, + ), + true, + self.can_commit() || force_all, + )); } self.commands_nav(out, force_all); From f1c86d918070cd4236f963438bfd6eb8b15577f7 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 23:15:01 +0000 Subject: [PATCH 35/50] =?UTF-8?q?=F0=9F=93=9D=20docs:=20move=20comments=20?= =?UTF-8?q?to=20doc=20ones?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 96 +++++++++++++++---------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 9bfdf1543d..11469d7778 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -52,101 +52,101 @@ enum CommitType { #[derive(Clone)] enum MoreInfoCommit { - // 🎨 + /// 🎨 CodeStyle, - // πŸ’… + /// πŸ’… Formatted, - // ⚑️ + /// ⚑️ Performance, - // πŸ› + /// πŸ› Bug, - // πŸš‘οΈ + /// πŸš‘οΈ CriticalBug, - // ✨ + /// ✨ Feature, - // πŸ“ + /// πŸ“ Documentation, - // πŸ’„ + /// πŸ’„ UI, - // πŸŽ‰ + /// πŸŽ‰ Initial, - // βœ… + /// βœ… TestsPassing, - // βž• + /// βž• Add, - // βž– + /// βž– Remove, - // πŸ”’οΈ + /// πŸ”’οΈ Security, - // πŸ”– + /// πŸ”– Release, - // ⚠️ + /// ⚠️ Warning, - // 🚧 + /// 🚧 Wip, - // ⬇️ + /// ⬇️ Down, - // ⬆️ + /// ⬆️ Up, - // πŸ‘· + /// πŸ‘· CI, - // ♻️ + /// ♻️ Refactor, - // πŸ“ˆ + /// πŸ“ˆ TrackCode, - // ✏️ + /// ✏️ Typo, - // 🌐 + /// 🌐 Internationalization, - // βͺ️ + /// βͺ️ Revert, - // πŸ“¦οΈ + /// πŸ“¦οΈ Package, - // πŸ‘½οΈ + /// πŸ‘½οΈ ExternalDependencyChange, - // 🚚 + /// 🚚 RenameResources, - // ♿️ + /// ♿️ Accessibility, - // πŸ“œ + /// πŸ“œ Readme, - // βš–οΈ + /// βš–οΈ License, - // πŸ’¬ + /// πŸ’¬ TextLiteral, - // ⛃ + /// ⛃ DatabaseRelated, - // πŸ”Š + /// πŸ”Š AddLogs, - // πŸ”‡ + /// πŸ”‡ RemoveLogs, - // 🚸 + /// 🚸 ImproveExperience, - // πŸ—οΈ + /// πŸ—οΈ ArchitecturalChanges, - // 🀑 + /// 🀑 WrittingReallyBadCode, - // πŸ™ˆ + /// πŸ™ˆ GitIgnore, - // βš—οΈ + /// βš—οΈ Experimentations, - // 🚩 + /// 🚩 Flag, - // πŸ—‘οΈ + /// πŸ—‘οΈ Trash, - // πŸ›‚ + /// πŸ›‚ Authorization, - // 🩹 + /// 🩹 QuickFix, - // ⚰️ + /// ⚰️ RemoveDeadCode, - // πŸ‘” + /// πŸ‘” Business, - // 🩺 + /// 🩺 HealthCheck, - // 🧱 + /// 🧱 Infra, - // 🦺 + /// 🦺 Validation, } From 29fbfc9351fbd2af46883d8ce0fb2607458f1e3c Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 23:16:42 +0000 Subject: [PATCH 36/50] =?UTF-8?q?=E2=9A=A0=EF=B8=8F=20fix:=20warning?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 36 +++++++++++++++---------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 11469d7778..a08ae4d24f 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -743,25 +743,23 @@ impl Component for ConventionalCommitPopup { self.seleted_commit_type { self.validate_escape(commit_type); - } else { - if let Some(&commit) = self - .query_results_type - .get(self.selected_index) - { - self.seleted_commit_type = Some(commit); - - #[cfg(feature = "gitmoji")] - { - self.next_step(); - - if commit.more_info().len() == 1 { - self.validate_escape(commit); - } - } - #[cfg(not(feature = "gitmoji"))] - self.validate_escape(commit); - } - } + } else if let Some(&commit) = self + .query_results_type + .get(self.selected_index) + { + self.seleted_commit_type = Some(commit); + + #[cfg(feature = "gitmoji")] + { + self.next_step(); + + if commit.more_info().len() == 1 { + self.validate_escape(commit); + } + } + #[cfg(not(feature = "gitmoji"))] + self.validate_escape(commit); + } } else if key_match( key, self.key_config.keys.breaking, From 96459014aa38ea41b0090af44c2cb27f88f15eb0 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 23:23:27 +0000 Subject: [PATCH 37/50] =?UTF-8?q?=F0=9F=90=9B=20fix:=20when=20empty,=20don?= =?UTF-8?q?'t=20panic=20with=20[]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 34 +++++++++++++++++++------------ 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index a08ae4d24f..82821e0288 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -591,20 +591,28 @@ impl ConventionalCommitPopup { } #[cfg(feature = "gitmoji")] { - let (emoji, short_msg, _) = self.query_results_more_info - [self.selected_index] - .strings(); - self.queue.push(crate::queue::InternalEvent::OpenCommit); - self.queue.push( - crate::queue::InternalEvent::AddCommitMessage( - format!( - "{emoji} {commit_type}{}{}{short_msg}", - if self.is_breaking { "!" } else { "" }, - if short_msg.is_empty() { "" } else { ": " }, + if let Some((emoji, short_msg, _)) = self + .query_results_more_info + .get(self.selected_index) + .map(|more_info| more_info.strings()) + { + self.queue + .push(crate::queue::InternalEvent::OpenCommit); + self.queue.push( + crate::queue::InternalEvent::AddCommitMessage( + format!( + "{emoji} {commit_type}{}{}{short_msg}", + if self.is_breaking { "!" } else { "" }, + if short_msg.is_empty() { + "" + } else { + ": " + }, + ), ), - ), - ); - self.hide(); + ); + self.hide(); + } } } From 12b2c92e85f80b55915c87ab9091b394ded33d99 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 23:23:39 +0000 Subject: [PATCH 38/50] =?UTF-8?q?=F0=9F=92=85=20style:=20fmt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 34 +++++++++++++++---------------- src/tabs/status.rs | 6 ++++-- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 82821e0288..2937b87224 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -502,7 +502,7 @@ impl ConventionalCommitPopup { } else { *available_chars.first().expect("Should already have at least one letter available") } - }) + }) .collect_vec() } @@ -752,22 +752,22 @@ impl Component for ConventionalCommitPopup { { self.validate_escape(commit_type); } else if let Some(&commit) = self - .query_results_type - .get(self.selected_index) - { - self.seleted_commit_type = Some(commit); - - #[cfg(feature = "gitmoji")] - { - self.next_step(); - - if commit.more_info().len() == 1 { - self.validate_escape(commit); - } - } - #[cfg(not(feature = "gitmoji"))] - self.validate_escape(commit); - } + .query_results_type + .get(self.selected_index) + { + self.seleted_commit_type = Some(commit); + + #[cfg(feature = "gitmoji")] + { + self.next_step(); + + if commit.more_info().len() == 1 { + self.validate_escape(commit); + } + } + #[cfg(not(feature = "gitmoji"))] + self.validate_escape(commit); + } } else if key_match( key, self.key_config.keys.breaking, diff --git a/src/tabs/status.rs b/src/tabs/status.rs index 6b14f589ad..5e357a9455 100644 --- a/src/tabs/status.rs +++ b/src/tabs/status.rs @@ -686,7 +686,8 @@ impl Status { strings::commands::select_staging(&self.key_config), !focus_on_diff, (self.visible - && !focus_on_diff && self.focus == Focus::WorkDir) + && !focus_on_diff + && self.focus == Focus::WorkDir) || force_all, ) .order(strings::order::NAV), @@ -696,7 +697,8 @@ impl Status { strings::commands::select_unstaged(&self.key_config), !focus_on_diff, (self.visible - && !focus_on_diff && self.focus == Focus::Stage) + && !focus_on_diff + && self.focus == Focus::Stage) || force_all, ) .order(strings::order::NAV), From b4270f549912dd73bf834df66ce5737eee4c2483 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 23:28:20 +0000 Subject: [PATCH 39/50] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20use=20co?= =?UTF-8?q?nsts=20instead=20of=20magic=20&str?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 4 ++-- src/strings.rs | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 2937b87224..d674b82233 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -641,9 +641,9 @@ impl DrawableComponent for ConventionalCommitPopup { .style(self.theme.title(true)) .title(Span::styled( if self.seleted_commit_type.is_some() { - "Emoji of commit" + strings::POPUP_TITLE_CONVENTIONAL_COMMIT } else { - "Type of commit" + strings::POPUP_TITLE_GITMOJI }, self.theme.title(true), )) diff --git a/src/strings.rs b/src/strings.rs index c943d484fe..258851f27f 100644 --- a/src/strings.rs +++ b/src/strings.rs @@ -23,6 +23,8 @@ pub static PUSH_POPUP_STATES_DELTAS: &str = "deltas (2/3)"; pub static PUSH_POPUP_STATES_PUSHING: &str = "pushing (3/3)"; pub static PUSH_POPUP_STATES_TRANSFER: &str = "transfer"; pub static PUSH_POPUP_STATES_DONE: &str = "done"; +pub const POPUP_TITLE_CONVENTIONAL_COMMIT: &str = "Type of Commit"; +pub const POPUP_TITLE_GITMOJI: &str = "Emoji of Commit"; pub static PUSH_TAGS_POPUP_MSG: &str = "Push Tags"; pub static PUSH_TAGS_STATES_FETCHING: &str = "fetching"; From d0540866b9fc9debb8be8b8d3e716dcbebc51f8b Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 23:32:09 +0000 Subject: [PATCH 40/50] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20use=20Bo?= =?UTF-8?q?rrow=20instead=20of=20&str?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index d674b82233..5b79275dc1 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -1,4 +1,4 @@ -use std::borrow::Cow; +use std::borrow::{Borrow, Cow}; use anyhow::Result; use crossterm::event::{Event, KeyCode}; @@ -528,12 +528,12 @@ impl ConventionalCommitPopup { .map_or(true, |q| q != self.input.get_text()) { let text = self.input.get_text(); - self.set_query(text.to_owned().as_str()); + self.set_query(text.to_owned()); } } - fn set_query(&mut self, query: &str) { - let query = query.to_lowercase(); + fn set_query>(&mut self, query: S) { + let query = query.borrow().to_lowercase(); self.query = Some(query.clone()); if let Some(commit_type) = &self.seleted_commit_type { From 5c92e338097105af804335110a9599d87e669bfe Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 23:35:42 +0000 Subject: [PATCH 41/50] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20rm=20dup?= =?UTF-8?q?licated=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 5b79275dc1..d5b2d7e4bf 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -50,7 +50,7 @@ enum CommitType { CI, } -#[derive(Clone)] +#[derive(Copy, Clone)] enum MoreInfoCommit { /// 🎨 CodeStyle, @@ -536,7 +536,9 @@ impl ConventionalCommitPopup { let query = query.borrow().to_lowercase(); self.query = Some(query.clone()); - if let Some(commit_type) = &self.seleted_commit_type { + let new_len = if let Some(commit_type) = + &self.seleted_commit_type + { self.query_results_more_info = commit_type .more_info() .iter() @@ -547,17 +549,10 @@ impl ConventionalCommitPopup { .to_lowercase() .contains(&query) }) - .cloned() + .copied() .collect_vec(); - if self.selected_index - >= self.query_results_more_info.len() - { - self.selected_index = self - .query_results_more_info - .len() - .saturating_sub(1); - } + self.query_results_more_info.len() } else { self.query_results_type = self .options @@ -568,10 +563,11 @@ impl ConventionalCommitPopup { .copied() .collect_vec(); - if self.selected_index >= self.query_results_type.len() { - self.selected_index = - self.query_results_type.len().saturating_sub(1); - } + self.query_results_type.len() + }; + + if self.selected_index >= new_len { + self.selected_index = new_len.saturating_sub(1); } } From ae1af08f7f6f78018ce33229fdc236ebe384a41b Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 23:44:56 +0000 Subject: [PATCH 42/50] =?UTF-8?q?=F0=9F=90=9B=20fix:=20bug=20when=201=20re?= =?UTF-8?q?s=20!=3D=20open=20commit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index d5b2d7e4bf..072e962676 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -730,6 +730,7 @@ impl Component for ConventionalCommitPopup { visibility_blocking(self) } + fn event( &mut self, event: &crossterm::event::Event, @@ -757,7 +758,8 @@ impl Component for ConventionalCommitPopup { { self.next_step(); - if commit.more_info().len() == 1 { + if self.query_results_more_info.len() == 1 + { self.validate_escape(commit); } } @@ -794,7 +796,19 @@ impl Component for ConventionalCommitPopup { { self.seleted_commit_type = Some(self.query_results_type[idx]); - self.next_step(); + #[cfg(feature = "gitmoji")] + { + self.next_step(); + + if self.query_results_more_info.len() == 1 + { + self.validate_escape( + self.query_results_type[idx], + ); + } + } + #[cfg(not(feature = "gitmoji"))] + self.validate_escape(commit); } } } From ae06c25a366565f470acf627dbb746164833a30c Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Wed, 15 Jan 2025 23:48:53 +0000 Subject: [PATCH 43/50] =?UTF-8?q?=F0=9F=A9=B9=20fix:=20remove=20unused=20r?= =?UTF-8?q?eference?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 072e962676..68fa75bb61 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -152,9 +152,9 @@ enum MoreInfoCommit { impl MoreInfoCommit { const fn strings( - &self, + self, ) -> (&'static str, &'static str, &'static str) { - match *self { + match self { Self::UI => ("πŸ’„", "UI", "UI related"), Self::CodeStyle => ("🎨", "style", "Style of the code"), Self::Performance => ("⚑️", "", "Performance"), From 40f807730ba0c4b21b0cdb8844a344fcccc94077 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Thu, 16 Jan 2025 13:48:11 +0000 Subject: [PATCH 44/50] =?UTF-8?q?=F0=9F=A9=B9=20fix:previously=20inverted?= =?UTF-8?q?=20order=20of=20commit=20title?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 68fa75bb61..48e30dbdc7 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -637,9 +637,9 @@ impl DrawableComponent for ConventionalCommitPopup { .style(self.theme.title(true)) .title(Span::styled( if self.seleted_commit_type.is_some() { - strings::POPUP_TITLE_CONVENTIONAL_COMMIT - } else { strings::POPUP_TITLE_GITMOJI + } else { + strings::POPUP_TITLE_CONVENTIONAL_COMMIT }, self.theme.title(true), )) From 8465c3fff59c2e7400f45bf1758ec69b7ff432a5 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Fri, 17 Jan 2025 00:19:19 +0000 Subject: [PATCH 45/50] =?UTF-8?q?=F0=9F=90=9B=20fix:=20clamp=20max=20depen?= =?UTF-8?q?ding=20on=20phase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 48e30dbdc7..42fad178e5 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -515,7 +515,12 @@ impl ConventionalCommitPopup { let new_selection = new_selection.clamp( 0, - self.query_results_type.len().saturating_sub(1), + if self.seleted_commit_type.is_some() { + self.query_results_more_info.len() + } else { + self.query_results_type.len() + } + .saturating_sub(1), ); self.selected_index = new_selection; From cb202547a0271c6d0cd133a6e2d97184919876cd Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Sun, 23 Mar 2025 18:44:58 +0100 Subject: [PATCH 46/50] =?UTF-8?q?=F0=9F=A9=B9=20fix:=20add=20the=20scroll?= =?UTF-8?q?=20keys?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 42fad178e5..861cfa4743 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -475,8 +475,8 @@ impl ConventionalCommitPopup { let mut available_chars = ('a'..='z').collect_vec(); for k in [ - self.key_config.keys.move_down, - self.key_config.keys.move_up, + self.key_config.keys.popup_up, + self.key_config.keys.popup_down, self.key_config.keys.exit_popup, self.key_config.keys.breaking, self.key_config.keys.exit, @@ -721,7 +721,7 @@ impl Component for ConventionalCommitPopup { } out.push(CommandInfo::new( - strings::commands::scroll(&self.key_config), + strings::commands::scroll_popup(&self.key_config), true, true, )); @@ -813,7 +813,9 @@ impl Component for ConventionalCommitPopup { } } #[cfg(not(feature = "gitmoji"))] - self.validate_escape(commit); + self.validate_escape( + self.query_results_type[idx], + ); } } } From bb7871480292870ccc76e97521caa779d1a4e4cc Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Sun, 23 Mar 2025 19:30:53 +0100 Subject: [PATCH 47/50] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20add=20mo?= =?UTF-8?q?re=20feature=20gating?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 123 +++++++++++++++++++++--------- src/strings.rs | 1 + 2 files changed, 86 insertions(+), 38 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 861cfa4743..dbc960a895 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -50,6 +50,7 @@ enum CommitType { CI, } +#[cfg(feature = "gitmoji")] #[derive(Copy, Clone)] enum MoreInfoCommit { /// 🎨 @@ -150,6 +151,7 @@ enum MoreInfoCommit { Validation, } +#[cfg(feature = "gitmoji")] impl MoreInfoCommit { const fn strings( self, @@ -237,6 +239,7 @@ impl MoreInfoCommit { } } +#[cfg(feature = "gitmoji")] impl CommitType { #[allow(clippy::pedantic)] fn more_info(&self) -> Vec { @@ -358,6 +361,7 @@ pub struct ConventionalCommitPopup { selected_index: usize, options: Vec, query_results_type: Vec, + #[cfg(feature = "gitmoji")] query_results_more_info: Vec, input: TextInputComponent, theme: SharedTheme, @@ -377,6 +381,7 @@ impl ConventionalCommitPopup { input, options: CommitType::iter().collect_vec(), query_results_type: CommitType::iter().collect_vec(), + #[cfg(feature = "gitmoji")] query_results_more_info: Vec::new(), is_insert: false, is_breaking: false, @@ -396,30 +401,48 @@ impl ConventionalCommitPopup { let quick_shortcuts = self.quick_shortcuts(); - let title = format!( - "Results: {}", - if self.seleted_commit_type.is_some() { - self.query_results_more_info.len() - } else { + let results = { + #[cfg(feature = "gitmoji")] + { + if self.seleted_commit_type.is_some() { + self.query_results_more_info.len() + } else { + self.query_results_type.len() + } + } + #[cfg(not(feature = "gitmoji"))] + { self.query_results_type.len() } - ); + }; + + let title = format!("Results: {results}",); let iter_over = if self.seleted_commit_type.is_some() { - self.query_results_more_info - .iter() - .enumerate() - .take(height) - .map(|(idx, more_info)| { - let (emoji, _, long_name) = more_info.strings(); - let text_string = format!("{emoji} {long_name}"); - let text = trim_length_left(&text_string, width); - ( - self.selected_index == idx, - format!("{text}{:width$}", " "), - ) - }) - .collect_vec() + #[cfg(feature = "gitmoji")] + { + self.query_results_more_info + .iter() + .enumerate() + .take(height) + .map(|(idx, more_info)| { + let (emoji, _, long_name) = + more_info.strings(); + let text_string = + format!("{emoji} {long_name}"); + let text = + trim_length_left(&text_string, width); + ( + self.selected_index == idx, + format!("{text}{:width$}", " "), + ) + }) + .collect_vec() + } + #[cfg(not(feature = "gitmoji"))] + { + vec![] + } } else { let max_len = self .query_results_type @@ -516,7 +539,14 @@ impl ConventionalCommitPopup { let new_selection = new_selection.clamp( 0, if self.seleted_commit_type.is_some() { - self.query_results_more_info.len() + #[cfg(feature = "gitmoji")] + { + self.query_results_more_info.len() + } + #[cfg(not(feature = "gitmoji"))] + { + self.query_results_type.len() + } } else { self.query_results_type.len() } @@ -544,20 +574,29 @@ impl ConventionalCommitPopup { let new_len = if let Some(commit_type) = &self.seleted_commit_type { - self.query_results_more_info = commit_type - .more_info() - .iter() - .filter(|more_info_commit| { - more_info_commit - .strings() - .2 - .to_lowercase() - .contains(&query) - }) - .copied() - .collect_vec(); + #[cfg(feature = "gitmoji")] + { + self.query_results_more_info = commit_type + .more_info() + .iter() + .filter(|more_info_commit| { + more_info_commit + .strings() + .2 + .to_lowercase() + .contains(&query) + }) + .copied() + .collect_vec(); - self.query_results_more_info.len() + self.query_results_more_info.len() + } + #[cfg(not(feature = "gitmoji"))] + { + let _ = commit_type; + self.hide(); + self.query_results_type.len() + } } else { self.query_results_type = self .options @@ -641,9 +680,14 @@ impl DrawableComponent for ConventionalCommitPopup { .borders(Borders::all()) .style(self.theme.title(true)) .title(Span::styled( - if self.seleted_commit_type.is_some() { - strings::POPUP_TITLE_GITMOJI - } else { + { + #[cfg(feature = "gitmoji")] + if self.seleted_commit_type.is_some() { + strings::POPUP_TITLE_GITMOJI + } else { + strings::POPUP_TITLE_CONVENTIONAL_COMMIT + } + #[cfg(not(feature = "gitmoji"))] strings::POPUP_TITLE_CONVENTIONAL_COMMIT }, self.theme.title(true), @@ -835,7 +879,10 @@ impl Component for ConventionalCommitPopup { self.is_visible = false; self.seleted_commit_type = None; self.query_results_type = CommitType::iter().collect_vec(); - self.query_results_more_info = Vec::new(); + #[cfg(feature = "gitmoji")] + { + self.query_results_more_info.clear(); + } } fn show(&mut self) -> Result<()> { diff --git a/src/strings.rs b/src/strings.rs index 258851f27f..4c6292708a 100644 --- a/src/strings.rs +++ b/src/strings.rs @@ -24,6 +24,7 @@ pub static PUSH_POPUP_STATES_PUSHING: &str = "pushing (3/3)"; pub static PUSH_POPUP_STATES_TRANSFER: &str = "transfer"; pub static PUSH_POPUP_STATES_DONE: &str = "done"; pub const POPUP_TITLE_CONVENTIONAL_COMMIT: &str = "Type of Commit"; +#[cfg(feature = "gitmoji")] pub const POPUP_TITLE_GITMOJI: &str = "Emoji of Commit"; pub static PUSH_TAGS_POPUP_MSG: &str = "Push Tags"; From 558bffb19d6346e75b8e0ff85fbe1ddcdefc92c3 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Sun, 23 Mar 2025 19:58:55 +0100 Subject: [PATCH 48/50] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20never=20?= =?UTF-8?q?collect=20the=20list=20block?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 132 +++++++++++++++--------------- 1 file changed, 67 insertions(+), 65 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index dbc960a895..2bf61a3f6d 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -416,82 +416,84 @@ impl ConventionalCommitPopup { } }; - let title = format!("Results: {results}",); + let block = Block::default() + .title(Span::styled( + format!("Results: {results}"), + self.theme.title(true), + )) + .borders(Borders::TOP); + + if self.seleted_commit_type.is_some() { + ui::draw_list_block(f, area, block, { + #[cfg(feature = "gitmoji")] + { + self.query_results_more_info + .iter() + .enumerate() + .take(height) + .map(|(idx, more_info)| { + let (emoji, _, long_name) = + more_info.strings(); + let text_string = + format!("{emoji} {long_name}"); + let text = + trim_length_left(&text_string, width); + self.line_from_text( + self.selected_index == idx, + &format!("{text}{:width$}", " "), + ) + }) + } + #[cfg(not(feature = "gitmoji"))] + { + std::iter::empty::() + } + }); + } else { + let max_len = self + .query_results_type + .iter() + .map(|s| s.to_string().len()) + .max(); - let iter_over = if self.seleted_commit_type.is_some() { - #[cfg(feature = "gitmoji")] - { - self.query_results_more_info + ui::draw_list_block( + f, + area, + block, + self.query_results_type .iter() .enumerate() .take(height) - .map(|(idx, more_info)| { - let (emoji, _, long_name) = - more_info.strings(); - let text_string = - format!("{emoji} {long_name}"); + .map(|(idx, commit_type)| { + let text_string = format!( + "{:w$} [{}]", + commit_type, + quick_shortcuts[idx], + w = max_len.unwrap_or_default(), + ); let text = trim_length_left(&text_string, width); - ( + + self.line_from_text( self.selected_index == idx, - format!("{text}{:width$}", " "), + &format!("{text}{:width$}", " "), ) - }) - .collect_vec() - } - #[cfg(not(feature = "gitmoji"))] - { - vec![] - } - } else { - let max_len = self - .query_results_type - .iter() - .map(|s| s.to_string().len()) - .max(); + }), + ); + } + } - self.query_results_type - .iter() - .enumerate() - .take(height) - .map(|(idx, commit_type)| { - let text_string = format!( - "{:w$} [{}]", - commit_type, - quick_shortcuts[idx], - w = max_len.unwrap_or_default(), - ); - let text = trim_length_left(&text_string, width); - - ( - self.selected_index == idx, - format!("{text}{:width$}", " "), + fn line_from_text(&self, is_selected: bool, text: &str) -> Line { + Line::from( + text.graphemes(true) + .map(|c| { + Span::styled( + Cow::from(c.to_string()), + self.theme.text(is_selected, is_selected), ) }) - .collect_vec() - }; - - let items = iter_over.into_iter().map(|(selected, text)| { - Line::from( - text.graphemes(true) - .map(|c| { - Span::styled( - Cow::from(c.to_string()), - self.theme.text(selected, selected), - ) - }) - .collect::>(), - ) - }); - - ui::draw_list_block( - f, - area, - Block::default() - .title(Span::styled(title, self.theme.title(true))) - .borders(Borders::TOP), - items, - ); + .collect_vec(), + ) } pub fn quick_shortcuts(&self) -> Vec { From 28d8ff50e1dcc7604086ec545390371b874a5b41 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Sun, 23 Mar 2025 20:07:37 +0100 Subject: [PATCH 49/50] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20derive?= =?UTF-8?q?=20IntoStaticStr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 70 +++++++++++++++---------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 2bf61a3f6d..2e48fb3f23 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -10,7 +10,7 @@ use ratatui::{ text::Span, widgets::{Block, Borders, Clear}, }; -use strum::{Display, EnumIter, IntoEnumIterator}; +use strum::{Display, EnumIter, IntoEnumIterator, IntoStaticStr}; use unicode_segmentation::UnicodeSegmentation; use crate::components::visibility_blocking; @@ -28,7 +28,7 @@ use crate::{ ui, }; -#[derive(EnumIter, Display, Copy, Clone)] +#[derive(EnumIter, Copy, Clone, IntoStaticStr, Display)] #[strum(serialize_all = "lowercase")] enum CommitType { Refactor, @@ -453,7 +453,7 @@ impl ConventionalCommitPopup { let max_len = self .query_results_type .iter() - .map(|s| s.to_string().len()) + .map(|s| Into::<&str>::into(s).len()) .max(); ui::draw_list_block( @@ -518,9 +518,8 @@ impl ConventionalCommitPopup { self.query_results_type .iter() - .map(std::string::ToString::to_string) .map(|s| { - if let Some(ch) = s.chars() + if let Some(ch) = Into::<&str>::into(s).chars() .find(|c| available_chars.contains(c)) { available_chars.retain(|&c| c != ch); ch @@ -573,44 +572,45 @@ impl ConventionalCommitPopup { let query = query.borrow().to_lowercase(); self.query = Some(query.clone()); - let new_len = if let Some(commit_type) = - &self.seleted_commit_type - { - #[cfg(feature = "gitmoji")] - { - self.query_results_more_info = commit_type - .more_info() + let new_len = + if let Some(commit_type) = &self.seleted_commit_type { + #[cfg(feature = "gitmoji")] + { + self.query_results_more_info = commit_type + .more_info() + .iter() + .filter(|more_info_commit| { + more_info_commit + .strings() + .2 + .to_lowercase() + .contains(&query) + }) + .copied() + .collect_vec(); + + self.query_results_more_info.len() + } + #[cfg(not(feature = "gitmoji"))] + { + let _ = commit_type; + self.hide(); + self.query_results_type.len() + } + } else { + self.query_results_type = self + .options .iter() - .filter(|more_info_commit| { - more_info_commit - .strings() - .2 + .filter(|option| { + Into::<&str>::into(*option) .to_lowercase() .contains(&query) }) .copied() .collect_vec(); - self.query_results_more_info.len() - } - #[cfg(not(feature = "gitmoji"))] - { - let _ = commit_type; - self.hide(); self.query_results_type.len() - } - } else { - self.query_results_type = self - .options - .iter() - .filter(|option| { - option.to_string().to_lowercase().contains(&query) - }) - .copied() - .collect_vec(); - - self.query_results_type.len() - }; + }; if self.selected_index >= new_len { self.selected_index = new_len.saturating_sub(1); From dc0936e35759d32e728d283e368b648b1d186282 Mon Sep 17 00:00:00 2001 From: tk <49250442+tkr-sh@users.noreply.github.com> Date: Sun, 23 Mar 2025 20:12:17 +0100 Subject: [PATCH 50/50] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20use=20cl?= =?UTF-8?q?ear=20instead=20of=20set=5Ftext?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/popups/conventional_commit.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/popups/conventional_commit.rs b/src/popups/conventional_commit.rs index 2e48fb3f23..5d5a8e870c 100644 --- a/src/popups/conventional_commit.rs +++ b/src/popups/conventional_commit.rs @@ -890,7 +890,7 @@ impl Component for ConventionalCommitPopup { fn show(&mut self) -> Result<()> { self.is_visible = true; self.input.show()?; - self.input.set_text(String::new()); + self.input.clear(); Ok(()) } }