static gboolean on_map_motion_notify_event(GtkWidget *widget, GdkEventMotion *event, area_context_t *context) { OsmGpsMap *map = OSM_GPS_MAP(widget); if(!std::isnan(context->map.start.rlon) && !std::isnan(context->map.start.rlat)) { /* remove existing marker */ osm_gps_map_track_remove_all(map); OsmGpsMapPoint start = context->map.start; OsmGpsMapPoint end = osm_gps_map_convert_screen_to_geographic(map, event->x, event->y); GSList *box = pos_append_rad(nullptr, start.rlat, start.rlon); box = pos_append_rad(box, end.rlat, start.rlon); box = pos_append_rad(box, end.rlat, end.rlon); box = pos_append_rad(box, start.rlat, end.rlon); box = pos_append_rad(box, start.rlat, start.rlon); osm_gps_map_add_track(map, box); } /* returning true here disables dragging in osm-gps-map */ return osm_gps_map_osd_get_state(map) == TRUE ? FALSE : TRUE; }
static void on_gps_width_changed (GtkAdjustment *adjustment, gpointer user_data) { OsmGpsMap *map = OSM_GPS_MAP(user_data); OsmGpsMapTrack *track = osm_gps_map_gps_get_track (map); float f = gtk_adjustment_get_value(adjustment); g_object_set (track, "line-width", f, NULL); }
static gboolean on_home_clicked_event (GtkWidget *widget, gpointer user_data) { OsmGpsMap *map = OSM_GPS_MAP(user_data); osm_gps_map_set_center_and_zoom(map, -43.5326,172.6362,12); return FALSE; }
void _view_map_show_osd(const dt_view_t *view, gboolean enabled) { dt_map_t *lib = (dt_map_t*)view->data; gboolean old_value = dt_conf_get_bool("plugins/map/show_map_osd"); if(enabled == old_value) return; dt_conf_set_bool("plugins/map/show_map_osd", enabled); if(enabled) osm_gps_map_layer_add(OSM_GPS_MAP(lib->map), lib->osd); else osm_gps_map_layer_remove(OSM_GPS_MAP(lib->map), lib->osd); g_signal_emit_by_name(lib->map, "changed"); }
static gboolean on_zoom_out_clicked_event (GtkWidget *widget, gpointer user_data) { int zoom; OsmGpsMap *map = OSM_GPS_MAP(user_data); g_object_get(map, "zoom", &zoom, NULL); osm_gps_map_set_zoom(map, zoom-1); return FALSE; }
static osd_button_t osd_check(osm_gps_map_osd_t *osd, G_GNUC_UNUSED gboolean down, gint x, gint y) { osd_priv_t *priv = (osd_priv_t*)osd->priv; osd_button_t but = OSD_NONE; y -= (osd->widget->allocation.height - OSD_H)/2; if(x < osd->widget->allocation.width/2) { if(y >= 0 && y <= OSD_H && x >= 0 && x <= OSD_W) { if(y < OSD_W) but = OSD_IN; else but = OSD_OUT; } } else { x -= osd->widget->allocation.width - OSD_W; if(y >= 0 && y <= OSD_H && x >= 0 && x <= OSD_W) { if(y < OSD_W) { if(priv->select_toggle.state) { priv->select_toggle.state = FALSE; osd_render_toggle(osd); osm_gps_map_repaint(OSM_GPS_MAP(osd->widget)); } but = OSD_SELECT; } else { if(!priv->select_toggle.state) { priv->select_toggle.state = TRUE; osd_render_toggle(osd); osm_gps_map_repaint(OSM_GPS_MAP(osd->widget)); } but = OSD_DRAG; } } } return but; }
static gboolean on_button_release_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { float lat,lon; GtkEntry *entry = GTK_ENTRY(user_data); OsmGpsMap *map = OSM_GPS_MAP(widget); g_object_get(map, "latitude", &lat, "longitude", &lon, NULL); gchar *msg = g_strdup_printf("%f,%f",lat,lon); gtk_entry_set_text(entry, msg); g_free(msg); return FALSE; }
static void cb_map_gps(osd_button_t but, void *data) { OsmGpsMap *map = OSM_GPS_MAP(data); struct gps_t *fix = g_object_get_data(G_OBJECT(map), "gps_fix"); if(but == OSD_GPS && fix) { osm_gps_map_set_center(map, fix->latitude, fix->longitude); /* re-enable centering */ g_object_set(map, "auto-center", TRUE, NULL); } }
static gboolean on_map_button_release_event(GtkWidget *widget, GdkEventButton *event, area_context_t *context) { OsmGpsMap *map = OSM_GPS_MAP(widget); osm_gps_map_osd_t *osd = osm_gps_map_osd_get(map); if(!std::isnan(context->map.start.rlon) && !std::isnan(context->map.start.rlat)) { OsmGpsMapPoint start = context->map.start; OsmGpsMapPoint end = osm_gps_map_convert_screen_to_geographic(map, event->x, event->y); GSList *box = pos_append_rad(nullptr, start.rlat, start.rlon); box = pos_append_rad(box, end.rlat, start.rlon); box = pos_append_rad(box, end.rlat, end.rlon); box = pos_append_rad(box, start.rlat, end.rlon); box = pos_append_rad(box, start.rlat, start.rlon); osm_gps_map_add_track(map, box); if(start.rlat < end.rlat) { context->bounds.min.lat = RAD2DEG(start.rlat); context->bounds.max.lat = RAD2DEG(end.rlat); } else { context->bounds.min.lat = RAD2DEG(end.rlat); context->bounds.max.lat = RAD2DEG(start.rlat); } if(start.rlon < end.rlon) { context->bounds.min.lon = RAD2DEG(start.rlon); context->bounds.max.lon = RAD2DEG(end.rlon); } else { context->bounds.min.lon = RAD2DEG(end.rlon); context->bounds.max.lon = RAD2DEG(start.rlon); } area_main_update(context); direct_update(context); extent_update(context); context->map.start.rlon = context->map.start.rlat = NAN; } /* osm-gps-map needs this event to handle the OSD */ if(osd->check(osd, TRUE, event->x, event->y) != OSD_NONE) return FALSE; /* returning true here disables dragging in osm-gps-map */ return osm_gps_map_osd_get_state(map) == TRUE ? FALSE : TRUE; }
static gboolean on_cache_clicked_event (GtkWidget *widget, gpointer user_data) { OsmGpsMap *map = OSM_GPS_MAP(user_data); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))) { int zoom,max_zoom; OsmGpsMapPoint pt1, pt2; osm_gps_map_get_bbox(map, &pt1, &pt2); g_object_get(map, "zoom", &zoom, "max-zoom", &max_zoom, NULL); osm_gps_map_download_maps(map, &pt1, &pt2, zoom, max_zoom); } else { osm_gps_map_download_cancel_all(map); } return FALSE; }
static gboolean on_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { OsmGpsMapPoint coord; float lat, lon; OsmGpsMap *map = OSM_GPS_MAP(widget); OsmGpsMapTrack *othertrack = OSM_GPS_MAP_TRACK(user_data); if (event->type == GDK_3BUTTON_PRESS) { if (event->button == 1) { if (g_last_image) osm_gps_map_image_remove (map, g_last_image); } if (event->button == 3) { osm_gps_map_track_remove(map, othertrack); } } if (event->type == GDK_2BUTTON_PRESS) { osm_gps_map_convert_screen_to_geographic(map, event->x, event->y, &coord); osm_gps_map_point_get_degrees(&coord, &lat, &lon); if (event->button == 1) { osm_gps_map_gps_add (map, lat, lon, g_random_double_range(0,360)); } if (event->button == 3) { osm_gps_map_track_add_point(othertrack, &coord); } } if (event->type == GDK_BUTTON_PRESS) { if (event->button == 2) { osm_gps_map_convert_screen_to_geographic(map, event->x, event->y, &coord); osm_gps_map_point_get_degrees(&coord, &lat, &lon); g_last_image = osm_gps_map_image_add ( map, lat, lon, g_star_image); } } return FALSE; }
static gboolean on_map_button_press_event(GtkWidget *widget, GdkEventButton *event, area_context_t *context) { OsmGpsMap *map = OSM_GPS_MAP(widget); osm_gps_map_osd_t *osd = osm_gps_map_osd_get(map); /* osm-gps-map needs this event to handle the OSD */ if(osd->check(osd, TRUE, event->x, event->y) != OSD_NONE) return FALSE; if(osm_gps_map_osd_get_state(map) == TRUE) return FALSE; /* remove existing marker */ osm_gps_map_track_remove_all(map); /* and remember this location as the start */ context->map.start = osm_gps_map_convert_screen_to_geographic(map, event->x, event->y); return TRUE; }
void init(dt_view_t *self) { self->data = malloc(sizeof(dt_map_t)); memset(self->data,0,sizeof(dt_map_t)); dt_map_t *lib = (dt_map_t *)self->data; lib->map = g_object_new (OSM_TYPE_GPS_MAP, "map-source", OSM_GPS_MAP_SOURCE_OPENSTREETMAP, "tile-cache", "dt.map.cache", // "tile-cache-base", "/tmp", "proxy-uri",g_getenv("http_proxy"), NULL); OsmGpsMapLayer *osd = g_object_new (OSM_TYPE_GPS_MAP_OSD, "show-scale",TRUE, NULL); osm_gps_map_layer_add(OSM_GPS_MAP(lib->map), osd); g_object_unref(G_OBJECT(osd)); }
static gboolean on_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { OsmGpsMapPoint coord; float lat, lon; OsmGpsMap *map = OSM_GPS_MAP(widget); double dist; double lat1,lon1; if (event->type == GDK_2BUTTON_PRESS) { osm_gps_map_convert_screen_to_geographic(map, event->x, event->y, &coord); osm_gps_map_point_get_degrees(&coord, &lat, &lon); fprintf(stderr, "lat %f lon %f\n",lat,lon); lat1=(double)lat; lon1=(double)lon; //send the function using last latitude,longitude and present latitude and longitude if(k==0) { k=1; dist=distance(0,0); fprintf(stderr, "distance betwwn two points %f", dist); lastlat=lat1; lastlon=lon1; } else { dist=distance(lat1,lon1); fprintf(stderr, "distance betwwn two points %f", dist); //i=i+1; } if (event->button == 1) { osm_gps_map_gps_add (map,lat,lon,g_random_double_range(0,360)); } } return FALSE; }
static void gps_callback(gps_mask_t set, struct gps_t *fix, void *data) { OsmGpsMap *map = OSM_GPS_MAP(data); #ifdef USE_MAEMO GtkWidget *toplevel = gtk_widget_get_toplevel(GTK_WIDGET(map)); #endif gps_mask_t gps_set = (gps_mask_t)GPOINTER_TO_INT(g_object_get_data(G_OBJECT(map), "gps_set")); g_error("impl"); /* ... and enable "goto" button if it's valid */ /* if((set & FIX_LATLON_SET) != (gps_set & FIX_LATLON_SET)) { */ /* osm_gps_map_osd_enable_gps(map, */ /* OSM_GPS_MAP_OSD_CALLBACK((set&FIX_LATLON_SET)?cb_map_gps:NULL), map); */ /* g_object_set_data(G_OBJECT(map), "gps_set", GINT_TO_POINTER(set)); */ /* } */ if(set & FIX_LATLON_SET) { /* save fix in case the user later wants to enable gps */ g_object_set_data(G_OBJECT(map), "gps_fix", fix); /* get error */ int radius = (set & FIX_HERR_SET)?dist2pixel(map, fix->eph/1000):0; g_object_set(map, "gps-track-highlight-radius", radius, NULL); osm_gps_map_draw_gps(map, fix->latitude, fix->longitude, fix->track); } else { g_object_set_data(G_OBJECT(map), "gps_fix", NULL); osm_gps_map_clear_gps(map); } #ifdef USE_MAEMO if((set & FIX_LATLON_SET) && toplevel) { /* check gps position every 10 seconds and trigger */ /* screen saver if useful */ time_t last = (time_t)g_object_get_data(G_OBJECT(map), "gps_timer"); time_t now = time(NULL); if(now-last > 10) { /* get last saved position */ coord_t *last_pos = g_object_get_data(G_OBJECT(map), "gps_pos"); coord_t cur = { .rlat = deg2rad(fix->latitude), .rlon = deg2rad(fix->longitude) }; if(last_pos) { /* consider everything under 3 kph (~2 mph) to be static and */ /* disable (trigger) screensaver only above this. 3.6kph = 10m/10sec */ /* compare with reported position */ if(get_distance(last_pos, &cur) > (now-last)) { printf("SCREENSAVER: trigger after %d ...\n", (int)(now-last)); osso_context_t *osso_context = g_object_get_data(G_OBJECT(toplevel), "osso-context"); g_assert(osso_context); osso_display_blanking_pause(osso_context); } else printf("SCREENSAVER: too slow, no trigger\n"); } else { printf("SCREENSAVER: no last pos\n"); last_pos = g_new0(coord_t, 1); } /* make current position the old one */ last_pos->rlat = cur.rlat; last_pos->rlon = cur.rlon; g_object_set_data(G_OBJECT(map), "gps_timer", (gpointer)now); g_object_set_data(G_OBJECT(map), "gps_pos", last_pos); } }
/** * @fn int main (int argc, char **argv) * @brief Main program & Gtk thread. * * Create window and all widgets, then set there parameters to be the <br> * ROS params. */ int main (int argc, char **argv) { GtkBuilder *builder; GdkColor black = { 0, 0, 0, 0 }; GError *error = NULL; char glade_gui_file[FILENAME_MAX]; int start_zoom = 15; char *mapcachedir; OsmGpsMapPoint ccny_coord = { 40.818551, -73.948674 }; struct arg param; param.argc = argc; param.argv = argv; pthread_t rosThread; // **** init threads g_thread_init (NULL); gdk_threads_init (); gdk_threads_enter (); // **** init gtk gtk_init (&argc, &argv); // **** allocate data structure data = g_slice_new (AppData); // **** set the glade gui file & set icon directory std::string package_path = ros::package::getPath (ROS_PACKAGE_NAME); sprintf (glade_gui_file, "%s/gui/%s", package_path.c_str (), "gui.glade"); sprintf (data->icon_directory, "%s/gui/icon", package_path.c_str ()); std::string rosbag_path = ros::package::getPath("rosbag"); sprintf (data->rosbag_rec_path, "%s/bin/record", rosbag_path.c_str ()); data->current_page = 0; data->telemetry_opt_popup_state = false; data->gps_opt_popup_state = false; data->fullscreen = false; load_icon (); // **** Create new GtkBuilder object builder = gtk_builder_new (); // **** Load UI from file if (!gtk_builder_add_from_file (builder, glade_gui_file, &error)) { g_warning ("%s", error->message); g_free (error); exit (-1); } // **** Get main window pointer from UI data->window = GTK_WIDGET (gtk_builder_get_object (builder, "window1")); gtk_window_set_title (GTK_WINDOW (data->window), "CityFlyer Ground Station"); gtk_window_set_position (GTK_WINDOW (data->window), GTK_WIN_POS_CENTER); gtk_window_set_default_size (GTK_WINDOW (data->window), 1024, 576); // **** create ROS thread pthread_create (&rosThread, NULL, startROS, ¶m); // **** wait ros finish read params while (!data->ros_param_read) { ROS_DEBUG ("Waiting ROS params"); } // **** Get GtkNotebook objsect data->notebook = GTK_WIDGET (gtk_builder_get_object (builder, "notebook1")); // ##################################################################### // ##################################################################### // **** Tab 1: Telemetry // **** create altimeter widgets data->alt = gtk_altimeter_new (); g_object_set (GTK_ALTIMETER (data->alt), "grayscale-color", data->grayscale_color, "unit-is-feet", data->altimeter_unit_is_feet, "unit-step-value", data->altimeter_step_value, "radial-color", data->radial_color, NULL); // **** create compass widgets data->comp = gtk_compass_new (); g_object_set (GTK_COMPASS (data->comp), "grayscale-color", data->grayscale_color, "radial-color", data->radial_color, NULL); data->comp2 = gtk_compass_new (); g_object_set (GTK_COMPASS (data->comp2), "grayscale-color", data->grayscale_color, "radial-color", data->radial_color, NULL); data->gauge1 = gtk_gauge_new (); g_object_set (GTK_GAUGE (data->gauge1), "name", data->gauge1_name_f, NULL); g_object_set (GTK_GAUGE (data->gauge1), "grayscale-color", data->grayscale_color, "radial-color", data->radial_color, "start-value", data->gauge1_start_value, "end-value", data->gauge1_end_value, "initial-step", data->gauge1_initial_step, "sub-step", (gdouble) data->gauge1_sub_step, "drawing-step", data->gauge1_drawing_step, "color-strip-order", data->gauge1_color_strip_order, "green-strip-start", data->gauge1_green_strip_start, "yellow-strip-start", data->gauge1_yellow_strip_start, "red-strip-start", data->gauge1_red_strip_start, NULL); // **** create artificial horizon widgets data->arh = gtk_artificial_horizon_new (); g_object_set (GTK_ARTIFICIAL_HORIZON (data->arh), "grayscale-color", data->grayscale_color, "radial-color", data->radial_color, NULL); // **** create variometer widgets data->vario = gtk_variometer_new (); g_object_set (GTK_VARIOMETER (data->vario), "grayscale-color", data->grayscale_color, "unit-is-feet", data->variometer_unit_is_feet, "unit-step-value", data->variometer_step_value, "radial-color", data->radial_color, NULL); data->widget_table = GTK_WIDGET (gtk_builder_get_object (builder, "table_Widgets")); gtk_table_attach_defaults (GTK_TABLE (data->widget_table), data->alt, 0, 1, 0, 1); gtk_table_attach_defaults (GTK_TABLE (data->widget_table), data->arh, 1, 2, 0, 1); gtk_table_attach_defaults (GTK_TABLE (data->widget_table), data->comp, 2, 3, 0, 1); gtk_table_attach_defaults (GTK_TABLE (data->widget_table), data->vario, 0, 1, 1, 2); gtk_table_attach_defaults (GTK_TABLE (data->widget_table), data->comp2, 1, 2, 1, 2); gtk_table_attach_defaults (GTK_TABLE (data->widget_table), data->gauge1, 2, 3, 1, 2); gtk_widget_modify_bg (data->alt, GTK_STATE_NORMAL, &black); gtk_widget_modify_bg (data->comp, GTK_STATE_NORMAL, &black); gtk_widget_modify_bg (data->comp2, GTK_STATE_NORMAL, &black); gtk_widget_modify_bg (data->arh, GTK_STATE_NORMAL, &black); gtk_widget_modify_bg (data->gauge1, GTK_STATE_NORMAL, &black); gtk_widget_modify_bg (data->vario, GTK_STATE_NORMAL, &black); data->telemetry_option_popup = GTK_WIDGET (gtk_builder_get_object (builder, "hbox_TelemetryOption")); data->btn_open_telemetry_option_popup = GTK_WIDGET (gtk_builder_get_object (builder, "button_OpenTelemetryOptionPopup")); data->btn_close_telemetry_option_popup = GTK_WIDGET (gtk_builder_get_object (builder, "button_CloseTelemetryOptionPopup")); gtk_button_set_image (GTK_BUTTON (data->btn_open_telemetry_option_popup), gtk_image_new_from_pixbuf (gdk_pixbuf_scale_simple (data->leftarrow_icon_64, 24, 50, GDK_INTERP_HYPER))); gtk_button_set_image (GTK_BUTTON (data->btn_close_telemetry_option_popup), gtk_image_new_from_pixbuf (gdk_pixbuf_scale_simple (data->rightarrow_icon_64, 24, 50, GDK_INTERP_HYPER))); // ##################################################################### // ##################################################################### // **** Tab 2: Gps // Some GpsdViewer initialisation data->draw_path = false; data->map_provider = OSM_GPS_MAP_SOURCE_OPENSTREETMAP; data->map_zoom_max = 18; data->map_current_zoom = start_zoom; data->repo_uri = osm_gps_map_source_get_repo_uri (data->map_provider); data->friendly_name = osm_gps_map_source_get_friendly_name (data->map_provider); data->uav_track = osm_gps_map_track_new (); mapcachedir = osm_gps_map_get_default_cache_directory (); data->cachedir = g_build_filename (mapcachedir, data->friendly_name, NULL); g_free (mapcachedir); // Create the OsmGpsMap object data->map = (OsmGpsMap *) g_object_new (OSM_TYPE_GPS_MAP, "map-source", data->map_provider, "tile-cache", data->cachedir, "proxy-uri", g_getenv ("http_proxy"), NULL); //Set the starting coordinates and zoom level for the map osm_gps_map_set_zoom (data->map, start_zoom); osm_gps_map_set_center (data->map, ccny_coord.rlat, ccny_coord.rlon); data->osd = gpsd_viewer_osd_new (); g_object_set (GPSD_VIEWER_OSD (data->osd), "show-scale", true, "show-coordinates", true, "show-dpad", true, "show-zoom", true, "show-gps-in-dpad", true, "show-gps-in-zoom", false, "dpad-radius", 30, NULL); osm_gps_map_layer_add (OSM_GPS_MAP (data->map), OSM_GPS_MAP_LAYER (data->osd)); data->map_box = GTK_WIDGET (gtk_builder_get_object (builder, "hbox_map_box")); data->map_container = GTK_WIDGET (gtk_builder_get_object (builder, "hbox_map_container")); gtk_box_pack_start (GTK_BOX (data->map_box), GTK_WIDGET (data->map), TRUE, TRUE, 0); data->gpsd_option_popup = GTK_WIDGET (gtk_builder_get_object (builder, "hbox_GpsdOptionPopup")); data->btn_open_gpsd_option_popup = GTK_WIDGET (gtk_builder_get_object (builder, "button_OpenGpsdOptionPopup")); data->btn_close_gpsd_option_popup = GTK_WIDGET (gtk_builder_get_object (builder, "button_CloseGpsdOptionPopup")); gtk_button_set_image (GTK_BUTTON (data->btn_open_gpsd_option_popup), gtk_image_new_from_pixbuf (gdk_pixbuf_scale_simple (data->leftarrow_icon_64, 24, 50, GDK_INTERP_HYPER))); gtk_button_set_image (GTK_BUTTON (data->btn_close_gpsd_option_popup), gtk_image_new_from_pixbuf (gdk_pixbuf_scale_simple (data->rightarrow_icon_64, 24, 50, GDK_INTERP_HYPER))); // ##################################################################### // ##################################################################### // **** Tab 3: Rec data->recording = 0; data->rosbag_record_cmd = "rosbag record"; data->topicsList = GTK_LIST_STORE (gtk_builder_get_object (builder, "liststore_TopicList")); data->cmd_line_entry = GTK_WIDGET (gtk_builder_get_object (builder, "entry_CommandLine")); data->prefix_entry = GTK_WIDGET (gtk_builder_get_object (builder, "entry_Prefix")); data->info_textview = GTK_WIDGET (gtk_builder_get_object (builder, "textview_BagInfo")); data->update_btn = GTK_WIDGET (gtk_builder_get_object (builder, "button_UpdateTopicList")); data->box_MotorStatus = GTK_WIDGET (gtk_builder_get_object (builder, "hbox_MotorStatus")); data->box_Flying = GTK_WIDGET (gtk_builder_get_object (builder, "hbox_Flying")); data->box_Gps = GTK_WIDGET (gtk_builder_get_object (builder, "hbox_Gps")); data->flightMode_label = GTK_WIDGET (gtk_builder_get_object (builder, "label_FlightModeValue")); data->upTime_label = GTK_WIDGET (gtk_builder_get_object (builder, "label_UpTimeValue")); data->cpuLoad_label = GTK_WIDGET (gtk_builder_get_object (builder, "label_CpuLoadValue")); data->box_RecordStatus = GTK_WIDGET (gtk_builder_get_object (builder, "hbox_RecordStatus")); data->record_stop_btn = GTK_WIDGET (gtk_builder_get_object (builder, "button_RecordStop")); gtk_box_pack_end (GTK_BOX (data->box_MotorStatus), data->status_ok_icon_motor, TRUE, TRUE, 0); gtk_box_pack_end (GTK_BOX (data->box_MotorStatus), data->status_fail_icon_motor, TRUE, TRUE, 0); gtk_box_pack_end (GTK_BOX (data->box_Flying), data->status_ok_icon_flying, TRUE, TRUE, 0); gtk_box_pack_end (GTK_BOX (data->box_Flying), data->status_fail_icon_flying, TRUE, TRUE, 0); gtk_box_pack_end (GTK_BOX (data->box_Gps), data->status_ok_icon_gps, TRUE, TRUE, 0); gtk_box_pack_end (GTK_BOX (data->box_Gps), data->status_fail_icon_gps, TRUE, TRUE, 0); gtk_box_pack_end (GTK_BOX (data->box_RecordStatus), data->record_icon, TRUE, TRUE, 0); gtk_box_pack_end (GTK_BOX (data->box_RecordStatus), data->record_g_icon, TRUE, TRUE, 0); gtk_button_set_image (GTK_BUTTON (data->update_btn), gtk_image_new_from_pixbuf (gdk_pixbuf_scale_simple (data->refresh_icon_64, 24, 24, GDK_INTERP_HYPER))); gtk_button_set_image (GTK_BUTTON (data->record_stop_btn), gtk_image_new_from_pixbuf (gdk_pixbuf_scale_simple (data->record_icon_64, 40, 40, GDK_INTERP_HYPER))); // Connect signals gtk_builder_connect_signals (builder, data); // Destroy builder, since we don't need it anymore g_object_unref (G_OBJECT (builder)); // Show window. All other widgets are automatically shown by GtkBuilder gtk_widget_show_all (data->window); gtk_widget_hide(data->record_icon); gtk_widget_hide(data->status_ok_icon_motor); gtk_widget_hide(data->status_ok_icon_flying); gtk_widget_hide(data->status_ok_icon_gps); gtk_widget_hide_all(data->telemetry_option_popup); gtk_widget_hide_all(data->gpsd_option_popup); // **** allow ROS spinning data->widget_created = true; // **** udpate all widgets g_timeout_add (data->telemetry_refresh_rate, widgets_update, NULL); gtk_main (); gdk_threads_leave (); return 0; }
void enter(dt_view_t *self) { dt_map_t *lib = (dt_map_t *)self->data; lib->map = g_object_new (OSM_TYPE_GPS_MAP, "map-source", OSM_GPS_MAP_SOURCE_OPENSTREETMAP, "proxy-uri",g_getenv("http_proxy"), NULL); if(dt_conf_get_bool("plugins/map/show_map_osd")) { OsmGpsMapLayer *osd = g_object_new (OSM_TYPE_GPS_MAP_OSD, "show-scale",TRUE, "show-coordinates",TRUE, "show-dpad",TRUE, "show-zoom",TRUE, NULL); osm_gps_map_layer_add(OSM_GPS_MAP(lib->map), osd); g_object_unref(G_OBJECT(osd)); } /* replace center widget */ GtkWidget *parent = gtk_widget_get_parent(dt_ui_center(darktable.gui->ui)); gtk_widget_hide(dt_ui_center(darktable.gui->ui)); gtk_box_pack_start(GTK_BOX(parent), GTK_WIDGET(lib->map) ,TRUE, TRUE, 0); gtk_box_reorder_child(GTK_BOX(parent), GTK_WIDGET(lib->map), 2); gtk_widget_show_all(GTK_WIDGET(lib->map)); /* setup proxy functions */ darktable.view_manager->proxy.map.view = self; darktable.view_manager->proxy.map.center_on_location = _view_map_center_on_location; /* setup collection listener and initialize main_query statement */ dt_control_signal_connect(darktable.signals, DT_SIGNAL_COLLECTION_CHANGED, G_CALLBACK(_view_map_collection_changed), (gpointer) self); osm_gps_map_set_post_expose_callback(lib->map, _view_map_post_expose, lib); /* restore last zoom,location in map */ OsmGpsMapPoint *pt; float lon, lat; const float rlon = dt_conf_get_float("plugins/map/longitude"); const float rlat = dt_conf_get_float("plugins/map/latitude"); const int zoom = dt_conf_get_int("plugins/map/zoom"); pt = osm_gps_map_point_new_radians(rlat,rlon); osm_gps_map_point_get_degrees (pt, &lat, &lon); osm_gps_map_set_center_and_zoom(lib->map, lat, lon, zoom); osm_gps_map_point_free(pt); _view_map_collection_changed(NULL, self); /* connect signal for filmstrip image activate */ dt_control_signal_connect(darktable.signals, DT_SIGNAL_VIEWMANAGER_FILMSTRIP_ACTIVATE, G_CALLBACK(_view_map_filmstrip_activate_callback), self); /* allow drag&drop of images from filmstrip */ gtk_drag_dest_set(GTK_WIDGET(lib->map), GTK_DEST_DEFAULT_ALL, target_list, n_targets, GDK_ACTION_COPY); g_signal_connect(GTK_WIDGET(lib->map), "drag-data-received", G_CALLBACK(drag_and_drop_received), self); }
static gboolean on_home_clicked_event (GtkWidget *widget, gpointer user_data) { OsmGpsMap *map = OSM_GPS_MAP(user_data); osm_gps_map_set_center_and_zoom(map, 48.858387,2.346268,12); return FALSE; }
/** * @fn int main (int argc, char **argv) * @brief Main program & Gtk thread. * * Create window and all widgets, then set there parameters to be the <br> * ROS params. */ int main (int argc, char **argv) { GtkBuilder *builder; GError *error = NULL; char gui_filename[FILENAME_MAX]; int start_zoom = 15; OsmGpsMapPoint ccny_coord = { 33.421355, -111.928253 }; OsmGpsMapTrack *rightclicktrack; struct arg param; param.argc = argc; param.argv = argv; pthread_t rosThread; // **** init threads g_thread_init (NULL); gdk_threads_init (); gdk_threads_enter (); // **** init gtk gtk_init (&argc, &argv); // **** get the glade gui file std::string package_path = ros::package::getPath (ROS_PACKAGE_NAME); sprintf (gui_filename, "%s/%s", package_path.c_str (), "gui.glade"); // Allocate data structure data = g_slice_new (AppData); // Create new GtkBuilder object builder = gtk_builder_new (); // Load UI from file if (!gtk_builder_add_from_file (builder, gui_filename, &error)) { g_warning ("%s", error->message); g_free (error); pthread_exit (NULL); } // Get main window pointer from UI data->window = GTK_WIDGET (gtk_builder_get_object (builder, "window")); // **** create ROS thread pthread_create (&rosThread, NULL, startROS, ¶m); // **** wait ros finish read params while (!data->ros_param_read) { ROS_DEBUG ("Waiting ROS params"); } // Some initialisation gdk_window_set_debug_updates (false); data->draw_path = false; data->map_provider = OSM_GPS_MAP_SOURCE_GOOGLE_SATELLITE; data->map_zoom_max = 18; data->map_current_zoom = start_zoom; data->repo_uri = osm_gps_map_source_get_repo_uri (data->map_provider); data->friendly_name = osm_gps_map_source_get_friendly_name (data->map_provider); char *mapcachedir; mapcachedir = osm_gps_map_get_default_cache_directory (); data->cachedir = g_build_filename (mapcachedir, data->friendly_name, NULL); g_free (mapcachedir); // Create the OsmGpsMap object data->map = (OsmGpsMap *) g_object_new (OSM_TYPE_GPS_MAP, "map-source", data->map_provider, "tile-cache", data->cachedir, "proxy-uri", g_getenv ("http_proxy"), "auto-center",FALSE, NULL); //Set the starting coordinates and zoom level for the map osm_gps_map_set_zoom (data->map, start_zoom); osm_gps_map_set_center (data->map, ccny_coord.rlat, ccny_coord.rlon); data->osd = gpsd_viewer_osd_new(); g_object_set(GPSD_VIEWER_OSD(data->osd), "show-scale",true, "show-coordinates",true, "show-dpad",true, "show-zoom",true, "show-gps-in-dpad",true, "show-gps-in-zoom",false, "dpad-radius", 30, NULL); osm_gps_map_layer_add(OSM_GPS_MAP(data->map), OSM_GPS_MAP_LAYER(data->osd)); data->current_track = osm_gps_map_track_new(); //Add a second track for right clicks rightclicktrack = osm_gps_map_track_new(); osm_gps_map_track_add(OSM_GPS_MAP(data->map), rightclicktrack); // Add the map to the box data->map_box = GTK_WIDGET (gtk_builder_get_object (builder, "hbox2")); gtk_box_pack_start (GTK_BOX (data->map_box), GTK_WIDGET (data->map), TRUE, TRUE, 0); data->map_container = GTK_WIDGET (gtk_builder_get_object (builder, "hbox1")); // Connect signals g_signal_connect (G_OBJECT (data->map), "button-press-event", G_CALLBACK (on_button_press_event), (gpointer) rightclicktrack); gtk_builder_connect_signals (builder, data); // Destroy builder, since we don't need it anymore g_object_unref (G_OBJECT (builder)); // Show window. All other widgets are automatically shown by GtkBuilder gtk_widget_show_all (data->window); // **** allow ROS spinning data->widget_created = true; // Start main loop gtk_main (); gdk_threads_leave (); return 0; }
int main (int argc, char **argv) { GtkBuilder *builder; GtkWidget *widget; GtkAccelGroup *ag; OsmGpsMap *map; OsmGpsMapLayer *osd; OsmGpsMapTrack *rightclicktrack; const char *repo_uri; char *cachedir, *cachebasedir; GError *error = NULL; GOptionContext *context; g_thread_init(NULL); gtk_init (&argc, &argv); context = g_option_context_new ("- Map browser"); g_option_context_set_help_enabled(context, FALSE); g_option_context_add_main_entries (context, entries, NULL); if (!g_option_context_parse (context, &argc, &argv, &error)) { usage(context); return 1; } /* Only use the repo_uri to check if the user has supplied a valid map source ID */ repo_uri = osm_gps_map_source_get_repo_uri(opt_map_provider); if ( repo_uri == NULL ) { usage(context); return 2; } cachebasedir = osm_gps_map_get_default_cache_directory(); if (opt_cache_base_dir && g_file_test(opt_cache_base_dir, G_FILE_TEST_IS_DIR)) { cachedir = g_strdup(OSM_GPS_MAP_CACHE_AUTO); cachebasedir = g_strdup(opt_cache_base_dir); } else if (opt_friendly_cache) { cachedir = g_strdup(OSM_GPS_MAP_CACHE_FRIENDLY); } else if (opt_no_cache) { cachedir = g_strdup(OSM_GPS_MAP_CACHE_DISABLED); } else { cachedir = g_strdup(OSM_GPS_MAP_CACHE_AUTO); } if (opt_debug) gdk_window_set_debug_updates(TRUE); g_debug("Map Cache Dir: %s", cachedir); g_debug("Map Provider: %s (%d)", osm_gps_map_source_get_friendly_name(opt_map_provider), opt_map_provider); map = g_object_new (OSM_TYPE_GPS_MAP, "map-source",opt_map_provider, "tile-cache",cachedir, "tile-cache-base", cachebasedir, "proxy-uri",g_getenv("http_proxy"), NULL); osd = g_object_new (OSM_TYPE_GPS_MAP_OSD, "show-scale",TRUE, "show-coordinates",TRUE, "show-crosshair",TRUE, "show-dpad",TRUE, "show-zoom",TRUE, "show-gps-in-dpad",TRUE, "show-gps-in-zoom",FALSE, "dpad-radius", 30, NULL); osm_gps_map_layer_add(OSM_GPS_MAP(map), osd); g_object_unref(G_OBJECT(osd)); //Add a second track for right clicks rightclicktrack = osm_gps_map_track_new(); osm_gps_map_track_add(OSM_GPS_MAP(map), rightclicktrack); g_free(cachedir); g_free(cachebasedir); //Enable keyboard navigation osm_gps_map_set_keyboard_shortcut(map, OSM_GPS_MAP_KEY_FULLSCREEN, GDK_F11); osm_gps_map_set_keyboard_shortcut(map, OSM_GPS_MAP_KEY_UP, GDK_Up); osm_gps_map_set_keyboard_shortcut(map, OSM_GPS_MAP_KEY_DOWN, GDK_Down); osm_gps_map_set_keyboard_shortcut(map, OSM_GPS_MAP_KEY_LEFT, GDK_Left); osm_gps_map_set_keyboard_shortcut(map, OSM_GPS_MAP_KEY_RIGHT, GDK_Right); //Build the UI g_star_image = gdk_pixbuf_new_from_file_at_size ("poi.png", 24,24,NULL); builder = gtk_builder_new(); gtk_builder_add_from_file (builder, "mapviewer.ui", &error); if (error) g_error ("ERROR: %s\n", error->message); gtk_box_pack_start ( GTK_BOX(gtk_builder_get_object(builder, "map_box")), GTK_WIDGET(map), TRUE, TRUE, 0); //Init values float lw,a; GdkColor c; OsmGpsMapTrack *gpstrack = osm_gps_map_gps_get_track (map); g_object_get (gpstrack, "line-width", &lw, "alpha", &a, NULL); osm_gps_map_track_get_color(gpstrack, &c); gtk_adjustment_set_value ( GTK_ADJUSTMENT(gtk_builder_get_object(builder, "gps_width_adjustment")), lw); gtk_adjustment_set_value ( GTK_ADJUSTMENT(gtk_builder_get_object(builder, "gps_alpha_adjustment")), a); gtk_adjustment_set_value ( GTK_ADJUSTMENT(gtk_builder_get_object(builder, "star_xalign_adjustment")), 0.5); gtk_adjustment_set_value ( GTK_ADJUSTMENT(gtk_builder_get_object(builder, "star_yalign_adjustment")), 0.5); gtk_color_button_set_color ( GTK_COLOR_BUTTON(gtk_builder_get_object(builder, "gps_colorbutton")), &c); //Connect to signals g_signal_connect ( gtk_builder_get_object(builder, "zoom_in_button"), "clicked", G_CALLBACK (on_zoom_in_clicked_event), (gpointer) map); g_signal_connect ( gtk_builder_get_object(builder, "zoom_out_button"), "clicked", G_CALLBACK (on_zoom_out_clicked_event), (gpointer) map); g_signal_connect ( gtk_builder_get_object(builder, "home_button"), "clicked", G_CALLBACK (on_home_clicked_event), (gpointer) map); g_signal_connect ( gtk_builder_get_object(builder, "cache_button"), "clicked", G_CALLBACK (on_cache_clicked_event), (gpointer) map); g_signal_connect ( gtk_builder_get_object(builder, "gps_alpha_adjustment"), "value-changed", G_CALLBACK (on_gps_alpha_changed), (gpointer) map); g_signal_connect ( gtk_builder_get_object(builder, "gps_width_adjustment"), "value-changed", G_CALLBACK (on_gps_width_changed), (gpointer) map); g_signal_connect ( gtk_builder_get_object(builder, "star_xalign_adjustment"), "value-changed", G_CALLBACK (on_star_align_changed), (gpointer) "x-align"); g_signal_connect ( gtk_builder_get_object(builder, "star_yalign_adjustment"), "value-changed", G_CALLBACK (on_star_align_changed), (gpointer) "y-align"); g_signal_connect ( gtk_builder_get_object(builder, "gps_colorbutton"), "color-set", G_CALLBACK (on_gps_color_changed), (gpointer) gpstrack); g_signal_connect (G_OBJECT (map), "button-press-event", G_CALLBACK (on_button_press_event), (gpointer) rightclicktrack); g_signal_connect (G_OBJECT (map), "button-release-event", G_CALLBACK (on_button_release_event), (gpointer) gtk_builder_get_object(builder, "text_entry")); g_signal_connect (G_OBJECT (map), "notify::tiles-queued", G_CALLBACK (on_tiles_queued_changed), (gpointer) gtk_builder_get_object(builder, "cache_label")); widget = GTK_WIDGET(gtk_builder_get_object(builder, "window1")); g_signal_connect (widget, "destroy", G_CALLBACK (on_close), (gpointer) map); //Setup accelerators. ag = gtk_accel_group_new(); gtk_accel_group_connect(ag, GDK_w, GDK_CONTROL_MASK, GTK_ACCEL_MASK, g_cclosure_new(gtk_main_quit, NULL, NULL)); gtk_accel_group_connect(ag, GDK_q, GDK_CONTROL_MASK, GTK_ACCEL_MASK, g_cclosure_new(gtk_main_quit, NULL, NULL)); gtk_window_add_accel_group(GTK_WINDOW(widget), ag); gtk_widget_show_all (widget); g_log_set_handler ("OsmGpsMap", G_LOG_LEVEL_MASK, g_log_default_handler, NULL); osm_gps_map_set_center_and_zoom(map, 48.858387,2.346268,12); gtk_main (); return 0; }
void init(dt_view_t *self) { self->data = malloc(sizeof(dt_map_t)); memset(self->data,0,sizeof(dt_map_t)); dt_map_t *lib = (dt_map_t *)self->data; OsmGpsMapSource_t map_source = OSM_GPS_MAP_SOURCE_OPENSTREETMAP; const gchar *old_map_source = dt_conf_get_string("plugins/map/map_source"); if(old_map_source && old_map_source[0] != '\0') { // find the number of the stored map_source for(int i=0; i<=OSM_GPS_MAP_SOURCE_LAST; i++) { const gchar *new_map_source = osm_gps_map_source_get_friendly_name(i); if(!g_strcmp0(old_map_source, new_map_source)) { if(osm_gps_map_source_is_valid(i)) map_source = i; break; } } } else // open street map should be a nice default ... dt_conf_set_string("plugins/map/map_source", osm_gps_map_source_get_friendly_name(OSM_GPS_MAP_SOURCE_OPENSTREETMAP)); lib->map = g_object_new (OSM_TYPE_GPS_MAP, "map-source", map_source, "proxy-uri",g_getenv("http_proxy"), NULL); GtkWidget *parent = gtk_widget_get_parent(dt_ui_center(darktable.gui->ui)); gtk_box_pack_start(GTK_BOX(parent), GTK_WIDGET(lib->map) ,TRUE, TRUE, 0); lib->osd = g_object_new (OSM_TYPE_GPS_MAP_OSD, "show-scale",TRUE, "show-coordinates",TRUE, "show-dpad",TRUE, "show-zoom",TRUE, NULL); if(dt_conf_get_bool("plugins/map/show_map_osd")) { osm_gps_map_layer_add(OSM_GPS_MAP(lib->map), lib->osd); } /* build the query string */ int max_images_drawn = dt_conf_get_int("plugins/map/max_images_drawn"); if(max_images_drawn == 0) max_images_drawn = 100; char *geo_query = g_strdup_printf("select * from (select id from images where \ longitude >= ?1 and longitude <= ?2 and latitude <= ?3 and latitude >= ?4 \ and longitude not NULL and latitude not NULL order by abs(latitude - ?5), abs(longitude - ?6) \ limit 0, %d) order by id", max_images_drawn); /* prepare the main query statement */ DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), geo_query, -1, &lib->statements.main_query, NULL); g_free(geo_query); /* allow drag&drop of images from filmstrip */ gtk_drag_dest_set(GTK_WIDGET(lib->map), GTK_DEST_DEFAULT_ALL, target_list_internal, n_targets_internal, GDK_ACTION_COPY); g_signal_connect(GTK_WIDGET(lib->map), "drag-data-received", G_CALLBACK(drag_and_drop_received), self); g_signal_connect(GTK_WIDGET(lib->map), "changed", G_CALLBACK(_view_map_changed_callback), self); g_signal_connect(G_OBJECT(lib->map), "button-press-event", G_CALLBACK(_view_map_button_press_callback), self); g_signal_connect (G_OBJECT(lib->map), "motion-notify-event", G_CALLBACK(_view_map_motion_notify_callback), self); /* allow drag&drop of images from the map, too */ g_signal_connect(GTK_WIDGET(lib->map), "drag-data-get", G_CALLBACK(_view_map_dnd_get_callback), self); g_signal_connect(GTK_WIDGET(lib->map), "drag-failed", G_CALLBACK(_view_map_dnd_failed_callback), self); }
bool area_edit_t::run() { GtkWidget *vbox; area_context_t context(*this, gtk_dialog_new_with_buttons(_("Area editor"), GTK_WINDOW(parent), GTK_DIALOG_MODAL, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, nullptr)); osm2go_platform::dialog_size_hint(context.dialog, osm2go_platform::MISC_DIALOG_HIGH); context.warning = gtk_dialog_add_button(context.dialog, _("Warning"), GTK_RESPONSE_HELP); gtk_button_set_image(GTK_BUTTON(context.warning), gtk_image_new_from_icon_name("dialog-warning", GTK_ICON_SIZE_BUTTON)); g_signal_connect_swapped(context.warning, "clicked", G_CALLBACK(on_area_warning_clicked), &context); /* ------------- fetch from map ------------------------ */ context.map.needs_redraw = false; context.map.widget = OSM_GPS_MAP(g_object_new(OSM_TYPE_GPS_MAP, "map-source", OSM_GPS_MAP_SOURCE_OPENSTREETMAP, "proxy-uri", g_getenv("http_proxy"), "auto-center", FALSE, "tile-cache", nullptr, nullptr)); osm_gps_map_osd_select_init(context.map.widget); g_signal_connect_swapped(context.map.widget, "configure-event", G_CALLBACK(on_map_configure), &context); g_signal_connect(context.map.widget, "button-press-event", G_CALLBACK(on_map_button_press_event), &context); g_signal_connect(context.map.widget, "motion-notify-event", G_CALLBACK(on_map_motion_notify_event), &context); g_signal_connect(context.map.widget, "button-release-event", G_CALLBACK(on_map_button_release_event), &context); /* install handler for timed updates of the gps button */ osm2go_platform::Timer timer; timer.restart(1, map_gps_update, &context); context.map.start.rlon = context.map.start.rlat = NAN; osm2go_platform::notebook_append_page(context.notebook, GTK_WIDGET(context.map.widget), _(TAB_LABEL_MAP)); /* ------------ direct min/max edit --------------- */ vbox = gtk_vbox_new(FALSE, 10); GtkTable *table = GTK_TABLE(gtk_table_new(3, 4, FALSE)); // x, y gtk_table_set_col_spacings(table, 10); gtk_table_set_row_spacings(table, 5); context.direct.minlat = pos_lat_entry_new(bounds.min.lat); table_attach(table, context.direct.minlat, 0, 0); GtkWidget *label = gtk_label_new(_("to")); table_attach(table, label, 1, 0); context.direct.maxlat = pos_lat_entry_new(bounds.max.lat); table_attach(table, context.direct.maxlat, 2, 0); context.direct.minlon = pos_lon_entry_new(bounds.min.lon); table_attach(table, context.direct.minlon, 0, 1); label = gtk_label_new(_("to")); table_attach(table, label, 1, 1); context.direct.maxlon = pos_lon_entry_new(bounds.max.lon); table_attach(table, context.direct.maxlon, 2, 1); /* setup this page */ g_signal_connect_swapped(context.direct.minlat, "changed", G_CALLBACK(callback_modified_direct), &context); g_signal_connect_swapped(context.direct.minlon, "changed", G_CALLBACK(callback_modified_direct), &context); g_signal_connect_swapped(context.direct.maxlat, "changed", G_CALLBACK(callback_modified_direct), &context); g_signal_connect_swapped(context.direct.maxlon, "changed", G_CALLBACK(callback_modified_direct), &context); /* --- hint --- */ label = gtk_label_new(_("(recommended min/max diff <0.03 degrees)")); gtk_table_attach_defaults(table, label, 0, 3, 2, 3); const GdkColor *color = osm2go_platform::invalid_text_color(); /* error label */ context.direct.error = gtk_label_new(nullptr); gtk_widget_modify_fg(context.direct.error, GTK_STATE_NORMAL, color); gtk_table_attach_defaults(table, context.direct.error, 0, 3, 3, 4); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(table), FALSE, FALSE, 0); osm2go_platform::notebook_append_page(context.notebook, vbox, _(TAB_LABEL_DIRECT)); /* ------------- center/extent edit ------------------------ */ vbox = gtk_vbox_new(FALSE, 10); table = GTK_TABLE(gtk_table_new(3, 5, FALSE)); // x, y gtk_table_set_col_spacings(table, 10); gtk_table_set_row_spacings(table, 5); label = gtk_label_new(_("Center:")); gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f); gtk_table_attach_defaults(table, label, 0, 1, 0, 1); context.extent.lat = pos_lat_entry_new(0.0); gtk_table_attach_defaults(table, context.extent.lat, 1, 2, 0, 1); context.extent.lon = pos_lon_entry_new(0.0); gtk_table_attach_defaults(table, context.extent.lon, 2, 3, 0, 1); gtk_table_set_row_spacing(table, 0, 10); label = gtk_label_new(_("Width:")); gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f); gtk_table_attach_defaults(table, label, 0, 1, 1, 2); context.extent.width = osm2go_platform::entry_new(); gtk_table_attach_defaults(table, context.extent.width, 1, 2, 1, 2); label = gtk_label_new(_("Height:")); gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f); gtk_table_attach_defaults(table, label, 0, 1, 2, 3); context.extent.height = osm2go_platform::entry_new(); gtk_table_attach_defaults(table, context.extent.height, 1, 2, 2, 3); std::vector<const char *> units(2); units[0] = _("mi"); units[1] = _("km"); context.extent.mil_km = osm2go_platform::combo_box_new(_("Unit"), units, 1); gtk_table_attach(table, context.extent.mil_km, 2, 3, 1, 3, static_cast<GtkAttachOptions>(0), static_cast<GtkAttachOptions>(0), 0, 0); /* setup this page */ extent_update(&context); /* connect signals after inital update to avoid confusion */ g_signal_connect_swapped(context.extent.lat, "changed", G_CALLBACK(callback_modified_extent), &context); g_signal_connect_swapped(context.extent.lon, "changed", G_CALLBACK(callback_modified_extent), &context); g_signal_connect_swapped(context.extent.width, "changed", G_CALLBACK(callback_modified_extent), &context); g_signal_connect_swapped(context.extent.height, "changed", G_CALLBACK(callback_modified_extent), &context); g_signal_connect_swapped(context.extent.mil_km, "changed", G_CALLBACK(callback_modified_unit), &context); /* --- hint --- */ label = gtk_label_new(_("(recommended width/height < 2km/1.25mi)")); gtk_table_attach_defaults(table, label, 0, 3, 3, 4); /* error label */ context.extent.error = gtk_label_new(nullptr); gtk_widget_modify_fg(context.extent.error, GTK_STATE_NORMAL, color); gtk_table_attach_defaults(table, context.extent.error, 0, 3, 4, 5); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(table), FALSE, FALSE, 0); osm2go_platform::notebook_append_page(context.notebook, vbox, _(TAB_LABEL_EXTENT)); #ifdef HAS_MAEMO_MAPPER /* ------------- fetch from maemo mapper ------------------------ */ vbox = gtk_vbox_new(FALSE, 8); context.mmapper.fetch = osm2go_platform::button_new_with_label(_("Get from Maemo Mapper")); gtk_box_pack_start(GTK_BOX(vbox), context.mmapper.fetch, FALSE, FALSE, 0); g_signal_connect_swapped(context.mmapper.fetch, "clicked", G_CALLBACK(callback_fetch_mm_clicked), &context); /* --- hint --- */ label = gtk_label_new(_("(recommended MM zoom level < 7)")); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); osm2go_platform::notebook_append_page(context.notebook, vbox, _("M.Mapper")); #endif /* ------------------------------------------------------ */ gtk_box_pack_start(context.dialog.vbox(), context.notebook, TRUE, TRUE, 0); g_signal_connect(osm2go_platform::notebook_get_gtk_notebook(context.notebook), "switch-page", G_CALLBACK(on_page_switch), &context); gtk_widget_show_all(context.dialog.get()); area_main_update(&context); bool ok = false; int response; do { response = gtk_dialog_run(context.dialog); if(GTK_RESPONSE_ACCEPT == response) { if(area_warning(&context)) { /* copy modified values back to given storage */ bounds = context.bounds; ok = true; break; } } } while(response == GTK_RESPONSE_HELP || response == GTK_RESPONSE_ACCEPT); return ok; }
int main (int argc, char **argv) { GtkBuilder *builder; GtkWidget *widget; GtkAccelGroup *ag; OsmGpsMapLayer *osd; const char *repo_uri; char *cachedir, *cachebasedir; GError *error = NULL; GOptionContext *context; GIOChannel *gio_read; context = g_option_context_new ("- Map browser"); g_option_context_set_help_enabled(context, FALSE); g_option_context_add_main_entries (context, entries, NULL); if (!g_option_context_parse (context, &argc, &argv, &error)) { usage(context); return 1; } if (aprsis_server == NULL) { aprsis_server = strdup("euro.aprs2.net"); } if (aprsis_port == 0) { aprsis_port = strdup("14580"); } aprsis_ctx *ctx = aprsis_new(aprsis_server, aprsis_port, "aprsmap", "-1"); //aprsis_ctx *ctx = aprsis_new("localhost", "14580", "aprsmap", "-1"); //set variables properties->lat, properties->lon, properties->range, properties->ctx aprs_details *properties = aprs_details_new(DEF_HOME_LAT,DEF_HOME_LON,DEF_RAD,ctx); if (packet_log_file != NULL) { FILE *log = fopen(packet_log_file, "w"); aprsis_set_log(ctx, log); } g_thread_init(NULL); gtk_init (&argc, &argv); // initialise APRS parser fap_init(); // connect to APRS_IS server start_aprsis(ctx); /* Only use the repo_uri to check if the user has supplied a valid map source ID */ repo_uri = osm_gps_map_source_get_repo_uri(opt_map_provider); if ( repo_uri == NULL ) { usage(context); return 2; } cachebasedir = osm_gps_map_get_default_cache_directory(); if (opt_cache_base_dir && g_file_test(opt_cache_base_dir, G_FILE_TEST_IS_DIR)) { cachedir = g_strdup(OSM_GPS_MAP_CACHE_AUTO); cachebasedir = g_strdup(opt_cache_base_dir); } else if (opt_friendly_cache) { cachedir = g_strdup(OSM_GPS_MAP_CACHE_FRIENDLY); } else if (opt_no_cache) { cachedir = g_strdup(OSM_GPS_MAP_CACHE_DISABLED); } else { cachedir = g_strdup(OSM_GPS_MAP_CACHE_AUTO); } if (opt_debug) gdk_window_set_debug_updates(TRUE); g_debug("Map Cache Dir: %s", cachedir); g_debug("Map Provider: %s (%d)", osm_gps_map_source_get_friendly_name(opt_map_provider), opt_map_provider); map = g_object_new (OSM_TYPE_GPS_MAP, "map-source",opt_map_provider, "tile-cache",cachedir, "tile-cache-base", cachebasedir, "proxy-uri",g_getenv("http_proxy"), NULL); osd = g_object_new (OSM_TYPE_GPS_MAP_OSD, "show-scale",TRUE, "show-coordinates",TRUE, NULL); osm_gps_map_layer_add(OSM_GPS_MAP(map), osd); g_object_unref(G_OBJECT(osd)); g_free(cachedir); g_free(cachebasedir); //Enable keyboard navigation osm_gps_map_set_keyboard_shortcut(map, OSM_GPS_MAP_KEY_FULLSCREEN, GDK_F11); osm_gps_map_set_keyboard_shortcut(map, OSM_GPS_MAP_KEY_UP, GDK_Up); osm_gps_map_set_keyboard_shortcut(map, OSM_GPS_MAP_KEY_DOWN, GDK_Down); osm_gps_map_set_keyboard_shortcut(map, OSM_GPS_MAP_KEY_LEFT, GDK_Left); osm_gps_map_set_keyboard_shortcut(map, OSM_GPS_MAP_KEY_RIGHT, GDK_Right); //Build the UI g_symbol_image = cairo_image_surface_create_from_png("allicons.png"); //, &error); g_symbol_image2 = cairo_image_surface_create_from_png("allicon2.png"); //, &error); stations = g_hash_table_new(g_str_hash, g_str_equal); builder = gtk_builder_new(); gtk_builder_add_from_file (builder, "mapviewer.ui", &error); if (error) g_error ("ERROR: %s\n", error->message); gtk_box_pack_start ( GTK_BOX(gtk_builder_get_object(builder, "map_box")), GTK_WIDGET(map), TRUE, TRUE, 0); // centre on the latitude and longitude set in the properties menu osm_gps_map_set_center_and_zoom(map, properties->lat,properties->lon, 5); //Connect to signals that need data passed to them g_signal_connect ( gtk_builder_get_object(builder, "home_button"), "clicked", G_CALLBACK (on_home_clicked_event), properties); g_signal_connect ( gtk_builder_get_object(builder, "homemenuitem"), "activate", G_CALLBACK (on_home_clicked_event), properties); g_signal_connect ( gtk_builder_get_object(builder, "sethomemenuitem"), "activate", G_CALLBACK (on_set_home_activate_event), properties); g_signal_connect ( gtk_builder_get_object(builder, "okPrefs"), "clicked", G_CALLBACK (on_properties_ok_clicked), properties); g_signal_connect ( gtk_builder_get_object(builder, "prefs_button"), "clicked", G_CALLBACK (on_properties_clicked_event), properties); g_signal_connect (G_OBJECT (map), "button-press-event", G_CALLBACK (on_button_press_event), (gpointer) map); /* potentially unneccesary callbacks. g_signal_connect ( G_OBJECT (map), "button-release-event", G_CALLBACK (on_button_release_event),(gpointer) gtk_builder_get_object(builder, "text_entry")); /* g_signal_connect (G_OBJECT (map), "notify::tiles-queued", G_CALLBACK (on_tiles_queued_changed), (gpointer) gtk_builder_get_object(builder, "cache_label")); */ widget = GTK_WIDGET(gtk_builder_get_object(builder, "window1")); g_signal_connect (widget, "destroy", G_CALLBACK (on_close), (gpointer) map); //pulls popup data from mapviewer.ui popup = GTK_WIDGET(gtk_builder_get_object(builder, "proppop")); about = GTK_WIDGET(gtk_builder_get_object(builder, "about")); //connect mapviewer.ui values to popup window gtk_builder_connect_signals(builder, popup); gtk_builder_connect_signals(builder, about); //Setup accelerators. ag = gtk_accel_group_new(); gtk_accel_group_connect(ag, GDK_w, GDK_CONTROL_MASK, GTK_ACCEL_MASK, g_cclosure_new(gtk_main_quit, NULL, NULL)); gtk_accel_group_connect(ag, GDK_q, GDK_CONTROL_MASK, GTK_ACCEL_MASK, g_cclosure_new(gtk_main_quit, NULL, NULL)); gtk_window_add_accel_group(GTK_WINDOW(widget), ag); //Set up GTK_ENTRY boxes in the preferences pop up latent = GTK_ENTRY(gtk_builder_get_object(builder, "declat")); lonent = GTK_ENTRY(gtk_builder_get_object(builder, "declon")); rangeent = GTK_ENTRY(gtk_builder_get_object(builder, "range")); gtk_entry_set_text(latent, g_strdup_printf("%f",properties->lat)); gtk_entry_set_text(lonent, g_strdup_printf("%f",properties->lon)); gtk_entry_set_text(rangeent, g_strdup_printf("%d",properties->range)); g_object_unref( G_OBJECT( builder ) ); gtk_widget_show_all (widget); //gtk_dialog_run (GTK_DIALOG(data->about) ); //g_log_set_handler ("OsmGpsMap", G_LOG_LEVEL_MASK, g_log_default_handler, NULL); g_log_set_handler ("OsmGpsMap", G_LOG_LEVEL_MESSAGE, g_log_default_handler, NULL); gtk_main (); fap_cleanup(); aprsis_close(ctx); return(0); }