summaryrefslogtreecommitdiff
path: root/src/gtkext
diff options
context:
space:
mode:
Diffstat (limited to 'src/gtkext')
-rw-r--r--src/gtkext/gtkdockable-int.h12
-rw-r--r--src/gtkext/gtkdockable.c65
-rw-r--r--src/gtkext/tmgt.c118
-rw-r--r--src/gtkext/tmgt.h5
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 */