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)));
+ })),
+ ]);
+ }
+}