diff options
Diffstat (limited to 'src/gui/panels/strings.c')
-rw-r--r-- | src/gui/panels/strings.c | 137 |
1 files changed, 55 insertions, 82 deletions
diff --git a/src/gui/panels/strings.c b/src/gui/panels/strings.c index 8d41165..4d7d077 100644 --- a/src/gui/panels/strings.c +++ b/src/gui/panels/strings.c @@ -26,7 +26,6 @@ #include <inttypes.h> -#include <regex.h> #include "panel-int.h" @@ -34,6 +33,7 @@ #include "../../core/params.h" #include "../../dialogs/gotox.h" #include "../../gtkext/easygtk.h" +#include "../../gtkext/gtkdockable-int.h" @@ -46,7 +46,7 @@ struct _GStringsPanel GPanelItem parent; /* A laisser en premier */ GtkTreeView *treeview; /* Composant d'affichage */ - regex_t *filter; /* Filtre appliqué ou NULL */ + const regex_t *filter; /* Filtre appliqué ou NULL */ GtkMenu *menu; /* Menu contextuel pour param. */ @@ -84,22 +84,23 @@ static void g_strings_panel_class_init(GStringsPanelClass *); /* Initialise une instance de panneau d'affichage des chaînes. */ static void g_strings_panel_init(GStringsPanel *); +/* Procède à l'initialisation de l'interface de rassemblement. */ +static void g_strings_panel_dockable_interface_init(GtkDockableInterface *); + /* Supprime toutes les références externes. */ static void g_strings_panel_dispose(GStringsPanel *); /* Procède à la libération totale de la mémoire. */ static void g_strings_panel_finalize(GStringsPanel *); -/* Réagit à un changement d'affichage principal de contenu. */ -static void change_strings_panel_current_binary(GStringsPanel *, GLoadedBinary *); - - - /* ------------------------- AFFICHAGE A L'AIDE D'UNE LISTE ------------------------- */ +/* Réagit à un changement d'affichage principal de contenu. */ +static void change_strings_panel_current_binary(GStringsPanel *, GLoadedBinary *); + /* Réagit au changement de sélection des chaînes textuelles. */ static void on_strings_selection_change(GtkTreeSelection *, GStringsPanel *); @@ -117,8 +118,8 @@ static void on_string_value_edited(GtkCellRendererText *, gchar *, gchar *, GtkT /* ------------------------- FILTRAGE DES SYMBOLES PRESENTS ------------------------- */ -/* Démarre l'actualisation du filtrage des paramètres. */ -static void on_string_search_changed(GtkSearchEntry *, GStringsPanel *); +/* Démarre l'actualisation du filtrage des chaînes. */ +static void update_filtered_strings(GStringsPanel *, const regex_t *); /* Détermine si une chaîne textuelle doit être filtrée ou non. */ static bool is_string_filtered(GStringsPanel *, const char *, const char *); @@ -151,14 +152,14 @@ static void mcb_strings_panel_filter(GtkMenuItem *, GStringsPanel *); - /* ---------------------------------------------------------------------------------- */ /* PARTIE PRINCIPALE DU PANNEAU */ /* ---------------------------------------------------------------------------------- */ /* Indique le type définit pour un panneau d'affichage des chaînes. */ -G_DEFINE_TYPE(GStringsPanel, g_strings_panel, G_TYPE_PANEL_ITEM); +G_DEFINE_TYPE_WITH_CODE(GStringsPanel, g_strings_panel, G_TYPE_PANEL_ITEM, + G_IMPLEMENT_INTERFACE(GTK_TYPE_DOCKABLE, g_strings_panel_dockable_interface_init)) /****************************************************************************** @@ -206,9 +207,6 @@ static void g_strings_panel_init(GStringsPanel *panel) { GEditorItem *base; /* Version basique d'instance */ GObject *ref; /* Espace de référencement */ - GtkWidget *label; /* Etiquette à utiliser */ - GtkWidget *search; /* Zone de recherche */ - GtkWidget *scrolled; /* Fenêtre défilante */ GtkTreeStore *store; /* Modèle de gestion */ GtkWidget *treeview; /* Affichage de la liste */ GtkCellRenderer *renderer; /* Moteur de rendu de colonne */ @@ -219,35 +217,16 @@ static void g_strings_panel_init(GStringsPanel *panel) base = G_EDITOR_ITEM(panel); - base->widget = gtk_grid_new(); + base->widget = gtk_scrolled_window_new(NULL, NULL); gtk_widget_show(base->widget); - gtk_grid_set_row_spacing(GTK_GRID(base->widget), 8); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(base->widget), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(base->widget), GTK_SHADOW_IN); ref = G_OBJECT(base->widget); g_object_set_data(ref, "panel", panel); - /* Partie recherche */ - - label = qck_create_label(NULL, NULL, _("Look for:")); - g_object_set(label, "margin", 8, NULL); - gtk_grid_attach(GTK_GRID(base->widget), label, 0, 0, 1, 1); - - search = gtk_search_entry_new(); - g_signal_connect(search, "search-changed", G_CALLBACK(on_string_search_changed), panel); - gtk_widget_show(search); - gtk_widget_set_hexpand(search, TRUE); - gtk_grid_attach_next_to(GTK_GRID(base->widget), search, label, GTK_POS_RIGHT, 1, 1); - - /* Partie paramètres */ - - scrolled = gtk_scrolled_window_new(NULL, NULL); - gtk_widget_show(scrolled); - gtk_widget_set_vexpand(scrolled, TRUE); - gtk_grid_attach_next_to(GTK_GRID(base->widget), scrolled, label, GTK_POS_BOTTOM, 2, 1); - - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN); + /* Partie chaînes */ store = gtk_tree_store_new(STC_COUNT, G_TYPE_OBJECT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); @@ -263,7 +242,7 @@ static void g_strings_panel_init(GStringsPanel *panel) G_CALLBACK(on_key_pressed_over_strings), panel); gtk_widget_show(treeview); - gtk_container_add(GTK_CONTAINER(scrolled), treeview); + gtk_container_add(GTK_CONTAINER(base->widget), treeview); g_object_unref(G_OBJECT(store)); @@ -336,6 +315,35 @@ static void g_strings_panel_init(GStringsPanel *panel) /****************************************************************************** * * +* Paramètres : iface = interface GTK à initialiser. * +* * +* Description : Procède à l'initialisation de l'interface de rassemblement. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_strings_panel_dockable_interface_init(GtkDockableInterface *iface) +{ + GtkDockableInterface *parent_iface; /* Définition précédente */ + + parent_iface = (GtkDockableInterface *)g_type_interface_peek_parent(iface); + + iface->can_search = true; + iface->can_be_closed = true; + + iface->get_name = parent_iface->get_name; + iface->get_desc = parent_iface->get_desc; + iface->get_widget = parent_iface->get_widget; + iface->update_filtered = (update_filtered_data_fc)update_filtered_strings; + +} + + +/****************************************************************************** +* * * Paramètres : panel = instance d'objet GLib à traiter. * * * * Description : Supprime toutes les références externes. * @@ -708,10 +716,10 @@ static void on_string_value_edited(GtkCellRendererText *renderer, gchar *path, g /****************************************************************************** * * -* Paramètres : entry = entrée de texte contenant le filtre brut. * -* panel = panneau assurant l'affichage des paramètres. * +* Paramètres : panel = panneau assurant l'affichage des paramètres. * +* preg = expression régulière compilée à utiliser. * * * -* Description : Démarre l'actualisation du filtrage des paramètres. * +* Description : Démarre l'actualisation du filtrage des chaînes. * * * * Retour : - * * * @@ -719,44 +727,9 @@ static void on_string_value_edited(GtkCellRendererText *renderer, gchar *path, g * * ******************************************************************************/ -static void on_string_search_changed(GtkSearchEntry *entry, GStringsPanel *panel) +static void update_filtered_strings(GStringsPanel *panel, const regex_t *preg) { - const gchar *text; /* Texte de l'utilisateur */ - int ret; /* Bilan de mise en place */ - GdkRGBA error; /* Couleur d'erreur */ - - if (panel->filter != NULL) - { - regfree(panel->filter); - free(panel->filter); - panel->filter = NULL; - } - - text = gtk_entry_get_text(GTK_ENTRY(entry)); - - if (strlen(text) > 0) - { - panel->filter = (regex_t *)calloc(1, sizeof(regex_t)); - ret = regcomp(panel->filter, text, REG_EXTENDED); - - if (ret != 0) - { - free(panel->filter); - panel->filter = NULL; - - error.red = 1.0; - error.green = 0.0; - error.blue = 0.0; - error.alpha = 1.0; - gtk_widget_override_color(GTK_WIDGET(entry), GTK_STATE_NORMAL, &error); - - return; - - } - - } - - gtk_widget_override_color(GTK_WIDGET(entry), GTK_STATE_NORMAL, NULL); + panel->filter = preg; change_strings_panel_current_binary(panel, panel->binary); @@ -786,18 +759,18 @@ static bool is_string_filtered(GStringsPanel *panel, const char *label, const ch if (panel->filter == NULL) return false; - result = false; + result = true; if (label != NULL) { ret = regexec(panel->filter, label, 1, &match, 0); - result |= (ret != REG_NOMATCH); + result &= (ret == REG_NOMATCH); } ret = regexec(panel->filter, value, 1, &match, 0); - result |= (ret != REG_NOMATCH); + result &= (ret == REG_NOMATCH); - return !result; + return result; } |