From 44cde00066303e185b615cd1efb0d3bb1ffb0071 Mon Sep 17 00:00:00 2001 From: Michael Terry Date: Wed, 23 Mar 2011 16:24:34 -0500 Subject: add bevel above location buttons --- data/datetime-dialog.ui | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) (limited to 'data') diff --git a/data/datetime-dialog.ui b/data/datetime-dialog.ui index 7545227..ead11d1 100644 --- a/data/datetime-dialog.ui +++ b/data/datetime-dialog.ui @@ -7,11 +7,6 @@ 86400 864000 - - 1.8446744073709552e+19 - 60 - 3600 - False Locations @@ -46,6 +41,17 @@ 0 + + + True + False + + + False + True + 1 + + True @@ -55,7 +61,6 @@ True True True - Add a Location… False @@ -76,7 +81,6 @@ True True True - Remove This Location False @@ -96,7 +100,7 @@ False True - 1 + 2 @@ -112,6 +116,11 @@ + + 1.8446744073709552e+19 + 60 + 3600 + False 5 -- cgit v1.2.3 From e4733095077a4bef45a1572492d5f593574c60f9 Mon Sep 17 00:00:00 2001 From: Michael Terry Date: Mon, 28 Mar 2011 15:17:43 -0400 Subject: add missing a11y descriptions --- data/datetime-dialog.ui | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'data') diff --git a/data/datetime-dialog.ui b/data/datetime-dialog.ui index ead11d1..6bd7428 100644 --- a/data/datetime-dialog.ui +++ b/data/datetime-dialog.ui @@ -62,6 +62,11 @@ True True False + + + Add a Location… + + True @@ -82,6 +87,11 @@ True True False + + + Remove This Location + + True -- 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 --- data/datetime-dialog.ui | 1 - src/datetime-prefs-locations.c | 4 +--- src/datetime-prefs-locations.h | 2 +- src/datetime-prefs.c | 20 ++++++++++++++++++-- 4 files changed, 20 insertions(+), 7 deletions(-) (limited to 'data') diff --git a/data/datetime-dialog.ui b/data/datetime-dialog.ui index ead11d1..f150765 100644 --- a/data/datetime-dialog.ui +++ b/data/datetime-dialog.ui @@ -10,7 +10,6 @@ False Locations - True 300 200 True 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); diff --git a/src/datetime-prefs-locations.h b/src/datetime-prefs-locations.h index 1760567..e312894 100644 --- a/src/datetime-prefs-locations.h +++ b/src/datetime-prefs-locations.h @@ -28,7 +28,7 @@ with this program. If not, see . G_BEGIN_DECLS -GtkWidget * datetime_setup_locations_dialog (GtkWindow * parent, CcTimezoneMap * map); +GtkWidget * datetime_setup_locations_dialog (CcTimezoneMap * map); G_END_DECLS diff --git a/src/datetime-prefs.c b/src/datetime-prefs.c index fbc88f2..5a6fd91 100644 --- a/src/datetime-prefs.c +++ b/src/datetime-prefs.c @@ -53,6 +53,7 @@ GtkWidget * date_spin = NULL; guint save_time_id = 0; gboolean user_edited_time = FALSE; gboolean changing_time = FALSE; +GtkWidget * loc_dlg = NULL; /* Turns the boolean property into a string gsettings */ static GVariant * @@ -494,11 +495,26 @@ setup_time_spinners (GtkWidget * time, GtkWidget * date) update_spinners (); } +static void +hide_locations () +{ + if (loc_dlg != NULL) + gtk_widget_destroy (loc_dlg); +} + static void show_locations (GtkWidget * button, GtkWidget * dlg) { - GtkWidget * locationsDlg = datetime_setup_locations_dialog (GTK_WINDOW (dlg), tzmap); - gtk_widget_show_all (locationsDlg); + if (loc_dlg == NULL) { + loc_dlg = datetime_setup_locations_dialog (tzmap); + gtk_window_set_transient_for (GTK_WINDOW (loc_dlg), GTK_WINDOW (dlg)); + g_signal_connect (loc_dlg, "destroy", G_CALLBACK (gtk_widget_destroyed), &loc_dlg); + g_signal_connect (dlg, "focus-in-event", G_CALLBACK (hide_locations), NULL); + gtk_widget_show_all (loc_dlg); + } + else { + gtk_window_present_with_time (GTK_WINDOW (loc_dlg), gtk_get_current_event_time ()); + } } static gboolean -- 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 --- data/datetime-dialog.ui | 4 ++++ src/datetime-prefs-locations.c | 38 +++++++++++++++++++++++++++++++------- 2 files changed, 35 insertions(+), 7 deletions(-) (limited to 'data') diff --git a/data/datetime-dialog.ui b/data/datetime-dialog.ui index 80b4fa6..8479482 100644 --- a/data/datetime-dialog.ui +++ b/data/datetime-dialog.ui @@ -123,6 +123,10 @@ + + + + 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 095bf2692ce36c1197349a629dde3c714c845384 Mon Sep 17 00:00:00 2001 From: Michael Terry Date: Tue, 29 Mar 2011 17:22:14 -0300 Subject: remember user's preferred location name for main timezone --- data/com.canonical.indicator.datetime.gschema.xml | 7 +++ src/datetime-prefs.c | 62 ++++++++++++++++------- src/settings-shared.h | 1 + 3 files changed, 51 insertions(+), 19 deletions(-) (limited to 'data') diff --git a/data/com.canonical.indicator.datetime.gschema.xml b/data/com.canonical.indicator.datetime.gschema.xml index b33f34e..8ce75e6 100644 --- a/data/com.canonical.indicator.datetime.gschema.xml +++ b/data/com.canonical.indicator.datetime.gschema.xml @@ -100,5 +100,12 @@ indicator-datetime menu. + + '' + The name of the current timezone + + Some timezones can be known by many different cities or names. This setting describes how the current zone prefers to be named. Format is "TIMEZONE NAME" (e.g. "America/New_York Boston" to name the New_York zone Boston). + + diff --git a/src/datetime-prefs.c b/src/datetime-prefs.c index 4213ea9..b1335ca 100644 --- a/src/datetime-prefs.c +++ b/src/datetime-prefs.c @@ -184,10 +184,30 @@ ntp_query_answered (GObject *object, GAsyncResult *res, gpointer user_data) static void sync_entry (const gchar * location) { - gchar * name; - split_settings_location (location, NULL, &name); - gtk_entry_set_text (GTK_ENTRY (tz_entry), name); - g_free (name); + gchar * new_zone, * new_name; + gchar * old_zone, * old_name; + + split_settings_location (location, &new_zone, &new_name); + + GSettings * conf = g_settings_new (SETTINGS_INTERFACE); + gchar * tz_name = g_settings_get_string (conf, SETTINGS_TIMEZONE_NAME_S); + split_settings_location (tz_name, &old_zone, &old_name); + g_free (tz_name); + g_object_unref (conf); + + // new_name is always just a sanitized version of a timezone. + // old_name is potentially a saved "pretty" version of a timezone name from + // geonames. So we prefer to use it if available and the zones match. + + if (g_strcmp0 (old_zone, new_zone) == 0) + gtk_entry_set_text (GTK_ENTRY (tz_entry), old_name); + else + gtk_entry_set_text (GTK_ENTRY (tz_entry), new_name); + + g_free (new_zone); + g_free (old_zone); + g_free (new_name); + g_free (old_name); } static void @@ -521,36 +541,40 @@ static gboolean timezone_selected (GtkEntryCompletion * widget, GtkTreeModel * model, GtkTreeIter * iter, gpointer user_data) { - GValue value = {0}; - const gchar * strval; + const gchar * name, * zone; - gtk_tree_model_get_value (model, iter, TIMEZONE_COMPLETION_ZONE, &value); - strval = g_value_get_string (&value); + gtk_tree_model_get (model, iter, + TIMEZONE_COMPLETION_NAME, &name, + TIMEZONE_COMPLETION_ZONE, &zone, + -1); - if (strval != NULL && strval[0] != 0) { - cc_timezone_map_set_timezone (tzmap, strval); - } - else { - GValue lon_value = {0}, lat_value = {0}; + if (zone == NULL || zone[0] == 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); } - cc_timezone_map_set_coords (tzmap, lon, lat); + zone = cc_timezone_map_get_timezone_at_coords (tzmap, lon, lat); } - g_value_unset (&value); + GSettings * conf = g_settings_new (SETTINGS_INTERFACE); + gchar * tz_name = g_strdup_printf ("%s %s", zone, name); + g_settings_set_string (conf, SETTINGS_TIMEZONE_NAME_S, tz_name); + g_free (tz_name); + g_object_unref (conf); + + cc_timezone_map_set_timezone (tzmap, zone); return FALSE; // Do normal action too } diff --git a/src/settings-shared.h b/src/settings-shared.h index cdbb063..1ad4799 100644 --- a/src/settings-shared.h +++ b/src/settings-shared.h @@ -34,6 +34,7 @@ with this program. If not, see . #define SETTINGS_SHOW_EVENTS_S "show-events" #define SETTINGS_SHOW_LOCATIONS_S "show-locations" #define SETTINGS_LOCATIONS_S "locations" +#define SETTINGS_TIMEZONE_NAME_S "timezone-name" enum { SETTINGS_TIME_LOCALE = 0, -- cgit v1.2.3