+ if (!part || !strcmp(part, "icon"))
+ return wd->icon;
+ else if (!strcmp(part, "end"))
+ return wd->end;
+ return NULL;
+}
+
+static Evas_Object *
+_content_unset_hook(Evas_Object *obj, const char *part)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+ if (!part || !strcmp(part, "icon"))
+ return _icon_unset(obj);
+ else if (!strcmp(part, "end"))
+ return _end_unset(obj);
+ return NULL;
+}
+
+static void
+_hash_labels_free_cb(void* label)
+{
+ if (label)
+ eina_stringshare_del(label);
+}
+
+static void
+_min_max_set(Evas_Object *obj)
+{
+ char *buf_min = NULL;
+ char *buf_max = NULL;
+
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return;
+ if (wd->units_format_func)
+ {
+ buf_min = wd->units_format_func(wd->val_min);
+ buf_max = wd->units_format_func(wd->val_max);
+ }
+ else if (wd->units)
+ {
+ int length = strlen(wd->units);
+
+ buf_min = alloca(length + 128);
+ buf_max = alloca(length + 128);
+
+ snprintf((char*) buf_min, length + 128, wd->units, wd->val_min);
+ snprintf((char*) buf_max, length + 128, wd->units, wd->val_max);
+ }
+
+ edje_object_part_text_escaped_set(wd->slider, "elm.units.min", buf_min);
+ edje_object_part_text_escaped_set(wd->slider, "elm.units.max", buf_max);
+
+ if (wd->units_format_func && wd->units_format_free)
+ {
+ wd->units_format_free(buf_min);
+ wd->units_format_free(buf_max);
+ }
+}
+
+
+EAPI Evas_Object *
+elm_slider_add(Evas_Object *parent)
+{
+ Evas_Object *obj;
+ Evas *e;
+ Widget_Data *wd;
+
+ ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
+
+ ELM_SET_WIDTYPE(widtype, "slider");
+ elm_widget_type_set(obj, "slider");
+ elm_widget_sub_object_add(parent, obj);
+ elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);
+ elm_widget_data_set(obj, wd);
+ elm_widget_del_hook_set(obj, _del_hook);
+ elm_widget_theme_hook_set(obj, _theme_hook);
+ elm_widget_disable_hook_set(obj, _disable_hook);
+ elm_widget_can_focus_set(obj, EINA_TRUE);
+ elm_widget_event_hook_set(obj, _event_hook);
+ elm_widget_text_set_hook_set(obj, _elm_slider_label_set);
+ elm_widget_text_get_hook_set(obj, _elm_slider_label_get);
+ elm_widget_content_set_hook_set(obj, _content_set_hook);
+ elm_widget_content_get_hook_set(obj, _content_get_hook);
+ elm_widget_content_unset_hook_set(obj, _content_unset_hook);
+
+ wd->horizontal = EINA_TRUE;
+ wd->indicator_show = EINA_TRUE;
+ wd->val = 0.0;
+ wd->val_min = 0.0;
+ wd->val_max = 1.0;
+ wd->labels = eina_hash_string_superfast_new(_hash_labels_free_cb);
+
+ wd->slider = edje_object_add(e);
+ _elm_theme_object_set(obj, wd->slider, "slider", "horizontal", "default");
+ elm_widget_resize_object_set(obj, wd->slider);
+ edje_object_signal_callback_add(wd->slider, "drag", "*", _drag, obj);
+ edje_object_signal_callback_add(wd->slider, "drag,start", "*", _drag_start, obj);
+ edje_object_signal_callback_add(wd->slider, "drag,stop", "*", _drag_stop, obj);
+ edje_object_signal_callback_add(wd->slider, "drag,step", "*", _drag_step, obj);
+ edje_object_signal_callback_add(wd->slider, "drag,page", "*", _drag_stop, obj);
+ // edje_object_signal_callback_add(wd->slider, "drag,set", "*", _drag_stop, obj);
+ edje_object_part_drag_value_set(wd->slider, "elm.dragable.slider", 0.0, 0.0);
+
+ wd->spacer = evas_object_rectangle_add(e);
+ evas_object_color_set(wd->spacer, 0, 0, 0, 0);
+ evas_object_pass_events_set(wd->spacer, EINA_TRUE);
+ elm_widget_sub_object_add(obj, wd->spacer);
+ edje_object_part_swallow(wd->slider, "elm.swallow.bar", wd->spacer);
+ evas_object_event_callback_add(wd->spacer, EVAS_CALLBACK_MOUSE_DOWN, _spacer_down_cb, obj);
+ evas_object_event_callback_add(wd->spacer, EVAS_CALLBACK_MOUSE_MOVE, _spacer_move_cb, obj);
+ evas_object_event_callback_add(wd->spacer, EVAS_CALLBACK_MOUSE_UP, _spacer_up_cb, obj);
+ evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);
+
+ _mirrored_set(obj, elm_widget_mirrored_get(obj));
+ _sizing_eval(obj);
+
+ // TODO: convert Elementary to subclassing of Evas_Smart_Class
+ // TODO: and save some bytes, making descriptions per-class and not instance!
+ evas_object_smart_callbacks_descriptions_set(obj, _signals);
+ return obj;