pub struct PanZoomController { /* private fields */ }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);A cloneable handle onto a PanZoomView: drive it with
jump_to/fit_to_bounds/
fit_rect and read where it stands with
transform. Every clone shares one state, so the handle
an app keeps in its state and the one attached to the view are the same.
Commands are recorded, not applied: the widget applies the latest one at its next layout or paint (a later command replaces an unapplied earlier one), clamping the scale to the view’s bounds. One controller drives one view; attaching it to two makes them race for its commands.
Implementations§
Source§impl PanZoomController
impl PanZoomController
Sourcepub fn new() -> PanZoomController
pub fn new() -> PanZoomController
A controller attached to nothing yet, reading PanZoomTransform::IDENTITY.
Sourcepub fn transform(&self) -> PanZoomTransform
pub fn transform(&self) -> PanZoomTransform
The transform the attached widget last published (identity until one attaches and lays out).
Sourcepub fn viewport_size(&self) -> Size
pub fn viewport_size(&self) -> Size
The attached widget’s last laid-out size (zero until it lays out).
Sourcepub fn content_size(&self) -> Size
pub fn content_size(&self) -> Size
The child’s last laid-out natural size (zero until it lays out).
Sourcepub fn jump_to(&self, scale: f64, offset: Vec2)
pub fn jump_to(&self, scale: f64, offset: Vec2)
Move to scale (clamped to the view’s bounds) with the child’s origin
at view-local offset.
Sourcepub fn fit_to_bounds(&self)
pub fn fit_to_bounds(&self)
Fit the child’s whole laid-out bounds into the view, centred, at the largest scale that shows all of it (clamped to the view’s bounds).
Trait Implementations§
Source§impl Clone for PanZoomController
impl Clone for PanZoomController
Source§fn clone(&self) -> PanZoomController
fn clone(&self) -> PanZoomController
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for PanZoomController
impl Debug for PanZoomController
Source§impl Default for PanZoomController
impl Default for PanZoomController
Source§fn default() -> PanZoomController
fn default() -> PanZoomController
Auto Trait Implementations§
impl !RefUnwindSafe for PanZoomController
impl !Send for PanZoomController
impl !Sync for PanZoomController
impl !UnwindSafe for PanZoomController
impl Freeze for PanZoomController
impl Unpin for PanZoomController
impl UnsafeUnpin for PanZoomController
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<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.