diff options
Diffstat (limited to 'src/glibext/gcodebuffer.c')
-rw-r--r-- | src/glibext/gcodebuffer.c | 132 |
1 files changed, 128 insertions, 4 deletions
diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c index b211c4a..1654a72 100644 --- a/src/glibext/gcodebuffer.c +++ b/src/glibext/gcodebuffer.c @@ -111,6 +111,10 @@ struct _GCodeBufferClass { GObjectClass parent; /* A laisser en premier */ + /* Signaux */ + + void (* line_changed) (GCodeBuffer *, GBufferLine *, GBufferSegment *); + }; @@ -136,6 +140,15 @@ static size_t g_code_buffer_get_index_from_address(GCodeBuffer *, const vmpa2t * /* Actualise les largeurs maximales par groupes de lignes. */ static void g_code_buffer_update_line_max_widths(const GCodeBuffer *, size_t, size_t); +/* Réagit à un changement de contenu d'une ligne donnée. */ +static void on_line_content_change(GBufferLine *, GBufferSegment *, GCodeBuffer *); + +/* Réagit à un changement de propriété rattachée à une ligne. */ +static void on_line_flag_flip(GBufferLine *, BufferLineFlags, BufferLineFlags, GCodeBuffer *); + +/* Ajoute une nouvelle ligne à une position donnée. */ +static GBufferLine *g_code_buffer_create_new_line(GCodeBuffer *, size_t, const mrange_t *); + /* ---------------------- VUE PARTICULIERE D'UN TAMPON DE CODE ---------------------- */ @@ -191,6 +204,9 @@ static void g_buffer_view_dispose(GBufferView *); /* Procède à la libération totale de la mémoire. */ static void g_buffer_view_finalize(GBufferView *); +/* Réagit à un changement de contenu d'une ligne donnée. */ +static void on_buffer_line_changed(GCodeBuffer *, GBufferLine *, GBufferSegment *, GBufferView *); + /* Réinitialise le cache de la hauteur des lignes. */ static void g_buffer_view_reset_required_height(GBufferView *); @@ -366,6 +382,13 @@ G_DEFINE_TYPE(GCodeBuffer, g_code_buffer, G_TYPE_OBJECT); static void g_code_buffer_class_init(GCodeBufferClass *class) { + g_signal_new("line-changed", + G_TYPE_CODE_BUFFER, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(GCodeBufferClass, line_changed), + NULL, NULL, + g_cclosure_user_marshal_VOID__OBJECT_OBJECT, + G_TYPE_NONE, 2, G_TYPE_OBJECT, G_TYPE_OBJECT); } @@ -691,10 +714,53 @@ static void g_code_buffer_update_line_max_widths(const GCodeBuffer *buffer, size /****************************************************************************** * * -* Paramètres : buffer = composant GTK à mettre à jour. * +* Paramètres : line = ligne dont la définition vient d'évoluer. * +* segment = éventuel segment qui vient d'évoluer ou NULL. * +* buffer = tampon de lignes cohérentes à manipuler. * +* * +* Description : Réagit à un changement de contenu d'une ligne donnée. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void on_line_content_change(GBufferLine *line, GBufferSegment *segment, GCodeBuffer *buffer) +{ + g_signal_emit_by_name(buffer, "line-changed", line, segment); + +} + + +/****************************************************************************** +* * +* Paramètres : line = ligne dont la définition vient d'évoluer. * +* old = ancien groupe de propriétés associées. * +* old = nouveau groupe de propriétés associées. * +* buffer = tampon de lignes cohérentes à manipuler. * +* * +* Description : Réagit à un changement de propriété rattachée à une ligne. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void on_line_flag_flip(GBufferLine *line, BufferLineFlags old, BufferLineFlags new, GCodeBuffer *buffer) +{ + g_signal_emit_by_name(buffer, "line-changed", line, NULL); + +} + + +/****************************************************************************** +* * +* Paramètres : buffer = composant GLib à mettre à jour. * * range = emplacement où va se situer la ligne. * * * -* Description : Ajoute une nouvelle ligne à un tampon pour code désassemblé. * +* Description : Ajoute une nouvelle ligne à une position donnée. * * * * Retour : Nouvelle ligne vierge à écrire. * * * @@ -702,7 +768,7 @@ static void g_code_buffer_update_line_max_widths(const GCodeBuffer *buffer, size * * ******************************************************************************/ -GBufferLine *g_code_buffer_append_new_line(GCodeBuffer *buffer, const mrange_t *range) +static GBufferLine *g_code_buffer_create_new_line(GCodeBuffer *buffer, size_t index, const mrange_t *range) { GBufferLine *result; /* Instance à retourner */ size_t i; /* Boucle de parcours */ @@ -714,12 +780,42 @@ GBufferLine *g_code_buffer_append_new_line(GCodeBuffer *buffer, const mrange_t * buffer->count * sizeof(GBufferLine *)); } + buffer->used++; + assert(index < buffer->used); + result = g_buffer_line_new(range, buffer->main_column); - buffer->lines[buffer->used++] = result; + buffer->lines[index] = result; for (i = 0; i < buffer->indent; i++) g_buffer_line_insert_text(result, BLC_ASSEMBLY_HEAD, " ", 4, RTT_RAW); + g_signal_connect(result, "content-changed", G_CALLBACK(on_line_content_change), buffer); + g_signal_connect(result, "flip-flag", G_CALLBACK(on_line_flag_flip), buffer); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : buffer = composant GLib à mettre à jour. * +* range = emplacement où va se situer la ligne. * +* * +* Description : Ajoute une nouvelle ligne à un tampon pour code désassemblé. * +* * +* Retour : Nouvelle ligne vierge à écrire. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GBufferLine *g_code_buffer_append_new_line(GCodeBuffer *buffer, const mrange_t *range) +{ + GBufferLine *result; /* Instance à retourner */ + + result = g_code_buffer_create_new_line(buffer, buffer->used, range); + return result; } @@ -1031,6 +1127,8 @@ static void g_buffer_view_init(GBufferView *buffer) static void g_buffer_view_dispose(GBufferView *view) { + g_object_unref(G_OBJECT(view->buffer)); + G_OBJECT_CLASS(g_buffer_view_parent_class)->dispose(G_OBJECT(view)); } @@ -1083,6 +1181,8 @@ GBufferView *g_buffer_view_new(GCodeBuffer *buffer, segcnt_list *highlighted) g_buffer_view_restrict(result, NULL, NULL); + g_signal_connect(buffer, "line-changed", G_CALLBACK(on_buffer_line_changed), result); + if (highlighted != NULL) result->highlighted = highlighted; else @@ -1097,6 +1197,30 @@ GBufferView *g_buffer_view_new(GCodeBuffer *buffer, segcnt_list *highlighted) /****************************************************************************** * * +* Paramètres : buffer = tampon de lignes cohérentes à manipuler. * +* line = ligne dont la définition vient d'évoluer. * +* segment = éventuel segment qui vient d'évoluer ou NULL. * +* view = vue active du tampon de lignes concerné. * +* * +* Description : Réagit à un changement de contenu d'une ligne donnée. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void on_buffer_line_changed(GCodeBuffer *buffer, GBufferLine *line, GBufferSegment *segment, GBufferView *view) +{ + /* TODO : regarder si la vue et concernée et cibler d'avantage l'actualisation */ + + g_signal_emit_by_name(view, "need-redraw"); + +} + + +/****************************************************************************** +* * * Paramètres : view = visualisateur à mettre à jour. * * first = première ligne à imprimer. * * last = première ligne hors cadre. * |