Optimized LogsView insertion logic. 64/61164/3
authorEugene Kurzberg <i.kurtsberg@samsung.com>
Wed, 9 Mar 2016 10:58:10 +0000 (12:58 +0200)
committerEugene Kurzberg <i.kurtsberg@samsung.com>
Wed, 9 Mar 2016 10:58:10 +0000 (12:58 +0200)
Change-Id: I7ecab3795609cba26aab1d59aba6b10778dd77e8
Signed-off-by: Eugene Kurzberg <i.kurtsberg@samsung.com>
lib-logs/inc/Logs/List/LogsView.h
lib-logs/src/Logs/List/LogsView.cpp

index 2fb076e..e8ddb15 100644 (file)
@@ -56,7 +56,6 @@ namespace Logs
                         * @param[in]   filterType    Defines how to filter log list
                         */
                        LogsView(FilterType filterType = FilterAll);
-
                        virtual ~LogsView() override;
 
                private:
@@ -70,10 +69,14 @@ namespace Logs
                        Evas_Object *createNoContentsLayout(Evas_Object *parent);
                        void fillGenlist();
 
-                       bool shouldDisplayLogs(const Model::LogGroup &group);
-                       LogItem *createLogItem(Model::LogGroup *group);
-                       LogGroupItem *insertLogItem(Model::LogGroup *group, LogGroupItem *groupItem);
-                       LogGroupItem *createLogGroupItem(tm date);
+                       bool shouldDisplayLogs(const Model::LogGroup *logGroup) const;
+                       LogItem *createLogItem(Model::LogGroup *logGroup);
+                       LogItem *insertLogItem(Model::LogGroup *logGroup);
+
+                       LogGroupItem *insertGroupItem(tm date);
+                       LogGroupItem *getLastGroupItem();
+                       void setLastGroupItem(LogGroupItem *groupItem);
+
 
                        void setMode(ItemMode mode);
 
@@ -83,11 +86,11 @@ namespace Logs
                        void onLogItemDelete(LogItem *item);
 
                        Model::LogProvider m_LogProvider;
-
-                       Ui::Genlist *m_Genlist;
-
                        ItemMode m_Mode;
                        FilterType m_FilterType;
+
+                       Ui::Genlist *m_Genlist;
+                       LogGroupItem *m_LastGroupItem;
                };
        }
 }
index 1b146fe..3565dc0 100644 (file)
@@ -36,10 +36,8 @@ using namespace Logs::Details;
 using namespace std::placeholders;
 
 LogsView::LogsView(FilterType filterType)
-       : m_LogProvider(),
-         m_Genlist(nullptr),
-         m_Mode(ItemMode::Default),
-         m_FilterType(filterType)
+       : m_Mode(ItemMode::Default), m_FilterType(filterType),
+         m_Genlist(nullptr), m_LastGroupItem(nullptr)
 {
        system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_LOCALE_TIMEFORMAT_24HOUR, makeCallbackWithLastParam(&LogsView::onSettingsChanged), this);
        system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_LOCALE_COUNTRY, makeCallbackWithLastParam(&LogsView::onSettingsChanged), this);
@@ -137,11 +135,9 @@ Evas_Object *LogsView::createNoContentsLayout(Evas_Object *parent)
 
 void LogsView::fillGenlist()
 {
-       LogGroupItem *groupItem = nullptr;
-
        for (auto &&group : m_LogProvider.getLogGroupList()) {
-               if (shouldDisplayLogs(*group)) {
-                       groupItem = insertLogItem(group.get(), groupItem);
+               if (shouldDisplayLogs(group.get())) {
+                       insertLogItem(group.get());
                }
        }
 
@@ -151,12 +147,12 @@ void LogsView::fillGenlist()
        }
 }
 
