diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2015-04-12 22:07:56 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2015-04-12 22:07:56 (GMT) |
commit | 90923fccb863075722d2ed17360e2c330b262e04 (patch) | |
tree | b7588517a6437efa2d4cd885984e0b87ef8307fe /src/glibext/gcodebuffer.c | |
parent | 054d2d76f1951c20822286bce0128e60c26c4b9b (diff) |
Highlighted the current segment on caret location changes.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@511 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/glibext/gcodebuffer.c')
-rw-r--r-- | src/glibext/gcodebuffer.c | 124 |
1 files changed, 72 insertions, 52 deletions
diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c index fd1330b..171ba09 100644 --- a/src/glibext/gcodebuffer.c +++ b/src/glibext/gcodebuffer.c @@ -154,7 +154,7 @@ struct _GBufferView gint last_width; /* Plus grande col. de fusion */ BufferLineColumn last_merge; /* Colonne de fusion extrême */ - GSList *highlighted; /* Segments mis en évidence */ + segcnt_list *highlighted; /* Segments mis en évidence */ }; @@ -180,6 +180,12 @@ 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 *); +/* Supprime toutes les références externes. */ +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éinitialise le cache de la hauteur des lignes. */ static void g_buffer_view_reset_required_height(GBufferView *); @@ -892,6 +898,13 @@ G_DEFINE_TYPE(GBufferView, g_buffer_view, G_TYPE_OBJECT); static void g_buffer_view_class_init(GBufferViewClass *class) { + GObjectClass *object; /* Autre version de la classe */ + + object = G_OBJECT_CLASS(class); + + object->dispose = (GObjectFinalizeFunc/* ! */)g_buffer_view_dispose; + object->finalize = (GObjectFinalizeFunc)g_buffer_view_finalize; + g_signal_new("need-redraw", G_TYPE_BUFFER_VIEW, G_SIGNAL_RUN_LAST, @@ -922,6 +935,48 @@ static void g_buffer_view_init(GBufferView *buffer) g_buffer_view_reset_required_height(buffer); g_buffer_view_reset_required_widths(buffer); + buffer->highlighted = init_segment_content_list(); + +} + + +/****************************************************************************** +* * +* Paramètres : view = instance d'objet GLib à traiter. * +* * +* Description : Supprime toutes les références externes. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_buffer_view_dispose(GBufferView *view) +{ + G_OBJECT_CLASS(g_buffer_view_parent_class)->dispose(G_OBJECT(view)); + +} + + +/****************************************************************************** +* * +* Paramètres : view = instance d'objet GLib à traiter. * +* * +* Description : Procède à la libération totale de la mémoire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_buffer_view_finalize(GBufferView *view) +{ + exit_segment_content_list(view->highlighted); + + G_OBJECT_CLASS(g_buffer_view_parent_class)->finalize(G_OBJECT(view)); + } @@ -1689,84 +1744,49 @@ const vmpa2t *g_buffer_view_move_caret(GBufferView *view, GdkRectangle *caret, b bool g_buffer_view_unhighlight_segments(GBufferView *view) { - GSList *iter; /* Boucle de parcours */ - GBufferSegment *segment; /* Segment visé par le pointeur*/ + bool result; /* Bilan d'action à renvoyer */ - if (g_slist_length(view->highlighted) == 0) - return false; + result = reset_segment_content_list(view->highlighted); - for (iter = view->highlighted; iter != NULL; iter = view->highlighted) - { - segment = G_BUFFER_SEGMENT(iter->data); - g_buffer_segment_set_style(segment, SRS_CLASSIC); - - g_object_unref(G_OBJECT(segment)); - - view->highlighted = g_slist_remove_link(view->highlighted, iter); - - } - - return true; + return result; } /****************************************************************************** * * -* Paramètres : view = vue de tampon à mettre à jour. * -* x = abscisse de la zone principale à traiter. * -* y = ordonnée de la zone principale à traiter. * +* Paramètres : view = vue de tampon à mettre à jour. * +* x = abscisse de la zone principale à traiter. * +* y = ordonnée de la zone principale à traiter. * +* display = règles d'affichage des colonnes modulables. * * * * Description : Surligne tous les segments similaires à celui sous la souris.* * * -* Retour : - * +* Retour : true si un besoin d'actualisation d'affichage se fait sentir.* * * * Remarques : - * * * ******************************************************************************/ -void g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y) +bool g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y, const bool *display) { -#if 0 /* FIXME : inclusion des champs adresses/code */ - GBufferLine *line; /* Ligne sous le pointeur */ - GBufferSegment *segment; /* Segment visé par le pointeur*/ bool need_redraw; /* Besoin d'actualisation ? */ - size_t first; /* Première ligne intégrée */ - size_t last; /* Dernière ligne intégrée */ - size_t i; /* Boucle de parcours */ - - line = g_buffer_view_find_line_at(view, y, NULL); - if (line == NULL) return; - - x -= view->left_text; - if (x < 0) return; - - segment = g_buffer_line_get_segment_at(line, view->max_widths, &x, GDK_SCROLL_LEFT, false); - printf(" ... seg @%d ? %p\n", x, segment); - if (segment == NULL) return; - - - printf("text :: '%s'\n", g_buffer_segment_get_text(segment, false)); - + GBufferLine *line; /* Ligne ciblée */ + GBufferSegment *segment; /* Segment sélectionnable */ if (view->highlighted != NULL) need_redraw = g_buffer_view_unhighlight_segments(view); else need_redraw = false; - first = g_code_buffer_get_index_from_address(view->buffer, view->start, true); - last = g_code_buffer_get_index_from_address(view->buffer, view->end, false); - - for (i = first; i <= last; i++) - view->highlighted = g_buffer_line_highlight_all_same_segments(view->buffer->lines[i], - view->highlighted, segment); + line = g_buffer_view_find_line_and_segment_at(view, &x, y, NULL, display, &segment); - if (g_slist_length(view->highlighted) > 0) - need_redraw = true; + if (segment) + need_redraw |= add_segment_content_to_selection_list(view->highlighted, segment); if (need_redraw) g_signal_emit_by_name(view, "need-redraw"); -#endif + } @@ -1837,7 +1857,7 @@ void g_buffer_view_draw(const GBufferView *view, cairo_t *cr, gint fake_x, gint } - g_buffer_line_draw(lines[i], cr, view->max_widths, real_x, y, display); + g_buffer_line_draw(lines[i], cr, view->max_widths, real_x, y, display, view->highlighted); y += view->line_height; |