forked from enlightenment/efl
efl_ui_list : introduce new list widget for simple usage
Summary: most usage of simple list, items are very limited and loading performance is not serious. to support those requirement, this efl.ui.list will create scrollable box with efl.pack. user can create list by packing an pre-loaded item object, Efl.Ui.List.Item class. Test Plan: tested in efl_ui_list_example_1.c in examples. Reviewers: cedric, felipealmeida Subscribers: woohyun, Jaehyun_Cho Differential Revision: https://phab.enlightenment.org/D5861
This commit is contained in:
parent
bbbd05148a
commit
75f21087f5
|
@ -1,8 +1,12 @@
|
|||
group { "efl/view_list";
|
||||
group { "efl/list";
|
||||
inherit: "efl/scroller";
|
||||
}
|
||||
|
||||
group { name: "efl/list/item";
|
||||
group { "efl/view_list";
|
||||
inherit: "efl/list";
|
||||
}
|
||||
|
||||
group { "efl/list_item";
|
||||
data.item: "selectraise" "on";
|
||||
data.item: "focusraise" "on";
|
||||
images.image: "bevel_curved_horiz_out.png" COMP;
|
||||
|
@ -11,118 +15,91 @@ group { name: "efl/list/item";
|
|||
images.image: "bevel_horiz_out.png" COMP;
|
||||
images.image: "shine.png" COMP;
|
||||
parts {
|
||||
part { name: "event"; type: RECT;
|
||||
description { state: "default" 0.0;
|
||||
rect { "event";
|
||||
desc { "default";
|
||||
color: 0 0 0 0;
|
||||
}
|
||||
description { state: "disabled" 0.0;
|
||||
inherit: "default" 0.0;
|
||||
visible: 0;
|
||||
desc { "disabled";
|
||||
inherit: "default";
|
||||
hid;
|
||||
}
|
||||
}
|
||||
part { name: "base"; type: RECT; mouse_events: 0;
|
||||
description { state: "default" 0.0;
|
||||
rect { "base"; nomouse;
|
||||
desc { "default";
|
||||
color: 64 64 64 255;
|
||||
color_class: "list_item_base";
|
||||
}
|
||||
description { state: "odd" 0.0;
|
||||
desc { "odd";
|
||||
color: 56 56 56 255;
|
||||
color_class: "list_item_base_odd";
|
||||
}
|
||||
}
|
||||
program {
|
||||
signal: "elm,state,odd"; source: "elm";
|
||||
action: STATE_SET "odd" 1.0;
|
||||
target: "base";
|
||||
}
|
||||
program {
|
||||
signal: "elm,state,even"; source: "elm";
|
||||
action: STATE_SET "default" 0.0;
|
||||
target: "base";
|
||||
}
|
||||
part { name: "bevel"; mouse_events: 0;
|
||||
description { state: "default" 0.0;
|
||||
|
||||
image { "bevel"; nomouse;
|
||||
desc { "default";
|
||||
image.normal: "bevel_curved_horiz_out.png";
|
||||
image.border: 0 0 2 2;
|
||||
image.middle: 0;
|
||||
fill.smooth: 0;
|
||||
}
|
||||
}
|
||||
part { name: "sel_shadow"; mouse_events: 0;
|
||||
description { state: "default" 0.0;
|
||||
swallow { "efl.background";
|
||||
desc { "default";
|
||||
rel.to: "base";
|
||||
vis;
|
||||
}
|
||||
}
|
||||
image { "sel_shadow"; nomouse;
|
||||
desc { "default";
|
||||
image.normal: "shadow_rounded_horiz.png";
|
||||
image.border: 0 0 9 9;
|
||||
rel1.offset: 0 -4;
|
||||
rel2.offset: -1 5;
|
||||
fill.smooth: 0;
|
||||
visible: 0;
|
||||
hid;
|
||||
}
|
||||
description { state: "selected" 0.0;
|
||||
inherit: "default" 0.0;
|
||||
visible: 1;
|
||||
desc { "selected";
|
||||
inherit: "default";
|
||||
vis;
|
||||
}
|
||||
}
|
||||
part { name: "sel_base"; mouse_events: 0;
|
||||
description { state: "default" 0.0;
|
||||
image { "sel_base"; nomouse;
|
||||
desc { "default";
|
||||
image.normal: "vgrad_med_dark.png";
|
||||
fill.smooth: 0;
|
||||
visible: 0;
|
||||
hid;
|
||||
TILED_HORIZ(120)
|
||||
}
|
||||
description { state: "selected" 0.0;
|
||||
inherit: "default" 0.0;
|
||||
visible: 1;
|
||||
desc { "selected";
|
||||
inherit: "default";
|
||||
vis;
|
||||
}
|
||||
}
|
||||
part { name: "sel_bevel"; mouse_events: 0;
|
||||
description { state: "default" 0.0;
|
||||
image { "sel_bevel"; nomouse;
|
||||
desc { "default";
|
||||
image.normal: "bevel_horiz_out.png";
|
||||
image.border: 0 0 2 2;
|
||||
image.middle: 0;
|
||||
fill.smooth: 0;
|
||||
visible: 0;
|
||||
hid;
|
||||
}
|
||||
description { state: "selected" 0.0;
|
||||
inherit: "default" 0.0;
|
||||
visible: 1;
|
||||
desc { "selected";
|
||||
inherit: "default";
|
||||
vis;
|
||||
}
|
||||
}
|
||||
program {
|
||||
signal: "elm,state,selected"; source: "elm";
|
||||
action: STATE_SET "selected" 0.0;
|
||||
target: "sel_shadow";
|
||||
target: "sel_base";
|
||||
target: "sel_bevel";
|
||||
}
|
||||
program {
|
||||
signal: "elm,state,unselected"; source: "elm";
|
||||
action: STATE_SET "default" 0.0;
|
||||
target: "sel_shadow";
|
||||
target: "sel_base";
|
||||
target: "sel_bevel";
|
||||
}
|
||||
program {
|
||||
signal: "elm,state,disabled"; source: "elm";
|
||||
action: STATE_SET "disabled" 0.0;
|
||||
target: "event";
|
||||
}
|
||||
program {
|
||||
signal: "elm,state,enabled"; source: "elm";
|
||||
action: STATE_SET "default" 0.0;
|
||||
target: "event";
|
||||
}
|
||||
|
||||
//##//
|
||||
part { name: "elm.text"; type: TEXT; mouse_events: 0;
|
||||
text { "efl.text"; nomouse;
|
||||
effect: SHADOW BOTTOM;
|
||||
scale: 1;
|
||||
description { state: "default" 0.0;
|
||||
desc { "default";
|
||||
rel1.offset: 2 3;
|
||||
rel1.relative: 1.0 0.0;
|
||||
rel1.to_x: "elm.swallow.icon";
|
||||
rel1.to_x: "efl.icon";
|
||||
rel2.offset: -3 -3;
|
||||
rel2.relative: 0.0 1.0;
|
||||
rel2.to_x: "elm.swallow.end";
|
||||
rel2.to_x: "efl.end";
|
||||
color: FN_COL_DEFAULT;
|
||||
color_class: "list_item";
|
||||
text { font: FN; size: 10;
|
||||
|
@ -132,96 +109,68 @@ group { name: "efl/list/item";
|
|||
text_class: "list_item";
|
||||
}
|
||||
}
|
||||
description { state: "selected" 0.0;
|
||||
inherit: "default" 0.0;
|
||||
visible: 0;
|
||||
desc { "selected";
|
||||
inherit: "default";
|
||||
hid;
|
||||
}
|
||||
description { state: "disabled" 0.0;
|
||||
inherit: "default" 0.0;
|
||||
visible: 0;
|
||||
desc { "disabled";
|
||||
inherit: "default";
|
||||
hid;
|
||||
}
|
||||
}
|
||||
part { name: "label2"; type: TEXT; mouse_events: 0;
|
||||
text { "label2"; nomouse;
|
||||
effect: SHADOW BOTTOM;
|
||||
scale: 1;
|
||||
description { state: "default" 0.0;
|
||||
rel1.to: "elm.text";
|
||||
rel2.to: "elm.text";
|
||||
desc { "default";
|
||||
rel1.to: "efl.text";
|
||||
rel2.to: "efl.text";
|
||||
color: FN_COL_DISABLE;
|
||||
color_class: "list_item_disabled";
|
||||
text { font: FN; size: 10;
|
||||
text_source: "elm.text";
|
||||
text_source: "efl.text";
|
||||
align: 0.0 0.5;
|
||||
text_class: "list_item";
|
||||
}
|
||||
visible: 0;
|
||||
hid;
|
||||
}
|
||||
description { state: "selected" 0.0;
|
||||
inherit: "default" 0.0;
|
||||
visible: 0;
|
||||
desc { "selected";
|
||||
inherit: "default";
|
||||
hid;
|
||||
}
|
||||
description { state: "disabled" 0.0;
|
||||
inherit: "default" 0.0;
|
||||
visible: 1;
|
||||
desc { "disabled";
|
||||
inherit: "default";
|
||||
vis;
|
||||
}
|
||||
}
|
||||
part { name: "label3"; type: TEXT; mouse_events: 0;
|
||||
text { "label3"; nomouse;
|
||||
effect: GLOW;
|
||||
scale: 1;
|
||||
description { state: "default" 0.0;
|
||||
desc { "default";
|
||||
rel1.offset: -2 -3;
|
||||
rel1.to: "elm.text";
|
||||
rel1.to: "efl.text";
|
||||
rel2.offset: 1 1;
|
||||
rel2.to: "elm.text";
|
||||
rel2.to: "efl.text";
|
||||
color: FN_COL_HIGHLIGHT;
|
||||
color_class: "list_item_selected";
|
||||
text { font: FN; size: 10;
|
||||
text_source: "elm.text";
|
||||
text_source: "efl.text";
|
||||
align: 0.0 0.5;
|
||||
text_class: "list_item";
|
||||
}
|
||||
visible: 0;
|
||||
hid;
|
||||
}
|
||||
description { state: "selected" 0.0;
|
||||
inherit: "default" 0.0;
|
||||
visible: 1;
|
||||
desc { "selected";
|
||||
inherit: "default";
|
||||
vis;
|
||||
}
|
||||
description { state: "disabled" 0.0;
|
||||
inherit: "default" 0.0;
|
||||
visible: 0;
|
||||
desc { "disabled";
|
||||
inherit: "default";
|
||||
hid;
|
||||
}
|
||||
}
|
||||
program {
|
||||
signal: "elm,state,selected"; source: "elm";
|
||||
action: STATE_SET "selected" 0.0;
|
||||
target: "elm.text";
|
||||
target: "label2";
|
||||
target: "label3";
|
||||
}
|
||||
program {
|
||||
signal: "elm,state,unselected"; source: "elm";
|
||||
action: STATE_SET "default" 0.0;
|
||||
target: "elm.text";
|
||||
target: "label2";
|
||||
target: "label3";
|
||||
}
|
||||
program {
|
||||
signal: "elm,state,disabled"; source: "elm";
|
||||
action: STATE_SET "disabled" 0.0;
|
||||
target: "elm.text";
|
||||
target: "label2";
|
||||
target: "label3";
|
||||
}
|
||||
program {
|
||||
signal: "elm,state,enabled"; source: "elm";
|
||||
action: STATE_SET "default" 0.0;
|
||||
target: "elm.text";
|
||||
target: "label2";
|
||||
target: "label3";
|
||||
}
|
||||
//##//
|
||||
part { name: "elm.swallow.icon"; type: SWALLOW;
|
||||
description { state: "default" 0.0;
|
||||
swallow { "efl.icon";
|
||||
desc { "default";
|
||||
fixed: 1 0;
|
||||
align: 0.0 0.5;
|
||||
aspect: 1.0 1.0;
|
||||
|
@ -230,8 +179,8 @@ group { name: "efl/list/item";
|
|||
rel2.offset: 2 -3;
|
||||
}
|
||||
}
|
||||
part { name: "elm.swallow.end"; type: SWALLOW;
|
||||
description { state: "default" 0.0;
|
||||
swallow { "efl.end";
|
||||
desc { "default";
|
||||
fixed: 1 0;
|
||||
align: 1.0 0.5;
|
||||
aspect: 1.0 1.0;
|
||||
|
@ -241,51 +190,281 @@ group { name: "efl/list/item";
|
|||
}
|
||||
}
|
||||
//##//
|
||||
|
||||
part { name: "sel_shine"; mouse_events: 0;
|
||||
description { state: "default" 0.0;
|
||||
image { "sel_shine"; nomouse;
|
||||
desc { "default";
|
||||
image.normal: "shine.png";
|
||||
rel1.offset: 0 -2;
|
||||
rel1.to: "sel_base";
|
||||
rel2.relative: 1.0 0.0;
|
||||
rel2.offset: -1 2;
|
||||
rel2.to: "sel_base";
|
||||
visible: 0;
|
||||
hid;
|
||||
FIXED_SIZE(69, 5)
|
||||
}
|
||||
description { state: "selected" 0.0;
|
||||
inherit: "default" 0.0;
|
||||
visible: 1;
|
||||
desc { "selected";
|
||||
inherit: "default";
|
||||
vis;
|
||||
}
|
||||
}
|
||||
part { name: "event_block"; type: RECT;
|
||||
description { state: "default" 0.0;
|
||||
rect { "event_block";
|
||||
desc { "default";
|
||||
color: 0 0 0 0;
|
||||
visible: 0;
|
||||
hid;
|
||||
}
|
||||
description { state: "disabled" 0.0;
|
||||
inherit: "default" 0.0;
|
||||
visible: 1;
|
||||
desc { "disabled";
|
||||
inherit: "default";
|
||||
vis;
|
||||
}
|
||||
}
|
||||
}
|
||||
programs {
|
||||
program {
|
||||
signal: "elm,state,selected"; source: "elm";
|
||||
action: STATE_SET "selected" 0.0;
|
||||
signal: "efl,state,odd"; source: "efl";
|
||||
action: STATE_SET "odd";
|
||||
target: "base";
|
||||
}
|
||||
program {
|
||||
signal: "efl,state,even"; source: "efl";
|
||||
action: STATE_SET "default";
|
||||
target: "base";
|
||||
}
|
||||
program {
|
||||
signal: "efl,state,pressed"; source: "efl";
|
||||
action: STATE_SET "selected";
|
||||
target: "sel_shadow";
|
||||
target: "sel_base";
|
||||
target: "sel_bevel";
|
||||
target: "efl.text";
|
||||
target: "label2";
|
||||
target: "label3";
|
||||
target: "sel_shine";
|
||||
}
|
||||
program {
|
||||
signal: "elm,state,unselected"; source: "elm";
|
||||
action: STATE_SET "default" 0.0;
|
||||
signal: "efl,state,unpressed"; source: "efl";
|
||||
action: STATE_SET "default";
|
||||
target: "sel_shadow";
|
||||
target: "sel_base";
|
||||
target: "sel_bevel";
|
||||
target: "efl.text";
|
||||
target: "label2";
|
||||
target: "label3";
|
||||
target: "sel_shine";
|
||||
}
|
||||
program {
|
||||
signal: "elm,state,disabled"; source: "elm";
|
||||
action: STATE_SET "disabled" 0.0;
|
||||
signal: "efl,state,selected"; source: "efl";
|
||||
action: STATE_SET "selected";
|
||||
target: "sel_shadow";
|
||||
target: "sel_base";
|
||||
target: "sel_bevel";
|
||||
target: "efl.text";
|
||||
target: "label2";
|
||||
target: "label3";
|
||||
target: "sel_shine";
|
||||
}
|
||||
program {
|
||||
signal: "efl,state,unselected"; source: "efl";
|
||||
action: STATE_SET "default";
|
||||
target: "sel_shadow";
|
||||
target: "sel_base";
|
||||
target: "sel_bevel";
|
||||
target: "efl.text";
|
||||
target: "label2";
|
||||
target: "label3";
|
||||
target: "sel_shine";
|
||||
}
|
||||
program {
|
||||
signal: "efl,state,disabled"; source: "efl";
|
||||
action: STATE_SET "disabled";
|
||||
target: "event";
|
||||
target: "efl.text";
|
||||
target: "label2";
|
||||
target: "label3";
|
||||
target: "event_block";
|
||||
}
|
||||
program {
|
||||
signal: "elm,state,enabled"; source: "elm";
|
||||
action: STATE_SET "default" 0.0;
|
||||
signal: "efl,state,enabled"; source: "efl";
|
||||
action: STATE_SET "default";
|
||||
target: "event";
|
||||
target: "efl.text";
|
||||
target: "label2";
|
||||
target: "label3";
|
||||
target: "event_block";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
group { "efl/list_item:empty";
|
||||
data.item: "selectraise" "on";
|
||||
data.item: "focusraise" "on";
|
||||
images.image: "bevel_curved_horiz_out.png" COMP;
|
||||
images.image: "shadow_rounded_horiz.png" COMP;
|
||||
images.image: "vgrad_med_dark.png" COMP;
|
||||
images.image: "bevel_horiz_out.png" COMP;
|
||||
images.image: "shine.png" COMP;
|
||||
parts {
|
||||
rect { "event";
|
||||
desc { "default";
|
||||
color: 0 0 0 0;
|
||||
}
|
||||
desc { "disabled";
|
||||
inherit: "default";
|
||||
hid;
|
||||
}
|
||||
}
|
||||
rect { "base"; nomouse;
|
||||
desc { "default";
|
||||
color: 64 64 64 255;
|
||||
color_class: "list_item_base";
|
||||
}
|
||||
desc { "odd";
|
||||
color: 56 56 56 255;
|
||||
color_class: "list_item_base_odd";
|
||||
}
|
||||
}
|
||||
|
||||
image { "bevel"; nomouse;
|
||||
desc { "default";
|
||||
image.normal: "bevel_curved_horiz_out.png";
|
||||
image.border: 0 0 2 2;
|
||||
image.middle: 0;
|
||||
fill.smooth: 0;
|
||||
}
|
||||
}
|
||||
swallow { "efl.background";
|
||||
desc { "default";
|
||||
rel.to: "base";
|
||||
vis;
|
||||
}
|
||||
}
|
||||
image { "sel_shadow"; nomouse;
|
||||
desc { "default";
|
||||
image.normal: "shadow_rounded_horiz.png";
|
||||
image.border: 0 0 9 9;
|
||||
rel1.offset: 0 -4;
|
||||
rel2.offset: -1 5;
|
||||
fill.smooth: 0;
|
||||
hid;
|
||||
}
|
||||
desc { "selected";
|
||||
inherit: "default";
|
||||
vis;
|
||||
}
|
||||
}
|
||||
image { "sel_base"; nomouse;
|
||||
desc { "default";
|
||||
image.normal: "vgrad_med_dark.png";
|
||||
fill.smooth: 0;
|
||||
hid;
|
||||
TILED_HORIZ(120)
|
||||
}
|
||||
desc { "selected";
|
||||
inherit: "default";
|
||||
vis;
|
||||
}
|
||||
}
|
||||
image { "sel_bevel"; nomouse;
|
||||
desc { "default";
|
||||
image.normal: "bevel_horiz_out.png";
|
||||
image.border: 0 0 2 2;
|
||||
image.middle: 0;
|
||||
fill.smooth: 0;
|
||||
hid;
|
||||
}
|
||||
desc { "selected";
|
||||
inherit: "default";
|
||||
vis;
|
||||
}
|
||||
}
|
||||
//##//
|
||||
swallow { "efl.content"; mouse;
|
||||
scale;
|
||||
desc { "default";
|
||||
min: 19 19;
|
||||
rel1.offset: -1 2;
|
||||
rel2.offset: -3 -3;
|
||||
}
|
||||
}
|
||||
//##//
|
||||
image { "sel_shine";
|
||||
desc { "default";
|
||||
image.normal: "shine.png";
|
||||
rel1.offset: 0 -2;
|
||||
rel1.to: "sel_base";
|
||||
rel2.relative: 1.0 0.0;
|
||||
rel2.offset: -1 2;
|
||||
rel2.to: "sel_base";
|
||||
hid;
|
||||
FIXED_SIZE(69, 5)
|
||||
}
|
||||
desc { "selected";
|
||||
inherit: "default";
|
||||
vis;
|
||||
}
|
||||
}
|
||||
rect { "event_block"; mouse;
|
||||
desc { "default";
|
||||
color: 0 0 0 0;
|
||||
hid;
|
||||
}
|
||||
desc { "disabled";
|
||||
inherit: "default";
|
||||
vis;
|
||||
}
|
||||
}
|
||||
}
|
||||
programs {
|
||||
program {
|
||||
signal: "efl,state,odd"; source: "efl";
|
||||
action: STATE_SET "odd";
|
||||
target: "base";
|
||||
}
|
||||
program {
|
||||
signal: "efl,state,even"; source: "efl";
|
||||
action: STATE_SET "default";
|
||||
target: "base";
|
||||
}
|
||||
program {
|
||||
signal: "efl,state,pressed"; source: "efl";
|
||||
action: STATE_SET "selected";
|
||||
target: "sel_shadow";
|
||||
target: "sel_base";
|
||||
target: "sel_bevel";
|
||||
target: "sel_shine";
|
||||
}
|
||||
program {
|
||||
signal: "efl,state,unpressed"; source: "efl";
|
||||
action: STATE_SET "default";
|
||||
target: "sel_shadow";
|
||||
target: "sel_base";
|
||||
target: "sel_bevel";
|
||||
target: "sel_shine";
|
||||
}
|
||||
program {
|
||||
signal: "efl,state,selected"; source: "efl";
|
||||
action: STATE_SET "selected";
|
||||
target: "sel_shadow";
|
||||
target: "sel_base";
|
||||
target: "sel_bevel";
|
||||
target: "sel_shine";
|
||||
}
|
||||
program {
|
||||
signal: "efl,state,unselected"; source: "efl";
|
||||
action: STATE_SET "default";
|
||||
target: "sel_shadow";
|
||||
target: "sel_base";
|
||||
target: "sel_bevel";
|
||||
target: "sel_shine";
|
||||
}
|
||||
program {
|
||||
signal: "efl,state,disabled"; source: "efl";
|
||||
action: STATE_SET "disabled";
|
||||
target: "event";
|
||||
target: "event_block";
|
||||
}
|
||||
program {
|
||||
signal: "efl,state,enabled"; source: "efl";
|
||||
action: STATE_SET "default";
|
||||
target: "event";
|
||||
target: "event_block";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@ efl_eolian_legacy_files = \
|
|||
lib/efl/interfaces/efl_ui_scrollable_interactive.eo \
|
||||
lib/efl/interfaces/efl_ui_scrollbar.eo \
|
||||
lib/efl/interfaces/efl_ui_selectable.eo \
|
||||
lib/efl/interfaces/efl_ui_multi_selectable.eo \
|
||||
lib/efl/interfaces/efl_ui_zoom.eo \
|
||||
$(NULL)
|
||||
|
||||
|
|
|
@ -81,6 +81,13 @@ elm_public_eolian_files = \
|
|||
lib/elementary/efl_ui_view_list_pan.eo \
|
||||
lib/elementary/efl_ui_view_list_segarray.eo \
|
||||
lib/elementary/efl_ui_view_list_relayout.eo \
|
||||
lib/elementary/efl_ui_item.eo \
|
||||
lib/elementary/efl_ui_list_item.eo \
|
||||
lib/elementary/efl_ui_list_default_item_part_icon.eo \
|
||||
lib/elementary/efl_ui_list_default_item_part_end.eo \
|
||||
lib/elementary/efl_ui_list_default_item.eo \
|
||||
lib/elementary/efl_ui_list_empty_item.eo \
|
||||
lib/elementary/efl_ui_list.eo \
|
||||
lib/elementary/efl_ui_panes_part.eo \
|
||||
lib/elementary/efl_ui_progressbar_part.eo \
|
||||
lib/elementary/efl_ui_slider_part_indicator.eo \
|
||||
|
@ -391,6 +398,9 @@ includesunstable_HEADERS = \
|
|||
lib/elementary/elm_widget_thumb.h \
|
||||
lib/elementary/elm_widget_toolbar.h \
|
||||
lib/elementary/efl_ui_video_private.h \
|
||||
lib/elementary/efl_ui_item_private.h \
|
||||
lib/elementary/efl_ui_list_item_private.h \
|
||||
lib/elementary/efl_ui_list_private.h \
|
||||
lib/elementary/efl_ui_view_list_private.h \
|
||||
lib/elementary/efl_ui_view_list_segarray.h \
|
||||
lib/elementary/elm_widget_web.h \
|
||||
|
@ -809,6 +819,11 @@ lib_elementary_libelementary_la_SOURCES = \
|
|||
lib/elementary/efl_ui_focus_parent_provider_gen.c \
|
||||
lib/elementary/efl_ui_focus_util.c \
|
||||
lib/elementary/elm_widget_item_static_focus.c \
|
||||
lib/elementary/efl_ui_item.c \
|
||||
lib/elementary/efl_ui_list_item.c \
|
||||
lib/elementary/efl_ui_list_default_item.c \
|
||||
lib/elementary/efl_ui_list_empty_item.c \
|
||||
lib/elementary/efl_ui_list.c \
|
||||
lib/elementary/efl_ui_view_list.c \
|
||||
lib/elementary/efl_ui_view_list_precise_layouter.c \
|
||||
lib/elementary/efl_ui_view_list_segarray.c \
|
||||
|
|
|
@ -60,6 +60,7 @@
|
|||
/list_example_01
|
||||
/list_example_02
|
||||
/list_example_03
|
||||
/efl_ui_list_example_1
|
||||
/efl_ui_view_list_example_1
|
||||
/efl_ui_view_list_example_2
|
||||
/efl_ui_view_list_example_3
|
||||
|
|
|
@ -177,6 +177,7 @@ efl_thread_3.c \
|
|||
efl_thread_4.c \
|
||||
efl_thread_5.c \
|
||||
efl_thread_6.c \
|
||||
efl_ui_list_example_1.c \
|
||||
efl_ui_view_list_example_1.c \
|
||||
efl_ui_view_list_example_2.c \
|
||||
efl_ui_view_list_example_3.c
|
||||
|
@ -393,6 +394,7 @@ efl_thread_3 \
|
|||
efl_thread_4 \
|
||||
efl_thread_5 \
|
||||
efl_thread_6 \
|
||||
efl_ui_list_example_1 \
|
||||
efl_ui_view_list_example_1 \
|
||||
efl_ui_view_list_example_2 \
|
||||
efl_ui_view_list_example_3
|
||||
|
|
|
@ -0,0 +1,327 @@
|
|||
// gcc -o efl_ui_list_example_1 efl_ui_list_example_1.c `pkg-config --cflags --libs elementary`
|
||||
// ./efl_ui_list_example_1 item_style_name
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "elementary_config.h"
|
||||
#else
|
||||
# define EFL_BETA_API_SUPPORT 1
|
||||
# define EFL_EO_API_SUPPORT 1
|
||||
#endif
|
||||
|
||||
#include <Elementary.h>
|
||||
#include <Efl.h>
|
||||
#include <Eio.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#define NUM_ITEMS 400
|
||||
|
||||
typedef struct _List_Scroll_Data {
|
||||
Eo *list;
|
||||
Eo *slider;
|
||||
Eina_Bool anim;
|
||||
} List_Scroll_Data;
|
||||
List_Scroll_Data priv_d;
|
||||
|
||||
|
||||
static void
|
||||
_list_selected(void *data, const Efl_Event *ev)
|
||||
{
|
||||
Eo *list = ev->object;
|
||||
Eo *item = ev->info, *tmp;
|
||||
printf("list item [%p:%d] is %s\n", item, efl_ui_item_index_get(item), (efl_ui_item_selected_get(item)? "selected" : "unselected"));
|
||||
|
||||
Eina_Iterator *selects = efl_ui_list_selected_items_get(list);
|
||||
|
||||
EINA_ITERATOR_FOREACH(selects, tmp)
|
||||
printf("selected [%p:%d] ", tmp, efl_ui_item_index_get(tmp));
|
||||
printf("\n");
|
||||
eina_iterator_free(selects);
|
||||
}
|
||||
|
||||
static void
|
||||
_list_unselected(void *data, const Efl_Event *ev)
|
||||
{
|
||||
Eo *item = ev->info;
|
||||
printf("list item [%p : %d] is %s\n", item, efl_ui_item_index_get(item), (efl_ui_item_selected_get(item)? "selected" : "unselected"));
|
||||
}
|
||||
|
||||
static void
|
||||
_list_pressed(void *data, const Efl_Event *ev)
|
||||
{
|
||||
Eo *item = ev->info;
|
||||
printf("list item [%p : %d] is pressed\n", item, efl_ui_item_index_get(item));
|
||||
}
|
||||
|
||||
static void
|
||||
_list_unpressed(void *data, const Efl_Event *ev)
|
||||
{
|
||||
Eo *item = ev->info;
|
||||
printf("list item [%p : %d] is unpressed\n", item, efl_ui_item_index_get(item));
|
||||
}
|
||||
|
||||
static void
|
||||
_list_longpressed(void *data, const Efl_Event *ev)
|
||||
{
|
||||
Eo *item = ev->info;
|
||||
printf("list item [%p : %d] is longpressed\n", item, efl_ui_item_index_get(item));
|
||||
}
|
||||
|
||||
static void
|
||||
_select_radio_changed(void *data, const Efl_Event *ev)
|
||||
{
|
||||
Eo *list = data;
|
||||
efl_ui_select_mode_set(list, efl_ui_radio_state_value_get(ev->object));
|
||||
}
|
||||
|
||||
static void
|
||||
_anim_radio_changed(void *data, const Efl_Event *ev)
|
||||
{
|
||||
priv_d.anim = efl_ui_radio_state_value_get(ev->object);
|
||||
}
|
||||
|
||||
static void
|
||||
_scrl_btn_clicked(void *data, const Efl_Event *ev)
|
||||
{
|
||||
Efl_Ui_List_Item *item = efl_ui_list_last_selected_item_get(priv_d.list);
|
||||
printf("show [%d:%p] [%d]\n", efl_ui_item_index_get(item), item, priv_d.anim);
|
||||
efl_ui_list_item_scroll(priv_d.list, item, priv_d.anim);
|
||||
}
|
||||
|
||||
static void
|
||||
_scrl_align_btn_clicked(void *data, const Efl_Event *ev)
|
||||
{
|
||||
Efl_Ui_List_Item *item = efl_ui_list_last_selected_item_get(priv_d.list);
|
||||
double align = efl_ui_range_value_get(priv_d.slider);
|
||||
printf("show [%d:%p] [%.2lf], [%d]\n", efl_ui_item_index_get(item), item, align, priv_d.anim);
|
||||
efl_ui_list_item_scroll_align(priv_d.list, item, align, priv_d.anim);
|
||||
}
|
||||
|
||||
EAPI_MAIN int
|
||||
elm_main(int argc, char **argv)
|
||||
{
|
||||
Eo *win, *list;
|
||||
Eo *wbox, *ibox, *bbox, *rbox;
|
||||
Eo *item, *check, *txt;
|
||||
Eo *radio, *select_radio, *anim_radio;
|
||||
Eo *slider, *scrl_btn;
|
||||
int i;
|
||||
char buf[256];
|
||||
Eina_Bool emptystyle = EINA_FALSE;
|
||||
|
||||
win = elm_win_util_standard_add("list", "list");
|
||||
elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
|
||||
elm_win_autodel_set(win, EINA_TRUE);
|
||||
efl_gfx_entity_size_set(win, EINA_SIZE2D(400, 800));
|
||||
|
||||
wbox = efl_add(EFL_UI_BOX_CLASS, win);
|
||||
efl_ui_direction_set(wbox, EFL_UI_DIR_VERTICAL);
|
||||
efl_gfx_size_hint_weight_set(wbox, EFL_GFX_SIZE_HINT_EXPAND, EFL_GFX_SIZE_HINT_EXPAND);
|
||||
efl_gfx_size_hint_align_set(wbox, EFL_GFX_SIZE_HINT_FILL, EFL_GFX_SIZE_HINT_FILL);
|
||||
|
||||
if ((argv[1] != NULL) &&
|
||||
(!strcmp(argv[1], "empty")))
|
||||
emptystyle = EINA_TRUE;
|
||||
|
||||
priv_d.list = list = efl_add(EFL_UI_LIST_CLASS, wbox);
|
||||
efl_gfx_size_hint_weight_set(list, EFL_GFX_SIZE_HINT_EXPAND, 0.9);
|
||||
|
||||
efl_event_callback_add(list, EFL_UI_EVENT_SELECTED, _list_selected, NULL);
|
||||
efl_event_callback_add(list, EFL_UI_EVENT_UNSELECTED, _list_unselected, NULL);
|
||||
efl_event_callback_add(list, EFL_UI_EVENT_PRESSED, _list_pressed, NULL);
|
||||
efl_event_callback_add(list, EFL_UI_EVENT_UNPRESSED, _list_unpressed, NULL);
|
||||
efl_event_callback_add(list, EFL_UI_EVENT_LONGPRESSED, _list_longpressed, NULL);
|
||||
|
||||
for (i = 0; i < NUM_ITEMS; i++)
|
||||
{
|
||||
if (emptystyle) item = efl_add(EFL_UI_LIST_EMPTY_ITEM_CLASS, list);
|
||||
else item = efl_add(EFL_UI_LIST_DEFAULT_ITEM_CLASS, list);
|
||||
|
||||
/* disable case test */
|
||||
if (i == 1) efl_ui_widget_disabled_set(item, EINA_TRUE);
|
||||
|
||||
if (emptystyle)
|
||||
{
|
||||
ibox = efl_add(EFL_UI_BOX_CLASS, item);
|
||||
efl_ui_direction_set(ibox, EFL_UI_DIR_HORIZONTAL);
|
||||
|
||||
txt = efl_add(EFL_UI_TEXT_CLASS, ibox);
|
||||
efl_gfx_size_hint_weight_set(txt, 0.95, EFL_GFX_SIZE_HINT_EXPAND);
|
||||
efl_text_halign_set(txt, 0.2);
|
||||
efl_text_interactive_selection_allowed_set(txt, EINA_FALSE);
|
||||
snprintf(buf, sizeof(buf), "empty style item [%d]", i);
|
||||
efl_text_set(txt, buf);
|
||||
efl_pack_end(ibox, txt);
|
||||
|
||||
check = efl_add(EFL_UI_CHECK_CLASS, ibox);
|
||||
efl_gfx_size_hint_weight_set(check, 0.05, EFL_GFX_SIZE_HINT_EXPAND);
|
||||
efl_pack_end(ibox, check);
|
||||
|
||||
if (i % 2)
|
||||
efl_content_set(item, ibox);
|
||||
else
|
||||
efl_content_set(efl_part(item, "content"), ibox);
|
||||
}
|
||||
else
|
||||
{
|
||||
snprintf(buf, sizeof(buf), "default style item [%d]", i);
|
||||
if (i % 2)
|
||||
efl_text_set(efl_part(item, "text"), buf);
|
||||
else
|
||||
efl_text_set(item, buf);
|
||||
|
||||
|
||||
check = efl_add(EFL_UI_CHECK_CLASS, item);
|
||||
if ((i % 3) == 0)
|
||||
efl_content_set(efl_part(item, "end"), check);
|
||||
else if ((i % 3) == 1)
|
||||
efl_content_set(efl_part(item, "icon"), check);
|
||||
else
|
||||
efl_content_set(item, check);
|
||||
}
|
||||
/* Pack APIs test */
|
||||
switch (i)
|
||||
{
|
||||
case 10:
|
||||
efl_gfx_color_set(efl_part(item, "background"), 255, 0, 0, 255);
|
||||
efl_pack_begin(list, item);
|
||||
break;
|
||||
|
||||
case 20:
|
||||
efl_gfx_color_set(efl_part(item, "background"), 0, 255, 0, 255);
|
||||
efl_pack_before(list, item, efl_pack_content_get(list, 19));
|
||||
break;
|
||||
|
||||
case 30:
|
||||
efl_gfx_color_set(efl_part(item, "background"), 0, 0, 255, 255);
|
||||
efl_pack_after(list, item, efl_pack_content_get(list, 29));
|
||||
break;
|
||||
|
||||
case 40:
|
||||
efl_file_set(efl_part(item, "background"), "./sky_01.jpg", NULL);
|
||||
efl_gfx_image_scale_type_set(efl_part(item, "background"), EFL_GFX_IMAGE_SCALE_TYPE_FIT_OUTSIDE);
|
||||
efl_pack_at(list, item, 39);
|
||||
break;
|
||||
|
||||
case 50:
|
||||
efl_file_set(efl_part(item, "background"), "./sky_01.jpg", NULL);
|
||||
efl_gfx_image_scale_type_set(efl_part(item, "background"), EFL_GFX_IMAGE_SCALE_TYPE_TILE);
|
||||
efl_pack(list, item);
|
||||
break;
|
||||
|
||||
case 60:
|
||||
efl_pack(list, item);
|
||||
efl_pack_unpack(list, item);
|
||||
efl_del(item);
|
||||
break;
|
||||
|
||||
default:
|
||||
efl_pack_end(list, item);
|
||||
}
|
||||
}
|
||||
|
||||
efl_pack_end(wbox, list);
|
||||
|
||||
/*select mode */
|
||||
txt = efl_add(EFL_UI_TEXT_CLASS, wbox);
|
||||
efl_gfx_size_hint_weight_set(txt, EFL_GFX_SIZE_HINT_EXPAND, 0.01);
|
||||
efl_text_halign_set(txt, 0.02);
|
||||
efl_text_interactive_selection_allowed_set(txt, EINA_FALSE);
|
||||
efl_text_set(txt, "Select Mode");
|
||||
efl_pack_end(wbox, txt);
|
||||
|
||||
bbox = efl_add(EFL_UI_BOX_CLASS, wbox);
|
||||
efl_ui_direction_set(bbox, EFL_UI_DIR_HORIZONTAL);
|
||||
efl_gfx_size_hint_weight_set(bbox, EFL_GFX_SIZE_HINT_EXPAND, 0.05);
|
||||
|
||||
select_radio = radio = efl_add(EFL_UI_RADIO_CLASS, wbox);
|
||||
efl_text_set(radio, "SINGLE");
|
||||
efl_ui_radio_state_value_set(radio, EFL_UI_SELECT_SINGLE);
|
||||
efl_event_callback_add(radio, EFL_UI_RADIO_EVENT_CHANGED, _select_radio_changed, list);
|
||||
efl_pack_end(bbox, radio);
|
||||
radio = efl_add(EFL_UI_RADIO_CLASS, wbox);
|
||||
efl_text_set(radio, "SINGLE_ALWAYS");
|
||||
efl_ui_radio_state_value_set(radio, EFL_UI_SELECT_SINGLE_ALWAYS);
|
||||
efl_ui_radio_group_add(radio, select_radio);
|
||||
efl_event_callback_add(radio, EFL_UI_RADIO_EVENT_CHANGED, _select_radio_changed, list);
|
||||
efl_pack_end(bbox, radio);
|
||||
radio = efl_add(EFL_UI_RADIO_CLASS, wbox);
|
||||
efl_text_set(radio, "MULTI");
|
||||
efl_ui_radio_state_value_set(radio, EFL_UI_SELECT_MULTI);
|
||||
efl_ui_radio_group_add(radio, select_radio);
|
||||
efl_event_callback_add(radio, EFL_UI_RADIO_EVENT_CHANGED, _select_radio_changed, list);
|
||||
efl_pack_end(bbox, radio);
|
||||
radio = efl_add(EFL_UI_RADIO_CLASS, wbox);
|
||||
efl_text_set(radio, "NONE");
|
||||
efl_ui_radio_state_value_set(radio, EFL_UI_SELECT_NONE);
|
||||
efl_ui_radio_group_add(radio, select_radio);
|
||||
efl_event_callback_add(radio, EFL_UI_RADIO_EVENT_CHANGED, _select_radio_changed, list);
|
||||
efl_pack_end(bbox, radio);
|
||||
efl_pack_end(wbox, bbox);
|
||||
|
||||
/* scroll mode */
|
||||
txt = efl_add(EFL_UI_TEXT_CLASS, wbox);
|
||||
efl_gfx_size_hint_weight_set(txt, EFL_GFX_SIZE_HINT_EXPAND, 0.01);
|
||||
efl_text_interactive_selection_allowed_set(txt, EINA_FALSE);
|
||||
efl_text_halign_set(txt, 0.02);
|
||||
efl_text_set(txt, "Item Scroll");
|
||||
efl_pack_end(wbox, txt);
|
||||
|
||||
priv_d.slider = slider = efl_add(EFL_UI_SLIDER_CLASS, wbox);
|
||||
efl_ui_direction_set(slider, EFL_UI_DIR_HORIZONTAL);
|
||||
efl_gfx_size_hint_weight_set(slider, 0.0, 0.05);
|
||||
efl_gfx_size_hint_align_set(slider, 0.5, 0.5);
|
||||
efl_gfx_size_hint_min_set(slider, EINA_SIZE2D(380, 20));
|
||||
efl_ui_range_min_max_set(slider, 0.0, 1.0);
|
||||
efl_pack_end(wbox, slider);
|
||||
|
||||
bbox = efl_add(EFL_UI_BOX_CLASS, wbox);
|
||||
efl_ui_direction_set(bbox, EFL_UI_DIR_HORIZONTAL);
|
||||
efl_gfx_size_hint_weight_set(bbox, EFL_GFX_SIZE_HINT_EXPAND, 0.05);
|
||||
|
||||
rbox = efl_add(EFL_UI_BOX_CLASS, bbox);
|
||||
efl_ui_direction_set(rbox, EFL_UI_DIR_VERTICAL);
|
||||
|
||||
anim_radio = radio = efl_add(EFL_UI_RADIO_CLASS, rbox);
|
||||
efl_gfx_size_hint_align_set(radio, 0.5, 0.5);
|
||||
efl_text_set(radio, "ANIMATION OFF");
|
||||
efl_ui_radio_state_value_set(radio, 0);
|
||||
efl_event_callback_add(radio, EFL_UI_RADIO_EVENT_CHANGED, _anim_radio_changed, NULL);
|
||||
efl_pack_end(rbox, radio);
|
||||
radio = efl_add(EFL_UI_RADIO_CLASS, rbox);
|
||||
efl_gfx_size_hint_align_set(radio, 0.5, 0.5);
|
||||
efl_text_set(radio, "ANIMATION ON");
|
||||
efl_ui_radio_state_value_set(radio, 1);
|
||||
efl_ui_radio_group_add(radio, anim_radio);
|
||||
efl_event_callback_add(radio, EFL_UI_RADIO_EVENT_CHANGED, _anim_radio_changed, NULL);
|
||||
efl_pack_end(rbox, radio);
|
||||
efl_pack_end(bbox, rbox);
|
||||
|
||||
rbox = efl_add(EFL_UI_BOX_CLASS, bbox);
|
||||
efl_ui_direction_set(rbox, EFL_UI_DIR_VERTICAL);
|
||||
|
||||
scrl_btn = efl_add(EFL_UI_BUTTON_CLASS, rbox);
|
||||
efl_text_set(scrl_btn, "Scroll Item");
|
||||
efl_gfx_size_hint_align_set(scrl_btn, 0.5, 0.5);
|
||||
efl_gfx_size_hint_min_set(scrl_btn, EINA_SIZE2D(200, 25));
|
||||
efl_event_callback_add(scrl_btn, EFL_UI_EVENT_CLICKED, _scrl_btn_clicked, NULL);
|
||||
efl_pack_end(rbox, scrl_btn);
|
||||
|
||||
scrl_btn = efl_add(EFL_UI_BUTTON_CLASS, rbox);
|
||||
efl_text_set(scrl_btn, "Scroll Item Align");
|
||||
efl_gfx_size_hint_align_set(scrl_btn, 0.5, 0.5);
|
||||
efl_gfx_size_hint_min_set(scrl_btn, EINA_SIZE2D(200, 25));
|
||||
efl_event_callback_add(scrl_btn, EFL_UI_EVENT_CLICKED, _scrl_align_btn_clicked, NULL);
|
||||
efl_pack_end(rbox, scrl_btn);
|
||||
|
||||
efl_pack_end(bbox, rbox);
|
||||
efl_pack_end(wbox, bbox);
|
||||
|
||||
elm_win_resize_object_add(win, wbox);
|
||||
//window show
|
||||
efl_gfx_entity_visible_set(win, EINA_TRUE);
|
||||
|
||||
elm_run();
|
||||
|
||||
return 0;
|
||||
}
|
||||
ELM_MAIN()
|
|
@ -85,7 +85,7 @@ elm_main(int argc, char **argv)
|
|||
factory = efl_add(EFL_UI_LAYOUT_FACTORY_CLASS, win);
|
||||
efl_ui_model_connect(factory, "signal/elm,state,%v", "odd_style");
|
||||
efl_ui_model_connect(factory, "elm.text", "name");
|
||||
efl_ui_layout_factory_theme_config(factory, "list", "item", "default");
|
||||
efl_ui_layout_factory_theme_config(factory, "list_item", NULL, "default");
|
||||
|
||||
li = efl_add(EFL_UI_VIEW_LIST_CLASS, win);
|
||||
efl_ui_view_list_layout_factory_set(li, factory);
|
||||
|
|
|
@ -46,7 +46,7 @@ elm_main(int argc, char **argv)
|
|||
model = efl_add(EIO_MODEL_CLASS, efl_main_loop_get(), eio_model_path_set(efl_added, dirname));
|
||||
factory = efl_add(EFL_UI_LAYOUT_FACTORY_CLASS, win);
|
||||
efl_ui_model_connect(factory, "elm.text", "filename");
|
||||
efl_ui_layout_factory_theme_config(factory, "list", "item", "default");
|
||||
efl_ui_layout_factory_theme_config(factory, "list_item", NULL, "default");
|
||||
|
||||
li = efl_add(EFL_UI_VIEW_LIST_CLASS, win);
|
||||
efl_ui_view_list_layout_factory_set(li, factory);
|
||||
|
|
|
@ -223,7 +223,7 @@ elm_main(int argc, char **argv)
|
|||
priv->model = _make_model();
|
||||
factory = efl_add(EFL_UI_LAYOUT_FACTORY_CLASS, win);
|
||||
efl_ui_model_connect(factory, "elm.text", "filename");
|
||||
efl_ui_layout_factory_theme_config(factory, "list", "item", "default");
|
||||
efl_ui_layout_factory_theme_config(factory, "list_item", NULL, "default");
|
||||
|
||||
priv->list1 = efl_add(EFL_UI_VIEW_LIST_CLASS, win, efl_ui_view_model_set(efl_added, priv->model));
|
||||
efl_event_callback_add(priv->list1, EFL_UI_VIEW_LIST_EVENT_ITEM_REALIZED, _realized_1_cb, priv);
|
||||
|
@ -235,7 +235,7 @@ elm_main(int argc, char **argv)
|
|||
factory = efl_add(EFL_UI_LAYOUT_FACTORY_CLASS, win);
|
||||
efl_ui_model_connect(factory, "elm.text", "filename");
|
||||
efl_ui_model_connect(factory, "signal/elm,state,%v", "selected");
|
||||
efl_ui_layout_factory_theme_config(factory, "list", "item", "default");
|
||||
efl_ui_layout_factory_theme_config(factory, "list_item", NULL, "default");
|
||||
priv->list2 = efl_add(EFL_UI_VIEW_LIST_CLASS, win, efl_ui_view_model_set(efl_added, priv->model));
|
||||
efl_event_callback_add(priv->list2, EFL_UI_VIEW_LIST_EVENT_ITEM_REALIZED, _realized_2_cb, priv->list2);
|
||||
evas_object_size_hint_weight_set(priv->list2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
||||
|
|
|
@ -92,6 +92,7 @@ typedef Efl_Gfx_Path_Command_Type Efl_Gfx_Path_Command;
|
|||
#include "interfaces/efl_ui_scrollbar.eo.h"
|
||||
#include "interfaces/efl_ui_scrollable_interactive.eo.h"
|
||||
#include "interfaces/efl_ui_selectable.eo.h"
|
||||
#include "interfaces/efl_ui_multi_selectable.eo.h"
|
||||
#include "interfaces/efl_ui_zoom.eo.h"
|
||||
|
||||
#include "interfaces/efl_screen.eo.h"
|
||||
|
|
|
@ -74,6 +74,7 @@
|
|||
#include "interfaces/efl_ui_scrollable_interactive.eo.c"
|
||||
#include "interfaces/efl_ui_scrollbar.eo.c"
|
||||
#include "interfaces/efl_ui_selectable.eo.c"
|
||||
#include "interfaces/efl_ui_multi_selectable.eo.c"
|
||||
#include "interfaces/efl_ui_zoom.eo.c"
|
||||
|
||||
EAPI void
|
||||
|
|
|
@ -1,54 +0,0 @@
|
|||
interface Efl.Ui.Item {
|
||||
[[Efl UI item interface]]
|
||||
legacy_prefix: null;
|
||||
methods {
|
||||
@property prev {
|
||||
get {
|
||||
[[Get the item before this one in the widget's list of items.
|
||||
|
||||
See also @.next.
|
||||
]]
|
||||
}
|
||||
values {
|
||||
item: Efl.Ui.Item; [[The item before the object in its parent's
|
||||
list. If there is no previous item or in case
|
||||
of error, $null is returned.]]
|
||||
}
|
||||
}
|
||||
@property next {
|
||||
get {
|
||||
[[Get the item after this one in the widget's list of items.
|
||||
|
||||
See also @.prev.
|
||||
]]
|
||||
}
|
||||
values {
|
||||
item: Efl.Ui.Item; [[The item after the object in its parent's
|
||||
list. If there is no next item or in case
|
||||
of error, $null is returned.]]
|
||||
}
|
||||
}
|
||||
@property selected {
|
||||
[[Indicates whether this item is currently selected.]]
|
||||
get {
|
||||
[[Get the selected state of this item.]]
|
||||
}
|
||||
set {
|
||||
[[Set the selected state of $item.
|
||||
|
||||
This sets the selected state of the given item $it.
|
||||
$true for selected, $false for not selected.
|
||||
|
||||
If a new item is selected the previously selected will
|
||||
be unselected. Previously selected item can be retrieved
|
||||
with @Efl.Ui.Menu.selected_item.get.
|
||||
|
||||
Selected items will be highlighted.
|
||||
]]
|
||||
}
|
||||
values {
|
||||
selected: bool; [[The selection state.]]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
enum Efl.Ui.Select_Mode {
|
||||
[[Type of multi selectable object.]]
|
||||
legacy: efl_ui_select;
|
||||
single, [[Only single child is selected. if the child is selected,
|
||||
previous selected child will be unselected.]]
|
||||
single_always, [[Same as single select except, this will be selected
|
||||
in every select calls though child is already been selected.]]
|
||||
multi, [[allow multiple selection of children.]]
|
||||
none [[Last value of select mode. child cannot be selected at all.]]
|
||||
}
|
||||
|
||||
interface Efl.Ui.Multi_Selectable ()
|
||||
{
|
||||
[[Efl UI Multi selectable interface.
|
||||
The container have to control select property of multiple chidren.]]
|
||||
eo_prefix: efl_ui;
|
||||
methods
|
||||
{
|
||||
@property select_mode {
|
||||
[[The mode type for children selection.]]
|
||||
set {}
|
||||
get {}
|
||||
values {
|
||||
mode: Efl.Ui.Select_Mode; [[Type of selection of children]]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -324,6 +324,13 @@ typedef Eo Efl_Ui_Focus_Manager;
|
|||
# include <efl_ui_image_factory.eo.h>
|
||||
# include <efl_ui_slider_interval.eo.h>
|
||||
# include <efl_ui_layout_factory.eo.h>
|
||||
# include <efl_ui_item.eo.h>
|
||||
# include <efl_ui_list_item.eo.h>
|
||||
# include <efl_ui_list_default_item_part_icon.eo.h>
|
||||
# include <efl_ui_list_default_item_part_end.eo.h>
|
||||
# include <efl_ui_list_default_item.eo.h>
|
||||
# include <efl_ui_list_empty_item.eo.h>
|
||||
# include <efl_ui_list.eo.h>
|
||||
# include <efl_ui_view_list_types.eot.h>
|
||||
# include <efl_ui_view_list_segarray.h>
|
||||
# include <efl_ui_view_list_segarray.eo.h>
|
||||
|
|
|
@ -0,0 +1,260 @@
|
|||
#ifdef HAVE_CONFIG_H
|
||||
# include "elementary_config.h"
|
||||
#endif
|
||||
|
||||
#define EFL_ACCESS_PROTECTED
|
||||
#define EFL_UI_WIDGET_PART_BG_PROTECTED
|
||||
|
||||
#include <Elementary.h>
|
||||
|
||||
#include "elm_priv.h"
|
||||
#include "efl_ui_item_private.h"
|
||||
|
||||
#define MY_CLASS EFL_UI_ITEM_CLASS
|
||||
#define MY_CLASS_PFX efl_ui_item
|
||||
|
||||
#define MY_CLASS_NAME "Efl.Ui.Item"
|
||||
|
||||
static void
|
||||
_item_select(Eo *obj, Efl_Ui_Item_Data *pd)
|
||||
{
|
||||
if (pd->selected &&
|
||||
(*(pd->select_mode) != EFL_UI_SELECT_SINGLE_ALWAYS))
|
||||
return;
|
||||
if (*(pd->select_mode) == EFL_UI_SELECT_NONE) return;
|
||||
|
||||
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
|
||||
|
||||
pd->selected = EINA_TRUE;
|
||||
edje_object_signal_emit(wd->resize_obj, "efl,state,selected", "efl");
|
||||
efl_event_callback_call(obj, EFL_UI_EVENT_SELECTED, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
_item_unselect(Eo *obj, Efl_Ui_Item_Data *pd)
|
||||
{
|
||||
if (!pd->selected) return;
|
||||
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
|
||||
|
||||
pd->selected = EINA_FALSE;
|
||||
edje_object_signal_emit(wd->resize_obj, "efl,state,unselected", "efl");
|
||||
efl_event_callback_call(obj, EFL_UI_EVENT_UNSELECTED, NULL);
|
||||
}
|
||||
|
||||
/* Mouse Controls */
|
||||
static Eina_Bool
|
||||
_item_longpressed(void *data)
|
||||
{
|
||||
Efl_Ui_Item *item = data;
|
||||
EFL_UI_ITEM_DATA_GET_OR_RETURN(item, pd, ECORE_CALLBACK_CANCEL);
|
||||
|
||||
pd->longpress_timer = NULL;
|
||||
|
||||
efl_event_callback_call(item, EFL_UI_EVENT_LONGPRESSED, NULL);
|
||||
return ECORE_CALLBACK_CANCEL;
|
||||
}
|
||||
|
||||
static void
|
||||
_item_mouse_down(void *data,
|
||||
Evas *evas EINA_UNUSED,
|
||||
Evas_Object *obj EINA_UNUSED,
|
||||
void *event_info)
|
||||
{
|
||||
Evas_Event_Mouse_Down *ev = event_info;
|
||||
Eo *item = data;
|
||||
EFL_UI_ITEM_DATA_GET_OR_RETURN(item, pd);
|
||||
ELM_WIDGET_DATA_GET_OR_RETURN(item, wd);
|
||||
if (wd->disabled) return;
|
||||
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
|
||||
|
||||
edje_object_signal_emit(wd->resize_obj, "efl,state,pressed", "efl");
|
||||
|
||||
pd->longpress_timer = ecore_timer_add(_elm_config->longpress_timeout, _item_longpressed, item);
|
||||
efl_event_callback_call(item, EFL_UI_EVENT_PRESSED, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
_item_mouse_up(void *data,
|
||||
Evas *evas EINA_UNUSED,
|
||||
Evas_Object *obj EINA_UNUSED,
|
||||
void *event_info)
|
||||
{
|
||||
Evas_Event_Mouse_Up *ev = event_info;
|
||||
Eo *item = data;
|
||||
EFL_UI_ITEM_DATA_GET_OR_RETURN(item, pd);
|
||||
ELM_WIDGET_DATA_GET_OR_RETURN(item, wd);
|
||||
if (wd->disabled) return;
|
||||
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
|
||||
{
|
||||
//FIXME: should we send this message to fallback?
|
||||
edje_object_signal_emit(wd->resize_obj, "efl,state,unpressed", "efl");
|
||||
//efl_event_callback_call(item, EFL_UI_EVENT_UNPRESSED, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
if (pd->longpress_timer)
|
||||
{
|
||||
ecore_timer_del(pd->longpress_timer);
|
||||
pd->longpress_timer = NULL;
|
||||
}
|
||||
|
||||
edje_object_signal_emit(wd->resize_obj, "efl,state,unpressed", "efl");
|
||||
efl_event_callback_call(item, EFL_UI_EVENT_UNPRESSED, NULL);
|
||||
|
||||
if ((*(pd->select_mode) != EFL_UI_SELECT_SINGLE_ALWAYS) && (pd->selected))
|
||||
_item_unselect(item, pd);
|
||||
else if (*(pd->select_mode) != EFL_UI_SELECT_NONE)
|
||||
_item_select(item, pd);
|
||||
}
|
||||
|
||||
static void
|
||||
_item_mouse_move(void *data EINA_UNUSED,
|
||||
Evas *evas EINA_UNUSED,
|
||||
Evas_Object *obj EINA_UNUSED,
|
||||
void *event_info)
|
||||
{
|
||||
Evas_Event_Mouse_Move *ev = event_info;
|
||||
Eo *item = data;
|
||||
EFL_UI_ITEM_DATA_GET_OR_RETURN(item, pd);
|
||||
ELM_WIDGET_DATA_GET_OR_RETURN(item, wd);
|
||||
if (wd->disabled) return;
|
||||
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
|
||||
{
|
||||
edje_object_signal_emit(wd->resize_obj, "efl,state,unpressed", "efl");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
_item_mouse_in(void *data EINA_UNUSED,
|
||||
Evas *evas EINA_UNUSED,
|
||||
Evas_Object *obj EINA_UNUSED,
|
||||
void *event_info)
|
||||
{
|
||||
Evas_Event_Mouse_In *ev = event_info;
|
||||
Eo *item = data;
|
||||
EFL_UI_ITEM_DATA_GET_OR_RETURN(item, pd);
|
||||
ELM_WIDGET_DATA_GET_OR_RETURN(item, wd);
|
||||
if (wd->disabled) return;
|
||||
|
||||
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
|
||||
}
|
||||
|
||||
static void
|
||||
_item_mouse_callback_add(Eo *obj, void *data)
|
||||
{
|
||||
evas_object_event_callback_add
|
||||
(obj, EVAS_CALLBACK_MOUSE_DOWN, _item_mouse_down, data);
|
||||
evas_object_event_callback_add
|
||||
(obj, EVAS_CALLBACK_MOUSE_UP, _item_mouse_up, data);
|
||||
evas_object_event_callback_add
|
||||
(obj, EVAS_CALLBACK_MOUSE_MOVE, _item_mouse_move, data);
|
||||
evas_object_event_callback_add
|
||||
(obj, EVAS_CALLBACK_MOUSE_IN, _item_mouse_in, data);
|
||||
}
|
||||
|
||||
static void
|
||||
_item_mouse_callback_del(Eo *obj, void *data)
|
||||
{
|
||||
evas_object_event_callback_del_full
|
||||
(obj, EVAS_CALLBACK_MOUSE_DOWN, _item_mouse_down, data);
|
||||
evas_object_event_callback_del_full
|
||||
(obj, EVAS_CALLBACK_MOUSE_UP, _item_mouse_up, data);
|
||||
evas_object_event_callback_del_full
|
||||
(obj, EVAS_CALLBACK_MOUSE_MOVE, _item_mouse_move, data);
|
||||
evas_object_event_callback_del_full
|
||||
(obj, EVAS_CALLBACK_MOUSE_IN, _item_mouse_in, data);
|
||||
}
|
||||
/* Mouse Controls ends */
|
||||
|
||||
static void
|
||||
_sizing_eval(Evas_Object *obj, Efl_Ui_Item_Data *pd)
|
||||
{
|
||||
Evas_Coord minh = -1, minw = -1;
|
||||
Evas_Coord rest_w = 0, rest_h = 0;
|
||||
ELM_WIDGET_DATA_GET_OR_RETURN(pd->obj, wd);
|
||||
|
||||
edje_object_size_min_restricted_calc(wd->resize_obj, &minw, &minh,
|
||||
rest_w, rest_h);
|
||||
evas_object_size_hint_min_set(obj, minw, minh);
|
||||
|
||||
pd->needs_size_calc = EINA_FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
_efl_ui_item_elm_layout_sizing_eval(Eo *obj, Efl_Ui_Item_Data *pd)
|
||||
{
|
||||
if (pd->needs_size_calc) return;
|
||||
pd->needs_size_calc = EINA_TRUE;
|
||||
|
||||
efl_canvas_group_change(obj);
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_efl_ui_item_efl_canvas_group_group_calculate(Eo *obj, Efl_Ui_Item_Data *pd)
|
||||
{
|
||||
if (pd->needs_size_calc)
|
||||
{
|
||||
_sizing_eval(obj, pd);
|
||||
pd->needs_size_calc = EINA_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
EOLIAN static Eo *
|
||||
_efl_ui_item_efl_object_constructor(Eo *obj, Efl_Ui_Item_Data *pd)
|
||||
{
|
||||
pd->obj = obj;
|
||||
obj = efl_constructor(efl_super(obj, MY_CLASS));
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
EOLIAN static Efl_Object *
|
||||
_efl_ui_item_efl_object_finalize(Eo *obj, Efl_Ui_Item_Data *pd EINA_UNUSED)
|
||||
{
|
||||
Eo *eo;
|
||||
eo = efl_finalize(efl_super(obj, MY_CLASS));
|
||||
ELM_WIDGET_DATA_GET_OR_RETURN(eo, wd, eo);
|
||||
|
||||
_item_mouse_callback_add(wd->resize_obj, eo);
|
||||
return eo;
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_efl_ui_item_efl_object_destructor(Eo *obj, Efl_Ui_Item_Data *pd EINA_UNUSED)
|
||||
{
|
||||
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
|
||||
|
||||
_item_mouse_callback_del(wd->resize_obj, obj);
|
||||
efl_destructor(efl_super(obj, MY_CLASS));
|
||||
}
|
||||
|
||||
EOLIAN static int
|
||||
_efl_ui_item_index_get(const Eo *obj, Efl_Ui_Item_Data *pd)
|
||||
{
|
||||
return efl_pack_index_get(pd->parent, obj);
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_efl_ui_item_selected_set(Eo *obj, Efl_Ui_Item_Data *pd, Eina_Bool select)
|
||||
{
|
||||
Eina_Bool selected = !!select;
|
||||
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
|
||||
if (wd->disabled) return;
|
||||
|
||||
if (selected) _item_select(obj, pd);
|
||||
else _item_unselect(obj, pd);
|
||||
}
|
||||
|
||||
EOLIAN static Eina_Bool
|
||||
_efl_ui_item_selected_get(const Eo *obj EINA_UNUSED, Efl_Ui_Item_Data *pd)
|
||||
{
|
||||
return pd->selected;
|
||||
}
|
||||
|
||||
/* Internal EO APIs and hidden overrides */
|
||||
|
||||
#define EFL_UI_ITEM_EXTRA_OPS \
|
||||
ELM_LAYOUT_SIZING_EVAL_OPS(efl_ui_item)
|
||||
|
||||
#include "efl_ui_item.eo.c"
|
|
@ -0,0 +1,30 @@
|
|||
abstract Efl.Ui.Item (Efl.Ui.Layout.Object, Efl.Ui.Selectable, Efl.Ui.Clickable)
|
||||
{
|
||||
[[Item abstract class for pack widget. All item have to be inherited from this class.]]
|
||||
methods {
|
||||
@property index {
|
||||
[[index number of item from their parent object.]]
|
||||
get {}
|
||||
values {
|
||||
index : int;
|
||||
}
|
||||
}
|
||||
@property selected {
|
||||
[[Select property for item object.
|
||||
Item can be selected by user mouse/key input also]]
|
||||
set {}
|
||||
get {}
|
||||
values {
|
||||
select: bool;
|
||||
}
|
||||
}
|
||||
}
|
||||
implements {
|
||||
//Efl.Object
|
||||
Efl.Object.constructor;
|
||||
Efl.Object.finalize;
|
||||
Efl.Object.destructor;
|
||||
//Efl.Canvas
|
||||
Efl.Canvas.Group.group_calculate;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
#ifndef EFL_UI_ITEM_PRIVATE_H
|
||||
#define EFL_UI_ITEM_PRIVATE_H
|
||||
|
||||
#include "Elementary.h"
|
||||
|
||||
typedef struct _Efl_Ui_Item_Data
|
||||
{
|
||||
// Eo Objects
|
||||
Eo *obj; /* Self-Object */
|
||||
Eo *parent; /* Parent Widget */
|
||||
|
||||
Efl_Ui_Select_Mode *select_mode; /* Select Mdoe of parent widget */
|
||||
Ecore_Timer *longpress_timer; /* Timer for longpress handle */
|
||||
|
||||
// Boolean Data
|
||||
Eina_Bool selected : 1; /* State for item selected */
|
||||
Eina_Bool needs_size_calc : 1; /* Flag for Size calculation */
|
||||
} Efl_Ui_Item_Data;
|
||||
|
||||
|
||||
#define EFL_UI_ITEM_DATA_GET(o, pd) \
|
||||
Efl_Ui_Item_Data * pd = efl_data_scope_safe_get(o, EFL_UI_ITEM_CLASS)
|
||||
|
||||
#define EFL_UI_ITEM_DATA_GET_OR_RETURN(o, ptr, ...) \
|
||||
EFL_UI_ITEM_DATA_GET(o, ptr); \
|
||||
if (EINA_UNLIKELY(!ptr)) \
|
||||
{ \
|
||||
ERR("No widget data for object %p (%s)", \
|
||||
o, evas_object_type_get(o)); \
|
||||
return __VA_ARGS__; \
|
||||
}
|
||||
|
||||
#define EFL_UI_ITEM_CHECK_OR_RETURN(obj, ...) \
|
||||
if (EINA_UNLIKELY(!efl_isa((obj), EFL_UI_ITEM_CLASS))) \
|
||||
return __VA_ARGS__;
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,93 @@
|
|||
import efl_ui_list_item;
|
||||
|
||||
class Efl.Ui.List (Efl.Ui.Layout.Object,
|
||||
Efl.Ui.Scrollable_Interactive,
|
||||
Efl.Ui.Scrollbar,
|
||||
Efl.Pack_Linear, Efl.Pack_Layout,
|
||||
Efl.Ui.Clickable,
|
||||
Efl.Ui.Selectable,
|
||||
Efl.Ui.Multi_Selectable)
|
||||
{
|
||||
[[Simple list widget with Pack interface.]]
|
||||
methods {
|
||||
item_scroll {
|
||||
[[scroll move the item to show in the viewport.]]
|
||||
params {
|
||||
@in item: Efl.Ui.List_Item; [[Target item.]]
|
||||
@in animation: bool; [[Boolean value for animation of scroll move.]]
|
||||
}
|
||||
}
|
||||
item_scroll_align {
|
||||
[[scroll move the item to show at the align position of the viewport.]]
|
||||
params {
|
||||
@in item: Efl.Ui.List_Item; [[Target item.]]
|
||||
@in align: double; [[align value in Viewport.]]
|
||||
@in animation: bool; [[Boolean value for animation of scroll move.]]
|
||||
}
|
||||
}
|
||||
@property last_selected_item {
|
||||
[[Property data of last selected item.]]
|
||||
get {}
|
||||
values {
|
||||
return: Efl.Ui.List_Item; [[last selected item of list.]]
|
||||
}
|
||||
}
|
||||
selected_items_get {
|
||||
[[Get the selected items iterator. The iterator sequence will be decided by selection.]]
|
||||
return: iterator<Efl.Ui.List_Item> @owned @warn_unused; [[Iterator covered by selected items list.
|
||||
user have to free the iterator after used.]]
|
||||
}
|
||||
}
|
||||
implements {
|
||||
//Efl.Object
|
||||
Efl.Object.constructor;
|
||||
Efl.Object.finalize;
|
||||
Efl.Object.destructor;
|
||||
|
||||
//Efl.Canvas
|
||||
Efl.Canvas.Group.group_calculate;
|
||||
|
||||
//Efl.Container
|
||||
Efl.Container.content_iterate;
|
||||
Efl.Container.content_count;
|
||||
|
||||
//Efl.Ui.Direction.direction { get; set; } //TODO
|
||||
|
||||
//Efl.Ui.Widget
|
||||
Efl.Ui.Widget.theme_apply;
|
||||
|
||||
//Efl.Ui.Focus
|
||||
//Efl.Ui.Focus.Object.on_focus_update;
|
||||
|
||||
//Efl.Pack
|
||||
Efl.Pack.pack_clear;
|
||||
Efl.Pack.unpack_all;
|
||||
Efl.Pack.unpack;
|
||||
Efl.Pack.pack;
|
||||
Efl.Pack_Linear.pack_begin;
|
||||
Efl.Pack_Linear.pack_end;
|
||||
Efl.Pack_Linear.pack_before;
|
||||
Efl.Pack_Linear.pack_after;
|
||||
Efl.Pack_Linear.pack_at;
|
||||
Efl.Pack_Linear.pack_content_get;
|
||||
Efl.Pack_Linear.pack_unpack_at;
|
||||
Efl.Pack_Linear.pack_index_get;
|
||||
Efl.Pack_Layout.layout_update;
|
||||
Efl.Pack_Layout.layout_request;
|
||||
Efl.Pack.pack_padding { get; set; }
|
||||
//Efl.Pack.pack_align { get; set; }
|
||||
|
||||
//Efl.Ui.Scrollable
|
||||
Efl.Ui.Scrollable_Interactive.scroll;
|
||||
Efl.Ui.Scrollable_Interactive.content_size{ get; }
|
||||
Efl.Ui.Scrollable_Interactive.viewport_geometry{ get; }
|
||||
Efl.Ui.Scrollable_Interactive.bounce_enabled { set; get; }
|
||||
Efl.Ui.Scrollable_Interactive.scroll_freeze { get; set; }
|
||||
Efl.Ui.Scrollable_Interactive.scroll_hold { get; set; }
|
||||
Efl.Ui.Scrollable_Interactive.match_content { set; }
|
||||
Efl.Ui.Scrollbar.bar_mode { get; set; }
|
||||
|
||||
//Efl.Ui.Multi_Selectable
|
||||
Efl.Ui.Multi_Selectable.select_mode {get; set;}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,111 @@
|
|||
#ifdef HAVE_CONFIG_H
|
||||
# include "elementary_config.h"
|
||||
#endif
|
||||
|
||||
#define EFL_UI_LIST_DEFAULT_ITEM_PROTECTED
|
||||
|
||||
#include <Elementary.h>
|
||||
|
||||
#include "elm_priv.h"
|
||||
#include "efl_ui_list_default_item_part_icon.eo.h"
|
||||
#include "efl_ui_list_default_item_part_end.eo.h"
|
||||
#include "elm_part_helper.h"
|
||||
|
||||
#define MY_CLASS EFL_UI_LIST_DEFAULT_ITEM_CLASS
|
||||
#define MY_CLASS_PFX efl_ui_list_default_item
|
||||
|
||||
#define MY_CLASS_NAME "Efl.Ui.List_Default_Item"
|
||||
|
||||
EOLIAN static Efl_Object *
|
||||
_efl_ui_list_default_item_efl_object_finalize(Eo *obj, void *pd EINA_UNUSED)
|
||||
{
|
||||
Eo *eo;
|
||||
eo = efl_finalize(efl_super(obj, MY_CLASS));
|
||||
ELM_WIDGET_DATA_GET_OR_RETURN(eo, wd, eo);
|
||||
Efl_Ui_Theme_Apply theme_apply = efl_ui_layout_object_theme_set(obj, "list_item", NULL, NULL);
|
||||
|
||||
if (theme_apply == EFL_UI_THEME_APPLY_FAILED)
|
||||
CRI("Default Item(%p) failed to set theme [efl/list_item]!", eo);
|
||||
return eo;
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_efl_ui_list_default_item_efl_object_destructor(Eo *obj, void *pd EINA_UNUSED)
|
||||
{
|
||||
efl_destructor(efl_super(obj, MY_CLASS));
|
||||
}
|
||||
|
||||
/* Efl.Part */
|
||||
|
||||
ELM_PART_TEXT_DEFAULT_GET(efl_ui_list_default_item, "efl.text")
|
||||
ELM_PART_TEXT_DEFAULT_IMPLEMENT(efl_ui_list_default_item, void)
|
||||
ELM_PART_MARKUP_DEFAULT_IMPLEMENT(efl_ui_list_default_item, void)
|
||||
ELM_PART_CONTENT_DEFAULT_GET(efl_ui_list_default_item, "efl.icon")
|
||||
ELM_PART_CONTENT_DEFAULT_IMPLEMENT(efl_ui_list_default_item, void
|
||||
)
|
||||
|
||||
Eina_Bool
|
||||
_efl_ui_list_default_item_part_icon_efl_content_content_set(Eo *obj, void *pd EINA_UNUSED, Efl_Gfx_Entity *content)
|
||||
{
|
||||
Elm_Part_Data *wd = efl_data_scope_get(obj, EFL_UI_WIDGET_PART_CLASS);
|
||||
return efl_content_set(efl_part(efl_super(wd->obj, MY_CLASS), wd->part), content);
|
||||
}
|
||||
|
||||
Efl_Gfx_Entity *
|
||||
_efl_ui_list_default_item_part_icon_efl_content_content_get(const Eo *obj, void *pd EINA_UNUSED)
|
||||
{
|
||||
Elm_Part_Data *wd = efl_data_scope_get(obj, EFL_UI_WIDGET_PART_CLASS);
|
||||
return efl_content_get(efl_part(efl_super(wd->obj, MY_CLASS), wd->part));
|
||||
}
|
||||
|
||||
Efl_Gfx_Entity *
|
||||
_efl_ui_list_default_item_part_icon_efl_content_content_unset(Eo *obj, void *pd EINA_UNUSED)
|
||||
{
|
||||
Elm_Part_Data *wd = efl_data_scope_get(obj, EFL_UI_WIDGET_PART_CLASS);
|
||||
return efl_content_unset(efl_part(efl_super(wd->obj, MY_CLASS), wd->part));
|
||||
}
|
||||
#include "efl_ui_list_default_item_part_icon.eo.c"
|
||||
|
||||
Eina_Bool
|
||||
_efl_ui_list_default_item_part_end_efl_content_content_set(Eo *obj, void *pd EINA_UNUSED, Efl_Gfx_Entity *content)
|
||||
{
|
||||
Elm_Part_Data *wd = efl_data_scope_get(obj, EFL_UI_WIDGET_PART_CLASS);
|
||||
return efl_content_set(efl_part(efl_super(wd->obj, MY_CLASS), wd->part), content);
|
||||
}
|
||||
|
||||
Efl_Gfx_Entity *
|
||||
_efl_ui_list_default_item_part_end_efl_content_content_get(const Eo *obj, void *pd EINA_UNUSED)
|
||||
{
|
||||
Elm_Part_Data *wd = efl_data_scope_get(obj, EFL_UI_WIDGET_PART_CLASS);
|
||||
return efl_content_get(efl_part(efl_super(wd->obj, MY_CLASS), wd->part));
|
||||
}
|
||||
|
||||
Efl_Gfx_Entity *
|
||||
_efl_ui_list_default_item_part_end_efl_content_content_unset(Eo *obj, void *pd EINA_UNUSED)
|
||||
{
|
||||
Elm_Part_Data *wd = efl_data_scope_get(obj, EFL_UI_WIDGET_PART_CLASS);
|
||||
return efl_content_unset(efl_part(efl_super(wd->obj, MY_CLASS), wd->part));
|
||||
}
|
||||
#include "efl_ui_list_default_item_part_end.eo.c"
|
||||
|
||||
EOLIAN static Efl_Object *
|
||||
_efl_ui_list_default_item_efl_part_part(const Eo *obj, void *wd EINA_UNUSED, const char *part)
|
||||
{
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(part, NULL);
|
||||
if (eina_streq(part, "text"))
|
||||
return ELM_PART_IMPLEMENT(EFL_UI_LAYOUT_PART_TEXT_CLASS, obj, "efl.text");
|
||||
else if (eina_streq(part, "icon"))
|
||||
return ELM_PART_IMPLEMENT(EFL_UI_LIST_DEFAULT_ITEM_PART_ICON_CLASS, obj, "efl.icon");
|
||||
else if (eina_streq(part, "end"))
|
||||
return ELM_PART_IMPLEMENT(EFL_UI_LIST_DEFAULT_ITEM_PART_END_CLASS, obj, "efl.end");
|
||||
|
||||
return efl_part(efl_super(obj, MY_CLASS), part);
|
||||
}
|
||||
/* Efl.Part end */
|
||||
|
||||
/* Internal EO APIs and hidden overrides */
|
||||
#define EFL_UI_LIST_DEFAULT_ITEM_EXTRA_OPS \
|
||||
ELM_PART_TEXT_DEFAULT_OPS(efl_ui_list_default_item), \
|
||||
ELM_PART_CONTENT_DEFAULT_OPS(efl_ui_list_default_item)
|
||||
|
||||
#include "efl_ui_list_default_item.eo.c"
|
|
@ -0,0 +1,24 @@
|
|||
|
||||
class Efl.Ui.List_Default_Item (Efl.Ui.List_Item,
|
||||
Efl.Text,
|
||||
Efl.Text_Markup,
|
||||
Efl.Ui.Translatable,
|
||||
Efl.Content)
|
||||
{
|
||||
[[List Default Item class.
|
||||
This class need to be sub object of list widget.
|
||||
text and contents can be appliable by efl_text,
|
||||
efl_content or efl_part APIs.]]
|
||||
data: null;
|
||||
implements {
|
||||
//Efl.Object
|
||||
Efl.Object.finalize;
|
||||
Efl.Object.destructor;
|
||||
Efl.Text.text { get; set; }
|
||||
Efl.Text_Markup.markup { get; set; }
|
||||
Efl.Ui.Translatable.translatable_text { get; set; }
|
||||
Efl.Content.content { get; set; }
|
||||
Efl.Content.content_unset;
|
||||
Efl.Part.part;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
class Efl.Ui.List_Default_Item_Part_End (Efl.Ui.Layout.Part, Efl.Content)
|
||||
{
|
||||
[[List Default Item internal content of end part class]]
|
||||
data: null;
|
||||
implements {
|
||||
Efl.Content.content { get; set; }
|
||||
Efl.Content.content_unset;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
class Efl.Ui.List_Default_Item_Part_Icon (Efl.Ui.Layout.Part, Efl.Content)
|
||||
{
|
||||
[[List Default Item internal content of icon part class]]
|
||||
data: null;
|
||||
implements {
|
||||
Efl.Content.content { get; set; }
|
||||
Efl.Content.content_unset;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
#ifdef HAVE_CONFIG_H
|
||||
# include "elementary_config.h"
|
||||
#endif
|
||||
|
||||
#define EFL_UI_LIST_EMPTY_ITEM_PROTECTED
|
||||
|
||||
#include <Elementary.h>
|
||||
|
||||
#include "elm_priv.h"
|
||||
#include "elm_part_helper.h"
|
||||
|
||||
#define MY_CLASS EFL_UI_LIST_EMPTY_ITEM_CLASS
|
||||
#define MY_CLASS_PFX efl_ui_list_empty_item
|
||||
|
||||
#define MY_CLASS_NAME "Efl.Ui.List_Empty_Item"
|
||||
|
||||
EOLIAN static Efl_Object *
|
||||
_efl_ui_list_empty_item_efl_object_finalize(Eo *obj, void *pd EINA_UNUSED)
|
||||
{
|
||||
Eo *eo;
|
||||
eo = efl_finalize(efl_super(obj, MY_CLASS));
|
||||
ELM_WIDGET_DATA_GET_OR_RETURN(eo, wd, eo);
|
||||
Efl_Ui_Theme_Apply theme_apply = efl_ui_layout_object_theme_set(obj, "list_item", NULL, "empty");
|
||||
|
||||
if (theme_apply == EFL_UI_THEME_APPLY_FAILED)
|
||||
CRI("Empty Item(%p) failed to set theme [efl/list_item:empty]!", eo);
|
||||
return eo;
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_efl_ui_list_empty_item_efl_object_destructor(Eo *obj, void *pd EINA_UNUSED)
|
||||
{
|
||||
efl_destructor(efl_super(obj, MY_CLASS));
|
||||
}
|
||||
|
||||
/* Efl.Part */
|
||||
ELM_PART_CONTENT_DEFAULT_GET(efl_ui_list_empty_item, "efl.content")
|
||||
ELM_PART_CONTENT_DEFAULT_IMPLEMENT(efl_ui_list_empty_item, void)
|
||||
/* Efl.Part end */
|
||||
|
||||
EOLIAN static Efl_Object *
|
||||
_efl_ui_list_empty_item_efl_part_part(const Eo *obj, void *wd EINA_UNUSED, const char *part)
|
||||
{
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(part, NULL);
|
||||
if (eina_streq(part, "content"))
|
||||
return ELM_PART_IMPLEMENT(EFL_UI_LAYOUT_PART_CONTENT_CLASS, obj, "efl.content");
|
||||
|
||||
return efl_part(efl_super(obj, MY_CLASS), part);
|
||||
}
|
||||
|
||||
/* Internal EO APIs and hidden overrides */
|
||||
|
||||
#define EFL_UI_LIST_EMPTY_ITEM_EXTRA_OPS \
|
||||
ELM_PART_CONTENT_DEFAULT_OPS(efl_ui_list_empty_item)
|
||||
|
||||
#include "efl_ui_list_empty_item.eo.c"
|
|
@ -0,0 +1,16 @@
|
|||
|
||||
class Efl.Ui.List_Empty_Item (Efl.Ui.List_Item, Efl.Content)
|
||||
{
|
||||
[[List Empty Item class. This item have only one swallow space,
|
||||
thus user can decorate item by filling the swallow with
|
||||
any kind of container.]]
|
||||
data: null;
|
||||
implements {
|
||||
//Efl.Object
|
||||
Efl.Object.finalize;
|
||||
Efl.Object.destructor;
|
||||
Efl.Content.content { get; set; }
|
||||
Efl.Content.content_unset;
|
||||
Efl.Part.part;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,83 @@
|
|||
#ifdef HAVE_CONFIG_H
|
||||
# include "elementary_config.h"
|
||||
#endif
|
||||
|
||||
#define EFL_ACCESS_PROTECTED
|
||||
#define EFL_UI_WIDGET_PART_BG_PROTECTED
|
||||
|
||||
#include <Elementary.h>
|
||||
|
||||
#include "elm_priv.h"
|
||||
#include "efl_ui_list_item_private.h"
|
||||
|
||||
#define MY_CLASS EFL_UI_LIST_ITEM_CLASS
|
||||
#define MY_CLASS_PFX efl_ui_list_item
|
||||
|
||||
#define MY_CLASS_NAME "Efl.Ui.List_Item"
|
||||
|
||||
static void
|
||||
_sizing_eval(Evas_Object *obj, Efl_Ui_List_Item_Data *pd)
|
||||
{
|
||||
Evas_Coord minh = -1, minw = -1;
|
||||
Evas_Coord rest_w = 0, rest_h = 0;
|
||||
ELM_WIDGET_DATA_GET_OR_RETURN(pd->obj, wd);
|
||||
|
||||
edje_object_size_min_restricted_calc(wd->resize_obj, &minw, &minh,
|
||||
rest_w, rest_h);
|
||||
evas_object_size_hint_min_set(obj, minw, minh);
|
||||
|
||||
pd->needs_size_calc = EINA_FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
_efl_ui_list_item_elm_layout_sizing_eval(Eo *obj, Efl_Ui_List_Item_Data *pd)
|
||||
{
|
||||
if (pd->needs_size_calc) return;
|
||||
pd->needs_size_calc = EINA_TRUE;
|
||||
|
||||
efl_canvas_group_change(obj);
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_efl_ui_list_item_efl_canvas_group_group_calculate(Eo *obj, Efl_Ui_List_Item_Data *pd)
|
||||
{
|
||||
if (pd->needs_size_calc)
|
||||
{
|
||||
_sizing_eval(obj, pd);
|
||||
pd->needs_size_calc = EINA_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
EOLIAN static Eo *
|
||||
_efl_ui_list_item_efl_object_constructor(Eo *obj, Efl_Ui_List_Item_Data *pd)
|
||||
{
|
||||
pd->obj = obj;
|
||||
obj = efl_constructor(efl_super(obj, MY_CLASS));
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
EOLIAN static Efl_Object *
|
||||
_efl_ui_list_item_efl_object_finalize(Eo *obj, Efl_Ui_List_Item_Data *pd EINA_UNUSED)
|
||||
{
|
||||
Eo *eo;
|
||||
eo = efl_finalize(efl_super(obj, MY_CLASS));
|
||||
ELM_WIDGET_DATA_GET_OR_RETURN(eo, wd, eo);
|
||||
|
||||
return eo;
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_efl_ui_list_item_efl_object_destructor(Eo *obj, Efl_Ui_List_Item_Data *pd EINA_UNUSED)
|
||||
{
|
||||
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
|
||||
|
||||
efl_destructor(efl_super(obj, MY_CLASS));
|
||||
}
|
||||
|
||||
/* Internal EO APIs and hidden overrides */
|
||||
|
||||
#define EFL_UI_LIST_ITEM_EXTRA_OPS \
|
||||
ELM_LAYOUT_SIZING_EVAL_OPS(efl_ui_list_item)
|
||||
|
||||
#include "efl_ui_list_item.eo.c"
|
|
@ -0,0 +1,12 @@
|
|||
|
||||
abstract Efl.Ui.List_Item (Efl.Ui.Item)
|
||||
{
|
||||
implements {
|
||||
//Efl.Object
|
||||
Efl.Object.constructor;
|
||||
Efl.Object.finalize;
|
||||
Efl.Object.destructor;
|
||||
//Efl.Canvas
|
||||
Efl.Canvas.Group.group_calculate;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
#ifndef EFL_UI_LIST_ITEM_PRIVATE_H
|
||||
#define EFL_UI_LIST_ITEM_PRIVATE_H
|
||||
|
||||
#include "Elementary.h"
|
||||
|
||||
typedef struct _Efl_Ui_List_Item_Data
|
||||
{
|
||||
// Eo Objects
|
||||
Eo *obj; /* Self-Object */
|
||||
Eo *parent; /* Parent Widget */
|
||||
Eina_Bool needs_size_calc : 1; /* Flag for Size calculation */
|
||||
} Efl_Ui_List_Item_Data;
|
||||
|
||||
|
||||
#define EFL_UI_LIST_ITEM_DATA_GET(o, pd) \
|
||||
Efl_Ui_List_Item_Data * pd = efl_data_scope_safe_get(o, EFL_UI_LIST_ITEM_CLASS)
|
||||
|
||||
#define EFL_UI_LIST_ITEM_DATA_GET_OR_RETURN(o, ptr, ...) \
|
||||
EFL_UI_LIST_ITEM_DATA_GET(o, ptr); \
|
||||
if (EINA_UNLIKELY(!ptr)) \
|
||||
{ \
|
||||
ERR("No widget data for object %p (%s)", \
|
||||
o, evas_object_type_get(o)); \
|
||||
return __VA_ARGS__; \
|
||||
}
|
||||
|
||||
#define EFL_UI_LIST_ITEM_CHECK_OR_RETURN(obj, ...) \
|
||||
if (EINA_UNLIKELY(!efl_isa((obj), EFL_UI_LIST_ITEM_CLASS))) \
|
||||
return __VA_ARGS__;
|
||||
|
||||
#endif
|
|
@ -0,0 +1,63 @@
|
|||
#ifndef EFL_UI_LIST_PRIVATE_H
|
||||
#define EFL_UI_LIST_PRIVATE_H
|
||||
|
||||
#include "Elementary.h"
|
||||
|
||||
typedef struct _Efl_Ui_List_Data
|
||||
{
|
||||
// Eo Objects
|
||||
Eo *box; /* Internal box for Efl.Pack support */
|
||||
Eo *pan; /* Internal pan for scroll */
|
||||
Eo *smanager; /* Scroll Manager for support scroll with pan */
|
||||
|
||||
struct {
|
||||
Efl_Ui_List_Item *item; /* Scroll target item */
|
||||
double align; /* Item scroll aligned position.
|
||||
-1 is for default case of scroll in */
|
||||
Eina_Bool anim : 1; /* boolean data for animation on scroll */
|
||||
} scroll; /* Item scroll values for deferred operation */
|
||||
|
||||
Eina_List *items; /* All item list for internal maintaining */
|
||||
Eina_List *selected; /* Selected items list */
|
||||
Efl_Ui_List_Item *last_selected; /* latest selected item */
|
||||
|
||||
Efl_Ui_Select_Mode select_mode; /* Select mode for items
|
||||
with single or multiple seleciton */
|
||||
|
||||
// Boolean Data
|
||||
Eina_Bool freeze_want : 1; /* Flag for Scroll freezing */
|
||||
Eina_Bool match_content_w: 1; /* Flag for size matching on content width.
|
||||
it will disable horizontal scroll */
|
||||
Eina_Bool match_content_h: 1; /* Flag for size matching on content height.
|
||||
it will disable vertical scroll */
|
||||
Eina_Bool pan_resized : 1; /* Flag for pan resized.
|
||||
This value is used for checking scroll is
|
||||
calculated after initialized */
|
||||
} Efl_Ui_List_Data;
|
||||
|
||||
typedef struct _Item_Iterator
|
||||
{
|
||||
Eina_Iterator iterator;
|
||||
Eina_List *list;
|
||||
Eina_Iterator *real_iterator;
|
||||
Eo *object;
|
||||
} Item_Iterator;
|
||||
|
||||
|
||||
#define EFL_UI_LIST_DATA_GET(o, pd) \
|
||||
Efl_Ui_List_Data * pd = efl_data_scope_safe_get(o, EFL_UI_LIST_CLASS)
|
||||
|
||||
#define EFL_UI_LIST_DATA_GET_OR_RETURN(o, ptr, ...) \
|
||||
EFL_UI_LIST_DATA_GET(o, ptr); \
|
||||
if (EINA_UNLIKELY(!ptr)) \
|
||||
{ \
|
||||
ERR("No widget data for object %p (%s)", \
|
||||
o, evas_object_type_get(o)); \
|
||||
return __VA_ARGS__; \
|
||||
}
|
||||
|
||||
#define EFL_UI_LIST_CHECK(obj) \
|
||||
if (EINA_UNLIKELY(!efl_isa((obj), EFL_UI_LIST_CLASS))) \
|
||||
return
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue