diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2015-02-25 21:57:42 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2015-02-25 21:57:42 (GMT) |
commit | 4724b73c5161140222cab3c61bb5b3d0c8dde360 (patch) | |
tree | d341f43bacdad465ddae8c8b6c076a573c53e43d /src/gtkext | |
parent | 9ff8702e5c51c7916e239caee13b974dccff6413 (diff) |
Provided tweaks about positions when looking for address coordinates.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@480 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/gtkext')
-rw-r--r-- | src/gtkext/gtkbufferview.c | 50 | ||||
-rw-r--r-- | src/gtkext/gtkviewpanel-int.h | 2 | ||||
-rw-r--r-- | src/gtkext/gtkviewpanel.c | 10 | ||||
-rw-r--r-- | src/gtkext/gtkviewpanel.h | 12 |
4 files changed, 60 insertions, 14 deletions
diff --git a/src/gtkext/gtkbufferview.c b/src/gtkext/gtkbufferview.c index f179845..30cf075 100644 --- a/src/gtkext/gtkbufferview.c +++ b/src/gtkext/gtkbufferview.c @@ -59,7 +59,7 @@ static void gtk_buffer_view_compute_requested_size(GtkBufferView *, gint *, gint static void gtk_buffer_view_compute_scroll_inc(GtkBufferView *, gint, GtkOrientation, gdouble *, gdouble *); /* Indique la position d'affichage d'une adresse donnée. */ -static bool gtk_buffer_view_get_address_coordinates(const GtkBufferView *, const vmpa2t *, gint *, gint *); +static bool gtk_buffer_view_get_address_coordinates(const GtkBufferView *, const vmpa2t *, gint *, gint *, ScrollPositionTweak); /* Place en cache un rendu destiné à l'aperçu graphique rapide. */ static void gtk_buffer_view_cache_glance(GtkBufferView *, cairo_t *, const GtkAllocation *, double); @@ -474,7 +474,7 @@ static gboolean gtk_buffer_view_key_press(GtkWidget *widget, GdkEventKey *event) printf("ctrl ? %d -- keyval = %d -->> %d\n", ctrl, event->keyval, result); - if (addr != NULL) gtk_view_panel_scroll_to_address(pview, addr); + if (addr != NULL) gtk_view_panel_scroll_to_address(pview, addr, SPT_RAW); printf("\n"); @@ -552,10 +552,11 @@ static void gtk_buffer_view_compute_scroll_inc(GtkBufferView *view, gint size, G /****************************************************************************** * * -* Paramètres : view = composant GTK à consulter. * -* addr = adresse à présenter à l'écran. * -* x = position horizontale au sein du composant. [OUT] * -* y = position verticale au sein du composant. [OUT] * +* Paramètres : view = composant GTK à consulter. * +* addr = adresse à présenter à l'écran. * +* x = position horizontale au sein du composant. [OUT] * +* y = position verticale au sein du composant. [OUT] * +* tweak = adaptation finale à effectuer. * * * * Description : Indique la position d'affichage d'une adresse donnée. * * * @@ -565,9 +566,42 @@ static void gtk_buffer_view_compute_scroll_inc(GtkBufferView *view, gint size, G * * ******************************************************************************/ -static bool gtk_buffer_view_get_address_coordinates(const GtkBufferView *view, const vmpa2t *addr, gint *x, gint *y) +static bool gtk_buffer_view_get_address_coordinates(const GtkBufferView *view, const vmpa2t *addr, gint *x, gint *y, ScrollPositionTweak tweak) { - return g_buffer_view_get_address_coordinates(view->buffer_view, addr, x, y); + bool result; /* Bilan à remonter */ + bool need_code; /* Recherche plus raffinée */ + int height; /* Hauteur allouée */ + + need_code = (tweak == SPT_BOTTOM); + + result = g_buffer_view_get_address_coordinates(view->buffer_view, addr, x, y, need_code); + + if (result) + { + height = gtk_widget_get_allocated_height(GTK_WIDGET(view)); + + switch (tweak) + { + case SPT_RAW: + break; + + case SPT_TOP: + break; + + case SPT_CENTER: + *y -= (height / 2); + break; + + case SPT_BOTTOM: + *y -= height; + *y += g_buffer_view_get_line_height(view->buffer_view); + break; + + } + + } + + return result; } diff --git a/src/gtkext/gtkviewpanel-int.h b/src/gtkext/gtkviewpanel-int.h index f33499d..90bd141 100644 --- a/src/gtkext/gtkviewpanel-int.h +++ b/src/gtkext/gtkviewpanel-int.h @@ -49,7 +49,7 @@ typedef void (* define_address_fc) (GtkViewPanel *, vmpa_t); typedef void (* prepare_resize_fc) (GtkViewPanel *); /* Indique la position d'affichage d'une adresse donnée. */ -typedef bool (* get_addr_coordinates_fc) (const GtkViewPanel *, const vmpa2t *, gint *, gint *); +typedef bool (* get_addr_coordinates_fc) (const GtkViewPanel *, const vmpa2t *, gint *, gint *, ScrollPositionTweak); /* Place en cache un rendu destiné à l'aperçu graphique rapide. */ typedef void (* cache_glance_fc) (GtkViewPanel *, cairo_t *, const GtkAllocation *, double); diff --git a/src/gtkext/gtkviewpanel.c b/src/gtkext/gtkviewpanel.c index 8e41fa1..40ae038 100644 --- a/src/gtkext/gtkviewpanel.c +++ b/src/gtkext/gtkviewpanel.c @@ -747,7 +747,7 @@ bool gtk_view_panel_contain_address(const GtkViewPanel *panel, vmpa_t addr) gint dummy_x; /* Abscisse pour l'appel */ gint dummy_y; /* Ordonnée pour l'appel */ - return GTK_VIEW_PANEL_GET_CLASS(panel)->get_coordinates(panel, addr, &dummy_x, &dummy_y); + return GTK_VIEW_PANEL_GET_CLASS(panel)->get_coordinates(panel, addr, &dummy_x, &dummy_y, SPT_RAW); } @@ -756,6 +756,7 @@ bool gtk_view_panel_contain_address(const GtkViewPanel *panel, vmpa_t addr) * * * Paramètres : panel = composant GTK à manipuler. * * addr = adresse à présenter à l'écran. * +* tweak = adaptation finale à effectuer. * * * * Description : S'assure qu'une adresse donnée est visible à l'écran. * * * @@ -765,7 +766,7 @@ bool gtk_view_panel_contain_address(const GtkViewPanel *panel, vmpa_t addr) * * ******************************************************************************/ -void gtk_view_panel_scroll_to_address(GtkViewPanel *panel, const vmpa2t *addr) +void gtk_view_panel_scroll_to_address(GtkViewPanel *panel, const vmpa2t *addr, ScrollPositionTweak tweak) { gint x; /* Abscisse à garantir */ gint y; /* Ordonnée à garantir */ @@ -781,7 +782,7 @@ void gtk_view_panel_scroll_to_address(GtkViewPanel *panel, const vmpa2t *addr) */ - if (GTK_VIEW_PANEL_GET_CLASS(panel)->get_coordinates(panel, addr, &x, &y)) + if (GTK_VIEW_PANEL_GET_CLASS(panel)->get_coordinates(panel, addr, &x, &y, tweak)) { viewport = gtk_widget_get_parent(GTK_WIDGET(panel)); @@ -807,12 +808,13 @@ void gtk_view_panel_scroll_to_address(GtkViewPanel *panel, const vmpa2t *addr) page_size = gtk_adjustment_get_page_size(adj); value = gtk_adjustment_get_value(adj); - if (y < value) + if (y < value || tweak != SPT_RAW) gtk_adjustment_set_value(adj, y); else if ((y + step_inc) > (value + page_size)) gtk_adjustment_set_value(adj, y + step_inc - page_size); + } } diff --git a/src/gtkext/gtkviewpanel.h b/src/gtkext/gtkviewpanel.h index 95f2084..c733314 100644 --- a/src/gtkext/gtkviewpanel.h +++ b/src/gtkext/gtkviewpanel.h @@ -71,8 +71,18 @@ GLoadedBinary *gtk_view_panel_get_binary(const GtkViewPanel *); /* Indique si la vue contient une addrese donnée. */ bool gtk_view_panel_contain_address(const GtkViewPanel *, vmpa_t); +/* Adaptation d'une position sur une surface */ +typedef enum _ScrollPositionTweak +{ + SPT_RAW, /* Aucun ajustement */ + SPT_TOP, /* Le plus haut possible */ + SPT_CENTER, /* Au centre de la surface */ + SPT_BOTTOM /* Le plus bas possible */ + +} ScrollPositionTweak; + /* S'assure qu'une adresse donnée est visible à l'écran. */ -void gtk_view_panel_scroll_to_address(GtkViewPanel *, const vmpa2t *); +void gtk_view_panel_scroll_to_address(GtkViewPanel *, const vmpa2t *, ScrollPositionTweak); /* Place en cache un rendu destiné à l'aperçu graphique rapide. */ void gtk_view_panel_cache_glance(GtkViewPanel *, cairo_t *, const GtkAllocation *, double); |