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

Merge branch '3-add-split-shuffle-tiles-feature' into 'master'

Resolve "Add split/shuffle tiles feature"

Closes #3

See merge request !3
parents c78ecd95 4c11861b
No related branches found
No related tags found
1 merge request!3Resolve "Add split/shuffle tiles feature"
Pipeline #1183 passed
org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true
app.versionName=0.0.2
app.versionCode=2
app.versionName=0.0.3
app.versionCode=3
......@@ -4,8 +4,9 @@ class Data extends ChangeNotifier {
// application data
List _images = [];
String _image = '';
List _tiles = [];
String get image => _image;
......@@ -21,6 +22,13 @@ class Data extends ChangeNotifier {
notifyListeners();
}
List get tiles => _tiles;
set updateTiles(List value) {
_tiles = value;
notifyListeners();
}
void resetGame() {
_image = '';
notifyListeners();
......
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show rootBundle;
import 'package:image/image.dart' as imglib;
import 'package:provider/provider.dart';
import '../provider/data.dart';
......@@ -7,10 +11,21 @@ import '../utils/get_images_list.dart';
class Home extends StatelessWidget {
static const String id = 'home';
int _linesCount = 3;
int _columnsCount = 3;
double _selectorImageSize = 200;
double _tipImageSize = 100;
double _tileImageSize = 80;
Future<void> resetGame(Data myProvider) async {
myProvider.updateImage = '';
}
String getImageAssetName(String imageCode) {
return 'assets/images/'+imageCode+'.png';
}
Future<void> getImagesList(Data myProvider) async {
GetImagesList getImagesList;
getImagesList = GetImagesList();
......@@ -20,10 +35,12 @@ class Home extends StatelessWidget {
}
}
Container _buildImageSelectorItem(Data myProvider, String image) {
double imageSize = 200;
String imageAsset = 'assets/images/'+image+'.png';
Future<void> selectImage(Data myProvider, String imageCode) async {
myProvider.updateImage = imageCode;
myProvider.updateTiles = await splitImageInTiles(myProvider);
}
Container _buildImageSelectorItem(Data myProvider, String image) {
return Container(
child: FlatButton(
child: Container(
......@@ -36,15 +53,13 @@ class Home extends StatelessWidget {
),
margin: EdgeInsets.all(2),
child: Image(
image: AssetImage(imageAsset),
width: imageSize,
height: imageSize,
image: AssetImage(getImageAssetName(image)),
width: _selectorImageSize,
height: _selectorImageSize,
fit: BoxFit.fill
),
),
onPressed: () {
myProvider.updateImage = image;
},
onPressed: () { selectImage(myProvider, image); },
),
);
}
......@@ -66,33 +81,125 @@ class Home extends StatelessWidget {
);
}
Container _buildGameWidget(Data myProvider) {
double imageSize = 250;
String imageAsset = 'assets/images/'+myProvider.image+'.png';
Future<List<Image>> splitImageInTiles(Data myProvider) async {
String imageAsset = getImageAssetName(myProvider.image);
Uint8List imageData = (await rootBundle.load(imageAsset))
.buffer
.asUint8List();
imglib.Image image = imglib.decodeImage(imageData);
int x = 0, y = 0;
int width = (image.width / _linesCount).round();
int height = (image.height / _columnsCount).round();
List<imglib.Image> parts = List<imglib.Image>();
for (int i = 0; i < _linesCount; i++) {
for (int j = 0; j < _columnsCount; j++) {
parts.add(imglib.copyCrop(image, x, y, width, height));
x += width;
}
x = 0;
y += height;
}
List<Image> tiles = List<Image>();
for (var img in parts) {
tiles.add(Image.memory(imglib.encodeJpg(img)));
}
return tiles;
}
Container _buildImageTileItem(Image tile) {
return Container(
child: Image(
image: tile.image,
width: _tileImageSize,
height: _tileImageSize,
fit: BoxFit.fill
)
);
}
Container _buildTilesetWidget(Data myProvider) {
List tiles = myProvider.tiles;
tiles.shuffle();
int tileIndex = 0;
Table tileset = Table(
defaultColumnWidth: IntrinsicColumnWidth(),
border: TableBorder.all(
color: Colors.black,
style: BorderStyle.solid,
width: 2,
),
children: [
TableRow(children: [
Column(children: [_buildImageTileItem(tiles[tileIndex++])]),
Column(children: [_buildImageTileItem(tiles[tileIndex++])]),
Column(children: [_buildImageTileItem(tiles[tileIndex++])]),
]),
TableRow(children: [
Column(children: [_buildImageTileItem(tiles[tileIndex++])]),
Column(children: [_buildImageTileItem(tiles[tileIndex++])]),
Column(children: [_buildImageTileItem(tiles[tileIndex++])]),
]),
TableRow(children: [
Column(children: [_buildImageTileItem(tiles[tileIndex++])]),
Column(children: [_buildImageTileItem(tiles[tileIndex++])]),
Column(children: [_buildImageTileItem(tiles[tileIndex++])]),
]),
],
);
return Container(
margin: EdgeInsets.all(4),
padding: EdgeInsets.all(4),
decoration: BoxDecoration(
color: Colors.blue,
borderRadius: BorderRadius.circular(4),
border: Border.all(
color: Colors.green,
width: 4,
),
),
child: tileset,
);
}
Container _buildTipWidget(Data myProvider) {
return Container(
margin: EdgeInsets.all(4),
padding: EdgeInsets.all(4),
decoration: BoxDecoration(
color: Colors.blue,
borderRadius: BorderRadius.circular(4),
border: Border.all(
color: Colors.green,
width: 4,
),
),
child: Image(
image: AssetImage(getImageAssetName(myProvider.image)),
width: _tipImageSize,
height: _tipImageSize,
fit: BoxFit.fill
),
);
}
Container _buildGameWidget(Data myProvider) {
return Container(
child: Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
margin: EdgeInsets.all(4),
padding: EdgeInsets.all(4),
decoration: BoxDecoration(
color: Colors.blue,
borderRadius: BorderRadius.circular(4),
border: Border.all(
color: Colors.green,
width: 4,
),
),
child: Image(
image: AssetImage(imageAsset),
width: imageSize,
height: imageSize,
fit: BoxFit.fill
),
),
_buildTilesetWidget(myProvider),
SizedBox(height: 20),
_buildTipWidget(myProvider),
],
),
);
......
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
archive:
dependency: transitive
description:
name: archive
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.2"
async:
dependency: transitive
description:
......@@ -43,6 +50,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.15.0"
crypto:
dependency: transitive
description:
name: crypto
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.1"
fake_async:
dependency: transitive
description:
......@@ -60,6 +74,13 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
image:
dependency: "direct main"
description:
name: image
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.2"
matcher:
dependency: transitive
description:
......@@ -88,6 +109,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.0"
petitparser:
dependency: transitive
description:
name: petitparser
url: "https://pub.dartlang.org"
source: hosted
version: "4.1.0"
provider:
dependency: "direct main"
description:
......@@ -156,6 +184,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
xml:
dependency: transitive
description:
name: xml
url: "https://pub.dartlang.org"
source: hosted
version: "5.1.1"
sdks:
dart: ">=2.12.0 <3.0.0"
flutter: ">=1.16.0"
......@@ -9,6 +9,7 @@ environment:
dependencies:
flutter:
sdk: flutter
image: ^3.0.2
provider: ^5.0.0
dev_dependencies:
......
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