diff options
| author | Aram Drevekenin <aram@poor.dev> | 2025-04-29 20:52:17 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-29 20:52:17 +0200 |
| commit | 27c8986939a1642f3e4afda73e9717b7bd328824 (patch) | |
| tree | e80ee57aeede2578a5ce9fa6d0ab4a350ed9d838 /zellij-utils/src/plugin_api/plugin_command.rs | |
| parent | chore: update development version (diff) | |
| download | sl0ppij-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.rs | 153 |
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(), + }, + )), + }), } } } |
