Skip to content
Snippets Groups Projects
Commit 9d26ee74 authored by Benoît Harrault's avatar Benoît Harrault
Browse files

Merge branch '44-clean-code' into 'master'

Resolve "Clean code"

Closes #44

See merge request !42
parents 66840653 9632fad2
No related branches found
No related tags found
1 merge request!42Resolve "Clean code"
Pipeline #2929 passed
org.gradle.jvmargs=-Xmx1536M org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true android.useAndroidX=true
android.enableJetifier=true android.enableJetifier=true
app.versionName=0.0.39 app.versionName=0.0.40
app.versionCode=39 app.versionCode=40
Clean some code, remove deprecations
Nettoyage de code, correction des deprectations
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'tile.dart'; import 'tile.dart';
import '../provider/data.dart'; import '../provider/data.dart';
...@@ -8,19 +7,8 @@ class MovingTile extends Tile { ...@@ -8,19 +7,8 @@ class MovingTile extends Tile {
int currentCol; int currentCol;
int currentRow; int currentRow;
MovingTile( MovingTile(image, size, originalCol, originalRow, this.currentCol, this.currentRow)
image, : super(image, size, originalCol, originalRow);
size,
originalCol,
originalRow,
this.currentCol,
this.currentRow
): super(
image,
size,
originalCol,
originalRow
);
Container _tileWidget() { Container _tileWidget() {
return Container( return Container(
...@@ -32,62 +20,51 @@ class MovingTile extends Tile { ...@@ -32,62 +20,51 @@ class MovingTile extends Tile {
), ),
), ),
child: Image( child: Image(
image: this.image.image, image: this.image.image, width: this.size, height: this.size, fit: BoxFit.fill),
width: this.size,
height: this.size,
fit: BoxFit.fill
),
); );
} }
Container widget(Data myProvider) { Container widget(Data myProvider) {
return Container( return Container(
child: DragTarget<List<int>>( child: DragTarget<List<int>>(
builder: ( builder: (
BuildContext context, BuildContext context,
List<dynamic> accepted, List<dynamic> accepted,
List<dynamic> rejected, List<dynamic> rejected,
) { ) {
return Container( return Container(
height: this.size, height: this.size,
width: this.size, width: this.size,
color: Colors.cyan, color: Colors.cyan,
child: Draggable<List<int>>( child: Draggable<List<int>>(
data: [ data: [
this.currentCol, this.currentCol,
this.currentRow, this.currentRow,
], ],
// Widget when draggable is stationary // Widget when draggable is stationary
child: this._tileWidget(), child: this._tileWidget(),
// Widget when draggable is being dragged // Widget when draggable is being dragged
feedback: this._tileWidget(), feedback: this._tileWidget(),
// Widget to display on original place when being dragged // Widget to display on original place when being dragged
childWhenDragging: Container( childWhenDragging: Container(
height: this.size, height: this.size,
width: this.size, width: this.size,
color: Colors.pinkAccent, color: Colors.pinkAccent,
),
), ),
); ),
}, );
onAccept: (List<int> data) { },
myProvider.swapTiles( onAccept: (List<int> data) {
[this.currentCol, this.currentRow], myProvider.swapTiles([this.currentCol, this.currentRow], data);
data },
); ));
},
)
);
} }
bool isCorrect() { bool isCorrect() {
return ( return ((this.currentRow == this.originalRow) &&
(this.currentRow == this.originalRow) (this.currentCol == this.originalCol));
&&
(this.currentCol == this.originalCol)
);
} }
} }
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../provider/data.dart'; import '../provider/data.dart';
class Tile{ class Tile {
final Image image; final Image image;
final double size; final double size;
final int originalCol; final int originalCol;
final int originalRow; final int originalRow;
Tile( Tile(
@required this.image, this.image,
@required this.size, this.size,
@required this.originalCol, this.originalCol,
@required this.originalRow, this.originalRow,
); );
Container widget(Data myProvider) { Container widget(Data myProvider) {
return Container(); return Container();
} }
bool isCorrect() {} bool isCorrect() {
return false;
}
} }
...@@ -3,7 +3,6 @@ import 'package:flutter/foundation.dart'; ...@@ -3,7 +3,6 @@ import 'package:flutter/foundation.dart';
import '../entities/moving_tile.dart'; import '../entities/moving_tile.dart';
class Data extends ChangeNotifier { class Data extends ChangeNotifier {
// application configuration // application configuration
int _tilesCount = 4; int _tilesCount = 4;
...@@ -59,8 +58,10 @@ class Data extends ChangeNotifier { ...@@ -59,8 +58,10 @@ class Data extends ChangeNotifier {
} }
void swapTiles(List<int> tile1, List<int> tile2) { void swapTiles(List<int> tile1, List<int> tile2) {
int indexTile1 = _tiles.indexWhere((tile) => ((tile.currentCol == tile1[0]) && (tile.currentRow == tile1[1]))); int indexTile1 = _tiles.indexWhere(
int indexTile2 = _tiles.indexWhere((tile) => ((tile.currentCol == tile2[0]) && (tile.currentRow == tile2[1]))); (tile) => ((tile.currentCol == tile1[0]) && (tile.currentRow == tile1[1])));
int indexTile2 = _tiles.indexWhere(
(tile) => ((tile.currentCol == tile2[0]) && (tile.currentRow == tile2[1])));
MovingTile swap = _tiles[indexTile1]; MovingTile swap = _tiles[indexTile1];
_tiles[indexTile1] = _tiles[indexTile2]; _tiles[indexTile1] = _tiles[indexTile2];
......
...@@ -15,9 +15,9 @@ import '../utils/get_images_list.dart'; ...@@ -15,9 +15,9 @@ import '../utils/get_images_list.dart';
class Home extends StatelessWidget { class Home extends StatelessWidget {
static const String id = 'home'; static const String id = 'home';
Color themePrimaryColor = Colors.blue; final Color themePrimaryColor = Colors.blue;
double _tipImageSize = 100; final double _tipImageSize = 100;
int _selectImageColumnsCount = 3; final int _selectImageColumnsCount = 3;
Future<void> resetGame(Data myProvider) async { Future<void> resetGame(Data myProvider) async {
myProvider.updateImage = ''; myProvider.updateImage = '';
...@@ -29,7 +29,7 @@ class Home extends StatelessWidget { ...@@ -29,7 +29,7 @@ class Home extends StatelessWidget {
} }
String getImageAssetName(String imageCode) { String getImageAssetName(String imageCode) {
return 'assets/images/'+imageCode+'.png'; return 'assets/images/' + imageCode + '.png';
} }
Future<void> getImagesList(Data myProvider) async { Future<void> getImagesList(Data myProvider) async {
...@@ -42,10 +42,11 @@ class Home extends StatelessWidget { ...@@ -42,10 +42,11 @@ class Home extends StatelessWidget {
} }
} }
Future<void> selectImage(Data myProvider, String imageCode, double tileImageSize) async { Future<void> selectImage(
Data myProvider, String imageCode, double tileImageSize) async {
myProvider.updateIsShufflingBoard = true; myProvider.updateIsShufflingBoard = true;
myProvider.updateImage = imageCode; myProvider.updateImage = imageCode;
Timer timer = new Timer(new Duration(seconds: 1), () { new Timer(new Duration(seconds: 1), () {
splitImageInTiles(myProvider, tileImageSize); splitImageInTiles(myProvider, tileImageSize);
}); });
} }
...@@ -58,8 +59,10 @@ class Home extends StatelessWidget { ...@@ -58,8 +59,10 @@ class Home extends StatelessWidget {
Container _buildImageSelectorItem(Data myProvider, String image, double tileImageSize) { Container _buildImageSelectorItem(Data myProvider, String image, double tileImageSize) {
return Container( return Container(
child: FlatButton( child: TextButton(
padding: EdgeInsets.all(2), style: TextButton.styleFrom(
padding: EdgeInsets.all(2),
),
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4), borderRadius: BorderRadius.circular(4),
...@@ -68,12 +71,11 @@ class Home extends StatelessWidget { ...@@ -68,12 +71,11 @@ class Home extends StatelessWidget {
width: 4, width: 4,
), ),
), ),
child: Image( child: Image(image: AssetImage(getImageAssetName(image)), fit: BoxFit.fill),
image: AssetImage(getImageAssetName(image)),
fit: BoxFit.fill
),
), ),
onPressed: () { selectImage(myProvider, image, tileImageSize); }, onPressed: () {
selectImage(myProvider, image, tileImageSize);
},
), ),
); );
} }
...@@ -91,22 +93,19 @@ class Home extends StatelessWidget { ...@@ -91,22 +93,19 @@ class Home extends StatelessWidget {
Table( Table(
defaultColumnWidth: IntrinsicColumnWidth(), defaultColumnWidth: IntrinsicColumnWidth(),
children: [ children: [
for (var imageIndex = 0; imageIndex < images.length; imageIndex += _selectImageColumnsCount) for (var imageIndex = 0;
TableRow( imageIndex < images.length;
children: [ imageIndex += _selectImageColumnsCount)
for (var columnIndex = 0; columnIndex < _selectImageColumnsCount; columnIndex++) TableRow(children: [
Column( for (var columnIndex = 0;
children: [ columnIndex < _selectImageColumnsCount;
if (imageIndex + columnIndex < images.length) columnIndex++)
_buildImageSelectorItem( Column(children: [
myProvider, if (imageIndex + columnIndex < images.length)
images[imageIndex + columnIndex], _buildImageSelectorItem(
tileImageSize myProvider, images[imageIndex + columnIndex], tileImageSize)
) ]),
] ]),
),
]
),
], ],
), ),
], ],
...@@ -114,8 +113,9 @@ class Home extends StatelessWidget { ...@@ -114,8 +113,9 @@ class Home extends StatelessWidget {
); );
} }
FlatButton _buildTilesetSizeSelectorItem(Data myProvider, int value) { TextButton _buildTilesetSizeSelectorItem(Data myProvider, int value) {
String assetName = 'assets/icons/difficulty_' + value.toString() + 'x' + value.toString() + '.png'; String assetName =
'assets/icons/difficulty_' + value.toString() + 'x' + value.toString() + '.png';
Color borderColor = themePrimaryColor; Color borderColor = themePrimaryColor;
...@@ -123,7 +123,7 @@ class Home extends StatelessWidget { ...@@ -123,7 +123,7 @@ class Home extends StatelessWidget {
borderColor = Colors.white; borderColor = Colors.white;
} }
return FlatButton( return TextButton(
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4), borderRadius: BorderRadius.circular(4),
...@@ -133,12 +133,11 @@ class Home extends StatelessWidget { ...@@ -133,12 +133,11 @@ class Home extends StatelessWidget {
), ),
), ),
margin: EdgeInsets.all(8), margin: EdgeInsets.all(8),
child: Image( child: Image(image: AssetImage(assetName), fit: BoxFit.fill),
image: AssetImage(assetName),
fit: BoxFit.fill
),
), ),
onPressed: () { myProvider.updateTilesCount = value; }, onPressed: () {
myProvider.updateTilesCount = value;
},
); );
} }
...@@ -168,30 +167,24 @@ class Home extends StatelessWidget { ...@@ -168,30 +167,24 @@ class Home extends StatelessWidget {
Future<void> splitImageInTiles(Data myProvider, double tileImageSize) async { Future<void> splitImageInTiles(Data myProvider, double tileImageSize) async {
String imageAsset = getImageAssetName(myProvider.image); String imageAsset = getImageAssetName(myProvider.image);
Uint8List imageData = (await rootBundle.load(imageAsset)) Uint8List imageData = (await rootBundle.load(imageAsset)).buffer.asUint8List();
.buffer
.asUint8List();
imglib.Image image = imglib.decodeImage(imageData); imglib.Image image = imglib.decodeImage(imageData);
int x = 0, y = 0; int x = 0, y = 0;
int width = (image.width / myProvider.tilesCount).round(); int width = (image.width / myProvider.tilesCount).round();
int height = (image.height / myProvider.tilesCount).round(); int height = (image.height / myProvider.tilesCount).round();
List<MovingTile> tiles = List<MovingTile>(); List<MovingTile> tiles = [];
for (int i = 0; i < myProvider.tilesCount; i++) { for (int i = 0; i < myProvider.tilesCount; i++) {
for (int j = 0; j < myProvider.tilesCount; j++) { for (int j = 0; j < myProvider.tilesCount; j++) {
tiles.add( tiles.add(MovingTile(
MovingTile( Image.memory(imglib.encodeJpg(imglib.copyCrop(image, x, y, width, height))),
Image.memory( tileImageSize,
imglib.encodeJpg( j,
imglib.copyCrop(image, x, y, width, height) i,
) j,
), i,
tileImageSize, ));
j, i,
j, i,
)
);
x += width; x += width;
} }
...@@ -219,21 +212,19 @@ class Home extends StatelessWidget { ...@@ -219,21 +212,19 @@ class Home extends StatelessWidget {
int tileIndex = 0; int tileIndex = 0;
Table tileset = Table( Table tileset = Table(
defaultColumnWidth: IntrinsicColumnWidth(), defaultColumnWidth: IntrinsicColumnWidth(),
border: TableBorder.all(
border: TableBorder.all( color: Colors.black,
color: Colors.black, style: BorderStyle.solid,
style: BorderStyle.solid, width: 2,
width: 2, ),
), children: [
children: [ for (var row = 0; row < myProvider.tilesCount; row++)
for (var row = 0; row < myProvider.tilesCount; row++) TableRow(children: [
TableRow(children: [ for (var col = 0; col < myProvider.tilesCount; col++)
for (var col = 0; col < myProvider.tilesCount; col++) Column(children: [tiles[tileIndex++].widget(myProvider)]),
Column(children: [tiles[tileIndex++].widget(myProvider)]), ]),
]), ]);
]
);
return Container( return Container(
margin: EdgeInsets.all(8), margin: EdgeInsets.all(8),
...@@ -252,7 +243,7 @@ class Home extends StatelessWidget { ...@@ -252,7 +243,7 @@ class Home extends StatelessWidget {
Container _buildTipWidget(Data myProvider) { Container _buildTipWidget(Data myProvider) {
return Container( return Container(
child: FlatButton( child: TextButton(
child: Container( child: Container(
margin: EdgeInsets.all(4), margin: EdgeInsets.all(4),
padding: EdgeInsets.all(4), padding: EdgeInsets.all(4),
...@@ -265,15 +256,12 @@ class Home extends StatelessWidget { ...@@ -265,15 +256,12 @@ class Home extends StatelessWidget {
), ),
), ),
child: Image( child: Image(
image: AssetImage( image: AssetImage(myProvider.displayTipImage
myProvider.displayTipImage ? getImageAssetName(myProvider.image)
? getImageAssetName(myProvider.image) : 'assets/ui/tip-hidden.png'),
: 'assets/ui/tip-hidden.png' width: _tipImageSize,
), height: _tipImageSize,
width: _tipImageSize, fit: BoxFit.fill),
height: _tipImageSize,
fit: BoxFit.fill
),
), ),
onPressed: () => toggleDisplayTipImage(myProvider), onPressed: () => toggleDisplayTipImage(myProvider),
), ),
...@@ -288,7 +276,9 @@ class Home extends StatelessWidget { ...@@ -288,7 +276,9 @@ class Home extends StatelessWidget {
children: [ children: [
_buildTilesetWidget(myProvider), _buildTilesetWidget(myProvider),
SizedBox(height: 20), SizedBox(height: 20),
_checkTilesetIsCleared(myProvider.tiles) ? _buildWinMessage(myProvider) : _buildTipWidget(myProvider), _checkTilesetIsCleared(myProvider.tiles)
? _buildWinMessage(myProvider)
: _buildTipWidget(myProvider),
], ],
), ),
); );
...@@ -296,48 +286,30 @@ class Home extends StatelessWidget { ...@@ -296,48 +286,30 @@ class Home extends StatelessWidget {
Container _buildWinMessage(Data myProvider) { Container _buildWinMessage(Data myProvider) {
return Container( return Container(
margin: EdgeInsets.all(2), margin: EdgeInsets.all(2),
padding: EdgeInsets.all(2), padding: EdgeInsets.all(2),
child: Table(defaultColumnWidth: IntrinsicColumnWidth(), children: [
child: Table(
defaultColumnWidth: IntrinsicColumnWidth(),
children: [
TableRow( TableRow(
children: [ children: [
Column( Column(children: [
children: [ Image(image: AssetImage('assets/icons/game_win.png'), fit: BoxFit.fill),
Image( ]),
image: AssetImage('assets/icons/game_win.png'), Column(children: [
fit: BoxFit.fill TextButton(
), child: Container(
] child: Image(
), image: AssetImage('assets/icons/button_back.png'),
Column( fit: BoxFit.fill),
children: [ ),
FlatButton( onPressed: () => resetGame(myProvider),
child: Container(
child: Image(
image: AssetImage('assets/icons/button_back.png'),
fit: BoxFit.fill
),
),
onPressed: () => resetGame(myProvider),
),
]
),
Column(
children: [
Image(
image: AssetImage('assets/icons/game_win.png'),
fit: BoxFit.fill
),
]
), ),
]),
Column(children: [
Image(image: AssetImage('assets/icons/game_win.png'), fit: BoxFit.fill),
]),
], ],
), ),
] ]));
)
);
} }
Container _buildShufflingIndicatorWidget() { Container _buildShufflingIndicatorWidget() {
...@@ -367,7 +339,8 @@ class Home extends StatelessWidget { ...@@ -367,7 +339,8 @@ class Home extends StatelessWidget {
var content; var content;
double _tileImageSize = (MediaQuery.of(context).size.width - 70) / _myProvider.tilesCount; double _tileImageSize =
(MediaQuery.of(context).size.width - 70) / _myProvider.tilesCount;
if (_myProvider.isShufflingBoard) { if (_myProvider.isShufflingBoard) {
content = _buildShufflingIndicatorWidget(); content = _buildShufflingIndicatorWidget();
...@@ -384,7 +357,7 @@ class Home extends StatelessWidget { ...@@ -384,7 +357,7 @@ class Home extends StatelessWidget {
_buildTilesetSizeSelectorItem(_myProvider, 3), _buildTilesetSizeSelectorItem(_myProvider, 3),
_buildTilesetSizeSelectorItem(_myProvider, 4), _buildTilesetSizeSelectorItem(_myProvider, 4),
_buildTilesetSizeSelectorItem(_myProvider, 5), _buildTilesetSizeSelectorItem(_myProvider, 5),
FlatButton( TextButton(
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4), borderRadius: BorderRadius.circular(4),
...@@ -395,16 +368,14 @@ class Home extends StatelessWidget { ...@@ -395,16 +368,14 @@ class Home extends StatelessWidget {
), ),
margin: EdgeInsets.all(8), margin: EdgeInsets.all(8),
child: Image( child: Image(
image: AssetImage('assets/icons/button_shuffle.png'), image: AssetImage('assets/icons/button_shuffle.png'), fit: BoxFit.fill),
fit: BoxFit.fill
),
), ),
onPressed: () => shuffleImages(_myProvider), onPressed: () => shuffleImages(_myProvider),
), ),
]; ];
List<Widget> gameActions = [ List<Widget> gameActions = [
FlatButton( TextButton(
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4), borderRadius: BorderRadius.circular(4),
...@@ -414,25 +385,20 @@ class Home extends StatelessWidget { ...@@ -414,25 +385,20 @@ class Home extends StatelessWidget {
), ),
), ),
margin: EdgeInsets.all(8), margin: EdgeInsets.all(8),
child: Image( child:
image: AssetImage('assets/icons/button_back.png'), Image(image: AssetImage('assets/icons/button_back.png'), fit: BoxFit.fill),
fit: BoxFit.fill
),
), ),
onPressed: () => resetGame(_myProvider), onPressed: () => resetGame(_myProvider),
), ),
]; ];
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
backgroundColor: themePrimaryColor, backgroundColor: themePrimaryColor,
actions: _myProvider.image == '' ? menuActions : gameActions, actions: _myProvider.image == '' ? menuActions : gameActions,
),
body: SafeArea(
child: Center(
child: content
), ),
) body: SafeArea(
); child: Center(child: content),
));
} }
} }
import 'dart:async'; import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'dart:math' show Random;
class GetImagesList { class GetImagesList {
GetImagesList(); GetImagesList();
......
...@@ -49,7 +49,7 @@ packages: ...@@ -49,7 +49,7 @@ packages:
name: collection name: collection
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.15.0" version: "1.16.0"
crypto: crypto:
dependency: transitive dependency: transitive
description: description:
...@@ -63,7 +63,7 @@ packages: ...@@ -63,7 +63,7 @@ packages:
name: fake_async name: fake_async
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0" version: "1.3.0"
flutter: flutter:
dependency: "direct main" dependency: "direct main"
description: flutter description: flutter
...@@ -94,7 +94,7 @@ packages: ...@@ -94,7 +94,7 @@ packages:
name: material_color_utilities name: material_color_utilities
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.1.3" version: "0.1.4"
meta: meta:
dependency: transitive dependency: transitive
description: description:
...@@ -115,7 +115,7 @@ packages: ...@@ -115,7 +115,7 @@ packages:
name: path name: path
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.8.0" version: "1.8.1"
petitparser: petitparser:
dependency: transitive dependency: transitive
description: description:
...@@ -141,7 +141,7 @@ packages: ...@@ -141,7 +141,7 @@ packages:
name: source_span name: source_span
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.8.1" version: "1.8.2"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
...@@ -176,7 +176,7 @@ packages: ...@@ -176,7 +176,7 @@ packages:
name: test_api name: test_api
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.4.8" version: "0.4.9"
typed_data: typed_data:
dependency: transitive dependency: transitive
description: description:
...@@ -190,7 +190,7 @@ packages: ...@@ -190,7 +190,7 @@ packages:
name: vector_math name: vector_math
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.1" version: "2.1.2"
xml: xml:
dependency: transitive dependency: transitive
description: description:
...@@ -199,5 +199,5 @@ packages: ...@@ -199,5 +199,5 @@ packages:
source: hosted source: hosted
version: "5.3.1" version: "5.3.1"
sdks: sdks:
dart: ">=2.14.0 <3.0.0" dart: ">=2.17.0-0 <3.0.0"
flutter: ">=1.16.0" flutter: ">=1.16.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:puzzlegame/main.dart';
void main() {
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment