fix(stacked): stacked panes can't resize status-bar (#4051)
* fix(typo): fix a typo in error message * fix(typo): fix typo in Tip #6 * fix(logging): silence filesystem error This `Option` chain already ends with `.unwrap_or_else(Default::default)` so it's clearly expected that prior operations in the chain may fail. I didn't have the default `layout_dir` on my computer, and it would fill my logfile with unhelpful spam — on every pane creation, resize, etc. * fix(stacked): stacked panes can't resize status-bar * fix(e2e): race in multiple users test --------- Co-authored-by: Aram Drevekenin <aram@poor.dev>
This commit is contained in:
parent
9f0056335d
commit
4fd0bac675
5 changed files with 35 additions and 8 deletions
|
|
@ -323,7 +323,7 @@ impl Page {
|
||||||
}
|
}
|
||||||
)),
|
)),
|
||||||
ActiveComponent::new(TextOrCustomRender::Text(
|
ActiveComponent::new(TextOrCustomRender::Text(
|
||||||
Text::new("Press TAB to go to Chagne Mode Behavior")
|
Text::new("Press TAB to go to Change Mode Behavior")
|
||||||
.color_range(3, 6..=9)
|
.color_range(3, 6..=9)
|
||||||
)),
|
)),
|
||||||
ActiveComponent::new(TextOrCustomRender::Text(
|
ActiveComponent::new(TextOrCustomRender::Text(
|
||||||
|
|
|
||||||
|
|
@ -1799,7 +1799,9 @@ pub fn multiple_users_in_different_panes_and_same_tab() {
|
||||||
name: "take snapshot after",
|
name: "take snapshot after",
|
||||||
instruction: |remote_terminal: RemoteTerminal| -> bool {
|
instruction: |remote_terminal: RemoteTerminal| -> bool {
|
||||||
let mut step_is_complete = false;
|
let mut step_is_complete = false;
|
||||||
if remote_terminal.cursor_position_is(63, 2) && remote_terminal.status_bar_appears()
|
if remote_terminal.cursor_position_is(63, 2)
|
||||||
|
&& remote_terminal.status_bar_appears()
|
||||||
|
&& remote_terminal.snapshot_contains("LOCK")
|
||||||
{
|
{
|
||||||
// cursor is in the newly opened second pane
|
// cursor is in the newly opened second pane
|
||||||
step_is_complete = true;
|
step_is_complete = true;
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,10 @@ impl<'a> PaneResizer<'a> {
|
||||||
let spans = self
|
let spans = self
|
||||||
.discretize_spans(grid, space)
|
.discretize_spans(grid, space)
|
||||||
.map_err(|err| anyhow!("{}", err))?;
|
.map_err(|err| anyhow!("{}", err))?;
|
||||||
|
|
||||||
|
if self.is_layout_valid(&spans) {
|
||||||
self.apply_spans(spans)?;
|
self.apply_spans(spans)?;
|
||||||
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -128,6 +131,31 @@ impl<'a> PaneResizer<'a> {
|
||||||
Ok(grid.into_iter().flatten().collect())
|
Ok(grid.into_iter().flatten().collect())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// HACK: This whole function is a bit of a hack — it's here to stop us from breaking the layout if we've been given
|
||||||
|
// a bad state to start with. If this function returns false, nothing is resized.
|
||||||
|
fn is_layout_valid(&self, spans: &[Span]) -> bool {
|
||||||
|
// If pane stacks are too tall to fit on the screen, abandon ship before the status bar gets caught up in
|
||||||
|
// any erroneous resizing...
|
||||||
|
for span in spans {
|
||||||
|
let pane_is_stacked = self
|
||||||
|
.panes
|
||||||
|
.borrow()
|
||||||
|
.get(&span.pid)
|
||||||
|
.unwrap()
|
||||||
|
.current_geom()
|
||||||
|
.is_stacked();
|
||||||
|
if pane_is_stacked && span.direction == SplitDirection::Vertical {
|
||||||
|
let min_stack_height = StackedPanes::new(self.panes.clone())
|
||||||
|
.min_stack_height(&span.pid)
|
||||||
|
.unwrap();
|
||||||
|
if span.size.as_usize() < min_stack_height {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
fn apply_spans(&mut self, spans: Vec<Span>) -> Result<()> {
|
fn apply_spans(&mut self, spans: Vec<Span>) -> Result<()> {
|
||||||
let err_context = || format!("Failed to apply spans");
|
let err_context = || format!("Failed to apply spans");
|
||||||
let mut geoms_changed = false;
|
let mut geoms_changed = false;
|
||||||
|
|
|
||||||
|
|
@ -309,7 +309,7 @@ impl<'a> StackedPanes<'a> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
fn pane_is_one_liner(&self, id: &PaneId) -> Result<bool> {
|
fn pane_is_one_liner(&self, id: &PaneId) -> Result<bool> {
|
||||||
let err_context = || format!("Cannot determin if pane is one liner or not");
|
let err_context = || format!("Cannot determine if pane is one liner or not");
|
||||||
let panes = self.panes.borrow();
|
let panes = self.panes.borrow();
|
||||||
let pane_to_close = panes.get(id).with_context(err_context)?;
|
let pane_to_close = panes.get(id).with_context(err_context)?;
|
||||||
Ok(pane_to_close.position_and_size().rows.is_fixed())
|
Ok(pane_to_close.position_and_size().rows.is_fixed())
|
||||||
|
|
|
||||||
|
|
@ -1157,10 +1157,7 @@ impl Layout {
|
||||||
.or_else(|| default_layout_dir())
|
.or_else(|| default_layout_dir())
|
||||||
.and_then(|layout_dir| match std::fs::read_dir(layout_dir) {
|
.and_then(|layout_dir| match std::fs::read_dir(layout_dir) {
|
||||||
Ok(layout_files) => Some(layout_files),
|
Ok(layout_files) => Some(layout_files),
|
||||||
Err(e) => {
|
Err(_) => None,
|
||||||
log::error!("Failed to read layout dir: {:?}", e);
|
|
||||||
None
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
.map(|layout_files| {
|
.map(|layout_files| {
|
||||||
let mut available_layouts = vec![];
|
let mut available_layouts = vec![];
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue