mirror of
https://github.com/ImranR98/Obtainium.git
synced 2025-08-12 01:50:15 +02:00
Look at all these colors!🌈
This commit is contained in:
@@ -22,6 +22,9 @@
|
|||||||
"requiredInBrackets": "(Required)",
|
"requiredInBrackets": "(Required)",
|
||||||
"dropdownNoOptsError": "ERROR: DROPDOWN MUST HAVE AT LEAST ONE OPT",
|
"dropdownNoOptsError": "ERROR: DROPDOWN MUST HAVE AT LEAST ONE OPT",
|
||||||
"colour": "Colour",
|
"colour": "Colour",
|
||||||
|
"standard": "Standard",
|
||||||
|
"custom": "Custom",
|
||||||
|
"useMaterialYou": "Use Material You",
|
||||||
"githubStarredRepos": "GitHub Starred Repos",
|
"githubStarredRepos": "GitHub Starred Repos",
|
||||||
"uname": "Username",
|
"uname": "Username",
|
||||||
"wrongArgNum": "Wrong number of arguments provided",
|
"wrongArgNum": "Wrong number of arguments provided",
|
||||||
|
@@ -22,6 +22,9 @@
|
|||||||
"requiredInBrackets": "(обязательно)",
|
"requiredInBrackets": "(обязательно)",
|
||||||
"dropdownNoOptsError": "Ошибка: в выпадающем списке должна быть выбрана хотя бы одна настройка",
|
"dropdownNoOptsError": "Ошибка: в выпадающем списке должна быть выбрана хотя бы одна настройка",
|
||||||
"colour": "Цвет",
|
"colour": "Цвет",
|
||||||
|
"standard": "Стандартный",
|
||||||
|
"custom": "Индивидуальный",
|
||||||
|
"useMaterialYou": "Использовать Material You",
|
||||||
"githubStarredRepos": "Избранные репозитории GitHub",
|
"githubStarredRepos": "Избранные репозитории GitHub",
|
||||||
"uname": "Имя пользователя",
|
"uname": "Имя пользователя",
|
||||||
"wrongArgNum": "Неправильное количество предоставленных аргументов",
|
"wrongArgNum": "Неправильное количество предоставленных аргументов",
|
||||||
|
@@ -119,8 +119,6 @@ void main() async {
|
|||||||
BackgroundFetch.registerHeadlessTask(backgroundFetchHeadlessTask);
|
BackgroundFetch.registerHeadlessTask(backgroundFetchHeadlessTask);
|
||||||
}
|
}
|
||||||
|
|
||||||
var defaultThemeColour = Colors.deepPurple;
|
|
||||||
|
|
||||||
class Obtainium extends StatefulWidget {
|
class Obtainium extends StatefulWidget {
|
||||||
const Obtainium({super.key});
|
const Obtainium({super.key});
|
||||||
|
|
||||||
@@ -214,15 +212,13 @@ class _ObtainiumState extends State<Obtainium> {
|
|||||||
// Decide on a colour/brightness scheme based on OS and user settings
|
// Decide on a colour/brightness scheme based on OS and user settings
|
||||||
ColorScheme lightColorScheme;
|
ColorScheme lightColorScheme;
|
||||||
ColorScheme darkColorScheme;
|
ColorScheme darkColorScheme;
|
||||||
if (lightDynamic != null &&
|
if (lightDynamic != null && darkDynamic != null && settingsProvider.useMaterialYou) {
|
||||||
darkDynamic != null &&
|
|
||||||
settingsProvider.colour == ColourSettings.materialYou) {
|
|
||||||
lightColorScheme = lightDynamic.harmonized();
|
lightColorScheme = lightDynamic.harmonized();
|
||||||
darkColorScheme = darkDynamic.harmonized();
|
darkColorScheme = darkDynamic.harmonized();
|
||||||
} else {
|
} else {
|
||||||
lightColorScheme = ColorScheme.fromSeed(seedColor: defaultThemeColour);
|
lightColorScheme = ColorScheme.fromSeed(seedColor: settingsProvider.themeColor);
|
||||||
darkColorScheme = ColorScheme.fromSeed(
|
darkColorScheme = ColorScheme.fromSeed(
|
||||||
seedColor: defaultThemeColour, brightness: Brightness.dark);
|
seedColor: settingsProvider.themeColor, brightness: Brightness.dark);
|
||||||
}
|
}
|
||||||
|
|
||||||
// set the background and surface colors to pure black in the amoled theme
|
// set the background and surface colors to pure black in the amoled theme
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
import 'package:device_info_plus/device_info_plus.dart';
|
import 'package:device_info_plus/device_info_plus.dart';
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:equations/equations.dart';
|
import 'package:equations/equations.dart';
|
||||||
|
import 'package:flex_color_picker/flex_color_picker.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:obtainium/components/custom_app_bar.dart';
|
import 'package:obtainium/components/custom_app_bar.dart';
|
||||||
import 'package:obtainium/components/generated_form.dart';
|
import 'package:obtainium/components/generated_form.dart';
|
||||||
@@ -30,6 +31,10 @@ class _SettingsPageState extends State<SettingsPage> {
|
|||||||
late SplineInterpolation updateIntervalInterpolator; // 🤓
|
late SplineInterpolation updateIntervalInterpolator; // 🤓
|
||||||
String updateIntervalLabel = tr('neverManualOnly');
|
String updateIntervalLabel = tr('neverManualOnly');
|
||||||
bool showIntervalLabel = true;
|
bool showIntervalLabel = true;
|
||||||
|
final Map<ColorSwatch<Object>, String> colorsNameMap =
|
||||||
|
<ColorSwatch<Object>, String> {
|
||||||
|
ColorTools.createPrimarySwatch(obtainiumThemeColor): 'Obtainium'
|
||||||
|
};
|
||||||
|
|
||||||
void initUpdateIntervalInterpolator() {
|
void initUpdateIntervalInterpolator() {
|
||||||
List<InterpolationNode> nodes = [];
|
List<InterpolationNode> nodes = [];
|
||||||
@@ -111,24 +116,105 @@ class _SettingsPageState extends State<SettingsPage> {
|
|||||||
future: DeviceInfoPlugin().androidInfo
|
future: DeviceInfoPlugin().androidInfo
|
||||||
);
|
);
|
||||||
|
|
||||||
var colourDropdown = DropdownButtonFormField(
|
Future<bool> colorPickerDialog() async {
|
||||||
decoration: InputDecoration(labelText: tr('colour')),
|
return ColorPicker(
|
||||||
value: settingsProvider.colour,
|
color: settingsProvider.themeColor,
|
||||||
items: const [
|
onColorChanged: (Color color) =>
|
||||||
DropdownMenuItem(
|
setState(() =>
|
||||||
value: ColourSettings.basic,
|
settingsProvider.themeColor = color
|
||||||
child: Text('Obtainium'),
|
),
|
||||||
),
|
actionButtons: const ColorPickerActionButtons(
|
||||||
DropdownMenuItem(
|
okButton: true,
|
||||||
value: ColourSettings.materialYou,
|
closeButton: true,
|
||||||
child: Text('Material You'),
|
dialogActionButtons: false,
|
||||||
)
|
),
|
||||||
],
|
pickersEnabled: const <ColorPickerType, bool>{
|
||||||
onChanged: (value) {
|
ColorPickerType.both: false,
|
||||||
if (value != null) {
|
ColorPickerType.primary: false,
|
||||||
settingsProvider.colour = value;
|
ColorPickerType.accent: false,
|
||||||
|
ColorPickerType.bw: false,
|
||||||
|
ColorPickerType.custom: true,
|
||||||
|
ColorPickerType.wheel: true,
|
||||||
|
},
|
||||||
|
pickerTypeLabels: <ColorPickerType, String>{
|
||||||
|
ColorPickerType.custom: tr('standard'),
|
||||||
|
ColorPickerType.wheel: tr('custom')
|
||||||
|
},
|
||||||
|
title: Text(tr('selectX', args: [tr('colour')]),
|
||||||
|
style: Theme.of(context).textTheme.titleLarge),
|
||||||
|
wheelDiameter: 192,
|
||||||
|
wheelSquareBorderRadius: 32,
|
||||||
|
width: 48,
|
||||||
|
height: 48,
|
||||||
|
borderRadius: 24,
|
||||||
|
spacing: 8,
|
||||||
|
runSpacing: 8,
|
||||||
|
enableShadesSelection: false,
|
||||||
|
customColorSwatchesAndNames: colorsNameMap,
|
||||||
|
showMaterialName: true,
|
||||||
|
showColorName: true,
|
||||||
|
materialNameTextStyle: Theme.of(context).textTheme.bodySmall,
|
||||||
|
colorNameTextStyle: Theme.of(context).textTheme.bodySmall,
|
||||||
|
copyPasteBehavior: const ColorPickerCopyPasteBehavior(longPressMenu: true),
|
||||||
|
).showPickerDialog(
|
||||||
|
context,
|
||||||
|
transitionBuilder: (BuildContext context,
|
||||||
|
Animation<double> a1, Animation<double> a2, Widget widget) {
|
||||||
|
final double curvedValue = Curves.easeInCubic.transform(a1.value);
|
||||||
|
return Transform(
|
||||||
|
alignment: Alignment.center,
|
||||||
|
transform: Matrix4.diagonal3Values(curvedValue, curvedValue, 1),
|
||||||
|
child: Opacity(
|
||||||
|
opacity: curvedValue,
|
||||||
|
child: widget
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
transitionDuration: const Duration(milliseconds: 250),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
var colorPicker = ListTile(
|
||||||
|
dense: true,
|
||||||
|
contentPadding: EdgeInsets.zero,
|
||||||
|
title: Text(tr('selectX', args: [tr('colour')])),
|
||||||
|
subtitle: Text("${ColorTools.nameThatColor(settingsProvider.themeColor)} "
|
||||||
|
"(${ColorTools.materialNameAndCode(settingsProvider.themeColor,
|
||||||
|
colorSwatchNameMap: colorsNameMap)})"),
|
||||||
|
trailing: ColorIndicator(
|
||||||
|
width: 40,
|
||||||
|
height: 40,
|
||||||
|
borderRadius: 20,
|
||||||
|
color: settingsProvider.themeColor,
|
||||||
|
onSelectFocus: false,
|
||||||
|
onSelect: () async {
|
||||||
|
final Color colorBeforeDialog = settingsProvider.themeColor;
|
||||||
|
if (!(await colorPickerDialog())) {
|
||||||
|
setState(() {
|
||||||
|
settingsProvider.themeColor = colorBeforeDialog;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
var useMaterialThemeSwitch = FutureBuilder(
|
||||||
|
builder: (ctx, val) {
|
||||||
|
return ((val.data?.version.sdkInt ?? 0) >= 31) ?
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Flexible(child: Text(tr('useMaterialYou'))),
|
||||||
|
Switch(
|
||||||
|
value: settingsProvider.useMaterialYou,
|
||||||
|
onChanged: (value) {
|
||||||
|
settingsProvider.useMaterialYou = value;
|
||||||
|
})
|
||||||
|
],
|
||||||
|
) : const SizedBox.shrink();
|
||||||
|
},
|
||||||
|
future: DeviceInfoPlugin().androidInfo
|
||||||
|
);
|
||||||
|
|
||||||
var sortDropdown = DropdownButtonFormField(
|
var sortDropdown = DropdownButtonFormField(
|
||||||
isExpanded: true,
|
isExpanded: true,
|
||||||
@@ -510,8 +596,9 @@ class _SettingsPageState extends State<SettingsPage> {
|
|||||||
})
|
})
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
colourDropdown,
|
|
||||||
height16,
|
height16,
|
||||||
|
useMaterialThemeSwitch,
|
||||||
|
if (!settingsProvider.useMaterialYou) colorPicker,
|
||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
@@ -17,11 +17,10 @@ import 'package:shared_storage/shared_storage.dart' as saf;
|
|||||||
String obtainiumTempId = 'imranr98_obtainium_${GitHub().hosts[0]}';
|
String obtainiumTempId = 'imranr98_obtainium_${GitHub().hosts[0]}';
|
||||||
String obtainiumId = 'dev.imranr.obtainium';
|
String obtainiumId = 'dev.imranr.obtainium';
|
||||||
String obtainiumUrl = 'https://github.com/ImranR98/Obtainium';
|
String obtainiumUrl = 'https://github.com/ImranR98/Obtainium';
|
||||||
|
Color obtainiumThemeColor = const Color(0xFF6438B5);
|
||||||
|
|
||||||
enum ThemeSettings { light, dark, system }
|
enum ThemeSettings { light, dark, system }
|
||||||
|
|
||||||
enum ColourSettings { basic, materialYou }
|
|
||||||
|
|
||||||
enum SortColumnSettings { added, nameAuthor, authorName, releaseDate }
|
enum SortColumnSettings { added, nameAuthor, authorName, releaseDate }
|
||||||
|
|
||||||
enum SortOrderSettings { ascending, descending }
|
enum SortOrderSettings { ascending, descending }
|
||||||
@@ -68,13 +67,23 @@ class SettingsProvider with ChangeNotifier {
|
|||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
ColourSettings get colour {
|
Color get themeColor {
|
||||||
return ColourSettings
|
int? colorCode = prefs?.getInt('themeColor');
|
||||||
.values[prefs?.getInt('colour') ?? ColourSettings.basic.index];
|
return (colorCode != null) ?
|
||||||
|
Color(colorCode) : obtainiumThemeColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
set colour(ColourSettings t) {
|
set themeColor(Color themeColor) {
|
||||||
prefs?.setInt('colour', t.index);
|
prefs?.setInt('themeColor', themeColor.value);
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool get useMaterialYou {
|
||||||
|
return prefs?.getBool('useMaterialYou') ?? false;
|
||||||
|
}
|
||||||
|
|
||||||
|
set useMaterialYou(bool useMaterialYou) {
|
||||||
|
prefs?.setBool('useMaterialYou', useMaterialYou);
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
26
pubspec.lock
26
pubspec.lock
@@ -283,6 +283,22 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.0"
|
version: "1.1.0"
|
||||||
|
flex_color_picker:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: flex_color_picker
|
||||||
|
sha256: "5c846437069fb7afdd7ade6bf37e628a71d2ab0787095ddcb1253bf9345d5f3a"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.4.1"
|
||||||
|
flex_seed_scheme:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flex_seed_scheme
|
||||||
|
sha256: "4cee2f1d07259f77e8b36f4ec5f35499d19e74e17c7dce5b819554914082bc01"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.5.0"
|
||||||
flutter:
|
flutter:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description: flutter
|
description: flutter
|
||||||
@@ -659,10 +675,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: petitparser
|
name: petitparser
|
||||||
sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27
|
sha256: cb3798bef7fc021ac45b308f4b51208a152792445cce0448c9a4ba5879dd8750
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.0.2"
|
version: "5.4.0"
|
||||||
platform:
|
platform:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1041,10 +1057,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: xml
|
name: xml
|
||||||
sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226
|
sha256: "5bc72e1e45e941d825fd7468b9b4cc3b9327942649aeb6fc5cdbf135f0a86e84"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.5.0"
|
version: "6.3.0"
|
||||||
yaml:
|
yaml:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1054,5 +1070,5 @@ packages:
|
|||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.2"
|
version: "3.1.2"
|
||||||
sdks:
|
sdks:
|
||||||
dart: ">=3.3.0 <4.0.0"
|
dart: ">=3.3.3 <4.0.0"
|
||||||
flutter: ">=3.19.0"
|
flutter: ">=3.19.0"
|
||||||
|
@@ -69,6 +69,7 @@ dependencies:
|
|||||||
app_links: ^4.0.0
|
app_links: ^4.0.0
|
||||||
background_fetch: ^1.2.1
|
background_fetch: ^1.2.1
|
||||||
equations: ^5.0.2
|
equations: ^5.0.2
|
||||||
|
flex_color_picker: ^3.4.1
|
||||||
android_system_font:
|
android_system_font:
|
||||||
git:
|
git:
|
||||||
url: https://github.com/re7gog/android_system_font
|
url: https://github.com/re7gog/android_system_font
|
||||||
|
Reference in New Issue
Block a user