Skip to content

Commit df05034

Browse files
Merge pull request #1425 from QueryaHub/issue/1335-action-menu-to-menu-button
refactor(ui): menus on QueryaMenuButton, Execute as a QueryaSplitButton
2 parents 3c204b0 + 6368dd5 commit df05034

8 files changed

Lines changed: 62 additions & 223 deletions

File tree

‎lib/features/erd/widgets/erd_export_menu.dart‎

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import 'package:flutter/material.dart' as material;
2-
import 'package:querya_desktop/core/theme/querya_theme_scope.dart';
3-
import 'package:querya_desktop/shared/widgets/querya_action_menu.dart';
4-
import 'package:shadcn_flutter/shadcn_flutter.dart';
2+
import 'package:querya_desktop/shared/widgets/querya_action_menu.dart'
3+
show QueryaActionMenuItem;
4+
import 'package:querya_desktop/shared/widgets/querya_menu_button.dart';
55

66
/// Entries of the diagram's Export menu.
77
enum ErdExportAction {
@@ -24,8 +24,8 @@ class ErdExportMenu extends material.StatelessWidget {
2424

2525
@override
2626
material.Widget build(material.BuildContext context) {
27-
final wb = context.workbench;
28-
return QueryaActionMenu<ErdExportAction>(
27+
return QueryaMenuButton<ErdExportAction>(
28+
key: const material.ValueKey('erd_export'),
2929
items: const [
3030
QueryaActionMenuItem(
3131
value: ErdExportAction.toggleTheme,
@@ -74,23 +74,8 @@ class ErdExportMenu extends material.StatelessWidget {
7474
),
7575
],
7676
onSelected: onSelected,
77-
child: material.Padding(
78-
key: const material.ValueKey('erd_export'),
79-
padding:
80-
const material.EdgeInsets.symmetric(horizontal: 10, vertical: 6),
81-
child: material.Row(
82-
mainAxisSize: material.MainAxisSize.min,
83-
children: [
84-
material.Icon(material.Icons.file_download_outlined,
85-
size: 16, color: wb.mutedForeground),
86-
const material.SizedBox(width: 6),
87-
const Text('Export'),
88-
const material.SizedBox(width: 4),
89-
material.Icon(material.Icons.expand_more_rounded,
90-
size: 16, color: wb.mutedForeground),
91-
],
92-
),
93-
),
77+
label: 'Export',
78+
icon: material.Icons.file_download_outlined,
9479
);
9580
}
9681
}

‎lib/features/erd/widgets/erd_views_menu.dart‎

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import 'package:flutter/material.dart' as material;
22
import 'package:querya_desktop/core/erd/erd_saved_layout.dart';
3-
import 'package:querya_desktop/core/theme/querya_theme_scope.dart';
4-
import 'package:querya_desktop/shared/widgets/querya_action_menu.dart';
5-
import 'package:shadcn_flutter/shadcn_flutter.dart';
3+
import 'package:querya_desktop/shared/widgets/querya_action_menu.dart'
4+
show QueryaActionMenuItem;
5+
import 'package:querya_desktop/shared/widgets/querya_menu_button.dart';
66

77
/// The toolbar's view switcher: All tables, the saved views, and the
88
/// commands to save, rename and delete one.
@@ -34,9 +34,9 @@ class ErdViewsMenu extends material.StatelessWidget {
3434

3535
@override
3636
material.Widget build(material.BuildContext context) {
37-
final wb = context.workbench;
3837
final current = active;
39-
return QueryaActionMenu<String>(
38+
return QueryaMenuButton<String>(
39+
key: const material.ValueKey('erd_views'),
4040
items: [
4141
// A mark on every row, so the labels line up.
4242
QueryaActionMenuItem(
@@ -86,23 +86,8 @@ class ErdViewsMenu extends material.StatelessWidget {
8686
if (v.startsWith('view:')) onSwitch(v.substring(5));
8787
}
8888
},
89-
child: material.Padding(
90-
key: const material.ValueKey('erd_views'),
91-
padding:
92-
const material.EdgeInsets.symmetric(horizontal: 10, vertical: 6),
93-
child: material.Row(
94-
mainAxisSize: material.MainAxisSize.min,
95-
children: [
96-
material.Icon(material.Icons.bookmarks_outlined,
97-
size: 16, color: wb.mutedForeground),
98-
const material.SizedBox(width: 6),
99-
Text(current == null ? 'All tables' : shortName(current.name)),
100-
const material.SizedBox(width: 4),
101-
material.Icon(material.Icons.expand_more_rounded,
102-
size: 16, color: wb.mutedForeground),
103-
],
104-
),
105-
),
89+
label: current == null ? 'All tables' : shortName(current.name),
90+
icon: material.Icons.bookmarks_outlined,
10691
);
10792
}
10893
}

‎lib/features/results/charts/quick_chart_view.dart‎

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ import 'package:querya_desktop/core/storage/app_settings.dart';
1313
import 'package:querya_desktop/features/results/charts/chart_data.dart';
1414
import 'package:querya_desktop/features/results/charts/chart_format.dart';
1515
import 'package:querya_desktop/features/results/charts/chart_svg.dart';
16-
import 'package:querya_desktop/shared/widgets/querya_action_menu.dart';
1716
import 'package:querya_desktop/shared/widgets/widgets.dart';
17+
import 'package:querya_desktop/core/ui/querya_control_tokens.dart';
1818

1919
/// Formats of the chart export menu.
2020
enum _ChartExport { png, svg, toggleTheme }
@@ -379,7 +379,8 @@ class _QuickChartViewState extends material.State<QuickChartView> {
379379
),
380380
const material.SizedBox(width: 8),
381381
],
382-
QueryaActionMenu<_ChartExport>(
382+
QueryaMenuButton<_ChartExport>(
383+
key: const material.ValueKey('chart_export'),
383384
items: const [
384385
QueryaActionMenuItem(
385386
value: _ChartExport.png,
@@ -406,22 +407,10 @@ class _QuickChartViewState extends material.State<QuickChartView> {
406407
_exportSvg();
407408
}
408409
},
409-
child: material.Padding(
410-
key: const material.ValueKey('chart_export'),
411-
padding: const material.EdgeInsets.symmetric(
412-
horizontal: 8, vertical: 4),
413-
child: material.Row(
414-
mainAxisSize: material.MainAxisSize.min,
415-
children: [
416-
material.Icon(material.Icons.file_download_outlined,
417-
size: 16, color: wb.mutedForeground),
418-
const material.SizedBox(width: 4),
419-
const Text('Export'),
420-
material.Icon(material.Icons.expand_more_rounded,
421-
size: 16, color: wb.mutedForeground),
422-
],
423-
),
424-
),
410+
label: 'Export',
411+
icon: material.Icons.file_download_outlined,
412+
variant: QueryaButtonVariant.ghost,
413+
size: QueryaControlSize.sm,
425414
),
426415
],
427416
),

‎lib/features/workspace/sql_workspace_toolbar.dart‎

Lines changed: 13 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import 'package:querya_desktop/features/settings/preferences_dialog.dart';
55
import 'package:querya_desktop/features/settings/sql_statement_timeout_dropdown.dart';
66
import 'package:querya_desktop/features/workspace/sql_execution_delegate.dart';
77
import 'package:querya_desktop/features/workspace/sql_query_tab_session.dart';
8-
import 'package:querya_desktop/shared/widgets/querya_action_menu.dart';
98
import 'package:querya_desktop/shared/widgets/widgets.dart';
109

1110
/// Choices for the session options dropdown.
@@ -147,7 +146,6 @@ class SqlWorkspaceToolbar extends StatelessWidget {
147146

148147
@override
149148
material.Widget build(material.BuildContext context) {
150-
final accent = context.workbench.accent;
151149
return material.LayoutBuilder(
152150
builder: (context, constraints) {
153151
final compact = constraints.maxWidth < compactWidthBreakpoint;
@@ -159,17 +157,15 @@ class SqlWorkspaceToolbar extends StatelessWidget {
159157
headerBadge!,
160158
const material.SizedBox(width: 12),
161159
],
162-
QueryaActionButton(
163-
key: const material.ValueKey('run_script'),
160+
QueryaSplitButton<bool>(
161+
mainKey: const material.ValueKey('run_script'),
162+
menuKey: const material.ValueKey('run_menu'),
164163
label: 'Execute (F5)',
165164
icon: material.Icons.play_arrow_rounded,
166165
compact: compact,
167166
loading: session.running,
168167
onPressed: () => onExecute(false),
169-
),
170-
const material.SizedBox(width: 4),
171-
QueryaActionMenu<bool>(
172-
key: const material.ValueKey('run_menu'),
168+
menuTooltip: 'Run options',
173169
items: [
174170
QueryaActionMenuItem(
175171
value: true,
@@ -187,10 +183,6 @@ class SqlWorkspaceToolbar extends StatelessWidget {
187183
onExecute(atCursor);
188184
}
189185
},
190-
child: const material.Icon(
191-
material.Icons.expand_more_rounded,
192-
size: 16,
193-
),
194186
),
195187
if (delegate.supportsExplain) ...[
196188
const material.SizedBox(width: 8),
@@ -267,44 +259,15 @@ class SqlWorkspaceToolbar extends StatelessWidget {
267259
],
268260
const material.SizedBox(width: 8),
269261
],
270-
material.IgnorePointer(
271-
ignoring: session.running,
272-
child: material.Opacity(
273-
opacity: session.running ? 0.5 : 1,
274-
child: QueryaActionMenu<SqlWorkspaceSessionChoice>(
275-
key: const material.ValueKey('session_menu'),
276-
items: _sessionMenuItems(),
277-
onSelected: (choice) => _onSessionChoice(context, choice),
278-
child: material.Padding(
279-
padding: const material.EdgeInsets.symmetric(
280-
horizontal: 10,
281-
vertical: 6,
282-
),
283-
child: material.Row(
284-
mainAxisSize: material.MainAxisSize.min,
285-
children: [
286-
material.Icon(
287-
material.Icons.tune_rounded,
288-
size: 16,
289-
color: accent,
290-
),
291-
const material.SizedBox(width: 6),
292-
if (!compact) ...[
293-
Text(autocommit
294-
? 'Session · auto-commit'
295-
: 'Session · manual'),
296-
const material.SizedBox(width: 4),
297-
],
298-
material.Icon(
299-
material.Icons.expand_more_rounded,
300-
size: 16,
301-
color: accent,
302-
),
303-
],
304-
),
305-
),
306-
),
307-
),
262+
QueryaMenuButton<SqlWorkspaceSessionChoice>(
263+
key: const material.ValueKey('session_menu'),
264+
items: _sessionMenuItems(),
265+
onSelected: (choice) => _onSessionChoice(context, choice),
266+
enabled: !session.running,
267+
icon: material.Icons.tune_rounded,
268+
label: compact
269+
? null
270+
: (autocommit ? 'Session · auto-commit' : 'Session · manual'),
308271
),
309272
if (extraTrailing != null) ...[
310273
const material.SizedBox(width: 8),

‎lib/shared/widgets/export_menu_button.dart‎

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
import 'package:flutter/material.dart' as material;
2+
import 'package:querya_desktop/core/ui/querya_control_tokens.dart';
23
import 'package:querya_desktop/shared/services/data_export_service.dart';
3-
import 'package:querya_desktop/shared/widgets/querya_action_menu.dart';
4-
import 'package:shadcn_flutter/shadcn_flutter.dart';
4+
import 'package:querya_desktop/shared/widgets/querya_action_menu.dart'
5+
show QueryaActionMenuItem;
6+
import 'package:querya_desktop/shared/widgets/querya_menu_button.dart';
57

6-
class ExportMenuButton extends StatelessWidget {
8+
/// The Export / Copy menu of result and table toolbars: CSV, JSON, Markdown
9+
/// and SQL dump, saved to a file or copied ([isSave]).
10+
class ExportMenuButton extends material.StatelessWidget {
711
const ExportMenuButton({
812
super.key,
913
required this.label,
@@ -18,8 +22,11 @@ class ExportMenuButton extends StatelessWidget {
1822
final bool isSave;
1923

2024
@override
21-
Widget build(BuildContext context) {
22-
return QueryaActionMenu<DataExportFormat>(
25+
material.Widget build(material.BuildContext context) {
26+
return QueryaMenuButton<DataExportFormat>(
27+
label: label,
28+
icon: icon,
29+
size: QueryaControlSize.sm,
2330
onSelected: onSelected,
2431
items: [
2532
QueryaActionMenuItem(
@@ -43,14 +50,6 @@ class ExportMenuButton extends StatelessWidget {
4350
label: isSave ? 'SQL INSERT Dump (.sql)' : 'Copy as SQL Dump',
4451
),
4552
],
46-
child: material.Row(
47-
mainAxisSize: material.MainAxisSize.min,
48-
children: [
49-
material.Icon(icon, size: 14),
50-
const material.SizedBox(width: 6),
51-
Text(label),
52-
],
53-
),
5453
);
5554
}
5655
}

0 commit comments

Comments
 (0)