static void expander_box_open_notify (MexExpanderBox *box, GParamSpec *pspec, MexColumn *column) { MexColumnPrivate *priv = MEX_COLUMN (column)->priv; GList *l; MexShadow *shadow; ClutterColor shadow_color = { 0, 0, 0, 128 }; if (mex_expander_box_get_open (box)) { for (l = priv->children; l; l = l->next) { if (l->data != box) clutter_actor_animate (l->data, CLUTTER_EASE_IN_OUT_QUAD, 200, "opacity", 56, NULL); } clutter_actor_animate (priv->header, CLUTTER_EASE_IN_OUT_QUAD, 200, "opacity", 56, NULL); /* Restore the opened box to full opacity */ clutter_actor_animate (CLUTTER_ACTOR (box), CLUTTER_EASE_IN_OUT_QUAD, 200, "opacity", 255, NULL); shadow = mex_shadow_new (CLUTTER_ACTOR (box)); mex_shadow_set_paint_flags (shadow, MEX_TEXTURE_FRAME_TOP | MEX_TEXTURE_FRAME_BOTTOM); mex_shadow_set_radius_y (shadow, 25); mex_shadow_set_color (shadow, &shadow_color); g_object_set_qdata (G_OBJECT (box), _item_shadow_quark (), shadow); priv->open_boxes ++; } else { priv->open_boxes --; } if (priv->open_boxes == 0) { /* restore all children to full opacity */ for (l = priv->children; l; l = l->next) { clutter_actor_animate (l->data, CLUTTER_EASE_IN_OUT_QUAD, 200, "opacity", 255, NULL); } clutter_actor_animate (priv->header, CLUTTER_EASE_IN_OUT_QUAD, 200, "opacity", 255, NULL); shadow = g_object_get_qdata (G_OBJECT (box), _item_shadow_quark ()); if (shadow) { g_object_unref (shadow); g_object_set_qdata (G_OBJECT (box), _item_shadow_quark (), NULL); } } }
MexShadow * mex_telepathy_channel_create_shadow (void) { ClutterColor shadow_color = {0, 0, 0, 64}; MexShadow *shadow = mex_shadow_new (); mex_shadow_set_radius_x (shadow, 15); mex_shadow_set_radius_y (shadow, 15); mex_shadow_set_color (shadow, &shadow_color); return shadow; }
static MxFocusable * _accept_focus (MxFocusable *focusable, MxFocusHint hint) { MexActionButtonPrivate *priv = MEX_ACTION_BUTTON (focusable)->priv; MxFocusableIface *iface; ClutterColor shadow_color = {0, 0, 0, 64}; priv->has_focus = TRUE; priv->shadow = mex_shadow_new (CLUTTER_ACTOR (focusable)); mex_shadow_set_radius_x (priv->shadow, 15); mex_shadow_set_radius_y (priv->shadow, 15); mex_shadow_set_color (priv->shadow, &shadow_color); iface = g_type_interface_peek_parent (MX_FOCUSABLE_GET_INTERFACE (focusable)); return iface->accept_focus (focusable, hint); }
static void mex_action_button_init (MexActionButton *self) { ClutterColor shadow_color = {0, 0, 0, 64}; MexActionButtonPrivate *priv; priv = self->priv = ACTION_BUTTON_PRIVATE (self); mx_button_set_icon_position (MX_BUTTON (self), MX_POSITION_RIGHT); mx_bin_set_fill (MX_BIN (self), TRUE, TRUE); priv->shadow = mex_shadow_new (); mex_shadow_set_radius_x (priv->shadow, 15); mex_shadow_set_radius_y (priv->shadow, 15); mex_shadow_set_color (priv->shadow, &shadow_color); clutter_actor_meta_set_enabled (CLUTTER_ACTOR_META (priv->shadow), FALSE); clutter_actor_add_effect (CLUTTER_ACTOR (self), CLUTTER_EFFECT (priv->shadow)); }
/** * mex_column_add_content: * * Add an item to the column for the specified content at the specified * position. */ static void mex_column_add_content (MexColumn *column, MexContent *content, guint position) { MexColumnPrivate *priv = column->priv; ClutterActor *box; MexShadow *shadow; ClutterColor shadow_color = { 0, 0, 0, 128 }; GList *sibling; box = mex_content_box_new (); mex_content_view_set_content (MEX_CONTENT_VIEW (box), content); mex_content_view_set_context (MEX_CONTENT_VIEW (box), priv->model); sibling = g_list_nth (priv->children, position); priv->children = g_list_insert_before (priv->children, sibling, box); priv->n_items ++; /* add shadow */ shadow = mex_shadow_new (); mex_shadow_set_paint_flags (shadow, MEX_TEXTURE_FRAME_TOP | MEX_TEXTURE_FRAME_BOTTOM); mex_shadow_set_radius_y (shadow, 25); mex_shadow_set_color (shadow, &shadow_color); clutter_actor_add_effect_with_name (CLUTTER_ACTOR (box), "shadow", CLUTTER_EFFECT (shadow)); clutter_actor_meta_set_enabled (CLUTTER_ACTOR_META (shadow), FALSE); g_signal_connect (box, "notify::open", G_CALLBACK (content_box_open_notify), column); /* set important if the column has focus */ mex_content_box_set_important (MEX_CONTENT_BOX (box), priv->has_focus); clutter_actor_set_parent (box, CLUTTER_ACTOR (column)); }
static void mex_media_controls_init (MexMediaControls *self) { ClutterActor *actor; ClutterScript *script; GError *err = NULL; MxAdjustment *adjustment; ClutterActor *related_box; gchar *tmp; MexMediaControlsPrivate *priv = self->priv = MEDIA_CONTROLS_PRIVATE (self); priv->script = script = clutter_script_new (); tmp = g_build_filename (mex_get_data_dir (), "json", "media-controls.json", NULL); clutter_script_load_from_file (script, tmp, &err); g_free (tmp); if (err) g_error ("Could not load media controls interface: %s", err->message); priv->vbox = (ClutterActor*) clutter_script_get_object (script, "media-controls"); clutter_actor_set_parent (priv->vbox, CLUTTER_ACTOR (self)); /* add shadow to media controls box */ actor = (ClutterActor *) clutter_script_get_object (script, "media-controls-box"); clutter_actor_add_effect (actor, CLUTTER_EFFECT (mex_shadow_new ())); /* vertical fade effect */ priv->vertical_effect = mx_fade_effect_new (); clutter_actor_add_effect (priv->vbox, priv->vertical_effect); mx_scrollable_get_adjustments (MX_SCROLLABLE (mx_bin_get_child (MX_BIN (priv->vbox))), NULL, &adjustment); g_signal_connect (adjustment, "changed", G_CALLBACK (notify_vertical_changed_cb), self); g_signal_connect (adjustment, "notify::value", G_CALLBACK (notify_vertical_value_cb), self); /* horizontal fade effect */ priv->horizontal_effect = mx_fade_effect_new (); related_box = (ClutterActor *) clutter_script_get_object (priv->script, "related-box"); clutter_actor_add_effect (related_box, priv->horizontal_effect); mx_scrollable_get_adjustments (MX_SCROLLABLE (related_box), &adjustment, NULL); g_signal_connect (adjustment, "changed", G_CALLBACK (notify_horizontal_changed_cb), self); g_signal_connect (adjustment, "notify::value", G_CALLBACK (notify_horizontal_value_cb), self); /* slider setup */ priv->slider = (ClutterActor*) clutter_script_get_object (script, "slider"); g_signal_connect (priv->slider, "notify::value", G_CALLBACK (slider_value_changed_cb), self); g_signal_connect (priv->slider, "captured-event", G_CALLBACK (slider_captured_event), self); priv->play_pause_action = (MxAction*) clutter_script_get_object (script, "play-pause-action"); priv->stop_action = (MxAction*) clutter_script_get_object (script, "stop-action"); priv->add_to_queue_action = (MxAction*) clutter_script_get_object (script, "add-to-queue-action"); priv->queue_button = (ClutterActor *) clutter_script_get_object (script, "add-to-queue-button"); g_signal_connect (priv->play_pause_action, "activated", G_CALLBACK (mex_media_controls_play_cb), self); g_signal_connect (priv->stop_action, "activated", G_CALLBACK (mex_media_controls_stop_cb), self); #if 0 g_signal_connect (priv->add_to_queue_action, "activated", G_CALLBACK (mex_media_controls_add_to_queue_cb), self); #endif /* proxy setup */ priv->proxy_model = MEX_VIEW_MODEL (mex_view_model_new (NULL)); /* FIXME: Set an arbitrary 200-item limit as we can't handle large * amounts of actors without massive slow-down. */ mex_view_model_set_limit (priv->proxy_model, 200); priv->proxy = mex_content_proxy_new (MEX_MODEL (priv->proxy_model), CLUTTER_CONTAINER (related_box), MEX_TYPE_CONTENT_TILE); g_signal_connect (priv->proxy, "object-created", G_CALLBACK (tile_created_cb), self); priv->is_disabled = TRUE; }