[gnome-tetravex/arnaudb/add-moves-arrows] Draw helpers to move all tiles.



commit dd46548634eec5dfb90ca318faa2dc0f3957bfec
Author: Arnaud Bonatti <arnaud bonatti gmail com>
Date:   Fri Oct 18 03:15:16 2019 +0200

    Draw helpers to move all tiles.

 src/puzzle-view.vala | 43 +++++++++++++++++++++++++++++++++++++++++--
 src/puzzle.vala      | 30 +++++++++++++++++++++++-------
 2 files changed, 64 insertions(+), 9 deletions(-)
---
diff --git a/src/puzzle-view.vala b/src/puzzle-view.vala
index 737209e..44da5d4 100644
--- a/src/puzzle-view.vala
+++ b/src/puzzle-view.vala
@@ -243,15 +243,17 @@ private class PuzzleView : Gtk.DrawingArea
         /* Move immediately */
         if (duration == 0)
         {
-            redraw_tile (image);
+//            redraw_tile (image);
             image.x = image.target_x;
             image.y = image.target_y;
             image.snap_to_cursor = true;
-            redraw_tile (image);
+//            redraw_tile (image);
+            queue_draw ();
             return;
         }
 
         /* Start animation (maximum of 100fps) */
+        queue_draw ();
         if (animation_timeout == 0)
             animation_timeout = Timeout.add (10, animate_cb);
     }
@@ -447,6 +449,41 @@ private class PuzzleView : Gtk.DrawingArea
                 context.rectangle (0.0, 0.0, /* width and height */ tilesize, tilesize);
                 context.fill ();
 
+                if (x < puzzle.size && selected_tile == null)
+                {
+                    Direction dir = puzzle.can_move (x, y);
+                    if ((dir == Direction.LEFT  && puzzle.has_tile_on_line (y))
+                     || (dir == Direction.RIGHT && puzzle.has_tile_on_line (y))
+                     || (dir == Direction.UP    && puzzle.has_tile_on_column (x))
+                     || (dir == Direction.DOWN  && puzzle.has_tile_on_column (x)))
+//                     || dir == Direction.UP_LEFT || dir == Direction.DOWN_RIGHT
+//                     || dir == Direction.UP_RIGHT || dir == Direction.DOWN_LEFT)
+                    {
+                        context.save ();
+                        context.translate (tilesize / 2.0, tilesize / 2.0);
+                        switch (dir)
+                        {
+                            case Direction.LEFT:        context.rotate (-Math.PI_2);        break;
+                            case Direction.DOWN:        context.rotate ( Math.PI  );        break;
+                            case Direction.RIGHT:       context.rotate ( Math.PI_2);        break;
+//                            case Direction.UP_LEFT:     context.rotate (-Math.PI_4);        break;
+//                            case Direction.UP_RIGHT:    context.rotate ( Math.PI_4);        break;
+//                            case Direction.DOWN_LEFT:   context.rotate (-Math.PI_4 * 3.0);  break;
+//                            case Direction.DOWN_RIGHT:  context.rotate ( Math.PI_4 * 3.0);  break;
+                            default:                                                        break;
+                        }
+
+                        context.move_to (            0.0, -4.0 * tilesize / 10.0);
+                        context.line_to (tilesize / -6.0, -3.0 * tilesize / 10.0);
+                        context.line_to (tilesize /  6.0, -3.0 * tilesize / 10.0);
+                        context.close_path ();
+
+                        context.set_source_rgba (1.0, 1.0, 1.0, 0.3);
+                        context.stroke ();
+                        context.restore ();
+                    }
+                }
+
                 context.restore ();
             }
 
@@ -575,6 +612,8 @@ private class PuzzleView : Gtk.DrawingArea
             if (get_tile_coords (x, y, out tile_x, out tile_y))
                 puzzle.try_move (tile_x, tile_y);
         }
+        if (tile_selected)
+            queue_draw ();  // hiding move arrows
     }
     private inline bool get_tile_coords (double event_x, double event_y, out uint8 tile_x, out uint8 tile_y)
     {
diff --git a/src/puzzle.vala b/src/puzzle.vala
index 49b0230..5134559 100644
--- a/src/puzzle.vala
+++ b/src/puzzle.vala
@@ -422,7 +422,7 @@ private class Puzzle : Object
         }
     }
 
-    private inline Direction can_move (uint8 x, uint8 y)
+    internal Direction can_move (uint8 x, uint8 y)
     {
         bool left_board = x < size;
         if (half_board_is_empty (left_board))
@@ -459,13 +459,20 @@ private class Puzzle : Object
         return true;
     }
 
-    private enum Direction
+    internal bool has_tile_on_line (uint8 y)
     {
-        NONE,
-        UP,
-        DOWN,
-        LEFT,
-        RIGHT;
+        for (uint8 x = 0; x < size; x++)
+            if (board [x, y] != null)
+                return true;
+        return false;
+    }
+
+    internal bool has_tile_on_column (uint8 x)
+    {
+        for (uint8 y = 0; y < size; y++)
+            if (board [x, y] != null)
+                return true;
+        return false;
     }
 
     /*\
@@ -863,3 +870,12 @@ private class Puzzle : Object
 
     // TODO restore history 2/2
 }
+
+private enum Direction
+{
+    NONE,
+    UP,
+    DOWN,
+    LEFT,
+    RIGHT;
+}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]