summaryrefslogtreecommitdiff
path: root/src/gui/menus/view.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/menus/view.c')
-rw-r--r--src/gui/menus/view.c841
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));
+ }
+
+}