]> err.no Git - mapper/blobdiff - src/gtkmap.c
GpsBluez: cleanups
[mapper] / src / gtkmap.c
index 64cbf261caa8d71216e166d20b546a5e63095178..e4d9c10375aacf3b40fa76ce26c3474231b4d396 100644 (file)
@@ -70,6 +70,8 @@ struct _GtkMapPriv
        cairo_t *ct;
 #endif
 
+       GtkMenu *menu;
+
        PangoContext *context;
        PangoLayout *layout;
        PangoFontDescription *fontdesc;
@@ -164,11 +166,19 @@ struct _GtkMapPriv
        gboolean show_velvec;
        gboolean show_markers;
        gboolean show_speed;
+       gboolean click_to_center;
+       gboolean zoom_in_on_2button;
        gboolean rotate_view;
        gfloat rotate_angle;
 
        guint draw_width;
 
+       gboolean button_down;
+       gint mouse_x;
+       gint mouse_y;
+       gdouble mouse_lat;
+       gdouble mouse_lon;
+
        gboolean fast_render;
 
        guint key_zoom_new;
@@ -182,15 +192,19 @@ struct _GtkMapPriv
 
 #define tile2grid(tile) ((tile) << 3)
 #define grid2tile(grid) ((grid) >> 3)
+
 #define tile2pixel(tile) ((tile) << 8)
 #define pixel2tile(pixel) ((pixel) >> 8)
+
 #define tile2unit(tile) ((tile) << (8 + priv->zoom))
 #define unit2tile(unit) ((unit) >> (8 + priv->zoom))
+
 #define tile2zunit(tile, zoom) ((tile) << (8 + zoom))
 #define unit2ztile(unit, zoom) ((unit) >> (8 + zoom))
 
 #define grid2pixel(grid) ((grid) << 5)
 #define pixel2grid(pixel) ((pixel) >> 5)
+
 #define grid2unit(grid) ((grid) << (5 + priv->zoom))
 #define unit2grid(unit) ((unit) >> (5 + priv->zoom))
 
@@ -253,6 +267,8 @@ static void gtk_map_get_property(GObject *object, guint prop_id, GValue *value,
 static gboolean gtk_map_button_press_cb(GtkWidget *widget, GdkEventButton *event);
 static gboolean gtk_map_button_release_cb(GtkWidget *widget, GdkEventButton *event);
 static gboolean gtk_map_scroll_event_cb(GtkWidget *widget, GdkEventScroll *event); 
+static gboolean gtk_map_motion_notify_cb(GtkWidget *widget, GdkEventMotion *event, gpointer data);
+
 
 /* Signal IDs */
 enum {
@@ -393,6 +409,10 @@ priv->show_velvec=TRUE;
 priv->show_markers=TRUE;
 priv->show_location=TRUE;
 
+priv->button_down=FALSE;
+priv->click_to_center=FALSE;
+priv->zoom_in_on_2button=FALSE;
+
 priv->rotate_angle=M_PI;
 priv->rotate_view=FALSE;
 
@@ -603,7 +623,7 @@ if (priv->gl_config) {
     g_print("OpenGL version: %s\n", glGetString (GL_VERSION));
     g_print("OpenGL vendor: %s\n", glGetString (GL_VENDOR));
     g_print("OpenGL renderer: %s\n", glGetString (GL_RENDERER));
-       gtk_widget_set_gl_capability(widget->window, priv->gl_config, NULL, TRUE, GDK_GL_RGBA_TYPE);
+       gtk_widget_set_gl_capability(widget, priv->gl_config, NULL, TRUE, GDK_GL_RGBA_TYPE);
        priv->gl=TRUE;
 }
 #endif
@@ -662,6 +682,7 @@ pango_layout_set_alignment(priv->speed_layout, PANGO_ALIGN_LEFT);
 g_signal_connect(G_OBJECT(map), "button_press_event", G_CALLBACK(gtk_map_button_press_cb), NULL);
 g_signal_connect(G_OBJECT(map), "button_release_event",G_CALLBACK(gtk_map_button_release_cb), NULL);
 g_signal_connect(G_OBJECT(map), "scroll_event",  G_CALLBACK(gtk_map_scroll_event_cb), NULL);
+g_signal_connect(G_OBJECT(map), "motion_notify_event", G_CALLBACK(gtk_map_motion_notify_cb), NULL);
 
 gtk_widget_queue_resize(widget);
 }
@@ -767,6 +788,8 @@ g_return_if_fail(GTK_IS_MAP(widget));
 map=GTK_MAP(widget);
 priv=GTK_MAP_GET_PRIVATE(map);
 
+gc=priv->gc_waypoint;
+
 if ((x1 > priv->buf_width_pixels) || (y1 > priv->buf_height_pixels))
        return;
 gdk_draw_arc(widget->window, gc, FALSE, x1 - priv->draw_width, y1 - priv->draw_width, 2 * priv->draw_width, 2 * priv->draw_width, 0, 360 * 64);
@@ -889,6 +912,7 @@ g_return_val_if_fail(path, FALSE);
 map=GTK_MAP(widget);
 priv=GTK_MAP_GET_PRIVATE(map);
 priv->paths=g_slist_remove(priv->paths, path);
+return TRUE;
 }
 
 static void 
