Intruduce Efl.Ui.Panel (Create Efl Ui Widget from elm widget(elm_panel))

Summary: Create Efl Ui Widget from elm widget(elm_panel)

Test Plan: elementary_test -> efl_ui_panel

Reviewers: woohyun, Jaehyun_Cho, segfaultxavi

Reviewed By: Jaehyun_Cho, segfaultxavi

Subscribers: segfaultxavi, cedric, #reviewers, #committers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D7238
This commit is contained in:
Woochanlee 2018-12-20 11:32:28 +09:00 committed by Jaehyun Cho
parent 2e2c225093
commit d9a222ecf5
13 changed files with 2568 additions and 0 deletions

View File

@ -1026,6 +1026,7 @@ elementary/themes/edc/efl/grid.edc \
elementary/themes/edc/efl/navigation_bar.edc \
elementary/themes/edc/efl/navigation_layout.edc \
elementary/themes/edc/efl/tags.edc \
elementary/themes/edc/efl/panel.edc \
elementary/themes/edc/efl/nstate.edc \
elementary/themes/edc/efl/panes.edc \
elementary/themes/edc/efl/photocam.edc \

View File

@ -186,6 +186,7 @@ collections {
#include "edc/efl/video.edc"
#include "edc/efl/focus.edc"
#include "edc/efl/tags.edc"
#include "edc/efl/panel.edc"
#include "edc/efl/tooltip.edc"
#include "edc/efl/photocam.edc"
#include "edc/efl/progress.edc"

View File

@ -0,0 +1,831 @@
group { name: "efl/panel";
data {
item: "handler_size" "30";
}
parts {
part { name: "efl.content";
type: SWALLOW;
description { state: "default" 0.0;
}
}
}
}
group { name: "efl/panel/scrollable/left";
parts {
part { name: "efl.panel_area";
type: SWALLOW;
description { state: "default" 0.0;
rel2.relative: 0.0 1.0;
align: 0.0 0.5;
fixed: 1 1;
visible: 0;
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
}
}
part { name: "efl.event_area";
type: SWALLOW;
description { state: "default" 0.0;
rel1 {
relative: 1.0 0.0;
to: "efl.panel_area";
}
rel2 {
relative: 1.0 1.0;
to: "efl.panel_area";
}
align: 0.0 0.5;
fixed: 1 1;
visible: 0;
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
}
}
part { name: "access.outline";
type: RECT;
repeat_events: 1;
description { state: "default" 0.0;
rel1.to: "efl.panel_area";
rel2.to: "efl.panel_area";
color: 0 0 0 0;
}
}
part { name: "bg";
type: RECT;
description { state: "default" 0.0;
rel1.to: "efl.panel_area";
rel2.to: "efl.panel_area";
color: 64 64 64 255;
visible: 0;
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
}
}
part { name: "efl.content";
type: SWALLOW;
description { state: "default" 0.0;
rel1.to: "efl.panel_area";
rel2.to: "efl.panel_area";
visible: 0;
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
}
}
}
programs {
program { name: "active";
signal: "efl,state,content,visible";
source: "efl";
action: STATE_SET "visible" 0.0;
target: "efl.panel_area";
target: "efl.event_area";
target: "bg";
target: "efl.content";
}
program { name: "inactive";
signal: "efl,state,content,hidden";
source: "efl";
action: STATE_SET "default" 0.0;
target: "efl.panel_area";
target: "efl.event_area";
target: "bg";
target: "efl.content";
}
}
}
group { name: "efl/panel/scrollable/right";
parts {
part { name: "efl.event_area";
type: SWALLOW;
description { state: "default" 0.0;
rel2.relative: 0.0 1.0;
align: 0.0 0.5;
fixed: 1 1;
visible: 0;
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
}
}
part { name: "efl.panel_area";
type: SWALLOW;
description { state: "default" 0.0;
rel1 {
relative: 1.0 0.0;
to: "efl.event_area";
}
rel2 {
relative: 1.0 1.0;
to: "efl.event_area";
}
align: 0.0 0.5;
fixed: 1 1;
visible: 0;
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
}
}
part { name: "access.outline";
type: RECT;
repeat_events: 1;
description { state: "default" 0.0;
rel1.to: "efl.panel_area";
rel2.to: "efl.panel_area";
color: 0 0 0 0;
}
}
part { name: "bg";
type: RECT;
description { state: "default" 0.0;
rel1.to: "efl.panel_area";
rel2.to: "efl.panel_area";
color: 64 64 64 255;
visible: 0;
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
}
}
part { name: "efl.content";
type: SWALLOW;
description { state: "default" 0.0;
rel1.to: "efl.panel_area";
rel2.to: "efl.panel_area";
visible: 0;
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
}
}
}
programs {
program { name: "active";
signal: "efl,state,content,visible";
source: "efl";
action: STATE_SET "visible" 0.0;
target: "efl.panel_area";
target: "efl.event_area";
target: "bg";
target: "efl.content";
}
program { name: "inactive";
signal: "efl,state,content,hidden";
source: "efl";
action: STATE_SET "default" 0.0;
target: "efl.panel_area";
target: "efl.event_area";
target: "bg";
target: "efl.content";
}
}
}
group { name: "efl/panel/scrollable/top";
parts {
part { name: "efl.panel_area";
type: SWALLOW;
description { state: "default" 0.0;
rel2.relative: 1.0 0.0;
align: 0.5 0.0;
fixed: 1 1;
visible: 0;
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
}
}
part { name: "efl.event_area";
type: SWALLOW;
description { state: "default" 0.0;
rel1 {
relative: 0.0 1.0;
to: "efl.panel_area";
}
rel2 {
relative: 1.0 1.0;
to: "efl.panel_area";
}
align: 0.5 0.0;
fixed: 1 1;
visible: 0;
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
}
}
part { name: "access.outline";
type: RECT;
repeat_events: 1;
description { state: "default" 0.0;
rel1.to: "efl.panel_area";
rel2.to: "efl.panel_area";
color: 0 0 0 0;
}
}
part { name: "bg";
type: RECT;
description { state: "default" 0.0;
rel1.to: "efl.panel_area";
rel2.to: "efl.panel_area";
color: 64 64 64 255;
visible: 0;
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
}
}
part { name: "efl.content";
type: SWALLOW;
description { state: "default" 0.0;
rel1.to: "efl.panel_area";
rel2.to: "efl.panel_area";
visible: 0;
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
}
}
}
programs {
program { name: "active";
signal: "efl,state,content,visible";
source: "efl";
action: STATE_SET "visible" 0.0;
target: "efl.panel_area";
target: "efl.event_area";
target: "bg";
target: "efl.content";
}
program { name: "inactive";
signal: "efl,state,content,hidden";
source: "efl";
action: STATE_SET "default" 0.0;
target: "efl.panel_area";
target: "efl.event_area";
target: "bg";
target: "efl.content";
}
}
}
group { name: "efl/panel/scrollable/bottom";
parts {
part { name: "efl.event_area";
type: SWALLOW;
description { state: "default" 0.0;
rel2.relative: 1.0 0.0;
align: 0.5 0.0;
fixed: 1 1;
visible: 0;
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
}
}
part { name: "efl.panel_area";
type: SWALLOW;
description { state: "default" 0.0;
rel1 {
relative: 0.0 1.0;
to: "efl.event_area";
}
rel2 {
relative: 1.0 1.0;
to: "efl.event_area";
}
align: 0.5 0.0;
fixed: 1 1;
visible: 0;
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
}
}
part { name: "access.outline";
type: RECT;
repeat_events: 1;
description { state: "default" 0.0;
rel1.to: "efl.panel_area";
rel2.to: "efl.panel_area";
color: 0 0 0 0;
}
}
part { name: "bg";
type: RECT;
description { state: "default" 0.0;
rel1.to: "efl.panel_area";
rel2.to: "efl.panel_area";
color: 64 64 64 255;
visible: 0;
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
}
}
part { name: "efl.content";
type: SWALLOW;
description { state: "default" 0.0;
rel1.to: "efl.panel_area";
rel2.to: "efl.panel_area";
visible: 0;
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
}
}
}
programs {
program { name: "active";
signal: "efl,state,content,visible";
source: "efl";
action: STATE_SET "visible" 0.0;
target: "efl.panel_area";
target: "efl.event_area";
target: "bg";
target: "efl.content";
}
program { name: "inactive";
signal: "efl,state,content,hidden";
source: "efl";
action: STATE_SET "default" 0.0;
target: "efl.panel_area";
target: "efl.event_area";
target: "bg";
target: "efl.content";
}
}
}
group { name: "efl/panel/left";
images.image: "bevel_out.png" COMP;
images.image: "shine.png" COMP;
images.image: "shadow_square_tiny.png" COMP;
images.image: "holes_tiny_glow_vert.png" COMP;
images.image: "holes_tiny_glow_horiz.png" COMP;
images.image: "win_glow.png" COMP;
images.image: "icon_arrow_right.png" COMP;
images.image: "icon_arrow_left.png" COMP;
images.image: "icon_arrow_up.png" COMP;
images.image: "icon_arrow_down.png" COMP;
data.item: "focus_highlight" "on";
script {
public is_rtl = 0;
}
parts {
part { name: "shadow"; mouse_events: 0;
description { state: "default" 0.0;
rel1.offset: -3 -2;
rel1.to: "base";
rel2.offset: 2 4;
rel2.to: "base";
image.normal: "shadow_square_tiny.png";
image.border: 6 6 6 6;
fill.smooth: 0;
}
}
part { name: "glow"; mouse_events: 0;
description { state: "default" 0.0;
image.normal: "win_glow.png";
image.border: 9 9 9 9;
image.middle: 0;
rel1.offset: -5 -5;
rel1.to: "base";
rel2.offset: 4 4;
rel2.to: "base";
fill.smooth: 0;
color: 255 255 255 0;
visible: 0;
}
description { state: "focused" 0.0;
inherit: "default" 0.0;
color: 255 255 255 255;
visible: 1;
}
}
part { name: "all"; type: SPACER;
description { state: "default" 0.0;
}
}
part { name: "base"; type: RECT;
description { state: "default" 0.0;
rel1.to_x: "all";
rel2.to_x: "efl.swallow.event";
rel2.relative: 0.0 1.0;
rel2.offset: -4 -1;
color: 64 64 64 255;
}
}
part { name: "efl.content"; type: SWALLOW;
description { state: "default" 0.0;
rel1.offset: 4 4;
rel1.to: "base";
rel2.offset: -5 -5;
rel2.to: "base";
}
}
part { name: "bevel"; mouse_events: 0;
description { state: "default" 0.0;
rel1.to: "base";
rel2.to: "base";
image.normal: "bevel_out.png";
image.border: 1 1 1 1;
image.middle: 0;
fill.smooth: 0;
}
}
part { name: "shine"; mouse_events: 0;
description { state: "default" 0.0;
image.normal: "shine.png";
rel1.offset: 0 -2;
rel1.to: "base";
rel2.relative: 1.0 0.0;
rel2.offset: -1 2;
rel2.to: "base";
FIXED_SIZE(69, 5)
}
}
part { name: "efl.swallow.event"; type: SWALLOW;
description { state: "default" 0.0;
fixed: 1 1;
min: 20 20;
max: 20 20;
align: 1.0 0.5;
rel1.relative: 1.0 0.0;
rel2.relative: 1.0 1.0;
color: 0 0 0 0;
}
description { state: "hidden" 0.0;
inherit: "default" 0.0;
align: 0.0 0.5;
rel1.relative: 0.0 0.0;
rel2.relative: 0.0 1.0;
}
}
part { name: "btn"; type: RECT;
description { state: "default" 0.0;
rel1.to: "efl.swallow.event";
rel2.to: "efl.swallow.event";
color: 0 0 0 0;
}
description { state: "hidden" 0.0;
rel1.to: "efl.swallow.event";
rel2.to: "efl.swallow.event";
}
}
part { name: "dots"; mouse_events: 0;
description { state: "default" 0.0;
rel1.to: "icn";
rel2.to: "icn";
align: 0.0 0.5;
image.normal: "holes_tiny_glow_vert.png";
FIXED_SIZE(11, 17)
}
}
part { name: "icn"; mouse_events: 0;
scale: 1;
description { state: "default" 0.0;
fixed: 1 1;
min: 20 20;
max: 20 20;
rel1.to: "btn";
rel2.to: "btn";
image.normal: "icon_arrow_left.png";
}
description { state: "hidden" 0.0;
inherit: "default" 0.0;
image.normal: "icon_arrow_right.png";
}
}
}
programs {
program {
signal: "mouse,clicked,1"; source: "btn";
action: SIGNAL_EMIT "efl,action,panel,toggle" "efl";
}
program {
signal: "efl,action,show"; source: "efl";
action: STATE_SET "default" 0.0;
transition: DECELERATE 0.3;
target: "efl.swallow.event";
target: "base";
}
program {
signal: "efl,action,show"; source: "efl";
script {
if (get_int(is_rtl) == 0)
set_state(PART:"icn", "default", 0.0);
else
set_state(PART:"icn", "hidden", 0.0);
}
}
program {
signal: "edje,state,rtl";
source: "edje";
script {
new st[31];
new Float:vl;
get_state(PART:"efl.swallow.event", st, 30, vl);
if (!strcmp(st, "default"))
set_state(PART:"icn", "hidden", 0.0);
else
set_state(PART:"icn", "default", 0.0);
set_int(is_rtl, 1);
}
}
program {
signal: "edje,state,ltr";
source: "edje";
script {
new st[31];
new Float:vl;
get_state(PART:"efl.swallow.event", st, 30, vl);
if (!strcmp(st, "default"))
set_state(PART:"icn", "default", 0.0);
else
set_state(PART:"icn", "hidden", 0.0);
set_int(is_rtl, 0);
}
}
program {
signal: "efl,action,hide"; source: "efl";
action: STATE_SET "hidden" 0.0;
transition: ACCELERATE 0.3;
target: "efl.swallow.event";
}
program {
signal: "efl,action,hide"; source: "efl";
script {
if (get_int(is_rtl) == 0)
set_state(PART:"icn", "hidden", 0.0);
else
set_state(PART:"icn", "default", 0.0);
}
}
program { name: "hide1";
signal: "efl,action,hide"; source: "efl";
script {
new x, y, w, h;
if (get_int(is_rtl) == 0)
{
custom_state(PART:"base", "default", 0.0);
set_state_val(PART:"base", STATE_REL1, -1.0, 0.0);
get_geometry(PART:"efl.swallow.event", x, y, w, h);
set_state_val(PART:"base", STATE_REL1_OFFSET, w, 0);
}
else
{
custom_state(PART:"base", "default", 0.0);
set_state_val(PART:"base", STATE_REL1, -1.0, 0.0);
set_state_val(PART:"base", STATE_REL2, -2.0, 1.0);
get_geometry(PART:"efl.swallow.event", x, y, w, h);
set_state_val(PART:"base", STATE_REL2_OFFSET, -w, 0);
}
}
after: "hide2";
}
program { name: "hide2";
action: STATE_SET "custom" 0.0;
transition: ACCELERATE 0.3;
target: "base";
}
program {
signal: "efl,action,focus_highlight,show"; source: "efl";
action: STATE_SET "focused" 0.0;
transition: ACCELERATE 0.2;
target: "glow";
}
program {
signal: "efl,action,focus_highlight,hide"; source: "efl";
action: STATE_SET "default" 0.0;
transition: DECELERATE 0.5;
target: "glow";
}
}
}
group { name: "efl/panel/right";
inherit: "efl/panel/left";
parts {
part { name: "base";
description { state: "default" 0.0;
rel1.relative: 1.0 0.0;
rel1.to_x: "efl.swallow.event";
rel1.offset: 3 0;
rel2.relative: 1.0 1.0;
rel2.to_x: "all";
rel2.offset: -1 -1;
}
}
part { name: "efl.swallow.event";
description { state: "default" 0.0;
align: 0.0 0.5;
rel1.relative: 0.0 0.0;
rel2.relative: 0.0 1.0;
}
description { state: "hidden" 0.0;
align: 1.0 0.5;
rel1.relative: 1.0 0.0;
rel2.relative: 1.0 1.0;
}
}
part { name: "dots";
description { state: "default" 0.0;
align: 1.0 0.5;
}
}
part { name: "icn";
description { state: "default" 0.0;
image.normal: "icon_arrow_right.png";
}
description { state: "hidden" 0.0;
image.normal: "icon_arrow_left.png";
}
}
}
programs {
program { name: "hide1";
script {
new x, y, w, h;
custom_state(PART:"base", "default", 0.0);
set_state_val(PART:"base", STATE_REL1, 1.0, 0.0);
set_state_val(PART:"base", STATE_REL2, 2.0, 1.0);
get_geometry(PART:"efl.swallow.event", x, y, w, h);
set_state_val(PART:"base", STATE_REL2_OFFSET, -w, 0);
}
}
}
}
group { name: "efl/panel/top";
inherit: "efl/panel/left";
parts {
part { name: "base";
description { state: "default" 0.0;
rel1.relative: 0.0 0.0;
rel1.to_x: "all";
rel1.to_y: "all";
rel1.offset: 0 0;
rel2.relative: 1.0 0.0;
rel2.to_x: "all";
rel2.to_y: "efl.swallow.event";
rel2.offset: -1 -4;
}
}
part { name: "efl.swallow.event";
description { state: "default" 0.0;
align: 0.5 1.0;
rel1.relative: 0.0 1.0;
rel2.relative: 1.0 1.0;
}
description { state: "hidden" 0.0;
align: 0.5 0.0;
rel1.relative: 0.0 0.0;
rel2.relative: 1.0 0.0;
}
}
part { name: "dots";
description { state: "default" 0.0;
align: 0.5 0.0;
image.normal: "holes_tiny_glow_horiz.png";
FIXED_SIZE(17, 11)
}
}
part { name: "icn";
description { state: "default" 0.0;
image.normal: "icon_arrow_up.png";
}
description { state: "hidden" 0.0;
image.normal: "icon_arrow_down.png";
}
}
}
programs {
program { name: "hide1";
script {
new x, y, w, h;
custom_state(PART:"base", "default", 0.0);
set_state_val(PART:"base", STATE_REL1, 0.0, -1.0);
set_state_val(PART:"base", STATE_REL2, 1.0, 0.0);
get_geometry(PART:"efl.swallow.event", x, y, w, h);
set_state_val(PART:"base", STATE_REL1_OFFSET, 0, h);
}
}
program {
signal: "efl,action,show"; source: "efl";
action: STATE_SET "default" 0.0;
target: "icn";
}
program {
signal: "edje,state,rtl";
source: "edje";
script {
new st[31];
new Float:vl;
get_state(PART:"efl.swallow.event", st, 30, vl);
if (!strcmp(st, "default"))
set_state(PART:"icn", "default", 0.0);
else
set_state(PART:"icn", "hidden", 0.0);
}
}
program {
signal: "edje,state,ltr";
source: "edje";
script {
new st[31];
new Float:vl;
get_state(PART:"efl.swallow.event", st, 30, vl);
if (!strcmp(st, "default"))
set_state(PART:"icn", "default", 0.0);
else
set_state(PART:"icn", "hidden", 0.0);
}
}
program {
signal: "efl,action,hide"; source: "efl";
action: STATE_SET "hidden" 0.0;
target: "icn";
}
}
}
group { name: "efl/panel/bottom";
inherit: "efl/panel/top";
parts {
part { name: "base";
description { state: "default" 0.0;
rel1.relative: 0.0 1.0;
rel1.to_x: "all";
rel1.to_y: "efl.swallow.event";
rel1.offset: 0 3;
rel2.relative: 1.0 1.0;
rel2.to_x: "all";
rel2.to_y: "all";
rel2.offset: -1 -1;
}
}
part { name: "efl.swallow.event";
description { state: "default" 0.0;
align: 0.5 0.0;
rel1.relative: 0.0 0.0;
rel2.relative: 1.0 0.0;
}
description { state: "hidden" 0.0;
align: 0.5 1.0;
rel1.relative: 0.0 1.0;
rel2.relative: 1.0 1.0;
}
}
part { name: "dots";
description { state: "default" 0.0;
align: 0.5 0.0;
image.normal: "holes_tiny_glow_horiz.png";
FIXED_SIZE(17, 11)
}
}
part { name: "icn";
description { state: "default" 0.0;
image.normal: "icon_arrow_down.png";
}
description { state: "hidden" 0.0;
image.normal: "icon_arrow_up.png";
}
}
}
programs {
program { name: "hide1";
script {
new x, y, w, h;
custom_state(PART:"base", "default", 0.0);
set_state_val(PART:"base", STATE_REL1, 0.0, 1.0);
set_state_val(PART:"base", STATE_REL2, 1.0, 2.0);
get_geometry(PART:"efl.swallow.event", x, y, w, h);
set_state_val(PART:"base", STATE_REL2_OFFSET, 0, -h);
}
}
}
}

View File

@ -29,6 +29,7 @@ elm_public_eolian_files = \
lib/elementary/efl_ui_datepicker.eo \
lib/elementary/efl_ui_timepicker.eo \
lib/elementary/efl_ui_tags.eo \
lib/elementary/efl_ui_panel.eo \
lib/elementary/efl_ui_video.eo \
lib/elementary/efl_ui_win.eo \
lib/elementary/efl_ui_win_inlined.eo \
@ -414,6 +415,7 @@ includesunstable_HEADERS = \
lib/elementary/efl_ui_datepicker_private.h \
lib/elementary/efl_ui_timepicker_private.h \
lib/elementary/efl_ui_tags_private.h \
lib/elementary/efl_ui_panel_private.h \
lib/elementary/elm_widget_table.h \
lib/elementary/elm_widget_thumb.h \
lib/elementary/elm_widget_toolbar.h \
@ -787,6 +789,7 @@ lib_elementary_libelementary_la_SOURCES = \
lib/elementary/efl_ui_datepicker.c \
lib/elementary/efl_ui_timepicker.c \
lib/elementary/efl_ui_tags.c \
lib/elementary/efl_ui_panel.c \
lib/elementary/elm_slideshow.c \
lib/elementary/elm_spinner.c \
lib/elementary/elm_store.c \
@ -1064,6 +1067,7 @@ bin/elementary/test_ui_spin_button.c \
bin/elementary/test_ui_datepicker.c \
bin/elementary/test_ui_timepicker.c \
bin/elementary/test_ui_tags.c \
bin/elementary/test_ui_panel.c \
bin/elementary/test_slideshow.c \
bin/elementary/test_spinner.c \
bin/elementary/test_store.c \

View File

@ -136,6 +136,7 @@ test_ui_buttonspin.c \
test_ui_datepicker.c \
test_ui_timepicker.c \
test_ui_tags.c \
test_ui_panel.c \
test_store.c \
test_sys_notify.c \
test_systray.c \

View File

@ -98,6 +98,7 @@ elementary_test_src = [
'test_panel.c',
'test_panes.c',
'test_ui_panes.c',
'test_ui_panel.c',
'test_part_bg.c',
'test_part_shadow.c',
'test_photo.c',

View File

@ -189,6 +189,8 @@ void test_ui_spin_button(void *data, Evas_Object *obj, void *event_info);
void test_ui_datepicker(void *data, Evas_Object *obj, void *event_info);
void test_ui_timepicker(void *data, Evas_Object *obj, void *event_info);
void test_ui_tags(void *data, Evas_Object *obj, void *event_info);
void test_ui_panel(void *data, Evas_Object *obj, void *event_info);
void test_ui_panel2(void *data, Evas_Object *obj, void *event_info);
void test_index(void *data, Evas_Object *obj, void *event_info);
void test_index2(void *data, Evas_Object *obj, void *event_info);
void test_index3(void *data, Evas_Object *obj, void *event_info);
@ -1165,6 +1167,8 @@ add_tests:
ADD_TEST(NULL, "Dividers", "Panel Scrollable", test_panel2);
ADD_TEST(NULL, "Dividers", "Panes", test_panes);
ADD_TEST_EO(NULL, "Dividers", "Efl.Ui.Panes", test_panes_minsize);
ADD_TEST_EO(NULL, "Dividers", "Efl.Ui.Panel", test_ui_panel);
ADD_TEST_EO(NULL, "Dividers", "Efl.Ui.Panel Scrollable", test_ui_panel2);
//------------------------------//
ADD_TEST(NULL, "Standardization", "Conformant", test_conformant);

View File

@ -0,0 +1,159 @@
#ifdef HAVE_CONFIG_H
# include "elementary_config.h"
#endif
#include <Elementary.h>
void
test_ui_panel(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
char buf[PATH_MAX] = {0};
Eo *win, *table, *panel;
win = efl_add_ref(EFL_UI_WIN_CLASS, NULL,
efl_ui_win_type_set(efl_added, EFL_UI_WIN_BASIC),
efl_text_set(efl_added, "Efl.Ui.Panel"),
efl_ui_win_autodel_set(efl_added, EINA_TRUE));
table = efl_add(EFL_UI_TABLE_CLASS, win,
efl_content_set(win, efl_added));
snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get());
efl_add(EFL_UI_IMAGE_CLASS, table,
efl_file_set(efl_added, buf, NULL),
efl_gfx_size_hint_weight_set(efl_added, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND),
efl_gfx_size_hint_align_set(efl_added, EVAS_HINT_FILL, EVAS_HINT_FILL),
efl_pack_table(table, efl_added, 0, 0, 4, 5));
// Top Panel
panel = efl_add(EFL_UI_PANEL_CLASS, table,
efl_ui_panel_orient_set(efl_added, EFL_UI_PANEL_ORIENT_TOP),
efl_pack_table(table, efl_added, 0, 0, 4, 1));
efl_add(EFL_UI_BUTTON_CLASS, panel,
efl_text_set(efl_added, "Top Panel"),
efl_content_set(panel, efl_added));
// Left Panel
panel = efl_add(EFL_UI_PANEL_CLASS, table,
efl_ui_panel_orient_set(efl_added, EFL_UI_PANEL_ORIENT_LEFT),
efl_pack_table(table, efl_added, 0, 2, 2, 1));
efl_add(EFL_UI_BUTTON_CLASS, panel,
efl_text_set(efl_added, "Left Panel"),
efl_content_set(panel, efl_added));
// Right Panel
panel = efl_add(EFL_UI_PANEL_CLASS, table,
efl_ui_panel_orient_set(efl_added, EFL_UI_PANEL_ORIENT_RIGHT),
efl_pack_table(table, efl_added, 2, 2, 2, 1));
efl_add(EFL_UI_BUTTON_CLASS, panel,
efl_text_set(efl_added, "Right Panel"),
efl_content_set(panel, efl_added));
// Bottom Panel
panel = efl_add(EFL_UI_PANEL_CLASS, table,
efl_ui_panel_orient_set(efl_added, EFL_UI_PANEL_ORIENT_BOTTOM),
efl_pack_table(table, efl_added, 0, 4, 4, 1));
efl_add(EFL_UI_BUTTON_CLASS, panel,
efl_text_set(efl_added, "Bottom Panel"),
efl_content_set(panel, efl_added));
efl_gfx_entity_size_set(win, EINA_SIZE2D(280, 320));
}
static void
_check_changed(void *data EINA_UNUSED, const Efl_Event *ev)
{
elm_config_scroll_thumbscroll_enabled_set(efl_ui_nstate_value_get(ev->object));
}
static void
_panel_toggled(void *data, const Efl_Event *ev)
{
Evas_Object *list;
int i;
if (!efl_ui_nstate_value_get(data)) return;
list = efl_content_get(ev->object);
evas_object_del(list);
list = elm_list_add(ev->object);
evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
for (i = 0; i < 7; i++)
elm_list_item_append(list, "panel list item", NULL, NULL, NULL, NULL);
efl_content_set(ev->object, list);
printf("Panel toggled:%s\n", efl_ui_panel_hidden_get(ev->object) ? "hidden" : "visible");
}
static void
_btn_clicked(void *data, const Efl_Event *ev EINA_UNUSED)
{
Eo *panel = data;
efl_ui_panel_toggle(panel);
}
void
test_ui_panel2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
int i;
Eo *win, *box, *check, *btn, *table, *list, *panel;
win = efl_add_ref(EFL_UI_WIN_CLASS, NULL,
efl_ui_win_type_set(efl_added, EFL_UI_WIN_BASIC),
efl_text_set(efl_added, "Efl.Ui.Panel"),
efl_ui_win_autodel_set(efl_added, EINA_TRUE));
box = efl_add(EFL_UI_BOX_CLASS, win,
efl_content_set(win, efl_added));
efl_add(EFL_UI_CHECK_CLASS, box,
efl_ui_check_selected_set(efl_added, elm_config_scroll_thumbscroll_enabled_get()),
efl_text_set(efl_added, "Enable thumb scroll (temporarily"),
efl_event_callback_add(efl_added, EFL_UI_NSTATE_EVENT_CHANGED, _check_changed, NULL),
efl_gfx_size_hint_weight_set(efl_added, EVAS_HINT_EXPAND, 0),
efl_pack(box, efl_added));
check = efl_add(EFL_UI_CHECK_CLASS, box,
efl_text_set(efl_added, "Reset content on toggle"),
efl_gfx_size_hint_weight_set(efl_added, EVAS_HINT_EXPAND, 0),
efl_pack(box, efl_added));
btn = efl_add(EFL_UI_BUTTON_CLASS, box,
efl_text_set(efl_added, "toggle"),
efl_gfx_size_hint_weight_set(efl_added, EVAS_HINT_EXPAND, 0),
efl_pack(box, efl_added));
table = efl_add(EFL_UI_TABLE_CLASS, box,
efl_pack(box, efl_added));
list = elm_list_add(table);
evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_show(list);
for (i = 0; i < 20; i++)
elm_list_item_append(list, "center list item", NULL, NULL, NULL, NULL);
efl_pack_table(table, list, 0, 0, 1, 1);
panel = efl_add(EFL_UI_PANEL_CLASS, table,
efl_ui_panel_orient_set(efl_added, EFL_UI_PANEL_ORIENT_LEFT),
efl_ui_panel_scrollable_set(efl_added, EINA_TRUE),
efl_ui_panel_hidden_set(efl_added, EINA_TRUE),
efl_ui_panel_scrollable_content_size_set(efl_added, 0.75),
efl_pack_table(table, efl_added, 0, 0, 1, 1));
list = elm_list_add(panel);
evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
for (i = 0; i < 7; i++)
elm_list_item_append(list, "left panel item", NULL, NULL, NULL, NULL);
efl_content_set(panel, list);
efl_event_callback_add(panel, EFL_UI_PANEL_EVENT_TOGGLED, _panel_toggled, check);
efl_event_callback_add(btn, EFL_UI_EVENT_CLICKED, _btn_clicked, panel);
efl_gfx_entity_size_set(win, EINA_SIZE2D(320, 400));
}

