@@ -10,6 +10,7 @@ import '../theme/theme_extensions/menu_theme_extension.dart';
1010import '../theme/theme_extensions/menuitem_theme_extension.dart' ;
1111import '../theme/theme_settings/menuitem_theme_settings.dart' ;
1212import 'menu_evolve.dart' ;
13+ import 'utils/image_utils.dart' ;
1314import 'utils/text_utils.dart' ;
1415
1516class MenuItemImpl <T extends MenuItemSwt , V extends VMenuItem >
@@ -59,6 +60,7 @@ class MenuItemImpl<T extends MenuItemSwt, V extends VMenuItem>
5960 menuTheme: menuTheme,
6061 isEnabled: isEnabled,
6162 text: state.text,
63+ leading: _buildMenuIcon (widgetTheme, isEnabled),
6264 subMenu: state.menu! ,
6365 );
6466 }
@@ -97,10 +99,14 @@ class MenuItemImpl<T extends MenuItemSwt, V extends VMenuItem>
9799 widgetTheme: widgetTheme,
98100 isEnabled: isEnabled,
99101 onTap: isEnabled ? _onCheckPressed : null ,
100- leading: _MenuCheckbox (
102+ leading: _buildToggleLeading (
103+ indicator: _MenuCheckbox (
104+ widgetTheme: widgetTheme,
105+ isEnabled: isEnabled,
106+ isSelected: isChecked,
107+ ),
101108 widgetTheme: widgetTheme,
102109 isEnabled: isEnabled,
103- isSelected: isChecked,
104110 ),
105111 child: Text (stripAccelerators (state.text), style: textStyle),
106112 );
@@ -118,10 +124,14 @@ class MenuItemImpl<T extends MenuItemSwt, V extends VMenuItem>
118124 widgetTheme: widgetTheme,
119125 isEnabled: isEnabled,
120126 onTap: isEnabled ? _onRadioPressed : null ,
121- leading: _MenuRadioButton (
127+ leading: _buildToggleLeading (
128+ indicator: _MenuRadioButton (
129+ widgetTheme: widgetTheme,
130+ isEnabled: isEnabled,
131+ isSelected: isSelected,
132+ ),
122133 widgetTheme: widgetTheme,
123134 isEnabled: isEnabled,
124- isSelected: isSelected,
125135 ),
126136 child: Text (stripAccelerators (state.text), style: textStyle),
127137 );
@@ -154,13 +164,43 @@ class MenuItemImpl<T extends MenuItemSwt, V extends VMenuItem>
154164 notifier.closeMenu ();
155165 }
156166 } : null ,
167+ leading: _buildMenuIcon (widgetTheme, isEnabled),
157168 trailing: acceleratorText.isNotEmpty
158169 ? Text (acceleratorText, style: acceleratorStyle)
159170 : null ,
160171 child: Text (stripAccelerators (capturedState.text), style: textStyle),
161172 );
162173 }
163174
175+ Widget ? _buildMenuIcon (MenuItemThemeExtension widgetTheme, bool isEnabled) {
176+ if (state.image == null ) return null ;
177+ return ImageUtils .buildVImage (
178+ state.image,
179+ size: widgetTheme.iconSize,
180+ color: isEnabled ? widgetTheme.iconColor : widgetTheme.disabledIconColor,
181+ enabled: isEnabled,
182+ useBinaryImage: true ,
183+ renderAsIcon: true ,
184+ );
185+ }
186+
187+ Widget _buildToggleLeading ({
188+ required Widget indicator,
189+ required MenuItemThemeExtension widgetTheme,
190+ required bool isEnabled,
191+ }) {
192+ final icon = _buildMenuIcon (widgetTheme, isEnabled);
193+ if (icon == null ) return indicator;
194+ return Row (
195+ mainAxisSize: MainAxisSize .min,
196+ children: [
197+ indicator,
198+ SizedBox (width: widgetTheme.iconTextSpacing),
199+ icon,
200+ ],
201+ );
202+ }
203+
164204 void _registerRadioCallback (BuildContext context) {
165205 final notifier = MenuChangeNotifier .of (context);
166206 if (notifier != null ) {
@@ -276,13 +316,15 @@ class _CascadeMenuItemRow extends StatefulWidget {
276316 final MenuThemeExtension menuTheme;
277317 final bool isEnabled;
278318 final String ? text;
319+ final Widget ? leading;
279320 final VMenu subMenu;
280321
281322 const _CascadeMenuItemRow ({
282323 required this .widgetTheme,
283324 required this .menuTheme,
284325 required this .isEnabled,
285326 required this .text,
327+ this .leading,
286328 required this .subMenu,
287329 });
288330
@@ -394,6 +436,10 @@ class _CascadeMenuItemRowState extends State<_CascadeMenuItemRow> {
394436 menuChildren: _menuChildren,
395437 child: Row (
396438 children: [
439+ if (widget.leading != null ) ...[
440+ widget.leading! ,
441+ SizedBox (width: widget.widgetTheme.iconTextSpacing),
442+ ],
397443 Expanded (
398444 child: Text (stripAccelerators (widget.text), style: textStyle),
399445 ),
0 commit comments