|
|
@ -1,14 +1,16 @@ |
|
|
|
import 'package:flutter/material.dart'; |
|
|
|
import 'package:flutter_bloc/flutter_bloc.dart'; |
|
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart'; |
|
|
|
import 'package:image_picker/image_picker.dart'; |
|
|
|
import 'package:my_flutter_puzzle/application/states/image_splitter_state.dart'; |
|
|
|
import 'package:my_flutter_puzzle/application/states/puzzle_state.dart'; |
|
|
|
import 'package:my_flutter_puzzle/cubits/count_down_timer_cubit.dart'; |
|
|
|
import 'package:my_flutter_puzzle/models/puzzle_data.dart'; |
|
|
|
import 'package:my_flutter_puzzle/providers.dart'; |
|
|
|
import 'package:my_flutter_puzzle/res/puzzle_constants.dart'; |
|
|
|
import 'package:my_flutter_puzzle/utils/puzzle_solver.dart'; |
|
|
|
import 'package:my_flutter_puzzle/widgets/photo_screen/image_viewer.dart'; |
|
|
|
import 'package:my_flutter_puzzle/widgets/photo_screen/pick_image_button.dart'; |
|
|
|
import 'package:my_flutter_puzzle/widgets/solo_screen/count_down_timer_widget.dart'; |
|
|
|
import 'package:my_flutter_puzzle/widgets/solo_screen/solo_screen_export.dart'; |
|
|
|
import 'package:palette_generator/palette_generator.dart'; |
|
|
|
import 'package:rive/rive.dart'; |
|
|
@ -39,7 +41,10 @@ class _SoloScreenLargeState extends ConsumerState<PhotoScreenLarge> { |
|
|
|
|
|
|
|
bool _isStartPressed = false; |
|
|
|
final _imagePicker = ImagePicker(); |
|
|
|
|
|
|
|
final double _fontSize = 70.0; |
|
|
|
final double _boardSize = 280.0; |
|
|
|
final int _spacing = 4; |
|
|
|
late double _eachBoxSize; |
|
|
|
List<Image>? _previousImages; |
|
|
|
Image? _previousImage; |
|
|
|
PaletteGenerator? _previousPalette; |
|
|
@ -48,6 +53,7 @@ class _SoloScreenLargeState extends ConsumerState<PhotoScreenLarge> { |
|
|
|
void initState() { |
|
|
|
_solverClient = widget.solverClient; |
|
|
|
_puzzleSize = widget.puzzleSize; |
|
|
|
_eachBoxSize = (_boardSize / _puzzleSize) - (_spacing * (_puzzleSize - 1)); |
|
|
|
_initialPuzzleData = widget.initialPuzzleData; |
|
|
|
_riveController = widget.riveController; |
|
|
|
super.initState(); |
|
|
@ -73,12 +79,6 @@ class _SoloScreenLargeState extends ConsumerState<PhotoScreenLarge> { |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
var fontSize = 70.0; |
|
|
|
var boardSize = 280.0; |
|
|
|
|
|
|
|
var spacing = 4; |
|
|
|
var eachBoxSize = (boardSize / _puzzleSize) - (spacing * (_puzzleSize - 1)); |
|
|
|
|
|
|
|
return Scaffold( |
|
|
|
backgroundColor: Theme.of(context).colorScheme.background, |
|
|
|
body: SafeArea( |
|
|
@ -105,7 +105,11 @@ class _SoloScreenLargeState extends ConsumerState<PhotoScreenLarge> { |
|
|
|
child: Column( |
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly, |
|
|
|
children: [ |
|
|
|
const TimerWidget(fontSize: 30), |
|
|
|
// const TimerWidget(fontSize: 30), |
|
|
|
CountDownTimerWidget( |
|
|
|
duration: 3, |
|
|
|
finishCallback: () {}, |
|
|
|
), |
|
|
|
const SizedBox(height: 12), |
|
|
|
Consumer( |
|
|
|
builder: (context, ref, child) { |
|
|
@ -114,10 +118,10 @@ class _SoloScreenLargeState extends ConsumerState<PhotoScreenLarge> { |
|
|
|
return state.maybeWhen( |
|
|
|
() => PuzzleWidget( |
|
|
|
solverClient: _solverClient, |
|
|
|
boardSize: boardSize, |
|
|
|
eachBoxSize: eachBoxSize, |
|
|
|
boardSize: _boardSize, |
|
|
|
eachBoxSize: _eachBoxSize, |
|
|
|
initialPuzzleData: _initialPuzzleData, |
|
|
|
fontSize: fontSize, |
|
|
|
fontSize: _fontSize, |
|
|
|
images: _previousImages, |
|
|
|
kInitialSpeed: kInitialSpeed, |
|
|
|
), |
|
|
@ -128,20 +132,20 @@ class _SoloScreenLargeState extends ConsumerState<PhotoScreenLarge> { |
|
|
|
|
|
|
|
return PuzzleWidget( |
|
|
|
solverClient: _solverClient, |
|
|
|
boardSize: boardSize, |
|
|
|
eachBoxSize: eachBoxSize, |
|
|
|
boardSize: _boardSize, |
|
|
|
eachBoxSize: _eachBoxSize, |
|
|
|
initialPuzzleData: _initialPuzzleData, |
|
|
|
fontSize: fontSize, |
|
|
|
fontSize: _fontSize, |
|
|
|
images: images, |
|
|
|
kInitialSpeed: kInitialSpeed, |
|
|
|
); |
|
|
|
}, |
|
|
|
orElse: () => PuzzleWidget( |
|
|
|
solverClient: _solverClient, |
|
|
|
boardSize: boardSize, |
|
|
|
eachBoxSize: eachBoxSize, |
|
|
|
boardSize: _boardSize, |
|
|
|
eachBoxSize: _eachBoxSize, |
|
|
|
initialPuzzleData: _initialPuzzleData, |
|
|
|
fontSize: fontSize, |
|
|
|
fontSize: _fontSize, |
|
|
|
images: _previousImages, |
|
|
|
kInitialSpeed: kInitialSpeed, |
|
|
|
), |
|
|
@ -157,7 +161,7 @@ class _SoloScreenLargeState extends ConsumerState<PhotoScreenLarge> { |
|
|
|
child: Stack( |
|
|
|
children: [ |
|
|
|
AnimatedDash( |
|
|
|
boardSize: boardSize * 0.8, |
|
|
|
boardSize: _boardSize * 0.8, |
|
|
|
riveController: _riveController, |
|
|
|
onInit: (_) => setState(() {}), |
|
|
|
), |
|
|
@ -169,7 +173,8 @@ class _SoloScreenLargeState extends ConsumerState<PhotoScreenLarge> { |
|
|
|
CountdownWidget( |
|
|
|
isStartPressed: _isStartPressed, |
|
|
|
onFinish: () { |
|
|
|
ref.read(timerNotifierProvider.notifier).startTimer(); |
|
|
|
// ref.read(timerNotifierProvider.notifier).startTimer(); |
|
|
|
BlocProvider.of<CountDownTimerCubit>(context).start(); |
|
|
|
setState(() { |
|
|
|
_isStartPressed = false; |
|
|
|
}); |
|
|
@ -178,33 +183,19 @@ class _SoloScreenLargeState extends ConsumerState<PhotoScreenLarge> { |
|
|
|
), |
|
|
|
Visibility( |
|
|
|
visible: !_isStartPressed, |
|
|
|
child: Column( |
|
|
|
children: [ |
|
|
|
ImageViewer( |
|
|
|
child: ImageViewer( |
|
|
|
imagePicker: _imagePicker, |
|
|
|
puzzleSize: _puzzleSize, |
|
|
|
previousImage: _previousImage, |
|
|
|
previousPalette: _previousPalette, |
|
|
|
imageSize: 200, |
|
|
|
), |
|
|
|
PickImageButton( |
|
|
|
text: 'Pick Image', |
|
|
|
onTap: ref.read(imageSplitterNotifierProvider) is ImageSplitterComplete |
|
|
|
? () => ref.read(imageSplitterNotifierProvider.notifier).generateImages( |
|
|
|
picker: _imagePicker, |
|
|
|
puzzleSize: _puzzleSize, |
|
|
|
) |
|
|
|
: null, |
|
|
|
), |
|
|
|
], |
|
|
|
), |
|
|
|
), |
|
|
|
], |
|
|
|
), |
|
|
|
], |
|
|
|
), |
|
|
|
), |
|
|
|
// SizedBox(), |
|
|
|
], |
|
|
|
), |
|
|
|
), |
|
|
|
xxxxxxxxxx