[planner: 19/61] calendar-dialog: Port day type selector from GtkOptionMenu to GtkComboBox




commit 530ead8d5d074e950e36baa60135b664a4f6fba6
Author: Mart Raudsepp <leio gentoo org>
Date:   Sat Mar 7 18:25:05 2020 +0200

    calendar-dialog: Port day type selector from GtkOptionMenu to GtkComboBox
    
    GtkOptionMenu has been deprecated for most of gtk2 times and does not
    exist in gtk3.

 data/ui/calendar-dialog.ui    |   3 +-
 src/planner-calendar-dialog.c | 200 +++++++++++++++++++++---------------------
 2 files changed, 103 insertions(+), 100 deletions(-)
---
diff --git a/data/ui/calendar-dialog.ui b/data/ui/calendar-dialog.ui
index cfcd905c..9be3555b 100644
--- a/data/ui/calendar-dialog.ui
+++ b/data/ui/calendar-dialog.ui
@@ -245,11 +245,10 @@
                           </packing>
                         </child>
                         <child>
-                          <object class="GtkOptionMenu" id="optionmenu">
+                          <object class="GtkComboBox" id="combo_daytype">
                             <property name="visible">True</property>
                             <property name="sensitive">False</property>
                             <property name="can_focus">True</property>
-                            <property name="history">-1</property>
                           </object>
                           <packing>
                             <property name="padding">0</property>
