[iagno] Rework game-view.vala.
- From: Michael Catanzaro <mcatanzaro src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [iagno] Rework game-view.vala.
- Date: Tue, 16 Sep 2014 15:17:38 +0000 (UTC)
commit 27ab95fbacb03ac55fa190d53b899952f466ecea
Author: Arnaud Bonatti <arnaud bonatti gmail com>
Date: Tue Sep 16 16:09:48 2014 +0200
Rework game-view.vala.
https://bugzilla.gnome.org/show_bug.cgi?id=710125
src/game-view.vala | 96 +++++++++++++++++++--------------------------------
src/iagno.vala | 2 +-
2 files changed, 37 insertions(+), 61 deletions(-)
---
diff --git a/src/game-view.vala b/src/game-view.vala
index 45411f9..cb5c995 100644
--- a/src/game-view.vala
+++ b/src/game-view.vala
@@ -11,9 +11,16 @@
public class GameView : Gtk.DrawingArea
{
- /* Space between tiles in pixels */
+ /* Theme */
+ private const int GRID_BORDER = 3;
private const int GRID_WIDTH = 2;
+ /* Utilities, see calculate () */
+ private int tile_size;
+ private int board_size;
+ private int x_offset { get { return (get_allocated_width () - board_size) / 2; }}
+ private int y_offset { get { return (get_allocated_height () - board_size) / 2; }}
+
/* Delay in milliseconds between tile flip frames */
private const int PIXMAP_FLIP_DELAY = 20;
@@ -32,40 +39,6 @@ public class GameView : Gtk.DrawingArea
/* Used for a delay between the last move and flipping the pieces */
private bool flip_final_result_now = false;
- private int tile_size
- {
- get
- {
- return int.min (get_allocated_width () / 8, get_allocated_height () / (int) 8) - GRID_WIDTH;
- }
- }
-
- private int x_offset
- {
- get
- {
- return (get_allocated_width () - 8 * (tile_size + GRID_WIDTH)) / 2;
- }
- }
-
- private int y_offset
- {
- get
- {
- return (get_allocated_height () - 8 * (tile_size + GRID_WIDTH)) / 2;
- }
- }
-
- private int board_size { get { return (tile_size + GRID_WIDTH) * 8; } }
-
- public GameView ()
- {
- set_events (Gdk.EventMask.EXPOSURE_MASK | Gdk.EventMask.BUTTON_PRESS_MASK);
- pixmaps = new int[8,8];
-
- set_size_request (350, 350);
- }
-
private Game? _game = null;
public Game? game
{
@@ -93,25 +66,20 @@ public class GameView : Gtk.DrawingArea
set { _theme = value; tiles_pattern = null; queue_draw (); }
}
- public override Gtk.SizeRequestMode get_request_mode ()
- {
- return Gtk.SizeRequestMode.WIDTH_FOR_HEIGHT;
- }
-
- public override void get_preferred_width_for_height (int height, out int minimum_width, out int
natural_width)
+ public GameView ()
{
- /* Try and be square */
- minimum_width = natural_width = height;
- }
+ set_events (Gdk.EventMask.EXPOSURE_MASK | Gdk.EventMask.BUTTON_PRESS_MASK);
+ pixmaps = new int[8,8];
- public override void get_preferred_width (out int minimum, out int natural)
- {
- minimum = natural = (int) (8 * (20 + GRID_WIDTH));
+ set_size_request (350, 350);
}
- public override void get_preferred_height (out int minimum, out int natural)
+ private void calculate ()
{
- minimum = natural = (int) (8 * (20 + GRID_WIDTH));
+ var size = int.min (get_allocated_width (), get_allocated_height ());
+ /* tile_size includes a grid spacing */
+ tile_size = (size - 2 * GRID_BORDER + GRID_WIDTH) / 8;
+ board_size = tile_size * 8 - GRID_WIDTH + 2 * GRID_BORDER;
}
public override bool draw (Cairo.Context cr)
@@ -119,6 +87,8 @@ public class GameView : Gtk.DrawingArea
if (game == null)
return false;
+ calculate ();
+
if (tiles_pattern == null || render_size != tile_size)
{
render_size = tile_size;
@@ -128,12 +98,16 @@ public class GameView : Gtk.DrawingArea
tiles_pattern = new Cairo.Pattern.for_surface (surface);
}
+ cr.translate (x_offset, y_offset);
+ cr.save ();
+ cr.translate (GRID_BORDER - GRID_WIDTH, GRID_BORDER - GRID_WIDTH);
+
for (var x = 0; x < 8; x++)
{
for (var y = 0; y < 8; y++)
{
- var tile_x = x_offset + x * (tile_size + GRID_WIDTH);
- var tile_y = y_offset + y * (tile_size + GRID_WIDTH);
+ var tile_x = x * tile_size;
+ var tile_y = y * tile_size;
var texture_x = (pixmaps[x, y] % 8) * tile_size;
var texture_y = (pixmaps[x, y] / 8) * tile_size;
@@ -146,20 +120,22 @@ public class GameView : Gtk.DrawingArea
}
}
- cr.set_source_rgba (1.0, 1.0, 1.0, 1.0);
- cr.set_operator (Cairo.Operator.DIFFERENCE);
+ cr.restore ();
+
+ cr.set_source_rgba (0.0, 0.0, 0.0, 1.0);
cr.set_line_width (GRID_WIDTH);
for (var i = 1; i < 8; i++)
{
- cr.move_to (x_offset + i * board_size / 8 - GRID_WIDTH / 2, y_offset);
+ cr.move_to (i * tile_size + GRID_WIDTH / 2.0, 0);
cr.rel_line_to (0, board_size);
- cr.move_to (x_offset, y_offset + i * board_size / 8 - GRID_WIDTH / 2);
+ cr.move_to (0, i * tile_size + GRID_WIDTH / 2.0);
cr.rel_line_to (board_size, 0);
}
+ cr.stroke ();
- cr.rectangle (x_offset - GRID_WIDTH / 2, y_offset - GRID_WIDTH / 2, board_size, board_size);
-
+ cr.set_line_width (GRID_BORDER);
+ cr.rectangle (GRID_BORDER / 2.0, GRID_BORDER / 2.0, board_size - GRID_BORDER, board_size -
GRID_BORDER);
cr.stroke ();
return false;
@@ -270,7 +246,7 @@ public class GameView : Gtk.DrawingArea
if (animate_timeout == 0)
animate_timeout = Timeout.add (PIXMAP_FLIP_DELAY, animate_cb);
}
- queue_draw_area (x_offset + x * (int) (tile_size + GRID_WIDTH), y_offset + y * (int) (tile_size +
GRID_WIDTH), tile_size, tile_size);
+ queue_draw_area (x_offset + x * tile_size, y_offset + y * tile_size, tile_size, tile_size);
}
private bool animate_cb ()
@@ -315,8 +291,8 @@ public class GameView : Gtk.DrawingArea
{
if (event.button == 1)
{
- var x = (int) (event.x - x_offset) / (tile_size + GRID_WIDTH);
- var y = (int) (event.y - y_offset) / (tile_size + GRID_WIDTH);
+ var x = (int) (event.x - x_offset) / tile_size;
+ var y = (int) (event.y - y_offset) / tile_size;
if (x >= 0 && x < 8 && y >= 0 && y < 8)
move (x, y);
}
diff --git a/src/iagno.vala b/src/iagno.vala
index 3e34268..a4e36ac 100644
--- a/src/iagno.vala
+++ b/src/iagno.vala
@@ -147,7 +147,7 @@ public class Iagno : Gtk.Application
view.move.connect (player_move_cb);
var tile_set = settings.get_string ("tileset");
view.theme = Path.build_filename (DATA_DIRECTORY, "themes", tile_set);
- view.halign = Gtk.Align.CENTER;
+ view.halign = Gtk.Align.FILL;
view.show ();
var game_box = builder.get_object ("game-box") as Gtk.Box;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]