]> git.street.me.uk Git - andy/viking.git/blobdiff - src/viktreeview.c
Expose VikSlippyMapSource's private fields as properties
[andy/viking.git] / src / viktreeview.c
index 08bec791b70b018f36ad4009cceac06a171463f0..f04fc9e5d75ad0043231d00173017bf7f83e428f 100644 (file)
 #include "viking.h"
 #include "config.h"
 
 #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 {
 #define TREEVIEW_GET(model,iter,what,dest) gtk_tree_model_get(GTK_TREE_MODEL(model),(iter),(what),(dest),-1)
 
 enum {
@@ -69,6 +65,8 @@ struct _VikTreeview {
   GtkTreeModel *model;
 
   GdkPixbuf *layer_type_icons[VIK_LAYER_NUM_TYPES];
   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 */
 };
 
 /* TODO: find, make "static" and put up here all non-"a_" functions */
@@ -139,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 );
 
   /* 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 );
 
   g_signal_emit ( G_OBJECT(vt), 
 treeview_signals[VT_ITEM_TOGGLED_SIGNAL], 0, &iter );
@@ -193,6 +192,7 @@ static void treeview_add_columns ( VikTreeview *vt )
   GtkCellRenderer *renderer;
   GtkTreeViewColumn *column;
 
   GtkCellRenderer *renderer;
   GtkTreeViewColumn *column;
 
+  /* Layer column */
   renderer = gtk_cell_renderer_text_new ();
   g_signal_connect (renderer, "edited",
                    G_CALLBACK (treeview_edited_cb), vt);
   renderer = gtk_cell_renderer_text_new ();
   g_signal_connect (renderer, "edited",
                    G_CALLBACK (treeview_edited_cb), vt);
@@ -208,12 +208,10 @@ 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),
 
   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),
-                                   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);
+                                   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.5, NULL);
   renderer = gtk_cell_renderer_pixbuf_new ();
 
   g_object_set (G_OBJECT (renderer), "xalign", 0.5, NULL);
@@ -224,15 +222,11 @@ static void treeview_add_columns ( VikTreeview *vt )
                                                            ICON_COLUMN,
                                                            NULL);
 
                                                            ICON_COLUMN,
                                                            NULL);
 
-
   column = gtk_tree_view_get_column (GTK_TREE_VIEW (vt), col_offset - 1);
   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),
-                                        VT_COL_WIDTH_TYPE);
   gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column),
   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.5, NULL);
 
   renderer = gtk_cell_renderer_toggle_new ();
   g_object_set (G_OBJECT (renderer), "xalign", 0.5, NULL);
 
@@ -250,11 +244,8 @@ static void treeview_add_columns ( VikTreeview *vt )
                                                            NULL);
 
   column = gtk_tree_view_get_column (GTK_TREE_VIEW (vt), col_offset - 1);
                                                            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),
-                                        VT_COL_WIDTH_VISIBLE);
   gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column),
   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);
 
 }
 
 
 }
 
@@ -282,13 +273,29 @@ static void select_cb(GtkTreeSelection *selection, gpointer data)
   vik_window_selected_layer(vw, 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;
 
 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 */
   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);
   gtk_tree_view_set_model ( GTK_TREE_VIEW(vt), vt->model );
   treeview_add_columns ( vt );
   g_object_unref (vt->model);
@@ -454,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;
 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 );
   g_assert ( iter != NULL );
 
   gtk_tree_model_iter_parent ( vt->model, &parent_iter, iter );
@@ -466,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 );
     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;
     }
       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 );
   } while ( gtk_tree_model_iter_next ( vt->model, &search_iter ) );
 
   gtk_tree_store_move_before ( GTK_TREE_STORE(vt->model), iter, NULL );
@@ -478,7 +489,7 @@ void vik_treeview_add_sublayer_alphabetized
                    gint data, GdkPixbuf *icon, gboolean has_visible, gboolean editable )
 {
   GtkTreeIter search_iter;
                    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 ) )
   g_assert ( iter != NULL );
 
   if ( gtk_tree_model_iter_children ( vt->model, &search_iter, parent_iter ) )
@@ -490,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;
       {
         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;
       }
         break;
       }
+      g_free (search_name);
+      search_name = NULL;
     } while ( gtk_tree_model_iter_next ( vt->model, &search_iter ) );
 
     if ( ! found_greater_string )
     } while ( gtk_tree_model_iter_next ( vt->model, &search_iter ) );
 
     if ( ! found_greater_string )