Added functionality to base GenlistItem class. 21/52921/3
authorEugene Kurzberg <i.kurtsberg@samsung.com>
Fri, 27 Nov 2015 12:03:44 +0000 (14:03 +0200)
committerAleksandr Sapozhnik <a.sapozhnik@samsung.com>
Tue, 1 Dec 2015 09:46:00 +0000 (01:46 -0800)
Added possibility to insert already inserted item to another position
while preserving item data.

Change-Id: I4f045b452c0a2f05c9c0eee21349c25e5598eecf
Signed-off-by: Eugene Kurzberg <i.kurtsberg@samsung.com>
lib-common/inc/Ui/GenlistItem.h
lib-common/src/Ui/Genlist.cpp
lib-common/src/Ui/GenlistItem.cpp

index d6c36bf5aad670ce318f8e6f65b93171c2ea3ba0..e18fbf03307e4ec9f00cbab5dd6f4e56bbccb8df 100644 (file)
@@ -23,6 +23,7 @@
 
 namespace Ui
 {
+       class Genlist;
        class EXPORT_API GenlistItem
        {
        public:
@@ -39,12 +40,22 @@ namespace Ui
                Elm_Object_Item *getObjectItem() const;
 
                /**
-                * @return Next item in genlist or NULL if none.
+                * @return Parent genlist.
+                */
+               Genlist *getParent() const;
+
+               /**
+                * @return Parent genlist item or nullptr if none.
+                */
+               GenlistItem *getParentItem() const;
+
+               /**
+                * @return Next item in genlist or nullptr if none.
                 */
                GenlistItem *getNextItem() const;
 
                /**
-                * @return Previous item in genlist or NULL if none.
+                * @return Previous item in genlist or nullptr if none.
                 */
                GenlistItem *getPrevItem() const;
 
@@ -75,6 +86,11 @@ namespace Ui
                 */
                virtual Evas_Object *getContent(Evas_Object *parent, const char *part) { return nullptr; }
 
+               /**
+                * @brief Called after item was inserted into genlist.
+                */
+               virtual void onInserted() { }
+
                /**
                 * @brief Called when item is selected.
                 */
@@ -103,10 +119,12 @@ namespace Ui
 
        private:
                friend class Genlist;
+               static void onDestroy(GenlistItem *item, Evas_Object *genlist);
 
                Elm_Genlist_Item_Type m_ItemType;
                Elm_Genlist_Item_Class *m_ItemClass;
                Elm_Object_Item *m_Item;
+               bool m_Preserve;
        };
 }
 
index c169708a1c9c3f1a104c2db0415f8c1168946c83..83f621ca6ffbabcad6389a7508e9bc36f7c7b2eb 100644 (file)
@@ -53,6 +53,18 @@ GenlistItem *Genlist::getLastItem() const
 
 Elm_Object_Item *Genlist::insert(GenlistItem *item, GenlistItem *parent, GenlistItem *prev)
 {
+       if (!item) {
+               return nullptr;
+       }
+
+       if (item->m_Item) {
+               item->m_Preserve = true;
+               elm_object_item_del(item->m_Item);
+
+               item->m_Item = nullptr;
+               item->m_Preserve = false;
+       }
+
        Elm_Object_Item *parentItem = parent ? parent->getObjectItem() : nullptr;
        if (prev) {
                item->m_Item = elm_genlist_item_insert_after(getEvasObject(), item->m_ItemClass, item,
@@ -62,6 +74,7 @@ Elm_Object_Item *Genlist::insert(GenlistItem *item, GenlistItem *parent, Genlist
                                parentItem, item->m_ItemType, nullptr, nullptr);
        }
 
+       item->onInserted();
        return item->m_Item;
 }
 
index 17b1a9f2e66dfb687bac42eef454de0aaa46ea11..6e9ccc7a9114ab520deb74522b85291f5fecc465 100644 (file)
@@ -16,6 +16,7 @@
  */
 
 #include "Ui/GenlistItem.h"
+#include "Ui/Genlist.h"
 #include "Utils/Callback.h"
 
 using namespace Ui;
@@ -26,7 +27,7 @@ namespace
 }
 
 GenlistItem::GenlistItem(Elm_Genlist_Item_Class *itemClass, Elm_Genlist_Item_Type itemType)
-       : m_ItemType(itemType), m_ItemClass(itemClass), m_Item(nullptr)
+       : m_ItemType(itemType), m_ItemClass(itemClass), m_Item(nullptr), m_Preserve(false)
 {
        if (!m_ItemClass) {
                m_ItemClass = &defaultItemClass;
@@ -42,9 +43,7 @@ Elm_Genlist_Item_Class GenlistItem::createItemClass(const char *style,
        itc.decorate_all_item_style = editStyle;
        itc.func.text_get = makeCallback(&GenlistItem::getText);
        itc.func.content_get = makeCallback(&GenlistItem::getContent);
-       itc.func.del = [] (void *data, Evas_Object *obj) {
-               delete (GenlistItem *) data;
-       };
+       itc.func.del = (Elm_Gen_Item_Del_Cb) &GenlistItem::onDestroy;
 
        return itc;
 }
@@ -54,6 +53,18 @@ Elm_Object_Item *GenlistItem::getObjectItem() const
        return m_Item;
 }
 
+Genlist *GenlistItem::getParent() const
+{
+       Evas_Object *genlist = elm_object_item_widget_get(getObjectItem());
+       return static_cast<Genlist *>(Control::getControl(genlist));
+}
+
+GenlistItem *GenlistItem::getParentItem() const
+{
+       Elm_Object_Item *item = elm_genlist_item_parent_get(getObjectItem());
+       return (GenlistItem *) elm_object_item_data_get(item);
+}
+
 GenlistItem *GenlistItem::getNextItem() const
 {
        Elm_Object_Item *item = elm_genlist_item_next_get(getObjectItem());
@@ -70,3 +81,10 @@ void GenlistItem::onContracted()
 {
        elm_genlist_item_subitems_clear(getObjectItem());
 }
+
+void GenlistItem::onDestroy(GenlistItem *item, Evas_Object *genlist)
+{
+       if (!item->m_Preserve) {
+               delete item;
+       }
+}