summaryrefslogtreecommitdiff
path: root/src/glibext/gcodebuffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/glibext/gcodebuffer.c')
-rw-r--r--src/glibext/gcodebuffer.c127
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);