-bool LogsView::shouldDisplayLogs(const LogGroup &group)
+bool LogsView::shouldDisplayLogs(const LogGroup *group) const
 {
        switch (m_FilterType) {
                case FilterMissed:
                {
-                       int type = group.getLogList().back()->getType();
+                       int type = group->getLogList().back()->getType();
                        return (type == CONTACTS_PLOG_TYPE_VOICE_INCOMING_SEEN ||
                                        type == CONTACTS_PLOG_TYPE_VOICE_INCOMING_UNSEEN);
                }
@@ -187,26 +183,55 @@ LogItem *LogsView::createLogItem(LogGroup *group)
        return item;
 }
 
-LogGroupItem *LogsView::insertLogItem(LogGroup *group, LogGroupItem *groupItem)
+LogItem *LogsView::insertLogItem(LogGroup *group)
 {
        Log *log = group->getLogList().back();
-
+       LogGroupItem *groupItem = getLastGroupItem();
        if (!groupItem || !LogProvider::compareDate(groupItem->getDate(), log->getTime())) {
-               groupItem = createLogGroupItem(log->getTime());
+               groupItem = insertGroupItem(log->getTime());
        }
 
-       m_Genlist->insert(createLogItem(group), groupItem, (*groupItem->begin()));
-       return groupItem;
+       LogItem *item = createLogItem(group);
+       m_Genlist->insert(item, groupItem, *groupItem->begin());
+       return item;
 }
 
-LogGroupItem *LogsView::createLogGroupItem(tm date)
+LogGroupItem *LogsView::insertGroupItem(tm date)
 {
        LogGroupItem *groupItem = new LogGroupItem(date);
-       m_Genlist->insert(groupItem, nullptr, nullptr, Ui::Genlist::After);
+       m_Genlist->insert(groupItem, nullptr, getLastGroupItem());
        elm_genlist_item_select_mode_set(groupItem->getObjectItem(), ELM_OBJECT_SELECT_MODE_NONE);
+
+       setLastGroupItem(groupItem);
        return groupItem;
 }
 
+LogGroupItem *LogsView::getLastGroupItem()
+{
+       if (!m_LastGroupItem) {
+               for (auto &&item : *m_Genlist) {
+                       if (item->isGroupItem()) {
+                               setLastGroupItem(dynamic_cast<LogGroupItem *>(item));
+                               break;
+                       }
+               }
+       }
+
+       return m_LastGroupItem;
+}
+
+void LogsView::setLastGroupItem(LogGroupItem *groupItem)
+{
+       if (m_LastGroupItem) {
+               m_LastGroupItem->setDestroyCallback(nullptr);
+       }
+
+       m_LastGroupItem = groupItem;
+       m_LastGroupItem->setDestroyCallback([this] {
+               m_LastGroupItem = nullptr;
+       });
+}
+
 void LogsView::setMode(ItemMode mode)
 {
        m_Mode = mode;
@@ -243,23 +268,23 @@ void LogsView::onSelectViewBy()
 
 void LogsView::onLogInserted(LogGroup *group)
 {
-       if (shouldDisplayLogs(*group)) {
+       if (shouldDisplayLogs(group)) {
                if (!m_Genlist) {
                        updateLayout(false);
                }
 
-               LogGroupItem *groupItem = dynamic_cast<LogGroupItem *>(m_Genlist->getFirstItem());
-               groupItem = insertLogItem(group, groupItem);
-               groupItem->scrollTo();
+               insertLogItem(group);
+               m_Genlist->getFirstItem()->scrollTo();
        }
 }
 
 void LogsView::onLogItemDelete(LogItem *item)
 {
-       LogGroupItem *itemGroup = static_cast<LogGroupItem *>(item->getParentItem());
+       Ui::GenlistGroupItem *groupItem = item->getParentItem();
        delete item;
-       if (itemGroup->empty()) {
-               delete itemGroup;
+
+       if (groupItem->empty()) {
+               delete groupItem;
        }
 
        if (!elm_genlist_items_count(m_Genlist->getEvasObject())) {