[gnome-sudoku] Add gsetting "initialize-earmarks"



commit 0994ff250d8cdc2a87cc422e81e111b3316dd814
Author: Steven Elliott <selliott512 gmail com>
Date:   Sat Jul 2 15:43:55 2022 -0400

    Add gsetting "initialize-earmarks"
    
    Add gsetting "initialize-earmarks" to initialize the earmarks once when
    the Sudoku is first played. This is similar to option -s.

 data/org.gnome.Sudoku.gschema.xml |  4 ++++
 src/gnome-sudoku.vala             |  7 ++++++
 src/sudoku-view.vala              | 45 +++++++++++++++++++++++++++++++++++++++
 src/sudoku-window.vala            |  1 +
 4 files changed, 57 insertions(+)
---
diff --git a/data/org.gnome.Sudoku.gschema.xml b/data/org.gnome.Sudoku.gschema.xml
index 1db8f5a..b5cbd71 100644
--- a/data/org.gnome.Sudoku.gschema.xml
+++ b/data/org.gnome.Sudoku.gschema.xml
@@ -44,5 +44,9 @@
       <default>false</default>
       <summary>true if the window is maximized</summary>
     </key>
+    <key name="initialize-earmarks" type="b">
+      <default>false</default>
+      <summary>Initialize the earmarks with the possible values for each cell</summary>
+    </key>
   </schema>
 </schemalist>
diff --git a/src/gnome-sudoku.vala b/src/gnome-sudoku.vala
index ee442c7..ec9f8e5 100644
--- a/src/gnome-sudoku.vala
+++ b/src/gnome-sudoku.vala
@@ -128,6 +128,13 @@ public class Sudoku : Gtk.Application
         });
         add_action (highlighter_action);
 
+        var initialize_earmarks_action = settings.create_action ("initialize-earmarks");
+        initialize_earmarks_action.notify["state"].connect (() => {
+            if (view != null)
+                view.initialize_earmarks = settings.get_boolean ("initialize-earmarks");
+        });
+        add_action (initialize_earmarks_action);
+
         set_accels_for_action ("app.new-game", {"<Primary>n"});
         set_accels_for_action ("app.print", {"<Primary>p"});
         set_accels_for_action ("app.quit", {"<Primary>q"});
diff --git a/src/sudoku-view.vala b/src/sudoku-view.vala
index df401f0..25c26bf 100644
--- a/src/sudoku-view.vala
+++ b/src/sudoku-view.vala
@@ -34,6 +34,8 @@ private class SudokuCellView : DrawingArea
     private int row;
     private int col;
 
+    private bool initialized_earmarks;
+
     public int value
     {
         get { return game.board [row, col]; }
@@ -74,6 +76,17 @@ private class SudokuCellView : DrawingArea
         }
     }
 
+    private bool _initialize_earmarks;
+    public bool initialize_earmarks
+    {
+        get { return _initialize_earmarks; }
+        set
+        {
+            _initialize_earmarks = value;
+            queue_draw ();
+        }
+    }
+
     private bool _show_warnings = true;
     public bool show_warnings
     {
@@ -376,6 +389,26 @@ private class SudokuCellView : DrawingArea
         bool[] marks = null;
         if (!_show_possibilities)
         {
+            // Onetime earmark initialization.
+            if (!initialized_earmarks)
+            {
+                // For gsetting "initialize-earmarks" only initialize the earmarks
+                // if playing a new game.
+                if (_initialize_earmarks && (game.mode == GameMode.PLAY) &&
+                    (game.board.previous_played_time == 0.0))
+                {
+                    marks = game.board.get_possibilities_as_bool_array (row, col);
+                    for (int num = 1; num <= marks.length; num++)
+                    {
+                        if (marks[num - 1])
+                        {
+                            game.board.enable_earmark (row, col, num);
+                        }
+                    }
+                }
+                initialized_earmarks = true;
+            }
+
             marks = game.board.get_earmarks (row, col);
         }
         else if (value == 0)
@@ -673,6 +706,18 @@ public class SudokuView : AspectFrame
         }
     }
 
+    private bool _initialize_earmarks = false;
+    public bool initialize_earmarks
+    {
+        get { return _initialize_earmarks; }
+        set {
+            _initialize_earmarks = value;
+            for (var i = 0; i < game.board.rows; i++)
+                for (var j = 0; j < game.board.cols; j++)
+                    cells[i,j].initialize_earmarks = value;
+        }
+    }
+
     private bool _highlighter = false;
     public bool highlighter
     {
diff --git a/src/sudoku-window.vala b/src/sudoku-window.vala
index 8b4df22..441bd3f 100644
--- a/src/sudoku-window.vala
+++ b/src/sudoku-window.vala
@@ -140,6 +140,7 @@ public class SudokuWindow : ApplicationWindow
         else
             view.show_warnings = settings.get_boolean ("show-warnings");
         view.highlighter = settings.get_boolean ("highlighter");
+        view.initialize_earmarks = settings.get_boolean ("initialize-earmarks");
 
         view.show ();
         game_box.pack_start (view);


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