diff options
Diffstat (limited to 'src/glibext/gcodebuffer.c')
-rw-r--r-- | src/glibext/gcodebuffer.c | 127 |
1 files changed, 111 insertions, 16 deletions
diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c index 4302f14..452d695 100644 --- a/src/glibext/gcodebuffer.c +++ b/src/glibext/gcodebuffer.c @@ -146,6 +146,8 @@ struct _GBufferView 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 */ buffer_line_draw_fc drawing_extra; /* Fonction d'accompagnement */ void *drawing_data; /* Donnée utilisateur */ @@ -165,6 +167,7 @@ struct _GBufferViewClass }; +#define HEIGHT_CACHED(view) ((view)->line_height != -1) #define WIDTHS_CACHED(view) ((view)->max_widths[0] != -1) @@ -174,11 +177,14 @@ static void g_buffer_view_class_init(GBufferViewClass *); /* Procède à l'initialisation d'une vue d'un tampon pour code. */ static void g_buffer_view_init(GBufferView *); +/* Réinitialise le cache de la hauteur des lignes. */ +static void g_buffer_view_reset_required_height(GBufferView *); + /* Réinitialise le cache des largeurs de colonne calculées. */ static void g_buffer_view_reset_required_widths(GBufferView *); -/* Calcule les dimensions requises par une visualisation. */ -static void g_buffer_view_compute_required_widths(GBufferView *); +/* Calcule les largeurs requises par une visualisation. */ +static void g_buffer_view_compute_required_widths(GBufferView *, bool, bool); @@ -713,6 +719,9 @@ static void g_buffer_view_init(GBufferView *buffer) { buffer->fcache = g_font_cache_new(); + g_buffer_view_reset_required_height(buffer); + g_buffer_view_reset_required_widths(buffer); + } @@ -741,8 +750,6 @@ GBufferView *g_buffer_view_new(GCodeBuffer *buffer) result->start = 0; result->end = VMPA_MAX; - g_buffer_view_reset_required_widths(result); - return result; } @@ -815,6 +822,25 @@ GCodeBuffer *g_buffer_view_get_buffer(const GBufferView *view) * * * Paramètres : view = visualisation à consulter. * * * +* Description : Réinitialise le cache de la hauteur des lignes. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_buffer_view_reset_required_height(GBufferView *view) +{ + view->line_height = -1; + +} + + +/****************************************************************************** +* * +* Paramètres : view = visualisation à consulter. * +* * * Description : Réinitialise le cache des largeurs de colonne calculées. * * * * Retour : - * @@ -835,9 +861,9 @@ static void g_buffer_view_reset_required_widths(GBufferView *view) /****************************************************************************** * * -* Paramètres : view = visualisation à consulter. * +* Paramètres : view = visualisation à mettre à jour. * * * -* Description : Calcule les dimensions requises par une visualisation. * +* Description : Calcule la hauteur requise par une visualisation. * * * * Retour : - * * * @@ -845,7 +871,28 @@ static void g_buffer_view_reset_required_widths(GBufferView *view) * * ******************************************************************************/ -static void g_buffer_view_compute_required_widths(GBufferView *view) +static void g_buffer_view_compute_required_height(GBufferView *view) +{ + view->line_height = 17; + +} + + +/****************************************************************************** +* * +* Paramètres : view = visualisation à mettre à jour. * +* addr = indique si les positions doivent être affichées. * +* code = indique si le code binaire doit être affiché. * +* * +* Description : Calcule les largeurs requises par une visualisation. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_buffer_view_compute_required_widths(GBufferView *view, bool addr, bool code) { GBufferLine **lines; /* Liste des lignes à traiter */ size_t first; /* Première ligne intégrée */ @@ -853,25 +900,46 @@ static void g_buffer_view_compute_required_widths(GBufferView *view) 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 */ + + if (!HEIGHT_CACHED(view)) + g_buffer_view_compute_required_height(view); lines = view->buffer->lines; first = g_code_buffer_get_index_from_address(view->buffer, view->start); last = g_code_buffer_get_index_from_address(view->buffer, view->end); - view->line_height = 17; - 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_width(lines[i], 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, addr, code); + 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); + } + + } + + if (view->last_merge == BLC_INVALID) + view->last_merge = BLC_COUNT; + } @@ -889,8 +957,8 @@ static void g_buffer_view_compute_required_widths(GBufferView *view) gint g_buffer_view_get_line_height(GBufferView *view) { - if (!WIDTHS_CACHED(view)) - g_buffer_view_compute_required_widths(view); + if (!HEIGHT_CACHED(view)) + g_buffer_view_compute_required_height(view); return view->line_height; @@ -915,28 +983,55 @@ gint g_buffer_view_get_line_height(GBufferView *view) void g_buffer_view_get_size(GBufferView *view, gint *width, gint *height, bool addr, bool code) { - unsigned int i; /* Boucle de parcours */ + gint col_width; /* Calcul selon les colonnes */ + gint full_width; /* Calcul selon les fusions */ + BufferLineColumn i; /* Boucle de parcours */ size_t first; /* Première ligne intégrée */ size_t last; /* Dernière ligne intégrée */ if (!WIDTHS_CACHED(view)) - g_buffer_view_compute_required_widths(view); + g_buffer_view_compute_required_widths(view, addr, code); *width = view->left_text; *height = view->line_height; + col_width = 0; + full_width = 0; + + /* Première méthode */ + for (i = 0; i < BLC_COUNT; i++) { if (i == BLC_ADDRESS && !addr) continue; if (i == BLC_BINARY && !code) continue; - *width += view->max_widths[i]; + col_width += view->max_widths[i]; if ((i + 1) < BLC_COUNT) - *width += COL_MARGIN; + col_width += COL_MARGIN; } + /* Seconde méthode */ + + for (i = 0; i < view->last_merge; i++) + { + if (i == BLC_ADDRESS && !addr) continue; + if (i == BLC_BINARY && !code) continue; + + full_width += view->max_widths[i]; + + if ((i + 1) < view->last_merge) + full_width += COL_MARGIN; + + } + + full_width += view->last_width + COL_MARGIN; + + /* Mise en concurrence et poursuite... */ + + *width += + MAX(col_width, full_width); + first = g_code_buffer_get_index_from_address(view->buffer, view->start); last = g_code_buffer_get_index_from_address(view->buffer, view->end); |