Add settings page #46

Merged
Henry-Hiles merged 34 commits from settings-page into main 2026-07-17 20:36:42 -04:00
4 changed files with 45 additions and 35 deletions
Showing only changes of commit b2fd944293 - Show all commits
Henry Hiles 2026-07-16 23:53:01 -04:00
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs

View file

@ -1,7 +1,7 @@
import "package:flutter/material.dart"; import "package:flutter/material.dart";
extension SchemeToTheme on ColorScheme { extension SchemeToTheme on ColorScheme {
ThemeData get theme => .from(colorScheme: this).copyWith( ThemeData getTheme(bool useDefaultFont) => .from(colorScheme: this).copyWith(
cardTheme: .new(color: primaryContainer), cardTheme: .new(color: primaryContainer),
popupMenuTheme: .new( popupMenuTheme: .new(
shape: RoundedRectangleBorder(borderRadius: .circular(16)), shape: RoundedRectangleBorder(borderRadius: .circular(16)),
@ -11,10 +11,12 @@ extension SchemeToTheme on ColorScheme {
titleSpacing: 0, titleSpacing: 0,
backgroundColor: surfaceContainerLow, backgroundColor: surfaceContainerLow,
), ),
textTheme: ThemeData( textTheme: useDefaultFont
fontFamilyFallback: ["sans", "emoji"], ? null
brightness: brightness, : ThemeData(
).textTheme, fontFamilyFallback: ["sans", "emoji"],
brightness: brightness,
).textTheme,
inputDecorationTheme: const InputDecorationTheme( inputDecorationTheme: const InputDecorationTheme(
border: OutlineInputBorder(), border: OutlineInputBorder(),
), ),

View file

@ -8,6 +8,7 @@ import "package:nexus/controllers/client_controller.dart";
import "package:nexus/controllers/client_state_controller.dart"; import "package:nexus/controllers/client_state_controller.dart";
import "package:nexus/controllers/header_controller.dart"; import "package:nexus/controllers/header_controller.dart";
import "package:nexus/controllers/multi_provider_controller.dart"; import "package:nexus/controllers/multi_provider_controller.dart";
import "package:nexus/controllers/settings_controller.dart";
import "package:nexus/controllers/shared_prefs_controller.dart"; import "package:nexus/controllers/shared_prefs_controller.dart";
import "package:nexus/helpers/extensions/better_when.dart"; import "package:nexus/helpers/extensions/better_when.dart";
import "package:nexus/helpers/extensions/scheme_to_theme.dart"; import "package:nexus/helpers/extensions/scheme_to_theme.dart";
@ -90,20 +91,43 @@ class App extends StatelessWidget {
@override @override
Widget build(BuildContext context) => DynamicColorBuilder( Widget build(BuildContext context) => DynamicColorBuilder(
builder: (lightDynamic, darkDynamic) => MaterialApp( builder: (lightDynamic, darkDynamic) => Consumer(
navigatorKey: navigatorKey, builder: (context, ref, child) => MaterialApp(
debugShowCheckedModeBanner: false, navigatorKey: navigatorKey,
// Use indigo to work around bugs in theme generation debugShowCheckedModeBanner: false,
theme: (lightDynamic ?? ColorScheme.fromSeed(seedColor: Colors.indigo)) // Use indigo to work around bugs in theme generation
.theme, theme: (lightDynamic ?? ColorScheme.fromSeed(seedColor: Colors.indigo))
darkTheme: .getTheme(
(darkDynamic ?? ref
ColorScheme.fromSeed( .watch(SettingsController.provider)
seedColor: Colors.indigo, .maybeWhen(
brightness: Brightness.dark, orElse: () => true,
)) data: (settings) => settings.useSystemFont,
.theme, ),
home: Scaffold( ),
darkTheme:
(darkDynamic ??
ColorScheme.fromSeed(
seedColor: Colors.indigo,
brightness: Brightness.dark,
))
.getTheme(
ref
.watch(SettingsController.provider)
.maybeWhen(
orElse: () => true,
data: (settings) => settings.useSystemFont,
),
),
themeMode: ref
.watch(SettingsController.provider)
.maybeWhen(
data: (settings) => settings.theme,
orElse: () => ThemeMode.system,
),
home: child,
),
child: Scaffold(
body: Consumer( body: Consumer(
builder: (_, ref, _) => ref builder: (_, ref, _) => ref
.watch( .watch(

View file

@ -7,7 +7,6 @@ part "settings.g.dart";
abstract class Settings with _$Settings { abstract class Settings with _$Settings {
const factory Settings({ const factory Settings({
@Default(ThemeMode.light) ThemeMode theme, @Default(ThemeMode.light) ThemeMode theme,
@Default(true) bool useClientSideGenerations,
@Default(false) bool useSystemFont, @Default(false) bool useSystemFont,
}) = _Settings; }) = _Settings;

View file

@ -48,21 +48,6 @@ class SettingsPage extends ConsumerWidget {
.onError(showError), .onError(showError),
), ),
), ),
Setting(
title: "Use Client Side Decorations",
description:
"On desktop, toggle between client-side or server-side decorations",
builder: (title, description) => SwitchListTile(
title: Text(title),
secondary: Icon(Icons.border_top),
subtitle: Text(description),
value: settings.useClientSideGenerations,
onChanged: (value) => ref
.watch(SettingsController.provider.notifier)
.set(settings.copyWith(useClientSideGenerations: value))
.onError(showError),
),
),
Setting( Setting(
title: "Use System Font", title: "Use System Font",
description: description: