Enlightenment CVS committal Author : moom Project : e17 Module : libs/etk
Dir : e17/libs/etk/src/lib Modified Files: etk_range.c etk_range.h etk_slider.c etk_slider.h etk_tree.c etk_types.h Log Message: * [Slider] Sliders can now have labels directly in their theme-object, like e17's sliders. =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_range.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -3 -r1.17 -r1.18 --- etk_range.c 28 Jan 2007 17:46:04 -0000 1.17 +++ etk_range.c 20 Feb 2007 20:50:19 -0000 1.18 @@ -209,9 +209,9 @@ if (page_size != range->page_size) { range->page_size = page_size; - etk_widget_redraw_queue(ETK_WIDGET(range)); etk_object_notify(ETK_OBJECT(range), "page_size"); } + etk_range_value_set(range, range->value); } /** @@ -328,9 +328,9 @@ * A range has a <b>value</b> that can't be lower than the <b>lower bound</b> of the range, or greater than the * <b>upper bound</b> of the range. @n * Three other value have to be set when a new range is created: - * - the <b>"step increment"</b> value is the value added or substracted to current value of the range, when the arrow - * keys are used, or when the arrow buttons of a scrollbar are clicked for example. It is also the value used when the - * user uses the mouse wheel. + * - the <b>"step increment"</b> value is the value added or substracted to the current value of the range, when the + * arrow keys are used, or when the arrow buttons of a scrollbar are clicked for example. It is also the value used + * when the user uses the mouse wheel. * - the <b>"page increment"</b> value is the value added or substracted to current value of the range, when the page * up/down keys are pressed, or when the trough of a scrollbar is clicked for example. * - the <b>"page size"</b> value is the size of viewport, used to calculate the size of the drag button of a scrollbar @@ -374,7 +374,7 @@ * @prop_rw * @prop_val 0.0 * \par - * @prop_name "page_size": The size of the page of the range. See the description of Etk_Range for more info + * @prop_name "page_size": The page-size of the range. See the description of Etk_Range for more info * @prop_type Double * @prop_rw * @prop_val 0.0 =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_range.h,v retrieving revision 1.10 retrieving revision 1.11 diff -u -3 -r1.10 -r1.11 --- etk_range.h 28 Jan 2007 17:46:04 -0000 1.10 +++ etk_range.h 20 Feb 2007 20:50:19 -0000 1.11 @@ -19,7 +19,7 @@ #define ETK_IS_RANGE(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_RANGE_TYPE)) /** - * @brief @widget The structure of a range + * @brief An abstract class used by widgets like scrollbars or sliders * @structinfo */ struct Etk_Range =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_slider.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -3 -r1.13 -r1.14 --- etk_slider.c 6 Oct 2006 17:04:15 -0000 1.13 +++ etk_slider.c 20 Feb 2007 20:50:19 -0000 1.14 @@ -13,13 +13,23 @@ * @{ */ +enum Etk_Slider_Property_Id +{ + ETK_SLIDER_LABEL_FORMAT_PROPERTY +}; + static void _etk_slider_constructor(Etk_Slider *slider); +static void _etk_slider_destructor(Etk_Slider *slider); +static void _etk_slider_property_set(Etk_Object *object, int property_id, Etk_Property_Value *value); +static void _etk_slider_property_get(Etk_Object *object, int property_id, Etk_Property_Value *value); + static void _etk_slider_realize_cb(Etk_Object *object, void *data); static void _etk_slider_key_down_cb(Etk_Object *object, Etk_Event_Key_Down *event, void *data); static void _etk_slider_mouse_wheel(Etk_Object *object, Etk_Event_Mouse_Wheel *event, void *data); 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 void _etk_slider_label_update(Etk_Slider *slider); /************************** * @@ -32,12 +42,21 @@ * @brief Gets the type of an Etk_Slider * @return Returns the type of an Etk_Slider */ -Etk_Type *etk_slider_type_get() +Etk_Type *etk_slider_type_get(void) { static Etk_Type *slider_type = NULL; if (!slider_type) - slider_type = etk_type_new("Etk_Slider", ETK_RANGE_TYPE, sizeof(Etk_Slider), ETK_CONSTRUCTOR(_etk_slider_constructor), NULL); + { + slider_type = etk_type_new("Etk_Slider", ETK_RANGE_TYPE, sizeof(Etk_Slider), + ETK_CONSTRUCTOR(_etk_slider_constructor), ETK_DESTRUCTOR(_etk_slider_destructor)); + + etk_type_property_add(slider_type, "label_format", ETK_SLIDER_LABEL_FORMAT_PROPERTY, + ETK_PROPERTY_STRING, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_string(NULL)); + + slider_type->property_set = _etk_slider_property_set; + slider_type->property_get = _etk_slider_property_get; + } return slider_type; } @@ -47,7 +66,7 @@ * @brief Gets the type of an Etk_HSlider * @return Returns the type of an Etk_HSlider */ -Etk_Type *etk_hslider_type_get() +Etk_Type *etk_hslider_type_get(void) { static Etk_Type *hslider_type = NULL; @@ -62,7 +81,7 @@ * @brief Gets the type of an Etk_VSlider * @return Returns the type of an Etk_VSlider */ -Etk_Type *etk_vslider_type_get() +Etk_Type *etk_vslider_type_get(void) { static Etk_Type *vslider_type = NULL; @@ -78,8 +97,9 @@ */ Etk_Widget *etk_hslider_new(double lower, double upper, double value, double step_increment, double page_increment) { - return etk_widget_new(ETK_HSLIDER_TYPE, "theme_group", "hslider", "focusable", ETK_TRUE, "lower", lower, "upper", upper, - "value", value, "step_increment", step_increment, "page_increment", page_increment, "focus_on_click", ETK_TRUE, NULL); + return etk_widget_new(ETK_HSLIDER_TYPE, "theme_group", "hslider", "focusable", ETK_TRUE, + "lower", lower, "upper", upper, "value", value, "step_increment", step_increment, + "page_increment", page_increment, "focus_on_click", ETK_TRUE, NULL); } /** @@ -88,8 +108,43 @@ */ Etk_Widget *etk_vslider_new(double lower, double upper, double value, double step_increment, double page_increment) { - return etk_widget_new(ETK_VSLIDER_TYPE, "theme_group", "vslider", "focusable", ETK_TRUE, "lower", lower, "upper", upper, - "value", value, "step_increment", step_increment, "page_increment", page_increment, "focus_on_click", ETK_TRUE, NULL); + return etk_widget_new(ETK_VSLIDER_TYPE, "theme_group", "vslider", "focusable", ETK_TRUE, + "lower", lower, "upper", upper, "value", value, "step_increment", step_increment, + "page_increment", page_increment, "focus_on_click", ETK_TRUE, NULL); +} + +/** + * @brief Sets the format of the label to display next to the slider + * @param slider a slider + * @param label_format the format of the slider's label. It uses the same format as printf(). Since the value is + * a double, you have to use "%.2f" if you want to display the value with two digits for example. @n + * NULL will hide the label + */ +void etk_slider_label_set(Etk_Slider *slider, const char *label_format) +{ + if (!slider || slider->format == label_format) + return; + + free(slider->format); + slider->format = label_format ? strdup(label_format) : NULL; + + etk_widget_theme_signal_emit(ETK_WIDGET(slider), + label_format ? "etk,action,show,label" : "etk,action,hide,label", ETK_TRUE); + _etk_slider_label_update(slider); + + etk_object_notify(ETK_OBJECT(slider), "label_format"); +} + +/** + * @brief Gets the format of the label displayed next to the slider + * @param slider a slider + * @return Returns the format string of the slider's label (NULL means the label is hidden) + */ +const char *etk_slider_label_get(Etk_Slider *slider) +{ + if (!slider) + return NULL; + return slider->format; } /************************** @@ -105,6 +160,8 @@ return; slider->dragging = ETK_FALSE; + slider->format = 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); etk_signal_connect("key_down", ETK_OBJECT(slider), ETK_CALLBACK(_etk_slider_key_down_cb), NULL); @@ -113,6 +170,50 @@ etk_object_notification_callback_add(ETK_OBJECT(slider), "upper", _etk_slider_range_changed_cb, NULL); } +/* Destroys the slider */ +static void _etk_slider_destructor(Etk_Slider *slider) +{ + if (!slider) + return; + free(slider->format); +} + +/* Sets the property whose id is "property_id" to the value "value" */ +static void _etk_slider_property_set(Etk_Object *object, int property_id, Etk_Property_Value *value) +{ + Etk_Slider *slider; + + if (!(slider = ETK_SLIDER(object)) || !value) + return; + + switch (property_id) + { + case ETK_SLIDER_LABEL_FORMAT_PROPERTY: + etk_slider_label_set(slider, etk_property_value_string_get(value)); + break; + default: + break; + } +} + +/* Gets the value of the property whose id is "property_id" */ +static void _etk_slider_property_get(Etk_Object *object, int property_id, Etk_Property_Value *value) +{ + Etk_Slider *slider; + + if (!(slider = ETK_SLIDER(object)) || !value) + return; + + switch (property_id) + { + case ETK_SLIDER_LABEL_FORMAT_PROPERTY: + etk_property_value_string_set(value, slider->format); + break; + default: + break; + } +} + /************************** * * Callbacks and handlers @@ -122,13 +223,18 @@ /* Called when the slider is realized */ static void _etk_slider_realize_cb(Etk_Object *object, void *data) { + Etk_Slider *slider; Evas_Object *theme_object; - if (!object || !(theme_object = ETK_WIDGET(object)->theme_object)) + if (!(slider = ETK_SLIDER(object)) || !(theme_object = ETK_WIDGET(slider)->theme_object)) return; - _etk_slider_value_changed_handler(ETK_RANGE(object), ETK_RANGE(object)->value); - edje_object_signal_callback_add(theme_object, "drag*", "etk.dragable.slider", _etk_slider_cursor_dragged_cb, object); + etk_widget_theme_signal_emit(ETK_WIDGET(object), + slider->format ? "etk,action,show,label" : "etk,action,hide,label", ETK_TRUE); + edje_object_signal_callback_add(theme_object, "drag*", "etk.dragable.slider", + _etk_slider_cursor_dragged_cb, object); + + _etk_slider_value_changed_handler(ETK_RANGE(slider), ETK_RANGE(slider)->value); } /* Called when the user presses a key */ @@ -159,7 +265,7 @@ etk_signal_stop(); } -/* Called when the user wants to change the value the mouse wheel */ +/* Called when the user wants to change the value with the mouse wheel */ static void _etk_slider_mouse_wheel(Etk_Object *object, Etk_Event_Mouse_Wheel *event, void *data) { Etk_Range *slider_range; @@ -204,7 +310,7 @@ if (!(slider = ETK_SLIDER(range)) || !(theme_object = ETK_WIDGET(slider)->theme_object)) return; - if (range->upper > range->lower) + if (range->upper - range->page_size > range->lower) percent = ETK_CLAMP((value - range->lower) / (range->upper - range->lower - range->page_size), 0.0, 1.0); else percent = 0.0; @@ -216,6 +322,8 @@ else edje_object_part_drag_value_set(theme_object, "etk.dragable.slider", 0.0, percent); } + + _etk_slider_label_update(slider); } /* Called when the range of the slider is changed */ @@ -233,10 +341,29 @@ percent = ETK_CLAMP((range->value - range->lower) / (range->upper - range->lower - range->page_size), 0.0, 1.0); else percent = 0.0; + 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); +} + +/************************** + * + * Callbacks and handlers + * + **************************/ + +/* Updates the label of the slider's theme-object */ +static void _etk_slider_label_update(Etk_Slider *slider) +{ + char label[256]; + + if (!slider || !slider->format) + return; + + snprintf(label, sizeof(label), slider->format, etk_range_value_get(ETK_RANGE(slider))); + etk_widget_theme_part_text_set(ETK_WIDGET(slider), "etk.text.label", label); } /** @} */ =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_slider.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- etk_slider.h 6 Oct 2006 17:04:15 -0000 1.3 +++ etk_slider.h 20 Feb 2007 20:50:19 -0000 1.4 @@ -7,48 +7,50 @@ /** * @defgroup Etk_Slider Etk_Slider + * @brief An Etk_Slider is a widget with a cursor that the user can drag to change its value * @{ */ -/** @brief Gets the type of a slider */ +/** Gets the type of a slider */ #define ETK_SLIDER_TYPE (etk_slider_type_get()) -/** @brief Casts the object to an Etk_Slider */ +/** Casts the object to an Etk_Slider */ #define ETK_SLIDER(obj) (ETK_OBJECT_CAST((obj), ETK_SLIDER_TYPE, Etk_Slider)) -/** @brief Checks if the object is an Etk_Slider */ +/** Checks if the object is an Etk_Slider */ #define ETK_IS_SLIDER(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_SLIDER_TYPE)) -/** @brief Gets the type of a horizontal slider */ +/** Gets the type of a horizontal slider */ #define ETK_HSLIDER_TYPE (etk_hslider_type_get()) -/** @brief Casts the object to an Etk_HSlider */ +/** Casts the object to an Etk_HSlider */ #define ETK_HSLIDER(obj) (ETK_OBJECT_CAST((obj), ETK_HSLIDER_TYPE, Etk_HSlider)) -/** @brief Checks if the object is an Etk_HSlider */ +/** Checks if the object is an Etk_HSlider */ #define ETK_IS_HSLIDER(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_HSLIDER_TYPE)) -/** @brief Gets the type of a vertical slider */ +/** Gets the type of a vertical slider */ #define ETK_VSLIDER_TYPE (etk_vslider_type_get()) -/** @brief Casts the object to an Etk_VSlider */ +/** Casts the object to an Etk_VSlider */ #define ETK_VSLIDER(obj) (ETK_OBJECT_CAST((obj), ETK_VSLIDER_TYPE, Etk_VSlider)) -/** @brief Checks if the object is an Etk_VSlider */ +/** Checks if the object is an Etk_VSlider */ #define ETK_IS_VSLIDER(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_VSLIDER_TYPE)) /** - * @struct Etk_Slider - * @brief An Etk_Slider is a widget with a cursor you can move to change a value + * @brief A widget with a cursor that the user can drag to change its value + * @structinfo */ -struct _Etk_Slider +struct Etk_Slider { /* private: */ /* Inherit from Etk_Range */ Etk_Range range; + char *format; Etk_Bool dragging; }; /** - * @struct Etk_HSlider - * @brief A horizontal slider + * @brief An horizontal slider + * @structinfo */ -struct _Etk_HSlider +struct Etk_HSlider { /* private: */ /* Inherit from Etk_Slider */ @@ -56,22 +58,25 @@ }; /** - * @struct Etk_VSlider * @brief A vertical slider + * @structinfo */ -struct _Etk_VSlider +struct Etk_VSlider { /* private: */ /* Inherit from Etk_Slider */ Etk_Slider slider; }; -Etk_Type *etk_slider_type_get(); -Etk_Type *etk_vslider_type_get(); -Etk_Type *etk_hslider_type_get(); +Etk_Type *etk_slider_type_get(void); +Etk_Type *etk_vslider_type_get(void); +Etk_Type *etk_hslider_type_get(void); Etk_Widget *etk_hslider_new(double lower, double upper, double value, double step_increment, double page_increment); Etk_Widget *etk_vslider_new(double lower, double upper, double value, double step_increment, double page_increment); + +void etk_slider_label_set(Etk_Slider *slider, const char *label_format); +const char *etk_slider_label_get(Etk_Slider *slider); /** @} */ =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_tree.c,v retrieving revision 1.86 retrieving revision 1.87 diff -u -3 -r1.86 -r1.87 --- etk_tree.c 5 Feb 2007 03:49:22 -0000 1.86 +++ etk_tree.c 20 Feb 2007 20:50:19 -0000 1.87 @@ -133,6 +133,7 @@ static Etk_Tree_Row *_etk_tree_row_next_to_render_get(Etk_Tree_Row *row, int *depth); static Etk_Tree_Row_Object *_etk_tree_row_object_create(Etk_Tree *tree); static void _etk_tree_row_object_destroy(Etk_Tree *tree, Etk_Tree_Row_Object *row_object); +static void _etk_tree_row_signal_emit(Etk_Tree_Row *row, Etk_Tree_Row_Object *row_object, const char *signal); static void _etk_tree_expanders_clip(Etk_Tree *tree); static void _etk_tree_row_select(Etk_Tree *tree, Etk_Tree_Row *row, Etk_Modifiers modifiers); @@ -2423,12 +2424,6 @@ evas_object_resize(row_object->background, geometry.w, tree->rows_height); evas_object_show(row_object->background); - edje_object_signal_emit(row_object->background, - (row_id % 2 == 0) ? "etk,state,odd" : "etk,state,even", "etk"); - edje_object_signal_emit(row_object->background, - row->selected ? "etk,state,selected" : "etk,state,unselected", "etk"); - edje_object_message_signal_process(row_object->background); - if ((l2 = evas_list_find_list(prev_visible_rows, row))) prev_visible_rows = evas_list_remove_list(prev_visible_rows, l2); else @@ -2540,6 +2535,10 @@ } } + _etk_tree_row_signal_emit(row, row_object, (row_id % 2 == 0) ? "etk,state,odd" : "etk,state,even"); + _etk_tree_row_signal_emit(row, row_object, row->selected ? "etk,state,selected" : "etk,state,unselected"); + edje_object_message_signal_process(row_object->background); + evas_object_lower(row_object->background); row_object->row = row; } @@ -3352,6 +3351,18 @@ evas_object_del(row_object->expander); evas_object_del(row_object->background); free(row_object); +} + +/* Emits a theme-signal to all the row objects (background, expander, model-objects) */ +static void _etk_tree_row_signal_emit(Etk_Tree_Row *row, Etk_Tree_Row_Object *row_object, const char *signal) +{ + if (!row || !row_object || !signal) + return; + + if (row_object->background) + edje_object_signal_emit(row_object->background, signal, "etk"); + if (row_object->expander) + edje_object_signal_emit(row_object->expander, signal, "etk"); } /* Clips all the expanders against the clip object of the first visible column */ =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_types.h,v retrieving revision 1.62 retrieving revision 1.63 diff -u -3 -r1.62 -r1.63 --- etk_types.h 16 Jan 2007 23:49:27 -0000 1.62 +++ etk_types.h 20 Feb 2007 20:50:19 -0000 1.63 @@ -96,9 +96,9 @@ typedef struct Etk_HSeparator Etk_HSeparator; typedef struct Etk_VSeparator Etk_VSeparator; typedef struct Etk_Shadow Etk_Shadow; -typedef struct _Etk_Slider Etk_Slider; -typedef struct _Etk_HSlider Etk_HSlider; -typedef struct _Etk_VSlider Etk_VSlider; +typedef struct Etk_Slider Etk_Slider; +typedef struct Etk_HSlider Etk_HSlider; +typedef struct Etk_VSlider Etk_VSlider; typedef struct Etk_Spinner Etk_Spinner; typedef struct Etk_Statusbar Etk_Statusbar; typedef struct _Etk_Table Etk_Table; ------------------------------------------------------------------------- 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