[planner: 19/61] calendar-dialog: Port day type selector from GtkOptionMenu to GtkComboBox
- From: Mart Raudsepp <mraudsepp src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [planner: 19/61] calendar-dialog: Port day type selector from GtkOptionMenu to GtkComboBox
- Date: Sat, 12 Jun 2021 17:30:23 +0000 (UTC)
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]