Files
GitJournal/lib/settings/settings_theme.dart
Vishesh Handa 7fd1c99287 Use Provider's context.read/watch
Instead of the legacy Provider.of. Less scope of bugs this way and the
code is so much nicer to read.
2023-12-06 08:20:40 +01:00

171 lines
4.3 KiB
Dart

/*
* SPDX-FileCopyrightText: 2021 Vishesh Handa <me@vhanda.in>
*
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import 'package:carousel_slider/carousel_slider.dart';
// import 'package:flex_color_scheme/flex_color_scheme.dart';
import 'package:flutter/material.dart';
import 'package:gitjournal/l10n.dart';
import 'package:gitjournal/screens/home_screen.dart';
import 'package:gitjournal/settings/settings.dart';
import 'package:gitjournal/themes.dart';
import 'package:provider/provider.dart';
class SettingsThemeScreen extends StatefulWidget {
static const routePath = '/settings/ui/theme';
final Brightness brightness;
const SettingsThemeScreen(this.brightness, {super.key});
@override
_SettingsThemeState createState() => _SettingsThemeState();
}
class _SettingsThemeState extends State<SettingsThemeScreen> {
@override
Widget build(BuildContext context) {
var mq = MediaQuery.of(context);
var body = CarouselSlider(
options: CarouselOptions(
height: mq.size.height * 0.75,
enlargeCenterPage: true,
viewportFraction: 0.55,
enableInfiniteScroll: false,
),
items: [0, 1, 2, 3].map((i) {
return Builder(
builder: (BuildContext context) {
return Container(
width: MediaQuery.of(context).size.width,
margin: const EdgeInsets.symmetric(horizontal: 5.0),
// decoration: BoxDecoration(color: Colors.amber),
child: homeScreen(i),
);
},
);
}).toList(),
);
var title = widget.brightness == Brightness.light
? context.loc.settingsThemeLight
: context.loc.settingsThemeDark;
var settings = context.watch<Settings>();
var themeName = widget.brightness == Brightness.light
? settings.lightTheme
: settings.darkTheme;
return Theme(
data: Themes.fromName(themeName),
child: Scaffold(
appBar: AppBar(
title: Text(title),
leading: IconButton(
icon: const Icon(Icons.arrow_back),
onPressed: () {
Navigator.of(context).pop();
},
),
),
body: body,
),
);
}
Widget homeScreen(int i) {
var themes = [
/*
GitJournalTheme.fromFlexLight(
name: "Mandy Red",
flexScheme: FlexScheme.mandyRed,
),
GitJournalTheme.fromFlexLight(
name: "Blue",
flexScheme: FlexScheme.blue,
),
GitJournalTheme.fromFlexLight(
name: "Big Stone",
flexScheme: FlexScheme.bigStone,
),
GitJournalTheme.fromFlexLight(
name: "Amber",
flexScheme: FlexScheme.amber,
),
*/
];
return _GitJournalThemeView(gjTheme: themes[i]);
}
}
class _GitJournalThemeView extends StatelessWidget {
final GitJournalTheme gjTheme;
const _GitJournalThemeView({required this.gjTheme});
@override
Widget build(BuildContext context) {
var mq = MediaQuery.of(context);
var homeScreen = Theme(
data: gjTheme.themeData,
child: SizedBox(
width: mq.size.width,
height: mq.size.height,
child: IgnorePointer(
// ignoringSemantics: true,
child: HomeScreen(),
),
),
);
var theme = Theme.of(context);
return FittedBox(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
Container(
decoration: BoxDecoration(
border: Border.all(color: theme.dividerColor),
),
child: homeScreen,
),
const SizedBox(height: 32),
Text(
gjTheme.name,
style: Theme.of(context).textTheme.displaySmall!.copyWith(
fontWeight: FontWeight.w400,
),
),
],
),
),
);
}
}
// 1. Improve the carrosuel
// 3. Show Telegram type animation when changing the theme
// 5. Hook it up so the theme is actually saved
//
class GitJournalTheme {
final ThemeData themeData;
final String name;
GitJournalTheme({required this.name, required this.themeData});
/*
GitJournalTheme.fromFlexLight({
required this.name,
required FlexScheme flexScheme,
}) : themeData = FlexColorScheme.light(scheme: flexScheme).toTheme;
*/
}