[StScrollbar] Allocate steppers according to size requests

The forward/backward steppers are always allocated a square region at the
scroll bar's ends. Change the allocation to be based on the steppers' size
requests instead.

https://bugzilla.gnome.org/show_bug.cgi?id=609401
This commit is contained in:
Florian Müllner 2010-02-09 07:26:25 +01:00
parent ea4b1c6c29
commit 32e2ff7573

View File

@ -271,7 +271,7 @@ st_scroll_bar_allocate (ClutterActor *actor,
StScrollBarPrivate *priv = ST_SCROLL_BAR (actor)->priv; StScrollBarPrivate *priv = ST_SCROLL_BAR (actor)->priv;
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor)); StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
ClutterActorBox content_box, bw_box, fw_box, trough_box; ClutterActorBox content_box, bw_box, fw_box, trough_box;
gfloat stepper_size; gfloat bw_stepper_size, fw_stepper_size, min_size, natural_size;
/* Chain up */ /* Chain up */
CLUTTER_ACTOR_CLASS (st_scroll_bar_parent_class)-> CLUTTER_ACTOR_CLASS (st_scroll_bar_parent_class)->
@ -281,52 +281,70 @@ st_scroll_bar_allocate (ClutterActor *actor,
if (priv->vertical) if (priv->vertical)
{ {
stepper_size = content_box.x2 - content_box.x1; gfloat width = content_box.x2 - content_box.x1;
clutter_actor_get_preferred_height (priv->bw_stepper, width,
&min_size, &natural_size);
bw_stepper_size = MAX (min_size, natural_size);
/* Backward stepper */ /* Backward stepper */
bw_box.x1 = content_box.x1; bw_box.x1 = content_box.x1;
bw_box.y1 = content_box.y1; bw_box.y1 = content_box.y1;
bw_box.x2 = content_box.x2; bw_box.x2 = content_box.x2;
bw_box.y2 = bw_box.y1 + stepper_size; bw_box.y2 = bw_box.y1 + bw_stepper_size;
clutter_actor_allocate (priv->bw_stepper, &bw_box, flags); clutter_actor_allocate (priv->bw_stepper, &bw_box, flags);
clutter_actor_get_preferred_height (priv->fw_stepper, width,
&min_size, &natural_size);
fw_stepper_size = MAX (min_size, natural_size);
/* Forward stepper */ /* Forward stepper */
fw_box.x1 = content_box.x1; fw_box.x1 = content_box.x1;
fw_box.y1 = content_box.y2 - stepper_size; fw_box.y1 = content_box.y2 - fw_stepper_size;
fw_box.x2 = content_box.x2; fw_box.x2 = content_box.x2;
fw_box.y2 = content_box.y2; fw_box.y2 = content_box.y2;
clutter_actor_allocate (priv->fw_stepper, &fw_box, flags); clutter_actor_allocate (priv->fw_stepper, &fw_box, flags);
/* Trough */ /* Trough */
trough_box.x1 = content_box.x1; trough_box.x1 = content_box.x1;
trough_box.y1 = content_box.y1 + stepper_size; trough_box.y1 = content_box.y1 + bw_stepper_size;
trough_box.x2 = content_box.x2; trough_box.x2 = content_box.x2;
trough_box.y2 = content_box.y2 - stepper_size; trough_box.y2 = content_box.y2 - fw_stepper_size;
clutter_actor_allocate (priv->trough, &trough_box, flags); clutter_actor_allocate (priv->trough, &trough_box, flags);
} }
else else
{ {
stepper_size = content_box.y2 - content_box.y1; gfloat height = content_box.y2 - content_box.y1;
clutter_actor_get_preferred_width (priv->bw_stepper, height,
&min_size, &natural_size);
bw_stepper_size = MAX (min_size, natural_size);
/* Backward stepper */ /* Backward stepper */
bw_box.x1 = content_box.x1; bw_box.x1 = content_box.x1;
bw_box.y1 = content_box.y1; bw_box.y1 = content_box.y1;
bw_box.x2 = bw_box.x1 + stepper_size; bw_box.x2 = bw_box.x1 + bw_stepper_size;
bw_box.y2 = content_box.y2; bw_box.y2 = content_box.y2;
clutter_actor_allocate (priv->bw_stepper, &bw_box, flags); clutter_actor_allocate (priv->bw_stepper, &bw_box, flags);
clutter_actor_get_preferred_width (priv->fw_stepper, height,
&min_size, &natural_size);
fw_stepper_size = MAX (min_size, natural_size);
/* Forward stepper */ /* Forward stepper */
fw_box.x1 = content_box.x2 - stepper_size; fw_box.x1 = content_box.x2 - fw_stepper_size;
fw_box.y1 = content_box.y1; fw_box.y1 = content_box.y1;
fw_box.x2 = content_box.x2; fw_box.x2 = content_box.x2;
fw_box.y2 = content_box.y2; fw_box.y2 = content_box.y2;
clutter_actor_allocate (priv->fw_stepper, &fw_box, flags); clutter_actor_allocate (priv->fw_stepper, &fw_box, flags);
/* Trough */ /* Trough */
trough_box.x1 = content_box.x1 + stepper_size; trough_box.x1 = content_box.x1 + bw_stepper_size;
trough_box.y1 = content_box.y1; trough_box.y1 = content_box.y1;
trough_box.x2 = content_box.x2 - stepper_size; trough_box.x2 = content_box.x2 - fw_stepper_size;
trough_box.y2 = content_box.y2; trough_box.y2 = content_box.y2;
clutter_actor_allocate (priv->trough, &trough_box, flags); clutter_actor_allocate (priv->trough, &trough_box, flags);
} }
@ -335,10 +353,12 @@ st_scroll_bar_allocate (ClutterActor *actor,
if (priv->adjustment) if (priv->adjustment)
{ {
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor)); StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
float handle_size, position, avail_size; float handle_size, position, avail_size, stepper_size;
gdouble value, lower, upper, page_size, increment, min_size, max_size; gdouble value, lower, upper, page_size, increment, min_size, max_size;
ClutterActorBox handle_box = { 0, }; ClutterActorBox handle_box = { 0, };
stepper_size = bw_stepper_size + fw_stepper_size;
st_adjustment_get_values (priv->adjustment, st_adjustment_get_values (priv->adjustment,
&value, &value,
&lower, &lower,
@ -365,7 +385,7 @@ st_scroll_bar_allocate (ClutterActor *actor,
if (priv->vertical) if (priv->vertical)
{ {
avail_size = content_box.y2 - content_box.y1 - stepper_size * 2; avail_size = content_box.y2 - content_box.y1 - stepper_size;
handle_size = increment * avail_size; handle_size = increment * avail_size;
handle_size = CLAMP (handle_size, min_size, max_size); handle_size = CLAMP (handle_size, min_size, max_size);
@ -377,7 +397,7 @@ st_scroll_bar_allocate (ClutterActor *actor,
} }
else else
{ {
avail_size = content_box.x2 - content_box.x1 - stepper_size * 2; avail_size = content_box.x2 - content_box.x1 - stepper_size;
handle_size = increment * avail_size; handle_size = increment * avail_size;
handle_size = CLAMP (handle_size, min_size, max_size); handle_size = CLAMP (handle_size, min_size, max_size);