[iagno] Add an alternate-who-starts toggle.
- From: Arnaud B. <arnaudb src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [iagno] Add an alternate-who-starts toggle.
- Date: Fri, 13 Sep 2019 11:34:59 +0000 (UTC)
commit 015d32fdc921ff2015866c066736aa9bf7965f58
Author: Arnaud Bonatti <arnaud bonatti gmail com>
Date: Thu Sep 5 22:16:55 2019 +0200
Add an alternate-who-starts toggle.
That option diversifies the
gaming, as nobody regularly
changes who starts for now.
data/org.gnome.Reversi.gschema.xml | 7 ++++
src/iagno.vala | 67 +++++++++++++++++++++++++++++---------
2 files changed, 58 insertions(+), 16 deletions(-)
---
diff --git a/data/org.gnome.Reversi.gschema.xml b/data/org.gnome.Reversi.gschema.xml
index b042537..b82e406 100644
--- a/data/org.gnome.Reversi.gschema.xml
+++ b/data/org.gnome.Reversi.gschema.xml
@@ -44,6 +44,13 @@
</enum>
<schema id="org.gnome.Reversi" path="/org/gnome/iagno/" gettext-domain="iagno">
+ <key name="alternate-who-starts" type="b">
+ <default>false</default>
+ <!-- Translators: summary of a settings key, see 'dconf-editor /org/gnome/iagno/alternate-who-starts'
-->
+ <summary>A flag to alternate who starts</summary>
+ <!-- Translators: description of a settings key, see 'dconf-editor
/org/gnome/iagno/alternate-who-starts' -->
+ <description>If “trueâ€, when playing against AI, the “color†settings is toggled after every new game
request, making the next game being started with inverted roles (previous Dark player playing Light). Ignored
for two-player games.</description>
+ </key>
<key name="color" enum="org.gnome.Reversi.Color">
<default>'dark'</default>
<!-- Translators: summary of a settings key, see 'dconf-editor /org/gnome/iagno/color' -->
diff --git a/src/iagno.vala b/src/iagno.vala
index 4b71f61..9b6735b 100644
--- a/src/iagno.vala
+++ b/src/iagno.vala
@@ -109,6 +109,7 @@ private class Iagno : Gtk.Application, BaseApplication
private const GLib.ActionEntry app_actions [] =
{
+ { "alternate-who-starts", null, null, "false", change_alternate_who_starts }, // need to be able to
disable the action, so no settings.create_action()
{ "game-type", change_game_type, "s" },
{ "change-level", change_level_cb, "s" },
@@ -264,15 +265,18 @@ private class Iagno : Gtk.Application, BaseApplication
section.freeze ();
size_menu.append_section (null, section);
+ section = new GLib.Menu ();
if (!alternative_start && !random_start && !usual_start)
{
- section = new GLib.Menu ();
/* Translators: when configuring a new game, in the first menubutton's menu, label of the entry
to choose to use randomly an alternative start position (with a mnemonic that appears pressing Alt) */
section.append (_("_Random start position"), "app.random-start-position");
- section.freeze ();
- size_menu.append_section (null, section);
}
+ /* Translators: when configuring a new game, in the first menubutton's menu, label of the entry to
choose to alternate who starts between human and AI (with a mnemonic that appears pressing Alt) */
+ section.append (_("_Alternate who starts"), "app.alternate-who-starts");
+ section.freeze ();
+ size_menu.append_section (null, section);
+
size_menu.freeze ();
GLib.Menu theme_menu = new GLib.Menu ();
@@ -413,11 +417,18 @@ private class Iagno : Gtk.Application, BaseApplication
settings.bind ("theme", view, "theme", SettingsBindFlags.GET);
/* New-game screen signals */
+ alternate_who_starts_action = (SimpleAction) lookup_action ("alternate-who-starts");
+ settings.changed ["alternate-who-starts"].connect ((_settings, key_name) => {
+ alternate_who_starts_action.set_state (_settings.get_value (key_name));
+ });
+ alternate_who_starts_action.set_state (settings.get_value ("alternate-who-starts"));
+
settings.changed ["computer-level"].connect (() => {
- if (!level_changed)
- update_level_button_label (settings.get_int ("computer-level") /* 1 <= level <= 3 */);
- level_changed = false;
- });
+ if (level_changed)
+ level_changed = false;
+ else
+ update_level_button_label (settings.get_int ("computer-level") /* 1 <= level <= 3 */);
+ });
update_level_button_label (settings.get_int ("computer-level") /* 1 <= level <= 3 */);
settings.changed ["color"].connect (() => {
@@ -455,7 +466,10 @@ private class Iagno : Gtk.Application, BaseApplication
new_game_screen.update_sensitivity (solo);
if (settings.get_int ("num-players") == 2)
+ {
update_game_type_button_label ("two");
+ alternate_who_starts_action.set_enabled (false);
+ }
else if (settings.get_string ("color") == "dark")
update_game_type_button_label ("dark");
else
@@ -500,6 +514,14 @@ private class Iagno : Gtk.Application, BaseApplication
* * Internal calls
\*/
+ private SimpleAction alternate_who_starts_action;
+ private void change_alternate_who_starts (SimpleAction action, Variant? gvariant)
+ requires (gvariant != null)
+ {
+ // the state will be updated in response to the settings change
+ settings.set_value ("alternate-who-starts", (!) gvariant);
+ }
+
private bool game_type_changed_1 = false;
private bool game_type_changed_2 = false;
private void change_game_type (SimpleAction action, Variant? gvariant)
@@ -511,13 +533,14 @@ private class Iagno : Gtk.Application, BaseApplication
game_type_changed_2 = true;
switch (type)
{
- case "two": settings.set_int ("num-players", 2); new_game_screen.update_sensitivity
(false); return;
- case "dark": settings.delay ();
- settings.set_int ("num-players", 1); new_game_screen.update_sensitivity (true);
- settings.set_string ("color", "dark"); settings.apply ();
return;
- case "light": settings.delay ();
- settings.set_int ("num-players", 1); new_game_screen.update_sensitivity (true);
- settings.set_string ("color", "light"); settings.apply ();
return;
+ case "two": settings.set_int ("num-players", 2); new_game_screen.update_sensitivity (false);
+ /* no change to the color of course; */ alternate_who_starts_action.set_enabled
(false); return;
+ // DO NOT delay/apply or you lose sync between alternate_who_starts_action and the settings
after switching to one-player mode
+ case "dark": settings.set_int ("num-players", 1); new_game_screen.update_sensitivity (true);
+ settings.set_string ("color", "dark"); alternate_who_starts_action.set_enabled
(true); return;
+ // DO NOT delay/apply or you lose sync between alternate_who_starts_action and the settings
after switching to one-player mode
+ case "light": settings.set_int ("num-players", 1); new_game_screen.update_sensitivity (true);
+ settings.set_string ("color", "light"); alternate_who_starts_action.set_enabled
(true); return;
default: assert_not_reached ();
}
}
@@ -639,8 +662,20 @@ private class Iagno : Gtk.Application, BaseApplication
first_player_is_human = (player_one == Player.DARK) || (computer == null);
update_ui ();
- if (player_one != Player.DARK && computer != null)
- ((!) computer).move (MODERATE_MOVE_DELAY); // TODO MODERATE_MOVE_DELAY = 1.0, but after the
sliding animation…
+ if (computer != null)
+ {
+ if (player_one == Player.DARK)
+ {
+ if (settings.get_boolean ("alternate-who-starts"))
+ settings.set_string ("color", "light");
+ }
+ else
+ {
+ if (settings.get_boolean ("alternate-who-starts"))
+ settings.set_string ("color", "dark");
+ ((!) computer).move (MODERATE_MOVE_DELAY); // TODO MODERATE_MOVE_DELAY = 1.0, but after
the sliding animation…
+ }
+ }
}
private bool first_player_is_human = false;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]