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 ) );
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"),
"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 */
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)
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;
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)
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 )