From df55d7227fc5dbee06bfc39ecb4955252b272c66 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard 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, "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