template<typename T>
std::vector<T*> getItems() const;
+ template<typename T>
+ unsigned getItemsCount() const;
+
/**
* @brief Updates the contents of all realized items.
*/
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
{
#include "ThreadComposeListViewItem.h"
#include "PaddingListViewItem.h"
#include "MsgTypes.h"
+#include "NoContentListViewItem.h"
#include <set>
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;
ThreadComposeListViewItem *m_ComposeItem;
PaddingListViewItem *m_pTopPadItem;
PaddingListViewItem *m_pBottomPadItem;
+ NoContentListViewItem *m_pNoContentItem;
};
class IThreadListListener {
, m_ComposeItem(nullptr)
, m_pTopPadItem(nullptr)
, m_pBottomPadItem(nullptr)
+ , m_pNoContentItem(nullptr)
{
ListView::setListener(this);
ListView::setHomogeneous(false);
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();
}
}
// 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));
}
// Bottom padding:
m_pBottomPadItem = new PaddingListViewItem;
ListView::appendItem(*m_pBottomPadItem);
+
+ // No Content:
+ if (threadCount == 0)
+ showNoContent(true);
}
void ThreadList::deleteItems()
}
}
+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());
{
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()