From bdd1c4126d1bb79b6a4d8dfa0f154d2b8330a93c Mon Sep 17 00:00:00 2001 From: Rob Norris Date: Sun, 5 Sep 2010 17:32:19 +0100 Subject: [PATCH] On selection of layers panel item, automatically ensure it is fully shown. --- src/viklayerspanel.c | 2 +- src/viktreeview.c | 21 +++++++++++++++++++-- src/viktreeview.h | 2 +- src/viktrwlayer.c | 10 +++++----- 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/viklayerspanel.c b/src/viklayerspanel.c index 8b85c2c0..3b896b3d 100644 --- a/src/viklayerspanel.c +++ b/src/viklayerspanel.c @@ -471,7 +471,7 @@ static void layers_move_item ( VikLayersPanel *vlp, gboolean up ) if ( ! vik_treeview_get_selected_iter ( vlp->vt, &iter ) ) return; - vik_treeview_select_iter ( vlp->vt, &iter ); /* cancel any layer-name editing going on... */ + vik_treeview_select_iter ( vlp->vt, &iter, FALSE ); /* cancel any layer-name editing going on... */ if ( vik_treeview_item_get_type ( vlp->vt, &iter ) == VIK_TREEVIEW_TYPE_LAYER ) { diff --git a/src/viktreeview.c b/src/viktreeview.c index 0e8fc1ba..56b4165a 100644 --- a/src/viktreeview.c +++ b/src/viktreeview.c @@ -478,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 ) diff --git a/src/viktreeview.h b/src/viktreeview.h index b6a28db5..01b0ec11 100644 --- a/src/viktreeview.h +++ b/src/viktreeview.h @@ -65,7 +65,7 @@ void vik_treeview_item_set_pointer ( VikTreeview *vt, GtkTreeIter *iter, gpointe gpointer vik_treeview_item_get_parent ( VikTreeview *vt, GtkTreeIter *iter ); -void vik_treeview_select_iter ( VikTreeview *vt, GtkTreeIter *iter ); +void vik_treeview_select_iter ( VikTreeview *vt, GtkTreeIter *iter, gboolean view_all ); gboolean vik_treeview_get_selected_iter ( VikTreeview *vt, GtkTreeIter *iter ); void vik_treeview_item_set_name ( VikTreeview *vt, GtkTreeIter *iter, const gchar *to ); diff --git a/src/viktrwlayer.c b/src/viktrwlayer.c index 1598836e..8938d59c 100644 --- a/src/viktrwlayer.c +++ b/src/viktrwlayer.c @@ -2118,7 +2118,7 @@ static void trw_layer_goto_wp ( gpointer layer_and_vlp[2] ) { vik_viewport_set_center_coord ( vik_layers_panel_get_viewport(VIK_LAYERS_PANEL(layer_and_vlp[1])), &(wp->coord) ); vik_layers_panel_emit_update ( VIK_LAYERS_PANEL(layer_and_vlp[1]) ); - vik_treeview_select_iter ( VIK_LAYER(layer_and_vlp[0])->vt, g_hash_table_lookup ( VIK_TRW_LAYER(layer_and_vlp[0])->waypoints_iters, upname ) ); + vik_treeview_select_iter ( VIK_LAYER(layer_and_vlp[0])->vt, g_hash_table_lookup ( VIK_TRW_LAYER(layer_and_vlp[0])->waypoints_iters, upname ), TRUE ); break; } @@ -2363,7 +2363,7 @@ void vik_trw_layer_add_waypoint ( VikTrwLayer *vtl, gchar *name, VikWaypoint *wp #endif // Actual setting of visibility dependent on the waypoint vik_treeview_item_set_visible ( VIK_LAYER(vtl)->vt, iter, wp->visible ); - vik_treeview_select_iter ( VIK_LAYER(vtl)->vt, iter ); + vik_treeview_select_iter ( VIK_LAYER(vtl)->vt, iter, TRUE ); g_hash_table_insert ( vtl->waypoints_iters, name, iter ); } } @@ -2391,7 +2391,7 @@ void vik_trw_layer_add_track ( VikTrwLayer *vtl, gchar *name, VikTrack *t ) #endif // Actual setting of visibility dependent on the track vik_treeview_item_set_visible ( VIK_LAYER(vtl)->vt, iter, t->visible ); - vik_treeview_select_iter ( VIK_LAYER(vtl)->vt, iter ); + vik_treeview_select_iter ( VIK_LAYER(vtl)->vt, iter, TRUE ); g_hash_table_insert ( vtl->tracks_iters, name, iter ); } } @@ -3998,7 +3998,7 @@ static gboolean tool_edit_waypoint_click ( VikTrwLayer *vtl, GdkEventButton *eve vtl->current_wp_name = params.closest_wp_name; if ( params.closest_wp ) - vik_treeview_select_iter ( VIK_LAYER(vtl)->vt, g_hash_table_lookup ( vtl->waypoints_iters, vtl->current_wp_name ) ); + vik_treeview_select_iter ( VIK_LAYER(vtl)->vt, g_hash_table_lookup ( vtl->waypoints_iters, vtl->current_wp_name ), TRUE ); /* could make it so don't update if old WP is off screen and new is null but oh well */ vik_layer_emit_update ( VIK_LAYER(vtl) ); @@ -4347,7 +4347,7 @@ static gboolean tool_edit_trackpoint_click ( VikTrwLayer *vtl, GdkEventButton *e { vtl->current_tpl = params.closest_tpl; vtl->current_tp_track_name = params.closest_track_name; - vik_treeview_select_iter ( VIK_LAYER(vtl)->vt, g_hash_table_lookup ( vtl->tracks_iters, vtl->current_tp_track_name ) ); + vik_treeview_select_iter ( VIK_LAYER(vtl)->vt, g_hash_table_lookup ( vtl->tracks_iters, vtl->current_tp_track_name ), TRUE ); trw_layer_tpwin_init ( vtl ); vik_layer_emit_update ( VIK_LAYER(vtl) ); return TRUE; -- 2.39.5