From c987ca944052019957d3f31d69c679ed5ad994f2 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Sun, 14 Jun 2015 22:55:24 +0000 Subject: Been able to move the caret when scrolling to a given address. git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@541 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a --- ChangeLog | 16 +++++++++++++++ src/glibext/gcodebuffer.c | 35 +++++++++++++++++++++++++++++++ src/glibext/gcodebuffer.h | 3 +++ src/gtkext/gtkbufferview.c | 5 ++++- src/gtkext/gtkgraphview.c | 48 +++++++++++++++++++++++++++++++++++++++++++ src/gtkext/gtkviewpanel-int.h | 4 ++++ src/gtkext/gtkviewpanel.c | 7 ++++++- src/gtkext/gtkviewpanel.h | 4 +++- 8 files changed, 119 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index c64203f..7574a78 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +15-06-15 Cyrille Bagard + + * src/glibext/gcodebuffer.c: + * src/glibext/gcodebuffer.h: + Compute and provide the width before the header column. + + * src/gtkext/gtkbufferview.c: + * src/gtkext/gtkgraphview.c: + Register _gtk_*_view_move_caret_to() as a class function. + Get more accurate when computing new caret abscissa locations. + + * src/gtkext/gtkviewpanel.c: + * src/gtkext/gtkviewpanel.h: + * src/gtkext/gtkviewpanel-int.h: + Be able to move the caret when scrolling to a given address. + 15-06-14 Cyrille Bagard * src/arch/arm/v7/opdefs/pop_A88131.d: diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c index 9b13875..a27b202 100644 --- a/src/glibext/gcodebuffer.c +++ b/src/glibext/gcodebuffer.c @@ -1313,6 +1313,41 @@ gint g_buffer_view_get_width(GBufferView *view, const bool *display) } +/****************************************************************************** +* * +* Paramètres : view = visualisation à consulter. * +* display = règles d'affichage des colonnes modulables. * +* * +* Description : Fournit la largeur requise pour dépasser les marges gauches. * +* * +* Retour : Dimension calculée. * +* * +* Remarques : - * +* * +******************************************************************************/ + +gint g_buffer_view_get_margin(GBufferView *view, const bool *display) +{ + gint result; /* Taille à retourner */ + BufferLineColumn i; /* Boucle de parcours */ + + if (!WIDTHS_CACHED(view)) + g_buffer_view_compute_required_widths(view, display); + + result = view->left_text; + + for (i = 0; i < BLC_DISPLAY; i++) + { + if (!display[i]) continue; + + result += view->max_widths[i] + COL_MARGIN; + + } + + return result; + +} + /****************************************************************************** * * diff --git a/src/glibext/gcodebuffer.h b/src/glibext/gcodebuffer.h index 52c74ed..5cde79c 100644 --- a/src/glibext/gcodebuffer.h +++ b/src/glibext/gcodebuffer.h @@ -128,6 +128,9 @@ gint g_buffer_view_get_line_height(GBufferView *); /* Fournit la largeur requise par une visualisation. */ gint g_buffer_view_get_width(GBufferView *, const bool *); +/* Fournit la largeur requise pour dépasser les marges gauches. */ +gint g_buffer_view_get_margin(GBufferView *, const bool *); + /* Fournit la hauteur requise par une visualisation. */ gint g_buffer_view_get_height(const GBufferView *); diff --git a/src/gtkext/gtkbufferview.c b/src/gtkext/gtkbufferview.c index 7f62963..2884383 100644 --- a/src/gtkext/gtkbufferview.c +++ b/src/gtkext/gtkbufferview.c @@ -147,6 +147,7 @@ static void gtk_buffer_view_class_init(GtkBufferViewClass *class) panel_class->adjust = (adjust_scroll_value_fc)gtk_buffer_view_adjust_scroll_value; panel_class->get_coordinates = (get_addr_coordinates_fc)gtk_buffer_view_get_address_coordinates; panel_class->get_position = (get_view_position_fc)gtk_buffer_view_get_position; + panel_class->move_caret_to = (move_caret_to_fc)_gtk_buffer_view_move_caret_to; panel_class->cache_glance = (cache_glance_fc)gtk_buffer_view_cache_glance; g_signal_new("caret-moved", @@ -478,7 +479,7 @@ static gboolean gtk_buffer_view_key_press(GtkWidget *widget, GdkEventKey *event) if (addr != NULL) { gtk_buffer_view_relocate_caret(view, &area, addr); - gtk_view_panel_scroll_to_address(pview, addr, SPT_RAW); + _gtk_view_panel_scroll_to_address(pview, addr, SPT_RAW, false); } else g_signal_emit_by_name(view, "reach-limit", dir); @@ -754,6 +755,8 @@ static bool gtk_buffer_view_get_address_coordinates(const GtkBufferView *view, c if (result) { + *x += g_buffer_view_get_margin(view->buffer_view, GTK_VIEW_PANEL(view)->display); + height = gtk_widget_get_allocated_height(GTK_WIDGET(view)); switch (tweak) diff --git a/src/gtkext/gtkgraphview.c b/src/gtkext/gtkgraphview.c index 1b18c64..ac78981 100644 --- a/src/gtkext/gtkgraphview.c +++ b/src/gtkext/gtkgraphview.c @@ -86,6 +86,9 @@ static void gtk_graph_view_define_main_address(GtkGraphView *, const vmpa2t *); /* Indique la position d'affichage d'une adresse donnée. */ static bool gtk_graph_view_get_address_coordinates(const GtkGraphView *, const vmpa2t *addr, gint *x, gint *y, ScrollPositionTweak tweak); +/* Déplace le curseur à un emplacement défini. */ +static bool gtk_graph_view_move_caret_to(GtkGraphView *, gint, gint); + /* Place en cache un rendu destiné à l'aperçu graphique rapide. */ static void gtk_graph_view_cache_glance(GtkGraphView *, cairo_t *, const GtkAllocation *, double); @@ -129,6 +132,7 @@ static void gtk_graph_view_class_init(GtkGraphViewClass *class) panel_class->adjust = (adjust_scroll_value_fc)gtk_graph_view_adjust_scroll_value; panel_class->define = (define_address_fc)gtk_graph_view_define_main_address; panel_class->get_coordinates = (get_addr_coordinates_fc)gtk_graph_view_get_address_coordinates; + panel_class->move_caret_to = (move_caret_to_fc)gtk_graph_view_move_caret_to; panel_class->cache_glance = (cache_glance_fc)gtk_graph_view_cache_glance; } @@ -401,6 +405,50 @@ static bool gtk_graph_view_get_address_coordinates(const GtkGraphView *view, con /****************************************************************************** * * +* 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_graph_view_move_caret_to(GtkGraphView *view, gint x, gint y) +{ + bool result; /* Bilan à retourner */ + size_t i; /* Boucle de parcours */ + GtkViewPanel *pview; /* Autre vision d'enfance */ + gint sub_x; /* Abscisse relative à l'enfant*/ + gint sub_y; /* Ordonnée relative à l'enfant*/ + + result = false; + + for (i = 0; i < view->children_count; i++) + { + if (x < view->allocs[i].x || x >= (view->allocs[i].x + view->allocs[i].width)) continue; + if (y < view->allocs[i].y || y >= (view->allocs[i].y + view->allocs[i].height)) continue; + + pview = GTK_VIEW_PANEL(view->children[i]); + + sub_x = x - view->allocs[i].x; + sub_y = y - view->allocs[i].y; + + result = GTK_VIEW_PANEL_GET_CLASS(pview)->move_caret_to(pview, sub_x, sub_y); + break; + + } + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : view = composant GTK à manipuler. * * cairo = assistant pour la création de rendus. * * area = taille de la surface réduite à disposition. * diff --git a/src/gtkext/gtkviewpanel-int.h b/src/gtkext/gtkviewpanel-int.h index e51dbac..5fbcd76 100644 --- a/src/gtkext/gtkviewpanel-int.h +++ b/src/gtkext/gtkviewpanel-int.h @@ -57,6 +57,9 @@ typedef bool (* get_addr_coordinates_fc) (const GtkViewPanel *, const vmpa2t *, /* Fournit des éléments liés à la position courante dans la vue. */ typedef bool (* get_view_position_fc) (const GtkViewPanel *, GBufferLine **, GBufferSegment **); +/* Déplace le curseur à un emplacement défini. */ +typedef bool (* move_caret_to_fc) (GtkViewPanel *, gint, gint); + /* Place en cache un rendu destiné à l'aperçu graphique rapide. */ typedef void (* cache_glance_fc) (GtkViewPanel *, cairo_t *, const GtkAllocation *, double); @@ -95,6 +98,7 @@ struct _GtkViewPanelClass define_address_fc define; /* Centrage sur une partie */ get_addr_coordinates_fc get_coordinates;/* Conversion adresse <-> pos. */ get_view_position_fc get_position; /* Indications sur la position */ + move_caret_to_fc move_caret_to; /* Déplacement du curseur */ cache_glance_fc cache_glance; /* Cache de la mignature */ }; diff --git a/src/gtkext/gtkviewpanel.c b/src/gtkext/gtkviewpanel.c index 4241538..091482b 100644 --- a/src/gtkext/gtkviewpanel.c +++ b/src/gtkext/gtkviewpanel.c @@ -800,6 +800,7 @@ GLoadedBinary *gtk_view_panel_get_binary(const GtkViewPanel *panel) * Paramètres : panel = composant GTK à manipuler. * * addr = adresse à présenter à l'écran. * * tweak = adaptation finale à effectuer. * +* move = doit-on déplacer le curseur à l'adresse indiquée ? * * * * Description : S'assure qu'une adresse donnée est visible à l'écran. * * * @@ -809,7 +810,7 @@ GLoadedBinary *gtk_view_panel_get_binary(const GtkViewPanel *panel) * * ******************************************************************************/ -void gtk_view_panel_scroll_to_address(GtkViewPanel *panel, const vmpa2t *addr, ScrollPositionTweak tweak) +void _gtk_view_panel_scroll_to_address(GtkViewPanel *panel, const vmpa2t *addr, ScrollPositionTweak tweak, bool move) { GtkWidget *parent; /* Support parent à valider */ gint x; /* Abscisse à garantir */ @@ -874,6 +875,10 @@ void gtk_view_panel_scroll_to_address(GtkViewPanel *panel, const vmpa2t *addr, S else if ((y + step_inc) > (value + page_size)) gtk_adjustment_set_value(adj, y + step_inc - page_size); + /* Déplacement du curseur */ + + if (move && GTK_VIEW_PANEL_GET_CLASS(panel)->get_coordinates(panel, addr, &x, &y, SPT_RAW)) + GTK_VIEW_PANEL_GET_CLASS(panel)->move_caret_to(panel, x, y); } diff --git a/src/gtkext/gtkviewpanel.h b/src/gtkext/gtkviewpanel.h index 038e860..24f0640 100644 --- a/src/gtkext/gtkviewpanel.h +++ b/src/gtkext/gtkviewpanel.h @@ -79,7 +79,9 @@ typedef enum _ScrollPositionTweak } ScrollPositionTweak; /* S'assure qu'une adresse donnée est visible à l'écran. */ -void gtk_view_panel_scroll_to_address(GtkViewPanel *, const vmpa2t *, ScrollPositionTweak); +void _gtk_view_panel_scroll_to_address(GtkViewPanel *, const vmpa2t *, ScrollPositionTweak, bool); + +#define gtk_view_panel_scroll_to_address(p, a, t) _gtk_view_panel_scroll_to_address(p, a, t, true) /* Fournit des éléments liés à la position courante dans la vue. */ bool gtk_view_panel_get_position(const GtkViewPanel *, GBufferLine **, GBufferSegment **); -- cgit v0.11.2-87-g4458