summaryrefslogtreecommitdiff
path: root/src/gui
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2018-12-20 22:12:28 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2018-12-20 22:12:28 (GMT)
commitcffbe4839da452af215f05dfb7cc6c9304c1285e (patch)
treed2ea78b67592e868ed94ab189722670379cd2b67 /src/gui
parent0f58e137ff493ab38d2a7e6e2d5e5bc85951be3d (diff)
Kept the current location when switching views.
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/menus/view.c57
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));