summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Linford <tlinford@users.noreply.github.com>2021-08-23 15:51:33 +0200
committerGitHub <noreply@github.com>2021-08-23 15:51:33 +0200
commit94f20cfd5312f828c9180e7bcb5d760c09829a56 (patch)
tree05cb55c1aa80f59d58ae9ca00f10d15344857eb4
parentd1b5a6991807e2558b828c44a79b2b37af2b1094 (diff)
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
-rw-r--r--default-plugins/status-bar/src/main.rs28
-rw-r--r--default-plugins/status-bar/src/second_line.rs12
-rw-r--r--zellij-server/src/route.rs4
-rw-r--r--zellij-server/src/tab.rs6
-rw-r--r--zellij-tile/src/data.rs2
5 files changed, 47 insertions, 5 deletions
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(),
+ }
+}
diff --git a/zellij-server/src/route.rs b/zellij-server/src/route.rs
index 3959a19aa..20f14c3bd 100644
--- a/zellij-server/src/route.rs
+++ b/zellij-server/src/route.rs
@@ -23,6 +23,10 @@ fn route_action(
to_server: &SenderWithContext<ServerInstruction>,
) -> bool {
let mut should_break = false;
+ session
+ .senders
+ .send_to_plugin(PluginInstruction::Update(None, Event::InputReceived))
+ .unwrap();
match action {
Action::Write(val) => {
session
diff --git a/zellij-server/src/tab.rs b/zellij-server/src/tab.rs
index 8f12f8836..6ecf33b71 100644
--- a/zellij-server/src/tab.rs
+++ b/zellij-server/src/tab.rs
@@ -2871,6 +2871,9 @@ impl Tab {
let selected_text = self.get_active_pane().and_then(|p| p.get_selected_text());
if let Some(selected_text) = selected_text {
self.write_selection_to_clipboard(&selected_text);
+ self.senders
+ .send_to_plugin(PluginInstruction::Update(None, Event::CopyToClipboard))
+ .unwrap();
}
}
@@ -2879,6 +2882,9 @@ impl Tab {
self.senders
.send_to_server(ServerInstruction::Render(Some(output)))
.unwrap();
+ self.senders
+ .send_to_plugin(PluginInstruction::Update(None, Event::CopyToClipboard))
+ .unwrap();
}
fn is_inside_viewport(&self, pane_id: &PaneId) -> bool {
let pane_position_and_size = self.panes.get(pane_id).unwrap().position_and_size();
diff --git a/zellij-tile/src/data.rs b/zellij-tile/src/data.rs
index cdf57e69f..b22be626d 100644
--- a/zellij-tile/src/data.rs
+++ b/zellij-tile/src/data.rs
@@ -33,6 +33,8 @@ pub enum Event {
TabUpdate(Vec<TabInfo>),
KeyPress(Key),
Timer(f64),
+ CopyToClipboard,
+ InputReceived,
}
/// Describes the different input modes, which change the way that keystrokes will be interpreted.