diff --git a/lib/consts.dart b/lib/consts.dart index 1310bde4..0e125b53 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -65,6 +65,7 @@ const kFormDataButtonLabelTextStyle = TextStyle( fontSize: 12, fontWeight: FontWeight.w600, ); +const kTextStylePopupMenuItem = TextStyle(fontSize: 16); const kBorderRadius4 = BorderRadius.all(Radius.circular(4)); const kBorderRadius8 = BorderRadius.all(Radius.circular(8)); diff --git a/lib/screens/settings_page.dart b/lib/screens/settings_page.dart index 7b4a3bcb..90db09bb 100644 --- a/lib/screens/settings_page.dart +++ b/lib/screens/settings_page.dart @@ -4,7 +4,7 @@ import '../providers/providers.dart'; import '../widgets/widgets.dart'; import '../common/utils.dart'; import '../consts.dart'; -import 'package:apidash/extensions/extensions.dart'; +import '../extensions/extensions.dart'; class SettingsPage extends ConsumerWidget { const SettingsPage({super.key}); @@ -76,27 +76,36 @@ class SettingsPage extends ConsumerWidget { ), borderRadius: kBorderRadius8, ), - child: DropdownButtonHideUnderline( - child: DropdownButton( - borderRadius: kBorderRadius8, - onChanged: (value) { - ref - .read(settingsProvider.notifier) - .update(defaultUriScheme: value); - }, - value: settings.defaultUriScheme, - items: kSupportedUriSchemes - .map>((String value) { - return DropdownMenuItem( - value: value, - child: Padding( - padding: kP10, - child: Text(value), - ), - ); - }).toList(), - ), + child: URIPopupMenu( + value: settings.defaultUriScheme, + onChanged: (value) { + ref + .read(settingsProvider.notifier) + .update(defaultUriScheme: value); + }, + items: kSupportedUriSchemes, ), + // DropdownButtonHideUnderline( + // child: DropdownButton( + // borderRadius: kBorderRadius8, + // onChanged: (value) { + // ref + // .read(settingsProvider.notifier) + // .update(defaultUriScheme: value); + // }, + // value: settings.defaultUriScheme, + // items: kSupportedUriSchemes + // .map>((String value) { + // return DropdownMenuItem( + // value: value, + // child: Padding( + // padding: kP10, + // child: Text(value), + // ), + // ); + // }).toList(), + // ), + // ), ), ), ListTile( @@ -110,26 +119,35 @@ class SettingsPage extends ConsumerWidget { ), borderRadius: kBorderRadius8, ), - child: DropdownButtonHideUnderline( - child: DropdownButton( - borderRadius: kBorderRadius8, - value: settings.defaultCodeGenLang, - onChanged: (value) { - ref - .read(settingsProvider.notifier) - .update(defaultCodeGenLang: value); - }, - items: CodegenLanguage.values.map((value) { - return DropdownMenuItem( - value: value, - child: Padding( - padding: kP10, - child: Text(value.label), - ), - ); - }).toList(), - ), + child: CodegenPopupMenu( + value: settings.defaultCodeGenLang, + onChanged: (value) { + ref + .read(settingsProvider.notifier) + .update(defaultCodeGenLang: value); + }, + items: CodegenLanguage.values, ), + // DropdownButtonHideUnderline( + // child: DropdownButton( + // borderRadius: kBorderRadius8, + // value: settings.defaultCodeGenLang, + // onChanged: (value) { + // ref + // .read(settingsProvider.notifier) + // .update(defaultCodeGenLang: value); + // }, + // items: CodegenLanguage.values.map((value) { + // return DropdownMenuItem( + // value: value, + // child: Padding( + // padding: kP10, + // child: Text(value.label), + // ), + // ); + // }).toList(), + // ), + // ), ), ), CheckboxListTile( diff --git a/lib/widgets/popup_menu_codegen.dart b/lib/widgets/popup_menu_codegen.dart new file mode 100644 index 00000000..6bb164f6 --- /dev/null +++ b/lib/widgets/popup_menu_codegen.dart @@ -0,0 +1,53 @@ +import 'package:apidash/consts.dart'; +import 'package:apidash/extensions/extensions.dart'; +import 'package:flutter/material.dart'; + +class CodegenPopupMenu extends StatelessWidget { + const CodegenPopupMenu({ + super.key, + required this.value, + this.onChanged, + this.items, + }); + + final CodegenLanguage value; + final void Function(CodegenLanguage? value)? onChanged; + final List? items; + @override + Widget build(BuildContext context) { + final textClipLength = context.isCompactWindow ? 12 : 22; + final double boxLength = context.isCompactWindow ? 150 : 220; + return PopupMenuButton( + tooltip: "Select Code Generation Language", + surfaceTintColor: kColorTransparent, + constraints: BoxConstraints(minWidth: boxLength), + itemBuilder: (BuildContext context) => items! + .map((item) => PopupMenuItem( + value: item, + child: Text( + item.label, + style: kTextStylePopupMenuItem, + ), + )) + .toList(), + onSelected: onChanged, + child: Container( + width: boxLength, + padding: const EdgeInsets.all(8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + value.label.clip(textClipLength), + style: kTextStylePopupMenuItem, + ), + const Icon( + Icons.unfold_more, + size: 16, + ) + ], + ), + ), + ); + } +} diff --git a/lib/widgets/popup_menus.dart b/lib/widgets/popup_menu_env.dart similarity index 100% rename from lib/widgets/popup_menus.dart rename to lib/widgets/popup_menu_env.dart diff --git a/lib/widgets/popup_menu_uri.dart b/lib/widgets/popup_menu_uri.dart new file mode 100644 index 00000000..a6a3bb6c --- /dev/null +++ b/lib/widgets/popup_menu_uri.dart @@ -0,0 +1,52 @@ +import 'package:apidash/consts.dart'; +import 'package:apidash/extensions/extensions.dart'; +import 'package:flutter/material.dart'; + +class URIPopupMenu extends StatelessWidget { + const URIPopupMenu({ + super.key, + required this.value, + this.onChanged, + this.items, + }); + + final String value; + final void Function(String? value)? onChanged; + final List? items; + @override + Widget build(BuildContext context) { + final double boxLength = context.isCompactWindow ? 90 : 130; + return PopupMenuButton( + tooltip: "Select URI Scheme", + surfaceTintColor: kColorTransparent, + constraints: BoxConstraints(minWidth: boxLength), + itemBuilder: (BuildContext context) => items! + .map((item) => PopupMenuItem( + value: item, + child: Text( + item, + style: kTextStylePopupMenuItem, + ), + )) + .toList(), + onSelected: onChanged, + child: Container( + width: boxLength, + padding: const EdgeInsets.all(8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + value, + style: kTextStylePopupMenuItem, + ), + const Icon( + Icons.unfold_more, + size: 16, + ) + ], + ), + ), + ); + } +} diff --git a/lib/widgets/widgets.dart b/lib/widgets/widgets.dart index ef7fc10d..6b480b52 100644 --- a/lib/widgets/widgets.dart +++ b/lib/widgets/widgets.dart @@ -31,7 +31,9 @@ export 'json_previewer.dart'; export 'markdown.dart'; export 'menus.dart'; export 'overlay_widget.dart'; -export 'popup_menus.dart'; +export 'popup_menu_codegen.dart'; +export 'popup_menu_env.dart'; +export 'popup_menu_uri.dart'; export 'previewer.dart'; export 'request_widgets.dart'; export 'response_widgets.dart';