static void st_scroll_bar_allocate (ClutterActor *actor, const ClutterActorBox *box, ClutterAllocationFlags flags) { StScrollBar *bar = ST_SCROLL_BAR (actor); /* Chain up */ CLUTTER_ACTOR_CLASS (st_scroll_bar_parent_class)->allocate (actor, box, flags); scroll_bar_allocate_children (bar, box, flags); }
static void st_scroll_bar_map (ClutterActor *actor) { StScrollBarPrivate *priv = ST_SCROLL_BAR (actor)->priv; CLUTTER_ACTOR_CLASS (st_scroll_bar_parent_class)->map (actor); clutter_actor_map (priv->bw_stepper); clutter_actor_map (priv->fw_stepper); clutter_actor_map (priv->trough); if (priv->handle) clutter_actor_map (priv->handle); }
static void st_scroll_bar_pick (ClutterActor *actor, const ClutterColor *pick_color) { StScrollBarPrivate *priv = ST_SCROLL_BAR (actor)->priv; CLUTTER_ACTOR_CLASS (st_scroll_bar_parent_class)->pick (actor, pick_color); clutter_actor_paint (priv->bw_stepper); clutter_actor_paint (priv->fw_stepper); clutter_actor_paint (priv->trough); if (priv->handle && priv->adjustment) clutter_actor_paint (priv->handle); }
static GObject* st_scroll_bar_constructor (GType type, guint n_properties, GObjectConstructParam *properties) { GObjectClass *gobject_class; GObject *obj; StScrollBar *bar; gobject_class = G_OBJECT_CLASS (st_scroll_bar_parent_class); obj = gobject_class->constructor (type, n_properties, properties); bar = ST_SCROLL_BAR (obj); g_signal_connect (bar, "notify::reactive", G_CALLBACK (bar_reactive_notify_cb), NULL); return obj; }
static void st_scroll_bar_set_property (GObject *gobject, guint prop_id, const GValue *value, GParamSpec *pspec) { StScrollBar *bar = ST_SCROLL_BAR (gobject); switch (prop_id) { case PROP_ADJUSTMENT: st_scroll_bar_set_adjustment (bar, g_value_get_object (value)); break; case PROP_VERTICAL: bar->priv->vertical = g_value_get_boolean (value); if (bar->priv->vertical) { clutter_actor_set_name (CLUTTER_ACTOR (bar->priv->bw_stepper), "up-stepper"); clutter_actor_set_name (CLUTTER_ACTOR (bar->priv->fw_stepper), "down-stepper"); clutter_actor_set_name (CLUTTER_ACTOR (bar->priv->handle), "vhandle"); } else { clutter_actor_set_name (CLUTTER_ACTOR (bar->priv->fw_stepper), "forward-stepper"); clutter_actor_set_name (CLUTTER_ACTOR (bar->priv->bw_stepper), "backward-stepper"); clutter_actor_set_name (CLUTTER_ACTOR (bar->priv->handle), "hhandle"); } clutter_actor_queue_relayout ((ClutterActor*) gobject); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); break; } }
static void st_scroll_view_fade_set_actor (ClutterActorMeta *meta, ClutterActor *actor) { StScrollViewFade *self = ST_SCROLL_VIEW_FADE (meta); ClutterActorMetaClass *parent; g_return_if_fail (actor == NULL || ST_IS_SCROLL_VIEW (actor)); if (self->shader == COGL_INVALID_HANDLE) { clutter_actor_meta_set_enabled (meta, FALSE); return; } if (self->vadjustment) { g_signal_handlers_disconnect_by_func (self->vadjustment, (gpointer)on_vadjustment_changed, self); self->vadjustment = NULL; } if (actor) { StScrollView *scroll_view = ST_SCROLL_VIEW (actor); StScrollBar *vscroll = ST_SCROLL_BAR (st_scroll_view_get_vscroll_bar (scroll_view)); self->vadjustment = ST_ADJUSTMENT (st_scroll_bar_get_adjustment (vscroll)); g_signal_connect (self->vadjustment, "changed", G_CALLBACK (on_vadjustment_changed), self); on_vadjustment_changed (self->vadjustment, CLUTTER_EFFECT (self)); } parent = CLUTTER_ACTOR_META_CLASS (st_scroll_view_fade_parent_class); parent->set_actor (meta, actor); /* we keep a back pointer here, to avoid going through the ActorMeta */ self->actor = clutter_actor_meta_get_actor (meta); }
static gboolean st_scroll_bar_scroll_event (ClutterActor *actor, ClutterScrollEvent *event) { StScrollBarPrivate *priv = ST_SCROLL_BAR (actor)->priv; gdouble lower, step, upper, value; if (priv->adjustment) { g_object_get (priv->adjustment, "lower", &lower, "step-increment", &step, "upper", &upper, "value", &value, NULL); } else { return FALSE; } switch (event->direction) { case CLUTTER_SCROLL_UP: case CLUTTER_SCROLL_LEFT: if (value == lower) return FALSE; else st_adjustment_set_value (priv->adjustment, value - step); break; case CLUTTER_SCROLL_DOWN: case CLUTTER_SCROLL_RIGHT: if (value == upper) return FALSE; else st_adjustment_set_value (priv->adjustment, value + step); break; } return TRUE; }
static gboolean st_scroll_bar_scroll_event (ClutterActor *actor, ClutterScrollEvent *event) { StScrollBarPrivate *priv = ST_SCROLL_BAR (actor)->priv; gdouble step, value, delta_x, delta_y; if (priv->adjustment) { g_object_get (priv->adjustment, "step-increment", &step, "value", &value, NULL); } else { return FALSE; } switch (event->direction) { case CLUTTER_SCROLL_SMOOTH: clutter_event_get_scroll_delta ((ClutterEvent *)event, &delta_x, &delta_y); if (fabs (delta_x) > fabs(delta_y)) st_adjustment_set_value (priv->adjustment, value + delta_x); else st_adjustment_set_value (priv->adjustment, value + delta_y); break; case CLUTTER_SCROLL_UP: case CLUTTER_SCROLL_LEFT: st_adjustment_set_value (priv->adjustment, value - step); break; case CLUTTER_SCROLL_DOWN: case CLUTTER_SCROLL_RIGHT: st_adjustment_set_value (priv->adjustment, value + step); break; } return TRUE; }
static void st_scroll_bar_get_preferred_height (ClutterActor *self, gfloat for_width, gfloat *min_height_p, gfloat *natural_height_p) { StScrollBar *bar = ST_SCROLL_BAR (self); StScrollBarPrivate *priv = bar->priv; StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (self)); gfloat trough_min_height, trough_natural_height; gfloat handle_min_height, handle_natural_height; st_theme_node_adjust_for_width (theme_node, &for_width); _st_actor_get_preferred_height (priv->trough, for_width, TRUE, &trough_min_height, &trough_natural_height); _st_actor_get_preferred_height (priv->handle, for_width, TRUE, &handle_min_height, &handle_natural_height); if (priv->vertical) { if (min_height_p) *min_height_p = trough_min_height + handle_min_height; if (natural_height_p) *natural_height_p = trough_natural_height + handle_natural_height; } else { if (min_height_p) *min_height_p = MAX (trough_min_height, handle_min_height); if (natural_height_p) *natural_height_p = MAX (trough_natural_height, handle_natural_height); } st_theme_node_adjust_preferred_height (theme_node, min_height_p, natural_height_p); }
static void st_scroll_bar_dispose (GObject *gobject) { StScrollBar *bar = ST_SCROLL_BAR (gobject); StScrollBarPrivate *priv = bar->priv; if (priv->adjustment) st_scroll_bar_set_adjustment (bar, NULL); if (priv->handle) { g_signal_handlers_disconnect_by_func (priv->handle, G_CALLBACK (handle_button_press_event_cb), bar); clutter_actor_unparent (priv->handle); priv->handle = NULL; } if (priv->bw_stepper) { clutter_actor_unparent (priv->bw_stepper); priv->bw_stepper = NULL; } if (priv->fw_stepper) { clutter_actor_unparent (priv->fw_stepper); priv->fw_stepper = NULL; } if (priv->trough) { clutter_actor_unparent (priv->trough); priv->trough = NULL; } G_OBJECT_CLASS (st_scroll_bar_parent_class)->dispose (gobject); }
static void st_scroll_bar_get_property (GObject *gobject, guint prop_id, GValue *value, GParamSpec *pspec) { StScrollBarPrivate *priv = ST_SCROLL_BAR (gobject)->priv; switch (prop_id) { case PROP_ADJUSTMENT: g_value_set_object (value, priv->adjustment); break; case PROP_VERTICAL: g_value_set_boolean (value, priv->vertical); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); break; } }
static void st_scroll_bar_dispose (GObject *gobject) { StScrollBar *bar = ST_SCROLL_BAR (gobject); StScrollBarPrivate *priv = bar->priv; if (priv->adjustment) st_scroll_bar_set_adjustment (bar, NULL); if (priv->handle) { clutter_actor_destroy (priv->handle); priv->handle = NULL; } if (priv->trough) { clutter_actor_destroy (priv->trough); priv->trough = NULL; } G_OBJECT_CLASS (st_scroll_bar_parent_class)->dispose (gobject); }