theme_manager.dart 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. import 'package:flutter/material.dart';
  2. import 'package:shared_preferences/shared_preferences.dart';
  3. import 'theme_notifier.dart';
  4. /// Seasonal theme system for ZenTap
  5. enum SeasonalTheme {
  6. default_('default'),
  7. spring('spring'),
  8. summer('summer'),
  9. autumn('autumn'),
  10. winter('winter');
  11. const SeasonalTheme(this.id);
  12. final String id;
  13. static SeasonalTheme fromId(String id) {
  14. return SeasonalTheme.values.firstWhere(
  15. (theme) => theme.id == id,
  16. orElse: () => SeasonalTheme.default_,
  17. );
  18. }
  19. }
  20. /// Theme color scheme for each season
  21. class SeasonalColors {
  22. final Color appBackground;
  23. final Color secondaryBackground;
  24. final Color primaryText;
  25. final Color secondaryText;
  26. final Color mutedText;
  27. final Color buttonBackground;
  28. final Color buttonText;
  29. final Color uiElements;
  30. final Color gameBoardBorder;
  31. final Color bubbleDefault;
  32. final Color bubblePopEffect;
  33. final Color scoreText;
  34. final Color timerText;
  35. final Color links;
  36. final Color linkHover;
  37. final Color selectedMenuItem;
  38. // Animation colors
  39. final List<Color> animationLayer1;
  40. final List<Color> animationLayer2;
  41. final List<Color> animationLayer3;
  42. final List<Color> zenModeColors;
  43. const SeasonalColors({
  44. required this.appBackground,
  45. required this.secondaryBackground,
  46. required this.primaryText,
  47. required this.secondaryText,
  48. required this.mutedText,
  49. required this.buttonBackground,
  50. required this.buttonText,
  51. required this.uiElements,
  52. required this.gameBoardBorder,
  53. required this.bubbleDefault,
  54. required this.bubblePopEffect,
  55. required this.scoreText,
  56. required this.timerText,
  57. required this.links,
  58. required this.linkHover,
  59. required this.selectedMenuItem,
  60. required this.animationLayer1,
  61. required this.animationLayer2,
  62. required this.animationLayer3,
  63. required this.zenModeColors,
  64. });
  65. }
  66. class ThemeManager {
  67. static const String _keySelectedTheme = 'selected_theme';
  68. static SharedPreferences? _prefs;
  69. static SeasonalTheme _currentTheme = SeasonalTheme.default_;
  70. static Future<void> init() async {
  71. _prefs = await SharedPreferences.getInstance();
  72. final themeId = _prefs?.getString(_keySelectedTheme) ?? 'default';
  73. _currentTheme = SeasonalTheme.fromId(themeId);
  74. ThemeNotifier().initFromManager();
  75. }
  76. static SeasonalTheme get currentTheme => _currentTheme;
  77. static Future<void> setTheme(SeasonalTheme theme) async {
  78. _currentTheme = theme;
  79. await _prefs?.setString(_keySelectedTheme, theme.id);
  80. ThemeNotifier().setTheme(theme);
  81. }
  82. /// Get the current theme's color scheme
  83. static SeasonalColors get colors {
  84. switch (_currentTheme) {
  85. case SeasonalTheme.spring:
  86. return _springColors;
  87. case SeasonalTheme.summer:
  88. return _summerColors;
  89. case SeasonalTheme.autumn:
  90. return _autumnColors;
  91. case SeasonalTheme.winter:
  92. return _winterColors;
  93. case SeasonalTheme.default_:
  94. return _defaultColors;
  95. }
  96. }
  97. /// Get theme display name
  98. static String getThemeDisplayName(SeasonalTheme theme) {
  99. switch (theme) {
  100. case SeasonalTheme.default_:
  101. return 'Default (fSociety)';
  102. case SeasonalTheme.spring:
  103. return 'Spring Bloom';
  104. case SeasonalTheme.summer:
  105. return 'Summer Bright';
  106. case SeasonalTheme.autumn:
  107. return 'Autumn Leaves';
  108. case SeasonalTheme.winter:
  109. return 'Winter Frost';
  110. }
  111. }
  112. /// Get theme icon
  113. static IconData getThemeIcon(SeasonalTheme theme) {
  114. switch (theme) {
  115. case SeasonalTheme.default_:
  116. return Icons.contrast;
  117. case SeasonalTheme.spring:
  118. return Icons.local_florist;
  119. case SeasonalTheme.summer:
  120. return Icons.wb_sunny;
  121. case SeasonalTheme.autumn:
  122. return Icons.park;
  123. case SeasonalTheme.winter:
  124. return Icons.ac_unit;
  125. }
  126. }
  127. /// Default fSociety theme (current colors)
  128. static const SeasonalColors _defaultColors = SeasonalColors(
  129. appBackground: Color(0xFF000000),
  130. secondaryBackground: Color(0xFF0A0A0A),
  131. primaryText: Color(0xFFFFFFFF),
  132. secondaryText: Color(0xDEFFFFFF),
  133. mutedText: Color(0xFF808080),
  134. buttonBackground: Color(0xFF0BC2F9),
  135. buttonText: Color(0xFFFFFFFF),
  136. uiElements: Color(0xFF808080),
  137. gameBoardBorder: Color(0xFF808080),
  138. bubbleDefault: Color(0xFF646CFF),
  139. bubblePopEffect: Color(0xFFFF0000),
  140. scoreText: Color(0xFFFFFFFF),
  141. timerText: Color(0xDEFFFFFF),
  142. links: Color(0xFF000080),
  143. linkHover: Color(0xFFFF0000),
  144. selectedMenuItem: Color(0xFFFFFFFF),
  145. animationLayer1: [Color(0x33808080), Colors.transparent],
  146. animationLayer2: [Color(0x1AFF0000), Colors.transparent],
  147. animationLayer3: [Color(0x0D0BC2F9), Colors.transparent],
  148. zenModeColors: [Color(0x4D000080), Colors.transparent],
  149. );
  150. /// Spring theme - Fresh greens and soft pastels
  151. static const SeasonalColors _springColors = SeasonalColors(
  152. appBackground: Color(0xFF0A1A0A), // Dark forest green
  153. secondaryBackground: Color(0xFF1A2A1A),
  154. primaryText: Color(0xFFE8F5E8), // Light mint
  155. secondaryText: Color(0xDEE8F5E8),
  156. mutedText: Color(0xFF7FB069), // Soft green
  157. buttonBackground: Color(0xFF8FBC8F), // Dark sea green
  158. buttonText: Color(0xFF0A1A0A),
  159. uiElements: Color(0xFF556B2F), // Dark olive green
  160. gameBoardBorder: Color(0xFF6B8E23),
  161. bubbleDefault: Color(0xFF98FB98), // Pale green
  162. bubblePopEffect: Color(0xFFFFB6C1), // Light pink
  163. scoreText: Color(0xFFE8F5E8),
  164. timerText: Color(0xDEE8F5E8),
  165. links: Color(0xFF228B22), // Forest green
  166. linkHover: Color(0xFFFF69B4), // Hot pink
  167. selectedMenuItem: Color(0xFFE8F5E8),
  168. animationLayer1: [Color(0x3398FB98), Colors.transparent], // Pale green
  169. animationLayer2: [Color(0x1AFFB6C1), Colors.transparent], // Light pink
  170. animationLayer3: [Color(0x0D7FB069), Colors.transparent], // Soft green
  171. zenModeColors: [Color(0x4D228B22), Colors.transparent], // Forest green
  172. );
  173. /// Summer theme - Bright blues and warm yellows
  174. static const SeasonalColors _summerColors = SeasonalColors(
  175. appBackground: Color(0xFF0A0A2A), // Deep navy
  176. secondaryBackground: Color(0xFF1A1A3A),
  177. primaryText: Color(0xFFF0F8FF), // Alice blue
  178. secondaryText: Color(0xDEF0F8FF),
  179. mutedText: Color(0xFF87CEEB), // Sky blue
  180. buttonBackground: Color(0xFFFFD700), // Gold
  181. buttonText: Color(0xFF0A0A2A),
  182. uiElements: Color(0xFF4682B4), // Steel blue
  183. gameBoardBorder: Color(0xFF5F9EA0),
  184. bubbleDefault: Color(0xFF00BFFF), // Deep sky blue
  185. bubblePopEffect: Color(0xFFFF6347), // Tomato
  186. scoreText: Color(0xFFF0F8FF),
  187. timerText: Color(0xDEF0F8FF),
  188. links: Color(0xFF1E90FF), // Dodger blue
  189. linkHover: Color(0xFFFF4500), // Orange red
  190. selectedMenuItem: Color(0xFFF0F8FF),
  191. animationLayer1: [Color(0x3300BFFF), Colors.transparent], // Deep sky blue
  192. animationLayer2: [Color(0x1AFFD700), Colors.transparent], // Gold
  193. animationLayer3: [Color(0x0D87CEEB), Colors.transparent], // Sky blue
  194. zenModeColors: [Color(0x4D1E90FF), Colors.transparent], // Dodger blue
  195. );
  196. /// Autumn theme - Warm oranges, reds, and browns
  197. static const SeasonalColors _autumnColors = SeasonalColors(
  198. appBackground: Color(0xFF2A1A0A), // Dark brown
  199. secondaryBackground: Color(0xFF3A2A1A),
  200. primaryText: Color(0xFFFFF8DC), // Cornsilk
  201. secondaryText: Color(0xDEFFF8DC),
  202. mutedText: Color(0xFFDEB887), // Burlywood
  203. buttonBackground: Color(0xFFD2691E), // Chocolate
  204. buttonText: Color(0xFFFFF8DC),
  205. uiElements: Color(0xFF8B4513), // Saddle brown
  206. gameBoardBorder: Color(0xFFA0522D),
  207. bubbleDefault: Color(0xFFFF7F50), // Coral
  208. bubblePopEffect: Color(0xFFDC143C), // Crimson
  209. scoreText: Color(0xFFFFF8DC),
  210. timerText: Color(0xDEFFF8DC),
  211. links: Color(0xFFB22222), // Fire brick
  212. linkHover: Color(0xFFFF4500), // Orange red
  213. selectedMenuItem: Color(0xFFFFF8DC),
  214. animationLayer1: [Color(0x33FF7F50), Colors.transparent], // Coral
  215. animationLayer2: [Color(0x1ADC143C), Colors.transparent], // Crimson
  216. animationLayer3: [Color(0x0DDEB887), Colors.transparent], // Burlywood
  217. zenModeColors: [Color(0x4DB22222), Colors.transparent], // Fire brick
  218. );
  219. /// Winter theme - Cool blues and icy whites
  220. static const SeasonalColors _winterColors = SeasonalColors(
  221. appBackground: Color(0xFF0A1A2A), // Dark slate blue
  222. secondaryBackground: Color(0xFF1A2A3A),
  223. primaryText: Color(0xFFF0F8FF), // Alice blue
  224. secondaryText: Color(0xDEF0F8FF),
  225. mutedText: Color(0xFFB0C4DE), // Light steel blue
  226. buttonBackground: Color(0xFF6495ED), // Cornflower blue
  227. buttonText: Color(0xFF0A1A2A),
  228. uiElements: Color(0xFF708090), // Slate gray
  229. gameBoardBorder: Color(0xFF778899),
  230. bubbleDefault: Color(0xFF87CEFA), // Light sky blue
  231. bubblePopEffect: Color(0xFFFFFFFF), // White
  232. scoreText: Color(0xFFF0F8FF),
  233. timerText: Color(0xDEF0F8FF),
  234. links: Color(0xFF4169E1), // Royal blue
  235. linkHover: Color(0xFF00CED1), // Dark turquoise
  236. selectedMenuItem: Color(0xFFF0F8FF),
  237. animationLayer1: [Color(0x3387CEFA), Colors.transparent], // Light sky blue
  238. animationLayer2: [Color(0x1AFFFFFF), Colors.transparent], // White
  239. animationLayer3: [Color(0x0DB0C4DE), Colors.transparent], // Light steel blue
  240. zenModeColors: [Color(0x4D4169E1), Colors.transparent], // Royal blue
  241. );
  242. }