forked from firka/student-legacy
1050 lines
52 KiB
Dart
1050 lines
52 KiB
Dart
// ignore_for_file: use_build_context_synchronously, deprecated_member_use
|
|
|
|
import 'package:refilc/models/settings.dart';
|
|
// import 'package:refilc/models/shared_theme.dart';
|
|
import 'package:refilc/theme/colors/accent.dart';
|
|
import 'package:refilc/theme/colors/colors.dart';
|
|
import 'package:refilc/theme/observer.dart';
|
|
import 'package:refilc/ui/widgets/grade/grade_tile.dart';
|
|
import 'package:refilc/ui/widgets/message/message_tile.dart';
|
|
import 'package:refilc_kreta_api/models/grade.dart';
|
|
import 'package:refilc_kreta_api/models/homework.dart';
|
|
import 'package:refilc_kreta_api/models/message.dart';
|
|
// import 'package:refilc_mobile_ui/common/action_button.dart';
|
|
import 'package:refilc_mobile_ui/common/filter_bar.dart';
|
|
import 'package:refilc_mobile_ui/common/panel/panel.dart';
|
|
import 'package:refilc_mobile_ui/common/widgets/grade/new_grades.dart';
|
|
import 'package:refilc_mobile_ui/common/widgets/homework/homework_tile.dart';
|
|
// import 'package:refilc_plus/models/premium_scopes.dart';
|
|
// import 'package:refilc_plus/providers/plus_provider.dart';
|
|
import 'package:refilc_kreta_api/providers/share_provider.dart';
|
|
import 'package:refilc/ui/flutter_colorpicker/colorpicker.dart';
|
|
// import 'package:refilc_plus/ui/mobile/plus/upsell.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/services.dart';
|
|
import 'package:flutter_feather_icons/flutter_feather_icons.dart';
|
|
import 'package:provider/provider.dart';
|
|
import 'package:refilc_mobile_ui/screens/settings/submenu/share_theme_popup.dart';
|
|
import 'theme_screen.i18n.dart';
|
|
import 'package:share_plus/share_plus.dart';
|
|
|
|
class PremiumCustomAccentColorSetting extends StatefulWidget {
|
|
const PremiumCustomAccentColorSetting({super.key});
|
|
|
|
@override
|
|
State<PremiumCustomAccentColorSetting> createState() =>
|
|
_PremiumCustomAccentColorSettingState();
|
|
}
|
|
|
|
enum CustomColorMode {
|
|
theme,
|
|
saved,
|
|
accent,
|
|
background,
|
|
highlight,
|
|
text,
|
|
icon,
|
|
enterId,
|
|
grade,
|
|
}
|
|
|
|
class _PremiumCustomAccentColorSettingState
|
|
extends State<PremiumCustomAccentColorSetting>
|
|
with TickerProviderStateMixin {
|
|
late final SettingsProvider settings;
|
|
late final ShareProvider shareProvider;
|
|
bool colorSelection = false;
|
|
bool customColorMenu = false;
|
|
CustomColorMode colorMode = CustomColorMode.theme;
|
|
final customColorInput = TextEditingController();
|
|
final unknownColor = Colors.black;
|
|
|
|
late TabController _testTabController;
|
|
late TabController _colorsTabController;
|
|
late AnimationController _openAnimController;
|
|
|
|
late final Animation<double> backgroundAnimation =
|
|
Tween<double>(begin: 0, end: 1).animate(
|
|
CurvedAnimation(
|
|
parent: _openAnimController,
|
|
curve: const Interval(0.2, 1.0, curve: Curves.easeInOut),
|
|
),
|
|
);
|
|
|
|
late final Animation<double> fullPageAnimation =
|
|
Tween<double>(begin: 0, end: 1).animate(
|
|
CurvedAnimation(
|
|
parent: _openAnimController,
|
|
curve: const Interval(0.0, 0.6, curve: Curves.easeInOut),
|
|
),
|
|
);
|
|
|
|
late final Animation<double> backContainerAnimation =
|
|
Tween<double>(begin: 100, end: 0).animate(
|
|
CurvedAnimation(
|
|
parent: _openAnimController,
|
|
curve: const Interval(0.0, 0.9, curve: Curves.easeInOut),
|
|
),
|
|
);
|
|
|
|
late final Animation<double> backContentAnimation =
|
|
Tween<double>(begin: 100, end: 0).animate(
|
|
CurvedAnimation(
|
|
parent: _openAnimController,
|
|
curve: const Interval(0.2, 1.0, curve: Curves.easeInOut),
|
|
),
|
|
);
|
|
|
|
late final Animation<double> backContentScaleAnimation =
|
|
Tween<double>(begin: 0.8, end: 0.9).animate(
|
|
CurvedAnimation(
|
|
parent: _openAnimController,
|
|
curve: const Interval(0.45, 1.0, curve: Curves.easeInOut),
|
|
),
|
|
);
|
|
|
|
late final Animation<double> pickerContainerAnimation =
|
|
Tween<double>(begin: 0, end: 1).animate(
|
|
CurvedAnimation(
|
|
parent: _openAnimController,
|
|
curve: const Interval(0.25, 0.8, curve: Curves.easeInOut),
|
|
),
|
|
);
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
_colorsTabController = TabController(length: 4, vsync: this);
|
|
_testTabController = TabController(length: 4, vsync: this);
|
|
settings = Provider.of<SettingsProvider>(context, listen: false);
|
|
shareProvider = Provider.of<ShareProvider>(context, listen: false);
|
|
|
|
_openAnimController = AnimationController(
|
|
vsync: this, duration: const Duration(milliseconds: 750));
|
|
_openAnimController.forward();
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
_openAnimController.dispose();
|
|
super.dispose();
|
|
}
|
|
|
|
void setTheme(ThemeMode mode, bool store) async {
|
|
await settings.update(theme: mode, store: store);
|
|
Provider.of<ThemeModeObserver>(context, listen: false)
|
|
.changeTheme(mode, updateNavbarColor: false);
|
|
}
|
|
|
|
dynamic getCustomColor() {
|
|
switch (colorMode) {
|
|
case CustomColorMode.theme:
|
|
return accentColorMap[settings.accentColor];
|
|
case CustomColorMode.saved:
|
|
return [
|
|
settings.customBackgroundColor,
|
|
settings.customHighlightColor,
|
|
settings.customAccentColor,
|
|
settings.customTextColor,
|
|
];
|
|
case CustomColorMode.background:
|
|
return settings.customBackgroundColor;
|
|
case CustomColorMode.highlight:
|
|
return settings.customHighlightColor;
|
|
case CustomColorMode.accent:
|
|
return settings.customAccentColor;
|
|
case CustomColorMode.text:
|
|
return settings.customTextColor;
|
|
case CustomColorMode.icon:
|
|
return settings.customIconColor;
|
|
case CustomColorMode.enterId:
|
|
// do nothing here lol
|
|
break;
|
|
case CustomColorMode.grade:
|
|
// do nothing here as well
|
|
break;
|
|
}
|
|
}
|
|
|
|
void updateCustomColor(dynamic v, bool store,
|
|
{Color? accent, Color? background, Color? panels, Color? icon}) {
|
|
// reset custom theme id
|
|
settings.update(
|
|
currentThemeId: '',
|
|
currentThemeDisplayName: '',
|
|
currentThemeCreator: '',
|
|
store: store,
|
|
);
|
|
|
|
if (colorMode != CustomColorMode.theme) {
|
|
settings.update(accentColor: AccentColor.custom, store: store);
|
|
}
|
|
switch (colorMode) {
|
|
case CustomColorMode.theme:
|
|
settings.update(
|
|
accentColor: accentColorMap.keys.firstWhere(
|
|
(element) => accentColorMap[element] == v,
|
|
orElse: () => AccentColor.filc),
|
|
store: store);
|
|
settings.update(
|
|
customBackgroundColor: AppColors.of(context).background,
|
|
store: store);
|
|
settings.update(
|
|
customHighlightColor: AppColors.of(context).highlight,
|
|
store: store);
|
|
settings.update(
|
|
customTextColor: AppColors.of(context).text, store: store);
|
|
settings.update(customAccentColor: v, store: store);
|
|
break;
|
|
case CustomColorMode.saved:
|
|
settings.update(customBackgroundColor: v[0], store: store);
|
|
settings.update(customHighlightColor: v[1], store: store);
|
|
settings.update(customAccentColor: v[3], store: store);
|
|
settings.update(customTextColor: v[4], store: store);
|
|
break;
|
|
case CustomColorMode.background:
|
|
settings.update(customBackgroundColor: v, store: store);
|
|
break;
|
|
case CustomColorMode.highlight:
|
|
settings.update(customHighlightColor: v, store: store);
|
|
break;
|
|
case CustomColorMode.accent:
|
|
settings.update(customAccentColor: v, store: store);
|
|
break;
|
|
case CustomColorMode.text:
|
|
settings.update(customTextColor: v, store: store);
|
|
break;
|
|
case CustomColorMode.icon:
|
|
settings.update(customIconColor: v, store: store);
|
|
break;
|
|
case CustomColorMode.enterId:
|
|
settings.update(customBackgroundColor: background, store: store);
|
|
settings.update(customHighlightColor: panels, store: store);
|
|
settings.update(customAccentColor: accent, store: store);
|
|
settings.update(customIconColor: icon, store: store);
|
|
break;
|
|
case CustomColorMode.grade:
|
|
// do nothing
|
|
break;
|
|
}
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
// bool hasAccess = Provider.of<PlusProvider>(context)
|
|
// .hasScope(PremiumScopes.customColors);
|
|
bool hasAccess = true;
|
|
bool isBackgroundDifferent = Theme.of(context).colorScheme.surface !=
|
|
AppColors.of(context).background;
|
|
|
|
ThemeMode currentTheme = Theme.of(context).brightness == Brightness.light
|
|
? ThemeMode.light
|
|
: ThemeMode.dark;
|
|
|
|
return WillPopScope(
|
|
onWillPop: () async {
|
|
Provider.of<ThemeModeObserver>(context, listen: false)
|
|
.changeTheme(settings.theme, updateNavbarColor: true);
|
|
return true;
|
|
},
|
|
child: AnimatedBuilder(
|
|
animation: _openAnimController,
|
|
builder: (context, child) {
|
|
final backgroundGradientBottomColor = isBackgroundDifferent
|
|
? Theme.of(context).colorScheme.surface
|
|
: HSVColor.fromColor(Theme.of(context).colorScheme.surface)
|
|
.withValue(currentTheme == ThemeMode.dark
|
|
? 0.1 * _openAnimController.value
|
|
: 1.0 - (0.1 * _openAnimController.value))
|
|
.withAlpha(1.0)
|
|
.toColor();
|
|
|
|
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
|
|
systemNavigationBarColor: backgroundGradientBottomColor,
|
|
));
|
|
|
|
return Container(
|
|
decoration: BoxDecoration(
|
|
gradient: LinearGradient(
|
|
begin: Alignment.topCenter,
|
|
end: Alignment.bottomCenter,
|
|
stops: const [0.0, 0.75],
|
|
colors: isBackgroundDifferent
|
|
? [
|
|
Theme.of(context).colorScheme.surface.withValues(
|
|
alpha: 1 -
|
|
((currentTheme == ThemeMode.dark
|
|
? 0.65
|
|
: 0.25) *
|
|
backgroundAnimation.value)),
|
|
backgroundGradientBottomColor,
|
|
]
|
|
: [
|
|
backgroundGradientBottomColor,
|
|
backgroundGradientBottomColor
|
|
],
|
|
),
|
|
),
|
|
child: Opacity(
|
|
opacity: fullPageAnimation.value,
|
|
child: Scaffold(
|
|
backgroundColor: Colors.transparent,
|
|
appBar: AppBar(
|
|
surfaceTintColor: Theme.of(context).scaffoldBackgroundColor,
|
|
leading: BackButton(color: AppColors.of(context).text),
|
|
actions: [
|
|
Padding(
|
|
padding: const EdgeInsets.only(right: 10.0),
|
|
child: IconButton(
|
|
focusColor: Colors.transparent,
|
|
highlightColor: Colors.transparent,
|
|
splashColor: Colors.transparent,
|
|
onPressed: () async {
|
|
// ScaffoldMessenger.of(context).showSnackBar(
|
|
// const SnackBar(
|
|
// duration: Duration(milliseconds: 1000),
|
|
// content: Text(
|
|
// "Hamarosan...",
|
|
// ),
|
|
// ),
|
|
// );
|
|
// showDialog(
|
|
// context: context,
|
|
// builder: (context) => WillPopScope(
|
|
// onWillPop: () async => false,
|
|
// child: AlertDialog(
|
|
// shape: RoundedRectangleBorder(
|
|
// borderRadius: BorderRadius.circular(12.0)),
|
|
// title: Text("attention".i18n),
|
|
// content: Text("share_disclaimer".i18n),
|
|
// actions: [
|
|
// ActionButton(
|
|
// label: "understand".i18n,
|
|
// onTap: () async {
|
|
// Navigator.of(context).pop();
|
|
|
|
// SharedGradeColors gradeColors =
|
|
// await shareProvider
|
|
// .shareCurrentGradeColors(context);
|
|
// SharedTheme theme =
|
|
// await shareProvider.shareCurrentTheme(
|
|
// context,
|
|
// gradeColors: gradeColors,
|
|
// );
|
|
|
|
// Share.share(
|
|
// theme.id,
|
|
// subject: 'share_subj_theme'.i18n,
|
|
// );
|
|
// },
|
|
// ),
|
|
// ],
|
|
// ),
|
|
// ),
|
|
// );
|
|
if (settings.currentThemeId != '') {
|
|
Share.share(
|
|
settings.currentThemeId,
|
|
subject: 'share_subj_theme'.i18n,
|
|
);
|
|
} else {
|
|
ShareThemeDialog.show(context);
|
|
}
|
|
},
|
|
icon: const Icon(
|
|
FeatherIcons.share2,
|
|
size: 22.0,
|
|
),
|
|
),
|
|
),
|
|
],
|
|
title: Text(
|
|
"theme_prev".i18n,
|
|
style: TextStyle(color: AppColors.of(context).text),
|
|
),
|
|
backgroundColor: Colors.transparent,
|
|
elevation: 0,
|
|
),
|
|
body: Stack(
|
|
children: [
|
|
Opacity(
|
|
opacity: 1 - backContainerAnimation.value * (1 / 100),
|
|
child: Transform.translate(
|
|
offset: Offset(0, backContainerAnimation.value),
|
|
child: Container(
|
|
height: double.infinity,
|
|
width: double.infinity,
|
|
decoration: BoxDecoration(
|
|
borderRadius: BorderRadius.circular(24),
|
|
gradient: LinearGradient(
|
|
// https://discord.com/channels/1111649116020285532/1153619667848548452
|
|
begin: Alignment.topCenter,
|
|
end: Alignment.bottomCenter,
|
|
stops: const [
|
|
0.35,
|
|
0.75
|
|
],
|
|
colors: [
|
|
settings.customBackgroundColor ??
|
|
Theme.of(context).colorScheme.surface,
|
|
isBackgroundDifferent
|
|
? HSVColor.fromColor(Theme.of(context)
|
|
.colorScheme
|
|
.background)
|
|
.withSaturation((HSVColor.fromColor(
|
|
Theme.of(context)
|
|
.colorScheme
|
|
.background)
|
|
.saturation -
|
|
0.15)
|
|
.clamp(0.0, 1.0))
|
|
.toColor()
|
|
: backgroundGradientBottomColor,
|
|
]),
|
|
),
|
|
margin: const EdgeInsets.symmetric(
|
|
vertical: 30, horizontal: 20),
|
|
),
|
|
),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.only(top: 8.0),
|
|
child: SizedBox(
|
|
width: double.infinity,
|
|
child: Padding(
|
|
padding: const EdgeInsets.only(top: 24.0),
|
|
child: Opacity(
|
|
opacity: 1 - backContentAnimation.value * (1 / 100),
|
|
child: SingleChildScrollView(
|
|
physics: const BouncingScrollPhysics(),
|
|
child: Transform.translate(
|
|
offset:
|
|
Offset(0, -24 + backContentAnimation.value),
|
|
child: Transform.scale(
|
|
scale: backContentScaleAnimation.value,
|
|
child: Column(
|
|
children: [
|
|
Padding(
|
|
padding: const EdgeInsets.only(
|
|
left: 32.0,
|
|
right: 32.0,
|
|
top: 16.0,
|
|
bottom: 6.0,
|
|
),
|
|
child: FilterBar(
|
|
items: const [
|
|
Tab(text: "All"),
|
|
Tab(text: "Grades"),
|
|
Tab(text: "Messages"),
|
|
Tab(text: "Absences"),
|
|
],
|
|
controller: _testTabController,
|
|
padding: EdgeInsets.zero,
|
|
censored: true,
|
|
disableFading: true,
|
|
),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.symmetric(
|
|
horizontal: 18.0, vertical: 8.0),
|
|
child: NewGradesSurprise(
|
|
[
|
|
Grade.fromJson(
|
|
{
|
|
"Uid": "0,Ertekeles",
|
|
"RogzitesDatuma":
|
|
"2022-01-01T23:00:00Z",
|
|
"KeszitesDatuma":
|
|
"2022-01-01T23:00:00Z",
|
|
"LattamozasDatuma": null,
|
|
"Tantargy": {
|
|
"Uid": "0",
|
|
"Nev": "reFilc szakirodalom",
|
|
"Kategoria": {
|
|
"Uid": "0,_",
|
|
"Nev": "_",
|
|
"Leiras": "Nem mondom meg"
|
|
},
|
|
"SortIndex": 2
|
|
},
|
|
"Tema":
|
|
"Kupak csomag vásárlás vizsga",
|
|
"Tipus": {
|
|
"Uid": "0,_",
|
|
"Nev": "_",
|
|
"Leiras":
|
|
"Évközi jegy/értékelés",
|
|
},
|
|
"Mod": {
|
|
"Uid": "0,_",
|
|
"Nev": "_",
|
|
"Leiras": "_ feladat",
|
|
},
|
|
"ErtekFajta": {
|
|
"Uid": "1,Osztalyzat",
|
|
"Nev": "Osztalyzat",
|
|
"Leiras":
|
|
"Elégtelen (1) és Jeles (5) között az öt alapértelmezett érték"
|
|
},
|
|
"ErtekeloTanarNeve": "Premium",
|
|
"Jelleg": "Ertekeles",
|
|
"SzamErtek": 5,
|
|
"SzovegesErtek": "Jeles(5)",
|
|
"SulySzazalekErteke": 100,
|
|
"SzovegesErtekelesRovidNev":
|
|
null,
|
|
"OsztalyCsoport": {"Uid": "0"},
|
|
"SortIndex": 2
|
|
},
|
|
),
|
|
],
|
|
censored: true,
|
|
),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.symmetric(
|
|
horizontal: 24.0, vertical: 6.0),
|
|
child: Panel(
|
|
child: GradeTile(
|
|
Grade.fromJson(
|
|
{
|
|
"Uid": "0,Ertekeles",
|
|
"RogzitesDatuma":
|
|
"2022-01-01T23:00:00Z",
|
|
"KeszitesDatuma":
|
|
"2022-01-01T23:00:00Z",
|
|
"LattamozasDatuma": null,
|
|
"Tantargy": {
|
|
"Uid": "0",
|
|
"Nev": "reFilc szakosztály",
|
|
"Kategoria": {
|
|
"Uid": "0,_",
|
|
"Nev": "_",
|
|
"Leiras": "Nem mondom meg"
|
|
},
|
|
"SortIndex": 2
|
|
},
|
|
"Tema":
|
|
"Kupak csomag vásárlás vizsga",
|
|
"Tipus": {
|
|
"Uid": "0,_",
|
|
"Nev": "_",
|
|
"Leiras":
|
|
"Évközi jegy/értékelés",
|
|
},
|
|
"Mod": {
|
|
"Uid": "0,_",
|
|
"Nev": "_",
|
|
"Leiras": "_ feladat",
|
|
},
|
|
"ErtekFajta": {
|
|
"Uid": "1,Osztalyzat",
|
|
"Nev": "Osztalyzat",
|
|
"Leiras":
|
|
"Elégtelen (1) és Jeles (5) között az öt alapértelmezett érték"
|
|
},
|
|
"ErtekeloTanarNeve": "Premium",
|
|
"Jelleg": "Ertekeles",
|
|
"SzamErtek": 5,
|
|
"SzovegesErtek": "Jeles(5)",
|
|
"SulySzazalekErteke": 100,
|
|
"SzovegesErtekelesRovidNev":
|
|
null,
|
|
"OsztalyCsoport": {"Uid": "0"},
|
|
"SortIndex": 2
|
|
},
|
|
),
|
|
padding: EdgeInsets.zero,
|
|
censored: true,
|
|
),
|
|
),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.symmetric(
|
|
horizontal: 24.0, vertical: 6.0),
|
|
child: Panel(
|
|
child: HomeworkTile(
|
|
Homework.fromJson(
|
|
{
|
|
"Uid": "0",
|
|
"Tantargy": {
|
|
"Uid": "0",
|
|
"Nev":
|
|
"reFilc premium előnyei",
|
|
"Kategoria": {
|
|
"Uid": "0,_",
|
|
"Nev": "_",
|
|
"Leiras":
|
|
"reFilc premium előnyei",
|
|
},
|
|
"SortIndex": 0
|
|
},
|
|
"TantargyNeve":
|
|
"reFilc premium előnyei",
|
|
"RogzitoTanarNeve":
|
|
"Kupak János",
|
|
"Szoveg":
|
|
"45 perc filctollal való rajzolás",
|
|
"FeladasDatuma":
|
|
"2022-01-01T23:00:00Z",
|
|
"HataridoDatuma":
|
|
"2022-01-01T23:00:00Z",
|
|
"RogzitesIdopontja":
|
|
"2022-01-01T23:00:00Z",
|
|
"IsTanarRogzitette": true,
|
|
"IsTanuloHaziFeladatEnabled":
|
|
false,
|
|
"IsMegoldva": false,
|
|
"IsBeadhato": false,
|
|
"OsztalyCsoport": {"Uid": "0"},
|
|
"IsCsatolasEngedelyezes": false
|
|
},
|
|
),
|
|
padding: EdgeInsets.zero,
|
|
censored: true,
|
|
),
|
|
),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.symmetric(
|
|
horizontal: 24.0, vertical: 6.0),
|
|
child: Panel(
|
|
child: MessageTile(
|
|
Message.fromJson(
|
|
{
|
|
"azonosito": 0,
|
|
"isElolvasva": true,
|
|
"isToroltElem": false,
|
|
"tipus": {
|
|
"azonosito": 1,
|
|
"kod": "BEERKEZETT",
|
|
"rovidNev":
|
|
"Beérkezett üzenet",
|
|
"nev": "Beérkezett üzenet",
|
|
"leiras": "Beérkezett üzenet"
|
|
},
|
|
"uzenet": {
|
|
"azonosito": 0,
|
|
"kuldesDatum":
|
|
"2022-01-01T23:00:00",
|
|
"feladoNev": "reFilc",
|
|
"feladoTitulus":
|
|
"Nagyon magas szintű személy",
|
|
"szoveg":
|
|
"<p>Kedves Felhasználó!</p><p><br></p><p>A prémium vásárlásakor kapott filctollal 90%-al több esély van jó jegyek szerzésére.</p>",
|
|
"targy":
|
|
"Filctoll használati útmutató",
|
|
"statusz": {
|
|
"azonosito": 2,
|
|
"kod": "KIKULDVE",
|
|
"rovidNev": "Kiküldve",
|
|
"nev": "Kiküldve",
|
|
"leiras": "Kiküldve"
|
|
},
|
|
"cimzettLista": [
|
|
{
|
|
"azonosito": 0,
|
|
"kretaAzonosito": 0,
|
|
"nev": "Tinta Józsi",
|
|
"tipus": {
|
|
"azonosito": 0,
|
|
"kod": "TANULO",
|
|
"rovidNev": "Tanuló",
|
|
"nev": "Tanuló",
|
|
"leiras": "Tanuló"
|
|
}
|
|
},
|
|
],
|
|
"csatolmanyok": [
|
|
{
|
|
"azonosito": 0,
|
|
"fajlNev": "Filctoll.doc"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
),
|
|
censored: true,
|
|
padding: const EdgeInsets.only(
|
|
right: 6.0,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
Align(
|
|
alignment: Alignment.bottomCenter,
|
|
child: Wrap(
|
|
children: [
|
|
Opacity(
|
|
opacity: pickerContainerAnimation.value,
|
|
child: SizedBox(
|
|
width: double.infinity,
|
|
child: Container(
|
|
padding: const EdgeInsets.only(bottom: 12.0),
|
|
decoration: BoxDecoration(
|
|
boxShadow: [
|
|
BoxShadow(
|
|
color: backgroundGradientBottomColor,
|
|
offset: const Offset(0, -8),
|
|
blurRadius: 16,
|
|
spreadRadius: 18,
|
|
),
|
|
],
|
|
gradient: LinearGradient(
|
|
begin: Alignment.topCenter,
|
|
end: Alignment.bottomCenter,
|
|
stops: const [
|
|
0.0,
|
|
0.175
|
|
],
|
|
colors: [
|
|
backgroundGradientBottomColor,
|
|
backgroundGradientBottomColor,
|
|
]),
|
|
),
|
|
child: Column(
|
|
children: [
|
|
Padding(
|
|
padding: const EdgeInsets.symmetric(
|
|
horizontal: 8.0),
|
|
child: FilterBar(
|
|
items: [
|
|
ColorTab(
|
|
color: accentColorMap[
|
|
settings.accentColor] ??
|
|
unknownColor,
|
|
tab: Tab(
|
|
text: "colorpicker_presets"
|
|
.i18n)),
|
|
// ColorTab(
|
|
// color: unknownColor,
|
|
// tab: Tab(text: "enter_id".i18n)),
|
|
/*ColorTab(
|
|
color:
|
|
settings.customAccentColor ??
|
|
unknownColor,
|
|
tab: Tab(
|
|
text: "colorpicker_saved"
|
|
.i18n)),*/
|
|
ColorTab(
|
|
unlocked: hasAccess,
|
|
color: settings
|
|
.customBackgroundColor ??
|
|
unknownColor,
|
|
tab: Tab(
|
|
text: "colorpicker_background"
|
|
.i18n)),
|
|
ColorTab(
|
|
unlocked: hasAccess,
|
|
color: settings
|
|
.customHighlightColor ??
|
|
unknownColor,
|
|
tab: Tab(
|
|
text: "colorpicker_panels"
|
|
.i18n)),
|
|
ColorTab(
|
|
unlocked: hasAccess,
|
|
color:
|
|
settings.customAccentColor ??
|
|
unknownColor,
|
|
tab: Tab(
|
|
text: "colorpicker_accent"
|
|
.i18n)),
|
|
// ColorTab(
|
|
// unlocked: hasAccess,
|
|
// color: settings.customTextColor ??
|
|
// unknownColor,
|
|
// tab: Tab(
|
|
// text:
|
|
// "colorpicker_text".i18n)),
|
|
// ColorTab(
|
|
// unlocked: hasAccess,
|
|
// color: settings.customIconColor ??
|
|
// unknownColor,
|
|
// tab: Tab(
|
|
// text:
|
|
// "colorpicker_icon".i18n)),
|
|
],
|
|
onTap: (index) {
|
|
// if (!hasAccess) {
|
|
// index = 0;
|
|
// _colorsTabController.animateTo(0,
|
|
// duration: Duration.zero);
|
|
|
|
// PlusLockedFeaturePopup.show(
|
|
// context: context,
|
|
// feature: PremiumFeature
|
|
// .customcolors);
|
|
// }
|
|
|
|
switch (index) {
|
|
case 0:
|
|
setState(() {
|
|
colorMode =
|
|
CustomColorMode.theme;
|
|
});
|
|
break;
|
|
// case 1:
|
|
// setState(() {
|
|
// colorMode =
|
|
// CustomColorMode.enterId;
|
|
// });
|
|
// break;
|
|
/*case 1:
|
|
setState(() {
|
|
colorMode =
|
|
CustomColorMode.saved;
|
|
});
|
|
break;*/
|
|
case 1:
|
|
setState(() {
|
|
colorMode =
|
|
CustomColorMode.background;
|
|
});
|
|
break;
|
|
case 2:
|
|
setState(() {
|
|
colorMode =
|
|
CustomColorMode.highlight;
|
|
});
|
|
break;
|
|
case 3:
|
|
setState(() {
|
|
colorMode =
|
|
CustomColorMode.accent;
|
|
});
|
|
break;
|
|
case 4:
|
|
setState(() {
|
|
colorMode =
|
|
CustomColorMode.text;
|
|
});
|
|
break;
|
|
case 5:
|
|
setState(() {
|
|
colorMode =
|
|
CustomColorMode.icon;
|
|
});
|
|
break;
|
|
}
|
|
},
|
|
controller: _colorsTabController,
|
|
padding: EdgeInsets.zero,
|
|
),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.symmetric(
|
|
horizontal: 12.0),
|
|
child: SafeArea(
|
|
child: FilcColorPicker(
|
|
colorMode: colorMode,
|
|
pickerColor: colorMode ==
|
|
CustomColorMode.accent
|
|
? settings.customAccentColor ??
|
|
unknownColor
|
|
: colorMode ==
|
|
CustomColorMode.background
|
|
? settings
|
|
.customBackgroundColor ??
|
|
unknownColor
|
|
: colorMode ==
|
|
CustomColorMode.theme
|
|
? (accentColorMap[settings
|
|
.accentColor] ??
|
|
AppColors.of(context)
|
|
.text) // idk what else
|
|
: colorMode ==
|
|
CustomColorMode
|
|
.highlight
|
|
? settings
|
|
.customHighlightColor ??
|
|
unknownColor
|
|
: colorMode ==
|
|
CustomColorMode
|
|
.text
|
|
? settings
|
|
.customTextColor ??
|
|
unknownColor
|
|
: settings
|
|
.customIconColor ??
|
|
unknownColor,
|
|
onColorChanged: (c) {
|
|
setState(() {
|
|
updateCustomColor(c, false);
|
|
});
|
|
setTheme(settings.theme, false);
|
|
},
|
|
onColorChangeEnd: (c, {adaptive}) {
|
|
setState(() {
|
|
if (adaptive == true) {
|
|
settings.update(
|
|
accentColor:
|
|
AccentColor.adaptive);
|
|
settings.update(
|
|
customBackgroundColor:
|
|
AppColors.of(context)
|
|
.background,
|
|
store: true);
|
|
settings.update(
|
|
customHighlightColor:
|
|
AppColors.of(context)
|
|
.highlight,
|
|
store: true);
|
|
settings.update(
|
|
customTextColor:
|
|
AppColors.of(context)
|
|
.text,
|
|
store: true);
|
|
settings.update(
|
|
customIconColor:
|
|
const Color(0x00000000),
|
|
store: true);
|
|
} else {
|
|
updateCustomColor(c, true);
|
|
}
|
|
});
|
|
setTheme(settings.theme, true);
|
|
},
|
|
onThemeIdProvided: (theme) {
|
|
// changing grade colors
|
|
List<Color> colors = [
|
|
theme.gradeColors.oneColor,
|
|
theme.gradeColors.twoColor,
|
|
theme.gradeColors.threeColor,
|
|
theme.gradeColors.fourColor,
|
|
theme.gradeColors.fiveColor,
|
|
];
|
|
settings.update(
|
|
gradeColors: colors);
|
|
|
|
// changing shadow effect
|
|
settings.update(
|
|
shadowEffect:
|
|
theme.shadowEffect);
|
|
|
|
// changing theme
|
|
setState(() {
|
|
updateCustomColor(
|
|
null,
|
|
true,
|
|
accent: theme.accentColor,
|
|
background:
|
|
theme.backgroundColor,
|
|
panels: theme.panelsColor,
|
|
icon: theme.iconColor,
|
|
);
|
|
});
|
|
setTheme(settings.theme, true);
|
|
},
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
},
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class ColorTab extends StatelessWidget {
|
|
const ColorTab(
|
|
{super.key,
|
|
required this.tab,
|
|
required this.color,
|
|
this.unlocked = true});
|
|
|
|
final Tab tab;
|
|
final Color color;
|
|
final bool unlocked;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Row(
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
children: [
|
|
Transform.translate(
|
|
offset: const Offset(-3, 1),
|
|
child: unlocked
|
|
? Container(
|
|
width: 15,
|
|
height: 15,
|
|
decoration: BoxDecoration(
|
|
shape: BoxShape.circle,
|
|
color: color,
|
|
border: Border.all(color: Colors.black, width: 2.0),
|
|
),
|
|
)
|
|
: const Padding(
|
|
padding: EdgeInsets.symmetric(horizontal: 2),
|
|
child: Icon(Icons.lock,
|
|
color: Color.fromARGB(255, 82, 82, 82), size: 18),
|
|
),
|
|
),
|
|
tab
|
|
],
|
|
);
|
|
}
|
|
}
|
|
|
|
class PremiumColorPickerItem extends StatelessWidget {
|
|
const PremiumColorPickerItem(
|
|
{super.key, required this.label, this.onTap, required this.color});
|
|
|
|
final String label;
|
|
final void Function()? onTap;
|
|
final Color color;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Material(
|
|
type: MaterialType.transparency,
|
|
child: InkWell(
|
|
onTap: onTap,
|
|
child: Padding(
|
|
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Expanded(
|
|
child: Text(
|
|
label,
|
|
style: TextStyle(
|
|
color: AppColors.of(context).text,
|
|
fontWeight: FontWeight.w500),
|
|
),
|
|
),
|
|
Container(
|
|
width: 30,
|
|
height: 30,
|
|
decoration: BoxDecoration(
|
|
color: color, shape: BoxShape.circle, border: Border.all()),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|