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);
// 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.
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;
}
@@ -1212,7 +1212,12 @@ impl<W: LayoutElement> ScrollingSpace<W> {
// We might need to move the view to ensure the resized window is still visible.
// 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 let Some(prev_offset) = self.view_offset_before_fullscreen.take() {
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];
cancel_resize_for_column(&mut self.interactive_resize, col);
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) {
@@ -2405,18 +2416,17 @@ impl<W: LayoutElement> ScrollingSpace<W> {
return false;
}
if is_fullscreen
&& col_idx == self.active_column_idx
&& self.columns[col_idx].tiles.len() == 1
let mut col = &mut self.columns[col_idx];
let is_tabbed = col.display_mode == ColumnDisplay::Tabbed;
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());
}
let mut col = &mut self.columns[col_idx];
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.
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);
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
.insert(idx, TileData::new(&tile, WindowHeight::auto_1()));
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) {
if self.is_fullscreen {
self.tiles[0].request_fullscreen();
for tile in &mut self.tiles {
tile.request_fullscreen();
}
return;
}
@@ -4078,7 +4093,10 @@ impl<W: LayoutElement> Column<W> {
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.update_tile_sizes(false);
}
@@ -4234,7 +4252,7 @@ impl<W: LayoutElement> Column<W> {
assert_eq!(self.tiles.len(), self.data.len());
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 {
+19
View File
@@ -3106,6 +3106,25 @@ fn preset_column_width_reset_after_set_width() {
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 {
if parent_id == id {
return true;