[Elementary] For icon/end elements, use swallow parts in the scroller theme instead of an Elm_Box.

This defines a new theme group for elm_scrolled_entry:
"elm/scroller/entry/$THEME".  Themes that wants to support the icon/end
feature in scrolled entry should implement parts "elm.swallow.icon" and
"elm.swallow.end".  Black&White theme has been changed, Effeniht changes
to come on a later commit.



SVN revision: 52657
This commit is contained in:
Leandro Pereira 2010-09-23 22:30:47 +00:00
parent c9a4a09aaa
commit 8c4df25efe
5 changed files with 603 additions and 17 deletions

View File

@ -709,6 +709,565 @@ collections {
}
}
///////////////////////////////////////////////////////////////////////////////
group { name: "elm/scroller/entry/default";
script {
public sbvis_v, sbvis_h, sbalways_v, sbalways_h, sbvis_timer;
public timer0(val) {
new v;
v = get_int(sbvis_v);
if (v) {
v = get_int(sbalways_v);
if (!v) {
emit("do-hide-vbar", "");
set_int(sbvis_v, 0);
}
}
v = get_int(sbvis_h);
if (v) {
v = get_int(sbalways_h);
if (!v) {
emit("do-hide-hbar", "");
set_int(sbvis_h, 0);
}
}
set_int(sbvis_timer, 0);
return 0;
}
}
images {
image: "shelf_inset.png" COMP;
image: "bt_sm_base2.png" COMP;
image: "bt_sm_shine.png" COMP;
image: "bt_sm_hilight.png" COMP;
image: "sb_runnerh.png" COMP;
image: "sb_runnerv.png" COMP;
}
parts {
part { name: "bg";
type: RECT;
description { state: "default" 0.0;
rel1.offset: 2 2;
rel2.offset: -3 -3;
}
}
part { name: "clipper";
type: RECT;
mouse_events: 0;
description { state: "default" 0.0;
rel1.to: "bg";
rel2.to: "bg";
rel1.offset: 2 2;
rel2.offset: -3 -3;
}
}
part { name: "contentclipper";
type: RECT;
mouse_events: 0;
clip_to: "clipper";
description { state: "default" 0.0;
rel1.to: "elm.swallow.icon";
rel1.relative: 1.0 0.0;
rel2.to: "elm.swallow.end";
rel2.relative: 0.0 1.0;
}
}
part { name: "elm.swallow.icon";
type: SWALLOW;
clip_to: "clipper";
description { state: "default" 0.0;
fixed: 1 1;
rel1 {
to: "bg";
relative: 0.0 0.0;
offset: 0 0;
}
rel2 {
to: "bg";
relative: 0.0 1.0;
offset: -1 -1;
}
visible: 0;
}
description { state: "visible" 0.0;
fixed: 1 1;
align: 0.0 1.0;
rel1 {
to: "bg";
relative: 0.0 0.0;
offset: 0 0;
}
rel2 {
to: "bg";
relative: 0.0 1.0;
offset: -1 -1;
}
visible: 1;
}
}
part { name: "elm.swallow.end";
type: SWALLOW;
clip_to: "clipper";
description { state: "default" 0.0;
fixed: 1 1;
rel1 {
to: "bg";
relative: 1.0 0.0;
offset: 0 0;
}
rel2 {
to: "bg";
relative: 1.0 1.0;
offset: -1 -1;
}
visible: 0;
}
description { state: "visible" 0.0;
fixed: 1 1;
align: 1.0 1.0;
rel1 {
to: "bg";
relative: 1.0 0.0;
offset: 0 0;
}
rel2 {
to: "bg";
relative: 1.0 1.0;
offset: -1 -1;
}
visible: 1;
}
}
part { name: "conf_over";
mouse_events: 0;
description { state: "default" 0.0;
rel1.to: "bg";
rel2.to: "bg";
image {
normal: "shelf_inset.png";
border: 7 7 7 7;
middle: 0;
}
fill.smooth : 0;
}
}
part { name: "elm.swallow.content";
clip_to: "contentclipper";
type: SWALLOW;
description { state: "default" 0.0;
rel1 {
to: "elm.swallow.icon";
relative: 1.0 0.0;
offset: 4 4;
}
rel2 {
to: "elm.swallow.end";
relative: 0.0 1.0;
offset: -5 -5;
}
}
}
part { name: "sb_vbar_clip_master";
type: RECT;
mouse_events: 0;
description { state: "default" 0.0;
}
description { state: "hidden" 0.0;
visible: 0;
color: 255 255 255 0;
}
}
part { name: "sb_vbar_clip";
clip_to: "sb_vbar_clip_master";
type: RECT;
mouse_events: 0;
description { state: "default" 0.0;
}
description { state: "hidden" 0.0;
visible: 0;
color: 255 255 255 0;
}
}
part { name: "sb_vbar";
type: RECT;
mouse_events: 0;
description { state: "default" 0.0;
fixed: 1 1;
visible: 0;
min: 17 17;
align: 1.0 0.0;
rel1 {
relative: 0.0 0.0;
offset: -2 2;
to_y: "elm.swallow.content";
to_x: "elm.swallow.end";
}
rel2 {
relative: 0.0 0.0;
offset: -2 -1;
to_y: "sb_hbar";
to_x: "elm.swallow.end";
}
}
}
part { name: "sb_vbar_runner";
clip_to: "sb_vbar_clip";
mouse_events: 0;
description { state: "default" 0.0;
min: 3 3;
max: 3 99999;
rel1.to: "sb_vbar";
rel2.to: "sb_vbar";
image {
normal: "sb_runnerv.png";
border: 0 0 4 4;
}
fill.smooth: 0;
}
}
part { name: "elm.dragable.vbar";
clip_to: "sb_vbar_clip";
mouse_events: 0;
dragable {
x: 0 0 0;
y: 1 1 0;
confine: "sb_vbar";
}
description { state: "default" 0.0;
fixed: 1 1;
min: 17 17;
rel1 {
relative: 0.5 0.5;
offset: 0 0;
to: "sb_vbar";
}
rel2 {
relative: 0.5 0.5;
offset: 0 0;
to: "sb_vbar";
}
image {
normal: "bt_sm_base2.png";
border: 6 6 6 6;
}
image.middle: SOLID;
}
}
part { name: "sb_vbar_over1";
clip_to: "sb_vbar_clip";
mouse_events: 0;
description { state: "default" 0.0;
rel1.to: "elm.dragable.vbar";
rel2.relative: 1.0 0.5;
rel2.to: "elm.dragable.vbar";
image {
normal: "bt_sm_hilight.png";
border: 6 6 6 0;
}
}
}
part { name: "sb_vbar_over2";
clip_to: "sb_vbar_clip";
mouse_events: 0;
description { state: "default" 0.0;
rel1.to: "elm.dragable.vbar";
rel2.to: "elm.dragable.vbar";
image {
normal: "bt_sm_shine.png";
border: 6 6 6 0;
}
}
}
part { name: "sb_hbar_clip_master";
type: RECT;
mouse_events: 0;
description { state: "default" 0.0;
}
description { state: "hidden" 0.0;
visible: 0;
color: 255 255 255 0;
}
}
part { name: "sb_hbar_clip";
clip_to: "sb_hbar_clip_master";
type: RECT;
mouse_events: 0;
description { state: "default" 0.0;
}
description { state: "hidden" 0.0;
visible: 0;
color: 255 255 255 0;
}
}
part { name: "sb_hbar";
type: RECT;
mouse_events: 0;
description { state: "default" 0.0;
fixed: 1 1;
visible: 0;
min: 17 17;
align: 0.0 1.0;
rel1 {
relative: 0.0 1.0;
offset: 2 -2;
to_x: "elm.swallow.content";
}
rel2 {
relative: 0.0 1.0;
offset: -1 -2;
to_x: "sb_vbar";
}
}
}
part { name: "sb_hbar_runner";
clip_to: "sb_hbar_clip";
mouse_events: 0;
description { state: "default" 0.0;
min: 3 3;
max: 99999 3;
rel1.to: "sb_hbar";
rel2.to: "sb_hbar";
image {
normal: "sb_runnerh.png";
border: 4 4 0 0;
}
fill.smooth: 0;
}
}
part { name: "elm.dragable.hbar";
clip_to: "sb_hbar_clip";
mouse_events: 0;
dragable {
x: 1 1 0;
y: 0 0 0;
confine: "sb_hbar";
}
description { state: "default" 0.0;
fixed: 1 1;
min: 17 17;
rel1 {
relative: 0.5 0.5;
offset: 0 0;
to: "sb_hbar";
}
rel2 {
relative: 0.5 0.5;
offset: 0 0;
to: "sb_hbar";
}
image {
normal: "bt_sm_base2.png";
border: 6 6 6 6;
}
image.middle: SOLID;
}
}
part { name: "sb_hbar_over1";
clip_to: "sb_hbar_clip";
mouse_events: 0;
description { state: "default" 0.0;
rel1.to: "elm.dragable.hbar";
rel2.relative: 1.0 0.5;
rel2.to: "elm.dragable.hbar";
image {
normal: "bt_sm_hilight.png";
border: 6 6 6 0;
}
}
}
part { name: "sb_hbar_over2";
clip_to: "sb_hbar_clip";
mouse_events: 0;
description { state: "default" 0.0;
rel1.to: "elm.dragable.hbar";
rel2.to: "elm.dragable.hbar";
image {
normal: "bt_sm_shine.png";
border: 6 6 6 0;
}
}
}
}
programs {
program { name: "load";
signal: "load";
source: "";
script {
set_state(PART:"sb_hbar_clip", "hidden", 0.0);
set_state(PART:"sb_vbar_clip", "hidden", 0.0);
set_int(sbvis_h, 0);
set_int(sbvis_v, 0);
set_int(sbalways_v, 0);
set_int(sbalways_h, 0);
set_int(sbvis_timer, 0);
}
}
program { name: "icon_show";
signal: "elm,action,show,icon";
source: "elm";
action: STATE_SET "visible" 0.0;
target: "elm.swallow.icon";
}
program { name: "icon_hide";
signal: "elm,action,hide,icon";
source: "elm";
action: STATE_SET "default" 0.0;
target: "elm.swallow.icon";
}
program { name: "end_show";
signal: "elm,action,show,end";
source: "elm";
action: STATE_SET "visible" 0.0;
target: "elm.swallow.end";
}
program { name: "end_hide";
signal: "elm,action,hide,end";
source: "elm";
action: STATE_SET "default" 0.0;
target: "elm.swallow.end";
}
program { name: "vbar_show";
signal: "elm,action,show,vbar";
source: "elm";
action: STATE_SET "default" 0.0;
target: "sb_vbar_clip_master";
}
program { name: "vbar_hide";
signal: "elm,action,hide,vbar";
source: "elm";
action: STATE_SET "hidden" 0.0;
target: "sb_vbar_clip_master";
}
program { name: "vbar_show_always";
signal: "elm,action,show_always,vbar";
source: "elm";
script {
new v;
v = get_int(sbvis_v);
v |= get_int(sbalways_v);
if (!v) {
set_int(sbalways_v, 1);
emit("do-show-vbar", "");
set_int(sbvis_v, 1);
}
}
}
program { name: "vbar_show_notalways";
signal: "elm,action,show_notalways,vbar";
source: "elm";
script {
new v;
v = get_int(sbalways_v);
if (v) {
set_int(sbalways_v, 0);
v = get_int(sbvis_v);
if (!v) {
emit("do-hide-vbar", "");
set_int(sbvis_v, 0);
}
}
}
}
program { name: "sb_vbar_show";
signal: "do-show-vbar";
source: "";
action: STATE_SET "default" 0.0;
transition: LINEAR 1.0;
target: "sb_vbar_clip";
}
program { name: "sb_vbar_hide";
signal: "do-hide-vbar";
source: "";
action: STATE_SET "hidden" 0.0;
transition: LINEAR 1.0;
target: "sb_vbar_clip";
}
program { name: "hbar_show";
signal: "elm,action,show,hbar";
source: "elm";
action: STATE_SET "default" 0.0;
target: "sb_hbar_clip_master";
}
program { name: "hbar_hide";
signal: "elm,action,hide,hbar";
source: "elm";
action: STATE_SET "hidden" 0.0;
target: "sb_hbar_clip_master";
}
program { name: "hbar_show_always";
signal: "elm,action,show_always,hbar";
source: "elm";
script {
new v;
v = get_int(sbvis_h);
v |= get_int(sbalways_h);
if (!v) {
set_int(sbalways_h, 1);
emit("do-show-hbar", "");
set_int(sbvis_h, 1);
}
}
}
program { name: "hbar_show_notalways";
signal: "elm,action,show_notalways,hbar";
source: "elm";
script {
new v;
v = get_int(sbalways_h);
if (v) {
set_int(sbalways_h, 0);
v = get_int(sbvis_h);
if (!v) {
emit("do-hide-hbar", "");
set_int(sbvis_h, 0);
}
}
}
}
program { name: "sb_hbar_show";
signal: "do-show-hbar";
source: "";
action: STATE_SET "default" 0.0;
transition: LINEAR 1.0;
target: "sb_hbar_clip";
}
program { name: "sb_hbar_hide";
signal: "do-hide-hbar";
source: "";
action: STATE_SET "hidden" 0.0;
transition: LINEAR 1.0;
target: "sb_hbar_clip";
}
program { name: "scroll";
signal: "elm,action,scroll";
source: "elm";
script {
new v;
v = get_int(sbvis_v);
v |= get_int(sbalways_v);
if (!v) {
emit("do-show-vbar", "");
set_int(sbvis_v, 1);
}
v = get_int(sbvis_h);
v |= get_int(sbalways_h);
if (!v) {
emit("do-show-hbar", "");
set_int(sbvis_h, 1);
}
v = get_int(sbvis_timer);
if (v > 0) cancel_timer(v);
v = timer(2.0, "timer0", 0);
set_int(sbvis_timer, v);
}
}
}
}
///////////////////////////////////////////////////////////////////////////////
group { name: "elm/label/base/default";
data.item: "default_font_size" "24";

View File

@ -293,8 +293,8 @@ test_entry_scrolled(void *data, Evas_Object *obj, void *event_info)
en = elm_scrolled_entry_add(win);
evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5);
elm_scrolled_entry_scrollbar_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
elm_scrolled_entry_entry_set(en, "This is a single line");
elm_scrolled_entry_scrollbar_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
elm_scrolled_entry_single_line_set(en, 1);
elm_scrolled_entry_select_all(en);
evas_object_show(en);
@ -313,15 +313,20 @@ test_entry_scrolled(void *data, Evas_Object *obj, void *event_info)
/* scrolled entry with icon/end widgets*/
en = elm_scrolled_entry_add(win);
elm_scrolled_entry_scrollbar_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
elm_scrolled_entry_single_line_set(en, 1);
evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
bt = elm_button_add(win);
elm_button_label_set(bt, "left");
bt = elm_icon_add(win);
elm_icon_standard_set(bt, "home");
evas_object_size_hint_min_set(bt, 48, 48);
evas_object_color_set(bt, 255, 0, 0, 128);
evas_object_show(bt);
elm_scrolled_entry_icon_set(en, bt);
bt = elm_button_add(win);
elm_button_label_set(bt, "right");
bt = elm_icon_add(win);
elm_icon_standard_set(bt, "delete");
evas_object_color_set(bt, 255, 0, 0, 128);
evas_object_size_hint_min_set(bt, 48, 48);
evas_object_show(bt);
elm_scrolled_entry_end_set(en, bt);
elm_scrolled_entry_entry_set(en, "scrolled entry with icon and end objects");

