From 9e254d13139fab2531519d41b4b1db7e5aee9edb Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Sat, 7 Jul 2012 09:44:52 +0000 Subject: [PATCH] slider popup outside widget mode. backwards-compatible too. :) i know - freeze is on. last thing going into elm. only because i rejected the patch at the last minute and it was small enough to do now. SVN revision: 73450 --- legacy/elementary/ChangeLog | 14 +- .../elementary/data/themes/widgets/slider.edc | 187 +++++++++++++++-- legacy/elementary/src/lib/elm_slider.c | 192 +++++++++++++++++- 3 files changed, 362 insertions(+), 31 deletions(-) diff --git a/legacy/elementary/ChangeLog b/legacy/elementary/ChangeLog index ed2963aaa3..9f619fcb24 100644 --- a/legacy/elementary/ChangeLog +++ b/legacy/elementary/ChangeLog @@ -256,20 +256,20 @@ * Add and use elm_widget_item_widget_get() * Fix elm_segment_control to not abuse user's data from item. -2012-07-3 Cedric Bail +2012-07-03 Cedric Bail * Initialize Emotion when necessary. -2012-07-3 Minseok Kim +2012-07-03 Minseok Kim * Add elm_multibuttonentry_editable_set() and elm_multibuttonentry_editable_get() -2012-07-3 Shinwoo Kim (kimcinoo) +2012-07-03 Shinwoo Kim (kimcinoo) * Add access hook to widget infra. -2012-07-5 Carsten Haitzler (The Rasterman) +2012-07-05 Carsten Haitzler (The Rasterman) * Fix several FB related issues: * Fallback to FB from X11 so it "just works" @@ -279,9 +279,13 @@ softcursor mode defaulting to auto. * Add elm_win_screen_dpi_get() -2012-07-6 Shinwoo Kim (kimcinoo) +2012-07-06 Shinwoo Kim (kimcinoo) * Add layout access enable/disable api: * elm_layout_edje_object_can_access_set/get() +2012-07-07 Carsten Haitzler (The Rasterman) + * Add slider popup mode (based in idea originally proposed in + patches from Sumanth Krishna Mannam, but susbequently rejected + a few times as it didn't measure up to commitable standards). diff --git a/legacy/elementary/data/themes/widgets/slider.edc b/legacy/elementary/data/themes/widgets/slider.edc index b8700e7461..31503e1b6a 100644 --- a/legacy/elementary/data/themes/widgets/slider.edc +++ b/legacy/elementary/data/themes/widgets/slider.edc @@ -356,11 +356,22 @@ group { name: "elm/slider/horizontal/default"; text.min: 1 1; } } - part { name: "elm.dragable.slider"; + part { name: "button"; type: GROUP; source: "elm/slider/horizontal/indicator/default"; - mouse_events: 1; - repeat_events: 1; + mouse_events: 0; + description { state: "default" 0.0; + fixed: 1 1; + rel1.to: "elm.dragable.slider"; + rel2.to: "elm.dragable.slider"; + } + description { state: "hidden" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { name: "elm.dragable.slider"; + type: RECT; scale: 1; dragable { x: 1 1 0; @@ -368,8 +379,8 @@ group { name: "elm/slider/horizontal/default"; confine: "bg"; } description { state: "default" 0.0; - min: 0 24; - max: 0 24; + min: 0 0; + max: 0 0; fixed: 1 1; rel1 { relative: 0.5 0.0; @@ -379,7 +390,30 @@ group { name: "elm/slider/horizontal/default"; relative: 0.5 1.0; to_x: "bg"; } - color: 255 0 0 100; + color: 0 0 0 0; + } + } + part { name: "slideevent"; + type: RECT; + mouse_events: 1; + scale: 1; + dragable.events: "elm.dragable.slider"; + description { state: "default" 0.0; + fixed: 1 1; + min: 24 24; + max: 24 24; + rel1.to: "elm.dragable.slider"; + rel2.to: "elm.dragable.slider"; + color: 0 0 0 0; + } + } + part { name: "elm.track.slider"; + type: SWALLOW; + mouse_events: 0; + description { state: "default" 0.0; + max: 0 0; + rel1.to: "elm.dragable.slider"; + rel2.to: "elm.dragable.slider"; } } part { name: "disabler"; @@ -395,6 +429,38 @@ group { name: "elm/slider/horizontal/default"; } } programs { + program { name: "indicator_show"; + signal: "elm,state,indicator,show"; + source: "elm"; + action: SIGNAL_EMIT "popup,show" "elm"; + after: "popup_show2"; + } + program { name: "indicator_hide"; + signal: "elm,state,indicator,hide"; + source: "elm"; + action: SIGNAL_EMIT "popup,hide" "elm"; + after: "popup_hide2"; + } + program { name: "popup_show"; + signal: "mouse,down,1"; + source: "slideevent"; + action: SIGNAL_EMIT "popup,show" "elm"; + after: "popup_show2"; + } + program { name: "popup_show2"; + action: STATE_SET "hidden" 0.0; + target: "button"; + } + program { name: "popup_hide"; + signal: "mouse,up,1"; + source: "slideevent"; + action: SIGNAL_EMIT "popup,hide" "elm"; + after: "popup_hide2"; + } + program { name: "popup_hide2"; + action: STATE_SET "default" 0.0; + target: "button"; + } program { name: "text_show"; signal: "elm,state,text,visible"; source: "elm"; @@ -854,11 +920,22 @@ group { name: "elm/slider/vertical/default"; color3: 0 0 0 0; } } - part { name: "elm.dragable.slider"; + part { name: "button"; type: GROUP; - source: "elm/slider/vertical/indicator/default"; - mouse_events: 1; - repeat_events: 1; + source: "elm/slider/horizontal/indicator/default"; + mouse_events: 0; + description { state: "default" 0.0; + fixed: 1 1; + rel1.to: "elm.dragable.slider"; + rel2.to: "elm.dragable.slider"; + } + description { state: "hidden" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { name: "elm.dragable.slider"; + type: RECT; scale: 1; dragable { x: 0 0 0; @@ -866,20 +943,43 @@ group { name: "elm/slider/vertical/default"; confine: "bg"; } description { state: "default" 0.0; - min: 24 0; - max: 24 0; + min: 0 0; + max: 0 0; fixed: 1 1; rel1 { - relative: 0.5 0.0; - to_y: "bg"; + relative: 0.0 0.5; + to_x: "bg"; } rel2 { - relative: 0.5 1.0; - to_y: "bg"; + relative: 1.0 0.5; + to_x: "bg"; } color: 0 0 0 0; } } + part { name: "slideevent"; + type: RECT; + mouse_events: 1; + scale: 1; + dragable.events: "elm.dragable.slider"; + description { state: "default" 0.0; + fixed: 1 1; + min: 24 24; + max: 24 24; + rel1.to: "elm.dragable.slider"; + rel2.to: "elm.dragable.slider"; + color: 0 0 0 0; + } + } + part { name: "elm.track.slider"; + type: SWALLOW; + mouse_events: 0; + description { state: "default" 0.0; + max: 0 0; + rel1.to: "elm.dragable.slider"; + rel2.to: "elm.dragable.slider"; + } + } part { name: "disabler"; type: RECT; description { state: "default" 0.0; @@ -894,6 +994,38 @@ group { name: "elm/slider/vertical/default"; } programs { + program { name: "indicator_show"; + signal: "elm,state,indicator,show"; + source: "elm"; + action: SIGNAL_EMIT "popup,show" "elm"; + after: "popup_show2"; + } + program { name: "indicator_hide"; + signal: "elm,state,indicator,hide"; + source: "elm"; + action: SIGNAL_EMIT "popup,hide" "elm"; + after: "popup_hide2"; + } + program { name: "popup_show"; + signal: "mouse,down,1"; + source: "slideevent"; + action: SIGNAL_EMIT "popup,show" "elm"; + after: "popup_show2"; + } + program { name: "popup_show2"; + action: STATE_SET "hidden" 0.0; + target: "button"; + } + program { name: "popup_hide"; + signal: "mouse,up,1"; + source: "slideevent"; + action: SIGNAL_EMIT "popup,hide" "elm"; + after: "popup_hide2"; + } + program { name: "popup_hide2"; + action: STATE_SET "default" 0.0; + target: "button"; + } program { name: "text_show"; signal: "elm,state,text,visible"; source: "elm"; @@ -1061,6 +1193,10 @@ group { name: "elm/slider/horizontal/indicator/default"; alias: "elm/slider/horizontal/indicator/disabled"; alias: "elm/slider/vertical/indicator/default"; alias: "elm/slider/vertical/indicator/disabled"; + + alias: "elm/slider/horizontal/popup/default"; + alias: "elm/slider/vertical/popup/default"; + images { image: "sl_bt_0.png" COMP; image: "sl_bt_1.png" COMP; @@ -1323,6 +1459,25 @@ group { name: "elm/slider/horizontal/indicator/default"; } } programs { + program { name: "popup_show"; + signal: "popup,show"; + source: "elm"; + script { + thumb_down(); + } + } + program { name: "popup_hide"; + signal: "popup,hide"; + source: "elm"; + action: SIGNAL_EMIT "popup,hide,done" "elm"; + } + program { name: "popup_hide2"; + signal: "popup,hide"; + source: "elm"; + script { + thumb_up(); + } + } program { name: "set_val_show"; signal: "elm,state,val,show"; source: "elm"; diff --git a/legacy/elementary/src/lib/elm_slider.c b/legacy/elementary/src/lib/elm_slider.c index ca9ccc898b..431d19c11e 100644 --- a/legacy/elementary/src/lib/elm_slider.c +++ b/legacy/elementary/src/lib/elm_slider.c @@ -10,7 +10,7 @@ struct _Elm_Slider_Smart_Data { Elm_Layout_Smart_Data base; - Evas_Object *spacer; + Evas_Object *spacer, *popup, *track; Ecore_Timer *delay; const char *units; @@ -31,6 +31,7 @@ struct _Elm_Slider_Smart_Data Eina_Bool indicator_show : 1; Eina_Bool spacer_down : 1; Eina_Bool frozen : 1; + Eina_Bool popup_hiding : 1; }; static const Elm_Layout_Part_Alias_Description _content_aliases[] = @@ -111,7 +112,7 @@ _val_fetch(Evas_Object *obj) edje_object_part_drag_value_get (ELM_WIDGET_DATA(sd)->resize_obj, "elm.dragable.slider", &posx, &posy); if (sd->horizontal) pos = posx; - else pos = posy; + else pos = posy; rtl = elm_widget_mirrored_get(obj); if ((!rtl && sd->inverted) || @@ -189,7 +190,10 @@ _indicator_set(Evas_Object *obj) char *buf; buf = sd->indicator_format_func(sd->val); + elm_layout_text_set(obj, "elm.indicator", buf); elm_layout_text_set(obj, "elm.dragable.slider:elm.indicator", buf); + if (sd->popup) + edje_object_part_text_set(sd->popup, "elm.indicator", buf); if (sd->indicator_format_free) sd->indicator_format_free(buf); } @@ -198,9 +202,18 @@ _indicator_set(Evas_Object *obj) char buf[1024]; snprintf(buf, sizeof(buf), sd->indicator, sd->val); + elm_layout_text_set(obj, "elm.indicator", buf); elm_layout_text_set(obj, "elm.dragable.slider:elm.indicator", buf); + if (sd->popup) + edje_object_part_text_set(sd->popup, "elm.indicator", buf); + } + else + { + elm_layout_text_set(obj, "elm.indicator", NULL); + elm_layout_text_set(obj, "elm.dragable.slider:elm.indicator", NULL); + if (sd->popup) + edje_object_part_text_set(sd->popup, "elm.indicator", NULL); } - else elm_layout_text_set(obj, "elm.dragable.slider:elm.indicator", NULL); } static void @@ -287,6 +300,68 @@ _drag_down(void *data, (ELM_WIDGET_DATA(sd)->resize_obj, "elm.dragable.slider", step, step); } +static void +_popup_show(void *data, + Evas_Object *obj __UNUSED__, + const char *emission __UNUSED__, + const char *source __UNUSED__) +{ + ELM_SLIDER_DATA_GET(data, sd); + if (sd->popup) + { + evas_object_raise(sd->popup); + evas_object_show(sd->popup); + edje_object_signal_emit(sd->popup, "popup,show", "elm"); + } +} + +static void +_popup_hide(void *data, + Evas_Object *obj __UNUSED__, + const char *emission __UNUSED__, + const char *source __UNUSED__) +{ + ELM_SLIDER_DATA_GET(data, sd); + if (sd->popup) + { + if (!sd->popup_hiding) + { + edje_object_signal_emit(sd->popup, "popup,hide", "elm"); + sd->popup_hiding = EINA_TRUE; + } + } +} + +static void +_popup_hide_done(void *data, + Evas_Object *obj __UNUSED__, + const char *emission __UNUSED__, + const char *source __UNUSED__) +{ + ELM_SLIDER_DATA_GET(data, sd); + if (sd->popup) + { + if (sd->popup_hiding) + { + evas_object_hide(sd->popup); + sd->popup_hiding = EINA_FALSE; + } + } +} + +static void +_popup_emit(void *data, + Evas_Object *obj __UNUSED__, + const char *emission, + const char *source) +{ + ELM_SLIDER_DATA_GET(data, sd); + if (sd->popup) + { + edje_object_signal_emit(sd->popup, emission, source); + } +} + static Eina_Bool _elm_slider_smart_event(Evas_Object *obj, Evas_Object *src __UNUSED__, @@ -375,9 +450,21 @@ _elm_slider_smart_theme(Evas_Object *obj) ELM_SLIDER_DATA_GET(obj, sd); if (sd->horizontal) - eina_stringshare_replace(&ELM_LAYOUT_DATA(sd)->group, "horizontal"); + { + eina_stringshare_replace(&ELM_LAYOUT_DATA(sd)->group, "horizontal"); + if (sd->popup) + _elm_theme_set(NULL, sd->popup, + "slider", "horizontal/popup", + elm_widget_style_get(obj)); + } else - eina_stringshare_replace(&ELM_LAYOUT_DATA(sd)->group, "vertical"); + { + eina_stringshare_replace(&ELM_LAYOUT_DATA(sd)->group, "vertical"); + if (sd->popup) + _elm_theme_set(NULL, sd->popup, + "slider", "vertical/popup", + elm_widget_style_get(obj)); + } if (!ELM_WIDGET_CLASS(_elm_slider_parent_sc)->theme(obj)) return EINA_FALSE; @@ -394,11 +481,17 @@ _elm_slider_smart_theme(Evas_Object *obj) elm_config_scale_get()); if (sd->inverted) - elm_layout_signal_emit(obj, "elm,state,inverted,on", "elm"); + { + elm_layout_signal_emit(obj, "elm,state,inverted,on", "elm"); + if (sd->popup) + edje_object_signal_emit(sd->popup, "elm,state,inverted,on", "elm"); + } _visuals_refresh(obj); edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj); + if (sd->popup) + edje_object_message_signal_process(sd->popup); elm_layout_sizing_eval(obj); @@ -544,6 +637,32 @@ _spacer_up_cb(void *data, elm_layout_signal_emit(data, "elm,state,indicator,hide", "elm"); } +static void +_track_move_cb(void *data, + Evas *e __UNUSED__, + Evas_Object *obj, + void *event_info __UNUSED__) +{ + Evas_Coord x, y; + + ELM_SLIDER_DATA_GET(data, sd); + evas_object_geometry_get(obj, &x, &y, NULL, NULL); + evas_object_move(sd->popup, x, y); +} + +static void +_track_resize_cb(void *data, + Evas *e __UNUSED__, + Evas_Object *obj, + void *event_info __UNUSED__) +{ + Evas_Coord w, h; + + ELM_SLIDER_DATA_GET(data, sd); + evas_object_geometry_get(obj, NULL, NULL, &w, &h); + evas_object_move(sd->popup, w, h); +} + static void _min_max_set(Evas_Object *obj) { @@ -599,6 +718,9 @@ _elm_slider_smart_add(Evas_Object *obj) elm_layout_signal_callback_add(obj, "drag,stop", "*", _drag_stop, obj); elm_layout_signal_callback_add(obj, "drag,step", "*", _drag_step, obj); elm_layout_signal_callback_add(obj, "drag,page", "*", _drag_stop, obj); + elm_layout_signal_callback_add(obj, "popup,show", "elm", _popup_show, obj); + elm_layout_signal_callback_add(obj, "popup,hide", "elm", _popup_hide, obj); + elm_layout_signal_callback_add(obj, "*", "popup,emit", _popup_emit, obj); edje_object_part_drag_value_set (ELM_WIDGET_DATA(priv)->resize_obj, "elm.dragable.slider", 0.0, 0.0); @@ -607,6 +729,30 @@ _elm_slider_smart_add(Evas_Object *obj) evas_object_pass_events_set(priv->spacer, EINA_TRUE); elm_layout_content_set(obj, "elm.swallow.bar", priv->spacer); + /* if theme has an overlayed slider mode, then lets support it */ + if (edje_object_part_exists(elm_layout_edje_get(obj), + "elm.track.slider")) + { + // XXX popup needs to adapt to theme etc. + priv->popup = edje_object_add(evas_object_evas_get(obj)); + _elm_theme_set(NULL, priv->popup, + "slider", "horizontal/popup", + elm_widget_style_get(obj)); + edje_object_signal_callback_add(priv->popup, "popup,hide,done", "elm", + _popup_hide_done, obj); + + /* create a rectangle to track position+size of the dragable */ + priv->track = evas_object_rectangle_add(evas_object_evas_get(obj)); + evas_object_event_callback_add + (priv->track, EVAS_CALLBACK_MOVE, _track_move_cb, obj); + evas_object_event_callback_add + (priv->track, EVAS_CALLBACK_RESIZE, _track_resize_cb, obj); + + evas_object_color_set(priv->track, 0, 0, 0, 0); + evas_object_pass_events_set(priv->track, EINA_TRUE); + elm_layout_content_set(obj, "elm.track.slider", priv->track); + } + evas_object_event_callback_add (priv->spacer, EVAS_CALLBACK_MOUSE_DOWN, _spacer_down_cb, obj); evas_object_event_callback_add @@ -625,6 +771,8 @@ _elm_slider_smart_del(Evas_Object *obj) if (sd->indicator) eina_stringshare_del(sd->indicator); if (sd->units) eina_stringshare_del(sd->units); if (sd->delay) ecore_timer_del(sd->delay); + + if (sd->popup) evas_object_del(sd->popup); ELM_WIDGET_CLASS(_elm_slider_parent_sc)->base.del(obj); } @@ -688,9 +836,17 @@ elm_slider_span_size_set(Evas_Object *obj, elm_config_scale_get()); if (sd->indicator_show) - elm_layout_signal_emit(obj, "elm,state,val,show", "elm"); + { + elm_layout_signal_emit(obj, "elm,state,val,show", "elm"); + if (sd->popup) + edje_object_signal_emit(sd->popup, "elm,state,val,show", "elm"); + } else - elm_layout_signal_emit(obj, "elm,state,val,hide", "elm"); + { + elm_layout_signal_emit(obj, "elm,state,val,hide", "elm"); + if (sd->popup) + edje_object_signal_emit(sd->popup, "elm,state,val,hide", "elm"); + } elm_layout_sizing_eval(obj); } @@ -716,11 +872,15 @@ elm_slider_unit_format_set(Evas_Object *obj, { elm_layout_signal_emit(obj, "elm,state,units,visible", "elm"); edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj); + if (sd->popup) + edje_object_signal_emit(sd->popup, "elm,state,units,visible", "elm"); } else { elm_layout_signal_emit(obj, "elm,state,units,hidden", "elm"); edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj); + if (sd->popup) + edje_object_signal_emit(sd->popup, "elm,state,units,hidden", "elm"); } _min_max_set(obj); @@ -852,9 +1012,17 @@ elm_slider_inverted_set(Evas_Object *obj, sd->inverted = inverted; if (sd->inverted) - elm_layout_signal_emit(obj, "elm,state,inverted,on", "elm"); + { + elm_layout_signal_emit(obj, "elm,state,inverted,on", "elm"); + if (sd->popup) + edje_object_signal_emit(sd->popup, "elm,state,inverted,on", "elm"); + } else - elm_layout_signal_emit(obj, "elm,state,inverted,off", "elm"); + { + elm_layout_signal_emit(obj, "elm,state,inverted,off", "elm"); + if (sd->popup) + edje_object_signal_emit(sd->popup, "elm,state,inverted,off", "elm"); + } edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj); @@ -909,10 +1077,14 @@ elm_slider_indicator_show_set(Evas_Object *obj, { sd->indicator_show = EINA_TRUE; elm_layout_signal_emit(obj, "elm,state,val,show", "elm"); + if (sd->popup) + edje_object_signal_emit(sd->popup, "elm,state,val,show", "elm"); } else { sd->indicator_show = EINA_FALSE; elm_layout_signal_emit(obj, "elm,state,val,hide", "elm"); + if (sd->popup) + edje_object_signal_emit(sd->popup, "elm,state,val,hide", "elm"); } elm_layout_sizing_eval(obj);