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

-- 


Reply via email to