From 7862e6721bbf69da615b5ff6bca2eb19d6e7fed6 Mon Sep 17 00:00:00 2001 From: Lukas Klingsbo Date: Tue, 27 Aug 2024 13:20:56 +0200 Subject: [PATCH 1/7] feat: Clickable categories --- .../app_center/lib/widgets/app_title.dart | 46 ++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/packages/app_center/lib/widgets/app_title.dart b/packages/app_center/lib/widgets/app_title.dart index d6fbcf1a8..18a0e7d94 100644 --- a/packages/app_center/lib/widgets/app_title.dart +++ b/packages/app_center/lib/widgets/app_title.dart @@ -2,6 +2,7 @@ import 'package:app_center/appstream/appstream.dart'; import 'package:app_center/games/games.dart'; import 'package:app_center/l10n.dart'; import 'package:app_center/snapd/snapd.dart'; +import 'package:app_center/store/store_navigator.dart'; import 'package:appstream/appstream.dart'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; @@ -107,7 +108,7 @@ class AppTitle extends StatelessWidget { Row( children: snapCategories! .whereNot((c) => c.categoryEnum == SnapCategoryEnum.featured) - .map((c) => Text(c.categoryEnum.localize(l10n))) + .map(_CategoryText.new) .separatedBy(const Text(', ')), ), ], @@ -116,6 +117,49 @@ class AppTitle extends StatelessWidget { } } +class _CategoryText extends StatefulWidget { + const _CategoryText(this.category); + + final SnapCategory category; + + @override + _CategoryTextState createState() => _CategoryTextState(); +} + +class _CategoryTextState extends State<_CategoryText> { + bool _isHovered = false; + + @override + Widget build(BuildContext context) { + final l10n = AppLocalizations.of(context); + final categoryName = widget.category.categoryEnum.localize(l10n); + final colorScheme = Theme.of(context).colorScheme; + + return GestureDetector( + child: MouseRegion( + cursor: SystemMouseCursors.click, + child: Text( + categoryName, + style: _isHovered + ? TextStyle( + color: colorScheme.primary, + decoration: TextDecoration.underline, + ) + : null, + ), + onEnter: (_) => setState(() => _isHovered = true), + onExit: (_) => setState(() => _isHovered = false), + ), + onTap: () { + StoreNavigator.pushSearch( + context, + category: widget.category.categoryEnum.categoryName, + ); + }, + ); + } +} + extension on Iterable { List separatedBy(Widget separator) => [ for (var i = 0; i < length; i++) ...[ From 245d4e6cfe00fe9a9fa739647d744aa21d6b3d7a Mon Sep 17 00:00:00 2001 From: Shoaib Hossain <131895466+MrSIHAB@users.noreply.github.com> Date: Sat, 24 Aug 2024 18:07:33 +0600 Subject: [PATCH 2/7] improved: SearchBar autofocus when click on clear btn The search bar should automatically focused when 'clear search text' button is clicked. This is small tweak but usefull too. I do search, do some activities. Then search bar become unfocused. Then I click on clear search button and start typing my query, And then I see that Search bar is not focused. I have to manually click on the textfeild to focus it. This pull request will automatically focus search bar when someone click on clear search button. I made this changes from my experience. --- packages/app_center/lib/search/search_field.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/app_center/lib/search/search_field.dart b/packages/app_center/lib/search/search_field.dart index 8da39bb03..c098e7573 100644 --- a/packages/app_center/lib/search/search_field.dart +++ b/packages/app_center/lib/search/search_field.dart @@ -188,7 +188,10 @@ class _SearchFieldState extends ConsumerState { return YaruIconButton( icon: const Icon(YaruIcons.edit_clear, size: 16), onPressed: - controller.text.isEmpty ? null : controller.clear, + controller.text.isEmpty ? null : (){ + controller.clear(); + node.requestFocus(); + }, ); }, ), From 0da01a1d53f8814d341fa0684776ea41b1d92b92 Mon Sep 17 00:00:00 2001 From: Lukas Klingsbo Date: Wed, 28 Aug 2024 16:24:05 +0200 Subject: [PATCH 3/7] Fix formatting --- packages/app_center/lib/search/search_field.dart | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/app_center/lib/search/search_field.dart b/packages/app_center/lib/search/search_field.dart index c098e7573..09769ad99 100644 --- a/packages/app_center/lib/search/search_field.dart +++ b/packages/app_center/lib/search/search_field.dart @@ -187,11 +187,12 @@ class _SearchFieldState extends ConsumerState { builder: (context, child) { return YaruIconButton( icon: const Icon(YaruIcons.edit_clear, size: 16), - onPressed: - controller.text.isEmpty ? null : (){ - controller.clear(); - node.requestFocus(); - }, + onPressed: controller.text.isEmpty + ? null + : () { + controller.clear(); + node.requestFocus(); + }, ); }, ), From 7e68d2d9581fa92a67920bf568b430a1102ebd6d Mon Sep 17 00:00:00 2001 From: Lukas Klingsbo Date: Wed, 28 Aug 2024 14:56:47 +0200 Subject: [PATCH 4/7] ci: Remove unnecessary snapcraft step --- snap/snapcraft.yaml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 5439194af..9b58f2148 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -10,11 +10,9 @@ parts: flutter-git: plugin: nil source: . - override-pull: | - craftctl default + override-build: | bash $CRAFT_PART_SRC/scripts/install-fvm.sh fvm install - override-build: | fvm flutter doctor build-packages: - clang @@ -46,9 +44,6 @@ parts: fvm dart pub global run melos exec -c 1 --fail-fast --depends-on=build_runner -- \ fvm dart run build_runner build --delete-conflicting-outputs - fvm dart pub global run melos exec -c 1 --fail-fast --depends-on=build_runner -- \ - fvm dart run build_runner build --delete-conflicting-outputs - cd packages/app_center fvm flutter gen-l10n fvm flutter build linux --release -v From ae6a7a1b000c01e4015ed39cbd9f1665de679cf4 Mon Sep 17 00:00:00 2001 From: Lukas Klingsbo Date: Wed, 28 Aug 2024 16:42:58 +0200 Subject: [PATCH 5/7] fix: Move featured section to top of explore page --- .../app_center/lib/explore/explore_page.dart | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/app_center/lib/explore/explore_page.dart b/packages/app_center/lib/explore/explore_page.dart index 30afe223f..8a8481de1 100644 --- a/packages/app_center/lib/explore/explore_page.dart +++ b/packages/app_center/lib/explore/explore_page.dart @@ -23,17 +23,6 @@ class ExplorePage extends ConsumerWidget { final l10n = AppLocalizations.of(context); return ResponsiveLayoutScrollView( slivers: [ - SliverList.list( - children: const [ - SizedBox(height: kPagePadding), - CategoryBanner(category: SnapCategoryEnum.ubuntuDesktop), - SizedBox(height: kPagePadding), - ], - ), - const CategorySnapList( - category: SnapCategoryEnum.ubuntuDesktop, - hideBannerSnaps: true, - ), SliverList.list( children: const [ SizedBox(height: 56), @@ -77,6 +66,17 @@ class ExplorePage extends ConsumerWidget { category: SnapCategoryEnum.development, hideBannerSnaps: true, ), + SliverList.list( + children: const [ + SizedBox(height: 56), + CategoryBanner(category: SnapCategoryEnum.ubuntuDesktop), + SizedBox(height: kPagePadding), + ], + ), + const CategorySnapList( + category: SnapCategoryEnum.ubuntuDesktop, + hideBannerSnaps: true, + ), SliverList.list( children: const [ SizedBox(height: 56), From 60f68871061cea7f1571175c0925a849186cc2ab Mon Sep 17 00:00:00 2001 From: Lukas Klingsbo Date: Wed, 28 Aug 2024 17:23:33 +0200 Subject: [PATCH 6/7] fix: Remove secondary action icons --- packages/app_center/lib/manage/manage_snap_tile.dart | 1 - packages/app_center/lib/snapd/snap_page.dart | 2 -- 2 files changed, 3 deletions(-) diff --git a/packages/app_center/lib/manage/manage_snap_tile.dart b/packages/app_center/lib/manage/manage_snap_tile.dart index bcbbfea80..39d0d374d 100644 --- a/packages/app_center/lib/manage/manage_snap_tile.dart +++ b/packages/app_center/lib/manage/manage_snap_tile.dart @@ -234,7 +234,6 @@ class _ButtonBarForUpdate extends ConsumerWidget { ), MenuItemButton( onPressed: ref.read(snapModelProvider(snap.name).notifier).remove, - leadingIcon: Icon(SnapAction.remove.icon, color: removeColor), child: Text( SnapAction.remove.label(l10n), style: TextStyle(color: removeColor), diff --git a/packages/app_center/lib/snapd/snap_page.dart b/packages/app_center/lib/snapd/snap_page.dart index 32ff42902..d1fb9c550 100644 --- a/packages/app_center/lib/snapd/snap_page.dart +++ b/packages/app_center/lib/snapd/snap_page.dart @@ -358,8 +358,6 @@ class _SnapActionButtons extends ConsumerWidget { child: IntrinsicWidth( child: ListTile( mouseCursor: SystemMouseCursors.click, - leading: - action.icon != null ? Icon(action.icon, color: color) : null, title: Text( action.label(l10n), style: TextStyle(color: color), From 33c31260bb2c1cfb648513e7635f59c1db45cf27 Mon Sep 17 00:00:00 2001 From: Lukas Klingsbo Date: Fri, 30 Aug 2024 11:22:14 +0200 Subject: [PATCH 7/7] fix: Update to use ClickableText --- .../app_center/lib/widgets/app_title.dart | 66 ++++--------------- packages/app_center/pubspec.yaml | 4 +- 2 files changed, 15 insertions(+), 55 deletions(-) diff --git a/packages/app_center/lib/widgets/app_title.dart b/packages/app_center/lib/widgets/app_title.dart index 18a0e7d94..cc499ed6c 100644 --- a/packages/app_center/lib/widgets/app_title.dart +++ b/packages/app_center/lib/widgets/app_title.dart @@ -1,4 +1,5 @@ import 'package:app_center/appstream/appstream.dart'; +import 'package:app_center/extensions/iterable_extensions.dart'; import 'package:app_center/games/games.dart'; import 'package:app_center/l10n.dart'; import 'package:app_center/snapd/snapd.dart'; @@ -7,6 +8,7 @@ import 'package:appstream/appstream.dart'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:snapd/snapd.dart'; +import 'package:ubuntu_widgets/ubuntu_widgets.dart'; import 'package:yaru/yaru.dart'; class AppTitle extends StatelessWidget { @@ -108,7 +110,17 @@ class AppTitle extends StatelessWidget { Row( children: snapCategories! .whereNot((c) => c.categoryEnum == SnapCategoryEnum.featured) - .map(_CategoryText.new) + .map( + (category) => ClickableText( + category.categoryEnum.localize(l10n), + onTap: () { + StoreNavigator.pushSearch( + context, + category: category.categoryEnum.categoryName, + ); + }, + ), + ) .separatedBy(const Text(', ')), ), ], @@ -116,55 +128,3 @@ class AppTitle extends StatelessWidget { ); } } - -class _CategoryText extends StatefulWidget { - const _CategoryText(this.category); - - final SnapCategory category; - - @override - _CategoryTextState createState() => _CategoryTextState(); -} - -class _CategoryTextState extends State<_CategoryText> { - bool _isHovered = false; - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context); - final categoryName = widget.category.categoryEnum.localize(l10n); - final colorScheme = Theme.of(context).colorScheme; - - return GestureDetector( - child: MouseRegion( - cursor: SystemMouseCursors.click, - child: Text( - categoryName, - style: _isHovered - ? TextStyle( - color: colorScheme.primary, - decoration: TextDecoration.underline, - ) - : null, - ), - onEnter: (_) => setState(() => _isHovered = true), - onExit: (_) => setState(() => _isHovered = false), - ), - onTap: () { - StoreNavigator.pushSearch( - context, - category: widget.category.categoryEnum.categoryName, - ); - }, - ); - } -} - -extension on Iterable { - List separatedBy(Widget separator) => [ - for (var i = 0; i < length; i++) ...[ - elementAt(i), - if (i < length - 1) separator, - ], - ]; -} diff --git a/packages/app_center/pubspec.yaml b/packages/app_center/pubspec.yaml index 93a327eae..be07c1397 100644 --- a/packages/app_center/pubspec.yaml +++ b/packages/app_center/pubspec.yaml @@ -44,11 +44,11 @@ dependencies: snapcraft_launcher: ^0.1.0 snapd: ^0.6.4 snowball_stemmer: ^0.1.0 - ubuntu_localizations: ^0.4.0 + ubuntu_localizations: ^0.4.1 ubuntu_logger: ^0.1.1 ubuntu_service: ^0.3.2 ubuntu_test: ^0.1.0-beta.9 - ubuntu_widgets: ^0.6.0 + ubuntu_widgets: ^0.6.1 url_launcher: ^6.2.6 xdg_directories: ^1.0.4 yaru: ^4.1.0