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
21 #ifndef _VIKING_LAYER_H
22 #define _VIKING_LAYER_H
27 #include <gdk-pixbuf/gdk-pixdata.h>
29 #include "uibuilder.h"
30 #include "vikwindow.h"
31 #include "viktreeview.h"
32 #include "vikviewport.h"
34 #define VIK_LAYER_TYPE (vik_layer_get_type ())
35 #define VIK_LAYER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_LAYER_TYPE, VikLayer))
36 #define VIK_LAYER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_LAYER_TYPE, VikLayerClass))
37 #define IS_VIK_LAYER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_LAYER_TYPE))
38 #define IS_VIK_LAYER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_LAYER_TYPE))
40 typedef struct _VikLayer VikLayer
;
41 typedef struct _VikLayerClass VikLayerClass
;
45 GObjectClass object_class
;
46 void (* update
) (VikLayer
*vl
);
49 GType
vik_layer_get_type ();
57 VikTreeview
*vt
; /* simply a reference */
60 /* for explicit "polymorphism" (function type switching) */
67 VIK_LAYER_AGGREGATE
= 0,
77 /* I think most of these are ignored,
78 * returning GRAB_FOCUS grabs the focus for mouse move,
79 * mouse click, release always grabs focus. Focus allows key presses
81 * It used to be that, if ignored, Viking could look for other layers.
82 * this was useful for clicking a way/trackpoint in any layer,
83 * if no layer was selected (find way/trackpoint)
86 VIK_LAYER_TOOL_IGNORED
=0,
88 VIK_LAYER_TOOL_ACK_REDRAW_ABOVE
,
89 VIK_LAYER_TOOL_ACK_REDRAW_ALL
,
90 VIK_LAYER_TOOL_ACK_REDRAW_IF_VISIBLE
,
91 VIK_LAYER_TOOL_ACK_GRAB_FOCUS
, /* only for move */
92 } VikLayerToolFuncStatus
;
94 /* gpointer is tool-specific state created in the constructor */
95 typedef gpointer (*VikToolConstructorFunc
) (VikWindow
*, VikViewport
*);
96 typedef void (*VikToolDestructorFunc
) (gpointer
);
97 typedef VikLayerToolFuncStatus (*VikToolMouseFunc
) (VikLayer
*, GdkEventButton
*, gpointer
);
98 typedef VikLayerToolFuncStatus (*VikToolMouseMoveFunc
) (VikLayer
*, GdkEventMotion
*, gpointer
);
99 typedef void (*VikToolActivationFunc
) (VikLayer
*, gpointer
);
100 typedef gboolean (*VikToolKeyFunc
) (VikLayer
*, GdkEventKey
*, gpointer
);
102 typedef struct _VikToolInterface VikToolInterface
;
103 struct _VikToolInterface
{
105 VikToolConstructorFunc create
;
106 VikToolDestructorFunc destroy
;
107 VikToolActivationFunc activate
;
108 VikToolActivationFunc deactivate
;
109 VikToolMouseFunc click
;
110 VikToolMouseMoveFunc move
;
111 VikToolMouseFunc release
;
112 VikToolKeyFunc key_press
; /* return FALSE if we don't use the key press -- should return AFLSE most of the time if we want any shortcuts / UI keybindings to work! use sparingly. */
113 GdkCursorType cursor_type
;
114 const GdkPixdata
*cursor_data
;
115 const GdkCursor
*cursor
;
118 /* Parameters (for I/O and Properties) */
119 /* --> moved to uibuilder.h */
122 /* layer interface functions */
124 /* Create a new layer of a certain type. Should be filled with defaults */
125 typedef VikLayer
* (*VikLayerFuncCreate
) (VikViewport
*);
127 /* normally only needed for layers with sublayers. This is called when they
128 * are added to the treeview so they can add sublayers to the treeview. */
129 typedef void (*VikLayerFuncRealize
) (VikLayer
*,VikTreeview
*,GtkTreeIter
*);
131 /* rarely used, this is called after a read operation or properties box is run.
132 * usually used to create GC's that depend on params,
133 * but GC's can also be created from create() or set_param() */
134 typedef void (*VikLayerFuncPostRead
) (VikLayer
*,VikViewport
*vp
,gboolean from_file
);
136 typedef void (*VikLayerFuncFree
) (VikLayer
*);
138 /* do _not_ use this unless absolutely neccesary. Use the dynamic properties (see coordlayer for example)
139 * returns TRUE if OK was pressed */
140 typedef gboolean (*VikLayerFuncProperties
) (VikLayer
*,VikViewport
*);
142 typedef void (*VikLayerFuncDraw
) (VikLayer
*,VikViewport
*);
143 typedef void (*VikLayerFuncChangeCoordMode
) (VikLayer
*,VikCoordMode
);
145 typedef void (*VikLayerFuncSetMenuItemsSelection
) (VikLayer
*,guint16
);
146 typedef guint16 (*VikLayerFuncGetMenuItemsSelection
) (VikLayer
*);
147 typedef void (*VikLayerFuncAddMenuItems
) (VikLayer
*,GtkMenu
*,gpointer
); /* gpointer is a VikLayersPanel */
148 typedef gboolean (*VikLayerFuncSublayerAddMenuItems
) (VikLayer
*,GtkMenu
*,gpointer
, /* first gpointer is a VikLayersPanel */
149 gint
,gpointer
,GtkTreeIter
*);
150 typedef const gchar
* (*VikLayerFuncSublayerRenameRequest
) (VikLayer
*,const gchar
*,gpointer
,
151 gint
,VikViewport
*,GtkTreeIter
*); /* first gpointer is a VikLayersPanel */
152 typedef gboolean (*VikLayerFuncSublayerToggleVisible
) (VikLayer
*,gint
,gpointer
);
154 typedef void (*VikLayerFuncMarshall
) (VikLayer
*, guint8
**, gint
*);
155 typedef VikLayer
* (*VikLayerFuncUnmarshall
) (guint8
*, gint
, VikViewport
*);
157 /* returns TRUE if needs to redraw due to changed param */
158 typedef gboolean (*VikLayerFuncSetParam
) (VikLayer
*, guint16
, VikLayerParamData
, VikViewport
*);
160 typedef VikLayerParamData
161 (*VikLayerFuncGetParam
) (VikLayer
*, guint16
);
163 typedef void (*VikLayerFuncReadFileData
) (VikLayer
*, FILE *);
164 typedef void (*VikLayerFuncWriteFileData
) (VikLayer
*, FILE *);
166 /* item manipulation */
167 typedef void (*VikLayerFuncDeleteItem
) (VikLayer
*, gint
, gpointer
);
168 /* layer, subtype, pointer to sub-item */
169 typedef void (*VikLayerFuncCopyItem
) (VikLayer
*, gint
, gpointer
, guint8
**, guint
*);
170 /* layer, subtype, pointer to sub-item, return pointer, return len */
171 typedef gboolean (*VikLayerFuncPasteItem
) (VikLayer
*, gint
, guint8
*, guint
);
172 typedef void (*VikLayerFuncFreeCopiedItem
) (gint
, gpointer
);
174 /* treeview drag and drop method. called on the destination layer. it is given a source and destination layer,
175 * and the source and destination iters in the treeview.
177 typedef void (*VikLayerFuncDragDropRequest
) (VikLayer
*, VikLayer
*, GtkTreeIter
*, GtkTreePath
*);
180 VIK_MENU_ITEM_PROPERTY
=1,
182 VIK_MENU_ITEM_COPY
=4,
183 VIK_MENU_ITEM_PASTE
=8,
184 VIK_MENU_ITEM_DELETE
=16,
185 VIK_MENU_ITEM_ALL
=0xff
186 } VikStdLayerMenuItem
;
188 typedef struct _VikLayerInterface VikLayerInterface
;
190 /* See vik_layer_* for function parameter names */
191 struct _VikLayerInterface
{
193 const GdkPixdata
* icon
;
195 VikToolInterface
* tools
;
198 /* for I/O reading to and from .vik files -- params like coordline width, color, etc. */
199 VikLayerParam
* params
;
200 guint16 params_count
;
201 gchar
** params_groups
;
202 guint8 params_groups_count
;
204 /* menu items to be created */
205 VikStdLayerMenuItem menu_items_selection
;
207 VikLayerFuncCreate create
;
208 VikLayerFuncRealize realize
;
209 VikLayerFuncPostRead post_read
;
210 VikLayerFuncFree free
;
212 VikLayerFuncProperties properties
;
213 VikLayerFuncDraw draw
;
214 VikLayerFuncChangeCoordMode change_coord_mode
;
216 VikLayerFuncSetMenuItemsSelection set_menu_selection
;
217 VikLayerFuncGetMenuItemsSelection get_menu_selection
;
219 VikLayerFuncAddMenuItems add_menu_items
;
220 VikLayerFuncSublayerAddMenuItems sublayer_add_menu_items
;
221 VikLayerFuncSublayerRenameRequest sublayer_rename_request
;
222 VikLayerFuncSublayerToggleVisible sublayer_toggle_visible
;
224 VikLayerFuncMarshall marshall
;
225 VikLayerFuncUnmarshall unmarshall
;
228 VikLayerFuncSetParam set_param
;
229 VikLayerFuncGetParam get_param
;
231 /* for I/O -- extra non-param data like TrwLayer data */
232 VikLayerFuncReadFileData read_file_data
;
233 VikLayerFuncWriteFileData write_file_data
;
235 VikLayerFuncDeleteItem delete_item
;
236 VikLayerFuncCopyItem copy_item
;
237 VikLayerFuncPasteItem paste_item
;
238 VikLayerFuncFreeCopiedItem free_copied_item
;
240 VikLayerFuncDragDropRequest drag_drop_request
;
243 VikLayerInterface
*vik_layer_get_interface ( gint type
);
246 void vik_layer_init ( VikLayer
*vl
, gint type
);
247 void vik_layer_draw ( VikLayer
*l
, gpointer data
);
248 void vik_layer_change_coord_mode ( VikLayer
*l
, VikCoordMode mode
);
249 void vik_layer_rename ( VikLayer
*l
, const gchar
*new_name
);
250 void vik_layer_rename_no_copy ( VikLayer
*l
, gchar
*new_name
);
251 const gchar
*vik_layer_get_name ( VikLayer
*l
);
253 gboolean
vik_layer_set_param (VikLayer
*layer
, guint16 id
, VikLayerParamData data
, gpointer vp
);
255 void vik_layer_emit_update ( VikLayer
*vl
);
258 void vik_layer_set_menu_items_selection(VikLayer
*l
, guint16 selection
);
259 guint16
vik_layer_get_menu_items_selection(VikLayer
*l
);
260 void vik_layer_add_menu_items ( VikLayer
*l
, GtkMenu
*menu
, gpointer vlp
);
261 VikLayer
*vik_layer_create ( gint type
, gpointer vp
, GtkWindow
*w
, gboolean interactive
);
262 gboolean
vik_layer_properties ( VikLayer
*layer
, gpointer vp
);
264 void vik_layer_realize ( VikLayer
*l
, VikTreeview
*vt
, GtkTreeIter
* layer_iter
);
265 void vik_layer_post_read ( VikLayer
*layer
, VikViewport
*vp
, gboolean from_file
);
267 gboolean
vik_layer_sublayer_add_menu_items ( VikLayer
*l
, GtkMenu
*menu
, gpointer vlp
, gint subtype
, gpointer sublayer
, GtkTreeIter
*iter
);
269 VikLayer
*vik_layer_copy ( VikLayer
*vl
, gpointer vp
);
270 void vik_layer_marshall ( VikLayer
*vl
, guint8
**data
, gint
*len
);
271 VikLayer
*vik_layer_unmarshall ( guint8
*data
, gint len
, VikViewport
*vvp
);
272 void vik_layer_marshall_params ( VikLayer
*vl
, guint8
**data
, gint
*len
);
273 void vik_layer_unmarshall_params ( VikLayer
*vl
, guint8
*data
, gint len
, VikViewport
*vvp
);
275 const gchar
*vik_layer_sublayer_rename_request ( VikLayer
*l
, const gchar
*newname
, gpointer vlp
, gint subtype
, gpointer sublayer
, GtkTreeIter
*iter
);
277 gboolean
vik_layer_sublayer_toggle_visible ( VikLayer
*l
, gint subtype
, gpointer sublayer
);
279 /* TODO: put in layerspanel */
280 GdkPixbuf
*vik_layer_load_icon ( gint type
);
282 VikLayer
*vik_layer_get_and_reset_trigger();
283 void vik_layer_emit_update_secondary ( VikLayer
*vl
); /* to be called by aggregate layer only. doesn't set the trigger */
284 void vik_layer_emit_update_although_invisible ( VikLayer
*vl
);