[iagno] Load settings in startup() and sync them with new-game screen buttons.
- From: Michael Catanzaro <mcatanzaro src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [iagno] Load settings in startup() and sync them with new-game screen buttons.
- Date: Thu, 25 Sep 2014 16:44:25 +0000 (UTC)
commit 8e6a8cb753eb9bb8e4d2caddf5d2b9a15339453f
Author: Arnaud Bonatti <arnaud bonatti gmail com>
Date: Thu Sep 25 17:19:41 2014 +0200
Load settings in startup() and sync them with new-game screen buttons.
https://bugzilla.gnome.org/show_bug.cgi?id=664976
data/iagno.6 | 5 ++-
data/iagno.ui | 18 +++++-----
src/iagno.vala | 100 +++++++++++++++++++++++++++++---------------------------
3 files changed, 64 insertions(+), 59 deletions(-)
---
diff --git a/data/iagno.6 b/data/iagno.6
index 93928c4..d63cda7 100644
--- a/data/iagno.6
+++ b/data/iagno.6
@@ -37,7 +37,7 @@ Play with reduced delay before the computer moves.
.br
.B \-\-two-players
.RS 7
-Sets the game mode (for the next play if already playing).
+Sets the game mode.
.br
The options --first and --second are for a one-player game,
where the player plays respectively first and second.
@@ -59,13 +59,14 @@ Changes the computer's AI level (1-3).
.br
.B \-\-unmute
.RS 7
-Turn off/on the sound, when launched or during a play.
+Turn off/on the sound.
.br
If the two options are given, the game is muted.
.RE
.TP
.B \-s, \-\-size=<size>
Changes the size of the board. The size must be even and at least 4.
+.br
This option is for debugging only. The AI may not perform optimally.
.TP
.B \-v, \-\-version
diff --git a/data/iagno.ui b/data/iagno.ui
index 7b7f6cb..bc6146b 100644
--- a/data/iagno.ui
+++ b/data/iagno.ui
@@ -87,7 +87,7 @@
<property name="valign">center</property>
<property name="width-request">120</property>
<property name="height-request">60</property>
- <property name="action-name">app.change-mode</property>
+ <property name="action-name">app.play-as</property>
<property name="action-target">'first'</property>
<property name="draw-indicator">False</property>
<style>
@@ -110,7 +110,7 @@
<property name="valign">center</property>
<property name="width-request">120</property>
<property name="height-request">60</property>
- <property name="action-name">app.change-mode</property>
+ <property name="action-name">app.play-as</property>
<property name="action-target">'second'</property>
<property name="group">play_dark</property>
<property name="draw-indicator">False</property>
@@ -134,7 +134,7 @@
<property name="valign">center</property>
<property name="width-request">120</property>
<property name="height-request">60</property>
- <property name="action-name">app.change-mode</property>
+ <property name="action-name">app.play-as</property>
<property name="action-target">'two-players'</property>
<property name="group">play_dark</property>
<property name="draw-indicator">False</property>
@@ -171,8 +171,8 @@
<property name="valign">center</property>
<property name="width-request">120</property>
<property name="height-request">60</property>
- <property name="action-name">app.change-difficulty</property>
- <property name="action-target">'1'</property>
+ <property name="action-name">app.computer-level</property>
+ <property name="action-target">1</property>
<property name="draw-indicator">False</property>
<style>
<class name="button"/>
@@ -194,8 +194,8 @@
<property name="valign">center</property>
<property name="width-request">120</property>
<property name="height-request">60</property>
- <property name="action-name">app.change-difficulty</property>
- <property name="action-target">'2'</property>
+ <property name="action-name">app.computer-level</property>
+ <property name="action-target">2</property>
<property name="group">easy</property>
<property name="draw-indicator">False</property>
<style>
@@ -218,8 +218,8 @@
<property name="valign">center</property>
<property name="width-request">120</property>
<property name="height-request">60</property>
- <property name="action-name">app.change-difficulty</property>
- <property name="action-target">'3'</property>
+ <property name="action-name">app.computer-level</property>
+ <property name="action-target">3</property>
<property name="group">easy</property>
<property name="draw-indicator">False</property>
<style>
diff --git a/src/iagno.vala b/src/iagno.vala
index 538d120..bd252a8 100644
--- a/src/iagno.vala
+++ b/src/iagno.vala
@@ -15,10 +15,14 @@ public class Iagno : Gtk.Application
private Settings settings;
private bool is_fullscreen;
private bool is_maximized;
+ private int window_width;
+ private int window_height;
private static bool fast_mode;
private static int computer_level = 0;
private static int size = 8;
private static bool begin_with_new_game_screen = false;
+ private static string play_as;
+ private static bool? sound = null;
/* Seconds */
private static const double QUICK_MOVE_DELAY = 0.4;
@@ -27,8 +31,6 @@ public class Iagno : Gtk.Application
/* Widgets */
private Gtk.Window window;
- private int window_width;
- private int window_height;
private Gtk.HeaderBar headerbar;
private GameView view;
private Gtk.Image mark_icon_dark;
@@ -44,7 +46,6 @@ public class Iagno : Gtk.Application
private SimpleAction back_action;
-
/* Computer player (if there is one) */
private ComputerPlayer? computer = null;
@@ -58,10 +59,10 @@ public class Iagno : Gtk.Application
{
{ "fast-mode", 'f', 0, OptionArg.NONE, ref fast_mode, N_("Reduce delay before AI moves"), null},
{ "first", 0, 0, OptionArg.NONE, null, N_("Play first"), null},
- { "level", 'l', 0, OptionArg.INT, ref computer_level, N_("Set the level of the computer's AI"),
null},
+ { "level", 'l', 0, OptionArg.INT, ref computer_level, N_("Set the level of the computer's AI"),
"LEVEL"},
{ "mute", 0, 0, OptionArg.NONE, null, N_("Turn off the sound"), null},
{ "second", 0, 0, OptionArg.NONE, null, N_("Play second"), null},
- { "size", 's', 0, OptionArg.INT, ref size, N_("Size of the board (debug only)"), null},
+ { "size", 's', 0, OptionArg.INT, ref size, N_("Size of the board (debug only)"), "SIZE"},
{ "two-players", 0, 0, OptionArg.NONE, null, N_("Two-players mode"), null},
{ "unmute", 0, 0, OptionArg.NONE, null, N_("Turn on the sound"), null},
{ "version", 'v', 0, OptionArg.NONE, null, N_("Print release version and exit"), null},
@@ -70,11 +71,6 @@ public class Iagno : Gtk.Application
private const GLib.ActionEntry app_actions[] =
{
- /* http://valadoc.org/#!api=gio-2.0/GLib.SimpleActionChangeStateCallback
- * TODO SimpleActionChangeStateCallback is deprecated... */
- {"change-mode", change_mode_cb, "s"},
- {"change-difficulty", change_difficulty_cb, "s"},
-
{"new-game", new_game_cb},
{"start-game", start_game_cb},
@@ -124,32 +120,21 @@ public class Iagno : Gtk.Application
return Posix.EXIT_FAILURE;
}
- /* WARNING: Don't forget that changing at this moment settings
- could interfere badly with a running instance of the game. */
- settings = new Settings ("org.gnome.iagno");
-
- /* Sound can be turned on/off via command-line while playing. */
if (options.contains ("unmute"))
- settings.set_boolean ("sound", true);
+ sound = true;
if (options.contains ("mute"))
- settings.set_boolean ("sound", false);
+ sound = false;
- /* The computer's AI level is set for the next game. */
- if (computer_level > 0)
- {
- if (computer_level <= 3)
- settings.set_int ("computer-level", computer_level);
- else
- stderr.printf ("%s\n", _("Level should be between 1 (easy) and 3 (hard). Settings
unchanged."));
- }
+ /* TODO message should be displayed if "--level 0" */
+ if (computer_level < 0 || computer_level > 3)
+ stderr.printf ("%s\n", _("Level should be between 1 (easy) and 3 (hard). Settings unchanged."));
- /* The game mode is set for the next game. */
if (options.contains ("two-players"))
- settings.set_string ("play-as", "two-players");
+ play_as = "two-players";
else if (options.contains ("first"))
- settings.set_string ("play-as", "first");
+ play_as = "first";
else if (options.contains ("second"))
- settings.set_string ("play-as", "second");
+ play_as = "second";
else
begin_with_new_game_screen = true;
@@ -160,12 +145,37 @@ public class Iagno : Gtk.Application
protected override void startup()
{
base.startup ();
+ var builder = new Gtk.Builder.from_resource ("/org/gnome/iagno/ui/iagno.ui");
+
+ /* Settings */
+ settings = new Settings ("org.gnome.iagno");
+ if (sound != null)
+ settings.set_boolean ("sound", sound);
+ if (!begin_with_new_game_screen)
+ settings.set_string ("play-as", play_as);
+ else /* hack, part 1 on 3 */
+ play_as = settings.get_string ("play-as");
+ if (computer_level > 0 && computer_level <= 3)
+ settings.set_int ("computer-level", computer_level);
+ else /* hack, part 2 on 3 */
+ computer_level = settings.get_int ("computer-level");
+
+ /* Actions and preferences */
add_action_entries (app_actions, this);
set_accels_for_action ("app.new-game", {"<Primary>n"});
set_accels_for_action ("app.undo-move", {"<Primary>z"});
+ /* TODO bugs when changing manually the gsettings key (not for sound);
+ * solving this bug may remove the need of the hack in three parts */
+ add_action (settings.create_action ("play-as"));
+ add_action (settings.create_action ("computer-level"));
- var builder = new Gtk.Builder.from_resource ("/org/gnome/iagno/ui/iagno.ui");
+ var level_box = builder.get_object ("level-box") as Gtk.Box;
+ settings.changed["play-as"].connect (() => {
+ level_box.sensitive = settings.get_string ("play-as") != "two-players";
+ });
+ level_box.sensitive = play_as != "two-players";
+ /* Window construction */
window = builder.get_object ("iagno-window") as Gtk.ApplicationWindow;
window.configure_event.connect (window_configure_event_cb);
window.window_state_event.connect (window_state_event_cb);
@@ -173,6 +183,15 @@ public class Iagno : Gtk.Application
if (settings.get_boolean ("window-is-maximized"))
window.maximize ();
add_window (window);
+
+ /* Hack for restoring radiobuttons settings, part 3 on 3.
+ * When you add_window(), settings are initialized with the value
+ * of the first radiobutton of the group found in the UI file. */
+ Settings.sync ();
+ settings.set_string ("play-as", play_as);
+ settings.set_int ("computer-level", computer_level);
+
+ /* View construction */
view = new GameView ();
view.move.connect (player_move_cb);
var tile_set = settings.get_string ("tileset");
@@ -183,41 +202,26 @@ public class Iagno : Gtk.Application
game_box = builder.get_object ("game-box") as Gtk.Box;
game_box.pack_start (view);
+ /* Information widgets */
headerbar = builder.get_object ("headerbar") as Gtk.HeaderBar;
light_score_label = builder.get_object ("light-score-label") as Gtk.Label;
dark_score_label = builder.get_object ("dark-score-label") as Gtk.Label;
mark_icon_dark = builder.get_object ("mark-icon-dark") as Gtk.Image;
mark_icon_light = builder.get_object ("mark-icon-light") as Gtk.Image;
+
+ /* Changing screen */
main_stack = builder.get_object ("main_stack") as Gtk.Stack;
back_button = builder.get_object ("back_button") as Gtk.Button;
undo_button = builder.get_object ("undo_button") as Gtk.Button;
back_action = (SimpleAction) lookup_action ("back");
- var level_box = builder.get_object ("level-box") as Gtk.Box;
-
- settings.changed["play-as"].connect (() => {
- var mode = settings.get_string ("play-as");
- level_box.sensitive = (mode == "two-players") ? false : true;
- });
-
if (begin_with_new_game_screen)
show_new_game_screen ();
else
start_game ();
}
- private void change_mode_cb (SimpleAction action, Variant? variant)
- {
- settings.set_string ("play-as", variant.get_string ());
- }
-
- private void change_difficulty_cb (SimpleAction action, Variant? variant)
- {
- var difficulty = int.parse (variant.get_string ());
- settings.set_int ("computer-level", difficulty);
- }
-
protected override void activate ()
{
window.present ();
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]