create: Allow detection of skeletons of different type.

In input ask user to choose which skeleton to use.
Thanks for the contribution davemds
This commit is contained in:
Andy Williams 2017-05-28 21:24:24 +01:00
parent 0bc52e975e
commit 06954e00ef
5 changed files with 171 additions and 22 deletions

View File

@ -111,7 +111,8 @@ 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],
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);
}
@ -164,10 +165,11 @@ main(int argc, char **argv)
if (!strncmp("create", build_type, 6))
{
if (argc - args != 6)
if (argc - args != 7)
{
fprintf(stderr, "create requires 5 additional parameters:\n");
fprintf(stderr, " parent_path, project_name, project_url, creator_name, creator_email\n");
fprintf(stderr, "create requires 6 additional parameters:\n");
fprintf(stderr, " skeleton, parent_path, project_name, "
"project_url, creator_name, creator_email\n");
goto end;
}

View File

@ -91,6 +91,7 @@ extern Edi_Project_Config *_edi_project_config;
Eina_Bool _edi_config_init(void);
Eina_Bool _edi_config_shutdown(void);
const char *_edi_config_dir_get(void);
// Global configuration handling

View File

@ -14,11 +14,20 @@
#define _EDI_WELCOME_PROJECT_NEW_TABLE_WIDTH 4
typedef struct _Edi_Skeleton
{
const char *name;
const char *path;
// TODO: add more fields here (taken from skeleton metadata)
} Edi_Skeleton;
static Eina_List *_available_skeletons = NULL;
static Evas_Object *_welcome_window, *_welcome_naviframe;
static Evas_Object *_edi_new_popup;
static Evas_Object *_edi_welcome_list;
static Evas_Object *_edi_project_box;
static Evas_Object *_create_inputs[5];
static Evas_Object *_create_inputs[6];
static Evas_Object *_edi_create_button, *_edi_open_button;
@ -208,20 +217,152 @@ _edi_welcome_project_new_create_done_cb(const char *path, Eina_Bool success)
_edi_welcome_project_open(path, EINA_TRUE);
}
static Edi_Skeleton *
_edi_skeleton_new(const char *zippath)
{
Edi_Skeleton *skel;
char *name, *tarname;
skel = malloc(sizeof(Edi_Skeleton));
if (!skel)
return NULL;
skel->path = eina_stringshare_add(zippath);
tarname = ecore_file_strip_ext(ecore_file_file_get(zippath));
name = ecore_file_strip_ext(tarname);
skel->name = eina_stringshare_add(name);
free(tarname);
free(name);
// TODO: here we can search for an (optional) metadata file for the skeleton
// and present more info to the user
return skel;
}
static void
_edi_skeleton_free(Edi_Skeleton *skel)
{
if (skel)
{
eina_stringshare_del(skel->name);
eina_stringshare_del(skel->path);
free(skel);
}
}
static void
_edi_skeletons_discover(const char *path)
{
Eina_List *file_list, *l;
char fullp[PATH_MAX], *p;
file_list = ecore_file_ls(path);
EINA_LIST_FOREACH(file_list, l, p)
{
if (eina_str_has_extension(p, ".tar.gz"))
{
Edi_Skeleton *skel;
snprintf(fullp, sizeof(fullp), "%s/%s", path, p);
skel = _edi_skeleton_new(fullp);
if (skel)
_available_skeletons = eina_list_append(_available_skeletons, skel);
}
free(p);
}
eina_list_free(file_list);
}
static char *
_edi_skeleton_text_get_cb(void *data, Evas_Object *obj EINA_UNUSED,
const char *part EINA_UNUSED)
{
Edi_Skeleton *skel = data;
if (skel && skel->name && skel->name[0])
return strdup(skel->name);
else
return NULL;
}
static void
_edi_skeleton_pressed_cb(void *data EINA_UNUSED, Evas_Object *obj,
void *event_info)
{
Edi_Skeleton *skel = elm_object_item_data_get(event_info);
elm_object_text_set(obj, skel->name);
elm_combobox_hover_end(obj);
evas_object_data_set(obj, "selected_skeleton", skel);
}
static void
_edi_welcome_project_new_skeleton_combobox_add(const char *text, int row, Evas_Object *parent)
{
Evas_Object *label, *cmbbox;
Elm_Genlist_Item_Class *itc;
static char user_skeleton_dir[PATH_MAX];
Edi_Skeleton *skel;
Eina_List *l;
label = elm_label_add(parent);
elm_object_text_set(label, text);
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);
cmbbox = elm_combobox_add(parent);
evas_object_size_hint_weight_set(cmbbox, EVAS_HINT_EXPAND, 0);
evas_object_size_hint_align_set(cmbbox, EVAS_HINT_FILL, 0);
elm_object_part_text_set(cmbbox, "guide", "Select the project type");
elm_object_text_set(cmbbox, "eflproject");
elm_table_pack(parent, cmbbox, 1, row, _EDI_WELCOME_PROJECT_NEW_TABLE_WIDTH - 1, 1);
evas_object_smart_callback_add(cmbbox, "item,pressed",
_edi_skeleton_pressed_cb, NULL);
evas_object_show(cmbbox);
_create_inputs[row] = cmbbox;
EINA_LIST_FREE(_available_skeletons, skel)
_edi_skeleton_free(skel);
snprintf(user_skeleton_dir, sizeof(user_skeleton_dir),
"%s/skeleton", _edi_config_dir_get());
_edi_skeletons_discover(PACKAGE_DATA_DIR "/skeleton");
_edi_skeletons_discover(user_skeleton_dir);
itc = elm_genlist_item_class_new();
itc->item_style = "default";
itc->func.text_get = _edi_skeleton_text_get_cb;
EINA_LIST_FOREACH(_available_skeletons, l, skel)
elm_genlist_item_append(cmbbox, itc, skel, NULL,
ELM_GENLIST_ITEM_NONE, NULL, NULL);
elm_genlist_item_class_free(itc);
}
static void
_edi_welcome_project_new_create_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Evas_Object *entry;
const char *path, *name, *user, *email, *url;
Edi_Skeleton *skeleton;
entry = elm_layout_content_get(_create_inputs[0], "elm.swallow.entry");
skeleton = evas_object_data_get(_create_inputs[0], "selected_skeleton");
entry = elm_layout_content_get(_create_inputs[1], "elm.swallow.entry");
path = elm_object_text_get(entry);
name = elm_object_text_get(_create_inputs[1]);
url = elm_object_text_get(_create_inputs[2]);
user = elm_object_text_get(_create_inputs[3]);
email = elm_object_text_get(_create_inputs[4]);
name = elm_object_text_get(_create_inputs[2]);
url = elm_object_text_get(_create_inputs[3]);
user = elm_object_text_get(_create_inputs[4]);
email = elm_object_text_get(_create_inputs[5]);
edi_create_efl_project(path, name, url, user, email, _edi_welcome_project_new_create_done_cb);
if (skeleton && path && path[0] && name && name[0])
edi_create_efl_project(skeleton->path, path, name, url, user, email,
_edi_welcome_project_new_create_done_cb);
// TODO show something to the user in case of missing fields
}
static int
@ -277,6 +418,7 @@ _edi_welcome_project_new_cb(void *data, Evas_Object *obj EINA_UNUSED, void *even
username = getenv("USER");
if (!username)
username = getenv("USERNAME");
_edi_welcome_project_new_skeleton_combobox_add("Project Type", 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 URL", NULL, row++, content);

View File

@ -12,7 +12,7 @@
typedef struct _Edi_Create
{
char *path, *temp, *name;
char *path, *temp, *name, *skelfile;
char *url, *user, *email;
Edi_Create_Cb callback;
@ -119,6 +119,7 @@ _edi_create_free_data()
free(create->name);
free(create->path);
free(create->temp);
free(create->skelfile);
free(create);
}
@ -232,7 +233,8 @@ _edi_create_extract_done(void *data, int type EINA_UNUSED, void *event EINA_UNUS
char tmpinner[PATH_MAX];
create = (Edi_Create *)data;
snprintf(tmpinner, sizeof(tmpinner), "%s/eflproject", create->temp);
snprintf(tmpinner, sizeof(tmpinner), "%s/%s", create->temp, create->skelfile);
tmpinner[strlen(tmpinner) - 7] = '\0'; // strip extensin
ecore_event_handler_del(create->handler);
@ -247,25 +249,26 @@ _edi_create_extract_done(void *data, int type EINA_UNUSED, void *event EINA_UNUS
}
EAPI void
edi_create_efl_project(const char *parentdir, const char *name, const char *url,
const char *user, const char *email, Edi_Create_Cb func)
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)
{
char *source, *cmd, *extract;
char *cmd, *extract;
char tmp[PATH_MAX], dest[PATH_MAX];
Edi_Create *data;
Ecore_Event_Handler *handler;
source = PACKAGE_DATA_DIR "/skeleton/eflproject.tar.gz";
extract = "tar zxf %s -C %s";
snprintf(tmp, sizeof(tmp), "%s/edi_%s", eina_environment_tmp_get(), name);
snprintf(dest, sizeof(dest), "%s/%s", parentdir, name);
INF("Creating project \"%s\" at path %s for %s<%s>\n", name, dest, user, email);
DBG("Extracting project files from %s\n", source);
DBG("Extracting project files from %s\n", skelpath);
data = calloc(1, sizeof(Edi_Create));
data->path = strdup(dest);
data->name = strdup(name);
data->skelfile = strdup(ecore_file_file_get(skelpath));
data->url = strdup(url);
data->user = strdup(user);
@ -280,8 +283,8 @@ edi_create_efl_project(const char *parentdir, const char *name, const char *url,
return;
}
cmd = malloc(sizeof(char) * (strlen(extract) + strlen(source) + strlen(tmp) + 1));
sprintf(cmd, extract, source, tmp);
cmd = malloc(sizeof(char) * (strlen(extract) + strlen(skelpath) + strlen(tmp) + 1));
sprintf(cmd, extract, skelpath, tmp);
data->temp = strdup(tmp);
handler = ecore_event_handler_add(ECORE_EXE_EVENT_DEL, _edi_create_extract_done, data);

View File

@ -28,8 +28,9 @@ typedef void (*Edi_Create_Cb)(const char *path, Eina_Bool success);
* @ingroup Creation
*/
EAPI void
edi_create_efl_project(const char *parentdir, const char *name, const char *url,
const char *user, const char *email, Edi_Create_Cb func);
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);
/**
* @}