summaryrefslogtreecommitdiff
path: root/src/glibext/gcodebuffer.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/gcodebuffer.c
parentc476dae9b50d6ff218e903e3f8d40ad51003fa40 (diff)
Avoided to throw comments too far by defining local columns managers.
Diffstat (limited to 'src/glibext/gcodebuffer.c')
-rw-r--r--src/glibext/gcodebuffer.c113
1 files changed, 76 insertions, 37 deletions
diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c
index c676b7c..b211c4a 100644
--- a/src/glibext/gcodebuffer.c
+++ b/src/glibext/gcodebuffer.c
@@ -24,6 +24,7 @@
#include "gcodebuffer.h"
+#include <assert.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
@@ -132,6 +133,9 @@ static size_t _g_code_buffer_get_index_from_address_new(const GCodeBuffer *, con
/* Convertit une adresse en indice de ligne. */
static size_t g_code_buffer_get_index_from_address(GCodeBuffer *, const vmpa2t *, bool);
+/* Actualise les largeurs maximales par groupes de lignes. */
+static void g_code_buffer_update_line_max_widths(const GCodeBuffer *, size_t, size_t);
+
/* ---------------------- VUE PARTICULIERE D'UN TAMPON DE CODE ---------------------- */
@@ -149,11 +153,10 @@ struct _GBufferView
size_t last_index; /* Indice de la dernière ligne */ /* FIXME : idem */
gint line_height; /* Hauteur maximale des lignes */
- gint max_widths[BLC_COUNT]; /* Taille cachée des colonnes */
gint left_margin; /* Marge gauche + espace */
gint left_text; /* Début d'impression du code */
- gint last_width; /* Plus grande col. de fusion */
- BufferLineColumn last_merge; /* Colonne de fusion extrême */
+ gint max_widths[BLC_COUNT]; /* Taille cachée des colonnes */
+ gint merged_width; /* Plus grande taille de fusion*/
segcnt_list *highlighted; /* Segments mis en évidence */
bool external; /* Note l'origine de la liste */
@@ -634,6 +637,60 @@ static size_t g_code_buffer_get_index_from_address(GCodeBuffer *buffer, const vm
/******************************************************************************
* *
+* Paramètres : buffer = tampon contentenant un ensemble de lignes. *
+* first = première ligne modifiée à considérer. *
+* last = dernière ligne modifiée à considérer. *
+* *
+* Description : Actualise les largeurs maximales par groupes de lignes. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_code_buffer_update_line_max_widths(const GCodeBuffer *buffer, size_t first, size_t last)
+{
+ GBufferLine **lines; /* Liste des lignes à traiter */
+ size_t start; /* Début de groupe de largeurs */
+ size_t end; /* Fin de groupe de largeurs */
+ GBufferLine *manager; /* Ligne de gestion de largeurs*/
+ size_t i; /* Boucle de parcours */
+
+ assert(buffer->used > 0);
+
+ lines = buffer->lines;
+
+ /* Recherche des bornes du groupe de largeurs courant */
+
+ for (start = first; start > 0; start--)
+ if (g_buffer_line_get_flags(lines[start]) & BLF_WIDTH_MANAGER)
+ break;
+
+ for (end = last; end < (buffer->used - 1); end++)
+ if (g_buffer_line_get_flags(lines[end + 1]) & BLF_WIDTH_MANAGER)
+ break;
+
+ /* Réinitialisation ciblée des largeurs */
+
+ assert(g_buffer_line_get_flags(lines[start]) & BLF_WIDTH_MANAGER);
+
+ manager = NULL;
+
+ for (i = start; i <= end; i++)
+ {
+ if (g_buffer_line_get_flags(lines[i]) & BLF_WIDTH_MANAGER)
+ manager = lines[i];
+
+ g_buffer_line_update_max_widths(lines[i], manager);
+
+ }
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : buffer = composant GTK à mettre à jour. *
* range = emplacement où va se situer la ligne. *
* *
@@ -1144,6 +1201,8 @@ static void g_buffer_view_reset_required_widths(GBufferView *view)
for (i = 0; i < BLC_COUNT; i++)
view->max_widths[i] = -1;
+ view->merged_width = 0;
+
}
@@ -1184,10 +1243,7 @@ static void g_buffer_view_compute_required_widths(GBufferView *view, const bool
GBufferLine **lines; /* Liste des lignes à traiter */
size_t first; /* Première ligne intégrée */
size_t last; /* Dernière ligne intégrée */
- size_t i; /* Boucle de parcours #1 */
- unsigned int j; /* Boucle de parcours #2 */
- gint width; /* Largeur d'une colonne */
- BufferLineColumn merge; /* Début de fusion de colonnes */
+ size_t i; /* Boucle de parcours */
if (!HEIGHT_CACHED(view))
g_buffer_view_compute_required_height(view);
@@ -1200,32 +1256,14 @@ static void g_buffer_view_compute_required_widths(GBufferView *view, const bool
view->left_margin = 2 * view->line_height;
view->left_text = 2.5 * view->line_height;
- view->last_width = 0;
- view->last_merge = BLC_INVALID;
-
if (view->buffer->used > 0)
- for (i = first; i <= last; i++)
- {
- for (j = 0; j < BLC_COUNT; j++)
- {
- width = g_buffer_line_get_column_width(lines[i], j);
- view->max_widths[j] = MAX(view->max_widths[j], width);
- }
-
- width = g_buffer_line_get_merge_width(lines[i], &merge, display);
- view->last_width = MAX(view->last_width, width);
- if (merge != BLC_COUNT)
- {
- if (view->last_merge == BLC_INVALID)
- view->last_merge = merge;
- else
- view->last_merge = MAX(view->last_merge, merge);
- }
+ {
+ g_code_buffer_update_line_max_widths(view->buffer, first, last);
- }
+ for (i = first; i <= last; i++)
+ g_buffer_line_apply_max_widths(lines[i], view->max_widths, &view->merged_width);
- if (view->last_merge == BLC_INVALID)
- view->last_merge = BLC_COUNT;
+ }
}
@@ -1295,18 +1333,15 @@ gint g_buffer_view_get_width(GBufferView *view, const bool *display)
/* Seconde méthode */
- for (i = 0; i < view->last_merge; i++)
+ for (i = 0; i < BLC_DISPLAY; i++)
{
- if (i < BLC_DISPLAY && !display[i]) continue;
-
- full_width += view->max_widths[i];
+ if (!display[i]) continue;
- if ((i + 1) < view->last_merge)
- full_width += COL_MARGIN;
+ full_width += view->max_widths[i] + COL_MARGIN;
}
- full_width += view->last_width + COL_MARGIN;
+ full_width += view->merged_width;
/* Mise en concurrence et poursuite... */
@@ -1712,7 +1747,11 @@ const vmpa2t *g_buffer_view_move_caret(GBufferView *view, GdkRectangle *caret, b
for (i = BLC_ASSEMBLY_HEAD; i < BLC_COUNT; i++)
right_pos += view->max_widths[i] + COL_MARGIN;
+ /*
+gint g_buffer_line_compute_max_width(const GBufferLine *line, BufferLineColumn index, const gint *max_widths)
+BufferLineColumn g_buffer_line_get_merge_start(const GBufferLine *line)
+ */
left_pos = view->left_text;