diff --git a/src/planner-calendar-dialog.c b/src/planner-calendar-dialog.c
index f2d8db5f..c22c3771 100644
--- a/src/planner-calendar-dialog.c
+++ b/src/planner-calendar-dialog.c
@@ -62,7 +62,7 @@ typedef struct {
        GtkWidget     *name_label;
 
        GtkWidget     *calendar;
-       GtkWidget     *option_menu;
+       GtkWidget     *daytype_combo;
 
        GtkWidget     *base_radiobutton;
        GtkWidget     *type_radiobutton;
@@ -88,10 +88,10 @@ typedef struct {
 #define DIALOG_GET_DATA(d) g_object_get_data ((GObject*)d, "data")
 
 
-static void          cal_dialog_setup_option_menu      (DialogData       *data);
-static void          cal_dialog_option_menu_set_day    (GtkWidget        *option_menu,
+static void          cal_dialog_setup_day_combo        (DialogData       *data);
+static void          cal_dialog_day_combo_set          (GtkWidget        *combo,
                                                        MrpDay           *day);
-static MrpDay *      cal_dialog_option_menu_get_day    (GtkWidget        *option_menu);
+static MrpDay *      cal_dialog_day_combo_get          (GtkWidget        *combo);
 static void          cal_dialog_response_cb            (GtkWidget        *dialog,
                                                        gint              response,
                                                        DialogData       *data);
@@ -111,7 +111,7 @@ static void          cal_dialog_month_changed_cb       (PlannerCalendar       *c
                                                        DialogData       *data);
 static void          cal_dialog_date_selected_cb       (PlannerCalendar       *calendar,
                                                        DialogData       *data);
-static void          cal_dialog_option_menu_changed_cb (GtkWidget        *option_menu,
+static void          cal_dialog_day_combo_changed_cb   (GtkWidget        *combo,
                                                        DialogData       *data);
 
 static void          cal_dialog_day_types_toggled_cb   (GtkWidget        *widget,
@@ -418,81 +418,70 @@ planner_cal_cmd_add (PlannerWindow  *main_window,
 }
 
 static void
-cal_dialog_setup_option_menu (DialogData *data)
+cal_dialog_setup_day_combo (DialogData *data)
 {
-       GtkOptionMenu *option_menu;
-       GList         *types, *l;
-       GtkWidget     *menu;
-       GtkWidget     *menu_item;
-       const gchar   *name;
-       MrpDay        *day;
-
-       types = mrp_day_get_all (data->project);
-
-       types = g_list_prepend (types, mrp_day_get_nonwork ());
-       types = g_list_prepend (types, mrp_day_get_work ());
+       GtkListStore *store;
+       GtkTreeIter   iter;
+       GList        *types, *l;
 
-       option_menu = GTK_OPTION_MENU (data->option_menu);
-       menu = gtk_option_menu_get_menu (option_menu);
+       store = gtk_list_store_new (1, MRP_TYPE_DAY);
+       gtk_combo_box_set_model (GTK_COMBO_BOX (data->daytype_combo),
+                                GTK_TREE_MODEL (store));
+       g_object_unref (store);
 
-       if (menu) {
-               gtk_widget_destroy (menu);
-       }
+       gtk_list_store_append (store, &iter);
+       gtk_list_store_set (store, &iter,
+                           0, mrp_day_get_work (),
+                           -1);
+       gtk_list_store_append (store, &iter);
+       gtk_list_store_set (store, &iter,
+                           0, mrp_day_get_nonwork (),
+                           -1);
 
-       menu = gtk_menu_new ();
+       types = mrp_day_get_all (data->project);
 
        for (l = types; l; l = l->next) {
-               day = l->data;
-
-               name = mrp_day_get_name (day);
-
-               menu_item = gtk_menu_item_new_with_label (name);
-               gtk_widget_show (menu_item);
-               gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
-
-               g_object_set_data (G_OBJECT (menu_item),
-                                  "data",
-                                  day);
+               gtk_list_store_append (store, &iter);
+               gtk_list_store_set (store, &iter,
+                                   0, MRP_DAY (l->data),
+                                   -1);
        }
 
-       gtk_widget_show (menu);
-       gtk_option_menu_set_menu (option_menu, menu);
-
        g_list_free (types);
 }
 
 static void
-cal_dialog_option_menu_set_day (GtkWidget *option_menu,
-                               MrpDay    *day)
+cal_dialog_day_combo_set (GtkWidget *combo,
+                         MrpDay    *day)
 {
-       GtkWidget *menu;
-       GtkWidget *item;
-       GList     *children, *l;
-       gint       i;
-
-               menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (option_menu));
+       GtkTreeModel *model;
+       GtkTreeIter   iter;
+       MrpDay       *iter_day;
 
-       children = GTK_MENU_SHELL (menu)->children;
-       for (i = 0, l = children; l; i++, l = l->next) {
-               item = l->data;
+       model = gtk_combo_box_get_model (GTK_COMBO_BOX (combo));
+       gtk_tree_model_get_iter_first (model, &iter);
 
-               if (day == g_object_get_data (G_OBJECT (item), "data")) {
-                       gtk_option_menu_set_history (GTK_OPTION_MENU (option_menu), i);
-                       break;
+       do {
+               gtk_tree_model_get (model, &iter, 0, &iter_day, -1);
+               if (iter_day == day) {
+                       gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combo), &iter);
+                       return;
                }
-       }
+       } while (gtk_tree_model_iter_next (model, &iter));
 }
 
 static MrpDay *
-cal_dialog_option_menu_get_day (GtkWidget *option_menu)
+cal_dialog_day_combo_get (GtkWidget *combo)
 {
-       GtkWidget *menu;
-       GtkWidget *item;
-
-       menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (option_menu));
-       item = gtk_menu_get_active (GTK_MENU (menu));
+       GtkTreeIter  iter;
+       MrpDay      *day;
 
-       return 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,
+                           0, &day,
+                           -1);
+       return day;
 }
 
 static void
@@ -579,6 +568,18 @@ cal_dialog_parent_destroy_cb (GtkWidget *window, GtkWidget *dialog)
        gtk_widget_destroy (dialog);
 }
 
