From 70477f47a40e52bace7aecc1846a958964fb9fee Mon Sep 17 00:00:00 2001 From: ChunEon Park Date: Thu, 10 Jul 2014 13:43:55 +0900 Subject: [PATCH] newfile - new feature come. now user choose a template at new file. --- configure.ac | 2 +- data/.proto/Makefile.am | 6 - data/Makefile.am | 2 +- data/templates/Makefile.am | 32 +++ .../{.proto/proto.edc => templates/basic.edc} | 0 data/templates/empty.edc | 6 + data/templates/textblock.edc | 23 +++ data/themes/default/menu.edc | 189 ++++++++++++++++++ src/bin/globals.c | 2 +- src/bin/main.c | 8 +- src/bin/menu.c | 104 ++++++++-- src/bin/newfile.c | 154 +++++++++++++- src/include/globals.h | 2 +- src/include/menu.h | 2 +- src/include/newfile.h | 4 +- 15 files changed, 495 insertions(+), 41 deletions(-) delete mode 100644 data/.proto/Makefile.am create mode 100644 data/templates/Makefile.am rename data/{.proto/proto.edc => templates/basic.edc} (100%) create mode 100644 data/templates/empty.edc create mode 100644 data/templates/textblock.edc diff --git a/configure.ac b/configure.ac index 718d8b3..b7edad2 100644 --- a/configure.ac +++ b/configure.ac @@ -99,7 +99,7 @@ data/images/Makefile data/themes/Makefile data/themes/default/Makefile data/themes/default/images/Makefile -data/.proto/Makefile +data/templates/Makefile data/color/Makefile ]) diff --git a/data/.proto/Makefile.am b/data/.proto/Makefile.am deleted file mode 100644 index 64d1d81..0000000 --- a/data/.proto/Makefile.am +++ /dev/null @@ -1,6 +0,0 @@ -MAINTAINERCLEANFILES = Makefile.in - -filesdir = $(datadir)/$(PACKAGE)/.proto -files_DATA = proto.edc - -EXTRA_DIST = $(files_DATA) diff --git a/data/Makefile.am b/data/Makefile.am index cb43601..de3a12a 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -1,3 +1,3 @@ MAINTAINERCLEANFILES = Makefile.in -SUBDIRS = images themes .proto desktop icon color +SUBDIRS = images themes templates desktop icon color diff --git a/data/templates/Makefile.am b/data/templates/Makefile.am new file mode 100644 index 0000000..6a24c6a --- /dev/null +++ b/data/templates/Makefile.am @@ -0,0 +1,32 @@ +MAINTAINERCLEANFILES = Makefile.in + +EDJE_CC = @edje_cc@ +EDJE_FLAGS = -id $(top_srcdir)/data/images + +filesdir = $(datadir)/$(PACKAGE)/templates +files_DATA = basic.edc \ + basic.edj \ + empty.edc \ + empty.edj \ + textblock.edc \ + textblock.edj + +EXTRA_DIST = $(files_DATA) + +basic.edj: Makefile $(EXTRA_DIST) + $(EDJE_CC) $(EDJE_FLAGS) \ + $(top_srcdir)/data/templates/basic.edc \ + $(top_builddir)/data/templates/basic.edj + +empty.edj: Makefile $(EXTRA_DIST) + $(EDJE_CC) $(EDJE_FLAGS) \ + $(top_srcdir)/data/templates/empty.edc \ + $(top_builddir)/data/templates/empty.edj + +textblock.edj: Makefile $(EXTRA_DIST) + $(EDJE_CC) $(EDJE_FLAGS) \ + $(top_srcdir)/data/templates/textblock.edc \ + $(top_builddir)/data/templates/textblock.edj + +clean-local: + rm -f *.edj diff --git a/data/.proto/proto.edc b/data/templates/basic.edc similarity index 100% rename from data/.proto/proto.edc rename to data/templates/basic.edc diff --git a/data/templates/empty.edc b/data/templates/empty.edc new file mode 100644 index 0000000..c184f42 --- /dev/null +++ b/data/templates/empty.edc @@ -0,0 +1,6 @@ +collections { + group { name: "main"; + parts { + } + } +} \ No newline at end of file diff --git a/data/templates/textblock.edc b/data/templates/textblock.edc new file mode 100644 index 0000000..55304b4 --- /dev/null +++ b/data/templates/textblock.edc @@ -0,0 +1,23 @@ +collections { + styles { + style { name: "text_style"; + base: "font="Sans" font_size=25 text_class=entry color=#ffffff style=shadow,bottom shadow_color=#00000080 valign=0.5 ellipsis=1.0 wrap=none align=center"; + } + } + group { name: "main"; + parts { + part { name: "text"; + type: TEXTBLOCK; + scale: 1; + description { state: "default" 0.0; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 1.0; + text { + style: "text_style"; + text: "Enventor"; + } + } + } + } + } +} \ No newline at end of file diff --git a/data/themes/default/menu.edc b/data/themes/default/menu.edc index e97a9eb..4e1819d 100644 --- a/data/themes/default/menu.edc +++ b/data/themes/default/menu.edc @@ -5,6 +5,7 @@ images { image: "warning.png" COMP; image: "setting_icon.png" COMP; image: "fileselect.png" COMP; + image: "new.png" COMP; image: "logo.png" COMP; image: "shine.png" COMP; image: "bub_over_bot.png" COMP; @@ -312,6 +313,194 @@ group { name: "fileselector_layout"; } } +group { name: "newfile_layout"; + parts { + part { name: "clipper"; + type: RECT; + description { state: "default" 0.0; + color: 127 127 127 127; + } + description { state: "show" 0.0; + color: 255 255 255 255; + } + } + part { name: "bg"; + type: RECT; + clip_to: "clipper"; + description { state: "default" 0.0; + color: 0 0 0 175; + } + } + part { name: "base_frame_img"; + type: IMAGE; + scale: 1; + clip_to: "clipper"; + description { + min: 600 380; + max: 600 380; + fixed: 1 1; + image.normal: "menu_layout.png"; + image.border: 10 10 10 10; + image.border_scale: 1; + } + } + part { name: "shine_img"; + type: IMAGE; + scale: 1; + clip_to: "clipper"; + description { + rel1 { to: "base_frame_img"; relative: 0 0; } + rel2 { to: "base_frame_img"; relative: 1 0; } + align: 0.5 0; + min: 600 3; + fixed: 1 1; + image.normal: "shine.png"; + } + } + part { name: "base_frame"; + type: SPACER; + description { + rel1 { to: "base_frame_img"; offset: 10 10; } + rel2 { to: "base_frame_img"; offset: -11 -11; } + } + } + part { name: "title_frame"; + type: RECT; + scale: 1; + clip_to: "clipper"; + description { + rel1 { to: "base_frame"; } + rel2 { to: "base_frame"; relative: 1 0; } + align: 0.5 0; + min: 0 23; + fixed: 0 1; + color: 0 0 0 255; + } + } + part { name: "title_icon"; + type: IMAGE; + scale: 1; + clip_to: "clipper"; + description { + align: 0 0.5; + min: 20 20; + max: 20 20; + fixed: 1 1; + rel1.to: "title_frame"; + rel2.to: "title_frame"; + image.normal: "new.png"; + } + } + part { name: "elm.text.title"; + type: TEXT; + scale: 1; + clip_to: "clipper"; + effect: GLOW; + description { + rel1.to: "title_frame"; + rel2.to: "title_frame"; + align: 0.5 0.5; + fixed: 1 1; + text { + font: FN; + size: 12; + align: 0.5 0.5; + min: 1 0; + } + color: 51 153 255 255; + color2: 51 153 255 24; + color3: 51 153 255 18; + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + clip_to: "clipper"; + description { + rel1 { to: "title_frame"; relative: 0 1; offset: 0 5; } + rel2 { to: "base_frame"; relative: 1 0.91; } + } + } + part { name: "elm.swallow.ok_btn"; + type: SWALLOW; + scale: 1; + clip_to: "clipper"; + description { + align: 1 1; + min: 50 25; + fixed: 1 1; + rel1.to: "base_frame"; + rel1.relative: 0.5 1; + rel2.to: "base_frame"; + rel2.relative: 0.5 1; + rel2.offset: -2 -1; + } + } + part { name: "elm.swallow.cancel_btn"; + type: SWALLOW; + scale: 1; + clip_to: "clipper"; + description { + align: 0 1; + min: 50 25; + fixed: 1 1; + rel1.to: "base_frame"; + rel1.relative: 0.5 1; + rel1.offset: 1 0; + rel2.to: "base_frame"; + rel2.relative: 0.5 1; + } + } + part { name: "event_blocker"; + type: RECT; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 1; + } + description { state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { name: "over_img"; + type: IMAGE; + scale: 1; + clip_to: "clipper"; + mouse_events: 0; + description { + rel1 { to: "base_frame_img"; relative: 0 0; } + rel2 { to: "base_frame_img"; relative: 1 1; } + image.normal: "bub_over_bot.png"; + } + } + } + programs { + program { name: "load"; + signal: "load"; + action: STATE_SET "show" 0.0; + transition: "DECELERATE" 0.5; + target: "clipper"; + after: "event_blocker_hide"; + } + program { name: "dismiss"; + signal: "elm,state,dismiss"; + source: ""; + action: STATE_SET "default" 0.0; + target: "clipper"; + target: "event_blocker"; + after: "dismiss_done"; + } + program { name: "event_blocker_hide"; + signal: "elm,state,event_blocker,hide"; + source: ""; + action: STATE_SET "hide" 0.0; + target: "event_blocker"; + } + program { name: "dismiss_done"; + action: SIGNAL_EMIT "elm,state,dismiss,done" ""; + } + } +} + group { name: "warning_layout"; parts { part { name: "clipper"; diff --git a/src/bin/globals.c b/src/bin/globals.c index 9690742..82f7444 100644 --- a/src/bin/globals.c +++ b/src/bin/globals.c @@ -1,5 +1,5 @@ #include #include "common.h" -const char *PROTO_EDC_PATH = "/tmp/.proto.edc"; +const char *DEFAULT_EDC_PATH = "/tmp/enventor.edc"; char EDJE_PATH[PATH_MAX]; diff --git a/src/bin/main.c b/src/bin/main.c index 3e23829..d58c3ee 100644 --- a/src/bin/main.c +++ b/src/bin/main.c @@ -34,9 +34,9 @@ edc_changed_cb(void *data, int type EINA_UNUSED, void *event) } static Eina_Bool -edc_proto_setup() +edc_default_setup() { - newfile_new(NULL, EINA_TRUE); + newfile_default_set(); build_edc(); return EINA_TRUE; @@ -442,7 +442,7 @@ args_dispatch(int argc, char **argv, char *edc_path, char *img_path, } defaults: - if (default_edc) sprintf(edc_path, "%s", PROTO_EDC_PATH); + if (default_edc) sprintf(edc_path, "%s", DEFAULT_EDC_PATH); } static void @@ -519,7 +519,7 @@ init(app_data *ad, int argc, char **argv) config_data_set(ad, argc, argv); if (!build_init()) return EINA_FALSE; - if (!edc_proto_setup()) return EINA_FALSE; + if (!edc_default_setup()) return EINA_FALSE; if (!base_gui_init()) return EINA_FALSE; edj_mgr_set(); diff --git a/src/bin/menu.c b/src/bin/menu.c index e58a9e1..86cdaa1 100644 --- a/src/bin/menu.c +++ b/src/bin/menu.c @@ -4,6 +4,7 @@ struct menu_s { Evas_Object *menu_layout; + Evas_Object *newfile_layout; Evas_Object *setting_layout; Evas_Object *warning_layout; Evas_Object *fileselector_layout; @@ -46,6 +47,13 @@ fileselector_close() elm_object_signal_emit(md->fileselector_layout, "elm,state,dismiss", ""); } +static void +newfile_close() +{ + menu_data *md = g_md; + elm_object_signal_emit(md->newfile_layout, "elm,state,dismiss", ""); +} + static void about_close() { @@ -75,6 +83,22 @@ menu_close() elm_object_signal_emit(md->menu_layout, "elm,state,dismiss", ""); } +static void +newfile_dismiss_done(void *data, Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, + const char *source EINA_UNUSED) +{ + menu_data *md = data; + evas_object_del(md->newfile_layout); + md->newfile_layout = NULL; + md->open_depth--; + if (md->menu_layout) + { + elm_object_disabled_set(md->menu_layout, EINA_FALSE); + elm_object_focus_set(md->menu_layout, EINA_TRUE); + } +} + static void fileselector_dismiss_done(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, @@ -145,8 +169,61 @@ warning_dismiss_done(void *data, Evas_Object *obj EINA_UNUSED, } static void -warning_open(menu_data *md, Evas_Smart_Cb yes_cb, - Evas_Smart_Cb save_cb) +newfile_ok_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + menu_data *md = data; + newfile_set(md->ed); + newfile_close(md); + menu_close(md); +} + +static void +newfile_cancel_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + menu_data *md = data; + newfile_close(md); +} + +void +newfile_open(menu_data *md) +{ + if (md->newfile_layout) return; + + Evas_Object *layout = elm_layout_add(base_win_get()); + elm_layout_file_set(layout, EDJE_PATH, "newfile_layout"); + elm_object_part_text_set(layout, "elm.text.title", "New File: choose a template."); + elm_object_signal_callback_add(layout, "elm,state,dismiss,done", "", + newfile_dismiss_done, md); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(layout); + base_win_resize_object_add(layout); + + elm_object_part_content_set(layout, "elm.swallow.content", + newfile_create(layout)); + Evas_Object *btn; + + //Ok Button + btn = elm_button_add(layout); + elm_object_text_set(btn, "Ok"); + evas_object_smart_callback_add(btn, "clicked", newfile_ok_btn_cb, md); + elm_object_part_content_set(layout, "elm.swallow.ok_btn", btn); + + //Cancel Button + btn = elm_button_add(layout); + elm_object_text_set(btn, "Cancel"); + evas_object_smart_callback_add(btn, "clicked", newfile_cancel_btn_cb, md); + elm_object_part_content_set(layout, "elm.swallow.cancel_btn", btn); + + if (md->menu_layout) elm_object_disabled_set(md->menu_layout, EINA_TRUE); + + md->newfile_layout = layout; + md->open_depth++; +} + +static void +warning_open(menu_data *md, Evas_Smart_Cb yes_cb, Evas_Smart_Cb save_cb) { if (md->warning_layout) return; @@ -603,7 +680,7 @@ new_yes_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { menu_data *md = data; - newfile_new(md->ed, EINA_FALSE); + newfile_open(md); warning_close(md); menu_close(md); } @@ -674,7 +751,7 @@ new_save_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, menu_data *md = data; edit_save(md->ed); - newfile_new(md->ed, EINA_FALSE); + newfile_open(md); warning_close(md); menu_close(md); } @@ -1003,20 +1080,14 @@ menu_setting() setting_open(md); } -Eina_Bool +void menu_edc_new() { menu_data *md = g_md; if (edit_changed_get(md->ed)) - { - warning_open(md, new_yes_btn_cb, new_save_btn_cb); - return EINA_TRUE; - } - - newfile_new(md->ed, EINA_FALSE); - menu_close(md); - - return EINA_FALSE; + warning_open(md, new_yes_btn_cb, new_save_btn_cb); + else + newfile_open(md); } void @@ -1051,6 +1122,11 @@ menu_toggle() warning_close(md); return; } + if (md->newfile_layout) + { + newfile_close(md); + return; + } if (md->fileselector_layout) { fileselector_close(md); diff --git a/src/bin/newfile.c b/src/bin/newfile.c index b9a9870..d101fd0 100644 --- a/src/bin/newfile.c +++ b/src/bin/newfile.c @@ -1,21 +1,54 @@ #include #include "common.h" +typedef struct new_data_s { + Evas_Object *list; + Eina_List *templates; +} new_data; + +static new_data *g_nd = NULL; + +static void +list_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + new_data *nd = g_nd; + free(g_nd); + g_nd = NULL; +} void -newfile_new(edit_data *ed, Eina_Bool init) +newfile_set(edit_data *ed) +{ + new_data *nd = g_nd; + if (!nd) return; + + Elm_Object_Item *it = elm_list_selected_item_get(nd->list); + if (!it) return; + + Eina_Bool success = EINA_TRUE; + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "%s/templates/%s.edc", + elm_app_data_dir_get(), elm_object_item_text_get(it)); + config_edc_path_set(DEFAULT_EDC_PATH); + success = eina_file_copy(buf, config_edc_path_get(), + EINA_FILE_COPY_DATA, NULL, NULL); + if (!success) + { + EINA_LOG_ERR("Cannot find file! \"%s\"", buf); + return; + } + edit_edc_reload(ed, DEFAULT_EDC_PATH); +} + +void +newfile_default_set() { Eina_Bool success = EINA_TRUE; char buf[PATH_MAX]; - snprintf(buf, sizeof(buf), "%s/.proto/proto.edc", + snprintf(buf, sizeof(buf), "%s/templates/basic.edc", elm_app_data_dir_get()); - if (!init) - { - config_edc_path_set(PROTO_EDC_PATH); - success = eina_file_copy(buf, config_edc_path_get(), - EINA_FILE_COPY_DATA, NULL, NULL); - } - else if (!ecore_file_exists(config_edc_path_get())) + if (!ecore_file_exists(config_edc_path_get())) { success = eina_file_copy(buf,config_edc_path_get(), EINA_FILE_COPY_DATA, NULL, NULL); @@ -25,6 +58,105 @@ newfile_new(edit_data *ed, Eina_Bool init) EINA_LOG_ERR("Cannot find file! \"%s\"", buf); return; } - - if (!init) edit_edc_reload(ed, PROTO_EDC_PATH); +} + +static void +file_dir_list_cb(const char *name, const char *path, void *data) +{ + new_data *nd = data; + + char *ext = strrchr(name, '.'); + if (!ext || strcmp(ext, ".edc")) return; + + char *file_name = ecore_file_strip_ext(name); + nd->templates = eina_list_append(nd->templates, + eina_stringshare_add(file_name)); + free(file_name); +} + +static void +list_item_selected_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *layout = data; + Elm_Object_Item *it = event_info; + + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "%s/templates/%s.edj", elm_app_data_dir_get(), + elm_object_item_text_get(it)); + + elm_layout_file_set(layout, buf, "main"); +} + +static void +templates_get(new_data *nd) +{ + Eina_Iterator *itr; + + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "%s/templates", elm_app_data_dir_get()); + + if (!ecore_file_path_dir_exists(buf)) + { + EINA_LOG_ERR("Cannot find templates folder! \"%s\"", buf); + return; + } + + eina_file_dir_list(buf, EINA_FALSE, file_dir_list_cb, nd); +} + +Evas_Object * +newfile_create(Evas_Object *parent) +{ + new_data *nd = g_nd; + if (!nd) + { + nd = calloc(1, sizeof(new_data)); + g_nd = nd; + } + + //Grid + Evas_Object *grid = elm_grid_add(parent); + + //Preview Layout + Evas_Object *layout = elm_layout_add(grid); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(layout); + + elm_grid_pack(grid, layout, 2, 2, 46, 98); + + templates_get(nd); + + //List + Evas_Object *list = elm_list_add(grid); + elm_object_focus_set(list, EINA_TRUE); + evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL); + + Eina_List *l; + Eina_Stringshare *name; + Elm_Object_Item *it; + Eina_Bool first_item = EINA_TRUE; + + EINA_LIST_REVERSE_FOREACH(nd->templates, l, name) + { + it = elm_list_item_append(list, name, NULL, NULL, list_item_selected_cb, + layout); + if (first_item) + { + elm_list_item_selected_set(it, EINA_TRUE); + first_item = EINA_FALSE; + } + } + evas_object_event_callback_add(list, EVAS_CALLBACK_DEL, list_del_cb, NULL); + evas_object_show(list); + + elm_grid_pack(grid, list, 50, 0, 50, 100); + + EINA_LIST_FREE(nd->templates, name) + eina_stringshare_del(name); + + nd->list = list; + + return grid; } diff --git a/src/include/globals.h b/src/include/globals.h index cbeaecb..a359b13 100644 --- a/src/include/globals.h +++ b/src/include/globals.h @@ -1,2 +1,2 @@ -extern const char *PROTO_EDC_PATH; +extern const char *DEFAULT_EDC_PATH; extern char EDJE_PATH[PATH_MAX]; diff --git a/src/include/menu.h b/src/include/menu.h index bf48b14..692dca5 100644 --- a/src/include/menu.h +++ b/src/include/menu.h @@ -3,7 +3,7 @@ void menu_term(); void menu_toggle(); void menu_ctxpopup_register(Evas_Object *ctxpopup); void menu_ctxpopup_unregister(Evas_Object *ctxpopup); -Eina_Bool menu_edc_new(); +void menu_edc_new(); void menu_edc_save(); void menu_edc_load(); void menu_exit(); diff --git a/src/include/newfile.h b/src/include/newfile.h index 730757d..5adc18b 100644 --- a/src/include/newfile.h +++ b/src/include/newfile.h @@ -1 +1,3 @@ -void newfile_new(edit_data *ed, Eina_Bool init); +void newfile_default_set(); +void newfile_set(edit_data *ed); +Evas_Object * newfile_create(Evas_Object *parent);