]> git.street.me.uk Git - andy/viking.git/blobdiff - src/viktreeview.c
On selection of layers panel item, automatically ensure it is fully shown.
[andy/viking.git] / src / viktreeview.c
index f04fc9e5d75ad0043231d00173017bf7f83e428f..56b4165a39d7e54d24bd14bb8d5fedd838f4a002 100644 (file)
@@ -143,6 +143,71 @@ static void treeview_toggled_cb (GtkCellRendererToggle *cell, gchar *path_str, V
 treeview_signals[VT_ITEM_TOGGLED_SIGNAL], 0, &iter );
 }
 
+/* Inspired by GTK+ test
+ * http://git.gnome.org/browse/gtk+/tree/tests/testtooltips.c
+ */
+static gboolean
+treeview_tooltip_cb (GtkWidget  *widget,
+                    gint        x,
+                    gint        y,
+                    gboolean    keyboard_tip,
+                    GtkTooltip *tooltip,
+                    gpointer    data)
+{
+  GtkTreeIter iter;
+  GtkTreeView *tree_view = GTK_TREE_VIEW (widget);
+  GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
+  GtkTreePath *path = NULL;
+
+  char buffer[256];
+
+  if (!gtk_tree_view_get_tooltip_context (tree_view, &x, &y,
+                                         keyboard_tip,
+                                         &model, &path, &iter))
+    return FALSE;
+
+  /* ATM normally treeview doesn't call into layers - maybe another level of redirection required? */
+  gint rv;
+  gtk_tree_model_get (model, &iter, TYPE_COLUMN, &rv, -1);
+  if ( rv == VIK_TREEVIEW_TYPE_SUBLAYER ) {
+
+    gtk_tree_model_get (model, &iter, ITEM_DATA_COLUMN, &rv, -1);
+    // No tooltips ATM for the immediate Tracks / Waypoints tree list
+    if ( rv == 0 || rv == 1 )
+      // VIK_TRW_LAYER_SUBLAYER_WAYPOINTS or VIK_TRW_LAYER_SUBLAYER_TRACKS
+      return FALSE;
+
+    gpointer sublayer;
+    gtk_tree_model_get (model, &iter, ITEM_POINTER_COLUMN, &sublayer, -1);
+
+    gpointer parent;
+    gtk_tree_model_get (model, &iter, ITEM_PARENT_COLUMN, &parent, -1);
+
+    g_snprintf (buffer, sizeof(buffer), "%s", vik_layer_sublayer_tooltip (VIK_LAYER(parent), rv, sublayer));
+  }
+  else if ( rv == VIK_TREEVIEW_TYPE_LAYER ) {
+    gpointer layer;
+    gtk_tree_model_get (model, &iter, ITEM_POINTER_COLUMN, &layer, -1);
+    g_snprintf (buffer, sizeof(buffer), "%s", vik_layer_layer_tooltip (VIK_LAYER(layer)));
+  }
+  else
+    return FALSE;
+
+  // Don't display null strings :)
+  if ( strncmp (buffer, "(null)", 6) == 0 ) {
+    return FALSE;
+  }
+  else {
+    gtk_tooltip_set_markup (tooltip, buffer);
+  }
+
+  gtk_tree_view_set_tooltip_row (tree_view, tooltip, path);
+
+  gtk_tree_path_free (path);
+
+  return TRUE;
+}
+
 VikTreeview *vik_treeview_new ()
 {
   return VIK_TREEVIEW ( g_object_new ( VIK_TREEVIEW_TYPE, NULL ) );
@@ -197,7 +262,7 @@ static void treeview_add_columns ( VikTreeview *vt )
   g_signal_connect (renderer, "edited",
                    G_CALLBACK (treeview_edited_cb), vt);
 
-  g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL);
+  g_object_set (G_OBJECT (renderer), "xalign", 0.0, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
 
   col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (vt),
                                                            -1, _("Layer Name"),
@@ -206,9 +271,11 @@ static void treeview_add_columns ( VikTreeview *vt )
                                                            "editable", EDITABLE_COLUMN,
                                                            NULL);
 
+  /* ATM the minimum overall width (and starting default) of the treeview size is determined
+     by the buttons added to the bottom of the layerspanel */
   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_AUTOSIZE);
