X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/911400b5f03f33605110ef8eb4564d758cf84c3c..5dab4f3fa3c22facc679ba558dd6987d3d8f34e0:/src/vikgeoreflayer.c diff --git a/src/vikgeoreflayer.c b/src/vikgeoreflayer.c index 604dc407..815ae716 100644 --- a/src/vikgeoreflayer.c +++ b/src/vikgeoreflayer.c @@ -34,6 +34,8 @@ VikLayerParam georef_layer_params[] = { enum { PARAM_IMAGE = 0, PARAM_CE, PARAM_CN, PARAM_ME, PARAM_MN, NUM_PARAMS }; +static void georef_layer_marshall( VikGeorefLayer *vgl, guint8 **data, gint *len ); +static VikGeorefLayer *georef_layer_unmarshall( guint8 *data, gint len, VikViewport *vvp ); static VikGeorefLayer *georef_layer_copy ( VikGeorefLayer *vgl, gpointer vp ); static gboolean georef_layer_set_param ( VikGeorefLayer *vgl, guint16 id, VikLayerParamData data, VikViewport *vp ); static VikLayerParamData georef_layer_get_param ( VikGeorefLayer *vgl, guint16 id ); @@ -46,13 +48,20 @@ static void georef_layer_add_menu_items ( VikGeorefLayer *vgl, GtkMenu *menu, gp static void georef_layer_set_image ( VikGeorefLayer *vgl, const gchar *image ); static gboolean georef_layer_dialog ( VikGeorefLayer **vgl, gpointer vp, GtkWindow *w ); static void georef_layer_load_image ( VikGeorefLayer *vgl ); + +/* tools */ +static gpointer georef_layer_move_create ( VikWindow *vw, VikViewport *vvp); static gboolean georef_layer_move_release ( VikGeorefLayer *vgl, GdkEventButton *event, VikViewport *vvp ); static gboolean georef_layer_move_press ( VikGeorefLayer *vgl, GdkEventButton *event, VikViewport *vvp ); +static gpointer georef_layer_zoom_create ( VikWindow *vw, VikViewport *vvp); static gboolean georef_layer_zoom_press ( VikGeorefLayer *vgl, GdkEventButton *event, VikViewport *vvp ); static VikToolInterface georef_tools[] = { - { "Georef Move Map", (VikToolInterfaceFunc) georef_layer_move_press, (VikToolInterfaceFunc) georef_layer_move_release }, - { "Georef Zoom Tool", (VikToolInterfaceFunc) georef_layer_zoom_press, NULL }, + { "Georef Move Map", (VikToolConstructorFunc) georef_layer_move_create, NULL, NULL, NULL, + (VikToolMouseFunc) georef_layer_move_press, NULL, (VikToolMouseFunc) georef_layer_move_release }, + + { "Georef Zoom Tool", (VikToolConstructorFunc) georef_layer_zoom_create, NULL, NULL, NULL, + (VikToolMouseFunc) georef_layer_zoom_press, NULL, NULL }, }; VikLayerInterface vik_georef_layer_interface = { @@ -67,6 +76,8 @@ VikLayerInterface vik_georef_layer_interface = { NULL, 0, + VIK_MENU_ITEM_ALL, + (VikLayerFuncCreate) georef_layer_create, (VikLayerFuncRealize) NULL, (VikLayerFuncPostRead) georef_layer_load_image, @@ -76,6 +87,9 @@ VikLayerInterface vik_georef_layer_interface = { (VikLayerFuncDraw) georef_layer_draw, (VikLayerFuncChangeCoordMode) NULL, + (VikLayerFuncSetMenuItemsSelection) NULL, + (VikLayerFuncGetMenuItemsSelection) NULL, + (VikLayerFuncAddMenuItems) georef_layer_add_menu_items, (VikLayerFuncSublayerAddMenuItems) NULL, @@ -83,8 +97,8 @@ VikLayerInterface vik_georef_layer_interface = { (VikLayerFuncSublayerToggleVisible) NULL, (VikLayerFuncCopy) georef_layer_copy, - (VikLayerFuncMarshall) NULL, - (VikLayerFuncUnmarshall) NULL, + (VikLayerFuncMarshall) georef_layer_marshall, + (VikLayerFuncUnmarshall) georef_layer_unmarshall, (VikLayerFuncSetParam) georef_layer_set_param, (VikLayerFuncGetParam) georef_layer_get_param, @@ -92,6 +106,7 @@ VikLayerInterface vik_georef_layer_interface = { (VikLayerFuncReadFileData) NULL, (VikLayerFuncWriteFileData) NULL, + (VikLayerFuncDeleteItem) NULL, (VikLayerFuncCopyItem) NULL, (VikLayerFuncPasteItem) NULL, (VikLayerFuncFreeCopiedItem) NULL, @@ -152,6 +167,21 @@ static VikGeorefLayer *georef_layer_copy ( VikGeorefLayer *vgl, gpointer vp ) return rv; } +static void georef_layer_marshall( VikGeorefLayer *vgl, guint8 **data, gint *len ) +{ + vik_layer_marshall_params ( VIK_LAYER(vgl), data, len ); +} + +static VikGeorefLayer *georef_layer_unmarshall( guint8 *data, gint len, VikViewport *vvp ) +{ + VikGeorefLayer *rv = georef_layer_new ( vvp ); + vik_layer_unmarshall_params ( VIK_LAYER(rv), data, len, vvp ); + if (rv->image) { + georef_layer_load_image ( rv ); + } + return rv; +} + static gboolean georef_layer_set_param ( VikGeorefLayer *vgl, guint16 id, VikLayerParamData data, VikViewport *vp ) { switch ( id ) @@ -355,7 +385,7 @@ static gboolean georef_layer_dialog ( VikGeorefLayer **vgl, gpointer vp, GtkWind GTK_RESPONSE_REJECT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, - 0 ); + NULL ); GtkWidget *table, *wfp_hbox, *wfp_label, *wfp_button, *ce_label, *ce_spin, *cn_label, *cn_spin, *xlabel, *xspin, *ylabel, *yspin, *imagelabel, *imageentry; GtkWidget *pass_along[4]; @@ -502,8 +532,17 @@ static void georef_layer_add_menu_items ( VikGeorefLayer *vgl, GtkMenu *menu, gp gtk_widget_show ( item ); } + +static gpointer georef_layer_move_create ( VikWindow *vw, VikViewport *vvp) +{ + return vvp; +} + static gboolean georef_layer_move_release ( VikGeorefLayer *vgl, GdkEventButton *event, VikViewport *vvp ) { + if (!vgl || vgl->vl.type != VIK_LAYER_GEOREF) + return FALSE; + if ( vgl->click_x != -1 ) { vgl->corner.easting += (event->x - vgl->click_x) * vik_viewport_get_xmpp (vvp); @@ -514,8 +553,15 @@ static gboolean georef_layer_move_release ( VikGeorefLayer *vgl, GdkEventButton return FALSE; /* I didn't move anything on this layer! */ } +static gpointer georef_layer_zoom_create ( VikWindow *vw, VikViewport *vvp) +{ + return vvp; +} + static gboolean georef_layer_zoom_press ( VikGeorefLayer *vgl, GdkEventButton *event, VikViewport *vvp ) { + if (!vgl || vgl->vl.type != VIK_LAYER_GEOREF) + return FALSE; if ( event->button == 1 ) { if ( vgl->mpp_easting < (VIK_VIEWPORT_MAX_ZOOM / 1.05) && vgl->mpp_northing < (VIK_VIEWPORT_MAX_ZOOM / 1.05) ) @@ -540,6 +586,8 @@ static gboolean georef_layer_zoom_press ( VikGeorefLayer *vgl, GdkEventButton *e static gboolean georef_layer_move_press ( VikGeorefLayer *vgl, GdkEventButton *event, VikViewport *vvp ) { + if (!vgl || vgl->vl.type != VIK_LAYER_GEOREF) + return FALSE; vgl->click_x = event->x; vgl->click_y = event->y; return TRUE;