]> git.street.me.uk Git - andy/viking.git/blobdiff - src/viktreeview.c
Gpslayer: New menu items to remove all tracks and waypoints in GPS folders.
[andy/viking.git] / src / viktreeview.c
index 3f662cdb22639d4434016afcef1ad61227086034..9eb401ddc12a9774f35bd1ee3074fd9cbe7a0b61 100644 (file)
@@ -172,9 +172,9 @@ gpointer vik_treeview_item_get_parent ( VikTreeview *vt, GtkTreeIter *iter )
   return rv;
 }
 
-void vik_treeview_get_iter_from_path_str ( VikTreeview *vt, GtkTreeIter *iter, const gchar *path_str )
+gboolean vik_treeview_get_iter_from_path_str ( VikTreeview *vt, GtkTreeIter *iter, const gchar *path_str )
 {
-  gtk_tree_model_get_iter_from_string ( GTK_TREE_MODEL(vt->model), iter, path_str );
+  return gtk_tree_model_get_iter_from_string ( GTK_TREE_MODEL(vt->model), iter, path_str );
 }
 
 static void treeview_add_columns ( VikTreeview *vt )
@@ -245,6 +245,30 @@ static void treeview_add_columns ( VikTreeview *vt )
 
 }
 
+static void select_cb(GtkTreeSelection *selection, gpointer data)
+{
+  VikTreeview *vt = data;
+  gint type;
+  GtkTreeIter iter, parent;
+  VikLayer *vl;
+  VikWindow * vw;
+
+  if (!gtk_tree_selection_get_selected(selection, NULL, &iter)) return;
+  type = vik_treeview_item_get_type( vt, &iter);
+
+  while ( type != VIK_TREEVIEW_TYPE_LAYER ) {
+    if ( ! vik_treeview_item_get_parent_iter ( vt, &iter, &parent ) )
+      return;
+    iter = parent;
+    type = vik_treeview_item_get_type (vt, &iter );
+  }
+
+  vl = VIK_LAYER( vik_treeview_item_get_pointer ( vt, &iter ) );
+
+  vw = VIK_GTK_WINDOW_FROM_LAYER(vl);
+  vik_window_selected_layer(vw, vl);
+}
+
 void treeview_init ( VikTreeview *vt )
 {
   guint16 i;
@@ -279,6 +303,8 @@ void treeview_init ( VikTreeview *vt )
     vt->layer_type_icons[i] = vik_layer_load_icon ( i ); /* if icon can't be loaded, it will be null and simply not be shown. */
 
   gtk_tree_view_set_reorderable (GTK_TREE_VIEW(vt), TRUE);
+  g_signal_connect(gtk_tree_view_get_selection (GTK_TREE_VIEW (vt)), "changed",
+      G_CALLBACK(select_cb), vt);
 
 }
 
@@ -388,7 +414,12 @@ void vik_treeview_insert_layer ( VikTreeview *vt, GtkTreeIter *parent_iter, GtkT
 {
   g_assert ( iter != NULL );
   g_assert ( icon_type < VIK_LAYER_NUM_TYPES );
-  gtk_tree_store_insert_before ( GTK_TREE_STORE(vt->model), iter, parent_iter, sibling );
+  if (sibling) {
+    gtk_tree_store_insert_before ( GTK_TREE_STORE(vt->model), iter, parent_iter, sibling );
+  } else {
+    gtk_tree_store_append ( GTK_TREE_STORE(vt->model), iter, parent_iter );
+  }
+    
   gtk_tree_store_set ( GTK_TREE_STORE(vt->model), iter, NAME_COLUMN, name, VISIBLE_COLUMN, TRUE, 
     TYPE_COLUMN, VIK_TREEVIEW_TYPE_LAYER, ITEM_PARENT_COLUMN, parent, ITEM_POINTER_COLUMN, item, 
     ITEM_DATA_COLUMN, data, HAS_VISIBLE_COLUMN, TRUE, EDITABLE_COLUMN, TRUE,
@@ -505,6 +536,13 @@ static gboolean treeview_drag_data_received (GtkTreeDragDest *drag_dest, GtkTree
      *    and call the move method of that layer type. 
      *
      */
+    if (!gtk_tree_model_get_iter (src_model, &src_iter, src_path)) {
+      goto out;
+    }
+    if (!gtk_tree_path_compare(src_path, dest)) {
+      goto out;
+    }
+
     i_src = gtk_tree_path_get_indices (src_path);
     dest_cp = gtk_tree_path_copy (dest);
 
@@ -512,9 +550,6 @@ static gboolean treeview_drag_data_received (GtkTreeDragDest *drag_dest, GtkTree
     TREEVIEW_GET(tree_model, &root_iter, ITEM_POINTER_COLUMN, &vl);
     vt = vl->vt;
 
-    if (!gtk_tree_model_get_iter (src_model, &src_iter, src_path)) {
-      goto out;
-    }
 
     if (gtk_tree_path_get_depth(dest_cp)>1) { /* can't be sibling of top layer */
       VikLayer *vl_src, *vl_dest;
@@ -537,7 +572,7 @@ static gboolean treeview_drag_data_received (GtkTreeDragDest *drag_dest, GtkTree
 
       /* TODO: might want to allow different types, and let the clients handle how they want */
       if (vl_src->type == vl_dest->type && vik_layer_get_interface(vl_dest->type)->drag_drop_request) {
-       g_print("moving an item from layer '%s' into layer '%s'\n", vl_src->name, vl_dest->name);
+       //      g_print("moving an item from layer '%s' into layer '%s'\n", vl_src->name, vl_dest->name);
        vik_layer_get_interface(vl_dest->type)->drag_drop_request(vl_src, vl_dest, &src_iter, dest);
       }    
     }