rimmed pushed a commit to branch master. http://git.enlightenment.org/tools/eflete.git/commit/?id=bf441a60eda6caba623f9fbf4b8f8b6e40c46359
commit bf441a60eda6caba623f9fbf4b8f8b6e40c46359 Author: Andrii Kroitor <an.kroi...@samsung.com> Date: Wed Jan 13 16:22:51 2016 +0200 group_manager: implement program add/del --- src/bin/project_manager/group_manager.c | 38 ++++++++ src/bin/project_manager/group_manager.h | 6 ++ src/bin/ui/group_navigator.c | 155 ++++++++++++++++++++++++++++++++ src/bin/ui/group_navigator.h | 7 ++ src/bin/ui/tabs.c | 30 +++++++ src/bin/ui/workspace/workspace.c | 20 +++++ src/bin/ui/workspace/workspace.h | 24 +++++ 7 files changed, 280 insertions(+) diff --git a/src/bin/project_manager/group_manager.c b/src/bin/project_manager/group_manager.c index 37c000d..aa4d5a4 100644 --- a/src/bin/project_manager/group_manager.c +++ b/src/bin/project_manager/group_manager.c @@ -673,6 +673,44 @@ gm_part_item_restack(Part *part, Eina_Stringshare *part_item, Eina_Stringshare * part->items = eina_list_append(part->items, part_item); } +void +gm_program_add(Project *pro, Group *group, Eina_Stringshare *program_name) +{ + Resource *program; + + assert(pro != NULL); + assert(program_name != NULL); + assert(group != NULL); + + program = mem_calloc(1, sizeof(Resource)); + program->name = eina_stringshare_add(program_name); + group->programs = eina_list_sorted_insert(group->programs, (Eina_Compare_Cb)resource_cmp, program); +} + +void +gm_program_del(Project *pro, Group *group, Eina_Stringshare *program_name) +{ + Eina_List *l; + Resource *program; + + assert(pro != NULL); + assert(program_name != NULL); + assert(group != NULL); + + program = pm_resource_get(group->programs, program_name); + + assert(program != NULL); + + l = eina_list_data_find_list(group->programs, program); + + assert(l != NULL); + + group->programs = eina_list_remove_list(group->programs, l); + eina_stringshare_del(program->name); + eina_list_free(program->used_in); + free(program); +} + /** * ref http://docs.enlightenment.org/auto/edje/group__Edje__Object__Part.html */ diff --git a/src/bin/project_manager/group_manager.h b/src/bin/project_manager/group_manager.h index d80ccd0..f5cffed 100644 --- a/src/bin/project_manager/group_manager.h +++ b/src/bin/project_manager/group_manager.h @@ -110,6 +110,12 @@ gm_part_restack(Part *part, Part *rel_part); void gm_part_item_restack(Part *part, Eina_Stringshare *part_item, Eina_Stringshare *relative_part_item); +void +gm_program_add(Project *pro, Group *group, Eina_Stringshare *program); + +void +gm_program_del(Project *pro, Group *group, Eina_Stringshare *program); + const char * gm_part_type_text_get(Edje_Part_Type part_type); #endif /* GROUP_MANAGER_H */ diff --git a/src/bin/ui/group_navigator.c b/src/bin/ui/group_navigator.c index f835f61..c8084e5 100644 --- a/src/bin/ui/group_navigator.c +++ b/src/bin/ui/group_navigator.c @@ -468,6 +468,7 @@ _selected_cb(void *data, assert(pl != NULL); + elm_object_disabled_set(pl->btn_del, true); if ((glit == pl->parts_caption_item) || (glit == pl->programs_caption_item)) { @@ -483,6 +484,7 @@ _selected_cb(void *data, if (pl->selected_part_item) _unselect_part(pl); + elm_object_disabled_set(pl->btn_del, false); res = elm_object_item_data_get(glit); evas_object_smart_callback_call(ap.win, SIGNAL_PROGRAM_SELECTED, (void *)res); } @@ -623,6 +625,26 @@ _item_validate(void *data, } static void +_program_validate(void *data, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + Part_List *pl = data; + const char *name, *program; + Eina_Bool valid; + Eina_List *l; + + assert(pl != NULL); + + name = elm_entry_entry_get(pl->popup.entry_name); + valid = (elm_validator_regexp_status_get(pl->name_validator) == ELM_REG_NOERROR); + EINA_LIST_FOREACH(pl->group->programs, l, program) + valid = valid && strcmp(program, name); + + elm_object_disabled_set(pl->popup.btn_add, !valid); +} + +static void _job_popup_del(void *data) { Part_List *pl = data; @@ -1018,6 +1040,135 @@ _on_menu_add_item_clicked(void *data __UNUSED__, } static void +_popup_add_program_ok_clicked(void *data, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + Part_List *pl = data; + const char *name; + Eina_Stringshare *msg; + Change *change; + + assert(pl != NULL); + + name = elm_entry_entry_get(pl->popup.entry_name); + + msg = eina_stringshare_printf(_("added new program \"%s\""), name); + change = change_add(msg); + editor_program_add(pl->group->edit_object, change, false, name); + + history_change_add(pl->group->history, change); + eina_stringshare_del(msg); + ecore_job_add(_job_popup_del, pl); +} + +static void +_on_menu_add_program_clicked(void *data __UNUSED__, + Evas_Object *obj, + void *ei __UNUSED__) +{ + Part_List *pl = evas_object_data_get(obj, GROUP_NAVIGATOR_DATA); + Evas_Object *box, *item; + + assert(pl != NULL); + + ap.popup = elm_popup_add(ap.win); + elm_object_part_text_set(ap.popup, "title,text", _("Add new program")); + + BOX_ADD(ap.popup, box, false, false); + LAYOUT_PROP_ADD(box, _("Name:"), "property", "1swallow") + ENTRY_ADD(item, pl->popup.entry_name, true); + eo_do(pl->popup.entry_name, eo_event_callback_add(ELM_ENTRY_EVENT_VALIDATE, + elm_validator_regexp_helper, pl->name_validator)); + evas_object_smart_callback_add(pl->popup.entry_name, "changed", _program_validate, pl); + elm_object_part_text_set(pl->popup.entry_name, "guide", _("Enter name for new program here.")); + elm_object_part_content_set(item, "elm.swallow.content", pl->popup.entry_name); + elm_box_pack_end(box, item); + + elm_object_content_set(ap.popup, box); + + BUTTON_ADD(ap.popup, pl->popup.btn_add, _("Add")); + evas_object_smart_callback_add(pl->popup.btn_add, "clicked", _popup_add_program_ok_clicked, pl); + elm_object_part_content_set(ap.popup, "button1", pl->popup.btn_add); + elm_object_disabled_set(pl->popup.btn_add, true); + + BUTTON_ADD(ap.popup, pl->popup.btn_cancel, _("Cancel")); + evas_object_smart_callback_add(pl->popup.btn_cancel, "clicked", _popup_cancel_clicked, pl); + elm_object_part_content_set(ap.popup, "button2", pl->popup.btn_cancel); + + ui_menu_items_list_disable_set(ap.menu, MENU_ITEMS_LIST_MAIN, true); + evas_object_show(ap.popup); + elm_object_focus_set(pl->popup.entry_name, true); +} + +void +group_navigator_program_add(Evas_Object *obj, Eina_Stringshare *program) +{ + Part_List *pl = evas_object_data_get(obj, GROUP_NAVIGATOR_DATA); + Elm_Object_Item *glit; + const Eina_List *l; + Resource *res; + + assert(pl != NULL); + assert(program != NULL); + + elm_genlist_item_expanded_set(pl->programs_caption_item, false); + elm_genlist_item_expanded_set(pl->programs_caption_item, true); + elm_genlist_item_update(pl->programs_caption_item); + EINA_LIST_FOREACH(elm_genlist_item_subitems_get(pl->programs_caption_item), l, glit) + { + res = elm_object_item_data_get(glit); + if (res->name == program) /* comparing stringshares */ + { + elm_genlist_item_selected_set(glit, true); + break; + } + } +} + +static void +_program_del(Part_List *pl, + Elm_Object_Item *glit) +{ + Eina_Stringshare *msg; + Change *change; + Resource *program; + + assert(pl != NULL); + assert(glit != NULL); + + program = elm_object_item_data_get(glit); + + assert(program != NULL); + + msg = eina_stringshare_printf(_("deleted program \"%s\""), program->name); + change = change_add(msg); + eina_stringshare_del(msg); + + eina_stringshare_ref(program->name); + editor_program_del(pl->group->edit_object, change, false, program->name); + eina_stringshare_del(program->name); + + history_change_add(pl->group->history, change); +} + +void +group_navigator_program_del(Evas_Object *obj, Eina_Stringshare *program __UNUSED__) +{ + Part_List *pl = evas_object_data_get(obj, GROUP_NAVIGATOR_DATA); + + assert(pl != NULL); + + elm_genlist_item_update(pl->programs_caption_item); + if (elm_genlist_item_expanded_get(pl->programs_caption_item)) + { + elm_genlist_item_expanded_set(pl->programs_caption_item, false); + elm_genlist_item_expanded_set(pl->programs_caption_item, true); + } + elm_genlist_item_selected_set(pl->programs_caption_item, true); +} + +static void _on_btn_plus_clicked(void *data, Evas_Object *obj, void *ei __UNUSED__) @@ -1236,6 +1387,8 @@ _on_btn_minus_clicked(void *data, _state_del(pl, glit); else if ((itc == pl->itc_item)) _item_del(pl, glit); + else if ((itc == pl->itc_program)) + _program_del(pl, glit); TODO("Check if we still need this") /* Need to save pl->group->edit_object, since we changed it */ @@ -1594,6 +1747,8 @@ group_navigator_add(Group *group) elm_menu_item_icon_name_set(menu_item, "type_proxy"); menu_item = elm_menu_item_add(pl->menu, NULL, NULL, _("Spacer"), _on_menu_add_part_clicked, &_type_spacer); elm_menu_item_icon_name_set(menu_item, "type_spacer"); + menu_item = elm_menu_item_separator_add(pl->menu, NULL); + elm_menu_item_add(pl->menu, NULL, NULL, _("Program"), _on_menu_add_program_clicked, NULL); pl->name_validator = elm_validator_regexp_new(PART_NAME_REGEX, NULL); if (group->main_group) diff --git a/src/bin/ui/group_navigator.h b/src/bin/ui/group_navigator.h index 5fd6148..183ccfa 100644 --- a/src/bin/ui/group_navigator.h +++ b/src/bin/ui/group_navigator.h @@ -92,4 +92,11 @@ group_navigator_part_item_restack(Evas_Object *obj, Part *part, Eina_Stringshare *part_item, Eina_Stringshare *relative_part_item); + +void +group_navigator_program_add(Evas_Object *obj, Eina_Stringshare *program); + +void +group_navigator_program_del(Evas_Object *obj, Eina_Stringshare *program); + #endif /* GROUP_NAVIGATOR_H */ diff --git a/src/bin/ui/tabs.c b/src/bin/ui/tabs.c index 7f0194c..2e9edf4 100644 --- a/src/bin/ui/tabs.c +++ b/src/bin/ui/tabs.c @@ -454,6 +454,34 @@ _editor_part_deleted_cb(void *data __UNUSED__, } static void +_editor_program_added_cb(void *data __UNUSED__, + Evas_Object *obj __UNUSED__, + void *event_info) +{ + Eina_Stringshare *program_name = event_info; + + assert(program_name != NULL); + assert(tabs.current_group != NULL); + assert(tabs.current_workspace != NULL); + + workspace_program_add(tabs.current_workspace, program_name); +} + +static void +_editor_program_deleted_cb(void *data __UNUSED__, + Evas_Object *obj __UNUSED__, + void *event_info) +{ + Eina_Stringshare *program_name = event_info; + + assert(program_name != NULL); + assert(tabs.current_group != NULL); + assert(tabs.current_workspace != NULL); + + workspace_program_del(tabs.current_workspace, program_name); +} + +static void _editor_part_item_added_cb(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) @@ -640,6 +668,8 @@ tabs_add(void) evas_object_smart_callback_add(ap.win, SIGNAL_EDITOR_PART_ITEM_RESTACKED, _editor_part_item_restacked_cb, NULL); evas_object_smart_callback_add(ap.win, SIGNAL_EDITOR_STATE_ADDED, _editor_state_added_cb, NULL); evas_object_smart_callback_add(ap.win, SIGNAL_EDITOR_STATE_DELETED, _editor_state_deleted_cb, NULL); + evas_object_smart_callback_add(ap.win, SIGNAL_EDITOR_PROGRAM_ADDED, _editor_program_added_cb, NULL); + evas_object_smart_callback_add(ap.win, SIGNAL_EDITOR_PROGRAM_DELETED, _editor_program_deleted_cb, NULL); return tabs.layout; } diff --git a/src/bin/ui/workspace/workspace.c b/src/bin/ui/workspace/workspace.c index 3a4787d..5cdabf4 100644 --- a/src/bin/ui/workspace/workspace.c +++ b/src/bin/ui/workspace/workspace.c @@ -1938,3 +1938,23 @@ workspace_part_item_restack(Evas_Object *obj, groupedit_hard_update(sd->groupedit); } + +void +workspace_program_add(Evas_Object *obj, Eina_Stringshare *program_name) +{ + WS_DATA_GET(obj, sd); + assert(program_name != NULL); + + gm_program_add(ap.project, sd->group, program_name); + group_navigator_program_add(sd->group_navigator, program_name); +} + +void +workspace_program_del(Evas_Object *obj, Eina_Stringshare *program_name) +{ + WS_DATA_GET(obj, sd); + assert(program_name != NULL); + + gm_program_del(ap.project, sd->group, program_name); + group_navigator_program_del(sd->group_navigator, program_name); +} diff --git a/src/bin/ui/workspace/workspace.h b/src/bin/ui/workspace/workspace.h index 7321f43..0a6d9dc 100644 --- a/src/bin/ui/workspace/workspace.h +++ b/src/bin/ui/workspace/workspace.h @@ -106,6 +106,18 @@ workspace_part_item_add(Evas_Object *obj, Eina_Stringshare *item_name); /** + * Add new program to group_edit and group_navigator. + * Part should be already added to edit_object. + * + * @param obj The workspace object. + * @param program_name name of added program + * + * @ingroup Workspace + */ +void +workspace_program_add(Evas_Object *obj, Eina_Stringshare *program_name); + +/** * Select state in group_navigator. * Part should be already selected. * @@ -177,6 +189,18 @@ void workspace_part_del(Evas_Object *obj, Eina_Stringshare *part_name); /** + * Del program from group_edit and group_navigator. + * Part should be already deleted edit_object. + * + * @param obj The workspace object. + * @param program_name name of deleted program + * + * @ingroup Workspace + */ +void +workspace_program_del(Evas_Object *obj, Eina_Stringshare *program_name); + +/** * */ void --