[gnome-chess/mcatanzaro/gtk4] progress
- From: Michael Catanzaro <mcatanzaro src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-chess/mcatanzaro/gtk4] progress
- Date: Wed, 23 Dec 2020 21:21:04 +0000 (UTC)
commit ce409149cb51a3286b8ed4f749518796168b2334
Author: Michael Catanzaro <mcatanzaro gnome org>
Date: Wed Dec 23 15:17:14 2020 -0600
progress
data/preferences.ui | 6 +--
src/chess-scene.vala | 37 +++++++------
src/chess-view.vala | 1 +
src/gnome-chess.vala | 144 ++++++++++++++++++++++++++-------------------------
4 files changed, 99 insertions(+), 89 deletions(-)
---
diff --git a/data/preferences.ui b/data/preferences.ui
index 9ce4df0..1917817 100644
--- a/data/preferences.ui
+++ b/data/preferences.ui
@@ -209,9 +209,7 @@
<property name="resizable">0</property>
<property name="destroy-with-parent">1</property>
<property name="use-header-bar">1</property>
- <signal name="delete-event" handler="preferences_delete_event_cb" swapped="no"/>
- <signal name="response" handler="preferences_response_cb" swapped="no"/>
- <child internal-child="vbox">
+ <child>
<object class="GtkBox">
<property name="can-focus">0</property>
<child>
@@ -466,7 +464,7 @@
<object class="GtkImage">
<property name="can-focus">0</property>
<property name="icon-name">dialog-information-symbolic</property>
- <property name="icon-size">6</property>
+ <property name="icon-size">large</property>
</object>
</child>
<child>
diff --git a/src/chess-scene.vala b/src/chess-scene.vala
index 35f25ec..56264d5 100644
--- a/src/chess-scene.vala
+++ b/src/chess-scene.vala
@@ -78,9 +78,11 @@ public class ChessScene : Object
private double animation_time;
public signal bool is_human (ChessPlayer player);
- public signal PieceType? choose_promotion_type ();
public signal void changed ();
+ public delegate void PromotionTypeCompletionHandler (PieceType? type);
+ public signal void choose_promotion_type (PromotionTypeCompletionHandler handler);
+
public int selected_rank = -1;
public int selected_file = -1;
@@ -225,24 +227,29 @@ public class ChessScene : Object
else if (selected_file != -1)
{
bool can_move = game.current_player.move_with_coords (selected_rank, selected_file,
- rank, file, false);
- if (can_move && (get_selected_piece ()).type == PieceType.PAWN &&
+ rank, file, false);
+
+ if (can_move && get_selected_piece ().type == PieceType.PAWN &&
(rank == 0 || rank == 7))
{
// Prompt user for selecting promotion type
- PieceType? promotion_selection = choose_promotion_type ();
-
- // If promotion dialog is closed, do nothing
- if (promotion_selection == null)
- return;
-
- game.current_player.move_with_coords (selected_rank,
- selected_file, rank, file, true, promotion_selection);
- selected_rank = selected_file = -1;
+ choose_promotion_type ((promotion_selection) => {
+ if (promotion_selection != null)
+ {
+ game.current_player.move_with_coords (selected_rank,
+ selected_file,
+ rank, file,
+ true, promotion_selection);
+ selected_rank = selected_file = -1;
+
+ update_board ();
+ changed ();
+ }
+ });
+ return;
}
- // Need to check selected_file here again for promotion case
- if (selected_file != -1 &&
- game.current_player.move_with_coords (selected_rank, selected_file, rank, file))
+
+ if (game.current_player.move_with_coords (selected_rank, selected_file, rank, file))
selected_rank = selected_file = -1;
}
diff --git a/src/chess-view.vala b/src/chess-view.vala
index 3e94704..a92f643 100644
--- a/src/chess-view.vala
+++ b/src/chess-view.vala
@@ -275,6 +275,7 @@ public class ChessView : Gtk.DrawingArea
{
click_controller = new Gtk.GestureClick (); // only reacts to Gdk.BUTTON_PRIMARY
click_controller.pressed.connect (on_click);
+ add_controller (click_controller);
}
private void on_click (Gtk.GestureClick _click_controller, int n_press, double event_x, double event_y)
diff --git a/src/gnome-chess.vala b/src/gnome-chess.vala
index 67d8c20..d6e15b8 100644
--- a/src/gnome-chess.vala
+++ b/src/gnome-chess.vala
@@ -63,6 +63,7 @@ public class ChessApplication : Gtk.Application
private MessageDialog? resign_dialog = null;
private AboutDialog? about_dialog = null;
private Dialog? promotion_type_selector_dialog = null;
+ private ChessScene.PromotionTypeCompletionHandler? promotion_type_completion_handler = null;
private PGNGame pgn_game;
private ChessGame game;
@@ -318,77 +319,83 @@ Copyright © 2015–2016 Sahil Sareen""";
promotion_type_selector_dialog.response (PromotionTypeSelected.BISHOP);
}
- public PieceType? show_promotion_type_selector ()
+ private void promotion_type_selector_response_cb (int response_id)
+ requires (promotion_type_completion_handler != null)
{
-#if 0
- var promotion_type_selector_builder = new Builder.from_resource
("/org/gnome/Chess/ui/promotion-type-selector.ui");
-
- promotion_type_selector_dialog = (Dialog) promotion_type_selector_builder.get_object
("dialog_promotion_type_selector");
- promotion_type_selector_dialog.transient_for = window;
-
- var button_box = (Box) promotion_type_selector_builder.get_object ("button_box");
- if (layout_mode == LayoutMode.NARROW)
- button_box.orientation = Orientation.VERTICAL;
-
- string color;
- if (game.current_player.color == Color.WHITE)
- color = "white";
- else
- color = "black";
-
- var filename = Path.build_filename (PKGDATADIR, "pieces", scene.theme_name, "%sQueen.svg".printf
(color));
- set_piece_image ((Image) promotion_type_selector_builder.get_object ("image_queen"), filename);
-
- filename = Path.build_filename (PKGDATADIR, "pieces", scene.theme_name, "%sKnight.svg".printf
(color));
- set_piece_image ((Image) promotion_type_selector_builder.get_object ("image_knight"), filename);
-
- filename = Path.build_filename (PKGDATADIR, "pieces", scene.theme_name, "%sRook.svg".printf (color));
- set_piece_image ((Image) promotion_type_selector_builder.get_object ("image_rook"), filename);
-
- filename = Path.build_filename (PKGDATADIR, "pieces", scene.theme_name, "%sBishop.svg".printf
(color));
- set_piece_image ((Image) promotion_type_selector_builder.get_object ("image_bishop"), filename);
-
- PieceType? selection = null;
- int choice = promotion_type_selector_dialog.run ();
- switch (choice)
+ switch (response_id)
{
case PromotionTypeSelected.QUEEN:
- selection = PieceType.QUEEN;
+ promotion_type_completion_handler (PieceType.QUEEN);
break;
case PromotionTypeSelected.KNIGHT:
- selection = PieceType.KNIGHT;
+ promotion_type_completion_handler (PieceType.KNIGHT);
break;
case PromotionTypeSelected.ROOK:
- selection = PieceType.ROOK;
+ promotion_type_completion_handler (PieceType.ROOK);
break;
case PromotionTypeSelected.BISHOP:
- selection = PieceType.BISHOP;
+ promotion_type_completion_handler (PieceType.BISHOP);
break;
+ default:
+ assert_not_reached ();
}
- promotion_type_selector_dialog.destroy ();
- promotion_type_selector_dialog = null;
- return selection;
-#endif
-return null;
+ promotion_type_selector_dialog.hide ();
+
+ promotion_type_completion_handler = null;
}
- private void set_piece_image (Image image, string filename)
+ public void show_promotion_type_selector (ChessScene.PromotionTypeCompletionHandler handler)
+ requires (promotion_type_completion_handler == null)
{
-#if 0
- int width, height;
- if (!icon_size_lookup (IconSize.DIALOG, out width, out height))
- return;
+ if (promotion_type_selector_dialog == null)
+ {
+ var promotion_type_selector_builder = new Builder.from_resource
("/org/gnome/Chess/ui/promotion-type-selector.ui");
+
+ promotion_type_selector_dialog = (Dialog) promotion_type_selector_builder.get_object
("dialog_promotion_type_selector");
+ promotion_type_selector_dialog.transient_for = window;
+
+ var button_box = (Box) promotion_type_selector_builder.get_object ("button_box");
+ if (layout_mode == LayoutMode.NARROW)
+ button_box.orientation = Orientation.VERTICAL;
+
+ string color;
+ if (game.current_player.color == Color.WHITE)
+ color = "white";
+ else
+ color = "black";
+
+ var filename = Path.build_filename (PKGDATADIR, "pieces", scene.theme_name, "%sQueen.svg".printf
(color));
+ set_piece_image ((Image) promotion_type_selector_builder.get_object ("image_queen"), filename);
+
+ filename = Path.build_filename (PKGDATADIR, "pieces", scene.theme_name, "%sKnight.svg".printf
(color));
+ set_piece_image ((Image) promotion_type_selector_builder.get_object ("image_knight"), filename);
+
+ filename = Path.build_filename (PKGDATADIR, "pieces", scene.theme_name, "%sRook.svg".printf
(color));
+ set_piece_image ((Image) promotion_type_selector_builder.get_object ("image_rook"), filename);
+
+ filename = Path.build_filename (PKGDATADIR, "pieces", scene.theme_name, "%sBishop.svg".printf
(color));
+ set_piece_image ((Image) promotion_type_selector_builder.get_object ("image_bishop"), filename);
+
+ promotion_type_selector_dialog.response.connect (promotion_type_selector_response_cb);
+ }
+
+ promotion_type_selector_dialog.show ();
+
+ promotion_type_completion_handler = handler;
+ }
+ private void set_piece_image (Image image, string filename)
+ {
try
{
var h = new Rsvg.Handle.from_file (filename);
- var s = new Cairo.ImageSurface (Cairo.Format.ARGB32, width, height);
+ var s = new Cairo.ImageSurface (Cairo.Format.ARGB32, 64, 64);
var c = new Cairo.Context (s);
- h.render_document (c, Rsvg.Rectangle () { width = width, height = height, x = 0, y = 0 });
+ h.render_document (c, Rsvg.Rectangle () { width = 64, height = 64, x = 0, y = 0 });
- var p = Gdk.pixbuf_get_from_surface (s, 0, 0, width, height);
+ var p = Gdk.pixbuf_get_from_surface (s, 0, 0, 64, 64);
image.set_from_pixbuf (p);
}
catch (Error e)
@@ -396,7 +403,6 @@ return null;
warning ("Failed to load image %s: %s", filename, e.message);
return;
}
-#endif
}
enum PromotionTypeSelected
@@ -1831,16 +1837,29 @@ return null;
scene.move_number = 0;
}
+ public void preferences_response_cb (int response_id)
+ {
+ preferences_dialog.hide ();
+ }
+
public void preferences_cb ()
{
-#if 0
if (preferences_dialog != null)
{
- preferences_dialog.run ();
+ preferences_dialog.show ();
return;
}
- Builder preferences_builder = new Builder.from_resource ("/org/gnome/Chess/ui/preferences.ui");
+ Builder preferences_builder = new Builder ();
+ preferences_builder.set_current_object (this);
+ try
+ {
+ preferences_builder.add_from_resource ("/org/gnome/Chess/ui/preferences.ui");
+ }
+ catch (Error e)
+ {
+ error ("Failed to load UI resource: %s", e.message);
+ }
preferences_dialog = (Dialog) preferences_builder.get_object ("preferences");
preferences_dialog.transient_for = window;
@@ -1905,8 +1924,6 @@ return null;
var theme_combo = (ComboBox) preferences_builder.get_object ("piece_style_combo");
set_combo (theme_combo, 1, settings.get_string ("piece-theme"));
- preferences_builder.connect_signals (this);
-
/* Human vs. human */
if (ai_combo.get_active () == 0)
{
@@ -1914,8 +1931,8 @@ return null;
difficulty_combo.sensitive = false;
}
- preferences_dialog.run ();
-#endif
+ preferences_dialog.response.connect (preferences_response_cb);
+ preferences_dialog.show ();
}
private void set_combo (ComboBox combo, int value_index, string value)
@@ -2268,19 +2285,6 @@ return null;
settings.set_string ("clock-type", clock_type.to_string ());
}
- [CCode (cname = "preferences_response_cb", instance_pos = -1)]
- public void preferences_response_cb (Widget widget, int response_id)
- {
- preferences_dialog.hide ();
- }
-
- [CCode (cname = "preferences_delete_event_cb", instance_pos = -1)]
- public bool preferences_delete_event_cb (Widget widget, Gdk.Event event)
- {
- preferences_response_cb (widget, ResponseType.CANCEL);
- return true;
- }
-
[CCode (cname = "piece_style_combo_changed_cb", instance_pos = -1)]
public void piece_style_combo_changed_cb (ComboBox combo)
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]