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/gtkext/gtkviewpanel.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/gtkext/gtkviewpanel.c')
-rw-r--r-- | src/gtkext/gtkviewpanel.c | 72 |
1 files changed, 60 insertions, 12 deletions
diff --git a/src/gtkext/gtkviewpanel.c b/src/gtkext/gtkviewpanel.c index 27799b5..8e41fa1 100644 --- a/src/gtkext/gtkviewpanel.c +++ b/src/gtkext/gtkviewpanel.c @@ -53,6 +53,9 @@ static void gtk_view_panel_size_allocate(GtkWidget *, GtkAllocation *); /* Met à jour l'affichage du composant d'affichage. */ static gboolean gtk_view_panel_draw(GtkWidget *, cairo_t *); +/* Détermine la taille des bonds lors de défilements. */ +static void gtk_view_panel_compute_scroll_inc(GtkViewPanel *, gint, GtkOrientation, gdouble *, gdouble *); + /* Détermine la taille allouée pour le contenu. */ static void gtk_view_panel_compute_allocation(GtkViewPanel *, GtkAllocation *); @@ -94,9 +97,11 @@ static void gtk_view_panel_class_init(GtkViewPanelClass *class) { GObjectClass *gobject_class; /* Plus haut niveau équivalent */ GtkWidgetClass *widget_class; /* Classe de haut niveau */ + GtkViewPanelClass *panel_class; /* Classe de lus bas niveau */ gobject_class = G_OBJECT_CLASS(class); widget_class = GTK_WIDGET_CLASS(class); + panel_class = GTK_VIEW_PANEL_CLASS(class); gobject_class->set_property = gtk_view_panel_set_property; gobject_class->get_property = gtk_view_panel_get_property; @@ -112,6 +117,8 @@ static void gtk_view_panel_class_init(GtkViewPanelClass *class) widget_class->size_allocate = gtk_view_panel_size_allocate; widget_class->draw = gtk_view_panel_draw; + panel_class->compute_inc = gtk_view_panel_compute_scroll_inc; + } @@ -365,6 +372,30 @@ static gboolean gtk_view_panel_draw(GtkWidget *widget, cairo_t *cr) /****************************************************************************** * * +* Paramètres : panel = composant GTK d'affichage à mettre à jour. * +* size = taille de l'espace dans la direction donnée. * +* orientation = indication sur le défilement à traiter. * +* step = valeur d'un petit pas de défilement. [OUT] * +* page = valeur d'un grand pas de défilement. [OUT] * +* * +* Description : Détermine la taille des bonds lors de défilements. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void gtk_view_panel_compute_scroll_inc(GtkViewPanel *panel, gint size, GtkOrientation orientation, gdouble *step, gdouble *page) +{ + *step = size * 0.1; + *page = size * 0.9; + +} + + +/****************************************************************************** +* * * Paramètres : panel = composant GTK à consulter. * * alloc = emplacement à déterminer. [OUT] * * * @@ -521,6 +552,8 @@ static void gtk_view_panel_update_adjustment(GtkViewPanel *panel, GtkOrientation GtkAdjustment *adj; /* Ajustement à manipuler */ gint req; /* Dimension requise */ gint allocated; /* Dimension allouée */ + gdouble step_inc; /* Pas de défilement */ + gdouble page_inc; /* ENjambée de défilement */ gtk_view_panel_compute_allocation(panel, &allocation); @@ -541,10 +574,12 @@ static void gtk_view_panel_update_adjustment(GtkViewPanel *panel, GtkOrientation } + GTK_VIEW_PANEL_GET_CLASS(panel)->compute_inc(panel, allocated, orientation, &step_inc, &page_inc); + gtk_adjustment_configure(adj, gtk_adjustment_get_value(adj), 0, MAX(req, allocated), - allocated * 0.1, - allocated * 0.9, + step_inc, + page_inc, allocated); } @@ -736,8 +771,9 @@ void gtk_view_panel_scroll_to_address(GtkViewPanel *panel, const vmpa2t *addr) gint y; /* Ordonnée à garantir */ GtkWidget *viewport; /* Parent avec défilement */ GtkAdjustment *adj; /* Défilement à mettre à jour */ - double limit; /* Limite à ne pas dépasser */ - + gdouble step_inc; /* Valeur d'un petit pas */ + gdouble page_size; /* Taille de l'affichage */ + double value; /* Valeur courante */ /* if (panel->define != NULL) @@ -749,21 +785,33 @@ void gtk_view_panel_scroll_to_address(GtkViewPanel *panel, const vmpa2t *addr) { viewport = gtk_widget_get_parent(GTK_WIDGET(panel)); + /* Eventuel défilement horizontal */ + g_object_get(G_OBJECT(viewport), "hadjustment", &adj, NULL); - limit = gtk_adjustment_get_upper(adj) - gtk_adjustment_get_page_size(adj); - if (x > limit) - x = limit; + step_inc = gtk_adjustment_get_step_increment(adj); + page_size = gtk_adjustment_get_page_size(adj); + value = gtk_adjustment_get_value(adj); - gtk_adjustment_set_value(adj, x); + if (x < value) + gtk_adjustment_set_value(adj, x); + + else if ((x + step_inc) > (value + page_size)) + gtk_adjustment_set_value(adj, x + step_inc - page_size); + + /* Eventuel défilement vertical */ g_object_get(G_OBJECT(viewport), "vadjustment", &adj, NULL); - limit = gtk_adjustment_get_upper(adj) - gtk_adjustment_get_page_size(adj); - if (y > limit) - y = limit; + step_inc = gtk_adjustment_get_step_increment(adj); + page_size = gtk_adjustment_get_page_size(adj); + value = gtk_adjustment_get_value(adj); + + if (y < value) + gtk_adjustment_set_value(adj, y); - gtk_adjustment_set_value(adj, y); + else if ((y + step_inc) > (value + page_size)) + gtk_adjustment_set_value(adj, y + step_inc - page_size); } |