From 68475cb28fe5c811a8d8a1a244b8d3be92dec514 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Mon, 1 Jan 2018 21:41:14 +0000 Subject: [PATCH 1/9] examples: First pass add of examples info. Infrastructure not in place yet, so example cannot be selected --- data/extra/examples/examples.edc | 23 +++ data/extra/examples/images/hellogui.png | Bin 0 -> 2642 bytes data/extra/examples/meson.build | 20 +++ data/meson.build | 1 + src/bin/screens/edi_welcome.c | 220 ++++++++++++++++++++---- 5 files changed, 231 insertions(+), 33 deletions(-) create mode 100644 data/extra/examples/examples.edc create mode 100644 data/extra/examples/images/hellogui.png create mode 100644 data/extra/examples/meson.build diff --git a/data/extra/examples/examples.edc b/data/extra/examples/examples.edc new file mode 100644 index 0000000..2dcdb22 --- /dev/null +++ b/data/extra/examples/examples.edc @@ -0,0 +1,23 @@ +data { + item: "hellogui.title" "C EFL Beta Hello World"; + item: "hellogui.directory" "tutorials/c/hellogui/"; + item: "hellogui.description" + "Hello World using the EFL Beta APIs"; +} + +collections { + group { + name: "hellogui"; + max: 128 128; + + parts { + part { name: "icon"; + description { state: "default" 0.0; + max: 128 128; + images.image: "hellogui.png" COMP; + image.normal: "hellogui.png"; + } + } + } + } +} diff --git a/data/extra/examples/images/hellogui.png b/data/extra/examples/images/hellogui.png new file mode 100644 index 0000000000000000000000000000000000000000..6ad779c919327e2b94732685fe4b8c7eec1ed63f GIT binary patch literal 2642 zcmV-Y3a#~tP)JkKW}%W{iF46q{>c^Y*}fl#%YQ}aC@xgX4aSuVzLvnBrG8RM%L7^DSt{Y)l zR&9BACGW1*+WE6HJYz5m>{Dn_xf!bJr3FHf(Moo>YeJOTYTq` z2B?jNExvPTK+du(v(m|BRZyYScLD(*s3=PKgAYFVy{2i0R##W|sH)o4wybXh0)ap_ z6bj9Ec6N?`{`u#BHVoqt;1@!ufVRHCmwA8?q7w)K;WyrRV}E~t|6fz7)ZWc{fbB#q z7MojGSUB;`H{bjVcm%9kmZcS+Q{n-IY9|1M{eJ(>UAuODnM@}4n5Kzg7+99oaFBW2 z5JDh?Kv5Ku$>iQ$yLNr)_xpd7&*$TSDTFYJt0UI~3RO=S=mNUme*5h|q*AHh8HRyj z814^L@R+93w+pqNPf-*UMIjc8{q5q#i+=)^fh_RIxvtm)6zsY`1a#}VKC0_FnzrUK zx~_BNi7t-z*kRxwOIiN;FblxQ$OwlH9Rgr{e4L4iiK^)x9UWdh|CXZbI?-s9Xfz5y zI-Mq+PP@;S&*!l$3tiVofxiGbK*tWu29$Qh{Mbh50=iXIeJYpB;dp>y7%1r!?`mnD zyfep>cjkCkOQWPy2q8Fp_^^AU!-o&Mu2?C(_@2&j?AS5hd+$A*>TdlpG&EE(eIv)g zg9ix)gJtQ1gM+;G+G|bUH2T_O0K+gipykl+t(KI6p`1x--*Y4qiIVi4J9nZeN?Ce;e?POcvna~iPb-ST zGtWH3sZ*yodh{sw?%m_{*I(!Q_3P~2yO%3huJHc*@AJhMU+}^UFA$AJ85 zA;@GhM59qY{q$4(em}>LA19GWkVqtW{`u!wSXdws2ypV`NpxN3(xpp`j*imP)5FZn z45Oo?y!6sbT)upnmtTIFYuBz34u|RM>*M_S^W^jSveNHV%h_z!O>=4sRaM>RGfk6B zCeuM_lin@(>pj3VfN7fK^Lb3u#57HW5L`|yvyyzsYT;N(KIF=Bn(x2=o_IX&mV|gb z&h+$j#q`O^NrVvYeNEFu(=^VWJvb+ z{g%GIK8A*dxNzYDmSyqktFQ9$#~(8?GJ>XQ3=9kq3WW%TLg>0)lGkEA78e&$RTWLs z&@>HIRasnIEO|ahL(2P9YaUPt9HPhzI@SkY04*Bjj|+GCEw)$u9f97z8v$Irc##7K z4gfGUHRT4QO6luM)Q%lHIC0_xOG`_xkYi(GJpJ_3((uTj&dyGThlhFd%{Tez zqmM|Z)2OOSZ*MQDREmy{4!6qb?d>I#$yTP$-0|s)WN~ z(&;pzP{{pG*L4Dc0DixpR4PSJPYeZ{qfm^^l zkODF_4KOk?QqchIMo|<}sT5sZ+o!`F3tTP8RMd6-XsC0N`0A^#SYBS7#MK1E&i_RjF@FvPWx5T zBDJcZY6cKaM?%s%1sy9^>oq+<24Zh$#siQZ;2pJeEH;1>AbfyN8o)aWI{H{!)ZkV} za$V3Cv)%*Tzbn;S3wA@p(b53*siBb^j@~L79gePw^nm&_ zs!_24ii3oV0Zp=j7*Mw-EUKhSTBG8-6|x`TF|GCk8os%tlvZK@)QJI-=BN+@T%-qh zOsgIMHHIRj0qRqyBewCLunfY@QKuPNhHP$bF|rxzF|9O1EB4gt-CR=224cX*=7eQ4 z)H^&|8!A1ZKCQNb+@&cp1~f;F7*Mt(#YvQGA+i)|&i}7qILbiguV%Wk# zpeAWxQeJ?J0iM&=7$ET;ITYbBUJOOZRS_-F>dH8|Hne>-HYF)NpgFt>!ZHRliCi1{ ze~284*hJbo6d?^zAFtjIkZck%2zyK`L0I;LJ)qT|urxr6Y|sEMG6rlhvKi_za&hh! z2H>k|m`F)TdG1WDM|_w#EQSOSC=|Aw8fzp1r8;#myf_+S(JAv_$JY zVd(+&@gfL=tb&@xvnff*<{+D)n@2@m8~(3}Uw{3zC%KW>RQ>1Ol@fRF-rdHmYWc-RIoAd2{*n>C=<*^Yc@{HQ+zMB9OE!O9jgI6Mh2Q2z|gWfnNzBe*Vro?>sj$ zGSWLZIJhGgi*-6b;)S?g8KhleHhN7emC|nCzMYwvm`I#Ie}2ZYtXbeX@NeM1KoWT9 z>Rx=Y5JJJ;cC{B6#5TkL(9ha-tlMKV;P#l z!@%A-dlh@n$TYTwE39ejQuT%GLUk0u-ex8n=a2@djbi}kP-|-3=$kM?b_i->H7Mx+06gO-ut9^Y8~^|S07*qoM6N<$f>~ht ATmS$7 literal 0 HcmV?d00001 diff --git a/data/extra/examples/meson.build b/data/extra/examples/meson.build new file mode 100644 index 0000000..2431771 --- /dev/null +++ b/data/extra/examples/meson.build @@ -0,0 +1,20 @@ +tar = find_program('tar') +edje_cc = find_program('edje_cc') + +cmd = [ edje_cc, + '-id', join_paths(meson.source_root(), 'data' , 'extra', 'examples', 'images'), + '@INPUT@', '@OUTPUT@' + ] + +examples_dir = join_paths(get_option('datadir'), 'edi', 'examples') +custom_target('examples_meta', + input : 'examples.edc', + output : 'examples.edj', + command : cmd, + install_dir: examples_dir, + install: true, +) + +out = join_paths(get_option('prefix'), examples_dir, 'examples.edj') +meson.add_install_script('../../../scripts/world_read.sh', out) + diff --git a/data/meson.build b/data/meson.build index 3b2b0d8..881b3c2 100644 --- a/data/meson.build +++ b/data/meson.build @@ -1,4 +1,5 @@ subdir('desktop') subdir('images') subdir('extra/templates') +subdir('extra/examples') subdir('themes') diff --git a/src/bin/screens/edi_welcome.c b/src/bin/screens/edi_welcome.c index 869267f..93b4cc3 100644 --- a/src/bin/screens/edi_welcome.c +++ b/src/bin/screens/edi_welcome.c @@ -22,6 +22,15 @@ typedef struct _Edi_Template char *desc; } Edi_Template; +typedef struct _Edi_Example +{ + char *edje_id; + char *edje_path; + char *example_path; + char *title; + char *desc; +} Edi_Example; + typedef struct _Edi_Welcome_Data { Evas_Object *pb; Evas_Object *button; @@ -31,6 +40,7 @@ typedef struct _Edi_Welcome_Data { } Edi_Welcome_Data; static Eina_List *_available_templates = NULL; +static Eina_List *_available_examples = NULL; static Evas_Object *_welcome_window, *_welcome_naviframe; static Evas_Object *_edi_new_popup; @@ -214,37 +224,6 @@ _edi_welcome_project_new_input_row_add(const char *text, const char *placeholder _create_inputs[row] = input; } -static void -_edi_template_free(Edi_Template *t) -{ - if (t) - { - free(t->title); - free(t->desc); - free(t->edje_path); - free(t->skeleton_path); - free(t); - } -} - -static void -_edi_welcome_project_new_create_done_cb(const char *path, Eina_Bool success) -{ - Edi_Template *template; - - if (!success) - { - ERR("Unable to create project at path %s", path); - - return; - } - - EINA_LIST_FREE(_available_templates, template) - _edi_template_free(template); - - _edi_welcome_project_open(path, EINA_TRUE); -} - Edi_Template * _edi_template_add(const char *directory, const char *file) { @@ -263,6 +242,19 @@ _edi_template_add(const char *directory, const char *file) return t; } +static void +_edi_template_free(Edi_Template *t) +{ + if (!t) + return; + + free(t->title); + free(t->desc); + free(t->edje_path); + free(t->skeleton_path); + free(t); +} + static void _edi_templates_discover(const char *directory) { @@ -286,6 +278,82 @@ _edi_templates_discover(const char *directory) eina_list_free(files); } +Edi_Example * +_edi_example_add(const char *examples, const char *group) +{ + Edi_Example *e; + + e = malloc(sizeof(Edi_Example)); + + printf("EXITS %s, %s\n", edje_file_data_get(examples, "title"), + edje_file_data_get(examples, eina_slstr_printf("%s.title", group))); + e->title = edje_file_data_get(examples, eina_slstr_printf("%s.title", group)); + e->desc = edje_file_data_get(examples, eina_slstr_printf("%s.description", group)); + e->example_path = edje_file_data_get(examples, eina_slstr_printf("%s.directory", group)); + e->edje_path = strdup(examples); + e->edje_id = strdup(group); + + return e; +} + +static void +_edi_example_free(Edi_Example *e) +{ + if (!e) + return; + + free(e->title); + free(e->desc); + free(e->edje_path); + free(e->edje_id); + free(e->example_path); + free(e); +} + +static void +_edi_examples_discover(const char *directory) +{ + Eina_List *collection, *list; + char path[PATH_MAX]; + const char *groupname; + + eina_file_path_join(path, sizeof(path), directory, "examples.edj"); + if (!ecore_file_exists(path)) + return; + + collection = edje_file_collection_list(path); + EINA_LIST_FOREACH(collection, list, groupname) + { + printf("Found group %s\n", groupname); + Edi_Example *example = _edi_example_add(path, groupname); + if (example) + _available_examples = eina_list_append(_available_examples, example); + } + + edje_mmap_collection_list_free(collection); +} + +static void +_edi_welcome_project_new_create_done_cb(const char *path, Eina_Bool success) +{ + Edi_Template *template; + Edi_Example *example; + + if (!success) + { + ERR("Unable to create project at path %s", path); + + return; + } + + EINA_LIST_FREE(_available_templates, template) + _edi_template_free(template); + EINA_LIST_FREE(_available_examples, example) + _edi_example_free(example); + + _edi_welcome_project_open(path, EINA_TRUE); +} + static void _edi_welcome_project_new_create_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { @@ -449,6 +517,66 @@ _content_get(void *data, Evas_Object *obj, const char *source) return frame; } +static char * +_header_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *source EINA_UNUSED) +{ + return strdup((char *)data); +} + +static void +_header_del(void *data, Evas_Object *obj EINA_UNUSED) +{ + free(data); +} + +static Evas_Object * +_example_content_get(void *data, Evas_Object *obj, const char *source) +{ + Evas_Object *frame, *table, *image, *entry; + Edi_Example *example = (Edi_Example *) data; + Eina_Slstr *content; + + if (strcmp(source, "elm.swallow.content")) + return NULL; + + frame = elm_frame_add(obj); + elm_object_style_set(frame, "pad_medium"); + evas_object_size_hint_weight_set(frame, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(frame, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(frame); + + table = elm_table_add(obj); + evas_object_size_hint_weight_set(table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_padding_set(table, 5, 5); + elm_table_homogeneous_set(table, EINA_TRUE); + evas_object_show(table); + elm_object_content_set(frame, table); + + image = elm_image_add(table); + evas_object_size_hint_weight_set(image, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(image, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_min_set(image, 96 * elm_config_scale_get(), 96 * elm_config_scale_get()); + elm_image_file_set(image, example->edje_path, example->edje_id); + evas_object_show(image); + elm_table_pack(table, image, 0, 0, 1, 1); + + entry = elm_entry_add(table); + evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_entry_editable_set(entry, EINA_FALSE); + elm_entry_scrollable_set(entry, EINA_FALSE); + elm_entry_single_line_set(entry, EINA_FALSE); + elm_entry_line_wrap_set(entry, ELM_WRAP_WORD); + elm_table_pack(table, entry, 1, 0, 3, 1); + evas_object_show(entry); + + content = eina_slstr_printf("%s

