You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

219 lines
8.4 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_bloc/flutter_bloc.dart';
  3. import 'package:flutter_riverpod/flutter_riverpod.dart';
  4. import 'package:my_flutter_puzzle/application/states/image_splitter_state.dart';
  5. import 'package:my_flutter_puzzle/application/states/puzzle_state.dart';
  6. import 'package:my_flutter_puzzle/cubits/count_down_timer_cubit.dart';
  7. import 'package:my_flutter_puzzle/models/puzzle_data.dart';
  8. import 'package:my_flutter_puzzle/providers.dart';
  9. import 'package:my_flutter_puzzle/res/puzzle_constants.dart';
  10. import 'package:my_flutter_puzzle/utils/puzzle_solver.dart';
  11. import 'package:my_flutter_puzzle/utils/utils.dart';
  12. import 'package:my_flutter_puzzle/widgets/photo_screen/image_viewer.dart';
  13. import 'package:my_flutter_puzzle/widgets/solo_screen/count_down_timer_widget.dart';
  14. import 'package:my_flutter_puzzle/widgets/solo_screen/solo_screen_export.dart';
  15. import 'package:palette_generator/palette_generator.dart';
  16. import 'package:rive/rive.dart';
  17. class PhotoScreenLarge extends ConsumerStatefulWidget {
  18. const PhotoScreenLarge({
  19. required this.solverClient,
  20. required this.initialPuzzleData,
  21. required this.puzzleSize,
  22. required this.riveController,
  23. required this.duration,
  24. Key? key,
  25. }) : super(key: key);
  26. final PuzzleSolverClient solverClient;
  27. final PuzzleData initialPuzzleData;
  28. final int puzzleSize;
  29. final int duration;
  30. final RiveAnimationController riveController;
  31. @override
  32. ConsumerState<ConsumerStatefulWidget> createState() => _SoloScreenLargeState();
  33. }
  34. class _SoloScreenLargeState extends ConsumerState<PhotoScreenLarge> {
  35. late final PuzzleSolverClient _solverClient;
  36. late final int _puzzleSize;
  37. late final PuzzleData _initialPuzzleData;
  38. late final RiveAnimationController _riveController;
  39. bool _puzzleSolved = false;
  40. bool _isStartPressed = false;
  41. final double _fontSize = 70.0;
  42. final double _boardSize = 280.0;
  43. final int _spacing = 4;
  44. late double _eachBoxSize;
  45. List<Image>? _previousImages;
  46. Image? _previousImage;
  47. PaletteGenerator? _previousPalette;
  48. @override
  49. void initState() {
  50. _solverClient = widget.solverClient;
  51. _puzzleSize = widget.puzzleSize;
  52. _eachBoxSize = (_boardSize / _puzzleSize) - (_spacing * (_puzzleSize - 1));
  53. _initialPuzzleData = widget.initialPuzzleData;
  54. _riveController = widget.riveController;
  55. super.initState();
  56. }
  57. @override
  58. Widget build(BuildContext context) {
  59. ref.listen(puzzleNotifierProvider(_solverClient), (previous, PuzzleState next) {
  60. if (next is PuzzleInitializing) {
  61. setState(() {
  62. _isStartPressed = true;
  63. });
  64. }
  65. if (next is PuzzleSolved) {
  66. _puzzleSolved = true;
  67. }
  68. });
  69. ref.listen(imageSplitterNotifierProvider, (previous, next) {
  70. if (next is ImageSplitterComplete) {
  71. setState(() {
  72. _previousImages = next.images;
  73. _previousImage = next.image;
  74. _previousPalette = next.palette;
  75. });
  76. }
  77. });
  78. return WillPopScope(
  79. onWillPop: () async {
  80. BlocProvider.of<CountDownTimerCubit>(context).stop();
  81. return true;
  82. },
  83. child: Scaffold(
  84. backgroundColor: Theme.of(context).colorScheme.background,
  85. body: SafeArea(
  86. child: Row(
  87. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  88. children: [
  89. Padding(
  90. padding: const EdgeInsetsDirectional.symmetric(horizontal: 10),
  91. child: Column(
  92. mainAxisAlignment: MainAxisAlignment.center,
  93. crossAxisAlignment: CrossAxisAlignment.center,
  94. children: [
  95. const SizedBox(height: 32),
  96. MovesTilesWidget(solverClient: _solverClient, fontSize: 16),
  97. const SizedBox(height: 32),
  98. GameButtonWidget(
  99. solverClient: _solverClient,
  100. initialPuzzleData: _initialPuzzleData,
  101. ),
  102. ],
  103. ),
  104. ),
  105. SingleChildScrollView(
  106. child: Column(
  107. mainAxisAlignment: MainAxisAlignment.spaceEvenly,
  108. children: [
  109. CountDownTimerWidget(
  110. duration: widget.duration,
  111. finishCallback: () {
  112. if (!_puzzleSolved) {
  113. Utils.instance.showToast(context, 'TimeOut');
  114. Future.delayed(const Duration(milliseconds: 1500), () {
  115. Navigator.pop(context);
  116. });
  117. }
  118. },
  119. ),
  120. const SizedBox(height: 12),
  121. Consumer(
  122. builder: (context, ref, child) {
  123. final state = ref.watch(imageSplitterNotifierProvider);
  124. return state.maybeWhen(
  125. () => PuzzleWidget(
  126. solverClient: _solverClient,
  127. boardSize: _boardSize,
  128. eachBoxSize: _eachBoxSize,
  129. initialPuzzleData: _initialPuzzleData,
  130. fontSize: _fontSize,
  131. images: _previousImages,
  132. kInitialSpeed: kInitialSpeed,
  133. ),
  134. complete: (image, images, palette) {
  135. _previousImages = images;
  136. _previousImage = image;
  137. _previousPalette = palette;
  138. return PuzzleWidget(
  139. solverClient: _solverClient,
  140. boardSize: _boardSize,
  141. eachBoxSize: _eachBoxSize,
  142. initialPuzzleData: _initialPuzzleData,
  143. fontSize: _fontSize,
  144. images: images,
  145. kInitialSpeed: kInitialSpeed,
  146. );
  147. },
  148. orElse: () => PuzzleWidget(
  149. solverClient: _solverClient,
  150. boardSize: _boardSize,
  151. eachBoxSize: _eachBoxSize,
  152. initialPuzzleData: _initialPuzzleData,
  153. fontSize: _fontSize,
  154. images: _previousImages,
  155. kInitialSpeed: kInitialSpeed,
  156. ),
  157. );
  158. },
  159. ),
  160. const SizedBox(height: 30),
  161. ],
  162. ),
  163. ),
  164. Padding(
  165. padding: const EdgeInsetsDirectional.symmetric(horizontal: 10),
  166. child: Stack(
  167. children: [
  168. AnimatedDash(
  169. boardSize: _boardSize * 0.8,
  170. riveController: _riveController,
  171. onInit: (_) => setState(() {}),
  172. ),
  173. Column(
  174. mainAxisSize: MainAxisSize.max,
  175. crossAxisAlignment: CrossAxisAlignment.end,
  176. mainAxisAlignment: MainAxisAlignment.center,
  177. children: [
  178. CountdownWidget(
  179. isStartPressed: _isStartPressed,
  180. onFinish: () {
  181. // ref.read(timerNotifierProvider.notifier).startTimer();
  182. BlocProvider.of<CountDownTimerCubit>(context).start();
  183. setState(() {
  184. _isStartPressed = false;
  185. });
  186. },
  187. initialSpeed: kInitialSpeed,
  188. ),
  189. Visibility(
  190. visible: !_isStartPressed,
  191. child: ImageViewer(
  192. puzzleSize: _puzzleSize,
  193. previousImage: _previousImage,
  194. previousPalette: _previousPalette,
  195. imageSize: 200,
  196. ),
  197. ),
  198. ],
  199. ),
  200. ],
  201. ),
  202. ),
  203. ],
  204. ),
  205. ),
  206. ),
  207. );
  208. }
  209. }