jaehwan pushed a commit to branch master. http://git.enlightenment.org/tools/eflete.git/commit/?id=5435b55e0e13c64afc0764cd874e88b72a244953
commit 5435b55e0e13c64afc0764cd874e88b72a244953 Author: Jaehwan Kim <[email protected]> Date: Thu Jun 16 15:55:32 2016 +0900 group_navigator: copy the style by command Use like eflete -w button:default[default2] ~/default.edj It will copy the default style to default2 style. group navigator show "default2" that is copied "default" style --- src/bin/common/widget_list.c | 91 ++++++++++++++++++++++++++++++- src/bin/common/widget_list.h | 3 + src/bin/main.c | 2 +- src/bin/project_manager/group_manager.c | 1 + src/bin/project_manager/project_manager.c | 4 +- src/bin/project_manager/project_manager.h | 2 +- src/bin/ui/tab_home_common.c | 38 ++++++++++++- src/bin/ui/tab_home_import_edc.c | 4 +- src/bin/ui/tab_home_import_edj.c | 17 ++++-- src/bin/ui/tab_home_new.c | 4 +- src/bin/ui/tabs_private.h | 2 +- 11 files changed, 152 insertions(+), 16 deletions(-) diff --git a/src/bin/common/widget_list.c b/src/bin/common/widget_list.c index 0e3231f..46330f4 100644 --- a/src/bin/common/widget_list.c +++ b/src/bin/common/widget_list.c @@ -250,7 +250,7 @@ option_widget_name_get(const char *str, Eina_List **style_list) char widget[32], style[256]; Eina_List *list = NULL; int i, first = 0; - Eina_Bool is_style = EINA_FALSE; + Eina_Bool is_style = EINA_FALSE, copying = EINA_FALSE; for (i = 0; i < len; i++) { @@ -268,7 +268,12 @@ option_widget_name_get(const char *str, Eina_List **style_list) } else { - if (str[i] == ',') + if (str[i] == '[') + copying = EINA_TRUE; + else if (str[i] == ']') + copying = EINA_FALSE; + + if (!copying && str[i] == ',') { style[i - first] = '\0'; list = eina_list_append(list, strdup(style)); @@ -291,3 +296,85 @@ option_widget_name_get(const char *str, Eina_List **style_list) return strdup(widget); } + +const char * +option_style_name_get(const char *str, Eina_List **cp_style_list) +{ + int len = strlen(str); + char style[32], cp_style[256]; + Eina_List *list = NULL; + int i, first = 0; + Eina_Bool is_cp_style = EINA_FALSE; + + for (i = 0; i < len; i++) + { + if (str[i] == '[') + { + is_cp_style = EINA_TRUE; + style[i] = '\0'; + first = i + 1; + continue; + } + else if (str[i] == ']') + break; + + if (!is_cp_style) + { + style[i] = str[i]; + } + else + { + if (str[i] == ',') + { + cp_style[i - first] = '\0'; + list = eina_list_append(list, strdup(cp_style)); + first = i + 1; + continue; + } + cp_style[i - first] = str[i]; + } + } + + if (!is_cp_style) + style[i] = '\0'; + else + { + cp_style[i - first] = '\0'; + list = eina_list_append(list, strdup(cp_style)); + } + + *cp_style_list = list; + + return strdup(style); +} + +Eina_List * +widget_prefix_list_get(Eina_List *collections, const char *widget_name, const char *style_name) +{ + Eina_List *l, *list = NULL; + Eina_Stringshare *group_name; + char prefix[1024]; + const char *widget = NULL; + const char *style = NULL; + int i, end = 0; + + EINA_LIST_FOREACH(collections, l, group_name) + { + widget = widget_name_get(group_name); + + if (widget && !strcmp(widget, widget_name)) + { + style = style_name_get(group_name); + if (style && !strcmp(style, style_name)) + { + end = strlen(group_name) - strlen(strrchr(group_name, '/')) + 1; + for (i = 0; i < end; i++) + prefix[i] = group_name[i]; + prefix[i] = '\0'; + + list = eina_list_append(list, strdup(prefix)); + } + } + } + return list; +} diff --git a/src/bin/common/widget_list.h b/src/bin/common/widget_list.h index 35683a4..1a40b87 100644 --- a/src/bin/common/widget_list.h +++ b/src/bin/common/widget_list.h @@ -25,6 +25,7 @@ struct _Tree_Item_Data const char *name; Eina_Bool check; Eina_List *list; + Eina_List *copy; }; typedef struct _Tree_Item_Data Tree_Item_Data; @@ -41,5 +42,7 @@ const char *item_style_name_get(const Eina_Stringshare *group_name, Eina_List *s Eina_Bool style_name_check(const Eina_Stringshare *group_name, const char *style_name); Eina_Bool item_style_name_check(const Eina_Stringshare *group_name, const char *style_name, Eina_List *style_list); const char *option_widget_name_get(const char *str, Eina_List **style_list); +const char *option_style_name_get(const char *str, Eina_List **cp_style_list); +Eina_List *widget_prefix_list_get(Eina_List *collections, const char *widget_name, const char *style_name); #endif /* WIDGET_LIST_H */ diff --git a/src/bin/main.c b/src/bin/main.c index 1553230..72f4dcf 100644 --- a/src/bin/main.c +++ b/src/bin/main.c @@ -65,7 +65,7 @@ static const Ecore_Getopt options = { ECORE_GETOPT_APPEND_METAVAR('s', "sd", "Add sound directory for edc compilation", "DIR_NAME", ECORE_GETOPT_TYPE_STR), ECORE_GETOPT_APPEND_METAVAR('f', "fd", "Add font directory for edc compilation", "DIR_NAME", ECORE_GETOPT_TYPE_STR), ECORE_GETOPT_APPEND_METAVAR('d', "dd", "Add data directory for edc compilation", "DIR_NAME", ECORE_GETOPT_TYPE_STR), - ECORE_GETOPT_APPEND_METAVAR('w', "widget", "Add widget to new project or import edj-file. Add its styles if the style names are added", "WIDGET_NAME[:STYLE_NAME, ...]", ECORE_GETOPT_TYPE_STR), + ECORE_GETOPT_APPEND_METAVAR('w', "widget", "Add widget to new project or import edj-file. Add its styles if the style names are added. Copy its styles if the copy style names are added", "WIDGET:STYLE[COPY_STYLE,..],..", ECORE_GETOPT_TYPE_STR), ECORE_GETOPT_STORE_TRUE('r', "reopen", "reopen last project"), ECORE_GETOPT_VERSION ('v', "version"), ECORE_GETOPT_COPYRIGHT('c', "copyright"), diff --git a/src/bin/project_manager/group_manager.c b/src/bin/project_manager/group_manager.c index b98c98d..06fb6b2 100644 --- a/src/bin/project_manager/group_manager.c +++ b/src/bin/project_manager/group_manager.c @@ -787,6 +787,7 @@ _is_checked(Eina_List *widgets) EINA_LIST_FOREACH(widget->list, ll, style) { if (style->check) return EINA_TRUE; + if (style->copy) return EINA_TRUE; EINA_LIST_FOREACH(style->list, lll, item_style) if (item_style->check) return EINA_TRUE; } diff --git a/src/bin/project_manager/project_manager.c b/src/bin/project_manager/project_manager.c index 51550a5..02eb77c 100644 --- a/src/bin/project_manager/project_manager.c +++ b/src/bin/project_manager/project_manager.c @@ -229,13 +229,15 @@ _end_send(void *data __UNUSED__) PM_Project_End_Cb func; PM_Project_Result result; void *udata; + Eina_List *widgets = NULL; /** Copy the links to callback and meesage, to fast release worker resource. */ worker.func_progress = NULL; func = worker.func_end; result = worker.result; udata = worker.data; - func(udata, result); + widgets = worker.widgets; + func(udata, result, widgets); } static Eina_Bool diff --git a/src/bin/project_manager/project_manager.h b/src/bin/project_manager/project_manager.h index a9e43de..5b69235 100644 --- a/src/bin/project_manager/project_manager.h +++ b/src/bin/project_manager/project_manager.h @@ -182,7 +182,7 @@ typedef Eina_Bool * @ingroup ProjectManager */ typedef void -(* PM_Project_End_Cb)(void *data, PM_Project_Result result); +(* PM_Project_End_Cb)(void *data, PM_Project_Result result, Eina_List *widgets); /** * Free the Project Thread object. diff --git a/src/bin/ui/tab_home_common.c b/src/bin/ui/tab_home_common.c index 7cc5f5e..8482bd5 100644 --- a/src/bin/ui/tab_home_common.c +++ b/src/bin/ui/tab_home_common.c @@ -23,6 +23,7 @@ #include "project_navigator.h" #include "config.h" #include "project_common.h" +#include "widget_list.h" void meta_controls_add(Evas_Object *layout, Meta_Data_Controls *meta) @@ -90,8 +91,41 @@ entry_path_set(void *data, return true; } +_group_copy(Project *pro, Eina_List *widgets) +{ + Eina_List *collections, *prefixs, *wl, *sl, *cl, *gl; + Tree_Item_Data *widget, *style; + char *cp_style_name = NULL; + char *prefix = NULL; + char group_name[1024]; + char cp_group_name[1024]; + + collections = edje_file_collection_list(pro->dev); + + EINA_LIST_FOREACH(widgets, wl, widget) + { + EINA_LIST_FOREACH(widget->list, sl, style) + { + if (style->copy) + { + prefixs = widget_prefix_list_get(collections, widget->name, style->name); + EINA_LIST_FOREACH(style->copy, cl, cp_style_name) + { + EINA_LIST_FOREACH(prefixs, gl, prefix) + { + snprintf(group_name, strlen(prefix) + strlen(style->name) + 1, "%s%s", prefix, style->name); + snprintf(cp_group_name, strlen(prefix) + strlen(cp_style_name) + 1, "%s%s", prefix, cp_style_name); + CRIT_ON_FAIL(editor_group_copy(ap.project->global_object, group_name, cp_group_name)); + gm_group_add(ap.project, cp_group_name); + } + } + } + } + } +} + void -_tabs_progress_end(void *data, PM_Project_Result result) +_tabs_progress_end(void *data, PM_Project_Result result, Eina_List *widgets) { Meta_Data_Controls *meta = (Meta_Data_Controls *)data; @@ -120,6 +154,8 @@ _tabs_progress_end(void *data, PM_Project_Result result) project_navigator_project_set(); //tabs_menu_tab_open(TAB_HOME_PROJECT_INFO); + _group_copy(ap.project, widgets); + config_recent_add(ap.project->name, ap.project->pro_path); _tab_open_project_recents_update(); evas_object_smart_callback_call(ap.win, SIGNAL_PROJECT_OPENED, NULL); diff --git a/src/bin/ui/tab_home_import_edc.c b/src/bin/ui/tab_home_import_edc.c index 9105498..5b3171c 100644 --- a/src/bin/ui/tab_home_import_edc.c +++ b/src/bin/ui/tab_home_import_edc.c @@ -356,7 +356,7 @@ _progress_print(void *data, Eina_Stringshare *progress_string) } static void -_progress_end(void *data, PM_Project_Result result) +_progress_end(void *data, PM_Project_Result result, Eina_List *widgets) { if (PM_PROJECT_ERROR == result) popup_log_message_helper(eina_strbuf_string_get(tab_edc.log)); @@ -375,7 +375,7 @@ _progress_end(void *data, PM_Project_Result result) elm_entry_entry_set(tab_edc.meta.licenses, NULL); elm_entry_entry_set(tab_edc.meta.comment, N_("Created with Eflete!")); } - _tabs_progress_end(data, result); + _tabs_progress_end(data, result, widgets); } static Eina_Bool diff --git a/src/bin/ui/tab_home_import_edj.c b/src/bin/ui/tab_home_import_edj.c index 19fb716..84ef6f9 100644 --- a/src/bin/ui/tab_home_import_edj.c +++ b/src/bin/ui/tab_home_import_edj.c @@ -446,7 +446,7 @@ _template_theme_changed(void *data __UNUSED__, } static void -_progress_end(void *data, PM_Project_Result result) +_progress_end(void *data, PM_Project_Result result, Eina_List *widgets) { if (PM_PROJECT_SUCCESS == result) { @@ -459,7 +459,7 @@ _progress_end(void *data, PM_Project_Result result) elm_entry_entry_set(tab_edj.meta.comment, N_("Created with Eflete!")); } - _tabs_progress_end(data, result); + _tabs_progress_end(data, result, widgets); } static Eina_Bool @@ -645,6 +645,7 @@ _tab_import_edj_data_set(const char *name, const char *path, const char *edj, co { const Eina_List *l, *wl, *wll, *wlll, *wllll; Eina_List *style_list = NULL; + Eina_List *cp_style_list = NULL; const char *str, *widget_name, *style_name; Eina_Strbuf *buf = eina_strbuf_new(); Eina_Bool first_not_found = true; @@ -685,15 +686,21 @@ _tab_import_edj_data_set(const char *name, const char *path, const char *edj, co { EINA_LIST_FOREACH(style_list, wlll, style_name) { + style_name = option_style_name_get(style_name, &cp_style_list); + EINA_LIST_FOREACH(widget->list, wll, style) { if (!strcasecmp(style_name, style->name)) { - EINA_LIST_FOREACH(style->list, wllll, item_style) + style->copy = cp_style_list; + if (!(style->copy)) { - item_style->check = true; + EINA_LIST_FOREACH(style->list, wllll, item_style) + { + item_style->check = true; + } + style->check = true; } - style->check = true; break; } } diff --git a/src/bin/ui/tab_home_new.c b/src/bin/ui/tab_home_new.c index a729b81..449582d 100644 --- a/src/bin/ui/tab_home_new.c +++ b/src/bin/ui/tab_home_new.c @@ -430,7 +430,7 @@ _edc_code_generate(Eina_Stringshare *path) /* SPLASH */ static void -_progress_end(void *data, PM_Project_Result result) +_progress_end(void *data, PM_Project_Result result, Eina_List *widgets) { if (PM_PROJECT_SUCCESS == result) { @@ -442,7 +442,7 @@ _progress_end(void *data, PM_Project_Result result) elm_entry_entry_set(tab_new.meta.comment, N_("Created with Eflete!")); _checks_set(false); } - _tabs_progress_end(data, result); + _tabs_progress_end(data, result, widgets); } static Eina_Bool diff --git a/src/bin/ui/tabs_private.h b/src/bin/ui/tabs_private.h index a717d41..2c55912 100644 --- a/src/bin/ui/tabs_private.h +++ b/src/bin/ui/tabs_private.h @@ -77,7 +77,7 @@ Eina_Bool entry_path_set(void *data, Evas_Object *obj, void *event_info); void -_tabs_progress_end(void *data, PM_Project_Result result); +_tabs_progress_end(void *data, PM_Project_Result result, Eina_List *widgets); void _tab_default_focus(void *data, Evas *e, Evas_Object *obj, void *event_info); --
