From 70f099e25e75282dfea3970ce38ba6c4d8eba370 Mon Sep 17 00:00:00 2001 From: Denis Dolzhenko Date: Wed, 12 Oct 2016 11:41:13 +0300 Subject: [PATCH] TSAM-8530: Message lastest don't display on top of Thread list when have messages Change-Id: Icd0d7f229f8832eb790749b9deb0875a407da39f Signed-off-by: Denis Dolzhenko --- src/Common/View/inc/ListView.h | 34 +++++++++++++++++++ src/MsgThread/Controller/inc/ThreadList.h | 2 +- src/MsgThread/Controller/inc/ThreadListItem.h | 3 +- src/MsgThread/Controller/src/ThreadList.cpp | 43 ++++++++++++++----------- src/MsgThread/Controller/src/ThreadListItem.cpp | 15 +++------ 5 files changed, 64 insertions(+), 33 deletions(-) diff --git a/src/Common/View/inc/ListView.h b/src/Common/View/inc/ListView.h index a72aa40..a246b2e 100644 --- a/src/Common/View/inc/ListView.h +++ b/src/Common/View/inc/ListView.h @@ -182,6 +182,9 @@ namespace Msg */ ListItem *getNextItem(ListItem &item) const; + template + T *getNextItem(ListItem &item) const; + /** * @brief Gets list-view item previous to specified one. * @param[in] item an item in genlist. @@ -189,6 +192,9 @@ namespace Msg */ ListItem *getPrevItem(ListItem &item) const; + template + 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. @@ -301,6 +307,34 @@ namespace Msg return list; } + + template + T *ListView::getNextItem(ListItem &item) const + { + T *res = nullptr; + ListItem *next = nullptr; + do + { + next = getNextItem(item); + res = dynamic_cast(next); + } while(next && !res); + + return res; + } + + template + T *ListView::getPrevItem(ListItem &item) const + { + T *res = nullptr; + ListItem *next = nullptr; + do + { + next = getPrevItem(item); + res = dynamic_cast(next); + } while(next && !res); + + return res; + } } #endif // ListView_15152b60_4142_11b3_aa6e_080a200c9a62_h_ diff --git a/src/MsgThread/Controller/inc/ThreadList.h b/src/MsgThread/Controller/inc/ThreadList.h index ea15cd9..ffdafbb 100644 --- a/src/MsgThread/Controller/inc/ThreadList.h +++ b/src/MsgThread/Controller/inc/ThreadList.h @@ -74,7 +74,7 @@ namespace Msg 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; diff --git a/src/MsgThread/Controller/inc/ThreadListItem.h b/src/MsgThread/Controller/inc/ThreadListItem.h index 09916e1..cfad3ed 100644 --- a/src/MsgThread/Controller/inc/ThreadListItem.h +++ b/src/MsgThread/Controller/inc/ThreadListItem.h @@ -35,8 +35,7 @@ namespace Msg virtual ~ThreadListItem(); ThreadId getThreadId() const; - void updateModel(const MsgThreadItem &threadItem); - void updateModel(); + void update(const MsgThreadItem &threadItem, bool updateUi); private: // ThreadListViewItem: diff --git a/src/MsgThread/Controller/src/ThreadList.cpp b/src/MsgThread/Controller/src/ThreadList.cpp index 2bfb22e..a40ac45 100644 --- a/src/MsgThread/Controller/src/ThreadList.cpp +++ b/src/MsgThread/Controller/src/ThreadList.cpp @@ -247,10 +247,8 @@ void ThreadList::updateItems(const MsgIdList &idList) for(ThreadListItem *item: threadItems) { if(threadIdSet.count(item->getThreadId())) - update(*item); + updateItem(*item); } - - updateRealizedItems(); } void ThreadList::updateItems() @@ -258,25 +256,34 @@ void ThreadList::updateItems() auto items = getItems(); 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(item); + ThreadListItem *prev = getPrevItem(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 ThreadList::getThreadIdSet(const MsgIdList &idList) @@ -311,18 +318,16 @@ void ThreadList::onListItemChecked(ListItem &listItem) 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(); } diff --git a/src/MsgThread/Controller/src/ThreadListItem.cpp b/src/MsgThread/Controller/src/ThreadListItem.cpp index 6e59927..60514ec 100644 --- a/src/MsgThread/Controller/src/ThreadListItem.cpp +++ b/src/MsgThread/Controller/src/ThreadListItem.cpp @@ -33,7 +33,7 @@ ThreadListItem::ThreadListItem(const MsgThreadItem &threadItem, App &app) : BaseThreadListItem(app) , m_ThreadId() { - updateModel(threadItem); + update(threadItem, false); } ThreadListItem::~ThreadListItem() @@ -55,10 +55,9 @@ Evas_Object *ThreadListItem::getIcon() 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); @@ -94,17 +93,11 @@ void ThreadListItem::updateModel(const MsgThreadItem &threadItem) } 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(); } - -- 2.7.4