add mouse scroll to zoom functionality
This commit is contained in:
@@ -208,8 +208,9 @@ class LazyCanvasController with ChangeNotifier {
|
||||
}
|
||||
|
||||
/// Increment or decrement the scale by an additive delta value.
|
||||
void updateScalebyDelta(double delta) {
|
||||
final focalPoint = Offset(canvasSize.width / 2, canvasSize.height / 2);
|
||||
void updateScalebyDelta(double delta, {Offset? focalPoint}) {
|
||||
// added focalPoint param
|
||||
focalPoint ??= Offset(canvasSize.width / 2, canvasSize.height / 2);
|
||||
final newScale = _scale + delta;
|
||||
_gsTopLeftOffset = newGsTopLeftOnScaling(_gsTopLeftOffset, focalPoint, _scale, newScale);
|
||||
_scale = newScale;
|
||||
|
||||
+18
-2
@@ -1,5 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/rendering.dart';
|
||||
import 'package:flutter/services.dart'; // added for LogicalKeyboardKey
|
||||
import 'package:flutter/gestures.dart'; // added for PointerScrollEvent
|
||||
import '../utils/offset_extensions.dart';
|
||||
|
||||
import '../utils/styles.dart';
|
||||
@@ -33,7 +35,21 @@ class _LazyCanvasState extends State<LazyCanvas> with TickerProviderStateMixin<L
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
widget.controller.setBuildContext(context);
|
||||
return GestureDetector(
|
||||
return Listener(
|
||||
behavior: HitTestBehavior.translucent, // ensure scroll signals are captured even on empty space
|
||||
onPointerSignal: (event) {
|
||||
if (event is PointerScrollEvent) {
|
||||
final pressed = RawKeyboard.instance.keysPressed;
|
||||
if (pressed.contains(LogicalKeyboardKey.controlLeft) || pressed.contains(LogicalKeyboardKey.controlRight)) {
|
||||
// Typical mouse wheel up gives negative dy on many platforms; invert if needed
|
||||
final delta = (-event.scrollDelta.dy) * 0.0015; // sensitivity
|
||||
if (delta != 0) {
|
||||
widget.controller.updateScalebyDelta(delta, focalPoint: event.localPosition);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
child: GestureDetector(
|
||||
behavior: HitTestBehavior.translucent,
|
||||
onScaleUpdate: widget.controller.onScaleUpdate,
|
||||
onScaleStart: widget.controller.onScaleStart,
|
||||
@@ -74,6 +90,7 @@ class _LazyCanvasState extends State<LazyCanvas> with TickerProviderStateMixin<L
|
||||
}
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -217,7 +234,6 @@ class _CanvasRenderBox extends RenderBox
|
||||
childParentData.id = _childrenIds[index];
|
||||
childParentData.scale = _scale;
|
||||
index++;
|
||||
// loosen so like a stack can take it's own size inside parent
|
||||
child.layout(constraints.loosen(), parentUsesSize: true);
|
||||
|
||||
// notify the controller about the size of the child
|
||||
|
||||
Reference in New Issue
Block a user