namespace Ui
{
+ class Genlist;
class EXPORT_API GenlistItem
{
public:
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;
*/
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.
*/
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;
};
}
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,
parentItem, item->m_ItemType, nullptr, nullptr);
}
+ item->onInserted();
return item->m_Item;
}
*/
#include "Ui/GenlistItem.h"
+#include "Ui/Genlist.h"
#include "Utils/Callback.h"
using namespace Ui;
}
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;
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;
}
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());
{
elm_genlist_item_subitems_clear(getObjectItem());
}
+
+void GenlistItem::onDestroy(GenlistItem *item, Evas_Object *genlist)
+{
+ if (!item->m_Preserve) {
+ delete item;
+ }
+}