summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2014-04-14 16:43:36 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2014-04-14 16:43:36 (GMT)
commite25b4d02bba5dbd5cbc34b8f24a8c980396f86fb (patch)
tree5224eab28e5f86c8c0cddb703ce84e34f7eaef1a /src
parent3e8341ca17547db1dcf28c99d6fc68fe6901573b (diff)
Handled mouse clicks in view margins.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@370 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src')
-rw-r--r--src/glibext/gcodebuffer.c13
-rw-r--r--src/glibext/gcodebuffer.h2
-rw-r--r--src/gtkext/gtkbufferview.c29
3 files changed, 30 insertions, 14 deletions
diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c
index 4a4e38f..fdfaa71 100644
--- a/src/glibext/gcodebuffer.c
+++ b/src/glibext/gcodebuffer.c
@@ -1072,8 +1072,9 @@ gint g_buffer_view_get_height(const GBufferView *view)
/******************************************************************************
* *
* Paramètres : view = vue de tampon à mettre à jour. *
+* line = ligne correspondant à la position. *
+* index = indice de cette même ligne dans le tampon. *
* x = abscisse de la zone principale à traiter. *
-* y = ordonnée de la zone principale à traiter. *
* caret = position du curseur à construire. [OUT] *
* *
* Description : Calcule la position idéale de curseur pour un point donné. *
@@ -1084,24 +1085,18 @@ gint g_buffer_view_get_height(const GBufferView *view)
* *
******************************************************************************/
-vmpa_t g_buffer_view_compute_caret(GBufferView *view, gint x, gint y, GdkRectangle *caret)
+vmpa_t g_buffer_view_compute_caret(GBufferView *view, GBufferLine *line, size_t index, gint x, GdkRectangle *caret)
{
- size_t index; /* Indice de la ligne trouvée */
- GBufferLine *line; /* Ligne sous le pointeur */
gint tmp_x; /* Copie de travail modifiable */
GBufferSegment *segment; /* Segment visé par le pointeur*/
size_t first; /* Première ligne intégrée */
- line = g_buffer_view_find_line_at(view, y, &index);
- if (line == NULL) return VMPA_INVALID;
-
tmp_x = x;
tmp_x -= view->left_text;
if (tmp_x < 0) return VMPA_INVALID;
segment = g_buffer_line_get_segment_at(line, view->max_widths, &tmp_x, true);
- if (segment == NULL) printf("no segment\n");
if (segment == NULL) return VMPA_INVALID;
caret->x = (x - tmp_x) + g_buffer_segment_get_caret_position(segment, tmp_x);
@@ -1233,7 +1228,7 @@ vmpa_t g_buffer_view_move_caret(GBufferView *view, GdkRectangle *caret, bool ctr
}
if (result && !computed)
- result = g_buffer_view_compute_caret(view, caret->x, caret->y, caret);
+ /*result = g_buffer_view_compute_caret(view, caret->x, caret->y, caret, NULL)*/;
return result;
diff --git a/src/glibext/gcodebuffer.h b/src/glibext/gcodebuffer.h
index e2ff8b0..2e2d483 100644
--- a/src/glibext/gcodebuffer.h
+++ b/src/glibext/gcodebuffer.h
@@ -128,7 +128,7 @@ gint g_buffer_view_get_width(GBufferView *, bool, bool);
gint g_buffer_view_get_height(const GBufferView *);
/* Calcule la position idéale de curseur pour un point donné. */
-vmpa_t g_buffer_view_compute_caret(GBufferView *, gint, gint, GdkRectangle *);
+vmpa_t g_buffer_view_compute_caret(GBufferView *, GBufferLine *, size_t, gint, GdkRectangle *);
/* Déplace le curseur au sein d'une vue de tampon. */
vmpa_t g_buffer_view_move_caret(GBufferView *, GdkRectangle *, bool, GdkScrollDirection, bool, bool);
diff --git a/src/gtkext/gtkbufferview.c b/src/gtkext/gtkbufferview.c
index 877b041..ac1a8e5 100644
--- a/src/gtkext/gtkbufferview.c
+++ b/src/gtkext/gtkbufferview.c
@@ -216,6 +216,8 @@ static gboolean gtk_buffer_view_button_press(GtkWidget *widget, GdkEventButton *
GtkBufferView *view; /* Autre version du composant */
gint real_x; /* Abscisse absolue réelle */
gint real_y; /* Ordonnée absolue réelle */
+ size_t index; /* Indice de ligne de tampon */
+ GBufferLine *line; /* Ligne à la position courante*/
vmpa_t addr; /* Position mémoire associée */
GdkRectangle new; /* Nouvel emplacement calculé */
@@ -227,19 +229,38 @@ static gboolean gtk_buffer_view_button_press(GtkWidget *widget, GdkEventButton *
real_y = event->y;
gtk_buffer_view_compute_real_coord(view, &real_x, &real_y);
- printf(" mouse :: (%g ; %g) -> (%d ; %d)\n",
+ printf(" !mouse! :: (%g ; %g) -> (%d ; %d)\n",
event->x, event->y,
real_x, real_y);
- addr = g_buffer_view_compute_caret(view->buffer_view, real_x, real_y, &new);
- if (addr != VMPA_INVALID)
+
+ line = g_buffer_view_find_line_at(view->buffer_view, real_y, &index);
+ if (line == NULL) return FALSE;
+
+
+ if (real_x < view->left_margin)
{
+
+
+
+ printf("Border Line :: %p\n", line);
+
+
+ }
+ else
+ {
+ addr = g_buffer_view_compute_caret(view->buffer_view, line, index, real_x, &new);
+ if (addr == VMPA_INVALID) return FALSE;
+
gtk_buffer_view_compute_relative_coords(view, &view->caret.x, &view->caret.y);
printf(" mouse --old-- :: (%d ; %d)\n",
view->caret.x, view->caret.y);
+ printf(" mouse --new-- :: (%d ; %d)\n",
+ new.x, new.y);
+
gtk_widget_queue_draw_area(GTK_WIDGET(view), view->caret.x, view->caret.y,
view->caret.width, view->caret.height);
@@ -503,7 +524,7 @@ static gboolean gtk_buffer_view_draw(GtkWidget *widget, cairo_t *cr)
gtk_style_context_get(gtk_widget_get_style_context(widget), state,
GTK_STYLE_PROPERTY_BACKGROUND_COLOR, &color, NULL);
- cairo_rectangle(cr, fake_x, area.y,view->left_margin, area.y + area.height);
+ cairo_rectangle(cr, fake_x, area.y, view->left_margin, area.y + area.height);
cairo_fill(cr);
gtk_style_context_get(gtk_widget_get_style_context(widget), state,