disable scroll options when image is wrapped by window

Signed-off-by: fufesou <shuanglongchen@yeah.net>
This commit is contained in:
fufesou 2023-01-06 20:25:18 +08:00
parent 921b049e1e
commit 947b7c9a4d
4 changed files with 90 additions and 66 deletions

View File

@ -402,12 +402,10 @@ class _ImagePaintState extends State<ImagePaint> {
onHover: (evt) {}, onHover: (evt) {},
child: child)); child: child));
final imageWidth = c.getDisplayWidth() * s; if (c.imageOverflow.isTrue && c.scrollStyle == ScrollStyle.scrollbar) {
final imageHeight = c.getDisplayHeight() * s; final imageWidth = c.getDisplayWidth() * s;
final imageSize = Size(imageWidth, imageHeight); final imageHeight = c.getDisplayHeight() * s;
bool overflow = final imageSize = Size(imageWidth, imageHeight);
c.size.width < imageSize.width || c.size.height < imageSize.height;
if (overflow && c.scrollStyle == ScrollStyle.scrollbar) {
final imageWidget = CustomPaint( final imageWidget = CustomPaint(
size: imageSize, size: imageSize,
painter: ImagePainter(image: m.image, x: 0, y: 0, scale: s), painter: ImagePainter(image: m.image, x: 0, y: 0, scale: s),

View File

@ -118,6 +118,15 @@ abstract class MenuEntryBase<T> {
this.enabled, this.enabled,
}); });
List<mod_menu.PopupMenuEntry<T>> build(BuildContext context, MenuConfig conf); List<mod_menu.PopupMenuEntry<T>> build(BuildContext context, MenuConfig conf);
enabledStyle(BuildContext context) => TextStyle(
color: Theme.of(context).textTheme.titleLarge?.color,
fontSize: MenuConfig.fontSize,
fontWeight: FontWeight.normal);
disabledStyle() => TextStyle(
color: Colors.grey,
fontSize: MenuConfig.fontSize,
fontWeight: FontWeight.normal);
} }
class MenuEntryDivider<T> extends MenuEntryBase<T> { class MenuEntryDivider<T> extends MenuEntryBase<T> {
@ -189,54 +198,76 @@ class MenuEntryRadios<T> extends MenuEntryBase<T> {
mod_menu.PopupMenuEntry<T> _buildMenuItem( mod_menu.PopupMenuEntry<T> _buildMenuItem(
BuildContext context, MenuConfig conf, MenuEntryRadioOption opt) { BuildContext context, MenuConfig conf, MenuEntryRadioOption opt) {
Widget getTextChild() {
final enabledTextChild = Text(
opt.text,
style: enabledStyle(context),
);
final disabledTextChild = Text(
opt.text,
style: disabledStyle(),
);
if (opt.enabled == null) {
return enabledTextChild;
} else {
return Obx(
() => opt.enabled!.isTrue ? enabledTextChild : disabledTextChild);
}
}
final child = Container(
padding: padding,
alignment: AlignmentDirectional.centerStart,
constraints:
BoxConstraints(minHeight: conf.height, maxHeight: conf.height),
child: Row(
children: [
getTextChild(),
Expanded(
child: Align(
alignment: Alignment.centerRight,
child: Transform.scale(
scale: MenuConfig.iconScale,
child: Obx(() => opt.value == curOption.value
? IconButton(
padding:
const EdgeInsets.fromLTRB(8.0, 0.0, 8.0, 0.0),
hoverColor: Colors.transparent,
focusColor: Colors.transparent,
onPressed: () {},
icon: Icon(
Icons.check,
color: (opt.enabled ?? true.obs).isTrue
? conf.commonColor
: Colors.grey,
))
: const SizedBox.shrink()),
))),
],
),
);
onPressed() {
if (opt.dismissOnClicked && Navigator.canPop(context)) {
Navigator.pop(context);
}
setOption(opt.value);
}
return mod_menu.PopupMenuItem( return mod_menu.PopupMenuItem(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
height: conf.height, height: conf.height,
child: Container( child: Container(
width: conf.boxWidth, width: conf.boxWidth,
child: TextButton( child: opt.enabled == null
child: Container( ? TextButton(
padding: padding, child: child,
alignment: AlignmentDirectional.centerStart, onPressed: onPressed,
constraints: BoxConstraints( )
minHeight: conf.height, maxHeight: conf.height), : Obx(() => TextButton(
child: Row( child: child,
children: [ onPressed: opt.enabled!.isTrue ? onPressed : null,
Text( )),
opt.text, ),
style: TextStyle(
color: Theme.of(context).textTheme.titleLarge?.color,
fontSize: MenuConfig.fontSize,
fontWeight: FontWeight.normal),
),
Expanded(
child: Align(
alignment: Alignment.centerRight,
child: Transform.scale(
scale: MenuConfig.iconScale,
child: Obx(() => opt.value == curOption.value
? IconButton(
padding: const EdgeInsets.fromLTRB(
8.0, 0.0, 8.0, 0.0),
hoverColor: Colors.transparent,
focusColor: Colors.transparent,
onPressed: () {},
icon: Icon(
Icons.check,
color: conf.commonColor,
))
: const SizedBox.shrink()),
))),
],
),
),
onPressed: () {
if (opt.dismissOnClicked && Navigator.canPop(context)) {
Navigator.pop(context);
}
setOption(opt.value);
},
)),
); );
} }
@ -567,12 +598,9 @@ class MenuEntrySubMenu<T> extends MenuEntryBase<T> {
const SizedBox(width: MenuConfig.midPadding), const SizedBox(width: MenuConfig.midPadding),
Obx(() => Text( Obx(() => Text(
text, text,
style: TextStyle( style: super.enabled!.value
color: super.enabled!.value ? enabledStyle(context)
? Theme.of(context).textTheme.titleLarge?.color : disabledStyle(),
: Colors.grey,
fontSize: MenuConfig.fontSize,
fontWeight: FontWeight.normal),
)), )),
Expanded( Expanded(
child: Align( child: Align(
@ -605,14 +633,6 @@ class MenuEntryButton<T> extends MenuEntryBase<T> {
); );
Widget _buildChild(BuildContext context, MenuConfig conf) { Widget _buildChild(BuildContext context, MenuConfig conf) {
final enabledStyle = TextStyle(
color: Theme.of(context).textTheme.titleLarge?.color,
fontSize: MenuConfig.fontSize,
fontWeight: FontWeight.normal);
const disabledStyle = TextStyle(
color: Colors.grey,
fontSize: MenuConfig.fontSize,
fontWeight: FontWeight.normal);
super.enabled ??= true.obs; super.enabled ??= true.obs;
return Obx(() => Container( return Obx(() => Container(
width: conf.boxWidth, width: conf.boxWidth,
@ -631,7 +651,7 @@ class MenuEntryButton<T> extends MenuEntryBase<T> {
constraints: constraints:
BoxConstraints(minHeight: conf.height, maxHeight: conf.height), BoxConstraints(minHeight: conf.height, maxHeight: conf.height),
child: childBuilder( child: childBuilder(
super.enabled!.value ? enabledStyle : disabledStyle), super.enabled!.value ? enabledStyle(context) : disabledStyle()),
), ),
))); )));
} }

View File

@ -936,11 +936,13 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
text: translate('ScrollAuto'), text: translate('ScrollAuto'),
value: kRemoteScrollStyleAuto, value: kRemoteScrollStyleAuto,
dismissOnClicked: true, dismissOnClicked: true,
enabled: widget.ffi.canvasModel.imageOverflow,
), ),
MenuEntryRadioOption( MenuEntryRadioOption(
text: translate('Scrollbar'), text: translate('Scrollbar'),
value: kRemoteScrollStyleBar, value: kRemoteScrollStyleBar,
dismissOnClicked: true, dismissOnClicked: true,
enabled: widget.ffi.canvasModel.imageOverflow,
), ),
], ],
curOptionGetter: () async => curOptionGetter: () async =>
@ -1200,7 +1202,6 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
}, },
optionSetter: (String oldValue, String newValue) async { optionSetter: (String oldValue, String newValue) async {
await bind.sessionSetKeyboardMode(id: widget.id, value: newValue); await bind.sessionSetKeyboardMode(id: widget.id, value: newValue);
widget.ffi.canvasModel.updateViewStyle();
}, },
) )
]; ];

