refactor remote menu

Signed-off-by: fufesou <shuanglongchen@yeah.net>
This commit is contained in:
fufesou 2023-02-06 11:27:20 +08:00
parent 182f0510fc
commit 74dc2b2538
2 changed files with 207 additions and 164 deletions

View File

@ -243,96 +243,35 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
padding: padding, padding: padding,
), ),
MenuEntryDivider<String>(), MenuEntryDivider<String>(),
MenuEntryRadios<String>( RemoteMenuEntry.viewStyle(
text: translate('Ratio'), key,
optionsGetter: () => [ ffi,
MenuEntryRadioOption( padding,
text: translate('Scale original'), dismissFunc: cancelFunc,
value: kRemoteViewStyleOriginal,
dismissOnClicked: true,
),
MenuEntryRadioOption(
text: translate('Scale adaptive'),
value: kRemoteViewStyleAdaptive,
dismissOnClicked: true,
),
],
curOptionGetter: () async =>
// null means peer id is not found, which there's no need to care about
await bind.sessionGetViewStyle(id: key) ?? '',
optionSetter: (String oldValue, String newValue) async {
await bind.sessionSetViewStyle(id: key, value: newValue);
ffi.canvasModel.updateViewStyle();
cancelFunc();
},
padding: padding,
), ),
]); ]);
if (!ffi.canvasModel.cursorEmbedded) { if (!ffi.canvasModel.cursorEmbedded) {
menu.add(MenuEntryDivider<String>()); menu.add(MenuEntryDivider<String>());
menu.add(() { menu.add(RemoteMenuEntry.showRemoteCursor(
final state = ShowRemoteCursorState.find(key); key,
final optKey = 'show-remote-cursor'; padding,
return MenuEntrySwitch2<String>( dismissFunc: cancelFunc,
switchType: SwitchType.scheckbox, ));
text: translate('Show remote cursor'),
getter: () {
return state;
},
setter: (bool v) async {
await bind.sessionToggleOption(id: key, value: optKey);
state.value = bind.sessionGetToggleOptionSync(id: key, arg: optKey);
cancelFunc();
},
padding: padding,
);
}());
} }
if (perms['keyboard'] != false) { if (perms['keyboard'] != false) {
if (perms['clipboard'] != false) { if (perms['clipboard'] != false) {
menu.add(MenuEntrySwitch<String>( menu.add(RemoteMenuEntry.disableClipboard(key, padding,
switchType: SwitchType.scheckbox, dismissFunc: cancelFunc));
text: translate('Disable clipboard'),
getter: () async {
return bind.sessionGetToggleOptionSync(
id: key, arg: 'disable-clipboard');
},
setter: (bool v) async {
await bind.sessionToggleOption(id: key, value: 'disable-clipboard');
cancelFunc();
},
padding: padding,
));
} }
menu.add(MenuEntryButton<String>( menu.add(
childBuilder: (TextStyle? style) => Text( RemoteMenuEntry.insertLock(key, padding, dismissFunc: cancelFunc));
translate('Insert Lock'),
style: style,
),
proc: () {
bind.sessionLockScreen(id: key);
cancelFunc();
},
padding: padding,
dismissOnClicked: true,
));
if (pi.platform == kPeerPlatformLinux || pi.sasEnabled) { if (pi.platform == kPeerPlatformLinux || pi.sasEnabled) {
menu.add(MenuEntryButton<String>( menu.add(RemoteMenuEntry.insertCtrlAltDel(key, padding,
childBuilder: (TextStyle? style) => Text( dismissFunc: cancelFunc));
'${translate("Insert")} Ctrl + Alt + Del',
style: style,
),
proc: () {
bind.sessionCtrlAltDel(id: key);
cancelFunc();
},
padding: padding,
dismissOnClicked: true,
));
} }
} }

View File

@ -99,6 +99,175 @@ class _MenubarTheme {
static const double dividerHeight = 12.0; static const double dividerHeight = 12.0;
} }
typedef DismissFunc = void Function();
class RemoteMenuEntry {
static MenuEntryRadios<String> viewStyle(
String remoteId,
FFI ffi,
EdgeInsets padding, {
DismissFunc? dismissFunc,
DismissCallback? dismissCallback,
RxString? rxViewStyle,
}) {
return MenuEntryRadios<String>(
text: translate('Ratio'),
optionsGetter: () => [
MenuEntryRadioOption(
text: translate('Scale original'),
value: kRemoteViewStyleOriginal,
dismissOnClicked: true,
dismissCallback: dismissCallback,
),
MenuEntryRadioOption(
text: translate('Scale adaptive'),
value: kRemoteViewStyleAdaptive,
dismissOnClicked: true,
dismissCallback: dismissCallback,
),
],
curOptionGetter: () async {
// null means peer id is not found, which there's no need to care about
final viewStyle = await bind.sessionGetViewStyle(id: remoteId) ?? '';
if (rxViewStyle != null) {
rxViewStyle.value = viewStyle;
}
return viewStyle;
},
optionSetter: (String oldValue, String newValue) async {
await bind.sessionSetViewStyle(id: remoteId, value: newValue);
if (rxViewStyle != null) {
rxViewStyle.value = newValue;
}
ffi.canvasModel.updateViewStyle();
if (dismissFunc != null) {
dismissFunc();
}
},
padding: padding,
dismissOnClicked: true,
dismissCallback: dismissCallback,
);
}
static MenuEntrySwitch2<String> showRemoteCursor(
String remoteId,
EdgeInsets padding, {
DismissFunc? dismissFunc,
DismissCallback? dismissCallback,
}) {
final state = ShowRemoteCursorState.find(remoteId);
final optKey = 'show-remote-cursor';
return MenuEntrySwitch2<String>(
switchType: SwitchType.scheckbox,
text: translate('Show remote cursor'),
getter: () {
return state;
},
setter: (bool v) async {
await bind.sessionToggleOption(id: remoteId, value: optKey);
state.value =
bind.sessionGetToggleOptionSync(id: remoteId, arg: optKey);
if (dismissFunc != null) {
dismissFunc();
}
},
padding: padding,
dismissOnClicked: true,
dismissCallback: dismissCallback,
);
}
static MenuEntrySwitch<String> disableClipboard(
String remoteId,
EdgeInsets? padding, {
DismissFunc? dismissFunc,
DismissCallback? dismissCallback,
}) {
return createSwitchMenuEntry(
remoteId,
'Disable clipboard',
'disable-clipboard',
padding,
true,
dismissCallback: dismissCallback,
);
}
static MenuEntrySwitch<String> createSwitchMenuEntry(
String remoteId,
String text,
String option,
EdgeInsets? padding,
bool dismissOnClicked, {
DismissFunc? dismissFunc,
DismissCallback? dismissCallback,
}) {
return MenuEntrySwitch<String>(
switchType: SwitchType.scheckbox,
text: translate(text),
getter: () async {
return bind.sessionGetToggleOptionSync(id: remoteId, arg: option);
},
setter: (bool v) async {
await bind.sessionToggleOption(id: remoteId, value: option);
if (dismissFunc != null) {
dismissFunc();
}
},
padding: padding,
dismissOnClicked: dismissOnClicked,
dismissCallback: dismissCallback,
);
}
static MenuEntryButton<String> insertLock(
String remoteId,
EdgeInsets? padding, {
DismissFunc? dismissFunc,
DismissCallback? dismissCallback,
}) {
return MenuEntryButton<String>(
childBuilder: (TextStyle? style) => Text(
translate('Insert Lock'),
style: style,
),
proc: () {
bind.sessionLockScreen(id: remoteId);
if (dismissFunc != null) {
dismissFunc();
}
},
padding: padding,
dismissOnClicked: true,
dismissCallback: dismissCallback,
);
}
static insertCtrlAltDel(
String remoteId,
EdgeInsets? padding, {
DismissFunc? dismissFunc,
DismissCallback? dismissCallback,
}) {
return MenuEntryButton<String>(
childBuilder: (TextStyle? style) => Text(
'${translate("Insert")} Ctrl + Alt + Del',
style: style,
),
proc: () {
bind.sessionCtrlAltDel(id: remoteId);
if (dismissFunc != null) {
dismissFunc();
}
},
padding: padding,
dismissOnClicked: true,
dismissCallback: dismissCallback,
);
}
}
class RemoteMenubar extends StatefulWidget { class RemoteMenubar extends StatefulWidget {
final String id; final String id;
final FFI ffi; final FFI ffi;
@ -616,18 +785,8 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
displayMenu.add(MenuEntryDivider()); displayMenu.add(MenuEntryDivider());
if (perms['keyboard'] != false) { if (perms['keyboard'] != false) {
if (pi.platform == kPeerPlatformLinux || pi.sasEnabled) { if (pi.platform == kPeerPlatformLinux || pi.sasEnabled) {
displayMenu.add(MenuEntryButton<String>( displayMenu.add(RemoteMenuEntry.insertCtrlAltDel(widget.id, padding,
childBuilder: (TextStyle? style) => Text( dismissCallback: _menuDismissCallback));
'${translate("Insert")} Ctrl + Alt + Del',
style: style,
),
proc: () {
bind.sessionCtrlAltDel(id: widget.id);
},
padding: padding,
dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
));
} }
} }
if (perms['restart'] != false && if (perms['restart'] != false &&
@ -649,18 +808,8 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
} }
if (perms['keyboard'] != false) { if (perms['keyboard'] != false) {
displayMenu.add(MenuEntryButton<String>( displayMenu.add(RemoteMenuEntry.insertLock(widget.id, padding,
childBuilder: (TextStyle? style) => Text( dismissCallback: _menuDismissCallback));
translate('Insert Lock'),
style: style,
),
proc: () {
bind.sessionLockScreen(id: widget.id);
},
padding: padding,
dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
));
if (pi.platform == kPeerPlatformWindows) { if (pi.platform == kPeerPlatformWindows) {
displayMenu.add(MenuEntryButton<String>( displayMenu.add(MenuEntryButton<String>(
@ -770,36 +919,12 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
const EdgeInsets padding = EdgeInsets.only(left: 18.0, right: 8.0); const EdgeInsets padding = EdgeInsets.only(left: 18.0, right: 8.0);
final peer_version = widget.ffi.ffiModel.pi.version; final peer_version = widget.ffi.ffiModel.pi.version;
final displayMenu = [ final displayMenu = [
MenuEntryRadios<String>( RemoteMenuEntry.viewStyle(
text: translate('Ratio'), widget.id,
optionsGetter: () => [ widget.ffi,
MenuEntryRadioOption( padding,
text: translate('Scale original'),
value: kRemoteViewStyleOriginal,
dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
),
MenuEntryRadioOption(
text: translate('Scale adaptive'),
value: kRemoteViewStyleAdaptive,
dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
),
],
curOptionGetter: () async {
// null means peer id is not found, which there's no need to care about
final viewStyle = await bind.sessionGetViewStyle(id: widget.id) ?? '';
widget.state.viewStyle.value = viewStyle;
return viewStyle;
},
optionSetter: (String oldValue, String newValue) async {
await bind.sessionSetViewStyle(id: widget.id, value: newValue);
widget.state.viewStyle.value = newValue;
widget.ffi.canvasModel.updateViewStyle();
},
padding: padding,
dismissOnClicked: true,
dismissCallback: _menuDismissCallback, dismissCallback: _menuDismissCallback,
rxViewStyle: widget.state.viewStyle,
), ),
MenuEntryDivider<String>(), MenuEntryDivider<String>(),
MenuEntryRadios<String>( MenuEntryRadios<String>(
@ -1158,25 +1283,11 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
/// Show remote cursor /// Show remote cursor
if (!widget.ffi.canvasModel.cursorEmbedded) { if (!widget.ffi.canvasModel.cursorEmbedded) {
displayMenu.add(() { displayMenu.add(RemoteMenuEntry.showRemoteCursor(
final state = ShowRemoteCursorState.find(widget.id); widget.id,
final optKey = 'show-remote-cursor'; padding,
return MenuEntrySwitch2<String>( dismissCallback: _menuDismissCallback,
switchType: SwitchType.scheckbox, ));
text: translate('Show remote cursor'),
getter: () {
return state;
},
setter: (bool v) async {
await bind.sessionToggleOption(id: widget.id, value: optKey);
state.value =
bind.sessionGetToggleOptionSync(id: widget.id, arg: optKey);
},
padding: padding,
dismissOnClicked: true,
dismissCallback: _menuDismissCallback,
);
}());
} }
/// Show remote cursor scaling with image /// Show remote cursor scaling with image
@ -1237,8 +1348,11 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
if (perms['keyboard'] != false) { if (perms['keyboard'] != false) {
if (perms['clipboard'] != false) { if (perms['clipboard'] != false) {
displayMenu.add(_createSwitchMenuEntry( displayMenu.add(RemoteMenuEntry.disableClipboard(
'Disable clipboard', 'disable-clipboard', padding, true)); widget.id,
padding,
dismissCallback: _menuDismissCallback,
));
} }
displayMenu.add(_createSwitchMenuEntry( displayMenu.add(_createSwitchMenuEntry(
'Lock after session end', 'lock-after-session-end', padding, true)); 'Lock after session end', 'lock-after-session-end', padding, true));
@ -1349,19 +1463,9 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
MenuEntrySwitch<String> _createSwitchMenuEntry( MenuEntrySwitch<String> _createSwitchMenuEntry(
String text, String option, EdgeInsets? padding, bool dismissOnClicked) { String text, String option, EdgeInsets? padding, bool dismissOnClicked) {
return MenuEntrySwitch<String>( return RemoteMenuEntry.createSwitchMenuEntry(
switchType: SwitchType.scheckbox, widget.id, text, option, padding, dismissOnClicked,
text: translate(text), dismissCallback: _menuDismissCallback);
getter: () async {
return bind.sessionGetToggleOptionSync(id: widget.id, arg: option);
},
setter: (bool v) async {
await bind.sessionToggleOption(id: widget.id, value: option);
},
padding: padding,
dismissOnClicked: dismissOnClicked,
dismissCallback: _menuDismissCallback,
);
} }
} }