refactor: unify request approval menus and naming

This commit is contained in:
21pages committed 2026-11-01 15:45:13 +08:00
1 parent 417dcdf7bb
commit c43443b1a1
67 files changed
+535 -559

No files matched your search

+38 -6
View File
@@ -18,6 +18,7 @@ import '../../common.dart';
import '../../common/formatter/id_formatter.dart';
import '../../common/widgets/peer_tab_page.dart';
import '../../common/widgets/autocomplete.dart';
import '../../common/widgets/request_approval_menu.dart';
import '../../models/platform_model.dart';
import '../../desktop/widgets/material_mod_popup_menu.dart' as mod_menu;
@@ -340,6 +341,37 @@ class _ConnectionPageState extends State<ConnectionPage>
isTcpTunneling: isTcpTunneling);
}
RequestApprovalMenu _requestApprovalMenu(BuildContext context) {
MenuEntryButton<String> action(String title,
{bool isFileTransfer = false,
bool isViewCamera = false,
bool isTerminal = false,
bool isTcpTunneling = false}) =>
MenuEntryButton<String>(
childBuilder: (style) => Text(translate(title), style: style),
proc: () => connect(context, _idController.id,
loginMethod: 'request-approval',
isFileTransfer: isFileTransfer,
isViewCamera: isViewCamera,
isTerminal: isTerminal,
isTcpTunneling: isTcpTunneling),
padding: EdgeInsets.symmetric(horizontal: kDesktopMenuPadding.left),
dismissOnClicked: true,
);
return RequestApprovalMenu(
title: translate('Request approval'),
padding: EdgeInsets.symmetric(horizontal: kDesktopMenuPadding.left),
entries: [
action('Connect'),
action('Transfer file', isFileTransfer: true),
action('View camera', isViewCamera: true),
action('${translate('Terminal')} (beta)', isTerminal: true),
if (isDesktop) action('TCP tunneling', isTcpTunneling: true),
],
);
}
/// UI for the remote ID TextField.
/// Search for a peer.
Widget _buildRemoteIDTextField(BuildContext context) {
@@ -558,11 +590,6 @@ class _ConnectionPageState extends State<ConnectionPage>
context: context,
position: RelativeRect.fromLTRB(x, y, x, y),
items: [
(
'Connect without password',
() => connect(context, _idController.id,
loginMethod: 'consent')
),
(
'Transfer file',
() => onConnect(isFileTransfer: true)
@@ -584,7 +611,8 @@ class _ConnectionPageState extends State<ConnectionPage>
() => onConnect(isTcpTunneling: true)
),
]
.map((e) => MenuEntryButton<String>(
.map<MenuEntryBase<String>>(
(e) => MenuEntryButton<String>(
childBuilder: (TextStyle? style) =>
Text(
translate(e.$1),
@@ -596,6 +624,10 @@ class _ConnectionPageState extends State<ConnectionPage>
kDesktopMenuPadding.left),
dismissOnClicked: true,
))
.followedBy([
MenuEntryDivider<String>(),
_requestApprovalMenu(context),
])
.map((e) => e.build(
context,
const MenuConfig(
+21 -4
View File
@@ -15,6 +15,7 @@ class PopupMenuChildrenItem<T> extends mod_menu.PopupMenuEntry<T> {
this.enabled,
this.textStyle,
this.onTap,
this.dismissParentOnCanceled = false,
this.position = mod_menu.PopupMenuPosition.overSide,
this.offset = Offset.zero,
required this.itemBuilder,
@@ -27,6 +28,7 @@ class PopupMenuChildrenItem<T> extends mod_menu.PopupMenuEntry<T> {
final EdgeInsets? padding;
final RxBool? enabled;
final void Function()? onTap;
final bool dismissParentOnCanceled;
final List<mod_menu.PopupMenuEntry<T>> Function(BuildContext) itemBuilder;
final Widget child;
@@ -69,6 +71,13 @@ class MyPopupMenuItemState<T, W extends PopupMenuChildrenItem<T>>
position: widget.position,
offset: widget.offset,
onSelected: handleTap,
onCanceled: widget.dismissParentOnCanceled
? () {
if (ModalRoute.of(context)?.isCurrent == true) {
Navigator.pop(context);
}
}
: null,
itemBuilder: widget.itemBuilder,
padding: EdgeInsets.zero,
child: AnimatedDefaultTextStyle(
@@ -645,11 +654,13 @@ class MenuEntrySubMenu<T> extends MenuEntryBase<T> {
final String text;
final List<MenuEntryBase<T>> entries;
final EdgeInsets? padding;
final bool dismissParentOnCanceled;
MenuEntrySubMenu({
required this.text,
required this.entries,
this.padding,
this.dismissParentOnCanceled = false,
RxBool? enabled,
}) : super(enabled: enabled);
@@ -662,6 +673,7 @@ class MenuEntrySubMenu<T> extends MenuEntryBase<T> {
enabled: super.enabled,
height: conf.height,
padding: padding,
dismissParentOnCanceled: dismissParentOnCanceled,
position: mod_menu.PopupMenuPosition.overSide,
itemBuilder: (BuildContext context) => entries
.map((entry) => entry.build(context, conf))
@@ -678,10 +690,15 @@ class MenuEntrySubMenu<T> extends MenuEntryBase<T> {
Expanded(
child: Align(
alignment: Alignment.centerRight,
child: Obx(() => Icon(
Icons.keyboard_arrow_right,
color: super.enabled!.value ? conf.commonColor : Colors.grey,
)),
child: Transform.scale(
scale: MenuConfig.iconScale,
child: Obx(() => Icon(
Icons.keyboard_arrow_right,
color: super.enabled!.value
? Theme.of(context).unselectedWidgetColor
: disabledStyle().color,
)),
),
))
]),
)