yakov pushed a commit to branch master. http://git.enlightenment.org/tools/erigo.git/commit/?id=b81de27d139edafa82d9c0db48bd2afe81154424
commit b81de27d139edafa82d9c0db48bd2afe81154424 Author: Yakov Goldberg <yako...@samsung.com> Date: Wed Feb 11 17:20:04 2015 +0200 Add items reordering in itemview --- src/bin/egui_gui/editor.c | 42 +++++++++++++++++--- src/bin/egui_gui/egui_layout.json | 84 ++++++++++++++++++++++++++++++++++++--- src/bin/egui_gui/itemview.c | 18 ++++++++- src/bin/egui_gui/itemview.h | 4 +- src/bin/egui_gui/objtree.c | 1 + src/lib/gui_widget.c | 33 +++++++++++++++ src/lib/gui_widget.h | 3 ++ 7 files changed, 172 insertions(+), 13 deletions(-) diff --git a/src/bin/egui_gui/editor.c b/src/bin/egui_gui/editor.c index 429a9bf..eb2fcf2 100644 --- a/src/bin/egui_gui/editor.c +++ b/src/bin/egui_gui/editor.c @@ -3645,6 +3645,7 @@ _itemview_item_selected(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, vo static Eina_Bool _itemview_item_do_(unsigned int type) { + Eina_Bool reload = EINA_TRUE; static int i = -1; i++; Item_Container_Item *wit = NULL, *parent_it = NULL; @@ -3744,6 +3745,25 @@ _itemview_item_do_(unsigned int type) item_container_item_set_on_id(item_container_item_eid_get(parent_it), new_parent_item); } + else if (type == ITEM_MOVE_UP || (type == ITEM_MOVE_DOWN)) + { + if (!wit) return EINA_FALSE; + parent_it = (Item_Container_Item *) item_container_item_parent_item_get(wit); + + new_parent_item = item_container_item_copy(parent_it); + + /* Ref old parent it, because it will be unreffed in _set_on_id() */ + item_container_item_ref(parent_it); + item_container_item_set_on_id(item_container_item_eid_get(parent_it), new_parent_item); + + intptr_t dir = (type == ITEM_MOVE_UP) ? UP : DOWN; + if ((reload = item_container_item_reorder(wit, dir))) + { + Gui_Memento *memento = gui_memento_new(wdg_eid_get(wdg), MEMENTO_ITEM_CONTAINER_ITEM, parent_it, new_parent_item); + gui_context_memento_add((Gui_Context *) ctx, memento); + } + item_container_item_unref(parent_it); + } /* Adding item to widget and parent item * If some item is selected and we add item, we add it after. */ @@ -3767,14 +3787,24 @@ _itemview_item_do_(unsigned int type) item_container_item_eid_get(it)); break; } + case ITEM_MOVE_UP: + case ITEM_MOVE_DOWN: + { + break; + } + default: + ERR("case - default"); } - _wdg_parent_win_reload(wdg); - proplayout_build(NULL); - _editor_wdg_selected_set(wdg); - objtree_build(ctx); - objtree_item_selected_set(wdg); - itemview_item_selected_set(it); + if (reload) + { + _wdg_parent_win_reload(wdg); + proplayout_build(NULL); + _editor_wdg_selected_set(wdg); + objtree_build(ctx); + objtree_item_selected_set(wdg); + itemview_item_selected_set(it); + } return EO_CALLBACK_CONTINUE; } diff --git a/src/bin/egui_gui/egui_layout.json b/src/bin/egui_gui/egui_layout.json index 7eded62..fd9b7e2 100644 --- a/src/bin/egui_gui/egui_layout.json +++ b/src/bin/egui_gui/egui_layout.json @@ -33,7 +33,9 @@ "_proplayout_toolbar_clicked":"_proplayout_toolbar_clicked", "_contentview_up_btn_clicked":"_contentview_up_btn_clicked", "_contentview_down_btn_clicked":"_contentview_down_btn_clicked", - "_contentview_del_btn_clicked":"_contentview_del_btn_clicked" + "_contentview_del_btn_clicked":"_contentview_del_btn_clicked", + "_itemview_up_btn_clicked":"_itemview_up_btn_clicked", + "_itemview_down_btn_clicked":"_itemview_down_btn_clicked" } }, "Widgets": @@ -2940,7 +2942,7 @@ "Evas.Object.size_hint_weight":[1, 0], "Evas.Object.size_hint_align":[-1, 0] }, - "Contains":["itemview_add_item_but", "itemview_add_item_nested_but", "itemview_add_separator_but", "itemview_del_item_but"] + "Contains":["itemview_add_item_but", "itemview_add_item_nested_but", "itemview_add_separator_but", "itemview_up_btn", "itemview_down_btn", "itemview_del_item_but"] }, "itemview_add_item_but": { @@ -3004,14 +3006,56 @@ }, "Properties": { - "Elm_Widget.part_text":[null, "Delete Item"], - "Evas.Object.visibility":[true] + "Evas.Object.visibility":[true], + "Elm_Widget.part_text":[null, "X"] }, "Callbacks": { "clicked":["Invoke", "_itemview_item_del_but_clicked_cb", null] } }, + "itemview_up_btn": + { + "Desc": + { + "parent":"itemview_buttons_box", + "class":"Elm_Button" + }, + "Properties": + { + "Evas.Object.visibility":[true], + "Evas.Object.size":[73, 30] + }, + "Callbacks": + { + "clicked":["Invoke", "_itemview_up_btn_clicked", null] + }, + "Contains": + { + "itemview_up_btn_icon":[null] + } + }, + "itemview_down_btn": + { + "Desc": + { + "parent":"itemview_buttons_box", + "class":"Elm_Button" + }, + "Properties": + { + "Evas.Object.visibility":[true], + "Evas.Object.size":[73, 30] + }, + "Callbacks": + { + "clicked":["Invoke", "_itemview_down_btn_clicked", null] + }, + "Contains": + { + "itemview_down_btn_icon":[null] + } + }, "contentview_up_btn_icon": { "Desc": @@ -3071,6 +3115,36 @@ "Evas.Object.size":[40, 40], "Efl.File.file":["move_down_icon", null] } + }, + "itemview_up_btn_icon": + { + "Desc": + { + "parent":"itemview_up_btn", + "class":"Elm_Icon" + }, + "Properties": + { + "Evas.Object.size_hint_weight":[1, 1], + "Evas.Object.visibility":[true], + "Evas.Object.size":[40, 40], + "Efl.File.file":["move_up_icon", null] + } + }, + "itemview_down_btn_icon": + { + "Desc": + { + "parent":"itemview_down_btn", + "class":"Elm_Icon" + }, + "Properties": + { + "Evas.Object.size_hint_weight":[1, 1], + "Evas.Object.visibility":[true], + "Evas.Object.size":[40, 40], + "Efl.File.file":["move_down_icon", null] + } } } - } + } \ No newline at end of file diff --git a/src/bin/egui_gui/itemview.c b/src/bin/egui_gui/itemview.c index 0949ccb..cb02400 100644 --- a/src/bin/egui_gui/itemview.c +++ b/src/bin/egui_gui/itemview.c @@ -361,7 +361,7 @@ _itemview_separator_add_but_clicked_cb(void *data EINA_UNUSED, Eo *obj EINA_UNUS return EO_CALLBACK_CONTINUE; } -/* This callback is called, when "Delete Item" button is pressed. */ +/* This callback is called, when "X" - delete item button is pressed. */ Eina_Bool _itemview_item_del_but_clicked_cb(void *data EINA_UNUSED, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED) { @@ -369,3 +369,19 @@ _itemview_item_del_but_clicked_cb(void *data EINA_UNUSED, Eo *obj EINA_UNUSED, c return EO_CALLBACK_CONTINUE; } +/* This callback is called, when "move up" button is pressed. */ +Eina_Bool +_itemview_up_btn_clicked(void *data EINA_UNUSED, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED) +{ + _view_cbs->_itemview_item_do_(ITEM_MOVE_UP); + return EO_CALLBACK_CONTINUE; +} + +/* This callback is called, when "move down" button is pressed. */ +Eina_Bool +_itemview_down_btn_clicked(void *data EINA_UNUSED, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED) +{ + _view_cbs->_itemview_item_do_(ITEM_MOVE_DOWN); + return EO_CALLBACK_CONTINUE; +} + diff --git a/src/bin/egui_gui/itemview.h b/src/bin/egui_gui/itemview.h index 403646c..b716172 100644 --- a/src/bin/egui_gui/itemview.h +++ b/src/bin/egui_gui/itemview.h @@ -17,7 +17,9 @@ enum ITEM_ADD, ITEM_ADD_NESTED, SEPARATOR_ADD, - ITEM_DELETE + ITEM_DELETE, + ITEM_MOVE_UP, + ITEM_MOVE_DOWN }; void diff --git a/src/bin/egui_gui/objtree.c b/src/bin/egui_gui/objtree.c index 1f22730..42556f4 100644 --- a/src/bin/egui_gui/objtree.c +++ b/src/bin/egui_gui/objtree.c @@ -232,6 +232,7 @@ objtree_item_selected_set(const Gui_Widget *wdg) /* If filter was active, need to drop filter and clear open items hash. */ if (_objtree_filter_entry_string_get()) { + ERR("strane but we are here"); objtree_filtering_reset(); elm_genlist_clear(lst); _item_expand(NULL, NULL); diff --git a/src/lib/gui_widget.c b/src/lib/gui_widget.c index 92c1104..27c9cba 100644 --- a/src/lib/gui_widget.c +++ b/src/lib/gui_widget.c @@ -1976,6 +1976,39 @@ _item_container_item_add(Gui_Widget *wdg, Item_Container_Item *parent_item, Item parent_item->items = eina_list_append_relative(parent_item->items, (void *) (uintptr_t) item->eid, (void *) (uintptr_t) eid_after); } +Eina_Bool +item_container_item_reorder(const Item_Container_Item *item, intptr_t dir) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(item, EINA_FALSE); + + Eid *parent_item_id = item->parent_item_id; + Item_Container_Item *parent_item = item_container_item_get_from_id(parent_item_id); + + /* If there is less then one item in list, nothing can be reordered */ + if (eina_list_count(parent_item->items) <= 1) return EINA_FALSE; + + /* Check if item is first/last according to direction */ + if (((dir == UP) && (item->eid == (void *) eina_list_data_get(parent_item->items))) || + ((dir == DOWN) && (item->eid == (void *) eina_list_data_get(eina_list_last(parent_item->items))))) + return EINA_FALSE; + + Eid *eid_after = 0; + if (dir == UP) + { + eid_after = eina_list_data_get(eina_list_prev(eina_list_data_find_list(parent_item->items, item->eid))); + parent_item->items = eina_list_remove(parent_item->items, item->eid); + parent_item->items = eina_list_prepend_relative(parent_item->items, item->eid, eid_after); + } + else + { + eid_after = eina_list_data_get(eina_list_next(eina_list_data_find_list(parent_item->items, item->eid))); + parent_item->items = eina_list_remove(parent_item->items, item->eid); + parent_item->items = eina_list_append_relative(parent_item->items, item->eid, eid_after); + } + + return EINA_TRUE; +} + /* Add item to widget. * If parent_item is NULL, item will be added to Widget. */ Eina_Bool diff --git a/src/lib/gui_widget.h b/src/lib/gui_widget.h index 2b5a9d9..1880ed1 100644 --- a/src/lib/gui_widget.h +++ b/src/lib/gui_widget.h @@ -563,6 +563,9 @@ item_container_item_parent_item_get(const Item_Container_Item *item); Eid * item_container_item_parent_item_id_get(const Item_Container_Item *item); +Eina_Bool +item_container_item_reorder(const Item_Container_Item *item, intptr_t dir); + /******************************************************************************/ /* Property functions */ --