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