From df55d7227fc5dbee06bfc39ecb4955252b272c66 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Thu, 12 Jul 2018 10:00:34 +0200
Subject: Added menu items to switch to next and previous views.

---
 src/gui/core/global.c |  19 +++++
 src/gui/core/global.h |   3 +
 src/gui/menus/view.c  | 219 +++++++++++++++++++++++++++++++++++++++++++++-----
 3 files changed, 222 insertions(+), 19 deletions(-)

diff --git a/src/gui/core/global.c b/src/gui/core/global.c
index d3c9005..89a2d90 100644
--- a/src/gui/core/global.c
+++ b/src/gui/core/global.c
@@ -88,6 +88,25 @@ GtkWindow *get_editor_window(void)
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : -                                                            *
+*                                                                             *
+*  Description : Fournit l'espace de références global en mode graphique.     *
+*                                                                             *
+*  Retour      : Espace de références global.                                 *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+GObject *get_global_ref(void)
+{
+    return G_OBJECT(_editor);
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : status  = barre de statut à tenir informée.                  *
 *                                                                             *
 *  Description : Note l'adresse de la barre de statut principale.             *
diff --git a/src/gui/core/global.h b/src/gui/core/global.h
index 5e49ec5..5e9d902 100644
--- a/src/gui/core/global.h
+++ b/src/gui/core/global.h
@@ -37,6 +37,9 @@ void set_editor_window(GtkWindow *);
 /* Fournit l'adresse de la fenêtre principale de l'éditeur. */
 GtkWindow *get_editor_window(void);
 
+/* Fournit l'espace de références global en mode graphique. */
+GObject *get_global_ref(void);
+
 /* Note l'adresse de la barre de statut principale. */
 void set_global_status(GtkStatusStack *);
 
diff --git a/src/gui/menus/view.c b/src/gui/menus/view.c
index 70247a9..dfbf152 100644
--- a/src/gui/menus/view.c
+++ b/src/gui/menus/view.c
@@ -42,6 +42,9 @@
 
 
 
+/* Met à jour les accès du menu "Affichage -> Basculer...". */
+static void update_switch_access_in_menu_view(void);
+
 /* Réagit avec le menu "Affichage -> Panneaux latéraux". */
 static void mcb_view_update_side_panels_list(GtkMenuItem *, GMenuBar *);
 
@@ -51,6 +54,15 @@ static void mcb_view_change_panel_docking(GtkCheckMenuItem *, GPanelItem *);
 /* Réagit avec le menu "Affichage -> Vue xxx". */
 static void mcb_view_change_support(GtkRadioMenuItem *, gpointer);
 
+/* Réagit avec le menu "Affichage -> Basculer vers le suivant". */
+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);
+
+/* Effectue la bascule d'un panneau de chargement à un autre. */
+static void change_current_view_support(unsigned int);
+
 /* Réagit avec le menu "Affichage -> (colonne xxx)". */
 static void mcb_view_display_column(GtkCheckMenuItem *, gpointer);
 
@@ -116,6 +128,16 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar)
     g_object_set_data(G_OBJECT(submenuitem), "kind_of_display", GSIZE_TO_POINTER(GTK_TYPE_GRAPH_DISPLAY));
     gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
 
+    submenuitem = qck_create_menu_item(ref, "mcb_view_switch_to_next_support", _("Switch to next"),
+                                       G_CALLBACK(mcb_view_switch_to_next_support), NULL);
+    add_accelerator_to_menu_item(submenuitem, "Tab", accgroup);
+    gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
+
+    submenuitem = qck_create_menu_item(ref, "mcb_view_switch_to_prev_support", _("Switch to previous"),
+                                       G_CALLBACK(mcb_view_switch_to_prev_support), NULL);
+    add_accelerator_to_menu_item(submenuitem, "<Shift>Tab", accgroup);
+    gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
+
     /* - */
 
     submenuitem = qck_create_menu_separator();
@@ -292,6 +314,10 @@ void update_access_in_menu_view(GObject *ref, GtkDisplayPanel *panel)
 
     access = (panel != NULL);
 
+    /* Bascules */
+
+    update_switch_access_in_menu_view();
+
     /* Affichage des données */
 
     item = GTK_WIDGET(g_object_get_data(ref, "mnu_view_display_off"));
@@ -308,6 +334,62 @@ void update_access_in_menu_view(GObject *ref, GtkDisplayPanel *panel)
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : -                                                            *
+*                                                                             *
+*  Description : Met à jour les accès du menu "Affichage -> Basculer...".     *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void update_switch_access_in_menu_view(void)
+{
+    GObject *ref;                           /* Espace de références        */
+    GLoadedPanel *panel;                    /* Afficheur effectif de code  */
+    GLoadedContent *content;                /* Contenu représenté          */
+    unsigned int count;                     /* Nombre de vues possibles    */
+    unsigned int index;                     /* Indice de la vue courante   */
+    gboolean access;                        /* Accès à déterminer          */
+    GtkWidget *item;                        /* Elément de menu à traiter   */
+
+    ref = get_global_ref();
+
+    panel = get_current_view();
+
+    if (panel == NULL)
+        content = NULL;
+    else
+    {
+        content = g_loaded_panel_get_content(panel);
+
+        count = g_loaded_content_count_views(content);
+        index = g_loaded_content_get_view_index(content, GTK_WIDGET(panel));
+
+    }
+
+    access = (panel != NULL && (index + 1) < count);
+
+    item = GTK_WIDGET(g_object_get_data(ref, "mcb_view_switch_to_next_support"));
+    gtk_widget_set_sensitive(item, access);
+
+    access = (panel != NULL && index > 0);
+
+    item = GTK_WIDGET(g_object_get_data(ref, "mcb_view_switch_to_prev_support"));
+    gtk_widget_set_sensitive(item, access);
+
+    if (panel != NULL)
+    {
+        g_object_unref(G_OBJECT(content));
+        g_object_unref(G_OBJECT(panel));
+    }
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : menuitem = élément de menu sélectionné.                      *
 *                bar      = barre de menu parente.                            *
 *                                                                             *
@@ -466,12 +548,6 @@ static void mcb_view_change_support(GtkRadioMenuItem *menuitem, gpointer unused)
     GSList *group;                          /* Liste de menus radio        */
     GSList *iter;                           /* Boucle de parcours          */
     unsigned int wanted;                    /* Nouvelle vue à présenter    */
-    GLoadedPanel *panel;                    /* Afficheur effectif de code  */
-    GtkDockStation *station;                /* Base du remplacement        */
-    GLoadedContent *content;                /* Contenu représenté          */
-    GtkWidget *support;                     /* Nouvel afficheur généraliste*/
-    GLineCursor *cursor;                    /* Position à transmettre      */
-    GLoadedPanel *new;                      /* Panneau encapsulé           */
 
     /* On ne traite qu'une seule fois ! */
     if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) return;
