diff --git a/flutter/lib/desktop/pages/remote_page.dart b/flutter/lib/desktop/pages/remote_page.dart index 3e5fc441a..2c17d4be6 100644 --- a/flutter/lib/desktop/pages/remote_page.dart +++ b/flutter/lib/desktop/pages/remote_page.dart @@ -540,8 +540,6 @@ class ImagePaint extends StatefulWidget { class _ImagePaintState extends State { bool _lastRemoteCursorMoved = false; - final ScrollController _horizontal = ScrollController(); - final ScrollController _vertical = ScrollController(); String get id => widget.id; RxBool get zoomCursor => widget.zoomCursor; @@ -610,24 +608,18 @@ class _ImagePaintState extends State { : _buildScrollbarNonTextureRender(m, paintSize, s); return NotificationListener( onNotification: (notification) { - final percentX = _horizontal.hasClients - ? _horizontal.position.extentBefore / - (_horizontal.position.extentBefore + - _horizontal.position.extentInside + - _horizontal.position.extentAfter) - : 0.0; - final percentY = _vertical.hasClients - ? _vertical.position.extentBefore / - (_vertical.position.extentBefore + - _vertical.position.extentInside + - _vertical.position.extentAfter) - : 0.0; - c.setScrollPercent(percentX, percentY); + c.updateScrollPercent(); return false; }, child: mouseRegion( child: Obx(() => _buildCrossScrollbarFromLayout( - context, _buildListener(paintWidget), c.size, paintSize)), + context, + _buildListener(paintWidget), + c.size, + paintSize, + c.scrollHorizontal, + c.scrollVertical, + )), )); } else { if (c.size.width > 0 && c.size.height > 0) { @@ -740,7 +732,13 @@ class _ImagePaintState extends State { } Widget _buildCrossScrollbarFromLayout( - BuildContext context, Widget child, Size layoutSize, Size size) { + BuildContext context, + Widget child, + Size layoutSize, + Size size, + ScrollController horizontal, + ScrollController vertical, + ) { final scrollConfig = CustomMouseWheelScrollConfig( scrollDuration: kDefaultScrollDuration, scrollCurve: Curves.linearToEaseOut, @@ -752,7 +750,7 @@ class _ImagePaintState extends State { widget = ScrollConfiguration( behavior: ScrollConfiguration.of(context).copyWith(scrollbars: false), child: SingleChildScrollView( - controller: _horizontal, + controller: horizontal, scrollDirection: Axis.horizontal, physics: cursorOverImage.isTrue ? const NeverScrollableScrollPhysics() @@ -774,7 +772,7 @@ class _ImagePaintState extends State { widget = ScrollConfiguration( behavior: ScrollConfiguration.of(context).copyWith(scrollbars: false), child: SingleChildScrollView( - controller: _vertical, + controller: vertical, physics: cursorOverImage.isTrue ? const NeverScrollableScrollPhysics() : null, @@ -793,13 +791,13 @@ class _ImagePaintState extends State { } if (layoutSize.width < size.width) { widget = ImprovedScrolling( - scrollController: _horizontal, + scrollController: horizontal, enableCustomMouseWheelScrolling: cursorOverImage.isFalse, customMouseWheelScrollConfig: scrollConfig, child: RawScrollbar( thickness: kScrollbarThickness, thumbColor: Colors.grey, - controller: _horizontal, + controller: horizontal, thumbVisibility: false, trackVisibility: false, notificationPredicate: layoutSize.height < size.height @@ -811,13 +809,13 @@ class _ImagePaintState extends State { } if (layoutSize.height < size.height) { widget = ImprovedScrolling( - scrollController: _vertical, + scrollController: vertical, enableCustomMouseWheelScrolling: cursorOverImage.isFalse, customMouseWheelScrollConfig: scrollConfig, child: RawScrollbar( thickness: kScrollbarThickness, thumbColor: Colors.grey, - controller: _vertical, + controller: vertical, thumbVisibility: false, trackVisibility: false, child: widget, @@ -874,10 +872,14 @@ class CursorPaint extends StatelessWidget { debugPrint('unreachable! The displays rect is null.'); return Container(); } - final imageWidth = rect.width * c.scale; - final imageHeight = rect.height * c.scale; - cx = -imageWidth * c.scrollX; - cy = -imageHeight * c.scrollY; + if (cx < 0) { + final imageWidth = rect.width * c.scale; + cx = -imageWidth * c.scrollX; + } + if (cy < 0) { + final imageHeight = rect.height * c.scale; + cy = -imageHeight * c.scrollY; + } } double x = (m.x - hotx) * c.scale + cx; diff --git a/flutter/lib/models/model.dart b/flutter/lib/models/model.dart index b90fbea71..146679740 100644 --- a/flutter/lib/models/model.dart +++ b/flutter/lib/models/model.dart @@ -1205,6 +1205,9 @@ class CanvasModel with ChangeNotifier { ScrollStyle _scrollStyle = ScrollStyle.scrollauto; ViewStyle _lastViewStyle = ViewStyle.defaultViewStyle(); + final ScrollController _horizontal = ScrollController(); + final ScrollController _vertical = ScrollController(); + final _imageOverflow = false.obs; WeakReference parent; @@ -1229,6 +1232,8 @@ class CanvasModel with ChangeNotifier { _scrollY = y; } + ScrollController get scrollHorizontal => _horizontal; + ScrollController get scrollVertical => _vertical; double get scrollX => _scrollX; double get scrollY => _scrollY; @@ -1289,6 +1294,7 @@ class CanvasModel with ChangeNotifier { if (refreshMousePos) { parent.target?.inputModel.refreshMousePos(); } + updateScrollPercent(); } updateScrollStyle() async { @@ -1424,6 +1430,22 @@ class CanvasModel with ChangeNotifier { _scale = 1.0; if (notify) notifyListeners(); } + + updateScrollPercent() { + final percentX = _horizontal.hasClients + ? _horizontal.position.extentBefore / + (_horizontal.position.extentBefore + + _horizontal.position.extentInside + + _horizontal.position.extentAfter) + : 0.0; + final percentY = _vertical.hasClients + ? _vertical.position.extentBefore / + (_vertical.position.extentBefore + + _vertical.position.extentInside + + _vertical.position.extentAfter) + : 0.0; + setScrollPercent(percentX, percentY); + } } // data for cursor