Changeset 182


Ignore:
Timestamp:
03/24/09 21:51:11 (3 years ago)
Author:
antonbatenev.ya.ru
Message:

Бранч. Перед достройкой веток топика.

Location:
branches/message_tree
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • branches/message_tree/message_tree.cpp

    r181 r182  
    2020AMessageTree::AMessageTree (QWidget* parent, QWidget* form) : QTreeWidget (parent), IMessageTree () 
    2121{ 
     22        // 
     23        // инициализация полей 
     24        // 
     25 
    2226        m_parent       = form; 
    2327        m_forum_tree   = 0; 
     
    3337        m_current_forum.RateLimit = 0; 
    3438 
     39        // 
     40        // инициализация GUI виджета 
     41        // 
     42 
    3543        setFrameShadow(QFrame::Plain); 
    3644        setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
     
    4755        headerItem()->setTextAlignment(1, Qt::AlignCenter); 
    4856        headerItem()->setTextAlignment(2, Qt::AlignCenter); 
     57 
     58        // 
     59        // иконки 
     60        // 
    4961 
    5062        m_message_read   = QIcon(":/icons/messageread.png"); 
     
    6678        m_moderate      = QIcon(":/icons/moderate.png"); 
    6779 
    68         // меню 
     80        // 
     81        // контекстное меню (для основного дерева сообщений) 
     82        // 
     83 
    6984        m_menu = new QMenu(this); 
    7085 
     
    88103        m_menu_mark_thread_as_unread->setIcon(QIcon(":/icons/markpatrialasunread16.png")); 
    89104 
    90         // спец-меню 
     105        // 
     106        // контекстное спец-меню (для оценок, модерилок и исходящих сообщений) 
     107        // 
     108 
    91109        m_menu_special = new QMenu(this); 
    92110 
     
    120138        m_menu_special_delete->setIcon(QIcon(":/icons/delete16.png")); 
    121139 
     140        // 
    122141        // события меню 
     142        // 
     143 
    123144        connect(m_menu_reply,                  SIGNAL(triggered()), this, SLOT(menu_reply_triggered())); 
    124145        connect(m_menu_mark_message_as_read,   SIGNAL(triggered()), this, SLOT(menu_mark_message_as_read_triggered())); 
     
    127148        connect(m_menu_mark_thread_as_unread,  SIGNAL(triggered()), this, SLOT(menu_mark_thread_as_unread_triggered())); 
    128149 
     150        // 
    129151        // события спец-меню 
     152        // 
     153 
    130154        connect(m_menu_special_delete, SIGNAL(triggered()), this, SLOT(menu_special_delete_triggered())); 
    131155        connect(m_menu_special_edit,   SIGNAL(triggered()), this, SLOT(menu_special_edit_triggered())); 
     
    139163        connect(m_menu_special_minus,  SIGNAL(triggered()), this, SLOT(menu_special_minus_triggered())); 
    140164 
    141         // события дерева 
     165        // 
     166        // события виджета 
     167        // 
     168 
    142169        connect(this, SIGNAL(itemSelectionChanged()),                    this, SLOT(selection_changed())); 
    143170        connect(this, SIGNAL(itemExpanded(QTreeWidgetItem*)),            this, SLOT(expand_item(QTreeWidgetItem*))); 
     
    147174        connect(verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(vertical_scroll(int))); 
    148175 
     176        // событие таймера отметки как прочитанное 
    149177        connect(&m_timer, SIGNAL(timeout()), this, SLOT(timer_on_timer())); 
    150178} 
     
    159187{ 
    160188        QTreeWidget::resizeEvent(event); 
     189 
     190        // при ресайзе по высоте могут внизу появиться незагруженные топики 
     191        scrollTopics(); 
    161192} 
    162193//---------------------------------------------------------------------------------------------- 
     
    211242//---------------------------------------------------------------------------------------------- 
    212243 
    213 void AMessageTree::expand_item (QTreeWidgetItem* item_expanded) 
    214 { 
    215 } 
    216 //---------------------------------------------------------------------------------------------- 
    217  
    218244void AMessageTree::timer_on_timer () 
    219245{ 
     
    328354bool AMessageTree::selectByPath (const QList<int>* path) 
    329355{ 
     356} 
     357//---------------------------------------------------------------------------------------------- 
     358 
     359AMessageInfoGUI* AMessageTree::createItem () 
     360{ 
     361        MessageTreeWidgetItem* item = new MessageTreeWidgetItem(); 
     362 
     363        AMessageInfoGUI* info = item->pag(); 
     364 
     365        info->Item = item; 
     366 
     367        return info; 
    330368} 
    331369//---------------------------------------------------------------------------------------------- 
     
    405443 
    406444        // получение информации о себе 
     445        // TODO: вынести в AGlobal 
    407446        QSettings settings; 
    408447 
     
    433472                for (int i = 0; i < topic_list.count(); i++) 
    434473                { 
    435                         MessageTreeWidgetItem* item = new MessageTreeWidgetItem(); 
    436  
    437474                        // начальное заполнение дескриптора топика 
    438                         AMessageInfoGUI* info = item->pag(); 
    439  
    440                         info->ID   = topic_list[i]; 
    441                         info->Item = item; 
    442  
    443                         items.append(item); 
     475                        AMessageInfoGUI* info = createItem(); 
     476 
     477                        info->ID = topic_list[i]; 
     478 
     479                        items.append(info->Item); 
    444480                } 
    445481 
     
    458494void AMessageTree::scrollTopics () 
    459495{ 
     496        // Среднее время выполнения для дозагрузки одного элемента 10 ms 
     497        // Среднее время выполнения для дозагрузки страницы из 56 топиков (полный экран 1280х1024) 61 ms 
     498 
    460499        // пустой форум или спец-группа 
    461500        if (m_current_forum.ID == 0 || m_current_forum.IDGroup == SPECIAL_ID_GROUP) 
     
    470509 
    471510        if (top_item == NULL) 
    472         { 
    473                 DEBUG_MSG("top_item == NULL"); 
    474                 return; 
    475         } 
     511                return; // нет элементов в дереве(?) 
    476512 
    477513        top_item = ATreeWidgetItem::rootItem(top_item); 
    478514 
    479         int from_index = indexOfTopLevelItem(top_item); 
     515        int top_index = indexOfTopLevelItem(top_item); 
    480516 
    481517        // поиск корня нижнего видимого элемента в отображении 
    482518        QTreeWidgetItem* bottom_item = itemAt(1, height() - 1); 
    483519 
    484         int to_index; 
     520        int bottom_index; 
    485521 
    486522        if (bottom_item == NULL) 
    487                 to_index = topLevelItemCount(); 
     523                bottom_index = topLevelItemCount(); 
    488524        else 
    489525        { 
    490526                bottom_item = ATreeWidgetItem::rootItem(bottom_item); 
    491527 
    492                 to_index = indexOfTopLevelItem(bottom_item) + 1; 
     528                bottom_index = indexOfTopLevelItem(bottom_item) + 1; 
    493529        } 
    494530 
     
    499535        AMessageInfoGUIPtrList list; 
    500536 
    501         while (from_index < to_index) 
    502         { 
    503                 MessageTreeWidgetItem* item = static_cast<MessageTreeWidgetItem*>(topLevelItem(from_index)); 
     537        while (top_index < bottom_index) 
     538        { 
     539                MessageTreeWidgetItem* item = static_cast<MessageTreeWidgetItem*>(topLevelItem(top_index)); 
    504540 
    505541                AMessageInfoGUI* info = item->pag(); 
     
    508544                        list.append(info); 
    509545 
    510                 from_index++; 
     546                top_index++; 
    511547        } 
    512548 
     
    578614} 
    579615//---------------------------------------------------------------------------------------------- 
     616 
     617void AMessageTree::expand_item (QTreeWidgetItem* item_expanded) 
     618{ 
     619        MessageTreeWidgetItem* item = static_cast<MessageTreeWidgetItem*>(item_expanded); 
     620 
     621        AMessageInfoGUI* info = item->pag(); 
     622 
     623        if (info->HasChild == true && info->IsChildLoaded == false) 
     624        { 
     625                // получение хранилища 
     626                std::auto_ptr<IAStorage> storage(AStorageFactory::getStorage()); 
     627 
     628                if (storage.get() == NULL) 
     629                { 
     630                        QMessageBox::critical(m_parent, QString::fromUtf8("Ошибка!"), QString::fromUtf8("Не выбрано хранилище данных")); 
     631                        return; 
     632                } 
     633 
     634                // заполнение списка сообщений 
     635                AMessageInfoGUIPtrList list; 
     636 
     637                if (storage->getTopicMessageList(info->ID, list, this, m_me.ID, NULL) == false) 
     638                { 
     639                        storage->showError(m_parent); 
     640                        return; 
     641                } 
     642 
     643                // постройка дерева 
     644                buildTree(info, &list); 
     645 
     646                // для предотвращения повторной загрузки TODO 
     647                //info->IsChildLoaded = true; 
     648 
     649                /* 
     650                // раскрытие дерева до уровня непрочитаных топиков 
     651                if (item->pag()->UnreadChildCount != 0) 
     652                        expandUnreadChild(item); 
     653                */ 
     654        } 
     655} 
     656//---------------------------------------------------------------------------------------------- 
     657 
     658void AMessageTree::buildTree (AMessageInfoGUI* root, AMessageInfoGUIPtrList* list) 
     659{ 
     660} 
     661//---------------------------------------------------------------------------------------------- 
  • branches/message_tree/message_tree.h

    r181 r182  
    1818 */ 
    1919class AMessageTree : 
    20         public QTreeWidget, // стандартное дерево Qt 
    21         public IMessageTree // интерфес для взаимодействия со списком форумов и отображением сообщения 
     20        public  QTreeWidget,           // стандартное дерево Qt 
     21        public  IMessageTree,          // интерфес для взаимодействия со списком форумов и отображением сообщения 
     22        private IMessageInfoGUIFactory // интерфейс фабрики создания элементов дерева 
    2223{ 
    2324        Q_OBJECT 
     
    7677                IFormMain*    m_main_form;    /*!< \brief Интерфейс главной формы         */ 
    7778 
     79                // 
    7880                // иконки для отображения статусов сообщений 
     81                // 
     82 
    7983                QIcon m_message_read;      /*!< \brief Сообщение прочитано                     */ 
    8084                QIcon m_child_unread;      /*!< \brief Есть непрочитанные дочерние сообщения   */ 
     
    8387                QIcon m_message_unread_my; /*!< \brief В ветке есть сообщение для меня         */ 
    8488 
     89                // 
    8590                // иконки для отображения оценок 
     91                // 
     92 
    8693                QIcon m_rating_plus_1; /*!< \brief "+1"  */ 
    8794                QIcon m_rating_1;      /*!< \brief "1"   */ 
     
    100107 
    101108                /*! 
    102                  * \brief Высплывающее меню 
     109                 * \brief Основное контекстное меню (для основного дерева сообщений) 
    103110                 */ 
    104111                QMenu* m_menu; 
     
    111118 
    112119                /*! 
    113                  * \brief Высплывающее меню в спец-фоорумах 
     120                 * \brief Контекстное меню в спец-фоорумах (оценки, модерилки, исходящие сообщения) 
    114121                 */ 
    115122                QMenu* m_menu_special; 
     
    138145                void scrollTopics (); 
    139146 
     147                /*! 
     148                 * \brief Построение дерева (топика) из списка элементов 
     149                 * \param root Родительский элемент 
     150                 * \param list Список дочерних элементов для построения 
     151                 */ 
     152                void buildTree (AMessageInfoGUI* root, AMessageInfoGUIPtrList* list); 
     153 
    140154        // IMessageTree 
    141155        public: 
     
    153167                bool selectByPath (const QList<int>* path); 
    154168 
     169        // IMessageInfoGUIFactory 
     170        private: 
     171 
     172                AMessageInfoGUI* createItem (); 
     173 
    155174        private slots: 
    156175 
     
    171190 
    172191                /*! 
    173                  * \brief Двойной клик 
     192                 * \brief Двойной клик (редактирование) 
    174193                 */ 
    175194                void item_double_clicked (QTreeWidgetItem* item, int column); 
     
    185204                void context_menu_request (const QPoint& pos); 
    186205 
    187                 // меню 
     206                // 
     207                // Основное контекстное меню 
     208                // 
     209 
    188210                void menu_reply_triggered                  (); /*!< \brief Ответить                             */ 
    189211                void menu_mark_message_as_read_triggered   (); /*!< \brief Пометить сообщение как прочитанное   */ 
     
    193215 
    194216                // 
    195                 // Специальное меню 
     217                // Специальное контекстное меню 
    196218                // 
    197219 
  • branches/message_tree/model/message.h

    r181 r182  
    121121 
    122122/*! 
     123 * \brief Интерфейс для фабрики элементов дерева отображения сообщений (см. IAStorage::getTopicMessageList) 
     124 * Необходим для уменьшения расходов врмени на копирование информации при загрузке большого топика 
     125 */ 
     126class IMessageInfoGUIFactory 
     127{ 
     128        public: 
     129 
     130                /*! 
     131                 * \brief Метод для создания GUI-элемента дерева сообщений 
     132                 * \return Указатель на готовый к заполнению данными элемент (поле Item устанавливается в валидное при создании) 
     133                 */ 
     134                virtual AMessageInfoGUI* createItem () = 0; 
     135}; 
     136 
     137/*! 
    123138 * \brief Сообщение к отправке 
    124139 */ 
  • branches/message_tree/storage/istorage.h

    r181 r182  
    1717 
    1818/*! 
    19  * \brief Типы множеств для групповой обработки (см. IAStorage::SetIDsAsRead и IAStorage::Unsubscribe). 
     19 * \brief Типы множеств для групповой обработки (см. IAStorage::setIDsAsRead и IAStorage::unsubscribe). 
    2020 */ 
    2121typedef enum AIDSet 
     
    137137                /*! 
    138138                 * \brief Заполняет информацию о топиках 
    139                  * Поля списка (кроме ID и Item) предполагаются заполненными значениями полей по умолчанию (см. AMessageInfoGUI::AMessageInfoGUI()) и не меняются без необходимости. 
     139                 * Поля списка (кроме ID и Item) предполагаются заполненными значениями полей по умолчанию (см. AMessageInfoGUI::AMessageInfoGUI) и не меняются без необходимости. 
    140140                 * Функция должна заполнить все поля AMessageInfo плюс установить флаги IsRead, HasUnreadChild, HasUnreadChildMy в актуальные значения. 
    141                  * Функция НЕ должна устанавливать флаг IsInfoLoaded (устанавливается вызвающим кодом) 
     141                 * Функция НЕ должна устанавливать флаг IsInfoLoaded (устанавливается вызвающим кодом). 
    142142                 * \param list Список топиков (с установленным полем ID, по которому будет производиться дальнейшее заполнение информацией). 
    143                  * \param id_me ID текущего пользователя 
     143                 * \param id_me ID текущего пользователя avalon. 
    144144                 * \param progress Прогресс выполнения операции. 
    145145                 */ 
     
    147147 
    148148                /*! 
    149                  * \brief Возвращает список _всех_ сообщений в топике (родительской ветке) за исключением тел самих сообщений, 
    150                  * тело сообщения будет запрошено при помощи IAStorage::GetMessageBody, по мере необходимости. 
     149                 * \brief Заполняет информацию о всех сообщениях в топике (родительской ветке). 
     150                 * Функция должна заполнить все поля AMessageInfoGUI кроме (TODO) (которые устанавливаются вызвающим кодом), 
     151                 * body - тело сообщения будет запрошено при помощи IAStorage::GetMessageBody, по мере необходимости. 
    151152                 * \param id_topic ID топика (темы, родительской ветки). 
    152                  * \param list Список сообщений. 
    153                  * \param id_me ID текущего пользователя 
    154                  * \param progress Прогресс выполнения операции. 
    155                  */ 
    156                 virtual bool getTopicMessageList (int id_topic, AMessageInfoGUIList& list, int id_me, IProgress* progress = NULL) = 0; 
     153                 * \param list Список сообщений (изначально пустой, на выходе заполненый). 
     154                 * \param factory Фабрика для создания элементов (каждый элемент списка создается вызовом IMessageInfoGUIFactory::createItem), 
     155                 * поля (кроме Item) предполагаются заполненными значениями полей по умолчанию (см. AMessageInfoGUI::AMessageInfoGUI) и не меняются без необходимости. 
     156                 * \param id_me ID текущего пользователя avalon. 
     157                 * \param progress Прогресс выполнения операции. 
     158                 */ 
     159                virtual bool getTopicMessageList (int id_topic, AMessageInfoGUIPtrList& list, IMessageInfoGUIFactory* factory, int id_me, IProgress* progress = NULL) = 0; 
    157160 
    158161                /*! 
  • branches/message_tree/storage/mysql_storage.cpp

    r181 r182  
    18361836        sql += "        `id_forum` = " + QString::number(id_forum) + "\n"; 
    18371837        sql += "ORDER BY\n"; 
    1838  
    18391838        // поскльку id_message автоинкремент и растет вместе с датой, то 
    18401839        // можно условно положиться на то, что бОльшему id_message соответствует 
    18411840        // бОльшая дата - в результате сортировка дает ~50% выигрыша в производительности 
    18421841        //sql += "      `message_date` DESC"; 
    1843  
    18441842        sql += "        `id_message` DESC"; 
    18451843 
     
    21202118//---------------------------------------------------------------------------------------------- 
    21212119 
    2122 bool AMySQLStorage::getTopicMessageList (int id_topic, AMessageInfoGUIList& list, int id_me, IProgress* progress) 
     2120bool AMySQLStorage::getTopicMessageList (int id_topic, AMessageInfoGUIPtrList& list, IMessageInfoGUIFactory* factory, int id_me, IProgress* progress) 
    21232121{ 
    2124 /* 
     2122 
    21252123        if (progress != NULL) 
    21262124                progress->onProgress(0); 
     
    21542152        sql += "        `id_topic` = " + QString::number(id_topic) + "\n"; 
    21552153        sql += "ORDER BY\n"; 
    2156         sql += "        `message_date` DESC"; 
     2154        // поскльку id автоинкремент и растет вместе с датой, то 
     2155        // можно условно положиться на то, что бОльшему id_message соответствует 
     2156        // бОльшая дата - в результате сортировка дает ~50% выигрыша в производительности 
     2157        //sql += "      `message_date` DESC"; 
     2158        sql += "        `id` DESC"; 
    21572159 
    21582160        std::auto_ptr<AQuery> query_select(createQuery(sql, false)); 
     
    21602162        if (query_select.get() == NULL) 
    21612163                return returnError(AMySQLDatabase::getLastError()); 
     2164 
     2165        query_select->setForwardOnly(true); 
    21622166 
    21632167        if (query_select->exec() == false) 
     
    21662170        while (query_select->next()) 
    21672171        { 
    2168                 ATopicInfo info; 
    2169  
    2170                 info.ID             = query_select->value(0).toInt(); 
    2171                 info.IDTopic        = query_select->value(1).toInt(); 
    2172                 info.IDParent       = query_select->value(2).toInt(); 
    2173                 info.IDUser         = query_select->value(3).toInt(); 
    2174                 info.IDForum        = query_select->value(4).toInt(); 
    2175                 info.Subject        = query_select->value(5).toString(); 
    2176                 info.MessageName    = query_select->value(6).toString(); 
    2177                 info.UserNick       = query_select->value(7).toString(); 
    2178                 info.IDArticle      = query_select->value(8).toInt(); 
    2179                 info.MessageDate    = query_select->value(9).toDateTime(); 
    2180                 info.UpdateDate     = query_select->value(10).toDateTime(); 
    2181                 info.UserRole       = query_select->value(11).toString(); 
    2182                 info.UserTitle      = query_select->value(12).toString(); 
    2183                 info.UserTitleColor = query_select->value(13).toInt(); 
    2184                 info.LastModerated  = query_select->value(14).toDateTime(); 
    2185                 info.HasChild       = query_select->value(15).toInt(); 
    2186  
    2187                 info.IsRead         = true; 
    2188                 info.HasUnreadChild = 0; 
     2172                AMessageInfoGUI* info = factory->createItem(); 
     2173 
     2174                info->ID             = query_select->value(0).toInt(); 
     2175                info->IDTopic        = query_select->value(1).toInt(); 
     2176                info->IDParent       = query_select->value(2).toInt(); 
     2177                info->IDUser         = query_select->value(3).toInt(); 
     2178                info->IDForum        = query_select->value(4).toInt(); 
     2179                info->Subject        = query_select->value(5).toString(); 
     2180                info->MessageName    = query_select->value(6).toString(); 
     2181                info->UserNick       = query_select->value(7).toString(); 
     2182                info->IDArticle      = query_select->value(8).toInt(); 
     2183                info->MessageDate    = query_select->value(9).toDateTime(); 
     2184                info->UpdateDate     = query_select->value(10).toDateTime(); 
     2185                info->UserRole       = query_select->value(11).toString(); 
     2186                info->UserTitle      = query_select->value(12).toString(); 
     2187                info->UserTitleColor = query_select->value(13).toInt(); 
     2188                info->LastModerated  = query_select->value(14).toDateTime(); 
     2189                info->HasChild       = query_select->value(15).toInt(); 
    21892190 
    21902191                list.append(info); 
     
    22112212                return returnError(AMySQLDatabase::getLastError()); 
    22122213 
     2214        query_select_unread->setForwardOnly(true); 
     2215 
    22132216        if (query_select_unread->exec() == false) 
    22142217                return returnError(query_select_unread->getLastError()); 
     
    22232226                        { 
    22242227                                if (id_parent_user == id_me) 
    2225                                         list[i].HasUnreadChild = 2; 
    2226  
    2227                                 list[i].IsRead = false; 
    2228                                 //list.move(i, 0); 
     2228                                        list[i]->HasUnreadChild = 2; 
     2229 
     2230                                list[i]->IsRead = false; 
     2231 
     2232                                list.move(i, 0); 
     2233 
    22292234                                break; 
    22302235                        } 
     
    22322237 
    22332238        return returnSuccess(); 
    2234 */ 
    2235         returnError(QString::fromUtf8("AMySQLStorage::getTopicMessageList")); 
    22362239} 
    22372240//---------------------------------------------------------------------------------------------- 
  • branches/message_tree/storage/mysql_storage.h

    r181 r182  
    5858                bool getForumTopicList      (int id_forum, int count, QList<int>& list, IProgress* progress = NULL); 
    5959                bool getTopicInfoList       (AMessageInfoGUIPtrList& list, int id_me, IProgress* progress = NULL); 
    60                 bool getTopicMessageList    (int id_topic, AMessageInfoGUIList& list, int id_me, IProgress* progress = NULL); 
     60                bool getTopicMessageList    (int id_topic, AMessageInfoGUIPtrList& list, IMessageInfoGUIFactory* factory, int id_me, IProgress* progress = NULL); 
    6161                bool getMessageBody         (int id_message, QString& body, IProgress* progress = NULL); 
    6262                bool setIDsAsRead           (const QList<int>& list, AIDSet type, bool read, QDateTime date, IProgress* progress = NULL); 
  • branches/message_tree/version.h

    r181 r182  
    2020 * \brief Дата билда (заменяется автоматически при каждом билде в version.h, что и приводит к смене номера ревизии) 
    2121 */ 
    22 #define AVALON_DATE "Пнд Мар 23 20:37:20 MSK 2009" 
     22#define AVALON_DATE "Втр Мар 24 20:28:25 MSK 2009" 
    2323 
    2424#endif 
Note: See TracChangeset for help on using the changeset viewer.