@@ -484,30 +560,135 @@ static void mcb_view_change_support(GtkRadioMenuItem *menuitem, gpointer unused)
 
         wanted = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(iter->data), "kind_of_view"));
 
-        panel = get_current_view();
-        station = get_dock_station_for_view_panel(GTK_WIDGET(panel));
+        change_current_view_support(wanted);
 
-        content = g_loaded_panel_get_content(panel);
+    }
 
-        support = g_loaded_content_build_view(content, wanted);
+}
 
-        g_object_unref(G_OBJECT(content));
 
-        cursor = g_loaded_panel_get_cursor(panel);
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : menuitem = élément de menu ayant basculé.                    *
+*                unused   = adresse non utilisée ici.                         *
+*                                                                             *
+*  Description : Réagit avec le menu "Affichage -> Basculer vers le suivant". *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
 
-        gtk_dock_panel_change_active_widget(station, support);
+static void mcb_view_switch_to_next_support(GtkRadioMenuItem *menuitem, gpointer unused)
+{
+    GLoadedPanel *panel;                    /* Afficheur effectif de code  */
+    GLoadedContent *content;                /* Contenu représenté          */
+    unsigned int index;                     /* Indice de la vue courante   */
+#ifndef NDEBUG
+    unsigned int count;                     /* Nombre de vues possibles    */
+#endif
 
-        new = G_LOADED_PANEL(get_loaded_panel_from_built_view(support));
+    panel = get_current_view();
+    content = g_loaded_panel_get_content(panel);
 
-        g_loaded_panel_set_cursor(new, cursor);
+    index = g_loaded_content_get_view_index(content, GTK_WIDGET(panel));
 
-        change_editor_items_current_view(new);
+#ifndef NDEBUG
+    count = g_loaded_content_count_views(content);
 
-        g_object_unref(G_OBJECT(cursor));
+    assert((index + 1) < count);
+#endif
 
-        g_object_unref(G_OBJECT(panel));
+    change_current_view_support(index + 1);
 
-    }
+    g_object_unref(G_OBJECT(content));
+    g_object_unref(G_OBJECT(panel));
+
+    update_switch_access_in_menu_view();
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : menuitem = élément de menu ayant basculé.                    *
+*                unused   = adresse non utilisée ici.                         *
+*                                                                             *
+*  Description : Réagit avec le menu "Affichage -> Basculer ... précédent".   *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void mcb_view_switch_to_prev_support(GtkRadioMenuItem *menuitem, gpointer unused)
+{
+    GLoadedPanel *panel;                    /* Afficheur effectif de code  */
+    GLoadedContent *content;                /* Contenu représenté          */
+    unsigned int index;                     /* Indice de la vue courante   */
+
+    panel = get_current_view();
+    content = g_loaded_panel_get_content(panel);
+
+    index = g_loaded_content_get_view_index(content, GTK_WIDGET(panel));
+
+    assert(index > 0);
+
+    change_current_view_support(index - 1);
+
+    g_object_unref(G_OBJECT(content));
+    g_object_unref(G_OBJECT(panel));
+
+    update_switch_access_in_menu_view();
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : wanted = indice de la vue désirée.                           *
+*                                                                             *
+*  Description : Effectue la bascule d'un panneau de chargement à un autre.   *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void change_current_view_support(unsigned int wanted)
+{
+    GLoadedPanel *panel;                    /* Afficheur effectif de code  */
+    GtkDockStation *station;                /* Base du remplacement        */
+    GLoadedContent *content;                /* Contenu représenté          */
+    GtkWidget *support;                     /* Nouvel afficheur généraliste*/
+    GLineCursor *cursor;                    /* Position à transmettre      */
+    GLoadedPanel *new;                      /* Panneau encapsulé           */
+
+    panel = get_current_view();
+    station = get_dock_station_for_view_panel(GTK_WIDGET(panel));
+
+    content = g_loaded_panel_get_content(panel);
+
+    support = g_loaded_content_build_view(content, wanted);
+
+    g_object_unref(G_OBJECT(content));
+
+    cursor = g_loaded_panel_get_cursor(panel);
+
+    gtk_dock_panel_change_active_widget(station, support);
+
+    new = G_LOADED_PANEL(get_loaded_panel_from_built_view(support));
+
+    g_loaded_panel_set_cursor(new, cursor);
+
+    change_editor_items_current_view(new);
+
+    g_object_unref(G_OBJECT(cursor));
+
+    g_object_unref(G_OBJECT(panel));
 
 }
 
-- 
cgit v0.11.2-87-g4458