-
BINassets/images/jpg/level-1.jpg
-
BINassets/images/jpg/level-2.jpg
-
BINassets/images/jpg/level-3.jpg
-
BINassets/images/jpg/level-4.jpg
-
BINassets/images/jpg/level-5.jpg
-
BINassets/images/jpg/level-6.jpg
-
BINassets/images/jpg/level-7.jpg
-
BINassets/images/jpg/level-8.jpg
-
BINassets/images/level_1_image.png
-
BINassets/images/level_2_image.png
-
BINassets/images/level_4_image.png
-
BINassets/images/png/avatar.png
-
0assets/images/png/default_image.png
-
0assets/images/png/level_screen_image.png
-
0assets/images/png/puzzle_side_image.png
-
0assets/images/png/splash_screen_image.png
-
0assets/images/png/start.png
-
3assets/images/svg/flash.svg
-
4assets/images/svg/refresh.svg
-
3assets/images/svg/timer.svg
-
3lib/application/notifiers/image_splitter_notifier.dart
-
10lib/cubits/count_down_timer_cubit.dart
-
15lib/main.dart
-
62lib/screens/level_list/screen/level_list_screen.dart
-
14lib/screens/photo/photo_screen.dart
-
225lib/screens/photo/photo_screen_large.dart
-
3lib/screens/puzzle/puzzle_starter_screen.dart
-
1lib/screens/splash/screen/splash_screen.dart
-
6lib/utils/extensions/string_extensions.dart
-
10lib/utils/image_splitter.dart
-
11lib/utils/puzzle_solver.dart
-
22lib/widgets/photo_screen/image_viewer.dart
-
15lib/widgets/solo_screen/animated_dash.dart
-
19lib/widgets/solo_screen/count_down_timer_widget.dart
-
85lib/widgets/solo_screen/countdown_widget.dart
-
4lib/widgets/solo_screen/moves_tiles_widget.dart
-
97lib/widgets/solo_screen/moves_tiles_widget/moves_tiles_text.dart
-
4lib/widgets/solo_screen/puzzle_widget/puzzle_board.dart
-
2pubspec.yaml
-
13test/my_queue_test.dart
-
16test/puzzle_solver_test.dart
-
29test/widget_test.dart
After Width: 600 | Height: 600 | Size: 71 KiB |
After Width: 600 | Height: 600 | Size: 67 KiB |
After Width: 600 | Height: 600 | Size: 89 KiB |
After Width: 600 | Height: 600 | Size: 68 KiB |
After Width: 600 | Height: 600 | Size: 84 KiB |
After Width: 600 | Height: 600 | Size: 66 KiB |
After Width: 600 | Height: 600 | Size: 59 KiB |
After Width: 600 | Height: 600 | Size: 70 KiB |
Before Width: 70 | Height: 70 | Size: 10 KiB |
Before Width: 70 | Height: 71 | Size: 11 KiB |
Before Width: 70 | Height: 71 | Size: 13 KiB |
After Width: 126 | Height: 251 | Size: 37 KiB |
Before Width: 1006 | Height: 1007 | Size: 1.2 MiB After Width: 1006 | Height: 1007 | Size: 1.2 MiB |
Before Width: 214 | Height: 296 | Size: 54 KiB After Width: 214 | Height: 296 | Size: 54 KiB |
Before Width: 1061 | Height: 1400 | Size: 791 KiB After Width: 1061 | Height: 1400 | Size: 791 KiB |
Before Width: 266 | Height: 209 | Size: 45 KiB After Width: 266 | Height: 209 | Size: 45 KiB |
Before Width: 63 | Height: 63 | Size: 1.8 KiB After Width: 63 | Height: 63 | Size: 1.8 KiB |
@ -0,0 +1,3 @@ |
|||
<svg xmlns="http://www.w3.org/2000/svg" width="8.669" height="15.172" viewBox="0 0 8.669 15.172"> |
|||
<path id="Icon_ionic-ios-flash" data-name="Icon ionic-ios-flash" d="M17.4,8.748H13.738L15.512,2.42a.137.137,0,0,0-.244-.115L9.049,10.461a.286.286,0,0,0,.213.454h3.663l-1.774,6.328a.137.137,0,0,0,.244.115l6.219-8.153A.289.289,0,0,0,17.4,8.748Z" transform="translate(-8.996 -2.246)" fill="#fa6400"/> |
|||
</svg> |
@ -0,0 +1,4 @@ |
|||
<svg id="icon-refresh" xmlns="http://www.w3.org/2000/svg" width="12.871" height="12.995" viewBox="0 0 12.871 12.995"> |
|||
<path id="Path" d="M1.609,5.785a4.877,4.877,0,0,1,7.995-3l-.629.629a.54.54,0,0,0,.381.921h2.474a.54.54,0,0,0,.54-.54V1.325a.54.54,0,0,0-.921-.381l-.7.7A6.488,6.488,0,0,0,.011,5.549a.817.817,0,0,0,.8.948A.817.817,0,0,0,1.609,5.785Z" transform="translate(0 0)" fill="#ff9700"/> |
|||
<path id="Path-2" data-name="Path" d="M11.563,0a.817.817,0,0,0-.8.712,4.877,4.877,0,0,1-7.995,3L3.4,3.079a.54.54,0,0,0-.381-.921H.54A.54.54,0,0,0,0,2.7V5.172a.54.54,0,0,0,.921.381l.7-.7A6.488,6.488,0,0,0,12.36.949a.817.817,0,0,0-.8-.949Z" transform="translate(0.5 6.497)" fill="#ff9700"/> |
|||
</svg> |
@ -0,0 +1,3 @@ |
|||
<svg xmlns="http://www.w3.org/2000/svg" width="13.763" height="17.144" viewBox="0 0 13.763 17.144"> |
|||
<path id="Icon_material-timer" data-name="Icon material-timer" d="M13.342.5H8.921V1.974h4.421ZM10.394,11.25h1.474V7.408H10.394Zm5.917-4.87,1.046-1.046a8.14,8.14,0,0,0-1.039-1.039L15.272,5.341A6.631,6.631,0,1,0,16.311,6.38Zm-5.18,9.291a5.158,5.158,0,1,1,5.158-5.158A5.154,5.154,0,0,1,11.131,15.671Z" transform="translate(-4.25 -0.25)" fill="#fff" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="0.5"/> |
|||
</svg> |
@ -1,13 +0,0 @@ |
|||
import 'package:flutter_test/flutter_test.dart'; |
|||
import 'package:freezed_annotation/freezed_annotation.dart'; |
|||
import 'package:tuple/tuple.dart'; |
|||
|
|||
void main() { |
|||
test('queue test', () { |
|||
final queue = HeapPriorityQueue<Tuple2<int, int>>((a, b) => a.item1.compareTo(b.item1)); |
|||
queue.add(const Tuple2(5, 515)); |
|||
queue.add(const Tuple2(3, 245)); |
|||
queue.add(const Tuple2(8, 645)); |
|||
queue.add(const Tuple2(2, 345)); |
|||
}); |
|||
} |
@ -1,16 +0,0 @@ |
|||
import 'package:flutter_test/flutter_test.dart'; |
|||
import 'package:my_flutter_puzzle/utils/puzzle_solver.dart'; |
|||
|
|||
void main() { |
|||
test('solver logic test', () { |
|||
final solver = PuzzleSolverClient(size: 4); |
|||
final board = solver.createRandomBoard(); |
|||
|
|||
final boardStates = solver.runner(board); |
|||
if (boardStates != null) { |
|||
for (var board in boardStates) { |
|||
print(board); |
|||
} |
|||
} |
|||
}); |
|||
} |
@ -1,29 +0,0 @@ |
|||
// This is a basic Flutter widget test. |
|||
// |
|||
// To perform an interaction with a widget in your test, use the WidgetTester |
|||
// utility that Flutter provides. For example, you can send tap and scroll |
|||
// gestures. You can also use WidgetTester to find child widgets in the widget |
|||
// tree, read text, and verify that the values of widget properties are correct. |
|||
|
|||
import 'package:flutter/material.dart'; |
|||
import 'package:flutter_test/flutter_test.dart'; |
|||
import 'package:my_flutter_puzzle/main.dart'; |
|||
|
|||
void main() { |
|||
testWidgets('Counter increments smoke test', (WidgetTester tester) async { |
|||
// Build our app and trigger a frame. |
|||
await tester.pumpWidget(const MyApp()); |
|||
|
|||
// Verify that our counter starts at 0. |
|||
expect(find.text('0'), findsOneWidget); |
|||
expect(find.text('1'), findsNothing); |
|||
|
|||
// Tap the '+' icon and trigger a frame. |
|||
await tester.tap(find.byIcon(Icons.add)); |
|||
await tester.pump(); |
|||
|
|||
// Verify that our counter has incremented. |
|||
expect(find.text('0'), findsNothing); |
|||
expect(find.text('1'), findsOneWidget); |
|||
}); |
|||
} |