aboutsummaryrefslogtreecommitdiffstats
path: root/zellij-utils/src/plugin_api/plugin_command.rs
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2025-04-29 20:52:17 +0200
committerGitHub <noreply@github.com>2025-04-29 20:52:17 +0200
commit27c8986939a1642f3e4afda73e9717b7bd328824 (patch)
treee80ee57aeede2578a5ce9fa6d0ab4a350ed9d838 /zellij-utils/src/plugin_api/plugin_command.rs
parentchore: update development version (diff)
downloadsl0ppij-27c8986939a1642f3e4afda73e9717b7bd328824.tar.gz
sl0ppij-27c8986939a1642f3e4afda73e9717b7bd328824.tar.xz
sl0ppij-27c8986939a1642f3e4afda73e9717b7bd328824.zip
feat: multiple Select and Bulk Pane Actions (#4169)
* initial implementation with break panes to new tab * break pane group left/right * group embed/eject panes * stack pane group on resize * close pane group * style(fmt): rustfmt * fix tests * group drag and ungroup with the mouse * fix mouse hover for multiple clients * fix for multiple clients * multiple select plugin initial * use real data in plugin * adjust functionality * fix some ux issues * reflect group mouse group selections in plugin * group/ungroup panes in Zellij * highlight frames when marked by the plugin * refactor: render function in plugin * some ui responsiveness * some more responsiveness and adjust hover text * break out functionality * stack functionality * break panes left/right and close multiple panes * fix(tab): only relayout the relevant layout when non-focused pane is closed * status bar UI * embed and float panes * work * fix some ui/ux issues * refactor: move stuff around * some responsiveness and fix search result browsing bug * change plugin pane title * differentiate group from focused pane * add keyboard shortcut * add ui to compact bar * make boundary colors appear properly without pane frames * get plugins to also display their frame color * make hover shortcuts appear on command panes * fix: do not render search string component if it's empty * BeforeClose Event and unhighlight panes on exit * some UI/UX fixes * some fixes to the catppuccin-latte theme * remove ungroup shortcut * make some ui components opaque * fix more opaque elements * fix some issues with stacking pane order * keyboard shortcuts for grouping * config to opt out of advanced mouse actions * make selected + focused frame color distinct * group marking mode * refactor: multiple-select plugin * adjust stacking group behavior * adjust flashing periods * render common modifier in group controls * add to compact bar * adjust key hint wording * add key to presets and default config * some cleanups * some refactoring * fix tests * fix plugin system tests * tests: group/ungroup/hover * test: BeforeClose plugin event * new plugin assets * style(fmt): rustfmt * remove warnings * tests: give plugin more time to load
Diffstat (limited to 'zellij-utils/src/plugin_api/plugin_command.rs')
-rw-r--r--zellij-utils/src/plugin_api/plugin_command.rs153
1 files changed, 143 insertions, 10 deletions
diff --git a/zellij-utils/src/plugin_api/plugin_command.rs b/zellij-utils/src/plugin_api/plugin_command.rs
index 0de590e7..833d6270 100644
--- a/zellij-utils/src/plugin_api/plugin_command.rs
+++ b/zellij-utils/src/plugin_api/plugin_command.rs
@@ -5,17 +5,19 @@ pub use super::generated_api::api::{
plugin_command::{
plugin_command::Payload, BreakPanesToNewTabPayload, BreakPanesToTabWithIndexPayload,
ChangeFloatingPanesCoordinatesPayload, ChangeHostFolderPayload,
- ClearScreenForPaneIdPayload, CliPipeOutputPayload, CloseTabWithIndexPayload, CommandName,
- ContextItem, EditScrollbackForPaneWithIdPayload, EnvVariable, ExecCmdPayload,
+ ClearScreenForPaneIdPayload, CliPipeOutputPayload, CloseMultiplePanesPayload,
+ CloseTabWithIndexPayload, CommandName, ContextItem, EditScrollbackForPaneWithIdPayload,
+ EmbedMultiplePanesPayload, EnvVariable, ExecCmdPayload,
FixedOrPercent as ProtobufFixedOrPercent,
- FixedOrPercentValue as ProtobufFixedOrPercentValue,
- FloatingPaneCoordinates as ProtobufFloatingPaneCoordinates, HidePaneWithIdPayload,
- HttpVerb as ProtobufHttpVerb, IdAndNewName, KeyToRebind, KeyToUnbind, KillSessionsPayload,
- LoadNewPluginPayload, MessageToPluginPayload, MovePaneWithPaneIdInDirectionPayload,
- MovePaneWithPaneIdPayload, MovePayload, NewPluginArgs as ProtobufNewPluginArgs,
- NewTabsWithLayoutInfoPayload, OpenCommandPaneFloatingNearPluginPayload,
- OpenCommandPaneInPlaceOfPluginPayload, OpenCommandPaneNearPluginPayload,
- OpenCommandPanePayload, OpenFileFloatingNearPluginPayload, OpenFileInPlaceOfPluginPayload,
+ FixedOrPercentValue as ProtobufFixedOrPercentValue, FloatMultiplePanesPayload,
+ FloatingPaneCoordinates as ProtobufFloatingPaneCoordinates, GroupAndUngroupPanesPayload,
+ HidePaneWithIdPayload, HighlightAndUnhighlightPanesPayload, HttpVerb as ProtobufHttpVerb,
+ IdAndNewName, KeyToRebind, KeyToUnbind, KillSessionsPayload, LoadNewPluginPayload,
+ MessageToPluginPayload, MovePaneWithPaneIdInDirectionPayload, MovePaneWithPaneIdPayload,
+ MovePayload, NewPluginArgs as ProtobufNewPluginArgs, NewTabsWithLayoutInfoPayload,
+ OpenCommandPaneFloatingNearPluginPayload, OpenCommandPaneInPlaceOfPluginPayload,
+ OpenCommandPaneNearPluginPayload, OpenCommandPanePayload,
+ OpenFileFloatingNearPluginPayload, OpenFileInPlaceOfPluginPayload,
OpenFileNearPluginPayload, OpenFilePayload, OpenTerminalFloatingNearPluginPayload,
OpenTerminalInPlaceOfPluginPayload, OpenTerminalNearPluginPayload,
PageScrollDownInPaneIdPayload, PageScrollUpInPaneIdPayload, PaneId as ProtobufPaneId,
@@ -1540,6 +1542,78 @@ impl TryFrom<ProtobufPluginCommand> for PluginCommand {
},
_ => Err("Mismatched payload for OpenFileInPlaceOfPlugin"),
},
+ Some(CommandName::GroupAndUngroupPanes) => match protobuf_plugin_command.payload {
+ Some(Payload::GroupAndUngroupPanesPayload(group_and_ungroup_panes_payload)) => {
+ Ok(PluginCommand::GroupAndUngroupPanes(
+ group_and_ungroup_panes_payload
+ .pane_ids_to_group
+ .into_iter()
+ .filter_map(|p| p.try_into().ok())
+ .collect(),
+ group_and_ungroup_panes_payload
+ .pane_ids_to_ungroup
+ .into_iter()
+ .filter_map(|p| p.try_into().ok())
+ .collect(),
+ ))
+ },
+ _ => Err("Mismatched payload for GroupAndUngroupPanes"),
+ },
+ Some(CommandName::HighlightAndUnhighlightPanes) => {
+ match protobuf_plugin_command.payload {
+ Some(Payload::HighlightAndUnhighlightPanesPayload(
+ highlight_and_unhighlight_panes_payload,
+ )) => Ok(PluginCommand::HighlightAndUnhighlightPanes(
+ highlight_and_unhighlight_panes_payload
+ .pane_ids_to_highlight
+ .into_iter()
+ .filter_map(|p| p.try_into().ok())
+ .collect(),
+ highlight_and_unhighlight_panes_payload
+ .pane_ids_to_unhighlight
+ .into_iter()
+ .filter_map(|p| p.try_into().ok())
+ .collect(),
+ )),
+ _ => Err("Mismatched payload for HighlightAndUnhighlightPanes"),
+ }
+ },
+ Some(CommandName::CloseMultiplePanes) => match protobuf_plugin_command.payload {
+ Some(Payload::CloseMultiplePanesPayload(close_multiple_panes_payload)) => {
+ Ok(PluginCommand::CloseMultiplePanes(
+ close_multiple_panes_payload
+ .pane_ids
+ .into_iter()
+ .filter_map(|p| p.try_into().ok())
+ .collect(),
+ ))
+ },
+ _ => Err("Mismatched payload for CloseMultiplePanes"),
+ },
+ Some(CommandName::FloatMultiplePanes) => match protobuf_plugin_command.payload {
+ Some(Payload::FloatMultiplePanesPayload(float_multiple_panes_payload)) => {
+ Ok(PluginCommand::FloatMultiplePanes(
+ float_multiple_panes_payload
+ .pane_ids
+ .into_iter()
+ .filter_map(|p| p.try_into().ok())
+ .collect(),
+ ))
+ },
+ _ => Err("Mismatched payload for FloatMultiplePanes"),
+ },
+ Some(CommandName::EmbedMultiplePanes) => match protobuf_plugin_command.payload {
+ Some(Payload::EmbedMultiplePanesPayload(embed_multiple_panes_payload)) => {
+ Ok(PluginCommand::EmbedMultiplePanes(
+ embed_multiple_panes_payload
+ .pane_ids
+ .into_iter()
+ .filter_map(|p| p.try_into().ok())
+ .collect(),
+ ))
+ },
+ _ => Err("Mismatched payload for EmbedMultiplePanes"),
+ },
None => Err("Unrecognized plugin command"),
}
}
@@ -2551,6 +2625,65 @@ impl TryFrom<PluginCommand> for ProtobufPluginCommand {
},
)),
}),
+ PluginCommand::GroupAndUngroupPanes(panes_to_group, panes_to_ungroup) => {
+ Ok(ProtobufPluginCommand {
+ name: CommandName::GroupAndUngroupPanes as i32,
+ payload: Some(Payload::GroupAndUngroupPanesPayload(
+ GroupAndUngroupPanesPayload {
+ pane_ids_to_group: panes_to_group
+ .iter()
+ .filter_map(|&p| p.try_into().ok())
+ .collect(),
+ pane_ids_to_ungroup: panes_to_ungroup
+ .iter()
+ .filter_map(|&p| p.try_into().ok())
+ .collect(),
+ },
+ )),
+ })
+ },
+ PluginCommand::HighlightAndUnhighlightPanes(
+ panes_to_highlight,
+ panes_to_unhighlight,
+ ) => Ok(ProtobufPluginCommand {
+ name: CommandName::HighlightAndUnhighlightPanes as i32,
+ payload: Some(Payload::HighlightAndUnhighlightPanesPayload(
+ HighlightAndUnhighlightPanesPayload {
+ pane_ids_to_highlight: panes_to_highlight
+ .iter()
+ .filter_map(|&p| p.try_into().ok())
+ .collect(),
+ pane_ids_to_unhighlight: panes_to_unhighlight
+ .iter()
+ .filter_map(|&p| p.try_into().ok())
+ .collect(),
+ },
+ )),
+ }),
+ PluginCommand::CloseMultiplePanes(pane_ids) => Ok(ProtobufPluginCommand {
+ name: CommandName::CloseMultiplePanes as i32,
+ payload: Some(Payload::CloseMultiplePanesPayload(
+ CloseMultiplePanesPayload {
+ pane_ids: pane_ids.iter().filter_map(|&p| p.try_into().ok()).collect(),
+ },
+ )),
+ }),
+ PluginCommand::FloatMultiplePanes(pane_ids) => Ok(ProtobufPluginCommand {
+ name: CommandName::FloatMultiplePanes as i32,
+ payload: Some(Payload::FloatMultiplePanesPayload(
+ FloatMultiplePanesPayload {
+ pane_ids: pane_ids.iter().filter_map(|&p| p.try_into().ok()).collect(),
+ },
+ )),
+ }),
+ PluginCommand::EmbedMultiplePanes(pane_ids) => Ok(ProtobufPluginCommand {
+ name: CommandName::EmbedMultiplePanes as i32,
+ payload: Some(Payload::EmbedMultiplePanesPayload(
+ EmbedMultiplePanesPayload {
+ pane_ids: pane_ids.iter().filter_map(|&p| p.try_into().ok()).collect(),
+ },
+ )),
+ }),
}
}
}