%s", example->title, example->desc); + elm_object_text_set(entry, content); + + return frame; +} + static void _edi_welcome_project_new_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { @@ -457,7 +585,8 @@ _edi_welcome_project_new_cb(void *data, Evas_Object *obj EINA_UNUSED, void *even Evas_Object *table, *list, *rect, *hbox; Elm_Object_Item *item; Edi_Template *template; - Elm_Genlist_Item_Class *itc; + Edi_Example *example; + Elm_Genlist_Item_Class *ith, *itc, *itc2; char path[PATH_MAX]; naviframe = (Evas_Object *) data; @@ -466,10 +595,13 @@ _edi_welcome_project_new_cb(void *data, Evas_Object *obj EINA_UNUSED, void *even _edi_template_free(template); snprintf(path, sizeof(path), "%s/templates", _edi_config_dir_get()); - _edi_templates_discover(PACKAGE_DATA_DIR "/templates"); _edi_templates_discover(path); + snprintf(path, sizeof(path), "%s/examples", _edi_config_dir_get()); + _edi_examples_discover(PACKAGE_DATA_DIR "/examples"); + _edi_examples_discover(path); + content = elm_box_add(naviframe); evas_object_size_hint_weight_set(content, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(content, EVAS_HINT_FILL, EVAS_HINT_FILL); @@ -503,6 +635,12 @@ _edi_welcome_project_new_cb(void *data, Evas_Object *obj EINA_UNUSED, void *even elm_table_pack(table, list, 0, 0, 1, 1); elm_box_pack_end(hbox, table); + ith = elm_genlist_item_class_new(); + ith->item_style = "group_index"; + ith->func.text_get = _header_text_get; + ith->func.del = _header_del; + elm_genlist_item_append(list, ith, _("Templates"), NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + itc = elm_genlist_item_class_new(); itc->item_style = "full"; itc->func.text_get = NULL; @@ -513,6 +651,22 @@ _edi_welcome_project_new_cb(void *data, Evas_Object *obj EINA_UNUSED, void *even EINA_LIST_FOREACH(_available_templates, l, template) elm_genlist_item_append(list, itc, template, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_genlist_item_append(list, ith, _("Examples"), NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + + itc2 = elm_genlist_item_class_new(); + itc2->item_style = "full"; + itc2->func.text_get = NULL; + itc2->func.content_get = _example_content_get; + itc2->func.state_get = NULL; + itc2->func.del = NULL; + EINA_LIST_FOREACH(_available_examples, l, example) + { + Elm_Widget_Item *item; + + item = elm_genlist_item_append(list, itc2, example, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_NONE); + } + elm_genlist_realized_items_update(list); elm_genlist_item_class_free(itc); From 83eaa3db84b7863a84cd092872870ec31061e3d9 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Mon, 1 Jan 2018 22:07:36 +0000 Subject: [PATCH 2/9] Example: Add more content for the main examples --- data/extra/examples/examples.edc | 42 +++++++++++++++++++++- data/extra/examples/images/life.png | Bin 0 -> 2964 bytes data/extra/examples/images/texteditor.png | Bin 0 -> 10679 bytes 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 data/extra/examples/images/life.png create mode 100644 data/extra/examples/images/texteditor.png diff --git a/data/extra/examples/examples.edc b/data/extra/examples/examples.edc index 2dcdb22..aff064b 100644 --- a/data/extra/examples/examples.edc +++ b/data/extra/examples/examples.edc @@ -1,8 +1,18 @@ data { item: "hellogui.title" "C EFL Beta Hello World"; - item: "hellogui.directory" "tutorials/c/hellogui/"; + item: "hellogui.directory" "tutorials/c/hellogui/"; item: "hellogui.description" "Hello World using the EFL Beta APIs"; + + item: "life.title" "C EFL Beta Game of Life"; + item: "life.directory" "apps/c/life/"; + item: "life.description" + "Game of Life using the EFL Beta APIs"; + + item: "texteditor.title" "C EFL Beta Basic Text Editor"; + item: "texteditor.directory" "apps/c/texteditor/"; + item: "texteditor.description" + "A basic text editor app using the EFL Beta APIs"; } collections { @@ -20,4 +30,34 @@ collections { } } } + + group { + name: "life"; + max: 128 128; + + parts { + part { name: "icon"; + description { state: "default" 0.0; + max: 128 128; + images.image: "life.png" COMP; + image.normal: "life.png"; + } + } + } + } + + group { + name: "texteditor"; + max: 128 128; + + parts { + part { name: "icon"; + description { state: "default" 0.0; + max: 128 128; + images.image: "texteditor.png" COMP; + image.normal: "texteditor.png"; + } + } + } + } } diff --git a/data/extra/examples/images/life.png b/data/extra/examples/images/life.png new file mode 100644 index 0000000000000000000000000000000000000000..27f848a0329d127e107dd4040a0c4e4bf350b252 GIT binary patch literal 2964 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 Date: Tue, 2 Jan 2018 21:16:45 +0000 Subject: [PATCH 3/9] examples: Crash fix on going back --- src/bin/screens/edi_welcome.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/bin/screens/edi_welcome.c b/src/bin/screens/edi_welcome.c index 93b4cc3..1f7b01e 100644 --- a/src/bin/screens/edi_welcome.c +++ b/src/bin/screens/edi_welcome.c @@ -523,12 +523,6 @@ _header_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *source EI return strdup((char *)data); } -static void -_header_del(void *data, Evas_Object *obj EINA_UNUSED) -{ - free(data); -} - static Evas_Object * _example_content_get(void *data, Evas_Object *obj, const char *source) { @@ -638,7 +632,7 @@ _edi_welcome_project_new_cb(void *data, Evas_Object *obj EINA_UNUSED, void *even ith = elm_genlist_item_class_new(); ith->item_style = "group_index"; ith->func.text_get = _header_text_get; - ith->func.del = _header_del; + ith->func.del = NULL; elm_genlist_item_append(list, ith, _("Templates"), NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); itc = elm_genlist_item_class_new(); From 3497aee535b96ef018b283f1e26f2758344f6801 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Tue, 2 Jan 2018 22:02:41 +0000 Subject: [PATCH 4/9] examples: refactor data to be tidier --- data/extra/examples/examples.edc | 38 ++++++++++++++++++-------------- src/bin/screens/edi_welcome.c | 19 +++++++++------- 2 files changed, 32 insertions(+), 25 deletions(-) diff --git a/data/extra/examples/examples.edc b/data/extra/examples/examples.edc index aff064b..230ceb4 100644 --- a/data/extra/examples/examples.edc +++ b/data/extra/examples/examples.edc @@ -1,25 +1,15 @@ -data { - item: "hellogui.title" "C EFL Beta Hello World"; - item: "hellogui.directory" "tutorials/c/hellogui/"; - item: "hellogui.description" - "Hello World using the EFL Beta APIs"; - - item: "life.title" "C EFL Beta Game of Life"; - item: "life.directory" "apps/c/life/"; - item: "life.description" - "Game of Life using the EFL Beta APIs"; - - item: "texteditor.title" "C EFL Beta Basic Text Editor"; - item: "texteditor.directory" "apps/c/texteditor/"; - item: "texteditor.description" - "A basic text editor app using the EFL Beta APIs"; -} - collections { group { name: "hellogui"; max: 128 128; + data { + item: "title" "C EFL Beta Hello World"; + item: "directory" "tutorials/c/hellogui/"; + item: "description" + "Hello World using the EFL Beta APIs"; + } + parts { part { name: "icon"; description { state: "default" 0.0; @@ -35,6 +25,13 @@ collections { name: "life"; max: 128 128; + data { + item: "title" "C EFL Beta Game of Life"; + item: "directory" "apps/c/life/"; + item: "description" + "Game of Life using the EFL Beta APIs"; + } + parts { part { name: "icon"; description { state: "default" 0.0; @@ -50,6 +47,13 @@ collections { name: "texteditor"; max: 128 128; + data { + item: "title" "C EFL Beta Basic Text Editor"; + item: "directory" "apps/c/texteditor/"; + item: "description" + "A basic text editor app using the EFL Beta APIs"; + } + parts { part { name: "icon"; description { state: "default" 0.0; diff --git a/src/bin/screens/edi_welcome.c b/src/bin/screens/edi_welcome.c index 1f7b01e..a4db773 100644 --- a/src/bin/screens/edi_welcome.c +++ b/src/bin/screens/edi_welcome.c @@ -279,20 +279,24 @@ _edi_templates_discover(const char *directory) } Edi_Example * -_edi_example_add(const char *examples, const char *group) +_edi_example_add(const char *examples, const char *groupname) { Edi_Example *e; + Evas_Object *group; + Ecore_Evas *evas; // TODO find a way to not need this! e = malloc(sizeof(Edi_Example)); + evas = ecore_evas_buffer_new(0, 0); + group = edje_object_add(ecore_evas_get(evas)); + edje_object_file_set(group, examples, groupname); - printf("EXITS %s, %s\n", edje_file_data_get(examples, "title"), - edje_file_data_get(examples, eina_slstr_printf("%s.title", group))); - e->title = edje_file_data_get(examples, eina_slstr_printf("%s.title", group)); - e->desc = edje_file_data_get(examples, eina_slstr_printf("%s.description", group)); - e->example_path = edje_file_data_get(examples, eina_slstr_printf("%s.directory", group)); + e->title = strdup(edje_object_data_get(group, "title")); + e->desc = strdup(edje_object_data_get(group, "description")); + e->example_path = strdup(edje_object_data_get(group, "directory")); e->edje_path = strdup(examples); - e->edje_id = strdup(group); + e->edje_id = strdup(groupname); + ecore_evas_free(evas); return e; } @@ -324,7 +328,6 @@ _edi_examples_discover(const char *directory) collection = edje_file_collection_list(path); EINA_LIST_FOREACH(collection, list, groupname) { - printf("Found group %s\n", groupname); Edi_Example *example = _edi_example_add(path, groupname); if (example) _available_examples = eina_list_append(_available_examples, example); From 305c7c4b436ef46528a22f40e6822020a8b86480 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sat, 6 Jan 2018 13:42:24 +0000 Subject: [PATCH 5/9] examples: refactor template code to work for examples too --- data/extra/examples/examples.edc | 6 +- data/extra/templates/eflproject.edc | 23 --- data/extra/templates/eflproject_python.edc | 23 --- data/extra/templates/meson.build | 22 +-- data/extra/templates/templates.edc | 45 +++++ src/bin/screens/edi_welcome.c | 198 ++++++--------------- 6 files changed, 109 insertions(+), 208 deletions(-) delete mode 100644 data/extra/templates/eflproject.edc delete mode 100644 data/extra/templates/eflproject_python.edc create mode 100644 data/extra/templates/templates.edc diff --git a/data/extra/examples/examples.edc b/data/extra/examples/examples.edc index 230ceb4..482f346 100644 --- a/data/extra/examples/examples.edc +++ b/data/extra/examples/examples.edc @@ -5,7 +5,7 @@ collections { data { item: "title" "C EFL Beta Hello World"; - item: "directory" "tutorials/c/hellogui/"; + item: "path" "tutorials/c/hellogui/"; item: "description" "Hello World using the EFL Beta APIs"; } @@ -27,7 +27,7 @@ collections { data { item: "title" "C EFL Beta Game of Life"; - item: "directory" "apps/c/life/"; + item: "path" "apps/c/life/"; item: "description" "Game of Life using the EFL Beta APIs"; } @@ -49,7 +49,7 @@ collections { data { item: "title" "C EFL Beta Basic Text Editor"; - item: "directory" "apps/c/texteditor/"; + item: "path" "apps/c/texteditor/"; item: "description" "A basic text editor app using the EFL Beta APIs"; } diff --git a/data/extra/templates/eflproject.edc b/data/extra/templates/eflproject.edc deleted file mode 100644 index d0e3375..0000000 --- a/data/extra/templates/eflproject.edc +++ /dev/null @@ -1,23 +0,0 @@ -data { - item: "title" "C EFL Project"; - item: "file" "skeletons/eflproject.tar.gz"; - item: "description" - - "Begin your C programming EFL project. All content is freely modifiable and distributable and licensed in the public-domain.

