diff --git a/assets/icons/ZulipIcons.ttf b/assets/icons/ZulipIcons.ttf index 57a301f2e81..215f3d552f1 100644 Binary files a/assets/icons/ZulipIcons.ttf and b/assets/icons/ZulipIcons.ttf differ diff --git a/assets/icons/settings.svg b/assets/icons/settings.svg new file mode 100644 index 00000000000..202eb2deaf1 --- /dev/null +++ b/assets/icons/settings.svg @@ -0,0 +1,4 @@ + + + + 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))); + })), + ]); + } +}