Diff of /trunk/src/misc.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 218 by harbaum, Fri Nov 27 08:58:48 2009 UTC revision 221 by harbaum, Mon Nov 30 21:28:04 2009 UTC
# Line 33  Line 33 
33  #include <hildon/hildon-picker-dialog.h>  #include <hildon/hildon-picker-dialog.h>
34  #endif  #endif
35    
36    float roundf(float x);
37    
38    /* TODO: make coordinate picker support "changed" signal */
39    
40  #ifdef FREMANTLE  #ifdef FREMANTLE
41  #define PICKER_DIALOG  #define PRESET_PICKER_DIALOG
42    #define COORDINATE_PICKER
43  #endif  #endif
44    
45  char strlastchr(char *str) {  char strlastchr(char *str) {
# Line 304  float distance_parse(char *str, gboolean Line 309  float distance_parse(char *str, gboolean
309    return val;    return val;
310  }  }
311    
312    /* ------------------ coordinate picker tool --------------------------- */
313    
314  static gboolean mark(GtkWidget *widget, gboolean valid) {  static gboolean mark(GtkWidget *widget, gboolean valid) {
315    gtk_widget_set_state(widget, valid?GTK_STATE_NORMAL:TAG_STATE);    gtk_widget_set_state(widget, valid?GTK_STATE_NORMAL:TAG_STATE);
316    return valid;    return valid;
317  }  }
318    
319    #ifndef COORDINATE_PICKER
320  static void callback_modified_lat(GtkWidget *widget, gpointer data ) {  static void callback_modified_lat(GtkWidget *widget, gpointer data ) {
321    float i = pos_parse_lat((char*)gtk_entry_get_text(GTK_ENTRY(widget)));    float i = pos_parse_lat((char*)gtk_entry_get_text(GTK_ENTRY(widget)));
322    mark(widget, !isnan(i));    mark(widget, !isnan(i));
323  }  }
324    #else
325    static GtkWidget *letter_picker_create(char *a, char *b, int sel) {
326    #ifndef FREMANTLE
327      GtkWidget *view = gtk_tree_view_new();
328    #else
329      GtkWidget *view = hildon_gtk_tree_view_new(HILDON_UI_MODE_EDIT);
330    #endif
331    
332      gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE);
333      GtkTreeSelection *selection =
334        gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
335    
336      /* --- "char" column --- */
337      GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
338      g_object_set(renderer, "xalign", 0.5, NULL );
339      gtk_tree_view_insert_column_with_attributes(
340          GTK_TREE_VIEW(view), -1, "char", renderer, "text", 0, NULL);
341    
342      GtkListStore *store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT);
343    
344      /* add digits */
345      GtkTreeIter iter_a, iter_b;
346      gtk_list_store_append (store, &iter_a);
347      gtk_list_store_set(store, &iter_a, 0, _(a), 1, 0, -1);
348      gtk_list_store_append (store, &iter_b);
349      gtk_list_store_set(store, &iter_b, 0, _(b), 1, 1, -1);
350    
351      gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store));
352      g_object_unref(store);
353    
354      /* select right character */
355      GtkTreeIter iter = (!sel)?iter_a:iter_b;
356      gtk_tree_selection_select_iter(selection, &iter);
357      GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter);
358      gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(view),
359                                   path, NULL, TRUE, 0.5, 0.5);
360      gtk_tree_path_free(path);
361    
362      /* put this inside a scrolled view */
363    #ifndef USE_PANNABLE_AREA
364      GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL);
365      gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
366                                     GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
367      gtk_container_add(GTK_CONTAINER(scrolled_window), view);
368      return scrolled_window;
369    #else
370      GtkWidget *pannable_area = hildon_pannable_area_new();
371      gtk_container_add(GTK_CONTAINER(pannable_area), view);
372      return pannable_area;
373    #endif
374    }
375    
376    static int picker_get(GtkWidget *widget) {
377      GtkWidget *view = gtk_bin_get_child(GTK_BIN(widget));
378    
379      GtkTreeSelection *sel =
380        gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
381    
382      GtkTreeModel *model;
383      GtkTreeIter iter;
384    
385      /* there should never be an unseletced column. But if */
386      /* it is, we count it as zero */
387      if(!gtk_tree_selection_get_selected(sel, &model, &iter))
388        return 0;
389    
390      int retval = 0;
391      gtk_tree_model_get(model, &iter, 1, &retval, -1);
392      return retval;
393    }
394    
395    
396    static GtkWidget *digit_picker_create(int min, int max, int sel) {
397    #ifndef FREMANTLE
398      GtkWidget *view = gtk_tree_view_new();
399    #else
400      GtkWidget *view = hildon_gtk_tree_view_new(HILDON_UI_MODE_EDIT);
401    #endif
402    
403      gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE);
404      GtkTreeSelection *selection =
405        gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
406    
407      /* --- "digit" column --- */
408      GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
409      g_object_set(renderer, "xalign", 0.5, NULL );
410      gtk_tree_view_insert_column_with_attributes(
411          GTK_TREE_VIEW(view), -1, "digit", renderer, "text", 0, NULL);
412    
413      GtkListStore *store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT);
414    
415      /* add digits */
416      int i;
417      GtkTreeIter siter;
418      for(i=min;i<=max;i++) {
419        char str[2] = { '0'+i, 0 };
420        GtkTreeIter     iter;
421        /* Append a row and fill in some data */
422        gtk_list_store_append (store, &iter);
423        gtk_list_store_set(store, &iter, 0, str, 1, i, -1);
424    
425        if(i == sel) siter = iter;
426      }
427    
428      gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store));
429      g_object_unref(store);
430    
431      gtk_tree_selection_select_iter(selection, &siter);
432      GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &siter);
433      gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(view),
434                                   path, NULL, TRUE, 0.5, 0.5);
435      gtk_tree_path_free(path);
436    
437      /* put this inside a scrolled view */
438    #ifndef USE_PANNABLE_AREA
439      GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL);
440      gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
441                                     GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
442      gtk_container_add(GTK_CONTAINER(scrolled_window), view);
443      return scrolled_window;
444    #else
445      GtkWidget *pannable_area = hildon_pannable_area_new();
446      gtk_container_add(GTK_CONTAINER(pannable_area), view);
447      return pannable_area;
448    #endif
449    }
450    
451    static gint on_lat_picker_button_press(GtkWidget *button,
452                       GdkEventButton *event, gpointer data) {
453    
454      if(event->type == GDK_BUTTON_PRESS) {
455        GtkWidget *dialog =
456          gtk_dialog_new_with_buttons(_("Latitude"),
457              GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button))),
458                                      GTK_DIALOG_MODAL,
459              GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
460              _("Done"),        GTK_RESPONSE_ACCEPT,
461              NULL);
462    
463        gtk_window_set_default_size(GTK_WINDOW(dialog), 400, 200);
464    
465        int i, lat = (int)g_object_get_data(G_OBJECT(button), "latitude");
466    
467        /* parse latitude into components */
468        int sign = (lat>=0)?0:1;
469        lat = abs(lat);
470        int deg = lat / 60000;
471        int min = (lat /1000)%60;
472        int minfrac = lat % 1000;
473    
474        GtkWidget *signw, *degw[2], *minw[2], *minfracw[3];
475    
476    
477        /* create N/S 89° 99.999 */
478        GtkWidget *hbox = gtk_hbox_new(FALSE, 0);
479        gtk_box_pack_start_defaults(GTK_BOX(hbox),
480                    signw = letter_picker_create("N","S", sign));
481    
482        gtk_box_pack_start_defaults(GTK_BOX(hbox),
483                    degw[0] = digit_picker_create(0,8, deg/10));
484        gtk_box_pack_start_defaults(GTK_BOX(hbox),
485                    degw[1] = digit_picker_create(0,9, deg%10));
486        gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new("°"), FALSE, FALSE, 0);
487    
488        gtk_box_pack_start_defaults(GTK_BOX(hbox),
489                    minw[0] = digit_picker_create(0,5, min/10));
490        gtk_box_pack_start_defaults(GTK_BOX(hbox),
491                    minw[1] = digit_picker_create(0,9, min%10));
492        gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new("."), FALSE, FALSE, 0);
493    
494        gtk_box_pack_start_defaults(GTK_BOX(hbox),
495                    minfracw[0] = digit_picker_create(0,9, minfrac/100));
496        gtk_box_pack_start_defaults(GTK_BOX(hbox),
497                    minfracw[1] = digit_picker_create(0,9, (minfrac/10)%10));
498        gtk_box_pack_start_defaults(GTK_BOX(hbox),
499                    minfracw[2] = digit_picker_create(0,9, minfrac%10));
500    
501        gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox);
502    
503        gtk_widget_show_all(dialog);
504        if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
505    
506          /* parse N/S */
507          sign = picker_get(signw)?-1:1;
508    
509          /* parse degrees ... */
510          for(deg=0,i=0;i<2;i++)
511            deg = 10 * deg + picker_get(degw[i]);
512    
513          /* ... minutes ... */
514          for(min=0,i=0;i<2;i++)
515            min = 10 * min + picker_get(minw[i]);
516    
517          /* ... and fractions of minutes */
518          for(minfrac=0,i=0;i<3;i++)
519            minfrac = 10 * minfrac + picker_get(minfracw[i]);
520    
521          float latitude = sign * (deg + min/60.0 + minfrac/60000.0);
522          lat_entry_set(button, latitude);
523        }
524    
525        gtk_widget_destroy(dialog);
526    
527        return TRUE;
528      }
529      return FALSE;
530    }
531    #endif
532    
533  /* a entry that is colored red when being "active" */  /* a entry that is colored red when being "active" */
534  GtkWidget *lat_entry_new(float lat) {  GtkWidget *lat_entry_new(float lat) {
535      char str[32];
536      pos_lat_str(str, sizeof(str), lat);
537    
538    #ifndef COORDINATE_PICKER
539    GdkColor color;    GdkColor color;
540    
541    GtkWidget *widget = entry_new();    GtkWidget *widget = entry_new();
542    gdk_color_parse("#ff0000", &color);    gdk_color_parse("#ff0000", &color);
543    gtk_widget_modify_text(widget, TAG_STATE, &color);    gtk_widget_modify_text(widget, TAG_STATE, &color);
544    
   char str[32];  
   pos_lat_str(str, sizeof(str), lat);  
545    gtk_entry_set_text(GTK_ENTRY(widget), str);    gtk_entry_set_text(GTK_ENTRY(widget), str);
546    
547    g_signal_connect(G_OBJECT(widget), "changed",    g_signal_connect(G_OBJECT(widget), "changed",
548                     G_CALLBACK(callback_modified_lat), NULL);                     G_CALLBACK(callback_modified_lat), NULL);
549    
550    #else
551      GtkWidget *widget = gtk_button_new_with_label(str);
552    
553    #ifdef FREMANTLE
554      hildon_gtk_widget_set_theme_size(widget,
555            (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH));
556    #endif
557      int lat_int = (int)roundf(lat * 60000);
558      g_object_set_data(G_OBJECT(widget), "latitude", (gpointer)lat_int);
559      gtk_signal_connect(GTK_OBJECT(widget), "button-press-event",
560                         (GtkSignalFunc)on_lat_picker_button_press, NULL);
561    #endif
562    
563    return widget;    return widget;
564  }  }
565    
566    #ifndef COORDINATE_PICKER
567  static void callback_modified_lon(GtkWidget *widget, gpointer data ) {  static void callback_modified_lon(GtkWidget *widget, gpointer data ) {
568    float i = pos_parse_lon((char*)gtk_entry_get_text(GTK_ENTRY(widget)));    float i = pos_parse_lon((char*)gtk_entry_get_text(GTK_ENTRY(widget)));
569    mark(widget, !isnan(i));    mark(widget, !isnan(i));
570  }  }
571    #else
572    static gint on_lon_picker_button_press(GtkWidget *button,
573                       GdkEventButton *event, gpointer data) {
574    
575      if(event->type == GDK_BUTTON_PRESS) {
576        GtkWidget *dialog =
577          gtk_dialog_new_with_buttons(_("Longitude"),
578              GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button))),
579                                      GTK_DIALOG_MODAL,
580              GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
581              _("Done"),        GTK_RESPONSE_ACCEPT,
582              NULL);
583    
584        gtk_window_set_default_size(GTK_WINDOW(dialog), 400, 200);
585    
586        int i, lat = (int)g_object_get_data(G_OBJECT(button), "longitude");
587    
588        /* parse latitude into components */
589        int sign = (lat>=0)?0:1;
590        lat = abs(lat);
591        int deg = lat / 60000;
592        int min = (lat /1000)%60;
593        int minfrac = lat % 1000;
594    
595        GtkWidget *signw, *degw[3], *minw[2], *minfracw[3];
596    
597        /* create E/W 179° 99.999 */
598        GtkWidget *hbox = gtk_hbox_new(FALSE, 0);
599        gtk_box_pack_start_defaults(GTK_BOX(hbox),
600                    signw = letter_picker_create("E","W", sign));
601    
602        gtk_box_pack_start_defaults(GTK_BOX(hbox),
603                    degw[0] = digit_picker_create(0,1, deg/100));
604        gtk_box_pack_start_defaults(GTK_BOX(hbox),
605                    degw[1] = digit_picker_create(0,9, (deg/10)%10));
606        gtk_box_pack_start_defaults(GTK_BOX(hbox),
607                    degw[2] = digit_picker_create(0,9, deg%10));
608        gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new("°"), FALSE, FALSE, 0);
609    
610        gtk_box_pack_start_defaults(GTK_BOX(hbox),
611                    minw[0] = digit_picker_create(0,5, min/10));
612        gtk_box_pack_start_defaults(GTK_BOX(hbox),
613                    minw[1] = digit_picker_create(0,9, min%10));
614        gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new("."), FALSE, FALSE, 0);
615    
616        gtk_box_pack_start_defaults(GTK_BOX(hbox),
617                    minfracw[0] = digit_picker_create(0,9, minfrac/100));
618        gtk_box_pack_start_defaults(GTK_BOX(hbox),
619                    minfracw[1] = digit_picker_create(0,9, (minfrac/10)%10));
620        gtk_box_pack_start_defaults(GTK_BOX(hbox),
621                    minfracw[2] = digit_picker_create(0,9, minfrac%10));
622    
623        gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox);
624    
625        gtk_widget_show_all(dialog);
626        if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
627    
628          /* parse E/W */
629          sign = picker_get(signw)?-1:1;
630    
631          /* parse degrees ... */
632          for(deg=0,i=0;i<3;i++)
633            deg = 10 * deg + picker_get(degw[i]);
634    
635          /* ... minutes ... */
636          for(min=0,i=0;i<2;i++)
637            min = 10 * min + picker_get(minw[i]);
638    
639          /* ... and fractions of minutes */
640          for(minfrac=0,i=0;i<3;i++)
641            minfrac = 10 * minfrac + picker_get(minfracw[i]);
642    
643          float longitude = sign * (deg + min/60.0 + minfrac/60000.0);
644          lon_entry_set(button, longitude);
645        }
646    
647        gtk_widget_destroy(dialog);
648    
649        return TRUE;
650      }
651      return FALSE;
652    }
653    #endif
654    
655  /* a entry that is colored red when filled with invalid coordinate */  /* a entry that is colored red when filled with invalid coordinate */
656  GtkWidget *lon_entry_new(float lon) {  GtkWidget *lon_entry_new(float lon) {
657      char str[32];
658      pos_lon_str(str, sizeof(str), lon);
659    
660    #ifndef COORDINATE_PICKER
661    GdkColor color;    GdkColor color;
662    
663    GtkWidget *widget = entry_new();    GtkWidget *widget = entry_new();
   //  gtk_entry_set_width_chars(GTK_ENTRY(widget), 14);  
   
664    gdk_color_parse("#ff0000", &color);    gdk_color_parse("#ff0000", &color);
665    gtk_widget_modify_text(widget, TAG_STATE, &color);    gtk_widget_modify_text(widget, TAG_STATE, &color);
666    
   char str[32];  
   pos_lon_str(str, sizeof(str), lon);  
667    gtk_entry_set_text(GTK_ENTRY(widget), str);    gtk_entry_set_text(GTK_ENTRY(widget), str);
668    
669    g_signal_connect(G_OBJECT(widget), "changed",    g_signal_connect(G_OBJECT(widget), "changed",
670                     G_CALLBACK(callback_modified_lon), NULL);                     G_CALLBACK(callback_modified_lon), NULL);
671    
672    #else
673      GtkWidget *widget = gtk_button_new_with_label(str);
674    
675    #ifdef FREMANTLE
676      hildon_gtk_widget_set_theme_size(widget,
677            (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH));
678    #endif
679      int lon_int = (int)roundf(lon * 60000);
680      g_object_set_data(G_OBJECT(widget), "longitude", (gpointer)lon_int);
681      gtk_signal_connect(GTK_OBJECT(widget), "button-press-event",
682                         (GtkSignalFunc)on_lon_picker_button_press, NULL);
683    #endif
684    
685    return widget;    return widget;
686  }  }
687    
688    float lat_entry_get(GtkWidget *widget) {
689  float lat_get(GtkWidget *widget) {  #ifndef COORDINATE_PICKER
690    char *p = (char*)gtk_entry_get_text(GTK_ENTRY(widget));    char *p = (char*)gtk_entry_get_text(GTK_ENTRY(widget));
691    #else
692      char *p = (char*)gtk_button_get_label(GTK_BUTTON(widget));
693    #endif
694    return pos_parse_lat(p);    return pos_parse_lat(p);
695  }  }
696    
697  float lon_get(GtkWidget *widget) {  float lon_entry_get(GtkWidget *widget) {
698    #ifndef COORDINATE_PICKER
699    char *p = (char*)gtk_entry_get_text(GTK_ENTRY(widget));    char *p = (char*)gtk_entry_get_text(GTK_ENTRY(widget));
700    #else
701      char *p = (char*)gtk_button_get_label(GTK_BUTTON(widget));
702    #endif
703    return pos_parse_lon(p);    return pos_parse_lon(p);
704  }  }
705    
706    void lat_entry_set(GtkWidget *widget, float lat) {
707      char str[32];
708      pos_lat_str(str, sizeof(str)-1, lat);
709    #ifndef COORDINATE_PICKER
710      gtk_entry_set_text(GTK_ENTRY(widget), str);
711    #else
712      gtk_button_set_label(GTK_BUTTON(widget), str);
713      int lat_int = (int)roundf(lat * 60000);
714      g_object_set_data(G_OBJECT(widget), "latitude", (gpointer)lat_int);
715    #endif
716    }
717    
718    void lon_entry_set(GtkWidget *widget, float lon) {
719      char str[32];
720      pos_lon_str(str, sizeof(str)-1, lon);
721    #ifndef COORDINATE_PICKER
722      gtk_entry_set_text(GTK_ENTRY(widget), str);
723    #else
724      gtk_button_set_label(GTK_BUTTON(widget), str);
725      int lon_int = (int)roundf(lon * 60000);
726      g_object_set_data(G_OBJECT(widget), "longitude", (gpointer)lon_int);
727    #endif
728    }
729    
730    void lat_label_set(GtkWidget *widget, float lat) {
731      char str[32];
732      pos_lat_str(str, sizeof(str)-1, lat);
733      gtk_label_set(GTK_LABEL(widget), str);
734    }
735    
736    void lon_label_set(GtkWidget *widget, float lon) {
737      char str[32];
738      pos_lon_str(str, sizeof(str)-1, lon);
739      gtk_label_set(GTK_LABEL(widget), str);
740    }
741    
742    void lat_label_attrib_set(GtkWidget *widget, float lat,
743                              int size, int strikethrough) {
744      char str[32];
745      pos_lat_str(str, sizeof(str)-1, lat);
746      gtk_label_attrib_set(widget, str, size, strikethrough);
747    }
748    
749    void lon_label_attrib_set(GtkWidget *widget, float lon,
750                              int size, int strikethrough) {
751      char str[32];
752      pos_lon_str(str, sizeof(str)-1, lon);
753      gtk_label_attrib_set(widget, str, size, strikethrough);
754    }
755    
756  static void callback_modified_dist(GtkWidget *widget, gpointer data ) {  static void callback_modified_dist(GtkWidget *widget, gpointer data ) {
757    /* don't care for metric/imperial since we only want to know if this */    /* don't care for metric/imperial since we only want to know if this */
758    /* is parseable at all */    /* is parseable at all */
# Line 539  GtkWidget *left_label_new(char *str) { Line 924  GtkWidget *left_label_new(char *str) {
924    return widget;    return widget;
925  }  }
926    
927    /* ------------- preset coordinate picker tool ----------------- */
928    
929  static void pos_set(GtkWidget *item, float lat, float lon) {  static void pos_set(GtkWidget *item, float lat, float lon) {
   char str[32];  
930    
   pos_lat_str(str, sizeof(str)-1, lat);  
931    GtkWidget *lat_entry = g_object_get_data(G_OBJECT(item), "lat_entry");    GtkWidget *lat_entry = g_object_get_data(G_OBJECT(item), "lat_entry");
932    gtk_entry_set_text(GTK_ENTRY(lat_entry), str);    lat_entry_set(lat_entry, lat);
933    
   pos_lon_str(str, sizeof(str)-1, lon);  
934    GtkWidget *lon_entry = g_object_get_data(G_OBJECT(item), "lon_entry");    GtkWidget *lon_entry = g_object_get_data(G_OBJECT(item), "lon_entry");
935    gtk_entry_set_text(GTK_ENTRY(lon_entry), str);    lon_entry_set(lon_entry, lon);
936  }  }
937    
938  static void cb_gps(GtkWidget *item, gpointer data) {  static void cb_gps(GtkWidget *item, gpointer data) {
# Line 599  static void cb_cache(GtkWidget *item, gp Line 983  static void cb_cache(GtkWidget *item, gp
983    
984    if(!id)    if(!id)
985      pos_set(item, cache->pos.lat, cache->pos.lon);      pos_set(item, cache->pos.lat, cache->pos.lon);
986      else if(id == 1)
987        pos_set(item, cache->notes->pos.lat, cache->notes->pos.lon);
988    else {    else {
989      wpt_t *wpt = cache->wpt;      wpt_t *wpt = cache->wpt;
990      while(wpt && id > 1) {      while(wpt && id > 2) {
991        wpt = wpt->next;        wpt = wpt->next;
992        id--;        id--;
993      }      }
994    
995      if(id == 1)      if(id == 2)
996        pos_set(item, wpt->pos.lat, wpt->pos.lon);        pos_set(item, wpt->pos.lat, wpt->pos.lon);
997    }    }
998  }  }
999    
1000  #ifndef PICKER_DIALOG  #ifndef PRESET_PICKER_DIALOG
1001  static GtkWidget *menu_add(GtkWidget *menu, appdata_t *appdata,  static GtkWidget *menu_add(GtkWidget *menu, appdata_t *appdata,
1002                             GtkWidget *icon, char *menu_str,                             GtkWidget *icon, char *menu_str,
1003                             void(*func)(GtkWidget*, gpointer), gint id,                             void(*func)(GtkWidget*, gpointer), gint id,
# Line 667  static GtkWidget *popup_menu_create(appd Line 1053  static GtkWidget *popup_menu_create(appd
1053      char *name = cache->name;      char *name = cache->name;
1054      if(!name) name = cache->id;      if(!name) name = cache->id;
1055    
1056        /* original cache position */
1057      if(!isnan(cache->pos.lat) && !isnan(cache->pos.lon)) {      if(!isnan(cache->pos.lat) && !isnan(cache->pos.lon)) {
1058        menu_add(menu, appdata, icon_get_widget(ICON_POS, cache->type + 6),        menu_add(menu, appdata, icon_get_widget(ICON_POS, cache->type + 6),
1059                 name, cb_cache, 0, lon_entry, lat_entry);                 name, cb_cache, 0, lon_entry, lat_entry);
1060      }      }
1061    
1062        /* overwritten cache position */
1063        if(cache->notes &&
1064           !isnan(cache->notes->pos.lat) && !isnan(cache->notes->pos.lon)) {
1065          menu_add(menu, appdata, icon_get_widget(ICON_POS, cache->type + 6),
1066                   _("Modified coordinate"), cb_cache, 1, lon_entry, lat_entry);
1067        }
1068    
1069      wpt_t *wpt = cache->wpt;      wpt_t *wpt = cache->wpt;
1070      gint id = 1;      gint id = 2;
1071      while(wpt) {      while(wpt) {
1072        GtkWidget *icon = NULL;        GtkWidget *icon = NULL;
1073        if(wpt->sym != WPT_SYM_UNKNOWN)        if(wpt->sym != WPT_SYM_UNKNOWN)
# Line 715  static void on_popup_destroy(GtkWidget * Line 1109  static void on_popup_destroy(GtkWidget *
1109  }  }
1110  #endif  #endif
1111    
1112  #ifdef PICKER_DIALOG  #ifdef PRESET_PICKER_DIALOG
1113    
1114  enum {  enum {
1115    PICKER_COL_ICON = 0,    PRESET_PICKER_COL_ICON = 0,
1116    PICKER_COL_NAME,    PRESET_PICKER_COL_NAME,
1117    PICKER_COL_ID,    PRESET_PICKER_COL_ID,
1118    PICKER_COL_CB,    PRESET_PICKER_COL_CB,
1119    PICKER_NUM_COLS    PRESET_PICKER_NUM_COLS
1120  };  };
1121    
1122  static void picker_add(GtkListStore *store,  appdata_t *appdata,  static void preset_picker_add(GtkListStore *store,  appdata_t *appdata,
1123                         GdkPixbuf *icon, char *menu_str,                         GdkPixbuf *icon, char *menu_str,
1124                         void(*func)(GtkWidget*, gpointer), gint id) {                         void(*func)(GtkWidget*, gpointer), gint id) {
1125    GtkTreeIter     iter;    GtkTreeIter     iter;
# Line 734  static void picker_add(GtkListStore *sto Line 1128  static void picker_add(GtkListStore *sto
1128    gtk_list_store_append (store, &iter);    gtk_list_store_append (store, &iter);
1129    
1130    gtk_list_store_set(store, &iter,    gtk_list_store_set(store, &iter,
1131                       PICKER_COL_ICON, icon,                       PRESET_PICKER_COL_ICON, icon,
1132                       PICKER_COL_NAME, menu_str,                       PRESET_PICKER_COL_NAME, menu_str,
1133                       PICKER_COL_ID, id,                       PRESET_PICKER_COL_ID, id,
1134                       PICKER_COL_CB, func,                       PRESET_PICKER_COL_CB, func,
1135                       -1);                       -1);
1136  }  }
1137    
1138  static void on_picker_activated(GtkTreeView        *treeview,  static void on_preset_picker_activated(GtkTreeView        *treeview,
1139                                  GtkTreePath        *path,                                  GtkTreePath        *path,
1140                                  GtkTreeViewColumn  *col,                                  GtkTreeViewColumn  *col,
1141                                  gpointer            userdata) {                                  gpointer            userdata) {
# Line 752  static void on_picker_activated(GtkTreeV Line 1146  static void on_picker_activated(GtkTreeV
1146      gint id;      gint id;
1147      void(*func)(GtkWidget*, gpointer);      void(*func)(GtkWidget*, gpointer);
1148      gtk_tree_model_get(model, &iter,      gtk_tree_model_get(model, &iter,
1149                         PICKER_COL_ID, &id,                         PRESET_PICKER_COL_ID, &id,
1150                         PICKER_COL_CB, &func,                         PRESET_PICKER_COL_CB, &func,
1151                         -1);                         -1);
1152    
1153      /* set id on widget as callbacks expect it this way */      /* set id on widget as callbacks expect it this way */
1154      g_object_set_data(G_OBJECT(treeview), "id", (gpointer)id);      g_object_set_data(G_OBJECT(treeview), "id", (gpointer)id);
1155      func(GTK_WIDGET(treeview), userdata);      func(GTK_WIDGET(treeview), userdata);
1156    
     /* xyz */  
1157      gtk_dialog_response(GTK_DIALOG(gtk_widget_get_toplevel(      gtk_dialog_response(GTK_DIALOG(gtk_widget_get_toplevel(
1158                      GTK_WIDGET(treeview))), GTK_RESPONSE_ACCEPT);                      GTK_WIDGET(treeview))), GTK_RESPONSE_ACCEPT);
1159    
1160    }    }
1161  }  }
1162    
1163  static GtkWidget *picker_create(appdata_t *appdata,  static GtkWidget *preset_picker_create(appdata_t *appdata,
1164                                  GtkWidget *lat_entry, GtkWidget *lon_entry) {                                  GtkWidget *lat_entry, GtkWidget *lon_entry) {
1165    GtkCellRenderer *renderer;    GtkCellRenderer *renderer;
1166    GtkListStore    *store;    GtkListStore    *store;
# Line 780  static GtkWidget *picker_create(appdata_ Line 1173  static GtkWidget *picker_create(appdata_
1173    /* --- "Icon" column --- */    /* --- "Icon" column --- */
1174    renderer = gtk_cell_renderer_pixbuf_new();    renderer = gtk_cell_renderer_pixbuf_new();
1175    gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),    gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),
1176        -1, "Icon", renderer, "pixbuf", PICKER_COL_ICON, NULL);        -1, "Icon", renderer, "pixbuf", PRESET_PICKER_COL_ICON, NULL);
1177    
1178    /* --- "Name" column --- */    /* --- "Name" column --- */
1179    renderer = gtk_cell_renderer_text_new();    renderer = gtk_cell_renderer_text_new();
1180    g_object_set(renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL );    g_object_set(renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL );
1181    GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes(    GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes(
1182                   "Name", renderer, "text", PICKER_COL_NAME, NULL);                   "Name", renderer, "text", PRESET_PICKER_COL_NAME, NULL);
1183    gtk_tree_view_column_set_expand(column, TRUE);    gtk_tree_view_column_set_expand(column, TRUE);
1184    gtk_tree_view_insert_column(GTK_TREE_VIEW(view), column, -1);    gtk_tree_view_insert_column(GTK_TREE_VIEW(view), column, -1);
1185    
1186    store = gtk_list_store_new(PICKER_NUM_COLS,    store = gtk_list_store_new(PRESET_PICKER_NUM_COLS,
1187                               GDK_TYPE_PIXBUF,                               GDK_TYPE_PIXBUF,
1188                               G_TYPE_STRING,                               G_TYPE_STRING,
1189                               G_TYPE_INT,                               G_TYPE_INT,
1190                               G_TYPE_POINTER);                               G_TYPE_POINTER);
1191    
1192    picker_add(store, appdata, icon_get(ICON_POS, 18),    preset_picker_add(store, appdata, icon_get(ICON_POS, 18),
1193               _("GPS position"), cb_gps, 0);               _("GPS position"), cb_gps, 0);
1194    
1195    picker_add(store, appdata, icon_get(ICON_POS, 21),    preset_picker_add(store, appdata, icon_get(ICON_POS, 21),
1196               _("Home"), cb_gps, 1);               _("Home"), cb_gps, 1);
1197    
1198    location_t *location = appdata->location;    location_t *location = appdata->location;
1199    gint id = 2;    gint id = 2;
1200    while(location) {    while(location) {
1201      picker_add(store, appdata, icon_get(ICON_POS, 21),      preset_picker_add(store, appdata, icon_get(ICON_POS, 21),
1202                 location->name, cb_gps, id++);                 location->name, cb_gps, id++);
1203    
1204      location = location->next;      location = location->next;
1205    }    }
1206    
1207    picker_add(store, appdata, icon_get(ICON_POS, 19),    preset_picker_add(store, appdata, icon_get(ICON_POS, 19),
1208               _("Geomath projection"), cb_geomath, 0);               _("Geomath projection"), cb_geomath, 0);
1209  #ifdef ENABLE_OSM_GPS_MAP  #ifdef ENABLE_OSM_GPS_MAP
1210    picker_add(store, appdata, icon_get(ICON_POS, 20),    preset_picker_add(store, appdata, icon_get(ICON_POS, 20),
1211               _("Map position"), cb_map, 0);               _("Map position"), cb_map, 0);
1212  #endif  #endif
1213    
# Line 824  static GtkWidget *picker_create(appdata_ Line 1217  static GtkWidget *picker_create(appdata_
1217      char *name = cache->name;      char *name = cache->name;
1218      if(!name) name = cache->id;      if(!name) name = cache->id;
1219    
1220        /* original cache position */
1221      if(!isnan(cache->pos.lat) && !isnan(cache->pos.lon)) {      if(!isnan(cache->pos.lat) && !isnan(cache->pos.lon)) {
1222        picker_add(store, appdata, icon_get(ICON_POS, cache->type + 6),        preset_picker_add(store, appdata, icon_get(ICON_POS, cache->type + 6),
1223                   name, cb_cache, 0);                   name, cb_cache, 0);
1224      }      }
1225    
1226        /* overwritten cache position */
1227        if(cache->notes &&
1228           !isnan(cache->notes->pos.lat) && !isnan(cache->notes->pos.lon)) {
1229          preset_picker_add(store, appdata, icon_get(ICON_POS, cache->type + 6),
1230                     _("Modified coordinate"), cb_cache, 1);
1231        }
1232    
1233      wpt_t *wpt = cache->wpt;      wpt_t *wpt = cache->wpt;
1234      gint id = 1;      gint id = 2;
1235      while(wpt) {      while(wpt) {
1236        GdkPixbuf *icon = NULL;        GdkPixbuf *icon = NULL;
1237        if(wpt->sym != WPT_SYM_UNKNOWN)        if(wpt->sym != WPT_SYM_UNKNOWN)
# Line 840  static GtkWidget *picker_create(appdata_ Line 1241  static GtkWidget *picker_create(appdata_
1241        if(!name) name = wpt->cmt;        if(!name) name = wpt->cmt;
1242        if(!name) name = wpt->id;        if(!name) name = wpt->id;
1243    
1244        picker_add(store, appdata, icon, name, cb_cache, id++);        preset_picker_add(store, appdata, icon, name, cb_cache, id++);
1245        wpt = wpt->next;        wpt = wpt->next;
1246      }      }
1247    }    }
# Line 851  static GtkWidget *picker_create(appdata_ Line 1252  static GtkWidget *picker_create(appdata_
1252    
1253    /* make list react on clicks */    /* make list react on clicks */
1254    g_signal_connect(view, "row-activated",    g_signal_connect(view, "row-activated",
1255                     (GCallback)on_picker_activated, appdata);                     (GCallback)on_preset_picker_activated, appdata);
   
 #if 0  
   g_signal_connect(view, "destroy",  
                    (GCallback)cachelist_destroy, ce);  
 #endif  
1256    
1257    /* put this inside a scrolled view */    /* put this inside a scrolled view */
1258  #ifndef USE_PANNABLE_AREA  #ifndef USE_PANNABLE_AREA
# Line 872  static GtkWidget *picker_create(appdata_ Line 1268  static GtkWidget *picker_create(appdata_
1268  #endif  #endif
1269  }  }
1270    
1271  static gint on_picker_button_press(GtkWidget *button,  static gint on_preset_picker_button_press(GtkWidget *button,
1272                     GdkEventButton *event, gpointer data) {                     GdkEventButton *event, gpointer data) {
1273    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
1274    
# Line 890  static gint on_picker_button_press(GtkWi Line 1286  static gint on_picker_button_press(GtkWi
1286      gtk_window_set_default_size(GTK_WINDOW(dialog), 400, 200);      gtk_window_set_default_size(GTK_WINDOW(dialog), 400, 200);
1287    
1288      gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox),      gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox),
1289                                  picker_create(appdata, lat_entry, lon_entry));                          preset_picker_create(appdata, lat_entry, lon_entry));
1290    
1291      gtk_widget_show_all(dialog);      gtk_widget_show_all(dialog);
1292      gtk_dialog_run(GTK_DIALOG(dialog));      gtk_dialog_run(GTK_DIALOG(dialog));
# Line 902  static gint on_picker_button_press(GtkWi Line 1298  static gint on_picker_button_press(GtkWi
1298  }  }
1299  #endif  #endif
1300    
1301  GtkWidget *coo_popup(appdata_t *appdata,  void preset_coordinate_picker_update(appdata_t *appdata, GtkWidget *widget) {
1302    #ifndef PRESET_PICKER_DIALOG
1303      printf("updating popup menu\n");
1304    
1305      GtkWidget *menu = g_object_get_data(G_OBJECT(widget), "menu");
1306      g_assert(menu);
1307      gtk_widget_destroy(menu);
1308    
1309      gpointer lat_entry = g_object_get_data(G_OBJECT(widget), "lat_entry");
1310      g_assert(lat_entry);
1311      gpointer lon_entry = g_object_get_data(G_OBJECT(widget), "lon_entry");
1312      g_assert(lon_entry);
1313    
1314      menu = popup_menu_create(appdata, lat_entry, lon_entry);
1315      g_object_set_data(G_OBJECT(widget), "menu", (gpointer)menu);
1316    #endif
1317    }
1318    
1319    GtkWidget *preset_coordinate_picker(appdata_t *appdata,
1320                       GtkWidget *lat_entry, GtkWidget *lon_entry) {                       GtkWidget *lat_entry, GtkWidget *lon_entry) {
1321    
1322    GtkWidget *button = gtk_button_new();    GtkWidget *button = gtk_button_new();
# Line 911  GtkWidget *coo_popup(appdata_t *appdata, Line 1325  GtkWidget *coo_popup(appdata_t *appdata,
1325    
1326    gtk_widget_set_tooltip_text(button, _("Preset coordinates"));    gtk_widget_set_tooltip_text(button, _("Preset coordinates"));
1327    
1328  #ifndef PICKER_DIALOG    g_object_set_data(G_OBJECT(button), "lat_entry", (gpointer)lat_entry);
1329      g_object_set_data(G_OBJECT(button), "lon_entry", (gpointer)lon_entry);
1330    
1331      g_object_set_data(G_OBJECT(button), "lat_entry", (gpointer)lat_entry);
1332      g_object_set_data(G_OBJECT(button), "lon_entry", (gpointer)lon_entry);
1333    
1334    #ifndef PRESET_PICKER_DIALOG
1335    gtk_signal_connect(GTK_OBJECT(button), "button-press-event",    gtk_signal_connect(GTK_OBJECT(button), "button-press-event",
1336                       (GtkSignalFunc)on_popup_button_press, appdata);                       (GtkSignalFunc)on_popup_button_press, appdata);
1337    
# Line 926  GtkWidget *coo_popup(appdata_t *appdata, Line 1346  GtkWidget *coo_popup(appdata_t *appdata,
1346          (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH));          (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH));
1347  #endif  #endif
1348    
   g_object_set_data(G_OBJECT(button), "lat_entry", (gpointer)lat_entry);  
   g_object_set_data(G_OBJECT(button), "lon_entry", (gpointer)lon_entry);  
   
1349    gtk_signal_connect(GTK_OBJECT(button), "button-press-event",    gtk_signal_connect(GTK_OBJECT(button), "button-press-event",
1350                       (GtkSignalFunc)on_picker_button_press, appdata);                       (GtkSignalFunc)on_preset_picker_button_press, appdata);
1351  #endif  #endif
1352    
1353    return button;    return button;

Legend:
Removed from v.218  
changed lines
  Added in v.221