Diff of /trunk/src/misc.c

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

revision 198 by harbaum, Thu Nov 19 12:38:03 2009 UTC revision 212 by harbaum, Wed Nov 25 13:52:17 2009 UTC
# Line 311  static void callback_modified_lat(GtkWid Line 311  static void callback_modified_lat(GtkWid
311  GtkWidget *lat_entry_new(float lat) {  GtkWidget *lat_entry_new(float lat) {
312    GdkColor color;    GdkColor color;
313    
314  #if !defined(USE_MAEMO) || (MAEMO_VERSION_MAJOR < 5)    GtkWidget *widget = entry_new();
   GtkWidget *widget = gtk_entry_new();  
 #else  
   GtkWidget *widget = hildon_entry_new(HILDON_SIZE_AUTO);  
 #endif  
   
315    gdk_color_parse("#ff0000", &color);    gdk_color_parse("#ff0000", &color);
316    gtk_widget_modify_text(widget, TAG_STATE, &color);    gtk_widget_modify_text(widget, TAG_STATE, &color);
317    
# Line 339  static void callback_modified_lon(GtkWid Line 334  static void callback_modified_lon(GtkWid
334  GtkWidget *lon_entry_new(float lon) {  GtkWidget *lon_entry_new(float lon) {
335    GdkColor color;    GdkColor color;
336    
337  #if !defined(USE_MAEMO) || (MAEMO_VERSION_MAJOR < 5)    GtkWidget *widget = entry_new();
   GtkWidget *widget = gtk_entry_new();  
 #else  
   GtkWidget *widget = hildon_entry_new(HILDON_SIZE_AUTO);  
338    //  gtk_entry_set_width_chars(GTK_ENTRY(widget), 14);    //  gtk_entry_set_width_chars(GTK_ENTRY(widget), 14);
 #endif  
339    
340    gdk_color_parse("#ff0000", &color);    gdk_color_parse("#ff0000", &color);
341    gtk_widget_modify_text(widget, TAG_STATE, &color);    gtk_widget_modify_text(widget, TAG_STATE, &color);
# Line 380  static void callback_modified_dist(GtkWi Line 371  static void callback_modified_dist(GtkWi
371  /* a entry that is colored red when filled with invalid distance */  /* a entry that is colored red when filled with invalid distance */
372  GtkWidget *dist_entry_new(float dist, gboolean mil) {  GtkWidget *dist_entry_new(float dist, gboolean mil) {
373    GdkColor color;    GdkColor color;
374  #if !defined(USE_MAEMO) || (MAEMO_VERSION_MAJOR < 5)    GtkWidget *widget = entry_new();
   GtkWidget *widget = gtk_entry_new();  
 #else  
   GtkWidget *widget = hildon_entry_new(HILDON_SIZE_AUTO);  
 #endif  
375    gdk_color_parse("#ff0000", &color);    gdk_color_parse("#ff0000", &color);
376    gtk_widget_modify_text(widget, TAG_STATE, &color);    gtk_widget_modify_text(widget, TAG_STATE, &color);
377    
# Line 544  GtkWidget *left_label_new(char *str) { Line 531  GtkWidget *left_label_new(char *str) {
531    gtk_misc_set_alignment(GTK_MISC(widget), 0.0f, 0.5f);    gtk_misc_set_alignment(GTK_MISC(widget), 0.0f, 0.5f);
532    return widget;    return widget;
533  }  }
534    
535    static void pos_set(GtkMenuItem *item, float lat, float lon) {
536      char str[32];
537    
538      pos_lat_str(str, sizeof(str)-1, lat);
539      GtkWidget *lat_entry = g_object_get_data(G_OBJECT(item), "lat_entry");
540      gtk_entry_set_text(GTK_ENTRY(lat_entry), str);
541    
542      pos_lon_str(str, sizeof(str)-1, lon);
543      GtkWidget *lon_entry = g_object_get_data(G_OBJECT(item), "lon_entry");
544      gtk_entry_set_text(GTK_ENTRY(lon_entry), str);
545    }
546    
547    static void cb_gps(GtkMenuItem *item, gpointer data) {
548      appdata_t *appdata = (appdata_t*)data;
549    
550      pos_t *refpos = get_pos(appdata);
551      if(!refpos) pos_set(item, NAN, NAN);
552      else        pos_set(item, refpos->lat, refpos->lon);
553    }
554    
555    static void cb_geomath(GtkMenuItem *item, gpointer data) {
556      appdata_t *appdata = (appdata_t*)data;
557    
558      pos_set(item, appdata->geomath.lat, appdata->geomath.lon);
559    }
560    
561    #ifdef ENABLE_OSM_GPS_MAP
562    static void cb_map(GtkMenuItem *item, gpointer data) {
563      appdata_t *appdata = (appdata_t*)data;
564    
565      pos_set(item, appdata->map.pos.lat, appdata->map.pos.lon);
566    }
567    #endif
568    
569    static const gchar *menu_item_get_label(GtkMenuItem *menu_item) {
570      GList *children, *l;
571      GtkWidget *child;
572      children = gtk_container_get_children (GTK_CONTAINER (menu_item));
573      for (l = g_list_first (children); l != NULL;
574           l = g_list_next (l)) {
575        child = (GtkWidget *)l->data;
576        if (GTK_IS_LABEL (child)) {
577          return gtk_label_get_label (GTK_LABEL (child));
578        }
579      }
580      return NULL;
581    }
582    
583    static void cb_cache(GtkMenuItem *item, gpointer data) {
584      const char *label = menu_item_get_label(item);
585      appdata_t *appdata = (appdata_t*)data;
586    
587      cache_t *cache = appdata->cur_cache;
588      g_assert(cache);
589    
590      if(!strcmp(label, cache->id))
591        pos_set(item, cache->pos.lat, cache->pos.lon);
592      else {
593        wpt_t *wpt = cache->wpt;
594        while(wpt) {
595          if(!strcmp(label, wpt->id)) {
596            pos_set(item, wpt->pos.lat, wpt->pos.lon);
597            return;
598          }
599    
600          wpt = wpt->next;
601        }
602      }
603    }
604    
605    static GtkWidget *menu_add(GtkWidget *menu, appdata_t *appdata,
606                               GtkWidget *icon, char *menu_str,
607                               void(*func)(GtkMenuItem*, gpointer),
608                               GtkWidget *lon_entry, GtkWidget *lat_entry) {
609    
610      GtkWidget *item = gtk_image_menu_item_new_with_label(menu_str);
611    
612      if(icon)
613        gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), icon);
614    
615      g_object_set_data(G_OBJECT(item), "lat_entry", (gpointer)lat_entry);
616      g_object_set_data(G_OBJECT(item), "lon_entry", (gpointer)lon_entry);
617    
618      if(func)
619        gtk_signal_connect(GTK_OBJECT(item), "activate",
620                           (GtkSignalFunc)func, appdata);
621    
622      gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
623    
624      return item;
625    }
626    
627    static GtkWidget *popup_menu_create(appdata_t *appdata,
628                        GtkWidget *lat_entry, GtkWidget *lon_entry) {
629      GtkWidget *menu = gtk_menu_new();
630    
631      menu_add(menu, appdata, NULL, _("Current position (GPS)"),
632               cb_gps, lon_entry, lat_entry);
633      menu_add(menu, appdata, NULL, _("Geomath projection"),
634               cb_geomath, lon_entry, lat_entry);
635    #ifdef ENABLE_OSM_GPS_MAP
636      menu_add(menu, appdata, NULL, _("Map position"),
637               cb_map, lon_entry, lat_entry);
638    #endif
639    
640      if(appdata->cur_cache) {
641        cache_t *cache = appdata->cur_cache;
642    
643        if(!isnan(cache->pos.lat) && !isnan(cache->pos.lon)) {
644          menu_add(menu, appdata, icon_get_widget(ICON_CACHE_TYPE, cache->type),
645                   cache->id, cb_cache, lon_entry, lat_entry);
646        }
647    
648        printf("appending cache waypoints\n");
649        wpt_t *wpt = cache->wpt;
650        while(wpt) {
651          GtkWidget *icon = NULL;
652          if(wpt->sym != WPT_SYM_UNKNOWN)
653            icon = icon_get_widget(ICON_WPT, wpt->sym);
654    
655          menu_add(menu, appdata, icon, wpt->id, cb_cache,
656                   lon_entry, lat_entry);
657    
658          wpt = wpt->next;
659        }
660      }
661    
662      gtk_widget_show_all(menu);
663    
664      return menu;
665    }
666    
667    static gint on_popup_button_press(GtkWidget *button, GdkEventButton *event,
668                                      gpointer data) {
669    
670      if(event->type == GDK_BUTTON_PRESS) {
671        GtkWidget *menu = g_object_get_data(G_OBJECT(button), "menu");
672    
673        /* draw a popup menu */
674        gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,
675                       event->button, event->time);
676        return TRUE;
677      }
678      return FALSE;
679    }
680    
681    static void on_popup_destroy(GtkWidget *widget, gpointer user_data ) {
682      GtkWidget *menu = g_object_get_data(G_OBJECT(widget), "menu");
683      gtk_widget_destroy(menu);
684    }
685    
686    GtkWidget *coo_popup(appdata_t *appdata,
687                         GtkWidget *lat_entry, GtkWidget *lon_entry) {
688    
689      GtkWidget *button = gtk_button_new();
690    #ifdef FREMANTLE
691      hildon_gtk_widget_set_theme_size(button,
692              (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH));
693    #endif
694    
695      gtk_button_set_image(GTK_BUTTON(button),
696           gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_BUTTON));
697    
698      gtk_widget_set_tooltip_text(button, _("Preset coordinates"));
699    
700      gtk_signal_connect(GTK_OBJECT(button), "button-press-event",
701                         (GtkSignalFunc)on_popup_button_press, appdata);
702    
703      gtk_signal_connect(GTK_OBJECT(button), "destroy",
704                         (GtkSignalFunc)on_popup_destroy, appdata);
705    
706      g_object_set_data(G_OBJECT(button), "menu",
707                        popup_menu_create(appdata, lat_entry, lon_entry));
708    
709      return button;
710    }
711    
712    GtkWidget *entry_new(void) {
713    #if !defined(USE_MAEMO) || (MAEMO_VERSION_MAJOR < 5)
714      return gtk_entry_new();
715    #else
716      return hildon_entry_new(HILDON_SIZE_AUTO);
717    #endif
718    }

Legend:
Removed from v.198  
changed lines
  Added in v.212