+                                   GTK_TREE_VIEW_COLUMN_FIXED);
   gtk_tree_view_column_set_expand (GTK_TREE_VIEW_COLUMN (column), TRUE);
 
   /* Layer type */
@@ -247,6 +314,9 @@ static void treeview_add_columns ( VikTreeview *vt )
   gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column),
                                    GTK_TREE_VIEW_COLUMN_AUTOSIZE);
 
+
+  g_object_set (GTK_TREE_VIEW (vt), "has-tooltip", TRUE, NULL);
+  g_signal_connect (GTK_TREE_VIEW (vt), "query-tooltip", G_CALLBACK (treeview_tooltip_cb), vt);
 }
 
 static void select_cb(GtkTreeSelection *selection, gpointer data)
@@ -257,9 +327,29 @@ static void select_cb(GtkTreeSelection *selection, gpointer data)
   VikLayer *vl;
   VikWindow * vw;
 
+  gpointer tmp_layer;
+  VikLayer *tmp_vl = NULL;
+  gint tmp_subtype = 0;
+  gint tmp_type = VIK_TREEVIEW_TYPE_LAYER;
+
   if (!gtk_tree_selection_get_selected(selection, NULL, &iter)) return;
   type = vik_treeview_item_get_type( vt, &iter);
 
+  /* Find the Sublayer type if possible */
+  tmp_layer = vik_treeview_item_get_pointer ( vt, &iter );
+  if (tmp_layer) {
+    if (type == VIK_TREEVIEW_TYPE_SUBLAYER) {
+      tmp_vl = VIK_LAYER(vik_treeview_item_get_parent(vt, &iter));
+      tmp_subtype = vik_treeview_item_get_data(vt, &iter);
+      tmp_type = VIK_TREEVIEW_TYPE_SUBLAYER;
+    }
+  }
+  else {
+    tmp_subtype = vik_treeview_item_get_data(vt, &iter);
+    tmp_type = VIK_TREEVIEW_TYPE_SUBLAYER;
+  }
+
+  /* Go up the tree to find the Vik Layer */
   while ( type != VIK_TREEVIEW_TYPE_LAYER ) {
     if ( ! vik_treeview_item_get_parent_iter ( vt, &iter, &parent ) )
       return;
@@ -271,6 +361,19 @@ static void select_cb(GtkTreeSelection *selection, gpointer data)
 
   vw = VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vl));
   vik_window_selected_layer(vw, vl);
+
+  if (tmp_vl == NULL)
+    tmp_vl = vl;
+  /* Apply settings now we have the all details  */
+  if ( vik_layer_selected ( tmp_vl,
+                           tmp_subtype,
+                           tmp_layer,
+                           tmp_type,
+                           vik_window_layers_panel(vw) ) ) {
+    /* Redraw required */
+    vik_layers_panel_emit_update ( vik_window_layers_panel(vw) );
+  }
+
 }
 
 static gboolean treeview_selection_filter(GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path, gboolean path_currently_selected, gpointer data)
@@ -375,9 +478,26 @@ gboolean vik_treeview_get_iter_at_pos ( VikTreeview *vt, GtkTreeIter *iter, gint
   return TRUE;
 }
 
-void vik_treeview_select_iter ( VikTreeview *vt, GtkTreeIter *iter )
+/* Option to ensure visible */
+void vik_treeview_select_iter ( VikTreeview *vt, GtkTreeIter *iter, gboolean view_all )
 {
-  gtk_tree_selection_select_iter ( gtk_tree_view_get_selection ( GTK_TREE_VIEW ( vt ) ), iter );
+  GtkTreeView *tree_view = GTK_TREE_VIEW ( vt );
+  GtkTreePath *path;
+
+  if ( view_all ) {
+    path = gtk_tree_model_get_path ( gtk_tree_view_get_model (tree_view), iter );
+    gtk_tree_view_expand_to_path ( tree_view, path );
+  }
+
+  gtk_tree_selection_select_iter ( gtk_tree_view_get_selection ( tree_view ), iter );
+
+  if ( view_all ) {
+    gtk_tree_view_scroll_to_cell  ( tree_view,
+                                   path,
+                                   gtk_tree_view_get_expander_column (tree_view),
+                                   FALSE,
+                                   0.0, 0.0 );
+  }
 }
 
 gboolean vik_treeview_get_selected_iter ( VikTreeview *vt, GtkTreeIter *iter )