Skip to content
Snippets Groups Projects
Commit 45525f83 authored by Benoît Harrault's avatar Benoît Harrault
Browse files

Add light/dart theme setting

parent 787c4b1d
Branches
Tags
1 merge request!60Resolve "Add light/dark theme selector"
Pipeline #5469 passed
Showing
with 103 additions and 53 deletions
org.gradle.jvmargs=-Xmx1536M org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true android.useAndroidX=true
android.enableJetifier=true android.enableJetifier=true
app.versionName=0.0.56 app.versionName=0.0.57
app.versionCode=56 app.versionCode=57
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
"top_artists_title": "Top artists ({daysCount} days)", "top_artists_title": "Top artists ({daysCount} days)",
"settings_title": "Settings", "settings_title": "Settings",
"settings_label_theme": "Theme mode",
"settings_title_global": "Global:", "settings_title_global": "Global:",
"settings_label_username": "Username: ", "settings_label_username": "Username: ",
"settings_label_security_token": "Security token: ", "settings_label_security_token": "Security token: ",
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
"top_artists_title": "Top artistes ({daysCount} jours)", "top_artists_title": "Top artistes ({daysCount} jours)",
"settings_title": "Paramètres", "settings_title": "Paramètres",
"settings_label_theme": "Thème de couleurs",
"settings_title_global": "Généraux :", "settings_title_global": "Généraux :",
"settings_label_username": "Utilisateur : ", "settings_label_username": "Utilisateur : ",
"settings_label_security_token": "Jeton de sécurité : ", "settings_label_security_token": "Jeton de sécurité : ",
......
Add light/dark theme setting.
Ajout d'un réglage de thème clair/sombre.
import 'package:equatable/equatable.dart';
import 'package:flutter/material.dart';
import 'package:hydrated_bloc/hydrated_bloc.dart';
part 'theme_state.dart';
class ThemeCubit extends HydratedCubit<ThemeModeState> {
ThemeCubit() : super(const ThemeModeState());
void getTheme(ThemeModeState state) {
emit(state);
}
@override
ThemeModeState? fromJson(Map<String, dynamic> json) {
switch (json['themeMode']) {
case 'ThemeMode.dark':
return const ThemeModeState(themeMode: ThemeMode.dark);
case 'ThemeMode.light':
return const ThemeModeState(themeMode: ThemeMode.light);
case 'ThemeMode.system':
default:
return const ThemeModeState(themeMode: ThemeMode.system);
}
}
@override
Map<String, String>? toJson(ThemeModeState state) {
return <String, String>{'themeMode': state.themeMode.toString()};
}
}
part of 'theme_cubit.dart';
@immutable
class ThemeModeState extends Equatable {
const ThemeModeState({
this.themeMode,
});
final ThemeMode? themeMode;
@override
List<Object?> get props => <Object?>[
themeMode,
];
}
...@@ -20,6 +20,7 @@ import 'package:scrobbles/cubit/data_statistics_recent_cubit.dart'; ...@@ -20,6 +20,7 @@ import 'package:scrobbles/cubit/data_statistics_recent_cubit.dart';
import 'package:scrobbles/cubit/data_timeline_cubit.dart'; import 'package:scrobbles/cubit/data_timeline_cubit.dart';
import 'package:scrobbles/cubit/data_top_artists_cubit.dart'; import 'package:scrobbles/cubit/data_top_artists_cubit.dart';
import 'package:scrobbles/cubit/settings_cubit.dart'; import 'package:scrobbles/cubit/settings_cubit.dart';
import 'package:scrobbles/cubit/theme_cubit.dart';
import 'package:scrobbles/ui/skeleton.dart'; import 'package:scrobbles/ui/skeleton.dart';
void main() async { void main() async {
...@@ -67,18 +68,26 @@ class MyApp extends StatelessWidget { ...@@ -67,18 +68,26 @@ class MyApp extends StatelessWidget {
create: (context) => DataStatisticsRecentCubit()), create: (context) => DataStatisticsRecentCubit()),
BlocProvider<DataTimelineCubit>(create: (context) => DataTimelineCubit()), BlocProvider<DataTimelineCubit>(create: (context) => DataTimelineCubit()),
BlocProvider<DataTopArtistsCubit>(create: (context) => DataTopArtistsCubit()), BlocProvider<DataTopArtistsCubit>(create: (context) => DataTopArtistsCubit()),
BlocProvider<ThemeCubit>(create: (context) => ThemeCubit()),
], ],
child: MaterialApp( child: BlocBuilder<ThemeCubit, ThemeModeState>(
builder: (BuildContext context, ThemeModeState state) {
return MaterialApp(
title: 'Scrobbles', title: 'Scrobbles',
theme: appTheme,
home: const SkeletonScreen(), home: const SkeletonScreen(),
// Theme stuff
theme: lightTheme,
darkTheme: darkTheme,
themeMode: state.themeMode,
// Localization stuff // Localization stuff
localizationsDelegates: context.localizationDelegates, localizationsDelegates: context.localizationDelegates,
supportedLocales: context.supportedLocales, supportedLocales: context.supportedLocales,
locale: context.locale, locale: context.locale,
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
), );
}),
); );
} }
} }
...@@ -162,7 +162,7 @@ class CustomChart extends StatelessWidget { ...@@ -162,7 +162,7 @@ class CustomChart extends StatelessWidget {
child: Text( child: Text(
text, text,
style: TextStyle( style: TextStyle(
color: AppColors.mainTextColor1, // color: getTextColor(),
fontSize: titleFontSize, fontSize: titleFontSize,
), ),
), ),
...@@ -180,7 +180,6 @@ class CustomChart extends StatelessWidget { ...@@ -180,7 +180,6 @@ class CustomChart extends StatelessWidget {
child: Text( child: Text(
tr(dayShortName), tr(dayShortName),
style: const TextStyle( style: const TextStyle(
color: AppColors.mainTextColor1,
fontSize: 11, fontSize: 11,
), ),
), ),
...@@ -200,7 +199,6 @@ class CustomChart extends StatelessWidget { ...@@ -200,7 +199,6 @@ class CustomChart extends StatelessWidget {
child: Text( child: Text(
text, text,
style: TextStyle( style: TextStyle(
color: AppColors.mainTextColor1,
fontSize: titleFontSize, fontSize: titleFontSize,
), ),
), ),
...@@ -224,7 +222,6 @@ class CustomChart extends StatelessWidget { ...@@ -224,7 +222,6 @@ class CustomChart extends StatelessWidget {
child: Text( child: Text(
value.toInt().toString() + suffix, value.toInt().toString() + suffix,
style: TextStyle( style: TextStyle(
color: AppColors.mainTextColor1,
fontSize: titleFontSize, fontSize: titleFontSize,
), ),
), ),
......
...@@ -5,10 +5,10 @@ import 'package:scrobbles/models/counts_by_day.dart'; ...@@ -5,10 +5,10 @@ import 'package:scrobbles/models/counts_by_day.dart';
import 'package:scrobbles/ui/widgets/abstracts/custom_bar_chart.dart'; import 'package:scrobbles/ui/widgets/abstracts/custom_bar_chart.dart';
class ChartCountsByDay extends CustomBarChart { class ChartCountsByDay extends CustomBarChart {
final CountsByDayData chartData;
const ChartCountsByDay({super.key, required this.chartData}); const ChartCountsByDay({super.key, required this.chartData});
final CountsByDayData chartData;
@override @override
final double verticalTicksInterval = 5; final double verticalTicksInterval = 5;
@override @override
...@@ -31,7 +31,7 @@ class ChartCountsByDay extends CustomBarChart { ...@@ -31,7 +31,7 @@ class ChartCountsByDay extends CustomBarChart {
return getBarChart( return getBarChart(
barWidth: getBarWidth(maxWidth, barsCount), barWidth: getBarWidth(maxWidth, barsCount),
backgroundColor: Theme.of(context).colorScheme.onSurface, backgroundColor: Theme.of(context).colorScheme.background,
); );
}, },
), ),
......
...@@ -7,10 +7,10 @@ import 'package:scrobbles/ui/widgets/abstracts/custom_bar_chart.dart'; ...@@ -7,10 +7,10 @@ import 'package:scrobbles/ui/widgets/abstracts/custom_bar_chart.dart';
import 'package:scrobbles/utils/color_extensions.dart'; import 'package:scrobbles/utils/color_extensions.dart';
class ChartCountsByHour extends CustomBarChart { class ChartCountsByHour extends CustomBarChart {
final CountsByHourData chartData;
const ChartCountsByHour({super.key, required this.chartData}); const ChartCountsByHour({super.key, required this.chartData});
final CountsByHourData chartData;
@override @override
final double verticalTicksInterval = 5; final double verticalTicksInterval = 5;
@override @override
...@@ -33,7 +33,7 @@ class ChartCountsByHour extends CustomBarChart { ...@@ -33,7 +33,7 @@ class ChartCountsByHour extends CustomBarChart {
return getBarChart( return getBarChart(
barWidth: getBarWidth(maxWidth, barsCount), barWidth: getBarWidth(maxWidth, barsCount),
backgroundColor: Theme.of(context).colorScheme.onSurface, backgroundColor: Theme.of(context).colorScheme.background,
); );
}, },
), ),
......
...@@ -7,10 +7,10 @@ import 'package:scrobbles/ui/widgets/abstracts/custom_bar_chart.dart'; ...@@ -7,10 +7,10 @@ import 'package:scrobbles/ui/widgets/abstracts/custom_bar_chart.dart';
import 'package:scrobbles/utils/color_extensions.dart'; import 'package:scrobbles/utils/color_extensions.dart';
class ChartDiscoveriesArtists extends CustomBarChart { class ChartDiscoveriesArtists extends CustomBarChart {
final DiscoveriesData chartData;
const ChartDiscoveriesArtists({super.key, required this.chartData}); const ChartDiscoveriesArtists({super.key, required this.chartData});
final DiscoveriesData chartData;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (chartData.data.keys.isEmpty) { if (chartData.data.keys.isEmpty) {
...@@ -28,7 +28,7 @@ class ChartDiscoveriesArtists extends CustomBarChart { ...@@ -28,7 +28,7 @@ class ChartDiscoveriesArtists extends CustomBarChart {
return getBarChart( return getBarChart(
barWidth: getBarWidth(maxWidth, barsCount), barWidth: getBarWidth(maxWidth, barsCount),
backgroundColor: Theme.of(context).colorScheme.onSurface, backgroundColor: Theme.of(context).colorScheme.background,
); );
}, },
), ),
......
...@@ -7,10 +7,10 @@ import 'package:scrobbles/ui/widgets/abstracts/custom_bar_chart.dart'; ...@@ -7,10 +7,10 @@ import 'package:scrobbles/ui/widgets/abstracts/custom_bar_chart.dart';
import 'package:scrobbles/utils/color_extensions.dart'; import 'package:scrobbles/utils/color_extensions.dart';
class ChartDiscoveriesTracks extends CustomBarChart { class ChartDiscoveriesTracks extends CustomBarChart {
final DiscoveriesData chartData;
const ChartDiscoveriesTracks({super.key, required this.chartData}); const ChartDiscoveriesTracks({super.key, required this.chartData});
final DiscoveriesData chartData;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (chartData.data.keys.isEmpty) { if (chartData.data.keys.isEmpty) {
...@@ -28,7 +28,7 @@ class ChartDiscoveriesTracks extends CustomBarChart { ...@@ -28,7 +28,7 @@ class ChartDiscoveriesTracks extends CustomBarChart {
return getBarChart( return getBarChart(
barWidth: getBarWidth(maxWidth, barsCount), barWidth: getBarWidth(maxWidth, barsCount),
backgroundColor: Theme.of(context).colorScheme.onSurface, backgroundColor: Theme.of(context).colorScheme.background,
); );
}, },
), ),
......
...@@ -7,10 +7,10 @@ import 'package:scrobbles/models/heatmap.dart'; ...@@ -7,10 +7,10 @@ import 'package:scrobbles/models/heatmap.dart';
import 'package:scrobbles/ui/widgets/abstracts/custom_chart.dart'; import 'package:scrobbles/ui/widgets/abstracts/custom_chart.dart';
class ChartHeatmap extends CustomChart { class ChartHeatmap extends CustomChart {
final HeatmapData chartData;
const ChartHeatmap({super.key, required this.chartData}); const ChartHeatmap({super.key, required this.chartData});
final HeatmapData chartData;
@override @override
final double chartHeight = 150.0; final double chartHeight = 150.0;
@override @override
...@@ -133,7 +133,6 @@ class ChartHeatmap extends CustomChart { ...@@ -133,7 +133,6 @@ class ChartHeatmap extends CustomChart {
child: Text( child: Text(
tr(dayShortName), tr(dayShortName),
style: TextStyle( style: TextStyle(
color: AppColors.mainTextColor1,
fontSize: titleFontSize, fontSize: titleFontSize,
), ),
), ),
......
...@@ -6,10 +6,10 @@ import 'package:scrobbles/models/timeline.dart'; ...@@ -6,10 +6,10 @@ import 'package:scrobbles/models/timeline.dart';
import 'package:scrobbles/ui/widgets/abstracts/custom_bar_chart.dart'; import 'package:scrobbles/ui/widgets/abstracts/custom_bar_chart.dart';
class ChartTimelineCounts extends CustomBarChart { class ChartTimelineCounts extends CustomBarChart {
final TimelineData chartData;
const ChartTimelineCounts({super.key, required this.chartData}); const ChartTimelineCounts({super.key, required this.chartData});
final TimelineData chartData;
@override @override
final double verticalTicksInterval = 50; final double verticalTicksInterval = 50;
...@@ -30,7 +30,7 @@ class ChartTimelineCounts extends CustomBarChart { ...@@ -30,7 +30,7 @@ class ChartTimelineCounts extends CustomBarChart {
return getBarChart( return getBarChart(
barWidth: getBarWidth(maxWidth, barsCount), barWidth: getBarWidth(maxWidth, barsCount),
backgroundColor: Theme.of(context).colorScheme.onSurface, backgroundColor: Theme.of(context).colorScheme.background,
); );
}, },
), ),
......
...@@ -7,10 +7,10 @@ import 'package:scrobbles/ui/widgets/abstracts/custom_line_chart.dart'; ...@@ -7,10 +7,10 @@ import 'package:scrobbles/ui/widgets/abstracts/custom_line_chart.dart';
import 'package:scrobbles/utils/color_extensions.dart'; import 'package:scrobbles/utils/color_extensions.dart';
class ChartTimelineEclecticism extends CustomLineChart { class ChartTimelineEclecticism extends CustomLineChart {
final TimelineData chartData;
const ChartTimelineEclecticism({super.key, required this.chartData}); const ChartTimelineEclecticism({super.key, required this.chartData});
final TimelineData chartData;
@override @override
final String verticalAxisTitleSuffix = '%'; final String verticalAxisTitleSuffix = '%';
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:fl_chart/fl_chart.dart'; import 'package:fl_chart/fl_chart.dart';
import 'package:scrobbles/config/app_colors.dart';
import 'package:scrobbles/models/topartists.dart'; import 'package:scrobbles/models/topartists.dart';
import 'package:scrobbles/ui/widgets/abstracts/custom_chart.dart'; import 'package:scrobbles/ui/widgets/abstracts/custom_chart.dart';
import 'package:scrobbles/utils/color_extensions.dart'; import 'package:scrobbles/utils/color_extensions.dart';
class ChartTopArtists extends CustomChart { class ChartTopArtists extends CustomChart {
final TopArtistsData chartData;
const ChartTopArtists({super.key, required this.chartData}); const ChartTopArtists({super.key, required this.chartData});
final TopArtistsData chartData;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return AspectRatio( return AspectRatio(
...@@ -68,7 +67,6 @@ class ChartTopArtists extends CustomChart { ...@@ -68,7 +67,6 @@ class ChartTopArtists extends CustomChart {
radius: radius, radius: radius,
titleStyle: const TextStyle( titleStyle: const TextStyle(
fontSize: fontSize, fontSize: fontSize,
color: AppColors.mainTextColor1,
shadows: shadows, shadows: shadows,
), ),
); );
......
...@@ -6,10 +6,10 @@ import 'package:scrobbles/ui/widgets/abstracts/custom_line_chart.dart'; ...@@ -6,10 +6,10 @@ import 'package:scrobbles/ui/widgets/abstracts/custom_line_chart.dart';
import 'package:scrobbles/utils/color_extensions.dart'; import 'package:scrobbles/utils/color_extensions.dart';
class ChartTopArtistsStream extends CustomLineChart { class ChartTopArtistsStream extends CustomLineChart {
final TopArtistsData chartData;
const ChartTopArtistsStream({super.key, required this.chartData}); const ChartTopArtistsStream({super.key, required this.chartData});
final TopArtistsData chartData;
@override @override
final double verticalTicksInterval = 10; final double verticalTicksInterval = 10;
@override @override
...@@ -68,8 +68,7 @@ class ChartTopArtistsStream extends CustomLineChart { ...@@ -68,8 +68,7 @@ class ChartTopArtistsStream extends CustomLineChart {
List<LineChartBarData> getDataStreamLine() { List<LineChartBarData> getDataStreamLine() {
final int artistsCount = final int artistsCount =
chartData.topArtistsStream[chartData.topArtistsStream.keys.first]?.length ?? chartData.topArtistsStream[chartData.topArtistsStream.keys.first]?.length ?? 0;
0;
List<LineChartBarData> lines = []; List<LineChartBarData> lines = [];
...@@ -133,8 +132,7 @@ class ChartTopArtistsStream extends CustomLineChart { ...@@ -133,8 +132,7 @@ class ChartTopArtistsStream extends CustomLineChart {
List<BetweenBarsData> getBetweenBarsData() { List<BetweenBarsData> getBetweenBarsData() {
final int artistsCount = final int artistsCount =
chartData.topArtistsStream[chartData.topArtistsStream.keys.first]?.length ?? chartData.topArtistsStream[chartData.topArtistsStream.keys.first]?.length ?? 0;
0;
return Iterable<int>.generate(artistsCount) return Iterable<int>.generate(artistsCount)
.toList() .toList()
......
...@@ -4,10 +4,10 @@ import 'package:flutter/material.dart'; ...@@ -4,10 +4,10 @@ import 'package:flutter/material.dart';
import 'package:scrobbles/models/statistics_global.dart'; import 'package:scrobbles/models/statistics_global.dart';
class ContentStatisticsGlobal extends StatelessWidget { class ContentStatisticsGlobal extends StatelessWidget {
final StatisticsGlobalData statistics;
const ContentStatisticsGlobal({super.key, required this.statistics}); const ContentStatisticsGlobal({super.key, required this.statistics});
final StatisticsGlobalData statistics;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final TextTheme textTheme = Theme.of(context).primaryTextTheme; final TextTheme textTheme = Theme.of(context).primaryTextTheme;
...@@ -22,9 +22,8 @@ class ContentStatisticsGlobal extends StatelessWidget { ...@@ -22,9 +22,8 @@ class ContentStatisticsGlobal extends StatelessWidget {
style: textTheme.bodyMedium, style: textTheme.bodyMedium,
).tr( ).tr(
namedArgs: { namedArgs: {
'count': statistics.totalCount != null 'count':
? statistics.totalCount.toString() statistics.totalCount != null ? statistics.totalCount.toString() : placeholder,
: placeholder,
}, },
), ),
Text( Text(
......
...@@ -4,10 +4,10 @@ import 'package:flutter/material.dart'; ...@@ -4,10 +4,10 @@ import 'package:flutter/material.dart';
import 'package:scrobbles/models/statistics_recent.dart'; import 'package:scrobbles/models/statistics_recent.dart';
class ContentStatisticsRecent extends StatelessWidget { class ContentStatisticsRecent extends StatelessWidget {
final StatisticsRecentData statistics;
const ContentStatisticsRecent({super.key, required this.statistics}); const ContentStatisticsRecent({super.key, required this.statistics});
final StatisticsRecentData statistics;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final TextTheme textTheme = Theme.of(context).primaryTextTheme; final TextTheme textTheme = Theme.of(context).primaryTextTheme;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment