2 * viking -- GPS Data and Topo Analyzer, Explorer, and Manager
4 * Copyright (C) 2003-2005, Evan Battaglia <gtoevan@gmx.net>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include "vikgeoreflayer_pixmap.h"
27 VikLayerParam georef_layer_params
[] = {
28 { "image", VIK_LAYER_PARAM_STRING
, VIK_LAYER_NOT_IN_PROPERTIES
},
29 { "corner_easting", VIK_LAYER_PARAM_DOUBLE
, VIK_LAYER_NOT_IN_PROPERTIES
},
30 { "corner_northing", VIK_LAYER_PARAM_DOUBLE
, VIK_LAYER_NOT_IN_PROPERTIES
},
31 { "mpp_easting", VIK_LAYER_PARAM_DOUBLE
, VIK_LAYER_NOT_IN_PROPERTIES
},
32 { "mpp_northing", VIK_LAYER_PARAM_DOUBLE
, VIK_LAYER_NOT_IN_PROPERTIES
},
35 enum { PARAM_IMAGE
= 0, PARAM_CE
, PARAM_CN
, PARAM_ME
, PARAM_MN
, NUM_PARAMS
};
37 static VikGeorefLayer
*georef_layer_copy ( VikGeorefLayer
*vgl
, gpointer vp
);
38 static gboolean
georef_layer_set_param ( VikGeorefLayer
*vgl
, guint16 id
, VikLayerParamData data
, VikViewport
*vp
);
39 static VikLayerParamData
georef_layer_get_param ( VikGeorefLayer
*vgl
, guint16 id
);
40 VikGeorefLayer
*georef_layer_new ( );
41 VikGeorefLayer
*georef_layer_create ( VikViewport
*vp
);
42 static void georef_layer_free ( VikGeorefLayer
*vgl
);
43 gboolean
georef_layer_properties ( VikGeorefLayer
*vgl
, gpointer vp
);
44 static void georef_layer_draw ( VikGeorefLayer
*vgl
, gpointer data
);
45 static void georef_layer_add_menu_items ( VikGeorefLayer
*vgl
, GtkMenu
*menu
, gpointer vlp
);
46 static void georef_layer_set_image ( VikGeorefLayer
*vgl
, const gchar
*image
);
47 static gboolean
georef_layer_dialog ( VikGeorefLayer
**vgl
, gpointer vp
, GtkWindow
*w
);
48 static void georef_layer_load_image ( VikGeorefLayer
*vgl
);
49 static gboolean
georef_layer_move_release ( VikGeorefLayer
*vgl
, GdkEventButton
*event
, VikViewport
*vvp
);
50 static gboolean
georef_layer_move_press ( VikGeorefLayer
*vgl
, GdkEventButton
*event
, VikViewport
*vvp
);
51 static gboolean
georef_layer_zoom_press ( VikGeorefLayer
*vgl
, GdkEventButton
*event
, VikViewport
*vvp
);
53 static VikToolInterface georef_tools
[] = {
54 { "Georef Move Map", (VikToolInterfaceFunc
) georef_layer_move_press
, (VikToolInterfaceFunc
) georef_layer_move_release
},
55 { "Georef Zoom Tool", (VikToolInterfaceFunc
) georef_layer_zoom_press
, NULL
},
58 VikLayerInterface vik_georef_layer_interface
= {
60 &georeflayer_pixbuf
, /*icon */
63 sizeof(georef_tools
) / sizeof(VikToolInterface
),
70 (VikLayerFuncCreate
) georef_layer_create
,
71 (VikLayerFuncRealize
) NULL
,
72 (VikLayerFuncPostRead
) georef_layer_load_image
,
73 (VikLayerFuncFree
) georef_layer_free
,
75 (VikLayerFuncProperties
) georef_layer_properties
,
76 (VikLayerFuncDraw
) georef_layer_draw
,
77 (VikLayerFuncChangeCoordMode
) NULL
,
79 (VikLayerFuncAddMenuItems
) georef_layer_add_menu_items
,
80 (VikLayerFuncSublayerAddMenuItems
) NULL
,
82 (VikLayerFuncSublayerRenameRequest
) NULL
,
83 (VikLayerFuncSublayerToggleVisible
) NULL
,
85 (VikLayerFuncCopy
) georef_layer_copy
,
87 (VikLayerFuncSetParam
) georef_layer_set_param
,
88 (VikLayerFuncGetParam
) georef_layer_get_param
,
90 (VikLayerFuncReadFileData
) NULL
,
91 (VikLayerFuncWriteFileData
) NULL
,
93 (VikLayerFuncCopyItem
) NULL
,
94 (VikLayerFuncPasteItem
) NULL
,
95 (VikLayerFuncFreeCopiedItem
) NULL
,
98 struct _VikGeorefLayer
{
103 gdouble mpp_easting
, mpp_northing
;
106 gint click_x
, click_y
;
111 GType
vik_georef_layer_get_type ()
113 static GType vgl_type
= 0;
117 static const GTypeInfo vgl_info
=
119 sizeof (VikGeorefLayerClass
),
120 NULL
, /* base_init */
121 NULL
, /* base_finalize */
122 NULL
, /* class init */
123 NULL
, /* class_finalize */
124 NULL
, /* class_data */
125 sizeof (VikGeorefLayer
),
127 NULL
/* instance init */
129 vgl_type
= g_type_register_static ( VIK_LAYER_TYPE
, "VikGeorefLayer", &vgl_info
, 0 );
135 static VikGeorefLayer
*georef_layer_copy ( VikGeorefLayer
*vgl
, gpointer vp
)
137 VikGeorefLayer
*rv
= georef_layer_new ();
138 rv
->corner
= vgl
->corner
;
139 rv
->mpp_easting
= vgl
->mpp_easting
;
140 rv
->mpp_northing
= vgl
->mpp_northing
;
141 rv
->width
= vgl
->width
;
142 rv
->height
= vgl
->height
;
146 rv
->image
= g_strdup ( vgl
->image
);
147 georef_layer_load_image ( rv
);
152 static gboolean
georef_layer_set_param ( VikGeorefLayer
*vgl
, guint16 id
, VikLayerParamData data
, VikViewport
*vp
)
156 case PARAM_IMAGE
: georef_layer_set_image ( vgl
, data
.s
); break;
157 case PARAM_CN
: vgl
->corner
.northing
= data
.d
; break;
158 case PARAM_CE
: vgl
->corner
.easting
= data
.d
; break;
159 case PARAM_MN
: vgl
->mpp_northing
= data
.d
; break;
160 case PARAM_ME
: vgl
->mpp_easting
= data
.d
; break;
165 static VikLayerParamData
georef_layer_get_param ( VikGeorefLayer
*vgl
, guint16 id
)
167 VikLayerParamData rv
;
170 case PARAM_IMAGE
: rv
.s
= vgl
->image
? vgl
->image
: ""; break;
171 case PARAM_CN
: rv
.d
= vgl
->corner
.northing
; break;
172 case PARAM_CE
: rv
.d
= vgl
->corner
.easting
; break;
173 case PARAM_MN
: rv
.d
= vgl
->mpp_northing
; break;
174 case PARAM_ME
: rv
.d
= vgl
->mpp_easting
; break;
179 VikGeorefLayer
*georef_layer_new ( )
181 VikGeorefLayer
*vgl
= VIK_GEOREF_LAYER ( g_object_new ( VIK_GEOREF_LAYER_TYPE
, NULL
) );
182 vik_layer_init ( VIK_LAYER(vgl
), VIK_LAYER_GEOREF
);
191 static void georef_layer_draw ( VikGeorefLayer
*vgl
, gpointer data
)
196 VikViewport
*vp
= VIK_VIEWPORT(data
);
197 struct UTM utm_middle
;
198 gdouble xmpp
= vik_viewport_get_xmpp(vp
), ympp
= vik_viewport_get_ympp(vp
);
199 vik_coord_to_utm ( vik_viewport_get_center ( vp
), &utm_middle
);
201 if ( xmpp
== vgl
->mpp_easting
&& ympp
== vgl
->mpp_northing
)
203 guint width
= vik_viewport_get_width(vp
), height
= vik_viewport_get_height(vp
);
205 vgl
->corner
.zone
= utm_middle
.zone
;
206 vgl
->corner
.letter
= utm_middle
.letter
;
207 VikCoord corner_coord
;
208 vik_coord_load_from_utm ( &corner_coord
, vik_viewport_get_coord_mode(vp
), &(vgl
->corner
) );
209 vik_viewport_coord_to_screen ( vp
, &corner_coord
, &x
, &y
);
210 if ( (x
< 0 || x
< width
) && (y
< 0 || y
< height
) && x
+vgl
->width
> 0 && y
+vgl
->height
> 0 )
211 vik_viewport_draw_pixbuf ( vp
, vgl
->pixbuf
, 0, 0, x
, y
, vgl
->width
, vgl
->height
); /* todo: draw only what we need to. */
216 static void georef_layer_free ( VikGeorefLayer
*vgl
)
218 if ( vgl
->image
!= NULL
)
219 g_free ( vgl
->image
);
222 VikGeorefLayer
*georef_layer_create ( VikViewport
*vp
)
224 return georef_layer_new ();
227 gboolean
georef_layer_properties ( VikGeorefLayer
*vgl
, gpointer vp
)
229 return georef_layer_dialog ( &vgl
, vp
, VIK_GTK_WINDOW_FROM_WIDGET(vp
) );
232 static void georef_layer_load_image ( VikGeorefLayer
*vgl
)
235 if ( vgl
->image
== NULL
)
239 g_object_unref ( G_OBJECT(vgl
->pixbuf
) );
241 vgl
->pixbuf
= gdk_pixbuf_new_from_file ( vgl
->image
, &gx
);
245 g_warning ( "Couldn't open image file: %s", gx
->message
);
250 vgl
->width
= gdk_pixbuf_get_width ( vgl
->pixbuf
);
251 vgl
->height
= gdk_pixbuf_get_height ( vgl
->pixbuf
);
254 /* should find length and width here too */
257 static void georef_layer_set_image ( VikGeorefLayer
*vgl
, const gchar
*image
)
260 g_free ( vgl
->image
);
263 vgl
->image
= g_strdup ( image
);
266 static gboolean
world_file_read_line ( gchar
*buffer
, gint size
, FILE *f
, GtkWidget
*widget
, gboolean use_value
)
268 if (!fgets ( buffer
, 1024, f
))
270 a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_WIDGET(widget
), "Unexpected end of file reading World file." );
277 gdouble val
= strtod ( buffer
, NULL
);
278 gtk_spin_button_set_value ( GTK_SPIN_BUTTON(widget
), val
> 0 ? val
: -val
);
283 static void georef_layer_dialog_load ( GtkWidget
*pass_along
[4] )
285 GtkWidget
*file_selector
= gtk_file_selection_new ("Choose World file");
287 if ( gtk_dialog_run ( GTK_DIALOG ( file_selector
) ) == GTK_RESPONSE_OK
)
289 FILE *f
= fopen ( gtk_file_selection_get_filename ( GTK_FILE_SELECTION(file_selector
) ), "r" );
290 gtk_widget_destroy ( file_selector
);
293 a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_WIDGET(pass_along
[0]), "The World file you requested could not be opened for reading." );
298 gchar
*buffer
= g_malloc ( 1024 * sizeof(gchar
) );
299 if ( world_file_read_line ( buffer
, 1024, f
, pass_along
[0], TRUE
) && world_file_read_line ( buffer
, 1024, f
, pass_along
[1], TRUE
)
300 && world_file_read_line ( buffer
, 1024, f
, pass_along
[0], FALSE
) && world_file_read_line ( buffer
, 1024, f
, pass_along
[0], FALSE
)
301 && world_file_read_line ( buffer
, 1024, f
, pass_along
[2], TRUE
) && world_file_read_line ( buffer
, 1024, f
, pass_along
[3], TRUE
) )
309 gtk_widget_destroy ( file_selector
);
312 file selection dialog
313 file opener for reading, if NULL, send error_msg ( VIK_GTK_WINDOW_FROM_WIDGET(pass_along[0]) )
314 does that catch directories too?
315 read lines -- if not enough lines, give error.
316 if anything outside, give error. define range with #define CONSTANTS
317 put 'em in thar widgets, and that's it.
321 static void georef_layer_export_params ( gpointer
*pass_along
[2] )
323 VikGeorefLayer
*vgl
= VIK_GEOREF_LAYER(pass_along
[0]);
324 GtkWidget
*file_selector
= gtk_file_selection_new ("Choose World file");
326 if ( gtk_dialog_run ( GTK_DIALOG ( file_selector
) ) == GTK_RESPONSE_OK
)
328 FILE *f
= fopen ( gtk_file_selection_get_filename ( GTK_FILE_SELECTION(file_selector
) ), "w" );
329 gtk_widget_destroy ( file_selector
);
332 a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_WIDGET(pass_along
[0]), "The file you requested could not be opened for writing." );
337 fprintf ( f
, "%f\n%f\n%f\n%f\n%f\n%f\n", vgl
->mpp_easting
, vgl
->mpp_northing
, 0.0, 0.0, vgl
->corner
.easting
, vgl
->corner
.northing
);
342 gtk_widget_destroy ( file_selector
);
345 /* returns TRUE if OK was pressed. */
346 static gboolean
georef_layer_dialog ( VikGeorefLayer
**vgl
, gpointer vp
, GtkWindow
*w
)
348 GtkWidget
*dialog
= gtk_dialog_new_with_buttons ("Layer Properties",
350 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
356 GtkWidget
*table
, *wfp_hbox
, *wfp_label
, *wfp_button
, *ce_label
, *ce_spin
, *cn_label
, *cn_spin
, *xlabel
, *xspin
, *ylabel
, *yspin
, *imagelabel
, *imageentry
;
358 GtkWidget
*pass_along
[4];
360 table
= gtk_table_new ( 6, 2, FALSE
);
361 gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(dialog
)->vbox
), table
, TRUE
, TRUE
, 0 );
363 wfp_hbox
= gtk_hbox_new ( FALSE
, 0 );
364 wfp_label
= gtk_label_new ( "World File Parameters:" );
365 wfp_button
= gtk_button_new_with_label ( "Load From File..." );
367 gtk_box_pack_start ( GTK_BOX(wfp_hbox
), wfp_label
, TRUE
, TRUE
, 0 );
368 gtk_box_pack_start ( GTK_BOX(wfp_hbox
), wfp_button
, FALSE
, FALSE
, 3 );
370 ce_label
= gtk_label_new ( "Corner pixel easting:" );
371 ce_spin
= gtk_spin_button_new ( (GtkAdjustment
*) gtk_adjustment_new ( 4, 0.0, 1500000.0, 1, 5, 5 ), 1, 4 );
373 cn_label
= gtk_label_new ( "Corner pixel northing:" );
374 cn_spin
= gtk_spin_button_new ( (GtkAdjustment
*) gtk_adjustment_new ( 4, 0.0, 9000000.0, 1, 5, 5 ), 1, 4 );
376 xlabel
= gtk_label_new ( "X (easting) scale (mpp): ");
377 ylabel
= gtk_label_new ( "Y (northing) scale (mpp): ");
379 xspin
= gtk_spin_button_new ( (GtkAdjustment
*) gtk_adjustment_new ( 4, VIK_VIEWPORT_MIN_ZOOM
, VIK_VIEWPORT_MAX_ZOOM
, 1, 5, 5 ), 1, 8 );
380 yspin
= gtk_spin_button_new ( (GtkAdjustment
*) gtk_adjustment_new ( 4, VIK_VIEWPORT_MIN_ZOOM
, VIK_VIEWPORT_MAX_ZOOM
, 1, 5, 5 ), 1, 8 );
382 imagelabel
= gtk_label_new ( "Map Image:" );
383 imageentry
= vik_file_entry_new ();
387 gtk_spin_button_set_value ( GTK_SPIN_BUTTON(ce_spin
), (*vgl
)->corner
.easting
);
388 gtk_spin_button_set_value ( GTK_SPIN_BUTTON(cn_spin
), (*vgl
)->corner
.northing
);
389 gtk_spin_button_set_value ( GTK_SPIN_BUTTON(xspin
), (*vgl
)->mpp_easting
);
390 gtk_spin_button_set_value ( GTK_SPIN_BUTTON(yspin
), (*vgl
)->mpp_northing
);
392 vik_file_entry_set_filename ( VIK_FILE_ENTRY(imageentry
), (*vgl
)->image
);
396 VikCoord corner_coord
;
398 vik_viewport_screen_to_coord ( VIK_VIEWPORT(vp
), 0, 0, &corner_coord
);
399 vik_coord_to_utm ( &corner_coord
, &utm
);
400 gtk_spin_button_set_value ( GTK_SPIN_BUTTON(ce_spin
), utm
.easting
);
401 gtk_spin_button_set_value ( GTK_SPIN_BUTTON(cn_spin
), utm
.northing
);
402 gtk_spin_button_set_value ( GTK_SPIN_BUTTON(xspin
), vik_viewport_get_xmpp ( VIK_VIEWPORT(vp
) ) );
403 gtk_spin_button_set_value ( GTK_SPIN_BUTTON(yspin
), vik_viewport_get_ympp ( VIK_VIEWPORT(vp
) ) );
406 gtk_table_attach_defaults ( GTK_TABLE(table
), imagelabel
, 0, 1, 0, 1 );
407 gtk_table_attach_defaults ( GTK_TABLE(table
), imageentry
, 1, 2, 0, 1 );
408 gtk_table_attach_defaults ( GTK_TABLE(table
), wfp_hbox
, 0, 2, 1, 2 );
409 gtk_table_attach_defaults ( GTK_TABLE(table
), xlabel
, 0, 1, 2, 3 );
410 gtk_table_attach_defaults ( GTK_TABLE(table
), xspin
, 1, 2, 2, 3 );
411 gtk_table_attach_defaults ( GTK_TABLE(table
), ylabel
, 0, 1, 3, 4 );
412 gtk_table_attach_defaults ( GTK_TABLE(table
), yspin
, 1, 2, 3, 4 );
413 gtk_table_attach_defaults ( GTK_TABLE(table
), ce_label
, 0, 1, 4, 5 );
414 gtk_table_attach_defaults ( GTK_TABLE(table
), ce_spin
, 1, 2, 4, 5 );
415 gtk_table_attach_defaults ( GTK_TABLE(table
), cn_label
, 0, 1, 5, 6 );
416 gtk_table_attach_defaults ( GTK_TABLE(table
), cn_spin
, 1, 2, 5, 6 );
418 pass_along
[0] = xspin
;
419 pass_along
[1] = yspin
;
420 pass_along
[2] = ce_spin
;
421 pass_along
[3] = cn_spin
;
422 g_signal_connect_swapped ( G_OBJECT(wfp_button
), "clicked", G_CALLBACK(georef_layer_dialog_load
), pass_along
);
424 gtk_widget_show_all ( table
);
426 if ( gtk_dialog_run ( GTK_DIALOG(dialog
) ) == GTK_RESPONSE_ACCEPT
)
430 *vgl
= georef_layer_new ();
431 vik_layer_rename ( VIK_LAYER(*vgl
), vik_georef_layer_interface
.name
);
433 (*vgl
)->corner
.easting
= gtk_spin_button_get_value ( GTK_SPIN_BUTTON(ce_spin
) );
434 (*vgl
)->corner
.northing
= gtk_spin_button_get_value ( GTK_SPIN_BUTTON(cn_spin
) );
435 (*vgl
)->mpp_easting
= gtk_spin_button_get_value ( GTK_SPIN_BUTTON(xspin
) );
436 (*vgl
)->mpp_northing
= gtk_spin_button_get_value ( GTK_SPIN_BUTTON(yspin
) );
437 if ( (!(*vgl
)->image
) || strcmp( (*vgl
)->image
, vik_file_entry_get_filename(VIK_FILE_ENTRY(imageentry
)) ) != 0 )
439 georef_layer_set_image ( *vgl
, vik_file_entry_get_filename(VIK_FILE_ENTRY(imageentry
)) );
440 georef_layer_load_image ( *vgl
);
443 gtk_widget_destroy ( GTK_WIDGET(dialog
) );
446 gtk_widget_destroy ( GTK_WIDGET(dialog
) );
450 static void georef_layer_zoom_to_fit ( gpointer vgl_vlp
[2] )
452 vik_viewport_set_xmpp ( vik_layers_panel_get_viewport(VIK_LAYERS_PANEL(vgl_vlp
[1])), VIK_GEOREF_LAYER(vgl_vlp
[0])->mpp_easting
);
453 vik_viewport_set_ympp ( vik_layers_panel_get_viewport(VIK_LAYERS_PANEL(vgl_vlp
[1])), VIK_GEOREF_LAYER(vgl_vlp
[0])->mpp_northing
);
454 vik_layers_panel_emit_update ( VIK_LAYERS_PANEL(vgl_vlp
[1]) );
457 static void georef_layer_goto_center ( gpointer vgl_vlp
[2] )
459 VikGeorefLayer
*vgl
= VIK_GEOREF_LAYER ( vgl_vlp
[0] );
460 VikViewport
*vp
= vik_layers_panel_get_viewport(VIK_LAYERS_PANEL(vgl_vlp
[1]));
464 vik_coord_to_utm ( vik_viewport_get_center ( vp
), &utm
);
466 utm
.easting
= vgl
->corner
.easting
+ (vgl
->width
* vgl
->mpp_easting
/ 2); /* only an approximation */
467 utm
.northing
= vgl
->corner
.northing
- (vgl
->height
* vgl
->mpp_northing
/ 2);
469 vik_coord_load_from_utm ( &coord
, vik_viewport_get_coord_mode ( vp
), &utm
);
470 vik_viewport_set_center_coord ( vp
, &coord
);
472 vik_layers_panel_emit_update ( VIK_LAYERS_PANEL(vgl_vlp
[1]) );
475 static void georef_layer_add_menu_items ( VikGeorefLayer
*vgl
, GtkMenu
*menu
, gpointer vlp
)
477 static gpointer pass_along
[2];
482 item
= gtk_menu_item_new();
483 gtk_menu_shell_append ( GTK_MENU_SHELL(menu
), item
);
484 gtk_widget_show ( item
);
486 item
= gtk_menu_item_new_with_label ( "Zoom to Fit Map" );
487 g_signal_connect_swapped ( G_OBJECT(item
), "activate", G_CALLBACK(georef_layer_zoom_to_fit
), pass_along
);
488 gtk_menu_shell_append (GTK_MENU_SHELL (menu
), item
);
489 gtk_widget_show ( item
);
491 item
= gtk_menu_item_new_with_label ( "Goto Map Center" );
492 g_signal_connect_swapped ( G_OBJECT(item
), "activate", G_CALLBACK(georef_layer_goto_center
), pass_along
);
493 gtk_menu_shell_append (GTK_MENU_SHELL (menu
), item
);
494 gtk_widget_show ( item
);
496 item
= gtk_menu_item_new_with_label ( "Export to World File" );
497 g_signal_connect_swapped ( G_OBJECT(item
), "activate", G_CALLBACK(georef_layer_export_params
), pass_along
);
498 gtk_menu_shell_append (GTK_MENU_SHELL (menu
), item
);
499 gtk_widget_show ( item
);
502 static gboolean
georef_layer_move_release ( VikGeorefLayer
*vgl
, GdkEventButton
*event
, VikViewport
*vvp
)
504 if ( vgl
->click_x
!= -1 )
506 vgl
->corner
.easting
+= (event
->x
- vgl
->click_x
) * vik_viewport_get_xmpp (vvp
);
507 vgl
->corner
.northing
-= (event
->y
- vgl
->click_y
) * vik_viewport_get_ympp (vvp
);
508 vik_layer_emit_update ( VIK_LAYER(vgl
) );
511 return FALSE
; /* I didn't move anything on this layer! */
514 static gboolean
georef_layer_zoom_press ( VikGeorefLayer
*vgl
, GdkEventButton
*event
, VikViewport
*vvp
)
516 if ( event
->button
== 1 )
518 if ( vgl
->mpp_easting
< (VIK_VIEWPORT_MAX_ZOOM
/ 1.05) && vgl
->mpp_northing
< (VIK_VIEWPORT_MAX_ZOOM
/ 1.05) )
520 vgl
->mpp_easting
*= 1.01;
521 vgl
->mpp_northing
*= 1.01;
526 if ( vgl
->mpp_easting
> (VIK_VIEWPORT_MIN_ZOOM
* 1.05) && vgl
->mpp_northing
> (VIK_VIEWPORT_MIN_ZOOM
* 1.05) )
528 vgl
->mpp_easting
/= 1.01;
529 vgl
->mpp_northing
/= 1.01;
532 vik_viewport_set_xmpp ( vvp
, vgl
->mpp_easting
);
533 vik_viewport_set_ympp ( vvp
, vgl
->mpp_northing
);
534 vik_layer_emit_update ( VIK_LAYER(vgl
) );
538 static gboolean
georef_layer_move_press ( VikGeorefLayer
*vgl
, GdkEventButton
*event
, VikViewport
*vvp
)
540 vgl
->click_x
= event
->x
;
541 vgl
->click_y
= event
->y
;