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