ajwillia-ms pushed a commit to branch master.

http://git.enlightenment.org/tools/edi.git/commit/?id=31d2d309809bef10a99bc0fb81cc447fa70a048f

commit 31d2d309809bef10a99bc0fb81cc447fa70a048f
Author: Andy Williams <a...@andywilliams.me>
Date:   Thu Jun 8 23:13:02 2017 -0700

    welcome: Add support to clone a project from the welcome screen
    
    Also re-lay it out a little to be clearer :)
---
 src/bin/screens/edi_welcome.c | 134 +++++++++++++++++++++++++++---------------
 src/lib/edi_scm.c             |  13 ++++
 src/lib/edi_scm.h             |  13 ++++
 3 files changed, 114 insertions(+), 46 deletions(-)

diff --git a/src/bin/screens/edi_welcome.c b/src/bin/screens/edi_welcome.c
index a101643..0c2400a 100644
--- a/src/bin/screens/edi_welcome.c
+++ b/src/bin/screens/edi_welcome.c
@@ -252,21 +252,6 @@ _edi_skeleton_free(Edi_Skeleton *skel)
      }
 }
 
-static Edi_Skeleton *
-_edi_skeleton_from_name(const char *name)
-{
-   Eina_List *l;
-   Edi_Skeleton *skel;
-
-   EINA_LIST_FOREACH(_available_skeletons, l, skel)
-     {
-        if (!strcmp(skel->name, name))
-          return skel;
-     }
-
-   return NULL;
-}
-
 static void
 _edi_skeletons_discover(const char *path)
 {
@@ -457,15 +442,58 @@ _edi_welcome_project_new_cb(void *data, Evas_Object *obj 
EINA_UNUSED, void *even
    elm_table_pack(content, button, _EDI_WELCOME_PROJECT_NEW_TABLE_WIDTH - 2, 
row, 2, 1);
    evas_object_smart_callback_add(button, "clicked", 
_edi_welcome_project_new_create_cb, NULL);
 
-   item = elm_naviframe_item_push(naviframe,
-                                "Create New Project",
-                                NULL,
-                                NULL,
-                                content,
-                                NULL);
-
+   item = elm_naviframe_item_push(naviframe, "Create New Project",
+                                  NULL, NULL, content, NULL);
    elm_naviframe_item_title_enabled_set(item, EINA_TRUE, EINA_TRUE);
+}
+
+static void
+_edi_welcome_project_clone_click_cb(void *data EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   Evas_Object *entry;
+   const char *url, *parent, *name, *dir;
+   int status;
+
+   entry = elm_layout_content_get(_create_inputs[1], "elm.swallow.entry");
+   parent = elm_object_text_get(entry);
+   name = elm_object_text_get(_create_inputs[2]);
+   url = elm_object_text_get(_create_inputs[0]);
+
+   dir = edi_path_append(parent, name);
+   status = edi_scm_git_clone(url, dir);
+   if (status)
+     _edi_message_open("Unable to clone project, please check URL or try again 
later", EINA_TRUE);
+   else
+     _edi_welcome_project_open(dir, EINA_FALSE);
+}
+
+static void
+_edi_welcome_project_clone_cb(void *data, Evas_Object *obj EINA_UNUSED, void 
*event_info EINA_UNUSED)
+{
+   Evas_Object *content, *button, *naviframe = data;
+   Elm_Object_Item *item;
+   int row = 0;
+
+   content = elm_table_add(naviframe);
+   elm_table_homogeneous_set(content, EINA_TRUE);
+   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_directory_row_add("Parent Path", row++, content);
+   _edi_welcome_project_new_input_row_add("Project Name", NULL, row++, 
content);
+
+   button = elm_button_add(content);
+   elm_object_text_set(button, "Checkout");
+   evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, 
EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_show(button);
+   elm_table_pack(content, button, _EDI_WELCOME_PROJECT_NEW_TABLE_WIDTH - 2, 
row, 2, 1);
+   evas_object_smart_callback_add(button, "clicked", 
_edi_welcome_project_clone_click_cb, NULL);
 
+   item = elm_naviframe_item_push(naviframe, "Checkout Existing Project",
+                                  NULL, NULL, content, NULL);
+   elm_naviframe_item_title_enabled_set(item, EINA_TRUE, EINA_TRUE);
 }
 
 static void
@@ -542,9 +570,28 @@ _edi_welcome_add_recent_projects(Evas_Object *box)
    evas_object_show(list);
 }
 
+static Evas_Object *
+_edi_welcome_button_create(const char *title, const char *icon_name,
+                           Evas_Object *parent, Evas_Smart_Cb func, void *data)
+{
+   Evas_Object *button, *icon;
+
+   button = elm_button_add(parent);
+   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, 0.0);
+   _edi_create_button = button;
+   elm_object_text_set(button, title);
+   icon = elm_icon_add(button);
+   elm_icon_standard_set(icon, icon_name);
+   elm_object_part_content_set(button, "icon", icon);
+   evas_object_smart_callback_add(button, "clicked", func, data);
+   evas_object_show(button);
+
+   return button;
+}
+
 Evas_Object *edi_welcome_show()
 {
-   Evas_Object *win, *hbx, *box, *button, *icon, *frame, *image, *naviframe;
+   Evas_Object *win, *hbx, *box, *button, *frame, *image, *naviframe;
    Elm_Object_Item *item;
    char buf[PATH_MAX];
 
@@ -567,16 +614,27 @@ Evas_Object *edi_welcome_show()
    evas_object_show(hbx);
 
    /* Existing projects area */
-   frame = elm_frame_add(hbx);
+   box = elm_box_add(hbx);
+   evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_box_pack_end(hbx, box);
+   evas_object_show(box);
+
+   frame = elm_frame_add(box);
    elm_object_text_set(frame, "Recent Projects:");
-   evas_object_size_hint_weight_set(frame, EVAS_HINT_EXPAND, 0.0);
+   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);
-   elm_box_pack_end(hbx, frame);
+   elm_box_pack_end(box, frame);
    evas_object_show(frame);
 
    _edi_project_box = frame;
    _edi_welcome_add_recent_projects(frame);
 
