]> git.street.me.uk Git - andy/viking.git/commitdiff
(no commit message)
authorAlex Foobarian <foobarian@gmail.com>
Mon, 30 Oct 2006 20:51:28 +0000 (20:51 +0000)
committerAlex Foobarian <foobarian@gmail.com>
Mon, 30 Oct 2006 20:51:28 +0000 (20:51 +0000)
ChangeLog
src/menu.xml.h
src/vikaggregatelayer.c
src/vikcoordlayer.c
src/vikgeoreflayer.c
src/viklayer.h
src/viklayerspanel.c
src/vikmapslayer.c
src/viktrwlayer.c
src/vikwindow.c

index b0469e33d3d77fd8c702c8ad4e18ab47d64fa1b7..650463429ac33ef009d5659095cd465fef5f3331 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2006-10-30
+Alex Foobarian <foobarian@gmail.com>:
+       * 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 <foobarian@gmail.com>:
        * Cleared up the drawing modes and map type descriptions
index 3ee3a7174f2ea6d2c898a08712763b110363f394..671c91e89e6a137a7786d6d48057663ac579d91b 100644 (file)
@@ -22,6 +22,13 @@ static const char *menu_xml =
        "      <separator/>"
        "      <menuitem action='Exit'/>"
        "    </menu>"
+       "    <menu action='Edit'>"
+       "      <menuitem action='Cut'/>"
+       "      <menuitem action='Copy'/>"
+       "      <menuitem action='Paste'/>"
+       "      <menuitem action='Delete'/>"
+       "      <menuitem action='DeleteAll'/>"
+       "    </menu>"
        "    <menu action='View'>"
        "      <menuitem action='ModeUTM'/>"
        "      <menuitem action='ModeExpedia'/>"
@@ -54,12 +61,6 @@ static const char *menu_xml =
        "      <menuitem action='BGJobs'/>"
        "    </menu>"
        "    <menu action='Layers'>"
-       "      <menuitem action='Cut'/>"
-       "      <menuitem action='Copy'/>"
-       "      <menuitem action='Paste'/>"
-       "      <menuitem action='Delete'/>"
-       "      <menuitem action='DeleteAll'/>"
-       "      <separator/>"
        "      <menuitem action='Properties'/>"
        "      <separator/>"
        "    </menu>"
@@ -76,6 +77,13 @@ static const char *menu_xml =
        "      <toolitem name='Exit' action='Exit'/>"
        "      <separator/>"
        "    </placeholder>"
+       "    <placeholder name='EditToolItems'>"
+       "      <toolitem name='Cut' action='Cut'/>"
+       "      <toolitem name='Copy' action='Copy'/>"
+       "      <toolitem name='Paste' action='Paste'/>"
+       "      <toolitem name='Delete' action='Delete'/>"
+       "      <separator/>"
+       "    </placeholder>"
        "    <placeholder name='ToolItems'>"
        "    <toolitem action='Zoom'/>"
        "    <toolitem action='Ruler'/>"
index be4b2889d333d01455c4985fc0bb553150330e4e..2aaf48dcca4d53e8bb114167073b3c56011552a1 100644 (file)
@@ -69,6 +69,7 @@ VikLayerInterface vik_aggregate_layer_interface = {
   (VikLayerFuncReadFileData)            NULL,
   (VikLayerFuncWriteFileData)           NULL,
 
+  (VikLayerFuncDeleteItem)              NULL,
   (VikLayerFuncCopyItem)                NULL,
   (VikLayerFuncPasteItem)               NULL,
   (VikLayerFuncFreeCopiedItem)          NULL,
index 58554facb4b9dcde931c7bd4c61d6d907975585b..c00f30628de9c3e5a46cc08b957138af6614a122 100644 (file)
@@ -82,6 +82,7 @@ VikLayerInterface vik_coord_layer_interface = {
   (VikLayerFuncReadFileData)            NULL,
   (VikLayerFuncWriteFileData)           NULL,
 
+  (VikLayerFuncDeleteItem)              NULL,
   (VikLayerFuncCopyItem)                NULL,
   (VikLayerFuncPasteItem)               NULL,
   (VikLayerFuncFreeCopiedItem)          NULL,
index 9fb43ff14e02291068faf974daf8195aa0569ddb..f969274b22597de9fe7fa8209336a7114c9a69f2 100644 (file)
@@ -101,6 +101,7 @@ VikLayerInterface vik_georef_layer_interface = {
   (VikLayerFuncReadFileData)            NULL,
   (VikLayerFuncWriteFileData)           NULL,
 
+  (VikLayerFuncDeleteItem)              NULL,
   (VikLayerFuncCopyItem)                NULL,
   (VikLayerFuncPasteItem)               NULL,
   (VikLayerFuncFreeCopiedItem)          NULL,
index 01331c986e1493d7d4c140be38c678baa5829d71..629f86c3cfca8c661572f1c8d734172930138386 100644 (file)
@@ -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;
index 636c4daf1a8b651ab4b29215a538748c6ba28d5d..23de5c5ea1540c86e970057194952147c283d4bb 100644 (file)
@@ -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 )
index 716e9972c0d10c57860c41346c45fbf75c8f6479..3ef8ea903746fb5144c48c13598be277c20c1ccb 100644 (file)
@@ -174,6 +174,7 @@ VikLayerInterface vik_maps_layer_interface = {
   (VikLayerFuncReadFileData)            NULL,
   (VikLayerFuncWriteFileData)           NULL,
 
+  (VikLayerFuncDeleteItem)              NULL,
   (VikLayerFuncCopyItem)                NULL,
   (VikLayerFuncPasteItem)               NULL,
   (VikLayerFuncFreeCopiedItem)          NULL,
index 6cd7dc905ade63b402d48733df809321a65d07a1..37479926a02b12655379ca562ce0ae407a649a31 100644 (file)
@@ -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! */
index 1c82f01ac54ea0e0490988707042e31c5de62b05..fd6dd7fd4a6937a49345d43c6c3bc79637ede18b 100644 (file)
@@ -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 },