[gnome-chess/mcatanzaro/gtk4] progress



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]