Happy hacking!"; -} - -collections { - group { - name: "logo"; - max: 128 128; - parts { - part { name: "icon"; - description { state: "default" 0.0; - max: 128 128; - image.image: "c.png" COMP; - image.normal: "c.png"; - } - } - } - } -} diff --git a/data/extra/templates/eflproject_python.edc b/data/extra/templates/eflproject_python.edc deleted file mode 100644 index 24cf5d5..0000000 --- a/data/extra/templates/eflproject_python.edc +++ /dev/null @@ -1,23 +0,0 @@ -data { - item: "title" "Python EFL Project"; - item: "file" "skeletons/eflproject_python.tar.gz"; - item: "description" - - "Start your new EFL Python programming project. All code is in the public-domain, you are free to modify and distribute as you wish."; -} - -collections { - group { - name: "logo"; - max: 128 128; - parts { - part { name: "icon"; - description { state: "default" 0.0; - max: 128 128; - image.image: "python.png" COMP; - image.normal: "python.png"; - } - } - } - } -} diff --git a/data/extra/templates/meson.build b/data/extra/templates/meson.build index 10f7910..4358554 100644 --- a/data/extra/templates/meson.build +++ b/data/extra/templates/meson.build @@ -20,18 +20,14 @@ cmd = [ edje_cc, '@INPUT@', '@OUTPUT@' ] -skeleton_meta = ['eflproject', 'eflproject_python'] - template_dir = join_paths(get_option('datadir'), 'edi', 'templates') -foreach meta : skeleton_meta - custom_target('meta ' + meta, - input : meta + '.edc', - output : meta + '.edj', - command : cmd, - install_dir: template_dir, - install: true, - ) - out = join_paths(get_option('prefix'), template_dir, meta + '.edj') - meson.add_install_script('../../../scripts/world_read.sh', out) -endforeach +custom_target('templates_meta', + input : 'templates.edc', + output : 'templates.edj', + command : cmd, + install_dir: template_dir, + install: true, +) +out = join_paths(get_option('prefix'), template_dir, 'templates.edj') +meson.add_install_script('../../../scripts/world_read.sh', out) diff --git a/data/extra/templates/templates.edc b/data/extra/templates/templates.edc new file mode 100644 index 0000000..5bc9a1d --- /dev/null +++ b/data/extra/templates/templates.edc @@ -0,0 +1,45 @@ +collections { + group { + name: "eflproject"; + max: 128 128; + + data { + item: "title" "C EFL Project"; + item: "path" "skeletons/eflproject.tar.gz"; + item: "description" + "Begin your C programming EFL project. All content is freely modifiable and distributable and licensed in the public-domain.

