aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/layout/workspace.rs106
1 files changed, 93 insertions, 13 deletions
diff --git a/src/layout/workspace.rs b/src/layout/workspace.rs
index 6c51ffb5..dddd5d11 100644
--- a/src/layout/workspace.rs
+++ b/src/layout/workspace.rs
@@ -670,6 +670,7 @@ impl<W: LayoutElement> Workspace<W> {
self.options.clone(),
width,
is_full_width,
+ true,
);
let width = column.width();
self.columns.insert(col_idx, column);
@@ -747,6 +748,7 @@ impl<W: LayoutElement> Workspace<W> {
self.options.clone(),
width,
is_full_width,
+ true,
);
self.columns.insert(idx, column);
@@ -1313,31 +1315,57 @@ impl<W: LayoutElement> Workspace<W> {
return;
}
- let source_column = &self.columns[self.active_column_idx];
+ let source_col_idx = self.active_column_idx;
+ let source_column = &self.columns[source_col_idx];
+ let prev_y = source_column.tile_y(source_column.active_tile_idx);
+
if source_column.tiles.len() == 1 {
if self.active_column_idx == 0 {
return;
}
+ let offset_x = self.column_x(source_col_idx) - self.column_x(source_col_idx - 1);
+
// Move into adjacent column.
- let target_column_idx = self.active_column_idx - 1;
- let window = self.remove_window_by_idx(self.active_column_idx, 0);
+ let target_column_idx = source_col_idx - 1;
+
+ // Make sure the previous (target) column is activated so the animation looks right.
+ self.activate_prev_column_on_removal = Some(self.static_view_offset());
+ let window = self.remove_window_by_idx(source_col_idx, 0);
self.enter_output_for_window(&window);
+ let next_col_idx = source_col_idx;
+ let prev_next_x = self.column_x(next_col_idx);
+
let target_column = &mut self.columns[target_column_idx];
+ let offset_y = prev_y - target_column.tile_y(target_column.tiles.len());
+
target_column.add_window(window, true);
target_column.focus_last();
- self.activate_column(target_column_idx);
+
+ let new_tile = target_column.tiles.last_mut().unwrap();
+ new_tile.animate_move_from(Point::from((offset_x, offset_y)));
+
+ // Consuming a window into a column could've increased its width if the new window had a
+ // larger min width. Move the next columns to account for this.
+ let offset_next = prev_next_x - self.column_x(next_col_idx);
+ for col in &mut self.columns[next_col_idx..] {
+ col.animate_move_from(offset_next);
+ }
} else {
// Move out of column.
let width = source_column.width;
let is_full_width = source_column.is_full_width;
- let window =
- self.remove_window_by_idx(self.active_column_idx, source_column.active_tile_idx);
+
+ let window = self.remove_window_by_idx(source_col_idx, source_column.active_tile_idx);
self.add_window_at(self.active_column_idx, window, true, width, is_full_width);
// We added to the left, don't activate even further left on removal.
self.activate_prev_column_on_removal = None;
+
+ let new_col = &mut self.columns[self.active_column_idx];
+ let offset_y = prev_y - new_col.tile_y(0);
+ new_col.tiles[0].animate_move_from(Point::from((0, offset_y)));
}
}
@@ -1346,29 +1374,53 @@ impl<W: LayoutElement> Workspace<W> {
return;
}
- let source_column = &self.columns[self.active_column_idx];
+ let source_col_idx = self.active_column_idx;
+ let offset_x = self.column_x(source_col_idx) - self.column_x(source_col_idx + 1);
+
+ let source_column = &self.columns[source_col_idx];
+ let prev_y = source_column.tile_y(source_column.active_tile_idx);
+
if source_column.tiles.len() == 1 {
if self.active_column_idx + 1 == self.columns.len() {
return;
}
// Move into adjacent column.
- let target_column_idx = self.active_column_idx;
- let window = self.remove_window_by_idx(self.active_column_idx, 0);
+ let target_column_idx = source_col_idx;
+
+ // Make sure the target column gets activated.
+ self.activate_prev_column_on_removal = None;
+ let window = self.remove_window_by_idx(source_col_idx, 0);
self.enter_output_for_window(&window);
+ let prev_next_x = self.column_x(target_column_idx + 1);
+
let target_column = &mut self.columns[target_column_idx];
+ let offset_y = prev_y - target_column.tile_y(target_column.tiles.len());
+
target_column.add_window(window, true);
target_column.focus_last();
- self.activate_column(target_column_idx);
+
+ let new_tile = target_column.tiles.last_mut().unwrap();
+ new_tile.animate_move_from(Point::from((offset_x, offset_y)));
+
+ // Consuming a window into a column could've increased its width if the new window had a
+ // larger min width. Move the next columns to account for this.
+ let offset_next = prev_next_x - self.column_x(target_column_idx + 1);
+ for col in &mut self.columns[target_column_idx + 1..] {
+ col.animate_move_from(offset_next);
+ }
} else {
// Move out of column.
let width = source_column.width;
let is_full_width = source_column.is_full_width;
- let window =
- self.remove_window_by_idx(self.active_column_idx, source_column.active_tile_idx);
+ let window = self.remove_window_by_idx(source_col_idx, source_column.active_tile_idx);
self.add_window(window, true, width, is_full_width);
+
+ let new_col = &mut self.columns[self.active_column_idx];
+ let offset_y = prev_y - new_col.tile_y(0);
+ new_col.tiles[0].animate_move_from(Point::from((offset_x, offset_y)));
}
}
@@ -1382,17 +1434,34 @@ impl<W: LayoutElement> Workspace<W> {
}
let source_column_idx = self.active_column_idx + 1;
+
+ let offset_x = self.column_x(source_column_idx) - self.column_x(self.active_column_idx);
+ let prev_y = self.columns[source_column_idx].tile_y(0);
+
let window = self.remove_window_by_idx(source_column_idx, 0);
self.enter_output_for_window(&window);
+ let prev_next_x = self.column_x(self.active_column_idx + 1);
+
let target_column = &mut self.columns[self.active_column_idx];
let was_fullscreen = target_column.tiles[target_column.active_tile_idx].is_fullscreen();
+ let offset_y = prev_y - target_column.tile_y(target_column.tiles.len());
target_column.add_window(window, true);
if !was_fullscreen {
self.view_offset_before_fullscreen = None;
}
+
+ let new_tile = target_column.tiles.last_mut().unwrap();
+ new_tile.animate_move_from(Point::from((offset_x, offset_y)));
+
+ // Consuming a window into a column could've increased its width if the new window had a
+ // larger min width. Move the next columns to account for this.
+ let offset_next = prev_next_x - self.column_x(self.active_column_idx + 1);
+ for col in &mut self.columns[self.active_column_idx + 1..] {
+ col.animate_move_from(offset_next);
+ }
}
pub fn expel_from_column(&mut self) {
@@ -1400,17 +1469,26 @@ impl<W: LayoutElement> Workspace<W> {
return;
}
+ let offset_x =
+ self.column_x(self.active_column_idx) - self.column_x(self.active_column_idx + 1);
+
let source_column = &self.columns[self.active_column_idx];
if source_column.tiles.len() == 1 {
return;
}
+ let prev_y = source_column.tile_y(source_column.active_tile_idx);
+
let width = source_column.width;
let is_full_width = source_column.is_full_width;
let window =
self.remove_window_by_idx(self.active_column_idx, source_column.active_tile_idx);
self.add_window(window, true, width, is_full_width);
+
+ let new_col = &mut self.columns[self.active_column_idx];
+ let offset_y = prev_y - new_col.tile_y(0);
+ new_col.tiles[0].animate_move_from(Point::from((offset_x, offset_y)));
}
pub fn center_column(&mut self) {
@@ -1608,6 +1686,7 @@ impl<W: LayoutElement> Workspace<W> {
self.options.clone(),
width,
is_full_width,
+ false,
),
);
@@ -1942,6 +2021,7 @@ impl<W: LayoutElement> Column<W> {
options: Rc<Options>,
width: ColumnWidth,
is_full_width: bool,
+ animate_resize: bool,
) -> Self {
let mut rv = Self {
tiles: vec![],
@@ -1959,7 +2039,7 @@ impl<W: LayoutElement> Column<W> {
let is_pending_fullscreen = window.is_pending_fullscreen();
- rv.add_window(window, false);
+ rv.add_window(window, animate_resize);
if is_pending_fullscreen {
rv.set_fullscreen(true);