summaryrefslogtreecommitdiff
path: root/src/gtkext/gtkviewpanel.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gtkext/gtkviewpanel.c')
-rw-r--r--src/gtkext/gtkviewpanel.c72
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);
}