diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/glibext/gcodebuffer.c | 27 | ||||
-rw-r--r-- | src/glibext/gcodebuffer.h | 3 | ||||
-rw-r--r-- | src/gtkext/gtkblockview.c | 52 |
3 files changed, 62 insertions, 20 deletions
diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c index 75c2e94..3f9af35 100644 --- a/src/glibext/gcodebuffer.c +++ b/src/glibext/gcodebuffer.c @@ -483,3 +483,30 @@ void g_buffer_view_draw(const GBufferView *view, const GdkEventExpose *event, Gd } } + + +/****************************************************************************** +* * +* Paramètres : view = visualisation à consulter. * +* y = ordonnée comprise dans la ligne recherchée. * +* * +* Description : Fournit la ligne présente à une ordonnée donnée. * +* * +* Retour : Ligne retrouvée ou NULL si aucune. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GBufferLine *g_buffer_view_find_line_at(GBufferView *view, gint y) +{ + gint lheight; /* Hauteur d'une ligne */ + size_t index; /* Indice attendu */ + + lheight = g_buffer_view_get_line_height(view); + index = y / lheight; + + /* FIXME : à placer côté tampon ? */ + return (index < view->buffer->used ? view->buffer->lines[index] : NULL); + +} diff --git a/src/glibext/gcodebuffer.h b/src/glibext/gcodebuffer.h index 9460530..49b954d 100644 --- a/src/glibext/gcodebuffer.h +++ b/src/glibext/gcodebuffer.h @@ -97,6 +97,9 @@ void g_buffer_view_define_extra_drawing(GBufferView *, buffer_line_draw_fc, void /* Imprime la visualisation du tempon de code désassemblé. */ void g_buffer_view_draw(const GBufferView *, const GdkEventExpose *, GdkGC *, gint, gint); +/* Fournit la ligne présente à une ordonnée donnée. */ +GBufferLine *g_buffer_view_find_line_at(GBufferView *, gint); + #endif /* _GLIBEXT_GCODEBUFFER_H */ diff --git a/src/gtkext/gtkblockview.c b/src/gtkext/gtkblockview.c index 70cd8ea..5c5d0f6 100644 --- a/src/gtkext/gtkblockview.c +++ b/src/gtkext/gtkblockview.c @@ -43,6 +43,9 @@ #endif +static void gtk_block_view_compute_real_coord(GtkBlockView *view, gint *x, gint *y); + + /* -------------------------- INSERTION DIFFEREE DE LIGNES -------------------------- */ @@ -638,26 +641,35 @@ static gboolean gtk_block_view_button_press(GtkWidget *widget, GdkEventButton *e { gboolean result; /* Décision à retourner */ GtkBlockView *view; /* Composant GTK réel */ - GtkTextIter iter; /* Point d'insertion */ - GtkTextMark *mark; /* Marquage de ligne associée */ - GRenderingLine *line; /* Ligne de rendu */ + gint real_x; /* Abscisse réelle du point */ + gint real_y; /* Ordonnée réelle du point */ + GBufferLine *bline; /* Ligne intégrée au tampon */ + GRenderingLine *line; /* Ligne de rendu interne */ result = FALSE; -#if 0 - view = GTK_BLOCK_VIEW(widget); - gtk_text_layout_get_line_at_y(view->layout, &iter, event->y, NULL); - mark = gtk_text_iter_get_marks(&iter)->data; + view = GTK_BLOCK_VIEW(widget); - line = g_object_get_data(G_OBJECT(mark), "line"); + real_x = event->x; + real_y = event->y; + gtk_block_view_compute_real_coord(view, &real_x, &real_y); /* Clic dans la marge */ - if (event->type == GDK_BUTTON_PRESS && event->x < view->left_margin) + if (event->type == GDK_BUTTON_PRESS && real_x < view->left_margin) { - result = TRUE; - g_rendering_line_toggle_flag(line, RLF_BREAK_POINT); + bline = g_buffer_view_find_line_at(view->buffer_view, real_y); + + if (bline != NULL) + { + line = G_RENDERING_LINE(g_object_get_data(G_OBJECT(bline), "line")); + + result = TRUE; + g_rendering_line_toggle_flag(line, RLF_BREAK_POINT); + + } + } -#endif + return result; } @@ -733,11 +745,11 @@ static void gtk_block_view_compute_fake_coord(GtkBlockView *view, gint *x, gint static void gtk_block_view_compute_real_coord(GtkBlockView *view, gint *x, gint *y) { - if (GTK_BIN_VIEW(view)->hadjustment != NULL) + if (x != NULL && GTK_BIN_VIEW(view)->hadjustment != NULL) *x += gtk_adjustment_get_value(GTK_BIN_VIEW(view)->hadjustment); - if (GTK_BIN_VIEW(view)->vadjustment != NULL) - *y -= gtk_adjustment_get_value(GTK_BIN_VIEW(view)->vadjustment); + if (y != NULL && GTK_BIN_VIEW(view)->vadjustment != NULL) + *y += gtk_adjustment_get_value(GTK_BIN_VIEW(view)->vadjustment); } @@ -1039,11 +1051,11 @@ static void gtk_block_view_complete_building_content(GDelayedInsertion *insertio gdk_threads_enter(); /* Taille des marges */ -#if 0 - view->line_height = rect.height; - view->left_margin = 2 * rect.height; - view->left_text = -2.5 * rect.height; -#endif + + view->line_height = g_buffer_view_get_line_height(view->buffer_view); + view->left_margin = 2 * view->line_height; + view->left_text = -2.5 * view->line_height; + /* Validation finale */ gtk_block_view_recompute_size_request(view); |