diff options
Diffstat (limited to 'src/gtkext/gtkbufferview.c')
-rw-r--r-- | src/gtkext/gtkbufferview.c | 186 |
1 files changed, 124 insertions, 62 deletions
diff --git a/src/gtkext/gtkbufferview.c b/src/gtkext/gtkbufferview.c index 1a1f6f1..54c521e 100644 --- a/src/gtkext/gtkbufferview.c +++ b/src/gtkext/gtkbufferview.c @@ -48,7 +48,7 @@ static void gtk_buffer_view_dispose(GtkBufferView *); static void gtk_buffer_view_finalize(GtkBufferView *); /* Intègre le focus dans le rendu du composant. */ -static gboolean gtk_buffer_view_focus(GtkWidget *, GtkDirectionType); +static gboolean gtk_buffer_view_focus(GtkWidget *, GdkEventFocus *); /* Assure la gestion des clics de souris sur le composant. */ static gboolean gtk_buffer_view_button_press(GtkWidget *, GdkEventButton *); @@ -82,6 +82,9 @@ static void gtk_buffer_view_cache_glance(GtkBufferView *, cairo_t *, const GtkAl /* ------------------------------ ANIMATION DU CURSEUR ------------------------------ */ +/* Déplace le curseur à un emplacement défini. */ +static bool _gtk_buffer_view_move_caret_to(GtkBufferView *, gint, gint); + /* Déplace le curseur en effaçant son éventuelle position. */ static void gtk_buffer_view_relocate_caret(GtkBufferView *, const GdkRectangle *, const vmpa2t *); @@ -127,7 +130,8 @@ static void gtk_buffer_view_class_init(GtkBufferViewClass *class) object->dispose = (GObjectFinalizeFunc/* ! */)gtk_buffer_view_dispose; object->finalize = (GObjectFinalizeFunc)gtk_buffer_view_finalize; - widget_class->focus = gtk_buffer_view_focus; + widget_class->focus_in_event = gtk_buffer_view_focus; + widget_class->focus_out_event = gtk_buffer_view_focus; widget_class->button_press_event = gtk_buffer_view_button_press; widget_class->draw = gtk_buffer_view_draw; widget_class->key_press_event = gtk_buffer_view_key_press; @@ -147,6 +151,14 @@ static void gtk_buffer_view_class_init(GtkBufferViewClass *class) g_cclosure_user_marshal_VOID__UINT64, G_TYPE_NONE, 1, G_TYPE_UINT64); + g_signal_new("reach-limit", + GTK_TYPE_BUFFER_VIEW, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(GtkBufferViewClass, reach_limit), + NULL, NULL, + g_cclosure_marshal_VOID__ENUM, + G_TYPE_NONE, 1, GTK_TYPE_SCROLL_TYPE); + } @@ -213,7 +225,7 @@ static void gtk_buffer_view_finalize(GtkBufferView *view) /****************************************************************************** * * * Paramètres : widget = composant GTK visé par l'opération. * -* dir = sens de l'opération : perte ou gain de focus. * +* event = informations liées à l'événement. * * * * Description : Intègre le focus dans le rendu du composant. * * * @@ -223,13 +235,13 @@ static void gtk_buffer_view_finalize(GtkBufferView *view) * * ******************************************************************************/ -static gboolean gtk_buffer_view_focus(GtkWidget *widget, GtkDirectionType direction) +static gboolean gtk_buffer_view_focus(GtkWidget *widget, GdkEventFocus *event) { GtkBufferView *view; /* Autre version du composant */ gboolean has_focus; /* Etat courant */ view = GTK_BUFFER_VIEW(widget); - has_focus = gtk_widget_is_focus(widget); + has_focus = event->in; if (has_focus) restart_caret_blinking(view); @@ -265,16 +277,11 @@ static gboolean gtk_buffer_view_focus(GtkWidget *widget, GtkDirectionType direct static gboolean gtk_buffer_view_button_press(GtkWidget *widget, GdkEventButton *event) { GtkBufferView *view; /* Autre version du composant */ - GtkViewPanel *pview; /* 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*/ - const vmpa2t *addr; /* Position mémoire associée */ - GdkRectangle new; /* Nouvel emplacement calculé */ view = GTK_BUFFER_VIEW(widget); - pview = GTK_VIEW_PANEL(widget); gtk_widget_grab_focus(widget); @@ -287,32 +294,17 @@ static gboolean gtk_buffer_view_button_press(GtkWidget *widget, GdkEventButton * real_x, real_y); - - line = g_buffer_view_find_line_at(view->buffer_view, real_y, &index); - if (line == NULL) return FALSE; - - - - printf(" [init ] %p - line = %p (y=%d)\n", view->buffer_view, line, real_y); - - - if (real_x < view->left_margin) { + line = g_buffer_view_find_line_at(view->buffer_view, real_y, NULL); + if (line == NULL) return FALSE; - - + /* TODO */ printf("Border Line :: %p\n", line); - } else - { - //addr = g_buffer_view_compute_caret_old(view->buffer_view, line, index, real_x, pview->display, &new); - //addr = g_buffer_view_compute_caret(view->buffer_view, real_x, real_y, pview->display, &new); - addr = g_buffer_view_compute_caret_full(view->buffer_view, line, index, real_x, pview->display, &new); - gtk_buffer_view_relocate_caret(view, &new, addr); - } + _gtk_buffer_view_move_caret_to(view, real_x, real_y); return FALSE; @@ -472,77 +464,67 @@ static gboolean gtk_buffer_view_draw(GtkWidget *widget, cairo_t *cr) static gboolean gtk_buffer_view_key_press(GtkWidget *widget, GdkEventKey *event) { gboolean result; /* Suites à renvoyer */ - GtkBufferView *view; /* Autre version du composant */ GtkViewPanel *pview; /* Autre version du composant */ - - bool ctrl; /* Statut de la touche Contrôle*/ - - - GdkRectangle area; - - const vmpa2t *addr; - + GdkScrollDirection dir; /* Direction du déplacement */ + GdkRectangle area; /* Emplacement de curseur */ + const vmpa2t *addr; /* Adresse du nouveau curseur */ result = FALSE; - - view = GTK_BUFFER_VIEW(widget); pview = GTK_VIEW_PANEL(widget); - - area = view->caret; - - - ctrl = (event->state & GDK_CONTROL_MASK); - switch (event->keyval) { case GDK_KEY_Left: - printf("LEFT\n"); - addr = g_buffer_view_move_caret(view->buffer_view, &area, ctrl, GDK_SCROLL_LEFT, pview->display); - gtk_buffer_view_relocate_caret(view, &area, view->caret_addr); + dir = GDK_SCROLL_LEFT; result = TRUE; break; case GDK_KEY_Up: - printf("UP\n"); - addr = g_buffer_view_move_caret(view->buffer_view, &area, ctrl, GDK_SCROLL_UP, pview->display); - gtk_buffer_view_relocate_caret(view, &area, view->caret_addr); + dir = GDK_SCROLL_UP; result = TRUE; break; case GDK_KEY_Right: - printf("RIGHT\n"); - addr = g_buffer_view_move_caret(view->buffer_view, &area, ctrl, GDK_SCROLL_RIGHT, pview->display); - gtk_buffer_view_relocate_caret(view, &area, view->caret_addr); + dir = GDK_SCROLL_RIGHT; result = TRUE; break; case GDK_KEY_Down: - printf("DOWN\n"); - addr = g_buffer_view_move_caret(view->buffer_view, &area, ctrl, GDK_SCROLL_DOWN, pview->display); - gtk_buffer_view_relocate_caret(view, &area, view->caret_addr); + dir = GDK_SCROLL_DOWN; result = TRUE; break; default: - addr = NULL; break; } + if (result) + { + area = view->caret; + ctrl = (event->state & GDK_CONTROL_MASK); + + addr = g_buffer_view_move_caret(view->buffer_view, &area, ctrl, dir, pview->display); + + if (addr != NULL) + { + gtk_buffer_view_relocate_caret(view, &area, addr); + gtk_view_panel_scroll_to_address(pview, addr, SPT_RAW); + } + else + g_signal_emit_by_name(view, "reach-limit", dir); - printf("ctrl ? %d -- keyval = %d -->> %d\n", ctrl, event->keyval, result); - if (addr != NULL) gtk_view_panel_scroll_to_address(pview, addr, SPT_RAW); + //if (addr == NULL) return FALSE; - printf("\n"); + } return result; @@ -815,6 +797,8 @@ void gtk_buffer_view_attach_buffer(GtkBufferView *view, GBufferView *buffer) GBufferView *gtk_buffer_view_get_buffer(const GtkBufferView *view) { + /* TODO : ref... */ + return view->buffer_view; } @@ -862,6 +846,84 @@ void gtk_buffer_view_compute_relative_coords(GtkBufferView *view, gint *x, gint /****************************************************************************** * * * Paramètres : view = composant GTK à manipuler. * +* x = abscisse proposée pour le nouvel emplacement. * +* y = ordonnée proposée pour le nouvel emplacement. * +* * +* Description : Déplace le curseur à un emplacement défini. * +* * +* Retour : true si un traitement a été effectué, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool _gtk_buffer_view_move_caret_to(GtkBufferView *view, gint x, gint y) +{ + size_t index; /* Indice de ligne de tampon */ + GBufferLine *line; /* Ligne à la position courante*/ + GtkViewPanel *pview; /* Autre version du composant */ + const vmpa2t *addr; /* Position mémoire associée */ + GdkRectangle new; /* Nouvel emplacement calculé */ + + if (x < view->left_margin) return false; + + line = g_buffer_view_find_line_at(view->buffer_view, y, &index); + if (line == NULL) return false; + + pview = GTK_VIEW_PANEL(view); + + addr = g_buffer_view_compute_caret_full(view->buffer_view, line, index, x, pview->display, &new); + + if (addr != NULL) + gtk_buffer_view_relocate_caret(view, &new, addr); + + return (addr != NULL); + +} + + +/****************************************************************************** +* * +* Paramètres : view = composant GTK à manipuler. * +* beginning = précise le coin où se retrouvera le curseur. * +* same_x = tente de conserver une même abscisse ou NULL ? * +* * +* Description : Déplace le curseur à un emplacement en extrémité. * +* * +* Retour : true si un traitement a été effectué, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool gtk_buffer_view_move_caret_to(GtkBufferView *view, bool beginning, gint *same_x) +{ + bool result; /* Bilan à remonter */ + gint x; /* Abscisse d'emplacement */ + gint y; /* Ordonnée d'emplacement */ + + if (beginning) + { + x = same_x != NULL ? *same_x : view->left_margin * 2; + y = 0; + } + else + { + if (same_x != NULL) x = *same_x; + gtk_buffer_view_compute_requested_size(view, same_x != NULL ? NULL : &x, &y); + y--; + } + + result = _gtk_buffer_view_move_caret_to(view, x, y); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : view = composant GTK à manipuler. * * area = emplacement pour le dessin d'un curseur. * * addr = position dans la mémoire représentée du curseur. * * * |