diff --git a/legacy/elementary/data/themes/Makefile.am b/legacy/elementary/data/themes/Makefile.am index 46c657eea2..b3667a3aa0 100644 --- a/legacy/elementary/data/themes/Makefile.am +++ b/legacy/elementary/data/themes/Makefile.am @@ -108,7 +108,10 @@ sl_bt2_0_1.png \ sl_bt2_0_2.png \ sl_bt2_1.png \ sl_bt2_2.png \ -sl_units.png +sl_units.png \ +slv_bg.png \ +slv_bg_over.png \ +slv_units.png default.edj: Makefile $(EXTRA_DIST) $(EDJE_CC) $(EDJE_FLAGS) \ diff --git a/legacy/elementary/data/themes/default.edc b/legacy/elementary/data/themes/default.edc index 67d23e6f74..0a2161e31f 100644 --- a/legacy/elementary/data/themes/default.edc +++ b/legacy/elementary/data/themes/default.edc @@ -6080,7 +6080,7 @@ collections { visible: 1; aspect: 1.0 1.0; aspect_preference: VERTICAL; - rel2.offset: 4 -5; + rel2.offset: 4 -1; } } part { name: "elm.text"; @@ -6461,8 +6461,9 @@ collections { group { name: "elm/slider/vertical/default"; images { - image: "sl_bg.png" COMP; - image: "sl_bg_over.png" COMP; + image: "slv_bg.png" COMP; + image: "slv_bg_over.png" COMP; + image: "sl_bt_0.png" COMP; image: "sl_bt_1.png" COMP; image: "sl_bt_2.png" COMP; @@ -6471,21 +6472,22 @@ collections { image: "sl_bt2_0_2.png" COMP; image: "sl_bt2_1.png" COMP; image: "sl_bt2_2.png" COMP; - image: "sl_units.png" COMP; + + image: "slv_units.png" COMP; } parts { part { name: "base"; mouse_events: 0; description { state: "default" 0.0; - max: 99999 6; - min: 0 6; + max: 6 99999; + min: 6 0; rel1 { to: "bg"; offset: 1 0; } rel2 { to: "bg"; offset: -2 -1; } - image.normal: "sl_bg.png"; + image.normal: "slv_bg.png"; fill.smooth: 0; } } @@ -6495,9 +6497,9 @@ collections { description { state: "default" 0.0; rel1.to: "base"; rel2 { - to_y: "base"; - to_x: "elm.dragable.slider"; - relative: 0.5 1.0; + to_x: "base"; + to_y: "elm.dragable.slider"; + relative: 1.0 0.5; } color: 255 0 0 200; } @@ -6512,9 +6514,9 @@ collections { description { state: "default" 0.0; visible: 0; rel1 { - to_y: "base"; - to_x: "elm.dragable.slider"; - relative: 0.5 0.0; + to_x: "base"; + to_y: "elm.dragable.slider"; + relative: 0.0 0.5; } rel2.to: "base"; color: 255 0 0 200; @@ -6533,7 +6535,7 @@ collections { rel2.to: "base"; rel2.offset: 0 0; image { - normal: "sl_bg_over.png"; + normal: "slv_bg_over.png"; border: 3 3 3 3; } fill.smooth: 0; @@ -6554,18 +6556,18 @@ collections { type: SWALLOW; scale: 1; description { state: "default" 0.0; - min: 48 24; - max: 99999 24; + min: 24 48; + max: 24 9999; align: 1.0 0.5; rel1 { - to_x: "elm.text"; - relative: 1.0 0.0; - offset: 2 0; + to_y: "elm.text"; + relative: 0.0 1.0; + offset: 0 2; } rel2 { - to_x: "elm.units"; - relative: 0.0 1.0; - offset: -3 -1; + to_y: "elm.units"; + relative: 1.0 0.0; + offset: -1 -3; } } } @@ -6573,23 +6575,23 @@ collections { type: SWALLOW; description { state: "default" 0.0; visible: 0; - align: 0.0 0.5; + align: 0.5 0.0; rel1 { - offset: 4 0; - to_y: "elm.swallow.bar"; + offset: 0 4; + to_x: "elm.swallow.bar"; } rel2 { - offset: 3 -1; - relative: 0.0 1.0; - to_y: "elm.swallow.bar"; + offset: -1 3; + relative: 1.0 0.0; + to_x: "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; + aspect_preference: HORIZONTAL; + rel2.offset: -1 4; } } part { name: "elm.text"; @@ -6599,27 +6601,27 @@ collections { 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; + align: 0.5 0.0; + rel1.to_y: "elm.swallow.content"; + rel1.relative: 0.5 1.0; + rel1.offset: 0 -1; + rel2.to_y: "elm.swallow.content"; + rel2.relative: 0.5 1.0; + rel2.offset: -1 -1; color: 0 0 0 255; text { font: "Sans,Edje-Vera"; size: 10; min: 0 0; - align: 0.0 0.5; + align: 0.5 0.0; } } description { state: "visible" 0.0; inherit: "default" 0.0; visible: 1; text.min: 1 1; - rel1.offset: 0 4; - rel2.offset: 0 -5; + rel1.offset: 4 0; + rel2.offset: -5 0; } } part { name: "units"; @@ -6627,12 +6629,16 @@ collections { description { state: "default" 0.0; visible: 0; rel1 { - to_x: "elm.units"; - offset: 0 5; + to: "elm.units"; + offset: -8 0; + } + rel2 { + to: "elm.units"; + offset: 7 8; } image { - normal: "sl_units.png"; - border: 0 5 3 8; + normal: "slv_units.png"; + border: 8 8 0 9; } fill.smooth: 0; } @@ -6648,17 +6654,17 @@ collections { 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; + align: 0.5 1.0; + rel1.relative: 0.0 1.0; + rel1.offset: 8 0; rel2.relative: 1.0 1.0; - rel2.offset: 0 -9; + rel2.offset: -9 0; color: 0 0 0 255; text { font: "Sans,Edje-Vera"; size: 10; min: 0 0; - align: 0.0 0.5; + align: 0.5 0.0; } } description { state: "visible" 0.0; @@ -6666,8 +6672,8 @@ collections { fixed: 1 1; visible: 1; text.min: 1 1; - rel1.offset: -5 0; - rel2.offset: -5 -1; + rel1.offset: 8 -9; + rel2.offset: -9 -9; } } part { name: "elm.dragable.slider"; @@ -6769,6 +6775,7 @@ collections { visible: 0; max: 15 999; min: 15 32; + fixed: 1 1; rel1 { to_x: "elm.dragable.slider"; to_y: "elm.indicator"; @@ -6829,7 +6836,7 @@ collections { offset: 0 0; } rel2 { - to_x: "elm.dragable.slider"; + to: "elm.dragable.slider"; relative: 1.0 0.0; offset: -1 0; } diff --git a/legacy/elementary/src/bin/test.c b/legacy/elementary/src/bin/test.c index a729524c79..7cc53bf2d7 100644 --- a/legacy/elementary/src/bin/test.c +++ b/legacy/elementary/src/bin/test.c @@ -2020,12 +2020,17 @@ my_bt_28(void *data, Evas_Object *obj, void *event_info) evas_object_show(ic); evas_object_show(sl); + 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_HORIZONTAL, 1, 1); sl = elm_slider_add(win); + elm_slider_icon_set(sl, ic); elm_slider_label_set(sl, "Label 4"); 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); + evas_object_size_hint_align_set(sl, 0.5, -1.0); + evas_object_size_hint_weight_set(sl, 0.0, 1.0); elm_slider_indicator_format_set(sl, "%1.1f"); elm_slider_value_set(sl, 0.2); elm_object_scale_set(sl, 1.0); diff --git a/legacy/elementary/src/lib/Elementary.h.in b/legacy/elementary/src/lib/Elementary.h.in index 9efa39d51a..ca1ccf3aa2 100644 --- a/legacy/elementary/src/lib/Elementary.h.in +++ b/legacy/elementary/src/lib/Elementary.h.in @@ -466,6 +466,7 @@ extern "C" { * "unselected" - when the user selected an item */ + // FIXME: incomplete - carousel typedef struct _Elm_Carousel_Item Elm_Carousel_Item; EAPI Evas_Object *elm_carousel_add(Evas_Object *parent); EAPI Elm_Carousel_Item *elm_carousel_item_add(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func) (void *data, Evas_Object *obj, void *event_info), const void *data); @@ -476,24 +477,43 @@ extern "C" { */ 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); - - + 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). */ + typedef enum _Elm_Genlist_Item_Flags + { + ELM_GENLIST_ITEM_DISABLED, + ELM_GENLIST_ITEM_EXPANDED + } Elm_Genlist_Item_Flags; + typedef struct _Elm_Genlist_Item_Class Elm_Genlist_Item_Class; + typedef struct _Elm_Genlist_Item Elm_Genlist_Item; + struct _Elm_Genlist_Item_Class + { + const char *style; + struct { + char *(*label_get) (const void *data, const char *part); + Evas_Object *(*icon_get) (const void *data, const char *part); + Evas_Bool (*state_get) (const void *data, const char *part); + } func; + }; + EAPI Evas_Object *elm_genlist_add(Evas_Object *parent); + EAPI Elm_Genlist_Item *elm_genlist_item_add(Evas_Object *obj, const Elm_Genlist_Item_Class *itc, const void *data, Elm_Genlist_Item *parent, Elm_Genlist_Item_Flags flags); + /* smart callbacks called: + */ + #ifdef __cplusplus } #endif @@ -520,18 +540,22 @@ extern "C" { // * when entries are in a scroller and change size, the scroller shows scrollbars. fix. same for selecting. for 1 line entries in a scroller should only have scroll arrow indicators. // //// (more widgets/features - medium priority) -// * slider widget -// * +// * biglist widget (restricted format label + icon intended for massive lists) +// * treeview widget (like biglist - but items can expand to sub-items) // * radio + group handling // * checkbox (like toggle) // * pager (for pushing/popping pages and going back and forward and flipping) // * -// * biglist widget (restricted format label + icon intended for massive lists) -// * treeview widget (like biglist - but items can expand to sub-items) +// * // * // // * carousel selector widget // * auto-size label/text that adapts text size to its allocated region +// * [ scrollable dropdown combo box ] +// * [ notepad widget ] +// * [ toggle with 2x labelled button for 2 states ] +// * [ poker spinner with numbers + labels ] +// * [ wrapping text button bar ] // * separator widget (h/v) // * slide-open "panel" that can hold stuff and optionally scroll // * calendar widget (select date) diff --git a/legacy/elementary/src/lib/Makefile.am b/legacy/elementary/src/lib/Makefile.am index 019dd4c366..8ed7ef71d9 100644 --- a/legacy/elementary/src/lib/Makefile.am +++ b/legacy/elementary/src/lib/Makefile.am @@ -48,6 +48,7 @@ elm_toolbar.c \ elm_list.c \ elm_carousel.c \ elm_slider.c \ +elm_genlist.c \ \ elc_notepad.c \ elc_anchorview.c \ diff --git a/legacy/elementary/src/lib/elm_genlist.c b/legacy/elementary/src/lib/elm_genlist.c new file mode 100644 index 0000000000..2fe0858edc --- /dev/null +++ b/legacy/elementary/src/lib/elm_genlist.c @@ -0,0 +1,136 @@ +#include +#include "elm_priv.h" + +typedef struct _Widget_Data Widget_Data; + +struct _Widget_Data +{ + Evas_Object *scr; + Evas_Object *content; + Evas_Bool min_w : 1; + Evas_Bool min_h : 1; +}; + +static void _del_hook(Evas_Object *obj); +static void _theme_hook(Evas_Object *obj); +static void _show_region_hook(void *data, Evas_Object *obj); +static void _sizing_eval(Evas_Object *obj); +static void _sub_del(void *data, Evas_Object *obj, void *event_info); + +static void +_del_hook(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + free(wd); +} + +static void +_theme_hook(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + elm_smart_scroller_theme_set(wd->scr, "scroller", "base", "default"); + edje_object_scale_set(wd->scr, elm_widget_scale_get(obj) * _elm_config->scale); + _sizing_eval(obj); +} + +static void +_show_region_hook(void *data, Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(data); + Evas_Coord x, y, w, h; + elm_widget_show_region_get(obj, &x, &y, &w, &h); + elm_smart_scroller_child_region_show(wd->scr, x, y, w, h); +} + +static void +_sizing_eval(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + Evas_Coord vw, vh, minw, minh, maxw, maxh, w, h, vmw, vmh; + double xw, xy; + + evas_object_size_hint_min_get(wd->content, &minw, &minh); + evas_object_size_hint_max_get(wd->content, &maxw, &maxh); + evas_object_size_hint_weight_get(wd->content, &xw, &xy); + elm_smart_scroller_child_viewport_size_get(wd->scr, &vw, &vh); + if (xw > 0.0) + { + if ((minw > 0) && (vw < minw)) vw = minw; + else if ((maxw > 0) && (vw > maxw)) vw = maxw; + } + else if (minw > 0) vw = minw; + if (xy > 0.0) + { + if ((minh > 0) && (vh < minh)) vh = minh; + else if ((maxh > 0) && (vh > maxh)) vh = maxh; + } + else if (minh > 0) vh = minh; + evas_object_resize(wd->content, vw, vh); + w = -1; + h = -1; + edje_object_size_min_calc(elm_smart_scroller_edje_object_get(wd->scr), &vmw, &vmh); + if (wd->min_w) w = vmw + minw; + if (wd->min_h) h = vmh + minh; + evas_object_size_hint_min_set(obj, w, h); +} + +static void +_changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + _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->content) + { + elm_widget_on_show_region_hook_set(wd->content, NULL, NULL); + evas_object_event_callback_del + (sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints); + wd->content = NULL; + _sizing_eval(obj); + } +} + +static void +_resize(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + _sizing_eval(data); +} + +EAPI Evas_Object * +elm_genlist_add(Evas_Object *parent) +{ + Evas_Object *obj; + Evas *e; + Widget_Data *wd; + Evas_Coord vw, vh, minw, minh; + + 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->scr = elm_smart_scroller_add(e); + elm_widget_resize_object_set(obj, wd->scr); + + edje_object_size_min_calc(elm_smart_scroller_edje_object_get(wd->scr), &minw, &minh); + evas_object_size_hint_min_set(obj, minw, minh); + evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _resize, obj); + +// evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj); + + _sizing_eval(obj); + return obj; +} + +EAPI Elm_Genlist_Item * +elm_genlist_item_add(Evas_Object *obj, const Elm_Genlist_Item_Class *itc, const void *data, Elm_Genlist_Item *parent, Elm_Genlist_Item_Flags flags) +{ + Widget_Data *wd = elm_widget_data_get(obj); +} diff --git a/legacy/elementary/src/lib/els_scroller.c b/legacy/elementary/src/lib/els_scroller.c index 8ca68450bc..14d573cb77 100644 --- a/legacy/elementary/src/lib/els_scroller.c +++ b/legacy/elementary/src/lib/els_scroller.c @@ -27,6 +27,8 @@ struct _Smart_Data double timestamp; } history[20]; double anim_start; + Evas_Coord hold_x, hold_y; + Ecore_Animator *hold_animator; Ecore_Animator *momentum_animator; Evas_Coord locked_x, locked_y; unsigned char now : 1; @@ -63,6 +65,7 @@ static void _smart_pan_changed_hook(void *data, Evas_Object *obj, void *event_in static void _smart_pan_pan_changed_hook(void *data, Evas_Object *obj, void *event_info); static void _smart_event_wheel(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _smart_event_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info); +static int _smart_hold_animator(void *data); static int _smart_momentum_animator(void *data); static void _smart_event_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _smart_event_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info); @@ -431,6 +434,11 @@ _smart_event_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info) ev = event_info; if (_elm_config->thumbscroll_enable) { + if (sd->down.hold_animator) + { + ecore_animator_del(sd->down.hold_animator); + sd->down.hold_animator = NULL; + } if (sd->down.momentum_animator) { ecore_animator_del(sd->down.momentum_animator); @@ -456,6 +464,17 @@ _smart_event_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info) } } +static int +_smart_hold_animator(void *data) +{ + Smart_Data *sd; + + sd = data; + sd->down.hold_animator = NULL; + elm_smart_scroller_child_pos_set(sd->smart_obj, sd->down.hold_x, sd->down.hold_y); + return 0; +} + static int _smart_momentum_animator(void *data) { @@ -533,6 +552,11 @@ _smart_event_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info) { if (!sd->down.momentum_animator) sd->down.momentum_animator = ecore_animator_add(_smart_momentum_animator, sd); + if (sd->down.hold_animator) + { + ecore_animator_del(sd->down.hold_animator); + sd->down.hold_animator = NULL; + } sd->down.dx = ((double)dx / at); sd->down.dy = ((double)dy / at); sd->down.anim_start = t; @@ -614,7 +638,11 @@ _smart_event_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info) if (sd->down.dir_x) y = sd->down.locked_y; else x = sd->down.locked_x; } - elm_smart_scroller_child_pos_set(sd->smart_obj, x, y); + sd->down.hold_x = x; + sd->down.hold_y = y; + if (!sd->down.hold_animator) + sd->down.hold_animator = ecore_animator_add(_smart_hold_animator, sd); +// elm_smart_scroller_child_pos_set(sd->smart_obj, x, y); } } } @@ -975,6 +1003,7 @@ _smart_del(Evas_Object *obj) if (!sd->extern_pan) evas_object_del(sd->pan_obj); evas_object_del(sd->edje_obj); evas_object_del(sd->event_obj); + if (sd->down.hold_animator) ecore_animator_del(sd->down.hold_animator); if (sd->down.momentum_animator) ecore_animator_del(sd->down.momentum_animator); free(sd); evas_object_smart_data_set(obj, NULL);