gtk4-builder-tool: Prefer child properties
authorMatthias Clasen <mclasen@redhat.com>
Mon, 20 Feb 2023 02:47:10 +0000 (21:47 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 20 Feb 2023 02:48:56 +0000 (21:48 -0500)
Rewrite <child> elements to use child properties
where that is easily possible.

Fixes: #5609
15 files changed:
testsuite/tools/simplify-data-3to4/paned.expected
testsuite/tools/simplify-data/test10.expected [new file with mode: 0644]
testsuite/tools/simplify-data/test10.ui [new file with mode: 0644]
testsuite/tools/simplify-data/test11.expected [new file with mode: 0644]
testsuite/tools/simplify-data/test11.ui [new file with mode: 0644]
testsuite/tools/simplify-data/test12.expected [new file with mode: 0644]
testsuite/tools/simplify-data/test12.ui [new file with mode: 0644]
testsuite/tools/simplify-data/test13.expected [new file with mode: 0644]
testsuite/tools/simplify-data/test13.ui [new file with mode: 0644]
testsuite/tools/simplify-data/test5.expected
testsuite/tools/simplify-data/test8.expected [new file with mode: 0644]
testsuite/tools/simplify-data/test8.ui [new file with mode: 0644]
testsuite/tools/simplify-data/test9.expected [new file with mode: 0644]
testsuite/tools/simplify-data/test9.ui [new file with mode: 0644]
tools/gtk-builder-tool-simplify.c

index d767086ba8b80fe6fac9fb22232fcb296ec907b5..117fd2d4b67fdcf2c3d3d15615720e1203b22c96 100644 (file)
@@ -4,11 +4,11 @@
   <object class="GtkPaned">
     <property name="resize-end-child">0</property>
     <property name="shrink-start-child">0</property>
-    <child>
+    <property name="start-child">
       <object class="GtkButton" id="button"/>
-    </child>
-    <child>
+    </property>
+    <property name="end-child">
       <object class="GtkLabel" id="label"/>
-    </child>
+    </property>
   </object>
 </interface>
diff --git a/testsuite/tools/simplify-data/test10.expected b/testsuite/tools/simplify-data/test10.expected
new file mode 100644 (file)
index 0000000..54dec91
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <object class="GtkWindow">
+    <property name="child">
+      <object class="GtkLabel">
+        <property name="label">start</property>
+      </object>
+    </property>
+  </object>
+</interface>
diff --git a/testsuite/tools/simplify-data/test10.ui b/testsuite/tools/simplify-data/test10.ui
new file mode 100644 (file)
index 0000000..3b5e171
--- /dev/null
@@ -0,0 +1,9 @@
+<interface>
+  <object class="GtkWindow">
+    <child>
+      <object class="GtkLabel">
+        <property name="label">start</property>
+      </object>
+    </child>
+  </object>
+</interface>
diff --git a/testsuite/tools/simplify-data/test11.expected b/testsuite/tools/simplify-data/test11.expected
new file mode 100644 (file)
index 0000000..d54c185
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <object class="GtkPaned">
+    <property name="start-child">
+      <object class="GtkLabel">
+        <property name="label">start</property>
+      </object>
+    </property>
+    <property name="end-child">
+      <object class="GtkLabel">
+        <property name="label">end</property>
+      </object>
+    </property>
+  </object>
+</interface>
diff --git a/testsuite/tools/simplify-data/test11.ui b/testsuite/tools/simplify-data/test11.ui
new file mode 100644 (file)
index 0000000..1f546a1
--- /dev/null
@@ -0,0 +1,14 @@
+<interface>
+  <object class="GtkPaned">
+    <child>
+      <object class="GtkLabel">
+        <property name="label">start</property>
+      </object>
+    </child>
+    <child>
+      <object class="GtkLabel">
+        <property name="label">end</property>
+      </object>
+    </child>
+  </object>
+</interface>
diff --git a/testsuite/tools/simplify-data/test12.expected b/testsuite/tools/simplify-data/test12.expected
new file mode 100644 (file)
index 0000000..bc43c43
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <object class="GtkPaned">
+    <property name="end-child">
+      <object class="GtkLabel">
+        <property name="label">end</property>
+      </object>
+    </property>
+    <property name="start-child">
+      <object class="GtkLabel">
+        <property name="label">start</property>
+      </object>
+    </property>
+  </object>
+</interface>
diff --git a/testsuite/tools/simplify-data/test12.ui b/testsuite/tools/simplify-data/test12.ui
new file mode 100644 (file)
index 0000000..865dfb4
--- /dev/null
@@ -0,0 +1,14 @@
+<interface>
+  <object class="GtkPaned">
+    <child type="end">
+      <object class="GtkLabel">
+        <property name="label">end</property>
+      </object>
+    </child>
+    <child type="start">
+      <object class="GtkLabel">
+        <property name="label">start</property>
+      </object>
+    </child>
+  </object>
+</interface>
diff --git a/testsuite/tools/simplify-data/test13.expected b/testsuite/tools/simplify-data/test13.expected
new file mode 100644 (file)
index 0000000..ef4a037
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <object class="GtkCenterBox">
+    <property name="end-widget">
+      <object class="GtkLabel">
+        <property name="label">end</property>
+      </object>
+    </property>
+    <property name="center-widget">
+      <object class="GtkLabel">
+        <property name="label">center</property>
+      </object>
+    </property>
+    <property name="start-widget">
+      <object class="GtkLabel">
+        <property name="label">start</property>
+      </object>
+    </property>
+  </object>
+</interface>
diff --git a/testsuite/tools/simplify-data/test13.ui b/testsuite/tools/simplify-data/test13.ui
new file mode 100644 (file)
index 0000000..b8a1397
--- /dev/null
@@ -0,0 +1,19 @@
+<interface>
+  <object class="GtkCenterBox">
+    <child type="end">
+      <object class="GtkLabel">
+        <property name="label">end</property>
+      </object>
+    </child>
+    <child type="center">
+      <object class="GtkLabel">
+        <property name="label">center</property>
+      </object>
+    </child>
+    <child type="start">
+      <object class="GtkLabel">
+        <property name="label">start</property>
+      </object>
+    </child>
+  </object>
+</interface>
index 24b18f4a5278aa03b8d914ec03e361b470ee5d26..73d04161ec52b92865b037114d7ee8ad1da36c3d 100644 (file)
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <object class="GtkWindow">
-    <child>
+    <property name="child">
       <object class="GtkBox">
         <child>
           <placeholder/>
         </child>
       </object>
-    </child>
+    </property>
   </object>
 </interface>
diff --git a/testsuite/tools/simplify-data/test8.expected b/testsuite/tools/simplify-data/test8.expected
new file mode 100644 (file)
index 0000000..8862b26
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <object class="GtkAspectFrame">
+    <property name="child">
+      <object class="GtkLabel">
+        <property name="label">start</property>
+      </object>
+    </property>
+  </object>
+</interface>
diff --git a/testsuite/tools/simplify-data/test8.ui b/testsuite/tools/simplify-data/test8.ui
new file mode 100644 (file)
index 0000000..ef4f506
--- /dev/null
@@ -0,0 +1,9 @@
+<interface>
+  <object class="GtkAspectFrame">
+    <child>
+      <object class="GtkLabel">
+        <property name="label">start</property>
+      </object>
+    </child>
+  </object>
+</interface>
diff --git a/testsuite/tools/simplify-data/test9.expected b/testsuite/tools/simplify-data/test9.expected
new file mode 100644 (file)
index 0000000..1eb645a
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <object class="GtkComboBox">
+    <property name="child">
+      <object class="GtkLabel">
+        <property name="label">start</property>
+      </object>
+    </property>
+  </object>
+</interface>
diff --git a/testsuite/tools/simplify-data/test9.ui b/testsuite/tools/simplify-data/test9.ui
new file mode 100644 (file)
index 0000000..fa3ee56
--- /dev/null
@@ -0,0 +1,9 @@
+<interface>
+  <object class="GtkComboBox">
+    <child>
+      <object class="GtkLabel">
+        <property name="label">start</property>
+      </object>
+    </child>
+  </object>
+</interface>
index b66b4143ce13d2e244d4aaf32c1fee4567a3ba8f..d279aa526fe0a735ea30addd15d5fb7b6a91eed5 100644 (file)
@@ -1278,6 +1278,114 @@ rewrite_paned (Element *element,
     rewrite_paned_child (element, data, child2, "end-child");
 }
 
+static void
+replace_child_by_property (Element *element,
+                           Element *child,
+                           const char *property,
+                           MyParserData *data)
+{
+  Element *obj, *elt;
+
+  obj = child->children->data;
+  g_assert (obj && g_str_equal (obj->element_name, "object"));
+  child->children = g_list_remove (child->children, obj);
+
+  elt = g_new0 (Element, 1);
+  elt->parent = element;
+  elt->element_name = g_strdup ("property");
+  elt->attribute_names = g_new0 (char *, 2);
+  elt->attribute_names[0] = g_strdup ("name");
+  elt->attribute_values = g_new0 (char *, 2);
+  elt->attribute_values[0] = g_strdup (property);
+  elt->children = g_list_prepend (NULL, obj);
+
+  for (GList *l = element->children; l; l = l->next)
+    {
+      if (l->data == child)
+        {
+          l->data = elt;
+          elt = NULL;
+          free_element (child);
+          break;
+        }
+     }
+
+  g_assert (elt == NULL);
+}
+
+static void
+rewrite_start_end_children (Element      *element,
+                            MyParserData *data)
+{
+  Element *start_child = NULL;
+  Element *end_child = NULL;
+  GList *l;
+
+  for (l = element->children; l; l = l->next)
+    {
+      Element *child = l->data;
+
+      if (!g_str_equal (child->element_name, "child"))
+        continue;
+
+      if (has_attribute (child, "type", "start"))
+        start_child = child;
+      else if (has_attribute (child, "type", "end"))
+        end_child = child;
+      else if (start_child == NULL)
+        start_child = child;
+      else if (end_child == NULL)
+        end_child = child;
+      else
+        g_warning ("%s only accepts two children", get_class_name (element));
+    }
+
+  if (start_child)
+    replace_child_by_property (element, start_child, "start-child", data);
+
+  if (end_child)
+    replace_child_by_property (element, end_child, "end-child", data);
+}
+
+static void
+rewrite_start_center_end_children (Element      *element,
+                                   MyParserData *data)
+{
+  Element *start_child = NULL;
+  Element *center_child = NULL;
+  Element *end_child = NULL;
+  GList *l;
+
+  for (l = element->children; l; l = l->next)
+    {
+      Element *child = l->data;
+
+      if (has_attribute (child, "type", "start"))
+        start_child = child;
+      else if (has_attribute (child, "type", "center"))
+        center_child = child;
+      else if (has_attribute (child, "type", "end"))
+        end_child = child;
+      else if (start_child == NULL)
+        start_child = child;
+      else if (center_child == NULL)
+        center_child = child;
+      else if (end_child == NULL)
+        end_child = child;
+      else
+        g_warning ("%s only accepts three children", get_class_name (element));
+    }
+
+  if (start_child)
+    replace_child_by_property (element, start_child, "start-widget", data);
+
+  if (center_child)
+    replace_child_by_property (element, center_child, "center-widget", data);
+
+  if (end_child)
+    replace_child_by_property (element, end_child, "end-widget", data);
+}
+
 static void
 rewrite_dialog (Element *element,
                MyParserData *data)
@@ -2004,8 +2112,8 @@ simplify_tree (MyParserData *data)
 }
 
 static gboolean
