Skip to main content

PanZoomController

Struct PanZoomController 

Source
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

Source

pub fn new() -> PanZoomController

A controller attached to nothing yet, reading PanZoomTransform::IDENTITY.

Source

pub fn transform(&self) -> PanZoomTransform

The transform the attached widget last published (identity until one attaches and lays out).

Source

pub fn viewport_size(&self) -> Size

The attached widget’s last laid-out size (zero until it lays out).

Source

pub fn content_size(&self) -> Size

The child’s last laid-out natural size (zero until it lays out).

Source

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.

Source

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).

Source

pub fn fit_rect(&self, rect: Rect)

Fit rect, in the child’s content space, 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

Source§

fn clone(&self) -> PanZoomController

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for PanZoomController

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl Default for PanZoomController

Source§

fn default() -> PanZoomController

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert 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>

Convert 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)

Convert &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)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> NoneValue for T
where T: Default,

Source§

type NoneType = T

Source§

fn null_value() -> T

The none-equivalent value.
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T, S> SimdFrom<T, S> for T
where S: Simd,

Source§

fn simd_from(_simd: S, value: T) -> T

Source§

impl<F, T, S> SimdInto<T, S> for F
where T: SimdFrom<F, S>, S: Simd,

Source§

fn simd_into(self, simd: S) -> T

Source§

impl<T> StorageAccess<T> for T

Source§

fn as_borrowed(&self) -> &T

Borrows the value.
Source§

fn into_taken(self) -> T

Takes the value.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more