From 94f20cfd5312f828c9180e7bcb5d760c09829a56 Mon Sep 17 00:00:00 2001 From: Thomas Linford Date: Mon, 23 Aug 2021 15:51:33 +0200 Subject: Indicate to the user when text is copied to the clipboard (#642) * Indicate to the user when text is copied to the clipboard - broadcast CopyToClipboard event to plugins after selection has been copied, and InputReceived event after any input has been received. - add new ClientToServerMsg InputReceived - subscribe status-bar plugin to new events, modify second line after CopyToClipboard, reset it on InputReceived. * remove unnecessary InputReceived ClientToServerMsg - use existing Actions instead to know that user input has been received * make status bar text copied hint bold green * cleanup * cleanup * cleanup --- default-plugins/status-bar/src/main.rs | 28 ++++++++++++++++++++++----- default-plugins/status-bar/src/second_line.rs | 12 ++++++++++++ 2 files changed, 35 insertions(+), 5 deletions(-) (limited to 'default-plugins/status-bar/src') diff --git a/default-plugins/status-bar/src/main.rs b/default-plugins/status-bar/src/main.rs index dba373f6b..d2c6d82b5 100644 --- a/default-plugins/status-bar/src/main.rs +++ b/default-plugins/status-bar/src/main.rs @@ -8,7 +8,7 @@ use zellij_tile::prelude::*; use zellij_tile_utils::style; use first_line::{ctrl_keys, superkey}; -use second_line::keybinds; +use second_line::{keybinds, text_copied_hint}; // for more of these, copy paste from: https://en.wikipedia.org/wiki/Box-drawing_character static ARROW_SEPARATOR: &str = ""; @@ -17,6 +17,7 @@ static MORE_MSG: &str = " ... "; #[derive(Default)] struct State { mode_info: ModeInfo, + diplay_text_copied_hint: bool, } register_plugin!(State); @@ -136,12 +137,25 @@ impl ZellijPlugin for State { set_selectable(false); set_invisible_borders(true); set_fixed_height(2); - subscribe(&[EventType::ModeUpdate]); + subscribe(&[ + EventType::ModeUpdate, + EventType::CopyToClipboard, + EventType::InputReceived, + ]); } fn update(&mut self, event: Event) { - if let Event::ModeUpdate(mode_info) = event { - self.mode_info = mode_info; + match event { + Event::ModeUpdate(mode_info) => { + self.mode_info = mode_info; + } + Event::CopyToClipboard => { + self.diplay_text_copied_hint = true; + } + Event::InputReceived => { + self.diplay_text_copied_hint = false; + } + _ => {} } } @@ -161,7 +175,11 @@ impl ZellijPlugin for State { ); let first_line = format!("{}{}", superkey, ctrl_keys); - let second_line = keybinds(&self.mode_info, cols); + let second_line = if self.diplay_text_copied_hint { + text_copied_hint(&self.mode_info.palette) + } else { + keybinds(&self.mode_info, cols) + }; // [48;5;238m is gray background, [0K is so that it fills the rest of the line // [m is background reset, [0K is so that it clears the rest of the line diff --git a/default-plugins/status-bar/src/second_line.rs b/default-plugins/status-bar/src/second_line.rs index 750df77b6..d73cb2874 100644 --- a/default-plugins/status-bar/src/second_line.rs +++ b/default-plugins/status-bar/src/second_line.rs @@ -375,3 +375,15 @@ pub fn keybinds(help: &ModeInfo, max_width: usize) -> LinePart { } best_effort_shortcut_list(help, max_width) } + +pub fn text_copied_hint(palette: &Palette) -> LinePart { + let hint = " Text copied to clipboard"; + let green_color = match palette.green { + PaletteColor::Rgb((r, g, b)) => RGB(r, g, b), + PaletteColor::EightBit(color) => Fixed(color), + }; + LinePart { + part: format!("{}", Style::new().fg(green_color).bold().paint(hint)), + len: hint.len(), + } +} -- cgit v1.2.3