X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/119f63a0bab39b86f73676969b07fc86978a1329..e13ab673e45ea48de49661f7838e75925f405514:/src/viktreeview.c?ds=sidebyside diff --git a/src/viktreeview.c b/src/viktreeview.c index 9eb401dd..f04fc9e5 100644 --- a/src/viktreeview.c +++ b/src/viktreeview.c @@ -19,7 +19,13 @@ * */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include +#include + #include #include "viking.h" @@ -59,6 +65,8 @@ struct _VikTreeview { GtkTreeModel *model; GdkPixbuf *layer_type_icons[VIK_LAYER_NUM_TYPES]; + + gboolean was_a_toggle; }; /* TODO: find, make "static" and put up here all non-"a_" functions */ @@ -129,6 +137,7 @@ static void treeview_toggled_cb (GtkCellRendererToggle *cell, gchar *path_str, V /* get type and data */ vik_treeview_get_iter_from_path_str ( vt, &iter, path_str ); + vt->was_a_toggle = TRUE; g_signal_emit ( G_OBJECT(vt), treeview_signals[VT_ITEM_TOGGLED_SIGNAL], 0, &iter ); @@ -183,6 +192,7 @@ static void treeview_add_columns ( VikTreeview *vt ) GtkCellRenderer *renderer; GtkTreeViewColumn *column; + /* Layer column */ renderer = gtk_cell_renderer_text_new (); g_signal_connect (renderer, "edited", G_CALLBACK (treeview_edited_cb), vt); @@ -190,7 +200,7 @@ static void treeview_add_columns ( VikTreeview *vt ) g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL); col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (vt), - -1, "Layer Name", + -1, _("Layer Name"), renderer, "text", NAME_COLUMN, "editable", EDITABLE_COLUMN, @@ -198,36 +208,32 @@ 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_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE); - gtk_tree_view_column_set_resizable (GTK_TREE_VIEW_COLUMN (column), TRUE); + GTK_TREE_VIEW_COLUMN_AUTOSIZE); + gtk_tree_view_column_set_expand (GTK_TREE_VIEW_COLUMN (column), TRUE); + /* Layer type */ 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_sizing (GTK_TREE_VIEW_COLUMN (column), - GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE); - + GTK_TREE_VIEW_COLUMN_AUTOSIZE); + /* Layer visible */ 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,10 +244,8 @@ 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_sizing (GTK_TREE_VIEW_COLUMN (column), - GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE); + GTK_TREE_VIEW_COLUMN_AUTOSIZE); } @@ -265,17 +269,33 @@ static void select_cb(GtkTreeSelection *selection, gpointer data) vl = VIK_LAYER( vik_treeview_item_get_pointer ( vt, &iter ) ); - vw = VIK_GTK_WINDOW_FROM_LAYER(vl); + vw = VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vl)); vik_window_selected_layer(vw, vl); } +static gboolean treeview_selection_filter(GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path, gboolean path_currently_selected, gpointer data) +{ + VikTreeview *vt = data; + + if (vt->was_a_toggle) { + vt->was_a_toggle = FALSE; + return FALSE; + } + + return TRUE; +} + void treeview_init ( VikTreeview *vt ) { guint16 i; + vt->was_a_toggle = FALSE; + vt->model = GTK_TREE_MODEL(gtk_tree_store_new ( NUM_COLUMNS, G_TYPE_STRING, G_TYPE_BOOLEAN, GDK_TYPE_PIXBUF, G_TYPE_INT, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_INT, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN )); /* create tree view */ + gtk_tree_selection_set_select_function(gtk_tree_view_get_selection (GTK_TREE_VIEW(vt)), treeview_selection_filter, vt, NULL); + gtk_tree_view_set_model ( GTK_TREE_VIEW(vt), vt->model ); treeview_add_columns ( vt ); g_object_unref (vt->model); @@ -441,7 +461,7 @@ void vik_treeview_add_sublayer ( VikTreeview *vt, GtkTreeIter *parent_iter, GtkT void vik_treeview_sublayer_realphabetize ( VikTreeview *vt, GtkTreeIter *iter, const gchar *newname ) { GtkTreeIter search_iter, parent_iter; - gchar *search_name; + gchar *search_name = NULL; g_assert ( iter != NULL ); gtk_tree_model_iter_parent ( vt->model, &parent_iter, iter ); @@ -453,8 +473,12 @@ void vik_treeview_sublayer_realphabetize ( VikTreeview *vt, GtkTreeIter *iter, c if ( strcmp ( search_name, newname ) > 0 ) /* not >= or would trip on itself */ { gtk_tree_store_move_before ( GTK_TREE_STORE(vt->model), iter, &search_iter ); + g_free (search_name); + search_name = NULL; return; } + g_free (search_name); + search_name = NULL; } while ( gtk_tree_model_iter_next ( vt->model, &search_iter ) ); gtk_tree_store_move_before ( GTK_TREE_STORE(vt->model), iter, NULL ); @@ -465,7 +489,7 @@ void vik_treeview_add_sublayer_alphabetized gint data, GdkPixbuf *icon, gboolean has_visible, gboolean editable ) { GtkTreeIter search_iter; - gchar *search_name; + gchar *search_name = NULL; g_assert ( iter != NULL ); if ( gtk_tree_model_iter_children ( vt->model, &search_iter, parent_iter ) ) @@ -477,8 +501,12 @@ void vik_treeview_add_sublayer_alphabetized { gtk_tree_store_insert_before ( GTK_TREE_STORE(vt->model), iter, parent_iter, &search_iter ); found_greater_string = TRUE; + g_free (search_name); + search_name = NULL; break; } + g_free (search_name); + search_name = NULL; } while ( gtk_tree_model_iter_next ( vt->model, &search_iter ) ); if ( ! found_greater_string ) @@ -512,7 +540,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; @@ -593,7 +621,7 @@ static gboolean treeview_drag_data_received (GtkTreeDragDest *drag_dest, GtkTree static gboolean treeview_drag_data_delete ( GtkTreeDragSource *drag_source, GtkTreePath *path ) { gchar *s_dest = gtk_tree_path_to_string(path); - g_print("delete data from %s\n", s_dest); + g_print(_("delete data from %s\n"), s_dest); g_free(s_dest); return FALSE; }