static void move_handle (MxSlider *bar, gfloat x, gfloat y) { MxSliderPrivate *priv = bar->priv; gdouble value; gfloat ux, pos, fill_size; if (!clutter_actor_transform_stage_point (CLUTTER_ACTOR (bar), x, y, &ux, NULL)) { return; } priv->x_origin = priv->handle_width / 2 + clutter_actor_get_x (priv->trough); fill_size = priv->handle_middle_end - priv->handle_middle_start; pos = ux - priv->handle_middle_start; pos = CLAMP (pos, 0, fill_size); value = pos / fill_size; mx_slider_set_value (bar, value); }
static void add_float_prop_base (ClutterActor *table, const char *name, FloatProp *prop, float value) { int table_y = mx_table_get_row_count (MX_TABLE (table)); ClutterActor *label; ClutterActor *slider; label = mx_label_new_with_text (name); mx_table_add_actor (MX_TABLE (table), label, table_y, 0); slider = mx_slider_new (); mx_table_add_actor (MX_TABLE (table), slider, table_y, 1); prop->label = mx_label_new (); mx_table_add_actor (MX_TABLE (table), prop->label, table_y, 2); mx_slider_set_value (MX_SLIDER (slider), (value - prop->min) / (prop->max - prop->min)); update_float_prop_label (prop, value); g_signal_connect_data (slider, "notify::value", G_CALLBACK (float_prop_value_cb), prop, (GClosureNotify) float_prop_free, 0); }
static void drag_handle (MxSlider *bar, gfloat x, gfloat y) { MxSliderPrivate *priv = bar->priv; gdouble value; gfloat ux, pos, handle_width_2, fill_size, offset; if (!clutter_actor_transform_stage_point (CLUTTER_ACTOR (bar), x, y, &ux, NULL)) { return; } fill_size = priv->handle_middle_end - priv->handle_middle_start; /* offset is the difference between the middle of the handle and where one * clicked on it */ handle_width_2 = clutter_actor_get_width (priv->handle) / 2; offset = handle_width_2 - priv->x_origin; pos = ux - priv->handle_middle_start + offset; pos = CLAMP (pos, 0, fill_size); value = pos / fill_size; mx_slider_set_value (bar, value); /* update the handle position */ mx_slider_allocate_fill_handle (bar, NULL, 0); clutter_actor_queue_redraw (CLUTTER_ACTOR (bar)); }
static void add_color_prop_base (ClutterActor *table, const char *name, ColorProp *prop, const ClutterColor *value) { int table_y = mx_table_get_row_count (MX_TABLE (table)); ClutterActor *label; static const char *color_names[] = { "red", "green", "blue" }; int i; label = mx_label_new_with_text (name); mx_table_add_actor (MX_TABLE (table), label, table_y, 0); prop->rect = clutter_rectangle_new (); clutter_rectangle_set_color (CLUTTER_RECTANGLE (prop->rect), value); clutter_actor_set_size (prop->rect, 20, 0); mx_table_add_actor (MX_TABLE (table), prop->rect, table_y++, 1); for (i = 0; i < G_N_ELEMENTS (color_names); i++) { ClutterActor *slider; char *label_name = g_strconcat (name, " ", color_names[i], NULL); ColorPropComp *prop_comp = g_slice_new (ColorPropComp); label = mx_label_new_with_text (label_name); mx_table_add_actor (MX_TABLE (table), label, table_y, 0); g_free (label_name); slider = mx_slider_new (); mx_table_add_actor (MX_TABLE (table), slider, table_y, 1); mx_slider_set_value (MX_SLIDER (slider), ((guint8 *) value)[i] / 255.0f); prop_comp->comp_num = i; prop_comp->prop = prop; prop_comp->label = mx_label_new (); mx_table_add_actor (MX_TABLE (table), prop_comp->label, table_y, 2); update_prop_comp_label (prop_comp, ((guint8 *) value)[i]); g_signal_connect_data (slider, "notify::value", G_CALLBACK (color_prop_value_cb), prop_comp, (GClosureNotify) color_prop_comp_free, 0); table_y++; } }
static gboolean mx_slider_key_press_event (ClutterActor *actor, ClutterKeyEvent *event) { gdouble value; value = mx_slider_get_value (MX_SLIDER (actor)); switch (event->keyval) { case CLUTTER_Left : mx_slider_set_value (MX_SLIDER (actor), MAX (value - 0.1, 0)); return TRUE; case CLUTTER_Right : mx_slider_set_value (MX_SLIDER (actor), MIN (value + 0.1, 1)); return TRUE; default: break; } return FALSE; }
static void mex_media_controls_notify_progress_cb (ClutterMedia *media, GParamSpec *pspec, MexMediaControls *self) { MexMediaControlsPrivate *priv = self->priv; MxLabel *label; gchar *text; gdouble length, progress_s; gfloat progress; gint len_h, len_m, len_s, pos_h, pos_m, pos_s; if (priv->show_description) return; progress = clutter_media_get_progress (media); length = clutter_media_get_duration (media); len_h = length / 3600; len_m = (length - (len_h * 3600)) / 60; len_s = (length - (len_h * 3600) - (len_m * 60)); progress_s = length * progress; pos_h = progress_s / 3600; pos_m = (progress_s - (pos_h * 3600)) / 60; pos_s = (progress_s - (pos_h * 3600) - (pos_m * 60)); g_signal_handlers_block_by_func (priv->slider, slider_value_changed_cb, self); mx_slider_set_value (MX_SLIDER (priv->slider), progress); g_signal_handlers_unblock_by_func (priv->slider, slider_value_changed_cb, self); if (len_h > 0) text = g_strdup_printf ("%02d:%02d:%02d / %02d:%02d:%02d", pos_h, pos_m, pos_s, len_h, len_m, len_s); else text = g_strdup_printf ("%02d:%02d / %02d:%02d", pos_m, pos_s, len_m, len_s); label = (MxLabel*) clutter_script_get_object (priv->script, "progress-label"); mx_label_set_text (label, text); g_free (text); }
static void update_volume_slider (MpdVolumeTile *self) { MpdVolumeTilePrivate *priv = GET_PRIVATE (self); double volume; double value; g_signal_handlers_disconnect_by_func (priv->volume_slider, _volume_slider_value_notify_cb, self); volume = gvc_mixer_stream_get_volume (priv->sink); value = volume / PA_VOLUME_NORM; mx_slider_set_value (MX_SLIDER (priv->volume_slider), value); g_signal_connect (priv->volume_slider, "notify::value", G_CALLBACK (_volume_slider_value_notify_cb), self); }
static void mex_music_player_update_progress (MexMusicPlayer *player) { MexMusicPlayerPrivate *priv = player->priv; ClutterActor *label, *slider; gchar *text; gdouble progress, duration; progress = clutter_media_get_progress (priv->player); duration = clutter_media_get_duration (priv->player); label = mex_script_get_actor (priv->script, "progress-label"); slider = mex_script_get_actor (priv->script, "progress-slider"); g_signal_handler_block (slider, priv->slider_notify_id); mx_slider_set_value (MX_SLIDER (slider), progress); g_signal_handler_unblock (slider, priv->slider_notify_id); text = mex_metadata_utils_create_progress_string (progress, duration); mx_label_set_text (MX_LABEL (label), text); g_free (text); }
static void mx_slider_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { MxSlider *self = MX_SLIDER (object); switch (property_id) { case PROP_VALUE: mx_slider_set_value (self, g_value_get_double (value)); break; case PROP_BUFFER_VALUE: mx_slider_set_buffer_value (self, g_value_get_double (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } }