Changeset 186


Ignore:
Timestamp:
03/26/09 06:32:26 (3 years ago)
Author:
antonbatenev.ya.ru
Message:

Бранч. Оптимизация перехода к следующему непрочитанному сообщению.

Location:
branches/message_tree
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/message_tree/message_tree.cpp

    r185 r186  
    773773void AMessageTree::gotoNextUnreadArticle () 
    774774{ 
    775         if (checkCurrentItem() == false) 
    776                 return; 
    777 NO_COMPILE_THIS!!! 
     775        AMessageInfoGUI* info = NULL; 
     776 
    778777        MessageTreeWidgetItem* item = static_cast<MessageTreeWidgetItem*>(currentItem()); 
    779778 
     779        // если не было выделения, то ищем первый непрочитанный топик или топик с непрочитанными сообщениями 
     780        if (item == NULL) 
     781        { 
     782                for (int i = 0; i < topLevelItemCount(); i++) 
     783                { 
     784                        item = static_cast<MessageTreeWidgetItem*>(topLevelItem(i)); 
     785 
     786                        info = item->pag(); 
     787 
     788                        if (info->IsInfoLoaded == false) 
     789                                return; 
     790                        else if (info->IsRead == false) 
     791                        { 
     792                                setCurrentItem(item); 
     793                                return; 
     794                        } 
     795                        else if (info->HasUnreadChild == true) 
     796                                break; 
     797                } 
     798        } 
     799        else 
     800                info = item->pag(); 
     801 
     802        // флаг петли 
     803        bool loopback = false; 
     804 
     805        // есть выделение или найден топик с непрочитанными сообщениями 
    780806        while (true) 
    781807        { 
    782                 AMessageInfoGUI* info = item->pag(); 
    783  
    784                 if (info->HasUnreadChild != 0) 
     808                if (info->HasUnreadChild == true && info->IsChildLoaded == false) 
    785809                        item->setExpanded(true); 
    786810 
    787                 MessageTreeWidgetItem* next_item = static_cast<MessageTreeWidgetItem*>(ATreeWidgetItem::nextItem(item)); 
    788  
    789                 if (next_item == NULL) 
    790                         item = static_cast<MessageTreeWidgetItem*>(ATreeWidgetItem::firstSibling(ATreeWidgetItem::rootItem(item))); 
     811                // выбор следующего элемента 
     812                if (info->HasUnreadChild == true) 
     813                        // если есть дочерние непрочитанные, то выбираем первый дочерний 
     814                        item = static_cast<MessageTreeWidgetItem*>(ATreeWidgetItem::firstChild(item)); 
    791815                else 
    792                         item = next_item; 
     816                { 
     817                        // если нет дочерних непрочитанных, то ... 
     818 
     819                        // смотрим, есть ли у элемента родитель и есть ли у родителя непрочитанные дочерние 
     820                        MessageTreeWidgetItem* parent_item = static_cast<MessageTreeWidgetItem*>(item->parent()); 
     821 
     822                        // если есть родитель и у него нет непрочитанных дочерних, то поднимаемся на уровень родителя 
     823                        if (parent_item != NULL && parent_item->pag()->HasUnreadChild == false) 
     824                                item = parent_item; 
     825                        else 
     826                        { 
     827                                // у родителя есть непрочитанные дочерние или нет родителя - переходим к следующему брату 
     828                                // несмотря на то, что непрочитанный брат может быть и выше 
     829                                MessageTreeWidgetItem* sibling_item = static_cast<MessageTreeWidgetItem*>(ATreeWidgetItem::nextSibling(item)); 
     830 
     831                                // если следующего брата нет 
     832                                if (sibling_item == NULL && parent_item != NULL) 
     833                                { 
     834                                        // движение вверх по дереву, пока не найдется следующий брат у родителя 
     835                                        while (parent_item != NULL) 
     836                                        { 
     837                                                MessageTreeWidgetItem* last_child_item = static_cast<MessageTreeWidgetItem*>(ATreeWidgetItem::lastChild(parent_item)); 
     838 
     839                                                if (last_child_item != item) 
     840                                                        break; 
     841 
     842                                                item = parent_item; 
     843 
     844                                                parent_item = static_cast<MessageTreeWidgetItem*>(item->parent()); 
     845                                        } 
     846 
     847                                        // сдвиг на следующего брата в соседней подветке 
     848                                        item = static_cast<MessageTreeWidgetItem*>(ATreeWidgetItem::nextSibling(item)); 
     849                                } 
     850                                else 
     851                                        item = sibling_item; 
     852                        } 
     853                } 
     854 
     855                // если достигнут конец дерева, то переходим в корень 
     856                if (item == NULL) 
     857                        item = static_cast<MessageTreeWidgetItem*>(topLevelItem(0)); 
    793858 
    794859                info = item->pag(); 
    795860 
     861                // если найденый топик с незагруженной информацией 
    796862                if (info->IsInfoLoaded == false) 
    797                         item = static_cast<MessageTreeWidgetItem*>(ATreeWidgetItem::firstSibling(ATreeWidgetItem::rootItem(item))); 
     863                { 
     864                        if (loopback == true) 
     865                                return; 
     866 
     867                        item = static_cast<MessageTreeWidgetItem*>(topLevelItem(0)); 
     868                        info = item->pag(); 
     869 
     870                        loopback = true; 
     871                } 
    798872 
    799873                if (info->IsRead == false) 
     
    802876 
    803877        setCurrentItem(item); 
     878 
     879        scrollToItem(item, QAbstractItemView::PositionAtCenter); 
    804880} 
    805881//---------------------------------------------------------------------------------------------- 
     
    12361312                        // достройка дочерних веток для текущей 
    12371313                        if (info->HasChild) 
     1314                        { 
    12381315                                buildTree(info, list); 
     1316                                list_index = 0; 
     1317                        } 
    12391318                } 
    12401319                else   // if (info->ID == id_parent) 
  • branches/message_tree/version.h

    r185 r186  
    2020 * \brief Дата билда (заменяется автоматически при каждом билде в version.h, что и приводит к смене номера ревизии) 
    2121 */ 
    22 #define AVALON_DATE "Срд Мар 25 20:32:14 MSK 2009" 
     22#define AVALON_DATE "Чтв Мар 26 05:29:58 MSK 2009" 
    2323 
    2424#endif 
Note: See TracChangeset for help on using the changeset viewer.