From 494cd2e44f4ce7c88397f67f06263cac9d1b4c54 Mon Sep 17 00:00:00 2001 From: mohsen zamani Date: Tue, 7 Mar 2023 01:12:15 +0330 Subject: [PATCH] add splash_screen.dart add design of level list screen --- assets/images/level_1_image.png | Bin 0 -> 10613 bytes assets/images/level_2_image.png | Bin 0 -> 11227 bytes assets/images/level_4_image.png | Bin 0 -> 13049 bytes assets/images/level_screen_image.png | Bin 0 -> 54912 bytes assets/images/splash_screen_image.png | Bin 0 -> 46093 bytes assets/images/start.png | Bin 0 -> 1871 bytes assets/images/svg/check.svg | 3 + assets/images/svg/lock.svg | 3 + assets/images/svg/start.svg | 3 + lib/main.dart | 3 +- .../level_list/screen/level_list_screen.dart | 113 ++-- .../level_list/widgets/level_widget.dart | 178 +++++++ .../level_list/widgets/lock_level_widget.dart | 140 +++++ .../widgets/payed_level_widget.dart | 143 +++++ lib/screens/login_screen_name.dart | 54 -- lib/screens/menu_screen.dart | 180 ------- lib/screens/photo/photo_screen_large.dart | 5 +- lib/screens/puzzle/top_bar.dart | 152 ------ lib/screens/puzzle_screen.dart | 220 -------- lib/screens/puzzle_solo_screen.dart | 489 ------------------ lib/screens/splash/screen/splash_screen.dart | 43 ++ lib/utils/extensions/context_extension.dart | 19 + lib/utils/extensions/string_extensions.dart | 4 + lib/widgets/animated_grid.dart | 308 ----------- lib/widgets/grid.dart | 67 --- lib/widgets/login_widgets/name_field.dart | 62 --- .../login_widgets/start_game_widget.dart | 72 --- .../start_game_widget/start_game_button.dart | 39 -- lib/widgets/menu_widgets/menu_widgets.dart | 2 - .../menu_widgets/multiplayer_button.dart | 108 ---- lib/widgets/menu_widgets/solo_button.dart | 44 -- .../photo_screen/pick_image_button.dart | 53 -- lib/widgets/puzzle_widgets/moves_text.dart | 28 - lib/widgets/puzzle_widgets/player_text.dart | 26 - .../puzzle_widgets/puzzle_widgets.dart | 2 - .../puzzle_widgets/solo/timer_widget.dart | 73 --- .../solo_screen/solo_screen_export.dart | 6 - pubspec.lock | 42 +- pubspec.yaml | 5 +- 39 files changed, 661 insertions(+), 2028 deletions(-) create mode 100644 assets/images/level_1_image.png create mode 100644 assets/images/level_2_image.png create mode 100644 assets/images/level_4_image.png create mode 100644 assets/images/level_screen_image.png create mode 100644 assets/images/splash_screen_image.png create mode 100644 assets/images/start.png create mode 100644 assets/images/svg/check.svg create mode 100644 assets/images/svg/lock.svg create mode 100644 assets/images/svg/start.svg create mode 100644 lib/screens/level_list/widgets/level_widget.dart create mode 100644 lib/screens/level_list/widgets/lock_level_widget.dart create mode 100644 lib/screens/level_list/widgets/payed_level_widget.dart delete mode 100644 lib/screens/login_screen_name.dart delete mode 100644 lib/screens/menu_screen.dart delete mode 100644 lib/screens/puzzle/top_bar.dart delete mode 100644 lib/screens/puzzle_screen.dart delete mode 100644 lib/screens/puzzle_solo_screen.dart create mode 100644 lib/screens/splash/screen/splash_screen.dart create mode 100644 lib/utils/extensions/context_extension.dart delete mode 100644 lib/widgets/animated_grid.dart delete mode 100644 lib/widgets/grid.dart delete mode 100644 lib/widgets/login_widgets/name_field.dart delete mode 100644 lib/widgets/login_widgets/start_game_widget.dart delete mode 100644 lib/widgets/login_widgets/start_game_widget/start_game_button.dart delete mode 100644 lib/widgets/menu_widgets/menu_widgets.dart delete mode 100644 lib/widgets/menu_widgets/multiplayer_button.dart delete mode 100644 lib/widgets/menu_widgets/solo_button.dart delete mode 100644 lib/widgets/photo_screen/pick_image_button.dart delete mode 100644 lib/widgets/puzzle_widgets/moves_text.dart delete mode 100644 lib/widgets/puzzle_widgets/player_text.dart delete mode 100644 lib/widgets/puzzle_widgets/puzzle_widgets.dart delete mode 100644 lib/widgets/puzzle_widgets/solo/timer_widget.dart diff --git a/assets/images/level_1_image.png b/assets/images/level_1_image.png new file mode 100644 index 0000000000000000000000000000000000000000..c591db09d7ef30a2c51da695d6af71c58ce69beb GIT binary patch literal 10613 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 P00000NkvXXu0mjfmtCv~ literal 0 HcmV?d00001 diff --git a/assets/images/level_2_image.png b/assets/images/level_2_image.png new file mode 100644 index 0000000000000000000000000000000000000000..7e8e3b3eb4addd7cc0e57a36694c71832a9307e5 GIT binary patch literal 11227 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 Hu0mjfDCTFl literal 0 HcmV?d00001 diff --git a/assets/images/level_screen_image.png b/assets/images/level_screen_image.png new file mode 100644 index 0000000000000000000000000000000000000000..56767e3609fced3bfa4a2d14776413fb5ed4c709 GIT binary patch literal 54912 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

