From c8a7ea6ec6b39c68d0b591301b9cab17a57235b4 Mon Sep 17 00:00:00 2001 From: Zixuan James Li Date: Thu, 19 Dec 2024 13:20:58 -0500 Subject: [PATCH] home: Add settings page Signed-off-by: Zixuan James Li --- assets/icons/ZulipIcons.ttf | Bin 11668 -> 12536 bytes assets/icons/settings.svg | 4 ++ assets/l10n/app_en.arb | 4 ++ lib/generated/l10n/zulip_localizations.dart | 6 ++ .../l10n/zulip_localizations_ar.dart | 3 + .../l10n/zulip_localizations_en.dart | 3 + .../l10n/zulip_localizations_fr.dart | 3 + .../l10n/zulip_localizations_ja.dart | 3 + .../l10n/zulip_localizations_pl.dart | 3 + .../l10n/zulip_localizations_ru.dart | 3 + lib/widgets/home.dart | 20 +++++- lib/widgets/icons.dart | 19 +++--- lib/widgets/settings.dart | 63 ++++++++++++++++++ 13 files changed, 125 insertions(+), 9 deletions(-) create mode 100644 assets/icons/settings.svg create mode 100644 lib/widgets/settings.dart diff --git a/assets/icons/ZulipIcons.ttf b/assets/icons/ZulipIcons.ttf index 57a301f2e8125621e6f781304f2eed0793d16c48..215f3d552f14c4fcfbc7c7c4a909784b5908f362 100644 GIT binary patch delta 2422 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 RmOt*i>woF|;(t + + + diff --git a/assets/l10n/app_en.arb b/assets/l10n/app_en.arb index 58822303fdb..51af7893ae4 100644 --- a/assets/l10n/app_en.arb +++ b/assets/l10n/app_en.arb @@ -19,6 +19,10 @@ "@chooseAccountPageTitle": { "description": "Title for the page to choose between Zulip accounts." }, + "settingsPageTitle": "Settings", + "@settingsPageTitle": { + "description": "Title for the settings page." + }, "switchAccountButton": "Switch account", "@switchAccountButton": { "description": "Label for main-menu button leading to the choose-account page." diff --git a/lib/generated/l10n/zulip_localizations.dart b/lib/generated/l10n/zulip_localizations.dart index 00d7cfde72b..1fc7436ccba 100644 --- a/lib/generated/l10n/zulip_localizations.dart +++ b/lib/generated/l10n/zulip_localizations.dart @@ -133,6 +133,12 @@ abstract class ZulipLocalizations { /// **'Choose account'** String get chooseAccountPageTitle; + /// Title for the settings page. + /// + /// In en, this message translates to: + /// **'Settings'** + String get settingsPageTitle; + /// Label for main-menu button leading to the choose-account page. /// /// In en, this message translates to: diff --git a/lib/generated/l10n/zulip_localizations_ar.dart b/lib/generated/l10n/zulip_localizations_ar.dart index 542b85031bc..9ec904bbdf1 100644 --- a/lib/generated/l10n/zulip_localizations_ar.dart +++ b/lib/generated/l10n/zulip_localizations_ar.dart @@ -23,6 +23,9 @@ class ZulipLocalizationsAr extends ZulipLocalizations { @override String get chooseAccountPageTitle => 'Choose account'; + @override + String get settingsPageTitle => 'Settings'; + @override String get switchAccountButton => 'Switch account'; diff --git a/lib/generated/l10n/zulip_localizations_en.dart b/lib/generated/l10n/zulip_localizations_en.dart index b6bc9f72e7f..1b6a4fca45d 100644 --- a/lib/generated/l10n/zulip_localizations_en.dart +++ b/lib/generated/l10n/zulip_localizations_en.dart @@ -23,6 +23,9 @@ class ZulipLocalizationsEn extends ZulipLocalizations { @override String get chooseAccountPageTitle => 'Choose account'; + @override + String get settingsPageTitle => 'Settings'; + @override String get switchAccountButton => 'Switch account'; diff --git a/lib/generated/l10n/zulip_localizations_fr.dart b/lib/generated/l10n/zulip_localizations_fr.dart index c857da2c82f..69f873e0751 100644 --- a/lib/generated/l10n/zulip_localizations_fr.dart +++ b/lib/generated/l10n/zulip_localizations_fr.dart @@ -23,6 +23,9 @@ class ZulipLocalizationsFr extends ZulipLocalizations { @override String get chooseAccountPageTitle => 'Choose account'; + @override + String get settingsPageTitle => 'Settings'; + @override String get switchAccountButton => 'Switch account'; diff --git a/lib/generated/l10n/zulip_localizations_ja.dart b/lib/generated/l10n/zulip_localizations_ja.dart index 7adbc9ae8ad..9cf0d3933ce 100644 --- a/lib/generated/l10n/zulip_localizations_ja.dart +++ b/lib/generated/l10n/zulip_localizations_ja.dart @@ -23,6 +23,9 @@ class ZulipLocalizationsJa extends ZulipLocalizations { @override String get chooseAccountPageTitle => 'アカウントを選択'; + @override + String get settingsPageTitle => 'Settings'; + @override String get switchAccountButton => 'Switch account'; diff --git a/lib/generated/l10n/zulip_localizations_pl.dart b/lib/generated/l10n/zulip_localizations_pl.dart index 07746b3f27c..92c8b12adfe 100644 --- a/lib/generated/l10n/zulip_localizations_pl.dart +++ b/lib/generated/l10n/zulip_localizations_pl.dart @@ -23,6 +23,9 @@ class ZulipLocalizationsPl extends ZulipLocalizations { @override String get chooseAccountPageTitle => 'Wybierz konto'; + @override + String get settingsPageTitle => 'Settings'; + @override String get switchAccountButton => 'Switch account'; diff --git a/lib/generated/l10n/zulip_localizations_ru.dart b/lib/generated/l10n/zulip_localizations_ru.dart index 9c2065376bb..be9a3c71e71 100644 --- a/lib/generated/l10n/zulip_localizations_ru.dart +++ b/lib/generated/l10n/zulip_localizations_ru.dart @@ -23,6 +23,9 @@ class ZulipLocalizationsRu extends ZulipLocalizations { @override String get chooseAccountPageTitle => 'Выберите учетную запись'; + @override + String get settingsPageTitle => 'Settings'; + @override String get switchAccountButton => 'Switch account'; diff --git a/lib/widgets/home.dart b/lib/widgets/home.dart index 6b5a4979282..b9ffa25a28c 100644 --- a/lib/widgets/home.dart +++ b/lib/widgets/home.dart @@ -17,6 +17,7 @@ import 'message_list.dart'; import 'page.dart'; import 'profile.dart'; import 'recent_dm_conversations.dart'; +import 'settings.dart'; import 'store.dart'; import 'subscription_list.dart'; import 'text.dart'; @@ -268,7 +269,7 @@ void _showMainMenu(BuildContext context, { const _SwitchAccountButton(), // TODO(#198): Set my status // const SizedBox(height: 8), - // TODO(#97): Settings + const _SettingsButton(), // TODO(#661): Notifications // const SizedBox(height: 8), const _AboutZulipButton(), @@ -559,6 +560,23 @@ class _SwitchAccountButton extends _MenuButton { } } +class _SettingsButton extends _MenuButton { + const _SettingsButton(); + + @override + IconData? get icon => ZulipIcons.settings; + + @override + String label(ZulipLocalizations zulipLocalizations) { + return zulipLocalizations.settingsPageTitle; + } + + @override + void onPressed(BuildContext context) { + Navigator.of(context).push(SettingsPage.buildRoute()); + } +} + class _AboutZulipButton extends _MenuButton { const _AboutZulipButton(); diff --git a/lib/widgets/icons.dart b/lib/widgets/icons.dart index ba21bec42f5..b40a9159906 100644 --- a/lib/widgets/icons.dart +++ b/lib/widgets/icons.dart @@ -105,29 +105,32 @@ abstract final class ZulipIcons { /// The Zulip custom icon "send". static const IconData send = IconData(0xf11b, fontFamily: "Zulip Icons"); + /// The Zulip custom icon "settings". + static const IconData settings = IconData(0xf11c, fontFamily: "Zulip Icons"); + /// The Zulip custom icon "share". - static const IconData share = IconData(0xf11c, fontFamily: "Zulip Icons"); + static const IconData share = IconData(0xf11d, fontFamily: "Zulip Icons"); /// The Zulip custom icon "share_ios". - static const IconData share_ios = IconData(0xf11d, fontFamily: "Zulip Icons"); + static const IconData share_ios = IconData(0xf11e, fontFamily: "Zulip Icons"); /// The Zulip custom icon "smile". - static const IconData smile = IconData(0xf11e, fontFamily: "Zulip Icons"); + static const IconData smile = IconData(0xf11f, fontFamily: "Zulip Icons"); /// The Zulip custom icon "star". - static const IconData star = IconData(0xf11f, fontFamily: "Zulip Icons"); + static const IconData star = IconData(0xf120, fontFamily: "Zulip Icons"); /// The Zulip custom icon "star_filled". - static const IconData star_filled = IconData(0xf120, fontFamily: "Zulip Icons"); + static const IconData star_filled = IconData(0xf121, fontFamily: "Zulip Icons"); /// The Zulip custom icon "topic". - static const IconData topic = IconData(0xf121, fontFamily: "Zulip Icons"); + static const IconData topic = IconData(0xf122, fontFamily: "Zulip Icons"); /// The Zulip custom icon "unmute". - static const IconData unmute = IconData(0xf122, fontFamily: "Zulip Icons"); + static const IconData unmute = IconData(0xf123, fontFamily: "Zulip Icons"); /// The Zulip custom icon "user". - static const IconData user = IconData(0xf123, fontFamily: "Zulip Icons"); + static const IconData user = IconData(0xf124, fontFamily: "Zulip Icons"); // END GENERATED ICON DATA } diff --git a/lib/widgets/settings.dart b/lib/widgets/settings.dart new file mode 100644 index 00000000000..4f87f109215 --- /dev/null +++ b/lib/widgets/settings.dart @@ -0,0 +1,63 @@ +import 'package:drift/drift.dart' hide Column; +import 'package:flutter/material.dart'; + +import '../generated/l10n/zulip_localizations.dart'; +import '../model/database.dart'; +import '../model/settings.dart'; +import 'page.dart'; +import 'store.dart'; + +class SettingsPage extends StatelessWidget { + const SettingsPage({super.key}); + + static Route buildRoute() { + return MaterialWidgetRoute(page: const SettingsPage()); + } + + @override + Widget build(BuildContext context) { + final globalStore = GlobalStoreWidget.of(context); + final zulipLocalizations = ZulipLocalizations.of(context); + + return Scaffold( + appBar: AppBar(title: Text(zulipLocalizations.settingsPageTitle)), + body: Column(children: [ + _Select(initialValue: globalStore.globalSettings.themeSetting), + ])); + } +} + +class _Select extends StatefulWidget { + const _Select({required this.initialValue}); + + final ThemeSetting initialValue; + + @override + State<_Select> createState() => _SelectState(); +} + +class _SelectState extends State<_Select> { + late ThemeSetting value = widget.initialValue; + + @override + Widget build(BuildContext context) { + final globalStore = GlobalStoreWidget.of(context); + return Column( + children: [ + const ListTile(title: Text('Theme')), + for (final option in ThemeSetting.values) + ListTile( + title: Text(option.name), + leading: Radio.adaptive( + value: option, + groupValue: value, + onChanged: (newValue) { + setState(() { + value = newValue!; + }); + globalStore.updateGlobalSettings(GlobalSettingsCompanion( + themeSetting: Value(value))); + })), + ]); + } +}