Merge pull request #1690 from Kingtous/master

fix: scroll alignment in remote page
This commit is contained in:
RustDesk 2022-10-09 18:45:16 +08:00 committed by GitHub
commit e6a71c1566
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 106 additions and 49 deletions

View File

@ -286,30 +286,35 @@ class ImagePaint extends StatelessWidget {
child: child)); child: child));
if (c.scrollStyle == ScrollStyle.scrollbar) { if (c.scrollStyle == ScrollStyle.scrollbar) {
final imageWidth = c.getDisplayWidth() * s;
final imageHeight = c.getDisplayHeight() * s;
final imageWidget = SizedBox( final imageWidget = SizedBox(
width: c.getDisplayWidth() * s, width: imageWidth,
height: c.getDisplayHeight() * s, height: imageHeight,
child: CustomPaint( child: CustomPaint(
painter: ImagePainter(image: m.image, x: 0, y: 0, scale: s), painter: ImagePainter(image: m.image, x: 0, y: 0, scale: s),
)); ));
return Center( return NotificationListener<ScrollNotification>(
child: NotificationListener<ScrollNotification>( onNotification: (notification) {
onNotification: (notification) { final percentX = _horizontal.hasClients
final percentX = _horizontal.position.extentBefore / ? _horizontal.position.extentBefore /
(_horizontal.position.extentBefore + (_horizontal.position.extentBefore +
_horizontal.position.extentInside + _horizontal.position.extentInside +
_horizontal.position.extentAfter); _horizontal.position.extentAfter)
final percentY = _vertical.position.extentBefore / : 0.0;
(_vertical.position.extentBefore + final percentY = _vertical.hasClients
_vertical.position.extentInside + ? _vertical.position.extentBefore /
_vertical.position.extentAfter); (_vertical.position.extentBefore +
c.setScrollPercent(percentX, percentY); _vertical.position.extentInside +
return false; _vertical.position.extentAfter)
}, : 0.0;
child: mouseRegion( c.setScrollPercent(percentX, percentY);
child: _buildCrossScrollbar(_buildListener(imageWidget))), return false;
), },
child: mouseRegion(
child: _buildCrossScrollbar(context, _buildListener(imageWidget),
Size(imageWidth, imageHeight))),
); );
} else { } else {
final imageWidget = SizedBox( final imageWidget = SizedBox(
@ -342,44 +347,96 @@ class ImagePaint extends StatelessWidget {
} }
} }
Widget _buildCrossScrollbar(Widget child) { Widget _buildCrossScrollbarFromLayout(
BuildContext context, Widget child, Size layoutSize, Size size) {
final scrollConfig = CustomMouseWheelScrollConfig( final scrollConfig = CustomMouseWheelScrollConfig(
scrollDuration: kDefaultScrollDuration, scrollDuration: kDefaultScrollDuration,
scrollCurve: Curves.linearToEaseOut, scrollCurve: Curves.linearToEaseOut,
mouseWheelTurnsThrottleTimeMs: mouseWheelTurnsThrottleTimeMs:
kDefaultMouseWheelThrottleDuration.inMilliseconds, kDefaultMouseWheelThrottleDuration.inMilliseconds,
scrollAmountMultiplier: kDefaultScrollAmountMultiplier); scrollAmountMultiplier: kDefaultScrollAmountMultiplier);
return Obx(() => ImprovedScrolling( var widget = child;
if (layoutSize.width < size.width) {
widget = ScrollConfiguration(
behavior: ScrollConfiguration.of(context).copyWith(scrollbars: false),
child: SingleChildScrollView(
controller: _horizontal,
scrollDirection: Axis.horizontal,
physics: cursorOverImage.isTrue
? const NeverScrollableScrollPhysics()
: null,
child: widget,
),
);
} else {
widget = Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [widget],
);
}
if (layoutSize.height < size.height) {
widget = ScrollConfiguration(
behavior: ScrollConfiguration.of(context).copyWith(scrollbars: false),
child: SingleChildScrollView(
controller: _vertical,
physics: cursorOverImage.isTrue
? const NeverScrollableScrollPhysics()
: null,
child: widget,
),
);
} else {
widget = Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [widget],
);
}
if (layoutSize.width < size.width) {
widget = ImprovedScrolling(
scrollController: _horizontal,
enableCustomMouseWheelScrolling: cursorOverImage.isFalse,
customMouseWheelScrollConfig: scrollConfig,
child: RawScrollbar(
thumbColor: Colors.grey,
controller: _horizontal,
thumbVisibility: false,
trackVisibility: false,
notificationPredicate: (notification) => notification.depth == 1,
child: widget,
),
);
}
if (layoutSize.height < size.height) {
widget = ImprovedScrolling(
scrollController: _vertical, scrollController: _vertical,
enableCustomMouseWheelScrolling: cursorOverImage.isFalse, enableCustomMouseWheelScrolling: cursorOverImage.isFalse,
customMouseWheelScrollConfig: scrollConfig, customMouseWheelScrollConfig: scrollConfig,
child: ImprovedScrolling( child: RawScrollbar(
scrollController: _horizontal, thumbColor: Colors.grey,
enableCustomMouseWheelScrolling: cursorOverImage.isFalse, controller: _vertical,
customMouseWheelScrollConfig: scrollConfig, thumbVisibility: false,
child: Scrollbar( trackVisibility: false,
controller: _vertical, child: widget,
thumbVisibility: false, ),
trackVisibility: false, );
child: Scrollbar( }
controller: _horizontal,
thumbVisibility: false, return widget;
trackVisibility: false, }
notificationPredicate: (notif) => notif.depth == 1,
child: SingleChildScrollView( Widget _buildCrossScrollbar(BuildContext context, Widget child, Size size) {
controller: _vertical, var layoutSize = MediaQuery.of(context).size;
physics: cursorOverImage.isTrue layoutSize = Size(
? const NeverScrollableScrollPhysics() layoutSize.width - kWindowBorderWidth * 2,
: null, layoutSize.height -
child: SingleChildScrollView( kWindowBorderWidth * 2 -
controller: _horizontal, kDesktopRemoteTabBarHeight);
scrollDirection: Axis.horizontal, bool overflow =
physics: cursorOverImage.isTrue layoutSize.width < size.width || layoutSize.height < size.height;
? const NeverScrollableScrollPhysics() return overflow
: null, ? Obx(() =>
child: child, _buildCrossScrollbarFromLayout(context, child, layoutSize, size))
), : _buildCrossScrollbarFromLayout(context, child, layoutSize, size);
))))));
} }
Widget _buildListener(Widget child) { Widget _buildListener(Widget child) {

View File

@ -73,7 +73,7 @@ dependencies:
flutter_custom_cursor: flutter_custom_cursor:
git: git:
url: https://github.com/Kingtous/rustdesk_flutter_custom_cursor url: https://github.com/Kingtous/rustdesk_flutter_custom_cursor
ref: 527821d676017387be024dffd61898ff79b14c41 ref: 4a950fd3a5a228bf5381070a4c803919d5787c07
get: ^4.6.5 get: ^4.6.5
visibility_detector: ^0.3.3 visibility_detector: ^0.3.3
contextmenu: ^3.0.0 contextmenu: ^3.0.0