update cursor position when menu is dismissed

Signed-off-by: fufesou <shuanglongchen@yeah.net>
This commit is contained in:
fufesou 2023-02-03 19:17:59 +08:00
parent 1ad55d9914
commit ca97826b80
2 changed files with 90 additions and 10 deletions

View File

@ -109,13 +109,17 @@ class MenuConfig {
this.boxWidth}); this.boxWidth});
} }
typedef DismissCallback = Function();
abstract class MenuEntryBase<T> { abstract class MenuEntryBase<T> {
bool dismissOnClicked; bool dismissOnClicked;
DismissCallback? dismissCallback;
RxBool? enabled; RxBool? enabled;
MenuEntryBase({ MenuEntryBase({
this.dismissOnClicked = false, this.dismissOnClicked = false,
this.enabled, this.enabled,
this.dismissCallback,
}); });
List<mod_menu.PopupMenuEntry<T>> build(BuildContext context, MenuConfig conf); List<mod_menu.PopupMenuEntry<T>> build(BuildContext context, MenuConfig conf);
@ -146,12 +150,14 @@ class MenuEntryRadioOption {
String value; String value;
bool dismissOnClicked; bool dismissOnClicked;
RxBool? enabled; RxBool? enabled;
DismissCallback? dismissCallback;
MenuEntryRadioOption({ MenuEntryRadioOption({
required this.text, required this.text,
required this.value, required this.value,
this.dismissOnClicked = false, this.dismissOnClicked = false,
this.enabled, this.enabled,
this.dismissCallback,
}); });
} }
@ -177,8 +183,13 @@ class MenuEntryRadios<T> extends MenuEntryBase<T> {
required this.optionSetter, required this.optionSetter,
this.padding, this.padding,
dismissOnClicked = false, dismissOnClicked = false,
dismissCallback,
RxBool? enabled, RxBool? enabled,
}) : super(dismissOnClicked: dismissOnClicked, enabled: enabled) { }) : super(
dismissOnClicked: dismissOnClicked,
enabled: enabled,
dismissCallback: dismissCallback,
) {
() async { () async {
_curOption.value = await curOptionGetter(); _curOption.value = await curOptionGetter();
}(); }();
@ -249,6 +260,9 @@ class MenuEntryRadios<T> extends MenuEntryBase<T> {
onPressed() { onPressed() {
if (opt.dismissOnClicked && Navigator.canPop(context)) { if (opt.dismissOnClicked && Navigator.canPop(context)) {
Navigator.pop(context); Navigator.pop(context);
if (opt.dismissCallback != null) {
opt.dismissCallback!();
}
} }
setOption(opt.value); setOption(opt.value);
} }
@ -360,6 +374,9 @@ class MenuEntrySubRadios<T> extends MenuEntryBase<T> {
onPressed: () { onPressed: () {
if (opt.dismissOnClicked && Navigator.canPop(context)) { if (opt.dismissOnClicked && Navigator.canPop(context)) {
Navigator.pop(context); Navigator.pop(context);
if (opt.dismissCallback != null) {
opt.dismissCallback!();
}
} }
setOption(opt.value); setOption(opt.value);
}, },
@ -421,7 +438,12 @@ abstract class MenuEntrySwitchBase<T> extends MenuEntryBase<T> {
this.textStyle, this.textStyle,
this.padding, this.padding,
RxBool? enabled, RxBool? enabled,
}) : super(dismissOnClicked: dismissOnClicked, enabled: enabled); dismissCallback,
}) : super(
dismissOnClicked: dismissOnClicked,
enabled: enabled,
dismissCallback: dismissCallback,
);
RxBool get curOption; RxBool get curOption;
Future<void> setOption(bool? option); Future<void> setOption(bool? option);
@ -463,6 +485,9 @@ abstract class MenuEntrySwitchBase<T> extends MenuEntryBase<T> {
if (super.dismissOnClicked && if (super.dismissOnClicked &&
Navigator.canPop(context)) { Navigator.canPop(context)) {
Navigator.pop(context); Navigator.pop(context);
if (super.dismissCallback != null) {
super.dismissCallback!();
}
} }
setOption(v); setOption(v);
}, },
@ -474,6 +499,9 @@ abstract class MenuEntrySwitchBase<T> extends MenuEntryBase<T> {
if (super.dismissOnClicked && if (super.dismissOnClicked &&
Navigator.canPop(context)) { Navigator.canPop(context)) {
Navigator.pop(context); Navigator.pop(context);
if (super.dismissCallback != null) {
super.dismissCallback!();
}
} }
setOption(v); setOption(v);
}, },
@ -485,6 +513,9 @@ abstract class MenuEntrySwitchBase<T> extends MenuEntryBase<T> {
onPressed: () { onPressed: () {
if (super.dismissOnClicked && Navigator.canPop(context)) { if (super.dismissOnClicked && Navigator.canPop(context)) {
Navigator.pop(context); Navigator.pop(context);
if (super.dismissCallback != null) {
super.dismissCallback!();
}
} }
setOption(!curOption.value); setOption(!curOption.value);
}, },
@ -508,6 +539,7 @@ class MenuEntrySwitch<T> extends MenuEntrySwitchBase<T> {
EdgeInsets? padding, EdgeInsets? padding,
dismissOnClicked = false, dismissOnClicked = false,
RxBool? enabled, RxBool? enabled,
dismissCallback,
}) : super( }) : super(
switchType: switchType, switchType: switchType,
text: text, text: text,
@ -515,6 +547,7 @@ class MenuEntrySwitch<T> extends MenuEntrySwitchBase<T> {
padding: padding, padding: padding,
dismissOnClicked: dismissOnClicked, dismissOnClicked: dismissOnClicked,
enabled: enabled, enabled: enabled,
dismissCallback: dismissCallback,
) { ) {
() async { () async {
_curOption.value = await getter(); _curOption.value = await getter();
@ -551,12 +584,15 @@ class MenuEntrySwitch2<T> extends MenuEntrySwitchBase<T> {
EdgeInsets? padding, EdgeInsets? padding,
dismissOnClicked = false, dismissOnClicked = false,
RxBool? enabled, RxBool? enabled,
dismissCallback,
}) : super( }) : super(
switchType: switchType, switchType: switchType,
text: text, text: text,
textStyle: textStyle, textStyle: textStyle,
padding: padding, padding: padding,
dismissOnClicked: dismissOnClicked); dismissOnClicked: dismissOnClicked,
dismissCallback: dismissCallback,
);
@override @override
RxBool get curOption => getter(); RxBool get curOption => getter();
@ -627,9 +663,11 @@ class MenuEntryButton<T> extends MenuEntryBase<T> {
this.padding, this.padding,
dismissOnClicked = false, dismissOnClicked = false,
RxBool? enabled, RxBool? enabled,
dismissCallback,
}) : super( }) : super(
dismissOnClicked: dismissOnClicked, dismissOnClicked: dismissOnClicked,
enabled: enabled, enabled: enabled,
dismissCallback: dismissCallback,
); );
Widget _buildChild(BuildContext context, MenuConfig conf) { Widget _buildChild(BuildContext context, MenuConfig conf) {
@ -641,6 +679,9 @@ class MenuEntryButton<T> extends MenuEntryBase<T> {
? () { ? () {
if (super.dismissOnClicked && Navigator.canPop(context)) { if (super.dismissOnClicked && Navigator.canPop(context)) {
Navigator.pop(context); Navigator.pop(context);
if (super.dismissCallback != null) {
super.dismissCallback!();
}
} }
proc(); proc();
} }

View File

@ -231,6 +231,8 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
); );
} }
_menuDismissCallback() => widget.ffi.inputModel.refreshMousePos();
Widget _buildMenubar(BuildContext context) { Widget _buildMenubar(BuildContext context) {
final List<Widget> menubarItems = []; final List<Widget> menubarItems = [];
if (!isWebDesktop) { if (!isWebDesktop) {
@ -374,6 +376,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
onPressed: () { onPressed: () {
if (Navigator.canPop(context)) { if (Navigator.canPop(context)) {
Navigator.pop(context); Navigator.pop(context);
_menuDismissCallback();
} }
RxInt display = CurrentDisplayState.find(widget.id); RxInt display = CurrentDisplayState.find(widget.id);
if (display.value != i) { if (display.value != i) {
@ -551,6 +554,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
onPressed: () { onPressed: () {
if (Navigator.canPop(context)) { if (Navigator.canPop(context)) {
Navigator.pop(context); Navigator.pop(context);
_menuDismissCallback();
} }
showSetOSPassword( showSetOSPassword(
widget.id, false, widget.ffi.dialogManager); widget.id, false, widget.ffi.dialogManager);
@ -563,6 +567,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
}, },
padding: padding, padding: padding,
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
), ),
MenuEntryButton<String>( MenuEntryButton<String>(
childBuilder: (TextStyle? style) => Text( childBuilder: (TextStyle? style) => Text(
@ -574,6 +579,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
}, },
padding: padding, padding: padding,
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
), ),
MenuEntryButton<String>( MenuEntryButton<String>(
childBuilder: (TextStyle? style) => Text( childBuilder: (TextStyle? style) => Text(
@ -585,6 +591,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
connect(context, widget.id, isTcpTunneling: true); connect(context, widget.id, isTcpTunneling: true);
}, },
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
), ),
]); ]);
// {handler.get_audit_server() && <li #note>{translate('Note')}</li>} // {handler.get_audit_server() && <li #note>{translate('Note')}</li>}
@ -602,6 +609,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
}, },
padding: padding, padding: padding,
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
), ),
); );
} }
@ -618,6 +626,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
}, },
padding: padding, padding: padding,
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
)); ));
} }
} }
@ -635,6 +644,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
}, },
padding: padding, padding: padding,
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
)); ));
} }
@ -649,6 +659,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
}, },
padding: padding, padding: padding,
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
)); ));
if (pi.platform == kPeerPlatformWindows) { if (pi.platform == kPeerPlatformWindows) {
@ -667,6 +678,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
}, },
padding: padding, padding: padding,
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
)); ));
} }
if (pi.platform != kPeerPlatformAndroid && if (pi.platform != kPeerPlatformAndroid &&
@ -681,6 +693,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
showConfirmSwitchSidesDialog(widget.id, widget.ffi.dialogManager), showConfirmSwitchSidesDialog(widget.id, widget.ffi.dialogManager),
padding: padding, padding: padding,
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
)); ));
} }
} }
@ -696,6 +709,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
}, },
padding: padding, padding: padding,
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
)); ));
} }
@ -717,6 +731,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
// }, // },
// padding: padding, // padding: padding,
// dismissOnClicked: true, // dismissOnClicked: true,
// dismissCallback: _menuDismissCallback,
// )); // ));
// } // }
} }
@ -762,11 +777,13 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
text: translate('Scale original'), text: translate('Scale original'),
value: kRemoteViewStyleOriginal, value: kRemoteViewStyleOriginal,
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
), ),
MenuEntryRadioOption( MenuEntryRadioOption(
text: translate('Scale adaptive'), text: translate('Scale adaptive'),
value: kRemoteViewStyleAdaptive, value: kRemoteViewStyleAdaptive,
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
), ),
], ],
curOptionGetter: () async { curOptionGetter: () async {
@ -782,6 +799,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
}, },
padding: padding, padding: padding,
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
), ),
MenuEntryDivider<String>(), MenuEntryDivider<String>(),
MenuEntryRadios<String>( MenuEntryRadios<String>(
@ -791,21 +809,26 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
text: translate('Good image quality'), text: translate('Good image quality'),
value: kRemoteImageQualityBest, value: kRemoteImageQualityBest,
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
), ),
MenuEntryRadioOption( MenuEntryRadioOption(
text: translate('Balanced'), text: translate('Balanced'),
value: kRemoteImageQualityBalanced, value: kRemoteImageQualityBalanced,
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
), ),
MenuEntryRadioOption( MenuEntryRadioOption(
text: translate('Optimize reaction time'), text: translate('Optimize reaction time'),
value: kRemoteImageQualityLow, value: kRemoteImageQualityLow,
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
), ),
MenuEntryRadioOption( MenuEntryRadioOption(
text: translate('Custom'), text: translate('Custom'),
value: kRemoteImageQualityCustom, value: kRemoteImageQualityCustom,
dismissOnClicked: true), dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
),
], ],
curOptionGetter: () async => curOptionGetter: () async =>
// null means peer id is not found, which there's no need to care about // null means peer id is not found, which there's no need to care about
@ -970,12 +993,14 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
text: translate('ScrollAuto'), text: translate('ScrollAuto'),
value: kRemoteScrollStyleAuto, value: kRemoteScrollStyleAuto,
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
enabled: widget.ffi.canvasModel.imageOverflow, enabled: widget.ffi.canvasModel.imageOverflow,
), ),
MenuEntryRadioOption( MenuEntryRadioOption(
text: translate('Scrollbar'), text: translate('Scrollbar'),
value: kRemoteScrollStyleBar, value: kRemoteScrollStyleBar,
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
enabled: widget.ffi.canvasModel.imageOverflow, enabled: widget.ffi.canvasModel.imageOverflow,
), ),
], ],
@ -988,6 +1013,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
}, },
padding: padding, padding: padding,
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
)); ));
displayMenu.insert(3, MenuEntryDivider<String>()); displayMenu.insert(3, MenuEntryDivider<String>());
@ -1058,6 +1084,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
}, },
padding: padding, padding: padding,
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
), ),
); );
} }
@ -1084,11 +1111,13 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
text: translate('Auto'), text: translate('Auto'),
value: 'auto', value: 'auto',
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
), ),
MenuEntryRadioOption( MenuEntryRadioOption(
text: 'VP9', text: 'VP9',
value: 'vp9', value: 'vp9',
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
), ),
]; ];
if (codecs[0]) { if (codecs[0]) {
@ -1096,6 +1125,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
text: 'H264', text: 'H264',
value: 'h264', value: 'h264',
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
)); ));
} }
if (codecs[1]) { if (codecs[1]) {
@ -1103,6 +1133,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
text: 'H265', text: 'H265',
value: 'h265', value: 'h265',
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
)); ));
} }
return list; return list;
@ -1119,6 +1150,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
}, },
padding: padding, padding: padding,
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
)); ));
} }
} }
@ -1141,6 +1173,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
}, },
padding: padding, padding: padding,
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
); );
}()); }());
} }
@ -1163,6 +1196,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
}, },
padding: padding, padding: padding,
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
); );
}()); }());
} }
@ -1182,6 +1216,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
}, },
padding: padding, padding: padding,
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
)); ));
final perms = widget.ffi.ffiModel.permissions; final perms = widget.ffi.ffiModel.permissions;
@ -1219,6 +1254,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
}, },
padding: padding, padding: padding,
dismissOnClicked: true, dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
)); ));
} }
} }
@ -1290,6 +1326,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
onPressed: () { onPressed: () {
if (Navigator.canPop(context)) { if (Navigator.canPop(context)) {
Navigator.pop(context); Navigator.pop(context);
_menuDismissCallback();
} }
showKBLayoutTypeChooser( showKBLayoutTypeChooser(
localPlatform, widget.ffi.dialogManager); localPlatform, widget.ffi.dialogManager);
@ -1302,6 +1339,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
proc: () {}, proc: () {},
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
dismissOnClicked: false, dismissOnClicked: false,
dismissCallback: _menuDismissCallback,
), ),
); );
} }
@ -1321,6 +1359,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
}, },
padding: padding, padding: padding,
dismissOnClicked: dismissOnClicked, dismissOnClicked: dismissOnClicked,
dismissCallback: _menuDismissCallback,
); );
} }
} }