fix(panes): moving and toggling embed/float with frames (#1909)

* fix(ui): frame broken or missing when embedding/floating without pane frames

* fix(panes): offset properly without pane frames
This commit is contained in:
Aram Drevekenin 2022-11-05 14:45:45 +01:00 committed by GitHub
parent dde6ecf09a
commit 6c3c0f51d0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 123 additions and 2 deletions

View file

@ -142,7 +142,7 @@ impl TiledPanes {
mut with_pane: Box<dyn Pane>, mut with_pane: Box<dyn Pane>,
) -> Option<Box<dyn Pane>> { ) -> Option<Box<dyn Pane>> {
let with_pane_id = with_pane.pid(); let with_pane_id = with_pane.pid();
if self.draw_pane_frames { if self.draw_pane_frames && !with_pane.borderless() {
with_pane.set_content_offset(Offset::frame(1)); with_pane.set_content_offset(Offset::frame(1));
} }
let removed_pane = self.panes.remove(&pane_id).map(|removed_pane| { let removed_pane = self.panes.remove(&pane_id).map(|removed_pane| {
@ -248,7 +248,7 @@ impl TiledPanes {
} }
#[allow(clippy::if_same_then_else)] #[allow(clippy::if_same_then_else)]
if draw_pane_frames & !pane.borderless() { if draw_pane_frames && !pane.borderless() {
// there's definitely a frame around this pane, offset its contents // there's definitely a frame around this pane, offset its contents
pane.set_content_offset(Offset::frame(1)); pane.set_content_offset(Offset::frame(1));
} else if draw_pane_frames && pane.borderless() { } else if draw_pane_frames && pane.borderless() {
@ -828,6 +828,7 @@ impl TiledPanes {
} }
resize_pty!(current_position, self.os_api).unwrap(); resize_pty!(current_position, self.os_api).unwrap();
current_position.set_should_render(true); current_position.set_should_render(true);
self.set_pane_frames(self.draw_pane_frames);
} }
pub fn move_active_pane_down(&mut self, client_id: ClientId) { pub fn move_active_pane_down(&mut self, client_id: ClientId) {
if let Some(active_pane_id) = self.get_active_pane_id(client_id) { if let Some(active_pane_id) = self.get_active_pane_id(client_id) {
@ -861,6 +862,7 @@ impl TiledPanes {
} }
resize_pty!(current_position, self.os_api).unwrap(); resize_pty!(current_position, self.os_api).unwrap();
current_position.set_should_render(true); current_position.set_should_render(true);
self.set_pane_frames(self.draw_pane_frames);
} }
} }
} }
@ -896,6 +898,7 @@ impl TiledPanes {
} }
resize_pty!(current_position, self.os_api).unwrap(); resize_pty!(current_position, self.os_api).unwrap();
current_position.set_should_render(true); current_position.set_should_render(true);
self.set_pane_frames(self.draw_pane_frames);
} }
} }
} }
@ -931,6 +934,7 @@ impl TiledPanes {
} }
resize_pty!(current_position, self.os_api).unwrap(); resize_pty!(current_position, self.os_api).unwrap();
current_position.set_should_render(true); current_position.set_should_render(true);
self.set_pane_frames(self.draw_pane_frames);
} }
} }
} }
@ -966,6 +970,7 @@ impl TiledPanes {
} }
resize_pty!(current_position, self.os_api).unwrap(); resize_pty!(current_position, self.os_api).unwrap();
current_position.set_should_render(true); current_position.set_should_render(true);
self.set_pane_frames(self.draw_pane_frames);
} }
} }
} }

View file

