Add viewTransform support for external pan/zoom integration#86
Open
escamoteur wants to merge 1 commit intotimcreatedit:mainfrom
Open
Add viewTransform support for external pan/zoom integration#86escamoteur wants to merge 1 commit intotimcreatedit:mainfrom
escamoteur wants to merge 1 commit intotimcreatedit:mainfrom
Conversation
This feature allows Scribble to work seamlessly with external pan/zoom
controllers (like InteractiveViewer) by transforming coordinates internally
rather than relying on widget-level transforms. This solves hit-testing
issues that occur when using Transform widgets for zoom.
## Changes
### ScribbleState
- Added `viewTransform: Matrix4?` field to both Drawing and Erasing states
- Field is excluded from JSON serialization (runtime-only value)
### ScribbleNotifier
- Added `setViewTransform(Matrix4? transform)` method
- `_getPointFromEvent()` now transforms coordinates using inverse viewTransform
- `_erasePoint()` also transforms coordinates for consistent erasing
- When viewTransform is set, lines are stored with visual width (not divided
by scaleFactor) to maintain constant thickness regardless of zoom
### Painters (ScribblePainter, ScribbleEditingPainter)
- Apply viewTransform to canvas before rendering
- Use `1/scaleFactor` for line width when viewTransform is set, so after
canvas transform, lines appear at their intended visual width
- Lines maintain constant visual thickness at any zoom level
### Dependencies
- Added vector_math to dependencies for Matrix4/Vector3 operations
## Usage
```dart
// In your pan/zoom controller callback:
_transformController.addListener(() {
final transform = _transformController.value;
_scribbleNotifier.setViewTransform(transform);
_scribbleNotifier.setScaleFactor(transform.getMaxScaleOnAxis());
});
```
## How it works
1. Scribble stays viewport-sized (always receives all touches)
2. Pointer coordinates are transformed using inverse matrix before storing
3. Canvas applies viewTransform when painting
4. Lines maintain constant visual thickness regardless of zoom level
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This PR adds
viewTransformsupport to Scribble, enabling seamless integration with external pan/zoom controllers likeInteractiveViewer. This solves hit-testing issues that occur when usingTransformwidgets for zoom.Problem
When wrapping Scribble in an
InteractiveViewer(or similar), theTransformwidget affects hit testing. When zoomed out, touches at the edges of the viewport map to coordinates outside Scribble's bounds, causing strokes to fail.Solution
Instead of transforming the widget, transform coordinates inside Scribble:
Changes
ScribbleState
viewTransform: Matrix4?field to bothDrawingandErasingstatesScribbleNotifier
setViewTransform(Matrix4? transform)method_getPointFromEvent()transforms coordinates using inverse viewTransform_erasePoint()also transforms coordinates for consistent erasingPainters
1/scaleFactorfor line width when viewTransform is setDependencies
vector_mathto dependencies for Matrix4/Vector3 operationsUsage
Backwards Compatibility
viewTransformisnull, behavior is unchanged