View File

@ -323,6 +323,7 @@ typedef Eo Efl_Ui_Focus_Manager;
# include <efl_ui_datepicker.eo.h>
# include <efl_ui_timepicker.eo.h>
# include <efl_ui_tags.eo.h>
# include <efl_ui_panel.eo.h>
# include <efl_ui_image_factory.eo.h>
# include <efl_ui_slider.eo.h>
# include <efl_ui_slider_interval.eo.h>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,95 @@
enum Efl.Ui.Panel_Orient
{
[[Panel orientation mode]]
top, [[Panel (dis)appears from the top]]
bottom, [[Panel (dis)appears from the bottom]]
left, [[Panel (dis)appears from the left]]
right [[Panel (dis)appears from the right]]
}
struct Efl.Ui.Panel_Scroll_Info
{
[[Panel scroll information]]
rel_x: double; [[content scrolled position (0.0 ~ 1.0) in the panel]]
rel_y: double; [[content scrolled position (0.0 ~ 1.0) in the panel]]
}
class Efl.Ui.Panel (Efl.Ui.Layout, Efl.Ui.Focus.Layer, Elm.Interface_Scrollable, Efl.Content,
Efl.Access.Widget.Action)
{
[[Elementary panel class]]
methods {
@property orient {
set {
[[Sets the orientation of the panel
Sets from where the panel will (dis)appear.
]]
}
get {
[[Gets the orientation of the panel.]]
}
values {
orient: Efl.Ui.Panel_Orient; [[The panel orientation.]]
}
}
@property hidden {
set {
[[Sets the state of the panel.]]
}
get {
[[Gets the state of the panel.]]
}
values {
hidden: bool; [[If $true, the panel will run the animation to disappear.]]
}
}
@property scrollable {
set {
[[Sets the scrollability of the panel.]]
}
get {
[[Gets the state of the scrollability.
]]
}
values {
scrollable: bool; [[The scrollable state.]]
}
}
@property scrollable_content_size {
set {
[[Sets the size of the scrollable panel.]]
}
get {
[[Gets the size of the scrollable panel.
]]
}
values {
ratio: double; [[Size ratio]]
}
}
toggle {
[[Toggle the hidden state of the panel from code]]
}
}
implements {
Efl.Object.constructor;
Efl.Object.destructor;
Efl.Gfx.Entity.position { set; }
Efl.Gfx.Entity.size { set; }
Efl.Canvas.Group.group_member_add;
Efl.Ui.Widget.theme_apply;
Efl.Ui.Widget.on_disabled_update;
Efl.Ui.Widget.on_access_update;
Efl.Ui.Widget.widget_event;
Efl.Ui.Widget.interest_region { get; }
Efl.Access.Widget.Action.elm_actions { get; }
Efl.Ui.Base.mirrored { set; }
Efl.Content.content { get; set; }
Efl.Content.content_unset;
}
events {
toggled: void; [[Called when the hidden state was toggled]]
}
}

