From 76dacea54b17e72e9514c9974863dc9e67da97a4 Mon Sep 17 00:00:00 2001 From: 21pages Date: Sun, 1 Nov 2026 21:36:33 +0800 Subject: [PATCH] fix: align request approval menu layout and icons --- flutter/lib/common/widgets/peer_card.dart | 4 ++ .../common/widgets/request_approval_menu.dart | 28 +++--------- .../lib/desktop/pages/connection_page.dart | 1 + flutter/lib/desktop/widgets/popup_menu.dart | 44 +++++++++++++------ 4 files changed, 42 insertions(+), 35 deletions(-) diff --git a/flutter/lib/common/widgets/peer_card.dart b/flutter/lib/common/widgets/peer_card.dart index 868eb1c5f..4a15e3837 100644 --- a/flutter/lib/common/widgets/peer_card.dart +++ b/flutter/lib/common/widgets/peer_card.dart @@ -751,6 +751,10 @@ abstract class BasePeerCard extends StatelessWidget { child: IconButton( icon: const Icon(Icons.edit), padding: EdgeInsets.zero, + constraints: const BoxConstraints( + minWidth: kMinInteractiveDimension - 8, + minHeight: kMinInteractiveDimension, + ), onPressed: () { if (Navigator.canPop(context)) { Navigator.pop(context); diff --git a/flutter/lib/common/widgets/request_approval_menu.dart b/flutter/lib/common/widgets/request_approval_menu.dart index 1049e5363..2b6ee8bad 100644 --- a/flutter/lib/common/widgets/request_approval_menu.dart +++ b/flutter/lib/common/widgets/request_approval_menu.dart @@ -7,27 +7,18 @@ class RequestApprovalMenu extends MenuEntryBase { final String title; final List> entries; final EdgeInsets? padding; + final double arrowScale; RequestApprovalMenu( - {required this.title, required this.entries, this.padding}); + {required this.title, + required this.entries, + this.padding, + this.arrowScale = 1.0}); @override List> build( BuildContext context, MenuConfig conf) { final theme = Theme.of(context); - final buttonPadding = - (TextButtonTheme.of(context).style?.padding?.resolve({}) ?? - ButtonStyleButton.scaledPadding( - theme.useMaterial3 - ? const EdgeInsets.symmetric(horizontal: 12, vertical: 8) - : const EdgeInsets.all(8), - const EdgeInsets.symmetric(horizontal: 8), - const EdgeInsets.symmetric(horizontal: 4), - MediaQuery.textScalerOf(context) - .scale(theme.textTheme.labelLarge?.fontSize ?? 14) / - 14, - )) - .resolve(Directionality.of(context)); final checkboxTheme = CheckboxTheme.of(context); final checkboxWidth = ((checkboxTheme.materialTapTargetSize ?? theme.materialTapTargetSize) == @@ -41,14 +32,9 @@ class RequestApprovalMenu extends MenuEntryBase { return MenuEntrySubMenu( text: title, dismissParentOnCanceled: true, - // Normal entries contain two TextButtons; the submenu adds a leading gap. + arrowScale: arrowScale, padding: (padding ?? EdgeInsets.zero) - .add(EdgeInsets.only( - left: buttonPadding.left * 2, - right: buttonPadding.right * 2 + arrowInset)) - .subtract( - const EdgeInsetsDirectional.only(start: MenuConfig.midPadding)) - .resolve(Directionality.of(context)), + .copyWith(right: (padding?.right ?? 0) + arrowInset), entries: entries .map((entry) => MenuEntryButton( childBuilder: entry.childBuilder, diff --git a/flutter/lib/desktop/pages/connection_page.dart b/flutter/lib/desktop/pages/connection_page.dart index f3b516124..f484697ca 100644 --- a/flutter/lib/desktop/pages/connection_page.dart +++ b/flutter/lib/desktop/pages/connection_page.dart @@ -362,6 +362,7 @@ class _ConnectionPageState extends State return RequestApprovalMenu( title: translate('Request approval'), padding: EdgeInsets.symmetric(horizontal: kDesktopMenuPadding.left), + arrowScale: MenuConfig.iconScale, entries: [ action('Connect'), action('Transfer file', isFileTransfer: true), diff --git a/flutter/lib/desktop/widgets/popup_menu.dart b/flutter/lib/desktop/widgets/popup_menu.dart index d2a948d8c..04ecd5394 100644 --- a/flutter/lib/desktop/widgets/popup_menu.dart +++ b/flutter/lib/desktop/widgets/popup_menu.dart @@ -16,6 +16,7 @@ class PopupMenuChildrenItem extends mod_menu.PopupMenuEntry { this.textStyle, this.onTap, this.dismissParentOnCanceled = false, + this.useButtonLayout = false, this.position = mod_menu.PopupMenuPosition.overSide, this.offset = Offset.zero, required this.itemBuilder, @@ -29,6 +30,7 @@ class PopupMenuChildrenItem extends mod_menu.PopupMenuEntry { final RxBool? enabled; final void Function()? onTap; final bool dismissParentOnCanceled; + final bool useButtonLayout; final List> Function(BuildContext) itemBuilder; final Widget child; @@ -80,18 +82,30 @@ class MyPopupMenuItemState> : null, itemBuilder: widget.itemBuilder, padding: EdgeInsets.zero, - child: AnimatedDefaultTextStyle( - style: style, - duration: kThemeChangeDuration, - child: Container( - alignment: AlignmentDirectional.centerStart, - constraints: BoxConstraints( - minHeight: widget.height, maxHeight: widget.height), - padding: - widget.padding ?? const EdgeInsets.symmetric(horizontal: 16), - child: widget.child, - ), - ), + child: Builder(builder: (context) { + final child = AnimatedDefaultTextStyle( + style: style, + duration: kThemeChangeDuration, + child: Container( + alignment: AlignmentDirectional.centerStart, + constraints: BoxConstraints( + minHeight: widget.height, maxHeight: widget.height), + padding: widget.padding ?? + const EdgeInsets.symmetric(horizontal: 16), + child: widget.child, + ), + ); + if (!widget.useButtonLayout) return child; + final onPressed = enabled.value + ? () => context + .findAncestorStateOfType>() + ?.showButtonMenu() + : null; + return TextButton( + onPressed: onPressed, + child: TextButton(onPressed: onPressed, child: child), + ); + }), )); } } @@ -655,12 +669,14 @@ class MenuEntrySubMenu extends MenuEntryBase { final List> entries; final EdgeInsets? padding; final bool dismissParentOnCanceled; + final double arrowScale; MenuEntrySubMenu({ required this.text, required this.entries, this.padding, this.dismissParentOnCanceled = false, + this.arrowScale = MenuConfig.iconScale, RxBool? enabled, }) : super(enabled: enabled); @@ -674,13 +690,13 @@ class MenuEntrySubMenu extends MenuEntryBase { height: conf.height, padding: padding, dismissParentOnCanceled: dismissParentOnCanceled, + useButtonLayout: true, position: mod_menu.PopupMenuPosition.overSide, itemBuilder: (BuildContext context) => entries .map((entry) => entry.build(context, conf)) .expand((i) => i) .toList(), child: Row(children: [ - const SizedBox(width: MenuConfig.midPadding), Obx(() => Text( text, style: super.enabled!.value @@ -691,7 +707,7 @@ class MenuEntrySubMenu extends MenuEntryBase { child: Align( alignment: Alignment.centerRight, child: Transform.scale( - scale: MenuConfig.iconScale, + scale: arrowScale, child: Obx(() => Icon( Icons.keyboard_arrow_right, color: super.enabled!.value