diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2014-11-01 20:31:29 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2014-11-01 20:31:29 (GMT) |
commit | 67c0fe6eddda7ac5ff591ec972425095209d75ff (patch) | |
tree | d2f923845545c9b7f94968e9b9ded7539f3dbb7b /src/glibext/gcodebuffer.c | |
parent | 085fef16a819cb321fd38e7e0926d3cca863777a (diff) |
Moved the caret with mouse and keyboard.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@417 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/glibext/gcodebuffer.c')
-rw-r--r-- | src/glibext/gcodebuffer.c | 292 |
1 files changed, 233 insertions, 59 deletions
diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c index 1ea8f69..eab418e 100644 --- a/src/glibext/gcodebuffer.c +++ b/src/glibext/gcodebuffer.c @@ -24,6 +24,7 @@ #include "gcodebuffer.h" +#include <limits.h> #include <malloc.h> #include <string.h> @@ -123,10 +124,10 @@ static void g_code_buffer_class_init(GCodeBufferClass *); static void g_code_buffer_init(GCodeBuffer *); /* Convertit une adresse en indice de ligne. */ -static size_t _g_code_buffer_get_index_from_address(const GCodeBuffer *, vmpa_t, bool); +static size_t _g_code_buffer_get_index_from_address(const GCodeBuffer *, const vmpa2t *, bool); /* Convertit une adresse en indice de ligne. */ -static size_t g_code_buffer_get_index_from_address(GCodeBuffer *, vmpa_t, bool); +static size_t g_code_buffer_get_index_from_address(GCodeBuffer *, const vmpa2t *, bool); @@ -407,7 +408,7 @@ GCodeBuffer *g_code_buffer_new(BufferLineColumn main) * * ******************************************************************************/ -static size_t _g_code_buffer_get_index_from_address(const GCodeBuffer *buffer, vmpa_t addr, bool first) +static size_t _g_code_buffer_get_index_from_address(const GCodeBuffer *buffer, const vmpa2t *addr, bool first) { size_t result; /* Indice à retourner */ @@ -451,7 +452,7 @@ static size_t _g_code_buffer_get_index_from_address(const GCodeBuffer *buffer, v * * ******************************************************************************/ -static size_t g_code_buffer_get_index_from_address(GCodeBuffer *buffer, vmpa_t addr, bool first) +static size_t g_code_buffer_get_index_from_address(GCodeBuffer *buffer, const vmpa2t *addr, bool first) { size_t result; /* Indice à retourner */ @@ -1074,11 +1075,12 @@ 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. * -* caret = position du curseur à construire. [OUT] * +* 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. * +* display = règles d'affichage des colonnes modulables. * +* caret = position du curseur à construire. [OUT] * * * * Description : Calcule la position idéale de curseur pour un point donné. * * * @@ -1088,7 +1090,7 @@ gint g_buffer_view_get_height(const GBufferView *view) * * ******************************************************************************/ -const vmpa2t *g_buffer_view_compute_caret(GBufferView *view, GBufferLine *line, size_t index, gint x, GdkRectangle *caret) +const vmpa2t *g_buffer_view_compute_caret(GBufferView *view, GBufferLine *line, size_t index, gint x, const bool *display, GdkRectangle *caret) { gint tmp_x; /* Copie de travail modifiable */ GBufferSegment *segment; /* Segment visé par le pointeur*/ @@ -1099,9 +1101,16 @@ const vmpa2t *g_buffer_view_compute_caret(GBufferView *view, GBufferLine *line, tmp_x -= view->left_text; if (tmp_x < 0) return NULL; - segment = g_buffer_line_get_segment_at(line, view->max_widths, &tmp_x, true); + segment = g_buffer_line_get_segment_at(line, view->max_widths, display, &tmp_x, GDK_SCROLL_LEFT, true); + if (segment == NULL) printf(" -- no segment\n"); if (segment == NULL) return NULL; + printf("\n[BASE] tronc = %d reste = %d dernier = %d largeur = %d\n", + x - tmp_x, tmp_x, g_buffer_segment_get_caret_position(segment, tmp_x), + g_buffer_segment_get_width(segment)); + + printf(" '%s'\n", g_buffer_segment_get_text(segment)); + caret->x = (x - tmp_x) + g_buffer_segment_get_caret_position(segment, tmp_x); first = g_code_buffer_get_index_from_address(view->buffer, view->start, true); @@ -1110,20 +1119,147 @@ const vmpa2t *g_buffer_view_compute_caret(GBufferView *view, GBufferLine *line, caret->width = 2; caret->height = view->line_height; - return NULL;///g_buffer_line_get_address(line); + return get_mrange_addr(g_buffer_line_get_range(line)); } /****************************************************************************** * * -* Paramètres : view = vue de tampon à mettre à jour. * -* caret = position du curseur à faire évoluer. * -* ctrl = indique la demande d'un parcours rapide. * -* dir = direction du parcours. * -* phys = indique si les positions doivent être affichées. * -* virt = indique si les adresses doivent être affichées. * -* code = indique si le code binaire doit être affiché. * +* Paramètres : line = ligne à venir consulter. * +* caret = position du curseur à faire évoluer. * +* ctrl = indique la demande d'un parcours rapide. * +* dir = direction du parcours. * +* display = règles d'affichage des colonnes modulables. * +* * +* Description : Déplace le curseur au sein d'une vue de tampon. * +* * +* Retour : true si un déplacement a été effectué, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool _g_buffer_view_move_caret(GBufferView *view, const GBufferLine *line, GdkRectangle *caret, bool ctrl, GdkScrollDirection dir, const bool *display) +{ + bool result; + + gint tmp_x; /* Copie de travail modifiable */ + GBufferSegment *segment; /* Segment visé par le pointeur*/ + size_t first; /* Première ligne intégrée */ + + gint ref_x; + + + gint offset; + + + + tmp_x = caret->x; + + tmp_x -= view->left_text; + if (tmp_x < 0) return false; + + segment = g_buffer_line_get_segment_at(line, view->max_widths, display, &tmp_x, dir, false); + + if (segment == NULL) printf(" ===== NO SEG...\n"); + + if (segment == NULL) return false; + + + printf(" ====== FIRST SEG :: %p ('%s')\n", segment, g_buffer_segment_get_text(segment)); + + + + ref_x = tmp_x; + + + + //if (dir == GDK_SCROLL_LEFT || dir == GDK_SCROLL_RIGHT) + result = g_buffer_segment_move_caret(segment, &tmp_x, ctrl, dir); + //else + //result = true; + + printf(" ====== MOVE 1 ? %d\n", result); + + + if (!result) + { + + + segment = g_buffer_line_find_near_segment(line, segment, view->max_widths, display, dir, &offset); + + + printf(" ====== NEAR SEG :: %p ('%s')\n", segment, segment ? g_buffer_segment_get_text(segment) : NULL); + + if (segment != NULL) + { + //tmp_x = /*ref_x + */g_buffer_segment_get_width(segment); + + + //ref_x = tmp_x; + ref_x = tmp_x = 0; + + + ref_x = 0; + tmp_x = offset; + + + result = true; + //result = g_buffer_segment_move_caret(segment, &tmp_x, ctrl, dir); + + /* + if (result) + caret->x -= COL_MARGIN; + */ + + printf(" ====== MOVE 2 ? %d (offset=%d)\n", result, offset); + + + } + + + } + + + if (result) + printf(" ====== NEW CARET: %d -> %d\n", caret->x, caret->x + (tmp_x - ref_x)); + else + printf(" ====== NO NEW CARET!\n"); + + + + if (result) + caret->x += (tmp_x - ref_x); + + + + return result; + + + //bool g_buffer_segment_move_caret(const GBufferSegment *segment, gint *x, bool ctrl, GdkScrollDirection dir) + + + + /* TODO : utiliser les arguments booléens */ + + caret->x += (dir == GDK_SCROLL_RIGHT ? 10 : -10); + + return true; + + + return false; + +} + + +/****************************************************************************** +* * +* Paramètres : view = vue de tampon à mettre à jour. * +* caret = position du curseur à faire évoluer. * +* ctrl = indique la demande d'un parcours rapide. * +* dir = direction du parcours. * +* display = règles d'affichage des colonnes modulables. * * * * Description : Déplace le curseur au sein d'une vue de tampon. * * * @@ -1133,9 +1269,12 @@ const vmpa2t *g_buffer_view_compute_caret(GBufferView *view, GBufferLine *line, * * ******************************************************************************/ -vmpa_t g_buffer_view_move_caret(GBufferView *view, GdkRectangle *caret, bool ctrl, GdkScrollDirection dir, bool phys, bool virt, bool code) +const vmpa2t *g_buffer_view_move_caret(GBufferView *view, GdkRectangle *caret, bool ctrl, GdkScrollDirection dir, const bool *display) { - bool result; /* Actualisation à renvoyer */ + vmpa2t *result; /* Actualisation à renvoyer */ + GBufferLine *line; /* Ligne sous le pointeur */ + + bool computed; /* Récursivité pris en compte */ gint lheight; /* Hauteur d'une ligne */ gint left_pos; /* Retour à la ligne */ @@ -1143,11 +1282,34 @@ vmpa_t g_buffer_view_move_caret(GBufferView *view, GdkRectangle *caret, bool ctr BufferLineColumn i; /* Boucle de parcours */ size_t first; /* Première ligne intégrée */ size_t last; /* Dernière ligne intégrée */ - GBufferLine *line; /* Ligne sous le pointeur */ - result = VMPA_INVALID; + size_t index; /* Indice de ligne de tampon */ + + + bool moved; /* Mémorisation d'une évolut° */ + + + + + + + gint tmp_x; /* Copie de travail modifiable */ + GBufferSegment *segment; /* Segment visé par le pointeur*/ + + + + result = NULL; computed = false; + + + line = g_buffer_view_find_line_at(view, caret->y, &index); + if (line == NULL) return NULL; + + + lheight = g_buffer_view_get_line_height(view); + + switch (dir) { case GDK_SCROLL_UP: @@ -1157,12 +1319,17 @@ vmpa_t g_buffer_view_move_caret(GBufferView *view, GdkRectangle *caret, bool ctr case GDK_SCROLL_LEFT: case GDK_SCROLL_RIGHT: left_pos = view->left_text; - if (phys) left_pos += view->max_widths[BLC_PHYSICAL] + COL_MARGIN; - if (virt) left_pos += view->max_widths[BLC_VIRTUAL] + COL_MARGIN; - if (code) left_pos += view->max_widths[BLC_BINARY] + COL_MARGIN; + if (display[BLC_PHYSICAL]) left_pos += view->max_widths[BLC_PHYSICAL] + COL_MARGIN; + if (display[BLC_VIRTUAL]) left_pos += view->max_widths[BLC_VIRTUAL] + COL_MARGIN; + if (display[BLC_BINARY]) left_pos += view->max_widths[BLC_BINARY] + COL_MARGIN; right_pos = left_pos; for (i = BLC_ASSEMBLY_HEAD; i < BLC_COUNT; i++) right_pos += view->max_widths[i] + COL_MARGIN; + + + + left_pos = view->left_text; + break; default: /* GDK_SCROLL_SMOOTH */ break; @@ -1171,58 +1338,56 @@ vmpa_t g_buffer_view_move_caret(GBufferView *view, GdkRectangle *caret, bool ctr 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); + first = 0; + switch (dir) { case GDK_SCROLL_UP: - result = (caret->y >= (first * lheight)); - if (result) - caret->y -= lheight; + + if (index > first) + { + line = view->buffer->lines[index - 1]; + result = g_buffer_view_compute_caret(view, line, index - 1, caret->x, display, caret); + } + break; case GDK_SCROLL_DOWN: - result = ((caret->y + lheight) < (last * lheight)); - if (result) - caret->y += lheight; + + if (index < last) + { + line = view->buffer->lines[index + 1]; + result = g_buffer_view_compute_caret(view, line, index + 1, caret->x, display, caret); + } + break; case GDK_SCROLL_LEFT: - line = g_buffer_view_find_line_at(view, caret->y, NULL); + + line = g_buffer_view_find_line_at(view, caret->y, &index); if (line == NULL) break; - result = g_buffer_line_move_caret(line, caret, ctrl, GDK_SCROLL_LEFT, phys, virt, code); + moved = _g_buffer_view_move_caret(view, line, caret, ctrl, GDK_SCROLL_LEFT, display); - if (caret->x < left_pos) + if (!moved && index > first) { - caret->x = right_pos; - - result = g_buffer_view_move_caret(view, caret, ctrl, GDK_SCROLL_UP, phys, virt, code); - - if (result == VMPA_INVALID) - caret->x = left_pos; - else - computed = true; - + line = view->buffer->lines[index - 1]; + result = g_buffer_view_compute_caret(view, line, index - 1, INT_MAX, display, caret); } break; case GDK_SCROLL_RIGHT: - line = g_buffer_view_find_line_at(view, caret->y, NULL); + + line = g_buffer_view_find_line_at(view, caret->y, &index); if (line == NULL) break; - result = g_buffer_line_move_caret(line, caret, ctrl, GDK_SCROLL_RIGHT, phys, virt, code); + moved = _g_buffer_view_move_caret(view, line, caret, ctrl, GDK_SCROLL_RIGHT, display); - if (!result) + if (!moved && index < last) { - caret->x = left_pos; - - result = g_buffer_view_move_caret(view, caret, ctrl, GDK_SCROLL_DOWN, phys, virt, code); - - if (result == VMPA_INVALID) - caret->x = right_pos; - else - computed = true; - + line = view->buffer->lines[index + 1]; + result = g_buffer_view_compute_caret(view, line, index + 1, left_pos, display, caret); } break; @@ -1232,8 +1397,16 @@ vmpa_t g_buffer_view_move_caret(GBufferView *view, GdkRectangle *caret, bool ctr } + + printf(" --- CARET --- moved = %d index = %d result = %p\n", + moved, index, result); + + + + /* if (result && !computed) - /*result = g_buffer_view_compute_caret(view, caret->x, caret->y, caret, NULL)*/; + result = g_buffer_view_compute_caret(view, caret->x, caret->y, caret, display, NULL); + */ return result; @@ -1292,6 +1465,7 @@ bool g_buffer_view_unhighlight_segments(GBufferView *view) void g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y) { +#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 ? */ @@ -1305,7 +1479,7 @@ void g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y) x -= view->left_text; if (x < 0) return; - segment = g_buffer_line_get_segment_at(line, view->max_widths, &x, false); + 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; @@ -1330,7 +1504,7 @@ void g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y) if (need_redraw) g_signal_emit_by_name(view, "need-redraw"); - +#endif } |