View File

@ -0,0 +1,81 @@
#ifndef EFL_UI_PANEL_H
#define EFL_UI_PANEL_H
#include "elm_interface_scrollable.h"
#include "elm_widget_layout.h"
#include "efl_ui_panel.eo.h"
/* DO NOT USE THIS HEADER UNLESS YOU ARE PREPARED FOR BREAKING OF YOUR
* CODE. THIS IS ELEMENTARY'S INTERNAL WIDGET API (for now) AND IS NOT
* FINAL. CALL elm_widget_api_check(EFL_UI_INTERNAL_API_VERSION) TO CHECK
* IT AT RUNTIME.
*/
/**
* @addtogroup Widget
* @{
*
* @section elm-panel-class The Elementary Panel Class
*
* Elementary, besides having the @ref Panel widget, exposes its
* foundation -- the Elementary Panel Class -- in order to create other
* widgets which are a panel with some more logic on top.
*/
/**
* Base layout smart data extended with panel instance data.
*/
typedef struct _Efl_Ui_Panel_Data Efl_Ui_Panel_Data;
struct _Efl_Ui_Panel_Data
{
Evas_Object *bx, *content;
Evas_Object *event;
Evas_Object *scr_ly;
Evas_Object *hit_rect, *panel_edje, *scr_edje;
Evas_Object *scr_panel, *scr_event;
Efl_Ui_Panel_Orient orient;
double content_size_ratio;
Evas_Coord down_x, down_y;
Evas_Coord handler_size;
Ecore_Timer *timer;
Eina_Bool hidden : 1;
Eina_Bool delete_me : 1;
Eina_Bool scrollable : 1;
Eina_Bool freeze: 1;
Eina_Bool callback_added: 1;
};
/**
* @}
*/
#define EFL_UI_PANEL_DATA_GET(o, sd) \
Efl_Ui_Panel_Data * sd = efl_data_scope_get(o, EFL_UI_PANEL_CLASS)
#define EFL_UI_PANEL_DATA_GET_OR_RETURN(o, ptr) \
EFL_UI_PANEL_DATA_GET(o, ptr); \
if (EINA_UNLIKELY(!ptr)) \
{ \
ERR("No widget data for object %p (%s)", \
o, evas_object_type_get(o)); \
return; \
}
#define EFL_UI_PANEL_DATA_GET_OR_RETURN_VAL(o, ptr, val) \
EFL_UI_PANEL_DATA_GET(o, ptr); \
if (EINA_UNLIKELY(!ptr)) \
{ \
ERR("No widget data for object %p (%s)", \
o, evas_object_type_get(o)); \
return val; \
}
#define EFL_UI_PANEL_CHECK(obj) \
if (EINA_UNLIKELY(!efl_isa((obj), EFL_UI_PANEL_CLASS))) \
return
#endif

View File

@ -154,6 +154,7 @@ pub_eo_files = [
'efl_ui_slider_interval.eo',
'efl_ui_spin.eo',
'efl_ui_spin_button.eo',
'efl_ui_panel.eo',
'efl_ui_datepicker.eo',
'efl_ui_timepicker.eo',
'efl_ui_tags.eo',
@ -437,6 +438,7 @@ elementary_headers_unstable = [
'elm_widget_spinner.h',
'efl_ui_spin_private.h',
'efl_ui_spin_button_private.h',
'efl_ui_panel_private.h',
'efl_ui_datepicker_private.h',
'efl_ui_timepicker_private.h',
'efl_ui_tags_private.h',
@ -806,6 +808,7 @@ elementary_src = [
'efl_ui_slider_interval.c',
'efl_ui_spin.c',
'efl_ui_spin_button.c',
'efl_ui_panel.c',
'efl_ui_datepicker.c',
'efl_ui_timepicker.c',
'efl_ui_tags.c',