diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2020-08-15 12:52:38 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2020-08-15 12:52:38 (GMT) |
commit | ab4d9d3afa6185275323a40729193102c99ea5c6 (patch) | |
tree | 06a6031560e53600dd0d959462e0b9b83b4c6ccd /src/gui/menus/view.c | |
parent | 16498486a454f6042b881b77e572f342decf5851 (diff) |
Rebuilt the main interface using Glade.
Diffstat (limited to 'src/gui/menus/view.c')
-rw-r--r-- | src/gui/menus/view.c | 841 |
1 files changed, 409 insertions, 432 deletions
diff --git a/src/gui/menus/view.c b/src/gui/menus/view.c index c2f3f28..b778f8c 100644 --- a/src/gui/menus/view.c +++ b/src/gui/menus/view.c @@ -45,9 +45,6 @@ -/* Met à jour les accès du menu "Affichage -> Basculer...". */ -static void update_switch_access_in_menu_view(GObject *); - /* Réagit avec le menu "Affichage -> Panneaux latéraux -> ...". */ static void mcb_view_change_panel_docking(GtkCheckMenuItem *, GPanelItem *); @@ -55,10 +52,10 @@ static void mcb_view_change_panel_docking(GtkCheckMenuItem *, GPanelItem *); 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 *, GObject *); +static void mcb_view_switch_to_next_support(GtkRadioMenuItem *, GMenuBar *); /* Réagit avec le menu "Affichage -> Basculer vers le précédent". */ -static void mcb_view_switch_to_prev_support(GtkRadioMenuItem *, GObject *); +static void mcb_view_switch_to_prev_support(GtkRadioMenuItem *, GMenuBar *); /* Accompagne la première allocation d'un panneau d'affichage. */ static void handle_loaded_panel_first_allocation(GtkWidget *, GdkRectangle *, GLineCursor *); @@ -75,212 +72,16 @@ static void mcb_view_display_column(GtkCheckMenuItem *, gpointer); /* Réagit avec le menu "Affichage -> Plein écran". */ static void mcb_view_show_full_screen(GtkCheckMenuItem *, gpointer); +/* Met à jour les accès du menu "Affichage -> Basculer...". */ +static void update_switch_access_in_menu_view(GtkBuilder *); -/****************************************************************************** -* * -* Paramètres : ref = espace de référencement global. * -* bar = barre de menu parente. * -* * -* Description : Construit le menu "Affichage". * -* * -* Retour : Panneau de menus mis en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GtkWidget *build_menu_view(GObject *ref, GMenuBar *bar) -{ - GtkWidget *result; /* Support à retourner */ - GtkWidget *menubar; /* Support pour éléments */ - GtkWidget *submenuitem; /* Sous-élément de menu */ - - result = gtk_menu_item_new_with_mnemonic(_("_View")); - gtk_widget_show(result); - - menubar = qck_create_menu(GTK_MENU_ITEM(result)); - - /* Affichage -> Panneaux latéraux */ - - submenuitem = qck_create_menu_item(ref, "mnu_view_side_panels", _("Side panels"), NULL, NULL); - g_signal_connect(submenuitem, "select", G_CALLBACK(mcb_view_update_side_panels_list), bar); - gtk_container_add(GTK_CONTAINER(menubar), submenuitem); - - qck_create_menu(GTK_MENU_ITEM(submenuitem)); - - /* Séparation */ - - submenuitem = qck_create_menu_separator(); - g_object_set_data(ref, "mnu_view_start_panels", submenuitem); - gtk_container_add(GTK_CONTAINER(menubar), submenuitem); - - /* Types de panneau de code */ - - submenuitem = qck_create_menu_item(ref, "mnu_view_switch_to_next_support", _("Switch to next"), - G_CALLBACK(mcb_view_switch_to_next_support), ref); - add_accelerator_to_widget(submenuitem, "Tab"); - gtk_container_add(GTK_CONTAINER(menubar), submenuitem); - - submenuitem = qck_create_menu_item(ref, "mnu_view_switch_to_prev_support", _("Switch to previous"), - G_CALLBACK(mcb_view_switch_to_prev_support), ref); - add_accelerator_to_widget(submenuitem, "<Shift>Tab"); - gtk_container_add(GTK_CONTAINER(menubar), submenuitem); - - /* Séparation */ - - submenuitem = qck_create_menu_separator(); - gtk_container_add(GTK_CONTAINER(menubar), submenuitem); - - /* Zooms */ - - submenuitem = qck_create_menu_item(ref, "mnu_view_zoom_in", _("Zoom in"), - G_CALLBACK(mcb_view_zoom), GINT_TO_POINTER(0)); - add_accelerator_to_widget(submenuitem, "<Ctrl>plus"); - gtk_container_add(GTK_CONTAINER(menubar), submenuitem); - - submenuitem = qck_create_menu_item(ref, "mnu_view_zoom_out", _("Zoom out"), - G_CALLBACK(mcb_view_zoom), GINT_TO_POINTER(1)); - add_accelerator_to_widget(submenuitem, "<Ctrl>minus"); - gtk_container_add(GTK_CONTAINER(menubar), submenuitem); - - submenuitem = qck_create_menu_item(ref, "mnu_view_zoom_reset", _("Reset zoom"), - G_CALLBACK(mcb_view_zoom), GINT_TO_POINTER(2)); - add_accelerator_to_widget(submenuitem, "<Ctrl>0"); - gtk_container_add(GTK_CONTAINER(menubar), submenuitem); - - /* Séparation */ - - submenuitem = qck_create_menu_separator(); - g_object_set_data(ref, "mnu_view_start_options", submenuitem); - gtk_container_add(GTK_CONTAINER(menubar), submenuitem); - - /* Séparation */ - - submenuitem = qck_create_menu_separator(); - gtk_container_add(GTK_CONTAINER(menubar), submenuitem); - - /* Affichage -> Plein écran */ - - submenuitem = qck_create_check_menu_item(NULL, NULL, _("Full screen"), - G_CALLBACK(mcb_view_show_full_screen), NULL); - add_accelerator_to_widget(submenuitem, "F11"); - gtk_container_add(GTK_CONTAINER(menubar), submenuitem); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : widget = menu principal à actualiser. * -* ref = espace de référencement global. * -* new = nouveau contenu chargé à analyser. * -* * -* Description : Réagit à un changement d'affichage principal de contenu. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void rebuild_menu_view_for_content(GtkWidget *widget, GObject *ref, GLoadedContent *new) -{ - GtkWidget *menubar; /* Support pour éléments */ - unsigned int i; /* Boucle de parcours */ - char *key; /* Clef pour accès ultérieurs */ - GtkWidget *submenuitem; /* Sous-élément de menu */ - void *marker; /* Menu de référence */ - GList *list; /* Liste des éléments en place */ - gint position; /* Point d'insertion */ - GList *iter; /* Boucle de parcours */ - unsigned int count; /* Nombre d'itérations à mener */ - GSList *rgroup; /* Groupe des boutons radio */ - char *caption; /* Etiquette pour un menu */ - - /* Retrait d'éventuels anciens menus */ - - menubar = gtk_menu_item_get_submenu(GTK_MENU_ITEM(widget)); - - for (i = 0; ; i++) - { - asprintf(&key, "mnu_view_panel_%u", i); - - submenuitem = g_object_get_data(ref, key); - - free(key); - - if (submenuitem == NULL) - break; - else - gtk_container_remove(GTK_CONTAINER(menubar), GTK_WIDGET(submenuitem)); - - } - - if (new != NULL) - { - /* Insertion des différentes vues */ - - marker = g_object_get_data(ref, "mnu_view_start_panels"); - - list = gtk_container_get_children(GTK_CONTAINER(menubar)); - - position = 0; - - for (iter = list; iter != NULL; iter = g_list_next(iter)) - { - position++; - - if (marker == iter->data) - break; - - } - - g_list_free(list); - - count = g_loaded_content_count_views(new); - - rgroup = NULL; - - for (i = 0; i < count; i++) - { - asprintf(&key, "mnu_view_panel_%u", i); - caption = g_loaded_content_get_view_name(new, i); - - submenuitem = qck_create_radio_menu_item(ref, key, rgroup, caption, - G_CALLBACK(mcb_view_change_support), NULL); - g_object_set_data(G_OBJECT(submenuitem), "kind_of_view", GUINT_TO_POINTER(i)); - - free(caption); - free(key); - - asprintf(&key, "F%u", 3 + i); - - add_accelerator_to_widget(submenuitem, key); - - free(key); - - if (rgroup == NULL) - rgroup = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(submenuitem)); - - gtk_menu_shell_insert(GTK_MENU_SHELL(menubar), submenuitem, position + i); - - } - - } - -} - /****************************************************************************** * * -* Paramètres : widget = menu principal à actualiser. * -* ref = espace de référencement global. * -* new = nouvelle vue du contenu chargé analysé. * +* Paramètres : builder = constructeur avec l'ensemble des références. * * * -* Description : Lance une actualisation du fait d'un changement de support. * +* Description : Complète la définition du menu "Affichage". * * * * Retour : - * * * @@ -288,227 +89,36 @@ void rebuild_menu_view_for_content(GtkWidget *widget, GObject *ref, GLoadedConte * * ******************************************************************************/ -void rebuild_menu_view_for_view(GtkWidget *widget, GObject *ref, GLoadedPanel *new) +void setup_menu_view_callbacks(GtkBuilder *builder) { - GLoadedContent *content; /* Contenu en cours d'analyse */ - unsigned int index; /* Indice de la vue */ - GtkWidget *menubar; /* Support pour éléments */ - void *marker; /* Menu de référence */ - size_t i; /* Boucle de parcours */ - char *key; /* Clef pour accès ultérieurs */ - GtkWidget *submenuitem; /* Sous-élément de menu */ - GtkRadioMenuItem *item; /* Elément de menu arbitraire */ - GSList *radios; /* Liste des menus d'affichage */ - GList *list; /* Liste des éléments en place */ - gint position; /* Point d'insertion */ - GList *iter; /* Boucle de parcours */ - GDisplayOptions *options; /* Paramètres de rendus */ - size_t count; /* Nombre d'itérations à mener */ - bool status; /* Consigne d'affichage */ - - content = get_current_content(); - assert((content == NULL && new == NULL) || (content != NULL && new != NULL)); - - /* Retrait d'éventuels anciens menus */ + GObject *item; /* Elément à compléter */ - menubar = gtk_menu_item_get_submenu(GTK_MENU_ITEM(widget)); +#define DEFINE_CALLBACK(cb) #cb, G_CALLBACK(cb) - marker = g_object_get_data(ref, "mnu_view_start_options"); + gtk_builder_add_callback_symbols(builder, + DEFINE_CALLBACK(mcb_view_update_side_panels_list), + DEFINE_CALLBACK(mcb_view_switch_to_next_support), + DEFINE_CALLBACK(mcb_view_switch_to_prev_support), + DEFINE_CALLBACK(mcb_view_zoom), + DEFINE_CALLBACK(mcb_view_show_full_screen), + NULL); - for (i = 0; ; i++) - { - asprintf(&key, "mnu_view_display_option_%zu", i); - - submenuitem = g_object_get_data(ref, key); - - free(key); - - if (submenuitem == NULL) - break; - else - gtk_container_remove(GTK_CONTAINER(menubar), GTK_WIDGET(submenuitem)); - - } - - if (content != NULL) - { - index = g_loaded_content_get_view_index(content, GTK_WIDGET(new)); - - /* Mise à jour du choix de la vue */ - - item = GTK_RADIO_MENU_ITEM(g_object_get_data(ref, "mnu_view_panel_0")); - - radios = gtk_radio_menu_item_get_group(item); - - void disconnect_display_radio(GtkWidget *wgt, gpointer unused) - { - g_signal_handlers_disconnect_by_func(wgt, G_CALLBACK(mcb_view_change_support), NULL); - } - - g_slist_foreach(radios, (GFunc)disconnect_display_radio, NULL); - - asprintf(&key, "mnu_view_panel_%u", index); - - item = GTK_RADIO_MENU_ITEM(g_object_get_data(ref, key)); - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), TRUE); - - free(key); - - void reconnect_display_radio(GtkWidget *wgt, gpointer unused) - { - g_signal_connect(wgt, "toggled", G_CALLBACK(mcb_view_change_support), NULL); - } - - g_slist_foreach(radios, (GFunc)reconnect_display_radio, NULL); - - /* Insertion des options de rendu */ - - list = gtk_container_get_children(GTK_CONTAINER(menubar)); - - position = 0; - - for (iter = list; iter != NULL; iter = g_list_next(iter)) - { - position++; - - if (marker == iter->data) - break; - - } - - g_list_free(list); - - options = g_loaded_content_get_display_options(content, index); - - count = g_display_options_count(options); - - for (i = 0; i < count; i++) - { - asprintf(&key, "mnu_view_display_option_%zu", i); - - submenuitem = qck_create_check_menu_item(ref, key, - g_display_options_get_name(options, i), - G_CALLBACK(mcb_view_display_column), NULL); - g_object_set_data(G_OBJECT(submenuitem), "kind_of_opt", GUINT_TO_POINTER(i)); - - gtk_menu_shell_insert(GTK_MENU_SHELL(menubar), submenuitem, position + i); - - free(key); - - /** - * Un signal va être émis pour le menu, mais il n'ira pas très loin : - * l'ensemble des options ne notifie un changement que si changement il y a ! - */ - - status = g_display_options_get(options, i); - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(submenuitem), status); - - } - - g_object_unref(G_OBJECT(options)); - - g_object_unref(G_OBJECT(content)); - - } - - else - count = 0; - - /* Utilité de la séparation ? */ - - gtk_widget_set_visible(GTK_WIDGET(marker), count > 0); - -} - - -/****************************************************************************** -* * -* Paramètres : ref = espace de référencement global. * -* new = nouvelle vue du contenu chargé analysé. * -* * -* Description : Met à jour les accès du menu "Affichage" selon le contenu. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void update_access_for_view_in_menu_view(GObject *ref, GLoadedPanel *new) -{ - gboolean access; /* Accès à déterminer */ - GtkWidget *item; /* Elément de menu à traiter */ + /* Affichage -> Panneaux latéraux */ - /* Bascules */ + item = gtk_builder_get_object(builder, "view_side_panels"); - update_switch_access_in_menu_view(ref); + qck_create_menu(GTK_MENU_ITEM(item)); /* Zooms */ - access = GTK_IS_GRAPH_DISPLAY(new); - - item = GTK_WIDGET(g_object_get_data(ref, "mnu_view_zoom_in")); - gtk_widget_set_sensitive(item, access); - - item = GTK_WIDGET(g_object_get_data(ref, "mnu_view_zoom_out")); - gtk_widget_set_sensitive(item, access); - - item = GTK_WIDGET(g_object_get_data(ref, "mnu_view_zoom_reset")); - gtk_widget_set_sensitive(item, access); - -} - - -/****************************************************************************** -* * -* Paramètres : ref = espace de référencement global. * -* * -* Description : Met à jour les accès du menu "Affichage -> Basculer...". * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void update_switch_access_in_menu_view(GObject *ref) -{ - 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 */ - - panel = get_current_view(); + item = gtk_builder_get_object(builder, "view_zoom_in"); + g_object_set_data(item, "kind_of_zoom", GINT_TO_POINTER(0)); - if (panel == NULL) - content = NULL; + item = gtk_builder_get_object(builder, "view_zoom_out"); + g_object_set_data(item, "kind_of_zoom", GINT_TO_POINTER(1)); - 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, "mnu_view_switch_to_next_support")); - gtk_widget_set_sensitive(item, access); - - access = (panel != NULL && index > 0); - - item = GTK_WIDGET(g_object_get_data(ref, "mnu_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)); - } + item = gtk_builder_get_object(builder, "view_zoom_reset"); + g_object_set_data(item, "kind_of_zoom", GINT_TO_POINTER(2)); } @@ -528,7 +138,8 @@ static void update_switch_access_in_menu_view(GObject *ref) void mcb_view_update_side_panels_list(GtkMenuItem *menuitem, GMenuBar *bar) { - GtkWidget *menubar; /* Support pour éléments */ + GtkWidget *menu; /* Support pour éléments */ + GtkBuilder *builder; /* Constructeur principal */ typedef struct _panels_loading_filter { @@ -539,10 +150,9 @@ void mcb_view_update_side_panels_list(GtkMenuItem *menuitem, GMenuBar *bar) } panels_loading_filter; - panels_loading_filter pfilter; - + panels_loading_filter pfilter; /* Mécanismes de filtrage */ - menubar = gtk_menu_item_get_submenu(menuitem); + menu = gtk_menu_item_get_submenu(menuitem); /* Réinitialisation */ @@ -552,7 +162,7 @@ void mcb_view_update_side_panels_list(GtkMenuItem *menuitem, GMenuBar *bar) } - gtk_container_foreach(GTK_CONTAINER(menubar), (GtkCallback)remove_panel_menu_item, menubar); + gtk_container_foreach(GTK_CONTAINER(menu), (GtkCallback)remove_panel_menu_item, menu); /* Ajout des panneaux uniques */ @@ -572,7 +182,7 @@ void mcb_view_update_side_panels_list(GtkMenuItem *menuitem, GMenuBar *bar) filter->first = false; submenuitem = qck_create_menu_separator(); - gtk_container_add(GTK_CONTAINER(menubar), submenuitem); + gtk_container_add(GTK_CONTAINER(menu), submenuitem); } @@ -588,7 +198,11 @@ void mcb_view_update_side_panels_list(GtkMenuItem *menuitem, GMenuBar *bar) bindings = gtk_panel_item_get_key_bindings(panel); if (bindings != NULL) - add_accelerator_to_widget(submenuitem, bindings); + { + builder = g_menu_bar_get_builder(bar); + add_accelerator_to_widget(builder, submenuitem, bindings); + g_object_unref(G_OBJECT(builder)); + } gtk_container_add(filter->support, submenuitem); @@ -610,7 +224,7 @@ void mcb_view_update_side_panels_list(GtkMenuItem *menuitem, GMenuBar *bar) } - pfilter.support = GTK_CONTAINER(menubar); + pfilter.support = GTK_CONTAINER(menu); pfilter.personality = PIP_SINGLETON; pfilter.first = false; @@ -706,7 +320,7 @@ static void mcb_view_change_support(GtkRadioMenuItem *menuitem, gpointer unused) /****************************************************************************** * * * Paramètres : menuitem = élément de menu ayant basculé. * -* ref = espace de référencement global. * +* bar = barre de menu parente. * * * * Description : Réagit avec le menu "Affichage -> Basculer vers le suivant". * * * @@ -716,7 +330,7 @@ static void mcb_view_change_support(GtkRadioMenuItem *menuitem, gpointer unused) * * ******************************************************************************/ -static void mcb_view_switch_to_next_support(GtkRadioMenuItem *menuitem, GObject *ref) +static void mcb_view_switch_to_next_support(GtkRadioMenuItem *menuitem, GMenuBar *bar) { GLoadedPanel *panel; /* Afficheur effectif de code */ GLoadedContent *content; /* Contenu représenté */ @@ -724,6 +338,7 @@ static void mcb_view_switch_to_next_support(GtkRadioMenuItem *menuitem, GObject #ifndef NDEBUG unsigned int count; /* Nombre de vues possibles */ #endif + GtkBuilder *builder; /* Constructeur lié au menu */ panel = get_current_view(); content = g_loaded_panel_get_content(panel); @@ -741,7 +356,11 @@ static void mcb_view_switch_to_next_support(GtkRadioMenuItem *menuitem, GObject g_object_unref(G_OBJECT(content)); g_object_unref(G_OBJECT(panel)); - update_switch_access_in_menu_view(ref); + builder = g_menu_bar_get_builder(bar); + + update_switch_access_in_menu_view(builder); + + g_object_unref(G_OBJECT(builder)); } @@ -749,7 +368,7 @@ static void mcb_view_switch_to_next_support(GtkRadioMenuItem *menuitem, GObject /****************************************************************************** * * * Paramètres : menuitem = élément de menu ayant basculé. * -* ref = espace de référencement global. * +* bar = barre de menu parente. * * * * Description : Réagit avec le menu "Affichage -> Basculer ... précédent". * * * @@ -759,11 +378,12 @@ static void mcb_view_switch_to_next_support(GtkRadioMenuItem *menuitem, GObject * * ******************************************************************************/ -static void mcb_view_switch_to_prev_support(GtkRadioMenuItem *menuitem, GObject *ref) +static void mcb_view_switch_to_prev_support(GtkRadioMenuItem *menuitem, GMenuBar *bar) { GLoadedPanel *panel; /* Afficheur effectif de code */ GLoadedContent *content; /* Contenu représenté */ unsigned int index; /* Indice de la vue courante */ + GtkBuilder *builder; /* Constructeur lié au menu */ panel = get_current_view(); content = g_loaded_panel_get_content(panel); @@ -777,7 +397,11 @@ static void mcb_view_switch_to_prev_support(GtkRadioMenuItem *menuitem, GObject g_object_unref(G_OBJECT(content)); g_object_unref(G_OBJECT(panel)); - update_switch_access_in_menu_view(ref); + builder = g_menu_bar_get_builder(bar); + + update_switch_access_in_menu_view(builder); + + g_object_unref(G_OBJECT(builder)); } @@ -883,7 +507,7 @@ static void change_current_view_support(unsigned int wanted) /****************************************************************************** * * * Paramètres : menuitem = élément de menu sélectionné. * -* data = données indiquant la nature du zoom. * +* unused = adresse non utilisée ici. * * * * Description : Réagit avec le menu "Affichage -> Zoom *". * * * @@ -893,16 +517,19 @@ static void change_current_view_support(unsigned int wanted) * * ******************************************************************************/ -static void mcb_view_zoom(GtkCheckMenuItem *menuitem, gpointer data) +static void mcb_view_zoom(GtkCheckMenuItem *menuitem, gpointer unused) { GtkDisplayPanel *panel; /* Afficheur effectif de code */ double scale; /* Echelle à appliquer */ + int zoom_kind; /* Type de zoom à appliquer */ panel = GTK_DISPLAY_PANEL(get_current_view()); scale = gtk_display_panel_get_scale(panel); - switch (GPOINTER_TO_INT(data)) + zoom_kind = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menuitem), "kind_of_zoom")); + + switch (zoom_kind) { case 0: scale /= 1.25; @@ -916,6 +543,11 @@ static void mcb_view_zoom(GtkCheckMenuItem *menuitem, gpointer data) scale = 1.0; break; + default: + assert(false); + scale = 1.0; + break; + } gtk_display_panel_set_scale(panel, scale); @@ -996,3 +628,348 @@ static void mcb_view_show_full_screen(GtkCheckMenuItem *menuitem, gpointer unuse g_object_unref(G_OBJECT(editor)); } + + +/****************************************************************************** +* * +* Paramètres : builder = constructeur avec l'ensemble des références. * +* new = nouveau contenu chargé à analyser. * +* * +* Description : Réagit à un changement d'affichage principal de contenu. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void rebuild_menu_view_for_content(GtkBuilder *builder, GLoadedContent *new) +{ + GObject *menuitem; /* Menu d'affichage */ + GtkWidget *menu; /* Support pour éléments */ + unsigned int i; /* Boucle de parcours */ + char *key; /* Clef pour accès ultérieurs */ + GtkWidget *submenuitem; /* Sous-élément de menu */ + void *marker; /* Menu de référence */ + GList *list; /* Liste des éléments en place */ + gint position; /* Point d'insertion */ + GList *iter; /* Boucle de parcours */ + unsigned int count; /* Nombre d'itérations à mener */ + GSList *rgroup; /* Groupe des boutons radio */ + char *caption; /* Etiquette pour un menu */ + + /* Retrait d'éventuels anciens menus */ + + menuitem = gtk_builder_get_object(builder, "view"); + + menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(menuitem)); + + for (i = 0; ; i++) + { + asprintf(&key, "view_panel_%u", i); + + submenuitem = g_object_get_data(menuitem, key); + + free(key); + + if (submenuitem == NULL) + break; + else + gtk_container_remove(GTK_CONTAINER(menu), GTK_WIDGET(submenuitem)); + + } + + if (new != NULL) + { + /* Insertion des différentes vues */ + + marker = gtk_builder_get_object(builder, "view_sep_0"); + + list = gtk_container_get_children(GTK_CONTAINER(menu)); + + position = 0; + + for (iter = list; iter != NULL; iter = g_list_next(iter)) + { + position++; + + if (marker == iter->data) + break; + + } + + g_list_free(list); + + count = g_loaded_content_count_views(new); + + rgroup = NULL; + + for (i = 0; i < count; i++) + { + asprintf(&key, "view_panel_%u", i); + caption = g_loaded_content_get_view_name(new, i); + + submenuitem = qck_create_radio_menu_item(menuitem, key, rgroup, caption, + G_CALLBACK(mcb_view_change_support), NULL); + g_object_set_data(G_OBJECT(submenuitem), "kind_of_view", GUINT_TO_POINTER(i)); + + free(caption); + free(key); + + asprintf(&key, "F%u", 3 + i); + + add_accelerator_to_widget(builder, submenuitem, key); + + free(key); + + if (rgroup == NULL) + rgroup = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(submenuitem)); + + gtk_menu_shell_insert(GTK_MENU_SHELL(menu), submenuitem, position + i); + + } + + } + +} + + +/****************************************************************************** +* * +* Paramètres : builder = constructeur avec l'ensemble des références. * +* new = nouvelle vue du contenu chargé analysé. * +* * +* Description : Lance une actualisation du fait d'un changement de support. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void rebuild_menu_view_for_view(GtkBuilder *builder, GLoadedPanel *new) +{ + GObject *menuitem; /* Menu d'affichage */ + GLoadedContent *content; /* Contenu en cours d'analyse */ + unsigned int index; /* Indice de la vue */ + GtkWidget *menu; /* Support pour éléments */ + void *marker; /* Menu de référence */ + size_t i; /* Boucle de parcours */ + char *key; /* Clef pour accès ultérieurs */ + GtkWidget *submenuitem; /* Sous-élément de menu */ + GtkRadioMenuItem *item; /* Elément de menu arbitraire */ + GSList *radios; /* Liste des menus d'affichage */ + GList *list; /* Liste des éléments en place */ + gint position; /* Point d'insertion */ + GList *iter; /* Boucle de parcours */ + GDisplayOptions *options; /* Paramètres de rendus */ + size_t count; /* Nombre d'itérations à mener */ + bool status; /* Consigne d'affichage */ + + menuitem = gtk_builder_get_object(builder, "view"); + + content = get_current_content(); + assert((content == NULL && new == NULL) || (content != NULL && new != NULL)); + + /* Retrait d'éventuels anciens menus */ + + menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(menuitem)); + + marker = gtk_builder_get_object(builder, "view_sep_2"); + + for (i = 0; ; i++) + { + asprintf(&key, "view_display_option_%zu", i); + + submenuitem = g_object_get_data(menuitem, key); + + free(key); + + if (submenuitem == NULL) + break; + else + gtk_container_remove(GTK_CONTAINER(menu), GTK_WIDGET(submenuitem)); + + } + + if (content != NULL) + { + index = g_loaded_content_get_view_index(content, GTK_WIDGET(new)); + + /* Mise à jour du choix de la vue */ + + item = GTK_RADIO_MENU_ITEM(g_object_get_data(menuitem, "view_panel_0")); + + radios = gtk_radio_menu_item_get_group(item); + + void disconnect_display_radio(GtkWidget *wgt, gpointer unused) + { + g_signal_handlers_disconnect_by_func(wgt, G_CALLBACK(mcb_view_change_support), NULL); + } + + g_slist_foreach(radios, (GFunc)disconnect_display_radio, NULL); + + asprintf(&key, "view_panel_%u", index); + + item = GTK_RADIO_MENU_ITEM(g_object_get_data(menuitem, key)); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), TRUE); + + free(key); + + void reconnect_display_radio(GtkWidget *wgt, gpointer unused) + { + g_signal_connect(wgt, "toggled", G_CALLBACK(mcb_view_change_support), NULL); + } + + g_slist_foreach(radios, (GFunc)reconnect_display_radio, NULL); + + /* Insertion des options de rendu */ + + list = gtk_container_get_children(GTK_CONTAINER(menu)); + + position = 0; + + for (iter = list; iter != NULL; iter = g_list_next(iter)) + { + position++; + + if (marker == iter->data) + break; + + } + + g_list_free(list); + + options = g_loaded_content_get_display_options(content, index); + + count = g_display_options_count(options); + + for (i = 0; i < count; i++) + { + asprintf(&key, "view_display_option_%zu", i); + + submenuitem = qck_create_check_menu_item(menuitem, key, + g_display_options_get_name(options, i), + G_CALLBACK(mcb_view_display_column), NULL); + g_object_set_data(G_OBJECT(submenuitem), "kind_of_opt", GUINT_TO_POINTER(i)); + + gtk_menu_shell_insert(GTK_MENU_SHELL(menu), submenuitem, position + i); + + free(key); + + /** + * Un signal va être émis pour le menu, mais il n'ira pas très loin : + * l'ensemble des options ne notifie un changement que si changement il y a ! + */ + + status = g_display_options_get(options, i); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(submenuitem), status); + + } + + g_object_unref(G_OBJECT(options)); + + g_object_unref(G_OBJECT(content)); + + } + + else + count = 0; + + /* Utilité de la séparation ? */ + + gtk_widget_set_visible(GTK_WIDGET(marker), count > 0); + +} + + +/****************************************************************************** +* * +* Paramètres : builder = constructeur avec l'ensemble des références. * +* new = nouvelle vue du contenu chargé analysé. * +* * +* Description : Met à jour les accès du menu "Affichage" selon le contenu. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void update_access_for_view_in_menu_view(GtkBuilder *builder, GLoadedPanel *new) +{ + gboolean access; /* Accès à déterminer */ + GtkWidget *item; /* Elément de menu à traiter */ + + /* Bascules */ + + update_switch_access_in_menu_view(builder); + + /* Zooms */ + + access = GTK_IS_GRAPH_DISPLAY(new); + + item = GTK_WIDGET(gtk_builder_get_object(builder, "view_zoom_in")); + gtk_widget_set_sensitive(item, access); + + item = GTK_WIDGET(gtk_builder_get_object(builder, "view_zoom_out")); + gtk_widget_set_sensitive(item, access); + + item = GTK_WIDGET(gtk_builder_get_object(builder, "view_zoom_reset")); + gtk_widget_set_sensitive(item, access); + +} + + +/****************************************************************************** +* * +* Paramètres : builder = constructeur avec l'ensemble des références. * +* * +* Description : Met à jour les accès du menu "Affichage -> Basculer...". * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void update_switch_access_in_menu_view(GtkBuilder *builder) +{ + 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 */ + + 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(gtk_builder_get_object(builder, "view_switch_to_next")); + gtk_widget_set_sensitive(item, access); + + access = (panel != NULL && index > 0); + + item = GTK_WIDGET(gtk_builder_get_object(builder, "view_switch_to_prev")); + gtk_widget_set_sensitive(item, access); + + if (panel != NULL) + { + g_object_unref(G_OBJECT(content)); + g_object_unref(G_OBJECT(panel)); + } + +} |