+static void
+daytype_combo_get_name (GtkCellLayout   *layout,
+                        GtkCellRenderer *cell,
+                        GtkTreeModel    *model,
+                        GtkTreeIter     *iter,
+                        gpointer         user_data)
+{
+       MrpDay *day;
+       gtk_tree_model_get (model, iter, 0, &day, -1);
+       g_object_set (cell, "text", mrp_day_get_name (day), NULL);
+}
+
 GtkWidget *
 planner_calendar_dialog_new (PlannerWindow *window)
 {
@@ -588,6 +589,7 @@ planner_calendar_dialog_new (PlannerWindow *window)
        GtkWidget        *w;
        GtkTreeSelection *selection;
        gint              i;
+       GtkCellRenderer  *renderer;
 
        g_return_val_if_fail (PLANNER_IS_WINDOW (window), NULL);
 
@@ -653,12 +655,19 @@ planner_calendar_dialog_new (PlannerWindow *window)
                g_free (tmp);
        }
 
-       data->option_menu = GTK_WIDGET (gtk_builder_get_object (builder, "optionmenu"));
-       cal_dialog_setup_option_menu (data);
-       g_signal_connect  (data->option_menu,
-                          "changed",
-                          G_CALLBACK (cal_dialog_option_menu_changed_cb),
-                          data);
+       data->daytype_combo = GTK_WIDGET (gtk_builder_get_object (builder, "combo_daytype"));
+       cal_dialog_setup_day_combo (data);
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (data->daytype_combo),
+                                   renderer, TRUE);
+       gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (data->daytype_combo),
+                                           renderer,
+                                           daytype_combo_get_name,
+                                           NULL, NULL);
+       g_signal_connect (data->daytype_combo,
+                         "changed",
+                         G_CALLBACK (cal_dialog_day_combo_changed_cb),
+                         data);
 
        data->base_radiobutton = GTK_WIDGET (gtk_builder_get_object (builder, "base_radiobutton"));
        g_signal_connect (data->base_radiobutton,
@@ -825,7 +834,7 @@ cal_dialog_apply_clicked_cb (GtkWidget  *button,
        }
        else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->type_radiobutton))) {
                /* Day type. */
-               day = cal_dialog_option_menu_get_day (data->option_menu);
+               day = cal_dialog_day_combo_get (data->daytype_combo);
        } else {
                /* Custom. Not implemented yet. */
                day = NULL;
@@ -929,8 +938,8 @@ cal_dialog_date_selected_cb (PlannerCalendar *calendar_widget,
 }
 
 static void
-cal_dialog_option_menu_changed_cb (GtkWidget  *option_menu,
-                                  DialogData *data)
+cal_dialog_day_combo_changed_cb (GtkWidget  *combo,
+                                DialogData *data)
 {
        gtk_widget_set_sensitive (data->apply_button, TRUE);
 }
@@ -943,7 +952,7 @@ cal_dialog_day_types_toggled_cb (GtkWidget  *widget,
        gint     i;
 
        sensitive = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->type_radiobutton));
-       gtk_widget_set_sensitive (data->option_menu, sensitive);
+       gtk_widget_set_sensitive (data->daytype_combo, sensitive);
 
        gtk_widget_set_sensitive (data->apply_button, TRUE);
 
