summaryrefslogtreecommitdiff
path: root/src/glibext/gbuffersegment.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2015-04-12 22:07:56 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2015-04-12 22:07:56 (GMT)
commit90923fccb863075722d2ed17360e2c330b262e04 (patch)
treeb7588517a6437efa2d4cd885984e0b87ef8307fe /src/glibext/gbuffersegment.c
parent054d2d76f1951c20822286bce0128e60c26c4b9b (diff)
Highlighted the current segment on caret location changes.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@511 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/glibext/gbuffersegment.c')
-rw-r--r--src/glibext/gbuffersegment.c222
1 files changed, 194 insertions, 28 deletions
diff --git a/src/glibext/gbuffersegment.c b/src/glibext/gbuffersegment.c
index d25d728..8e7613f 100644
--- a/src/glibext/gbuffersegment.c
+++ b/src/glibext/gbuffersegment.c
@@ -36,6 +36,9 @@
+/* -------------------- NATURE DE BASE POUR UN FRAGMENT DE TEXTE -------------------- */
+
+
/* Propriétés de rendu */
typedef struct _rendering_color_t
@@ -105,8 +108,6 @@ struct _GBufferSegment
rendering_pattern_t *pattern; /* Propriétés du rendu */
- SegRenderingStyle style; /* Apparence du segment */
-
rendering_color_t cache_bg; /* Fond d'impression */
rendering_color_t alt_fg; /* Couleur d'impression bis */
const rendering_color_t *used_fg; /* Couleur d'impression utile */
@@ -144,6 +145,25 @@ static void g_buffer_segment_prepare(GBufferSegment *, size_t);
+
+/* -------------------- GESTION OPTIMALE D'UNE LISTE DE CONTENUS -------------------- */
+
+
+/* Liste identifiant un ensemble de segments */
+struct _segcnt_list
+{
+ fnv64_t *hashes; /* Empreinte pour comparaisons */
+ size_t count; /* Nommbre de ces empreintes */
+
+};
+
+
+
+/* ---------------------------------------------------------------------------------- */
+/* NATURE DE BASE POUR UN FRAGMENT DE TEXTE */
+/* ---------------------------------------------------------------------------------- */
+
+
/* Détermine le type du fragment de caractères aux propriétés communes. */
G_DEFINE_TYPE(GBufferSegment, g_buffer_segment, G_TYPE_OBJECT);
@@ -360,15 +380,13 @@ GBufferSegment *g_buffer_segment_new(RenderingTagType type, const char *text, si
result = g_object_new(G_TYPE_BUFFER_SEGMENT, NULL);
result->text = strndup(text, length);
- result->hash = fnv_64a_hash(text);
+ result->hash = fnv_64a_hash(result->text);
class = G_BUFFER_SEGMENT_GET_CLASS(result);
result->pattern = &class->patterns[type];
g_buffer_segment_prepare(result, length);
- g_buffer_segment_set_style(result, SRS_CLASSIC);
-
return result;
}
@@ -702,9 +720,12 @@ bool g_buffer_segment_move_caret(const GBufferSegment *segment, gint *x, bool ct
/******************************************************************************
* *
* Paramètres : segment = fragment de texte à manipuler. *
-* style = style de rendu pour le segment. *
+* cairo = contexte graphique à utiliser pour les pinceaux. *
+* x = abscisse du point d'impression (à maj). [OUT] *
+* y = ordonnée du point d'impression. *
+* list = liste de contenus à mettre en évidence. *
* *
-* Description : Module l'apparence finale du composant. *
+* Description : Imprime le fragment de texte représenté. *
* *
* Retour : - *
* *
@@ -712,10 +733,14 @@ bool g_buffer_segment_move_caret(const GBufferSegment *segment, gint *x, bool ct
* *
******************************************************************************/
-void g_buffer_segment_set_style(GBufferSegment *segment, SegRenderingStyle style)
+void g_buffer_segment_draw(GBufferSegment *segment, cairo_t *cairo, gint *x, gint y, const segcnt_list *list)
{
- segment->style = style;
+ bool selected; /* Marquer une sélection ? */
+ cairo_font_extents_t extents;
+
+
+ /*
switch (style)
{
default:
@@ -734,34 +759,28 @@ void g_buffer_segment_set_style(GBufferSegment *segment, SegRenderingStyle style
break;
}
+ */
-}
+ segment->used_fg = &segment->pattern->foreground;
-/******************************************************************************
-* *
-* Paramètres : segment = fragment de texte à manipuler. *
-* cairo = contexte graphique à utiliser pour les pinceaux. *
-* x = abscisse du point d'impression (à maj). [OUT] *
-* y = ordonnée du point d'impression. *
-* *
-* Description : Imprime le fragment de texte représenté. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-void g_buffer_segment_draw(GBufferSegment *segment, cairo_t *cairo, gint *x, gint y)
-{
+ selected = selection_list_has_segment_content(list, segment);
- cairo_font_extents_t extents;
+ if (selected)
+ {
+ segment->cache_bg.color.red = 0.5;
+ segment->cache_bg.color.green = 0.5;
+ segment->cache_bg.color.blue = 0.5;
+
+ segment->used_fg = &segment->alt_fg;
+
+ }
/* Fond du texte */
- if (segment->style != SRS_CLASSIC)
+ if (selected)
{
cairo_set_source_rgb(cairo,
segment->cache_bg.color.red,
@@ -935,3 +954,150 @@ void g_buffer_segment_export(const GBufferSegment *segment, buffer_export_contex
}
}
+
+
+
+/* ---------------------------------------------------------------------------------- */
+/* GESTION OPTIMALE D'UNE LISTE DE CONTENUS */
+/* ---------------------------------------------------------------------------------- */
+
+
+/******************************************************************************
+* *
+* Paramètres : - *
+* *
+* Description : Initilise une liste de contenus de segments. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+segcnt_list *init_segment_content_list(void)
+{
+ segcnt_list *result; /* Structure à retourner */
+
+ result = (segcnt_list *)calloc(1, sizeof(segcnt_list));
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : list = ensemble de références de contenus à traiter. *
+* *
+* Description : Libère la mémoire occupée par une liste de contenus. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void exit_segment_content_list(segcnt_list *list)
+{
+ reset_segment_content_list(list);
+
+ free(list);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : list = ensemble de références de contenus à manipuler. *
+* *
+* Description : Vide, si besoin est, une liste de contenus de segments. *
+* *
+* Retour : true si des éléments ont été purgés, false sinon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool reset_segment_content_list(segcnt_list *list)
+{
+ bool result; /* Bilan d'action à renvoyer */
+
+ result = (list->count > 0);
+
+ if (list->hashes != NULL)
+ {
+ free(list->hashes);
+ list->hashes = NULL;
+ }
+
+ list->count = 0;
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : list = ensemble de références de contenus à manipuler. *
+* segment = fragment de texte à conservr. *
+* *
+* Description : Marque le contenu d'un segment comme remarquable. *
+* *
+* Retour : true si la liste a été complétée, false sinon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool add_segment_content_to_selection_list(segcnt_list *list, const GBufferSegment *segment)
+{
+ bool result; /* Bilan à retourner */
+ size_t i; /* Boucle de parcours */
+
+ static const char white_list[] = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+ result = false;
+
+ for (i = 0; i < (sizeof(white_list) - 1) && !result; i++)
+ result = (strchr(segment->text, white_list[i]) != NULL);
+
+ if (result)
+ {
+ list->hashes = (fnv64_t *)realloc(list->hashes, ++list->count * sizeof(fnv64_t));
+
+ list->hashes[list->count - 1] = segment->hash;
+
+ }
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : list = ensemble de références de contenus à consulter. *
+* segment = fragment de texte à comparer. *
+* *
+* Description : Indique si le contenu d'un segment est notable ou non. *
+* *
+* Retour : true si le segment a un contenu présent dans la sélection. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool selection_list_has_segment_content(const segcnt_list *list, const GBufferSegment *segment)
+{
+ bool result; /* Bilan à retourner */
+ size_t i; /* Boucle de parcours */
+
+ result = false;
+
+ for (i = 0; i < list->count && !result; i++)
+ result = (cmp_fnv_64a(list->hashes[i], segment->hash) == 0);
+
+ return result;
+
+}