tiles: Limit tile panel move to avoid out of the container. (#630)
This commit is contained in:
parent
b18dd47ce0
commit
e4c31f1ce4
1 changed files with 18 additions and 5 deletions
|
|
@ -26,6 +26,7 @@ actions!(tiles, [Undo, Redo,]);
|
||||||
const MINIMUM_SIZE: Size<Pixels> = size(px(100.), px(100.));
|
const MINIMUM_SIZE: Size<Pixels> = size(px(100.), px(100.));
|
||||||
const DRAG_BAR_HEIGHT: Pixels = px(30.);
|
const DRAG_BAR_HEIGHT: Pixels = px(30.);
|
||||||
const HANDLE_SIZE: Pixels = px(20.0);
|
const HANDLE_SIZE: Pixels = px(20.0);
|
||||||
|
const GRID_ALIGNMENT: Pixels = px(10.0);
|
||||||
|
|
||||||
#[derive(Clone, PartialEq, Debug)]
|
#[derive(Clone, PartialEq, Debug)]
|
||||||
struct TileChange {
|
struct TileChange {
|
||||||
|
|
@ -213,7 +214,12 @@ impl Tiles {
|
||||||
cx.notify();
|
cx.notify();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update_position(&mut self, pos: Point<Pixels>, _: &mut Window, cx: &mut Context<'_, Self>) {
|
fn update_position(
|
||||||
|
&mut self,
|
||||||
|
mouse_position: Point<Pixels>,
|
||||||
|
_: &mut Window,
|
||||||
|
cx: &mut Context<'_, Self>,
|
||||||
|
) {
|
||||||
let Some(index) = self.dragging_index else {
|
let Some(index) = self.dragging_index else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
@ -223,12 +229,19 @@ impl Tiles {
|
||||||
};
|
};
|
||||||
|
|
||||||
let previous_bounds = item.bounds;
|
let previous_bounds = item.bounds;
|
||||||
let adjusted_position = pos - self.bounds.origin;
|
let adjusted_position = mouse_position - self.bounds.origin;
|
||||||
let delta = adjusted_position - self.dragging_initial_mouse;
|
let delta = adjusted_position - self.dragging_initial_mouse;
|
||||||
let new_origin = self.dragging_initial_bounds.origin + delta;
|
let mut new_origin = self.dragging_initial_bounds.origin + delta;
|
||||||
|
|
||||||
|
// Avoid out of bounds
|
||||||
|
if new_origin.x < px(0.) {
|
||||||
|
new_origin.x = px(0.);
|
||||||
|
}
|
||||||
|
if new_origin.y < px(0.) {
|
||||||
|
new_origin.y = px(0.);
|
||||||
|
}
|
||||||
|
|
||||||
let final_origin = round_point_to_nearest_ten(new_origin);
|
let final_origin = round_point_to_nearest_ten(new_origin);
|
||||||
|
|
||||||
// Only push to history if bounds have changed
|
// Only push to history if bounds have changed
|
||||||
if final_origin != previous_bounds.origin {
|
if final_origin != previous_bounds.origin {
|
||||||
item.bounds.origin = final_origin;
|
item.bounds.origin = final_origin;
|
||||||
|
|
@ -820,7 +833,7 @@ impl Tiles {
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn round_to_nearest_ten(value: Pixels) -> Pixels {
|
fn round_to_nearest_ten(value: Pixels) -> Pixels {
|
||||||
px((value.0 / 10.0).round() * 10.0)
|
(value / GRID_ALIGNMENT).round() * GRID_ALIGNMENT
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue