[planner: 27/61] new-property: Port property type selector to GtkComboBox




commit 960054670c72ac43d7fd86eb68b6c7c5a515326f
Author: Mart Raudsepp <leio gentoo org>
Date:   Sat Dec 26 21:53:27 2020 +0200

    new-property: Port property type selector to GtkComboBox
    
    GtkOptionMenu (used before) has been deprecated for most of gtk2 times
    and does not exist in gtk3.

 data/ui/new-property.ui          |   7 +--
 src/planner-project-properties.c | 101 +++++++++++++++++------------------
 src/planner-property-dialog.c    | 110 ++++++++++++++++++---------------------
 3 files changed, 99 insertions(+), 119 deletions(-)
---
diff --git a/data/ui/new-property.ui b/data/ui/new-property.ui
index de5d0ee2..b159cf3f 100644
--- a/data/ui/new-property.ui
+++ b/data/ui/new-property.ui
@@ -168,14 +168,9 @@
               </packing>
             </child>
             <child>
-              <object class="GtkOptionMenu" id="type_menu">
+              <object class="GtkComboBox" id="type_menu">
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
-                <property name="history">-1</property>
-                <child>
-                  <object class="GtkMenu" id="menu1">
-               </object>
-                </child>
               </object>
               <packing>
                 <property name="left_attach">1</property>
diff --git a/src/planner-project-properties.c b/src/planner-project-properties.c
index d82cffd2..36ae5d09 100644
--- a/src/planner-project-properties.c
+++ b/src/planner-project-properties.c
@@ -1206,75 +1206,72 @@ mpp_property_dialog_label_changed_cb (GtkWidget *label_entry,
 }
 
 static void
-mpp_property_dialog_setup_option_menu (GtkWidget     *option_menu,
-                                      GCallback      func,
-                                      gpointer       user_data,
-                                      gconstpointer  str1, ...)
+type_combo_get_name (GtkCellLayout   *layout,
+                     GtkCellRenderer *cell,
+                     GtkTreeModel    *model,
+                     GtkTreeIter     *iter,
+                     gpointer         user_data)
 {
-       GtkWidget     *menu;
-       GtkWidget     *menu_item;
-       gint           i;
-       va_list        args;
-       gconstpointer  str;
-       gint           type;
-
-               menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (option_menu));
-       if (menu) {
-               gtk_widget_destroy (menu);
-       }
+       gchar *name;
+       gtk_tree_model_get (model, iter, 0, &name, -1);
+       g_object_set (cell, "text", name, NULL);
+}
+
+static void
+mpp_property_dialog_setup_combobox (GtkWidget     *combo,
+                                    gconstpointer  str1,
+                                    ...)
+{
+       GtkListStore    *store;
+       GtkTreeIter      iter;
+       gint             i;
+       va_list          args;
+       gconstpointer    str;
+       gint             type;
+       GtkCellRenderer *renderer;
 
-       menu = gtk_menu_new ();
+       store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_INT);
+       gtk_combo_box_set_model (GTK_COMBO_BOX (combo), GTK_TREE_MODEL (store));
+       g_object_unref (store);
 
        va_start (args, str1);
        for (str = str1, i = 0; str != NULL; str = va_arg (args, gpointer), i++) {
-               menu_item = gtk_menu_item_new_with_label (str);
-               gtk_widget_show (menu_item);
-               gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
-
                type = va_arg (args, gint);
 
-               g_object_set_data (G_OBJECT (menu_item),
-                                  "data",
-                                  GINT_TO_POINTER (type));
-               if (func) {
-                       g_signal_connect (menu_item,
-                                         "activate",
-                                         func,
-                                         user_data);
-               }
+               gtk_list_store_append (store, &iter);
+               gtk_list_store_set (store, &iter,
+                                   0, str,
+                                   1, type,
+                                   -1);
        }
        va_end (args);
 
-       gtk_widget_show (menu);
-       gtk_option_menu_set_menu (GTK_OPTION_MENU (option_menu), menu);
+       gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
+
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo),
+                                   renderer, TRUE);
+       gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combo),
+                                           renderer,
+                                           type_combo_get_name,
+                                           NULL, NULL);
 }
 
 static gint
-mpp_property_dialog_get_selected (GtkWidget *option_menu)
+mpp_property_dialog_get_selected (GtkWidget *combo)
 {
-       GtkWidget *menu;
-       GtkWidget *item;
-       gint       ret;
+       GtkTreeIter iter;
+       gint        ret;
 
-       menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (option_menu));
-
-       item = gtk_menu_get_active (GTK_MENU (menu));
-
-       ret = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (item), "data"));
+       gtk_combo_box_get_active_iter (GTK_COMBO_BOX (combo), &iter);
+       gtk_tree_model_get (gtk_combo_box_get_model (GTK_COMBO_BOX (combo)),
+                           &iter,
+                           1, &ret,
+                           -1);
 
        return ret;
 }
 
-static void
-mpp_property_dialog_type_selected_cb (GtkWidget *widget, GtkWidget *dialog)
-{
-       gint type;
-
-       type = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (widget), "data"));
-
-       g_object_set_data (G_OBJECT (dialog), "type", GINT_TO_POINTER (type));
-}
-
 static void
 mpp_add_property_button_clicked_cb (GtkButton *button, GtkWidget *dialog)
 {
@@ -1303,10 +1300,8 @@ mpp_add_property_button_clicked_cb (GtkButton *button, GtkWidget *dialog)
                          G_CALLBACK (mpp_property_dialog_label_changed_cb),
                          name_entry);
 
-       mpp_property_dialog_setup_option_menu (
+       mpp_property_dialog_setup_combobox (
                GTK_WIDGET (gtk_builder_get_object (builder, "type_menu")),
-               G_CALLBACK (mpp_property_dialog_type_selected_cb),
-               add_dialog,
                mrp_property_type_as_string (MRP_PROPERTY_TYPE_STRING),
                MRP_PROPERTY_TYPE_STRING,
                mrp_property_type_as_string (MRP_PROPERTY_TYPE_INT),
diff --git a/src/planner-property-dialog.c b/src/planner-property-dialog.c
index 772d6013..fac90fc5 100644
--- a/src/planner-property-dialog.c
+++ b/src/planner-property-dialog.c
@@ -90,16 +90,12 @@ typedef struct {
 } PropertyCmdLabelEdited;
 
 
-static void        property_dialog_setup_option_menu    (GtkWidget           *option_menu,
-                                                        GCallback            func,
-                                                        gpointer             user_data,
+static void        property_dialog_setup_combobox       (GtkWidget           *combo,
                                                         gconstpointer        str1,
                                                         ...);
-static gint        property_dialog_get_selected         (GtkWidget           *option_menu);
+static gint        property_dialog_get_selected         (GtkWidget           *combo);
 static void        property_dialog_close_cb             (GtkWidget           *button,
                                                         GtkWidget           *dialog);
-static void        property_dialog_type_selected_cb     (GtkWidget           *widget,
-                                                        GtkWidget           *dialog);
 static gboolean    property_dialog_label_changed_cb     (GtkWidget           *label_entry,
                                                         GdkEvent            *event,
                                                         GtkWidget           *name_entry);
@@ -143,61 +139,68 @@ static void        property_cmd_label_edited_free       (PlannerCmd          *cm
 
 
 static void
-property_dialog_setup_option_menu (GtkWidget     *option_menu,
-                                  GCallback      func,
-                                  gpointer       user_data,
-                                  gconstpointer  str1, ...)
+type_combo_get_name (GtkCellLayout   *layout,
+                     GtkCellRenderer *cell,
+                     GtkTreeModel    *model,
+                     GtkTreeIter     *iter,
+                     gpointer         user_data)
 {
-       GtkWidget     *menu;
-       GtkWidget     *menu_item;
-       gint           i;
-       va_list        args;
-       gconstpointer  str;
-       gint           type;
-
-               menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (option_menu));
-       if (menu) {
-               gtk_widget_destroy (menu);
-       }
+       gchar *name;
+       gtk_tree_model_get (model, iter, 0, &name, -1);
+       g_object_set (cell, "text", name, NULL);
+}
 
-       menu = gtk_menu_new ();
+static void
+property_dialog_setup_combobox (GtkWidget     *combo,
+                                gconstpointer  str1,
+                                ...)
+{
+       GtkListStore    *store;
+       GtkTreeIter      iter;
+       gint             i;
+       va_list          args;
+       gconstpointer    str;
+       gint             type;
+       GtkCellRenderer *renderer;
+
+       store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_INT);
+       gtk_combo_box_set_model (GTK_COMBO_BOX (combo), GTK_TREE_MODEL (store));
+       g_object_unref (store);
 
        va_start (args, str1);
        for (str = str1, i = 0; str != NULL; str = va_arg (args, gpointer), i++) {
-               menu_item = gtk_menu_item_new_with_label (str);
-               gtk_widget_show (menu_item);
-               gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
-
                type = va_arg (args, gint);
 
-               g_object_set_data (G_OBJECT (menu_item),
-                                  "data",
-                                  GINT_TO_POINTER (type));
-               if (func) {
-                       g_signal_connect (menu_item,
-                                         "activate",
-                                         func,
-                                         user_data);
-               }
+               gtk_list_store_append (store, &iter);
+               gtk_list_store_set (store, &iter,
+                                   0, str,
+                                   1, type,
+                                   -1);
        }
        va_end (args);
 
-       gtk_widget_show (menu);
-       gtk_option_menu_set_menu (GTK_OPTION_MENU (option_menu), menu);
+       gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
+
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo),
+                                   renderer, TRUE);
+       gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combo),
+                                           renderer,
+                                           type_combo_get_name,
+                                           NULL, NULL);
 }
 
 static gint
-property_dialog_get_selected (GtkWidget *option_menu)
+property_dialog_get_selected (GtkWidget *combo)
 {
-       GtkWidget *menu;
-       GtkWidget *item;
-       gint       ret;
-
-       menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (option_menu));
+       GtkTreeIter iter;
+       gint        ret;
 
-       item = gtk_menu_get_active (GTK_MENU (menu));
-
-       ret = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (item), "data"));
+       gtk_combo_box_get_active_iter (GTK_COMBO_BOX (combo), &iter);
+       gtk_tree_model_get (gtk_combo_box_get_model (GTK_COMBO_BOX (combo)),
+                           &iter,
+                           1, &ret,
+                           -1);
 
        return ret;
 }
@@ -209,17 +212,6 @@ property_dialog_close_cb (GtkWidget *button,
        gtk_widget_destroy (dialog);
 }
 
-static void
-property_dialog_type_selected_cb (GtkWidget *widget,
-                                 GtkWidget *dialog)
-{
-       gint type;
-
-       type = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (widget), "data"));
-
-       g_object_set_data (G_OBJECT (dialog), "type", GINT_TO_POINTER (type));
-}
-
 static gboolean
 property_dialog_label_changed_cb (GtkWidget *label_entry,
                                  GdkEvent  *event,
@@ -269,10 +261,8 @@ property_dialog_add_cb (GtkWidget *button,
                          G_CALLBACK (property_dialog_label_changed_cb),
                          name_entry);
 
-       property_dialog_setup_option_menu (
+       property_dialog_setup_combobox (
                GTK_WIDGET (gtk_builder_get_object (builder, "type_menu")),
-               G_CALLBACK (property_dialog_type_selected_cb),
-               add_dialog,
                mrp_property_type_as_string (MRP_PROPERTY_TYPE_STRING),
                MRP_PROPERTY_TYPE_STRING,
                mrp_property_type_as_string (MRP_PROPERTY_TYPE_INT),


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