diff options
Diffstat (limited to 'src/gui/editor.c')
-rw-r--r-- | src/gui/editor.c | 215 |
1 files changed, 138 insertions, 77 deletions
diff --git a/src/gui/editor.c b/src/gui/editor.c index 01d7264..b444752 100644 --- a/src/gui/editor.c +++ b/src/gui/editor.c @@ -46,6 +46,7 @@ #include "tb/portions.h" #include "../common/extstr.h" #include "../core/global.h" +#include "../core/logs.h" #include "../core/params.h" #include "../glibext/chrysamarshal.h" #include "../glibext/named.h" @@ -70,15 +71,17 @@ static GtkBuilder *_load_dialog_builder = NULL; /* Met en place la liste des icônes de l'éditeur. */ static GList *build_editor_icons_list(void); - /* Construit la fenêtre de l'éditeur. */ GtkWidget *create_editor(void); +/* Applique tous les enregistrements de signaux. */ +static void connect_all_editor_signals(GtkBuilder *, GObject *, const gchar *, const gchar *, GObject *, GConnectFlags, gpointer); + /* Quitte le programme en sortie de la boucle de GTK. */ static gboolean on_delete_editor(GtkWidget *, GdkEvent *, gpointer); /* Quitte le programme en sortie de la boucle de GTK. */ -static void on_destroy_editor(GtkWidget *, GObject *); +static void on_destroy_editor(GtkWidget *, gpointer); @@ -86,10 +89,10 @@ static void on_destroy_editor(GtkWidget *, GObject *); /* Réagit à un changement d'état pour l'éditeur. */ -static gboolean on_window_state_changed(GtkWidget *, GdkEvent *, GObject *); +static gboolean on_window_state_changed(GtkWidget *, GdkEvent *, GtkBuilder *); /* Suit la frappe de touches sur la fenêtre principale. */ -static gboolean on_key_event(GtkWidget *, GdkEventKey *, GObject *); +static gboolean on_key_event(GtkWidget *, GdkEventKey *, GtkBuilder *); @@ -200,34 +203,23 @@ static GList *build_editor_icons_list(void) GtkWidget *create_editor(void) { GtkWidget *result; /* Fenêtre à renvoyer */ - - + GtkBuilder *builder; /* Constructeur principal */ bool hide; /* Cachette de la barre ? */ bool maximized; /* Affichage en plein écran ? */ GList *icons; /* Liste d'images dimensionnées*/ - GObject *ref; /* Version de référence */ - GtkAccelGroup *accgroup; /* Groupe de raccourcis clavier*/ + GtkBox *vbox; /* Rangements verticaux */ GEditorItem *editem; /* Menus réactifs principaux */ - GtkWidget *menuboard; /* Barre de menus principale */ - GtkWidget *toolbar; /* Barre d'outils */ GtkWidget *grid; /* Affichage en tuiles */ - - GtkWidget *vbox1; - - - GtkWidget *widget; /* Composant à intégrer */ + /* Mise en place des premières pierres */ + builder = gtk_builder_new_from_resource("/org/chrysalide/gui/editor.ui"); + set_editor_builder(builder); - result = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_position(GTK_WINDOW(result), GTK_WIN_POS_CENTER); - gtk_container_set_border_width(GTK_CONTAINER(result), 4); - gtk_window_set_title(GTK_WINDOW(result), _("Chrysalide")); - - g_object_ref_sink(G_OBJECT(result)); + result = GTK_WIDGET(gtk_builder_get_object(builder, "window")); set_editor_window(GTK_WINDOW(result)); @@ -241,45 +233,30 @@ GtkWidget *create_editor(void) gtk_window_set_icon_list(GTK_WINDOW(result), icons); g_list_free_full(icons, (GDestroyNotify)g_object_unref); - ref = G_OBJECT(result); - - g_signal_connect(ref, "delete-event", G_CALLBACK(on_delete_editor), NULL); - g_signal_connect(ref, "destroy", G_CALLBACK(on_destroy_editor), ref); - - g_signal_connect(ref, "window-state-event", G_CALLBACK(on_window_state_changed), ref); - g_signal_connect(ref, "key-press-event", G_CALLBACK(on_key_event), ref); - g_signal_connect(ref, "key-release-event", G_CALLBACK(on_key_event), ref); - - accgroup = gtk_accel_group_new(); - set_accel_group(accgroup); - - gtk_window_add_accel_group(GTK_WINDOW(result), accgroup); +#define DEFINE_CALLBACK(cb) #cb, G_CALLBACK(cb) + gtk_builder_add_callback_symbols(builder, + DEFINE_CALLBACK(on_delete_editor), + DEFINE_CALLBACK(on_destroy_editor), + DEFINE_CALLBACK(on_window_state_changed), + DEFINE_CALLBACK(on_key_event), + NULL); + setup_accel_group_callbacks(builder); - vbox1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4); - gtk_widget_show(vbox1); - gtk_container_add(GTK_CONTAINER(result), vbox1); + /* Constitution du corps */ + vbox = GTK_BOX(gtk_builder_get_object(builder, "vbox")); /* Intégration des menus */ - editem = g_menu_bar_new(ref); + editem = g_menu_bar_new(builder); register_editor_item(editem); - menuboard = g_editor_item_get_widget(editem); - gtk_box_pack_start(GTK_BOX(vbox1), menuboard, FALSE, FALSE, 0); - g_object_unref(G_OBJECT(menuboard)); - - g_object_set_data(ref, "menubar", editem); - g_object_set_data(ref, "menuboard", menuboard); - - gtk_widget_hide(menuboard); - /* Barre d'outils */ - toolbar = build_editor_toolbar(ref); - gtk_box_pack_start(GTK_BOX(vbox1), toolbar, FALSE, FALSE, 0); + toolbar = build_editor_toolbar(G_OBJECT(result)); + gtk_box_pack_start(vbox, toolbar, FALSE, FALSE, 0); /* Coeur de la fenêtre principale */ @@ -290,7 +267,7 @@ GtkWidget *create_editor(void) g_signal_connect(grid, "station-created", G_CALLBACK(on_dock_station_created), NULL); - gtk_box_pack_start(GTK_BOX(vbox1), grid, TRUE, TRUE, 0); + gtk_box_pack_start(vbox, grid, TRUE, TRUE, 0); /* Barre de statut générale */ @@ -298,16 +275,12 @@ GtkWidget *create_editor(void) register_editor_item(editem); widget = g_editor_item_get_widget(editem); - gtk_box_pack_start(GTK_BOX(vbox1), widget, FALSE, FALSE, 0); - g_object_unref(G_OBJECT(widget)); - + gtk_box_pack_start(vbox, widget, FALSE, FALSE, 0); /* Autre */ /* ... = */prepare_drag_and_drop_window(); - - /* Actualisation des contenus */ register_project_change_notification(notify_editor_project_change); @@ -319,6 +292,10 @@ GtkWidget *create_editor(void) _load_dialog = create_loading_dialog(GTK_WINDOW(result), &_load_dialog_builder); + /* Connexions finales */ + + gtk_builder_connect_signals_full(builder, connect_all_editor_signals, NULL); + return result; } @@ -326,9 +303,88 @@ GtkWidget *create_editor(void) /****************************************************************************** * * +* Paramètres : builder = constructeur (principal) visé par l'opération. * +* obj = objet à traiter. * +* sig_name = désignation du signal à traiter. * +* hdl_name = désignation du gestionnaire à employer. * +* conn_obj = approche alternative si différent de NULL. * +* flags = indications à prendre en compte. * +* unused = adresse non utilisée ici. * +* * +* Description : Applique tous les enregistrements de signaux. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void connect_all_editor_signals(GtkBuilder *builder, GObject *obj, const gchar *sig_name, const gchar *hdl_name, GObject *conn_obj, GConnectFlags flags, gpointer unused) +{ + GCallback func; /* Gestionnaire effectif */ + GModule *module; /* Module courant en soutien */ + GMenuBar *bar; /* Gestion des menus */ + void *arg; /* Données utilisateur choisie */ + + /* Recherche de l'adresse de renvoi */ + + func = gtk_builder_lookup_callback_symbol(builder, hdl_name); + + if (!func) + { + if (g_module_supported()) + module = g_module_open(NULL, G_MODULE_BIND_LAZY); + + if (module == NULL) + { + log_simple_message(LMT_ERROR, _("A working GModule is required!")); + goto exit; + } + + if (!g_module_symbol(module, hdl_name, (gpointer)&func)) + { + log_variadic_message(LMT_ERROR, _("Could not find signal handler '%s'"), hdl_name); + g_module_close(module); + goto exit; + } + + g_module_close(module); + + } + + /* Connexion du signal à son gestionnaire */ + + if (conn_obj != NULL) + g_signal_connect_object(obj, sig_name, func, conn_obj, flags); + + else + { + if (strncmp(hdl_name, "mcb_", 4) == 0) + { + bar = G_MENU_BAR(find_editor_item_by_key("menubar")); + arg = bar; + g_object_unref(G_OBJECT(bar)); + } + + else + arg = builder; + + g_signal_connect_data(obj, sig_name, func, arg, NULL, flags); + + } + + exit: + + ; + +} + + +/****************************************************************************** +* * * Paramètres : widget = fenêtre de l'éditeur de préférences. * * event = informations liées à l'événement. * -* data = adresse non utilisée ici. * +* unused = adresse non utilisée ici. * * * * Description : Quitte le programme en sortie de la boucle de GTK. * * * @@ -338,7 +394,7 @@ GtkWidget *create_editor(void) * * ******************************************************************************/ -static gboolean on_delete_editor(GtkWidget *widget, GdkEvent *event, gpointer data) +static gboolean on_delete_editor(GtkWidget *widget, GdkEvent *event, gpointer unused) { gboolean result; /* Continuation à retourner */ bool skip; /* Saut de la vérification ? */ @@ -397,7 +453,7 @@ static gboolean on_delete_editor(GtkWidget *widget, GdkEvent *event, gpointer da /****************************************************************************** * * * Paramètres : widget = fenêtre de l'éditeur de préférences. * -* ref = espace de référencement global. * +* unused = adresse non utilisée ici. * * * * Description : Quitte le programme en sortie de la boucle de GTK. * * * @@ -407,7 +463,7 @@ static gboolean on_delete_editor(GtkWidget *widget, GdkEvent *event, gpointer da * * ******************************************************************************/ -static void on_destroy_editor(GtkWidget *widget, GObject *ref) +static void on_destroy_editor(GtkWidget *widget, gpointer unused) { /* Fermeture propre */ @@ -433,9 +489,9 @@ static void on_destroy_editor(GtkWidget *widget, GObject *ref) /****************************************************************************** * * -* Paramètres : widget = fenêtre principale de l'éditeur. * -* event = informations liées à l'événement. * -* ref = espace de référencement global. * +* Paramètres : widget = fenêtre principale de l'éditeur. * +* event = informations liées à l'événement. * +* builder = constructeur principal de l'interface. * * * * Description : Réagit à un changement d'état pour l'éditeur. * * * @@ -445,12 +501,12 @@ static void on_destroy_editor(GtkWidget *widget, GObject *ref) * * ******************************************************************************/ -static gboolean on_window_state_changed(GtkWidget *widget, GdkEvent *event, GObject *ref) +static gboolean on_window_state_changed(GtkWidget *widget, GdkEvent *event, GtkBuilder *builder) { gboolean result; /* Consommation à retourner */ GdkWindow *window; /* Fenêtre principale */ GdkWindowState state; /* Statut courant d'affichage */ - GtkWidget *menuboard; /* Planche de menu à traiter */ + GtkWidget *menubar; /* Planche de menu à traiter */ result = FALSE; @@ -460,10 +516,10 @@ static gboolean on_window_state_changed(GtkWidget *widget, GdkEvent *event, GObj if ((state & GDK_WINDOW_STATE_FOCUSED) == 0) { - menuboard = GTK_WIDGET(g_object_get_data(ref, "menuboard")); + menubar = GTK_WIDGET(gtk_builder_get_object(builder, "menubar")); - if (gtk_widget_get_visible(menuboard)) - gtk_widget_hide(menuboard); + if (gtk_widget_get_visible(menubar)) + gtk_widget_hide(menubar); } @@ -474,9 +530,9 @@ static gboolean on_window_state_changed(GtkWidget *widget, GdkEvent *event, GObj /****************************************************************************** * * -* Paramètres : widget = fenêtre principale de l'éditeur. * -* event = informations liées à l'événement. * -* ref = espace de référencement global. * +* Paramètres : widget = fenêtre principale de l'éditeur. * +* event = informations liées à l'événement. * +* builder = constructeur principal de l'interface. * * * * Description : Suit la frappe de touches sur la fenêtre principale. * * * @@ -486,27 +542,27 @@ static gboolean on_window_state_changed(GtkWidget *widget, GdkEvent *event, GObj * * ******************************************************************************/ -static gboolean on_key_event(GtkWidget *widget, GdkEventKey *event, GObject *ref) +static gboolean on_key_event(GtkWidget *widget, GdkEventKey *event, GtkBuilder *builder) { gboolean result; /* Consommation à retourner */ - GtkWidget *menuboard; /* Planche de menu à traiter */ + GtkWidget *menubar; /* Planche de menu à traiter */ result = FALSE; result = (event->keyval == GDK_KEY_Alt_L); - menuboard = GTK_WIDGET(g_object_get_data(ref, "menuboard")); + menubar = GTK_WIDGET(gtk_builder_get_object(builder, "menubar")); - if (gtk_widget_get_visible(menuboard)) + if (gtk_widget_get_visible(menubar)) { if (event->type == GDK_KEY_PRESS && event->keyval == GDK_KEY_Alt_L) - gtk_widget_hide(menuboard); + gtk_widget_hide(menubar); } else { if (event->type == GDK_KEY_PRESS && event->keyval == GDK_KEY_Alt_L) - gtk_widget_show(menuboard); + gtk_widget_show(menubar); } @@ -726,6 +782,7 @@ static bool add_side_panel_to_menu(GPanelItem *panel, GtkContainer *support) char *key; /* Désignation de l'entrée */ GtkWidget *submenuitem; /* Sous-élément de menu */ const char *bindings; /* Raccourcis clavier bruts */ + GtkBuilder *builder; /* Constructeur principal */ /* Profil qui ne cadre pas ? */ @@ -747,7 +804,11 @@ static bool add_side_panel_to_menu(GPanelItem *panel, GtkContainer *support) bindings = gtk_panel_item_get_key_bindings(panel); if (bindings != NULL) - add_accelerator_to_widget(submenuitem, bindings); + { + builder = get_editor_builder(); + add_accelerator_to_widget(builder, submenuitem, bindings); + g_object_unref(G_OBJECT(builder)); + } gtk_container_add(support, submenuitem); |