pub struct PanZoomTransform {
pub scale: f64,
pub offset: Vec2,
}Expand description
A pan/zoom viewport over one child — a node-and-edge graph, a map, a large
image — without hand-rolling the gesture math. pan_zoom lays its child
out at its natural size and places it under a scale-then-translate
transform (PanZoomTransform) the user drives: primary drag pans (unless
the child claims the press), a touch pinch or a desktop ctrl/⌘+wheel and
trackpad pinch zooms about the gesture’s focal point, clamped to
.min_scale/.max_scale. A plain wheel still reaches the child, and the
child sees its own unscaled local coordinates at any zoom. Flat-re-exported
from frust-widgets so app code never names that crate directly; see
PanZoomView’s own doc for the full contract (.inertia glide,
.on_transform notification, and the PanZoomController handle’s
jump_to/fit_to_bounds/fit_rect).
use frust::authoring::{PaintCtx, PaintScene};
use frust::{AnyView, Component, PanZoomController, PanZoomTransform, any, canvas, pan_zoom};
use kurbo::{Point, Size};
use peniko::Color;
#[derive(Default)]
struct Board;
struct BoardState {
zoom: PanZoomController,
transform: PanZoomTransform,
}
impl Component for Board {
type State = BoardState;
fn init(&self) -> Self::State {
BoardState {
zoom: PanZoomController::new(),
transform: PanZoomTransform::IDENTITY,
}
}
fn build(&self, state: &mut Self::State) -> AnyView<Self::State> {
let board = canvas(|scene: &mut dyn PaintScene, size: Size, _ctx: &PaintCtx| {
scene.fill_rect(Point::ZERO, size, Color::from_rgb8(0x20, 0x20, 0x20));
})
.size(Size::new(2000.0, 1500.0));
any(pan_zoom(board)
.max_scale(4.0)
.inertia(true)
.controller(state.zoom.clone())
.on_transform(|state: &mut BoardState, t| state.transform = t))
}
}
frust::app!(Board);Where the content sits: view = offset + scale · content.
The child’s pod carries exactly affine; a content-space
point (the child’s local coordinates) maps to the view’s local space
through it and back through to_content.
Fields§
§scale: f64The zoom factor: 1.0 is the child’s natural size.
offset: Vec2Where the child’s local origin sits in the view, in view-local px.
Implementations§
Source§impl PanZoomTransform
impl PanZoomTransform
Sourcepub const IDENTITY: PanZoomTransform
pub const IDENTITY: PanZoomTransform
Unscaled, unpanned: the child at the view’s top-left at natural size.
Sourcepub fn to_content(&self, point: Point) -> Point
pub fn to_content(&self, point: Point) -> Point
The content-space point drawn at view-local point.
Trait Implementations§
Source§impl Clone for PanZoomTransform
impl Clone for PanZoomTransform
Source§fn clone(&self) -> PanZoomTransform
fn clone(&self) -> PanZoomTransform
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl Copy for PanZoomTransform
Source§impl Debug for PanZoomTransform
impl Debug for PanZoomTransform
Source§impl Default for PanZoomTransform
impl Default for PanZoomTransform
Source§fn default() -> PanZoomTransform
fn default() -> PanZoomTransform
Source§impl PartialEq for PanZoomTransform
impl PartialEq for PanZoomTransform
impl StructuralPartialEq for PanZoomTransform
Auto Trait Implementations§
impl Freeze for PanZoomTransform
impl RefUnwindSafe for PanZoomTransform
impl Send for PanZoomTransform
impl Sync for PanZoomTransform
impl Unpin for PanZoomTransform
impl UnsafeUnpin for PanZoomTransform
impl UnwindSafe for PanZoomTransform
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<T> Brush for T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.