--- trunk/src/misc.c 2009/11/27 08:58:48 218 +++ trunk/src/misc.c 2009/11/30 21:28:04 221 @@ -33,8 +33,13 @@ #include #endif +float roundf(float x); + +/* TODO: make coordinate picker support "changed" signal */ + #ifdef FREMANTLE -#define PICKER_DIALOG +#define PRESET_PICKER_DIALOG +#define COORDINATE_PICKER #endif char strlastchr(char *str) { @@ -304,70 +309,450 @@ return val; } +/* ------------------ coordinate picker tool --------------------------- */ + static gboolean mark(GtkWidget *widget, gboolean valid) { gtk_widget_set_state(widget, valid?GTK_STATE_NORMAL:TAG_STATE); return valid; } +#ifndef COORDINATE_PICKER static void callback_modified_lat(GtkWidget *widget, gpointer data ) { float i = pos_parse_lat((char*)gtk_entry_get_text(GTK_ENTRY(widget))); mark(widget, !isnan(i)); } +#else +static GtkWidget *letter_picker_create(char *a, char *b, int sel) { +#ifndef FREMANTLE + GtkWidget *view = gtk_tree_view_new(); +#else + GtkWidget *view = hildon_gtk_tree_view_new(HILDON_UI_MODE_EDIT); +#endif + + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE); + GtkTreeSelection *selection = + gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); + + /* --- "char" column --- */ + GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); + g_object_set(renderer, "xalign", 0.5, NULL ); + gtk_tree_view_insert_column_with_attributes( + GTK_TREE_VIEW(view), -1, "char", renderer, "text", 0, NULL); + + GtkListStore *store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT); + + /* add digits */ + GtkTreeIter iter_a, iter_b; + gtk_list_store_append (store, &iter_a); + gtk_list_store_set(store, &iter_a, 0, _(a), 1, 0, -1); + gtk_list_store_append (store, &iter_b); + gtk_list_store_set(store, &iter_b, 0, _(b), 1, 1, -1); + + gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store)); + g_object_unref(store); + + /* select right character */ + GtkTreeIter iter = (!sel)?iter_a:iter_b; + gtk_tree_selection_select_iter(selection, &iter); + GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter); + gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(view), + path, NULL, TRUE, 0.5, 0.5); + gtk_tree_path_free(path); + + /* put this inside a scrolled view */ +#ifndef USE_PANNABLE_AREA + GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_container_add(GTK_CONTAINER(scrolled_window), view); + return scrolled_window; +#else + GtkWidget *pannable_area = hildon_pannable_area_new(); + gtk_container_add(GTK_CONTAINER(pannable_area), view); + return pannable_area; +#endif +} + +static int picker_get(GtkWidget *widget) { + GtkWidget *view = gtk_bin_get_child(GTK_BIN(widget)); + + GtkTreeSelection *sel = + gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); + + GtkTreeModel *model; + GtkTreeIter iter; + + /* there should never be an unseletced column. But if */ + /* it is, we count it as zero */ + if(!gtk_tree_selection_get_selected(sel, &model, &iter)) + return 0; + + int retval = 0; + gtk_tree_model_get(model, &iter, 1, &retval, -1); + return retval; +} + + +static GtkWidget *digit_picker_create(int min, int max, int sel) { +#ifndef FREMANTLE + GtkWidget *view = gtk_tree_view_new(); +#else + GtkWidget *view = hildon_gtk_tree_view_new(HILDON_UI_MODE_EDIT); +#endif + + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE); + GtkTreeSelection *selection = + gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); + + /* --- "digit" column --- */ + GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); + g_object_set(renderer, "xalign", 0.5, NULL ); + gtk_tree_view_insert_column_with_attributes( + GTK_TREE_VIEW(view), -1, "digit", renderer, "text", 0, NULL); + + GtkListStore *store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT); + + /* add digits */ + int i; + GtkTreeIter siter; + for(i=min;i<=max;i++) { + char str[2] = { '0'+i, 0 }; + GtkTreeIter iter; + /* Append a row and fill in some data */ + gtk_list_store_append (store, &iter); + gtk_list_store_set(store, &iter, 0, str, 1, i, -1); + + if(i == sel) siter = iter; + } + + gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store)); + g_object_unref(store); + + gtk_tree_selection_select_iter(selection, &siter); + GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &siter); + gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(view), + path, NULL, TRUE, 0.5, 0.5); + gtk_tree_path_free(path); + + /* put this inside a scrolled view */ +#ifndef USE_PANNABLE_AREA + GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_container_add(GTK_CONTAINER(scrolled_window), view); + return scrolled_window; +#else + GtkWidget *pannable_area = hildon_pannable_area_new(); + gtk_container_add(GTK_CONTAINER(pannable_area), view); + return pannable_area; +#endif +} + +static gint on_lat_picker_button_press(GtkWidget *button, + GdkEventButton *event, gpointer data) { + + if(event->type == GDK_BUTTON_PRESS) { + GtkWidget *dialog = + gtk_dialog_new_with_buttons(_("Latitude"), + GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button))), + GTK_DIALOG_MODAL, + GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, + _("Done"), GTK_RESPONSE_ACCEPT, + NULL); + + gtk_window_set_default_size(GTK_WINDOW(dialog), 400, 200); + + int i, lat = (int)g_object_get_data(G_OBJECT(button), "latitude"); + + /* parse latitude into components */ + int sign = (lat>=0)?0:1; + lat = abs(lat); + int deg = lat / 60000; + int min = (lat /1000)%60; + int minfrac = lat % 1000; + + GtkWidget *signw, *degw[2], *minw[2], *minfracw[3]; + + + /* create N/S 89° 99.999 */ + GtkWidget *hbox = gtk_hbox_new(FALSE, 0); + gtk_box_pack_start_defaults(GTK_BOX(hbox), + signw = letter_picker_create("N","S", sign)); + + gtk_box_pack_start_defaults(GTK_BOX(hbox), + degw[0] = digit_picker_create(0,8, deg/10)); + gtk_box_pack_start_defaults(GTK_BOX(hbox), + degw[1] = digit_picker_create(0,9, deg%10)); + gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new("°"), FALSE, FALSE, 0); + + gtk_box_pack_start_defaults(GTK_BOX(hbox), + minw[0] = digit_picker_create(0,5, min/10)); + gtk_box_pack_start_defaults(GTK_BOX(hbox), + minw[1] = digit_picker_create(0,9, min%10)); + gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new("."), FALSE, FALSE, 0); + + gtk_box_pack_start_defaults(GTK_BOX(hbox), + minfracw[0] = digit_picker_create(0,9, minfrac/100)); + gtk_box_pack_start_defaults(GTK_BOX(hbox), + minfracw[1] = digit_picker_create(0,9, (minfrac/10)%10)); + gtk_box_pack_start_defaults(GTK_BOX(hbox), + minfracw[2] = digit_picker_create(0,9, minfrac%10)); + + gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox); + + gtk_widget_show_all(dialog); + if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { + + /* parse N/S */ + sign = picker_get(signw)?-1:1; + + /* parse degrees ... */ + for(deg=0,i=0;i<2;i++) + deg = 10 * deg + picker_get(degw[i]); + + /* ... minutes ... */ + for(min=0,i=0;i<2;i++) + min = 10 * min + picker_get(minw[i]); + + /* ... and fractions of minutes */ + for(minfrac=0,i=0;i<3;i++) + minfrac = 10 * minfrac + picker_get(minfracw[i]); + + float latitude = sign * (deg + min/60.0 + minfrac/60000.0); + lat_entry_set(button, latitude); + } + + gtk_widget_destroy(dialog); + + return TRUE; + } + return FALSE; +} +#endif /* a entry that is colored red when being "active" */ GtkWidget *lat_entry_new(float lat) { + char str[32]; + pos_lat_str(str, sizeof(str), lat); + +#ifndef COORDINATE_PICKER GdkColor color; GtkWidget *widget = entry_new(); gdk_color_parse("#ff0000", &color); gtk_widget_modify_text(widget, TAG_STATE, &color); - char str[32]; - pos_lat_str(str, sizeof(str), lat); gtk_entry_set_text(GTK_ENTRY(widget), str); g_signal_connect(G_OBJECT(widget), "changed", G_CALLBACK(callback_modified_lat), NULL); +#else + GtkWidget *widget = gtk_button_new_with_label(str); + +#ifdef FREMANTLE + hildon_gtk_widget_set_theme_size(widget, + (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH)); +#endif + int lat_int = (int)roundf(lat * 60000); + g_object_set_data(G_OBJECT(widget), "latitude", (gpointer)lat_int); + gtk_signal_connect(GTK_OBJECT(widget), "button-press-event", + (GtkSignalFunc)on_lat_picker_button_press, NULL); +#endif + return widget; } +#ifndef COORDINATE_PICKER static void callback_modified_lon(GtkWidget *widget, gpointer data ) { float i = pos_parse_lon((char*)gtk_entry_get_text(GTK_ENTRY(widget))); mark(widget, !isnan(i)); } +#else +static gint on_lon_picker_button_press(GtkWidget *button, + GdkEventButton *event, gpointer data) { + + if(event->type == GDK_BUTTON_PRESS) { + GtkWidget *dialog = + gtk_dialog_new_with_buttons(_("Longitude"), + GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button))), + GTK_DIALOG_MODAL, + GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, + _("Done"), GTK_RESPONSE_ACCEPT, + NULL); + + gtk_window_set_default_size(GTK_WINDOW(dialog), 400, 200); + + int i, lat = (int)g_object_get_data(G_OBJECT(button), "longitude"); + + /* parse latitude into components */ + int sign = (lat>=0)?0:1; + lat = abs(lat); + int deg = lat / 60000; + int min = (lat /1000)%60; + int minfrac = lat % 1000; + + GtkWidget *signw, *degw[3], *minw[2], *minfracw[3]; + + /* create E/W 179° 99.999 */ + GtkWidget *hbox = gtk_hbox_new(FALSE, 0); + gtk_box_pack_start_defaults(GTK_BOX(hbox), + signw = letter_picker_create("E","W", sign)); + + gtk_box_pack_start_defaults(GTK_BOX(hbox), + degw[0] = digit_picker_create(0,1, deg/100)); + gtk_box_pack_start_defaults(GTK_BOX(hbox), + degw[1] = digit_picker_create(0,9, (deg/10)%10)); + gtk_box_pack_start_defaults(GTK_BOX(hbox), + degw[2] = digit_picker_create(0,9, deg%10)); + gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new("°"), FALSE, FALSE, 0); + + gtk_box_pack_start_defaults(GTK_BOX(hbox), + minw[0] = digit_picker_create(0,5, min/10)); + gtk_box_pack_start_defaults(GTK_BOX(hbox), + minw[1] = digit_picker_create(0,9, min%10)); + gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new("."), FALSE, FALSE, 0); + + gtk_box_pack_start_defaults(GTK_BOX(hbox), + minfracw[0] = digit_picker_create(0,9, minfrac/100)); + gtk_box_pack_start_defaults(GTK_BOX(hbox), + minfracw[1] = digit_picker_create(0,9, (minfrac/10)%10)); + gtk_box_pack_start_defaults(GTK_BOX(hbox), + minfracw[2] = digit_picker_create(0,9, minfrac%10)); + + gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox); + + gtk_widget_show_all(dialog); + if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { + + /* parse E/W */ + sign = picker_get(signw)?-1:1; + + /* parse degrees ... */ + for(deg=0,i=0;i<3;i++) + deg = 10 * deg + picker_get(degw[i]); + + /* ... minutes ... */ + for(min=0,i=0;i<2;i++) + min = 10 * min + picker_get(minw[i]); + + /* ... and fractions of minutes */ + for(minfrac=0,i=0;i<3;i++) + minfrac = 10 * minfrac + picker_get(minfracw[i]); + + float longitude = sign * (deg + min/60.0 + minfrac/60000.0); + lon_entry_set(button, longitude); + } + + gtk_widget_destroy(dialog); + + return TRUE; + } + return FALSE; +} +#endif /* a entry that is colored red when filled with invalid coordinate */ GtkWidget *lon_entry_new(float lon) { + char str[32]; + pos_lon_str(str, sizeof(str), lon); + +#ifndef COORDINATE_PICKER GdkColor color; GtkWidget *widget = entry_new(); - // gtk_entry_set_width_chars(GTK_ENTRY(widget), 14); - gdk_color_parse("#ff0000", &color); gtk_widget_modify_text(widget, TAG_STATE, &color); - char str[32]; - pos_lon_str(str, sizeof(str), lon); gtk_entry_set_text(GTK_ENTRY(widget), str); g_signal_connect(G_OBJECT(widget), "changed", G_CALLBACK(callback_modified_lon), NULL); +#else + GtkWidget *widget = gtk_button_new_with_label(str); + +#ifdef FREMANTLE + hildon_gtk_widget_set_theme_size(widget, + (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH)); +#endif + int lon_int = (int)roundf(lon * 60000); + g_object_set_data(G_OBJECT(widget), "longitude", (gpointer)lon_int); + gtk_signal_connect(GTK_OBJECT(widget), "button-press-event", + (GtkSignalFunc)on_lon_picker_button_press, NULL); +#endif + return widget; } - -float lat_get(GtkWidget *widget) { +float lat_entry_get(GtkWidget *widget) { +#ifndef COORDINATE_PICKER char *p = (char*)gtk_entry_get_text(GTK_ENTRY(widget)); +#else + char *p = (char*)gtk_button_get_label(GTK_BUTTON(widget)); +#endif return pos_parse_lat(p); } -float lon_get(GtkWidget *widget) { +float lon_entry_get(GtkWidget *widget) { +#ifndef COORDINATE_PICKER char *p = (char*)gtk_entry_get_text(GTK_ENTRY(widget)); +#else + char *p = (char*)gtk_button_get_label(GTK_BUTTON(widget)); +#endif return pos_parse_lon(p); } +void lat_entry_set(GtkWidget *widget, float lat) { + char str[32]; + pos_lat_str(str, sizeof(str)-1, lat); +#ifndef COORDINATE_PICKER + gtk_entry_set_text(GTK_ENTRY(widget), str); +#else + gtk_button_set_label(GTK_BUTTON(widget), str); + int lat_int = (int)roundf(lat * 60000); + g_object_set_data(G_OBJECT(widget), "latitude", (gpointer)lat_int); +#endif +} + +void lon_entry_set(GtkWidget *widget, float lon) { + char str[32]; + pos_lon_str(str, sizeof(str)-1, lon); +#ifndef COORDINATE_PICKER + gtk_entry_set_text(GTK_ENTRY(widget), str); +#else + gtk_button_set_label(GTK_BUTTON(widget), str); + int lon_int = (int)roundf(lon * 60000); + g_object_set_data(G_OBJECT(widget), "longitude", (gpointer)lon_int); +#endif +} + +void lat_label_set(GtkWidget *widget, float lat) { + char str[32]; + pos_lat_str(str, sizeof(str)-1, lat); + gtk_label_set(GTK_LABEL(widget), str); +} + +void lon_label_set(GtkWidget *widget, float lon) { + char str[32]; + pos_lon_str(str, sizeof(str)-1, lon); + gtk_label_set(GTK_LABEL(widget), str); +} + +void lat_label_attrib_set(GtkWidget *widget, float lat, + int size, int strikethrough) { + char str[32]; + pos_lat_str(str, sizeof(str)-1, lat); + gtk_label_attrib_set(widget, str, size, strikethrough); +} + +void lon_label_attrib_set(GtkWidget *widget, float lon, + int size, int strikethrough) { + char str[32]; + pos_lon_str(str, sizeof(str)-1, lon); + gtk_label_attrib_set(widget, str, size, strikethrough); +} + static void callback_modified_dist(GtkWidget *widget, gpointer data ) { /* don't care for metric/imperial since we only want to know if this */ /* is parseable at all */ @@ -539,16 +924,15 @@ return widget; } +/* ------------- preset coordinate picker tool ----------------- */ + static void pos_set(GtkWidget *item, float lat, float lon) { - char str[32]; - pos_lat_str(str, sizeof(str)-1, lat); GtkWidget *lat_entry = g_object_get_data(G_OBJECT(item), "lat_entry"); - gtk_entry_set_text(GTK_ENTRY(lat_entry), str); + lat_entry_set(lat_entry, lat); - pos_lon_str(str, sizeof(str)-1, lon); GtkWidget *lon_entry = g_object_get_data(G_OBJECT(item), "lon_entry"); - gtk_entry_set_text(GTK_ENTRY(lon_entry), str); + lon_entry_set(lon_entry, lon); } static void cb_gps(GtkWidget *item, gpointer data) { @@ -599,19 +983,21 @@ if(!id) pos_set(item, cache->pos.lat, cache->pos.lon); + else if(id == 1) + pos_set(item, cache->notes->pos.lat, cache->notes->pos.lon); else { wpt_t *wpt = cache->wpt; - while(wpt && id > 1) { + while(wpt && id > 2) { wpt = wpt->next; id--; } - if(id == 1) + if(id == 2) pos_set(item, wpt->pos.lat, wpt->pos.lon); } } -#ifndef PICKER_DIALOG +#ifndef PRESET_PICKER_DIALOG static GtkWidget *menu_add(GtkWidget *menu, appdata_t *appdata, GtkWidget *icon, char *menu_str, void(*func)(GtkWidget*, gpointer), gint id, @@ -667,13 +1053,21 @@ char *name = cache->name; if(!name) name = cache->id; + /* original cache position */ if(!isnan(cache->pos.lat) && !isnan(cache->pos.lon)) { menu_add(menu, appdata, icon_get_widget(ICON_POS, cache->type + 6), name, cb_cache, 0, lon_entry, lat_entry); } + /* overwritten cache position */ + if(cache->notes && + !isnan(cache->notes->pos.lat) && !isnan(cache->notes->pos.lon)) { + menu_add(menu, appdata, icon_get_widget(ICON_POS, cache->type + 6), + _("Modified coordinate"), cb_cache, 1, lon_entry, lat_entry); + } + wpt_t *wpt = cache->wpt; - gint id = 1; + gint id = 2; while(wpt) { GtkWidget *icon = NULL; if(wpt->sym != WPT_SYM_UNKNOWN) @@ -715,17 +1109,17 @@ } #endif -#ifdef PICKER_DIALOG +#ifdef PRESET_PICKER_DIALOG enum { - PICKER_COL_ICON = 0, - PICKER_COL_NAME, - PICKER_COL_ID, - PICKER_COL_CB, - PICKER_NUM_COLS + PRESET_PICKER_COL_ICON = 0, + PRESET_PICKER_COL_NAME, + PRESET_PICKER_COL_ID, + PRESET_PICKER_COL_CB, + PRESET_PICKER_NUM_COLS }; -static void picker_add(GtkListStore *store, appdata_t *appdata, +static void preset_picker_add(GtkListStore *store, appdata_t *appdata, GdkPixbuf *icon, char *menu_str, void(*func)(GtkWidget*, gpointer), gint id) { GtkTreeIter iter; @@ -734,14 +1128,14 @@ gtk_list_store_append (store, &iter); gtk_list_store_set(store, &iter, - PICKER_COL_ICON, icon, - PICKER_COL_NAME, menu_str, - PICKER_COL_ID, id, - PICKER_COL_CB, func, + PRESET_PICKER_COL_ICON, icon, + PRESET_PICKER_COL_NAME, menu_str, + PRESET_PICKER_COL_ID, id, + PRESET_PICKER_COL_CB, func, -1); } -static void on_picker_activated(GtkTreeView *treeview, +static void on_preset_picker_activated(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *col, gpointer userdata) { @@ -752,22 +1146,21 @@ gint id; void(*func)(GtkWidget*, gpointer); gtk_tree_model_get(model, &iter, - PICKER_COL_ID, &id, - PICKER_COL_CB, &func, + PRESET_PICKER_COL_ID, &id, + PRESET_PICKER_COL_CB, &func, -1); /* set id on widget as callbacks expect it this way */ g_object_set_data(G_OBJECT(treeview), "id", (gpointer)id); func(GTK_WIDGET(treeview), userdata); - /* xyz */ gtk_dialog_response(GTK_DIALOG(gtk_widget_get_toplevel( GTK_WIDGET(treeview))), GTK_RESPONSE_ACCEPT); } } -static GtkWidget *picker_create(appdata_t *appdata, +static GtkWidget *preset_picker_create(appdata_t *appdata, GtkWidget *lat_entry, GtkWidget *lon_entry) { GtkCellRenderer *renderer; GtkListStore *store; @@ -780,41 +1173,41 @@ /* --- "Icon" column --- */ renderer = gtk_cell_renderer_pixbuf_new(); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), - -1, "Icon", renderer, "pixbuf", PICKER_COL_ICON, NULL); + -1, "Icon", renderer, "pixbuf", PRESET_PICKER_COL_ICON, NULL); /* --- "Name" column --- */ renderer = gtk_cell_renderer_text_new(); g_object_set(renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL ); GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes( - "Name", renderer, "text", PICKER_COL_NAME, NULL); + "Name", renderer, "text", PRESET_PICKER_COL_NAME, NULL); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_insert_column(GTK_TREE_VIEW(view), column, -1); - store = gtk_list_store_new(PICKER_NUM_COLS, + store = gtk_list_store_new(PRESET_PICKER_NUM_COLS, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_INT, G_TYPE_POINTER); - picker_add(store, appdata, icon_get(ICON_POS, 18), + preset_picker_add(store, appdata, icon_get(ICON_POS, 18), _("GPS position"), cb_gps, 0); - picker_add(store, appdata, icon_get(ICON_POS, 21), + preset_picker_add(store, appdata, icon_get(ICON_POS, 21), _("Home"), cb_gps, 1); location_t *location = appdata->location; gint id = 2; while(location) { - picker_add(store, appdata, icon_get(ICON_POS, 21), + preset_picker_add(store, appdata, icon_get(ICON_POS, 21), location->name, cb_gps, id++); location = location->next; } - picker_add(store, appdata, icon_get(ICON_POS, 19), + preset_picker_add(store, appdata, icon_get(ICON_POS, 19), _("Geomath projection"), cb_geomath, 0); #ifdef ENABLE_OSM_GPS_MAP - picker_add(store, appdata, icon_get(ICON_POS, 20), + preset_picker_add(store, appdata, icon_get(ICON_POS, 20), _("Map position"), cb_map, 0); #endif @@ -824,13 +1217,21 @@ char *name = cache->name; if(!name) name = cache->id; + /* original cache position */ if(!isnan(cache->pos.lat) && !isnan(cache->pos.lon)) { - picker_add(store, appdata, icon_get(ICON_POS, cache->type + 6), + preset_picker_add(store, appdata, icon_get(ICON_POS, cache->type + 6), name, cb_cache, 0); } + /* overwritten cache position */ + if(cache->notes && + !isnan(cache->notes->pos.lat) && !isnan(cache->notes->pos.lon)) { + preset_picker_add(store, appdata, icon_get(ICON_POS, cache->type + 6), + _("Modified coordinate"), cb_cache, 1); + } + wpt_t *wpt = cache->wpt; - gint id = 1; + gint id = 2; while(wpt) { GdkPixbuf *icon = NULL; if(wpt->sym != WPT_SYM_UNKNOWN) @@ -840,7 +1241,7 @@ if(!name) name = wpt->cmt; if(!name) name = wpt->id; - picker_add(store, appdata, icon, name, cb_cache, id++); + preset_picker_add(store, appdata, icon, name, cb_cache, id++); wpt = wpt->next; } } @@ -851,12 +1252,7 @@ /* make list react on clicks */ g_signal_connect(view, "row-activated", - (GCallback)on_picker_activated, appdata); - -#if 0 - g_signal_connect(view, "destroy", - (GCallback)cachelist_destroy, ce); -#endif + (GCallback)on_preset_picker_activated, appdata); /* put this inside a scrolled view */ #ifndef USE_PANNABLE_AREA @@ -872,7 +1268,7 @@ #endif } -static gint on_picker_button_press(GtkWidget *button, +static gint on_preset_picker_button_press(GtkWidget *button, GdkEventButton *event, gpointer data) { appdata_t *appdata = (appdata_t*)data; @@ -890,7 +1286,7 @@ gtk_window_set_default_size(GTK_WINDOW(dialog), 400, 200); gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox), - picker_create(appdata, lat_entry, lon_entry)); + preset_picker_create(appdata, lat_entry, lon_entry)); gtk_widget_show_all(dialog); gtk_dialog_run(GTK_DIALOG(dialog)); @@ -902,7 +1298,25 @@ } #endif -GtkWidget *coo_popup(appdata_t *appdata, +void preset_coordinate_picker_update(appdata_t *appdata, GtkWidget *widget) { +#ifndef PRESET_PICKER_DIALOG + printf("updating popup menu\n"); + + GtkWidget *menu = g_object_get_data(G_OBJECT(widget), "menu"); + g_assert(menu); + gtk_widget_destroy(menu); + + gpointer lat_entry = g_object_get_data(G_OBJECT(widget), "lat_entry"); + g_assert(lat_entry); + gpointer lon_entry = g_object_get_data(G_OBJECT(widget), "lon_entry"); + g_assert(lon_entry); + + menu = popup_menu_create(appdata, lat_entry, lon_entry); + g_object_set_data(G_OBJECT(widget), "menu", (gpointer)menu); +#endif +} + +GtkWidget *preset_coordinate_picker(appdata_t *appdata, GtkWidget *lat_entry, GtkWidget *lon_entry) { GtkWidget *button = gtk_button_new(); @@ -911,7 +1325,13 @@ gtk_widget_set_tooltip_text(button, _("Preset coordinates")); -#ifndef PICKER_DIALOG + g_object_set_data(G_OBJECT(button), "lat_entry", (gpointer)lat_entry); + g_object_set_data(G_OBJECT(button), "lon_entry", (gpointer)lon_entry); + + g_object_set_data(G_OBJECT(button), "lat_entry", (gpointer)lat_entry); + g_object_set_data(G_OBJECT(button), "lon_entry", (gpointer)lon_entry); + +#ifndef PRESET_PICKER_DIALOG gtk_signal_connect(GTK_OBJECT(button), "button-press-event", (GtkSignalFunc)on_popup_button_press, appdata); @@ -926,11 +1346,8 @@ (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH)); #endif - g_object_set_data(G_OBJECT(button), "lat_entry", (gpointer)lat_entry); - g_object_set_data(G_OBJECT(button), "lon_entry", (gpointer)lon_entry); - gtk_signal_connect(GTK_OBJECT(button), "button-press-event", - (GtkSignalFunc)on_picker_button_press, appdata); + (GtkSignalFunc)on_preset_picker_button_press, appdata); #endif return button;