View File

@ -35,7 +35,6 @@ typedef struct _Widget_Data Widget_Data;
struct _Widget_Data
{
Evas_Object *scroller;
Evas_Object *box;
Evas_Object *entry;
Evas_Object *icon;
Evas_Object *end;
@ -287,17 +286,12 @@ elm_scrolled_entry_add(Evas_Object *parent)
elm_widget_signal_callback_add_hook_set(obj, _signal_callback_add_hook);
elm_widget_signal_callback_del_hook_set(obj, _signal_callback_del_hook);
wd->box = elm_box_add(parent);
elm_widget_resize_object_set(obj, wd->box);
elm_box_horizontal_set(wd->box, EINA_TRUE);
elm_box_homogenous_set(wd->box, EINA_FALSE);
evas_object_show(wd->box);
wd->scroller = elm_scroller_add(parent);
elm_scroller_custom_widget_base_theme_set(wd->scroller, "scroller", "entry");
elm_widget_resize_object_set(obj, wd->scroller);
evas_object_size_hint_weight_set(wd->scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(wd->scroller, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_scroller_bounce_set(wd->scroller, 0, 0);
elm_box_pack_start(wd->box, wd->scroller);
evas_object_show(wd->scroller);
wd->entry = elm_entry_add(parent);
@ -348,10 +342,15 @@ elm_scrolled_entry_icon_set(Evas_Object *obj, Evas_Object *icon)
{
ELM_CHECK_WIDTYPE(obj, widtype);
Widget_Data *wd = elm_widget_data_get(obj);
Evas_Object *edje;
if (!wd || !icon) return;
if (wd->icon == icon) return;
if (wd->icon) evas_object_del(wd->icon);
wd->icon = icon;
elm_box_pack_before(wd->box, wd->icon, wd->scroller);
edje = _elm_scroller_edje_object_get(wd->scroller);
if (!edje) return;
edje_object_part_swallow(edje, "elm.swallow.icon", wd->icon);
edje_object_signal_emit(edje, "elm,action,show,icon", "elm");
_sizing_eval(obj);
}
@ -388,8 +387,12 @@ elm_scrolled_entry_icon_unset(Evas_Object *obj)
if (!wd) return NULL;
if (wd->icon)
{
Evas_Object *edje = _elm_scroller_edje_object_get(wd->scroller);
if (!edje) return NULL;
ret = wd->icon;
elm_box_unpack(wd->box, wd->icon);
edje_object_part_unswallow(edje, wd->icon);
edje_object_signal_emit(edje, "elm,action,hide,icon", "elm");
wd->icon = NULL;
_sizing_eval(obj);
}
return ret;
@ -432,10 +435,15 @@ elm_scrolled_entry_end_set(Evas_Object *obj, Evas_Object *end)
{
ELM_CHECK_WIDTYPE(obj, widtype);
Widget_Data *wd = elm_widget_data_get(obj);
Evas_Object *edje;
if (!wd || !end) return;
if (wd->end == end) return;
if (wd->end) evas_object_del(wd->end);
wd->end = end;
elm_box_pack_after(wd->box, wd->end, wd->scroller);
edje = _elm_scroller_edje_object_get(wd->scroller);
if (!edje) return;
edje_object_part_swallow(edje, "elm.swallow.end", wd->end);
edje_object_signal_emit(edje, "elm,action,show,end", "elm");
_sizing_eval(obj);
}
@ -472,8 +480,12 @@ elm_scrolled_entry_end_unset(Evas_Object *obj)
if (!wd) return NULL;
if (wd->end)
{
Evas_Object *edje = _elm_scroller_edje_object_get(wd->scroller);
if (!edje) return NULL;
ret = wd->end;
elm_box_unpack(wd->box, wd->end);
edje_object_part_unswallow(edje, wd->end);
edje_object_signal_emit(edje, "elm,action,hide,end", "elm");
wd->end = NULL;
_sizing_eval(obj);
}
return ret;

View File

@ -142,6 +142,8 @@ void elm_object_sub_tooltip_content_cb_set(Evas_Object *eventare
Eina_Bool _elm_dangerous_call_check(const char *call);
Evas_Object *_elm_scroller_edje_object_get(Evas_Object *obj);
extern char *_elm_appname;
extern Elm_Config *_elm_config;
extern const char *_elm_data_dir;

View File

@ -378,6 +378,14 @@ elm_scroller_add(Evas_Object *parent)
return obj;
}
Evas_Object *
_elm_scroller_edje_object_get(Evas_Object *obj)
{
ELM_CHECK_WIDTYPE(obj, widtype);
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return NULL;
return elm_smart_scroller_edje_object_get(wd->scr);
}
/**
* Set the content of the scroller widget (the object to be scrolled around).