mirror of
https://github.com/niri-wm/niri.git
synced 2026-06-23 02:05:33 +07:00
Add center-visible-columns action
This commit is contained in:
@@ -2139,6 +2139,64 @@ impl<W: LayoutElement> ScrollingSpace<W> {
|
||||
self.center_column();
|
||||
}
|
||||
|
||||
pub fn center_visible_columns(&mut self) {
|
||||
if self.columns.is_empty() {
|
||||
return;
|
||||
}
|
||||
|
||||
if self.is_centering_focused_column() {
|
||||
return;
|
||||
}
|
||||
|
||||
// Consider the end of an ongoing animation because that's what compute to fit does too.
|
||||
let view_x = self.target_view_pos();
|
||||
let working_x = self.working_area.loc.x;
|
||||
let working_w = self.working_area.size.w;
|
||||
|
||||
// Count all columns that are fully visible inside the working area.
|
||||
let mut width_taken = 0.;
|
||||
let mut leftmost_col_x = None;
|
||||
let mut active_col_x = None;
|
||||
|
||||
let gap = self.options.gaps;
|
||||
let col_xs = self.column_xs(self.data.iter().copied());
|
||||
for (idx, col_x) in col_xs.take(self.columns.len()).enumerate() {
|
||||
if col_x < view_x + working_x + gap {
|
||||
// Column goes off-screen to the left.
|
||||
continue;
|
||||
}
|
||||
|
||||
leftmost_col_x.get_or_insert(col_x);
|
||||
|
||||
let width = self.data[idx].width;
|
||||
if view_x + working_x + working_w < col_x + width + gap {
|
||||
// Column goes off-screen to the right. We can stop here.
|
||||
break;
|
||||
}
|
||||
|
||||
if idx == self.active_column_idx {
|
||||
active_col_x = Some(col_x);
|
||||
}
|
||||
|
||||
width_taken += width + gap;
|
||||
}
|
||||
|
||||
if active_col_x.is_none() {
|
||||
// The active column wasn't fully on screen, so we can't meaningfully do anything.
|
||||
return;
|
||||
}
|
||||
|
||||
let col = &mut self.columns[self.active_column_idx];
|
||||
cancel_resize_for_column(&mut self.interactive_resize, col);
|
||||
|
||||
let free_space = working_w - width_taken + gap;
|
||||
let new_view_x = leftmost_col_x.unwrap() - free_space / 2. - working_x;
|
||||
|
||||
self.animate_view_offset(self.active_column_idx, new_view_x - active_col_x.unwrap());
|
||||
// Just in case.
|
||||
self.animate_view_offset_to_column(None, self.active_column_idx, None);
|
||||
}
|
||||
|
||||
pub fn view_pos(&self) -> f64 {
|
||||
self.column_x(self.active_column_idx) + self.view_offset.current()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user