Fix drag-and-drop preview following #3906
This commit is contained in:
parent
069d7a634d
commit
2eaaf5fd6e
|
|
@ -2278,9 +2278,13 @@ impl Context {
|
||||||
impl Context {
|
impl Context {
|
||||||
/// Transform the graphics of the given layer.
|
/// Transform the graphics of the given layer.
|
||||||
///
|
///
|
||||||
|
/// This will also affect input.
|
||||||
|
///
|
||||||
/// This is a sticky setting, remembered from one frame to the next.
|
/// This is a sticky setting, remembered from one frame to the next.
|
||||||
///
|
///
|
||||||
/// Can be used to implement pan and zoom (see relevant demo).
|
/// Can be used to implement pan and zoom (see relevant demo).
|
||||||
|
///
|
||||||
|
/// For a temporary transform, use [`Self::transform_layer_shapes`] instead.
|
||||||
pub fn set_transform_layer(&self, layer_id: LayerId, transform: TSTransform) {
|
pub fn set_transform_layer(&self, layer_id: LayerId, transform: TSTransform) {
|
||||||
self.memory_mut(|m| {
|
self.memory_mut(|m| {
|
||||||
if transform == TSTransform::IDENTITY {
|
if transform == TSTransform::IDENTITY {
|
||||||
|
|
@ -2291,6 +2295,34 @@ impl Context {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Move all the graphics at the given layer.
|
||||||
|
///
|
||||||
|
/// Is used to implement drag-and-drop preview.
|
||||||
|
///
|
||||||
|
/// This only applied to the existing graphics at the layer, not to new graphics added later.
|
||||||
|
///
|
||||||
|
/// For a persistent transform, use [`Self::set_transform_layer`] instead.
|
||||||
|
#[deprecated = "Use `transform_layer_shapes` instead"]
|
||||||
|
pub fn translate_layer(&self, layer_id: LayerId, delta: Vec2) {
|
||||||
|
if delta != Vec2::ZERO {
|
||||||
|
let transform = emath::TSTransform::from_translation(delta);
|
||||||
|
self.transform_layer_shapes(layer_id, transform);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Transform all the graphics at the given layer.
|
||||||
|
///
|
||||||
|
/// Is used to implement drag-and-drop preview.
|
||||||
|
///
|
||||||
|
/// This only applied to the existing graphics at the layer, not to new graphics added later.
|
||||||
|
///
|
||||||
|
/// For a persistent transform, use [`Self::set_transform_layer`] instead.
|
||||||
|
pub fn transform_layer_shapes(&self, layer_id: LayerId, transform: TSTransform) {
|
||||||
|
if transform != TSTransform::IDENTITY {
|
||||||
|
self.graphics_mut(|g| g.entry(layer_id).transform(transform));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Top-most layer at the given position.
|
/// Top-most layer at the given position.
|
||||||
pub fn layer_id_at(&self, pos: Pos2) -> Option<LayerId> {
|
pub fn layer_id_at(&self, pos: Pos2) -> Option<LayerId> {
|
||||||
self.memory(|mem| {
|
self.memory(|mem| {
|
||||||
|
|
|
||||||
|
|
@ -227,8 +227,17 @@ impl GraphicLayers {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Also draw areas that are missing in `area_order`:
|
// Also draw areas that are missing in `area_order`:
|
||||||
for shapes in order_map.values_mut() {
|
for (id, list) in order_map {
|
||||||
all_shapes.append(&mut shapes.0);
|
let layer_id = LayerId::new(order, *id);
|
||||||
|
|
||||||
|
if let Some(transform) = transforms.get(&layer_id) {
|
||||||
|
for clipped_shape in &mut list.0 {
|
||||||
|
clipped_shape.clip_rect = *transform * clipped_shape.clip_rect;
|
||||||
|
clipped_shape.shape.transform(*transform);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
all_shapes.append(&mut list.0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2177,7 +2177,7 @@ impl Ui {
|
||||||
if let Some(pointer_pos) = self.ctx().pointer_interact_pos() {
|
if let Some(pointer_pos) = self.ctx().pointer_interact_pos() {
|
||||||
let delta = pointer_pos - response.rect.center();
|
let delta = pointer_pos - response.rect.center();
|
||||||
self.ctx()
|
self.ctx()
|
||||||
.set_transform_layer(layer_id, emath::TSTransform::from_translation(delta));
|
.transform_layer_shapes(layer_id, emath::TSTransform::from_translation(delta));
|
||||||
}
|
}
|
||||||
|
|
||||||
InnerResponse::new(inner, response)
|
InnerResponse::new(inner, response)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue