summaryrefslogtreecommitdiff
path: root/src/glibext/bufferline.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/glibext/bufferline.c')
-rw-r--r--src/glibext/bufferline.c68
1 files changed, 36 insertions, 32 deletions
diff --git a/src/glibext/bufferline.c b/src/glibext/bufferline.c
index 3e93c9c..5eec1db 100644
--- a/src/glibext/bufferline.c
+++ b/src/glibext/bufferline.c
@@ -53,10 +53,8 @@ struct _GBufferLine
{
GObject parent; /* A laisser en premier */
- mrange_t range; /* Couverture geographique */
- BufferLineColumn main_column; /* Colonne principale */
-
- line_column columns[BLC_COUNT]; /* Répartition du texte */
+ line_column *columns; /* Répartition du texte */
+ size_t col_count; /* Nombre de colonnes présentes*/
BufferLineColumn merge_start; /* Début de la zone globale */
BufferLineColumn last_used; /* Dernière colonne utilisée */
@@ -177,13 +175,10 @@ static void g_buffer_line_class_init(GBufferLineClass *class)
static void g_buffer_line_init(GBufferLine *line)
{
- BufferLineColumn i; /* Boucle de parcours */
-
- for (i = 0; i < BLC_COUNT; i++)
- init_line_column(&line->columns[i]);
-
- line->merge_start = BLC_COUNT;
- line->last_used = BLC_COUNT;
+ line->columns = NULL;
+ line->col_count = 0;
+ line->merge_start = -1;
+ line->last_used = -1;
}
@@ -226,11 +221,14 @@ static void g_buffer_line_dispose(GBufferLine *line)
static void g_buffer_line_finalize(GBufferLine *line)
{
- BufferLineColumn i; /* Boucle de parcours */
+ size_t i; /* Boucle de parcours */
- for (i = 0; i < BLC_COUNT; i++)
+ for (i = 0; i < line->col_count; i++)
reset_line_column(&line->columns[i]);
+ if (line->columns != NULL)
+ free(line->columns);
+
if (line->origins != NULL)
free(line->origins);
@@ -241,7 +239,7 @@ static void g_buffer_line_finalize(GBufferLine *line)
/******************************************************************************
* *
-* Paramètres : main = colonne à référencer comme étant la principale. *
+* Paramètres : col_count = quantité de colonnes à considérer. *
* *
* Description : Crée une nouvelle représentation de fragments de texte. *
* *
@@ -251,13 +249,19 @@ static void g_buffer_line_finalize(GBufferLine *line)
* *
******************************************************************************/
-GBufferLine *g_buffer_line_new(BufferLineColumn main)
+GBufferLine *g_buffer_line_new(size_t col_count)
{
GBufferLine *result; /* Composant à retourner */
+ size_t i; /* Boucle de parcours */
result = g_object_new(G_TYPE_BUFFER_LINE, NULL);
- result->main_column = main;
+ result->columns = malloc(col_count * sizeof(line_column));
+
+ for (i = 0; i < col_count; i++)
+ init_line_column(&result->columns[i]);
+
+ result->col_count = col_count;
return result;
@@ -887,8 +891,11 @@ void g_buffer_line_export(GBufferLine *line, buffer_export_context *ctx, BufferE
/******************************************************************************
* *
-* Paramètres : line = ligne à venir consulter. *
-* summary = largeurs maximales à faire évoluer. *
+* Paramètres : line = ligne à venir consulter. *
+* col_count = quantité de colonnes à considérer. *
+* opt_count = quantité de colonnes optionnelles. *
+* widths = largeur mesurée pour chacune des colonnes. [OUT] *
+* merged = largeur cumulée en cas de fusion. [OUT] *
* *
* Description : Fait remonter les largeurs requises par une ligne donnée. *
* *
@@ -898,35 +905,32 @@ void g_buffer_line_export(GBufferLine *line, buffer_export_context *ctx, BufferE
* *
******************************************************************************/
-void g_buffer_line_collect_widths(GBufferLine *line, line_width_summary *summary)
+void g_buffer_line_collect_widths(const GBufferLine *line, size_t col_count, size_t opt_count, gint *widths, gint *merged)
{
- gint merged_width; /* Largeur cumulée avant fusion*/
- BufferLineColumn i; /* Boucle de parcours */
+ size_t i; /* Boucle de parcours */
gint width; /* Largeur d'une colonne */
- merged_width = 0;
+ assert(col_count == line->col_count);
- for (i = 0; i < BLC_COUNT; i++)
+ *merged = 0;
+
+ for (i = 0; i < col_count; i++)
{
width = get_column_width(&line->columns[i]);
- if (i < line->merge_start)
- summary->max_widths[i] = MAX(summary->max_widths[i], width);
+ widths[i] = (i < line->merge_start ? width : 0);
- if (i >= BLC_DISPLAY)
+ if (line->merge_start != -1 && i >= opt_count)
{
- merged_width += width;
+ *merged += width;
- if (i < line->merge_start && (i + 1) < BLC_COUNT)
- merged_width += COL_MARGIN;
+ if (i < line->merge_start && (i + 1) < col_count)
+ *merged += COL_MARGIN;
}
}
- if (line->merge_start != BLC_COUNT)
- summary->merged_width = MAX(summary->merged_width, merged_width);
-
}