X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/70a23263f2aea090c9134e379601e72131797af2..c7fd05d26cebf734a3b3e073bd8e2a39009be4d0:/src/viktreeview.c?ds=sidebyside diff --git a/src/viktreeview.c b/src/viktreeview.c index 3f662cdb..70428030 100644 --- a/src/viktreeview.c +++ b/src/viktreeview.c @@ -25,6 +25,10 @@ #include "viking.h" #include "config.h" +#define VT_COL_WIDTH_NAME 160 +#define VT_COL_WIDTH_TYPE 20 +#define VT_COL_WIDTH_VISIBLE 20 + #define TREEVIEW_GET(model,iter,what,dest) gtk_tree_model_get(GTK_TREE_MODEL(model),(iter),(what),(dest),-1) enum { @@ -172,9 +176,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 ) @@ -199,35 +203,37 @@ static void treeview_add_columns ( VikTreeview *vt ) column = gtk_tree_view_get_column (GTK_TREE_VIEW (vt), col_offset - 1); gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 100); + gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), + VT_COL_WIDTH_NAME); gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE); gtk_tree_view_column_set_resizable (GTK_TREE_VIEW_COLUMN (column), TRUE); renderer = gtk_cell_renderer_pixbuf_new (); - g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL); + g_object_set (G_OBJECT (renderer), "xalign", 0.5, NULL); col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (vt), - -1, "Type", + -1, "", renderer, "pixbuf", ICON_COLUMN, NULL); column = gtk_tree_view_get_column (GTK_TREE_VIEW (vt), col_offset - 1); - gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 33); + gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), + VT_COL_WIDTH_TYPE); gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE); renderer = gtk_cell_renderer_toggle_new (); - g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL); + g_object_set (G_OBJECT (renderer), "xalign", 0.5, NULL); g_signal_connect (renderer, "toggled", G_CALLBACK (treeview_toggled_cb), vt); col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (vt), - -1, "Visible", + -1, "", renderer, "active", VISIBLE_COLUMN, @@ -238,13 +244,38 @@ static void treeview_add_columns ( VikTreeview *vt ) NULL); column = gtk_tree_view_get_column (GTK_TREE_VIEW (vt), col_offset - 1); - gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 40); + gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), + VT_COL_WIDTH_VISIBLE); gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE); } +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_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vl)); + vik_window_selected_layer(vw, vl); +} + void treeview_init ( VikTreeview *vt ) { guint16 i; @@ -279,6 +310,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 +421,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, @@ -481,7 +519,7 @@ static gboolean treeview_drag_data_received (GtkTreeDragDest *drag_dest, GtkTree GtkTreePath *src_path = NULL, *dest_cp = NULL; gboolean retval = FALSE; GtkTreeIter src_iter, root_iter, dest_iter, dest_parent; - guint *i_src = NULL; + gint *i_src = NULL; VikTreeview *vt; VikLayer *vl; @@ -505,6 +543,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 +557,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 +579,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); } }