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.

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