@@ -1404,7 +1428,7 @@ priv=GTK_MAP_GET_PRIVATE(map);
 gtk_map_set_center(widget, priv->center.unitx + delta_x*GTK_MAP_PAN_UNITS, priv->center.unity + delta_y*GTK_MAP_PAN_UNITS);
 }
 
-static void
+void
 gtk_map_refresh(GtkWidget *widget)
 {
 GtkMap *map;
@@ -1550,7 +1574,7 @@ gtk_map_scroll_event_cb(GtkWidget *widget, GdkEventScroll *event)
 GtkMap *map;
 GtkMapPriv *priv;
 
-g_return_if_fail(GTK_IS_MAP(widget));
+g_return_val_if_fail(GTK_IS_MAP(widget), FALSE);
 
 map=GTK_MAP(widget);
 priv=GTK_MAP_GET_PRIVATE(map);
@@ -1560,16 +1584,79 @@ if (priv->zoom_to_mouse)
 return FALSE;
 }
 
+static gboolean 
+gtk_map_motion_notify_cb(GtkWidget *widget, GdkEventMotion *event, gpointer data)
+{
+GtkMap *map;
+GtkMapPriv *priv;
+
+g_return_val_if_fail(GTK_IS_MAP(widget), FALSE);
+map=GTK_MAP(widget);
+priv=GTK_MAP_GET_PRIVATE(map);
+
+priv->mouse_x=(gint)event->x;
+priv->mouse_y=(gint)event->y;
+unit2latlon(x2unit((gint) (event->x+0.5)), y2unit((gint) (event->y+0.5)), priv->mouse_lat, priv->mouse_lon);
+
+g_debug("MOUSE: %d,%d (%f,%f)", priv->mouse_x, priv->mouse_y, priv->mouse_lat, priv->mouse_lon);
+
+return FALSE;
+}
+
 static gboolean
 gtk_map_button_press_cb(GtkWidget *widget, GdkEventButton *event)
 {
+GtkMap *map;
+GtkMapPriv *priv;
+
+g_return_val_if_fail(GTK_IS_MAP(widget), FALSE);
+map=GTK_MAP(widget);
+priv=GTK_MAP_GET_PRIVATE(map);
+
+switch (event->button) {
+case 1:
+       priv->button_down=TRUE;
+       if (priv->click_to_center) {
+               gtk_map_set_center(widget, x2unit((gint) (event->x+0.5)), y2unit((gint) (event->y+0.5)));
+               return FALSE;
+       } else if (event->type==GDK_2BUTTON_PRESS) {
+               gtk_map_set_center(widget, x2unit((gint) (event->x+0.5)), y2unit((gint) (event->y+0.5)));
+               if (priv->zoom_in_on_2button)
+                       gtk_map_zoom_in(widget);
+               return FALSE;
+       }
+break;
+case 2:
 
+break;
+case 3:
+       if (priv->menu)
+               gtk_menu_popup(GTK_MENU(priv->menu), NULL, NULL, NULL, NULL, event->button, gtk_get_current_event_time());
+break;
+}
 return FALSE;
 }
 
 static gboolean
 gtk_map_button_release_cb(GtkWidget *widget, GdkEventButton *event)
 {
+GtkMap *map;
+GtkMapPriv *priv;
 
+g_return_val_if_fail(GTK_IS_MAP(widget), FALSE);
+map=GTK_MAP(widget);
+priv=GTK_MAP_GET_PRIVATE(map);
+
+switch (event->button) {
+case 1:
+       priv->button_down=FALSE;
+break;
+case 2:
+
+break;
+case 3:
+
+break;
+}
 return FALSE;
 }