Enlightenment CVS committal Author : moom Project : e17 Module : libs/etk
Dir : e17/libs/etk/src/lib Modified Files: etk_colorpicker.c etk_colorpicker.h etk_range.c etk_range.h etk_spinner.c Log Message: * [Colorpicker] Apply Dave's patch to add a alpha slider to the colorpicker: you can use etk_colorpicker_use_alpha_set/get() to set whether or not it should be visible. * [Range] etk_range_value_set() now returns ETK_TRUE if the value has actually been changed, ETK_FALSE otherwise =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_colorpicker.c,v retrieving revision 1.22 retrieving revision 1.23 diff -u -3 -r1.22 -r1.23 --- etk_colorpicker.c 6 Oct 2006 17:04:14 -0000 1.22 +++ etk_colorpicker.c 28 Jan 2007 17:46:04 -0000 1.23 @@ -32,7 +32,8 @@ enum Etk_Colorpicker_Property_Id { - ETK_CP_MODE_PROPERTY + ETK_CP_MODE_PROPERTY, + ETK_CP_USE_ALPHA_PROPERTY }; static void _etk_colorpicker_constructor(Etk_Colorpicker *cp); @@ -49,6 +50,7 @@ static void _etk_colorpicker_current_color_realize_cb(Etk_Object *object, void *data); static void _etk_colorpicker_current_color_unrealize_cb(Etk_Object *object, void *data); static void _etk_colorpicker_slider_value_changed_cb(Etk_Object *object, double value, void *data); +static void _etk_colorpicker_alpha_slider_value_changed_cb(Etk_Object *object, double value, void *data); static void _etk_colorpicker_radio_toggled_cb(Etk_Object *object, void *data); static void _etk_colorpicker_sp_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); @@ -85,6 +87,7 @@ static void _etk_colorpicker_vp_color_get(Etk_Colorpicker *cp, int i, int *r, int *g, int *b); static void _etk_colorpicker_color_calc(Etk_Colorpicker_Mode mode, float sp_xpos, float sp_ypos, float vp_pos, int *r, int *g, int *b); +static float _etk_colorpicker_max_values[6] = { 360.0, 1.0, 1.0, 255.0, 255.0, 255.0 }; static Evas_Smart *_etk_colorpicker_picker_smart = NULL; static int _etk_colorpicker_picker_smart_use = 0; static Etk_Signal *_etk_colorpicker_signals[ETK_CP_NUM_SIGNALS]; @@ -101,7 +104,7 @@ * @brief Gets the type of an Etk_Colorpicker * @return Returns the type of an Etk_Colorpicker */ -Etk_Type *etk_colorpicker_type_get() +Etk_Type *etk_colorpicker_type_get(void) { static Etk_Type *cp_type = NULL; @@ -115,6 +118,8 @@ etk_type_property_add(cp_type, "color_mode", ETK_CP_MODE_PROPERTY, ETK_PROPERTY_INT, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_int(ETK_COLORPICKER_H)); + etk_type_property_add(cp_type, "use_alpha", ETK_CP_USE_ALPHA_PROPERTY, + ETK_PROPERTY_BOOL, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_bool(ETK_FALSE)); cp_type->property_set = _etk_colorpicker_property_set; cp_type->property_get = _etk_colorpicker_property_get; @@ -127,7 +132,7 @@ * @brief Creates a new colorpicker * @return Returns the new colorpicker */ -Etk_Widget *etk_colorpicker_new() +Etk_Widget *etk_colorpicker_new(void) { return etk_widget_new(ETK_COLORPICKER_TYPE, "theme_group", "colorpicker", NULL); } @@ -180,11 +185,11 @@ { value = etk_range_value_get(ETK_RANGE(cp->sliders[i])); if (i == mode) - cp->vp_pos = value / cp->sliders_max_value[i]; + cp->vp_pos = value / _etk_colorpicker_max_values[i]; else if (i == cp->sp_xcomponent) - cp->sp_xpos = value / cp->sliders_max_value[i]; + cp->sp_xpos = value / _etk_colorpicker_max_values[i]; else if (i == cp->sp_ycomponent) - cp->sp_ypos = value / cp->sliders_max_value[i]; + cp->sp_ypos = value / _etk_colorpicker_max_values[i]; } _etk_colorpicker_update(cp, ETK_TRUE, ETK_TRUE, ETK_TRUE, ETK_TRUE); @@ -211,14 +216,20 @@ */ void etk_colorpicker_current_color_set(Etk_Colorpicker *cp, Etk_Color color) { - if (cp->current_color.r == color.r && cp->current_color.g == color.g && cp->current_color.b == color.b) + if (cp->current_color.r == color.r && cp->current_color.g == color.g + && cp->current_color.b == color.b && cp->current_color.a == color.a) + { return; + } + /* TODO: this may bug if the B component is not changed... */ + /* TODO: this may emit the signal twice... */ cp->ignore_value_changed = ETK_TRUE; etk_range_value_set(ETK_RANGE(cp->sliders[ETK_COLORPICKER_R]), color.r); etk_range_value_set(ETK_RANGE(cp->sliders[ETK_COLORPICKER_G]), color.g); cp->ignore_value_changed = ETK_FALSE; etk_range_value_set(ETK_RANGE(cp->sliders[ETK_COLORPICKER_B]), color.b); + etk_range_value_set(ETK_RANGE(cp->alpha_slider), color.a); } /** @@ -237,6 +248,47 @@ return cp->current_color; } +/** + * @brief Sets whether or not the colorpicker has a slider that allows the user to choose the alpha + * component of the color + * @param cp a colorpicher + * @param use_alpha ETK_TRUE to make the colorpicker have an alpha slider, ETK_FALSE otherwise + */ +void etk_colorpicker_use_alpha_set(Etk_Colorpicker *cp, Etk_Bool use_alpha) +{ + if (!cp || cp->use_alpha == use_alpha) + return; + + cp->use_alpha = use_alpha; + if (cp->use_alpha) + { + etk_widget_show(cp->alpha_slider); + etk_widget_show(cp->alpha_name_label); + etk_widget_show(cp->alpha_value_label); + etk_range_value_set(ETK_RANGE(cp->alpha_slider), cp->current_color.a); + } + else + { + etk_widget_hide(cp->alpha_slider); + etk_widget_hide(cp->alpha_name_label); + etk_widget_hide(cp->alpha_value_label); + cp->current_color.a = 255; + } + etk_object_notify(ETK_OBJECT(cp), "use_alpha"); +} + +/** + * @brief Gets whether the colorpicker has an alpha slider + * @param cp a colorpicher + * @return Returns ETK_TRUE if the colorpicker has an alpha slider, ETK_FALSE otherwise + */ +Etk_Bool etk_colorpicker_use_alpha_get(Etk_Colorpicker *cp) +{ + if (!cp) + return ETK_FALSE; + return cp->use_alpha; +} + /************************** * * Etk specific functions @@ -248,7 +300,6 @@ { Etk_Widget *cp_widget; char *labels[6] = { _("H"), _("S"), _("V"), _("R"), _("G"), _("B") }; - float values[6] = { 360.0, 1.0, 1.0, 255.0, 255.0, 255.0 }; float steps[6] = { 1.0, 0.01, 0.01, 1.0, 1.0, 1.0 }; int i; @@ -256,6 +307,7 @@ return; cp->mode = ETK_COLORPICKER_H; + cp->use_alpha = ETK_FALSE; cp->sp_xcomponent = ETK_COLORPICKER_V; cp->sp_ycomponent = ETK_COLORPICKER_S; @@ -303,7 +355,7 @@ etk_widget_internal_set(cp->picker_widget, ETK_TRUE); etk_widget_show(cp->picker_widget); - cp->component_table = etk_table_new(3, 6, ETK_FALSE); + cp->component_table = etk_table_new(3, 7, ETK_FALSE); etk_table_attach_default(ETK_TABLE(cp->main_table), cp->component_table, 1, 1, 0, 0); etk_widget_internal_set(cp->component_table, ETK_TRUE); etk_widget_show(cp->component_table); @@ -320,20 +372,20 @@ etk_widget_internal_set(cp->radios[i], ETK_TRUE); etk_widget_show(cp->radios[i]); - cp->sliders[i] = etk_hslider_new(0.0, values[i], 0.0, steps[i], steps[i] * 5); + cp->sliders[i] = etk_hslider_new(0.0, _etk_colorpicker_max_values[i], 0.0, steps[i], steps[i] * 5); etk_table_attach(ETK_TABLE(cp->component_table), cp->sliders[i], 1, 1, i, i, 0, 0, ETK_TABLE_HFILL | ETK_TABLE_EXPAND); etk_widget_theme_parent_set(cp->sliders[i], ETK_WIDGET(cp)); etk_widget_internal_set(cp->sliders[i], ETK_TRUE); etk_widget_show(cp->sliders[i]); - cp->sliders_max_value[i] = values[i]; cp->sliders_image[i] = NULL; cp->value_labels[i] = etk_label_new("0"); etk_table_attach(ETK_TABLE(cp->component_table), cp->value_labels[i], 2, 2, i, i, 0, 0, ETK_TABLE_HFILL | ETK_TABLE_VEXPAND); etk_widget_internal_set(cp->value_labels[i], ETK_TRUE); + /* TODO: this sucks.. the width shouldn't be hardcoded.. */ etk_widget_size_request_set(cp->value_labels[i], 28, -1); etk_widget_show(cp->value_labels[i]); @@ -347,8 +399,32 @@ ETK_CALLBACK(_etk_colorpicker_slider_value_changed_cb), cp); } + /* Alpha slider */ + { + cp->alpha_name_label = etk_label_new(_("Alpha")); + etk_table_attach(ETK_TABLE(cp->component_table), cp->alpha_name_label, 0, 0, 6, 6, + 0, 0, ETK_TABLE_HFILL | ETK_TABLE_VEXPAND); + etk_widget_internal_set(cp->alpha_name_label, ETK_TRUE); + + cp->alpha_slider = etk_hslider_new(0.0, 255.0, 255.0, 10, 5.0); + etk_table_attach(ETK_TABLE(cp->component_table), cp->alpha_slider, 1, 1, 6, 6, + 0, 0, ETK_TABLE_HFILL | ETK_TABLE_EXPAND); + etk_widget_internal_set(cp->alpha_slider, ETK_TRUE); + + cp->alpha_value_label = etk_label_new("255"); + etk_table_attach(ETK_TABLE(cp->component_table), cp->alpha_value_label, 2, 2, 6, 6, + 0, 0, ETK_TABLE_HFILL | ETK_TABLE_VEXPAND); + etk_widget_internal_set(cp->alpha_value_label, ETK_TRUE); + /* TODO: this sucks.. the width shouldn't be hardcoded.. */ + etk_widget_size_request_set(cp->alpha_value_label, 28, -1); + + etk_signal_connect("value_changed", ETK_OBJECT(cp->alpha_slider), + ETK_CALLBACK(_etk_colorpicker_alpha_slider_value_changed_cb), cp); + } + /* We create the widgets for the color preview */ cp->color_table = etk_table_new(2, 1, ETK_FALSE); + etk_widget_padding_set(cp->color_table, 3, 3, 3, 3); etk_table_attach(ETK_TABLE(cp->main_table), cp->color_table, 0, 0, 1, 1, 0, 0, ETK_TABLE_FILL | ETK_TABLE_HEXPAND); etk_widget_internal_set(cp->color_table, ETK_TRUE); @@ -616,6 +692,7 @@ static void _etk_colorpicker_current_color_realize_cb(Etk_Object *object, void *data) { Etk_Colorpicker *cp; + Etk_Color color; Evas *evas; if (!(cp = ETK_COLORPICKER(data)) || !(evas = etk_widget_toplevel_evas_get(ETK_WIDGET(cp)))) @@ -625,8 +702,9 @@ etk_widget_swallow_object(cp->current_color_widget, "preview_rect", cp->current_color_rect); evas_object_show(cp->current_color_rect); - evas_object_color_set(cp->current_color_rect, cp->current_color.r, - cp->current_color.g, cp->current_color.b, 255); + color = cp->current_color; + evas_color_argb_premul(color.a, &color.r, &color.g, &color.b); + evas_object_color_set(cp->current_color_rect, color.r, color.g, color.b, color.a); } /* Called when the current color widget of the colorpicker is unrealized */ @@ -662,11 +740,11 @@ { /* First, we update the position of the cursors */ if (i == cp->mode) - cp->vp_pos = value / cp->sliders_max_value[i]; + cp->vp_pos = value / _etk_colorpicker_max_values[i]; else if (i == cp->sp_xcomponent) - cp->sp_xpos = value / cp->sliders_max_value[i]; + cp->sp_xpos = value / _etk_colorpicker_max_values[i]; else if (i == cp->sp_ycomponent) - cp->sp_ypos = value / cp->sliders_max_value[i]; + cp->sp_ypos = value / _etk_colorpicker_max_values[i]; /* We update the corresponding label */ if (i == ETK_COLORPICKER_S || i == ETK_COLORPICKER_V) @@ -742,7 +820,8 @@ cp->current_color.r = color.r; cp->current_color.g = color.g; cp->current_color.b = color.b; - evas_object_color_set(cp->current_color_rect, color.r, color.g, color.b, 255); + evas_color_argb_premul(cp->current_color.a, &color.r, &color.g, &color.b); + evas_object_color_set(cp->current_color_rect, color.r, color.g, color.b, cp->current_color.a); if (cp->emit_signal) etk_signal_emit(_etk_colorpicker_signals[ETK_CP_COLOR_CHANGED_SIGNAL], ETK_OBJECT(cp), NULL); } @@ -756,6 +835,36 @@ } } +/* Called when the alpha slider's value is changed */ +static void _etk_colorpicker_alpha_slider_value_changed_cb(Etk_Object *object, double value, void *data) +{ + Etk_Colorpicker *cp; + Etk_Widget *slider; + Etk_Color color; + char string[10]; + + if (!(slider = ETK_WIDGET(object)) || !(cp = ETK_COLORPICKER(data))) + return; + + snprintf(string, 10, "%d", (int)(value)); + etk_label_set(ETK_LABEL(cp->alpha_value_label), string); + + /* TODO: do we really need that?? */ + if (cp->ignore_value_changed) + return; + + color.r = cp->current_color.r; + color.g = cp->current_color.g; + color.b = cp->current_color.b; + + cp->current_color.a = value; + evas_color_argb_premul(cp->current_color.a, &color.r, &color.g, &color.b); + evas_object_color_set(cp->current_color_rect, color.r, color.g, color.b, cp->current_color.a); + + if (cp->emit_signal) + etk_signal_emit(_etk_colorpicker_signals[ETK_CP_COLOR_CHANGED_SIGNAL], ETK_OBJECT(cp), NULL); +} + /* Called when the color mode is changed with the radio buttons */ static void _etk_colorpicker_radio_toggled_cb(Etk_Object *object, void *data) { @@ -839,7 +948,7 @@ evas_object_geometry_get(cp->vp_image, NULL, &y, NULL, &h); percent = 1.0 - ETK_CLAMP((float)(event->canvas.y - y) / h, 0.0, 1.0); - etk_range_value_set(ETK_RANGE(cp->sliders[cp->mode]), percent * cp->sliders_max_value[cp->mode]); + etk_range_value_set(ETK_RANGE(cp->sliders[cp->mode]), percent * _etk_colorpicker_max_values[cp->mode]); cp->vp_dragging = ETK_TRUE; } @@ -867,7 +976,7 @@ evas_object_geometry_get(cp->vp_image, NULL, &y, NULL, &h); percent = 1.0 - ETK_CLAMP((float)(event->cur.canvas.y - y) / h, 0.0, 1.0); - etk_range_value_set(ETK_RANGE(cp->sliders[cp->mode]), percent * cp->sliders_max_value[cp->mode]); + etk_range_value_set(ETK_RANGE(cp->sliders[cp->mode]), percent * _etk_colorpicker_max_values[cp->mode]); } /* Called when the image of a slider of the colorpicker is resized */ @@ -1110,9 +1219,11 @@ return; cp->emit_signal = ETK_FALSE; - etk_range_value_set(ETK_RANGE(cp->sliders[cp->sp_xcomponent]), xpercent * cp->sliders_max_value[cp->sp_xcomponent]); + etk_range_value_set(ETK_RANGE(cp->sliders[cp->sp_xcomponent]), + xpercent * _etk_colorpicker_max_values[cp->sp_xcomponent]); cp->emit_signal = ETK_TRUE; - etk_range_value_set(ETK_RANGE(cp->sliders[cp->sp_ycomponent]), ypercent * cp->sliders_max_value[cp->sp_ycomponent]); + etk_range_value_set(ETK_RANGE(cp->sliders[cp->sp_ycomponent]), + ypercent * _etk_colorpicker_max_values[cp->sp_ycomponent]); } /* Updates of the colorpicker */ @@ -1364,3 +1475,5 @@ } /** @} */ + +/* TODOC: write documentation... */ =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_colorpicker.h,v retrieving revision 1.11 retrieving revision 1.12 diff -u -3 -r1.11 -r1.12 --- etk_colorpicker.h 6 Oct 2006 17:04:14 -0000 1.11 +++ etk_colorpicker.h 28 Jan 2007 17:46:04 -0000 1.12 @@ -69,7 +69,6 @@ /* Sliders */ Etk_Widget *sliders[6]; Evas_Object *sliders_image[6]; - float sliders_max_value[6]; int sliders_res; Etk_Bool sliders_need_update; @@ -78,6 +77,11 @@ Etk_Widget *radios[6]; Etk_Widget *value_labels[6]; + /* Alpha slider */ + Etk_Widget *alpha_slider; + Etk_Widget *alpha_name_label; + Etk_Widget *alpha_value_label; + /* Current color objects */ Etk_Widget *color_table; Etk_Widget *current_color_label; @@ -87,18 +91,20 @@ Etk_Bool ignore_value_changed; Etk_Bool emit_signal; + Etk_Bool use_alpha; Etk_Colorpicker_Mode mode; Etk_Color current_color; }; -Etk_Type *etk_colorpicker_type_get(); -Etk_Widget *etk_colorpicker_new(); +Etk_Type *etk_colorpicker_type_get(void); +Etk_Widget *etk_colorpicker_new(void); void etk_colorpicker_mode_set(Etk_Colorpicker *cp, Etk_Colorpicker_Mode mode); Etk_Colorpicker_Mode etk_colorpicker_mode_get(Etk_Colorpicker *cp); - -void etk_colorpicker_current_color_set(Etk_Colorpicker *cp, Etk_Color color); -Etk_Color etk_colorpicker_current_color_get(Etk_Colorpicker *cp); +void etk_colorpicker_current_color_set(Etk_Colorpicker *cp, Etk_Color color); +Etk_Color etk_colorpicker_current_color_get(Etk_Colorpicker *cp); +void etk_colorpicker_use_alpha_set(Etk_Colorpicker *cp, Etk_Bool use_alpha); +Etk_Bool etk_colorpicker_use_alpha_get(Etk_Colorpicker *cp); /** @} */ =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_range.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -3 -r1.16 -r1.17 --- etk_range.c 6 Oct 2006 17:04:14 -0000 1.16 +++ etk_range.c 28 Jan 2007 17:46:04 -0000 1.17 @@ -44,7 +44,7 @@ * @brief Gets the type of an Etk_Range * @return Returns the type of an Etk_Range */ -Etk_Type *etk_range_type_get() +Etk_Type *etk_range_type_get(void) { static Etk_Type *range_type = NULL; @@ -80,13 +80,15 @@ * @brief Sets the value of the range * @param range a range * @param value the value to set to the range + * @return Returns ETK_TRUE if the value has actually been changed, ETK_FALSE otherwise (because + * the current value is equal to the new value) */ -void etk_range_value_set(Etk_Range *range, double value) +Etk_Bool etk_range_value_set(Etk_Range *range, double value) { double new_value; if (!range) - return; + return ETK_FALSE; new_value = ETK_CLAMP(value, range->lower, range->upper - range->page_size); if (new_value != range->value) @@ -94,7 +96,10 @@ range->value = new_value; etk_signal_emit(_etk_range_signals[ETK_RANGE_VALUE_CHANGED_SIGNAL], ETK_OBJECT(range), NULL, range->value); etk_object_notify(ETK_OBJECT(range), "value"); + return ETK_TRUE; } + + return ETK_FALSE; } /** =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_range.h,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- etk_range.h 2 Jun 2006 18:46:34 -0000 1.9 +++ etk_range.h 28 Jan 2007 17:46:04 -0000 1.10 @@ -39,10 +39,10 @@ void (*value_changed)(Etk_Range *range, double value); }; -Etk_Type *etk_range_type_get(); +Etk_Type *etk_range_type_get(void); -void etk_range_value_set(Etk_Range *range, double value); -double etk_range_value_get(Etk_Range *range); +Etk_Bool etk_range_value_set(Etk_Range *range, double value); +double etk_range_value_get(Etk_Range *range); void etk_range_range_set(Etk_Range *range, double lower, double upper); void etk_range_range_get(Etk_Range *range, double *lower, double *upper); =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_spinner.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- etk_spinner.c 26 Dec 2006 14:51:23 -0000 1.4 +++ etk_spinner.c 28 Jan 2007 17:46:04 -0000 1.5 @@ -819,9 +819,7 @@ if (spinner->snap_to_ticks) value = _etk_spinner_value_snap(spinner, value); - if (etk_range_value_get(ETK_RANGE(spinner)) != value) - etk_range_value_set(ETK_RANGE(spinner), value); - else + if (!etk_range_value_set(ETK_RANGE(spinner), value)) _etk_spinner_update_text_from_value(spinner); } ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs