refactor remote menu
Signed-off-by: fufesou <shuanglongchen@yeah.net>
This commit is contained in:
parent
182f0510fc
commit
74dc2b2538
@ -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,
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user