From 0b6d27e6822f7287677fe37df9ffed092030f665 Mon Sep 17 00:00:00 2001 From: Iulian Alexa <116089722+iulianalexa@users.noreply.github.com> Date: Wed, 3 Jan 2024 21:19:22 +0200 Subject: [PATCH 1/4] add completion_char feature --- crates/libtiny_tui/src/config.rs | 3 +++ crates/libtiny_tui/src/input_area/mod.rs | 14 ++++++++++++-- crates/libtiny_tui/src/messaging.rs | 12 +++++++++++- crates/libtiny_tui/src/tui.rs | 14 ++++++++++++++ 4 files changed, 40 insertions(+), 3 deletions(-) diff --git a/crates/libtiny_tui/src/config.rs b/crates/libtiny_tui/src/config.rs index c7c26fa6..76d22dc4 100644 --- a/crates/libtiny_tui/src/config.rs +++ b/crates/libtiny_tui/src/config.rs @@ -31,6 +31,9 @@ pub(crate) struct Config { #[serde(default)] pub(crate) key_map: Option, + + #[serde(default)] + pub(crate) completion_char: Option, } #[derive(Debug, Deserialize, PartialEq, Eq)] diff --git a/crates/libtiny_tui/src/input_area/mod.rs b/crates/libtiny_tui/src/input_area/mod.rs index de8887d5..3a6474fa 100644 --- a/crates/libtiny_tui/src/input_area/mod.rs +++ b/crates/libtiny_tui/src/input_area/mod.rs @@ -712,7 +712,7 @@ impl InputArea { } impl InputArea { - pub(crate) fn autocomplete(&mut self, dict: &Trie) { + pub(crate) fn autocomplete(&mut self, dict: &Trie, completion_char: &Option) { if self.in_autocomplete() { // scroll next if you hit the KeyAction::InputAutoComplete key again self.completion_prev_entry(); @@ -746,7 +746,17 @@ impl InputArea { } }; - dict.drop_pfx(&mut word.iter().cloned()) + let mut completions = dict.drop_pfx(&mut word.iter().cloned()); + + if let Some(completion_suffix) = &completion_char { + if cursor_left == 0 { + for completion in completions.iter_mut() { + completion.push_str(&format!("{} ", completion_suffix)); + } + } + } + + completions }; if !completions.is_empty() { diff --git a/crates/libtiny_tui/src/messaging.rs b/crates/libtiny_tui/src/messaging.rs index 159c6e45..c1b086f0 100644 --- a/crates/libtiny_tui/src/messaging.rs +++ b/crates/libtiny_tui/src/messaging.rs @@ -39,6 +39,9 @@ pub(crate) struct MessagingUI { /// Last timestamp added to the UI. last_ts: Option, + + // Autocompletion character to be used when at the start of the line. Set with `set_completion_char`. + completion_char: Option, } /// Length of ": " suffix of nicks in messages @@ -92,6 +95,7 @@ impl MessagingUI { height: i32, scrollback: usize, msg_layout: Layout, + completion_char: Option, ) -> MessagingUI { MessagingUI { msg_area: MsgArea::new(width, height - 1, scrollback, msg_layout), @@ -102,6 +106,7 @@ impl MessagingUI { nicks: Trie::new(), last_activity_line: None, last_ts: None, + completion_char, } } @@ -164,7 +169,7 @@ impl MessagingUI { } KeyAction::InputAutoComplete => { if self.exit_dialogue.is_none() { - self.input_field.autocomplete(&self.nicks); + self.input_field.autocomplete(&self.nicks, &self.completion_char); } WidgetRet::KeyHandled } @@ -218,6 +223,11 @@ impl MessagingUI { self.input_field.set(str) } + /// Set completion char. + pub(crate) fn set_completion_char(&mut self, completion_char: Option) { + self.completion_char = completion_char; + } + /// Set cursor location in the input field. pub(crate) fn set_cursor(&mut self, cursor: i32) { self.input_field.set_cursor(cursor); diff --git a/crates/libtiny_tui/src/tui.rs b/crates/libtiny_tui/src/tui.rs index ba950d30..4e913a05 100644 --- a/crates/libtiny_tui/src/tui.rs +++ b/crates/libtiny_tui/src/tui.rs @@ -108,6 +108,9 @@ pub struct TUI { /// TabConfig settings loaded from config file tab_configs: TabConfigs, + + // Autocompletion character to be used when at the start of the line. + completion_char: Option, } pub(crate) enum CmdResult { @@ -175,6 +178,7 @@ impl TUI { key_map: KeyMap::default(), config_path, tab_configs: TabConfigs::default(), + completion_char: None, }; // Init "mentions" tab. This needs to happen right after creating the TUI to be able to @@ -365,9 +369,11 @@ impl TUI { max_nick_length, key_map, layout, + completion_char, .. } = config; self.set_colors(colors); + self.set_completion_char(completion_char); self.scrollback = scrollback.max(1); self.key_map.load(&key_map.unwrap_or_default()); if let Some(layout) = layout { @@ -394,6 +400,13 @@ impl TUI { self.colors = colors; } + fn set_completion_char(&mut self, completion_char: Option) { + self.completion_char = completion_char; + for tab in &mut self.tabs { + tab.widget.set_completion_char((&self.completion_char).clone()); + } + } + fn new_tab(&mut self, idx: usize, src: MsgSource, alias: Option) { let visible_name = alias.unwrap_or_else(|| match &src { MsgSource::Serv { serv } => serv.to_owned(), @@ -446,6 +459,7 @@ impl TUI { self.height - 1, self.scrollback, self.msg_layout, + self.completion_char.clone(), ), src, style: TabStyle::Normal, From ce6bec8ecea9c3005be702de19e73439c8df1376 Mon Sep 17 00:00:00 2001 From: Iulian Alexa <116089722+iulianalexa@users.noreply.github.com> Date: Sun, 7 Jan 2024 20:07:30 +0200 Subject: [PATCH 2/4] fixed formatting --- crates/libtiny_tui/src/messaging.rs | 3 ++- crates/libtiny_tui/src/tui.rs | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/crates/libtiny_tui/src/messaging.rs b/crates/libtiny_tui/src/messaging.rs index c1b086f0..04476bc5 100644 --- a/crates/libtiny_tui/src/messaging.rs +++ b/crates/libtiny_tui/src/messaging.rs @@ -169,7 +169,8 @@ impl MessagingUI { } KeyAction::InputAutoComplete => { if self.exit_dialogue.is_none() { - self.input_field.autocomplete(&self.nicks, &self.completion_char); + self.input_field + .autocomplete(&self.nicks, &self.completion_char); } WidgetRet::KeyHandled } diff --git a/crates/libtiny_tui/src/tui.rs b/crates/libtiny_tui/src/tui.rs index 4e913a05..4adeec04 100644 --- a/crates/libtiny_tui/src/tui.rs +++ b/crates/libtiny_tui/src/tui.rs @@ -403,7 +403,8 @@ impl TUI { fn set_completion_char(&mut self, completion_char: Option) { self.completion_char = completion_char; for tab in &mut self.tabs { - tab.widget.set_completion_char((&self.completion_char).clone()); + tab.widget + .set_completion_char((&self.completion_char).clone()); } } From d7c58dc4c3df43ad2e6a248626d5ea2f12345e54 Mon Sep 17 00:00:00 2001 From: Iulian Alexa <116089722+iulianalexa@users.noreply.github.com> Date: Tue, 9 Jan 2024 23:25:39 +0200 Subject: [PATCH 3/4] Move completion_char to InputArea --- crates/libtiny_tui/src/input_area/mod.rs | 13 +++++++++++-- crates/libtiny_tui/src/messaging.rs | 11 ++--------- crates/libtiny_tui/src/tui.rs | 1 - 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/crates/libtiny_tui/src/input_area/mod.rs b/crates/libtiny_tui/src/input_area/mod.rs index 3a6474fa..a33ac8aa 100644 --- a/crates/libtiny_tui/src/input_area/mod.rs +++ b/crates/libtiny_tui/src/input_area/mod.rs @@ -52,6 +52,9 @@ pub(crate) struct InputArea { /// Current nickname. Not available on initialization (e.g. before registration with the /// server). Set with `set_nick`. nick: Option, + + // Autocompletion character to be used when at the start of the line. Set with `set_completion_char`. + completion_char: Option, } enum Mode { @@ -120,6 +123,7 @@ impl InputArea { history: Vec::with_capacity(HIST_SIZE), mode: Mode::Edit, nick: None, + completion_char: None, } } @@ -127,6 +131,11 @@ impl InputArea { self.nick = Some(Nickname::new(value, color)) } + /// Set completion char. + pub(crate) fn set_completion_char(&mut self, completion_char: Option) { + self.completion_char = completion_char; + } + pub(crate) fn get_nick(&self) -> Option { self.nick.as_ref().map(|nick| nick.value.clone()) } @@ -712,7 +721,7 @@ impl InputArea { } impl InputArea { - pub(crate) fn autocomplete(&mut self, dict: &Trie, completion_char: &Option) { + pub(crate) fn autocomplete(&mut self, dict: &Trie) { if self.in_autocomplete() { // scroll next if you hit the KeyAction::InputAutoComplete key again self.completion_prev_entry(); @@ -748,7 +757,7 @@ impl InputArea { let mut completions = dict.drop_pfx(&mut word.iter().cloned()); - if let Some(completion_suffix) = &completion_char { + if let Some(completion_suffix) = &self.completion_char { if cursor_left == 0 { for completion in completions.iter_mut() { completion.push_str(&format!("{} ", completion_suffix)); diff --git a/crates/libtiny_tui/src/messaging.rs b/crates/libtiny_tui/src/messaging.rs index 04476bc5..55e814ce 100644 --- a/crates/libtiny_tui/src/messaging.rs +++ b/crates/libtiny_tui/src/messaging.rs @@ -39,9 +39,6 @@ pub(crate) struct MessagingUI { /// Last timestamp added to the UI. last_ts: Option, - - // Autocompletion character to be used when at the start of the line. Set with `set_completion_char`. - completion_char: Option, } /// Length of ": " suffix of nicks in messages @@ -95,7 +92,6 @@ impl MessagingUI { height: i32, scrollback: usize, msg_layout: Layout, - completion_char: Option, ) -> MessagingUI { MessagingUI { msg_area: MsgArea::new(width, height - 1, scrollback, msg_layout), @@ -106,7 +102,6 @@ impl MessagingUI { nicks: Trie::new(), last_activity_line: None, last_ts: None, - completion_char, } } @@ -169,8 +164,7 @@ impl MessagingUI { } KeyAction::InputAutoComplete => { if self.exit_dialogue.is_none() { - self.input_field - .autocomplete(&self.nicks, &self.completion_char); + self.input_field.autocomplete(&self.nicks); } WidgetRet::KeyHandled } @@ -224,9 +218,8 @@ impl MessagingUI { self.input_field.set(str) } - /// Set completion char. pub(crate) fn set_completion_char(&mut self, completion_char: Option) { - self.completion_char = completion_char; + self.input_field.set_completion_char(completion_char); } /// Set cursor location in the input field. diff --git a/crates/libtiny_tui/src/tui.rs b/crates/libtiny_tui/src/tui.rs index 4adeec04..27d8e482 100644 --- a/crates/libtiny_tui/src/tui.rs +++ b/crates/libtiny_tui/src/tui.rs @@ -460,7 +460,6 @@ impl TUI { self.height - 1, self.scrollback, self.msg_layout, - self.completion_char.clone(), ), src, style: TabStyle::Normal, From a8f6cb2b60e4a191863b3e4fd8f54523bb7e89f5 Mon Sep 17 00:00:00 2001 From: Iulian Alexa <116089722+iulianalexa@users.noreply.github.com> Date: Mon, 22 Jan 2024 01:21:32 +0200 Subject: [PATCH 4/4] Add sample config entry --- crates/tiny/config.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/crates/tiny/config.yml b/crates/tiny/config.yml index b5458151..1e0b9e2b 100644 --- a/crates/tiny/config.yml +++ b/crates/tiny/config.yml @@ -66,6 +66,10 @@ defaults: # Location for chat logs. log_dir: "{}" +# Optional character(s) that will be appended at the end of a completed +# nick, if at the beginning of the line. Uncomment to enable. +# completion_char: ":" + # Limits the maximum number of messages stored in each tab. Default is # unlimited. # scrollback: 512