diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2018-12-20 22:12:28 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2018-12-20 22:12:28 (GMT) |
commit | cffbe4839da452af215f05dfb7cc6c9304c1285e (patch) | |
tree | d2ea78b67592e868ed94ab189722670379cd2b67 /src/gui | |
parent | 0f58e137ff493ab38d2a7e6e2d5e5bc85951be3d (diff) |
Kept the current location when switching views.
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/menus/view.c | 57 |
1 files changed, 54 insertions, 3 deletions
diff --git a/src/gui/menus/view.c b/src/gui/menus/view.c index 4591c0f..63b6371 100644 --- a/src/gui/menus/view.c +++ b/src/gui/menus/view.c @@ -58,6 +58,9 @@ static void mcb_view_switch_to_next_support(GtkRadioMenuItem *, gpointer); /* Réagit avec le menu "Affichage -> Basculer vers le précédent". */ static void mcb_view_switch_to_prev_support(GtkRadioMenuItem *, gpointer); +/* Accompagne la première allocation d'un panneau d'affichage. */ +static void handle_loaded_panel_first_allocation(GtkWidget *, GdkRectangle *, GLineCursor *); + /* Effectue la bascule d'un panneau de chargement à un autre. */ static void change_current_view_support(unsigned int); @@ -741,6 +744,32 @@ static void mcb_view_switch_to_prev_support(GtkRadioMenuItem *menuitem, gpointer /****************************************************************************** * * +* Paramètres : widget = composant graphique visé par la procédure. * +* alloc = emplacement accordé à ce composant. * +* cursor = emplacement transmis à présenter en premier lieu. * +* * +* Description : Accompagne la première allocation d'un panneau d'affichage. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void handle_loaded_panel_first_allocation(GtkWidget *widget, GdkRectangle *alloc, GLineCursor *cursor) +{ + /* On ne réagit que la première fois */ + g_signal_handlers_disconnect_by_func(widget, G_CALLBACK(handle_loaded_panel_first_allocation), cursor); + + g_loaded_panel_scroll_to_cursor(G_LOADED_PANEL(widget), cursor, SPT_TOP, true); + + g_object_unref(G_OBJECT(cursor)); + +} + + +/****************************************************************************** +* * * Paramètres : wanted = indice de la vue désirée. * * * * Description : Effectue la bascule d'un panneau de chargement à un autre. * @@ -776,13 +805,35 @@ static void change_current_view_support(unsigned int wanted) cursor = g_loaded_panel_get_cursor(panel); + change_editor_items_current_view(new); + if (cursor != NULL) { g_loaded_panel_set_cursor(new, cursor); - g_object_unref(G_OBJECT(cursor)); - } - change_editor_items_current_view(new); + /** + * A ce stade, le nouveau composant d'affichage n'a pas encore connu son + * premier gtk_widget_size_allocate(). Cela viendra avec un événement ultérieur + * à celui déclenché pour ce menu. + * + * Dans les faits, cette situation est notable pour la vue en graphique : + * tous les blocs basiques chargés et intégrés dedans ont une position + * égale à -1 et une dimension d'un pixel. + * + * La recherche du bloc présent à une position donnée échoue donc dans la + * fonction gtk_graph_display_move_caret_to(), appelée in fine par + * g_loaded_panel_scroll_to_cursor(). + * + * Et au final, le curseur d'origine n'est pas transmis, et donc pas + * transmissible non plus par la suite. + * + * On se doit ainsi d'attendre l'attribution des emplacements avant de déplacer + * le curseur et de terminer de cet fait les opérations. + */ + + g_signal_connect(new, "size-allocate", G_CALLBACK(handle_loaded_panel_first_allocation), cursor); + + } g_object_unref(G_OBJECT(new)); |