summaryrefslogtreecommitdiff
path: root/src/glibext/gcodebuffer.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2015-04-12 22:07:56 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2015-04-12 22:07:56 (GMT)
commit90923fccb863075722d2ed17360e2c330b262e04 (patch)
treeb7588517a6437efa2d4cd885984e0b87ef8307fe /src/glibext/gcodebuffer.c
parent054d2d76f1951c20822286bce0128e60c26c4b9b (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.c124
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;