summaryrefslogtreecommitdiff
path: root/src/gui
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2018-07-12 08:00:34 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2018-07-12 08:00:34 (GMT)
commitdf55d7227fc5dbee06bfc39ecb4955252b272c66 (patch)
tree489c2db104af690f983c83c65cbeb61cad65f11b /src/gui
parent4299c1d780a37ad242948fabab8675d74952c5f9 (diff)
Added menu items to switch to next and previous views.
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/core/global.c19
-rw-r--r--src/gui/core/global.h3
-rw-r--r--src/gui/menus/view.c219
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));
}