Enlightenment CVS committal Author : moom Project : e17 Module : libs/etk
Dir : e17/libs/etk/src/lib Modified Files: etk_property.c etk_slider.c etk_slider.h Log Message: * [Slider] You can now change the update-policy of a slider with etk_slider_update_policy_set() =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_property.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- etk_property.c 2 Jun 2006 18:46:34 -0000 1.8 +++ etk_property.c 21 Feb 2007 18:27:03 -0000 1.9 @@ -672,8 +672,8 @@ * * Most of the following functions are used internally by Etk, you usually do not have to directly call any of the * etk_property_*() functions. @n - * If you want to create a property for a new object type, use etk_type_property_add() instead. @n - * The only case where you have to use the etk_property_value_*_set/get() functions in in the property_set/get() + * If you want to create a property for a new object type, use etk_type_property_add(). @n + * The only case where you have to use the etk_property_value_*_set/get() functions is in the property_set/get() * methods when you are implementing a new widget, to set or to get the value of a property. @n * * See Etk_Object for more information about how to use the property system. =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_slider.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -3 -r1.16 -r1.17 --- etk_slider.c 21 Feb 2007 05:19:17 -0000 1.16 +++ etk_slider.c 21 Feb 2007 18:27:03 -0000 1.17 @@ -13,10 +13,13 @@ * @{ */ +#define UPDATE_DELAY 0.3 + enum Etk_Slider_Property_Id { ETK_SLIDER_LABEL_FORMAT_PROPERTY, - ETK_SLIDER_INVERTED_PROPERTY + ETK_SLIDER_INVERTED_PROPERTY, + ETK_SLIDER_UPDATE_POLICY_PROPERTY }; static void _etk_slider_constructor(Etk_Slider *slider); @@ -30,6 +33,8 @@ static void _etk_slider_cursor_dragged_cb(void *data, Evas_Object *obj, const char *emission, const char *source); static void _etk_slider_value_changed_handler(Etk_Range *range, double value); static void _etk_slider_range_changed_cb(Etk_Object *object, const char *property_name, void *data); +static int _etk_slider_update_timer_cb(void *data); +static double _etk_slider_value_get_from_edje(Etk_Slider *slider); static void _etk_slider_label_update(Etk_Slider *slider); /************************** @@ -56,6 +61,8 @@ ETK_PROPERTY_STRING, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_string(NULL)); etk_type_property_add(slider_type, "inverted", ETK_SLIDER_INVERTED_PROPERTY, ETK_PROPERTY_BOOL, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_bool(ETK_FALSE)); + etk_type_property_add(slider_type, "update_policy", ETK_SLIDER_UPDATE_POLICY_PROPERTY, + ETK_PROPERTY_INT, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_int(ETK_SLIDER_CONTINUOUS)); slider_type->property_set = _etk_slider_property_set; slider_type->property_get = _etk_slider_property_get; @@ -197,6 +204,37 @@ return slider->inverted; } +/** + * @brief Sets the update-policy of the slider + * @param slider + * @param policy the update-policy to set to the timer + */ +void etk_slider_update_policy_set(Etk_Slider *slider, Etk_Slider_Update_Policy policy) +{ + if (!slider || slider->policy == policy) + return; + + slider->policy = policy; + if (slider->update_timer) + { + ecore_timer_del(slider->update_timer); + slider->update_timer = NULL; + } + etk_object_notify(ETK_OBJECT(slider), "update_policy"); +} + +/** + * @brief Gets the update-policy of the slider + * @param slider a slider + * @return Returns the update-policy of the slider + */ +Etk_Slider_Update_Policy etk_slider_update_policy_get(Etk_Slider *slider) +{ + if (!slider) + return ETK_SLIDER_CONTINUOUS; + return slider->policy; +} + /************************** * * Etk specific functions @@ -212,6 +250,8 @@ slider->format = NULL; slider->inverted = ETK_FALSE; slider->dragging = ETK_FALSE; + slider->policy = ETK_SLIDER_CONTINUOUS; + slider->update_timer = NULL; ETK_RANGE(slider)->value_changed = _etk_slider_value_changed_handler; etk_signal_connect("realize", ETK_OBJECT(slider), ETK_CALLBACK(_etk_slider_realize_cb), NULL); @@ -226,6 +266,9 @@ { if (!slider) return; + + if (slider->update_timer) + ecore_timer_del(slider->update_timer); free(slider->format); } @@ -245,6 +288,9 @@ case ETK_SLIDER_INVERTED_PROPERTY: etk_slider_inverted_set(slider, etk_property_value_bool_get(value)); break; + case ETK_SLIDER_UPDATE_POLICY_PROPERTY: + etk_slider_update_policy_set(slider, etk_property_value_int_get(value)); + break; default: break; } @@ -266,6 +312,9 @@ case ETK_SLIDER_INVERTED_PROPERTY: etk_property_value_bool_set(value, slider->inverted); break; + case ETK_SLIDER_UPDATE_POLICY_PROPERTY: + etk_property_value_int_set(value, slider->policy); + break; default: break; } @@ -343,30 +392,44 @@ /* Called when the cursor of the slider is dragged */ static void _etk_slider_cursor_dragged_cb(void *data, Evas_Object *obj, const char *emission, const char *source) { - Etk_Range *range; + Etk_Slider *slider; double v; - if (!(range = ETK_RANGE(data))) + if (!(slider = ETK_SLIDER(data))) return; if (strcmp(emission, "drag,start") == 0) - ETK_SLIDER(range)->dragging = ETK_TRUE; + slider->dragging = ETK_TRUE; else if (strcmp(emission, "drag,stop") == 0) - ETK_SLIDER(range)->dragging = ETK_FALSE; + { + /* The drag-button is released: we change the value of the slider if it uses the + * discontinuous or the delayed update-policy */ + if (slider->policy == ETK_SLIDER_DISCONTINUOUS || slider->policy == ETK_SLIDER_DELAYED) + { + v = _etk_slider_value_get_from_edje(slider); + etk_range_value_set(ETK_RANGE(slider), v); + if (slider->update_timer) + { + ecore_timer_del(slider->update_timer); + slider->update_timer = NULL; + } + } + slider->dragging = ETK_FALSE; + } else if (strcmp(emission, "drag") == 0) { - if (ETK_IS_HSLIDER(range)) + /* The drag-button has been moved */ + if (slider->policy == ETK_SLIDER_CONTINUOUS) { - edje_object_part_drag_value_get(obj, "etk.dragable.slider", &v, NULL); - v = ETK_SLIDER(range)->inverted ? (1.0 - v) : v; + v = _etk_slider_value_get_from_edje(slider); + etk_range_value_set(ETK_RANGE(slider), v); } - else + else if (slider->policy == ETK_SLIDER_DELAYED) { - edje_object_part_drag_value_get(obj, "etk.dragable.slider", NULL, &v); - v = ETK_SLIDER(range)->inverted ? v : (1.0 - v); + if (slider->update_timer) + ecore_timer_del(slider->update_timer); + slider->update_timer = ecore_timer_add(UPDATE_DELAY, _etk_slider_update_timer_cb, slider); } - - etk_range_value_set(range, range->lower + v * (range->upper - range->lower)); } } @@ -403,43 +466,76 @@ } /* Called when the range of the slider is changed */ -/* TODO: do we need that? _etk_slider_value_changed_handler() might be good enough? */ static void _etk_slider_range_changed_cb(Etk_Object *object, const char *property_name, void *data) { Etk_Range *range; - Evas_Object *theme_object; - double percent; - if (!(range = ETK_RANGE(object)) || !(theme_object = ETK_WIDGET(range)->theme_object)) + if (!(range = ETK_RANGE(object))) return; + _etk_slider_value_changed_handler(range, range->value); +} - /* Update the position of the drag button in the slider */ - if (range->upper - range->page_size > range->lower) - percent = ETK_CLAMP((range->value - range->lower) / (range->upper - range->lower - range->page_size), 0.0, 1.0); - else - percent = 0.0; +/* Timer used to update the slider's value when its policy is ETK_SLIDER_DELAYED */ +static int _etk_slider_update_timer_cb(void *data) +{ + Etk_Slider *slider; + double v; - if (ETK_IS_HSLIDER(range)) - edje_object_part_drag_value_set(theme_object, "etk.dragable.slider", percent, 0.0); - else - edje_object_part_drag_value_set(theme_object, "etk.dragable.slider", 0.0, percent); + if (!(slider = ETK_SLIDER(data))) + return 0; + + v = _etk_slider_value_get_from_edje(slider); + etk_range_value_set(ETK_RANGE(slider), v); + slider->update_timer = NULL; + return 0; } /************************** * - * Callbacks and handlers + * Private functions * **************************/ +/* Gets the value of the slider from the position of the drag-object */ +static double _etk_slider_value_get_from_edje(Etk_Slider *slider) +{ + Etk_Range *range; + double v; + + if (!(range = ETK_RANGE(slider)) || !ETK_WIDGET(slider)->theme_object || range->upper <= range->lower) + return 0.0; + + if (ETK_IS_HSLIDER(slider)) + { + edje_object_part_drag_value_get(ETK_WIDGET(slider)->theme_object, "etk.dragable.slider", &v, NULL); + v = slider->inverted ? (1.0 - v) : v; + } + else + { + edje_object_part_drag_value_get(ETK_WIDGET(slider)->theme_object, "etk.dragable.slider", NULL, &v); + v = slider->inverted ? v : (1.0 - v); + } + + v = range->lower + v * (range->upper - range->lower); + return v; +} + /* Updates the label of the slider's theme-object */ static void _etk_slider_label_update(Etk_Slider *slider) { char label[256]; + double v; - if (!slider || !slider->format) + if (!slider) return; - snprintf(label, sizeof(label), slider->format, ETK_RANGE(slider)->value); + if (slider->format) + { + v = _etk_slider_value_get_from_edje(slider); + snprintf(label, sizeof(label), slider->format, v); + } + else + label[0] = '\0'; etk_widget_theme_part_text_set(ETK_WIDGET(slider), "etk.text.label", label); } @@ -458,9 +554,14 @@ * Etk_Slider is the base class for Etk_HSlider (for horizontal sliders) and Etk_VSlider (for vertical sliders). @n * Since Etk_Slider inherits from Etk_Range, you can use all the @a etk_range_*() functions to get or set the value of * a slider, or to change its bounds. You can also use the @a "value_changed" signal to be notified when the value - * of a slider is changed. @n + * of a slider is changed. @n @n + * A slider can have different update-policies: by default, it uses a continuous update-policy, meaning the value of + * the slider will be changed each timer the slider's button is moved. But a slider can also use a discontinuous + * update-policy (the value will be changed only when the drag-button is released) or a delayed update-policy (the + * value will be changed after a brief timeout where no slider motion occurs). The update-policy can be changed with + * etk_slider_update_policy_set(). @n \n * By default, the maximum bound of an Etk_HSlider is the right end, and the top end for an Etk_VSlider. But you can - * invert the ends of a slider with etk_slider_inverted_set(). @n + * invert the ends of a slider with etk_slider_inverted_set(). @n @n * Sliders can also have their own label. For example, if you want to use a slider to control a value in centimeters, * you can add the associated label with: * @code @@ -486,4 +587,9 @@ * @prop_type Boolean (char *) * @prop_rw * @prop_val ETK_FALSE + * \par + * @prop_name "update_policy": The update-policy of the slider (continuous, discontinuous or delayed) + * @prop_type Integer (Etk_Slider_Update_Policy) + * @prop_rw + * @prop_val ETK_SLIDER_CONTINUOUS */ =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_slider.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- etk_slider.h 21 Feb 2007 05:19:17 -0000 1.5 +++ etk_slider.h 21 Feb 2007 18:27:03 -0000 1.6 @@ -3,6 +3,7 @@ #define _ETK_SLIDER_H_ #include "etk_range.h" +#include <Ecore.h> #include "etk_types.h" /** @@ -32,6 +33,15 @@ /** Checks if the object is an Etk_VSlider */ #define ETK_IS_VSLIDER(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_VSLIDER_TYPE)) + +/** @brief The different kinds of update policy for a slider */ +typedef enum Etk_Slider_Update_Policy +{ + ETK_SLIDER_CONTINUOUS, /**< The slider will be updated as soon as its button is dragged */ + ETK_SLIDER_DISCONTINUOUS, /**< The slider will be updated as soon as its button gets released */ + ETK_SLIDER_DELAYED /**< The slider will be updated after a brief timeout where no slider motion occurs */ +} Etk_Slider_Update_Policy; + /** * @brief A widget with a cursor that the user can drag to change its value * @structinfo @@ -45,6 +55,8 @@ char *format; Etk_Bool inverted; Etk_Bool dragging; + Etk_Slider_Update_Policy policy; + Ecore_Timer *update_timer; }; /** @@ -80,6 +92,9 @@ const char *etk_slider_label_get(Etk_Slider *slider); void etk_slider_inverted_set(Etk_Slider *slider, Etk_Bool inverted); Etk_Bool etk_slider_inverted_get(Etk_Slider *slider); + +void etk_slider_update_policy_set(Etk_Slider *slider, Etk_Slider_Update_Policy policy); +Etk_Slider_Update_Policy etk_slider_update_policy_get(Etk_Slider *slider); /** @} */ ------------------------------------------------------------------------- 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