summaryrefslogtreecommitdiff
path: root/src/glibext/gbufferline.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2015-12-09 22:06:59 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2015-12-09 22:06:59 (GMT)
commitc644db0ad3b1a276f2c3bf9be72026c3581dd35f (patch)
tree6d672db75ff38eb9daf9e600cdba8373f3cc7d7f /src/glibext/gbufferline.c
parentc476dae9b50d6ff218e903e3f8d40ad51003fa40 (diff)
Avoided to throw comments too far by defining local columns managers.
Diffstat (limited to 'src/glibext/gbufferline.c')
-rw-r--r--src/glibext/gbufferline.c239
1 files changed, 215 insertions, 24 deletions
diff --git a/src/glibext/gbufferline.c b/src/glibext/gbufferline.c
index 7768a0e..c998fce 100644
--- a/src/glibext/gbufferline.c
+++ b/src/glibext/gbufferline.c
@@ -99,6 +99,16 @@ struct _GBufferLine
BufferLineFlags flags; /* Drapeaux particuliers */
+ union
+ {
+ struct
+ {
+ gint max_widths[BLC_COUNT]; /* Taille cachée des colonnes */
+ gint merged_width; /* Largeur cumulée avant fusion*/
+ };
+ GBufferLine *manager; /* Représentante d'un groupe */
+ };
+
};
/* Représentation de fragments de texte en ligne (classe) */
@@ -122,6 +132,12 @@ static void g_buffer_line_class_init(GBufferLineClass *);
/* Procède à l'initialisation d'une représentation de fragments. */
static void g_buffer_line_init(GBufferLine *);
+/* Supprime toutes les références externes. */
+static void g_buffer_line_dispose(GBufferLine *);
+
+/* Procède à la libération totale de la mémoire. */
+static void g_buffer_line_finalize(GBufferLine *);
+
/* ---------------------------------------------------------------------------------- */
@@ -453,8 +469,14 @@ G_DEFINE_TYPE(GBufferLine, g_buffer_line, G_TYPE_OBJECT);
static void g_buffer_line_class_init(GBufferLineClass *class)
{
+ GObjectClass *object; /* Autre version de la classe */
gchar *filename; /* Chemin d'accès à utiliser */
+ object = G_OBJECT_CLASS(class);
+
+ object->dispose = (GObjectFinalizeFunc/* ! */)g_buffer_line_dispose;
+ object->finalize = (GObjectFinalizeFunc)g_buffer_line_finalize;
+
filename = find_pixmap_file("entrypoint.png");
assert(filename != NULL);
@@ -507,6 +529,49 @@ static void g_buffer_line_init(GBufferLine *line)
/******************************************************************************
* *
+* Paramètres : line = instance d'objet GLib à traiter. *
+* *
+* Description : Supprime toutes les références externes. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_buffer_line_dispose(GBufferLine *line)
+{
+ if (line->flags & BLF_WIDTH_MANAGER)
+ g_object_unref(G_OBJECT(line->manager));
+
+ G_OBJECT_CLASS(g_buffer_line_parent_class)->dispose(G_OBJECT(line));
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : line = instance d'objet GLib à traiter. *
+* *
+* Description : Procède à la libération totale de la mémoire. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_buffer_line_finalize(GBufferLine *line)
+{
+ /* TODO : segments des colonnes... */
+
+ G_OBJECT_CLASS(g_buffer_line_parent_class)->finalize(G_OBJECT(line));
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : range = emplacement où va se situer la ligne. *
* main = colonne à référencer comme étant la principale. *
* *
@@ -792,7 +857,7 @@ GBufferSegment *g_buffer_line_get_segment_at(const GBufferLine *line, const gint
if (i < line->merge_start)
{
- width = max_widths[i];
+ width = g_buffer_line_compute_max_width(line, i, max_widths);
if ((i + 1) < BLC_COUNT) limit = width + COL_MARGIN / 2;
else limit = width;
@@ -863,7 +928,10 @@ GBufferSegment *g_buffer_line_get_segment_at(const GBufferLine *line, const gint
printf(" -- update to col %u -- x = %d\n", i, *offset);
if ((i - 1) < line->merge_start)
- *base += (max_widths[i - 1] + COL_MARGIN);
+ {
+ width = g_buffer_line_compute_max_width(line, i - 1, max_widths);
+ *base += (width + COL_MARGIN);
+ }
else
*base += get_column_width(&line->columns[i - 1]);
@@ -998,7 +1066,10 @@ GBufferSegment *g_buffer_line_find_near_segment(const GBufferLine *line, GBuffer
displayed = (k < BLC_DISPLAY ? display[k] : true);
if (displayed)
- *offset += max_widths[k] + COL_MARGIN;
+ {
+ *offset += g_buffer_line_compute_max_width(line, k, max_widths);
+ if (k < line->merge_start) *offset += COL_MARGIN;
+ }
}
@@ -1118,55 +1189,147 @@ char *g_buffer_line_get_text(const GBufferLine *line, BufferLineColumn first, Bu
/******************************************************************************
* *
-* Paramètres : line = ligne à venir compléter. *
-* index = index de la colonne visée par la procédure. *
+* Paramètres : line = ligne à venir consulter/compléter. *
+* manager = ligne de départ d'un groupe de ligne. *
* *
-* Description : Fournit la largeur requise pour une colonne de ligne donnée. *
+* Description : Retient les largeurs d'une ligne si maximales. *
* *
-* Retour : Largeur en pixel requise. *
+* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
-gint g_buffer_line_get_column_width(GBufferLine *line, BufferLineColumn index)
+void g_buffer_line_update_max_widths(GBufferLine *line, GBufferLine *manager)
{
- gint result; /* Largeur à retourner */
+ BufferLineColumn i; /* Boucle de parcours */
+ GBufferLine *old; /* Ancienne ligne associée */
+ gint merged_width; /* Largeur cumulée avant fusion*/
+ gint width; /* Largeur d'une colonne */
- if (index >= line->merge_start) result = 0;
- else result = get_column_width(&line->columns[index]);
+ /* Réinitialisation ? */
- return result;
+ if (line == manager)
+ {
+ assert(line->flags & BLF_WIDTH_MANAGER);
+
+ for (i = 0; i < BLC_COUNT; i++)
+ line->max_widths[i] = 0;
+
+ line->merged_width = 0;
+
+ }
+ else
+ {
+ assert((line->flags & BLF_WIDTH_MANAGER) == 0);
+
+ old = line->manager;
+
+ g_object_ref(G_OBJECT(manager));
+ line->manager = manager;
+
+ g_object_unref(G_OBJECT(old));
+
+ }
+
+ /* Mises à jour */
+
+ merged_width = 0;
+
+ for (i = 0; i < BLC_COUNT; i++)
+ {
+ width = get_column_width(&line->columns[i]);
+
+ if (i < line->merge_start)
+ manager->max_widths[i] = MAX(manager->max_widths[i], width);
+
+ if (i >= BLC_DISPLAY)
+ {
+ merged_width += width;
+
+ if (i < line->merge_start && (i + 1) < BLC_COUNT)
+ merged_width += COL_MARGIN;
+
+ }
+
+ }
+
+ if (line->merge_start != BLC_COUNT)
+ manager->merged_width = MAX(manager->merged_width, merged_width);
}
/******************************************************************************
* *
-* Paramètres : line = ligne à venir compléter. *
-* merge = précise la première colonne marquant la fusion. [OUT]*
-* display = règles d'affichage des colonnes modulables. *
+* Paramètres : line = ligne à venir consulter. *
+* max_widths = tableau résumant les largeurs maximales. [OUT]*
+* merged_width = largeur maximale en cas de fusion. |OUT] *
* *
-* Description : Fournit la dernière largeur d'une ligne avec fusion. *
+* Description : Filtre des largeurs de lignes et ne garde que les maximales. *
* *
-* Retour : Largeur en pixel requise. *
+* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
-gint g_buffer_line_get_merge_width(GBufferLine *line, BufferLineColumn *merge, const bool *display)
+void g_buffer_line_apply_max_widths(GBufferLine *line, gint *max_widths, gint *merged_width)
+{
+ GBufferLine *manager; /* Gestionnaire de groupe */
+ BufferLineColumn i; /* Boucle de parcours */
+
+ if (line->flags & BLF_WIDTH_MANAGER)
+ manager = line;
+ else
+ manager = line->manager;
+
+ for (i = 0; i < BLC_COUNT; i++)
+ max_widths[i] = MAX(manager->max_widths[i], max_widths[i]);
+
+ *merged_width = MAX(manager->merged_width, *merged_width);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : line = ligne à venir consulter. *
+* index = indice de la colonne visée. *
+* max_widths = tableau résumant les largeurs maximales. *
+* *
+* Description : Fournit la largeur d'une colonne finalement appliquée. *
+* *
+* Retour : Largeur globale ou spécifique, selon l'indice communiqué. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+gint g_buffer_line_compute_max_width(const GBufferLine *line, BufferLineColumn index, const gint *max_widths)
{
gint result; /* Largeur à retourner */
- result = 0;
+ assert(index < BLC_COUNT);
+
+ if (index >= line->merge_start)
+ result = get_column_width(&line->columns[index]);
+
+ else
+ {
+ if (index < BLC_ASSEMBLY)
+ result = max_widths[index];
- /* TODO : wtf ?! quelle est l'utilité des arguments booléens ? */
+ else
+ {
+ if (line->flags & BLF_WIDTH_MANAGER)
+ result = line->max_widths[index];
+ else
+ result = line->manager->max_widths[index];
- *merge = line->merge_start;
+ }
- if (line->merge_start < BLC_COUNT)
- result = get_column_width(&line->columns[line->merge_start]);
+ }
return result;
@@ -1175,6 +1338,25 @@ gint g_buffer_line_get_merge_width(GBufferLine *line, BufferLineColumn *merge, c
/******************************************************************************
* *
+* Paramètres : line = ligne à venir consulter. *
+* *
+* Description : Fournit la colonne à partir de laquelle une fusion opère. *
+* *
+* Retour : Début de la première (et unique) zone globale. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+BufferLineColumn g_buffer_line_get_merge_start(const GBufferLine *line)
+{
+ return line->merge_start;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : line = ligne à venir compléter. *
* start = début de la première (et unique) zone globale. *
* *
@@ -1290,6 +1472,7 @@ void g_buffer_line_draw(GBufferLine *line, cairo_t *cairo, const gint max_widths
GBufferLineClass *class; /* Stockage de briques de base */
gint x; /* Point de départ d'impression*/
BufferLineColumn i; /* Boucle de parcours */
+ gint max_width; /* Largeur maximale de colonne */
if (line->flags != BLF_NONE && line->flags != BLF_HAS_CODE)
{
@@ -1300,6 +1483,9 @@ void g_buffer_line_draw(GBufferLine *line, cairo_t *cairo, const gint max_widths
else if (line->flags & BLF_BOOKMARK)
cairo_set_source_surface(cairo, class->bookmark_img, 5, y);
+ //////////////////
+ cairo_set_source_surface(cairo, class->entrypoint_img, 5, y);
+
cairo_paint(cairo);
}
@@ -1313,7 +1499,12 @@ void g_buffer_line_draw(GBufferLine *line, cairo_t *cairo, const gint max_widths
draw_segments_of_column(&line->columns[i], cairo, x, y, list);
if (i < line->merge_start)
- x += max_widths[i] + COL_MARGIN;
+ {
+ max_width = g_buffer_line_compute_max_width(line, i, max_widths);
+
+ x += max_width + COL_MARGIN;
+
+ }
}