static gboolean on_scroll(GritsViewer *viewer, GdkEventScroll *event, gpointer _) { switch (event->direction) { case GDK_SCROLL_DOWN: grits_viewer_zoom(viewer, 10./9); break; case GDK_SCROLL_UP: grits_viewer_zoom(viewer, 9./10); break; default: break; } return FALSE; }
/************* * Callbacks * *************/ static gboolean on_key_press(GritsViewer *viewer, GdkEventKey *event, gpointer _) { g_debug("GritsViewer: on_key_press - key=%x, state=%x, plus=%x", event->keyval, event->state, GDK_plus); double lat, lon, elev, pan; grits_viewer_get_location(viewer, &lat, &lon, &elev); pan = MIN(elev/(EARTH_R/2), 30); switch (event->keyval) { case GDK_Left: case GDK_h: grits_viewer_pan(viewer, 0, -pan, 0); break; case GDK_Down: case GDK_j: grits_viewer_pan(viewer, -pan, 0, 0); break; case GDK_Up: case GDK_k: grits_viewer_pan(viewer, pan, 0, 0); break; case GDK_Right: case GDK_l: grits_viewer_pan(viewer, 0, pan, 0); break; case GDK_minus: case GDK_o: grits_viewer_zoom(viewer, 10./9); break; case GDK_plus: case GDK_i: grits_viewer_zoom(viewer, 9./10); break; case GDK_H: grits_viewer_rotate(viewer, 0, 0, -2); break; case GDK_J: grits_viewer_rotate(viewer, 2, 0, 0); break; case GDK_K: grits_viewer_rotate(viewer, -2, 0, 0); break; case GDK_L: grits_viewer_rotate(viewer, 0, 0, 2); break; } return FALSE; }
static gboolean on_motion_notify(GritsViewer *viewer, GdkEventMotion *event, gpointer _) { gdouble x = viewer->drag_x - event->x; gdouble y = viewer->drag_y - event->y; gdouble lat, lon, elev, scale, rx, ry, rz; grits_viewer_get_location(GRITS_VIEWER(viewer), &lat, &lon, &elev); grits_viewer_get_rotation(GRITS_VIEWER(viewer), &rx, &ry, &rz); scale = (elev/EARTH_R/15) * (sin(deg2rad(ABS(rx)))*4+1); switch (viewer->drag_mode) { case GRITS_DRAG_PAN: grits_viewer_pan(viewer, -y*scale, x*scale, 0); break; case GRITS_DRAG_ZOOM: grits_viewer_zoom(viewer, pow(2, -y/500)); break; case GRITS_DRAG_TILT: grits_viewer_rotate(viewer, y/10, 0, x/10); break; } viewer->drag_x = event->x; viewer->drag_y = event->y; return FALSE; }
G_MODULE_EXPORT void on_zoomout(GtkAction *action, AWeatherGui *self) { grits_viewer_zoom(self->viewer, 4./3); }
G_MODULE_EXPORT void on_zoomin(GtkAction *action, AWeatherGui *self) { grits_viewer_zoom(self->viewer, 3./4); }