diff options
Diffstat (limited to 'src/layout/floating.rs')
| -rw-r--r-- | src/layout/floating.rs | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/src/layout/floating.rs b/src/layout/floating.rs index 5ef0a265..82b8c8cc 100644 --- a/src/layout/floating.rs +++ b/src/layout/floating.rs @@ -961,17 +961,42 @@ impl<W: LayoutElement> FloatingSpace<W> { }; let idx = self.idx_of(id).unwrap(); - let mut new_pos = self.data[idx].logical_pos; + let mut pos = self.data[idx].logical_pos; + + let available_width = self.working_area.size.w; + let available_height = self.working_area.size.h; + let working_area_loc = self.working_area.loc; + + const MAX_F: f64 = 10000.; + match x { - PositionChange::SetFixed(x) => new_pos.x = x + self.working_area.loc.x, - PositionChange::AdjustFixed(x) => new_pos.x += x, + PositionChange::SetFixed(x) => pos.x = x + working_area_loc.x, + PositionChange::SetProportion(prop) => { + let prop = (prop / 100.).clamp(0., MAX_F); + pos.x = available_width * prop + working_area_loc.x; + } + PositionChange::AdjustFixed(x) => pos.x += x, + PositionChange::AdjustProportion(prop) => { + let current_prop = (pos.x - working_area_loc.x) / available_width.max(1.); + let prop = (current_prop + prop / 100.).clamp(0., MAX_F); + pos.x = available_width * prop + working_area_loc.x; + } } match y { - PositionChange::SetFixed(y) => new_pos.y = y + self.working_area.loc.y, - PositionChange::AdjustFixed(y) => new_pos.y += y, + PositionChange::SetFixed(y) => pos.y = y + working_area_loc.y, + PositionChange::SetProportion(prop) => { + let prop = (prop / 100.).clamp(0., MAX_F); + pos.y = available_height * prop + working_area_loc.y; + } + PositionChange::AdjustFixed(y) => pos.y += y, + PositionChange::AdjustProportion(prop) => { + let current_prop = (pos.y - working_area_loc.y) / available_height.max(1.); + let prop = (current_prop + prop / 100.).clamp(0., MAX_F); + pos.y = available_height * prop + working_area_loc.y; + } } - self.move_to(idx, new_pos, animate); + self.move_to(idx, pos, animate); } pub fn center_window(&mut self, id: Option<&W::Id>) { |
