slider... horizontal only done right now - but complete. looks decent methinks.

SVN revision: 38972
This commit is contained in:
Carsten Haitzler 2009-02-08 12:34:58 +00:00
parent f53b4bea0f
commit 55055feb3e
17 changed files with 1011 additions and 4 deletions

View File

@ -97,7 +97,18 @@ icon_delete.png \
icon_edit.png \
ilist_1.png \
ilist_2.png \
ilist_item_shadow.png
ilist_item_shadow.png \
sl_bg.png \
sl_bg_over.png \
sl_bt_0.png \
sl_bt_1.png \
sl_bt_2.png \
sl_bt2_0_0.png \
sl_bt2_0_1.png \
sl_bt2_0_2.png \
sl_bt2_1.png \
sl_bt2_2.png \
sl_units.png
default.edj: Makefile $(EXTRA_DIST)
$(EDJE_CC) $(EDJE_FLAGS) \

View File

@ -5948,4 +5948,516 @@ collections {
}
}
}
///////////////////////////////////////////////////////////////////////////////
group { name: "elm/slider/horizontal/default";
// FIXME: do this element properly theme-wise. this is just testing here
images {
image: "sl_bg.png" COMP;
image: "sl_bg_over.png" COMP;
image: "sl_bt_0.png" COMP;
image: "sl_bt_1.png" COMP;
image: "sl_bt_2.png" COMP;
image: "sl_bt2_0_0.png" COMP;
image: "sl_bt2_0_1.png" COMP;
image: "sl_bt2_0_2.png" COMP;
image: "sl_bt2_1.png" COMP;
image: "sl_bt2_2.png" COMP;
image: "sl_units.png" COMP;
}
parts {
part { name: "base";
mouse_events: 0;
description { state: "default" 0.0;
max: 99999 6;
min: 0 6;
rel1 { to: "bg";
offset: 1 0;
}
rel2 { to: "bg";
offset: -2 -1;
}
image.normal: "sl_bg.png";
fill.smooth: 0;
}
}
part { name: "level";
type: RECT;
mouse_events: 0;
description { state: "default" 0.0;
rel1.to: "base";
rel2 {
to_y: "base";
to_x: "elm.dragable.slider";
relative: 0.5 1.0;
}
color: 255 0 0 200;
}
description { state: "inverted" 0.0;
inherit: "default" 0.0;
visible: 0;
}
}
part { name: "level2";
type: RECT;
mouse_events: 0;
description { state: "default" 0.0;
visible: 0;
rel1 {
to_y: "base";
to_x: "elm.dragable.slider";
relative: 0.5 0.0;
}
rel2.to: "base";
color: 255 0 0 200;
}
description { state: "inverted" 0.0;
inherit: "default" 0.0;
visible: 1;
}
}
part {
name: "base_over";
mouse_events: 0;
description { state: "default" 0.0;
rel1.to: "base";
rel1.offset: -1 -1;
rel2.to: "base";
rel2.offset: 0 0;
image {
normal: "sl_bg_over.png";
border: 3 3 3 3;
}
fill.smooth: 0;
}
}
part { name: "bg";
type: RECT;
mouse_events: 0;
scale: 1;
description { state: "default" 0.0;
visible: 0;
rel1.to: "elm.swallow.bar";
rel2.to: "elm.swallow.bar";
color: 0 0 0 0;
}
}
part { name: "elm.swallow.bar";
type: SWALLOW;
scale: 1;
description { state: "default" 0.0;
min: 48 24;
max: 99999 24;
align: 1.0 0.5;
rel1 {
to_x: "elm.text";
relative: 1.0 0.0;
offset: 2 0;
}
rel2 {
to_x: "elm.units";
relative: 0.0 1.0;
offset: -3 -1;
}
}
}
part { name: "elm.swallow.content";
type: SWALLOW;
description { state: "default" 0.0;
visible: 0;
align: 0.0 0.5;
rel1 {
offset: 4 0;
to_y: "elm.swallow.bar";
}
rel2 {
offset: 3 -1;
relative: 0.0 1.0;
to_y: "elm.swallow.bar";
}
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
aspect: 1.0 1.0;
aspect_preference: VERTICAL;
rel2.offset: 4 -5;
}
}
part { name: "elm.text";
type: TEXT;
mouse_events: 0;
scale: 1;
description { state: "default" 0.0;
visible: 0;
fixed: 1 1;
align: 0.0 0.5;
rel1.to_x: "elm.swallow.content";
rel1.relative: 1.0 0.0;
rel1.offset: -1 4;
rel2.to_x: "elm.swallow.content";
rel2.relative: 1.0 1.0;
rel2.offset: -1 -5;
color: 0 0 0 255;
text {
font: "Sans,Edje-Vera";
size: 10;
min: 0 0;
align: 0.0 0.5;
}
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
text.min: 1 1;
rel1.offset: 0 4;
rel2.offset: 0 -5;
}
}
part { name: "units";
mouse_events: 0;
description { state: "default" 0.0;
visible: 0;
rel1 {
to_x: "elm.units";
offset: 0 5;
}
image {
normal: "sl_units.png";
border: 0 5 3 8;
}
fill.smooth: 0;
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
}
}
part { name: "elm.units";
type: TEXT;
mouse_events: 0;
scale: 1;
description { state: "default" 0.0;
visible: 0;
fixed: 1 1;
align: 1.0 0.5;
rel1.relative: 1.0 0.0;
rel1.offset: 0 8;
rel2.relative: 1.0 1.0;
rel2.offset: 0 -9;
color: 0 0 0 255;
text {
font: "Sans,Edje-Vera";
size: 10;
min: 0 0;
align: 0.0 0.5;
}
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
fixed: 1 1;
visible: 1;
text.min: 1 1;
rel1.offset: -5 0;
rel2.offset: -5 -1;
}
}
part { name: "elm.dragable.slider";
type: RECT;
mouse_events: 1;
scale: 1;
dragable {
x: 1 1 0;
y: 0 0 0;
confine: "bg";
}
description { state: "default" 0.0;
min: 24 24;
max: 24 24;
fixed: 1 1;
rel1 {
relative: 0.5 0.5;
to: "bg";
}
rel2 {
relative: 0.5 0.5;
to: "bg";
}
color: 0 0 0 0;
}
}
part { name: "button0";
mouse_events: 0;
description { state: "default" 0.0;
max: 17 999;
min: 17 24;
rel1.to: "elm.dragable.slider";
rel2.to: "elm.dragable.slider";
image {
normal: "sl_bt_0.png";
border: 5 5 5 10;
}
fill.smooth: 0;
}
}
part { name: "button1";
mouse_events: 0;
description { state: "default" 0.0;
rel1.to: "button0";
rel2 {
to: "button0";
relative: 1.0 0.5;
offset: -1 -5;
}
image {
normal: "sl_bt_1.png";
border: 5 5 5 0;
}
}
}
part { name: "button2";
mouse_events: 0;
description { state: "default" 0.0;
rel1.to: "button0";
rel2.to: "button0";
image {
normal: "sl_bt_2.png";
border: 5 5 5 10;
}
fill.smooth: 0;
}
}
part { name: "button3";
mouse_events: 0;
description { state: "default" 0.0;
visible: 0;
min: 8 32;
align: 1.0 0.5;
rel1 {
to_x: "elm.indicator";
to_y: "button4";
relative: 0.0 0.0;
offset: -7 0;
}
rel2 {
to: "button4";
relative: 0.0 1.0;
offset: 0 -1;
}
image {
normal: "sl_bt2_0_0.png";
border: 6 0 6 12;
}
fill.smooth: 0;
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
}
}
part { name: "button4";
mouse_events: 0;
description { state: "default" 0.0;
visible: 0;
max: 15 999;
min: 15 32;
rel1 {
to_x: "elm.dragable.slider";
to_y: "elm.indicator";
offset: 0 -7;
}
rel2.to: "elm.dragable.slider";
image {
normal: "sl_bt2_0_1.png";
border: 0 0 6 12;
}
fill.smooth: 0;
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
}
}
part { name: "button5";
mouse_events: 0;
description { state: "default" 0.0;
visible: 0;
min: 8 32;
align: 1.0 0.5;
rel1 {
to: "button4";
relative: 1.0 0.0;
offset: 0 0;
}
rel2 {
to_x: "elm.indicator";
to_y: "button4";
relative: 1.0 1.0;
offset: 6 -1;
}
image {
normal: "sl_bt2_0_2.png";
border: 0 6 6 12;
}
fill.smooth: 0;
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
}
}
part { name: "elm.indicator";
type: TEXT;
mouse_events: 0;
effect: SOFT_SHADOW;
scale: 1;
description { state: "default" 0.0;
visible: 0;
fixed: 1 1;
align: 0.5 1.0;
rel1 {
to: "elm.dragable.slider";
relative: 0.0 0.0;
offset: 0 0;
}
rel2 {
to_x: "elm.dragable.slider";
relative: 1.0 0.0;
offset: -1 0;
}
color: 224 224 224 255;
color3: 0 0 0 64;
text {
font: "Sans,Edje-Vera";
size: 10;
min: 0 0;
align: 0.5 0.5;
}
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
text.min: 1 1;
rel1.offset: 0 -1;
rel2.offset: -1 -1;
}
}
part { name: "button6";
mouse_events: 0;
description { state: "default" 0.0;
visible: 0;
rel1.to: "button3";
rel2 {
to: "button5";
relative: 1.0 0.3;
offset: -1 -1;
}
image {
normal: "sl_bt2_1.png";
border: 5 5 5 0;
}
fill.smooth: 0;
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
}
}
part { name: "button7";
mouse_events: 0;
description { state: "default" 0.0;
visible: 0;
rel1.to: "button3";
rel2.to: "button5";
image {
normal: "sl_bt2_2.png";
border: 5 5 5 0;
middle: 0;
}
fill.smooth: 0;
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
}
}
}
programs {
program { name: "text_show";
signal: "elm,state,text,visible";
source: "elm";
action: STATE_SET "visible" 0.0;
target: "elm.text";
}
program { name: "text_hide";
signal: "elm,state,text,hidden";
source: "elm";
action: STATE_SET "default" 0.0;
target: "elm.text";
}
program { name: "icon_show";
signal: "elm,state,icon,visible";
source: "elm";
action: STATE_SET "visible" 0.0;
target: "elm.swallow.content";
}
program { name: "icon_hide";
signal: "elm,state,icon,hidden";
source: "elm";
action: STATE_SET "default" 0.0;
target: "elm.swallow.content";
}
program { name: "units_show";
signal: "elm,state,units,visible";
source: "elm";
action: STATE_SET "visible" 0.0;
target: "elm.units";
target: "units";
}
program { name: "units_hide";
signal: "elm,state,units,hidden";
source: "elm";
action: STATE_SET "default" 0.0;
target: "elm.units";
target: "units";
}
program { name: "invert_on";
signal: "elm,state,inverted,on";
source: "elm";
action: STATE_SET "inverted" 0.0;
target: "level";
target: "level2";
}
program { name: "invert_off";
signal: "elm,state,inverted,off";
source: "elm";
action: STATE_SET "default" 0.0;
target: "level";
target: "level2";
}
program { name: "val_show";
signal: "mouse,down,*";
source: "elm.dragable.slider";
action: STATE_SET "visible" 0.0;
target: "elm.indicator";
target: "button3";
target: "button4";
target: "button5";
target: "button6";
target: "button7";
}
program { name: "val_hide";
signal: "mouse,up,*";
source: "elm.dragable.slider";
action: STATE_SET "default" 0.0;
target: "elm.indicator";
target: "button3";
target: "button4";
target: "button5";
target: "button6";
target: "button7";
}
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 479 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 466 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 446 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 571 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 893 B

View File

@ -1898,8 +1898,8 @@ my_bt_27(void *data, Evas_Object *obj, void *event_info)
Evas_Object *win, *bg, *bx, *fr, *lb;
char buf[PATH_MAX];
win = elm_win_add(NULL, "scaling", ELM_WIN_BASIC);
elm_win_title_set(win, "Scaling");
win = elm_win_add(NULL, "scaling-2", ELM_WIN_BASIC);
elm_win_title_set(win, "Scaling 2");
elm_win_autodel_set(win, 1);
bg = elm_bg_add(win);
@ -1955,6 +1955,74 @@ my_bt_27(void *data, Evas_Object *obj, void *event_info)
evas_object_show(win);
}
static void
my_bt_28(void *data, Evas_Object *obj, void *event_info)
{
Evas_Object *win, *bg, *bx, *sl, *ic;
char buf[PATH_MAX];
win = elm_win_add(NULL, "slider", ELM_WIN_BASIC);
elm_win_title_set(win, "Slider");
elm_win_autodel_set(win, 1);
bg = elm_bg_add(win);
elm_win_resize_object_add(win, bg);
evas_object_size_hint_weight_set(bg, 1.0, 1.0);
evas_object_show(bg);
bx = elm_box_add(win);
evas_object_size_hint_weight_set(bx, 1.0, 1.0);
elm_win_resize_object_add(win, bx);
evas_object_show(bx);
ic = elm_icon_add(win);
snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR);
elm_icon_file_set(ic, buf, NULL);
evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
sl = elm_slider_add(win);
elm_slider_label_set(sl, "Label");
elm_slider_icon_set(sl, ic);
elm_slider_unit_format_set(sl, "%1.1f units");
elm_slider_span_size_set(sl, 400);
evas_object_size_hint_align_set(sl, -1.0, -1.0);
evas_object_size_hint_weight_set(sl, 1.0, 1.0);
elm_box_pack_end(bx, sl);
evas_object_show(ic);
evas_object_show(sl);
sl = elm_slider_add(win);
elm_slider_label_set(sl, "Label 2");
elm_slider_span_size_set(sl, 200);
evas_object_size_hint_align_set(sl, -1.0, -1.0);
evas_object_size_hint_weight_set(sl, 1.0, 1.0);
elm_slider_indicator_format_set(sl, "%3.0f");
elm_slider_min_max_set(sl, 50, 150);
elm_slider_value_set(sl, 80);
elm_slider_inverted_set(sl, 1);
evas_object_size_hint_align_set(sl, 0.5, 0.5);
evas_object_size_hint_weight_set(sl, 0.0, 0.0);
elm_box_pack_end(bx, sl);
evas_object_show(ic);
evas_object_show(sl);
sl = elm_slider_add(win);
elm_slider_label_set(sl, "Label 3");
elm_slider_unit_format_set(sl, "units");
elm_slider_span_size_set(sl, 200);
evas_object_size_hint_align_set(sl, -1.0, -1.0);
evas_object_size_hint_weight_set(sl, 1.0, 1.0);
elm_slider_indicator_format_set(sl, "%3.0f");
elm_slider_min_max_set(sl, 50, 150);
elm_slider_value_set(sl, 80);
elm_slider_inverted_set(sl, 1);
elm_object_scale_set(sl, 2.0);
elm_box_pack_end(bx, sl);
evas_object_show(ic);
evas_object_show(sl);
evas_object_show(win);
}
static void
my_win_main(void)
{
@ -2057,11 +2125,12 @@ my_win_main(void)
elm_list_item_append(li, "Inwin 2", NULL, NULL, my_bt_25, NULL);
elm_list_item_append(li, "Scaling", NULL, NULL, my_bt_26, NULL);
elm_list_item_append(li, "Scaling 2", NULL, NULL, my_bt_27, NULL);
elm_list_item_append(li, "Slider", NULL, NULL, my_bt_28, NULL);
elm_list_go(li);
/* set an initial window size */
evas_object_resize(win, 320, 520);
evas_object_resize(win, 312, 480);
/* show the window */
evas_object_show(win);
}

