summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2011-03-15 12:55:53 +1100
committerRobert Ancell <robert.ancell@canonical.com>2011-03-15 12:55:53 +1100
commitf13345d4631da443958f5364bd1eabe08ff9d00b (patch)
tree55717bcba8d77165c421dd54c2d073c084dc96a4
parentda23cc46c4e405c035d81918f9392ab33241f49f (diff)
downloaddconf-f13345d4631da443958f5364bd1eabe08ff9d00b.tar.gz
editor: Support changing of choices
-rw-r--r--editor/dconf-schema.vala33
-rw-r--r--editor/dconf-view.vala21
2 files changed, 49 insertions, 5 deletions
diff --git a/editor/dconf-schema.vala b/editor/dconf-schema.vala
index 8f3a70d..b074223 100644
--- a/editor/dconf-schema.vala
+++ b/editor/dconf-schema.vala
@@ -6,7 +6,7 @@ public class SchemaKey
public Variant default_value;
public SchemaValueRange? range;
public SchemaValueRange type_range;
- public List<Variant> choices;
+ public List<SchemaChoice> choices;
public string? enum_name;
public string? summary;
public string? description;
@@ -58,6 +58,8 @@ public class SchemaKey
{
for (var n = child->children; n != null; n = n->next)
{
+ if (n->type != Xml.ElementType.ELEMENT_NODE)
+ continue;
if (n->name != "choice")
{
warning ("Unknown child tag in <choices>, <%s>", n->name);
@@ -82,8 +84,8 @@ public class SchemaKey
Variant v;
try
{
- v = Variant.parse(new VariantType(type), value);
- choices.append (v);
+ v = new Variant(type, value);
+ choices.append (new SchemaChoice(value, v));
}
catch (VariantParseError e)
{
@@ -95,6 +97,8 @@ public class SchemaKey
{
for (var n = child->children; n != null; n = n->next)
{
+ if (n->type != Xml.ElementType.ELEMENT_NODE)
+ continue;
if (n->name != "alias")
{
warning ("Unknown child tag in <aliases>, <%s>", n->name);
@@ -123,7 +127,16 @@ public class SchemaKey
continue;
}
- // FIXME: Use it
+ Variant v;
+ try
+ {
+ v = new Variant(type, target);
+ choices.append (new SchemaChoice(value, v));
+ }
+ catch (VariantParseError e)
+ {
+ warning ("Invalid alias value '%s'", target);
+ }
}
}
else if (child->type != Xml.ElementType.TEXT_NODE && child->type != Xml.ElementType.COMMENT_NODE)
@@ -151,6 +164,18 @@ public class SchemaEnumValue : GLib.Object
}
}
+public class SchemaChoice
+{
+ public string name;
+ public Variant value;
+
+ public SchemaChoice(string name, Variant value)
+ {
+ this.name = name;
+ this.value = value;
+ }
+}
+
public class SchemaValueRange
{
public Variant min;
diff --git a/editor/dconf-view.vala b/editor/dconf-view.vala
index 1725af1..2c57385 100644
--- a/editor/dconf-view.vala
+++ b/editor/dconf-view.vala
@@ -13,6 +13,22 @@ private class KeyValueRenderer: Gtk.CellRenderer
set
{
_key = value;
+
+ if (key.has_schema && key.schema.choices != null)
+ {
+ combo_renderer.text = key.value.print(false);
+ var model = new Gtk.ListStore(2, typeof(string), typeof(string));
+ foreach (var choice in key.schema.choices)
+ {
+ Gtk.TreeIter iter;
+ model.append(out iter);
+ model.set(iter, 0, choice.name, 1, choice.value.print(false), -1);
+ }
+ combo_renderer.model = model;
+ mode = Gtk.CellRendererMode.EDITABLE;
+ return;
+ }
+
switch (key.type_string)
{
case "<enum>":
@@ -39,7 +55,7 @@ private class KeyValueRenderer: Gtk.CellRenderer
spin_renderer.text = key.value.print(false);
var v = get_variant_as_double(key.value);
double min = 0.0, max = 0.0;
- if (key.schema != null && key.schema.range != null)
+ if (key.has_schema && key.schema.range != null)
{
min = get_variant_as_double(key.schema.range.min);
max = get_variant_as_double(key.schema.range.max);
@@ -118,6 +134,9 @@ private class KeyValueRenderer: Gtk.CellRenderer
set {}
get
{
+ if (key.has_schema && key.schema.choices != null)
+ return combo_renderer;
+
switch (key.type_string)
{
case "<enum>":