From: ChunEon P. <he...@na...> - 2011-07-14 01:25:40
|
As you can see, those APIs does not have Evas Object* as their parameters but Elm_Naviframe_Item It can't use our common APIs. ------------------------------------ Let's run together for the best moment! -Regards, Hermet- -----Original Message----- From: "Daniel Juyung Seo"<seo...@gm...> To: enl...@li... Cc: enl...@li... Sent: 11-07-14(목) 09:33:43 Subject: Re: [E-devel] E SVN: hermet IN trunk/elementary: data/images data/themes src/bin src/libHello, I have some comments on following APIs. EAPI void elm_naviframe_item_title_label_set(Elm_Naviframe_Item *it, const char *label) EINA_ARG_NONNULL(1); EAPI const char *elm_naviframe_item_title_label_get(const Elm_Naviframe_Item *it) EINA_ARG_NONNULL(1); EAPI void elm_naviframe_item_subtitle_label_set(Elm_Naviframe_Item *it, const char *label) EINA_ARG_NONNULL(1); EAPI const char *elm_naviframe_item_subtitle_label_get(const Elm_Naviframe_Item *it) EINA_ARG_NONNULL(1); How about using elm_object_text_part_set/get() instead of those specific APIs? Using consts like "title" and "subtitle" limit the scalability of naviframe. Suppose, some time later we need another label such as "subtitle2". Or someone wants more labels for their customized naviframe. Using elm_object_text_part_set/get(), we don't need to add more APIs for that. This is just a recommendation. It's up to you to follow it or not. Thanks. Daniel Juyung Seo (SeoZ) On Wed, Jul 13, 2011 at 1:21 PM, Enlightenment SVN <no-...@en...> wrote: > Log: > elementary/naviframe - added new widget. > > This widget is for application's view manager such as elm_pager > But has optional functions more for users convenience. > Not completed yet for decorations. but basic frame is completed. > > Need to have a review. > > > > Author: hermet > Date: 2011-07-12 21:21:50 -0700 (Tue, 12 Jul 2011) > New Revision: 61313 > Trac: http://trac.enlightenment.org/e/changeset/61313 > > Added: > trunk/elementary/data/images/icon_right_arrow.png trunk/elementary/src/bin/test_naviframe.c trunk/elementary/src/lib/elc_naviframe.c > Modified: > trunk/elementary/data/themes/default.edc trunk/elementary/src/bin/Makefile.am trunk/elementary/src/bin/test.c trunk/elementary/src/lib/Elementary.h.in trunk/elementary/src/lib/Makefile.am > > > Property changes on: trunk/elementary/data/images/icon_right_arrow.png > ___________________________________________________________________ > Added: svn:mime-type > + application/octet-stream > > Modified: trunk/elementary/data/themes/default.edc > =================================================================== > --- trunk/elementary/data/themes/default.edc 2011-07-13 01:41:56 UTC (rev 61312) > +++ trunk/elementary/data/themes/default.edc 2011-07-13 04:21:50 UTC (rev 61313) > @@ -2970,6 +2970,193 @@ > } > } > } > + group { name: "elm/button/base/naviframe/back_btn/default"; > + images { > + image: "bt_base1.png" COMP; > + image: "bt_base2.png" COMP; > + image: "bt_hilight.png" COMP; > + image: "bt_shine.png" COMP; > + image: "bt_glow.png" COMP; > + image: "bt_dis_base.png" COMP; > + image: "bt_dis_hilight.png" COMP; > + image: "icon_left_arrow.png" COMP; > + } > + parts { > + part { name: "button_image"; > + mouse_events: 1; > + description { state: "default" 0.0; > + min: 15 15; > + image { > + normal: "bt_base2.png"; > + border: 7 7 7 7; > + } > + image.middle: SOLID; > + } > + description { state: "clicked" 0.0; > + inherit: "default" 0.0; > + image.normal: "bt_base1.png"; > + } > + description { state: "disabled" 0.0; > + inherit: "default" 0.0; > + image { > + normal: "bt_dis_base.png"; > + border: 4 4 4 4; > + } > + } > + } > + part { name: "prev_image"; > + type: IMAGE; > + scale: 1; > + description { state: "default" 0.0; > + min: 30 30; > + max: 30 30; > + fixed: 1 1; > + align: 0.5 0.5; > + image.normal: "icon_left_arrow.png"; > + } > + } > + part { name: "over1"; > + mouse_events: 0; > + description { state: "default" 0.0; > + rel2.relative: 1.0 0.5; > + image { > + normal: "bt_hilight.png"; > + border: 7 7 7 0; > + } > + } > + description { state: "disabled" 0.0; > + inherit: "default" 0.0; > + image { > + normal: "bt_dis_hilight.png"; > + border: 4 4 4 0; > + } > + } > + } > + part { name: "over2"; > + mouse_events: 1; > + repeat_events: 1; > + ignore_flags: ON_HOLD; > + description { state: "default" 0.0; > + image { > + normal: "bt_shine.png"; > + border: 7 7 7 7; > + } > + } > + description { state: "disabled" 0.0; > + inherit: "default" 0.0; > + visible: 0; > + } > + } > + part { name: "over3"; > + mouse_events: 1; > + repeat_events: 1; > + description { state: "default" 0.0; > + color: 255 255 255 0; > + image { > + normal: "bt_glow.png"; > + border: 12 12 12 12; > + } > + fill.smooth : 0; > + } > + description { state: "clicked" 0.0; > + inherit: "default" 0.0; > + color: 255 255 255 255; > + } > + } > + part { name: "disabler"; > + type: RECT; > + description { state: "default" 0.0; > + color: 0 0 0 0; > + visible: 0; > + } > + description { state: "disabled" 0.0; > + inherit: "default" 0.0; > + visible: 1; > + } > + } > + } > + programs { > + program { > + name: "button_click"; > + signal: "mouse,down,1"; > + source: "over2"; > + action: SIGNAL_EMIT "elm,action,press" ""; > + after: "button_click_anim"; > + } > + program { > + name: "button_click_anim"; > + action: STATE_SET "clicked" 0.0; > + target: "button_image"; > + } > + program { > + name: "button_unclick"; > + signal: "mouse,up,1"; > + source: "over3"; > + action: SIGNAL_EMIT "elm,action,unpress" ""; > + after: "button_unclick_anim"; > + } > + program { > + name: "button_pressed_anim"; > + signal: "elm,anim,activate"; > + source: "elm"; > + action: STATE_SET "clicked" 0.0; > + target: "button_image"; > + target: "over3"; > + after: "button_unpressed_anim"; > + } > + program { > + name: "button_unpressed_anim"; > + action: STATE_SET "default" 0.0; > + transition: DECELERATE 0.5; > + target: "button_image"; > + target: "over3"; > + } > + program { > + name: "button_unclick_anim"; > + action: STATE_SET "default" 0.0; > + target: "button_image"; > + } > + program { > + name: "button_click2"; > + signal: "mouse,down,1"; > + source: "over3"; > + action: STATE_SET "clicked" 0.0; > + target: "over3"; > + } > + program { > + name: "button_unclick2"; > + signal: "mouse,up,1"; > + source: "over3"; > + action: STATE_SET "default" 0.0; > + transition: DECELERATE 0.5; > + target: "over3"; > + } > + program { > + name: "button_unclick3"; > + signal: "mouse,clicked,1"; > + source: "over2"; > + action: SIGNAL_EMIT "elm,action,click" ""; > + } > + program { name: "disable"; > + signal: "elm,state,disabled"; > + source: "elm"; > + action: STATE_SET "disabled" 0.0; > + target: "button_image"; > + target: "over1"; > + target: "over2"; > + target: "disabler"; > + } > + program { name: "enable"; > + signal: "elm,state,enabled"; > + source: "elm"; > + action: STATE_SET "default" 0.0; > + target: "button_image"; > + target: "over1"; > + target: "over2"; > + target: "disabler"; > + } > + } > + } > > /////////////////////////////////////////////////////////////////////////////// > group { name: "elm/toggle/base/default"; > @@ -36691,4 +36878,378 @@ > } > } > } > +///////////////////////////////////////////////////////////////////////// > + group { name:"elm/naviframe/base/default"; > + images { > + image: "frame_1.png" COMP; > + image: "frame_2.png" COMP; > + image: "dia_grad.png" COMP; > + } > + parts { > + part { name: "base0"; > + mouse_events: 0; > + description { state: "default" 0.0; > + image.normal: "dia_grad.png"; > + fill { > + smooth: 0; > + size { > + relative: 0.0 1.0; > + offset: 64 0; > + } > + } > + } > + } > + part { name: "base1"; > + type: IMAGE; > + description { state: "default" 0.0; > + image { > + normal: "frame_2.png"; > + border: 5 5 32 26; > + middle: 0; > + } > + fill.smooth : 0; > + } > + } > + part { name: "over"; > + mouse_events: 0; > + description { state: "default" 0.0; > + rel1.offset: 4 4; > + rel2.offset: 5 5; > + image { > + normal: "frame_1.png"; > + border: 2 2 28 22; > + middle: 0; > + } > + fill.smooth : 0; > + } > + } > + } > + } > + group { name:"elm/naviframe/item/basic/default"; > + parts { > + part { name: "title_clip"; > + type: RECT; > + mouse_events: 0; > + description { state: "default" 0.0; > + min: 1 50; > + align: 0.0 0.0; > + fixed: 0 1; > + rel1 { relative: 0.0 0.0; } > + rel2 { relative: 1.0 0.0; } > + } > + description { state: "hide" 0.0; > + inherit: "default" 0.0; > + min: 0 0; > + max: 0 0; > + fixed: 1 1; > + } > + } > + part { name: "content_clip"; > + type: RECT; > + mouse_events: 0; > + description { state: "default" 0.0; > + rel1.to_y: "title_clip"; > + } > + } > + part { name: "elm.swallow.content"; > + type: SWALLOW; > + scale: 1; > + repeat_events: 0; > + clip_to: "content_clip"; > + description { state: "default" 0.0; > + align: 0.0 0.0; > + rel1.relative: 1.0 1.0; > + rel1.to_y: "title_clip"; > + rel2.relative: 2.0 1.0; > + } > + description { state: "show" 0.0; > + inherit: "default" 0.0; > + rel1.relative: 0.0 1.0; > + rel2.relative: 1.0 1.0; > + } > + description { state: "pushed" 0.0; > + inherit: "default" 0.0; > + rel1.relative: -1.0 1.0; > + rel2.relative: 0.0 1.0; > + } > + description { state: "popped" 0.0; > + inherit: "default" 0.0; > + rel1.relative: 1.0 1.0; > + rel2.relative: 2.0 1.0; > + } > + } > + part { name: "elm.swallow.title"; > + type: SWALLOW; > + scale: 1; > + repeat_events: 0; > + clip_to: "title_clip"; > + description { state: "default" 0.0; > + min: 1 50; > + align: 0.0 0.0; > + fixed: 0 1; > + rel1 { relative: 0.0 0.0; } > + rel2 { relative: 1.0 0.0; } > + } > + description { state: "hide" 0.0; > + inherit: "default" 0.0; > + min: 0 0; > + max: 0 0; > + fixed: 1 1; > + } > + } > + } > + programs { > + program { name: "show"; > + signal: "elm,state,show"; > + source: "elm"; > + action: STATE_SET "show" 0.0; > + target: "elm.swallow.content"; > + transition: DECELERATE 0.5; > + after: "show_finished"; > + } > + program { name: "pushed"; > + signal: "elm,state,pushed"; > + source: "elm"; > + action: STATE_SET "pushed" 0.0; > + target: "elm.swallow.content"; > + transition: DECELERATE 0.5; > + after: "pushed_finished"; > + } > + program { name: "popped"; > + signal: "elm,state,popped"; > + source: "elm"; > + action: STATE_SET "popped" 0.0; > + target: "elm.swallow.content"; > + transition: DECELERATE 0.5; > + after: "popped_finished"; > + } > + program { name: "visible"; > + signal: "elm,state,visible"; > + source: "elm"; > + action: STATE_SET "show" 0.0; > + target: "elm.swallow.content"; > + } > + program { name: "title_show"; > + signal: "elm,state,title,show"; > + source: "elm"; > + action: STATE_SET "default" 0.0; > + target: "title_clip"; > + } > + program { name: "title_hide"; > + signal: "elm,state,title,hide"; > + source: "elm"; > + action: STATE_SET "hide" 0.0; > + target: "title_clip"; > + } > + program { name: "show_finished"; > + action: SIGNAL_EMIT "elm,action,show,finished" ""; > + } > + program { name: "pushed_finished"; > + action: SIGNAL_EMIT "elm,action,pushed,finished" ""; > + } > + program { name: "popped_finished"; > + action: SIGNAL_EMIT "elm,action,popped,finished" ""; > + } > + } > + } > + group { name:"elm/naviframe/item/no_transit/default"; > + parts { > + part { name: "clip"; > + type: RECT; > + mouse_events: 0; > + description { state: "default" 0.0; > + } > + } > + part { name: "elm.swallow.content"; > + type: SWALLOW; > + scale: 1; > + repeat_events: 0; > + clip_to: "clip"; > + description { state: "default" 0.0; > + align: 0.0 0.0; > + rel1.relative: 0.0 1.0; > + rel1.to_y: "elm.swallow.title"; > + rel2.relative: 1.0 1.0; > + visible: 0; > + } > + description { state: "show" 0.0; > + inherit: "default" 0.0; > + visible: 1; > + } > + } > + part { name: "elm.swallow.title"; > + type: SWALLOW; > + scale: 1; > + repeat_events: 0; > + clip_to: "clip"; > + description { state: "default" 0.0; > + min: 1 50; > + align: 0.5 0.0; > + fixed: 0 1; > + rel1 { relative: 0.0 0.0; offset: 4 4; } > + rel2 { relative: 1.0 0.0; offset: -5 -5; } > + visible: 0; > + } > + description { state: "hide" 0.0; > + inherit: "default" 0.0; > + min: 0 0; > + max: 0 0; > + fixed: 1 1; > + } > + } > + } > + programs { > + program { name: "show"; > + signal: "elm,state,show"; > + source: "elm"; > + action: STATE_SET "show" 0.0; > + target: "elm.swallow.content"; > + after: "show_finished"; > + } > + program { name: "pushed"; > + signal: "elm,state,pushed"; > + source: "elm"; > + action: STATE_SET "default" 0.0; > + target: "elm.swallow.content"; > + after: "pushed_finished"; > + } > + program { name: "popped"; > + signal: "elm,state,popped"; > + source: "elm"; > + action: STATE_SET "default" 0.0; > + target: "elm.swallow.content"; > + after: "popped_finished"; > + } > + program { name: "visible"; > + signal: "elm,state,visible"; > + source: "elm"; > + action: STATE_SET "show" 0.0; > + target: "elm.swallow.content"; > + } > + program { name: "title_show"; > + signal: "elm,state,title,show"; > + source: "elm"; > + action: STATE_SET "default" 0.0; > + target: "elm.swallow.title"; > + } > + program { name: "title_hide"; > + signal: "elm,state,title,hide"; > + source: "elm"; > + action: STATE_SET "hide" 0.0; > + target: "elm.swallow.title"; > + } > + program { name: "show_finished"; > + action: SIGNAL_EMIT "elm,action,show,finished" ""; > + } > + program { name: "pushed_finished"; > + action: SIGNAL_EMIT "elm,action,pushed,finished" ""; > + } > + program { name: "popped_finished"; > + action: SIGNAL_EMIT "elm,action,popped,finished" ""; > + } > + } > + } > + group { name:"elm/naviframe/title/default"; > + images { > + image: "flip_base.png" COMP; > + image: "flip_shad.png" COMP; > + } > + parts { > + part { name: "base"; > + type: IMAGE; > + description { > + image.normal: "flip_base.png"; > + } > + } > + part { name: "elm.swallow.prev_btn"; > + type: SWALLOW; > + scale: 1; > + description { state: "default" 0.0; > + min: 80 40; > + max: 80 40; > + align: 0 0; > + fixed: 1 1; > + rel1.offset: 5 5; > + rel2.offset: -1 -6; > + } > + } > + part { name: "elm.swallow.next_btn"; > + type: SWALLOW; > + scale: 1; > + description { state: "default" 0.0; > + min: 80 40; > + max: 80 40; > + align: 1 0; > + fixed: 1 1; > + rel1.offset: 0 5; > + rel2.offset: -6 -6; > + } > + } > + part { name: "elm.swallow.icon"; > + type: SWALLOW; > + scale: 1; > + description { state: "default" 0.0; > + min: 40 40; > + max: 40 40; > + align: 1 0.5; > + rel1.to: "elm.text.title"; > + rel1.relative: 0 0; > + rel2.to: "elm.text.title"; > + rel2.relative: 0 1; > + } > + } > + part { name: "elm.text.title"; > + type: TEXT; > + scale: 1; > + repeat_events: 1; > + description { state: "default" 0.0; > + text { font: "Sans,Edje-Vera"; > + size: 10; > + min: 0 0; > + max: 1 0; > + align: 0.5 0.5; > + } > + color: 0 0 0 255; > + align: 0.5 0.5; > + } > + } > + part { name: "elm.text.subtitle"; > + type: TEXT; > + scale: 1; > + repeat_events: 1; > + description { state: "default" 0.0; > + text { font: "Sans,Edje-Vera"; > + size: 8; > + min: 0 0; > + max: 1 0; > + align: 0.5 1; > + } > + rel1.to_y: "elm.text.title"; > + rel1.relative: 0 1; > + color: 50 50 50 255; > + align: 0.5 0; > + } > + } > + part { name: "shade"; > + type: IMAGE; > + mouse_events: 0; > + description { > + align: 0.5 1; > + rel1.to_y: "elm.text.title"; > + rel1.relative: 0 1; > + rel1.offset: 0 0; > + rel2.offset: -1 5; > + image.normal: "flip_shad.png"; > + } > + } > + } > + programs { > + program { > + name: "title_clicked"; > + signal: "mouse,clicked,1"; > + source: "base"; > + action: SIGNAL_EMIT "elm,action,clicked" "elm"; > + } > + } > + } > } > > Modified: trunk/elementary/src/bin/Makefile.am > =================================================================== > --- trunk/elementary/src/bin/Makefile.am 2011-07-13 01:41:56 UTC (rev 61312) > +++ trunk/elementary/src/bin/Makefile.am 2011-07-13 04:21:50 UTC (rev 61313) > @@ -81,6 +81,7 @@ > test_map.c \ > test_menu.c \ > test_multi.c \ > +test_naviframe.c \ > test_notify.c \ > test_pager.c \ > test_panel.c \ > > Modified: trunk/elementary/src/bin/test.c > =================================================================== > --- trunk/elementary/src/bin/test.c 2011-07-13 01:41:56 UTC (rev 61312) > +++ trunk/elementary/src/bin/test.c 2011-07-13 04:21:50 UTC (rev 61313) > @@ -139,6 +139,7 @@ > void test_glview_simple(void *data, Evas_Object *obj, void *event_info); > void test_glview(void *data, Evas_Object *obj, void *event_info); > void test_3d(void *data, Evas_Object *obj, void *event_info); > +void test_naviframe(void *data, Evas_Object *obj, void *event_info); > #ifdef HAVE_EIO > void test_eio(void *data, Evas_Object *obj, void *event_info); > #endif > @@ -416,6 +417,7 @@ > ADD_TEST("3D", test_3d); > ADD_TEST("Genscroller", test_genscroller); > ADD_TEST("Gesture Layer", test_gesture_layer); > + ADD_TEST("Naviframe", test_naviframe); > #undef ADD_TEST > > if (autorun) > > Modified: trunk/elementary/src/lib/Elementary.h.in > =================================================================== > --- trunk/elementary/src/lib/Elementary.h.in 2011-07-13 01:41:56 UTC (rev 61312) > +++ trunk/elementary/src/lib/Elementary.h.in 2011-07-13 04:21:50 UTC (rev 61313) > @@ -7852,6 +7852,37 @@ > EAPI Evas_Object *elm_player_add(Evas_Object *parent); > EAPI void elm_player_video_set(Evas_Object *player, Evas_Object *video); > > + /* naviframe */ > + typedef struct _Elm_Naviframe_Item Elm_Naviframe_Item; > + > + typedef enum > + { > + ELM_NAVIFRAME_PREV_BUTTON, > + ELM_NAVIFRAME_NEXT_BUTTON > + } Elm_Naviframe_Button_Type; > + > + EAPI Evas_Object *elm_naviframe_add(Evas_Object *parent) EINA_ARG_NONNULL(1); > + EAPI Elm_Naviframe_Item *elm_naviframe_item_push(Evas_Object *obj, const char *title_label, Evas_Object *prev_btn, Evas_Object *next_btn, Evas_Object *content, const char *item_style) EINA_ARG_NONNULL(1, 5); > + EAPI Evas_Object *elm_naviframe_item_pop(Evas_Object *obj) EINA_ARG_NONNULL(1); > + EAPI void elm_naviframe_content_preserve_on_pop_set(Evas_Object *obj, Eina_Bool preserve) EINA_ARG_NONNULL(1); > + EAPI Eina_Bool elm_naviframe_content_preserve_on_pop_get(const Evas_Object *obj) EINA_ARG_NONNULL(1); > + EAPI void elm_naviframe_item_content_set(Elm_Naviframe_Item *item, Evas_Object *content) EINA_ARG_NONNULL(1); > + EAPI Evas_Object *elm_naviframe_item_content_get(const Elm_Naviframe_Item *it) EINA_ARG_NONNULL(1); > + EAPI void elm_naviframe_item_title_label_set(Elm_Naviframe_Item *it, const char *label) EINA_ARG_NONNULL(1); > + EAPI const char *elm_naviframe_item_title_label_get(const Elm_Naviframe_Item *it) EINA_ARG_NONNULL(1); > + EAPI void elm_naviframe_item_subtitle_label_set(Elm_Naviframe_Item *it, const char *label) EINA_ARG_NONNULL(1); > + EAPI const char *elm_naviframe_item_subtitle_label_get(const Elm_Naviframe_Item *it) EINA_ARG_NONNULL(1); > + EAPI Elm_Naviframe_Item *elm_naviframe_top_item_get(const Evas_Object *obj) EINA_ARG_NONNULL(1); > + EAPI Elm_Naviframe_Item *elm_naviframe_bottom_item_get(const Evas_Object *obj) EINA_ARG_NONNULL(1); > + EAPI void elm_naviframe_item_button_set(Elm_Naviframe_Item *it, Evas_Object *btn, Elm_Naviframe_Button_Type btn_type) EINA_ARG_NONNULL(1); > + EAPI Evas_Object *elm_naviframe_item_button_get(const Elm_Naviframe_Item *it, Elm_Naviframe_Button_Type btn_type) EINA_ARG_NONNULL(1); > + EAPI void elm_naviframe_item_icon_set(Elm_Naviframe_Item *it, Evas_Object *icon) EINA_ARG_NONNULL(1); > + EAPI Evas_Object *elm_naviframe_item_icon_get(const Elm_Naviframe_Item *it) EINA_ARG_NONNULL(1); > + EAPI void elm_naviframe_item_style_set(Elm_Naviframe_Item *it, const char *item_style) EINA_ARG_NONNULL(1); > + EAPI const char *elm_naviframe_item_style_get(const Elm_Naviframe_Item *it) EINA_ARG_NONNULL(1); > + EAPI void elm_naviframe_item_title_visible_set(Elm_Naviframe_Item *it, Eina_Bool visible) EINA_ARG_NONNULL(1); > + EAPI Eina_Bool elm_naviframe_item_title_visible_get(const Elm_Naviframe_Item *it) EINA_ARG_NONNULL(1); > + > #ifdef __cplusplus > } > #endif > > Modified: trunk/elementary/src/lib/Makefile.am > =================================================================== > --- trunk/elementary/src/lib/Makefile.am 2011-07-13 01:41:56 UTC (rev 61312) > +++ trunk/elementary/src/lib/Makefile.am 2011-07-13 04:21:50 UTC (rev 61313) > @@ -49,6 +49,7 @@ > elc_fileselector.c \ > elc_fileselector_entry.c \ > elc_hoversel.c \ > +elc_naviframe.c \ > elc_player.c \ > elc_scrolled_entry.c \ > elm_actionslider.c \ > > > ------------------------------------------------------------------------------ > AppSumo Presents a FREE Video for the SourceForge Community by Eric > Ries, the creator of the Lean Startup Methodology on "Lean Startup > Secrets Revealed." This video shows you how to validate your ideas, > optimize your ideas and identify your business strategy. > http://p.sf.net/sfu/appsumosfdev2dev > _______________________________________________ > enlightenment-svn mailing list > enl...@li... > https://lists.sourceforge.net/lists/listinfo/enlightenment-svn > ------------------------------------------------------------------------------ AppSumo Presents a FREE Video for the SourceForge Community by Eric Ries, the creator of the Lean Startup Methodology on "Lean Startup Secrets Revealed." This video shows you how to validate your ideas, optimize your ideas and identify your business strategy. http://p.sf.net/sfu/appsumosfdev2dev _______________________________________________ enlightenment-devel mailing list enl...@li... https://lists.sourceforge.net/lists/listinfo/enlightenment-devel |