Elementary Flippicker, a fresh new widget.

This is one more widget whose idea come from Samsung set of
contributions to Elementary.

There is a known bug involving embryo + string functions, which will,
if in "stress", appear at the labels of the widget. Not time to attack
it right now, though.



SVN revision: 53109
This commit is contained in:
Gustavo Lima Chaves 2010-10-06 18:40:04 +00:00
parent 4cc43413ae
commit a3ba92f0dc
10 changed files with 1726 additions and 2 deletions

View File

@ -57,6 +57,8 @@ flip_base_shad.png \
flip_pmb.png \
flip_pmt.png \
flip_shad.png \
flip_t.png \
flip_b.png \
head.png \
sb_runnerh.png \
sb_runnerv.png \

View File

@ -8505,7 +8505,7 @@ collections {
rel1.to: "size";
rel2.to: "size";
rel1.relative: -0.06 -0.06;
rel2.relative: 1.07 1.07;
rel2.relative: 1.07 1.07;
image.normal: "shadow.png";
}
}
@ -27367,3 +27367,496 @@ collections {
}
}
}
///////////////////////////////////////////////////////////////////////////////
#define FLIP_PICKER_MAX_LEN (50)
#define FLIP_PICKER_MAX_LEN_STR "50"
group { name: "elm/flippicker/base/default";
images {
image: "flip_base.png" COMP;
image: "flip_base_shad.png" COMP;
image: "flip_shad.png" COMP;
image: "arrow_up.png" COMP;
image: "arrow_down.png" COMP;
image: "flip_t.png" COMP;
image: "flip_b.png" COMP;
}
data {
item: "max_len" FLIP_PICKER_MAX_LEN_STR;
}
//FIXME: quick successive clicks on, say, up, lead to nastiness
script {
public cur, prev, next, lock;
public animator_bottom_down(val, Float:pos) {
new tmp[FLIP_PICKER_MAX_LEN];
set_tween_state(PART:"bottom", pos, "shrink", 0.0, "default", 0.0);
set_tween_state(PART:"bottom_sheet", pos, "shrink", 0.0, "default",
0.0);
set_tween_state(PART:"shadow", pos, "half", 0.0, "full",
0.0);
if (pos >= 1.0) {
set_state(PART:"shadow", "default", 0.0);
set_int(lock, 0);
fetch_str(next, 0, tmp, FLIP_PICKER_MAX_LEN);
if (strncmp(tmp, "", FLIP_PICKER_MAX_LEN) != 0) {
replace_str(next, 0, "");
message(MSG_STRING, 1, tmp);
}
}
}
public animator_top_down(val, Float:pos) {
set_tween_state(PART:"top", pos, "default", 0.0, "shrink", 0.0);
set_tween_state(PART:"top_sheet", pos, "default", 0.0, "shrink",
0.0);
set_tween_state(PART:"shadow", pos, "default", 0.0, "half",
0.0);
if (pos >= 1.0)
anim(0.2, "animator_bottom_down", val);
}
public animator_bottom_up(val, Float:pos) {
set_tween_state(PART:"bottom", pos, "default", 0.0, "shrink", 0.0);
set_tween_state(PART:"bottom_sheet", pos, "default", 0.0, "shrink",
0.0);
set_tween_state(PART:"shadow", pos, "full", 0.0, "half",
0.0);
if (pos >= 1.0)
anim(0.2, "animator_top_up", val);
}
public animator_top_up(val, Float:pos) {
new tmp[FLIP_PICKER_MAX_LEN];
set_tween_state(PART:"top", pos, "shrink", 0.0, "default", 0.0);
set_tween_state(PART:"top_sheet", pos, "shrink", 0.0, "default",
0.0);
set_tween_state(PART:"shadow", pos, "half", 0.0, "default",
0.0);
if (pos >= 1.0) {
set_state(PART:"shadow", "default", 0.0);
set_int(lock, 0);
fetch_str(next, 0, tmp, FLIP_PICKER_MAX_LEN);
if (strncmp(tmp, "", FLIP_PICKER_MAX_LEN) != 0) {
replace_str(next, 0, "");
message(MSG_STRING, 2, tmp);
}
}
}
public message(Msg_Type:type, id, ...) {
/* flip down */
if ((type == MSG_STRING) && (id == 1)) {
new value[FLIP_PICKER_MAX_LEN], tmp[FLIP_PICKER_MAX_LEN];
snprintf(value, FLIP_PICKER_MAX_LEN, "%s", getarg(2));
if (get_int(lock) == 1) {
replace_str(next, 0, value);
return;
}
fetch_str(cur, 0, tmp, FLIP_PICKER_MAX_LEN);
set_text(PART:"bottom_b", tmp);
set_state(PART:"top", "shrink", 0.0);
set_text(PART:"top", tmp);
set_state(PART:"top", "default", 0.0);
set_text(PART:"top", tmp);
replace_str(prev, 0, tmp);
set_state(PART:"bottom", "default", 0.0);
set_text(PART:"bottom", value);
set_state(PART:"bottom", "shrink", 0.0);
set_text(PART:"bottom", value);
set_text(PART:"top_b", value);
replace_str(cur, 0, value);
set_state(PART:"bottom_sheet", "shrink", 0.0);
set_state(PART:"top_sheet", "default", 0.0);
set_int(lock, 1);
set_state(PART:"shadow", "default", 0.0);
anim(0.2, "animator_top_down", 1);
}
/* flip up */
if ((type == MSG_STRING) && (id == 2)) {
new value[FLIP_PICKER_MAX_LEN], tmp[FLIP_PICKER_MAX_LEN];
snprintf(value, FLIP_PICKER_MAX_LEN, "%s", getarg(2));
if (get_int(lock) == 1) {
replace_str(next, 0, value);
return;
}
fetch_str(cur, 0, tmp, FLIP_PICKER_MAX_LEN);
set_text(PART:"top_b", tmp);
set_state(PART:"bottom", "shrink", 0.0);
set_text(PART:"bottom", tmp);
set_state(PART:"bottom", "default", 0.0);
set_text(PART:"bottom", tmp);
replace_str(prev, 0, tmp);
set_state(PART:"top", "default", 0.0);
set_text(PART:"top", value);
set_state(PART:"top", "shrink", 0.0);
set_text(PART:"top", value);
set_text(PART:"bottom_b", value);
replace_str(cur, 0, value);
set_state(PART:"bottom_sheet", "default", 0.0);
set_state(PART:"top_sheet", "shrink", 0.0);
set_int(lock, 1);
set_state(PART:"shadow", "full", 0.0);
anim(0.2, "animator_bottom_up", 1);
}
}
}
parts {
part { name: "shad";
mouse_events: 0;
description { state: "default" 0.0;
rel1.offset: -4 -4;
rel1.to: "base";
rel2.offset: 3 3;
rel2.to: "base";
image {
normal: "flip_base_shad.png";
border: 8 8 8 8;
}
}
}
part { name: "base";
scale: 1;
description { state: "default" 0.0;
rel1.offset: 4 4;
rel2.offset: -5 -5;
min: 24 48;
image.normal: "flip_base.png";
}
}
part { name: "b";
type: RECT;
mouse_events: 1;
description { state: "default" 0.0;
rel1.to: "base";
rel1.relative: 0.0 0.5;
rel2.to: "base";
color: 0 0 0 0;
}
description { state: "hidden" 0.0;
inherit: "default" 0.0;
visible: 0;
}
}
part { name: "t";
type: RECT;
mouse_events: 1;
description { state: "default" 0.0;
rel1.to: "base";
rel2.to: "base";
rel2.relative: 1.0 0.5;
color: 0 0 0 0;
}
description { state: "hidden" 0.0;
inherit: "default" 0.0;
visible: 0;
}
}
part { name: "bottom_sheet_static";
mouse_events: 0;
description { state: "default" 0.0;
visible: 1;
rel1.to: "b";
rel2.to: "b";
image.normal: "flip_b.png";
}
}
part { name: "bottom_b";
mouse_events: 0;
clip_to: "bottom_clipper";
type: TEXT;
scale: 1;
description { state: "default" 0.0;
rel1.to: "base";
rel2.to: "base";
color: 0 0 0 255;
color2: 0 0 0 255;
text {
font: "Sans:style=Bold,Edje-Vera-Bold";
size: 30;
min: 1 1;
align: 0.5 0.5;
}
}
}
part { name: "shadow";
mouse_events: 0;
description { state: "default" 0.0;
rel1.to: "b";
rel2.to: "b";
rel2.relative: 1.0 0.0;
image.normal: "flip_shad.png";
}
description { state: "half" 0.0;
inherit: "default" 0.0;
rel2.relative: 1.0 0.5;
}
description { state: "full" 0.0;
inherit: "default" 0.0;
rel2.relative: 1.0 1.0;
}
}
part { name: "bottom_sheet";
mouse_events: 0;
description { state: "default" 0.0;
visible: 1;
rel1.to: "b";
rel2.to: "b";
image.normal: "flip_b.png";
}
description { state: "shrink" 0.0;
inherit: "default" 0.0;
visible: 0;
rel2.relative: 1.0 0.0;
}
}
part { name: "bottom";
mouse_events: 0;
clip_to: "bottom_clipper";
type: TEXT;
scale: 1;
description { state: "default" 0.0;
rel1.to: "base";
rel2.to: "base";
color: 0 0 0 255;
color2: 0 0 0 255;
text {
font: "Sans:style=Bold,Edje-Vera-Bold";
size: 30;
min: 1 1;
align: 0.5 0.5;
}
}
description { state: "shrink" 0.0;
inherit: "default" 0.0;
color: 128 128 128 255;
visible: 0;
rel2.relative: 1.0 0.5; /* FIXME: same visual effect? --> MAP! */
}
}
part { name: "top_sheet_static";
mouse_events: 0;
description { state: "default" 0.0;
visible: 1;
rel1.to: "t";
rel2.to: "t";
image.normal: "flip_t.png";
}
}
part { name: "top_b";
mouse_events: 0;
clip_to: "top_clipper";
type: TEXT;
scale: 1;
description { state: "default" 0.0;
rel1.to: "base";
rel2.to: "base";
color: 0 0 0 255;
color2: 0 0 0 255;
text {
font: "Sans:style=Bold,Edje-Vera-Bold";
size: 30;
min: 1 1;
align: 0.5 0.5;
source: "top";
}
}
}
part { name: "top_sheet";
mouse_events: 0;
description { state: "default" 0.0;
visible: 1;
rel1.to: "t";
rel2.to: "t";
image.normal: "flip_t.png";
}
description { state: "shrink" 0.0;
inherit: "default" 0.0;
color: 128 128 128 255;
visible: 0;
rel1.relative: 0.0 1.0;
}
}
part { name: "top";
mouse_events: 0;
clip_to: "top_clipper";
type: TEXT;
scale: 1;
description { state: "default" 0.0;
rel1.to: "base";
rel2.to: "base";
color: 0 0 0 255;
color2: 0 0 0 255;
text {
font: "Sans:style=Bold,Edje-Vera-Bold";
size: 30;
min: 1 1;
align: 0.5 0.5;
}
}
description { state: "shrink" 0.0;
inherit: "default" 0.0;
visible: 0;
rel1.relative: 0.0 0.5;
}
}
part { name: "arrow_top";
mouse_events: 0;
scale: 1;
description { state: "default" 0.0;
min: 15 15;
max: 15 15;
align: 0.5 0.0;
rel1.to: "t";
rel2.to: "t";
image.normal: "arrow_up.png";
}
description { state: "hidden" 0.0;
inherit: "default" 0.0;
visible: 0;
}
}
part { name: "arrow_bottom";
mouse_events: 0;
scale: 1;
description { state: "default" 0.0;
min: 15 15;
max: 15 15;
align: 0.5 1.0;
rel1.to: "b";
rel2.to: "b";
image.normal: "arrow_down.png";
}
description { state: "hidden" 0.0;
inherit: "default" 0.0;
visible: 0;
}
}
part {
type: RECT;
mouse_events: 0;
name: "top_clipper";
description {
state: "default" 0.0;
rel1.to: "t";
rel2.to: "t";
visible: 1;
}
}
part {
type: RECT;
mouse_events: 0;
name: "bottom_clipper";
description {
state: "default" 0.0;
rel1.to: "b";
rel2.to: "b";
visible: 1;
}
}
}
programs {
program { name: "load";
signal: "load";
source: "";
script {
append_str(cur, "");
append_str(prev, "");
append_str(next, "");
set_int(lock, 0);
}
}
program { name: "hide_arrows";
signal: "elm,state,button,hidden";
source: "elm";
action: STATE_SET "hidden" 0.0;
target: "arrow_top";
target: "arrow_bottom";
target: "t";
target: "b";
}
program { name: "show_arrows";
signal: "elm,state,button,visible";
source: "elm";
action: STATE_SET "default" 0.0;
target: "arrow_top";
target: "arrow_bottom";
target: "t";
target: "b";
}
program { name: "up";
signal: "mouse,down,1";
source: "t";
action: SIGNAL_EMIT "elm,action,up,start" "";
}
program { name: "up,stop";
signal: "mouse,up,1";
source: "t";
action: SIGNAL_EMIT "elm,action,up,stop" "";
}
program { name: "down";
signal: "mouse,down,1";
source: "b";
action: SIGNAL_EMIT "elm,action,down,start" "";
}
program { name: "down,stop";
signal: "mouse,up,1";
source: "b";
action: SIGNAL_EMIT "elm,action,down,stop" "";
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 384 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 442 B

View File

@ -86,7 +86,8 @@ test_calendar.c \
test_tooltip.c \
test_cursor.c \
test_focus.c \
test_focus2.c
test_focus2.c \
test_flippicker.c
elementary_test_LDADD = $(top_builddir)/src/lib/libelementary.la @ELEMENTARY_EWEATHER_LIBS@
elementary_test_LDFLAGS =

View File

@ -87,6 +87,7 @@ void test_cursor2(void *data, Evas_Object *obj, void *event_info);
void test_cursor3(void *data, Evas_Object *obj, void *event_info);
void test_focus(void *data, Evas_Object *obj, void *event_info);
void test_focus2(void *data, Evas_Object *obj, void *event_info);
void test_flippicker(void *data, Evas_Object *obj, void *event_info);
struct elm_test
{
@ -294,6 +295,7 @@ my_win_main(char *autorun)
ADD_TEST("Cursor 3", test_cursor3);
ADD_TEST("Focus", test_focus);
ADD_TEST("Focus 2", test_focus2);
ADD_TEST("Flippicker", test_flippicker);
#undef ADD_TEST
if (autorun)

View File

@ -0,0 +1,83 @@
#include <Elementary.h>
#ifdef HAVE_CONFIG_H
# include "elementary_config.h"
#endif
#ifndef ELM_LIB_QUICKLAUNCH
void
_sel_cb(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
{
Elm_Flippicker_Item *it;
it = event_info;
printf("label of selected item is: %s\n", elm_flippicker_item_label_get(it));
}
void
_underflow_cb(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
printf("underflow!\n");
}
void
_overflow_cb(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
printf("overflow!\n");
}
void
test_flippicker(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
char buf[8];
unsigned int i;
Evas_Object *win, *bg, *bx, *fp;
static const char *lbl[] = {
"Elementary",
"Evas",
"Eina",
"Edje",
"Eet",
"Ecore",
"Efreet",
"Edbus"
};
win = elm_win_add(NULL, "flippicker", ELM_WIN_BASIC);
elm_win_title_set(win, "Flippicker");
elm_win_autodel_set(win, EINA_TRUE);
bg = elm_bg_add(win);
elm_win_resize_object_add(win, bg);
evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_show(bg);
bx = elm_box_add(win);
evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_win_resize_object_add(win, bx);
evas_object_show(bx);
fp = elm_flippicker_add(win);
evas_object_size_hint_weight_set(fp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_smart_callback_add(fp, "selected", _sel_cb, NULL);
evas_object_smart_callback_add(fp, "underflowed", _overflow_cb, NULL);
evas_object_smart_callback_add(fp, "overflowed", _underflow_cb, NULL);
for (i = 0; i < sizeof(lbl)/sizeof(char *); i++)
elm_flippicker_item_append(fp, lbl[i], NULL, NULL);
elm_box_pack_end(bx, fp);
evas_object_show(fp);
fp = elm_flippicker_add(win);
evas_object_smart_callback_add(fp, "underflowed", _overflow_cb, NULL);
evas_object_smart_callback_add(fp, "overflowed", _underflow_cb, NULL);
evas_object_size_hint_weight_set(fp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
for (i = 1990; i < 2099; i++)
{
snprintf(buf, 8, "%d", i);
elm_flippicker_item_append(fp, buf, _sel_cb, NULL);
}
elm_box_pack_end(bx, fp);
evas_object_show(fp);
evas_object_show(win);
}
#endif

View File

@ -1762,6 +1762,37 @@ extern "C" {
EAPI void elm_mapbuf_alpha_set(Evas_Object *obj, Eina_Bool alpha);
EAPI Eina_Bool elm_mapbuf_alpha_get(const Evas_Object *obj);
typedef struct _Elm_Flippicker_Item Elm_Flippicker_Item;
EAPI Evas_Object *elm_flippicker_add(Evas_Object *parent);
EAPI void elm_flippicker_flip_next(Evas_Object *obj);
EAPI void elm_flippicker_flip_prev(Evas_Object *obj);
EAPI Elm_Flippicker_Item *elm_flippicker_item_append(Evas_Object *obj, const char *label, void (*func)(void *data, Evas_Object *obj, void *event_info), void *data);
EAPI Elm_Flippicker_Item *elm_flippicker_item_prepend(Evas_Object *obj, const char *label, void (*func)(void *data, Evas_Object *obj, void *event_info), void *data);
EAPI const Eina_List *elm_flippicker_items_get(Evas_Object *obj);
EAPI const Elm_Flippicker_Item *elm_flippicker_first_item_get(Evas_Object *obj);
EAPI const Elm_Flippicker_Item *elm_flippicker_last_item_get(Evas_Object *obj);
EAPI const Elm_Flippicker_Item *elm_flippicker_selected_item_get(Evas_Object *obj);
EAPI void elm_flippicker_item_selected_set(Elm_Flippicker_Item *item);
EAPI void elm_flippicker_item_del(Elm_Flippicker_Item *item);
EAPI const char *elm_flippicker_item_label_get(Elm_Flippicker_Item *item);
EAPI void elm_flippicker_item_label_set(Elm_Flippicker_Item *item, const char *label);
EAPI Elm_Flippicker_Item *elm_flippicker_item_prev(Elm_Flippicker_Item *item);
EAPI Elm_Flippicker_Item *elm_flippicker_item_next(Elm_Flippicker_Item *item);
/* smart callbacks called:
* "selected" - when flippicker selected item is changed
* "overflowed" - when flippicker item is changed to first item
* from last item
* "underflowed" - when flippicker item is changed to last item
* from first item.
*/
/* available styles:
* default
*/
/* animator */
typedef struct _Animator Elm_Animator;

View File

@ -82,6 +82,7 @@ elm_thumb.c \
elm_config.c \
elm_animator.c \
elm_calendar.c \
elm_flippicker.c \
\
elc_anchorblock.c \
elc_anchorview.c \

File diff suppressed because it is too large Load Diff