TizenRefApp-8091 Implement show/hide "no content" item in thread list 66/116866/1
authorDenis Dolzhenko <d.dolzhenko@samsung.com>
Tue, 28 Feb 2017 15:55:14 +0000 (17:55 +0200)
committerDenis Dolzhenko <d.dolzhenko@samsung.com>
Tue, 28 Feb 2017 15:55:14 +0000 (17:55 +0200)
Change-Id: I9efc35605ea940e0de16b05282d96464e464b108
Signed-off-by: Denis Dolzhenko <d.dolzhenko@samsung.com>
src/Common/View/inc/ListView.h
src/MsgThread/Controller/inc/ThreadList.h
src/MsgThread/Controller/src/ThreadList.cpp

index a49ce4570ea2f7c8e19b157d66d0254430e8301c..9013fec361c3b7b8a3963cc2f2766b02b9a8c227 100644 (file)
@@ -236,6 +236,9 @@ namespace Msg
             template<typename T>
             std::vector<T*> getItems() const;
 
+            template<typename T>
+            unsigned getItemsCount() const;
+
             /**
              * @brief Updates the contents of all realized items.
              */
@@ -310,6 +313,25 @@ namespace Msg
         return list;
     }
 
+    template<typename T>
+    unsigned ListView::getItemsCount() const
+    {
+        Elm_Object_Item *elmItem = elm_genlist_first_item_get(getEo());
+        unsigned count = 0;
+        while (elmItem)
+        {
+            void *data = elm_object_item_data_get(elmItem);
+            if (data)
+            {
+                T *listItem = dynamic_cast<T*>(static_cast<ListItem*>(data));
+                if (listItem)
+                    ++count;
+            }
+            elmItem = elm_genlist_item_next_get(elmItem);
+        }
+        return count;
+    }
+
     template<typename T>
     T *ListView::getNextItem(ListItem &item) const
     {
index 9ed7da5cac5bd01c32aa228d624a0c65ce32dc18..692c76fdb830a4ab6aaf10bb36d48faad33dcc0f 100644 (file)
@@ -24,6 +24,7 @@
 #include "ThreadComposeListViewItem.h"
 #include "PaddingListViewItem.h"
 #include "MsgTypes.h"
+#include "NoContentListViewItem.h"
 
 #include <set>
 
@@ -79,7 +80,9 @@ namespace Msg {
             void updateItems(const MsgIdList &idList);
             void updateItems();
             void updateItem(ThreadListItem &item);
+            void showNoContent(bool value);
             void insertItem(ThreadId id);
+            void deleteItem(ThreadId id);
             void navigateTo(ThreadListItem &item);
             ThreadListItem *getItem(ThreadId id) const;
             bool isAllThreadListItemChecked() const;
@@ -93,6 +96,7 @@ namespace Msg {
             ThreadComposeListViewItem *m_ComposeItem;
             PaddingListViewItem *m_pTopPadItem;
             PaddingListViewItem *m_pBottomPadItem;
+            NoContentListViewItem *m_pNoContentItem;
     };
 
     class IThreadListListener {
index 2182fbd9b38cea625d13e0c98268fdfbebcc40fe..de9efbfbef35bb382b0287178ec469a4a4305020 100644 (file)
@@ -41,6 +41,7 @@ ThreadList::ThreadList(Evas_Object *parent)
     , m_ComposeItem(nullptr)
     , m_pTopPadItem(nullptr)
     , m_pBottomPadItem(nullptr)
+    , m_pNoContentItem(nullptr)
 {
     ListView::setListener(this);
     ListView::setHomogeneous(false);
@@ -157,8 +158,25 @@ void ThreadList::insertItem(ThreadId id)
     MsgThreadItemRef threadItem = m_App.getMsgEngine().getStorage().getThread(id);
     if (threadItem) {
         auto newItem = new ThreadListItem(*threadItem);
-        ListView::sortedInsertItem(*newItem);
-        navigateTo(*newItem);
+        if (ListView::sortedInsertItem(*newItem)) {
+            navigateTo(*newItem);
+            showNoContent(false);
+            if (m_pListener)
+                m_pListener->onThreadListChanged();
+        }
+    }
+}
+
+void ThreadList::deleteItem(ThreadId id)
+{
+    auto* thread = getItem(id);
+    if (thread) {
+        ListView::deleteItem(*thread);
+        unsigned count = getItemsCount<ThreadListItem>();
+        if (count == 0)
+            showNoContent(true);
+        if (m_pListener)
+            m_pListener->onThreadListChanged();
     }
 }
 
@@ -188,10 +206,11 @@ void ThreadList::fillList()
 
     // Thread list:
     MsgThreadListRef msgThreadList = m_App.getMsgEngine().getStorage().getThreadList();
+    int threadCount = 0;
     if (msgThreadList) {
-        int length = msgThreadList->getLength();
+        threadCount = msgThreadList->getLength();
 
-        for (int i = 0; i < length; ++i) {
+        for (int i = 0; i < threadCount; ++i) {
             const MsgThreadItem &msgThreadItem = msgThreadList->at(i);
             ListView::appendItem(*new ThreadListItem(msgThreadItem));
         }
@@ -200,6 +219,10 @@ void ThreadList::fillList()
     // Bottom padding:
     m_pBottomPadItem = new PaddingListViewItem;
     ListView::appendItem(*m_pBottomPadItem);
+
+    // No Content:
+    if (threadCount == 0)
+        showNoContent(true);
 }
 
 void ThreadList::deleteItems()
@@ -247,6 +270,19 @@ void ThreadList::updateItems()
     }
 }
 
+void ThreadList::showNoContent(bool value)
+{
+    if (value) {
+        if (!m_pNoContentItem) {
+            m_pNoContentItem = new NoContentListViewItem;
+            insertBeforeItem(*m_pNoContentItem, *m_pBottomPadItem);
+        }
+    } else if (m_pNoContentItem){
+        m_pNoContentItem->destroy();
+        m_pNoContentItem = nullptr;
+    }
+}
+
 void ThreadList::updateItem(ThreadListItem &item)
 {
     MsgThreadItemRef msgThread = m_App.getMsgEngine().getStorage().getThread(item.getThreadId());
@@ -310,19 +346,12 @@ void ThreadList::onMsgStorageThreadInsert(const ThreadId &threadId)
 {
     MSG_LOG("");
     insertItem(threadId);
-    if (m_pListener)
-        m_pListener->onThreadListChanged();
 }
 
 void ThreadList::onMsgStorageThreadDelete(const ThreadId &threadId)
 {
     MSG_LOG("");
-    auto* thread = getItem(threadId);
-    if (thread)
-        ListView::deleteItem(*thread);
-
-    if (m_pListener)
-        m_pListener->onThreadListChanged();
+    deleteItem(threadId);
 }
 
 void ThreadList::onContactChanged()