From 466fe074b8be70855bd747e87450a73c06bc0d38 Mon Sep 17 00:00:00 2001 From: Eddie Date: Thu, 1 Sep 2022 14:45:55 -0600 Subject: [PATCH 1/7] Initial stab at swapping locales, work in progress - stubbed in button for testing locale switching, needs design polish and direction on whether the button is available at all times or just in menu - tested and fixed switching on the fly for wonder views, intro, timeline, artifacts, and menu --- lib/l10n/app_en.arb | 1 + lib/l10n/app_zh.arb | 1 + lib/logic/app_logic.dart | 5 ++- lib/logic/locale_logic.dart | 8 ++++ lib/logic/settings_logic.dart | 1 + lib/logic/timeline_logic.dart | 17 ++++---- lib/logic/wonders_logic.dart | 24 ++++++----- lib/main.dart | 32 +++++++++------ lib/ui/app_scaffold.dart | 27 +++++++++++++ lib/ui/screens/home_menu/home_menu.dart | 54 +++++++++++++------------ lib/ui/screens/intro/intro_screen.dart | 13 +++--- 11 files changed, 120 insertions(+), 63 deletions(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 59babdcc..697bedf8 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -1,5 +1,6 @@ { "appName": "Wonderous", + "localeSwapButton": "简体中文", "animatedArrowSemanticSwipe": "Explore details about {title}.", "appBarTitleFactsHistory": "Facts and History", "appBarTitleConstruction": "Construction", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index b3e8fd0e..31ac6c93 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -1,5 +1,6 @@ { "appName": "Wonderous", + "localeSwapButton": "English", "animatedArrowSemanticSwipe": "查看关于{title}的详细信息。", "appBarTitleFactsHistory": "历史与细节", "appBarTitleConstruction": "建造", diff --git a/lib/logic/app_logic.dart b/lib/logic/app_logic.dart index b1fd3e6f..1bc93ce3 100644 --- a/lib/logic/app_logic.dart +++ b/lib/logic/app_logic.dart @@ -30,8 +30,11 @@ class AppLogic { // Localizations await localeLogic.load(); + // Data load + wondersLogic.init(); + // Timeline - await timelineLogic.init(); + timelineLogic.init(); // Settings await settingsLogic.load(); diff --git a/lib/logic/locale_logic.dart b/lib/logic/locale_logic.dart index 9067fda9..ebbe61f4 100644 --- a/lib/logic/locale_logic.dart +++ b/lib/logic/locale_logic.dart @@ -3,6 +3,7 @@ import 'dart:ui'; import 'package:flutter/foundation.dart'; import 'package:intl/intl_standalone.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:wonders/common_libs.dart'; class LocaleLogic { AppLocalizations? _strings; @@ -20,6 +21,13 @@ class LocaleLogic { if (AppLocalizations.supportedLocales.contains(locale) == false) { locale = Locale('en'); } + settingsLogic.currentLocale.value = locale.languageCode; _strings = await AppLocalizations.delegate.load(locale); } + + Future refreshIfChanged(Locale locale) async { + if (_strings?.localeName != locale.languageCode && AppLocalizations.supportedLocales.contains(locale)) { + _strings = await AppLocalizations.delegate.load(locale); + } + } } diff --git a/lib/logic/settings_logic.dart b/lib/logic/settings_logic.dart index 451a1111..3a09ae84 100644 --- a/lib/logic/settings_logic.dart +++ b/lib/logic/settings_logic.dart @@ -7,6 +7,7 @@ class SettingsLogic with ThrottledSaveLoadMixin { late final hasCompletedOnboarding = ValueNotifier(false)..addListener(scheduleSave); late final hasDismissedSearchMessage = ValueNotifier(false)..addListener(scheduleSave); + late final currentLocale = ValueNotifier('en')..addListener(scheduleSave); final bool useBlurs = defaultTargetPlatform != TargetPlatform.android; diff --git a/lib/logic/timeline_logic.dart b/lib/logic/timeline_logic.dart index 32dc2995..8e1e6808 100644 --- a/lib/logic/timeline_logic.dart +++ b/lib/logic/timeline_logic.dart @@ -3,18 +3,17 @@ import 'package:wonders/logic/common/string_utils.dart'; import 'package:wonders/logic/data/timeline_data.dart'; class TimelineLogic { - final List events = []; + List events = []; - Future init() async { - events.addAll(GlobalEventsData().globalEvents); - - for (var w in wondersLogic.all) { - events.add( - TimelineEvent( + void init() { + events = [ + ...GlobalEventsData().globalEvents, + ...wondersLogic.all.map( + (w) => TimelineEvent( w.startYr, StringUtils.supplant($strings.timelineLabelConstruction, {'{title}': w.title}), ), - ); - } + ) + ]; } } diff --git a/lib/logic/wonders_logic.dart b/lib/logic/wonders_logic.dart index 34362286..f84481c8 100644 --- a/lib/logic/wonders_logic.dart +++ b/lib/logic/wonders_logic.dart @@ -10,16 +10,7 @@ import 'package:wonders/logic/data/wonders_data/pyramids_giza_data.dart'; import 'package:wonders/logic/data/wonders_data/taj_mahal_data.dart'; class WondersLogic { - late List all = [ - GreatWallData(), - PetraData(), - ColosseumData(), - ChichenItzaData(), - MachuPicchuData(), - TajMahalData(), - ChristRedeemerData(), - PyramidsGizaData(), - ]; + List all = []; final int timelineStartYear = -3000; final int timelineEndYear = 2200; @@ -29,4 +20,17 @@ class WondersLogic { if (result == null) throw ('Could not find data for wonder type $value'); return result; } + + void init() { + all = [ + GreatWallData(), + PetraData(), + ColosseumData(), + ChichenItzaData(), + MachuPicchuData(), + TajMahalData(), + ChristRedeemerData(), + PyramidsGizaData(), + ]; + } } diff --git a/lib/main.dart b/lib/main.dart index fed31757..4b08f62e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -30,19 +30,25 @@ class WondersApp extends StatelessWidget { const WondersApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { - return MaterialApp.router( - debugShowCheckedModeBanner: false, - routerDelegate: appRouter.routerDelegate, - routeInformationProvider: appRouter.routeInformationProvider, - routeInformationParser: appRouter.routeInformationParser, - theme: ThemeData(fontFamily: $styles.text.body.fontFamily), - localizationsDelegates: const [ - AppLocalizations.delegate, - GlobalMaterialLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - ], - supportedLocales: AppLocalizations.supportedLocales, + return ValueListenableBuilder( + valueListenable: settingsLogic.currentLocale, + builder: (_, localeCode, __) { + return MaterialApp.router( + locale: Locale(localeCode), + debugShowCheckedModeBanner: false, + routerDelegate: appRouter.routerDelegate, + routeInformationProvider: appRouter.routeInformationProvider, + routeInformationParser: appRouter.routeInformationParser, + theme: ThemeData(fontFamily: $styles.text.body.fontFamily), + localizationsDelegates: const [ + AppLocalizations.delegate, + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ], + supportedLocales: AppLocalizations.supportedLocales, + ); + } ); } } diff --git a/lib/ui/app_scaffold.dart b/lib/ui/app_scaffold.dart index 9824c777..32241cd5 100644 --- a/lib/ui/app_scaffold.dart +++ b/lib/ui/app_scaffold.dart @@ -5,6 +5,15 @@ class WondersAppScaffold extends StatelessWidget with GetItMixin { WondersAppScaffold({Key? key, required this.child}) : super(key: key); final Widget child; + Future _handleSwapLocale() async { + final currentLocale = settingsLogic.currentLocale.value; + final newLocale = Locale(currentLocale == 'en' ? 'zh' : 'en'); + settingsLogic.currentLocale.value = newLocale.languageCode; + await localeLogic.refreshIfChanged(newLocale); + wondersLogic.init(); + timelineLogic.init(); + } + @override Widget build(BuildContext context) { Animate.defaultDuration = $styles.times.fast; @@ -22,6 +31,24 @@ class WondersAppScaffold extends StatelessWidget with GetItMixin { ), ), ), + + //TODO: just some test UI to check swapping behavior, need to get finalized design and location + Align( + alignment: Alignment.topRight, + child: SafeArea( + child: TextButton( + onPressed: _handleSwapLocale, + child: Container( + decoration: BoxDecoration( + color: $styles.colors.greyStrong.withOpacity(.7), + borderRadius: BorderRadius.all(Radius.circular($styles.corners.md)), + ), + padding: EdgeInsets.all($styles.insets.sm), + child: Text($strings.localeSwapButton, style: $styles.text.btn.copyWith(color: $styles.colors.white)), + ), + ), + ), + ), ], ); } diff --git a/lib/ui/screens/home_menu/home_menu.dart b/lib/ui/screens/home_menu/home_menu.dart index 6b023cdf..99ffbe1a 100644 --- a/lib/ui/screens/home_menu/home_menu.dart +++ b/lib/ui/screens/home_menu/home_menu.dart @@ -106,31 +106,35 @@ class HomeMenu extends StatelessWidget { } Widget _buildBottomBtns(BuildContext context) { - return SeparatedColumn( - separatorBuilder: () => Divider(thickness: 1.5, height: 1).animate().scale( - duration: $styles.times.slow, - delay: $styles.times.pageTransition + 200.ms, - curve: Curves.easeOutBack, - ), - children: [ - _MenuTextBtn( - label: $strings.homeMenuButtonExplore, - icon: AppIcons.timeline, - onPressed: () => _handleTimelinePressed(context)), - _MenuTextBtn( - label: $strings.homeMenuButtonView, - icon: AppIcons.collection, - onPressed: () => _handleCollectionPressed(context)), - _MenuTextBtn( - label: $strings.homeMenuButtonAbout, - icon: AppIcons.info, - onPressed: () => _handleAboutPressed(context), - ), - ] - .animate(interval: 50.ms) - .fade(delay: $styles.times.pageTransition + 50.ms) - .slide(begin: Offset(0, .1), curve: Curves.easeOut), - ); + return ValueListenableBuilder( + valueListenable: settingsLogic.currentLocale, + builder: (_, __, ___) { + return SeparatedColumn( + separatorBuilder: () => Divider(thickness: 1.5, height: 1).animate().scale( + duration: $styles.times.slow, + delay: $styles.times.pageTransition + 200.ms, + curve: Curves.easeOutBack, + ), + children: [ + _MenuTextBtn( + label: $strings.homeMenuButtonExplore, + icon: AppIcons.timeline, + onPressed: () => _handleTimelinePressed(context)), + _MenuTextBtn( + label: $strings.homeMenuButtonView, + icon: AppIcons.collection, + onPressed: () => _handleCollectionPressed(context)), + _MenuTextBtn( + label: $strings.homeMenuButtonAbout, + icon: AppIcons.info, + onPressed: () => _handleAboutPressed(context), + ), + ] + .animate(interval: 50.ms) + .fade(delay: $styles.times.pageTransition + 50.ms) + .slide(begin: Offset(0, .1), curve: Curves.easeOut), + ); + }); } Widget _buildGridBtn(BuildContext context, WonderData btnData) { diff --git a/lib/ui/screens/intro/intro_screen.dart b/lib/ui/screens/intro/intro_screen.dart index 37955fef..d0afe413 100644 --- a/lib/ui/screens/intro/intro_screen.dart +++ b/lib/ui/screens/intro/intro_screen.dart @@ -19,11 +19,7 @@ class _IntroScreenState extends State { static const double _textHeight = 155; static const double _pageIndicatorHeight = 55; - static List<_PageData> pageData = [ - _PageData($strings.introTitleJourney, $strings.introDescriptionNavigate, 'camel', '1'), - _PageData($strings.introTitleExplore, $strings.introDescriptionUncover, 'petra', '2'), - _PageData($strings.introTitleDiscover, $strings.introDescriptionLearn, 'statue', '3'), - ]; + static List<_PageData> pageData = []; late final PageController _pageController = PageController()..addListener(_handlePageChanged); final ValueNotifier _currentPage = ValueNotifier(0); @@ -51,6 +47,13 @@ class _IntroScreenState extends State { @override Widget build(BuildContext context) { + // Set the page data, as strings may have changed based on locale + pageData = [ + _PageData($strings.introTitleJourney, $strings.introDescriptionNavigate, 'camel', '1'), + _PageData($strings.introTitleExplore, $strings.introDescriptionUncover, 'petra', '2'), + _PageData($strings.introTitleDiscover, $strings.introDescriptionLearn, 'statue', '3'), + ]; + // This view uses a full screen PageView to enable swipe navigation. // However, we only want the title / description to actually swipe, // so we stack a PageView with that content over top of all the other From 726cc6d5e73900f83b5a21a409de3b59ea117479 Mon Sep 17 00:00:00 2001 From: Eddie Date: Tue, 6 Sep 2022 16:31:22 -0600 Subject: [PATCH 2/7] Add Locale button - add LocaleButton to intro and menu, toasted placeholder in app_scaffold - add localeLogic.isEnglish helper, used in _results_grid and _scrolling_content --- lib/logic/locale_logic.dart | 2 ++ lib/ui/app_scaffold.dart | 27 ---------------- lib/ui/common/controls/locale_button.dart | 32 +++++++++++++++++++ .../widgets/_results_grid.dart | 3 +- .../editorial/widgets/_scrolling_content.dart | 3 +- lib/ui/screens/home_menu/home_menu.dart | 13 +++++++- lib/ui/screens/intro/intro_screen.dart | 7 ++++ 7 files changed, 55 insertions(+), 32 deletions(-) create mode 100644 lib/ui/common/controls/locale_button.dart diff --git a/lib/logic/locale_logic.dart b/lib/logic/locale_logic.dart index ebbe61f4..414d6f30 100644 --- a/lib/logic/locale_logic.dart +++ b/lib/logic/locale_logic.dart @@ -11,6 +11,8 @@ class LocaleLogic { bool get isLoaded => _strings != null; + bool get isEnglish => strings.localeName == 'en'; + Future load() async { final localeCode = await findSystemLocale(); Locale locale = Locale(localeCode.split('_')[0]); diff --git a/lib/ui/app_scaffold.dart b/lib/ui/app_scaffold.dart index 32241cd5..9824c777 100644 --- a/lib/ui/app_scaffold.dart +++ b/lib/ui/app_scaffold.dart @@ -5,15 +5,6 @@ class WondersAppScaffold extends StatelessWidget with GetItMixin { WondersAppScaffold({Key? key, required this.child}) : super(key: key); final Widget child; - Future _handleSwapLocale() async { - final currentLocale = settingsLogic.currentLocale.value; - final newLocale = Locale(currentLocale == 'en' ? 'zh' : 'en'); - settingsLogic.currentLocale.value = newLocale.languageCode; - await localeLogic.refreshIfChanged(newLocale); - wondersLogic.init(); - timelineLogic.init(); - } - @override Widget build(BuildContext context) { Animate.defaultDuration = $styles.times.fast; @@ -31,24 +22,6 @@ class WondersAppScaffold extends StatelessWidget with GetItMixin { ), ), ), - - //TODO: just some test UI to check swapping behavior, need to get finalized design and location - Align( - alignment: Alignment.topRight, - child: SafeArea( - child: TextButton( - onPressed: _handleSwapLocale, - child: Container( - decoration: BoxDecoration( - color: $styles.colors.greyStrong.withOpacity(.7), - borderRadius: BorderRadius.all(Radius.circular($styles.corners.md)), - ), - padding: EdgeInsets.all($styles.insets.sm), - child: Text($strings.localeSwapButton, style: $styles.text.btn.copyWith(color: $styles.colors.white)), - ), - ), - ), - ), ], ); } diff --git a/lib/ui/common/controls/locale_button.dart b/lib/ui/common/controls/locale_button.dart new file mode 100644 index 00000000..76b262e5 --- /dev/null +++ b/lib/ui/common/controls/locale_button.dart @@ -0,0 +1,32 @@ +import 'package:flutter/src/foundation/key.dart'; +import 'package:flutter/src/widgets/container.dart'; +import 'package:flutter/src/widgets/framework.dart'; +import 'package:wonders/common_libs.dart'; + +class LocaleButton extends StatelessWidget { + const LocaleButton({Key? key}) : super(key: key); + + Future _handleSwapLocale() async { + final currentLocale = settingsLogic.currentLocale.value; + final newLocale = Locale(currentLocale == 'en' ? 'zh' : 'en'); + settingsLogic.currentLocale.value = newLocale.languageCode; + await localeLogic.refreshIfChanged(newLocale); + wondersLogic.init(); + timelineLogic.init(); + } + + @override + Widget build(BuildContext context) { + return TextButton( + onPressed: _handleSwapLocale, + child: Container( + decoration: BoxDecoration( + color: $styles.colors.greyStrong.withOpacity(.7), + borderRadius: BorderRadius.all(Radius.circular($styles.corners.md)), + ), + padding: EdgeInsets.all($styles.insets.sm), + child: Text($strings.localeSwapButton, style: $styles.text.btn.copyWith(color: $styles.colors.white)), + ), + ); + } +} diff --git a/lib/ui/screens/artifact/artifact_search/widgets/_results_grid.dart b/lib/ui/screens/artifact/artifact_search/widgets/_results_grid.dart index d2c89da2..ee891aca 100644 --- a/lib/ui/screens/artifact/artifact_search/widgets/_results_grid.dart +++ b/lib/ui/screens/artifact/artifact_search/widgets/_results_grid.dart @@ -31,11 +31,10 @@ class _ResultsGrid extends StatelessWidget { } Widget _buildLanguageMessage(BuildContext context) { - bool isEnglish = localeLogic.strings.localeName == 'en'; return ValueListenableBuilder( valueListenable: settingsLogic.hasDismissedSearchMessage, builder: (_, value, __) { - if (isEnglish || value) return SizedBox(); + if (localeLogic.isEnglish || value) return SizedBox(); return AppBtn.basic( onPressed: () => settingsLogic.hasDismissedSearchMessage.value = true, semanticLabel: $strings.resultsSemanticDismiss, diff --git a/lib/ui/screens/editorial/widgets/_scrolling_content.dart b/lib/ui/screens/editorial/widgets/_scrolling_content.dart index 9acf8a99..de320a02 100644 --- a/lib/ui/screens/editorial/widgets/_scrolling_content.dart +++ b/lib/ui/screens/editorial/widgets/_scrolling_content.dart @@ -28,8 +28,7 @@ class _ScrollingContent extends StatelessWidget { final String dropChar = value.substring(0, 1); final textScale = MediaQuery.of(context).textScaleFactor; final double dropCapWidth = StringUtils.measure(dropChar, dropStyle).width * textScale; - final bool isEnglish = localeLogic.strings.localeName == 'en'; //TODO EC: Helper method for localLogic.isEnglish? - final bool skipCaps = !isEnglish || MediaQuery.of(context).accessibleNavigation; + final bool skipCaps = !localeLogic.isEnglish || MediaQuery.of(context).accessibleNavigation; return Semantics( label: value, child: !skipCaps diff --git a/lib/ui/screens/home_menu/home_menu.dart b/lib/ui/screens/home_menu/home_menu.dart index 99ffbe1a..fbdf1d9a 100644 --- a/lib/ui/screens/home_menu/home_menu.dart +++ b/lib/ui/screens/home_menu/home_menu.dart @@ -4,6 +4,7 @@ import 'package:wonders/common_libs.dart'; import 'package:wonders/logic/data/wonder_data.dart'; import 'package:wonders/ui/common/app_backdrop.dart'; import 'package:wonders/ui/common/app_icons.dart'; +import 'package:wonders/ui/common/controls/locale_button.dart'; import 'package:wonders/ui/screens/home_menu/about_dialog_content.dart'; class HomeMenu extends StatelessWidget { @@ -75,7 +76,17 @@ class HomeMenu extends StatelessWidget { ), ), ), - ) + ), + Positioned( + right: -$styles.insets.xs, + top: $styles.insets.xs, + child: SafeArea( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: $styles.insets.lg), + child: LocaleButton(), + ), + ), + ), ], ); } diff --git a/lib/ui/screens/intro/intro_screen.dart b/lib/ui/screens/intro/intro_screen.dart index d0afe413..0e7bf99a 100644 --- a/lib/ui/screens/intro/intro_screen.dart +++ b/lib/ui/screens/intro/intro_screen.dart @@ -2,6 +2,7 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:wonders/common_libs.dart'; import 'package:wonders/ui/common/app_icons.dart'; import 'package:wonders/ui/common/controls/app_page_indicator.dart'; +import 'package:wonders/ui/common/controls/locale_button.dart'; import 'package:wonders/ui/common/static_text_scale.dart'; import 'package:wonders/ui/common/themed_text.dart'; import 'package:wonders/ui/common/utils/app_haptics.dart'; @@ -137,6 +138,12 @@ class _IntroScreenState extends State { child: _buildNavText(context), ), ), + + Positioned( + right: 0, + top: 0, + child: LocaleButton(), + ), ]); return DefaultTextColor( From 828f353d26011877629ba350478fcfcbd18e0e48 Mon Sep 17 00:00:00 2001 From: Eddie Date: Tue, 6 Sep 2022 16:44:29 -0600 Subject: [PATCH 3/7] Fix for localeButton not updating --- lib/ui/common/controls/locale_button.dart | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/ui/common/controls/locale_button.dart b/lib/ui/common/controls/locale_button.dart index 76b262e5..5d958d95 100644 --- a/lib/ui/common/controls/locale_button.dart +++ b/lib/ui/common/controls/locale_button.dart @@ -25,7 +25,12 @@ class LocaleButton extends StatelessWidget { borderRadius: BorderRadius.all(Radius.circular($styles.corners.md)), ), padding: EdgeInsets.all($styles.insets.sm), - child: Text($strings.localeSwapButton, style: $styles.text.btn.copyWith(color: $styles.colors.white)), + child: ValueListenableBuilder( + valueListenable: settingsLogic.currentLocale, + builder: (_, __, ___) { + return Text($strings.localeSwapButton, style: $styles.text.btn.copyWith(color: $styles.colors.white)); + }, + ), ), ); } From b080a5b2e9fb01ab84365986faf5a153ba95dc7c Mon Sep 17 00:00:00 2001 From: Shawn Date: Wed, 7 Sep 2022 13:25:56 -0600 Subject: [PATCH 4/7] add setLocale method on settings --- lib/logic/settings_logic.dart | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/logic/settings_logic.dart b/lib/logic/settings_logic.dart index 3a09ae84..23a19059 100644 --- a/lib/logic/settings_logic.dart +++ b/lib/logic/settings_logic.dart @@ -1,4 +1,5 @@ import 'package:flutter/foundation.dart'; +import 'package:wonders/common_libs.dart'; import 'package:wonders/logic/common/save_load_mixin.dart'; class SettingsLogic with ThrottledSaveLoadMixin { @@ -24,4 +25,11 @@ class SettingsLogic with ThrottledSaveLoadMixin { 'hasDismissedSearchMessage': hasDismissedSearchMessage.value, }; } + + Future setLocale(Locale value) async { + currentLocale.value = value.languageCode; + await localeLogic.refreshIfChanged(value); + wondersLogic.init(); + timelineLogic.init(); + } } From 31be98dd260db0d76bfbdb2a8a1869afc6b6b285 Mon Sep 17 00:00:00 2001 From: Shawn Date: Wed, 7 Sep 2022 13:26:30 -0600 Subject: [PATCH 5/7] Switch LocalBtn to use AppBtn --- lib/ui/common/controls/locale_button.dart | 42 +++++++---------------- 1 file changed, 12 insertions(+), 30 deletions(-) diff --git a/lib/ui/common/controls/locale_button.dart b/lib/ui/common/controls/locale_button.dart index 5d958d95..3f9b3914 100644 --- a/lib/ui/common/controls/locale_button.dart +++ b/lib/ui/common/controls/locale_button.dart @@ -1,37 +1,19 @@ -import 'package:flutter/src/foundation/key.dart'; -import 'package:flutter/src/widgets/container.dart'; -import 'package:flutter/src/widgets/framework.dart'; import 'package:wonders/common_libs.dart'; -class LocaleButton extends StatelessWidget { - const LocaleButton({Key? key}) : super(key: key); - - Future _handleSwapLocale() async { - final currentLocale = settingsLogic.currentLocale.value; - final newLocale = Locale(currentLocale == 'en' ? 'zh' : 'en'); - settingsLogic.currentLocale.value = newLocale.languageCode; - await localeLogic.refreshIfChanged(newLocale); - wondersLogic.init(); - timelineLogic.init(); - } +class LocaleButton extends StatelessWidget with GetItMixin { + LocaleButton({Key? key}) : super(key: key); @override Widget build(BuildContext context) { - return TextButton( - onPressed: _handleSwapLocale, - child: Container( - decoration: BoxDecoration( - color: $styles.colors.greyStrong.withOpacity(.7), - borderRadius: BorderRadius.all(Radius.circular($styles.corners.md)), - ), - padding: EdgeInsets.all($styles.insets.sm), - child: ValueListenableBuilder( - valueListenable: settingsLogic.currentLocale, - builder: (_, __, ___) { - return Text($strings.localeSwapButton, style: $styles.text.btn.copyWith(color: $styles.colors.white)); - }, - ), - ), - ); + final locale = watchX((SettingsLogic s) => s.currentLocale); + Future handleSwapLocale() async { + final newLocale = Locale(locale == 'en' ? 'zh' : 'en'); + await settingsLogic.setLocale(newLocale); + } + + return AppBtn.from( + padding: EdgeInsets.symmetric(vertical: $styles.insets.sm, horizontal: $styles.insets.sm), + text: $strings.localeSwapButton, + onPressed: handleSwapLocale); } } From 65d5fd48d3357849508222b64ab2c92c216e2cfb Mon Sep 17 00:00:00 2001 From: Shawn Date: Wed, 7 Sep 2022 13:28:41 -0600 Subject: [PATCH 6/7] Rename to LocaleSwitcher, tweak HomeMenu layout --- ...ocale_button.dart => locale_switcher.dart} | 4 +-- lib/ui/screens/home_menu/home_menu.dart | 34 ++++++++++--------- lib/ui/screens/intro/intro_screen.dart | 4 +-- 3 files changed, 22 insertions(+), 20 deletions(-) rename lib/ui/common/controls/{locale_button.dart => locale_switcher.dart} (82%) diff --git a/lib/ui/common/controls/locale_button.dart b/lib/ui/common/controls/locale_switcher.dart similarity index 82% rename from lib/ui/common/controls/locale_button.dart rename to lib/ui/common/controls/locale_switcher.dart index 3f9b3914..9150b9c2 100644 --- a/lib/ui/common/controls/locale_button.dart +++ b/lib/ui/common/controls/locale_switcher.dart @@ -1,7 +1,7 @@ import 'package:wonders/common_libs.dart'; -class LocaleButton extends StatelessWidget with GetItMixin { - LocaleButton({Key? key}) : super(key: key); +class LocaleSwitcher extends StatelessWidget with GetItMixin { + LocaleSwitcher({Key? key}) : super(key: key); @override Widget build(BuildContext context) { diff --git a/lib/ui/screens/home_menu/home_menu.dart b/lib/ui/screens/home_menu/home_menu.dart index fbdf1d9a..138e0694 100644 --- a/lib/ui/screens/home_menu/home_menu.dart +++ b/lib/ui/screens/home_menu/home_menu.dart @@ -4,7 +4,7 @@ import 'package:wonders/common_libs.dart'; import 'package:wonders/logic/data/wonder_data.dart'; import 'package:wonders/ui/common/app_backdrop.dart'; import 'package:wonders/ui/common/app_icons.dart'; -import 'package:wonders/ui/common/controls/locale_button.dart'; +import 'package:wonders/ui/common/controls/locale_switcher.dart'; import 'package:wonders/ui/screens/home_menu/about_dialog_content.dart'; class HomeMenu extends StatelessWidget { @@ -50,11 +50,23 @@ class HomeMenu extends StatelessWidget { ), ), - /// Back btn - BackBtn.close( - bgColor: Colors.transparent, - iconColor: $styles.colors.offWhite, - ).safe(), + SafeArea( + child: PaddedRow( + padding: EdgeInsets.symmetric( + horizontal: $styles.insets.md, + vertical: $styles.insets.sm, + ), + children: [ + /// Back btn + BackBtn.close( + bgColor: Colors.transparent, + iconColor: $styles.colors.offWhite, + ), + Spacer(), + LocaleSwitcher() + ], + ), + ), /// Content Positioned.fill( @@ -77,16 +89,6 @@ class HomeMenu extends StatelessWidget { ), ), ), - Positioned( - right: -$styles.insets.xs, - top: $styles.insets.xs, - child: SafeArea( - child: Padding( - padding: EdgeInsets.symmetric(horizontal: $styles.insets.lg), - child: LocaleButton(), - ), - ), - ), ], ); } diff --git a/lib/ui/screens/intro/intro_screen.dart b/lib/ui/screens/intro/intro_screen.dart index 0e7bf99a..1ec5fa70 100644 --- a/lib/ui/screens/intro/intro_screen.dart +++ b/lib/ui/screens/intro/intro_screen.dart @@ -2,7 +2,7 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:wonders/common_libs.dart'; import 'package:wonders/ui/common/app_icons.dart'; import 'package:wonders/ui/common/controls/app_page_indicator.dart'; -import 'package:wonders/ui/common/controls/locale_button.dart'; +import 'package:wonders/ui/common/controls/locale_switcher.dart'; import 'package:wonders/ui/common/static_text_scale.dart'; import 'package:wonders/ui/common/themed_text.dart'; import 'package:wonders/ui/common/utils/app_haptics.dart'; @@ -142,7 +142,7 @@ class _IntroScreenState extends State { Positioned( right: 0, top: 0, - child: LocaleButton(), + child: LocaleSwitcher(), ), ]); From d7952ed1ab12e0ca7e7f91039df690291b99193b Mon Sep 17 00:00:00 2001 From: Shawn Date: Wed, 7 Sep 2022 13:44:20 -0600 Subject: [PATCH 7/7] Remove from intro screen --- lib/ui/screens/intro/intro_screen.dart | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lib/ui/screens/intro/intro_screen.dart b/lib/ui/screens/intro/intro_screen.dart index 1ec5fa70..e7006123 100644 --- a/lib/ui/screens/intro/intro_screen.dart +++ b/lib/ui/screens/intro/intro_screen.dart @@ -138,12 +138,6 @@ class _IntroScreenState extends State { child: _buildNavText(context), ), ), - - Positioned( - right: 0, - top: 0, - child: LocaleSwitcher(), - ), ]); return DefaultTextColor(