diff options
Diffstat (limited to 'src/gtkext')
-rw-r--r-- | src/gtkext/gtkdockable-int.h | 12 | ||||
-rw-r--r-- | src/gtkext/gtkdockable.c | 65 | ||||
-rw-r--r-- | src/gtkext/tmgt.c | 118 | ||||
-rw-r--r-- | src/gtkext/tmgt.h | 5 |
4 files changed, 126 insertions, 74 deletions
diff --git a/src/gtkext/gtkdockable-int.h b/src/gtkext/gtkdockable-int.h index d9dbbd5..d4cd2d1 100644 --- a/src/gtkext/gtkdockable-int.h +++ b/src/gtkext/gtkdockable-int.h @@ -32,6 +32,12 @@ +/* Indique si le composant représenté à du contenu à fouiller. */ +typedef bool (* can_dockable_search_fc) (const GtkDockable *); + +/* Indique si le composant peut être désencapsulé manuellement. */ +typedef bool (* can_dockable_be_closed_fc) (const GtkDockable *); + /* Fournit le nom court du composant encapsulable. */ typedef const char * (* get_dockable_name_fc) (const GtkDockable *); @@ -42,7 +48,7 @@ typedef const char * (* get_dockable_desc_fc) (const GtkDockable *); typedef GtkWidget * (* get_dockable_widget_fc) (const GtkDockable *); /* Démarre l'actualisation du filtrage des paramètres. */ -typedef void (* update_filtered_data_fc) (GtkDockable *, const regex_t *); +typedef void (* update_filtered_data_fc) (GtkDockable *, char *); /* Elément accepté dans les rassemblements (interface) */ @@ -50,8 +56,8 @@ struct _GtkDockableIface { GTypeInterface base_iface; /* A laisser en premier */ - bool can_search; /* Contenu fouillable ? */ - bool can_be_closed; /* Fermeture possible ? */ + can_dockable_search_fc can_search; /* Contenu fouillable ? */ + can_dockable_be_closed_fc can_be_closed;/* Fermeture possible ? */ get_dockable_name_fc get_name; /* Nom pour titre */ get_dockable_desc_fc get_desc; /* Description humaine */ diff --git a/src/gtkext/gtkdockable.c b/src/gtkext/gtkdockable.c index cad9b43..3056402 100644 --- a/src/gtkext/gtkdockable.c +++ b/src/gtkext/gtkdockable.c @@ -33,6 +33,7 @@ #include "easygtk.h" #include "gtkdockable-int.h" +#include "tmgt.h" @@ -197,11 +198,14 @@ const char *gtk_dockable_get_desc(const GtkDockable *dockable) bool gtk_dockable_can_search(const GtkDockable *dockable) { + bool result; /* Indication à retourner */ GtkDockableIface *iface; /* Interface utilisée */ iface = GTK_DOCKABLE_GET_IFACE(dockable); - return iface->can_search; + result = iface->can_search(dockable); + + return result; } @@ -220,11 +224,14 @@ bool gtk_dockable_can_search(const GtkDockable *dockable) bool gtk_dockable_can_be_closed(const GtkDockable *dockable) { + bool result; /* Indication à retourner */ GtkDockableIface *iface; /* Interface utilisée */ iface = GTK_DOCKABLE_GET_IFACE(dockable); - return iface->can_be_closed; + result = iface->can_be_closed(dockable); + + return result; } @@ -256,7 +263,7 @@ GtkWidget *gtk_dockable_build_widget(GtkDockable *dockable) /* Encapsulation avec un panneau coulissant ? */ - if (iface->can_search) + if (gtk_dockable_can_search(dockable)) { revealer = gtk_revealer_new(); gtk_widget_show(revealer); @@ -305,7 +312,7 @@ GtkWidget *gtk_dockable_decompose(GtkDockable *dockable, GtkWidget **support) result = iface->get_widget(dockable); - if (iface->can_search) + if (gtk_dockable_can_search(dockable)) result = gtk_widget_get_parent(result); /* GtkBox */ if (support != NULL) @@ -407,56 +414,12 @@ static GtkWidget *build_search_area(GtkDockable *dockable, GtkWidget **search) static void on_dockable_search_changed(GtkSearchEntry *entry, GtkDockable *dockable) { - regex_t *filter; /* Expression régulière */ - const gchar *text; /* Texte de l'utilisateur */ - GtkStyleContext *context; /* Contexte du thème actuel */ - int ret; /* Bilan de mise en place */ + char *filter; /* Nouveau filtre à considérer */ GtkDockableIface *iface; /* Interface utilisée */ - filter = g_object_get_data(G_OBJECT(entry), "preg_filter"); - - text = gtk_entry_get_text(GTK_ENTRY(entry)); - - context = gtk_widget_get_style_context(GTK_WIDGET(entry)); - - /* Mise en place d'une nouvelle règle */ - if (strlen(text) > 0) - { - if (filter == NULL) - { - void destroy_filter(regex_t *preg) - { - regfree(preg); - free(preg); - } - - filter = (regex_t *)calloc(1, sizeof(regex_t)); - g_object_set_data_full(G_OBJECT(entry), "preg_filter", filter, (GDestroyNotify)destroy_filter); - - } - else - regfree(filter); - - ret = regcomp(filter, text, REG_EXTENDED); - - if (ret != 0) - { - gtk_style_context_add_class(context, "filter-error"); - return; - } - - } - - /* Suppresion de toute règle existante */ - else if (filter != NULL) - { - g_object_set_data(G_OBJECT(entry), "preg_filter", NULL); - filter = NULL; - } - - /* Mises à jour */ + filter = NULL; - gtk_style_context_remove_class(context, "filter-error"); + update_regex_on_search_entry_changed(entry, &filter); iface = GTK_DOCKABLE_GET_IFACE(dockable); diff --git a/src/gtkext/tmgt.c b/src/gtkext/tmgt.c index 536adb0..7e815f6 100644 --- a/src/gtkext/tmgt.c +++ b/src/gtkext/tmgt.c @@ -24,6 +24,7 @@ #include "tmgt.h" +#include <assert.h> #include <malloc.h> #include <string.h> @@ -45,41 +46,52 @@ * * ******************************************************************************/ -void update_regex_on_search_entry_changed(GtkSearchEntry *entry, regex_t **filter) +void update_regex_on_search_entry_changed(GtkSearchEntry *entry, char **filter) { const gchar *text; /* Texte de l'utilisateur */ - GtkStyleContext *context; /* Contexte du thème actuel */ + bool has_error; /* Détecttion d'une erreur */ + regex_t exp; /* Expression régulière créée */ int ret; /* Bilan de mise en place */ + GtkStyleContext *context; /* Contexte du thème actuel */ if (*filter != NULL) - { - regfree(*filter); free(*filter); - *filter = NULL; - } + + /* Validation et exportation des résultats */ text = gtk_entry_get_text(GTK_ENTRY(entry)); - context = gtk_widget_get_style_context(GTK_WIDGET(entry)); + if (strlen(text) == 0) + { + has_error = false; + *filter = NULL; + } - if (strlen(text) > 0) + else { - *filter = (regex_t *)calloc(1, sizeof(regex_t)); - ret = regcomp(*filter, text, REG_EXTENDED | REG_ICASE); + ret = regcomp(&exp, text, REG_EXTENDED | REG_ICASE); - if (ret != 0) - { - free(*filter); - *filter = NULL; + has_error = (ret != 0); - gtk_style_context_add_class(context, "filter-error"); - return; + if (has_error) + *filter = NULL; + else + { + *filter = strdup(text); + regfree(&exp); } } - gtk_style_context_remove_class(context, "filter-error"); + /* Indication à l'écran */ + + context = gtk_widget_get_style_context(GTK_WIDGET(entry)); + + if (has_error) + gtk_style_context_add_class(context, "filter-error"); + else + gtk_style_context_remove_class(context, "filter-error"); } @@ -103,10 +115,11 @@ bool is_content_matching(const regex_t *filter, const char *content, regmatch_t bool result; /* Bilan à retourner */ int ret; /* Bilan du filtrage */ - memset(match, 0, sizeof(regmatch_t)); - if (filter == NULL) + { + memset(match, 0, sizeof(regmatch_t)); result = true; + } else { @@ -199,3 +212,70 @@ char *build_highlighted_name(const char *raw, const regmatch_t *match, size_t st return result; } + + +/****************************************************************************** +* * +* Paramètres : store = organisation des données sous forme arborescente. * +* iter = position du noeud courant à traiter. * +* show = visibilité à obtenir pour le noeud final. * +* * +* Description : Met à jour l'affichage des noeuds en fonction des besoin. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void update_node_visibility(GtkTreeStore *store, GtkTreeIter *iter, gint column, bool show) +{ + GtkTreeModel *model; /* Autre vision du gestionnaire*/ + gint matched_col; /* Colonne de visibilité */ + gint points_col; /* Colonne des points */ + guint points; /* Compteur de besoins */ + GtkTreeIter parent; /* Position de noeuf parent */ + gboolean further; /* Poursuite de remontée */ + + model = GTK_TREE_MODEL(store); + + matched_col = column; + points_col = column + 1; + + /* Enumération des besoins */ + + gtk_tree_model_get(model, iter, points_col, &points, -1); + + if (show) + points++; + + else + { + assert(points > 0); + points--; + } + + gtk_tree_store_set(store, iter, points_col, points, -1); + + /* Adaptation de l'affichage */ + + if (show) + { + if (points == 1) + gtk_tree_store_set(store, iter, matched_col, true, -1); + } + + else + { + if (points == 0) + gtk_tree_store_set(store, iter, matched_col, false, -1); + } + + /* Eventuel étage supérieur */ + + further = gtk_tree_model_iter_parent(model, &parent, iter); + + if (further) + update_node_visibility(store, &parent, column, show); + +} diff --git a/src/gtkext/tmgt.h b/src/gtkext/tmgt.h index 189e704..3f3a4f3 100644 --- a/src/gtkext/tmgt.h +++ b/src/gtkext/tmgt.h @@ -32,7 +32,7 @@ /* Met à jour un filtre selon un contenu recherché. */ -void update_regex_on_search_entry_changed(GtkSearchEntry *, regex_t **); +void update_regex_on_search_entry_changed(GtkSearchEntry *, char **); /* Détermine si un contenu correspond à un filtre donné. */ bool is_content_matching(const regex_t *, const char *, regmatch_t *); @@ -40,6 +40,9 @@ bool is_content_matching(const regex_t *, const char *, regmatch_t *); /* Met en évidence le texte recherché en cas de correspondance. */ char *build_highlighted_name(const char *, const regmatch_t *, size_t); +/* Met à jour l'affichage des noeuds en fonction des besoin. */ +void update_node_visibility(GtkTreeStore *, GtkTreeIter *, gint, bool); + #endif /* _COMMON_TMGT_H */ |