diff options
Diffstat (limited to 'src/glibext/gcodebuffer.c')
-rw-r--r-- | src/glibext/gcodebuffer.c | 113 |
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; |