summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2021-02-09 17:36:37 +0100
committerGitHub <noreply@github.com>2021-02-09 17:36:37 +0100
commit14783c2b2c3bcd3b4b01e72c46d6af3ecbdd203c (patch)
tree7e25be8c93e85ec9fc03335f1993f319f713c614
parentc5370803acd92d973f9e0be8b38d4b6c63e96a6e (diff)
feat(ui): new keybindings and status bar (#160)
* work * feat(statusbar): new design and keybindings * fix(ipc): add missing const * style(fmt): rustfmt * style(input): remove accidental comment
-rw-r--r--assets/layouts/default.yaml2
-rw-r--r--assets/plugins/status-bar.wasmbin479232 -> 509798 bytes
-rw-r--r--src/client/boundaries.rs517
-rw-r--r--src/client/panes/plugin_pane.rs8
-rw-r--r--src/client/panes/terminal_pane.rs3
-rw-r--r--src/client/tab.rs15
-rw-r--r--src/common/errors.rs2
-rw-r--r--src/common/input/actions.rs1
-rw-r--r--src/common/input/handler.rs124
-rw-r--r--src/common/input/keybinds.rs128
-rw-r--r--src/common/mod.rs20
-rw-r--r--src/common/screen.rs1
-rw-r--r--src/common/wasm_vm.rs16
-rw-r--r--src/tests/integration/basic.rs75
-rw-r--r--src/tests/integration/close_pane.rs298
-rw-r--r--src/tests/integration/move_focus_down.rs21
-rw-r--r--src/tests/integration/move_focus_left.rs21
-rw-r--r--src/tests/integration/move_focus_right.rs21
-rw-r--r--src/tests/integration/move_focus_up.rs21
-rw-r--r--src/tests/integration/resize_down.rs321
-rw-r--r--src/tests/integration/resize_left.rs320
-rw-r--r--src/tests/integration/resize_right.rs321
-rw-r--r--src/tests/integration/resize_up.rs320
-rw-r--r--src/tests/integration/snapshots/mosaic__tests__integration__tabs__close_the_tab_that_has_a_pane_in_fullscreen.snap20
-rw-r--r--src/tests/integration/tabs.rs130
-rw-r--r--src/tests/integration/toggle_fullscreen.rs18
-rw-r--r--src/tests/utils.rs75
27 files changed, 1905 insertions, 914 deletions
diff --git a/assets/layouts/default.yaml b/assets/layouts/default.yaml
index e63356917..a3987e50b 100644
--- a/assets/layouts/default.yaml
+++ b/assets/layouts/default.yaml
@@ -5,4 +5,4 @@ parts:
- direction: Vertical
split_size:
Fixed: 1
- plugin: status-bar \ No newline at end of file
+ plugin: status-bar
diff --git a/assets/plugins/status-bar.wasm b/assets/plugins/status-bar.wasm
index 97b9be0ce..646ad3b5b 100644
--- a/assets/plugins/status-bar.wasm
+++ b/assets/plugins/status-bar.wasm
Binary files differ
diff --git a/src/client/boundaries.rs b/src/client/boundaries.rs
index 498a37318..67733c12b 100644
--- a/src/client/boundaries.rs
+++ b/src/client/boundaries.rs
@@ -1,6 +1,8 @@
use crate::tab::Pane;
use std::collections::HashMap;
+use std::fmt::{Display, Error, Formatter};
+
pub mod boundary_type {
pub const TOP_RIGHT: &str = "┐";
pub const VERTICAL: &str = "│";
@@ -17,277 +19,579 @@ pub mod boundary_type {
pub type BoundaryType = &'static str; // easy way to refer to boundary_type above
-fn combine_symbols(current_symbol: &str, next_symbol: &str) -> Option<&'static str> {
+#[derive(Clone, Copy, Debug)]
+pub struct BoundarySymbol {
+ boundary_type: BoundaryType,
+ invisible: bool,
+}
+
+impl BoundarySymbol {
+ pub fn new(boundary_type: BoundaryType) -> Self {
+ BoundarySymbol {
+ boundary_type,
+ invisible: false,
+ }
+ }
+ pub fn invisible(mut self) -> Self {
+ self.invisible = true;
+ self
+ }
+}
+
+impl Display for BoundarySymbol {
+ fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
+ if self.invisible {
+ write!(f, " ")
+ } else {
+ write!(f, "{}", self.boundary_type)
+ }
+ }
+}
+
+fn combine_symbols(
+ current_symbol: BoundarySymbol,
+ next_symbol: BoundarySymbol,
+) -> Option<BoundarySymbol> {
+ let invisible = current_symbol.invisible || next_symbol.invisible;
+ let current_symbol = current_symbol.boundary_type;
+ let next_symbol = next_symbol.boundary_type;
match (current_symbol, next_symbol) {
(boundary_type::TOP_RIGHT, boundary_type::TOP_RIGHT) => {
// (┐, ┐) => Some(┐)
- Some(boundary_type::TOP_RIGHT)
+ let boundary_type = boundary_type::TOP_RIGHT;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::TOP_RIGHT, boundary_type::VERTICAL) => {
// (┐, │) => Some(┤)
- Some(boundary_type::VERTICAL_LEFT)
+ let boundary_type = boundary_type::VERTICAL_LEFT;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::TOP_RIGHT, boundary_type::HORIZONTAL) => {
// (┐, ─) => Some(┬)
- Some(boundary_type::HORIZONTAL_DOWN)
+ let boundary_type = boundary_type::HORIZONTAL_DOWN;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::TOP_RIGHT, boundary_type::TOP_LEFT) => {
// (┐, ┌) => Some(┬)
- Some(boundary_type::HORIZONTAL_DOWN)
+ let boundary_type = boundary_type::HORIZONTAL_DOWN;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::TOP_RIGHT, boundary_type::BOTTOM_RIGHT) => {
// (┐, ┘) => Some(┤)
- Some(boundary_type::VERTICAL_LEFT)
+ let boundary_type = boundary_type::VERTICAL_LEFT;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::TOP_RIGHT, boundary_type::BOTTOM_LEFT) => {
// (┐, └) => Some(┼)
- Some(boundary_type::CROSS)
+ let boundary_type = boundary_type::CROSS;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::TOP_RIGHT, boundary_type::VERTICAL_LEFT) => {
// (┐, ┤) => Some(┤)
- Some(boundary_type::VERTICAL_LEFT)
+ let boundary_type = boundary_type::VERTICAL_LEFT;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::TOP_RIGHT, boundary_type::VERTICAL_RIGHT) => {
// (┐, ├) => Some(┼)
- Some(boundary_type::CROSS)
+ let boundary_type = boundary_type::CROSS;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::TOP_RIGHT, boundary_type::HORIZONTAL_DOWN) => {
// (┐, ┬) => Some(┬)
- Some(boundary_type::HORIZONTAL_DOWN)
+ let boundary_type = boundary_type::HORIZONTAL_DOWN;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::TOP_RIGHT, boundary_type::HORIZONTAL_UP) => {
// (┐, ┴) => Some(┼)
- Some(boundary_type::CROSS)
+ let boundary_type = boundary_type::CROSS;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::TOP_RIGHT, boundary_type::CROSS) => {
// (┐, ┼) => Some(┼)
- Some(boundary_type::CROSS)
+ let boundary_type = boundary_type::CROSS;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::HORIZONTAL, boundary_type::HORIZONTAL) => {
// (─, ─) => Some(─)
- Some(boundary_type::HORIZONTAL)
+ let boundary_type = boundary_type::HORIZONTAL;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::HORIZONTAL, boundary_type::VERTICAL) => {
// (─, │) => Some(┼)
- Some(boundary_type::CROSS)
+ let boundary_type = boundary_type::CROSS;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::HORIZONTAL, boundary_type::TOP_LEFT) => {
// (─, ┌) => Some(┬)
- Some(boundary_type::HORIZONTAL_DOWN)
+ let boundary_type = boundary_type::HORIZONTAL_DOWN;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::HORIZONTAL, boundary_type::BOTTOM_RIGHT) => {
// (─, ┘) => Some(┴)
- Some(boundary_type::HORIZONTAL_UP)
+ let boundary_type = boundary_type::HORIZONTAL_UP;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::HORIZONTAL, boundary_type::BOTTOM_LEFT) => {
// (─, └) => Some(┴)
- Some(boundary_type::HORIZONTAL_UP)
+ let boundary_type = boundary_type::HORIZONTAL_UP;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::HORIZONTAL, boundary_type::VERTICAL_LEFT) => {
// (─, ┤) => Some(┼)
- Some(boundary_type::CROSS)
+ let boundary_type = boundary_type::CROSS;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::HORIZONTAL, boundary_type::VERTICAL_RIGHT) => {
// (─, ├) => Some(┼)
- Some(boundary_type::CROSS)
+ let boundary_type = boundary_type::CROSS;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::HORIZONTAL, boundary_type::HORIZONTAL_DOWN) => {
// (─, ┬) => Some(┬)
- Some(boundary_type::HORIZONTAL_DOWN)
+ let boundary_type = boundary_type::HORIZONTAL_DOWN;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::HORIZONTAL, boundary_type::HORIZONTAL_UP) => {
// (─, ┴) => Some(┴)
- Some(boundary_type::HORIZONTAL_UP)
+ let boundary_type = boundary_type::HORIZONTAL_UP;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::HORIZONTAL, boundary_type::CROSS) => {
// (─, ┼) => Some(┼)
- Some(boundary_type::CROSS)
+ let boundary_type = boundary_type::CROSS;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::VERTICAL, boundary_type::VERTICAL) => {
// (│, │) => Some(│)
- Some(boundary_type::VERTICAL)
+ let boundary_type = boundary_type::VERTICAL;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::VERTICAL, boundary_type::TOP_LEFT) => {
// (│, ┌) => Some(├)
- Some(boundary_type::VERTICAL_RIGHT)
+ let boundary_type = boundary_type::VERTICAL_RIGHT;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::VERTICAL, boundary_type::BOTTOM_RIGHT) => {
// (│, ┘) => Some(┤)
- Some(boundary_type::VERTICAL_LEFT)
+ let boundary_type = boundary_type::VERTICAL_LEFT;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::VERTICAL, boundary_type::BOTTOM_LEFT) => {
// (│, └) => Some(├)
- Some(boundary_type::VERTICAL_RIGHT)
+ let boundary_type = boundary_type::VERTICAL_RIGHT;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::VERTICAL, boundary_type::VERTICAL_LEFT) => {
// (│, ┤) => Some(┤)
- Some(boundary_type::VERTICAL_LEFT)
+ let boundary_type = boundary_type::VERTICAL_LEFT;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::VERTICAL, boundary_type::VERTICAL_RIGHT) => {
// (│, ├) => Some(├)
- Some(boundary_type::VERTICAL_RIGHT)
+ let boundary_type = boundary_type::VERTICAL_RIGHT;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::VERTICAL, boundary_type::HORIZONTAL_DOWN) => {
// (│, ┬) => Some(┼)
- Some(boundary_type::CROSS)
+ let boundary_type = boundary_type::CROSS;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::VERTICAL, boundary_type::HORIZONTAL_UP) => {
// (│, ┴) => Some(┼)
- Some(boundary_type::CROSS)
+ let boundary_type = boundary_type::CROSS;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::VERTICAL, boundary_type::CROSS) => {
// (│, ┼) => Some(┼)
- Some(boundary_type::CROSS)
+ let boundary_type = boundary_type::CROSS;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::TOP_LEFT, boundary_type::TOP_LEFT) => {
// (┌, ┌) => Some(┌)
- Some(boundary_type::TOP_LEFT)
+ let boundary_type = boundary_type::TOP_LEFT;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::TOP_LEFT, boundary_type::BOTTOM_RIGHT) => {
// (┌, ┘) => Some(┼)
- Some(boundary_type::CROSS)
+ let boundary_type = boundary_type::CROSS;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::TOP_LEFT, boundary_type::BOTTOM_LEFT) => {
// (┌, └) => Some(├)
- Some(boundary_type::VERTICAL_RIGHT)
+ let boundary_type = boundary_type::VERTICAL_RIGHT;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::TOP_LEFT, boundary_type::VERTICAL_LEFT) => {
// (┌, ┤) => Some(┼)
- Some(boundary_type::CROSS)
+ let boundary_type = boundary_type::CROSS;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::TOP_LEFT, boundary_type::VERTICAL_RIGHT) => {
// (┌, ├) => Some(├)
- Some(boundary_type::VERTICAL_RIGHT)
+ let boundary_type = boundary_type::VERTICAL_RIGHT;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::TOP_LEFT, boundary_type::HORIZONTAL_DOWN) => {
// (┌, ┬) => Some(┬)
- Some(boundary_type::HORIZONTAL_DOWN)
+ let boundary_type = boundary_type::HORIZONTAL_DOWN;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::TOP_LEFT, boundary_type::HORIZONTAL_UP) => {
// (┌, ┴) => Some(┼)
- Some(boundary_type::CROSS)
+ let boundary_type = boundary_type::CROSS;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::TOP_LEFT, boundary_type::CROSS) => {
// (┌, ┼) => Some(┼)
- Some(boundary_type::CROSS)
+ let boundary_type = boundary_type::CROSS;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::BOTTOM_RIGHT, boundary_type::BOTTOM_RIGHT) => {
// (┘, ┘) => Some(┘)
- Some(boundary_type::BOTTOM_RIGHT)
+ let boundary_type = boundary_type::BOTTOM_RIGHT;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::BOTTOM_RIGHT, boundary_type::BOTTOM_LEFT) => {
// (┘, └) => Some(┴)
- Some(boundary_type::HORIZONTAL_UP)
+ let boundary_type = boundary_type::HORIZONTAL_UP;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::BOTTOM_RIGHT, boundary_type::VERTICAL_LEFT) => {
// (┘, ┤) => Some(┤)
- Some(boundary_type::VERTICAL_LEFT)
+ let boundary_type = boundary_type::VERTICAL_LEFT;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::BOTTOM_RIGHT, boundary_type::VERTICAL_RIGHT) => {
// (┘, ├) => Some(┼)
- Some(boundary_type::CROSS)
+ let boundary_type = boundary_type::CROSS;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::BOTTOM_RIGHT, boundary_type::HORIZONTAL_DOWN) => {
// (┘, ┬) => Some(┼)
- Some(boundary_type::CROSS)
+ let boundary_type = boundary_type::CROSS;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::BOTTOM_RIGHT, boundary_type::HORIZONTAL_UP) => {
// (┘, ┴) => Some(┴)
- Some(boundary_type::HORIZONTAL_UP)
+ let boundary_type = boundary_type::HORIZONTAL_UP;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::BOTTOM_RIGHT, boundary_type::CROSS) => {
// (┘, ┼) => Some(┼)
- Some(boundary_type::CROSS)
+ let boundary_type = boundary_type::CROSS;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::BOTTOM_LEFT, boundary_type::BOTTOM_LEFT) => {
// (└, └) => Some(└)
- Some(boundary_type::BOTTOM_LEFT)
+ let boundary_type = boundary_type::BOTTOM_LEFT;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::BOTTOM_LEFT, boundary_type::VERTICAL_LEFT) => {
// (└, ┤) => Some(┼)
- Some(boundary_type::CROSS)
+ let boundary_type = boundary_type::CROSS;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::BOTTOM_LEFT, boundary_type::VERTICAL_RIGHT) => {
// (└, ├) => Some(├)
- Some(boundary_type::VERTICAL_RIGHT)
+ let boundary_type = boundary_type::VERTICAL_RIGHT;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::BOTTOM_LEFT, boundary_type::HORIZONTAL_DOWN) => {
// (└, ┬) => Some(┼)
- Some(boundary_type::CROSS)
+ let boundary_type = boundary_type::CROSS;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::BOTTOM_LEFT, boundary_type::HORIZONTAL_UP) => {
// (└, ┴) => Some(┴)
- Some(boundary_type::HORIZONTAL_UP)
+ let boundary_type = boundary_type::HORIZONTAL_UP;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::BOTTOM_LEFT, boundary_type::CROSS) => {
// (└, ┼) => Some(┼)
- Some(boundary_type::CROSS)
+ let boundary_type = boundary_type::CROSS;
+ Some(BoundarySymbol {
+ boundary_type,
+ invisible,
+ })
}
(boundary_type::VERTICAL_LEFT, boundary_type::VERTICAL_LEFT) => {
// (┤, ┤) => Some(┤)
- Some(boundary_type::VERTICAL_LEFT)
+ let boundary_type = boundary_type::VERTICAL_LEFT;
+ Some(BoundarySymbol {
+