Happy hacking!"; + } + + parts { + part { name: "icon"; + description { state: "default" 0.0; + max: 128 128; + images.image: "c.png" COMP; + image.normal: "c.png"; + } + } + } + } + + group { + name: "eflproject_python"; + max: 128 128; + + data { + item: "title" "Python EFL Project"; + item: "path" "skeletons/eflproject_python.tar.gz"; + item: "description" + "Start your new EFL Python programming project. All code is in the public-domain, you are free to modify and distribute as you wish."; + } + + parts { + part { name: "icon"; + description { state: "default" 0.0; + max: 128 128; + images.image: "python.png" COMP; + image.normal: "python.png"; + } + } + } + } +} diff --git a/src/bin/screens/edi_welcome.c b/src/bin/screens/edi_welcome.c index a4db773..d623edd 100644 --- a/src/bin/screens/edi_welcome.c +++ b/src/bin/screens/edi_welcome.c @@ -15,21 +15,15 @@ #define _EDI_WELCOME_PROJECT_NEW_TABLE_WIDTH 4 typedef struct _Edi_Template -{ - char *edje_path; - char *skeleton_path; - char *title; - char *desc; -} Edi_Template; - -typedef struct _Edi_Example { char *edje_id; - char *edje_path; - char *example_path; + char *edje_path; // TODO fix + char *path; // file path for skeleton, directory for example char *title; char *desc; -} Edi_Example; + + Eina_Bool is_template; +} Edi_Template; typedef struct _Edi_Welcome_Data { Evas_Object *pb; @@ -174,7 +168,7 @@ _edi_welcome_project_choose_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNU static void _edi_welcome_project_new_directory_row_add(const char *text, int row, - Evas_Object *parent) + Evas_Object *parent) { Evas_Object *label, *input; @@ -196,9 +190,9 @@ _edi_welcome_project_new_directory_row_add(const char *text, int row, _create_inputs[row] = input; } -static void -_edi_welcome_project_new_input_row_add(const char *text, const char *placeholder, int row, - Evas_Object *parent) +static Evas_Object * +_edi_welcome_project_new_input_row_add(const char *text, const char *placeholder, + Eina_Bool show, int row, Evas_Object *parent) { Evas_Object *label, *input; @@ -225,19 +219,22 @@ _edi_welcome_project_new_input_row_add(const char *text, const char *placeholder } Edi_Template * -_edi_template_add(const char *directory, const char *file) +_edi_template_add(const char *templates, const char *groupname) { Edi_Template *t; - char *path = edi_path_append(directory, file); - - if (!ecore_file_exists(path)) - return NULL; + Evas_Object *group; + Ecore_Evas *evas; // TODO find a way to not need this! t = malloc(sizeof(Edi_Template)); - t->title = edje_file_data_get(path, "title"); - t->desc = edje_file_data_get(path, "description"); - t->skeleton_path = edi_path_append(directory, edje_file_data_get(path, "file")); - t->edje_path = path; + evas = ecore_evas_buffer_new(0, 0); + group = edje_object_add(ecore_evas_get(evas)); + edje_object_file_set(group, templates, groupname); + + t->title = strdup(edje_object_data_get(group, "title")); + t->desc = strdup(edje_object_data_get(group, "description")); + t->path = strdup(edje_object_data_get(group, "path")); + t->edje_path = strdup(templates); + t->edje_id = strdup(groupname); return t; } @@ -251,67 +248,34 @@ _edi_template_free(Edi_Template *t) free(t->title); free(t->desc); free(t->edje_path); - free(t->skeleton_path); + free(t->edje_id); + free(t->path); free(t); } static void _edi_templates_discover(const char *directory) { - Eina_List *files; - char *file; + Eina_List *collection, *list; + char path[PATH_MAX]; + const char *groupname; - files = ecore_file_ls(directory); - EINA_LIST_FREE(files, file) - { - if (eina_str_has_extension(file, ".edj")) - { - Edi_Template *template = _edi_template_add(directory, file); - if (template) - _available_templates = eina_list_append(_available_templates, template); - } - - free(file); - } - - if (files) - eina_list_free(files); -} - -Edi_Example * -_edi_example_add(const char *examples, const char *groupname) -{ - Edi_Example *e; - Evas_Object *group; - Ecore_Evas *evas; // TODO find a way to not need this! - - e = malloc(sizeof(Edi_Example)); - evas = ecore_evas_buffer_new(0, 0); - group = edje_object_add(ecore_evas_get(evas)); - edje_object_file_set(group, examples, groupname); - - e->title = strdup(edje_object_data_get(group, "title")); - e->desc = strdup(edje_object_data_get(group, "description")); - e->example_path = strdup(edje_object_data_get(group, "directory")); - e->edje_path = strdup(examples); - e->edje_id = strdup(groupname); - - ecore_evas_free(evas); - return e; -} - -static void -_edi_example_free(Edi_Example *e) -{ - if (!e) + eina_file_path_join(path, sizeof(path), directory, "templates.edj"); + if (!ecore_file_exists(path)) return; - free(e->title); - free(e->desc); - free(e->edje_path); - free(e->edje_id); - free(e->example_path); - free(e); + collection = edje_file_collection_list(path); + EINA_LIST_FOREACH(collection, list, groupname) + { + Edi_Template *template = _edi_template_add(path, groupname); + if (!template) + continue; + + template->is_template = EINA_TRUE; + _available_templates = eina_list_append(_available_templates, template); + } + + edje_mmap_collection_list_free(collection); } static void @@ -328,9 +292,12 @@ _edi_examples_discover(const char *directory) collection = edje_file_collection_list(path); EINA_LIST_FOREACH(collection, list, groupname) { - Edi_Example *example = _edi_example_add(path, groupname); - if (example) - _available_examples = eina_list_append(_available_examples, example); + Edi_Template *example = _edi_template_add(path, groupname); + if (!example) + continue; + + example->is_template = EINA_FALSE; + _available_examples = eina_list_append(_available_examples, example); } edje_mmap_collection_list_free(collection); @@ -339,8 +306,7 @@ _edi_examples_discover(const char *directory) static void _edi_welcome_project_new_create_done_cb(const char *path, Eina_Bool success) { - Edi_Template *template; - Edi_Example *example; + Edi_Template *template, *example; if (!success) { @@ -352,7 +318,7 @@ _edi_welcome_project_new_create_done_cb(const char *path, Eina_Bool success) EINA_LIST_FREE(_available_templates, template) _edi_template_free(template); EINA_LIST_FREE(_available_examples, example) - _edi_example_free(example); + _edi_template_free(example); _edi_welcome_project_open(path, EINA_TRUE); } @@ -500,7 +466,7 @@ _content_get(void *data, Evas_Object *obj, const char *source) evas_object_size_hint_weight_set(image, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(image, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_min_set(image, 96 * elm_config_scale_get(), 96 * elm_config_scale_get()); - elm_image_file_set(image, template->edje_path, "logo"); + elm_image_file_set(image, template->edje_path, template->edje_id); evas_object_show(image); elm_table_pack(table, image, 0, 0, 1, 1); @@ -526,54 +492,6 @@ _header_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *source EI return strdup((char *)data); } -static Evas_Object * -_example_content_get(void *data, Evas_Object *obj, const char *source) -{ - Evas_Object *frame, *table, *image, *entry; - Edi_Example *example = (Edi_Example *) data; - Eina_Slstr *content; - - if (strcmp(source, "elm.swallow.content")) - return NULL; - - frame = elm_frame_add(obj); - elm_object_style_set(frame, "pad_medium"); - evas_object_size_hint_weight_set(frame, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(frame, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_show(frame); - - table = elm_table_add(obj); - evas_object_size_hint_weight_set(table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL); - elm_table_padding_set(table, 5, 5); - elm_table_homogeneous_set(table, EINA_TRUE); - evas_object_show(table); - elm_object_content_set(frame, table); - - image = elm_image_add(table); - evas_object_size_hint_weight_set(image, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(image, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_size_hint_min_set(image, 96 * elm_config_scale_get(), 96 * elm_config_scale_get()); - elm_image_file_set(image, example->edje_path, example->edje_id); - evas_object_show(image); - elm_table_pack(table, image, 0, 0, 1, 1); - - entry = elm_entry_add(table); - evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL); - elm_entry_editable_set(entry, EINA_FALSE); - elm_entry_scrollable_set(entry, EINA_FALSE); - elm_entry_single_line_set(entry, EINA_FALSE); - elm_entry_line_wrap_set(entry, ELM_WRAP_WORD); - elm_table_pack(table, entry, 1, 0, 3, 1); - evas_object_show(entry); - - content = eina_slstr_printf("%s

