Allow tabbed columns to go fullscreen

This commit is contained in:
Ivan Molodetskikh
2025-02-04 09:51:23 +03:00
parent f90eb0cbe4
commit df70140b36
2 changed files with 50 additions and 13 deletions
+31 -13
View File
@@ -816,9 +816,9 @@ impl<W: LayoutElement> ScrollingSpace<W> {
self.data[col_idx].update(target_column); self.data[col_idx].update(target_column);
// If the target column is the active column and its window was requested to, but hasn't // If the target column is the active column and its window was requested to, but hasn't
// gone into fullscreen yet, then clear the stored view offset, since we just asked it to // gone into fullscreen yet, then clear the stored view offset, if we just asked it to
// stop going into fullscreen. // stop going into fullscreen.
if col_idx == self.active_column_idx && !was_fullscreen { if col_idx == self.active_column_idx && !was_fullscreen && !target_column.is_fullscreen {
self.view_offset_before_fullscreen = None; self.view_offset_before_fullscreen = None;
} }
@@ -1212,7 +1212,12 @@ impl<W: LayoutElement> ScrollingSpace<W> {
// We might need to move the view to ensure the resized window is still visible. // We might need to move the view to ensure the resized window is still visible.
// Upon unfullscreening, restore the view offset. // Upon unfullscreening, restore the view offset.
let is_fullscreen = self.columns[col_idx].tiles[tile_idx].is_fullscreen(); //
// In tabbed display mode, there can be multiple tiles in a fullscreen column. They
// will unfullscreen one by one, and the column width will shrink only when the
// last tile unfullscreens. This is when we want to restore the view offset,
// otherwise it will immediately reset back by the animate_view_offset below.
let is_fullscreen = self.columns[col_idx].tiles.iter().any(Tile::is_fullscreen);
if was_fullscreen && !is_fullscreen { if was_fullscreen && !is_fullscreen {
if let Some(prev_offset) = self.view_offset_before_fullscreen.take() { if let Some(prev_offset) = self.view_offset_before_fullscreen.take() {
self.animate_view_offset(col_idx, prev_offset); self.animate_view_offset(col_idx, prev_offset);
@@ -1965,6 +1970,12 @@ impl<W: LayoutElement> ScrollingSpace<W> {
let col = &mut self.columns[self.active_column_idx]; let col = &mut self.columns[self.active_column_idx];
cancel_resize_for_column(&mut self.interactive_resize, col); cancel_resize_for_column(&mut self.interactive_resize, col);
col.toggle_tabbed_display(); col.toggle_tabbed_display();
// Disable fullscreen if needed.
if col.display_mode != ColumnDisplay::Tabbed && col.tiles.len() > 1 {
let window = col.tiles[col.active_tile_idx].window().id().clone();
self.set_fullscreen(&window, false);
}
} }
pub fn center_column(&mut self) { pub fn center_column(&mut self) {
@@ -2405,18 +2416,17 @@ impl<W: LayoutElement> ScrollingSpace<W> {
return false; return false;
} }
if is_fullscreen let mut col = &mut self.columns[col_idx];
&& col_idx == self.active_column_idx let is_tabbed = col.display_mode == ColumnDisplay::Tabbed;
&& self.columns[col_idx].tiles.len() == 1
if is_fullscreen && col_idx == self.active_column_idx && (col.tiles.len() == 1 || is_tabbed)
{ {
self.view_offset_before_fullscreen = Some(self.view_offset.stationary()); self.view_offset_before_fullscreen = Some(self.view_offset.stationary());
} }
let mut col = &mut self.columns[col_idx];
cancel_resize_for_column(&mut self.interactive_resize, col); cancel_resize_for_column(&mut self.interactive_resize, col);
if is_fullscreen && col.tiles.len() > 1 { if is_fullscreen && (col.tiles.len() > 1 && !is_tabbed) {
// This wasn't the only window in its column; extract it into a separate column. // This wasn't the only window in its column; extract it into a separate column.
let activate = self.active_column_idx == col_idx && col.active_tile_idx == tile_idx; let activate = self.active_column_idx == col_idx && col.active_tile_idx == tile_idx;
@@ -3399,7 +3409,10 @@ impl<W: LayoutElement> Column<W> {
let mut prev_offsets = Vec::with_capacity(self.tiles.len() + 1); let mut prev_offsets = Vec::with_capacity(self.tiles.len() + 1);
prev_offsets.extend(self.tile_offsets().take(self.tiles.len())); prev_offsets.extend(self.tile_offsets().take(self.tiles.len()));
self.is_fullscreen = false; if self.display_mode != ColumnDisplay::Tabbed {
self.is_fullscreen = false;
}
self.data self.data
.insert(idx, TileData::new(&tile, WindowHeight::auto_1())); .insert(idx, TileData::new(&tile, WindowHeight::auto_1()));
self.tiles.insert(idx, tile); self.tiles.insert(idx, tile);
@@ -3475,7 +3488,9 @@ impl<W: LayoutElement> Column<W> {
fn update_tile_sizes_with_transaction(&mut self, animate: bool, transaction: Transaction) { fn update_tile_sizes_with_transaction(&mut self, animate: bool, transaction: Transaction) {
if self.is_fullscreen { if self.is_fullscreen {
self.tiles[0].request_fullscreen(); for tile in &mut self.tiles {
tile.request_fullscreen();
}
return; return;
} }
@@ -4078,7 +4093,10 @@ impl<W: LayoutElement> Column<W> {
return; return;
} }
assert_eq!(self.tiles.len(), 1); if is_fullscreen {
assert!(self.tiles.len() == 1 || self.display_mode == ColumnDisplay::Tabbed);
}
self.is_fullscreen = is_fullscreen; self.is_fullscreen = is_fullscreen;
self.update_tile_sizes(false); self.update_tile_sizes(false);
} }
@@ -4234,7 +4252,7 @@ impl<W: LayoutElement> Column<W> {
assert_eq!(self.tiles.len(), self.data.len()); assert_eq!(self.tiles.len(), self.data.len());
if self.is_fullscreen { if self.is_fullscreen {
assert_eq!(self.tiles.len(), 1); assert!(self.tiles.len() == 1 || self.display_mode == ColumnDisplay::Tabbed);
} }
if let Some(idx) = self.preset_width_idx { if let Some(idx) = self.preset_width_idx {
+19
View File
@@ -3106,6 +3106,25 @@ fn preset_column_width_reset_after_set_width() {
assert_eq!(win.requested_size().unwrap().w, 500); assert_eq!(win.requested_size().unwrap().w, 500);
} }
#[test]
fn disable_tabbed_mode_in_fullscreen() {
let ops = [
Op::AddOutput(0),
Op::AddWindow {
params: TestWindowParams::new(0),
},
Op::AddWindow {
params: TestWindowParams::new(1),
},
Op::ConsumeOrExpelWindowLeft { id: None },
Op::ToggleColumnTabbedDisplay,
Op::FullscreenWindow(0),
Op::ToggleColumnTabbedDisplay,
];
check_ops(&ops);
}
fn parent_id_causes_loop(layout: &Layout<TestWindow>, id: usize, mut parent_id: usize) -> bool { fn parent_id_causes_loop(layout: &Layout<TestWindow>, id: usize, mut parent_id: usize) -> bool {
if parent_id == id { if parent_id == id {
return true; return true;