View File

@ -22,6 +22,7 @@ import 'package:tuple/tuple.dart';
import 'package:image/image.dart' as img2; import 'package:image/image.dart' as img2;
import 'package:flutter_custom_cursor/cursor_manager.dart'; import 'package:flutter_custom_cursor/cursor_manager.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import '../common.dart'; import '../common.dart';
import '../common/shared_state.dart'; import '../common/shared_state.dart';
@ -542,6 +543,8 @@ class CanvasModel with ChangeNotifier {
ScrollStyle _scrollStyle = ScrollStyle.scrollauto; ScrollStyle _scrollStyle = ScrollStyle.scrollauto;
ViewStyle _lastViewStyle = ViewStyle(); ViewStyle _lastViewStyle = ViewStyle();
final _imageOverflow = false.obs;
WeakReference<FFI> parent; WeakReference<FFI> parent;
CanvasModel(this.parent); CanvasModel(this.parent);
@ -552,6 +555,7 @@ class CanvasModel with ChangeNotifier {
Size get size => _size; Size get size => _size;
ScrollStyle get scrollStyle => _scrollStyle; ScrollStyle get scrollStyle => _scrollStyle;
ViewStyle get viewStyle => _lastViewStyle; ViewStyle get viewStyle => _lastViewStyle;
RxBool get imageOverflow => _imageOverflow;
_resetScroll() => setScrollPercent(0.0, 0.0); _resetScroll() => setScrollPercent(0.0, 0.0);
@ -601,6 +605,7 @@ class CanvasModel with ChangeNotifier {
} }
_x = (size.width - displayWidth * _scale) / 2; _x = (size.width - displayWidth * _scale) / 2;
_y = (size.height - displayHeight * _scale) / 2; _y = (size.height - displayHeight * _scale) / 2;
_imageOverflow.value = _x < 0 || y < 0;
notifyListeners(); notifyListeners();
} }