+   button = _edi_welcome_button_create("Open Existing Project", "folder",
+                                       box, _edi_welcome_project_choose_cb, 
NULL);
+   elm_box_pack_end(box, button);
+
+
    /* New project area */
    box = elm_box_add(hbx);
    evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -592,29 +650,13 @@ Evas_Object *edi_welcome_show()
    elm_box_pack_end(box, image);
    evas_object_show(image);
 
-   button = elm_button_add(box);
-   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, 0.0);
-   _edi_open_button = button;
-   elm_object_text_set(button, "Open Existing Project");
-   icon = elm_icon_add(button);
-   elm_icon_standard_set(icon, "folder");
-   elm_object_part_content_set(button, "icon", icon);
-   evas_object_smart_callback_add(button, "clicked",
-                                       _edi_welcome_project_choose_cb, NULL);
+   button = _edi_welcome_button_create("Create New Project", "folder-new",
+                                       box, _edi_welcome_project_new_cb, 
naviframe);
    elm_box_pack_end(box, button);
-   evas_object_show(button);
 
-   button = elm_button_add(box);
-   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, 0.0);
-   _edi_create_button = button;
-   elm_object_text_set(button, "Create New Project");
-   icon = elm_icon_add(button);
-   elm_icon_standard_set(icon, "folder-new");
-   elm_object_part_content_set(button, "icon", icon);
-   evas_object_smart_callback_add(button, "clicked",
-                                       _edi_welcome_project_new_cb, naviframe);
+   button = _edi_welcome_button_create("Checkout Existing Project", 
"network-server",
+                                       box, _edi_welcome_project_clone_cb, 
naviframe);
    elm_box_pack_end(box, button);
-   evas_object_show(button);
 
    item = elm_naviframe_item_push(naviframe,
                                 "Choose Project",
diff --git a/src/lib/edi_scm.c b/src/lib/edi_scm.c
index ee946d4..99418b0 100644
--- a/src/lib/edi_scm.c
+++ b/src/lib/edi_scm.c
@@ -61,6 +61,19 @@ edi_scm_git_new(void)
    return _edi_scm_exec("git init .");
 }
 
+EAPI int
+edi_scm_git_clone(const char *url, const char *dir)
+{
+   int code;
+   Eina_Strbuf *command = eina_strbuf_new();
+
+   eina_strbuf_append_printf(command, "git clone '%s' '%s'", url, dir);
+   code = edi_exe_wait(eina_strbuf_string_get(command));
+
+   eina_strbuf_free(command);
+   return code;
+}
+
 static int
 _edi_scm_git_file_add(const char *path)
 {
diff --git a/src/lib/edi_scm.h b/src/lib/edi_scm.h
index b157f19..a2fe542 100644
--- a/src/lib/edi_scm.h
+++ b/src/lib/edi_scm.h
@@ -76,11 +76,24 @@ void edi_scm_shutdown();
 /**
  * Set up a new git repository for the current project.
  *
+ * @return The status code of the init command.
+ *
  * @ingroup Scm
  */
 EAPI int edi_scm_git_new(void);
 
 /**
+ * Clone an existing git repository from the provided url.
+ *
+ * @param url the URL to clone from.
+ * @param dir the new directory that will be created to clone into
+ * @return The status code of the clone command.
+ *
+ * @ingroup Scm
+ */
+EAPI int edi_scm_git_clone(const char *url, const char *dir);
+
+/**
  * Get a pointer to the SCM engine in use.
  *
  * @return The pointer to the engine or NULL.

-- 


Reply via email to