From d8bc35a117109ba043f9f899467d1d36a303b2eb Mon Sep 17 00:00:00 2001 From: Daniel Juyung Seo Date: Mon, 7 Jun 2010 12:27:33 +0900 Subject: [PATCH] svn update: 49550 (latest:49550) --- AUTHORS | 2 + configure.ac | 54 +- data/themes/default.edc | 334 +++++++- debian/SVN_REV | 4 +- src/bin/Makefile.am | 2 +- src/bin/config.c | 5 +- src/bin/test.c | 8 +- src/bin/test_flip.c | 192 +++++ src/bin/test_gengrid.c | 188 +++++ src/bin/test_genlist.c | 9 + src/bin/test_index.c | 158 ++++ src/bin/test_panel.c | 181 ++++- src/bin/test_win_state.c | 2 +- src/lib/Elementary.h.in | 134 ++-- src/lib/Makefile.am | 2 +- src/lib/elc_fileselector_button.c | 45 +- src/lib/elc_scrolled_entry.c | 60 +- src/lib/elm_clock.c | 119 ++- src/lib/elm_config.c | 10 +- src/lib/elm_entry.c | 116 +-- src/lib/elm_flip.c | 4 +- src/lib/elm_gengrid.c | 1579 +++++++++++++++++++++++++++++++++++++ src/lib/elm_genlist.c | 4 +- src/lib/elm_hover.c | 4 +- src/lib/elm_index.c | 166 +++- src/lib/elm_main.c | 34 +- src/lib/elm_menu.c | 4 +- src/lib/elm_panel.c | 6 +- src/lib/elm_photo.c | 8 +- src/lib/elm_photocam.c | 2 +- src/lib/elm_spinner.c | 5 +- src/lib/elm_theme.c | 2 +- src/lib/elm_thumb.c | 39 +- src/lib/elm_toolbar.c | 28 +- src/lib/elm_widget.c | 4 +- src/lib/els_icon.c | 12 +- src/lib/els_scroller.c | 18 +- 37 files changed, 3187 insertions(+), 357 deletions(-) create mode 100644 src/bin/test_gengrid.c create mode 100644 src/lib/elm_gengrid.c diff --git a/AUTHORS b/AUTHORS index c99bb2b..8df9a5c 100644 --- a/AUTHORS +++ b/AUTHORS @@ -11,3 +11,5 @@ Michael Bouchaud Jonathan Atton (Watchwolf) Brian Wang Mike Blumenkrantz (zmike) +Saumsung Electronics +Samsung SAIT diff --git a/configure.ac b/configure.ac index 26748a7..6cdcf0a 100644 --- a/configure.ac +++ b/configure.ac @@ -1,8 +1,25 @@ -# get rid of that stupid cache mechanism -rm -f config.cache - -AC_INIT([elementary], [0.6.0.063], [enlightenment-devel@lists.sourceforge.net]) -release="ver-pre-svn-05" +##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--## +##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--## +m4_define([v_maj], [0]) +m4_define([v_min], [7]) +m4_define([v_mic], [0]) +m4_define([v_rev], m4_esyscmd([(svnversion . | grep -v exported || echo 0) | awk -F : '{printf("%s\n", $1);}' | tr -d ' :MSP\n'])) +m4_if(v_rev, [0], [m4_define([v_rev], m4_esyscmd([git log 2> /dev/null | (grep -m1 git-svn-id || echo 0) | sed -e 's/.*@\([0-9]*\).*/\1/' | tr -d '\n']))]) +##-- When released, remove the dnl on the below line +dnl m4_undefine([v_rev]) +##-- When doing snapshots - change soname. remove dnl on below line +m4_define([relname], [ver-pre-svn-06]) +m4_define([v_rel], [-release relname]) +##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--## +m4_ifdef([v_rev], [m4_define([v_ver], [v_maj.v_min.v_mic.v_rev])], +[m4_define([v_ver], [v_maj.v_min.v_mic])]) +m4_define([lt_rev], m4_eval(v_maj + v_min)) +m4_define([lt_cur], v_mic) +m4_define([lt_age], v_min) +##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--## +##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--## + +AC_INIT([elementary], [v_ver], [enlightenment-devel@lists.sourceforge.net]) AC_PREREQ(2.52) AC_CONFIG_SRCDIR([configure.ac]) AC_CONFIG_MACRO_DIR([m4]) @@ -29,20 +46,31 @@ define([AC_LIBTOOL_LANG_CXX_CONFIG], [:])dnl define([AC_LIBTOOL_LANG_F77_CONFIG], [:])dnl AC_PROG_LIBTOOL -VMAJ=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $1);}'` -VMIN=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $2);}'` -VMIC=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $3);}'` -SNAP=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $4);}'` -version_info=`expr $VMAJ + $VMIN`":$VMIC:$VMIN" +##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--## +##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--## +m4_ifdef([v_rev], , [m4_define([v_rev], [0])]) +m4_ifdef([v_rel], , [m4_define([v_rel], [])]) +AC_DEFINE_UNQUOTED(VMAJ, [v_maj], [Major version]) +AC_DEFINE_UNQUOTED(VMIN, [v_min], [Minor version]) +AC_DEFINE_UNQUOTED(VMIC, [v_mic], [Micro version]) +AC_DEFINE_UNQUOTED(VREV, [v_rev], [Revison]) +version_info="lt_rev:lt_cur:lt_age" +release_info="v_rel" AC_SUBST(version_info) +AC_SUBST(release_info) +##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--## +##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--## +VMAJ=v_maj +VMIN=v_min +AC_SUBST(VMAJ) +AC_SUBST(VMIN) case "$host_os" in mingw32ce* | cegcc*) MODULE_ARCH="$host_os-$host_cpu" ;; *) - release_info="-release $release" - MODULE_ARCH="$host_os-$host_cpu-$release" + MODULE_ARCH="$host_os-$host_cpu-relname" ;; esac AC_SUBST(release_info) @@ -143,7 +171,7 @@ PKG_CHECK_MODULES([ELEMENTARY], ecore >= 0.9.9 ecore-evas >= 0.9.9 ecore-file >= 0.9.9 - edje >= 0.9.91 + edje >= 0.9.9 ] ) diff --git a/data/themes/default.edc b/data/themes/default.edc index 535ddb8..2cb28c8 100644 --- a/data/themes/default.edc +++ b/data/themes/default.edc @@ -80,7 +80,7 @@ collections { alias: "elm/list/base/default"; alias: "elm/genlist/base/default"; alias: "elm/carousel/base/default"; - alias: "elm/grid/base/default"; + alias: "elm/gengrid/base/default"; script { public sbvis_v, sbvis_h, sbalways_v, sbalways_h, sbvis_timer; @@ -2700,12 +2700,22 @@ collections { program { name: "up"; signal: "mouse,down,1"; source: "t"; - action: SIGNAL_EMIT "elm,action,up" ""; + 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" ""; + action: SIGNAL_EMIT "elm,action,down,start" ""; + } + program { name: "down,stop"; + signal: "mouse,up,1"; + source: "b"; + action: SIGNAL_EMIT "elm,action,down,stop" ""; } } } @@ -3010,12 +3020,22 @@ collections { program { name: "up"; signal: "mouse,down,1"; source: "t"; - action: SIGNAL_EMIT "elm,action,up" ""; + 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" ""; + action: SIGNAL_EMIT "elm,action,down,start" ""; + } + program { name: "down,stop"; + signal: "mouse,up,1"; + source: "b"; + action: SIGNAL_EMIT "elm,action,down,stop" ""; } } } @@ -21072,7 +21092,7 @@ collections { } /////////////////////////////////////////////////////////////////////////////// - group { name: "elm/grid/cell/default/default"; + group { name: "elm/gengrid/item/default/default"; data.item: "labels" "elm.text"; data.item: "icons" "elm.swallow.icon elm.swallow.end"; images { @@ -21338,17 +21358,17 @@ collections { } } } - group { name: "elm/grid/cell/default_style/default"; + group { name: "elm/gengrid/item/default_style/default"; styles { - style { name: "grid_style"; + style { name: "gengrid_style"; base: "font=Sans font_size=10 align=left valign=0.5 color=#000"; tag: "br" "\n"; tag: "hilight" "+ font=Sans:style=Bold"; tag: "b" "+ font=Sans:style=Bold"; tag: "tab" "\t"; } - style { name: "grid_selected_style"; + style { name: "gengrid_selected_style"; base: "font=Sans font_size=10 align=left valign=0.5 color=#fff"; tag: "br" "\n"; tag: "hilight" "+ font=Sans:style=Bold"; @@ -21519,14 +21539,14 @@ collections { offset: -1 -5; } text { - style: "grid_style"; + style: "gengrid_style"; min: 1 1; } } description { state: "selected" 0.0; inherit: "default" 0.0; text { - style: "grid_selected_style"; + style: "gengrid_selected_style"; } } } @@ -23201,6 +23221,298 @@ collections { } } + group { + name: "elm/panel/base/right"; + images + { + image: "bt_base1.png" COMP; + image: "bt_hilight.png" COMP; + image: "bt_shine.png" COMP; + image: "bt_glow.png" COMP; + image: "bt_dis_base.png" COMP; + image: "icon_arrow_left.png" COMP; + image: "icon_arrow_right.png" COMP; + } + parts + { + part + { + name: "bg"; + type: RECT; + mouse_events: 0; + description + { + state: "default" 0.0; + color: 255 255 255 0; + rel1.relative: 1 0; + rel2.offset: -31 0; + } + description + { + state: "visible" 0.0; + inherit: "default" 0.0; + rel1.relative: 0 0; + } + } + part + { + name: "base"; + type: IMAGE; + mouse_events: 0; + description + { + state: "default" 0.0; + rel1 + { + offset: 20 0; + to_x: "bg"; + } + rel2.offset: -1 -1; + image + { + normal: "bt_dis_base.png"; + border: 4 4 4 4; + } + } + } + part + { + name: "clipper"; + type: RECT; + mouse_events: 0; + description + { + state: "default" 0.0; + rel1 + { + offset: 4 4; + to: "base"; + } + rel2 + { + offset: -5 -5; + to: "base"; + } + } + } + part + { + name: "elm.swallow.content"; + type: SWALLOW; + clip_to: "clipper"; + description + { + state: "default" 0.0; + rel1.to: "clipper"; + rel2.to: "clipper"; + } + } + part + { + name: "btn"; + type: IMAGE; + mouse_events: 1; + description + { + state: "default" 0.0; + max: 32 48; + fixed: 1 1; + align: 1 0.5; + rel1 + { + to_x: "bg"; + } + rel2 + { + offset: 2 0; + relative: 0.0 1; + to_x: "base"; + } + image + { + normal: "bt_base1.png"; + border: 5 0 4 12; + } + fill.smooth: 0; + } + description + { + state: "clicked" 0.0; + inherit: "default" 0.0; + } + } + part + { + name: "btn_over"; + type: IMAGE; + mouse_events: 0; + description + { + state: "default" 0.0; + rel1.to: "btn"; + rel2 + { + relative: 1.0 0.5; + to: "btn"; + } + image + { + normal: "bt_hilight.png"; + border: 7 0 7 0; + } + } + } + part + { + name: "btn_over2"; + type: IMAGE; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description + { + state: "default" 0.0; + rel1.to: "btn"; + rel2.to: "btn"; + image + { + normal: "bt_shine.png"; + border: 7 0 7 7; + } + } + } + part + { + name: "btn_over3"; + type: IMAGE; + mouse_events: 1; + repeat_events: 1; + description + { + state: "default" 0.0; + color: 255 255 255 0; + rel1.to: "btn"; + rel2.to: "btn"; + image + { + normal: "bt_glow.png"; + border: 12 12 12 12; + } + fill.smooth: 0; + } + description + { + state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 255; + } + } + part + { + name: "btn_icon"; + type: IMAGE; + repeat_events: 1; + description + { + state: "default" 0.0; + rel1.to: "btn"; + rel2.to: "btn"; + align: 0.5 0.5; + min: 16 16; + max: 16 16; + image.normal: "icon_arrow_left.png"; + } + description + { + state: "visible" 0.0; + inherit: "default" 0.0; + image.normal: "icon_arrow_right.png"; + } + } + } + programs + { + program + { + name: "show"; + signal: "elm,action,show"; + source: "elm"; + action: STATE_SET "visible" 0.0; + target: "bg"; + target: "btn_icon"; + transition: LINEAR 0.5; + } + program + { + name: "show2"; + signal: "show"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "btn_icon"; + after: "show3"; + } + program + { + name: "show3"; + action: STATE_SET "visible" 0.0; + target: "bg"; + target: "btn_icon"; + transition: LINEAR 0.5; + } + program + { + name: "hide"; + signal: "elm,action,hide"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "btn_icon"; + transition: LINEAR 0.5; + } + program + { + name: "btn_click"; + signal: "mouse,down,1"; + source: "btn_over2"; + action: STATE_SET "clicked" 0.0; + target: "btn"; + } + program + { + name: "btn_unclick"; + signal: "mouse,up,1"; + source: "btn_over2"; + action: STATE_SET "default" 0.0; + target: "btn"; + } + program + { + name: "btn_click2"; + signal: "mouse,down,1"; + source: "btn_over3"; + action: STATE_SET "clicked" 0.0; + target: "btn_over3"; + } + program + { + name: "btn_unclick2"; + signal: "mouse,up,1"; + source: "btn_over3"; + action: STATE_SET "default" 0.0; + transition: DECELERATE 0.5; + target: "btn_over3"; + } + program + { + name: "btn_unclick3"; + signal: "mouse,up,1"; + source: "btn_over2"; + action: SIGNAL_EMIT "elm,action,panel,toggle" ""; + } + } + } + /////////////////////////////////////////////////////////////////////////////// group { name: "elm/conformant/base/default"; parts { diff --git a/debian/SVN_REV b/debian/SVN_REV index a7df81f..14fb43b 100644 --- a/debian/SVN_REV +++ b/debian/SVN_REV @@ -1,2 +1,2 @@ -Revision 48959 -Last Changed Rev 48945 +Revision 49550 +Last Changed Rev 49550 diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am index 172287d..933e5fe 100644 --- a/src/bin/Makefile.am +++ b/src/bin/Makefile.am @@ -36,7 +36,7 @@ test_button.c \ test_fileselector_button.c \ test_toggle.c \ test_table.c \ -test_grid.c \ +test_gengrid.c \ test_clock.c \ test_layout.c \ test_hover.c \ diff --git a/src/bin/config.c b/src/bin/config.c index 9c3946b..f700cc5 100644 --- a/src/bin/config.c +++ b/src/bin/config.c @@ -367,7 +367,7 @@ _sample_theme_new(Evas_Object *win) elm_separator_horizontal_set(sp, 1); evas_object_size_hint_weight_set(sp, 1.0, 0.0); evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); - elm_table_pack(base, sl, 0, 2, 2, 1); + elm_table_pack(base, sp, 0, 2, 2, 1); evas_object_show(sp); sl = elm_slider_add(win); @@ -655,6 +655,7 @@ static int _exit_timer(void *data) { elm_exit(); + return 0; } /* this is your elementary main function - it MUSt be called IMMEDIATELY @@ -701,7 +702,7 @@ elm_main(int argc, char **argv) interactive = 0; } } - /* put ere any init specific to this app like parsing args etc. */ + /* put here any init specific to this app like parsing args etc. */ if (!quiet) { status_win(); /* create main window */ diff --git a/src/bin/test.c b/src/bin/test.c index 7f166b5..bd9806d 100644 --- a/src/bin/test.c +++ b/src/bin/test.c @@ -43,7 +43,7 @@ void test_genlist4(void *data, Evas_Object *obj, void *event_info); void test_genlist5(void *data, Evas_Object *obj, void *event_info); void test_genlist6(void *data, Evas_Object *obj, void *event_info); void test_table(void *data, Evas_Object *obj, void *event_info); -void test_grid(void *data, Evas_Object *obj, void *event_info); +void test_gengrid(void *data, Evas_Object *obj, void *event_info); void test_pager(void *data, Evas_Object *obj, void *event_info); void test_win_state(void *data, Evas_Object *obj, void *event_info); void test_win_state2(void *data, Evas_Object *obj, void *event_info); @@ -54,6 +54,7 @@ void test_scroller(void *data, Evas_Object *obj, void *event_info); void test_scroller2(void *data, Evas_Object *obj, void *event_info); void test_spinner(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_photocam(void *data, Evas_Object *obj, void *event_info); void test_photo(void *data, Evas_Object *obj, void *event_info); void test_thumb(void *data, Evas_Object *obj, void *event_info); @@ -66,6 +67,7 @@ void test_map(void *data, Evas_Object *obj, void *event_info); void test_weather(void *data, Evas_Object *obj, void *event_info); void test_flip(void *data, Evas_Object *obj, void *event_info); void test_flip2(void *data, Evas_Object *obj, void *event_info); +void test_flip3(void *data, Evas_Object *obj, void *event_info); void test_label(void *data, Evas_Object *obj, void *event_info); void test_conformant(void *data, Evas_Object *obj, void *event_info); void test_multi(void *data, Evas_Object *obj, void *event_info); @@ -234,7 +236,7 @@ my_win_main(void) ADD_TEST("Genlist 4", test_genlist4); ADD_TEST("Genlist 5", test_genlist5); ADD_TEST("Genlist Tree", test_genlist6); - ADD_TEST("Scrolled Grid", test_grid); + ADD_TEST("GenGrid", test_gengrid); ADD_TEST("Checks", test_check); ADD_TEST("Radios", test_radio); ADD_TEST("Pager", test_pager); @@ -247,6 +249,7 @@ my_win_main(void) ADD_TEST("Scroller 2", test_scroller2); ADD_TEST("Spinner", test_spinner); ADD_TEST("Index", test_index); + ADD_TEST("Index 2", test_index2); ADD_TEST("Photocam", test_photocam); ADD_TEST("Photo", test_photo); ADD_TEST("Thumb", test_thumb); @@ -259,6 +262,7 @@ my_win_main(void) ADD_TEST("Weather", test_weather); ADD_TEST("Flip", test_flip); ADD_TEST("Flip 2", test_flip2); + ADD_TEST("Flip 3", test_flip3); ADD_TEST("Label", test_label); ADD_TEST("Conformant", test_conformant); ADD_TEST("Multi Touch", test_multi); diff --git a/src/bin/test_flip.c b/src/bin/test_flip.c index 42eee41..f8932a2 100644 --- a/src/bin/test_flip.c +++ b/src/bin/test_flip.c @@ -271,4 +271,196 @@ test_flip2(void *data, Evas_Object *obj, void *event_info) evas_object_resize(win, 320, 480); evas_object_show(win); } + +void +test_flip3(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *win, *bg, *bx, *bx2, *bx3, *bx4, *bx5, *fl, *fl_f, *fl_b, *o, + *bt, *ly, *lb; + char buf[PATH_MAX]; + + win = elm_win_add(NULL, "flip flip", ELM_WIN_BASIC); + elm_win_title_set(win, "Flip Flip"); + elm_win_autodel_set(win, 1); + + 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); + + fl = elm_flip_add(win); + evas_object_size_hint_align_set(fl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(fl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, fl); + + bx3 = elm_box_add(win); + evas_object_size_hint_align_set(bx3, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx3, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx3); + + fl_f = elm_flip_add(win); + evas_object_size_hint_align_set(fl_f, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(fl_f, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + bx5 = elm_box_add(win); + evas_object_size_hint_align_set(bx5, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx5, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx5); + + o = elm_bg_add(win); + evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + snprintf(buf, sizeof(buf), "%s/images/%s", PACKAGE_DATA_DIR, "sky_01.jpg"); + elm_bg_file_set(o, buf, NULL); + evas_object_show(o); + elm_box_pack_end(bx5, o); + + lb = elm_label_add(win); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0); + elm_label_label_set(lb, "Front Flip - Front"); + evas_object_show(lb); + elm_box_pack_end(bx5, lb); + + elm_flip_content_front_set(fl_f, bx5); + + bx5 = elm_box_add(win); + evas_object_size_hint_align_set(bx5, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx5, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx5); + + o = elm_bg_add(win); + evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + snprintf(buf, sizeof(buf), "%s/images/%s", PACKAGE_DATA_DIR, "sky_02.jpg"); + elm_bg_file_set(o, buf, NULL); + evas_object_show(o); + elm_box_pack_end(bx5, o); + + lb = elm_label_add(win); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0); + elm_label_label_set(lb, "Front Flip - Back"); + evas_object_show(lb); + elm_box_pack_end(bx5, lb); + + elm_flip_content_back_set(fl_f, bx5); + + evas_object_show(fl_f); + elm_box_pack_end(bx3, fl_f); + + lb = elm_label_add(win); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0); + elm_label_label_set(lb, "Main Flip - Front"); + evas_object_show(lb); + elm_box_pack_end(bx3, lb); + + bx4 = elm_box_add(win); + evas_object_size_hint_weight_set(bx4, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx4); + + fl_b = elm_flip_add(win); + evas_object_size_hint_align_set(fl_b, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(fl_b, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + bx5 = elm_box_add(win); + evas_object_size_hint_align_set(bx5, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx5, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx5); + + o = elm_bg_add(win); + evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + snprintf(buf, sizeof(buf), "%s/images/%s", PACKAGE_DATA_DIR, "sky_03.jpg"); + elm_bg_file_set(o, buf, NULL); + evas_object_show(o); + elm_box_pack_end(bx5, o); + + lb = elm_label_add(win); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0); + elm_label_label_set(lb, "Back Flip - Front"); + evas_object_show(lb); + elm_box_pack_end(bx5, lb); + + elm_flip_content_front_set(fl_b, bx5); + + bx5 = elm_box_add(win); + evas_object_size_hint_align_set(bx5, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx5, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx5); + + o = elm_bg_add(win); + evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + snprintf(buf, sizeof(buf), "%s/images/%s", PACKAGE_DATA_DIR, "sky_04.jpg"); + elm_bg_file_set(o, buf, NULL); + evas_object_show(o); + elm_box_pack_end(bx5, o); + + lb = elm_label_add(win); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0); + elm_label_label_set(lb, "Back Flip - Back"); + evas_object_show(lb); + elm_box_pack_end(bx5, lb); + + elm_flip_content_back_set(fl_b, bx5); + + evas_object_show(fl_b); + elm_box_pack_end(bx4, fl_b); + + lb = elm_label_add(win); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0); + elm_label_label_set(lb, "Main Flip - Back"); + elm_box_pack_end(bx4, lb); + evas_object_show(lb); + + elm_flip_content_front_set(fl, bx3); + elm_flip_content_back_set(fl, bx4); + + evas_object_show(fl); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, 1); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + + bt = elm_button_add(win); + elm_button_label_set(bt, "Main Flip"); + evas_object_smart_callback_add(bt, "clicked", my_fl_1, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_button_label_set(bt, "Front Flip"); + evas_object_smart_callback_add(bt, "clicked", my_fl_1, fl_f); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_button_label_set(bt, "Back Flip"); + evas_object_smart_callback_add(bt, "clicked", my_fl_1, fl_b); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} #endif diff --git a/src/bin/test_gengrid.c b/src/bin/test_gengrid.c new file mode 100644 index 0000000..9a3ecff --- /dev/null +++ b/src/bin/test_gengrid.c @@ -0,0 +1,188 @@ +#include +#ifndef ELM_LIB_QUICKLAUNCH +typedef struct _Testitem +{ + Elm_Gengrid_Item *item; + const char *path; + int mode; + int onoff; +} Testitem; + +static Elm_Gengrid_Item_Class gic; + +static void +grid_drag_up(void *data, Evas_Object *obj, void *event_info) +{ + printf("Drag up: %p\n", event_info); +} + +static void +grid_drag_right(void *data, Evas_Object *obj, void *event_info) +{ + printf("Drag right: %p\n", event_info); +} + +static void +grid_drag_down(void *data, Evas_Object *obj, void *event_info) +{ + printf("Drag down: %p\n", event_info); +} + +static void +grid_drag_left(void *data, Evas_Object *obj, void *event_info) +{ + printf("Drag left: %p\n", event_info); +} + +static void +grid_drag_stop(void *data, Evas_Object *obj, void *event_info) +{ + printf("Drag stop: %p\n", event_info); +} + +static void +grid_selected(void *data, Evas_Object *obj, void *event_info) +{ + printf("Selected: %p\n", event_info); +} + +static void +grid_clicked(void *data, Evas_Object *obj, void *event_info) +{ + printf("Clicked: %p\n", event_info); +} + +static void +grid_longpress(void *data, Evas_Object *obj, void *event_info) +{ + printf("longpress %p\n", event_info); +} + +static void +grid_item_check_changed(void *data, Evas_Object *obj, void *event_info) +{ + Testitem *ti = data; + ti->onoff = elm_check_state_get(obj); + printf("item %p onoff = %i\n", ti, ti->onoff); +} + +char * +grid_label_get(const void *data, Evas_Object *obj, const char *part) +{ + const Testitem *ti = data; + char buf[256]; + snprintf(buf, sizeof(buf), "Photo %s", ti->path); + return strdup(buf); +} + +Evas_Object * +grid_icon_get(const void *data, Evas_Object *obj, const char *part) +{ + const Testitem *ti = data; + if (!strcmp(part, "elm.swallow.icon")) + { + + Evas_Object *icon = elm_bg_add(obj); + elm_bg_file_set(icon, ti->path, NULL); + evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + evas_object_show(icon); + return icon; + } + else if (!strcmp(part, "elm.swallow.end")) + { + Evas_Object *ck; + ck = elm_check_add(obj); + evas_object_propagate_events_set(ck, 0); + elm_check_state_set(ck, ti->onoff); + evas_object_smart_callback_add(ck, "changed", grid_item_check_changed, data); + evas_object_show(ck); + return ck; + } + return NULL; +} + +Eina_Bool +grid_state_get(const void *data, Evas_Object *obj, const char *part) +{ + return EINA_FALSE; +} + +void +grid_del(const void *data, Evas_Object *obj) +{ +} + +static void +grid_sel(void *data, Evas_Object *obj, void *event_info) +{ + printf("sel item data [%p] on grid obj [%p], pointer [%p]\n", data, obj, event_info); +} + +void +test_gengrid(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *win, *bg, *grid; + static Testitem ti[144]; + int i, j, n; + char buf[PATH_MAX]; + const char *img[9] = + { + "panel_01.jpg", + "plant_01.jpg", + "rock_01.jpg", + "rock_02.jpg", + "sky_01.jpg", + "sky_02.jpg", + "sky_03.jpg", + "sky_04.jpg", + "wood_01.jpg", + }; + + win = elm_win_add(NULL, "grid", ELM_WIN_BASIC); + elm_win_title_set(win, "Grid"); + elm_win_autodel_set(win, 1); + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + grid = elm_gengrid_add(win); + elm_gengrid_item_size_set(grid, 150, 150); + elm_gengrid_horizontal_set(grid, EINA_FALSE); + elm_gengrid_multi_select_set(grid, EINA_TRUE); + evas_object_smart_callback_add(grid, "selected", grid_selected, NULL); + evas_object_smart_callback_add(grid, "clicked", grid_clicked, NULL); + evas_object_smart_callback_add(grid, "longpressed", grid_longpress, NULL); + evas_object_smart_callback_add(grid, "drag,start,up", grid_drag_up, NULL); + evas_object_smart_callback_add(grid, "drag,start,right", grid_drag_right, NULL); + evas_object_smart_callback_add(grid, "drag,start,down", grid_drag_down, NULL); + evas_object_smart_callback_add(grid, "drag,start,left", grid_drag_left, NULL); + evas_object_smart_callback_add(grid, "drag,stop", grid_drag_stop, NULL); + evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + gic.item_style = "default"; + gic.func.label_get = grid_label_get; + gic.func.icon_get = grid_icon_get; + gic.func.state_get = grid_state_get; + gic.func.del = grid_del; + + n = 0; + for (i = 0; i < 12 * 12; i++) + { + snprintf(buf, sizeof(buf), "%s/images/%s", PACKAGE_DATA_DIR, img[n]); + n = (n + 1) % 9; + ti[i].mode = i; + ti[i].path = eina_stringshare_add(buf); + ti[i].item = elm_gengrid_item_append(grid, &gic, &(ti[i]), grid_sel, NULL); + if (!(i % 5)) + elm_gengrid_item_selected_set(ti[i].item, EINA_TRUE); + } + + evas_object_show(grid); + elm_win_resize_object_add(win, grid); + + evas_object_resize(win, 600, 600); + evas_object_show(win); +} +#endif diff --git a/src/bin/test_genlist.c b/src/bin/test_genlist.c index 4f783c4..18909ae 100644 --- a/src/bin/test_genlist.c +++ b/src/bin/test_genlist.c @@ -1,5 +1,14 @@ #include #ifndef ELM_LIB_QUICKLAUNCH + +/* Hint: + * In this example some calls to elm_genlist_item_append() are used which give the + * value of an int as 'item data' and 'func data' after casting into (void*). For + * sure this works only on architectures where sizeof(int)==sizeof(void*). + * For real world usage you should hold a data structure or value in your + * application and then give only a pointer to this data as data pointer. + */ + typedef struct _Testitem { Elm_Genlist_Item *item; diff --git a/src/bin/test_index.c b/src/bin/test_index.c index 955f0b7..026338f 100644 --- a/src/bin/test_index.c +++ b/src/bin/test_index.c @@ -90,4 +90,162 @@ test_index(void *data, Evas_Object *obj, void *event_info) evas_object_resize(win, 320, 480); evas_object_show(win); } + +/***********/ + +typedef struct _Test_Index2_Elements +{ + Evas_Object *entry, *lst, *id; +} Test_Index2_Elements; + +void +test_index2_del(void *data, Evas_Object *obj, void *event_info) +{ + /* FIXME it won't be called if elm_test main window is closed */ + free(data); +} + +int +test_index2_cmp(const void *data1, const void *data2) +{ + const char *label1, *label2; + const Elm_List_Item *it1 = data1; + const Elm_List_Item *it2 = data2; + + label1 = elm_list_item_label_get(it1); + label2 = elm_list_item_label_get(it2); + + return strcasecmp(label1, label2); +} + +int +test_index2_icmp(const void *data1, const void *data2) +{ + const char *label1, *label2; + const Elm_Index_Item *it1 = data1; + const Elm_Index_Item *it2 = data2; + + label1 = elm_index_item_letter_get(it1); + label2 = elm_index_item_letter_get(it2); + + return strcasecmp(label1, label2); +} + +void +test_index2_it_add(void *data, Evas_Object *obj, void *event_info) +{ + Test_Index2_Elements *gui = data; + Elm_List_Item *it; + const char *label; + char letter[2]; + + label = elm_scrolled_entry_entry_get(gui->entry); + snprintf(letter, sizeof(letter), "%c", label[0]); + it = elm_list_item_sorted_insert(gui->lst, label, NULL, NULL, NULL, NULL, + test_index2_cmp); + elm_index_item_sorted_insert(gui->id, letter, it, test_index2_icmp, + test_index2_cmp); + elm_list_go(gui->lst); + /* FIXME it's not showing the recently added item */ + elm_list_item_show(it); +} + +void +test_index2_it_del(void *data, Evas_Object *obj, void *event_info) +{ + Test_Index2_Elements *gui = data; + const char *label, *label_next; + Elm_List_Item *it, *it_next; + + it = elm_list_selected_item_get(obj); + it_next = elm_list_item_next(it); + + if (!it_next) + { + elm_index_item_del(gui->id, it); + elm_list_item_del(it); + return; + } + + label = elm_list_item_label_get(it); + label_next = elm_list_item_label_get(it_next); + + if (label[0] == label_next[0]) + { + Elm_Index_Item *iit; + iit = elm_index_item_find(gui->id, it); + elm_index_item_data_set(iit, it_next); + } + else + elm_index_item_del(gui->id, it); + + elm_list_item_del(it); +} + +void +test_index2_id_changed(void *data, Evas_Object *obj, void *event_info) +{ + elm_list_item_show(event_info); +} + +void +test_index2(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *win, *bg, *box, *bt; + Test_Index2_Elements *gui; + + gui = malloc(sizeof(*gui)); + + win = elm_win_add(NULL, "sorted-index-list", ELM_WIN_BASIC); + elm_win_title_set(win, "Sorted Index and List"); + evas_object_smart_callback_add(win, "delete-request", test_index2_del, gui); + elm_win_autodel_set(win, 1); + + 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); + + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + gui->id = elm_index_add(win); + evas_object_size_hint_weight_set(gui->id, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, gui->id); + evas_object_smart_callback_add(gui->id, "delay,changed", + test_index2_id_changed, NULL); + evas_object_show(gui->id); + + gui->entry = elm_scrolled_entry_add(win); + elm_scrolled_entry_entry_set(gui->entry, "Label"); + elm_scrolled_entry_single_line_set(gui->entry, EINA_TRUE); + evas_object_size_hint_weight_set(gui->entry, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_fill_set(gui->entry, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, gui->entry); + evas_object_show(gui->entry); + + bt = elm_button_add(win); + elm_button_label_set(bt, "Add"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, bt); + evas_object_smart_callback_add(bt, "clicked", test_index2_it_add, gui); + evas_object_show(bt); + + gui->lst = elm_list_add(win); + elm_box_pack_end(box, gui->lst); + evas_object_size_hint_weight_set(gui->lst, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(gui->lst, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(gui->lst, "selected", test_index2_it_del, + gui); + elm_list_go(gui->lst); + evas_object_show(gui->lst); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} #endif diff --git a/src/bin/test_panel.c b/src/bin/test_panel.c index 2e736f9..63a70f5 100644 --- a/src/bin/test_panel.c +++ b/src/bin/test_panel.c @@ -3,6 +3,8 @@ static Elm_Genlist_Item_Class itc; +static void _bstatus(void *data, Evas_Object *obj, void *event_info); +static void _tstatus(void *data, Evas_Object *obj, void *event_info); static char *_label_get(const void *data, Evas_Object *obj, const char *source); static Evas_Object *_icon_get(const void *data, Evas_Object *obj, const char *source); static Eina_Bool _state_get(const void *data, Evas_Object *obj, const char *source); @@ -10,52 +12,28 @@ static void _item_del(const void *data, Evas_Object *obj); static void _fill_list(Evas_Object *obj); static Eina_Bool _dir_has_subs(const char *path); -void -test_panel(void *data, Evas_Object *obj, void *event_info) +static void +_tstatus(void *data, Evas_Object *obj, void *event_info) { - Evas_Object *win, *bg, *panel, *bx; - Evas_Object *list; - - win = elm_win_add(NULL, "panel", ELM_WIN_BASIC); - elm_win_title_set(win, "Panel"); - elm_win_autodel_set(win, 1); - - 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); - elm_win_resize_object_add(win, bx); - evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_show(bx); - - panel = elm_panel_add(win); - elm_panel_orient_set(panel, ELM_PANEL_ORIENT_LEFT); - evas_object_size_hint_weight_set(panel, 0.0, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(panel, 0.0, EVAS_HINT_FILL); - - itc.item_style = "default"; - itc.func.label_get = _label_get; - itc.func.icon_get = _icon_get; - itc.func.state_get = _state_get; - itc.func.del = _item_del; - - list = elm_genlist_add(win); - evas_object_size_hint_min_set(list, 100, -1); - 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); - - elm_panel_content_set(panel, list); + char *status; - elm_box_pack_end(bx, panel); - evas_object_show(panel); + if (elm_panel_hidden_get((Evas_Object*)data)) + status = "hidden"; + else status = "shown"; + printf("The top panel is currently %s\n", status); + elm_toolbar_item_unselect_all(obj); +} - _fill_list(list); +static void +_bstatus(void *data, Evas_Object *obj, void *event_info) +{ + char *status; - evas_object_resize(win, 300, 300); - evas_object_show(win); + if (elm_panel_hidden_get((Evas_Object*)data)) + status = "hidden"; + else status = "shown"; + printf("The bottom panel is currently %s\n", status); + elm_toolbar_item_unselect_all(obj); } static char * @@ -160,4 +138,123 @@ _dir_has_subs(const char *path) return result; } +void +test_panel(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *win, *bg, *panel, *bx, *vbx, *toolbar, *ic; + char buf[PATH_MAX]; + Evas_Object *list; + + win = elm_win_add(NULL, "panel", ELM_WIN_BASIC); + elm_win_title_set(win, "Panel"); + elm_win_autodel_set(win, 1); + + 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); + + vbx = elm_box_add(win); + elm_win_resize_object_add(win, vbx); + evas_object_size_hint_weight_set(vbx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(vbx, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(vbx); + + bx = elm_box_add(win); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(bx); + + panel = elm_panel_add(win); + elm_panel_orient_set(panel, ELM_PANEL_ORIENT_TOP); + evas_object_size_hint_weight_set(panel, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(panel, EVAS_HINT_FILL, EVAS_HINT_FILL); + + toolbar = elm_toolbar_add(win); + elm_toolbar_homogenous_set(toolbar, 0); + elm_toolbar_scrollable_set(toolbar, 0); + evas_object_size_hint_weight_set(toolbar, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(toolbar, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(toolbar); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR); + elm_icon_file_set(ic, buf, NULL); + elm_toolbar_item_add(toolbar, ic, "Hello", _tstatus, panel); + + elm_panel_content_set(panel, toolbar); + elm_box_pack_end(vbx, panel); + evas_object_show(panel); + + panel = elm_panel_add(win); + elm_panel_orient_set(panel, ELM_PANEL_ORIENT_LEFT); + evas_object_size_hint_weight_set(panel, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(panel, 0, EVAS_HINT_FILL); + + itc.item_style = "default"; + itc.func.label_get = _label_get; + itc.func.icon_get = _icon_get; + itc.func.state_get = _state_get; + itc.func.del = _item_del; + + list = elm_genlist_add(win); + evas_object_size_hint_min_set(list, 100, -1); + 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); + + elm_panel_content_set(panel, list); + + elm_box_pack_end(bx, panel); + evas_object_show(panel); + + _fill_list(list); + + panel = elm_panel_add(win); + elm_panel_orient_set(panel, ELM_PANEL_ORIENT_RIGHT); + evas_object_size_hint_weight_set(panel, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(panel, 1, EVAS_HINT_FILL); + + list = elm_genlist_add(win); + evas_object_size_hint_min_set(list, 100, -1); + 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); + + elm_panel_content_set(panel, list); + + elm_box_pack_end(bx, panel); + evas_object_show(panel); + + _fill_list(list); + + elm_box_pack_end(vbx, bx); + + panel = elm_panel_add(win); + elm_panel_orient_set(panel, ELM_PANEL_ORIENT_BOTTOM); + evas_object_size_hint_weight_set(panel, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(panel, EVAS_HINT_FILL, EVAS_HINT_FILL); + + toolbar = elm_toolbar_add(win); + elm_toolbar_homogenous_set(toolbar, 0); + elm_toolbar_scrollable_set(toolbar, 0); + evas_object_size_hint_weight_set(toolbar, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(toolbar, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(toolbar); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR); + elm_icon_file_set(ic, buf, NULL); + elm_toolbar_item_add(toolbar, ic, "Hello", _bstatus, panel); + + elm_panel_content_set(panel, toolbar); + elm_box_pack_end(vbx, panel); + evas_object_show(panel); + + evas_object_resize(win, 320, 400); + evas_object_show(win); +} + + #endif diff --git a/src/bin/test_win_state.c b/src/bin/test_win_state.c index 2d771da..a1b6649 100644 --- a/src/bin/test_win_state.c +++ b/src/bin/test_win_state.c @@ -102,7 +102,7 @@ _win_foc_out(void *data, Evas *e, void *event_info) } static void -_close_win(void *data, Evas *e, void *event_info) +_close_win(void *data, Evas_Object *obj, void *event_info) { evas_object_del(data); } diff --git a/src/lib/Elementary.h.in b/src/lib/Elementary.h.in index 1862715..5cff583 100644 --- a/src/lib/Elementary.h.in +++ b/src/lib/Elementary.h.in @@ -118,6 +118,19 @@ extern "C" { #endif +#define ELM_VERSION_MAJOR @VMAJ@ +#define ELM_VERSION_MINOR @VMIN@ + + typedef struct _Elm_Version + { + int major; + int minor; + int micro; + int revision; + } Elm_Version; + + EAPI extern Elm_Version *elm_version; + /* handy macros */ #define ELM_RECTS_INTERSECT(x, y, w, h, xx, yy, ww, hh) (((x) < ((xx) + (ww))) && ((y) < ((yy) + (hh))) && (((x) + (w)) > (xx)) && (((y) + (h)) > (yy))) #define ELM_PI 3.14159265358979323846 @@ -260,7 +273,8 @@ extern "C" { EAPI Evas_Coord elm_finger_size_get(void); EAPI void elm_finger_size_set(Evas_Coord size); EAPI void elm_finger_size_all_set(Evas_Coord size); - + + EAPI Eina_Bool elm_object_focus_get(Evas_Object *obj); EAPI void elm_object_focus(Evas_Object *obj); EAPI void elm_object_unfocus(Evas_Object *obj); EAPI void elm_object_focus_allow_set(Evas_Object *obj, Eina_Bool enable); @@ -436,19 +450,19 @@ extern "C" { EAPI void elm_fileselector_button_icon_set(Evas_Object *obj, Evas_Object *icon); EAPI Evas_Object *elm_fileselector_button_icon_get(const Evas_Object *obj); EAPI void elm_fileselector_button_window_title_set(Evas_Object *obj, const char *title); - EAPI const char *elm_fileselector_button_window_title_get(Evas_Object *obj); + EAPI const char *elm_fileselector_button_window_title_get(const Evas_Object *obj); EAPI void elm_fileselector_button_window_size_set(Evas_Object *obj, Evas_Coord width, Evas_Coord height); - EAPI void elm_fileselector_button_window_size_get(Evas_Object *obj, Evas_Coord *width, Evas_Coord *height); + EAPI void elm_fileselector_button_window_size_get(const Evas_Object *obj, Evas_Coord *width, Evas_Coord *height); EAPI void elm_fileselector_button_path_set(Evas_Object *obj, const char *path); - EAPI const char *elm_fileselector_button_path_get(Evas_Object *obj); + EAPI const char *elm_fileselector_button_path_get(const Evas_Object *obj); EAPI void elm_fileselector_button_expandable_set(Evas_Object *obj, Eina_Bool value); - EAPI Eina_Bool elm_fileselector_button_expandable_get(Evas_Object *obj); + EAPI Eina_Bool elm_fileselector_button_expandable_get(const Evas_Object *obj); EAPI void elm_fileselector_button_folder_only_set(Evas_Object *obj, Eina_Bool value); - EAPI Eina_Bool elm_fileselector_button_folder_only_get(Evas_Object *obj); + EAPI Eina_Bool elm_fileselector_button_folder_only_get(const Evas_Object *obj); EAPI void elm_fileselector_button_is_save_set(Evas_Object *obj, Eina_Bool value); - EAPI Eina_Bool elm_fileselector_button_is_save_get(Evas_Object *obj); + EAPI Eina_Bool elm_fileselector_button_is_save_get(const Evas_Object *obj); EAPI void elm_fileselector_button_inwin_mode_set(Evas_Object *obj, Eina_Bool value); - EAPI Eina_Bool elm_fileselector_button_inwin_mode_get(Evas_Object *obj); + EAPI Eina_Bool elm_fileselector_button_inwin_mode_get(const Evas_Object *obj); EAPI void elm_fileselector_button_selected_set(Evas_Object *obj, const char *path); EAPI const char *elm_fileselector_button_selected_get(const Evas_Object *obj); @@ -549,63 +563,64 @@ extern "C" { EAPI void elm_table_unpack(Evas_Object *obj, Evas_Object *subobj); EAPI void elm_table_clear(Evas_Object *obj, Eina_Bool clear); - typedef struct _Elm_Grid_Cell_Class Elm_Grid_Cell_Class; - typedef struct _Elm_Grid_Cell_Class_Func Elm_Grid_Cell_Class_Func; - typedef struct _Elm_Grid_Cell Elm_Grid_Cell; - typedef char *(*GridCellLabelGetFunc) (const void *data, Evas_Object *obj, const char *part); - typedef Evas_Object *(*GridCellIconGetFunc) (const void *data, Evas_Object *obj, const char *part); - typedef Eina_Bool (*GridCellStateGetFunc) (const void *data, Evas_Object *obj, const char *part); - typedef void (*GridCellDelFunc) (const void *data, Evas_Object *obj); - - struct _Elm_Grid_Cell_Class + typedef struct _Elm_Gengrid_Item_Class Elm_Gengrid_Item_Class; + typedef struct _Elm_Gengrid_Item_Class_Func Elm_Gengrid_Item_Class_Func; + typedef struct _Elm_Gengrid_Item Elm_Gengrid_Item; + typedef char *(*GridItemLabelGetFunc) (const void *data, Evas_Object *obj, const char *part); + typedef Evas_Object *(*GridItemIconGetFunc) (const void *data, Evas_Object *obj, const char *part); + typedef Eina_Bool (*GridItemStateGetFunc) (const void *data, Evas_Object *obj, const char *part); + typedef void (*GridItemDelFunc) (const void *data, Evas_Object *obj); + + struct _Elm_Gengrid_Item_Class { const char *item_style; - struct _Elm_Grid_Cell_Class_Func + struct _Elm_Gengrid_Item_Class_Func { - GridCellLabelGetFunc label_get; - GridCellIconGetFunc icon_get; - GridCellStateGetFunc state_get; - GridCellDelFunc del; + GridItemLabelGetFunc label_get; + GridItemIconGetFunc icon_get; + GridItemStateGetFunc state_get; + GridItemDelFunc del; } func; }; - EAPI Evas_Object *elm_scrolled_grid_add(Evas_Object *parent); - EAPI void elm_scrolled_grid_cell_size_set(Evas_Object *obj, Evas_Coord w, Evas_Coord h); - EAPI void elm_scrolled_grid_cell_size_get(const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h); - EAPI void elm_scrolled_grid_align_set(Evas_Object *obj, double align_x, double align_y); - EAPI void elm_scrolled_grid_align_get(const Evas_Object *obj, double *align_x, double *align_y); - EAPI void elm_scrolled_grid_cell_del(Elm_Grid_Cell *cell); - EAPI void elm_scrolled_grid_always_select_mode_set(Evas_Object *obj, Eina_Bool always_select); - EAPI Eina_Bool elm_scrolled_grid_always_select_mode_get(const Evas_Object *obj); - EAPI void elm_scrolled_grid_no_select_mode_set(Evas_Object *obj, Eina_Bool no_select); - EAPI Eina_Bool elm_scrolled_grid_no_select_mode_get(const Evas_Object *obj); - EAPI void elm_scrolled_grid_multi_select_set(Evas_Object *obj, Eina_Bool multi); - EAPI Eina_Bool elm_scrolled_grid_multi_select_get(const Evas_Object *obj); - EAPI void elm_scrolled_grid_bounce_set(Evas_Object *obj, Eina_Bool h_bounce, Eina_Bool v_bounce); - EAPI void elm_scrolled_grid_bounce_get(const Evas_Object *obj, Eina_Bool *h_bounce, Eina_Bool *v_bounce); - EAPI void elm_scrolled_grid_horizontal_set(Evas_Object *obj, Eina_Bool setting); - EAPI void elm_scrolled_grid_clear(Evas_Object *obj); - EAPI void *elm_scrolled_grid_cell_data_get(Elm_Grid_Cell *cell); - EAPI void elm_scrolled_grid_cell_pos_get(const Elm_Grid_Cell *cell, unsigned int *x, unsigned int *y); - EAPI Eina_Bool elm_scrolled_grid_cell_selected_get(const Elm_Grid_Cell *cell); - EAPI const Evas_Object *elm_scrolled_grid_cell_object_get(Elm_Grid_Cell *cell); - EAPI const Eina_List *elm_scrolled_grid_selected_cells_get(const Evas_Object *obj); - EAPI Elm_Grid_Cell *elm_scrolled_grid_cell_add(Evas_Object *obj, const Elm_Grid_Cell_Class *gcc, const void *data, Evas_Smart_Cb func, const void *func_data); + EAPI Evas_Object *elm_gengrid_add(Evas_Object *parent); + EAPI void elm_gengrid_item_size_set(Evas_Object *obj, Evas_Coord w, Evas_Coord h); + EAPI void elm_gengrid_item_size_get(const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h); + EAPI void elm_gengrid_align_set(Evas_Object *obj, double align_x, double align_y); + EAPI void elm_gengrid_align_get(const Evas_Object *obj, double *align_x, double *align_y); + EAPI void elm_gengrid_item_del(Elm_Gengrid_Item *item); + EAPI void elm_gengrid_always_select_mode_set(Evas_Object *obj, Eina_Bool always_select); + EAPI Eina_Bool elm_gengrid_always_select_mode_get(const Evas_Object *obj); + EAPI void elm_gengrid_no_select_mode_set(Evas_Object *obj, Eina_Bool no_select); + EAPI Eina_Bool elm_gengrid_no_select_mode_get(const Evas_Object *obj); + EAPI void elm_gengrid_multi_select_set(Evas_Object *obj, Eina_Bool multi); + EAPI Eina_Bool elm_gengrid_multi_select_get(const Evas_Object *obj); + EAPI void elm_gengrid_bounce_set(Evas_Object *obj, Eina_Bool h_bounce, Eina_Bool v_bounce); + EAPI void elm_gengrid_bounce_get(const Evas_Object *obj, Eina_Bool *h_bounce, Eina_Bool *v_bounce); + EAPI void elm_gengrid_horizontal_set(Evas_Object *obj, Eina_Bool setting); + EAPI void elm_gengrid_clear(Evas_Object *obj); + EAPI void *elm_gengrid_item_data_get(Elm_Gengrid_Item *item); + EAPI void elm_gengrid_item_pos_get(const Elm_Gengrid_Item *item, unsigned int *x, unsigned int *y); + EAPI void elm_gengrid_item_selected_set(Elm_Gengrid_Item *item, Eina_Bool selected); + EAPI Eina_Bool elm_gengrid_item_selected_get(const Elm_Gengrid_Item *item); + EAPI const Evas_Object *elm_gengrid_item_object_get(Elm_Gengrid_Item *item); + EAPI const Eina_List *elm_gengrid_selected_items_get(const Evas_Object *obj); + EAPI Elm_Gengrid_Item *elm_gengrid_item_append(Evas_Object *obj, const Elm_Gengrid_Item_Class *gcc, const void *data, Evas_Smart_Cb func, const void *func_data); /* smart callbacks called: * - * selected - User has selected a cell. - * unselected - User has unselected a cell. - * clicked - User has double-clicked a cell. - * realized - An evas object for a cell was built. + * selected - User has selected a item. + * unselected - User has unselected a item. + * clicked - User has double-clicked a item. + * realized - An evas object for a item was built. * scroll - the content has been scrolled (moved). * "scroll,drag,start" - dragging the contents around has started. * "scroll,drat,stop" - dragging the contents around has stopped. - * drag - grid is being dragged. - * "drag,start,up" - grid has been dragged (not scrolled) up. - * "drag,start,down" - grid has been dragged (not scrolled) down. - * "drag,start,left" - grid has been dragged (not scrolled) left. - * "drag,start,rigth" - grid has been dragged (nto scrolled) right. - * "drag,stop" - grid is not being dragged. + * drag - Gengrid is being dragged. + * "drag,start,up" - Gengrid has been dragged (not scrolled) up. + * "drag,start,down" - Gengrid has been dragged (not scrolled) down. + * "drag,start,left" - Gengrid has been dragged (not scrolled) left. + * "drag,start,rigth" - Gengrid has been dragged (nto scrolled) right. + * "drag,stop" - Gengrid is not being dragged. */ EAPI Evas_Object *elm_clock_add(Evas_Object *parent); @@ -613,8 +628,8 @@ extern "C" { EAPI void elm_clock_time_get(const Evas_Object *obj, int *hrs, int *min, int *sec); EAPI void elm_clock_edit_set(Evas_Object *obj, Eina_Bool edit); EAPI Eina_Bool elm_clock_edit_get(const Evas_Object *obj); - EAPI void elm_clock_digit_edit_set(Evas_Object *obj, unsigned int digedit); - EAPI unsigned int elm_clock_digit_edit_get(const Evas_Object *obj); + EAPI void elm_clock_digit_edit_set(Evas_Object *obj, Elm_Clock_Digedit digedit); + EAPI Elm_Clock_Digedit elm_clock_digit_edit_get(const Evas_Object *obj); EAPI void elm_clock_show_am_pm_set(Evas_Object *obj, Eina_Bool am_pm); EAPI Eina_Bool elm_clock_show_am_pm_get(const Evas_Object *obj); EAPI void elm_clock_show_seconds_set(Evas_Object *obj, Eina_Bool seconds); @@ -845,6 +860,7 @@ extern "C" { EAPI Evas_Object *elm_thumb_add(Evas_Object *parent); EAPI void elm_thumb_file_set(Evas_Object *obj, const char *file, const char *key); EAPI void elm_thumb_file_get(const Evas_Object *obj, const char **file, const char **key); + EAPI void elm_thumb_path_get(const Evas_Object *obj, const char **file, const char **key); EAPI void elm_thumb_keep_aspect_set(Evas_Object *obj, Eina_Bool setting); EAPI Eina_Bool elm_thumb_keep_aspect_get(const Evas_Object *obj); EAPI void elm_thumb_align_set(Evas_Object *obj, float x_align, float y_align); @@ -1265,6 +1281,7 @@ extern "C" { * vertical (two up/down buttons at the right side and text left aligned) */ + typedef struct _Elm_Index_Item Elm_Index_Item; EAPI Evas_Object *elm_index_add(Evas_Object *parent); EAPI void elm_index_active_set(Evas_Object *obj, Eina_Bool active); EAPI void elm_index_item_level_set(Evas_Object *obj, int level); @@ -1274,9 +1291,14 @@ extern "C" { EAPI void elm_index_item_prepend(Evas_Object *obj, const char *letter, const void *item); EAPI void elm_index_item_append_relative(Evas_Object *obj, const char *letter, const void *item, const void *relative); EAPI void elm_index_item_prepend_relative(Evas_Object *obj, const char *letter, const void *item, const void *relative); + EAPI void elm_index_item_sorted_insert(Evas_Object *obj, const char *letter, const void *item, Eina_Compare_Cb cmp_func, Eina_Compare_Cb cmp_data_func); EAPI void elm_index_item_del(Evas_Object *obj, const void *item); + EAPI Elm_Index_Item *elm_index_item_find(Evas_Object *obj, const void *item); EAPI void elm_index_item_clear(Evas_Object *obj); EAPI void elm_index_item_go(Evas_Object *obj, int level); + EAPI void *elm_index_item_data_get(const Elm_Index_Item *item); + EAPI void elm_index_item_data_set(Elm_Index_Item *it, const void *data); + EAPI const char *elm_index_item_letter_get(const Elm_Index_Item *item); /* smart callbacks called: * "changed" - when the selected index item changes * "delay,changed" - when the selected index item changes, but after some small idle period diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am index f2711bf..b8a515d 100644 --- a/src/lib/Makefile.am +++ b/src/lib/Makefile.am @@ -45,7 +45,7 @@ elm_label.c \ elm_toggle.c \ elm_frame.c \ elm_table.c \ -elm_scrolled_grid.c \ +elm_gengrid.c \ elm_clock.c \ elm_layout.c \ elm_hover.c \ diff --git a/src/lib/elc_fileselector_button.c b/src/lib/elc_fileselector_button.c index f753588..08ba775 100644 --- a/src/lib/elc_fileselector_button.c +++ b/src/lib/elc_fileselector_button.c @@ -45,11 +45,12 @@ static void _selection_done(void *data, Evas_Object *obj, void *event_info); static const char SIG_CLICKED[] = "clicked"; static const char SIG_UNPRESSED[] = "unpressed"; static const char SIG_FILE_CHOSEN[] = "file,chosen"; -static const Evas_Smart_Cb_Description _signals[] = { - {SIG_CLICKED, ""}, - {SIG_UNPRESSED, ""}, - {SIG_FILE_CHOSEN, "s"}, - {NULL, NULL} +static const Evas_Smart_Cb_Description _signals[] = +{ + {SIG_CLICKED, ""}, + {SIG_UNPRESSED, ""}, + {SIG_FILE_CHOSEN, "s"}, + {NULL, NULL} }; static void @@ -107,8 +108,8 @@ _theme_hook(Evas_Object *obj) edje_object_signal_emit(wd->btn, "elm,state,icon,hidden", "elm"); edje_object_part_text_set(wd->btn, "elm.text", wd->btn_label); edje_object_message_signal_process(wd->btn); - edje_object_scale_set(wd->btn, elm_widget_scale_get(obj) * \ - _elm_config->scale); + edje_object_scale_set(wd->btn, + elm_widget_scale_get(obj) * _elm_config->scale); _sizing_eval(obj); } @@ -167,7 +168,6 @@ _sub_del(void *data __UNUSED__, Evas_Object *obj, void *event_info) static void _signal_clicked(void *data, Evas_Object *obj, const char *emission, const char *source) { - Widget_Data *wd = elm_widget_data_get(data); if (!wd) return; @@ -245,7 +245,7 @@ _fs_launch(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSE } } - if (!wd->inwin_mode || win_fallback) + if ((!wd->inwin_mode) || (win_fallback)) { win = _new_window_add(wd); evas_object_data_set(fs_btn, "win", win); @@ -262,7 +262,7 @@ _fs_launch(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSE evas_object_smart_callback_add(wd->fs, "done", _selection_done, fs_btn); evas_object_show(wd->fs); - if (wd->inwin_mode && !win_fallback) + if ((wd->inwin_mode) && (!win_fallback)) { elm_win_inwin_content_set(iw, wd->fs); elm_win_inwin_activate(iw); @@ -415,7 +415,6 @@ elm_fileselector_button_selected_set(Evas_Object *obj, const char *path) ELM_CHECK_WIDTYPE(obj, widtype); Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; - eina_stringshare_replace(&wd->fsd.path, path); } @@ -466,7 +465,7 @@ elm_fileselector_button_window_title_set(Evas_Object *obj, const char *title) * @ingroup File_Selector_Button */ EAPI const char * -elm_fileselector_button_window_title_get(Evas_Object *obj) +elm_fileselector_button_window_title_get(const Evas_Object *obj) { ELM_CHECK_WIDTYPE(obj, widtype) NULL; Widget_Data *wd = elm_widget_data_get(obj); @@ -492,7 +491,6 @@ elm_fileselector_button_window_size_set(Evas_Object *obj, Evas_Coord width, Evas ELM_CHECK_WIDTYPE(obj, widtype); Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; - wd->w = width; wd->h = height; } @@ -507,12 +505,11 @@ elm_fileselector_button_window_size_set(Evas_Object *obj, Evas_Coord width, Evas * @ingroup File_Selector_Button */ EAPI void -elm_fileselector_button_window_size_get(Evas_Object *obj, Evas_Coord *width, Evas_Coord *height) +elm_fileselector_button_window_size_get(const Evas_Object *obj, Evas_Coord *width, Evas_Coord *height) { ELM_CHECK_WIDTYPE(obj, widtype); Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; - if (width) *width = wd->w; if (height) *height = wd->h; } @@ -544,7 +541,7 @@ elm_fileselector_button_path_set(Evas_Object *obj, const char *path) * @ingroup File_Selector_Button */ EAPI const char * -elm_fileselector_button_path_get(Evas_Object *obj) +elm_fileselector_button_path_get(const Evas_Object *obj) { ELM_CHECK_WIDTYPE(obj, widtype) NULL; Widget_Data *wd = elm_widget_data_get(obj); @@ -569,7 +566,6 @@ elm_fileselector_button_expandable_set(Evas_Object *obj, Eina_Bool value) ELM_CHECK_WIDTYPE(obj, widtype); Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; - wd->fsd.expandable = value; } @@ -582,12 +578,11 @@ elm_fileselector_button_expandable_set(Evas_Object *obj, Eina_Bool value) * @ingroup File_Selector_Button */ EAPI Eina_Bool -elm_fileselector_button_expandable_get(Evas_Object *obj) +elm_fileselector_button_expandable_get(const Evas_Object *obj) { ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return EINA_FALSE; - return wd->fsd.expandable; } @@ -606,7 +601,6 @@ elm_fileselector_button_folder_only_set(Evas_Object *obj, Eina_Bool value) ELM_CHECK_WIDTYPE(obj, widtype); Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; - wd->fsd.folder_only = value; } @@ -619,12 +613,11 @@ elm_fileselector_button_folder_only_set(Evas_Object *obj, Eina_Bool value) * @ingroup File_Selector_Button */ EAPI Eina_Bool -elm_fileselector_button_folder_only_get(Evas_Object *obj) +elm_fileselector_button_folder_only_get(const Evas_Object *obj) { ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return EINA_FALSE; - return wd->fsd.folder_only; } @@ -643,7 +636,6 @@ elm_fileselector_button_is_save_set(Evas_Object *obj, Eina_Bool value) ELM_CHECK_WIDTYPE(obj, widtype); Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; - wd->fsd.is_save = value; } @@ -656,12 +648,11 @@ elm_fileselector_button_is_save_set(Evas_Object *obj, Eina_Bool value) * @ingroup File_Selector_Button */ EAPI Eina_Bool -elm_fileselector_button_is_save_get(Evas_Object *obj) +elm_fileselector_button_is_save_get(const Evas_Object *obj) { ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return EINA_FALSE; - return wd->fsd.is_save; } @@ -681,7 +672,6 @@ elm_fileselector_button_inwin_mode_set(Evas_Object *obj, Eina_Bool value) ELM_CHECK_WIDTYPE(obj, widtype); Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; - wd->inwin_mode = value; } @@ -694,12 +684,11 @@ elm_fileselector_button_inwin_mode_set(Evas_Object *obj, Eina_Bool value) * @ingroup File_Selector_Button */ EAPI Eina_Bool -elm_fileselector_button_inwin_mode_get(Evas_Object *obj) +elm_fileselector_button_inwin_mode_get(const Evas_Object *obj) { ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return EINA_FALSE; - return wd->inwin_mode; } diff --git a/src/lib/elc_scrolled_entry.c b/src/lib/elc_scrolled_entry.c index d593df6..664cce7 100644 --- a/src/lib/elc_scrolled_entry.c +++ b/src/lib/elc_scrolled_entry.c @@ -12,22 +12,22 @@ * widget. * * Signals that you can add callbacks for are: - * "changed" - The text within the entry was changed - * "activated" - The entry has received focus and the cursor - * "press" - The entry has been clicked - * "longpressed" - The entry has been clicked for a couple seconds - * "clicked" - The entry has been clicked - * "clicked,double" - The entry has been double clicked - * "focused" - The entry has received focus - * "unfocused" - The entry has lost focus - * "selection,paste" - A paste action has occurred - * "selection,copy" - A copy action has occurred - * "selection,cut" - A cut action has occurred - * "selection,start" - A selection has begun - * "selection,changed" - The selection has changed - * "selection,cleared" - The selection has been cleared - * "cursor,changed" - The cursor has changed - * "anchor,clicked" - The anchor has been clicked + * - "changed" - The text within the entry was changed + * - "activated" - The entry has received focus and the cursor + * - "press" - The entry has been clicked + * - "longpressed" - The entry has been clicked for a couple seconds + * - "clicked" - The entry has been clicked + * - "clicked,double" - The entry has been double clicked + * - "focused" - The entry has received focus + * - "unfocused" - The entry has lost focus + * - "selection,paste" - A paste action has occurred + * - "selection,copy" - A copy action has occurred + * - "selection,cut" - A cut action has occurred + * - "selection,start" - A selection has begun + * - "selection,changed" - The selection has changed + * - "selection,cleared" - The selection has been cleared + * - "cursor,changed" - The cursor has changed + * - "anchor,clicked" - The anchor has been clicked */ typedef struct _Widget_Data Widget_Data; @@ -571,9 +571,9 @@ elm_scrolled_entry_select_all(Evas_Object *obj) EAPI Eina_Bool elm_scrolled_entry_cursor_next(Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) 0; + ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return 0; + if (!wd) return EINA_FALSE; return elm_entry_cursor_next(wd->entry); } @@ -588,9 +588,9 @@ elm_scrolled_entry_cursor_next(Evas_Object *obj) EAPI Eina_Bool elm_scrolled_entry_cursor_prev(Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) 0; + ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return 0; + if (!wd) return EINA_FALSE; return elm_entry_cursor_prev(wd->entry); } @@ -605,9 +605,9 @@ elm_scrolled_entry_cursor_prev(Evas_Object *obj) EAPI Eina_Bool elm_scrolled_entry_cursor_up(Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) 0; + ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return 0; + if (!wd) return EINA_FALSE; return elm_entry_cursor_up(wd->entry); } @@ -622,9 +622,9 @@ elm_scrolled_entry_cursor_up(Evas_Object *obj) EAPI Eina_Bool elm_scrolled_entry_cursor_down(Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) 0; + ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return 0; + if (!wd) return EINA_FALSE; return elm_entry_cursor_down(wd->entry); } @@ -737,9 +737,9 @@ elm_scrolled_entry_cursor_selection_end(Evas_Object *obj) EAPI Eina_Bool elm_scrolled_entry_cursor_is_format_get(const Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) 0; + ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return 0; + if (!wd) return EINA_FALSE; return elm_entry_cursor_is_format_get(wd->entry); } @@ -754,9 +754,9 @@ elm_scrolled_entry_cursor_is_format_get(const Evas_Object *obj) EAPI Eina_Bool elm_scrolled_entry_cursor_is_visible_format_get(const Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) 0; + ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return 0; + if (!wd) return EINA_FALSE; return elm_entry_cursor_is_visible_format_get(wd->entry); } @@ -890,9 +890,9 @@ elm_scrolled_entry_context_menu_disabled_set(Evas_Object *obj, Eina_Bool disable EAPI Eina_Bool elm_scrolled_entry_context_menu_disabled_get(const Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) 0; + ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return 0; + if (!wd) return EINA_FALSE; return elm_entry_context_menu_disabled_get(wd->entry); } diff --git a/src/lib/elm_clock.c b/src/lib/elm_clock.c index 092f1a7..6606ba5 100644 --- a/src/lib/elm_clock.c +++ b/src/lib/elm_clock.c @@ -14,22 +14,24 @@ typedef struct _Widget_Data Widget_Data; struct _Widget_Data { Evas_Object *clk; + double interval; Eina_Bool seconds : 1; Eina_Bool am_pm : 1; Eina_Bool edit : 1; - unsigned int digedit; + Elm_Clock_Digedit digedit; int hrs, min, sec; Evas_Object *digit[6]; Evas_Object *ampm; - Ecore_Timer *ticker; - struct + Evas_Object *sel_obj; + Ecore_Timer *ticker, *spin; + struct { int hrs, min, sec; char ampm; Eina_Bool seconds : 1; Eina_Bool am_pm : 1; Eina_Bool edit : 1; - unsigned int digedit; + Elm_Clock_Digedit digedit; } cur; }; @@ -37,8 +39,8 @@ static const char *widtype = NULL; static void _del_hook(Evas_Object *obj); static void _theme_hook(Evas_Object *obj); static int _ticker(void *data); -static void _signal_clock_val_up(void *data, Evas_Object *obj, const char *emission, const char *source); -static void _signal_clock_val_down(void *data, Evas_Object *obj, const char *emission, const char *source); +static int _signal_clock_val_up(void *data); +static int _signal_clock_val_down(void *data); static void _time_update(Evas_Object *obj); static void @@ -53,6 +55,7 @@ _del_hook(Evas_Object *obj) } if (wd->ampm) evas_object_del(wd->ampm); if (wd->ticker) ecore_timer_del(wd->ticker); + if (wd->spin) ecore_timer_del(wd->spin); free(wd); } @@ -108,94 +111,136 @@ _ticker(void *data) return 0; } -static void -_signal_clock_val_up(void *data, Evas_Object *obj, const char *emission __UNUSED__, const char *source __UNUSED__) +static int +_signal_clock_val_up(void *data) { Widget_Data *wd = elm_widget_data_get(data); if (!wd) return; if (!wd->edit) return; - if (obj == wd->digit[0]) + if (!wd->sel_obj) return; + if (wd->sel_obj == wd->digit[0]) { wd->hrs = wd->hrs + 10; if (wd->hrs >= 24) wd->hrs -= 24; } - if (obj == wd->digit[1]) + if (wd->sel_obj == wd->digit[1]) { wd->hrs = wd->hrs + 1; if (wd->hrs >= 24) wd->hrs -= 24; } - if (obj == wd->digit[2]) + if (wd->sel_obj == wd->digit[2]) { wd->min = wd->min + 10; if (wd->min >= 60) wd->min -= 60; } - if (obj == wd->digit[3]) + if (wd->sel_obj == wd->digit[3]) { wd->min = wd->min + 1; if (wd->min >= 60) wd->min -= 60; } - if (obj == wd->digit[4]) + if (wd->sel_obj == wd->digit[4]) { wd->sec = wd->sec + 10; if (wd->sec >= 60) wd->sec -= 60; } - if (obj == wd->digit[5]) + if (wd->sel_obj == wd->digit[5]) { wd->sec = wd->sec + 1; if (wd->sec >= 60) wd->sec -= 60; } - if (obj == wd->ampm) + if (wd->sel_obj == wd->ampm) { wd->hrs = wd->hrs + 12; if (wd->hrs > 23) wd->hrs -= 24; } + wd->interval = wd->interval / 1.05; + ecore_timer_interval_set(wd->spin, wd->interval); _time_update(data); evas_object_smart_callback_call(data, "changed", NULL); + return ECORE_CALLBACK_RENEW; } -static void -_signal_clock_val_down(void *data, Evas_Object *obj, const char *emission __UNUSED__, const char *source __UNUSED__) +static int +_signal_clock_val_down(void *data) { Widget_Data *wd = elm_widget_data_get(data); if (!wd) return; if (!wd->edit) return; - if (obj == wd->digit[0]) + if (!wd->sel_obj) return; + if (wd->sel_obj == wd->digit[0]) { wd->hrs = wd->hrs - 10; if (wd->hrs < 0) wd->hrs += 24; } - if (obj == wd->digit[1]) + if (wd->sel_obj == wd->digit[1]) { wd->hrs = wd->hrs - 1; if (wd->hrs < 0) wd->hrs += 24; } - if (obj == wd->digit[2]) + if (wd->sel_obj == wd->digit[2]) { wd->min = wd->min - 10; if (wd->min < 0) wd->min += 60; } - if (obj == wd->digit[3]) + if (wd->sel_obj == wd->digit[3]) { wd->min = wd->min - 1; if (wd->min < 0) wd->min += 60; } - if (obj == wd->digit[4]) + if (wd->sel_obj == wd->digit[4]) { wd->sec = wd->sec - 10; if (wd->sec < 0) wd->sec += 60; } - if (obj == wd->digit[5]) + if (wd->sel_obj == wd->digit[5]) { wd->sec = wd->sec - 1; if (wd->sec < 0) wd->sec += 60; } - if (obj == wd->ampm) + if (wd->sel_obj == wd->ampm) { wd->hrs = wd->hrs - 12; if (wd->hrs < 0) wd->hrs += 24; } + wd->interval = wd->interval / 1.05; + ecore_timer_interval_set(wd->spin, wd->interval); _time_update(data); evas_object_smart_callback_call(data, "changed", NULL); + return ECORE_CALLBACK_RENEW; +} + +static void +_signal_clock_val_up_start(void *data, Evas_Object *obj, const char *emission __UNUSED__, const char *source __UNUSED__) +{ + Widget_Data *wd = elm_widget_data_get(data); + if (!wd) return; + wd->interval = 0.85; + wd->sel_obj = obj; + if (wd->spin) ecore_timer_del(wd->spin); + wd->spin = ecore_timer_add(wd->interval, _signal_clock_val_up, data); + _signal_clock_val_up(data); +} + +static void +_signal_clock_val_down_start(void *data, Evas_Object *obj, const char *emission __UNUSED__, const char *source __UNUSED__) +{ + Widget_Data *wd = elm_widget_data_get(data); + if (!wd) return; + wd->interval = 0.85; + wd->sel_obj = obj; + if (wd->spin) ecore_timer_del(wd->spin); + wd->spin = ecore_timer_add(wd->interval, _signal_clock_val_down, data); + _signal_clock_val_down(data); +} + +static void +_signal_clock_val_change_stop(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__) +{ + Widget_Data *wd = elm_widget_data_get(data); + if (!wd) return; + if (wd->spin) ecore_timer_del(wd->spin); + wd->spin = NULL; + wd->sel_obj = NULL; } static void @@ -248,10 +293,14 @@ _time_update(Evas_Object *obj) _elm_config->scale); if (wd->edit && (wd->digedit & (1 << i))) edje_object_signal_emit(wd->digit[i], "elm,state,edit,on", "elm"); - edje_object_signal_callback_add(wd->digit[i], "elm,action,up", "", - _signal_clock_val_up, obj); - edje_object_signal_callback_add(wd->digit[i], "elm,action,down", "", - _signal_clock_val_down, obj); + edje_object_signal_callback_add(wd->digit[i], "elm,action,up,start", + "", _signal_clock_val_up_start, obj); + edje_object_signal_callback_add(wd->digit[i], "elm,action,up,stop", + "", _signal_clock_val_change_stop, obj); + edje_object_signal_callback_add(wd->digit[i], "elm,action,down,start", + "", _signal_clock_val_down_start, obj); + edje_object_signal_callback_add(wd->digit[i], "elm,action,down,stop", + "", _signal_clock_val_change_stop, obj); mw = mh = -1; elm_coords_finger_size_adjust(1, &mw, 2, &mh); edje_object_size_min_restricted_calc(wd->digit[i], &mw, &mh, mw, mh); @@ -269,10 +318,14 @@ _time_update(Evas_Object *obj) _elm_config->scale); if (wd->edit) edje_object_signal_emit(wd->ampm, "elm,state,edit,on", "elm"); - edje_object_signal_callback_add(wd->ampm, "elm,action,up", "", - _signal_clock_val_up, obj); - edje_object_signal_callback_add(wd->ampm, "elm,action,down", "", - _signal_clock_val_down, obj); + edje_object_signal_callback_add(wd->ampm, "elm,action,up,start", + "", _signal_clock_val_up_start, obj); + edje_object_signal_callback_add(wd->ampm, "elm,action,up,stop", + "", _signal_clock_val_change_stop, obj); + edje_object_signal_callback_add(wd->ampm, "elm,action,down,start", + "", _signal_clock_val_down_start, obj); + edje_object_signal_callback_add(wd->ampm, "elm,action,down,stop", + "", _signal_clock_val_change_stop, obj); mw = mh = -1; elm_coords_finger_size_adjust(1, &mw, 2, &mh); edje_object_size_min_restricted_calc(wd->ampm, &mw, &mh, mw, mh); @@ -558,7 +611,7 @@ elm_clock_digit_edit_set(Evas_Object *obj, Elm_Clock_Digedit digedit) * * @ingroup Clock */ -EAPI unsigned int +EAPI Elm_Clock_Digedit elm_clock_digit_edit_get(const Evas_Object *obj) { ELM_CHECK_WIDTYPE(obj, widtype) 0; diff --git a/src/lib/elm_config.c b/src/lib/elm_config.c index 97a265d..44b36be 100644 --- a/src/lib/elm_config.c +++ b/src/lib/elm_config.c @@ -64,7 +64,7 @@ _prop_config_get(void) _atom[ATOM_E_CONFIG], _atom[ATOM_E_CONFIG], 8, &data, &size)) - return 0; + return EINA_FALSE; else _atom_config = _atom[ATOM_E_CONFIG]; } @@ -73,16 +73,16 @@ _prop_config_get(void) if (size < 1) { free(data); - return 0; + return EINA_FALSE; } config_data = eet_data_descriptor_decode(_config_edd, data, size); free(data); - if (!config_data) return 0; + if (!config_data) return EINA_FALSE; _config_free(); _elm_config = config_data; _config_apply(); _elm_rescale(); - return 1; + return EINA_TRUE; } static int @@ -364,7 +364,7 @@ _config_load(void) static void _env_get(void) { - char buf[PATH_MAX], *p, *s; + char *s; s = getenv("ELM_ENGINE"); if (s) diff --git a/src/lib/elm_entry.c b/src/lib/elm_entry.c index fba911b..063cbb7 100644 --- a/src/lib/elm_entry.c +++ b/src/lib/elm_entry.c @@ -19,46 +19,46 @@ * vsize=ascent or vsize=full. the href=NAME sets the item name. Entry * supports a list of emoticon names by default. These are: * - * emoticon/angry - * emoticon/angry-shout - * emoticon/crazy-laugh - * emoticon/evil-laugh - * emoticon/evil - * emoticon/goggle-smile - * emoticon/grumpy - * emoticon/grumpy-smile - * emoticon/guilty - * emoticon/guilty-smile - * emoticon/haha - * emoticon/half-smile - * emoticon/happy-panting - * emoticon/happy - * emoticon/indifferent - * emoticon/kiss - * emoticon/knowing-grin - * emoticon/laugh - * emoticon/little-bit-sorry - * emoticon/love-lots - * emoticon/love - * emoticon/minimal-smile - * emoticon/not-happy - * emoticon/not-impressed - * emoticon/omg - * emoticon/opensmile - * emoticon/smile - * emoticon/sorry - * emoticon/squint-laugh - * emoticon/surprised - * emoticon/suspicious - * emoticon/tongue-dangling - * emoticon/tongue-poke - * emoticon/uh - * emoticon/unhappy - * emoticon/very-sorry - * emoticon/what - * emoticon/wink - * emoticon/worried - * emoticon/wtf + * - emoticon/angry + * - emoticon/angry-shout + * - emoticon/crazy-laugh + * - emoticon/evil-laugh + * - emoticon/evil + * - emoticon/goggle-smile + * - emoticon/grumpy + * - emoticon/grumpy-smile + * - emoticon/guilty + * - emoticon/guilty-smile + * - emoticon/haha + * - emoticon/half-smile + * - emoticon/happy-panting + * - emoticon/happy + * - emoticon/indifferent + * - emoticon/kiss + * - emoticon/knowing-grin + * - emoticon/laugh + * - emoticon/little-bit-sorry + * - emoticon/love-lots + * - emoticon/love + * - emoticon/minimal-smile + * - emoticon/not-happy + * - emoticon/not-impressed + * - emoticon/omg + * - emoticon/opensmile + * - emoticon/smile + * - emoticon/sorry + * - emoticon/squint-laugh + * - emoticon/surprised + * - emoticon/suspicious + * - emoticon/tongue-dangling + * - emoticon/tongue-poke + * - emoticon/uh + * - emoticon/unhappy + * - emoticon/very-sorry + * - emoticon/what + * - emoticon/wink + * - emoticon/worried + * - emoticon/wtf * * These are built-in currently, but you can add your own item provieer that * can create inlined objects in the text and fill the space allocated to the @@ -67,22 +67,22 @@ * See the entry test for some more examples of use of this. * * Signals that you can add callbacks for are: - * "changed" - The text within the entry was changed - * "activated" - The entry has received focus and the cursor - * "press" - The entry has been clicked - * "longpressed" - The entry has been clicked for a couple seconds - * "clicked" - The entry has been clicked - * "clicked,double" - The entry has been double clicked - * "focused" - The entry has received focus - * "unfocused" - The entry has lost focus - * "selection,paste" - A paste action has occurred - * "selection,copy" - A copy action has occurred - * "selection,cut" - A cut action has occurred - * "selection,start" - A selection has begun - * "selection,changed" - The selection has changed - * "selection,cleared" - The selection has been cleared - * "cursor,changed" - The cursor has changed - * "anchor,clicked" - The anchor has been clicked + * - "changed" - The text within the entry was changed + * - "activated" - The entry has received focus and the cursor + * - "press" - The entry has been clicked + * - "longpressed" - The entry has been clicked for a couple seconds + * - "clicked" - The entry has been clicked + * - "clicked,double" - The entry has been double clicked + * - "focused" - The entry has received focus + * - "unfocused" - The entry has lost focus + * - "selection,paste" - A paste action has occurred + * - "selection,copy" - A copy action has occurred + * - "selection,cut" - A cut action has occurred + * - "selection,start" - A selection has begun + * - "selection,changed" - The selection has changed + * - "selection,cleared" - The selection has been cleared + * - "cursor,changed" - The cursor has changed + * - "anchor,clicked" - The anchor has been clicked */ typedef struct _Mod_Api Mod_Api; @@ -455,8 +455,10 @@ static void _store_selection(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); - const char *sel = edje_object_part_text_selection_get(wd->ent, "elm.text"); + const char *sel; + if (!wd) return; + sel = edje_object_part_text_selection_get(wd->ent, "elm.text"); eina_stringshare_replace(&wd->cut_sel, sel); } diff --git a/src/lib/elm_flip.c b/src/lib/elm_flip.c index 9daf720..0bca0b3 100644 --- a/src/lib/elm_flip.c +++ b/src/lib/elm_flip.c @@ -346,7 +346,7 @@ elm_flip_content_front_set(Evas_Object *obj, Evas_Object *content) wd->front.content = content; if (content) { - elm_widget_sub_object_add(content, obj); + elm_widget_sub_object_add(obj, content); evas_object_smart_member_add(content, obj); evas_object_clip_set(content, wd->front.clip); evas_object_event_callback_add(content, @@ -385,7 +385,7 @@ elm_flip_content_back_set(Evas_Object *obj, Evas_Object *content) wd->back.content = content; if (content) { - elm_widget_sub_object_add(content, obj); + elm_widget_sub_object_add(obj, content); evas_object_smart_member_add(content, obj); evas_object_clip_set(content, wd->back.clip); evas_object_event_callback_add(content, diff --git a/src/lib/elm_gengrid.c b/src/lib/elm_gengrid.c new file mode 100644 index 0000000..6a54fa1 --- /dev/null +++ b/src/lib/elm_gengrid.c @@ -0,0 +1,1579 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ +#include +#include "elm_priv.h" + +/** + * @defgroup Gengrid Gengrid + * + * This widget aims to position objects in a grid layout while actually + * building only the visible ones, using the same idea as genlist: the user + * define a class for each item, specifying functions that will be called at + * object creation and deletion. + * + * Signals that you can add callbacks for are: + * + * clicked - The user has double-clicked a item. The event_info parameter is + * the Gengrid item that was double-clicked. + * + * selected - The user has made an item selected. The event_info parameter is + * the Gengrid item that was selected. + * + * unselected - The user has made an item unselected. The event_info parameter + * is the Gengrid item that was unselected. + * + * realized - This is called when the item in the Gengrid is created as a real + * evas object. event_info is the Gengrid item that was created. The object may be + * deleted at any time, so it is up to the caller to not use the object pointer + * from elm_gengrid_item_object_get() in a way where it may point to + * freed objects. + * + * drag,start,up - Called when the item in the Gengrid has been dragged (not + * scrolled) up. + * + * drag,start,down - Called when the item in the Gengrid has been dragged (not + * scrolled) down. + * + * drag,start,left - Called when the item in the Gengrid has been dragged (not + * scrolled) left. + * + * drag,start,right - Called when the item in the Gengrid has been dragged (not + * scrolled) right. + * + * drag,stop - Called when the item in the Gengrid has stopped being dragged. + * + * drag - Called when the item in the Gengrid is being dragged. + * + * scroll - called when the content has been scrolled (moved). + * + * scroll,drag,start - called when dragging the content has started. + * + * scroll,drag,stop - called when dragging the content has stopped. + * + * + * A item in the Gengrid can have 0 or more text labels (they can be regular text + * or textblock - that's up to the style to determine), 0 or more icons (which + * are simply objects swallowed into the Gengrid item) and 0 or more boolean states + * that can be used for check, radio or other indicators by the edje theme style. + * A item may be one of several styles (Elementary provides 1 by default - + * "default", but this can be extended by system or application custom + * themes/overlays/extensions). + * + * In order to implement the ability to add and delete items on the fly, Gengrid + * implements a class/callback system where the application provides a structure + * with information about that type of item (Gengrid may contain multiple different + * items with different classes, states and styles). Gengrid will call the functions + * in this struct (methods) when a item is "realized" (that is created + * dynamically while scrolling). All objects will simply be deleted when no + * longer needed with evas_object_del(). The Elm_GenGrid_Item_Class structure + * contains the following members: + * + * item_style - This is a constant string and simply defines the name of the + * item style. It must be specified and the default should be "default". + * + * func.label_get - This function is called when an actual item object is + * created. The data parameter is the one passed to elm_gengrid_item_append() + * and related item creation functions. The obj parameter is the Gengrid object and + * the part parameter is the string name of the text part in the edje design that + * is listed as one of the possible labels that can be set. This function must + * return a strdup'()ed string as the caller will free() it when done. + * + * func.icon_get - This function is called when an actual item object is + * created. The data parameter is the one passed to elm_gengrid_item_append() + * and related item creation functions. The obj parameter is the Gengrid object and + * the part parameter is the string name of the icon part in the edje design that + * is listed as one of the possible icons that can be set. This must return NULL + * for no object or a valid object. The object will be deleted by Gengrid on + * shutdown or when the item is unrealized. + * + * func.state_get - This function is called when an actual item object is + * created. The data parameter is the one passed to elm_gengrid_item_append() + * and related item creation functions. The obj parameter is the Gengrid object and + * the part parameter is the string name of th state part in the edje design that + * is listed as one of the possible states that can be set. Return 0 for false + * and 1 for true. Gengrid will emit a signal to the edje object with + * "elm,state,XXX,active" "elm" when true (the default is false), where XXX is + * the name of the part. + * + * func.del - This is called when elm_gengrid_item_del() is called on a + * item or elm_gengrid_clear() is called on the Gengrid. This is intended for + * use when actual Gengrid items are deleted, so any backing data attached to the + * item (e.g. its data parameter on creation) can be deleted. + * + * If the application wants multiple items to be able to be selected, + * elm_gengrid_multi_select_set() can enable this. If the Gengrid is + * single-selection only (the default), then elm_gengrid_select_item_get() + * will return the selected item, if any, or NULL if none is selected. If the + * Gengrid is multi-select then elm_gengrid_selected_items_get() will return a + * list (that is only valid as long as no items are modified (added, deleted, + * selected or unselected). + * + * If a item changes (state of boolean changes, label or icons change), then use + * elm_gengrid_item_update() to have Gengrid update the item with the new + * state. Gengrid will re-realize the item thus call the functions in the + * _Elm_Gengrid_Item_Class for that item. + * + * To programmatically (un)select a item use elm_gengrid_item_selected_set(). + * To get its selected state use elm_gengrid_item_selected_get(). To make a + * item disabled (unable to be selected and appear differently) use + * elm_gengrid_item_disable_set() to set this and + * elm_gengrid_item_disable_get() to get the disabled state. + * + * Cells will only call their selection func and callback when first becoming + * selected. Any further clicks will do nothing, unless you enable always + * select with elm_gengrid_always_select_mode_set(). This means event if + * selected, every click will make the selected callbacks be called. + * elm_gengrid_no_select_mode_set() will turn off the ability to select + * items entirely and they will neither appear selected nor call selected + * callback function. + * + * Remember that you can create new styles and add your own theme augmentation + * per application with elm_theme_extension_add(). If you absolutely must have a + * specific style that overrides any theme the user or system sets up you can use + * elm_theme_overlay_add() to add such a file. + * + * -- + * TODO: + * * Handle non-homogeneous objects too. + */ + +typedef struct _Widget_Data Widget_Data; +typedef struct _Pan Pan; + +#define PRELOAD 1 + +struct _Elm_Gengrid_Item +{ + Evas_Object *base, *spacer; + const Elm_Gengrid_Item_Class *gic; + Ecore_Timer *long_timer; + Widget_Data *wd; + Eina_List *labels, *icons, *states, *icon_objs; + const void *data; + struct + { + Evas_Smart_Cb func; + const void *data; + } func; + + Evas_Coord x, y, dx, dy; + int relcount; + + Eina_Bool want_unrealize : 1; + Eina_Bool realized : 1; + Eina_Bool dragging : 1; + Eina_Bool down : 1; + Eina_Bool delete_me : 1; + Eina_Bool display_only : 1; + Eina_Bool disabled : 1; + Eina_Bool selected : 1; + Eina_Bool hilighted : 1; + Eina_Bool walking : 1; +}; + +struct _Widget_Data +{ + Evas_Object *self, *scr; + Evas_Object *pan_smart; + Pan *pan; + Eina_List *items; + Ecore_Job *calc_job; + Eina_List *selected; + double align_x, align_y; + + Evas_Coord pan_x, pan_y; + Evas_Coord item_width, item_height; /* Each item size */ + Evas_Coord minw, minh; /* Total obj size */ + unsigned int nmax; + + Eina_Bool horizontal : 1; + Eina_Bool on_hold : 1; + Eina_Bool longpressed : 1; + Eina_Bool multi : 1; + Eina_Bool no_select : 1; + Eina_Bool wasselected : 1; + Eina_Bool always_select : 1; +}; + +struct _Pan +{ + Evas_Object_Smart_Clipped_Data __clipped_data; + Widget_Data *wd; +}; + +static const char *widtype = NULL; +static void _item_hilight(Elm_Gengrid_Item *item); +static void _item_unrealize(Elm_Gengrid_Item *item); +static void _item_select(Elm_Gengrid_Item *item); +static void _item_unselect(Elm_Gengrid_Item *item); + +static Evas_Smart_Class _pan_sc = EVAS_SMART_CLASS_INIT_VERSION; + +static void +_theme_hook(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + elm_smart_scroller_object_theme_set(obj, wd->scr, "gengrid", "base", + elm_widget_style_get(obj)); +} + +static void +_del_hook(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + if (wd->calc_job) ecore_job_del(wd->calc_job); + evas_object_del(wd->pan_smart); + wd->pan_smart = NULL; + elm_gengrid_clear(obj); + free(wd); +} + +static void +_mouse_move(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_info) +{ + Elm_Gengrid_Item *item = data; + Evas_Event_Mouse_Move *ev = event_info; + Evas_Coord minw = 0, minh = 0, x, y, dx, dy, adx, ady; + + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) + { + if (!item->wd->on_hold) { + item->wd->on_hold = EINA_TRUE; + _item_unselect(item); + } + } + if ((item->dragging) && (item->down)) + { + if (item->long_timer) + { + ecore_timer_del(item->long_timer); + item->long_timer = NULL; + } + evas_object_smart_callback_call(item->wd->self, "drag", item); + return; + } + if ((!item->down) || (item->wd->longpressed)) + { + if (item->long_timer) + { + ecore_timer_del(item->long_timer); + item->long_timer = NULL; + } + return; + } + if (!item->display_only) + elm_coords_finger_size_adjust(1, &minw, 1, &minh); + evas_object_geometry_get(obj, &x, &y, NULL, NULL); + x = ev->cur.canvas.x - x; + y = ev->cur.canvas.y - y; + dx = x - item->dx; + adx = dx; + if (adx < 0) adx = -dx; + dy = y - item->dy; + ady = dy; + if (ady < 0) ady = -dy; + minw /= 2; + minh /= 2; + if ((adx > minw) || (ady > minh)) + { + item->dragging = 1; + if (item->long_timer) + { + ecore_timer_del(item->long_timer); + item->long_timer = NULL; + } + if (item->wd->wasselected) + _item_unselect(item); + item->wd->wasselected = 0; + if (dy < 0) + { + if (ady > adx) + evas_object_smart_callback_call(item->wd->self, "drag,start,up", + item); + else + { + if (dx < 0) + evas_object_smart_callback_call(item->wd->self, + "drag,start,left", item); + } + } + else + { + if (ady > adx) + evas_object_smart_callback_call(item->wd->self, + "drag,start,down", item); + else + { + if (dx < 0) + evas_object_smart_callback_call(item->wd->self, + "drag,start,left", item); + else + evas_object_smart_callback_call(item->wd->self, + "drag,start,right", item); + } + } + } +} + +static int +_long_press(void *data) +{ + Elm_Gengrid_Item *item = data; + + item->long_timer = NULL; + if ((item->disabled) || (item->dragging)) return 0; + item->wd->longpressed = EINA_TRUE; + evas_object_smart_callback_call(item->wd->self, "longpressed", item); + return 0; +} + +static void +_mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_info) +{ + Elm_Gengrid_Item *item = data; + Evas_Event_Mouse_Down *ev = event_info; + Evas_Coord x, y; + + if (ev->button != 1) return; + item->down = 1; + item->dragging = 0; + evas_object_geometry_get(obj, &x, &y, NULL, NULL); + item->dx = ev->canvas.x - x; + item->dy = ev->canvas.y - y; + item->wd->longpressed = EINA_FALSE; + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) item->wd->on_hold = EINA_TRUE; + else item->wd->on_hold = EINA_FALSE; + item->wd->wasselected = item->selected; + _item_hilight(item); + if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK) + evas_object_smart_callback_call(item->wd->self, "clicked", item); + if (item->long_timer) ecore_timer_del(item->long_timer); + if (item->realized) + item->long_timer = ecore_timer_add(1.0, _long_press, item); + else + item->long_timer = NULL; +} + +static void +_mouse_up(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Elm_Gengrid_Item *item = data; + Evas_Event_Mouse_Up *ev = event_info; + Eina_Bool dragged = EINA_FALSE; + + if (ev->button != 1) return; + item->down = EINA_FALSE; + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) item->wd->on_hold = EINA_TRUE; + else item->wd->on_hold = EINA_FALSE; + if (item->long_timer) + { + ecore_timer_del(item->long_timer); + item->long_timer = NULL; + } + if (item->dragging) + { + item->dragging = EINA_FALSE; + evas_object_smart_callback_call(item->wd->self, "drag,stop", item); + dragged = EINA_TRUE; + } + if (item->wd->on_hold) + { + item->wd->longpressed = EINA_FALSE; + item->wd->on_hold = EINA_FALSE; + return; + } + if (item->wd->longpressed) + { + item->wd->longpressed = EINA_FALSE; + if (!item->wd->wasselected) + _item_unselect(item); + item->wd->wasselected = EINA_FALSE; + return; + } + if (dragged) + { + if (item->want_unrealize) + _item_unrealize(item); + } + if ((item->disabled) || dragged) return; + if (item->wd->multi) + { + if (!item->selected) + { + _item_hilight(item); + _item_select(item); + } + else _item_unselect(item); + } + else + { + if (!item->selected) + { + while (item->wd->selected) _item_unselect(item->wd->selected->data); + } + else + { + const Eina_List *l, *l_next; + Elm_Gengrid_Item *item2; + + EINA_LIST_FOREACH_SAFE(item->wd->selected, l, l_next, item2) + if (item2 != item) _item_unselect(item2); + } + _item_hilight(item); + _item_select(item); + } +} + +static void +_item_hilight(Elm_Gengrid_Item *item) +{ + if ((item->wd->no_select) || (item->delete_me) || (item->hilighted)) return; + edje_object_signal_emit(item->base, "elm,state,selected", "elm"); + item->hilighted = EINA_TRUE; +} + +static void +_item_realize(Elm_Gengrid_Item *item) +{ + char buf[1024]; + + if ((item->realized) || (item->delete_me)) return; + item->base = edje_object_add(evas_object_evas_get(item->wd->self)); + edje_object_scale_set(item->base, elm_widget_scale_get(item->wd->self) * + _elm_config->scale); + evas_object_smart_member_add(item->base, item->wd->pan_smart); + elm_widget_sub_object_add(item->wd->self, item->base); + _elm_theme_object_set(item->wd->self, item->base, "gengrid", "item/default", + elm_widget_style_get(item->wd->self)); + item->spacer = evas_object_rectangle_add(evas_object_evas_get(item->wd->self)); + evas_object_color_set(item->spacer, 0, 0, 0, 0); + elm_widget_sub_object_add(item->wd->self, item->spacer); + evas_object_size_hint_min_set(item->spacer, 2 * _elm_config->scale, 1); + edje_object_part_swallow(item->base, "elm.swallow.pad", item->spacer); + + if (item->gic->func.label_get) + { + const Eina_List *l; + const char *key; + + item->labels = _elm_stringlist_get(edje_object_data_get(item->base, + "labels")); + EINA_LIST_FOREACH(item->labels, l, key) + { + char *s = item->gic->func.label_get(item->data, item->wd->self, + l->data); + if (s) + { + edje_object_part_text_set(item->base, l->data, s); + free(s); + } + } + } + + if (item->gic->func.icon_get) + { + const Eina_List *l; + const char *key; + + item->icons = _elm_stringlist_get(edje_object_data_get(item->base, + "icons")); + EINA_LIST_FOREACH(item->icons, l, key) + { + Evas_Object *ic = item->gic->func.icon_get(item->data, + item->wd->self, + l->data); + if (ic) + { + item->icon_objs = eina_list_append(item->icon_objs, ic); + edje_object_part_swallow(item->base, key, ic); + evas_object_show(ic); + elm_widget_sub_object_add(item->wd->self, ic); + } + } + } + + if (item->gic->func.state_get) + { + const Eina_List *l; + const char *key; + + item->states = _elm_stringlist_get(edje_object_data_get(item->base, + "states")); + EINA_LIST_FOREACH(item->states, l, key) + { + Eina_Bool on = item->gic->func.state_get(item->data, + item->wd->self, l->data); + if (on) + { + snprintf(buf, sizeof(buf), "elm,state,%s,active", key); + edje_object_signal_emit(item->base, buf, "elm"); + } + } + } + + if (!item->wd->item_width && !item->wd->item_height) + { + edje_object_size_min_restricted_calc(item->base, + &item->wd->item_width, &item->wd->item_height, + item->wd->item_width, item->wd->item_height); + elm_coords_finger_size_adjust(1, &item->wd->item_width, + 1, &item->wd->item_height); + } + + evas_object_event_callback_add(item->base, EVAS_CALLBACK_MOUSE_DOWN, + _mouse_down, item); + evas_object_event_callback_add(item->base, EVAS_CALLBACK_MOUSE_UP, + _mouse_up, item); + evas_object_event_callback_add(item->base, EVAS_CALLBACK_MOUSE_MOVE, + _mouse_move, item); + + if (item->selected) + edje_object_signal_emit(item->base, "elm,state,selected", "elm"); + if (item->disabled) + edje_object_signal_emit(item->base, "elm,state,disabled", "elm"); + + evas_object_show(item->base); + item->realized = EINA_TRUE; + item->want_unrealize = EINA_FALSE; +} + +static void +_item_unrealize(Elm_Gengrid_Item *item) +{ + Evas_Object *icon; + + if (!item->realized) return; + if (item->long_timer) + { + ecore_timer_del(item->long_timer); + item->long_timer = NULL; + } + evas_object_del(item->base); + item->base = NULL; + evas_object_del(item->spacer); + item->spacer = NULL; + _elm_stringlist_free(item->labels); + item->labels = NULL; + _elm_stringlist_free(item->icons); + item->icons = NULL; + _elm_stringlist_free(item->states); + + EINA_LIST_FREE(item->icon_objs, icon) + evas_object_del(icon); + + item->states = NULL; + item->realized = EINA_FALSE; + item->want_unrealize = EINA_FALSE; +} + +static void +_item_place(Elm_Gengrid_Item *item, Evas_Coord cx, Evas_Coord cy) +{ + Evas_Coord x, y, ox, oy, cvx, cvy, cvw, cvh; + Evas_Coord tch, tcw, alignw = 0, alignh = 0, vw, vh; + + item->x = cx; + item->y = cy; + evas_object_geometry_get(item->wd->self, &ox, &oy, &vw, &vh); + evas_output_viewport_get(evas_object_evas_get(item->wd->self), + &cvx, &cvy, &cvw, &cvh); + + /* Preload rows/columns at each side of the Gengrid */ + cvx -= PRELOAD * item->wd->item_width; + cvy -= PRELOAD * item->wd->item_height; + cvw += 2 * PRELOAD * item->wd->item_width; + cvh += 2 * PRELOAD * item->wd->item_height; + + tch = ((vh/item->wd->item_height)*item->wd->item_height); + alignh = (vh - tch)*item->wd->align_y; + + tcw = ((vw/item->wd->item_width)*item->wd->item_width); + alignw = (vw - tcw)*item->wd->align_x; + + if (item->wd->horizontal && item->wd->minw < vw) + { + int columns; + + columns = eina_list_count(item->wd->items)/(vh/item->wd->item_height); + if (eina_list_count(item->wd->items) % (vh/item->wd->item_height)) + columns++; + + tcw = item->wd->item_width * columns; + alignw = (vw - tcw)*item->wd->align_x; + } + else if (item->wd->horizontal && item->wd->minw > vw) + alignw = 0; + if (!item->wd->horizontal && item->wd->minh < vh) + { + int rows; + + rows = eina_list_count(item->wd->items)/(vw/item->wd->item_width); + if (eina_list_count(item->wd->items) % (vw/item->wd->item_width)) + rows++; + + tch = item->wd->item_height * rows; + alignh = (vh - tch)*item->wd->align_y; + } + else if (!item->wd->horizontal && item->wd->minh > vh) + alignh = 0; + x = cx * item->wd->item_width - item->wd->pan_x + ox + alignw; + y = cy * item->wd->item_height - item->wd->pan_y + oy + alignh; + + if (ELM_RECTS_INTERSECT(x, y, item->wd->item_width, item->wd->item_height, + cvx, cvy, cvw, cvh)) + { + Eina_Bool was_realized = item->realized; + _item_realize(item); + if (!was_realized) + evas_object_smart_callback_call(item->wd->self, "realized", item); + evas_object_move(item->base, x, y); + evas_object_resize(item->base, item->wd->item_width, + item->wd->item_height); + } + else + _item_unrealize(item); +} + +static Elm_Gengrid_Item * +_item_create(Widget_Data *wd, const Elm_Gengrid_Item_Class *gic, + const void *data, Evas_Smart_Cb func, const void *func_data) +{ + Elm_Gengrid_Item *item; + + item = calloc(1, sizeof(*item)); + if (!item) return NULL; + item->wd = wd; + item->gic = gic; + item->data = data; + item->func.func = func; + item->func.data = func_data; + return item; +} + +static void +_item_del(Elm_Gengrid_Item *item) +{ + if (item->selected) + item->wd->selected = eina_list_remove(item->wd->selected, item); + if (item->realized) _item_unrealize(item); + if ((!item->delete_me) && (item->gic->func.del)) + item->gic->func.del(item->data, item->wd->self); + item->delete_me = EINA_TRUE; + item->wd->items = eina_list_remove(item->wd->items, item); + if (item->long_timer) ecore_timer_del(item->long_timer); + free(item); +} + +static void +_item_select(Elm_Gengrid_Item *item) +{ + if ((item->wd->no_select) || (item->delete_me)) return; + if (item->selected) + { + if (item->wd->always_select) goto call; + return; + } + item->selected = EINA_TRUE; + item->wd->selected = eina_list_append(item->wd->selected, item); +call: + item->walking++; + if (item->func.func) item->func.func((void *)item->func.data, item->wd->self, + item); + if (!item->delete_me) + evas_object_smart_callback_call(item->wd->self, "selected", item); + item->walking--; + if ((item->walking == 0) && (item->delete_me)) + if (item->relcount == 0) _item_del(item); +} + +static void +_item_unselect(Elm_Gengrid_Item *item) +{ + if ((item->delete_me) || (!item->hilighted)) return; + edje_object_signal_emit(item->base, "elm,state,unselected", "elm"); + item->hilighted = EINA_FALSE; + if (item->selected) + { + item->selected = EINA_FALSE; + item->wd->selected = eina_list_remove(item->wd->selected, item); + evas_object_smart_callback_call(item->wd->self, "unselected", item); + } +} + +static void +_calc_job(void *data) +{ + Widget_Data *wd = data; + Evas_Coord minw = 0, minh = 0, nmax = 0, cvw, cvh; + int count; + + evas_object_geometry_get(wd->self, NULL, NULL, &cvw, &cvh); + if (wd->horizontal && wd->item_height) + nmax = cvh / wd->item_height; + else if (wd->item_width) + nmax = cvw / wd->item_width; + + if (nmax) + { + count = eina_list_count(wd->items); + if (wd->horizontal) + { + minw = ceil(count / (float)nmax) * wd->item_width; + minh = nmax * wd->item_height; + } + else + { + minw = nmax * wd->item_width; + minh = ceil(count / (float)nmax) * wd->item_height; + } + } + + if ((minw != wd->minw) || (minh != wd->minh)) + { + wd->minh = minh; + wd->minw = minw; + evas_object_smart_callback_call(wd->pan_smart, "changed", NULL); + } + + wd->nmax = nmax; + wd->calc_job = NULL; + evas_object_smart_changed(wd->pan_smart); +} + +static void +_pan_add(Evas_Object *obj) +{ + Pan *sd; + Evas_Object_Smart_Clipped_Data *cd; + + _pan_sc.add(obj); + cd = evas_object_smart_data_get(obj); + sd = ELM_NEW(Pan); + if (!sd) return; + sd->__clipped_data = *cd; + free(cd); + evas_object_smart_data_set(obj, sd); +} + +static void +_pan_del(Evas_Object *obj) +{ + Pan *sd = evas_object_smart_data_get(obj); + + if (!sd) return; + _pan_sc.del(obj); +} + +static void +_pan_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y) +{ + Pan *sd = evas_object_smart_data_get(obj); + if ((x == sd->wd->pan_x) && (y == sd->wd->pan_y)) return; + sd->wd->pan_x = x; + sd->wd->pan_y = y; + evas_object_smart_changed(obj); +} + +static void +_pan_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y) +{ + Pan *sd = evas_object_smart_data_get(obj); + if (x) *x = sd->wd->pan_x; + if (y) *y = sd->wd->pan_y; +} + +static void +_pan_child_size_get(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h) +{ + Pan *sd = evas_object_smart_data_get(obj); + if (w) *w = sd->wd->minw; + if (h) *h = sd->wd->minh; +} + +static void +_pan_max_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y) +{ + Pan *sd = evas_object_smart_data_get(obj); + Evas_Coord ow, oh; + + if (!sd) return; + evas_object_geometry_get(obj, NULL, NULL, &ow, &oh); + if (x) + *x = (ow < sd->wd->minw) ? sd->wd->minw - ow : 0; + if (y) + *y = (oh < sd->wd->minh) ? sd->wd->minh - oh : 0; +} + +static void +_pan_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h) +{ + Pan *sd = evas_object_smart_data_get(obj); + Evas_Coord ow, oh; + + evas_object_geometry_get(obj, NULL, NULL, &ow, &oh); + if ((ow == w) && (oh == h)) return; + if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job); + sd->wd->calc_job = ecore_job_add(_calc_job, sd->wd); +} + +static void +_pan_calculate(Evas_Object *obj) +{ + Pan *sd = evas_object_smart_data_get(obj); + Evas_Coord cx = 0, cy = 0; + Eina_List *l; + Elm_Gengrid_Item *item; + + if (!sd) return; + if (!sd->wd->nmax) return; + + EINA_LIST_FOREACH(sd->wd->items, l, item) + { + _item_place(item, cx, cy); + if (sd->wd->horizontal) + { + cy = (cy + 1) % sd->wd->nmax; + if (!cy) cx++; + } + else + { + cx = (cx + 1) % sd->wd->nmax; + if (!cx) cy++; + } + } +} + +static void +_pan_move(Evas_Object *obj, Evas_Coord x __UNUSED__, Evas_Coord y __UNUSED__) +{ + Pan *sd = evas_object_smart_data_get(obj); + if (!sd) return; + if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job); + sd->wd->calc_job = ecore_job_add(_calc_job, sd->wd); +} + +static void +_hold_on(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + elm_smart_scroller_hold_set(wd->scr, 1); +} + +static void +_hold_off(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + elm_smart_scroller_hold_set(wd->scr, 0); +} + +static void +_freeze_on(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + elm_smart_scroller_freeze_set(wd->scr, 1); +} + +static void +_freeze_off(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + elm_smart_scroller_freeze_set(wd->scr, 0); +} + +static void +_scr_drag_start(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + evas_object_smart_callback_call(data, "scroll,drag,start", NULL); +} + +static void +_scr_drag_stop(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + evas_object_smart_callback_call(data, "scroll,drag,stop", NULL); +} + +static void +_scr_scroll(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + evas_object_smart_callback_call(data, "scroll", NULL); +} + +/** + * Add a new Gengrid object. + * + * @param parent The parent object. + * @return The new object or NULL if it cannot be created. + * + * @see elm_gengrid_item_size_set() + * @see elm_gengrid_horizontal_set() + * @see elm_gengrid_item_append() + * @see elm_gengrid_item_del() + * @see elm_gengrid_clear() + * + * @ingroup Gengrid + */ +EAPI Evas_Object * +elm_gengrid_add(Evas_Object *parent) +{ + Evas_Object *obj; + Evas *e; + Evas_Coord minw, minh; + Widget_Data *wd; + static Evas_Smart *smart = NULL; + + wd = ELM_NEW(Widget_Data); + e = evas_object_evas_get(parent); + obj = elm_widget_add(e); + ELM_SET_WIDTYPE(widtype, "gengrid"); + elm_widget_type_set(obj, "gengrid"); + elm_widget_sub_object_add(parent, obj); + elm_widget_data_set(obj, wd); + elm_widget_del_hook_set(obj, _del_hook); + elm_widget_theme_hook_set(obj, _theme_hook); + + wd->scr = elm_smart_scroller_add(e); + elm_smart_scroller_widget_set(wd->scr, obj); + elm_smart_scroller_object_theme_set(obj, wd->scr, "gengrid", "base", "default"); + elm_widget_resize_object_set(obj, wd->scr); + + evas_object_smart_callback_add(wd->scr, "drag,start", _scr_drag_start, obj); + evas_object_smart_callback_add(wd->scr, "drag,stop", _scr_drag_stop, obj); + evas_object_smart_callback_add(wd->scr, "scroll", _scr_scroll, obj); + + elm_smart_scroller_bounce_allow_set(wd->scr, 1, 1); + + wd->self = obj; + wd->align_x = 0.5; + wd->align_y = 0.5; + + evas_object_smart_callback_add(obj, "scroll-hold-on", _hold_on, obj); + evas_object_smart_callback_add(obj, "scroll-hold-off", _hold_off, obj); + evas_object_smart_callback_add(obj, "scroll-freeze-on", _freeze_on, obj); + evas_object_smart_callback_add(obj, "scroll-freeze-off", _freeze_off, obj); + + if (!smart) + { + static Evas_Smart_Class sc; + + evas_object_smart_clipped_smart_set(&_pan_sc); + sc = _pan_sc; + sc.name = "elm_gengrid_pan"; + sc.version = EVAS_SMART_CLASS_VERSION; + sc.add = _pan_add; + sc.del = _pan_del; + sc.resize = _pan_resize; + sc.move = _pan_move; + sc.calculate = _pan_calculate; + smart = evas_smart_class_new(&sc); + } + if (smart) + { + wd->pan_smart = evas_object_smart_add(e, smart); + wd->pan = evas_object_smart_data_get(wd->pan_smart); + wd->pan->wd = wd; + } + + elm_smart_scroller_extern_pan_set(wd->scr, wd->pan_smart, + _pan_set, _pan_get, + _pan_max_get, _pan_child_size_get); + + return obj; +} + +/** + * Set the size for the item of the Gengrid. + * + * @param obj The Gengrid object. + * @param w The item's width. + * @param h The item's height; + * + * @see elm_gengrid_item_size_get() + * + * @ingroup Gengrid + */ +EAPI void +elm_gengrid_item_size_set(Evas_Object *obj, Evas_Coord w, Evas_Coord h) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + if (wd->item_width == w && wd->item_height == h) return; + wd->item_width = w; + wd->item_height = h; + if (wd->calc_job) ecore_job_del(wd->calc_job); + wd->calc_job = ecore_job_add(_calc_job, wd); +} + +/** + * Get the size of the item of the Gengrid. + * + * @param obj The Gengrid object. + * @param w Pointer to the item's width. + * @param h Pointer to the item's height. + * + * @see elm_gengrid_item_size_get() + * + * @ingroup Gengrid + */ +EAPI void +elm_gengrid_item_size_get(const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + if (w) *w = wd->item_width; + if (h) *h = wd->item_height; +} + +/** + * Set item's alignment within the scroller. + * + * @param obj The Gengrid object. + * @param align_x The x alignment (0 <= x <= 1). + * @param align_y The y alignment (0 <= y <= 1). + * + * @see elm_gengrid_align_get() + * + * @ingroup Gengrid + */ +EAPI void +elm_gengrid_align_set(Evas_Object *obj, double align_x, double align_y) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + + if (align_x > 1.0) + align_x = 1.0; + else if (align_x < 0.0) + align_x = 0.0; + wd->align_x = align_x; + + if (align_y > 1.0) + align_y = 1.0; + else if (align_y < 0.0) + align_y = 0.0; + wd->align_y = align_y; +} + +/** + * Get the alignenment set for the Gengrid object. + * + * @param obj The Gengrid object. + * @param align_x Pointer to x alignenment. + * @param align_y Pointer to y alignenment. + * + * @see elm_gengrid_align_set() + * + * @ingroup Gengrid + */ +EAPI void +elm_gengrid_align_get(const Evas_Object *obj, double *align_x, double *align_y) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (align_x) *align_x = wd->align_x; + if (align_y) *align_y = wd->align_y; +} + +/** + * Add item to the end of the Gengrid. + * + * @param obj The Gengrid object. + * @param gic The item class for the item. + * @param data The item data. + * @param func Convenience function called when item is selected. + * @param func_data Data passed to @p func above. + * @return A handle to the item added or NULL if not possible. + * + * @see elm_gengrid_item_del() + * + * @ingroup Gengrid + */ +EAPI Elm_Gengrid_Item * +elm_gengrid_item_append(Evas_Object *obj, const Elm_Gengrid_Item_Class *gic, + const void *data, Evas_Smart_Cb func, + const void *func_data) +{ + Elm_Gengrid_Item *item; + ELM_CHECK_WIDTYPE(obj, widtype) NULL; + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return NULL; + + item = _item_create(wd, gic, data, func, func_data); + if (!item) return NULL; + + wd->items = eina_list_append(wd->items, item); + wd->no_select = EINA_FALSE; + + if (wd->calc_job) ecore_job_del(wd->calc_job); + wd->calc_job = ecore_job_add(_calc_job, wd); + + return item; +} + +/** + * Remove a item from the Gengrid. + * + * @param item The item to be removed. + * @return @c EINA_TRUE on success or @c EINA_FALSE otherwise. + * + * @see elm_gengrid_clear() to remove all items of the Gengrid. + * + * @ingroup Gengrid + */ +EAPI void +elm_gengrid_item_del(Elm_Gengrid_Item *item) +{ + if (!item) return; + if ((item->relcount > 0) || (item->walking > 0)) + { + item->delete_me = EINA_TRUE; + if (item->selected) + item->wd->selected = eina_list_remove(item->wd->selected, item); + if (item->gic->func.del) item->gic->func.del(item->data, item->wd->self); + return; + } + + _item_del(item); + + if (item->wd->calc_job) ecore_job_del(item->wd->calc_job); + item->wd->calc_job = ecore_job_add(_calc_job, item->wd); +} + +/** + * Set for what direction the Gengrid will expand. + * + * @param obj The Gengrid object. + * @param setting If @c EINA_TRUE the Gengrid will expand horizontally or + * vertically if @c EINA_FALSE. + * + * @ingroup Gengrid + */ +EAPI void +elm_gengrid_horizontal_set(Evas_Object *obj, Eina_Bool setting) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + if (setting == wd->horizontal) return; + wd->horizontal = setting; + + /* Update the items to conform to the new layout */ + if (wd->calc_job) ecore_job_del(wd->calc_job); + wd->calc_job = ecore_job_add(_calc_job, wd); +} + +/** + * Clear the Gengrid + * + * This clears all items in the Gengrid, leaving it empty. + * + * @param obj The Gengrid object. + * + * @see elm_gengrid_item_del() to remove just one item. + * + * @ingroup Gengrid + */ +EAPI void +elm_gengrid_clear(Evas_Object *obj) +{ + Eina_List *l, *l_next; + Elm_Gengrid_Item *item; + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + + if (wd->calc_job) + { + ecore_job_del(wd->calc_job); + wd->calc_job = NULL; + } + + EINA_LIST_FOREACH_SAFE(wd->items, l, l_next, item) + { + if (item->realized) _item_unrealize(item); + if (item->gic->func.del) item->gic->func.del(item->data, wd->self); + if (item->long_timer) ecore_timer_del(item->long_timer); + free(item); + wd->items = eina_list_remove_list(wd->items, l); + } + + if (wd->selected) + { + eina_list_free(wd->selected); + wd->selected = NULL; + } + + wd->pan_x = 0; + wd->pan_y = 0; + wd->minw = 0; + wd->minh = 0; + evas_object_size_hint_min_set(wd->pan_smart, wd->minw, wd->minh); + evas_object_smart_callback_call(wd->pan_smart, "changed", NULL); +} + +/** + * Get the real evas object of the Gengrid item + * + * This returns the actual evas object used for the specified Gengrid item. + * This may be NULL as it may not be created, and may be deleted at any time + * by Gengrid. Do not modify this object (move, resize, show, hide etc.) as + * Gengrid is controlling it. This function is for querying, emitting custom + * signals or hooking lower level callbacks for events. Do not delete this + * object under any circumstances. + * + * @param item The Gengrid item. + * @return the evas object associated to this item. + * + * @see elm_gengrid_item_data_get() + * + * @ingroup Gengrid + */ +EAPI const Evas_Object * +elm_gengrid_item_object_get(Elm_Gengrid_Item *item) +{ + if (!item) return NULL; + return item->base; +} + +/** + * Returns the data associated to a item + * + * This returns the data value passed on the elm_gengrid_item_append() and + * related item addition calls. + * + * @param item The Gengrid item. + * @return the data associated to this item. + * + * @see elm_gengrid_item_append() + * @see elm_gengrid_item_object_get() + * + * @ingroup Gengrid + */ +EAPI void * +elm_gengrid_item_data_get(Elm_Gengrid_Item *item) +{ + if (!item) return NULL; + return (void *)item->data; +} + +/** + * Get the item's coordinates. + * + * This returns the logical position of the item whithin the Gengrid. + * + * @param item The Gengrid item. + * @param x The x-axis coordinate pointer. + * @param y The y-axis coordinate pointer. + * + * @ingroup Gengrid + */ +EAPI void +elm_gengrid_item_pos_get(const Elm_Gengrid_Item *item, unsigned int *x, unsigned int *y) +{ + if (!item) return; + if (x) *x = item->x; + if (y) *y = item->y; +} + +/** + * Enable or disable multi-select in the Gengrid. + * + * This enables (EINA_TRUE) or disables (EINA_FALSE) multi-select in the Gengrid. + * This allows more than 1 item to be selected. + * + * @param obj The Gengrid object. + * @param multi Multi-select enabled/disabled + * + * @ingroup Gengrid + */ +EAPI void +elm_gengrid_multi_select_set(Evas_Object *obj, Eina_Bool multi) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + wd->multi = multi; +} + +/** + * Get if multi-select in Gengrid is enabled or disabled + * + * @param obj The Gengrid object + * @return Multi-select enable/disable + * (EINA_TRUE = enabled / EINA_FALSE = disabled) + * + * @ingroup Gengrid + */ +EAPI Eina_Bool +elm_gengrid_multi_select_get(const Evas_Object *obj) +{ + ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return EINA_FALSE; + return wd->multi; +} + +/** + * Get the selected item in the Gengrid + * + * This gets the selected item in the Gengrid (if multi-select is enabled only + * the first item in the list is selected - which is not very useful, so see + * elm_gengrid_selected_items_get() for when multi-select is used). + * + * If no item is selected, NULL is returned. + * + * @param obj The Gengrid object. + * @return The selected item, or NULL if none. + * + * @ingroup Gengrid + */ +EAPI Elm_Gengrid_Item * +elm_gengrid_selected_item_get(const Evas_Object *obj) +{ + ELM_CHECK_WIDTYPE(obj, widtype) NULL; + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return NULL; + if (wd->selected) return wd->selected->data; + return NULL; +} + +/** + * Get a list of selected items in the Gengrid. + * + * This returns a list of the selected items. This list pointer is only valid + * so long as no items are selected or unselected (or unselected implictly by + * deletion). The list contains Elm_Gengrid_Item pointers. + * + * @param obj The Gengrid object. + * @return The list of selected items, or NULL if none are selected. + * + * @ingroup Gengrid + */ +EAPI const Eina_List * +elm_gengrid_selected_items_get(const Evas_Object *obj) +{ + ELM_CHECK_WIDTYPE(obj, widtype) NULL; + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return NULL; + return wd->selected; +} + +/** + * Set the selected state of a item. + * + * This sets the selected state of a item. If multi-select is not enabled and + * selected is EINA_TRUE, previously selected items are unselected. + * + * @param item The item + * @param selected The selected state. + * + * @ingroup Gengrid + */ +EAPI void +elm_gengrid_item_selected_set(Elm_Gengrid_Item *item, Eina_Bool selected) +{ + Widget_Data *wd = elm_widget_data_get(item->wd->self); + if (!wd) return; + if (!item || item->delete_me) return; + selected = !!selected; + if (item->selected == selected) return; + + if (selected) + { + if (!wd->multi) + { + while (wd->selected) + _item_unselect(wd->selected->data); + } + _item_hilight(item); + _item_select(item); + } + else + _item_unselect(item); +} + +/** + * Get the selected state of a item. + * + * This gets the selected state of a item (1 selected, 0 not selected). + * + * @param item The item + * @return The selected state + * + * @ingroup Gengrid + */ +EAPI Eina_Bool +elm_gengrid_item_selected_get(const Elm_Gengrid_Item *item) +{ + if (!item) return EINA_FALSE; + return item->selected; +} + +/** + * Sets the disabled state of a item. + * + * A disabled item cannot be selected or unselected. It will also change + * appearance to disabled. This sets the disabled state (1 disabled, 0 not + * disabled). + * + * @param item The item + * @param disabled The disabled state + * + * @ingroup Gengrid + */ +EAPI void +elm_gengrid_item_disabled_set(Elm_Gengrid_Item *item, Eina_Bool disabled) +{ + if (!item) return; + if (item->disabled == disabled) return; + if (item->delete_me) return; + item->disabled = disabled; + if (item->realized) + { + if (item->disabled) + edje_object_signal_emit(item->base, "elm,state,disabled", "elm"); + else + edje_object_signal_emit(item->base, "elm,state,enabled", "elm"); + } +} + +/** + * Get the disabled state of a item. + * + * This gets the disabled state of the given item. + * + * @param item The item + * @return The disabled state + * + * @ingroup Gengrid + */ +EAPI Eina_Bool +elm_gengrid_item_disabled_get(const Elm_Gengrid_Item *item) +{ + if (!item) return EINA_FALSE; + if (item->delete_me) return EINA_FALSE; + return item->disabled; +} + +/** + * Set the always select mode. + * + * Cells will only call their selection func and callback when first becoming + * selected. Any further clicks will do nothing, unless you enable always select + * with elm_gengrid_always_select_mode_set(). This means even if selected, + * every click will make the selected callbacks be called. + * + * @param obj The Gengrid object + * @param always_select The always select mode (EINA_TRUE = on, EINA_FALSE = off) + * + * @ingroup Gengrid + */ +EAPI void +elm_gengrid_always_select_mode_set(Evas_Object *obj, Eina_Bool always_select) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + wd->always_select = always_select; +} + +/** + * Get the always select mode. + * + * @param obj The Gengrid object. + * @return The always select mode (EINA_TRUE = on, EINA_FALSE = off) + * + * @ingroup Gengrid + */ +EAPI Eina_Bool +elm_gengrid_always_select_mode_get(const Evas_Object *obj) +{ + ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return EINA_FALSE; + return wd->always_select; +} + +/** + * Set no select mode. + * + * This will turn off the ability to select items entirely and they will + * neither appear selected nor call selected callback functions. + * + * @param obj The Gengrid object + * @param no_select The no select mode (EINA_TRUE = on, EINA_FALSE = off) + * + * @ingroup Gengrid + */ +EAPI void +elm_gengrid_no_select_mode_set(Evas_Object *obj, Eina_Bool no_select) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + wd->no_select = no_select; +} + +/** + * Gets no select mode. + * + * @param obj The Gengrid object + * @return The no select mode (EINA_TRUE = on, EINA_FALSE = off) + * + * @ingroup Gengrid + */ +EAPI Eina_Bool +elm_gengrid_no_select_mode_get(const Evas_Object *obj) +{ + ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return EINA_FALSE; + return wd->no_select; +} + +/** + * Set bounce mode. + * + * This will enable or disable the scroller bounce mode for the Gengrid. See + * elm_scroller_bounce_set() for details. + * + * @param obj The Gengrid object + * @param h_bounce Allow bounce horizontally + * @param v_bounce Allow bounce vertically + * + * @ingroup Gengrid + */ +EAPI void +elm_gengrid_bounce_set(Evas_Object *obj, Eina_Bool h_bounce, Eina_Bool v_bounce) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + elm_smart_scroller_bounce_allow_set(wd->scr, h_bounce, v_bounce); +} + +/** + * Get the bounce mode + * + * @param obj The Gengrid object + * @param h_bounce Allow bounce horizontally + * @param v_bounce Allow bounce vertically + * + * @ingroup Gengrid + */ +EAPI void +elm_gengrid_bounce_get(const Evas_Object *obj, Eina_Bool *h_bounce, Eina_Bool *v_bounce) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + elm_smart_scroller_bounce_allow_get(wd->scr, h_bounce, v_bounce); +} diff --git a/src/lib/elm_genlist.c b/src/lib/elm_genlist.c index 436c42b..fac0cff 100644 --- a/src/lib/elm_genlist.c +++ b/src/lib/elm_genlist.c @@ -705,7 +705,7 @@ _mouse_up(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void * { Elm_Genlist_Item *it = data; Evas_Event_Mouse_Up *ev = event_info; - Eina_Bool dragged = 0; + Eina_Bool dragged = EINA_FALSE; if (ev->button != 1) return; it->down = 0; @@ -2112,7 +2112,7 @@ elm_genlist_realized_items_get(const Evas_Object *obj) Widget_Data *wd = elm_widget_data_get(obj); Eina_List *list = NULL; Item_Block *itb; - Eina_Bool done = 0; + Eina_Bool done = EINA_FALSE; if (!wd) return NULL; EINA_INLIST_FOREACH(wd->blocks, itb) { diff --git a/src/lib/elm_hover.c b/src/lib/elm_hover.c index 2508aab..9e0d43c 100644 --- a/src/lib/elm_hover.c +++ b/src/lib/elm_hover.c @@ -399,7 +399,7 @@ elm_hover_target_get(Evas_Object *obj) { ELM_CHECK_WIDTYPE(obj, widtype) NULL; Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; + if (!wd) return NULL; return wd->target; } @@ -417,7 +417,7 @@ elm_hover_parent_get(Evas_Object *obj) { ELM_CHECK_WIDTYPE(obj, widtype) NULL; Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; + if (!wd) return NULL; return wd->parent; } diff --git a/src/lib/elm_index.c b/src/lib/elm_index.c index af2c1e2..48c547f 100644 --- a/src/lib/elm_index.c +++ b/src/lib/elm_index.c @@ -9,7 +9,6 @@ */ typedef struct _Widget_Data Widget_Data; -typedef struct _Item Item; struct _Widget_Data { @@ -26,7 +25,7 @@ struct _Widget_Data Eina_Bool down : 1; }; -struct _Item +struct _Elm_Index_Item { Evas_Object *obj; const char *letter; @@ -42,13 +41,13 @@ static void _theme_hook(Evas_Object *obj); static void _sizing_eval(Evas_Object *obj); static void _index_box_auto_fill(Evas_Object *obj, Evas_Object *box, int level); static void _index_box_clear(Evas_Object *obj, Evas_Object *box, int level); -static void _item_free(Item *it); +static void _item_free(Elm_Index_Item *it); static void _del_hook(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); - Item *it; + Elm_Index_Item *it; Eina_List *l, *clear = NULL; if (!wd) return; _index_box_clear(obj, wd->bx[wd->level], wd->level); @@ -138,13 +137,13 @@ _sizing_eval(Evas_Object *obj) evas_object_size_hint_max_set(obj, maxw, maxh); } -static Item * +static Elm_Index_Item * _item_new(Evas_Object *obj, const char *letter, const void *item) { Widget_Data *wd = elm_widget_data_get(obj); - Item *it; + Elm_Index_Item *it; if (!wd) return NULL; - it = calloc(1, sizeof(Item)); + it = calloc(1, sizeof(Elm_Index_Item)); if (!it) return NULL; it->obj = obj; it->letter = eina_stringshare_add(letter); @@ -153,12 +152,12 @@ _item_new(Evas_Object *obj, const char *letter, const void *item) return it; } -static Item * +static Elm_Index_Item * _item_find(Evas_Object *obj, const void *item) { Widget_Data *wd = elm_widget_data_get(obj); Eina_List *l; - Item *it; + Elm_Index_Item *it; if (!wd) return NULL; EINA_LIST_FOREACH(wd->items, l, it) if (it->data == item) return it; @@ -166,7 +165,7 @@ _item_find(Evas_Object *obj, const void *item) } static void -_item_free(Item *it) +_item_free(Elm_Index_Item *it) { Widget_Data *wd = elm_widget_data_get(it->obj); if (!wd) return; @@ -182,7 +181,7 @@ _index_box_auto_fill(Evas_Object *obj, Evas_Object *box, int level) { Widget_Data *wd = elm_widget_data_get(obj); Eina_List *l; - Item *it; + Elm_Index_Item *it; Evas_Coord mw, mh, w, h; int i = 0; if (!wd) return; @@ -235,7 +234,7 @@ _index_box_clear(Evas_Object *obj, Evas_Object *box __UNUSED__, int level) { Widget_Data *wd = elm_widget_data_get(obj); Eina_List *l; - Item *it; + Elm_Index_Item *it; if (!wd) return; if (!wd->level_active[level]) return; EINA_LIST_FOREACH(wd->items, l, it) @@ -264,12 +263,12 @@ static void _sel_eval(Evas_Object *obj, Evas_Coord evx, Evas_Coord evy) { Widget_Data *wd = elm_widget_data_get(obj); - Item *it, *it_closest, *it_last; + Elm_Index_Item *it, *it_closest, *it_last; Eina_List *l; Evas_Coord x, y, w, h, bx, by, bw, bh, xx, yy; double cdv = 0.5; Evas_Coord dist; - Eina_Bool change = 0; + Eina_Bool change = EINA_FALSE; char *label = NULL, *last = NULL; int i; if (!wd) return; @@ -614,7 +613,7 @@ elm_index_item_selected_get(const Evas_Object *obj, int level) ELM_CHECK_WIDTYPE(obj, widtype) NULL; Widget_Data *wd = elm_widget_data_get(obj); Eina_List *l; - Item *it; + Elm_Index_Item *it; if (!wd) return NULL; EINA_LIST_FOREACH(wd->items, l, it) if ((it->selected) && (it->level == level)) return it->data; @@ -635,7 +634,7 @@ elm_index_item_append(Evas_Object *obj, const char *letter, const void *item) { ELM_CHECK_WIDTYPE(obj, widtype); Widget_Data *wd = elm_widget_data_get(obj); - Item *it; + Elm_Index_Item *it; if (!wd) return; it = _item_new(obj, letter, item); if (!it) return; @@ -657,7 +656,7 @@ elm_index_item_prepend(Evas_Object *obj, const char *letter, const void *item) { ELM_CHECK_WIDTYPE(obj, widtype); Widget_Data *wd = elm_widget_data_get(obj); - Item *it; + Elm_Index_Item *it; if (!wd) return; it = _item_new(obj, letter, item); @@ -681,7 +680,7 @@ elm_index_item_append_relative(Evas_Object *obj, const char *letter, const void { ELM_CHECK_WIDTYPE(obj, widtype); Widget_Data *wd = elm_widget_data_get(obj); - Item *it, *it_rel; + Elm_Index_Item *it, *it_rel; if (!wd) return; if (!relative) { @@ -715,7 +714,7 @@ elm_index_item_prepend_relative(Evas_Object *obj, const char *letter, const void { ELM_CHECK_WIDTYPE(obj, widtype); Widget_Data *wd = elm_widget_data_get(obj); - Item *it, *it_rel; + Elm_Index_Item *it, *it_rel; if (!wd) return; if (!relative) { @@ -735,6 +734,65 @@ elm_index_item_prepend_relative(Evas_Object *obj, const char *letter, const void } /** + * Insert a new @p item into the sorted index @p obj in @p letter. + * + * @param obj The index object + * @param letter Letter under which the item should be indexed + * @param item The item to put in the index + * @param cmp_func The function called for the sort of index items. + * @param cmp_data_func The function called for the sort of the data. It will + * be used when cmp_func return 0. It means the index item already exists. + * So, to decide which data item should be pointed by the index item, a function + * to compare them is needed. If this function is not provided, index items + * will be duplicated. If cmp_data_func returns a non-negative value, the + * previous index item data will be replaced by the inserted @p item. So + * if the previous data need to be free, it should be done in this function, + * because the reference will be lost. + * + * @ingroup Index + */ +EAPI void +elm_index_item_sorted_insert(Evas_Object *obj, const char *letter, const void *item, Eina_Compare_Cb cmp_func, Eina_Compare_Cb cmp_data_func) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + Eina_List *lnear; + Elm_Index_Item *it; + int cmp; + + if (!wd) return; + if (!(wd->items)) + { + elm_index_item_append(obj, letter, item); + return; + } + + it = _item_new(obj, letter, item); + if (!it) return; + + lnear = eina_list_search_sorted_near_list(wd->items, cmp_func, it, &cmp); + if (cmp < 0) + wd->items = eina_list_append_relative_list(wd->items, it, lnear); + else if (cmp > 0) + wd->items = eina_list_prepend_relative_list(wd->items, it, lnear); + else + { + /* If cmp_data_func is not provided, append a duplicated item */ + if (!cmp_data_func) + wd->items = eina_list_append_relative_list(wd->items, it, lnear); + else + { + Elm_Index_Item *p_it = eina_list_data_get(lnear); + if (cmp_data_func(p_it->data, it->data) >= 0) + p_it->data = it->data; + _item_free(it); + } + } + + _index_box_clear(obj, wd->bx[wd->level], wd->level); +} + +/** * Remove an item from the index. * * @param obj The index object @@ -747,7 +805,7 @@ elm_index_item_del(Evas_Object *obj, const void *item) { ELM_CHECK_WIDTYPE(obj, widtype); Widget_Data *wd = elm_widget_data_get(obj); - Item *it; + Elm_Index_Item *it; if (!wd) return; it = _item_find(obj, item); if (!it) return; @@ -756,6 +814,24 @@ elm_index_item_del(Evas_Object *obj, const void *item) } /** + * Find an index item using item data. + * + * @param obj The index object + * @param item The item pointed by index item + * @return The index item pointing to @p item + * + * @ingroup Index + */ +EAPI Elm_Index_Item * +elm_index_item_find(Evas_Object *obj, const void *item) +{ + ELM_CHECK_WIDTYPE(obj, widtype) NULL; + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return NULL; + return _item_find(obj, item); +} + +/** * Clears an index of its items. * * @param obj The index object. @@ -767,7 +843,7 @@ elm_index_item_clear(Evas_Object *obj) { ELM_CHECK_WIDTYPE(obj, widtype); Widget_Data *wd = elm_widget_data_get(obj); - Item *it; + Elm_Index_Item *it; Eina_List *l, *clear = NULL; if (!wd) return; _index_box_clear(obj, wd->bx[wd->level], wd->level); @@ -796,3 +872,51 @@ elm_index_item_go(Evas_Object *obj, int level __UNUSED__) _index_box_auto_fill(obj, wd->bx[0], 0); if (wd->level == 1) _index_box_auto_fill(obj, wd->bx[1], 1); } + +/** + * Returns the data associated with the item. + * + * @param it The list item + * @return The data associated with @p it + * + * @ingroup Index + */ +EAPI void * +elm_index_item_data_get(const Elm_Index_Item *it) +{ + if (!it) return NULL; + return (void *)it->data; +} + +/** + * Set the data item from the index item + * + * This set a new data value. + * + * @param it The item + * @param data The new data pointer to set + * + * @ingroup Index + */ +EAPI void +elm_index_item_data_set(Elm_Index_Item *it, const void *data) +{ + if (!it) return; + it->data = data; +} + +/** + * Gets the letter of the item. + * + * @param it The list item + * @return The letter of @p it + * + * @ingroup Index + */ +EAPI const char * +elm_index_item_letter_get(const Elm_Index_Item *it) +{ + if (!it) return NULL; + return it->letter; +} + diff --git a/src/lib/elm_main.c b/src/lib/elm_main.c index e9bc65b..e72bcf6 100644 --- a/src/lib/elm_main.c +++ b/src/lib/elm_main.c @@ -19,6 +19,9 @@ #include #include "elm_priv.h" +static Elm_Version _version = { VMAJ, VMIN, VMIC, VREV }; +EAPI Elm_Version *elm_version = &_version; + /** * @defgroup Start Getting Started * @@ -260,9 +263,6 @@ myapp_CFLAGS = */ static int _elm_signal_exit(void *data, int ev_type, void *ev); -#ifdef HAVE_ELEMENTARY_X -static int _elm_window_property_change(void *data, int ev_type, void *ev); -#endif char *_elm_appname = NULL; const char *_elm_data_dir = NULL; @@ -328,7 +328,7 @@ elm_shutdown(void) } #ifdef ELM_EDBUS -static Eina_Bool _elm_need_e_dbus = 0; +static Eina_Bool _elm_need_e_dbus = EINA_FALSE; #endif EAPI void elm_need_e_dbus(void) @@ -355,7 +355,7 @@ _elm_unneed_e_dbus(void) } #ifdef ELM_EFREET -static Eina_Bool _elm_need_efreet = 0; +static Eina_Bool _elm_need_efreet = EINA_FALSE; #endif EAPI void elm_need_efreet(void) @@ -422,6 +422,7 @@ elm_quicklaunch_init(int argc, char **argv) evas_init(); edje_init(); ecore_evas_init(); // FIXME: check errors + ecore_imf_init(); _elm_module_init(); _elm_exit_handler = ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT, _elm_signal_exit, NULL); @@ -550,6 +551,7 @@ elm_quicklaunch_shutdown(void) _elm_unneed_e_dbus(); _elm_unneed_ethumb(); _elm_module_shutdown(); + ecore_imf_shutdown(); ecore_evas_shutdown(); edje_shutdown(); evas_shutdown(); @@ -1174,9 +1176,24 @@ elm_coords_finger_size_adjust(int times_w, Evas_Coord *w, int times_h, Evas_Coor */ /** + * Get the focus of the object + * + * This gets the focused property of the object. + * + * @param obj The object + * @return 1 if the object is focused, 0 if not. + * @ingroup Focus + */ +EAPI Eina_Bool +elm_object_focus_get(Evas_Object *obj) +{ + return elm_widget_focus_get(obj); +} + +/** * Set the focus to the object * - * This sets the focus target forkeyboard input to be the object indicated. + * This sets the focus target for keyboard input to be the object indicated. * * @param obj The object * @ingroup Focus @@ -1189,9 +1206,10 @@ elm_object_focus(Evas_Object *obj) } /** - * Set the focus to the object + * Remove the focus from the object * - * This sets the focus target forkeyboard input to be the object indicated. + * This removes the focus target for keyboard input from be the object + * indicated. * * @param obj The object * @ingroup Focus diff --git a/src/lib/elm_menu.c b/src/lib/elm_menu.c index 4556e96..85d9ca9 100644 --- a/src/lib/elm_menu.c +++ b/src/lib/elm_menu.c @@ -657,7 +657,7 @@ elm_menu_item_disabled_set(Elm_Menu_Item *item, Eina_Bool disabled) EAPI Eina_Bool elm_menu_item_disabled_get(Elm_Menu_Item *item) { - if (!item) return 0; + if (!item) return EINA_FALSE; return item->disabled; } @@ -733,7 +733,7 @@ elm_menu_item_icon_get(Elm_Menu_Item *item) EAPI Eina_Bool elm_menu_item_is_separator(Elm_Menu_Item *item) { - if (!item) return 0; + if (!item) return EINA_FALSE; return item->separator; } diff --git a/src/lib/elm_panel.c b/src/lib/elm_panel.c index 2c57c4c..ee7b844 100644 --- a/src/lib/elm_panel.c +++ b/src/lib/elm_panel.c @@ -12,7 +12,7 @@ * ELM_PANEL_ORIENT_BOTTOM * ELM_PANEL_ORIENT_LEFT * ELM_PANEL_ORIENT_RIGHT - * NOTE: Only LEFT orientation is implemented. + * NOTE: Only LEFT and RIGHT orientations are implemented. * * THIS WIDGET IS UNDER CONSTRUCTION! */ @@ -187,7 +187,7 @@ elm_panel_add(Evas_Object *parent) * ELM_PANEL_ORIENT_LEFT * ELM_PANEL_ORIENT_RIGHT * - * NOTE: Currently all orientations but LEFT are unimplemented. + * NOTE: Only LEFT and RIGHT orientations are implemented. * * @ingroup Panel */ @@ -205,7 +205,9 @@ elm_panel_orient_set(Evas_Object *obj, Elm_Panel_Orient orient) break; case ELM_PANEL_ORIENT_LEFT: elm_smart_scroller_object_theme_set(obj, wd->scr, "panel", "base", "left"); + break; case ELM_PANEL_ORIENT_RIGHT: + elm_smart_scroller_object_theme_set(obj, wd->scr, "panel", "base", "right"); break; default: break; diff --git a/src/lib/elm_photo.c b/src/lib/elm_photo.c index 5526ee6..8d8b8ab 100644 --- a/src/lib/elm_photo.c +++ b/src/lib/elm_photo.c @@ -132,13 +132,13 @@ elm_photo_add(Evas_Object *parent) EAPI Eina_Bool elm_photo_file_set(Evas_Object *obj, const char *file) { - ELM_CHECK_WIDTYPE(obj, widtype) 0; + ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return 0; + if (!wd) return EINA_FALSE; if (!_els_smart_icon_file_key_set(wd->img, file, NULL)) - return 0; + return EINA_FALSE; _sizing_eval(obj); - return 1; + return EINA_TRUE; } /** diff --git a/src/lib/elm_photocam.c b/src/lib/elm_photocam.c index 426cd8a..183ec05 100644 --- a/src/lib/elm_photocam.c +++ b/src/lib/elm_photocam.c @@ -375,7 +375,7 @@ grid_load(Evas_Object *obj, Grid *g) for (x = 0; x < g->gw; x++) { int tn, xx, yy, ww, hh; - Eina_Bool visible = 0; + Eina_Bool visible = EINA_FALSE; tn = (y * g->gw) + x; xx = g->grid[tn].out.x; diff --git a/src/lib/elm_spinner.c b/src/lib/elm_spinner.c index 564f14a..4ba970b 100644 --- a/src/lib/elm_spinner.c +++ b/src/lib/elm_spinner.c @@ -60,6 +60,7 @@ _del_hook(Evas_Object *obj) if (!wd) return; if (wd->label) eina_stringshare_del(wd->label); if (wd->delay) ecore_timer_del(wd->delay); + if (wd->spin) ecore_timer_del(wd->spin); if (wd->special_values) EINA_LIST_FREE(wd->special_values, sv) { @@ -208,14 +209,14 @@ _value_set(Evas_Object *obj, double delta) new_val = wd->val_max; } - if (new_val == wd->val) return 0; + if (new_val == wd->val) return EINA_FALSE; wd->val = new_val; evas_object_smart_callback_call(obj, "changed", NULL); if (wd->delay) ecore_timer_del(wd->delay); wd->delay = ecore_timer_add(0.2, _delay_change, obj); - return 1; + return EINA_TRUE; } static void diff --git a/src/lib/elm_theme.c b/src/lib/elm_theme.c index ada77f7..3dc0bba 100644 --- a/src/lib/elm_theme.c +++ b/src/lib/elm_theme.c @@ -443,7 +443,7 @@ elm_theme_get(Elm_Theme *th) len = 0; EINA_LIST_FOREACH(th->themes, l, f) { - len + strlen(f); + len += strlen(f); if (l->next) len += 1; } tmp = alloca(len + 1); diff --git a/src/lib/elm_thumb.c b/src/lib/elm_thumb.c index d12fa55..3764898 100644 --- a/src/lib/elm_thumb.c +++ b/src/lib/elm_thumb.c @@ -41,6 +41,11 @@ struct _Widget_Data } children; const char *file; const char *key; + struct + { + const char *file; + const char *key; + } thumb; Ecore_Event_Handler *eeh; int id; Elm_Thumb_Animation_Setting anim_setting; @@ -185,6 +190,8 @@ _finished_thumb(Widget_Data *wd, int id, const char *thumb_path, const char *thu elm_widget_sub_object_add(wd->self, wd->children.view); edje_object_part_swallow(wd->children.frm, "elm.swallow.content", wd->children.view); + eina_stringshare_replace(&(wd->thumb.file), thumb_path); + eina_stringshare_replace(&(wd->thumb.key), thumb_key); edje_object_signal_emit(wd->children.frm, EDJE_SIGNAL_GENERATE_STOP, "elm"); evas_object_smart_callback_call(wd->self, SIG_GENERATE_STOP, NULL); return; @@ -308,7 +315,7 @@ _thumb_hide_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void #endif #ifdef ELM_ETHUMB -static Eina_Bool _elm_need_ethumb = 0; +static Eina_Bool _elm_need_ethumb = EINA_FALSE; static void _on_die_cb(void *, Ethumb_Client *); @@ -484,6 +491,9 @@ elm_thumb_file_set(Evas_Object *obj, const char *file, const char *key) } } + eina_stringshare_replace(&(wd->thumb.file), NULL); + eina_stringshare_replace(&(wd->thumb.key), NULL); + #ifdef HAVE_ELEMENTARY_ETHUMB if ((file_replaced || key_replaced) && evas_object_visible_get(obj)) _thumb_show(wd); @@ -498,6 +508,7 @@ elm_thumb_file_set(Evas_Object *obj, const char *file, const char *key) * @param key Pointer to key. * * @see elm_thumb_file_set() + * @see elm_thumb_path_get() * @see elm_thumb_animate() * * @ingroup Thumb @@ -514,6 +525,32 @@ elm_thumb_file_get(const Evas_Object *obj, const char **file, const char **key) } /** + * Get the path and key to the image or video generated by ethumb. + * + * One just need to make sure that the thumbnail was generated before getting + * its path; otherwise, the path will be NULL. One way to do that is by asking + * for the path when/after the "generate,stop" smart callback is called. + * + * @param obj The thumb object. + * @param file Pointer to thumb path. + * @param key Pointer to thumb key. + * + * @see elm_thumb_file_get() + * + * @ingroup Thumb + */ +EAPI void +elm_thumb_path_get(const Evas_Object *obj, const char **file, const char **key) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (file) + *file = wd->thumb.file; + if (key) + *key = wd->thumb.key; +} + +/** * Set the animation state for the thumb object. If its content is an animated * video, you may start/stop the animation or tell it to play continuously and * looping. diff --git a/src/lib/elm_toolbar.c b/src/lib/elm_toolbar.c index 10173f9..878ffa6 100644 --- a/src/lib/elm_toolbar.c +++ b/src/lib/elm_toolbar.c @@ -659,10 +659,10 @@ elm_toolbar_scrollable_set(Evas_Object *obj, Eina_Bool scrollable) EAPI Eina_Bool elm_toolbar_scrollable_get(Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype); + ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; + if (!wd) return EINA_FALSE; return wd->scrollable; } @@ -696,10 +696,10 @@ elm_toolbar_homogenous_set(Evas_Object *obj, Eina_Bool homogenous) EAPI Eina_Bool elm_toolbar_homogenous_get(Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype); + ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; + if (!wd) return EINA_FALSE; return wd->homogeneous; } @@ -774,6 +774,21 @@ elm_toolbar_item_unselect_all(Evas_Object *obj) } /** + * Unselect the specified toolbar item. + * + * @param item The toolbar item + * + * @ingroup Toolbar + */ +EAPI void +elm_toolbar_item_unselect(Elm_Toolbar_Item *item) +{ + if ((!item) || (!item->selected)) return; + item->selected = EINA_FALSE; + edje_object_signal_emit(item->base, "elm,state,unselected", "elm"); +} + +/** * Set the alignment of the items. * * @param obj The toolbar object @@ -874,8 +889,6 @@ elm_toolbar_item_menu_get(Elm_Toolbar_Item *item) EAPI Eina_List * elm_toolbar_item_get_all(Evas_Object *obj) { - Eina_List *l; - Elm_Toolbar_Item *it; ELM_CHECK_WIDTYPE(obj, widtype) NULL; Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return NULL; @@ -895,7 +908,6 @@ elm_toolbar_item_get_all(Evas_Object *obj) EAPI Elm_Toolbar_Item * elm_toolbar_item_get_first(Evas_Object *obj) { - Eina_List *l; Elm_Toolbar_Item *it; ELM_CHECK_WIDTYPE(obj, widtype) NULL; Widget_Data *wd = elm_widget_data_get(obj); @@ -917,7 +929,7 @@ elm_toolbar_item_get_first(Evas_Object *obj) EAPI Elm_Toolbar_Item * elm_toolbar_item_get_last(Evas_Object *obj) { - Eina_List *l, *last; + Eina_List *last; Elm_Toolbar_Item *it; ELM_CHECK_WIDTYPE(obj, widtype) NULL; Widget_Data *wd = elm_widget_data_get(obj); diff --git a/src/lib/elm_widget.c b/src/lib/elm_widget.c index 684d197..cee9846 100644 --- a/src/lib/elm_widget.c +++ b/src/lib/elm_widget.c @@ -1011,7 +1011,7 @@ elm_widget_drag_lock_y_set(Evas_Object *obj, Eina_Bool lock) EAPI Eina_Bool elm_widget_drag_lock_x_get(Evas_Object *obj) { - API_ENTRY return 0; + API_ENTRY return EINA_FALSE; printf("check %p x lock %i\n", obj, sd->drag_x_locked); return sd->drag_x_locked; } @@ -1019,7 +1019,7 @@ elm_widget_drag_lock_x_get(Evas_Object *obj) EAPI Eina_Bool elm_widget_drag_lock_y_get(Evas_Object *obj) { - API_ENTRY return 0; + API_ENTRY return EINA_FALSE; printf("check %p y lock %i\n", obj, sd->drag_y_locked); return sd->drag_y_locked; } diff --git a/src/lib/els_icon.c b/src/lib/els_icon.c index 371b16b..5cd0988 100644 --- a/src/lib/els_icon.c +++ b/src/lib/els_icon.c @@ -48,15 +48,15 @@ _els_smart_icon_file_key_set(Evas_Object *obj, const char *file, const char *key Smart_Data *sd; sd = evas_object_smart_data_get(obj); - if (!sd) return 0; + if (!sd) return EINA_FALSE; /* smart code here */ if (sd->size != 0) evas_object_image_load_size_set(sd->obj, sd->size, sd->size); evas_object_image_file_set(sd->obj, file, key); if (evas_object_image_load_error_get(sd->obj) != EVAS_LOAD_ERROR_NONE) - return 0; + return EINA_FALSE; _smart_reconfigure(sd); - return 1; + return EINA_TRUE; } Eina_Bool @@ -65,15 +65,15 @@ _els_smart_icon_file_edje_set(Evas_Object *obj, const char *file, const char *pa Smart_Data *sd; sd = evas_object_smart_data_get(obj); - if (!sd) return 0; + if (!sd) return EINA_FALSE; /* smart code here */ if (sd->obj) evas_object_del(sd->obj); sd->obj = edje_object_add(evas_object_evas_get(obj)); evas_object_smart_member_add(sd->obj, obj); if (!edje_object_file_set(sd->obj, file, part)) - return 0; + return EINA_FALSE; _smart_reconfigure(sd); - return 1; + return EINA_TRUE; } void diff --git a/src/lib/els_scroller.c b/src/lib/els_scroller.c index 0af0fd4..b565456 100644 --- a/src/lib/els_scroller.c +++ b/src/lib/els_scroller.c @@ -415,8 +415,8 @@ _smart_do_page(Smart_Data *sd) { if ((sd->pagerel_h == 0.0) && (sd->pagesize_h == 0) && (sd->pagerel_v == 0.0) && (sd->pagesize_v == 0)) - return 0; - return 1; + return EINA_FALSE; + return EINA_TRUE; } static Evas_Coord @@ -570,21 +570,21 @@ can_scroll(Smart_Data *sd, int dir) switch (dir) { case LEFT: - if (px > 0) return 1; + if (px > 0) return EINA_TRUE; break; case RIGHT: - if (px < mx) return 1; + if (px < mx) return EINA_TRUE; break; case UP: - if (py > 0) return 1; + if (py > 0) return EINA_TRUE; break; case DOWN: - if (py < my) return 1; + if (py < my) return EINA_TRUE; break; default: break; } - return 0; + return EINA_FALSE; } static int @@ -1424,7 +1424,7 @@ _smart_event_post_up(void *data, Evas *e) elm_widget_drag_lock_y_set(sd->widget, 0); } } - return 1; + return EINA_TRUE; } static void @@ -1694,7 +1694,7 @@ _smart_event_post_move(void *data, Evas *e) } if (start) _smart_drag_start(sd->smart_obj); } - return 1; + return EINA_TRUE; } static void -- 2.7.4