]> git.street.me.uk Git - andy/viking.git/blobdiff - src/vikgeoreflayer.c
Bug fix: View Mode displayed wrong setting on startup.
[andy/viking.git] / src / vikgeoreflayer.c
index 0f4077eedab1ca67ae3e2844dd1bcfd22bc9585d..815ae7162cc2ca498253a55c23845fed2a7224b9 100644 (file)
@@ -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,6 +97,8 @@ VikLayerInterface vik_georef_layer_interface = {
   (VikLayerFuncSublayerToggleVisible)   NULL,
 
   (VikLayerFuncCopy)                    georef_layer_copy,
+  (VikLayerFuncMarshall)               georef_layer_marshall,
+  (VikLayerFuncUnmarshall)             georef_layer_unmarshall,
 
   (VikLayerFuncSetParam)                georef_layer_set_param,
   (VikLayerFuncGetParam)                georef_layer_get_param,
@@ -90,9 +106,11 @@ VikLayerInterface vik_georef_layer_interface = {
   (VikLayerFuncReadFileData)            NULL,
   (VikLayerFuncWriteFileData)           NULL,
 
+  (VikLayerFuncDeleteItem)              NULL,
   (VikLayerFuncCopyItem)                NULL,
   (VikLayerFuncPasteItem)               NULL,
   (VikLayerFuncFreeCopiedItem)          NULL,
+  (VikLayerFuncDragDropRequest)                NULL,
 };
 
 struct _VikGeorefLayer {
@@ -149,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 )
@@ -352,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];
@@ -499,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);
@@ -511,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) )
@@ -537,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;