Dear, 
I added a new widget naviframe. 
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. 
Do someone review it's APIs and functionalities?
------------------------------------
Let's run together for the best moment!
 -Regards, Hermet-
 
-----Original Message-----
From: "Enlightenment SVN"<[email protected]> 
To: [email protected]
Cc: 
Sent: 11-07-13(수) 13:21:50
Subject: E SVN: hermet IN trunk/elementary: data/images data/themes src/bin 
src/libLog:
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
[email protected]
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to