From f0367b638e29db6dc61acd93b769e0dc0bf5dd7e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr>
Date: Thu, 27 May 2021 16:19:51 +0200
Subject: [PATCH] Add swap tiles feature on drop tile on an other

---
 android/gradle.properties |  4 ++--
 lib/entities/tile.dart    |  9 ++++++++-
 lib/provider/data.dart    | 13 +++++++++++++
 lib/screens/home.dart     |  6 +++---
 4 files changed, 26 insertions(+), 6 deletions(-)

diff --git a/android/gradle.properties b/android/gradle.properties
index 135006f..85b94f8 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,5 +1,5 @@
 org.gradle.jvmargs=-Xmx1536M
 android.useAndroidX=true
 android.enableJetifier=true
-app.versionName=0.0.6
-app.versionCode=6
+app.versionName=0.0.7
+app.versionCode=7
diff --git a/lib/entities/tile.dart b/lib/entities/tile.dart
index e9919d7..2860b50 100644
--- a/lib/entities/tile.dart
+++ b/lib/entities/tile.dart
@@ -1,4 +1,7 @@
 import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
+
+import '../provider/data.dart';
 
 class Tile {
   final Image image;
@@ -35,7 +38,7 @@ class Tile {
     );
   }
 
-  Container widget() {
+  Container widget(Data myProvider) {
     return Container(
       child: DragTarget<List<int>>(
         builder: (
@@ -70,6 +73,10 @@ class Tile {
         },
         onAccept: (List<int> data) {
           print(data.toString());
+          myProvider.swapTiles(
+            [this.currentCol, this.currentRow],
+            data
+          );
         },
       )
     );
diff --git a/lib/provider/data.dart b/lib/provider/data.dart
index 5979a1b..601037d 100644
--- a/lib/provider/data.dart
+++ b/lib/provider/data.dart
@@ -1,5 +1,7 @@
 import 'package:flutter/foundation.dart';
 
+import '../entities/tile.dart';
+
 class Data extends ChangeNotifier {
 
   // application data
@@ -38,6 +40,17 @@ class Data extends ChangeNotifier {
     notifyListeners();
   }
 
+  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])));
+
+    Tile swap = _tiles[indexTile1];
+    _tiles[indexTile1] = _tiles[indexTile2];
+    _tiles[indexTile2] = swap;
+
+    notifyListeners();
+  }
+
   void resetGame() {
     _image = '';
     notifyListeners();
diff --git a/lib/screens/home.dart b/lib/screens/home.dart
index 42432a2..6d7bd07 100644
--- a/lib/screens/home.dart
+++ b/lib/screens/home.dart
@@ -117,14 +117,14 @@ class Home extends StatelessWidget {
       y += height;
     }
 
+    tiles.shuffle();
+
     return tiles;
   }
 
   Container _buildTilesetWidget(Data myProvider) {
     List tiles = myProvider.tiles;
 
-    tiles.shuffle();
-
     int tileIndex = 0;
 
     Table tileset = Table(
@@ -139,7 +139,7 @@ class Home extends StatelessWidget {
         for (var row = 0; row < _linesCount; row++)
           TableRow(children: [
             for (var col = 0; col < _columnsCount; col++)
-              Column(children: [tiles[tileIndex++].widget()]),
+              Column(children: [tiles[tileIndex++].widget(myProvider)]),
           ]),
       ]
     );
-- 
GitLab