%s", example->title, example->desc); - elm_object_text_set(entry, content); - - return frame; -} - static void _edi_welcome_project_new_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { @@ -581,10 +499,9 @@ _edi_welcome_project_new_cb(void *data, Evas_Object *obj EINA_UNUSED, void *even Evas_Object *content, *button, *naviframe; Evas_Object *table, *list, *rect, *hbox; Elm_Object_Item *item; - Edi_Template *template; - Edi_Example *example; - Elm_Genlist_Item_Class *ith, *itc, *itc2; char path[PATH_MAX]; + Edi_Template *template, *example; + Elm_Genlist_Item_Class *ith, *itc; naviframe = (Evas_Object *) data; @@ -650,19 +567,8 @@ _edi_welcome_project_new_cb(void *data, Evas_Object *obj EINA_UNUSED, void *even elm_genlist_item_append(list, ith, _("Examples"), NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); - itc2 = elm_genlist_item_class_new(); - itc2->item_style = "full"; - itc2->func.text_get = NULL; - itc2->func.content_get = _example_content_get; - itc2->func.state_get = NULL; - itc2->func.del = NULL; EINA_LIST_FOREACH(_available_examples, l, example) - { - Elm_Widget_Item *item; - - item = elm_genlist_item_append(list, itc2, example, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); - elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_NONE); - } + elm_genlist_item_append(list, itc, example, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); elm_genlist_realized_items_update(list); From a99382bed87844c0767807e6b0139b815e94fc13 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sat, 6 Jan 2018 13:46:43 +0000 Subject: [PATCH 6/9] templtaes: refactor to use template name rather than path This makes our command line interface easier to use. We lose the search paths for templates, but we did not use it --- data/extra/templates/meson.build | 2 +- data/extra/templates/templates.edc | 4 ++-- src/bin/edi_build_main.c | 8 ++++---- src/bin/screens/edi_welcome.c | 13 ++++--------- src/lib/edi_create.c | 10 ++++++---- src/lib/edi_create.h | 8 ++++---- 6 files changed, 21 insertions(+), 24 deletions(-) diff --git a/data/extra/templates/meson.build b/data/extra/templates/meson.build index 4358554..421cd76 100644 --- a/data/extra/templates/meson.build +++ b/data/extra/templates/meson.build @@ -9,7 +9,7 @@ foreach skeleton_name : skeleton_names command : [tar, 'zcf', '@OUTPUT@', '-C', '../data/extra/templates/skeletons', skeleton_name], input : 'skeletons' + '/' + skeleton_name, output : skeleton_name + '.tar.gz', - install_dir: join_paths(get_option('prefix'), get_option('datadir'), 'edi', 'templates', 'skeletons'), + install_dir: join_paths(get_option('prefix'), get_option('datadir'), 'edi', 'templates'), install : true, ) diff --git a/data/extra/templates/templates.edc b/data/extra/templates/templates.edc index 5bc9a1d..edc52e6 100644 --- a/data/extra/templates/templates.edc +++ b/data/extra/templates/templates.edc @@ -5,7 +5,7 @@ collections { data { item: "title" "C EFL Project"; - item: "path" "skeletons/eflproject.tar.gz"; + item: "path" "eflproject"; item: "description" "Begin your C programming EFL project. All content is freely modifiable and distributable and licensed in the public-domain.

Happy hacking!"; } @@ -27,7 +27,7 @@ collections { data { item: "title" "Python EFL Project"; - item: "path" "skeletons/eflproject_python.tar.gz"; + item: "path" "eflproject_python"; item: "description" "Start your new EFL Python programming project. All code is in the public-domain, you are free to modify and distribute as you wish."; } diff --git a/src/bin/edi_build_main.c b/src/bin/edi_build_main.c index 9cf9ce6..1d36b9c 100644 --- a/src/bin/edi_build_main.c +++ b/src/bin/edi_build_main.c @@ -107,9 +107,9 @@ static void _edi_build_create_start(int argc, int arg0, char **argv) { elm_init(argc, argv); - edi_create_efl_project(argv[arg0 + 1], argv[arg0 + 2], argv[arg0 + 3], - argv[arg0 + 4], argv[arg0 + 5], argv[arg0 + 6], - _edi_build_create_done_cb); + edi_create_project(argv[arg0 + 1], argv[arg0 + 2], argv[arg0 + 3], + argv[arg0 + 4], argv[arg0 + 5], argv[arg0 + 6], + _edi_build_create_done_cb); } EAPI_MAIN int @@ -165,7 +165,7 @@ main(int argc, char **argv) if (argc - args != 7) { fprintf(stderr, _("create requires 6 additional parameters:\n")); - fprintf(stderr, " skeleton, parent_path, project_name, " + fprintf(stderr, " template_name, parent_path, project_name, " "project_url, creator_name, creator_email\n"); goto end; } diff --git a/src/bin/screens/edi_welcome.c b/src/bin/screens/edi_welcome.c index d623edd..be12696 100644 --- a/src/bin/screens/edi_welcome.c +++ b/src/bin/screens/edi_welcome.c @@ -339,14 +339,14 @@ _edi_welcome_project_new_create_cb(void *data EINA_UNUSED, Evas_Object *obj EINA if (template && path && path[0] && name && name[0]) { - edi_create_efl_project(template->skeleton_path, path, name, url, user, email, - _edi_welcome_project_new_create_done_cb); + edi_create_example(template->path, path, name, + _edi_welcome_project_new_create_done_cb); } else { - if (path && !path[0]) + if (!path || !path[0]) elm_object_focus_set(_create_inputs[0], EINA_TRUE); - else if (name && !name[0]) + else if (!name || !name[0]) elm_object_focus_set(_create_inputs[1], EINA_TRUE); } } @@ -508,13 +508,8 @@ _edi_welcome_project_new_cb(void *data, Evas_Object *obj EINA_UNUSED, void *even EINA_LIST_FREE(_available_templates, template) _edi_template_free(template); - snprintf(path, sizeof(path), "%s/templates", _edi_config_dir_get()); _edi_templates_discover(PACKAGE_DATA_DIR "/templates"); - _edi_templates_discover(path); - - snprintf(path, sizeof(path), "%s/examples", _edi_config_dir_get()); _edi_examples_discover(PACKAGE_DATA_DIR "/examples"); - _edi_examples_discover(path); content = elm_box_add(naviframe); evas_object_size_hint_weight_set(content, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); diff --git a/src/lib/edi_create.c b/src/lib/edi_create.c index a293a8f..f000013 100644 --- a/src/lib/edi_create.c +++ b/src/lib/edi_create.c @@ -298,12 +298,12 @@ _edi_create_extract_done(void *data, int type EINA_UNUSED, void *event EINA_UNUS } EAPI void -edi_create_efl_project(const char *skelpath, const char *parentdir, - const char *name, const char *url, const char *user, - const char *email, Edi_Create_Cb func) +edi_create_project(const char *template_name, const char *parentdir, + const char *name, const char *url, const char *user, + const char *email, Edi_Create_Cb func) { char *cmd, *extract; - char tmp[PATH_MAX], dest[PATH_MAX]; + char tmp[PATH_MAX], dest[PATH_MAX], skelpath[PATH_MAX]; Edi_Create *data; Ecore_Event_Handler *handler; @@ -311,6 +311,8 @@ edi_create_efl_project(const char *skelpath, const char *parentdir, snprintf(tmp, sizeof(tmp), "%s/edi_%s", eina_environment_tmp_get(), name); snprintf(dest, sizeof(dest), "%s/%s", parentdir, name); + snprintf(skelpath, sizeof(skelpath), PACKAGE_DATA_DIR "/templates/%s.tar.gz", template_name); + INF("Creating project \"%s\" at path %s for %s<%s>\n", name, dest, user, email); DBG("Extracting project files from %s\n", skelpath); diff --git a/src/lib/edi_create.h b/src/lib/edi_create.h index 96ea7bc..19315b4 100644 --- a/src/lib/edi_create.h +++ b/src/lib/edi_create.h @@ -23,14 +23,14 @@ typedef void (*Edi_Create_Cb)(const char *path, Eina_Bool success); */ /** - * Create a new standard EFL project. + * Create a new project from an Edi template. * * @ingroup Creation */ EAPI void -edi_create_efl_project(const char *skelpath, const char *parentdir, - const char *name, const char *url, const char *user, - const char *email, Edi_Create_Cb func); +edi_create_project(const char *template_name, const char *parentdir, + const char *name, const char *url, const char *user, + const char *email, Edi_Create_Cb func); /** * @} From 1b7acee71193c488616e06885469d747d59f7036 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sat, 6 Jan 2018 13:50:39 +0000 Subject: [PATCH 7/9] suggest: fix potential crash. Don't list un-named methods? --- src/bin/language/edi_language_provider_c.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/bin/language/edi_language_provider_c.c b/src/bin/language/edi_language_provider_c.c index 5df7c2d..8239f08 100644 --- a/src/bin/language/edi_language_provider_c.c +++ b/src/bin/language/edi_language_provider_c.c @@ -286,12 +286,14 @@ _edi_language_c_lookup(Edi_Editor *editor, unsigned int row, unsigned int col) } if (name) - suggest_it->summary = strdup(name); - suggest_it->detail = _edi_suggest_c_detail_get(editor, name, ret?ret:"", param?param:""); + { + suggest_it->summary = strdup(name); + suggest_it->detail = _edi_suggest_c_detail_get(editor, name, ret?ret:"", param?param:""); + + list = eina_list_append(list, suggest_it); + } if (param) free(param); - - list = eina_list_append(list, suggest_it); } clang_disposeCodeCompleteResults(res); #else From e170fdee19139562a6c07c95299110ce753c8a72 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sat, 6 Jan 2018 14:48:04 +0000 Subject: [PATCH 8/9] examples: extract example from git to create new projects --- src/bin/edi_build_main.c | 24 +++++++++++- src/bin/screens/edi_welcome.c | 33 +++++++++++------ src/lib/edi_create.c | 69 +++++++++++++++++++++++++++++++++++ src/lib/edi_create.h | 9 +++++ src/lib/edi_private.h | 3 ++ 5 files changed, 125 insertions(+), 13 deletions(-) diff --git a/src/bin/edi_build_main.c b/src/bin/edi_build_main.c index 1d36b9c..1e6a740 100644 --- a/src/bin/edi_build_main.c +++ b/src/bin/edi_build_main.c @@ -41,7 +41,7 @@ _exe_del(void *d EINA_UNUSED, int t EINA_UNUSED, void *event_info EINA_UNUSED) static const Ecore_Getopt optdesc = { "edi_build", - "%prog [options] [build|clean|create|test]", + "%prog [options] [build|clean|test|create|example]", PACKAGE_VERSION, COPYRIGHT, "BSD with advertisement clause", @@ -112,6 +112,14 @@ _edi_build_create_start(int argc, int arg0, char **argv) _edi_build_create_done_cb); } +static void +_edi_build_example_start(int argc, int arg0, char **argv) +{ + elm_init(argc, argv); + edi_create_example(argv[arg0 + 1], argv[arg0 + 2], argv[arg0 + 3], + _edi_build_create_done_cb); +} + EAPI_MAIN int main(int argc, char **argv) { @@ -172,6 +180,20 @@ main(int argc, char **argv) _edi_build_create_start(argc, args, argv); + ecore_main_loop_begin(); + goto end; + } + if (!strncmp("example", build_type, 7)) + { + if (argc - args != 4) + { + fprintf(stderr, _("example requires 3 additional parameters:\n")); + fprintf(stderr, " example_name, parent_path, project_name\n"); + goto end; + } + + _edi_build_example_start(argc, args, argv); + ecore_main_loop_begin(); goto end; } diff --git a/src/bin/screens/edi_welcome.c b/src/bin/screens/edi_welcome.c index be12696..27b9549 100644 --- a/src/bin/screens/edi_welcome.c +++ b/src/bin/screens/edi_welcome.c @@ -201,7 +201,8 @@ _edi_welcome_project_new_input_row_add(const char *text, const char *placeholder evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_table_pack(parent, label, 0, row, 1, 1); - evas_object_show(label); + if (show) + evas_object_show(label); input = elm_entry_add(parent); elm_entry_scrollable_set(input, EINA_TRUE); @@ -209,13 +210,15 @@ _edi_welcome_project_new_input_row_add(const char *text, const char *placeholder evas_object_size_hint_weight_set(input, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(input, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_table_pack(parent, input, 1, row, _EDI_WELCOME_PROJECT_NEW_TABLE_WIDTH - 1, 1); - evas_object_show(input); + if (show) + evas_object_show(input); if (placeholder) { elm_object_text_set(input, placeholder); } _create_inputs[row] = input; + return input; } Edi_Template * @@ -337,10 +340,14 @@ _edi_welcome_project_new_create_cb(void *data EINA_UNUSED, Evas_Object *obj EINA user = elm_object_text_get(_create_inputs[3]); email = elm_object_text_get(_create_inputs[4]); - if (template && path && path[0] && name && name[0]) + if (path && path[0] && name && name[0]) { + if (!template->is_template) edi_create_example(template->path, path, name, _edi_welcome_project_new_create_done_cb); + else + edi_create_project(template->path, path, name, url, user, email, + _edi_welcome_project_new_create_done_cb); } else { @@ -385,7 +392,7 @@ _edi_welcome_user_fullname_get(const char *username, char *fullname, size_t max) static void _edi_welcome_project_details(Evas_Object *naviframe, Edi_Template *template) { - Evas_Object *content, *button; + Evas_Object *content, *button, *input; Elm_Object_Item *item; int row = 0; char fullname[1024]; @@ -400,13 +407,16 @@ _edi_welcome_project_details(Evas_Object *naviframe, Edi_Template *template) if (!username) username = getenv("USERNAME"); _edi_welcome_project_new_directory_row_add(_("Parent Path"), row++, content); - _edi_welcome_project_new_input_row_add(_("Project Name"), NULL, row++, content); - _edi_welcome_project_new_input_row_add(_("Project URL"), NULL, row++, content); + input = _edi_welcome_project_new_input_row_add(_("Project Name"), NULL, EINA_TRUE, row++, content); + if (!template->is_template) + elm_object_text_set(input, template->edje_id); + + _edi_welcome_project_new_input_row_add(_("Project URL"), NULL, template->is_template, row++, content); if (_edi_welcome_user_fullname_get(username, fullname, sizeof(fullname))) - _edi_welcome_project_new_input_row_add(_("Creator Name"), fullname, row++, content); + _edi_welcome_project_new_input_row_add(_("Creator Name"), fullname, template->is_template, row++, content); else - _edi_welcome_project_new_input_row_add(_("Creator Name"), username, row++, content); - _edi_welcome_project_new_input_row_add(_("Creator Email"), NULL, row++, content); + _edi_welcome_project_new_input_row_add(_("Creator Name"), username, template->is_template, row++, content); + _edi_welcome_project_new_input_row_add(_("Creator Email"), NULL, template->is_template, row++, content); button = elm_button_add(content); elm_object_text_set(button, _("Create")); @@ -499,7 +509,6 @@ _edi_welcome_project_new_cb(void *data, Evas_Object *obj EINA_UNUSED, void *even Evas_Object *content, *button, *naviframe; Evas_Object *table, *list, *rect, *hbox; Elm_Object_Item *item; - char path[PATH_MAX]; Edi_Template *template, *example; Elm_Genlist_Item_Class *ith, *itc; @@ -667,9 +676,9 @@ _edi_welcome_project_clone_cb(void *data, Evas_Object *obj EINA_UNUSED, void *ev evas_object_size_hint_weight_set(content, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_show(content); - _edi_welcome_project_new_input_row_add(_("Source Control URL"), NULL, row++, content); + _edi_welcome_project_new_input_row_add(_("Source Control URL"), NULL, EINA_TRUE, row++, content); _edi_welcome_project_new_directory_row_add(_("Parent Path"), row++, content); - _edi_welcome_project_new_input_row_add(_("Project Name"), NULL, row++, content); + _edi_welcome_project_new_input_row_add(_("Project Name"), NULL, EINA_TRUE, row++, content); pb = elm_progressbar_add(content); evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, 0.5); diff --git a/src/lib/edi_create.c b/src/lib/edi_create.c index f000013..ab09a93 100644 --- a/src/lib/edi_create.c +++ b/src/lib/edi_create.c @@ -10,6 +10,8 @@ #include "edi_private.h" +#define EXAMPLES_GIT_URL "https://git.enlightenment.org/tools/examples.git" + typedef struct _Edi_Create { char *path, *temp, *name, *skelfile; @@ -21,6 +23,15 @@ typedef struct _Edi_Create int filters; } Edi_Create; +typedef struct _Edi_Create_Example +{ + char *path, *name; + + Edi_Create_Cb callback; + +} Edi_Create_Example; + + static Edi_Create *_edi_create_data; static const char * @@ -345,3 +356,61 @@ edi_create_project(const char *template_name, const char *parentdir, free(cmd); } +static void +_edi_create_example_done_cb(void *data, Eio_File *file EINA_UNUSED) +{ + Edi_Create_Example *create = data; + + if (create->callback) + create->callback(create->path, EINA_TRUE); +} + +static void +_edi_create_example_extract_dir(char *examples_path, Edi_Create_Example *create) +{ + char path[PATH_MAX]; + + eina_file_path_join(path, sizeof(path), examples_path, create->name); + + eio_dir_copy(path, create->path, NULL, NULL, _edi_create_example_done_cb, + _edi_create_error_cb, create); + + free(examples_path); +} + +EAPI void +edi_create_example(const char *example_name, const char *parentdir, + const char *name, Edi_Create_Cb func) +{ + char dest[PATH_MAX], examplepath[PATH_MAX]; + int status = 0; + Edi_Create_Example *data; + + snprintf(dest, sizeof(dest), "%s/%s", parentdir, name); + snprintf(examplepath, sizeof(examplepath), "%s/%s/examples.git", + efreet_cache_home_get(), PACKAGE_NAME); + + data = calloc(1, sizeof(Edi_Create_Example)); + data->path = strdup(dest); + data->name = strdup(example_name); + data->callback = func; + + INF("Extracting example project \"%s\" at path %s\n", example_name, dest); + + if (ecore_file_exists(examplepath)) + ERR("TODO: UPDATE NOT IMPLEMENTED"); +// status = edi_scm_git_update(examplepath); + else + status = edi_scm_git_clone(EXAMPLES_GIT_URL, examplepath); + + if (status) + { + ERR("git error: [%d]\n", status); + + if (func) + func(dest, EINA_FALSE); + } + else + _edi_create_example_extract_dir(strdup(examplepath), data); +} + diff --git a/src/lib/edi_create.h b/src/lib/edi_create.h index 19315b4..13f9711 100644 --- a/src/lib/edi_create.h +++ b/src/lib/edi_create.h @@ -32,6 +32,15 @@ edi_create_project(const char *template_name, const char *parentdir, const char *name, const char *url, const char *user, const char *email, Edi_Create_Cb func); +/** + * Create a new project from an example. + * + * @ingroup Creation + */ +EAPI void +edi_create_example(const char *example_name, const char *parentdir, + const char *name, Edi_Create_Cb func); + /** * @} */ diff --git a/src/lib/edi_private.h b/src/lib/edi_private.h index ac3bd48..7ae6400 100644 --- a/src/lib/edi_private.h +++ b/src/lib/edi_private.h @@ -1,6 +1,9 @@ #ifndef EDI_PRIVATE_H # define EDI_PRIVATE_H +#include +#include + extern int _edi_lib_log_dom; char *edi_create_escape_quotes(const char *in); From 131a627b6e2b0fdefc1bf922d678683781dc463d Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sat, 3 Feb 2018 19:32:16 +0000 Subject: [PATCH 9/9] Fix compile error for non-c99 buids --- src/lib/edi_build_provider_meson.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lib/edi_build_provider_meson.c b/src/lib/edi_build_provider_meson.c index a62f72d..48fb9a2 100644 --- a/src/lib/edi_build_provider_meson.c +++ b/src/lib/edi_build_provider_meson.c @@ -54,6 +54,8 @@ _meson_configured_check(const char *dir) static Eina_Bool _meson_file_hidden_is(const char *file) { + size_t k; + if (!file || strlen(file) == 0) return EINA_FALSE; @@ -66,7 +68,7 @@ _meson_file_hidden_is(const char *file) if (ecore_file_is_dir(file) && _meson_configured_check(file)) return EINA_TRUE; - for (size_t k = 0; k < EINA_C_ARRAY_LENGTH(hidden_exts); k++) + for (k = 0; k < EINA_C_ARRAY_LENGTH(hidden_exts); k++) if (eina_str_has_extension(file, hidden_exts[k])) return EINA_TRUE;