summaryrefslogtreecommitdiff
path: root/src/gui/menus
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2020-12-05 00:39:57 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2020-12-05 00:39:57 (GMT)
commit1e3fa9b79ebe55698e2aa7d5484baec7e8400a8f (patch)
treec3581ceb7f8586f2f6822de563927a1246dd33a5 /src/gui/menus
parent6122bb7f34b178d4c07285adae16afcc55294b1f (diff)
Rewritten the whole API dealing with panels.
Diffstat (limited to 'src/gui/menus')
-rw-r--r--src/gui/menus/view.c202
1 files changed, 138 insertions, 64 deletions
diff --git a/src/gui/menus/view.c b/src/gui/menus/view.c
index d41df92..37db20a 100644
--- a/src/gui/menus/view.c
+++ b/src/gui/menus/view.c
@@ -45,8 +45,25 @@
+/* Retire un sous-menu d'un menu. */
+static void remove_panel_menu_item(GtkWidget *, GtkContainer *);
+
+/* Filtre pour parcours de panneaux */
+typedef struct _panels_loading_filter
+{
+ GMenuBar *bar; /* Barre de menus principale */
+ GtkContainer *support; /* Support pour éléments */
+
+ PanelItemPersonality personality; /* Nature des éléments attendus*/
+ bool first; /* Premier ajout ? */
+
+} panels_loading_filter;
+
+/* Ajoute un panneau à la liste des panneaux existants. */
+static bool add_side_panel_to_list(GPanelItemClass *, panels_loading_filter *);
+
/* Réagit avec le menu "Affichage -> Panneaux latéraux -> ...". */
-static void mcb_view_change_panel_docking(GtkCheckMenuItem *, GPanelItem *);
+static void mcb_view_change_panel_docking(GtkCheckMenuItem *, gpointer);
/* Réagit avec le menu "Affichage -> Vue xxx". */
static void mcb_view_change_support(GtkRadioMenuItem *, gpointer);
@@ -123,10 +140,10 @@ void setup_menu_view_callbacks(GtkBuilder *builder)
/******************************************************************************
* *
-* Paramètres : menuitem = élément de menu sélectionné. *
-* bar = barre de menu parente. *
+* Paramètres : widget = composant graphique à retirer de l'affichage. *
+* container = conteneur graphique à vider. *
* *
-* Description : Réagit avec le menu "Affichage -> Panneaux latéraux". *
+* Description : Retire un sous-menu d'un menu. *
* *
* Retour : - *
* *
@@ -134,101 +151,140 @@ void setup_menu_view_callbacks(GtkBuilder *builder)
* *
******************************************************************************/
-void mcb_view_update_side_panels_list(GtkMenuItem *menuitem, GMenuBar *bar)
+static void remove_panel_menu_item(GtkWidget *widget, GtkContainer *container)
{
- GtkWidget *menu; /* Support pour éléments */
- GtkBuilder *builder; /* Constructeur principal */
+ gtk_container_remove(container, widget);
- typedef struct _panels_loading_filter
- {
- GtkContainer *support; /* Support pour éléments */
+}
- PanelItemPersonality personality; /* Nature des éléments attendus*/
- bool first; /* Premier ajout ? */
- } panels_loading_filter;
+/******************************************************************************
+* *
+* Paramètres : class = classe de panneau à traiter. *
+* filter = filtre pour le parcours de l'ensemble des panneaux. *
+* *
+* Description : Ajoute un panneau à la liste des panneaux existants. *
+* *
+* Retour : true, par conformité avec browse_all_item_panels(). *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
- panels_loading_filter pfilter; /* Mécanismes de filtrage */
+static bool add_side_panel_to_list(GPanelItemClass *class, panels_loading_filter *filter)
+{
+ gpointer type_ptr; /* Type de panneau traité */
+ char *key; /* Désignation de l'entrée */
+ GtkWidget *submenuitem; /* Sous-élément de menu */
+ char *bindings; /* Raccourcis clavier bruts */
+ GtkBuilder *builder; /* Constructeur principal */
+ GEditorItem *item; /* Instance de panneau en place*/
- menu = gtk_menu_item_get_submenu(menuitem);
+ if (gtk_panel_item_class_get_personality(class) != filter->personality)
+ goto exit;
- /* Réinitialisation */
+ /* Séparation */
- void remove_panel_menu_item(GtkWidget *widget, GtkContainer *container)
+ if (filter->first)
{
- gtk_container_remove(container, widget);
+ filter->first = false;
- }
+ submenuitem = qck_create_menu_separator();
+ gtk_container_add(filter->support, submenuitem);
- gtk_container_foreach(GTK_CONTAINER(menu), (GtkCallback)remove_panel_menu_item, menu);
+ }
- /* Ajout des panneaux uniques */
+ /* Elément de menu */
- bool add_side_panel_to_list(GPanelItem *panel, panels_loading_filter *filter)
- {
- char *key; /* Désignation de l'entrée */
- GtkWidget *submenuitem; /* Sous-élément de menu */
- const char *bindings; /* Raccourcis clavier bruts */
+ type_ptr = GSIZE_TO_POINTER(G_TYPE_FROM_CLASS(class));
- if (gtk_panel_item_get_personality(panel) != filter->personality)
- goto aptl_exit;
+ key = g_editor_item_class_get_key(G_EDITOR_ITEM_CLASS(class));
- /* Séparation */
+ submenuitem = qck_create_check_menu_item(NULL, NULL, key,
+ G_CALLBACK(mcb_view_change_panel_docking), type_ptr);
- if (filter->first)
- {
- filter->first = false;
+ free(key);
- submenuitem = qck_create_menu_separator();
- gtk_container_add(GTK_CONTAINER(menu), submenuitem);
+ bindings = gtk_panel_item_class_get_key_bindings(class);
- }
+ if (bindings != NULL)
+ {
+ builder = g_menu_bar_get_builder(filter->bar);
+ add_accelerator_to_widget(builder, submenuitem, bindings);
+ g_object_unref(G_OBJECT(builder));
- /* Elément de menu */
+ free(bindings);
- key = g_editor_item_get_key(G_EDITOR_ITEM(panel));
+ }
- submenuitem = qck_create_check_menu_item(NULL, NULL, key,
- G_CALLBACK(mcb_view_change_panel_docking), panel);
+ gtk_container_add(filter->support, submenuitem);
- free(key);
+ /* Statut de la coche */
- bindings = gtk_panel_item_get_key_bindings(panel);
+ item = find_editor_item_by_type(G_TYPE_FROM_CLASS(class));
- if (bindings != NULL)
+ if (item != NULL)
+ {
+ if (g_panel_item_is_docked(G_PANEL_ITEM(item)))
{
- builder = g_menu_bar_get_builder(bar);
- add_accelerator_to_widget(builder, submenuitem, bindings);
- g_object_unref(G_OBJECT(builder));
+ g_signal_handlers_disconnect_by_func(submenuitem, G_CALLBACK(mcb_view_change_panel_docking), type_ptr);
+
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(submenuitem), TRUE);
+
+ g_signal_connect(submenuitem, "toggled", G_CALLBACK(mcb_view_change_panel_docking), type_ptr);
+
}
- gtk_container_add(filter->support, submenuitem);
+ g_object_unref(G_OBJECT(item));
- /* Statut de la coche */
+ }
- if (g_panel_item_is_docked(panel))
- {
- g_signal_handlers_disconnect_by_func(submenuitem, G_CALLBACK(mcb_view_change_panel_docking), panel);
+ exit:
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(submenuitem), TRUE);
+ return true;
- g_signal_connect(submenuitem, "toggled", G_CALLBACK(mcb_view_change_panel_docking), panel);
+}
- }
- aptl_exit:
+/******************************************************************************
+* *
+* Paramètres : menuitem = élément de menu sélectionné. *
+* bar = barre de menu parente. *
+* *
+* Description : Réagit avec le menu "Affichage -> Panneaux latéraux". *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void mcb_view_update_side_panels_list(GtkMenuItem *menuitem, GMenuBar *bar)
+{
+ GtkWidget *menu; /* Support pour éléments */
+ panels_loading_filter pfilter; /* Mécanismes de filtrage */
+
+ menu = gtk_menu_item_get_submenu(menuitem);
- return true;
+ /* Réinitialisation */
- }
+ gtk_container_foreach(GTK_CONTAINER(menu), (GtkCallback)remove_panel_menu_item, menu);
+
+ /* Ajout des panneaux uniques */
+ pfilter.bar = bar;
pfilter.support = GTK_CONTAINER(menu);
- pfilter.personality = PIP_SINGLETON;
+ pfilter.personality = PIP_PERSISTENT_SINGLETON;
pfilter.first = false;
browse_all_item_panels((handle_panel_item_fc)add_side_panel_to_list, &pfilter);
+ pfilter.personality = PIP_SINGLETON;
+ pfilter.first = true;
+
+ browse_all_item_panels((handle_panel_item_fc)add_side_panel_to_list, &pfilter);
+
pfilter.personality = PIP_OTHER;
pfilter.first = true;
@@ -240,7 +296,7 @@ void mcb_view_update_side_panels_list(GtkMenuItem *menuitem, GMenuBar *bar)
/******************************************************************************
* *
* Paramètres : menuitem = élément de menu ayant basculé. *
-* bar = barre de menu parente. *
+* type_ptr = type de panneau à mettre en place. *
* *
* Description : Réagit avec le menu "Affichage -> Panneaux latéraux -> ...". *
* *
@@ -250,9 +306,11 @@ void mcb_view_update_side_panels_list(GtkMenuItem *menuitem, GMenuBar *bar)
* *
******************************************************************************/
-static void mcb_view_change_panel_docking(GtkCheckMenuItem *menuitem, GPanelItem *item)
+static void mcb_view_change_panel_docking(GtkCheckMenuItem *menuitem, gpointer type_ptr)
{
- gboolean active; /* Etat de sélection du menu */
+ GType type; /* Type de panneau considérée */
+ GEditorItem *item; /* Instance de panneau en place*/
+ GPanelItem *panel; /* Instance de panneau créée */
/**
* Comme l'accrochage et le décrochage d'un panneau peuvent se réaliser
@@ -268,12 +326,28 @@ static void mcb_view_change_panel_docking(GtkCheckMenuItem *menuitem, GPanelItem
* On préfèrera donc se baser sur l'état courant du panneau.
*/
- active = !g_panel_item_is_docked(item);
+ type = GPOINTER_TO_SIZE(type_ptr);
+
+ item = find_editor_item_by_type(type);
+
+ if (item == NULL)
+ {
+ panel = g_panel_item_new(type, "");
+ g_object_unref(G_OBJECT(panel));
+ }
- if (active)
- g_panel_item_dock(item);
else
- g_panel_item_undock(item);
+ {
+ panel = G_PANEL_ITEM(item);
+
+ if (g_panel_item_is_docked(panel))
+ g_panel_item_undock(panel);
+ else
+ g_panel_item_dock(panel);
+
+ g_object_unref(G_OBJECT(item));
+
+ }
}