@@ -976,7 +985,7 @@ cal_dialog_update_day_widgets (DialogData *data)
        if (!calendar) {
                gtk_widget_set_sensitive (data->base_radiobutton, FALSE);
                gtk_widget_set_sensitive (data->type_radiobutton, FALSE);
-               gtk_widget_set_sensitive (data->option_menu, FALSE);
+               gtk_widget_set_sensitive (data->daytype_combo, FALSE);
                gtk_widget_set_sensitive (data->custom_radiobutton, FALSE);
 
                return;
@@ -984,8 +993,8 @@ cal_dialog_update_day_widgets (DialogData *data)
 
        gtk_widget_set_sensitive (data->type_radiobutton, TRUE);
 
-       g_signal_handlers_block_by_func (data->option_menu,
-                                        cal_dialog_option_menu_changed_cb,
+       g_signal_handlers_block_by_func (data->daytype_combo,
+                                        cal_dialog_day_combo_changed_cb,
                                         data);
        g_signal_handlers_block_by_func (data->base_radiobutton,
                                         cal_dialog_day_types_toggled_cb,
@@ -1013,14 +1022,14 @@ cal_dialog_update_day_widgets (DialogData *data)
        day = mrp_calendar_get_day (calendar, t, FALSE);
 
        if (day == mrp_day_get_use_base ()) {
-               gtk_widget_set_sensitive (data->option_menu, FALSE);
+               gtk_widget_set_sensitive (data->daytype_combo, FALSE);
 
                gtk_toggle_button_set_active (
                        GTK_TOGGLE_BUTTON (data->base_radiobutton), TRUE);
        } else {
-               gtk_widget_set_sensitive (data->option_menu, TRUE);
+               gtk_widget_set_sensitive (data->daytype_combo, TRUE);
 
-               cal_dialog_option_menu_set_day (data->option_menu, day);
+               cal_dialog_day_combo_set (data->daytype_combo, day);
 
                gtk_toggle_button_set_active (
                        GTK_TOGGLE_BUTTON (data->type_radiobutton), TRUE);
@@ -1057,8 +1066,8 @@ cal_dialog_update_day_widgets (DialogData *data)
                g_free (str);
        }
 
-       g_signal_handlers_unblock_by_func (data->option_menu,
-                                          cal_dialog_option_menu_changed_cb,
+       g_signal_handlers_unblock_by_func (data->daytype_combo,
+                                          cal_dialog_day_combo_changed_cb,
                                           data);
        g_signal_handlers_unblock_by_func (data->base_radiobutton,
                                           cal_dialog_day_types_toggled_cb,
@@ -1078,12 +1087,12 @@ cal_dialog_project_day_added_cb (MrpProject *project,
 {
        MrpDay *selected_day;
 
-       selected_day = cal_dialog_option_menu_get_day (data->option_menu);
+       selected_day = cal_dialog_day_combo_get (data->daytype_combo);
 
-       cal_dialog_setup_option_menu (data);
+       cal_dialog_setup_day_combo (data);
 
        /* Reselect the same day as before. */
-       cal_dialog_option_menu_set_day (data->option_menu, selected_day);
+       cal_dialog_day_combo_set (data->daytype_combo, selected_day);
 }
 
 static void
@@ -1091,31 +1100,26 @@ cal_dialog_project_day_removed_cb (MrpProject *project,
                                   MrpDay     *day,
                                   DialogData *data)
 {
-       GtkOptionMenu *option_menu;
-       GtkWidget     *menu;
-       GtkWidget     *item;
-       GList         *children, *l;
+       GtkTreeModel *model;
+       GtkTreeIter   iter;
+       MrpDay       *iter_day;
 
        /* We get the signal before the day is actually removed, so we can't
         * just re-add all types, we need to find it and remove it.
         */
+       /* TODO: Can't we adjust the signal to be RUN_FIRST and then
+        * connect_after? */
 
-       option_menu = GTK_OPTION_MENU (data->option_menu);
-       menu = gtk_option_menu_get_menu (option_menu);
+       model = gtk_combo_box_get_model (GTK_COMBO_BOX (data->daytype_combo));
+       gtk_tree_model_get_iter_first (model, &iter);
 
-       if (!menu) {
-               return;
-       }
-
-       children = GTK_MENU_SHELL (menu)->children;
-       for (l = children; l; l = l->next) {
-               item = l->data;
-
-               if (day == g_object_get_data (G_OBJECT (item), "data")) {
-                       gtk_widget_destroy (item);
-                       break;
+       do {
+               gtk_tree_model_get (model, &iter, 0, &iter_day, -1);
+               if (iter_day == day) {
+                       gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
+                       return;
                }
-       }
+       } while (gtk_tree_model_iter_next (model, &iter));
 }
 
 static void


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