diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2020-12-05 00:39:57 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2020-12-05 00:39:57 (GMT) |
commit | 1e3fa9b79ebe55698e2aa7d5484baec7e8400a8f (patch) | |
tree | c3581ceb7f8586f2f6822de563927a1246dd33a5 /src/gui/menus | |
parent | 6122bb7f34b178d4c07285adae16afcc55294b1f (diff) |
Rewritten the whole API dealing with panels.
Diffstat (limited to 'src/gui/menus')
-rw-r--r-- | src/gui/menus/view.c | 202 |
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)); + + } } |