*/
ListItem *getNextItem(ListItem &item) const;
+ template<typename T>
+ T *getNextItem(ListItem &item) const;
+
/**
* @brief Gets list-view item previous to specified one.
* @param[in] item an item in genlist.
*/
ListItem *getPrevItem(ListItem &item) const;
+ template<typename T>
+ T *getPrevItem(ListItem &item) const;
+
/**
* @brief Demotes specified list-view item to the end of the list.
* @param[in] item an item to be demoted.
return list;
}
+
+ template<typename T>
+ T *ListView::getNextItem(ListItem &item) const
+ {
+ T *res = nullptr;
+ ListItem *next = nullptr;
+ do
+ {
+ next = getNextItem(item);
+ res = dynamic_cast<T*>(next);
+ } while(next && !res);
+
+ return res;
+ }
+
+ template<typename T>
+ T *ListView::getPrevItem(ListItem &item) const
+ {
+ T *res = nullptr;
+ ListItem *next = nullptr;
+ do
+ {
+ next = getPrevItem(item);
+ res = dynamic_cast<T*>(next);
+ } while(next && !res);
+
+ return res;
+ }
}
#endif // ListView_15152b60_4142_11b3_aa6e_080a200c9a62_h_
void deleteItems();
void updateItems(const MsgIdList &idList);
void updateItems();
- void update(ThreadListItem &item);
+ void updateItem(ThreadListItem &item);
void insertItem(const MsgThreadItem &msgThreadItem);
void insertItem(ThreadId id);
ThreadListItem *getItem(ThreadId id) const;
virtual ~ThreadListItem();
ThreadId getThreadId() const;
- void updateModel(const MsgThreadItem &threadItem);
- void updateModel();
+ void update(const MsgThreadItem &threadItem, bool updateUi);
private:
// ThreadListViewItem:
for(ThreadListItem *item: threadItems)
{
if(threadIdSet.count(item->getThreadId()))
- update(*item);
+ updateItem(*item);
}
-
- updateRealizedItems();
}
void ThreadList::updateItems()
auto items = getItems<ThreadListItem>();
for(ThreadListItem *item: items)
{
- update(*item);
+ updateItem(*item);
}
-
- updateRealizedItems();
}
-void ThreadList::update(ThreadListItem &item)
+void ThreadList::updateItem(ThreadListItem &item)
{
- time_t time = item.getRawTime();
- item.updateModel();
- if(item.getRawTime() < time)
+ MsgThreadItemRef msgThread = m_App.getMsgEngine().getStorage().getThread(item.getThreadId());
+ if(!msgThread)
+ {
+ MSG_LOG_ERROR("msgThread is null");
+ return;
+ }
+
+ ThreadListItem *next = getNextItem<ThreadListItem>(item);
+ ThreadListItem *prev = getPrevItem<ThreadListItem>(item);
+ time_t threadTime = msgThread->getTime();
+
+ if((next && threadTime < next->getRawTime()) ||
+ (prev && threadTime > prev->getRawTime()))
{
- // TODO: JIRA issue TSAM-8683
+ auto newItem = new ThreadListItem(*msgThread, m_App);
+ item.destroy();
+ ListView::sortedInsertItem(*newItem);
}
- else if(item.getRawTime() > time)
+ else
{
- // TODO: JIRA issue TSAM-8683
+ item.update(*msgThread, true);
}
- item.update();
}
std::set<ThreadId> ThreadList::getThreadIdSet(const MsgIdList &idList)
void ThreadList::onMsgStorageThreadUpdate(const ThreadId &threadId)
{
MSG_LOG("");
- auto* thread = getItem(threadId);
- if(thread)
- update(*thread);
+ auto* item = getItem(threadId);
+ if(item)
+ updateItem(*item);
}
void ThreadList::onMsgStorageThreadInsert(const ThreadId &threadId)
{
MSG_LOG("");
-
insertItem(threadId);
updateSelectAllItem();
-
if(m_pListener)
m_pListener->onThreadListChanged();
}
: BaseThreadListItem(app)
, m_ThreadId()
{
- updateModel(threadItem);
+ update(threadItem, false);
}
ThreadListItem::~ThreadListItem()
return makeUnreadIcon(m_UnreadCount);
}
-void ThreadListItem::updateModel(const MsgThreadItem &threadItem)
+void ThreadListItem::update(const MsgThreadItem &threadItem, bool updateUi)
{
m_ThreadId = threadItem.getId();
-
State state = NormalState;
MsgConversationListRef convList = m_App.getMsgEngine().getStorage().getConversationList(m_ThreadId);
}
setState(state, false);
-
updateMessage(threadItem);
updateThumbnailAndName(threadItem, true);
updateTime(threadItem.getTime());
-}
-void ThreadListItem::updateModel()
-{
- MsgThreadItemRef msgThread = m_App.getMsgEngine().getStorage().getThread(m_ThreadId);
- if(msgThread)
- updateModel(*msgThread);
+ if(updateUi)
+ ListItem::update();
}
-