From 33534cd89a6eb1529e8adda0619e34e6326fcaa8 Mon Sep 17 00:00:00 2001 From: Alex Foobarian Date: Mon, 30 Oct 2006 20:51:28 +0000 Subject: [PATCH] --- ChangeLog | 6 +++ src/menu.xml.h | 20 +++++--- src/vikaggregatelayer.c | 1 + src/vikcoordlayer.c | 1 + src/vikgeoreflayer.c | 1 + src/viklayer.h | 5 ++ src/viklayerspanel.c | 6 +++ src/vikmapslayer.c | 1 + src/viktrwlayer.c | 111 +++++++++++++++++++++++++++++++++++++--- src/vikwindow.c | 1 + 10 files changed, 140 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index b0469e33..65046342 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2006-10-30 +Alex Foobarian : + * Created standard Edit menu + * Implemented Cut for trackpoints and waypoints + * When moving trackpoints, we now draw one under the cursor for visual feedback + 2006-10-26 Alex Foobarian : * Cleared up the drawing modes and map type descriptions diff --git a/src/menu.xml.h b/src/menu.xml.h index 3ee3a717..671c91e8 100644 --- a/src/menu.xml.h +++ b/src/menu.xml.h @@ -22,6 +22,13 @@ static const char *menu_xml = " " " " " " + " " + " " + " " + " " + " " + " " + " " " " " " " " @@ -54,12 +61,6 @@ static const char *menu_xml = " " " " " " - " " - " " - " " - " " - " " - " " " " " " " " @@ -76,6 +77,13 @@ static const char *menu_xml = " " " " " " + " " + " " + " " + " " + " " + " " + " " " " " " " " diff --git a/src/vikaggregatelayer.c b/src/vikaggregatelayer.c index be4b2889..2aaf48dc 100644 --- a/src/vikaggregatelayer.c +++ b/src/vikaggregatelayer.c @@ -69,6 +69,7 @@ VikLayerInterface vik_aggregate_layer_interface = { (VikLayerFuncReadFileData) NULL, (VikLayerFuncWriteFileData) NULL, + (VikLayerFuncDeleteItem) NULL, (VikLayerFuncCopyItem) NULL, (VikLayerFuncPasteItem) NULL, (VikLayerFuncFreeCopiedItem) NULL, diff --git a/src/vikcoordlayer.c b/src/vikcoordlayer.c index 58554fac..c00f3062 100644 --- a/src/vikcoordlayer.c +++ b/src/vikcoordlayer.c @@ -82,6 +82,7 @@ VikLayerInterface vik_coord_layer_interface = { (VikLayerFuncReadFileData) NULL, (VikLayerFuncWriteFileData) NULL, + (VikLayerFuncDeleteItem) NULL, (VikLayerFuncCopyItem) NULL, (VikLayerFuncPasteItem) NULL, (VikLayerFuncFreeCopiedItem) NULL, diff --git a/src/vikgeoreflayer.c b/src/vikgeoreflayer.c index 9fb43ff1..f969274b 100644 --- a/src/vikgeoreflayer.c +++ b/src/vikgeoreflayer.c @@ -101,6 +101,7 @@ VikLayerInterface vik_georef_layer_interface = { (VikLayerFuncReadFileData) NULL, (VikLayerFuncWriteFileData) NULL, + (VikLayerFuncDeleteItem) NULL, (VikLayerFuncCopyItem) NULL, (VikLayerFuncPasteItem) NULL, (VikLayerFuncFreeCopiedItem) NULL, diff --git a/src/viklayer.h b/src/viklayer.h index 01331c98..629f86c3 100644 --- a/src/viklayer.h +++ b/src/viklayer.h @@ -188,7 +188,11 @@ typedef VikLayerParamData typedef void (*VikLayerFuncReadFileData) (VikLayer *, FILE *); typedef void (*VikLayerFuncWriteFileData) (VikLayer *, FILE *); +/* item manipulation */ +typedef void (*VikLayerFuncDeleteItem) (VikLayer *, gint, gpointer); + /* layer, subtype, pointer to sub-item */ typedef void (*VikLayerFuncCopyItem) (VikLayer *, gint, gpointer, guint8 **, guint *); + /* layer, subtype, pointer to sub-item, return pointer, return len */ typedef gboolean (*VikLayerFuncPasteItem) (VikLayer *, gint, guint8 *, guint); typedef void (*VikLayerFuncFreeCopiedItem) (gint, gpointer); @@ -240,6 +244,7 @@ struct _VikLayerInterface { VikLayerFuncReadFileData read_file_data; VikLayerFuncWriteFileData write_file_data; + VikLayerFuncDeleteItem delete_item; VikLayerFuncCopyItem copy_item; VikLayerFuncPasteItem paste_item; VikLayerFuncFreeCopiedItem free_copied_item; diff --git a/src/viklayerspanel.c b/src/viklayerspanel.c index 636c4daf..23de5c5e 100644 --- a/src/viklayerspanel.c +++ b/src/viklayerspanel.c @@ -491,6 +491,12 @@ void vik_layers_panel_delete_selected ( VikLayersPanel *vlp ) else a_dialog_info_msg ( VIK_GTK_WINDOW_FROM_WIDGET(vlp), "You cannot delete the Top Layer." ); } + else if (type == VIK_TREEVIEW_TYPE_SUBLAYER) { + VikLayer *sel = vik_layers_panel_get_selected ( vlp ); + if ( vik_layer_get_interface(sel->type)->delete_item ) { + vik_layer_get_interface(sel->type)->delete_item ( sel, type, vik_treeview_item_get_pointer(sel->vt, &iter) ); + } + } } VikLayer *vik_layers_panel_get_selected ( VikLayersPanel *vlp ) diff --git a/src/vikmapslayer.c b/src/vikmapslayer.c index 716e9972..3ef8ea90 100644 --- a/src/vikmapslayer.c +++ b/src/vikmapslayer.c @@ -174,6 +174,7 @@ VikLayerInterface vik_maps_layer_interface = { (VikLayerFuncReadFileData) NULL, (VikLayerFuncWriteFileData) NULL, + (VikLayerFuncDeleteItem) NULL, (VikLayerFuncCopyItem) NULL, (VikLayerFuncPasteItem) NULL, (VikLayerFuncFreeCopiedItem) NULL, diff --git a/src/viktrwlayer.c b/src/viktrwlayer.c index 6cd7dc90..37479926 100644 --- a/src/viktrwlayer.c +++ b/src/viktrwlayer.c @@ -154,6 +154,8 @@ struct DrawingParams { gdouble ce1, ce2, cn1, cn2; }; +static void trw_layer_delete_item ( gpointer *pass_along ); + static void trw_layer_find_maxmin_waypoints ( const gchar *name, const VikWaypoint *w, struct LatLon maxmin[2] ); static void trw_layer_find_maxmin_tracks ( const gchar *name, GList **t, struct LatLon maxmin[2] ); @@ -191,6 +193,7 @@ static VikTrwLayer *trw_layer_unmarshall( gpointer data, gint len, VikViewport * static gboolean trw_layer_set_param ( VikTrwLayer *vtl, guint16 id, VikLayerParamData data, VikViewport *vp ); static VikLayerParamData trw_layer_get_param ( VikTrwLayer *vtl, guint16 id ); +static void trw_layer_del_item ( VikTrwLayer *vtl, gint subtype, gpointer sublayer ); static void trw_layer_copy_item ( VikTrwLayer *vtl, gint subtype, gpointer sublayer, guint8 **item, guint *len ); static gboolean trw_layer_paste_item ( VikTrwLayer *vtl, gint subtype, guint8 *item, guint len ); static void trw_layer_free_copied_item ( gint subtype, gpointer item ); @@ -203,8 +206,9 @@ static void trw_layer_tpwin_response ( VikTrwLayer *vtl, gint response ); static void trw_layer_tpwin_init ( VikTrwLayer *vtl ); static gpointer tool_edit_trackpoint_create ( VikWindow *vw, VikViewport *vvp); -static gboolean tool_edit_trackpoint_click ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp ); -static gboolean tool_edit_trackpoint_release ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp ); +static gboolean tool_edit_trackpoint_click ( VikTrwLayer *vtl, GdkEventButton *event, gpointer data ); +static gboolean tool_edit_trackpoint_move ( VikTrwLayer *vtl, GdkEventButton *event, gpointer data ); +static gboolean tool_edit_trackpoint_release ( VikTrwLayer *vtl, GdkEventButton *event, gpointer data ); static gpointer tool_show_picture_create ( VikWindow *vw, VikViewport *vvp); static gboolean tool_show_picture_click ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp ); static gpointer tool_edit_waypoint_create ( VikWindow *vw, VikViewport *vvp); @@ -241,7 +245,9 @@ static VikToolInterface trw_layer_tools[] = { (VikToolMouseFunc) tool_edit_waypoint_click, NULL, (VikToolMouseFunc) tool_edit_waypoint_release }, { "Edit Trackpoint", (VikToolConstructorFunc) tool_edit_trackpoint_create, NULL, NULL, NULL, - (VikToolMouseFunc) tool_edit_trackpoint_click, NULL, (VikToolMouseFunc) tool_edit_trackpoint_release }, + (VikToolMouseFunc) tool_edit_trackpoint_click, + (VikToolMouseFunc) tool_edit_trackpoint_move, + (VikToolMouseFunc) tool_edit_trackpoint_release }, { "Show Picture", (VikToolConstructorFunc) tool_show_picture_create, NULL, NULL, NULL, (VikToolMouseFunc) tool_show_picture_click, NULL, NULL }, @@ -346,6 +352,7 @@ VikLayerInterface vik_trw_layer_interface = { (VikLayerFuncReadFileData) a_gpspoint_read_file, (VikLayerFuncWriteFileData) a_gpspoint_write_file, + (VikLayerFuncDeleteItem) trw_layer_del_item, (VikLayerFuncCopyItem) trw_layer_copy_item, (VikLayerFuncPasteItem) trw_layer_paste_item, (VikLayerFuncFreeCopiedItem) trw_layer_free_copied_item, @@ -385,6 +392,21 @@ GType vik_trw_layer_get_type () return vtl_type; } +static void trw_layer_del_item ( VikTrwLayer *vtl, gint subtype, gpointer sublayer ) +{ + static gpointer pass_along[5]; + if (!sublayer) { + return; + } + + pass_along[0] = vtl; + pass_along[1] = NULL; + pass_along[2] = (gpointer) subtype; + pass_along[3] = sublayer; + pass_along[4] = NULL; + + trw_layer_delete_item ( pass_along ); +} static void trw_layer_copy_item ( VikTrwLayer *vtl, gint subtype, gpointer sublayer, guint8 **item, guint *len ) { @@ -2778,14 +2800,26 @@ static gboolean tool_new_waypoint_click ( VikTrwLayer *vtl, GdkEventButton *even /*** Edit trackpoint ****/ +typedef struct { + VikViewport *vvp; + gboolean holding; + GdkGC *gc; + int oldx, oldy; +} tool_edtr_t; + static gpointer tool_edit_trackpoint_create ( VikWindow *vw, VikViewport *vvp) { - return vvp; + tool_edtr_t *t = g_new(tool_edtr_t, 1); + t->vvp = vvp; + t->holding = FALSE; + return t; } -static gboolean tool_edit_trackpoint_click ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp ) +static gboolean tool_edit_trackpoint_click ( VikTrwLayer *vtl, GdkEventButton *event, gpointer data ) { - TPSearchParams params; + tool_edtr_t *t = data; + VikViewport *vvp = t->vvp; + TPSearchParams params; /* OUTDATED DOCUMENTATION: find 5 pixel range on each side. then put these UTM, and a pointer to the winning track name (and maybe the winning track itself), and a @@ -2817,6 +2851,13 @@ static gboolean tool_edit_trackpoint_click ( VikTrwLayer *vtl, GdkEventButton *e abs(y - event->y) < TRACKPOINT_SIZE_APPROX ) { vtl->moving_tp = TRUE; + t->holding = TRUE; + t->gc = vik_viewport_new_gc (vvp, "black", 2); + gdk_gc_set_function ( t->gc, GDK_INVERT ); + vik_viewport_draw_rectangle ( vvp, t->gc, FALSE, event->x-3, event->y-3, 6, 6 ); + vik_viewport_sync(vvp); + t->oldx = event->x; + t->oldy = event->y; return TRUE; } @@ -2840,16 +2881,70 @@ static gboolean tool_edit_trackpoint_click ( VikTrwLayer *vtl, GdkEventButton *e return FALSE; } +static gboolean edtr_sync_done = TRUE; + +static gboolean edtr_sync(gpointer data) +{ + VikViewport *vvp = data; + gdk_threads_enter(); + vik_viewport_sync(vvp); + edtr_sync_done = TRUE; + gdk_threads_leave(); + return FALSE; +} + +static gboolean tool_edit_trackpoint_move ( VikTrwLayer *vtl, GdkEventButton *event, gpointer data ) +{ + tool_edtr_t *t = data; + VikViewport *vvp = t->vvp; + + if (!vtl || vtl->vl.type != VIK_LAYER_TRW) + return FALSE; + + if ( t->holding ) + { + VikCoord new_coord; + GdkGC *gc; + vik_viewport_screen_to_coord ( vvp, event->x, event->y, &new_coord ); + + /* snap to TP */ + if ( event->state & GDK_CONTROL_MASK ) + { + VikTrackpoint *tp = closest_tp_in_five_pixel_interval ( vtl, vvp, event->x, event->y ); + if ( tp && tp != vtl->current_tpl->data ) + new_coord = tp->coord; + } + // VIK_TRACKPOINT(vtl->current_tpl->data)->coord = new_coord; + vik_viewport_draw_rectangle ( vvp, t->gc, FALSE, t->oldx-3, t->oldy-3, 6, 6 ); + vik_viewport_draw_rectangle ( vvp, t->gc, FALSE, event->x-3, event->y-3, 6, 6 ); + t->oldx = event->x; + t->oldy = event->y; + if (edtr_sync_done) { + g_idle_add_full (G_PRIORITY_HIGH_IDLE + 10, edtr_sync, vvp, NULL); + edtr_sync_done = FALSE; + } + + return TRUE; + } + return FALSE; +} + -static gboolean tool_edit_trackpoint_release ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp ) +static gboolean tool_edit_trackpoint_release ( VikTrwLayer *vtl, GdkEventButton *event, gpointer data ) { + tool_edtr_t *t = data; + VikViewport *vvp = t->vvp; + if (!vtl || vtl->vl.type != VIK_LAYER_TRW) return FALSE; + + /* xxx: this state is now in the tool instance... fix this */ if ( vtl->moving_tp ) { /* vtl->moving_tp_x, vtl->moving_tp_y, etc. */ VikCoord new_coord; vtl->moving_tp = FALSE; + t->holding = FALSE; vik_viewport_screen_to_coord ( vvp, event->x, event->y, &new_coord ); /* snap to TP */ @@ -2862,6 +2957,8 @@ static gboolean tool_edit_trackpoint_release ( VikTrwLayer *vtl, GdkEventButton VIK_TRACKPOINT(vtl->current_tpl->data)->coord = new_coord; + vik_viewport_draw_rectangle ( vvp, t->gc, FALSE, t->oldx-3, t->oldy-3, 6, 6 ); + /* diff dist is diff from orig */ vik_trw_layer_tpwin_set_tp ( vtl->tpwin, vtl->current_tpl, vtl->current_tp_track_name ); /* can't join with itself! */ diff --git a/src/vikwindow.c b/src/vikwindow.c index 1c82f01a..fd6dd7fd 100644 --- a/src/vikwindow.c +++ b/src/vikwindow.c @@ -1518,6 +1518,7 @@ static void set_bg_color ( GtkAction *a, VikWindow *vw ) static GtkActionEntry entries[] = { { "File", NULL, "_File", 0, 0, 0 }, + { "Edit", NULL, "_Edit", 0, 0, 0 }, { "View", NULL, "_View", 0, 0, 0 }, { "SetZoom", NULL, "_Zoom", 0, 0, 0 }, { "Layers", NULL, "_Layers", 0, 0, 0 }, -- 2.39.5