[dconf-editor] Use path to identify keys with pending changes.



commit 79ac22f9c2e90e3915f892409aaf20b62949c526
Author: Arnaud Bonatti <arnaud bonatti gmail com>
Date:   Fri Jan 12 03:57:16 2018 +0100

    Use path to identify keys with pending changes.

 editor/dconf-model.vala            |   25 +++++++++++------
 editor/key-list-box-row.vala       |   16 ++++++------
 editor/modifications-handler.vala  |   50 ++++++++++++++++++------------------
 editor/modifications-revealer.vala |    4 +-
 editor/registry-info.vala          |   10 +++---
 editor/registry-search.vala        |    2 +-
 editor/registry-view.vala          |    2 +-
 7 files changed, 58 insertions(+), 51 deletions(-)
---
diff --git a/editor/dconf-model.vala b/editor/dconf-model.vala
index 651db8a..5f54599 100644
--- a/editor/dconf-model.vala
+++ b/editor/dconf-model.vala
@@ -446,35 +446,42 @@ public class SettingsModel : Object
         return client.read (key.full_name) == null;
     }
 
-    public void apply_key_value_changes (HashTable<Key, Variant?> changes)
+    public void apply_key_value_changes (HashTable<string, Variant?> changes)
     {
         HashTable<string, GLib.Settings> delayed_settings_hashtable = new HashTable<string, GLib.Settings> 
(str_hash, str_equal);
         DConf.Changeset dconf_changeset = new DConf.Changeset ();
-        changes.foreach ((key, planned_value) => {
-                if (key is GSettingsKey)
+        changes.foreach ((key_name, planned_value) => {
+                SettingObject? key = get_key (key_name);
+                if (key == null)
                 {
-                    string key_descriptor = key.descriptor;
+                    // TODO change value anyway?
+                }
+                else if ((!) key is GSettingsKey)
+                {
+                    string key_descriptor = ((Key) (!) key).descriptor;
                     string settings_descriptor = key_descriptor [0:key_descriptor.last_index_of_char (' ')]; 
// strip the key name
                     GLib.Settings? settings = delayed_settings_hashtable.lookup (settings_descriptor);
                     if (settings == null)
                     {
-                        settings = ((GSettingsKey) key).settings;
+                        settings = ((GSettingsKey) (!) key).settings;
                         ((!) settings).delay ();
                         delayed_settings_hashtable.insert (settings_descriptor, (!) settings);
                     }
 
                     if (planned_value == null)
                     {
-                        ((!) settings).reset (key.name);
+                        ((!) settings).reset (((!) key).name);
                         if (((!) settings).backend.get_type ().name () == "GDelayedSettingsBackend") // 
Workaround for https://bugzilla.gnome.org/show_bug.cgi?id=791290
-                            ((!) settings).backend.changed (key.full_name, null);
+                            ((!) settings).backend.changed (((!) key).full_name, null);
                         // Alternative workaround: key.value_changed ();
                     }
                     else
-                        ((!) settings).set_value (key.name, (!) planned_value);
+                        ((!) settings).set_value (((!) key).name, (!) planned_value);
                 }
+                else if ((!) key is DConfKey)
+                    dconf_changeset.set (((!) key).full_name, planned_value);
                 else
-                    dconf_changeset.set (key.full_name, planned_value);
+                    assert_not_reached ();
             });
 
         delayed_settings_hashtable.foreach_remove ((key_descriptor, schema_settings) => { 
schema_settings.apply (); return true; });
diff --git a/editor/key-list-box-row.vala b/editor/key-list-box-row.vala
index 8b167ba..77ba4b6 100644
--- a/editor/key-list-box-row.vala
+++ b/editor/key-list-box-row.vala
@@ -266,12 +266,12 @@ private abstract class KeyListBoxRow : ClickableListBoxRow
         SettingsModel model = modifications_handler.model;
         Key key = abstract_key;
         StyleContext context = get_style_context ();
-        if (modifications_handler.key_has_planned_change (key))
+        if (modifications_handler.key_has_planned_change (key.full_name))
         {
             context.add_class ("delayed");
             if (key is DConfKey)
             {
-                if (modifications_handler.get_key_planned_value (key) == null)
+                if (modifications_handler.get_key_planned_value (key.full_name) == null)
                     context.add_class ("erase");
                 else
                     context.remove_class ("erase");
@@ -391,8 +391,8 @@ private class KeyListBoxRowEditableNoSchema : KeyListBoxRow
         }
         else
         {
-            bool planned_change = modifications_handler.key_has_planned_change (key);
-            Variant? planned_value = modifications_handler.get_key_planned_value (key);
+            bool planned_change = modifications_handler.key_has_planned_change (key.full_name);
+            Variant? planned_value = modifications_handler.get_key_planned_value (key.full_name);
             if (planned_change)
             {
                 popover.new_section ();
@@ -520,8 +520,8 @@ private class KeyListBoxRowEditable : KeyListBoxRow
         }
 
         bool delayed_apply_menu = modifications_handler.get_current_delay_mode ();
-        bool planned_change = modifications_handler.key_has_planned_change (key);
-        Variant? planned_value = modifications_handler.get_key_planned_value (key);
+        bool planned_change = modifications_handler.key_has_planned_change (key.full_name);
+        Variant? planned_value = modifications_handler.get_key_planned_value (key.full_name);
 
         variant = new Variant ("(ss)", key.full_name, key.schema_id);
         popover.new_gaction ("customize", "ui.open-object(" + variant.print (false) + ")");
@@ -775,8 +775,8 @@ private class ContextPopover : Popover
         string type_string = original_type.dup_string ();
 
         bool delayed_apply_menu = modifications_handler.get_current_delay_mode ();
-        bool planned_change = modifications_handler.key_has_planned_change (key);
-        Variant? planned_value = modifications_handler.get_key_planned_value (key);
+        bool planned_change = modifications_handler.key_has_planned_change (key.full_name);
+        Variant? planned_value = modifications_handler.get_key_planned_value (key.full_name);
 
         Variant? value_variant;
         if (!has_default_value) // TODO report bug: if using ?: inside ?:, there's a "g_variant_ref: 
assertion 'value->ref_count > 0' failed"
diff --git a/editor/modifications-handler.vala b/editor/modifications-handler.vala
index 94932be..c5394de 100644
--- a/editor/modifications-handler.vala
+++ b/editor/modifications-handler.vala
@@ -32,17 +32,16 @@ class ModificationsHandler : Object
 {
     public ModificationsMode mode { get; set; default=ModificationsMode.NONE; }
 
-    private HashTable<Key, Variant?> keys_awaiting_hashtable = new HashTable<Key, Variant?> (
-            (key)        => { return str_hash (key.descriptor); },
-            (key1, key2) => { return str_equal (key1.descriptor, key2.descriptor); }
-        );
+    private HashTable<string, Variant?> keys_awaiting_hashtable = new HashTable<string, Variant?> (str_hash, 
str_equal);
+
     public uint dconf_changes_count
     {
         get
         {
             uint count = 0;
-            keys_awaiting_hashtable .foreach ((key, planned_value) => {
-                    if (key is DConfKey)
+            keys_awaiting_hashtable.@foreach ((key_path, planned_value) => {
+                    SettingObject? key = model.get_key (key_path);
+                    if (key != null && (!) key is DConfKey)
                         count++;
                 });
             return count;
@@ -53,8 +52,9 @@ class ModificationsHandler : Object
         get
         {
             uint count = 0;
-            keys_awaiting_hashtable .foreach ((key, planned_value) => {
-                    if (key is GSettingsKey)
+            keys_awaiting_hashtable.@foreach ((key_path, planned_value) => {
+                    SettingObject? key = model.get_key (key_path);
+                    if (key != null && (!) key is GSettingsKey)
                         count++;
                 });
             return count;
@@ -100,21 +100,21 @@ class ModificationsHandler : Object
         delayed_changes_changed ();
     }
 
-    public void add_delayed_setting (Key key, Variant? new_value)
+    public void add_delayed_setting (string key_path, Variant? new_value)
     {
-        keys_awaiting_hashtable.insert (key, new_value);
+        keys_awaiting_hashtable.insert (key_path, new_value);
 
         mode = get_current_delay_mode () ? ModificationsMode.DELAYED : ModificationsMode.TEMPORARY;
 
         delayed_changes_changed ();
     }
 
-    public void dismiss_change (Key key)
+    public void dismiss_change (string key_path)
     {
         if (mode == ModificationsMode.NONE)
             mode = behaviour == Behaviour.ALWAYS_DELAY ? ModificationsMode.DELAYED : 
ModificationsMode.TEMPORARY;
 
-        keys_awaiting_hashtable.remove (key);
+        keys_awaiting_hashtable.remove (key_path);
 
         delayed_changes_changed ();
     }
@@ -154,22 +154,22 @@ class ModificationsHandler : Object
 
     public Variant get_key_custom_value (Key key)
     {
-        bool planned_change = key_has_planned_change (key);
-        Variant? planned_value = get_key_planned_value (key);
+        bool planned_change = key_has_planned_change (key.full_name);
+        Variant? planned_value = get_key_planned_value (key.full_name);
         return planned_change && (planned_value != null) ? (!) planned_value : model.get_key_value (key);
     }
 
     public bool key_value_is_default (GSettingsKey key) // doesn't make sense for DConfKey?
     {
-        bool planned_change = key_has_planned_change (key);
-        Variant? planned_value = get_key_planned_value (key);
+        bool planned_change = key_has_planned_change (key.full_name);
+        Variant? planned_value = get_key_planned_value (key.full_name);
         return planned_change ? planned_value == null : model.is_key_default (key);
     }
 
     public void set_key_value (Key key, Variant? new_value)
     {
         if (get_current_delay_mode ())
-            add_delayed_setting (key, new_value);
+            add_delayed_setting (key.full_name, new_value);
         else if (new_value != null)
             model.set_key_value (key, (!) new_value);
         else if (key is GSettingsKey)
@@ -177,33 +177,33 @@ class ModificationsHandler : Object
         else if (behaviour != Behaviour.UNSAFE)
         {
             enter_delay_mode ();
-            add_delayed_setting (key, null);
+            add_delayed_setting (key.full_name, null);
         }
         else
             model.erase_key ((DConfKey) key);
     }
 
-    public bool key_has_planned_change (Key key)
+    public bool key_has_planned_change (string key_path)
     {
-        if (keys_awaiting_hashtable.contains (key))
+        if (keys_awaiting_hashtable.contains (key_path))
             return true;
 
         bool has_planned_changed = false;
         keys_awaiting_hashtable.@foreach ((key_awaiting, planned_value) => {
-                if (key.full_name == key_awaiting.full_name)
+                if (key_path == key_awaiting)
                     has_planned_changed = true;
             });
         return has_planned_changed;
     }
 
-    public Variant? get_key_planned_value (Key key)
+    public Variant? get_key_planned_value (string key_path)
     {
-        if (keys_awaiting_hashtable.contains (key))
-            return keys_awaiting_hashtable.lookup (key);
+        if (keys_awaiting_hashtable.contains (key_path))
+            return keys_awaiting_hashtable.lookup (key_path);
 
         Variant? planned_changed = null;
         keys_awaiting_hashtable.@foreach ((key_awaiting, planned_value) => {
-                if (key.full_name == key_awaiting.full_name)
+                if (key_path == key_awaiting)
                     planned_changed = planned_value;
             });
         return planned_changed;
diff --git a/editor/modifications-revealer.vala b/editor/modifications-revealer.vala
index de88cd4..8a2e9d2 100644
--- a/editor/modifications-revealer.vala
+++ b/editor/modifications-revealer.vala
@@ -94,10 +94,10 @@ class ModificationsRevealer : Revealer
             if (setting_object is DConfKey)
             {
                 if (!model.is_key_ghost ((DConfKey) setting_object))
-                    modifications_handler.add_delayed_setting ((Key) setting_object, null);
+                    modifications_handler.add_delayed_setting (setting_object.full_name, null);
             }
             else if (!model.is_key_default ((GSettingsKey) setting_object))
-                modifications_handler.add_delayed_setting ((Key) setting_object, null);
+                modifications_handler.add_delayed_setting (setting_object.full_name, null);
         }
     }
 
diff --git a/editor/registry-info.vala b/editor/registry-info.vala
index 3a73175..f34edeb 100644
--- a/editor/registry-info.vala
+++ b/editor/registry-info.vala
@@ -172,9 +172,9 @@ class RegistryInfo : Grid, BrowsableView
                 if (modifications_handler.should_delay_apply (tmp_string))
                 {
                     if (is_valid)
-                        modifications_handler.add_delayed_setting (key, key_editor_child.get_variant ());
+                        modifications_handler.add_delayed_setting (key.full_name, 
key_editor_child.get_variant ());
                     else
-                        modifications_handler.dismiss_change (key);
+                        modifications_handler.dismiss_change (key.full_name);
                 }
                 else
                     model.set_key_value (key, key_editor_child.get_variant ());
@@ -197,11 +197,11 @@ class RegistryInfo : Grid, BrowsableView
                     if (modifications_handler.should_delay_apply (tmp_string))
                     {
                         if (custom_value_switch.get_active ())
-                            modifications_handler.add_delayed_setting (key, null);
+                            modifications_handler.add_delayed_setting (key.full_name, null);
                         else
                         {
                             Variant tmp_variant = modifications_handler.get_key_custom_value (key);
-                            modifications_handler.add_delayed_setting (key, tmp_variant);
+                            modifications_handler.add_delayed_setting (key.full_name, tmp_variant);
                             key_editor_child.reload (tmp_variant);
                         }
                     }
@@ -231,7 +231,7 @@ class RegistryInfo : Grid, BrowsableView
         {
             erase_button_handler = erase_button.clicked.connect (() => {
                     modifications_handler.enter_delay_mode ();
-                    modifications_handler.add_delayed_setting (key, null);
+                    modifications_handler.add_delayed_setting (key.full_name, null);
                 });
         }
 
diff --git a/editor/registry-search.vala b/editor/registry-search.vala
index 3917458..d1cdd23 100644
--- a/editor/registry-search.vala
+++ b/editor/registry-search.vala
@@ -142,7 +142,7 @@ class RegistrySearch : Grid, BrowsableView
 
             ulong on_delete_call_handler = key_row.on_delete_call.connect (() => 
modifications_handler.set_key_value (key, null));
             ulong set_key_value_handler = key_row.set_key_value.connect ((variant) => { 
modifications_handler.set_key_value (key, variant); });
-            ulong change_dismissed_handler = key_row.change_dismissed.connect (() => 
modifications_handler.dismiss_change (key));
+            ulong change_dismissed_handler = key_row.change_dismissed.connect (() => 
modifications_handler.dismiss_change (key.full_name));
 
             ulong delayed_modifications_changed_handler =
                     modifications_handler.delayed_changes_changed.connect (() => key_row.set_delayed_icon 
());
diff --git a/editor/registry-view.vala b/editor/registry-view.vala
index 68f1810..36a2ad0 100644
--- a/editor/registry-view.vala
+++ b/editor/registry-view.vala
@@ -185,7 +185,7 @@ class RegistryView : Grid, BrowsableView
 
             ulong on_delete_call_handler = key_row.on_delete_call.connect (() => 
modifications_handler.set_key_value (key, null));
             ulong set_key_value_handler = key_row.set_key_value.connect ((variant) => { 
modifications_handler.set_key_value (key, variant); });
-            ulong change_dismissed_handler = key_row.change_dismissed.connect (() => 
modifications_handler.dismiss_change (key));
+            ulong change_dismissed_handler = key_row.change_dismissed.connect (() => 
modifications_handler.dismiss_change (key.full_name));
 
             ulong delayed_modifications_changed_handler =
                     modifications_handler.delayed_changes_changed.connect (() => key_row.set_delayed_icon 
());


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