@ -768,6 +768,11 @@ impl Tab {
return Ok(()); return Ok(());
} }
if let Some(mut embedded_pane_to_float) = self.close_pane(focused_pane_id, true) { if let Some(mut embedded_pane_to_float) = self.close_pane(focused_pane_id, true) {
if self.draw_pane_frames && !embedded_pane_to_float.borderless() {
embedded_pane_to_float.set_content_offset(Offset::frame(1));
} else if !self.draw_pane_frames {
embedded_pane_to_float.set_content_offset(Offset::default());
}
embedded_pane_to_float.set_geom(new_pane_geom); embedded_pane_to_float.set_geom(new_pane_geom);
resize_pty!(embedded_pane_to_float, self.os_api).with_context(err_context)?; resize_pty!(embedded_pane_to_float, self.os_api).with_context(err_context)?;
embedded_pane_to_float.set_active_at(Instant::now()); embedded_pane_to_float.set_active_at(Instant::now());

View file

@ -0,0 +1,26 @@
---
source: zellij-server/src/tab/./unit/tab_integration_tests.rs
assertion_line: 1604
expression: snapshot
---
00 (C): │
01 (C): │
02 (C): │
03 (C): │ I am scratch terminal
04 (C): │
05 (C): │
06 (C): │
07 (C): │
08 (C): │
09 (C): │
10 (C): │
11 (C): │
12 (C): │
13 (C): │
14 (C): │
15 (C): │
16 (C): │
17 (C): │
18 (C): │
19 (C): │

View file

@ -0,0 +1,26 @@
---
source: zellij-server/src/tab/./unit/tab_integration_tests.rs
assertion_line: 1632
expression: snapshot
---
00 (C):
01 (C):
02 (C):
03 (C):
04 (C):
05 (C): ┌ Pane #2 ─────────────────────────────────────────────────┐
06 (C): │ │
07 (C): │ │
08 (C): │ │
09 (C): │ I am an embedded pane │
10 (C): │ │
11 (C): │ │
12 (C): │ │
13 (C): │ │
14 (C): └──────────────────────────────────────────────────────────┘
15 (C):
16 (C):
17 (C):
18 (C):
19 (C):

View file

@ -1573,6 +1573,65 @@ fn float_embedded_pane() {
assert_snapshot!(snapshot); assert_snapshot!(snapshot);
} }
#[test]
fn embed_floating_pane_without_pane_frames() {
let size = Size {
cols: 121,
rows: 20,
};
let client_id = 1;
let mut tab = create_new_tab(size, ModeInfo::default());
let new_pane_id = PaneId::Terminal(2);
let mut output = Output::default();
tab.set_pane_frames(false);
tab.toggle_floating_panes(client_id, None).unwrap();
tab.new_pane(new_pane_id, None, None, Some(client_id))
.unwrap();
tab.handle_pty_bytes(
2,
Vec::from("\n\n\n I am scratch terminal".as_bytes()),
)
.unwrap();
tab.toggle_pane_embed_or_floating(client_id).unwrap();
tab.render(&mut output, None).unwrap();
let snapshot = take_snapshot(
output.serialize().unwrap().get(&client_id).unwrap(),
size.rows,
size.cols,
Palette::default(),
);
assert_snapshot!(snapshot);
}
#[test]
fn float_embedded_pane_without_pane_frames() {
let size = Size {
cols: 121,
rows: 20,
};
let client_id = 1;
let mut tab = create_new_tab(size, ModeInfo::default());
let new_pane_id = PaneId::Terminal(2);
let mut output = Output::default();
tab.set_pane_frames(false);
tab.new_pane(new_pane_id, None, None, Some(client_id))
.unwrap();
tab.handle_pty_bytes(
2,
Vec::from("\n\n\n I am an embedded pane".as_bytes()),
)
.unwrap();
tab.toggle_pane_embed_or_floating(client_id).unwrap();
tab.render(&mut output, None).unwrap();
let snapshot = take_snapshot(
output.serialize().unwrap().get(&client_id).unwrap(),
size.rows,
size.cols,
Palette::default(),
);
assert_snapshot!(snapshot);
}
#[test] #[test]
fn cannot_float_only_embedded_pane() { fn cannot_float_only_embedded_pane() {
let size = Size { let size = Size {