-rewrite_element (Element      *element,
-                 MyParserData *data)
+rewrite_element_3to4 (Element      *element,
+                      MyParserData *data)
 {
   GList *l;
 
@@ -2014,7 +2122,7 @@ rewrite_element (Element      *element,
     {
       GList *next = l->next;
       Element *child = l->data;
-      if (rewrite_element (child, data))
+      if (rewrite_element_3to4 (child, data))
         {
           element->children = g_list_remove (element->children, child);
           free_element (child);
@@ -2069,6 +2177,52 @@ rewrite_element (Element      *element,
       g_str_equal (get_class_name (element), "GtkFixed"))
     rewrite_fixed (element, data);
 
+  if (element_is_object_or_template (element) &&
+      g_str_equal (get_class_name (element), "GtkRadioButton"))
+    rewrite_radio_button (element, data);
+
+  if (element_is_object_or_template (element) &&
+      g_str_equal (get_class_name (element), "GtkScale"))
+    rewrite_scale (element, data);
+
+  if (g_str_equal (element->element_name, "property"))
+    maybe_rename_property (element, data);
+
+  if (g_str_equal (element->element_name, "property") &&
+      property_has_been_removed (element, data))
+    return TRUE;
+
+  if (g_str_equal (element->element_name, "requires"))
+    rewrite_requires (element, data);
+
+  return FALSE;
+}
+
+static void
+rewrite_tree_3to4 (MyParserData *data)
+{
+  rewrite_element_3to4 (data->root, data);
+}
+
+static gboolean
+rewrite_element (Element      *element,
+                 MyParserData *data)
+{
+  GList *l;
+
+  l = element->children;
+  while (l)
+    {
+      GList *next = l->next;
+      Element *child = l->data;
+      if (rewrite_element (child, data))
+        {
+          element->children = g_list_remove (element->children, child);
+          free_element (child);
+        }
+      l = next;
+    }
+
   if (element_is_object_or_template (element) &&
       (g_str_equal (get_class_name (element), "GtkAspectFrame") ||
        g_str_equal (get_class_name (element), "GtkComboBox") ||
@@ -2087,22 +2241,12 @@ rewrite_element (Element      *element,
     rewrite_bin_child (element, data);
 
   if (element_is_object_or_template (element) &&
-      g_str_equal (get_class_name (element), "GtkRadioButton"))
-    rewrite_radio_button (element, data);
+      g_str_equal (get_class_name (element), "GtkPaned"))
+    rewrite_start_end_children (element, data);
 
   if (element_is_object_or_template (element) &&
-      g_str_equal (get_class_name (element), "GtkScale"))
-    rewrite_scale (element, data);
-
-  if (g_str_equal (element->element_name, "property"))
-    maybe_rename_property (element, data);
-
-  if (g_str_equal (element->element_name, "property") &&
-      property_has_been_removed (element, data))
-    return TRUE;
-
-  if (g_str_equal (element->element_name, "requires"))
-    rewrite_requires (element, data);
+      g_str_equal (get_class_name (element), "GtkCenterBox"))
+    rewrite_start_center_end_children (element, data);
 
   return FALSE;
 }
@@ -2319,8 +2463,10 @@ simplify_file (const char *filename,
   if (data.convert3to4)
     {
       enhance_tree (&data);
-      rewrite_tree (&data);
+      rewrite_tree_3to4 (&data);
     }
+
+  rewrite_tree (&data);
   simplify_tree (&data);
 
   dump_tree (&data);