View File

@ -474,6 +474,25 @@ extern "C" {
/* smart callbacks called:
* "clicked" - when the user clicks on a carousel item and becomes selected
*/
EAPI Evas_Object *elm_slider_add(Evas_Object *parent);
EAPI void elm_slider_label_set(Evas_Object *obj, const char *label);
EAPI void elm_slider_icon_set(Evas_Object *obj, Evas_Object *icon);
EAPI void elm_slider_span_size_set(Evas_Object *obj, Evas_Coord size);
EAPI void elm_slider_unit_format_set(Evas_Object *obj, const char *format);
EAPI void elm_slider_indicator_format_set(Evas_Object *obj, const char *indicator);
EAPI void elm_slider_horizontal_set(Evas_Object *obj, Evas_Bool horizontal);
EAPI void elm_slider_min_max_set(Evas_Object *obj, double min, double max);
EAPI void elm_slider_value_set(Evas_Object *obj, double val);
EAPI double elm_slider_value_get(Evas_Object *obj);
EAPI void elm_slider_inverted_set(Evas_Object *obj, Evas_Bool inverted);
/* smart callbacks called:
* "changed" - when the slider value changes
* "delay,changed" - when the slider value changed, but a small time after a change (use this if you only want to respond to a change once the slider is held still for a short while).
*/
#ifdef __cplusplus
}
@ -527,6 +546,7 @@ extern "C" {
// * progress bar widget
// * generic "tacho" widget (set min/max labels - and up to 3 intermediate labels)
// * status widget (busy, stalled, running, etc.)
// * full window in window widget (so move/resize of window object does as you'd expect a child window to do within the canvas)
//
//// (improvements - low priority)
// * need another sample theme

View File

@ -47,6 +47,7 @@ elm_photo.c \
elm_toolbar.c \
elm_list.c \
elm_carousel.c \
elm_slider.c \
\
elc_notepad.c \
elc_anchorview.c \

View File

@ -0,0 +1,394 @@
#include <Elementary.h>
#include "elm_priv.h"
typedef struct _Widget_Data Widget_Data;
struct _Widget_Data
{
Evas_Object *slider;
Evas_Object *icon;
Evas_Object *spacer;
const char *label;
const char *units;
const char *indicator;
Evas_Bool horizontal : 1;
Evas_Bool inverted : 1;
double val, val_min, val_max;
Ecore_Timer *delay;
Evas_Coord size;
};
static void _del_hook(Evas_Object *obj);
static void _theme_hook(Evas_Object *obj);
static void _sizing_eval(Evas_Object *obj);
static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info);
static void _sub_del(void *data, Evas_Object *obj, void *event_info);
static void _units_set(Evas_Object *obj);
static void _indicator_set(Evas_Object *obj);
static void
_del_hook(Evas_Object *obj)
{
Widget_Data *wd = elm_widget_data_get(obj);
if (wd->label) eina_stringshare_del(wd->label);
if (wd->indicator) eina_stringshare_del(wd->units);
if (wd->delay) ecore_timer_del(wd->delay);
free(wd);
}
static void
_theme_hook(Evas_Object *obj)
{
Widget_Data *wd = elm_widget_data_get(obj);
if (wd->horizontal)
_elm_theme_set(wd->slider, "slider", "horizontal", "default");
else
_elm_theme_set(wd->slider, "slider", "vertical", "default");
if (wd->inverted)
edje_object_signal_emit(wd->slider, "elm,state,inverted,on", "elm");
else
edje_object_signal_emit(wd->slider, "elm,state,inverted,off", "elm");
if (wd->icon)
edje_object_signal_emit(wd->slider, "elm,state,icon,visible", "elm");
else
edje_object_signal_emit(wd->slider, "elm,state,icon,hidden", "elm");
if (wd->label)
edje_object_signal_emit(wd->slider, "elm,state,text,visible", "elm");
else
edje_object_signal_emit(wd->slider, "elm,state,text,hidden", "elm");
edje_object_part_text_set(wd->slider, "elm.text", wd->label);
if (wd->units)
edje_object_signal_emit(wd->slider, "elm,state,units,visible", "elm");
else
edje_object_signal_emit(wd->slider, "elm,state,units,hidden", "elm");
if (wd->horizontal)
evas_object_size_hint_min_set(wd->spacer, (double)wd->size * elm_widget_scale_get(obj) * _elm_config->scale, 1);
else
evas_object_size_hint_min_set(wd->spacer, 1, (double)wd->size * elm_widget_scale_get(obj) * _elm_config->scale);
edje_object_part_swallow(wd->slider, "elm.swallow.bar", wd->spacer);
_units_set(obj);
edje_object_message_signal_process(wd->slider);
edje_object_scale_set(wd->slider, elm_widget_scale_get(obj) * _elm_config->scale);
_sizing_eval(obj);
}
static void
_sizing_eval(Evas_Object *obj)
{
Widget_Data *wd = elm_widget_data_get(obj);
Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
edje_object_size_min_calc(wd->slider, &minw, &minh);
evas_object_size_hint_min_set(obj, minw, minh);
evas_object_size_hint_max_set(obj, maxw, maxh);
}
static void
_changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
Widget_Data *wd = elm_widget_data_get(data);
if (obj != wd->icon) return;
edje_object_part_swallow(wd->slider, "elm.swallow.content", obj);
_sizing_eval(data);
}
static void
_sub_del(void *data, Evas_Object *obj, void *event_info)
{
Widget_Data *wd = elm_widget_data_get(obj);
Evas_Object *sub = event_info;
if (sub == wd->icon)
{
edje_object_signal_emit(wd->slider, "elm,state,icon,hidden", "elm");
evas_object_event_callback_del
(sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints);
wd->icon = NULL;
_sizing_eval(obj);
}
}
static int
_delay_change(void *data)
{
Widget_Data *wd = elm_widget_data_get(data);
wd->delay = NULL;
evas_object_smart_callback_call(data, "delay,changed", NULL);
return 0;
}
static void
_val_fetch(Evas_Object *obj)
{
Widget_Data *wd = elm_widget_data_get(obj);
double posx = 0.0, posy = 0.0, pos = 0.0, val;
edje_object_part_drag_value_get(wd->slider, "elm.dragable.slider",
&posx, &posy);
if (wd->horizontal) pos = posx;
else pos = posy;
if (wd->inverted) pos = 1.0 - pos;
val = (pos * (wd->val_max - wd->val_min)) + wd->val_min;
if (val != wd->val)
{
wd->val = val;
evas_object_smart_callback_call(obj, "changed", NULL);
if (wd->delay) ecore_timer_del(wd->delay);
wd->delay = ecore_timer_add(0.2, _delay_change, obj);
}
}
static void
_val_set(Evas_Object *obj)
{
Widget_Data *wd = elm_widget_data_get(obj);
double pos;
if (wd->val_max > wd->val_min)
pos = (wd->val - wd->val_min) / (wd->val_max - wd->val_min);
else
pos = 0.0;
if (pos < 0.0) pos = 0.0;
else if (pos > 1.0) pos = 1.0;
if (wd->inverted) pos = 1.0 - pos;
edje_object_part_drag_value_set(wd->slider, "elm.dragable.slider", pos, pos);
}
static void
_units_set(Evas_Object *obj)
{
Widget_Data *wd = elm_widget_data_get(obj);
if (wd->units)
{
char buf[1024];
snprintf(buf, sizeof(buf), wd->units, wd->val);
edje_object_part_text_set(wd->slider, "elm.units", buf);
}
else
edje_object_part_text_set(wd->slider, "elm.units", NULL);
}
static void
_indicator_set(Evas_Object *obj)
{
Widget_Data *wd = elm_widget_data_get(obj);
if (wd->indicator)
{
char buf[1024];
snprintf(buf, sizeof(buf), wd->indicator, wd->val);
edje_object_part_text_set(wd->slider, "elm.indicator", buf);
}
else
edje_object_part_text_set(wd->slider, "elm.indicator", NULL);
}
static void
_drag(void *data, Evas_Object *obj, const char *emission, const char *source)
{
_val_fetch(data);
_units_set(data);
_indicator_set(data);
}
static void
_drag_start(void *data, Evas_Object *obj, const char *emission, const char *source)
{
_val_fetch(data);
_units_set(data);
_indicator_set(data);
}
static void
_drag_stop(void *data, Evas_Object *obj, const char *emission, const char *source)
{
_val_fetch(data);
_units_set(data);
_indicator_set(data);
}
EAPI Evas_Object *
elm_slider_add(Evas_Object *parent)
{
Evas_Object *obj;
Evas *e;
Widget_Data *wd;
wd = ELM_NEW(Widget_Data);
e = evas_object_evas_get(parent);
obj = elm_widget_add(e);
elm_widget_data_set(obj, wd);
elm_widget_del_hook_set(obj, _del_hook);
elm_widget_theme_hook_set(obj, _theme_hook);
wd->horizontal = 1;
wd->val = 0.0;
wd->val_min = 0.0;
wd->val_max = 1.0;
wd->slider = edje_object_add(e);
_elm_theme_set(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_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, 1);
elm_widget_sub_object_add(obj, wd->spacer);
edje_object_part_swallow(wd->slider, "elm.swallow.bar", wd->spacer);
evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);
_sizing_eval(obj);
return obj;
}
EAPI void
elm_slider_label_set(Evas_Object *obj, const char *label)
{
Widget_Data *wd = elm_widget_data_get(obj);
if (wd->label) eina_stringshare_del(wd->label);
if (label)
{
wd->label = eina_stringshare_add(label);
edje_object_signal_emit(wd->slider, "elm,state,text,visible", "elm");
edje_object_message_signal_process(wd->slider);
}
else
{
wd->label = NULL;
edje_object_signal_emit(wd->slider, "elm,state,text,hidden", "elm");
edje_object_message_signal_process(wd->slider);
}
edje_object_part_text_set(wd->slider, "elm.text", label);
_sizing_eval(obj);
}
EAPI void
elm_slider_icon_set(Evas_Object *obj, Evas_Object *icon)
{
Widget_Data *wd = elm_widget_data_get(obj);
if ((wd->icon != icon) && (wd->icon))
elm_widget_sub_object_del(obj, wd->icon);
wd->icon = icon;
if (icon)
{
elm_widget_sub_object_add(obj, icon);
edje_object_part_swallow(wd->slider, "elm.swallow.content", icon);
edje_object_signal_emit(wd->slider, "elm,state,icon,visible", "elm");
evas_object_event_callback_add(icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
_changed_size_hints, obj);
_sizing_eval(obj);
}
}
EAPI void
elm_slider_span_size_set(Evas_Object *obj, Evas_Coord size)
{
Widget_Data *wd = elm_widget_data_get(obj);
if (wd->size == size) return;
wd->size = size;
if (wd->horizontal)
evas_object_size_hint_min_set(wd->spacer, (double)wd->size * elm_widget_scale_get(obj) * _elm_config->scale, 1);
else
evas_object_size_hint_min_set(wd->spacer, 1, (double)wd->size * elm_widget_scale_get(obj) * _elm_config->scale);
edje_object_part_swallow(wd->slider, "elm.swallow.bar", wd->spacer);
_sizing_eval(obj);
}
EAPI void
elm_slider_unit_format_set(Evas_Object *obj, const char *units)
{
Widget_Data *wd = elm_widget_data_get(obj);
if (wd->units) eina_stringshare_del(wd->units);
if (units)
{
wd->units = eina_stringshare_add(units);
edje_object_signal_emit(wd->slider, "elm,state,units,visible", "elm");
edje_object_message_signal_process(wd->slider);
}
else
{
wd->units = NULL;
edje_object_signal_emit(wd->slider, "elm,state,units,hidden", "elm");
edje_object_message_signal_process(wd->slider);
}
_units_set(obj);
_sizing_eval(obj);
}
EAPI void
elm_slider_indicator_format_set(Evas_Object *obj, const char *indicator)
{
Widget_Data *wd = elm_widget_data_get(obj);
if (wd->indicator) eina_stringshare_del(wd->indicator);
if (indicator) wd->indicator = eina_stringshare_add(indicator);
else wd->indicator = NULL;
_indicator_set(obj);
}
EAPI void
elm_slider_horizontal_set(Evas_Object *obj, Evas_Bool horizontal)
{
Widget_Data *wd = elm_widget_data_get(obj);
horizontal = !!horizontal;
if (wd->horizontal == horizontal) return;
wd->horizontal = horizontal;
_theme_hook(obj);
}
EAPI void
elm_slider_min_max_set(Evas_Object *obj, double min, double max)
{
Widget_Data *wd = elm_widget_data_get(obj);
if ((wd->val_min == min) && (wd->val_max == max)) return;
wd->val_min = min;
wd->val_max = max;
if (wd->val < wd->val_min) wd->val = wd->val_min;
if (wd->val > wd->val_max) wd->val = wd->val_max;
_val_set(obj);
_units_set(obj);
_indicator_set(obj);
}
EAPI void
elm_slider_value_set(Evas_Object *obj, double val)
{
Widget_Data *wd = elm_widget_data_get(obj);
if (wd->val == val) return;
wd->val = val;
if (wd->val < wd->val_min) wd->val = wd->val_min;
if (wd->val > wd->val_max) wd->val = wd->val_max;
_val_set(obj);
_units_set(obj);
_indicator_set(obj);
}
EAPI double
elm_slider_value_get(Evas_Object *obj)
{
Widget_Data *wd = elm_widget_data_get(obj);
return wd->val;
}
EAPI void
elm_slider_inverted_set(Evas_Object *obj, Evas_Bool inverted)
{
Widget_Data *wd = elm_widget_data_get(obj);
inverted = !!inverted;
if (wd->inverted == inverted) return;
wd->inverted = inverted;
if (wd->inverted)
edje_object_signal_emit(wd->slider, "elm,state,inverted,on", "elm");
else
edje_object_signal_emit(wd->slider, "elm,state,inverted,off", "elm");
edje_object_message_signal_process(wd->slider);
_val_set(obj);
_units_set(obj);
_indicator_set(obj);
}