summaryrefslogtreecommitdiff
path: root/src/gui/panel.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/panel.c')
-rw-r--r--src/gui/panel.c300
1 files changed, 194 insertions, 106 deletions
diff --git a/src/gui/panel.c b/src/gui/panel.c
index 5b21620..6621c4e 100644
--- a/src/gui/panel.c
+++ b/src/gui/panel.c
@@ -2,7 +2,7 @@
/* Chrysalide - Outil d'analyse de fichiers binaires
* panel.c - gestion des éléments réactifs spécifiques aux panneaux
*
- * Copyright (C) 2019 Cyrille Bagard
+ * Copyright (C) 2019-2024 Cyrille Bagard
*
* This file is part of Chrysalide.
*
@@ -25,24 +25,14 @@
#include "panel.h"
-#include <assert.h>
-#include <stdio.h>
-#include <string.h>
+#include "panel-int.h"
-#include "panel-int.h"
-#include "core/global.h"
-#include "core/items.h"
-#include "../common/extstr.h"
-#include "../core/params.h"
-#include "../gtkext/gtkdockable-int.h"
-#include "../gtkext/named.h"
-#include "../plugins/dt.h"
-#include "../plugins/pglist.h"
+
+/* ---------------------- MANIPULATIONS D'UN PANNEAU GRAPHIQUE ---------------------- */
-/* ------------------------- COEUR DES PANNEAUX D'AFFICHAGE ------------------------- */
/* Initialise la classe des panneaux graphiques de l'éditeur. */
@@ -51,51 +41,18 @@ static void g_panel_item_class_init(GPanelItemClass *);
/* Initialise une instance de panneau graphique pour l'éditeur. */
static void g_panel_item_init(GPanelItem *);
-/* Procède à l'initialisation de l'interface d'incrustation. */
-static void g_panel_item_dockable_interface_init(GtkDockableInterface *);
-
/* Supprime toutes les références externes. */
static void g_panel_item_dispose(GPanelItem *);
/* Procède à la libération totale de la mémoire. */
static void g_panel_item_finalize(GPanelItem *);
-/* Construit la chaîne d'accès à un élément de configuration. */
-static char *gtk_panel_item_class_build_configuration_key(const GPanelItemClass *, const char *);
-/* Fournit le nom court du composant encapsulable. */
-static char *gtk_panel_item_get_name(const GPanelItem *);
-/* Fournit le nom long du composant encapsulable. */
-static char *gtk_panel_item_get_desc(const GPanelItem *);
-
-/* Détermine si un panneau peut être filtré. */
-static bool gtk_panel_item_can_search(const GPanelItem *);
-
-/* Fournit le composant graphique intégrable dans un ensemble. */
-static GtkWidget *gtk_panel_item_get_widget(GPanelItem *);
-
-/* Démarre l'actualisation du filtrage du contenu. */
-static void gtk_panel_item_update_filtered(GPanelItem *, const char *);
-
-
-
-/* ---------------------- MECANISMES DE MISE A JOUR DE PANNEAU ---------------------- */
-
-
-/* Présente une copie de l'affichage du composant rafraîchi. */
-static gboolean g_panel_item_draw_mask(GtkWidget *, cairo_t *, GPanelItem *);
-
-
-
-/* ---------------------------------------------------------------------------------- */
-/* COEUR DES PANNEAUX D'AFFICHAGE */
-/* ---------------------------------------------------------------------------------- */
/* Indique le type défini pour un élément destiné à un panneau. */
-G_DEFINE_TYPE_WITH_CODE(GPanelItem, g_panel_item, G_TYPE_EDITOR_ITEM,
- G_IMPLEMENT_INTERFACE(GTK_TYPE_DOCKABLE, g_panel_item_dockable_interface_init));
+G_DEFINE_TYPE(GPanelItem, g_panel_item, G_TYPE_OBJECT);
/******************************************************************************
@@ -113,37 +70,12 @@ G_DEFINE_TYPE_WITH_CODE(GPanelItem, g_panel_item, G_TYPE_EDITOR_ITEM,
static void g_panel_item_class_init(GPanelItemClass *class)
{
GObjectClass *object; /* Autre version de la classe */
- GEditorItemClass *item; /* Encore une autre vision... */
object = G_OBJECT_CLASS(class);
object->dispose = (GObjectFinalizeFunc/* ! */)g_panel_item_dispose;
object->finalize = (GObjectFinalizeFunc)g_panel_item_finalize;
- item = G_EDITOR_ITEM_CLASS(class);
-
- item->get_widget = (get_item_widget_fc)gtk_panel_item_get_widget;
-
- class->get_personality = gtk_panel_item_class_get_personality_singleton;
- class->dock_at_startup = gtk_panel_item_class_return_true;
- class->can_search = gtk_panel_item_class_return_false;
-
- g_signal_new("dock-request",
- G_TYPE_PANEL_ITEM,
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET(GPanelItemClass, dock_request),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-
- g_signal_new("undock-request",
- G_TYPE_PANEL_ITEM,
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET(GPanelItemClass, undock_request),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-
}
@@ -161,23 +93,23 @@ static void g_panel_item_class_init(GPanelItemClass *class)
static void g_panel_item_init(GPanelItem *item)
{
- item->docked = false;
+ //item->docked = false;
- item->widget = NULL;
- item->cached_widget = NULL;
+ //item->widget = NULL;
+ //item->cached_widget = NULL;
- item->filter = NULL;
+ //item->filter = NULL;
- g_atomic_int_set(&item->switched, 0);
+ //g_atomic_int_set(&item->switched, 0);
}
/******************************************************************************
* *
-* Paramètres : iface = interface GTK à initialiser. *
+* Paramètres : item = instance d'objet GLib à traiter. *
* *
-* Description : Procède à l'initialisation de l'interface d'incrustation. *
+* Description : Supprime toutes les références externes. *
* *
* Retour : - *
* *
@@ -185,14 +117,12 @@ static void g_panel_item_init(GPanelItem *item)
* *
******************************************************************************/
-static void g_panel_item_dockable_interface_init(GtkDockableInterface *iface)
+static void g_panel_item_dispose(GPanelItem *item)
{
- iface->get_name = (get_dockable_name_fc)gtk_panel_item_get_name;
- iface->get_desc = (get_dockable_desc_fc)gtk_panel_item_get_desc;
- iface->can_search = (can_dockable_search_fc)gtk_panel_item_can_search;
+ //g_clear_object(&item->widget);
+ //g_clear_object(&item->cached_widget);
- iface->get_widget = (get_dockable_widget_fc)gtk_panel_item_get_widget;
- iface->update_filtered = (update_filtered_data_fc)gtk_panel_item_update_filtered;
+ G_OBJECT_CLASS(g_panel_item_parent_class)->dispose(G_OBJECT(item));
}
@@ -201,7 +131,7 @@ static void g_panel_item_dockable_interface_init(GtkDockableInterface *iface)
* *
* Paramètres : item = instance d'objet GLib à traiter. *
* *
-* Description : Supprime toutes les références externes. *
+* Description : Procède à la libération totale de la mémoire. *
* *
* Retour : - *
* *
@@ -209,58 +139,99 @@ static void g_panel_item_dockable_interface_init(GtkDockableInterface *iface)
* *
******************************************************************************/
-static void g_panel_item_dispose(GPanelItem *item)
+static void g_panel_item_finalize(GPanelItem *item)
{
- g_clear_object(&item->widget);
- g_clear_object(&item->cached_widget);
+ G_OBJECT_CLASS(g_panel_item_parent_class)->finalize(G_OBJECT(item));
- G_OBJECT_CLASS(g_panel_item_parent_class)->dispose(G_OBJECT(item));
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : item = définition de panneau à consulter. *
+* *
+* Description : Fournit une indication sur la personnalité du panneau. *
+* *
+* Retour : Identifiant lié à la nature du panneau. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+PanelItemPersonality g_panel_item_get_personality(const GPanelItem *item)
+{
+ PanelItemPersonality result; /* Personnalité à retourner */
+ GPanelItemClass *class; /* Classe à actionner */
+
+ class = G_PANEL_ITEM_GET_CLASS(item);
+
+ result = class->get_personality(item);
+
+ return result;
}
/******************************************************************************
* *
-* Paramètres : item = instance d'objet GLib à traiter. *
+* Paramètres : item = définition de panneau à manipuler. *
* *
-* Description : Procède à la libération totale de la mémoire. *
+* Description : Fournit un composant pour lancer l'activité d'un panneau. *
* *
-* Retour : - *
+* Retour : Composant GTK (déjà ?) mis en place. *
* *
* Remarques : - *
* *
******************************************************************************/
-static void g_panel_item_finalize(GPanelItem *item)
+GtkWidget *g_panel_item_get_launcher(GPanelItem *item)
{
- if (item->filter != NULL)
- free(item->filter);
+ GtkWidget *result; /* Composant à retourner */
+ GPanelItemClass *class; /* Classe à actionner */
- if (item->surface != NULL)
- cairo_surface_destroy(item->surface);
+ if (item->launcher == NULL)
+ {
+ class = G_PANEL_ITEM_GET_CLASS(item);
+ item->launcher = class->get_launcher(item);
+ }
- G_OBJECT_CLASS(g_panel_item_parent_class)->finalize(G_OBJECT(item));
+ result = item->launcher;
+
+ if (result != NULL)
+ ref_object(result);
+
+ return result;
}
/******************************************************************************
* *
-* Paramètres : class = classe à consulter. *
+* Paramètres : item = définition de panneau à manipuler. *
* *
-* Description : Fournit une indication sur la personnalité du panneau. *
+* Description : Fournit un composant pour paramétrer l'activité d'un panneau.*
* *
-* Retour : Identifiant lié à la nature du panneau. *
+* Retour : Composant GTK (déjà ?) mis en place. *
* *
* Remarques : - *
* *
******************************************************************************/
-PanelItemPersonality gtk_panel_item_class_get_personality(const GPanelItemClass *class)
+GtkWidget *g_panel_item_get_properties(GPanelItem *item)
{
- PanelItemPersonality result; /* Personnalité à retourner */
+ GtkWidget *result; /* Composant à retourner */
+ GPanelItemClass *class; /* Classe à actionner */
+
+ if (item->properties == NULL)
+ {
+ class = G_PANEL_ITEM_GET_CLASS(item);
+ item->properties = class->get_properties(item);
+ }
- result = class->get_personality(class);
+ result = item->properties;
+
+ if (result != NULL)
+ ref_object(result);
return result;
@@ -269,6 +240,120 @@ PanelItemPersonality gtk_panel_item_class_get_personality(const GPanelItemClass
/******************************************************************************
* *
+* Paramètres : item = définition de panneau à manipuler. *
+* *
+* Description : Fournit un composant représentant un panneau graphique. *
+* *
+* Retour : Composant GTK (déjà ?) mis en place. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GtkTiledPanel *g_panel_item_get_panel(GPanelItem *item)
+{
+ GtkTiledPanel *result; /* Composant à retourner */
+ GPanelItemClass *class; /* Classe à actionner */
+
+ if (item->pcount == 0 /* || !singleton */)
+ {
+ class = G_PANEL_ITEM_GET_CLASS(item);
+ result = class->get_panel(item, item->properties);
+
+ if (result != NULL)
+ {
+ item->panels = realloc(item->panels, ++item->pcount * sizeof(GtkTiledPanel *));
+ item->panels[item->pcount - 1] = result;
+ }
+
+ }
+
+ else
+ result = item->panels[item->pcount - 1];
+
+ if (result != NULL)
+ ref_object(result);
+
+ return result;
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+#if 0
+
+
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+
+
+#include "panel-int.h"
+#include "core/global.h"
+#include "core/items.h"
+#include "../common/extstr.h"
+#include "../core/params.h"
+#include "../gtkext/gtkdockable-int.h"
+#include "../gtkext/named.h"
+#include "../plugins/dt.h"
+#include "../plugins/pglist.h"
+
+
+
+/* ------------------------- COEUR DES PANNEAUX D'AFFICHAGE ------------------------- */
+
+
+
+
+/* ------------------------- COEUR D'UN PANNEAU D'AFFICHAGE ------------------------- */
+
+
+/* Construit la chaîne d'accès à un élément de configuration. */
+static char *gtk_panel_item_class_build_configuration_key(const GPanelItemClass *, const char *);
+
+/* Fournit le nom court du composant encapsulable. */
+static char *gtk_panel_item_get_name(const GPanelItem *);
+
+/* Fournit le nom long du composant encapsulable. */
+static char *gtk_panel_item_get_desc(const GPanelItem *);
+
+/* Détermine si un panneau peut être filtré. */
+static bool gtk_panel_item_can_search(const GPanelItem *);
+
+/* Fournit le composant graphique intégrable dans un ensemble. */
+static GtkWidget *gtk_panel_item_get_widget(GPanelItem *);
+
+/* Démarre l'actualisation du filtrage du contenu. */
+static void gtk_panel_item_update_filtered(GPanelItem *, const char *);
+
+
+
+/* ---------------------- MECANISMES DE MISE A JOUR DE PANNEAU ---------------------- */
+
+
+/* Présente une copie de l'affichage du composant rafraîchi. */
+static gboolean g_panel_item_draw_mask(GtkWidget *, cairo_t *, GPanelItem *);
+
+
+
+/* ---------------------------------------------------------------------------------- */
+/* COEUR DES PANNEAUX D'AFFICHAGE */
+/* ---------------------------------------------------------------------------------- */
+
+
+
+/******************************************************************************
+* *
* Paramètres : class = classe à consulter. *
* *
* Description : Fournit une indication sur la personnalité du panneau. *
@@ -1117,3 +1202,6 @@ void g_panel_item_switch_to_updated_content(GPanelItem *item)
g_atomic_int_dec_and_test(&item->switched);
}
+
+
+#endif