From 736dde41f6046b8610e27568f394031c9b6f72fd Mon Sep 17 00:00:00 2001 From: Michael Terry Date: Wed, 23 Mar 2011 15:24:28 -0500 Subject: cleanup locations dialog column usage --- src/datetime-prefs-locations.c | 58 ++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 33 deletions(-) (limited to 'src/datetime-prefs-locations.c') diff --git a/src/datetime-prefs-locations.c b/src/datetime-prefs-locations.c index 0c9a93c..5e93a56 100644 --- a/src/datetime-prefs-locations.c +++ b/src/datetime-prefs-locations.c @@ -35,6 +35,10 @@ with this program. If not, see . #define DATETIME_DIALOG_UI_FILE PKGDATADIR "/datetime-dialog.ui" +#define COL_NAME 0 +#define COL_TIME 1 +#define COL_ZONE 2 + static void handle_add (GtkWidget * button, GtkTreeView * tree) { @@ -84,7 +88,7 @@ handle_edit (GtkCellRendererText * renderer, gchar * path, gchar * new_text, GtkTreeIter iter; if (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (store), &iter, path)) { - gtk_list_store_set (store, &iter, 0, new_text, -1); + gtk_list_store_set (store, &iter, COL_NAME, new_text, -1); } } @@ -92,28 +96,28 @@ static gboolean timezone_selected (GtkEntryCompletion * widget, GtkTreeModel * model, GtkTreeIter * iter, gpointer user_data) { - GValue zone_value = {0}, name_value = {0}; const gchar * zone, * name; - gtk_tree_model_get_value (model, iter, TIMEZONE_COMPLETION_ZONE, &zone_value); - zone = g_value_get_string (&zone_value); + gtk_tree_model_get (model, iter, + TIMEZONE_COMPLETION_ZONE, &zone, + TIMEZONE_COMPLETION_NAME, &name, + -1); - gtk_tree_model_get_value (model, iter, TIMEZONE_COMPLETION_NAME, &name_value); - name = g_value_get_string (&name_value); + g_debug("match selected: %s, %s", name, zone); if (zone == NULL || zone[0] == 0) { - GValue lon_value = {0}, lat_value = {0}; const gchar * strlon, * strlat; gdouble lon = 0.0, lat = 0.0; - gtk_tree_model_get_value (model, iter, TIMEZONE_COMPLETION_LONGITUDE, &lon_value); - strlon = g_value_get_string (&lon_value); + gtk_tree_model_get (model, iter, + TIMEZONE_COMPLETION_LONGITUDE, &strlon, + TIMEZONE_COMPLETION_LATITUDE, &strlat, + -1); + if (strlon != NULL && strlon[0] != 0) { lon = strtod(strlon, NULL); } - gtk_tree_model_get_value (model, iter, TIMEZONE_COMPLETION_LATITUDE, &lat_value); - strlat = g_value_get_string (&lat_value); if (strlat != NULL && strlat[0] != 0) { lat = strtod(strlat, NULL); } @@ -125,12 +129,9 @@ timezone_selected (GtkEntryCompletion * widget, GtkTreeModel * model, GtkListStore * store = GTK_LIST_STORE (g_object_get_data (G_OBJECT (widget), "store")); GtkTreeIter * store_iter = (GtkTreeIter *)g_object_get_data (G_OBJECT (widget), "store_iter"); if (store != NULL && store_iter != NULL) { - gtk_list_store_set (store, store_iter, 0, name, 2, zone, -1); + gtk_list_store_set (store, store_iter, COL_NAME, name, COL_ZONE, zone, -1); } - g_value_unset (&name_value); - g_value_unset (&zone_value); - return FALSE; // Do normal action too } @@ -169,11 +170,9 @@ update_times (TimezoneCompletion * completion) GtkTreeIter iter; if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter)) { do { - GValue zone_value = {0}; const gchar * strzone; - gtk_tree_model_get_value (GTK_TREE_MODEL (store), &iter, 2, &zone_value); - strzone = g_value_get_string (&zone_value); + gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, COL_ZONE, &strzone, -1); if (strzone != NULL && strzone[0] != 0) { GTimeZone * tz = g_time_zone_new (strzone); @@ -181,15 +180,13 @@ update_times (TimezoneCompletion * completion) gchar * format = generate_format_string_at_time (now_tz); gchar * time_str = g_date_time_format (now_tz, format); - gtk_list_store_set (store, &iter, 1, time_str, -1); + gtk_list_store_set (store, &iter, COL_TIME, time_str, -1); g_free (time_str); g_free (format); g_date_time_unref (now_tz); g_time_zone_unref (tz); } - - g_value_unset (&zone_value); } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter)); } @@ -211,7 +208,7 @@ fill_from_settings (GObject * store, GSettings * conf) split_settings_location (*striter, &zone, &name); gtk_list_store_append (GTK_LIST_STORE (store), &iter); - gtk_list_store_set (GTK_LIST_STORE (store), &iter, 0, name, 2, zone, -1); + gtk_list_store_set (GTK_LIST_STORE (store), &iter, COL_NAME, name, COL_ZONE, zone, -1); g_free (zone); g_free (name); @@ -234,23 +231,18 @@ dialog_closed (GtkWidget * dlg, GObject * store) GtkTreeIter iter; if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter)) { do { - GValue zone_value = {0}, name_value = {0}; const gchar * strzone, * strname; - gtk_tree_model_get_value (GTK_TREE_MODEL (store), &iter, 0, &name_value); - gtk_tree_model_get_value (GTK_TREE_MODEL (store), &iter, 2, &zone_value); - - strzone = g_value_get_string (&zone_value); - strname = g_value_get_string (&name_value); + gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, + COL_NAME, &strname, + COL_ZONE, &strzone, + -1); if (strzone != NULL && strzone[0] != 0 && strname != NULL && strname[0] != 0) { gchar * settings_string = g_strdup_printf("%s %s", strzone, strname); g_variant_builder_add (&builder, "s", settings_string); g_free (settings_string); } - - g_value_unset (&zone_value); - g_value_unset (&name_value); } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter)); } @@ -304,7 +296,7 @@ datetime_setup_locations_dialog (GtkWindow * parent, CcTimezoneMap * map) g_signal_connect (cell, "edited", G_CALLBACK (handle_edit), store); gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree), -1, _("Location"), cell, - "text", 0, NULL); + "text", COL_NAME, NULL); GtkTreeViewColumn * loc_col = gtk_tree_view_get_column (GTK_TREE_VIEW (tree), 0); gtk_tree_view_column_set_expand (loc_col, TRUE); g_object_set_data (G_OBJECT (completion), "name-cell", cell); @@ -312,7 +304,7 @@ datetime_setup_locations_dialog (GtkWindow * parent, CcTimezoneMap * map) cell = gtk_cell_renderer_text_new (); gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree), -1, _("Time"), cell, - "text", 1, NULL); + "text", COL_TIME, NULL); GtkTreeSelection * selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree)); gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE); -- cgit v1.2.3 From f76208b252ab4eeec71b9ac305ff5dd8283571d5 Mon Sep 17 00:00:00 2001 From: Michael Terry Date: Thu, 24 Mar 2011 07:25:30 -0500 Subject: drop debugging line and update times when user selects a zone --- src/datetime-prefs-locations.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src/datetime-prefs-locations.c') diff --git a/src/datetime-prefs-locations.c b/src/datetime-prefs-locations.c index 5e93a56..b8d9f8f 100644 --- a/src/datetime-prefs-locations.c +++ b/src/datetime-prefs-locations.c @@ -39,6 +39,8 @@ with this program. If not, see . #define COL_TIME 1 #define COL_ZONE 2 +static gboolean update_times (TimezoneCompletion * completion); + static void handle_add (GtkWidget * button, GtkTreeView * tree) { @@ -103,8 +105,6 @@ timezone_selected (GtkEntryCompletion * widget, GtkTreeModel * model, TIMEZONE_COMPLETION_NAME, &name, -1); - g_debug("match selected: %s, %s", name, zone); - if (zone == NULL || zone[0] == 0) { const gchar * strlon, * strlat; gdouble lon = 0.0, lat = 0.0; @@ -132,6 +132,8 @@ timezone_selected (GtkEntryCompletion * widget, GtkTreeModel * model, gtk_list_store_set (store, store_iter, COL_NAME, name, COL_ZONE, zone, -1); } + update_times (TIMEZONE_COMPLETION (widget)); + return FALSE; // Do normal action too } -- cgit v1.2.3 From 594bff89b1c26340a1b0393cd17a45a48911fc9f Mon Sep 17 00:00:00 2001 From: Michael Terry Date: Thu, 24 Mar 2011 13:14:40 -0500 Subject: update locations gsettings as soon as changes as made, not just when the dialog is closed --- src/datetime-prefs-locations.c | 74 ++++++++++++++++++++++++++++++++---------- 1 file changed, 57 insertions(+), 17 deletions(-) (limited to 'src/datetime-prefs-locations.c') diff --git a/src/datetime-prefs-locations.c b/src/datetime-prefs-locations.c index b8d9f8f..5550450 100644 --- a/src/datetime-prefs-locations.c +++ b/src/datetime-prefs-locations.c @@ -39,7 +39,8 @@ with this program. If not, see . #define COL_TIME 1 #define COL_ZONE 2 -static gboolean update_times (TimezoneCompletion * completion); +static gboolean update_times (GtkWidget * dlg); +static void save_when_idle (GtkWidget * dlg); static void handle_add (GtkWidget * button, GtkTreeView * tree) @@ -96,7 +97,7 @@ handle_edit (GtkCellRendererText * renderer, gchar * path, gchar * new_text, static gboolean timezone_selected (GtkEntryCompletion * widget, GtkTreeModel * model, - GtkTreeIter * iter, gpointer user_data) + GtkTreeIter * iter, GtkWidget * dlg) { const gchar * zone, * name; @@ -132,7 +133,7 @@ timezone_selected (GtkEntryCompletion * widget, GtkTreeModel * model, gtk_list_store_set (store, store_iter, COL_NAME, name, COL_ZONE, zone, -1); } - update_times (TIMEZONE_COMPLETION (widget)); + update_times (dlg); return FALSE; // Do normal action too } @@ -155,9 +156,10 @@ handle_edit_started (GtkCellRendererText * renderer, GtkCellEditable * editable, } static gboolean -update_times (TimezoneCompletion * completion) +update_times (GtkWidget * dlg) { /* For each entry, check zone in column 2 and set column 1 to it's time */ + TimezoneCompletion * completion = TIMEZONE_COMPLETION (g_object_get_data (G_OBJECT (dlg), "completion")); GtkListStore * store = GTK_LIST_STORE (g_object_get_data (G_OBJECT (completion), "store")); GObject * cell = G_OBJECT (g_object_get_data (G_OBJECT (completion), "name-cell")); @@ -167,6 +169,8 @@ update_times (TimezoneCompletion * completion) return TRUE; } + g_signal_handlers_block_by_func (store, save_when_idle, dlg); + GDateTime * now = g_date_time_new_now_local (); GtkTreeIter iter; @@ -193,6 +197,9 @@ update_times (TimezoneCompletion * completion) } g_date_time_unref (now); + + g_signal_handlers_unblock_by_func (store, save_when_idle, dlg); + return TRUE; } @@ -220,13 +227,8 @@ fill_from_settings (GObject * store, GSettings * conf) } static void -dialog_closed (GtkWidget * dlg, GObject * store) +save_to_settings (GObject * store, GSettings * conf) { - /* Cleanup a tad */ - guint time_id = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (dlg), "time-id")); - g_source_remove (time_id); - - /* Now save to settings */ GVariantBuilder builder; g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY); @@ -249,11 +251,45 @@ dialog_closed (GtkWidget * dlg, GObject * store) } GVariant * locations = g_variant_builder_end (&builder); + g_settings_set_strv (conf, SETTINGS_LOCATIONS_S, g_variant_get_strv (locations, NULL)); + g_variant_unref (locations); +} +static gboolean +save_now (GtkWidget *dlg) +{ GSettings * conf = G_SETTINGS (g_object_get_data (G_OBJECT (dlg), "conf")); - g_settings_set_strv (conf, SETTINGS_LOCATIONS_S, g_variant_get_strv (locations, NULL)); + GObject * completion = G_OBJECT (g_object_get_data (G_OBJECT (dlg), "completion")); + GObject * store = G_OBJECT (g_object_get_data (completion, "store")); - g_variant_unref (locations); + save_to_settings (store, conf); + + g_object_set_data (G_OBJECT (dlg), "save-id", GINT_TO_POINTER(0)); + + return FALSE; +} + +static void +save_when_idle (GtkWidget *dlg) +{ + guint save_id = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (dlg), "save-id")); + + if (save_id == 0) { + save_id = g_idle_add ((GSourceFunc)save_now, dlg); + g_object_set_data (G_OBJECT (dlg), "save-id", GINT_TO_POINTER(save_id)); + } +} + +static void +dialog_closed (GtkWidget * dlg, GObject * store) +{ + /* Cleanup a tad */ + guint time_id = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (dlg), "time-id")); + g_source_remove (time_id); + + guint save_id = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (dlg), "save-id")); + if (save_id > 0) + g_source_remove (save_id); } static void @@ -290,7 +326,7 @@ datetime_setup_locations_dialog (GtkWindow * parent, CcTimezoneMap * map) TimezoneCompletion * completion = timezone_completion_new (); g_object_set_data (G_OBJECT (completion), "tzmap", map); g_object_set_data (G_OBJECT (completion), "store", store); - g_signal_connect (completion, "match-selected", G_CALLBACK (timezone_selected), NULL); + g_signal_connect (completion, "match-selected", G_CALLBACK (timezone_selected), dlg); GtkCellRenderer * cell = gtk_cell_renderer_text_new (); g_object_set (cell, "editable", TRUE, NULL); @@ -317,15 +353,19 @@ datetime_setup_locations_dialog (GtkWindow * parent, CcTimezoneMap * map) g_signal_connect (WIG ("removeButton"), "clicked", G_CALLBACK (handle_remove), tree); fill_from_settings (store, conf); - - guint time_id = g_timeout_add_seconds (2, (GSourceFunc)update_times, completion); - update_times (completion); + g_signal_connect_swapped (store, "row-deleted", G_CALLBACK (save_when_idle), dlg); + g_signal_connect_swapped (store, "row-inserted", G_CALLBACK (save_when_idle), dlg); + g_signal_connect_swapped (store, "row-changed", G_CALLBACK (save_when_idle), dlg); + g_signal_connect_swapped (store, "rows-reordered", G_CALLBACK (save_when_idle), dlg); g_object_set_data_full (G_OBJECT (dlg), "conf", g_object_ref (conf), g_object_unref); g_object_set_data_full (G_OBJECT (dlg), "completion", completion, g_object_unref); - g_object_set_data (G_OBJECT (dlg), "time-id", GINT_TO_POINTER(time_id)); g_signal_connect (dlg, "destroy", G_CALLBACK (dialog_closed), store); + guint time_id = g_timeout_add_seconds (2, (GSourceFunc)update_times, dlg); + g_object_set_data (G_OBJECT (dlg), "time-id", GINT_TO_POINTER(time_id)); + update_times (dlg); + gtk_window_set_transient_for (GTK_WINDOW (dlg), parent); #undef WIG -- cgit v1.2.3 From 0b0b94a49cd63bb1e1933cbe674c944c28ac24fb Mon Sep 17 00:00:00 2001 From: Michael Terry Date: Thu, 24 Mar 2011 13:43:07 -0500 Subject: fix crash when emptying location list --- src/datetime-prefs-locations.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'src/datetime-prefs-locations.c') diff --git a/src/datetime-prefs-locations.c b/src/datetime-prefs-locations.c index 5550450..d13f95a 100644 --- a/src/datetime-prefs-locations.c +++ b/src/datetime-prefs-locations.c @@ -229,6 +229,7 @@ fill_from_settings (GObject * store, GSettings * conf) static void save_to_settings (GObject * store, GSettings * conf) { + gboolean empty = TRUE; GVariantBuilder builder; g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY); @@ -246,13 +247,21 @@ save_to_settings (GObject * store, GSettings * conf) gchar * settings_string = g_strdup_printf("%s %s", strzone, strname); g_variant_builder_add (&builder, "s", settings_string); g_free (settings_string); + empty = FALSE; } } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter)); } - GVariant * locations = g_variant_builder_end (&builder); - g_settings_set_strv (conf, SETTINGS_LOCATIONS_S, g_variant_get_strv (locations, NULL)); - g_variant_unref (locations); + if (empty) { + /* Empty list */ + g_variant_builder_clear (&builder); + g_settings_set_strv (conf, SETTINGS_LOCATIONS_S, NULL); + } + else { + GVariant * locations = g_variant_builder_end (&builder); + g_settings_set_strv (conf, SETTINGS_LOCATIONS_S, g_variant_get_strv (locations, NULL)); + g_variant_unref (locations); + } } static gboolean -- cgit v1.2.3 From 3f00f0b2b0790d6d8429d6d6812fcb78dcad9d7b Mon Sep 17 00:00:00 2001 From: Michael Terry Date: Mon, 28 Mar 2011 15:21:46 -0400 Subject: Don't allow enter presses to leave non-timezone content in the model --- src/datetime-prefs-locations.c | 1 - 1 file changed, 1 deletion(-) (limited to 'src/datetime-prefs-locations.c') diff --git a/src/datetime-prefs-locations.c b/src/datetime-prefs-locations.c index d13f95a..9d0a97a 100644 --- a/src/datetime-prefs-locations.c +++ b/src/datetime-prefs-locations.c @@ -144,7 +144,6 @@ handle_edit_started (GtkCellRendererText * renderer, GtkCellEditable * editable, { if (GTK_IS_ENTRY (editable)) { GtkEntry *entry = GTK_ENTRY (editable); - gtk_entry_set_completion (entry, GTK_ENTRY_COMPLETION (completion)); timezone_completion_watch_entry (completion, entry); GtkListStore * store = GTK_LIST_STORE (g_object_get_data (G_OBJECT (completion), "store")); -- cgit v1.2.3 From 18ea5194b357dbd14dd724eb32013af8031a50be Mon Sep 17 00:00:00 2001 From: Michael Terry Date: Tue, 29 Mar 2011 11:17:52 -0400 Subject: treat locations dialog not as a modal dialog, but rather one that can be dismissed by interacting with the main dialog --- src/datetime-prefs-locations.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'src/datetime-prefs-locations.c') diff --git a/src/datetime-prefs-locations.c b/src/datetime-prefs-locations.c index d13f95a..5dd13e8 100644 --- a/src/datetime-prefs-locations.c +++ b/src/datetime-prefs-locations.c @@ -309,7 +309,7 @@ selection_changed (GtkTreeSelection * selection, GtkWidget * remove_button) } GtkWidget * -datetime_setup_locations_dialog (GtkWindow * parent, CcTimezoneMap * map) +datetime_setup_locations_dialog (CcTimezoneMap * map) { GError * error = NULL; GtkBuilder * builder = gtk_builder_new (); @@ -375,8 +375,6 @@ datetime_setup_locations_dialog (GtkWindow * parent, CcTimezoneMap * map) g_object_set_data (G_OBJECT (dlg), "time-id", GINT_TO_POINTER(time_id)); update_times (dlg); - gtk_window_set_transient_for (GTK_WINDOW (dlg), parent); - #undef WIG g_object_unref (conf); -- cgit v1.2.3 From 348285a8a64bedf936b5cc36a9e73519c2dde0d2 Mon Sep 17 00:00:00 2001 From: Michael Terry Date: Tue, 29 Mar 2011 15:53:18 -0400 Subject: show error icon if user focuses out of location entry when it has an non-location value --- src/datetime-prefs-locations.c | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) (limited to 'src/datetime-prefs-locations.c') diff --git a/src/datetime-prefs-locations.c b/src/datetime-prefs-locations.c index 6addac3..2862022 100644 --- a/src/datetime-prefs-locations.c +++ b/src/datetime-prefs-locations.c @@ -35,9 +35,11 @@ with this program. If not, see . #define DATETIME_DIALOG_UI_FILE PKGDATADIR "/datetime-dialog.ui" -#define COL_NAME 0 -#define COL_TIME 1 -#define COL_ZONE 2 +#define COL_NAME 0 +#define COL_TIME 1 +#define COL_ZONE 2 +#define COL_VISIBLE_NAME 3 +#define COL_ICON 4 static gboolean update_times (GtkWidget * dlg); static void save_when_idle (GtkWidget * dlg); @@ -90,8 +92,18 @@ handle_edit (GtkCellRendererText * renderer, gchar * path, gchar * new_text, { GtkTreeIter iter; + // Manual user edits are always wrong (unless they are undoing a previous + // edit), so we set the error icon here if needed. Common way to get to + // this code path is to lose entry focus. if (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (store), &iter, path)) { - gtk_list_store_set (store, &iter, COL_NAME, new_text, -1); + const gchar * name; + gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, COL_NAME, &name, -1); + gboolean correct = g_strcmp0 (name, new_text) == 0; + + gtk_list_store_set (store, &iter, + COL_VISIBLE_NAME, new_text, + COL_ICON, correct ? NULL : GTK_STOCK_DIALOG_ERROR, + -1); } } @@ -130,7 +142,11 @@ timezone_selected (GtkEntryCompletion * widget, GtkTreeModel * model, GtkListStore * store = GTK_LIST_STORE (g_object_get_data (G_OBJECT (widget), "store")); GtkTreeIter * store_iter = (GtkTreeIter *)g_object_get_data (G_OBJECT (widget), "store_iter"); if (store != NULL && store_iter != NULL) { - gtk_list_store_set (store, store_iter, COL_NAME, name, COL_ZONE, zone, -1); + gtk_list_store_set (store, store_iter, + COL_VISIBLE_NAME, name, + COL_ICON, NULL, + COL_NAME, name, + COL_ZONE, zone, -1); } update_times (dlg); @@ -216,7 +232,11 @@ fill_from_settings (GObject * store, GSettings * conf) split_settings_location (*striter, &zone, &name); gtk_list_store_append (GTK_LIST_STORE (store), &iter); - gtk_list_store_set (GTK_LIST_STORE (store), &iter, COL_NAME, name, COL_ZONE, zone, -1); + gtk_list_store_set (GTK_LIST_STORE (store), &iter, + COL_VISIBLE_NAME, name, + COL_ICON, NULL, + COL_NAME, name, + COL_ZONE, zone, -1); g_free (zone); g_free (name); @@ -342,11 +362,15 @@ datetime_setup_locations_dialog (CcTimezoneMap * map) g_signal_connect (cell, "edited", G_CALLBACK (handle_edit), store); gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree), -1, _("Location"), cell, - "text", COL_NAME, NULL); + "text", COL_VISIBLE_NAME, NULL); GtkTreeViewColumn * loc_col = gtk_tree_view_get_column (GTK_TREE_VIEW (tree), 0); gtk_tree_view_column_set_expand (loc_col, TRUE); g_object_set_data (G_OBJECT (completion), "name-cell", cell); + cell = gtk_cell_renderer_pixbuf_new (); + gtk_tree_view_column_pack_start (loc_col, cell, FALSE); + gtk_tree_view_column_add_attribute (loc_col, cell, "icon-name", COL_ICON); + cell = gtk_cell_renderer_text_new (); gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree), -1, _("Time"), cell, -- cgit v1.2.3 From af19585a970b79fdb5c566b1008d41830ced41c1 Mon Sep 17 00:00:00 2001 From: Michael Terry Date: Wed, 30 Mar 2011 09:12:30 -0400 Subject: add tooltip to error icon --- src/datetime-prefs-locations.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'src/datetime-prefs-locations.c') diff --git a/src/datetime-prefs-locations.c b/src/datetime-prefs-locations.c index 2862022..9c23a40 100644 --- a/src/datetime-prefs-locations.c +++ b/src/datetime-prefs-locations.c @@ -154,6 +154,27 @@ timezone_selected (GtkEntryCompletion * widget, GtkTreeModel * model, return FALSE; // Do normal action too } +static gboolean +query_tooltip (GtkTreeView * tree, gint x, gint y, gboolean keyboard_mode, + GtkTooltip * tooltip, GtkCellRenderer * cell) +{ + GtkTreeModel * model; + GtkTreeIter iter; + if (!gtk_tree_view_get_tooltip_context (tree, &x, &y, keyboard_mode, + &model, NULL, &iter)) + return FALSE; + + const gchar * icon; + gtk_tree_model_get (model, &iter, COL_ICON, &icon, -1); + if (icon == NULL) + return FALSE; + + GtkTreeViewColumn * col = gtk_tree_view_get_column (tree, 0); + gtk_tree_view_set_tooltip_cell (tree, tooltip, NULL, col, cell); + gtk_tooltip_set_text (tooltip, _("You need to complete this location for it to appear in the menu.")); + return TRUE; +} + static void handle_edit_started (GtkCellRendererText * renderer, GtkCellEditable * editable, gchar * path, TimezoneCompletion * completion) @@ -371,6 +392,9 @@ datetime_setup_locations_dialog (CcTimezoneMap * map) gtk_tree_view_column_pack_start (loc_col, cell, FALSE); gtk_tree_view_column_add_attribute (loc_col, cell, "icon-name", COL_ICON); + gtk_widget_set_has_tooltip (tree, TRUE); + g_signal_connect (tree, "query-tooltip", G_CALLBACK (query_tooltip), cell); + cell = gtk_cell_renderer_text_new (); gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree), -1, _("Time"), cell, -- cgit v1.2.3