Rqett=lzj}=)J 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 YU%^^^6%eT<#Q*>R07*qoM6N<$g1(kzA^-pY literal 0 HcmV?d00001 diff --git a/assets/images/splash_screen_image.png b/assets/images/splash_screen_image.png new file mode 100644 index 0000000000000000000000000000000000000000..ef292d852cbca0406e689d4a05e7da43dfbac2ae GIT binary patch literal 46093 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 literal 0 HcmV?d00001 diff --git a/assets/images/start.png b/assets/images/start.png new file mode 100644 index 0000000000000000000000000000000000000000..2bb1eef81a16af2d7d1c3835e27233b18147ed1f GIT binary patch literal 1871 zcmV-V2e9~wP)j{00004b3#c}2nYxW zd_h60}&a4+TxYOMDYj8;!XeNH&+;B9UgH9j3;39z_=Ag z0mfw*Kg0MG#xIs-{Z`_sc(>mY+XMJHc;ekKnqXu!aO-gV9~lS;z}~G0Kq=uZfZhiX zpTMY!2(tm_KMO&S*V+-UH9ox*@XkE}`~+-Xgi&og8~=$p_&Nvyc)>lKco33=_wJPd zxC+Cn8-SNkToMaH67arzxK{tT2*s&UqyvtD13n@@6di&vJO+f$_Wj1a;CUW0dkZEz4F$>Zt}b^oUpy>QQ{S=h`L3g4ZO{AO zZ=7@L>gv`2{#pVb+y18TRCOGHlnel#V+Ct2>=Wtf?|t*iU%y{0 z-*eKJ@0@e0s;UHlpR2B}KI|$lUxz7pq~d1+&#A7eyxcnQv$L~@8yXr;WwTl5l@(WO zrC?@!P}KbJst2F#drPeDdPVCL9HrXYTCu*q{(56$<4FxXt^v*z!qkrfuTx#Zr$$Fd zdwP3&hnJR?T4s77E1Kw#&`$H$-Q>FN0qu92#%5nKJZ z@Q&I_b=aom{_5)L5UBG23~lamj!*&M`nx0S7`tp;PL+c{&ye% zspaKmCFrJ?7WIP+jBIJ`?d>+C&zsOaP6vQf>(fOK4ubb=yc5OtCh#}_USJj%7thES z5?KAU!K<&313H5f1i5&T)!bdgEWokfp|~A^Ya|?1n)|K_-+vPxAgsZ`!9Gy(uGZGp z`|9iKcLVTsV0jw?F%Ju)UneIgFM`^m0|Ns;p-R53;Fa25>vOvSt`pLEoa3;9w4iY= zz{O9u&JXPMQEaa!ZB+0`3&aZ|+&O4*QVil$@u^>#VL@*BignhZQ^>JZF7*EJ$^%KE5xWY?%7A3l#N-Mih9?`dCqJ zy|0ep^MYEPDZFlBWBf*^n*_HMr0ogkE^U2WH=wIS8g#Bt>t0^yJ3RL{3P;X!osHuLAPAm9hou>{J_XgS z-XbYpjPkl`gVKRZF?BwjIF|xCwIk + + diff --git a/assets/images/svg/lock.svg b/assets/images/svg/lock.svg new file mode 100644 index 0000000..05743ac --- /dev/null +++ b/assets/images/svg/lock.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/start.svg b/assets/images/svg/start.svg new file mode 100644 index 0000000..a251085 --- /dev/null +++ b/assets/images/svg/start.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/main.dart b/lib/main.dart index 90829a5..68d55b0 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -5,6 +5,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:my_flutter_puzzle/cubits/count_down_timer_cubit.dart'; import 'package:my_flutter_puzzle/res/palette.dart'; import 'package:my_flutter_puzzle/screens/level_list/screen/level_list_screen.dart'; +import 'package:my_flutter_puzzle/screens/splash/screen/splash_screen.dart'; import 'package:my_flutter_puzzle/utils/color_brightness.dart'; import 'package:url_strategy/url_strategy.dart'; @@ -49,7 +50,7 @@ class MyApp extends StatelessWidget { onSurface: Colors.white38, ), ), - home: const LevelListScreen(), + home: const SplashScreen(), ), ); } diff --git a/lib/screens/level_list/screen/level_list_screen.dart b/lib/screens/level_list/screen/level_list_screen.dart index 728815e..05b4c0b 100644 --- a/lib/screens/level_list/screen/level_list_screen.dart +++ b/lib/screens/level_list/screen/level_list_screen.dart @@ -1,5 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:my_flutter_puzzle/screens/level_list/widgets/level_widget.dart'; +import 'package:my_flutter_puzzle/screens/level_list/widgets/lock_level_widget.dart'; +import 'package:my_flutter_puzzle/screens/level_list/widgets/payed_level_widget.dart'; import 'package:my_flutter_puzzle/screens/puzzle/puzzle_starter_screen.dart'; +import 'package:my_flutter_puzzle/utils/extensions/context_extension.dart'; import 'package:my_flutter_puzzle/utils/extensions/string_extensions.dart'; class LevelListScreen extends StatefulWidget { @@ -14,59 +18,86 @@ class _LevelListScreenState extends State { @override void initState() { - _levelList.add(Level(image: 'default_image'.pngPath, duration: 4, puzzleSize: 3)); - _levelList.add(Level(image: 'default_image'.pngPath, duration: 4, puzzleSize: 3)); - _levelList.add(Level(image: 'default_image'.pngPath, duration: 4, puzzleSize: 3)); - _levelList.add(Level(image: 'default_image'.pngPath, duration: 6, puzzleSize: 4)); - _levelList.add(Level(image: 'default_image'.pngPath, duration: 6, puzzleSize: 4)); - _levelList.add(Level(image: 'default_image'.pngPath, duration: 6, puzzleSize: 4)); - _levelList.add(Level(image: 'default_image'.pngPath, duration: 8, puzzleSize: 5)); - _levelList.add(Level(image: 'default_image'.pngPath, duration: 8, puzzleSize: 5)); - _levelList.add(Level(image: 'default_image'.pngPath, duration: 8, puzzleSize: 5)); + _levelList.add(Level(image: 'level_1_image'.pngPath, duration: 4, puzzleSize: 3, level: 1)); + _levelList.add(Level(image: 'level_1_image'.pngPath, duration: 4, puzzleSize: 3, level: 2)); + _levelList.add(Level(image: 'level_1_image'.pngPath, duration: 4, puzzleSize: 3, level: 3)); + _levelList.add(Level(image: 'level_2_image'.pngPath, duration: 6, puzzleSize: 4, level: 4)); + _levelList.add(Level(image: 'level_2_image'.pngPath, duration: 6, puzzleSize: 4, level: 5)); + _levelList.add(Level(image: 'level_2_image'.pngPath, duration: 6, puzzleSize: 4, level: 6)); + _levelList.add(Level(image: 'level_4_image'.pngPath, duration: 8, puzzleSize: 5, level: 7)); + _levelList.add(Level(image: 'level_4_image'.pngPath, duration: 8, puzzleSize: 5, level: 8)); + _levelList.add(Level(image: 'level_4_image'.pngPath, duration: 8, puzzleSize: 5, level: 9)); super.initState(); } @override Widget build(BuildContext context) { return Scaffold( - body: GridView.builder( - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 5), - itemBuilder: (context, index) { - return Container( - margin: const EdgeInsets.all(8), - decoration: BoxDecoration( - color: Colors.orange, - borderRadius: BorderRadius.circular(16), + backgroundColor: const Color(0xff6236FF), + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 55), + child: Row( + children: [ + Container( + width: context.width * 213 / 812, + height: context.height * 293 / 540, + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage('level_screen_image'.pngPath), + ), + ), ), - child: Column( + Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text('مرحله شماره ${index + 1}'), - const SizedBox(height: 8), - Text("زمان بازی : ${_levelList[index].duration} دقیقه"), - const SizedBox(height: 8), - GestureDetector( - child: const Text('شروع'), - onTap: () => _startLevel(_levelList[index]), + Padding( + padding: EdgeInsets.only(top: context.height * 33 / 540, bottom: context.height * 12 / 540), + child: const Text( + 'Levels', + style: TextStyle( + color: Colors.white, + fontSize: 24, + fontWeight: FontWeight.bold, + ), + ), + ), + SizedBox( + width: context.width * 436 / 820, + height: context.height * 397 / 540, + child: ListView.builder( + itemBuilder: (context, index) { + if (index == 0 || index == 1) { + return LevelWidget(level: _levelList[index]); + } + if (index == 2) { + return LockLevelWidget(level: _levelList[index]); + } + return PayedLevelWidget(level: _levelList[index]); + }, + itemCount: _levelList.length, + ), ), ], ), - ); - }, - itemCount: _levelList.length, + ], + ), ), ); } void _startLevel(Level level) { - Navigator.push(context, MaterialPageRoute( - builder: (context) { - return PuzzleStarterScreen( - duration: level.duration, - puzzleSize: level.puzzleSize, - image: level.image, - ); - }, - )); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) { + return PuzzleStarterScreen( + duration: level.duration, + puzzleSize: level.puzzleSize, + image: level.image, + ); + }, + ), + ); } } @@ -74,6 +105,12 @@ class Level { final String image; final int puzzleSize; final int duration; + final int level; - Level({required this.image, required this.duration, required this.puzzleSize}); + Level({ + required this.image, + required this.duration, + required this.puzzleSize, + required this.level, + }); } diff --git a/lib/screens/level_list/widgets/level_widget.dart b/lib/screens/level_list/widgets/level_widget.dart new file mode 100644 index 0000000..a1b9f5c --- /dev/null +++ b/lib/screens/level_list/widgets/level_widget.dart @@ -0,0 +1,178 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:my_flutter_puzzle/screens/level_list/screen/level_list_screen.dart'; +import 'package:my_flutter_puzzle/utils/extensions/context_extension.dart'; +import 'package:my_flutter_puzzle/utils/extensions/string_extensions.dart'; + +class LevelWidget extends StatelessWidget { + final Level level; + + const LevelWidget({Key? key, required this.level}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsetsDirectional.only(top: 10, start: 8, end: 8, bottom: 10), + margin: const EdgeInsets.only(bottom: 16), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16), + gradient: const LinearGradient( + colors: [ + Color(0xff5E34F5), + Color(0xff4425B1), + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + border: Border.all( + color: const Color(0xff6135FD), + width: 1, + ), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Stack( + alignment: AlignmentDirectional.centerEnd, + children: [ + Container( + width: context.width * 70 / 820, + height: context.width * 70 / 820, + margin: const EdgeInsetsDirectional.only(end: 16), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + image: DecorationImage( + image: AssetImage(level.image), + ), + ), + ), + Container( + width: context.width * 28 / 820, + height: context.width * 28 / 820, + margin: const EdgeInsetsDirectional.only(end: 6), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.red, + border: Border.all( + color: const Color(0xff6136FE), + ), + gradient: const LinearGradient( + colors: [ + Color(0xff6135FC), + Color(0xff4925CE), + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + child: Container( + padding: EdgeInsets.all(context.width * 5 / 820), + margin: EdgeInsets.all(context.width * 5 / 820), + decoration: const BoxDecoration( + color: Color(0xffF7B500), + shape: BoxShape.circle, + ), + child: SvgPicture.asset('check'.svgPath), + ), + ), + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text( + 'Level ${level.level}', + style: const TextStyle( + color: Colors.white, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(width: 12), + Text( + '${level.puzzleSize}*${level.puzzleSize} | 00:56', + style: const TextStyle( + color: Color(0xffBCACF4), + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + const SizedBox(height: 8), + const Text( + 'Keyboard', + style: TextStyle( + color: Colors.white, + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + const Spacer(), + Container( + padding: const EdgeInsets.all(3), + decoration: BoxDecoration( + color: const Color(0xff5F358F), + borderRadius: BorderRadius.circular(36), + ), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(31), + gradient: const LinearGradient( + colors: [ + Color(0xffFFC600), + Color(0xffFF5A00), + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const SizedBox(width: 6), + Container( + width: context.width * 26 / 540, + height: context.width * 26 / 540, + padding: const EdgeInsets.all(9), + margin: const EdgeInsets.symmetric(vertical: 3), + decoration: BoxDecoration( + border: Border.all( + color: Colors.white, + width: 1, + ), + gradient: const LinearGradient( + colors: [ + Colors.white, + Color(0xffD5D5D5), + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + shape: BoxShape.circle, + ), + child: SvgPicture.asset('start'.svgPath), + ), + const SizedBox(width: 8), + const Text( + 'Start', + style: TextStyle( + color: Colors.white, + fontSize: 14, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(width: 14), + ], + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/screens/level_list/widgets/lock_level_widget.dart b/lib/screens/level_list/widgets/lock_level_widget.dart new file mode 100644 index 0000000..369af87 --- /dev/null +++ b/lib/screens/level_list/widgets/lock_level_widget.dart @@ -0,0 +1,140 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:my_flutter_puzzle/screens/level_list/screen/level_list_screen.dart'; +import 'package:my_flutter_puzzle/utils/extensions/context_extension.dart'; +import 'package:my_flutter_puzzle/utils/extensions/string_extensions.dart'; + +class LockLevelWidget extends StatelessWidget { + final Level level; + + const LockLevelWidget({Key? key, required this.level}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.all(8), + margin: const EdgeInsets.only(bottom: 16), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16), + gradient: LinearGradient( + colors: [ + const Color(0xff6236FF).withOpacity(0.5), + const Color(0xff311B80).withOpacity(0.5), + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + border: Border.all( + color: const Color(0xff6135FD), + width: 1, + ), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Container( + width: context.width * 70 / 820, + height: context.width * 70 / 820, + margin: const EdgeInsetsDirectional.only(end: 16), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + image: DecorationImage( + image: AssetImage(level.image), + opacity: 0.8, + ), + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text( + 'Level ${level.level}', + style: TextStyle( + color: Colors.white.withOpacity(0.5), + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(width: 12), + Text( + '${level.puzzleSize}*${level.puzzleSize} | 00:56', + style: TextStyle( + color: const Color(0xffBCACF4).withOpacity(0.5), + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + const SizedBox(height: 8), + Text( + 'Keyboard', + style: TextStyle( + color: Colors.white.withOpacity(0.5), + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + const Spacer(), + Column( + children: [ + Text( + 'Solve lvl ${level.level - 1}', + style: const TextStyle( + color: Colors.white, + fontSize: 12, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 8), + Container( + padding: const EdgeInsets.all(3), + decoration: BoxDecoration( + color: const Color(0xff5F358F).withOpacity(0.8), + borderRadius: BorderRadius.circular(36), + ), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(31), + color: const Color(0xff5D32DE), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const SizedBox(width: 6), + Container( + width: context.width * 26 / 540, + height: context.width * 26 / 540, + padding: const EdgeInsets.all(10), + margin: const EdgeInsets.symmetric(vertical: 3), + decoration: const BoxDecoration( + color: Color(0xffAF99EF), + shape: BoxShape.circle, + ), + child: SvgPicture.asset('lock'.svgPath), + ), + const SizedBox(width: 8), + Text( + 'Lock', + style: TextStyle( + color: Colors.white.withOpacity(0.8), + fontSize: 14, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(width: 14), + ], + ), + ), + ), + ], + ), + ], + ), + ); + } +} diff --git a/lib/screens/level_list/widgets/payed_level_widget.dart b/lib/screens/level_list/widgets/payed_level_widget.dart new file mode 100644 index 0000000..bf1e81f --- /dev/null +++ b/lib/screens/level_list/widgets/payed_level_widget.dart @@ -0,0 +1,143 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:my_flutter_puzzle/screens/level_list/screen/level_list_screen.dart'; +import 'package:my_flutter_puzzle/utils/extensions/context_extension.dart'; +import 'package:my_flutter_puzzle/utils/extensions/string_extensions.dart'; + +class PayedLevelWidget extends StatelessWidget { + final Level level; + + const PayedLevelWidget({ + Key? key, + required this.level, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.all(8), + margin: const EdgeInsets.only(bottom: 16), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16), + gradient: LinearGradient( + colors: [ + const Color(0xff6236FF).withOpacity(0.5), + const Color(0xff311B80).withOpacity(0.5), + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + border: Border.all( + color: const Color(0xff6135FD), + width: 1, + ), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Container( + width: context.width * 70 / 820, + height: context.width * 70 / 820, + margin: const EdgeInsetsDirectional.only(end: 16), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + image: DecorationImage( + image: AssetImage(level.image), + opacity: 0.8, + ), + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text( + 'Level ${level.level}', + style: TextStyle( + color: Colors.white.withOpacity(0.5), + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(width: 12), + Text( + '${level.puzzleSize}*${level.puzzleSize} | 00:56', + style: TextStyle( + color: const Color(0xffBCACF4).withOpacity(0.5), + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + const SizedBox(height: 8), + Text( + 'Keyboard', + style: TextStyle( + color: Colors.white.withOpacity(0.5), + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + const Spacer(), + Column( + children: [ + const Text( + '\$ 2', + style: TextStyle( + color: Colors.white, + fontSize: 14, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 8), + Container( + padding: const EdgeInsets.all(3), + decoration: BoxDecoration( + color: const Color(0xff5F358F).withOpacity(0.8), + borderRadius: BorderRadius.circular(36), + ), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(31), + color: const Color(0xff7853FF), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const SizedBox(width: 6), + Container( + width: context.width * 26 / 540, + height: context.width * 26 / 540, + padding: const EdgeInsets.all(10), + margin: const EdgeInsets.symmetric(vertical: 3), + decoration: const BoxDecoration( + color: Colors.white , + shape: BoxShape.circle, + ), + child: SvgPicture.asset('lock'.svgPath), + ), + const SizedBox(width: 8), + Text( + 'Buy', + style: TextStyle( + color: Colors.white.withOpacity(0.8), + fontSize: 14, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(width: 14), + ], + ), + ), + ), + ], + ), + ], + ), + ); + } +} diff --git a/lib/screens/login_screen_name.dart b/lib/screens/login_screen_name.dart deleted file mode 100644 index 0770714..0000000 --- a/lib/screens/login_screen_name.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:my_flutter_puzzle/widgets/login_widgets/name_field.dart'; - -class LoginScreenName extends StatefulWidget { - const LoginScreenName({Key? key}) : super(key: key); - - @override - State createState() => _LoginScreenNameState(); -} - -class _LoginScreenNameState extends State { - late final TextEditingController _nameTextController; - late final FocusNode _nameFocusNode; - - String _nameString = ''; - - @override - void initState() { - super.initState(); - _nameTextController = TextEditingController(); - _nameFocusNode = FocusNode(); - } - - @override - Widget build(BuildContext context) { - var screenSize = MediaQuery.of(context).size; - return GestureDetector( - onTap: () => _nameFocusNode.unfocus(), - child: Scaffold( - backgroundColor: Colors.white, - body: Center( - child: SizedBox( - width: screenSize.width * 0.5, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - NameField( - focusNode: _nameFocusNode, - onChange: (value) => setState( - () => _nameString = value, - ), - ), - const SizedBox(height: 24), - // StartGameWidget( - // nameString: _nameString, - // ), - ], - ), - ), - ), - ), - ); - } -} diff --git a/lib/screens/menu_screen.dart b/lib/screens/menu_screen.dart deleted file mode 100644 index 5ec4817..0000000 --- a/lib/screens/menu_screen.dart +++ /dev/null @@ -1,180 +0,0 @@ -// import 'package:cloud_firestore/cloud_firestore.dart'; -// import 'package:flutter/material.dart'; -// import 'package:flutter_riverpod/flutter_riverpod.dart'; -// import 'package:my_flutter_puzzle/application/states/player_matching_state.dart'; -// import 'package:my_flutter_puzzle/models/user_info.dart'; -// import 'package:my_flutter_puzzle/providers.dart'; -// import 'package:my_flutter_puzzle/res/palette.dart'; -// import 'package:my_flutter_puzzle/utils/database_client.dart'; -// import 'package:my_flutter_puzzle/screens/puzzle_screen.dart'; -// import 'package:my_flutter_puzzle/widgets/menu_widgets/menu_widgets.dart'; - -// class MenuScreen extends ConsumerStatefulWidget { -// const MenuScreen({ -// Key? key, -// required this.userData, -// }) : super(key: key); - -// final UserData userData; - -// @override -// ConsumerState createState() => _MenuScreenState(); -// } - -// class _MenuScreenState extends ConsumerState { -// final numberList = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]; -// late final UserData userData; - -// @override -// void initState() { -// super.initState(); -// userData = widget.userData; -// numberList.shuffle(); -// } - -// @override -// Widget build(BuildContext context) { -// var screenSize = MediaQuery.of(context).size; - -// ref.listen(playerMatchingNotifierProvider, (previous, next) { -// if (next is PlayerMatched) { -// Navigator.of(context).push( -// MaterialPageRoute( -// builder: (context) => PuzzleScreen( -// initialList: numberList, -// id: next.id, -// myInfo: userData, -// ), -// ), -// ); -// } -// }); - -// return Scaffold( -// backgroundColor: Colors.white, -// body: Center( -// child: SizedBox( -// width: screenSize.width * 0.5, -// child: Consumer( -// builder: (context, ref, child) { -// final state = ref.watch(playerMatchingNotifierProvider); - -// return state.when( -// () => Column( -// mainAxisAlignment: MainAxisAlignment.center, -// children: [ -// const Text( -// 'Game Mode', -// style: TextStyle( -// fontSize: 30, -// // fontWeight: FontWeight.bold, -// color: Palette.crimson, -// ), -// ), -// const SizedBox(height: 24), -// MultiplayerButton( -// myInfo: userData, -// list: numberList, -// ), -// const SizedBox(height: 16), -// const SoloButton(), -// const SizedBox(height: 30), -// ], -// ), -// processing: () => Row( -// mainAxisAlignment: MainAxisAlignment.center, -// children: const [ -// CircularProgressIndicator( -// valueColor: -// AlwaysStoppedAnimation(Palette.violet), -// ), -// SizedBox(width: 16), -// Text( -// 'Finding player ...', -// style: TextStyle( -// fontSize: 24, -// ), -// ), -// ], -// ), -// isMatched: (id) => Row( -// mainAxisAlignment: MainAxisAlignment.center, -// children: const [ -// Icon( -// Icons.check_circle, -// color: Palette.violet, -// size: 50, -// ), -// SizedBox(width: 16), -// Text( -// 'Found player', -// style: TextStyle( -// fontSize: 24, -// ), -// ), -// ], -// ), -// isQueued: () => PlayerQueuedWidget( -// myInfo: userData, -// ), -// error: (message) => Text( -// message.toString(), -// style: const TextStyle( -// fontSize: 24, -// ), -// ), -// ); -// }, -// ), -// ), -// )); -// } -// } - -// class PlayerQueuedWidget extends ConsumerWidget { -// PlayerQueuedWidget({ -// Key? key, -// required this.myInfo, -// }) : super(key: key); - -// final UserData myInfo; - -// final _databaseClient = DatabaseClient(); - -// @override -// Widget build(BuildContext context, WidgetRef ref) { -// return StreamBuilder( -// stream: _databaseClient.isMatched(myInfo: myInfo), -// builder: (context, snapshot) { -// if (snapshot.hasData && snapshot.data!.data() != null) { -// final queuedUserData = -// snapshot.data!.data() as Map; -// bool isMatched = queuedUserData['ismatched']; - -// if (isMatched) { -// WidgetsBinding.instance?.addPostFrameCallback((_) { -// ref -// .read(playerMatchingNotifierProvider.notifier) -// .foundUser(myInfo: myInfo); -// }); -// } -// } - -// return Row( -// mainAxisAlignment: MainAxisAlignment.center, -// children: const [ -// CircularProgressIndicator( -// valueColor: AlwaysStoppedAnimation(Palette.violet), -// ), -// SizedBox(width: 16), -// Text( -// 'Your are in queue ...', -// style: TextStyle( -// fontSize: 24, -// ), -// ), -// ], -// ); -// }); -// } -// } diff --git a/lib/screens/photo/photo_screen_large.dart b/lib/screens/photo/photo_screen_large.dart index 669555b..4dd0a1e 100644 --- a/lib/screens/photo/photo_screen_large.dart +++ b/lib/screens/photo/photo_screen_large.dart @@ -10,8 +10,11 @@ import 'package:my_flutter_puzzle/res/puzzle_constants.dart'; import 'package:my_flutter_puzzle/utils/puzzle_solver.dart'; import 'package:my_flutter_puzzle/utils/utils.dart'; import 'package:my_flutter_puzzle/widgets/photo_screen/image_viewer.dart'; +import 'package:my_flutter_puzzle/widgets/solo_screen/animated_dash.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:my_flutter_puzzle/widgets/solo_screen/countdown_widget.dart'; +import 'package:my_flutter_puzzle/widgets/solo_screen/moves_tiles_widget.dart'; +import 'package:my_flutter_puzzle/widgets/solo_screen/puzzle_widget.dart'; import 'package:palette_generator/palette_generator.dart'; import 'package:rive/rive.dart'; diff --git a/lib/screens/puzzle/top_bar.dart b/lib/screens/puzzle/top_bar.dart deleted file mode 100644 index 3225deb..0000000 --- a/lib/screens/puzzle/top_bar.dart +++ /dev/null @@ -1,152 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; - -class TopBar extends ConsumerWidget { - const TopBar({ - required Color color, - required int puzzleSize, - this.padding = const EdgeInsets.fromLTRB(24.0, 16.0, 24.0, 16.0), - this.tileGap = 16, - this.isCentered = false, - Key? key, - }) : _color = color, - _puzzleSize = puzzleSize, - super(key: key); - - final Color _color; - final int _puzzleSize; - final EdgeInsets padding; - final double tileGap; - final bool isCentered; - - @override - Widget build(BuildContext context, WidgetRef ref) { - return Container( - color: _color, - child: Padding( - padding: padding, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - isCentered ? const SizedBox() : const Spacer(), - // TextButton( - // style: _puzzleType == 'Normal' - // ? ButtonStyle( - // foregroundColor: MaterialStateProperty.resolveWith( - // (Set states) { - // return Palette.blue; - // }, - // ), - // ) - // : null, - // onPressed: _puzzleType == 'Normal' - // ? null - // : () { - // ref.read(puzzleTypeNotifierProvider.notifier).changeToNormal(); - // }, - // child: Padding( - // padding: const EdgeInsets.all(8.0), - // child: Row( - // children: [ - // Opacity( - // opacity: _puzzleType == 'Normal' ? 1 : 0.5, - // child: const FaIcon(FontAwesomeIcons.rocket), - // ), - // const SizedBox(width: 8), - // Text( - // 'Normal', - // style: TextStyle( - // fontSize: 16, - // color: Colors.white.withOpacity(_puzzleType == 'Normal' ? 1 : 0.5), - // ), - // ), - // ], - // ), - // ), - // ), - // SizedBox(width: tileGap), - // TextButton( - // style: _puzzleType == 'Photo' - // ? ButtonStyle( - // foregroundColor: MaterialStateProperty.resolveWith( - // (Set states) { - // return Theme.of(context).colorScheme.primary; - // }, - // ), - // ) - // : null, - // onPressed: _puzzleType == 'Photo' - // ? null - // : () { - // final state = ref.read(imageSplitterNotifierProvider); - // if (state is! ImageSplitterComplete) { - // ref.read(imageSplitterNotifierProvider.notifier).getInitialImages(puzzleSize: _puzzleSize); - // } - // - // ref.read(puzzleTypeNotifierProvider.notifier).changeToPhoto(); - // }, - // child: Padding( - // padding: const EdgeInsets.all(8.0), - // child: Row( - // children: [ - // Opacity( - // opacity: _puzzleType == 'Photo' ? 1 : 0.5, - // child: const FaIcon(FontAwesomeIcons.image), - // ), - // const SizedBox(width: 8), - // Text( - // 'Photo', - // style: TextStyle( - // fontSize: 16, - // color: Colors.white.withOpacity(_puzzleType == 'Photo' ? 1 : 0.5), - // ), - // ), - // ], - // ), - // ), - // ), - // SizedBox(width: tileGap), - // TextButton( - // style: _puzzleType == 'Multiplayer' - // ? ButtonStyle( - // foregroundColor: MaterialStateProperty.resolveWith( - // (Set states) { - // return Palette.blue; - // }, - // ), - // ) - // : null, - // onPressed: _puzzleType == 'Multiplayer' - // ? null - // : () { - // // ref.read(puzzleTypeNotifierProvider.notifier).dispose(); - // - // ref.read(puzzleTypeNotifierProvider.notifier).changeToMultiplayer(); - // ref.read(emailAuthNotificationProvider.notifier).checkForSignedUser(); - // }, - // child: Padding( - // padding: const EdgeInsets.all(8.0), - // child: Row( - // children: [ - // Opacity( - // opacity: _puzzleType == 'Multiplayer' ? 1 : 0.5, - // child: const FaIcon(FontAwesomeIcons.gamepad), - // ), - // const SizedBox(width: 8), - // Text( - // 'Multiplayer', - // style: TextStyle( - // fontSize: 16, - // color: Colors.white.withOpacity(_puzzleType == 'Multiplayer' ? 1 : 0.5), - // ), - // ), - // ], - // ), - // ), - // ), - ], - ), - ), - ); - } -} diff --git a/lib/screens/puzzle_screen.dart b/lib/screens/puzzle_screen.dart deleted file mode 100644 index 03e705a..0000000 --- a/lib/screens/puzzle_screen.dart +++ /dev/null @@ -1,220 +0,0 @@ -import 'dart:developer'; - -import 'package:flutter/material.dart'; -import 'package:my_flutter_puzzle/models/user_info.dart'; -import 'package:my_flutter_puzzle/widgets/puzzle_widgets/puzzle_widgets.dart'; - -class PuzzleScreen extends StatefulWidget { - const PuzzleScreen({ - Key? key, - required this.initialList, - required this.id, - required this.myInfo, - }) : super(key: key); - - final List initialList; - final String id; - final UserData myInfo; - - @override - _PuzzleScreenState createState() => _PuzzleScreenState(); -} - -class _PuzzleScreenState extends State { - late final List myList; - late final List opponentList; - int _moves = 0; - - onClick(index) { - log('-----------------------'); - log('Tapped index: $index'); - - int emptyTilePosIndex = myList.indexOf(0); - int emptyTilePosRow = emptyTilePosIndex ~/ 4; - int emptyTilePosCol = emptyTilePosIndex % 4; - - int currentTileRow = index ~/ 4; - int currentTileCol = index % 4; - - //current element moves up - - if ((currentTileRow - 1 == emptyTilePosRow) && (currentTileCol == emptyTilePosCol)) { - setState(() { - myList[emptyTilePosIndex] = myList[index]; - myList[index] = 0; - _moves++; - }); - } - - //current element moves down - - else if ((currentTileRow + 1 == emptyTilePosRow) && (currentTileCol == emptyTilePosCol)) { - setState(() { - myList[emptyTilePosIndex] = myList[index]; - myList[index] = 0; - _moves++; - }); - } - - //current element moves left - - else if ((currentTileRow == emptyTilePosRow) && (currentTileCol + 1 == emptyTilePosCol)) { - setState(() { - myList[emptyTilePosIndex] = myList[index]; - myList[index] = 0; - _moves++; - }); - } - - //current element moves right - - else if ((currentTileRow == emptyTilePosRow) && (currentTileCol - 1 == emptyTilePosCol)) { - setState(() { - myList[emptyTilePosIndex] = myList[index]; - myList[index] = 0; - _moves++; - }); - } else { - if (currentTileCol == emptyTilePosCol) { - int low; - int high; - - // multiple elements move up - - if (emptyTilePosRow < currentTileRow) { - low = emptyTilePosRow; - high = currentTileRow; - - int i = low; - while (i < high) { - setState(() { - myList[(i * 4) + emptyTilePosCol] = myList[(((i + 1) * 4) + emptyTilePosCol)]; - }); - - i += 1; - } - setState(() { - myList[(high * 4) + emptyTilePosCol] = 0; - _moves++; - }); - } - - //multiple elements move down - - else { - low = emptyTilePosRow; - high = currentTileRow; - - int i = low; - while (i > high) { - setState(() { - myList[(i * 4) + emptyTilePosCol] = myList[(((i - 1) * 4) + emptyTilePosCol)]; - }); - - i -= 1; - } - setState(() { - myList[(high * 4) + emptyTilePosCol] = 0; - _moves++; - }); - } - } - - // multiple elements move left - - // multiple elements move right - - if (currentTileRow == emptyTilePosRow) { - int low; - int high; - - // multiple elements move left - - if (emptyTilePosCol < currentTileCol) { - low = emptyTilePosCol; - high = currentTileCol; - - int i = low; - while (i < high) { - setState(() { - myList[(emptyTilePosRow * 4) + i] = myList[(emptyTilePosRow * 4) + (i + 1)]; - }); - - i += 1; - } - setState(() { - myList[high + (emptyTilePosRow * 4)] = 0; - _moves++; - }); - } - - //multiple elements move right - - else { - low = emptyTilePosCol; - high = currentTileCol; - - int i = low; - while (i > high) { - setState(() { - myList[(i + (emptyTilePosRow * 4))] = myList[(i - 1) + (emptyTilePosRow * 4)]; - }); - - i -= 1; - } - setState(() { - myList[high + (emptyTilePosRow * 4)] = 0; - _moves++; - }); - } - } - } - - // _databaseClient.updateGameState( - // id: widget.id, - // mydata: widget.myInfo, - // numberList: myList, - // moves: _moves, - // ); - - log('List: $myList'); - log('-----------------------'); - } - - @override - void initState() { - super.initState(); - myList = widget.initialList; - opponentList = widget.initialList; - } - - @override - Widget build(BuildContext context) { - return Scaffold( - backgroundColor: Colors.white, - body: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - // PLAYER 1 puzzle --> my (own) - Column( - children: [ - const PlayerText( - displayName: 'PLAYER 1', - ), - // TODO: Change font size - MovesText( - moves: _moves, - fontSize: 60, - ), - ], - ), - Container( - height: MediaQuery.of(context).size.height * 0.6, - width: 2, - color: Colors.black, - ), - ], - ), - ); - } -} diff --git a/lib/screens/puzzle_solo_screen.dart b/lib/screens/puzzle_solo_screen.dart deleted file mode 100644 index 6e95baa..0000000 --- a/lib/screens/puzzle_solo_screen.dart +++ /dev/null @@ -1,489 +0,0 @@ -import 'dart:developer'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'package:my_flutter_puzzle/res/palette.dart'; -import 'package:my_flutter_puzzle/utils/puzzle_solver.dart'; -import 'package:my_flutter_puzzle/widgets/puzzle_widgets/puzzle_widgets.dart'; - -class PuzzleSoloScreen extends StatefulWidget { - const PuzzleSoloScreen({ - Key? key, - }) : super(key: key); - - @override - _PuzzleSoloScreenState createState() => _PuzzleSoloScreenState(); -} - -class _PuzzleSoloScreenState extends State { - late final PuzzleSolverClient _solverClient; - - List>? _board2D; - List? myList; - int _moves = 0; - final _puzzleSize = 3; - final int _animationSpeedInMilliseconds = 300; - bool _isComputing = false; - bool _isAutoSolving = false; - bool _isSolved = false; - - Map? _offsetMap; - List _solvedList = []; - - @override - void initState() { - super.initState(); - _solverClient = PuzzleSolverClient(size: _puzzleSize); - initBoard(); - generateSolvedList(); - } - - generateSolvedList() { - for (int i = 1; i < _puzzleSize * _puzzleSize; i++) { - _solvedList.add(i); - } - _solvedList.add(0); - } - - scrambleBoard() { - final generated2DBoard = _solverClient.createRandomBoard(); - final generated1DBoard = _solverClient.convertTo1D(generated2DBoard); - updateOffset(generated1DBoard); - setState(() { - _board2D = generated2DBoard; - myList = generated1DBoard; - _moves = 0; - _isSolved = false; - }); - } - - initBoard() { - final generated2DBoard = _solverClient.createRandomBoard(); - final generated1DBoard = _solverClient.convertTo1D(generated2DBoard); - - createOffset(generated1DBoard); - setState(() { - _board2D = generated2DBoard; - myList = generated1DBoard; - - _moves = 0; - }); - } - - startAutoSolver() async { - if (_board2D != null) { - setState(() { - _isComputing = true; - }); - - List>? boardStates = await compute(_solverClient.runner, _solverClient.convertTo2D(myList!)); - - setState(() { - _isComputing = false; - _isAutoSolving = true; - }); - - if (boardStates != null) { - for (var board in boardStates) { - await Future.delayed(Duration( - milliseconds: _animationSpeedInMilliseconds, - )); - setState(() { - myList = board; - _moves++; - }); - updateOffset(myList!); - } - } - } - setState(() { - _isAutoSolving = false; - _isSolved = true; - }); - showCompleteDialogBox(context); - } - - isSolved(List currentBoard) { - if (listEquals(currentBoard, _solvedList)) { - setState(() { - _isSolved = true; - }); - return true; - } - setState(() { - _isSolved = false; - }); - - return false; - } - - onClick(index) { - log('-----------------------'); - log('Tapped index: $index'); - - if (myList != null) { - int emptyTilePosIndex = myList!.indexOf(0); - int emptyTilePosRow = emptyTilePosIndex ~/ _puzzleSize; - int emptyTilePosCol = emptyTilePosIndex % _puzzleSize; - - int currentTileRow = index ~/ _puzzleSize; - int currentTileCol = index % _puzzleSize; - - //current element moves up - if ((currentTileRow - 1 == emptyTilePosRow) && (currentTileCol == emptyTilePosCol)) { - myList![emptyTilePosIndex] = myList![index]; - myList![index] = 0; - _moves++; - } - - //current element moves down - else if ((currentTileRow + 1 == emptyTilePosRow) && (currentTileCol == emptyTilePosCol)) { - myList![emptyTilePosIndex] = myList![index]; - myList![index] = 0; - _moves++; - } - - //current element moves left - else if ((currentTileRow == emptyTilePosRow) && (currentTileCol + 1 == emptyTilePosCol)) { - myList![emptyTilePosIndex] = myList![index]; - myList![index] = 0; - _moves++; - } - - //current element moves right - else if ((currentTileRow == emptyTilePosRow) && (currentTileCol - 1 == emptyTilePosCol)) { - myList![emptyTilePosIndex] = myList![index]; - myList![index] = 0; - _moves++; - } else { - if (currentTileCol == emptyTilePosCol) { - int low; - int high; - - // multiple elements move up - if (emptyTilePosRow < currentTileRow) { - low = emptyTilePosRow; - high = currentTileRow; - - int i = low; - while (i < high) { - myList![(i * _puzzleSize) + emptyTilePosCol] = myList![(((i + 1) * _puzzleSize) + emptyTilePosCol)]; - - i += 1; - } - - myList![(high * _puzzleSize) + emptyTilePosCol] = 0; - _moves++; - } - - //multiple elements move down - else { - low = emptyTilePosRow; - high = currentTileRow; - - int i = low; - while (i > high) { - myList![(i * _puzzleSize) + emptyTilePosCol] = myList![(((i - 1) * _puzzleSize) + emptyTilePosCol)]; - - i -= 1; - } - - myList![(high * _puzzleSize) + emptyTilePosCol] = 0; - _moves++; - } - } - - // multiple elements move left or right - if (currentTileRow == emptyTilePosRow) { - int low; - int high; - - // multiple elements move left - if (emptyTilePosCol < currentTileCol) { - low = emptyTilePosCol; - high = currentTileCol; - - int i = low; - while (i < high) { - myList![(emptyTilePosRow * _puzzleSize) + i] = myList![(emptyTilePosRow * _puzzleSize) + (i + 1)]; - - i += 1; - } - - myList![high + (emptyTilePosRow * _puzzleSize)] = 0; - _moves++; - } - - //multiple elements move right - else { - low = emptyTilePosCol; - high = currentTileCol; - - int i = low; - while (i > high) { - myList![(i + (emptyTilePosRow * _puzzleSize))] = myList![(i - 1) + (emptyTilePosRow * _puzzleSize)]; - - i -= 1; - } - - myList![high + (emptyTilePosRow * _puzzleSize)] = 0; - _moves++; - } - } - } - - // Update Offset list - // setState(() { - // updateOffset(myList!); - // }); - updateOffset(myList!); - setState(() {}); - - if (isSolved(myList!)) { - showCompleteDialogBox(context); - } - - log('List: $myList'); - log('-----------------------'); - } - } - - createOffset(List board) { - Map offsetMap = {}; - int j = 0; - - log('BOARD: $board'); - - for (int i = 0; i < board.length; i++) { - final xMod = i % _puzzleSize; - double x = xMod / (_puzzleSize - 1); - - if (x % i == 0 && i != 0) j++; - int yMod = j % _puzzleSize; - double y = yMod / (_puzzleSize - 1); - - offsetMap.addEntries([ - MapEntry( - board[i], - FractionalOffset(x, y), - ) - ]); - } - - log('INITIAL OFFSET MAP: $offsetMap'); - setState(() { - _offsetMap = offsetMap; - }); - } - - updateOffset(List board) { - int j = 0; - - for (int i = 0; i < board.length; i++) { - final xMod = i % _puzzleSize; - double x = xMod / (_puzzleSize - 1); - - if (x % i == 0 && i != 0) j++; - int yMod = j % _puzzleSize; - double y = yMod / (_puzzleSize - 1); - - _offsetMap![board[i]] = FractionalOffset(x, y); - } - log('OFFSET MAP: $_offsetMap'); - } - - showCompleteDialogBox(BuildContext context) { - showDialog( - context: context, - builder: (context) => Dialog( - child: Padding( - padding: const EdgeInsets.all(24.0), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - const Text( - 'Solved successfully!', - style: TextStyle(fontSize: 22), - ), - const SizedBox(height: 16), - ElevatedButton( - style: ElevatedButton.styleFrom( - primary: Palette.violet, - onSurface: Palette.violet, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(50), - ), - ), - onPressed: () { - Navigator.of(context).pop(); - }, - child: const Padding( - padding: EdgeInsets.all(16.0), - child: Text( - 'OK', - style: TextStyle(fontSize: 22), - ), - ), - ), - ], - ), - ), - ), - ); - } - - @override - Widget build(BuildContext context) { - var screenSize = MediaQuery.of(context).size; - - var boardSize = screenSize.height * 0.6; - - var spacing = 4; - var eachBoxSize = (boardSize / _puzzleSize) - (spacing * (_puzzleSize - 1)); - - return Scaffold( - backgroundColor: Colors.white, - body: myList != null && _offsetMap != null - ? Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Row(), - MovesText( - moves: _moves, - fontSize: 60, - ), - SizedBox( - height: boardSize, - width: boardSize, - child: Stack( - children: [ - for (int i = 0; i < _offsetMap!.length; i++) - _offsetMap!.entries.toList()[i].key != 0 - ? AnimatedAlign( - alignment: _offsetMap!.entries.toList()[i].value, - duration: Duration( - milliseconds: _animationSpeedInMilliseconds, - ), - curve: Curves.easeInOut, - child: GestureDetector( - onTap: () => onClick(myList!.indexOf(_offsetMap!.entries.toList()[i].key)), - child: Card( - elevation: 4, - color: const Color(0xFF2868d7), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - ), - child: SizedBox( - height: eachBoxSize, - width: eachBoxSize, - child: Center( - child: Text( - _offsetMap!.entries.toList()[i].key.toString(), - style: const TextStyle( - fontSize: 60, - fontWeight: FontWeight.bold, - color: Colors.white, - ), - ), - ), - ), - ), - ), - ) - : const SizedBox(), - ], - ), - ), - // AnimatedGrid( - // puzzleSize: _puzzleSize, - // key: UniqueKey(), - // number: myList!, - // offsetList: _offsetList!, - // onTap: onClick, - // color: const Color(0xFF2868d7), - // ), - const SizedBox(height: 30), - Row( - mainAxisSize: MainAxisSize.min, - children: [ - Padding( - padding: const EdgeInsets.only(bottom: 30.0), - child: SizedBox( - width: MediaQuery.of(context).size.width * 0.2, - child: ElevatedButton( - style: ElevatedButton.styleFrom( - primary: Palette.violet, - onSurface: Palette.violet, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(50), - ), - ), - onPressed: _isComputing || _isAutoSolving || _isSolved - ? null - : () { - startAutoSolver(); - }, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: _isComputing || _isAutoSolving - ? Row( - children: [ - const SizedBox( - width: 25, - height: 25, - child: CircularProgressIndicator( - color: Palette.violet, - strokeWidth: 2, - ), - ), - const SizedBox(width: 16), - Text( - _isComputing ? 'Computing ...' : 'Solving ...', - style: const TextStyle(fontSize: 20), - ), - ], - ) - : const Text( - 'Start Auto Solver', - style: TextStyle(fontSize: 22), - ), - ), - ), - ), - ), - const SizedBox(width: 16.0), - Padding( - padding: const EdgeInsets.only(bottom: 30.0), - child: SizedBox( - width: MediaQuery.of(context).size.width * 0.2, - child: ElevatedButton( - style: ElevatedButton.styleFrom( - primary: Palette.crimson, - onSurface: Palette.crimson, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(50), - ), - ), - onPressed: _isComputing || _isAutoSolving - ? null - : () { - scrambleBoard(); - }, - child: const Padding( - padding: EdgeInsets.all(16.0), - child: Text( - 'Scramble', - style: TextStyle(fontSize: 22), - ), - ), - ), - ), - ), - ], - ), - ], - ) - : const SizedBox(), - ); - } -} diff --git a/lib/screens/splash/screen/splash_screen.dart b/lib/screens/splash/screen/splash_screen.dart new file mode 100644 index 0000000..18f1cdc --- /dev/null +++ b/lib/screens/splash/screen/splash_screen.dart @@ -0,0 +1,43 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:my_flutter_puzzle/screens/level_list/screen/level_list_screen.dart'; +import 'package:my_flutter_puzzle/utils/extensions/string_extensions.dart'; + +class SplashScreen extends StatefulWidget { + const SplashScreen({Key? key}) : super(key: key); + + @override + State createState() => _SplashScreenState(); +} + +class _SplashScreenState extends State { + @override + void initState() { + Timer(const Duration(milliseconds: 2000), () { + Navigator.push(context, MaterialPageRoute( + builder: (context) { + return const LevelListScreen(); + }, + )); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: const Color(0xff6236FF), + body: Center( + child: Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage('splash_screen_image'.pngPath), + ), + ), + ), + ), + ); + } +} diff --git a/lib/utils/extensions/context_extension.dart b/lib/utils/extensions/context_extension.dart new file mode 100644 index 0000000..6872d02 --- /dev/null +++ b/lib/utils/extensions/context_extension.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +extension ContextExtentions on BuildContext { + double get height { + return MediaQuery.of(this).size.height; + } + + double get width { + return MediaQuery.of(this).size.width; + } + + double get horizontallyMargin { + return MediaQuery.of(this).size.width * 0.05; + } + + double get verticallyMargin { + return MediaQuery.of(this).size.height * 0.025; + } +} diff --git a/lib/utils/extensions/string_extensions.dart b/lib/utils/extensions/string_extensions.dart index 2b725a8..4ed93bc 100644 --- a/lib/utils/extensions/string_extensions.dart +++ b/lib/utils/extensions/string_extensions.dart @@ -6,4 +6,8 @@ extension StringExtension on String { String get rivePath { return 'assets/rive/$this.riv'; } + + String get svgPath { + return 'assets/images/svg/$this.svg'; + } } diff --git a/lib/widgets/animated_grid.dart b/lib/widgets/animated_grid.dart deleted file mode 100644 index 1cbdab7..0000000 --- a/lib/widgets/animated_grid.dart +++ /dev/null @@ -1,308 +0,0 @@ -import 'package:flutter/material.dart'; - -class AnimatedGrid extends StatefulWidget { - const AnimatedGrid({ - Key? key, - required this.number, - required this.offsetList, - required this.onTap, - required this.color, - required this.puzzleSize, - }) : super(key: key); - - final Function onTap; - final List number; - final List offsetList; - final Color color; - final int puzzleSize; - - @override - State createState() => _AnimatedGridState(); -} - -class _AnimatedGridState extends State { - late List _offsetList; - - @override - void initState() { - _offsetList = widget.offsetList; - super.initState(); - } - - @override - Widget build(BuildContext context) { - var screenSize = MediaQuery.of(context).size; - var boardSize = screenSize.width * 0.4; - - var spacing = 4; - var eachBoxSize = - (boardSize / widget.puzzleSize) - (spacing * (widget.puzzleSize - 1)); - - return SizedBox( - height: boardSize, - width: boardSize, - child: Stack( - children: [ - for (int i = 0; i < widget.offsetList.length; i++) - widget.number[i] != 0 - ? AnimatedAlign( - alignment: widget.offsetList[i], - duration: const Duration(seconds: 1), - curve: Curves.easeInOut, - child: GestureDetector( - onTap: () => widget.onTap(i), - child: Card( - elevation: 4, - color: widget.color, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - ), - child: SizedBox( - height: eachBoxSize, - width: eachBoxSize, - child: Center( - child: Text( - widget.number[i].toString(), - style: const TextStyle( - fontSize: 60, - fontWeight: FontWeight.bold, - color: Colors.white, - ), - ), - ), - ), - ), - ), - ) - : const SizedBox(), - ], - ), - ); - - // ----------------------------- - // Working implementation: - // ----------------------------- - // return SizedBox( - // height: screenSize.height * 0.7, - // width: screenSize.width * 0.4, - // child: GridView.builder( - // gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - // crossAxisCount: puzzleSize, - // ), - // itemCount: number.length, - // itemBuilder: (context, index) { - // return number[index] != 0 - // ? Padding( - // padding: const EdgeInsets.all(2.0), - // child: GestureDetector( - // onTap: () => onTap(index), - // child: AnimatedPositioned( - // duration: Duration(milliseconds: 600), - // child: Container( - // height: 20, - // width: 20, - // color: Colors.orange, - // ), - // ), - // ), - // ) - // // ? MouseRegion( - // // child: Padding( - // // padding: const EdgeInsets.all(2.0), - // // child: GestureDetector( - // // onTap: () => onTap(index), - // // child: Card( - // // elevation: 4, - // // color: color, - // // // dark -> 0xFF14407a - // // // light -> 0xFF43b9fd - // // shape: RoundedRectangleBorder( - // // borderRadius: BorderRadius.circular(20), - // // ), - // // child: SizedBox( - // // height: 20, - // // width: 20, - // // child: Center( - // // child: Text( - // // number[index].toString(), - // // style: const TextStyle( - // // fontSize: 60, - // // fontWeight: FontWeight.bold, - // // color: Colors.white, - // // ), - // // ), - // // ), - // // ), - // // ), - // // ), - // // ), - // // ) - // : const SizedBox(); - // // }, - // // ), - // // ); - // } - } -} - -// class AnimatedGrid extends StatefulWidget { -// const AnimatedGrid({ -// Key? key, -// required this.number, -// required this.offsetList, -// required this.onTap, -// required this.color, -// required this.puzzleSize, -// }) : super(key: key); - -// final Function onTap; -// final List number; -// final List offsetList; -// final Color color; -// final int puzzleSize; - -// @override -// State createState() => _AnimatedGridState(); -// } - -// class _AnimatedGridState extends State { -// // FractionalOffset offset = FractionalOffset(0, 0); -// late final List _numberList; -// // late final int _puzzleSize; - -// @override -// void initState() { -// _numberList = widget.number; -// // _puzzleSize = widget.puzzleSize; -// // print(_numberList); -// // print(widget.offsetList); -// super.initState(); -// } - -// // calculateOffset() { -// // List offsetList = []; - -// // for (int i = 0; i < _puzzleSize; i++) { -// // int yMod = i % _puzzleSize; -// // double y = yMod / (_puzzleSize - 1); -// // for (int j = 0; j < _puzzleSize; j++) { -// // final xMod = _numberList[i][j] % _puzzleSize; -// // double x = xMod / (_puzzleSize - 1); -// // offsetList.add(FractionalOffset(x, y)); -// // } -// // } -// // } - -// @override -// Widget build(BuildContext context) { -// var screenSize = MediaQuery.of(context).size; -// var boardSize = screenSize.width * 0.4; - -// var spacing = 4; -// var eachBoxSize = -// (boardSize / widget.puzzleSize) - (spacing * (widget.puzzleSize - 1)); - -// return SizedBox( -// height: boardSize, -// width: boardSize, -// child: Stack( -// children: [ -// for (var offset in widget.offsetList) -// AnimatedAlign( -// alignment: offset, -// duration: const Duration(seconds: 1), -// curve: Curves.easeInOut, -// child: Container( -// height: eachBoxSize, -// width: eachBoxSize, -// color: Colors.black, -// ), -// ), -// // AnimatedAlign( -// // alignment: FractionalOffset(1, 0), -// // duration: Duration(seconds: 1), -// // curve: Curves.easeInOut, -// // child: Container( -// // height: eachBoxSize, -// // width: eachBoxSize, -// // color: Colors.black, -// // ), -// // ), -// // AnimatedAlign( -// // alignment: FractionalOffset(0.5, 1), -// // duration: Duration(seconds: 1), -// // curve: Curves.easeInOut, -// // child: Container( -// // height: eachBoxSize, -// // width: eachBoxSize, -// // color: Colors.black, -// // ), -// // ), -// ], -// ), -// ); - -// // ----------------------------- -// // Working implementation: -// // ----------------------------- -// // return SizedBox( -// // height: screenSize.height * 0.7, -// // width: screenSize.width * 0.4, -// // child: GridView.builder( -// // gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( -// // crossAxisCount: puzzleSize, -// // ), -// // itemCount: number.length, -// // itemBuilder: (context, index) { -// // return number[index] != 0 -// // ? Padding( -// // padding: const EdgeInsets.all(2.0), -// // child: GestureDetector( -// // onTap: () => onTap(index), -// // child: AnimatedPositioned( -// // duration: Duration(milliseconds: 600), -// // child: Container( -// // height: 20, -// // width: 20, -// // color: Colors.orange, -// // ), -// // ), -// // ), -// // ) -// // // ? MouseRegion( -// // // child: Padding( -// // // padding: const EdgeInsets.all(2.0), -// // // child: GestureDetector( -// // // onTap: () => onTap(index), -// // // child: Card( -// // // elevation: 4, -// // // color: color, -// // // // dark -> 0xFF14407a -// // // // light -> 0xFF43b9fd -// // // shape: RoundedRectangleBorder( -// // // borderRadius: BorderRadius.circular(20), -// // // ), -// // // child: SizedBox( -// // // height: 20, -// // // width: 20, -// // // child: Center( -// // // child: Text( -// // // number[index].toString(), -// // // style: const TextStyle( -// // // fontSize: 60, -// // // fontWeight: FontWeight.bold, -// // // color: Colors.white, -// // // ), -// // // ), -// // // ), -// // // ), -// // // ), -// // // ), -// // // ), -// // // ) -// // : const SizedBox(); -// // }, -// // ), -// // ); -// } -// } diff --git a/lib/widgets/grid.dart b/lib/widgets/grid.dart deleted file mode 100644 index ad1f1ce..0000000 --- a/lib/widgets/grid.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'package:flutter/material.dart'; - -class Grid extends StatelessWidget { - const Grid({ - Key? key, - required this.number, - required this.onTap, - required this.color, - required this.puzzleSize, - }) : super(key: key); - - final Function onTap; - final List number; - final Color color; - final int puzzleSize; - - @override - Widget build(BuildContext context) { - var screenSize = MediaQuery.of(context).size; - - return SizedBox( - height: screenSize.height * 0.7, - width: screenSize.width * 0.4, - child: GridView.builder( - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: puzzleSize, - ), - itemCount: number.length, - itemBuilder: (context, index) { - return number[index] != 0 - ? MouseRegion( - child: Padding( - padding: const EdgeInsets.all(2.0), - child: GestureDetector( - onTap: () => onTap(index), - child: Card( - elevation: 4, - color: color, - // dark -> 0xFF14407a - // light -> 0xFF43b9fd - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - ), - child: SizedBox( - height: 20, - width: 20, - child: Center( - child: Text( - number[index].toString(), - style: const TextStyle( - fontSize: 60, - fontWeight: FontWeight.bold, - color: Colors.white, - ), - ), - ), - ), - ), - ), - ), - ) - : const SizedBox(); - }, - ), - ); - } -} diff --git a/lib/widgets/login_widgets/name_field.dart b/lib/widgets/login_widgets/name_field.dart deleted file mode 100644 index 576cac0..0000000 --- a/lib/widgets/login_widgets/name_field.dart +++ /dev/null @@ -1,62 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:my_flutter_puzzle/res/palette.dart'; - -class NameField extends StatefulWidget { - final FocusNode focusNode; - final Function(String) onChange; - - const NameField({ - Key? key, - required this.focusNode, - required this.onChange, - }) : super(key: key); - - @override - State createState() => _NameFieldState(); -} - -class _NameFieldState extends State { - late final TextEditingController _nameTextController; - late final FocusNode _nameFocusNode; - - @override - void initState() { - super.initState(); - _nameTextController = TextEditingController(); - _nameFocusNode = widget.focusNode; - } - - @override - Widget build(BuildContext context) { - return TextField( - controller: _nameTextController, - focusNode: _nameFocusNode, - style: const TextStyle( - fontSize: 24, - color: Palette.crimson, - ), - cursorColor: Palette.violet, - decoration: InputDecoration( - border: const UnderlineInputBorder(), - focusedBorder: const UnderlineInputBorder( - borderSide: BorderSide( - color: Palette.violet, - width: 3, - ), - ), - enabledBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: Palette.violet.withOpacity(0.5), - width: 2, - ), - ), - hintText: 'Enter your name', - hintStyle: TextStyle( - fontSize: 22, - color: Palette.violet.withOpacity(0.2), - ), - ), - onChanged: (value) => widget.onChange(value), - ); - } -} diff --git a/lib/widgets/login_widgets/start_game_widget.dart b/lib/widgets/login_widgets/start_game_widget.dart deleted file mode 100644 index f3e3e9a..0000000 --- a/lib/widgets/login_widgets/start_game_widget.dart +++ /dev/null @@ -1,72 +0,0 @@ -// import 'package:flutter/material.dart'; -// import 'package:flutter_riverpod/flutter_riverpod.dart'; -// import 'package:my_flutter_puzzle/application/states/anonymous_auth_state.dart'; -// import 'package:my_flutter_puzzle/providers.dart'; -// import 'package:my_flutter_puzzle/res/palette.dart'; -// import 'package:my_flutter_puzzle/screens/menu_screen.dart'; -// import 'package:my_flutter_puzzle/screens/puzzle_screen.dart'; -// import 'package:my_flutter_puzzle/widgets/login_widgets/start_game_widget/start_game_button.dart'; - -// class StartGameWidget extends ConsumerWidget { -// const StartGameWidget({ -// Key? key, -// required String nameString, -// }) : _nameString = nameString, -// super(key: key); - -// final String _nameString; - -// @override -// Widget build(BuildContext context, WidgetRef ref) { -// ref.listen(anonymousAuthNotificationProvider, (previous, next) { -// if (next is StorageDone) { -// Navigator.of(context).pushAndRemoveUntil( -// MaterialPageRoute( -// builder: (context) => MenuScreen( -// userData: next.userData, -// ), -// ), -// (route) => false, -// ); -// } -// }); - -// return Consumer( -// builder: (context, ref, child) { -// final state = ref.watch(anonymousAuthNotificationProvider); - -// return state.when( -// () => StartGameButton( -// nameString: _nameString, -// ), -// processing: () => const CircularProgressIndicator( -// valueColor: AlwaysStoppedAnimation(Palette.violet), -// ), -// done: (_) => const CircularProgressIndicator( -// valueColor: AlwaysStoppedAnimation(Palette.violet), -// ), -// storingInfo: () => const CircularProgressIndicator( -// valueColor: AlwaysStoppedAnimation(Palette.violet), -// ), -// storageDone: (userData) => const Icon( -// Icons.check, -// size: 50, -// color: Palette.violet, -// ), -// // done: (_) => const Icon( -// // Icons.check, -// // size: 50, -// // color: Palette.violet, -// // ), -// error: (message) => Column( -// children: [ -// Text('$message'), -// const SizedBox(height: 16), -// StartGameButton(nameString: _nameString), -// ], -// ), -// ); -// }, -// ); -// } -// } diff --git a/lib/widgets/login_widgets/start_game_widget/start_game_button.dart b/lib/widgets/login_widgets/start_game_widget/start_game_button.dart deleted file mode 100644 index fd84386..0000000 --- a/lib/widgets/login_widgets/start_game_widget/start_game_button.dart +++ /dev/null @@ -1,39 +0,0 @@ -// import 'package:flutter/material.dart'; -// import 'package:flutter_riverpod/flutter_riverpod.dart'; -// import 'package:my_flutter_puzzle/providers.dart'; -// import 'package:my_flutter_puzzle/res/palette.dart'; - -// class StartGameButton extends ConsumerWidget { -// const StartGameButton({ -// Key? key, -// required String nameString, -// }) : _nameString = nameString, -// super(key: key); - -// final String _nameString; - -// @override -// Widget build(BuildContext context, WidgetRef ref) { -// return SizedBox( -// width: double.maxFinite, -// child: ElevatedButton( -// style: ElevatedButton.styleFrom( -// primary: Palette.violet, -// onSurface: Palette.violet, -// ), -// onPressed: _nameString.isEmpty || _nameString.length < 3 -// ? null -// : () => ref -// .read(anonymousAuthNotificationProvider.notifier) -// .triggerAnonymousLogin(name: _nameString), -// child: const Padding( -// padding: EdgeInsets.all(16.0), -// child: Text( -// 'Start game', -// style: TextStyle(fontSize: 22), -// ), -// ), -// ), -// ); -// } -// } diff --git a/lib/widgets/menu_widgets/menu_widgets.dart b/lib/widgets/menu_widgets/menu_widgets.dart deleted file mode 100644 index 02b5ea8..0000000 --- a/lib/widgets/menu_widgets/menu_widgets.dart +++ /dev/null @@ -1,2 +0,0 @@ -export 'multiplayer_button.dart'; -export 'solo_button.dart'; \ No newline at end of file diff --git a/lib/widgets/menu_widgets/multiplayer_button.dart b/lib/widgets/menu_widgets/multiplayer_button.dart deleted file mode 100644 index b243b67..0000000 --- a/lib/widgets/menu_widgets/multiplayer_button.dart +++ /dev/null @@ -1,108 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:my_flutter_puzzle/models/user_info.dart'; -import 'package:my_flutter_puzzle/res/palette.dart'; - -class MultiplayerButton extends ConsumerStatefulWidget { - const MultiplayerButton({ - Key? key, - required this.myInfo, - required this.list, - }) : super(key: key); - - final UserData myInfo; - final List list; - - @override - ConsumerState createState() => _MultiplayerButtonState(); -} - -class _MultiplayerButtonState extends ConsumerState { - late final List numberList; - - @override - void initState() { - super.initState(); - numberList = widget.list; - numberList.shuffle(); - } - - @override - Widget build(BuildContext context) { - return SizedBox( - width: double.maxFinite, - child: OutlinedButton( - style: OutlinedButton.styleFrom( - primary: Palette.violet, - onSurface: Palette.violet, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(50), - ), - side: const BorderSide( - width: 2, - color: Palette.violet, - ), - ), - onPressed: () { - // ref - // .read(playerMatchingNotifierProvider.notifier) - // .triggerMatching(myInfo: widget.myInfo, numbers: numberList); - }, - child: const Padding( - padding: EdgeInsets.all(16.0), - child: Text( - 'Multiplayer', - style: TextStyle(fontSize: 22), - ), - ), - ), - ); - } -} - -// class MultiplayerButton extends StatefulWidget { -// final UserData myInfo; -// MultiplayerButton({ -// Key? key, -// required this.myInfo, -// }) : super(key: key); - -// @override -// State createState() => _MultiplayerButtonState(); -// } - -// class _MultiplayerButtonState extends State { -// final numberList = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]; - -// @override -// Widget build(BuildContext context) { -// return SizedBox( -// width: double.maxFinite, -// child: OutlinedButton( -// style: OutlinedButton.styleFrom( -// primary: Palette.violet, -// onSurface: Palette.violet, -// shape: RoundedRectangleBorder( -// borderRadius: BorderRadius.circular(50), -// ), -// side: const BorderSide( -// width: 2, -// color: Palette.violet, -// ), -// ), -// onPressed: () { -// ref.read(playerMatchingNotifierProvider.notifier).triggerMatching( -// myInfo: widget.myInfo, -// numbers: [14, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 15]); -// }, -// child: const Padding( -// padding: EdgeInsets.all(16.0), -// child: Text( -// 'Multiplayer', -// style: TextStyle(fontSize: 22), -// ), -// ), -// ), -// ); -// } -// } diff --git a/lib/widgets/menu_widgets/solo_button.dart b/lib/widgets/menu_widgets/solo_button.dart deleted file mode 100644 index 204ffab..0000000 --- a/lib/widgets/menu_widgets/solo_button.dart +++ /dev/null @@ -1,44 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:my_flutter_puzzle/res/palette.dart'; -import 'package:my_flutter_puzzle/screens/puzzle_solo_screen.dart'; - -class SoloButton extends StatelessWidget { - const SoloButton({ - Key? key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return SizedBox( - width: double.maxFinite, - child: OutlinedButton( - style: OutlinedButton.styleFrom( - primary: Palette.violet, - onSurface: Palette.violet, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(50), - ), - side: const BorderSide( - width: 2, - color: Palette.violet, - ), - ), - onPressed: () { - Navigator.of(context).pushAndRemoveUntil( - MaterialPageRoute( - builder: (context) => const PuzzleSoloScreen(), - ), - (route) => false, - ); - }, - child: const Padding( - padding: EdgeInsets.all(16.0), - child: Text( - 'Solo', - style: TextStyle(fontSize: 22), - ), - ), - ), - ); - } -} diff --git a/lib/widgets/photo_screen/pick_image_button.dart b/lib/widgets/photo_screen/pick_image_button.dart deleted file mode 100644 index e143e5c..0000000 --- a/lib/widgets/photo_screen/pick_image_button.dart +++ /dev/null @@ -1,53 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; - -class PickImageButton extends ConsumerWidget { - const PickImageButton({ - Key? key, - required this.text, - required this.onTap, - this.padding = const EdgeInsets.only(top: 13.0, bottom: 12.0), - this.width = 145, - }) : super(key: key); - - final String text; - final Function()? onTap; - final EdgeInsets padding; - final double width; - - @override - Widget build(BuildContext context, WidgetRef ref) { - return SizedBox( - width: width, - child: ElevatedButton( - style: ButtonStyle( - shape: MaterialStateProperty.all( - RoundedRectangleBorder(borderRadius: BorderRadius.circular(30)), - ), - backgroundColor: MaterialStateProperty.resolveWith( - (Set states) { - if (states.contains(MaterialState.pressed)) { - return Theme.of(context).colorScheme.primary.withOpacity(0.5); - } else if (states.contains(MaterialState.disabled)) { - return Theme.of(context).colorScheme.primary.withOpacity(0.5); - } - - return Theme.of(context).colorScheme.primary; - }, - ), - ), - onPressed: onTap, - child: Padding( - padding: padding, - child: Text( - text, - style: TextStyle( - fontSize: 16, - color: Colors.white.withOpacity(onTap == null ? 0.6 : 1), - ), - ), - ), - ), - ); - } -} diff --git a/lib/widgets/puzzle_widgets/moves_text.dart b/lib/widgets/puzzle_widgets/moves_text.dart deleted file mode 100644 index 1d70378..0000000 --- a/lib/widgets/puzzle_widgets/moves_text.dart +++ /dev/null @@ -1,28 +0,0 @@ -import 'package:flutter/material.dart'; - -class MovesText extends StatelessWidget { - const MovesText({ - Key? key, - required int moves, - required this.fontSize, - }) : _moves = moves, - super(key: key); - - final int _moves; - final double fontSize; - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.fromLTRB(0, 8, 0, 24), - child: Text( - '$_moves Moves', - style: TextStyle( - fontSize: fontSize, - fontWeight: FontWeight.bold, - color: Colors.black, - ), - ), - ); - } -} diff --git a/lib/widgets/puzzle_widgets/player_text.dart b/lib/widgets/puzzle_widgets/player_text.dart deleted file mode 100644 index 726ea76..0000000 --- a/lib/widgets/puzzle_widgets/player_text.dart +++ /dev/null @@ -1,26 +0,0 @@ -import 'package:flutter/material.dart'; - -class PlayerText extends StatelessWidget { - final String displayName; - - const PlayerText({ - Key? key, - required this.displayName, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.only(top: 24.0), - child: Text( - displayName, - style: const TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - color: Color(0xFF14407a), - letterSpacing: 2, - ), - ), - ); - } -} diff --git a/lib/widgets/puzzle_widgets/puzzle_widgets.dart b/lib/widgets/puzzle_widgets/puzzle_widgets.dart deleted file mode 100644 index 4906bbe..0000000 --- a/lib/widgets/puzzle_widgets/puzzle_widgets.dart +++ /dev/null @@ -1,2 +0,0 @@ -export 'moves_text.dart'; -export 'player_text.dart'; \ No newline at end of file diff --git a/lib/widgets/puzzle_widgets/solo/timer_widget.dart b/lib/widgets/puzzle_widgets/solo/timer_widget.dart deleted file mode 100644 index e7532fd..0000000 --- a/lib/widgets/puzzle_widgets/solo/timer_widget.dart +++ /dev/null @@ -1,73 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; - -class TimerWidget extends StatefulWidget { - const TimerWidget({ - Key? key, - required this.fontSize, - required this.color, - }) : super(key: key); - - final double fontSize; - final Color color; - - @override - _TimerWidgetState createState() => _TimerWidgetState(); -} - -class _TimerWidgetState extends State { - late final Timer _timer; - int _start = 0; - - void startTimer() { - _timer = Timer.periodic( - const Duration(seconds: 1), - (Timer timer) => setState(() => _start++), - ); - } - - String printDuration() { - var duration = Duration(seconds: _start); - String twoDigits(int n) => n.toString().padLeft(2, "0"); - String twoDigitMinutes = twoDigits(duration.inMinutes.remainder(60)); - String twoDigitSeconds = twoDigits(duration.inSeconds.remainder(60)); - return "${twoDigits(duration.inHours)}:$twoDigitMinutes:$twoDigitSeconds"; - } - - @override - void initState() { - startTimer(); - super.initState(); - } - - @override - void dispose() { - _timer.cancel(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Center( - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - printDuration(), - style: TextStyle( - fontSize: widget.fontSize, - color: widget.color, - ), - ), - const SizedBox(width: 8), - Icon( - Icons.timer, - color: widget.color, - size: widget.fontSize * 1.3, - ) - ], - ), - ); - } -} diff --git a/lib/widgets/solo_screen/solo_screen_export.dart b/lib/widgets/solo_screen/solo_screen_export.dart index b3cb511..e69de29 100644 --- a/lib/widgets/solo_screen/solo_screen_export.dart +++ b/lib/widgets/solo_screen/solo_screen_export.dart @@ -1,6 +0,0 @@ -export 'animated_dash.dart'; -export 'countdown_widget.dart'; -export 'game_button_widget.dart'; -export 'moves_tiles_widget.dart'; -export 'puzzle_widget.dart'; -export 'timer_widget.dart'; \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index 585fe15..2460255 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -278,6 +278,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" + flutter_svg: + dependency: "direct main" + description: + name: flutter_svg + sha256: "97c5b291b4fd34ae4f55d6a4c05841d4d0ed94952e033c5a6529e1b47b4d2a29" + url: "https://pub.dev" + source: hosted + version: "2.0.2" flutter_test: dependency: "direct dev" description: flutter @@ -480,6 +488,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.8.2" + path_parsing: + dependency: transitive + description: + name: path_parsing + sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf + url: "https://pub.dev" + source: hosted + version: "1.0.1" path_provider: dependency: "direct main" description: @@ -741,6 +757,30 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.0" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: e43c38822e7d2facd790fd617ce16b10cc359a4b094d5772e3198904270918ef + url: "https://pub.dev" + source: hosted + version: "1.1.1" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: "4a85a8563405bfe223052a85d6f8bc276ba3a22e12acfa3fd9a7108c67b32076" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: "9e8066d2f18e88f2fb1cf6c8ca567417bdfb0145ac28519dcca3c15d42a10b3e" + url: "https://pub.dev" + source: hosted + version: "1.1.1" vector_math: dependency: transitive description: @@ -799,4 +839,4 @@ packages: version: "3.1.1" sdks: dart: ">=2.19.0 <3.0.0" - flutter: ">=3.0.0" + flutter: ">=3.7.0-0" diff --git a/pubspec.yaml b/pubspec.yaml index e007306..fdf443e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,6 +12,7 @@ dependencies: url_strategy: ^0.2.0 flutter_riverpod: ^1.0.3 freezed_annotation: ^1.1.0 + flutter_svg: ^2.0.2 collection: ^1.15.0 tuple: ^2.0.0 isolated_worker: ^0.1.0 @@ -34,8 +35,8 @@ flutter: uses-material-design: true assets: - assets/rive/dash.riv - - assets/images/default_image.png - - assets/images/puzzle_side_image.png + - assets/images/ + - assets/images/svg/ fonts: - family: GoogleSans fonts: