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);

-- 


Reply via email to