mirror of
https://github.com/LGUG2Z/komorebi.git
synced 2026-03-25 19:01:19 +01:00
This commit adds a new command to resize by axis. Resizing is still limited to the BSP layout. This command is intended to be bound to mouse wheel up and down events, with different modified keys determining the axis to operate on.
64 lines
1.7 KiB
Rust
64 lines
1.7 KiB
Rust
use std::num::NonZeroUsize;
|
|
|
|
use clap::ArgEnum;
|
|
use serde::Deserialize;
|
|
use serde::Serialize;
|
|
use strum::Display;
|
|
use strum::EnumString;
|
|
|
|
use crate::direction::Direction;
|
|
use crate::Axis;
|
|
|
|
#[derive(Clone, Copy, Debug, Serialize, Deserialize, Display, EnumString, ArgEnum)]
|
|
#[strum(serialize_all = "snake_case")]
|
|
pub enum OperationDirection {
|
|
Left,
|
|
Right,
|
|
Up,
|
|
Down,
|
|
}
|
|
|
|
impl OperationDirection {
|
|
#[must_use]
|
|
pub const fn opposite(self) -> Self {
|
|
match self {
|
|
Self::Left => Self::Right,
|
|
Self::Right => Self::Left,
|
|
Self::Up => Self::Down,
|
|
Self::Down => Self::Up,
|
|
}
|
|
}
|
|
|
|
fn flip(self, layout_flip: Option<Axis>) -> Self {
|
|
layout_flip.map_or(self, |flip| match self {
|
|
Self::Left => match flip {
|
|
Axis::Horizontal | Axis::HorizontalAndVertical => Self::Right,
|
|
Axis::Vertical => self,
|
|
},
|
|
Self::Right => match flip {
|
|
Axis::Horizontal | Axis::HorizontalAndVertical => Self::Left,
|
|
Axis::Vertical => self,
|
|
},
|
|
Self::Up => match flip {
|
|
Axis::Vertical | Axis::HorizontalAndVertical => Self::Down,
|
|
Axis::Horizontal => self,
|
|
},
|
|
Self::Down => match flip {
|
|
Axis::Vertical | Axis::HorizontalAndVertical => Self::Up,
|
|
Axis::Horizontal => self,
|
|
},
|
|
})
|
|
}
|
|
|
|
#[must_use]
|
|
pub fn destination(
|
|
self,
|
|
layout: &dyn Direction,
|
|
layout_flip: Option<Axis>,
|
|
idx: usize,
|
|
len: NonZeroUsize,
|
|
) -> Option<usize> {
|
|
layout.index_in_direction(self.flip(layout_flip), idx, len.get())
|
|
}
|
|
}
|