From f6aa8c17937fadd1da3c8f2f080ea402ae17da87 Mon Sep 17 00:00:00 2001 From: Duncan Overbruck Date: Thu, 13 Mar 2025 03:09:06 +0100 Subject: Add move-column-to-index action --- src/input/mod.rs | 6 ++++++ src/layout/mod.rs | 7 +++++++ src/layout/scrolling.rs | 8 ++++++++ src/layout/tests.rs | 2 ++ src/layout/workspace.rs | 7 +++++++ 5 files changed, 30 insertions(+) (limited to 'src') diff --git a/src/input/mod.rs b/src/input/mod.rs index b38da2a0..95d30457 100644 --- a/src/input/mod.rs +++ b/src/input/mod.rs @@ -1167,6 +1167,12 @@ impl State { self.niri.queue_redraw_all(); } } + Action::MoveColumnToIndex(idx) => { + self.niri.layout.move_column_to_index(idx); + self.maybe_warp_cursor_to_focus(); + // FIXME: granular + self.niri.queue_redraw_all(); + } Action::FocusWorkspaceDown => { self.niri.layout.switch_workspace_down(); self.maybe_warp_cursor_to_focus(); diff --git a/src/layout/mod.rs b/src/layout/mod.rs index 11469551..67963f2e 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -1830,6 +1830,13 @@ impl Layout { true } + pub fn move_column_to_index(&mut self, index: usize) { + let Some(workspace) = self.active_workspace_mut() else { + return; + }; + workspace.move_column_to_index(index); + } + pub fn move_down(&mut self) { let Some(workspace) = self.active_workspace_mut() else { return; diff --git a/src/layout/scrolling.rs b/src/layout/scrolling.rs index cad65881..8659b8f8 100644 --- a/src/layout/scrolling.rs +++ b/src/layout/scrolling.rs @@ -1583,6 +1583,14 @@ impl ScrollingSpace { self.columns[self.active_column_idx].focus_bottom() } + pub fn move_column_to_index(&mut self, index: usize) { + if self.columns.is_empty() { + return; + } + + self.move_column_to(index.saturating_sub(1).min(self.columns.len() - 1)); + } + fn move_column_to(&mut self, new_idx: usize) { if self.active_column_idx == new_idx { return; diff --git a/src/layout/tests.rs b/src/layout/tests.rs index cfd5d053..29a44877 100644 --- a/src/layout/tests.rs +++ b/src/layout/tests.rs @@ -399,6 +399,7 @@ enum Op { MoveColumnToLast, MoveColumnLeftOrToMonitorLeft(#[proptest(strategy = "1..=2u8")] u8), MoveColumnRightOrToMonitorRight(#[proptest(strategy = "1..=2u8")] u8), + MoveColumnToIndex(#[proptest(strategy = "1..=5usize")] usize), MoveWindowDown, MoveWindowUp, MoveWindowDownOrToWorkspaceDown, @@ -975,6 +976,7 @@ impl Op { layout.move_column_right_or_to_output(&output); } + Op::MoveColumnToIndex(index) => layout.move_column_to_index(index), Op::MoveWindowDown => layout.move_down(), Op::MoveWindowUp => layout.move_up(), Op::MoveWindowDownOrToWorkspaceDown => layout.move_down_or_to_workspace_down(), diff --git a/src/layout/workspace.rs b/src/layout/workspace.rs index 08614308..873af715 100644 --- a/src/layout/workspace.rs +++ b/src/layout/workspace.rs @@ -972,6 +972,13 @@ impl Workspace { self.scrolling.move_column_to_last(); } + pub fn move_column_to_index(&mut self, index: usize) { + if self.floating_is_active.get() { + return; + } + self.scrolling.move_column_to_index(index); + } + pub fn move_down(&mut self) -> bool { if self.floating_is_active.get() { self.floating.move_down(); -- cgit