Changeset 181
- Timestamp:
- 03/23/09 22:01:45 (3 years ago)
- Location:
- branches/message_tree
- Files:
-
- 13 edited
-
form_message.cpp (modified) (1 diff)
-
form_message.h (modified) (2 diffs)
-
forum_tree.cpp (modified) (2 diffs)
-
global.cpp (modified) (1 diff)
-
global.h (modified) (1 diff)
-
message_tree.cpp (modified) (9 diffs)
-
message_tree.h (modified) (1 diff)
-
model/message.h (modified) (2 diffs)
-
storage/istorage.h (modified) (2 diffs)
-
storage/mysql_storage.cpp (modified) (10 diffs)
-
storage/mysql_storage.h (modified) (1 diff)
-
sysheaders.h (modified) (1 diff)
-
version.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
branches/message_tree/form_message.cpp
r177 r181 10 10 //---------------------------------------------------------------------------------------------- 11 11 12 FormMessage::FormMessage (QWidget* parent, bool is_reply, const A TopicInfo& info, int edit_id) : FormMessageUI (parent)12 FormMessage::FormMessage (QWidget* parent, bool is_reply, const AMessageInfoGUI& info, int edit_id) : FormMessageUI (parent) 13 13 { 14 14 if (edit_id != 0) -
branches/message_tree/form_message.h
r147 r181 32 32 * \param edit_id ID редактирования существующего сообщения к отправке 33 33 */ 34 FormMessage (QWidget* parent, bool is_reply, const A TopicInfo& info, int edit_id = 0);34 FormMessage (QWidget* parent, bool is_reply, const AMessageInfoGUI& info, int edit_id = 0); 35 35 ~FormMessage (); 36 36 … … 55 55 * \brief Текущее редактируемое сообщение. 56 56 */ 57 A TopicInfom_info;57 AMessageInfoGUI m_info; 58 58 59 59 /*! -
branches/message_tree/forum_tree.cpp
r152 r181 814 814 return; 815 815 816 A TopicInfoinfo;816 AMessageInfoGUI info; 817 817 818 818 info.ID = 0; … … 832 832 info.UserTitleColor = 0; 833 833 info.LastModerated = QDateTime(); 834 info.IsRead = false;834 /*info.IsRead = false; 835 835 info.HasChild = false; 836 info.HasUnreadChild = false; 836 info.HasUnreadChild = false;*/ // TODO: 837 837 838 838 FormMessage* form = new FormMessage(NULL, false, info); -
branches/message_tree/global.cpp
r162 r181 24 24 25 25 reload(); 26 27 AnonymousName = QString::fromUtf8("Аноним"); 28 DateFormat = "dd.MM.yyyy hh:mm:ss"; 26 29 } 27 30 //---------------------------------------------------------------------------------------------- -
branches/message_tree/global.h
r159 r181 42 42 int SynchronizeInterval; /*!< \brief Интервал синхронизации (минут) */ 43 43 AColorer Colorer; /*!< \brief Движок подсветки синтаксиса */ 44 45 // 46 // Константы 47 // 48 49 QString AnonymousName; /*!< \brief Отображаемое имя анонима */ 50 QString DateFormat; /*!< \brief Формат даты/времени */ 44 51 }; 45 52 -
branches/message_tree/message_tree.cpp
r179 r181 13 13 //---------------------------------------------------------------------------------------------- 14 14 /*! 15 * \brief Элемент, который хранится в каждой ноде дерева 16 */ 17 typedef struct AMessageInfoGUI 18 { 19 ATopicInfo Info; /*!< \brief Дескриптор сообщения */ 20 }; 21 //---------------------------------------------------------------------------------------------- 22 /*! 23 * \brief Элемент для дерева группы форумов с информацией о группе 15 * \brief Элемент для дерева сообщений 24 16 */ 25 17 typedef ATreeWidgetItemT<AMessageInfoGUI> MessageTreeWidgetItem; … … 33 25 m_main_form = 0; 34 26 27 m_me.ID = 0; 28 35 29 m_current_forum.ID = 0; 36 30 m_current_forum.IDGroup = 0; 37 m_current_forum.ShortName = "";38 m_current_forum.Name = "";39 31 m_current_forum.Rated = false; 40 32 m_current_forum.InTop = false; … … 215 207 void AMessageTree::vertical_scroll (int /*value*/) 216 208 { 209 scrollTopics(); 217 210 } 218 211 //---------------------------------------------------------------------------------------------- … … 352 345 m_current_forum.RateLimit = 0; 353 346 347 m_me.ID = 0; 348 m_me.Name = ""; 349 m_me.Nick = ""; 350 m_me.RealName = ""; 351 m_me.Email = ""; 352 m_me.Homepage = ""; 353 m_me.Specialization = ""; 354 m_me.WhereFrom = ""; 355 m_me.Origin = ""; 356 354 357 if (m_main_form != NULL) 355 358 m_main_form->setEnabledAction(aaViewSource, false); … … 401 404 } 402 405 406 // получение информации о себе 407 QSettings settings; 408 409 m_me.Name = settings.value("rsdn/login", "").toString(); 410 411 if (storage->whoAmI(m_me, NULL) == false) 412 m_me.Name = ""; 413 403 414 // если группа форумов обыкновенная 404 415 if (m_current_forum.IDGroup != SPECIAL_ID_GROUP) … … 406 417 // получение топиков 407 418 // ориентировочное время выполнения 68 ms (для форума NET, 28199 топиков) 419 // основное время занимает запрос данных из хранилища 408 420 QList<int> topic_list; 409 421 … … 413 425 return; 414 426 } 415 AProfiler p; for (int profiler = 0; profiler < 1000; profiler++) { 427 416 428 // установка топиков 417 429 // ориентировочное время выполнения 50 ms (для форума NET, 28199 топиков) 430 // основное время занимает создание объекта MessageTreeWidgetItem 418 431 QList<QTreeWidgetItem*> items; 419 MessageTreeWidgetItem* items_array = new MessageTreeWidgetItem[topic_list.count()];420 432 421 433 for (int i = 0; i < topic_list.count(); i++) 422 434 { 423 MessageTreeWidgetItem* item = &items_array[i]; 424 425 //MessageTreeWidgetItem* item = new MessageTreeWidgetItem(); 435 MessageTreeWidgetItem* item = new MessageTreeWidgetItem(); 426 436 427 437 // начальное заполнение дескриптора топика 428 438 AMessageInfoGUI* info = item->pag(); 429 439 430 //info->Info.ID = topic_list[i]; 440 info->ID = topic_list[i]; 441 info->Item = item; 431 442 432 443 items.append(item); … … 435 446 // отображение на виджет 436 447 addTopLevelItems(items); 437 clear(); 438 } p.stop(1000); 448 449 // дозагрузка информации о топиках, находящихся в видимой области отображения 450 scrollTopics(); 439 451 } 440 452 else // if (forum_info->IDGroup != SPECIAL_ID_GROUP) … … 443 455 } 444 456 //---------------------------------------------------------------------------------------------- 457 458 void AMessageTree::scrollTopics () 459 { 460 // пустой форум или спец-группа 461 if (m_current_forum.ID == 0 || m_current_forum.IDGroup == SPECIAL_ID_GROUP) 462 return; 463 464 // 465 // Определение диапазона возможной подгрузки данных 466 // 467 468 // поиск корня верхнего видимого элемента в отображении 469 QTreeWidgetItem* top_item = itemAt(1, 1); 470 471 if (top_item == NULL) 472 { 473 DEBUG_MSG("top_item == NULL"); 474 return; 475 } 476 477 top_item = ATreeWidgetItem::rootItem(top_item); 478 479 int from_index = indexOfTopLevelItem(top_item); 480 481 // поиск корня нижнего видимого элемента в отображении 482 QTreeWidgetItem* bottom_item = itemAt(1, height() - 1); 483 484 int to_index; 485 486 if (bottom_item == NULL) 487 to_index = topLevelItemCount(); 488 else 489 { 490 bottom_item = ATreeWidgetItem::rootItem(bottom_item); 491 492 to_index = indexOfTopLevelItem(bottom_item) + 1; 493 } 494 495 // 496 // Поиск еще не загруженных топиков в диапазоне 497 // 498 499 AMessageInfoGUIPtrList list; 500 501 while (from_index < to_index) 502 { 503 MessageTreeWidgetItem* item = static_cast<MessageTreeWidgetItem*>(topLevelItem(from_index)); 504 505 AMessageInfoGUI* info = item->pag(); 506 507 if (info->IsInfoLoaded == false) 508 list.append(info); 509 510 from_index++; 511 } 512 513 // 514 // загрузка топиков, которые не загружены 515 // 516 517 if (list.count() == 0) 518 return; 519 520 // получение хранилища 521 std::auto_ptr<IAStorage> storage(AStorageFactory::getStorage()); 522 523 if (storage.get() == NULL) 524 { 525 QMessageBox::critical(m_parent, QString::fromUtf8("Ошибка!"), QString::fromUtf8("Не выбрано хранилище данных")); 526 return; 527 } 528 529 if (storage->getTopicInfoList(list, m_me.ID, NULL) == false) 530 { 531 storage->showError(m_parent); 532 return; 533 } 534 535 AGlobal* global = AGlobal::getInstance(); 536 537 // 538 // Установка загруженой информации 539 // 540 541 for (int i = 0; i < list.count(); i++) 542 { 543 AMessageInfoGUI* info = list[i]; 544 545 info->IsInfoLoaded = true; 546 info->UnreadChildCount = 0; 547 info->UnreadChildCountMy = 0; 548 549 info->Item->setText(0, info->Subject); 550 551 if (info->IDUser == 0) 552 info->Item->setText(1, global->AnonymousName); 553 else 554 info->Item->setText(1, info->UserNick); 555 556 info->Item->setText(2, info->MessageDate.toString(global->DateFormat)); 557 558 if (info->HasChild == true) 559 info->Item->setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator); 560 561 if (info->IsRead == true) 562 { 563 if (info->HasUnreadChildMy) 564 info->Item->setIcon(0, m_child_unread_my); 565 else if (info->HasUnreadChild) 566 info->Item->setIcon(0, m_child_unread); 567 else 568 info->Item->setIcon(0, m_message_read); 569 } 570 else 571 { 572 if (info->HasUnreadChildMy) 573 info->Item->setIcon(0, m_message_unread_my); 574 else 575 info->Item->setIcon(0, m_message_unread); 576 } 577 } 578 } 579 //---------------------------------------------------------------------------------------------- -
branches/message_tree/message_tree.h
r179 r181 130 130 // 131 131 132 AForumInfo m_current_forum; 132 AForumInfo m_current_forum; /*!< \brief Текущий отображаемый форум */ 133 AUserInfo m_me; /*!< \brief Текущий пользователь avalon */ 134 135 /*! 136 * \brief Дозагрузка информации о топиках, находящихся в видимой области отображения 137 */ 138 void scrollTopics (); 133 139 134 140 // IMessageTree -
branches/message_tree/model/message.h
r118 r181 67 67 * \brief Расширенная информация о сообщении для отображения в дереве в GUI 68 68 */ 69 typedef struct AMessageInfo Ex: AMessageInfo69 typedef struct AMessageInfoGUI : AMessageInfo 70 70 { 71 bool IsRead; /*!< \brief Прочитано ли сообщение */ 71 bool IsInfoLoaded; /*!< \brief Загружена ли какая-нибудь информация кроме ID */ 72 bool IsRead; /*!< \brief Прочитано ли сообщение */ 73 bool HasChild; /*!< \brief Имеются ли дочерние сообщения */ 74 bool IsBodyLoaded; /*!< \brief Загружено ли тело сообщения */ 75 bool IsChildLoaded; /*!< \brief Загружены ли дочерние сообщения */ 76 int HasUnreadChild; /*!< \brief Наличие непрочитанных дочерних */ 77 int HasUnreadChildMy; /*!< \brief Наличие непрочитанных дочерних мне */ 78 int UnreadChildCount; /*!< \brief Количество непрочитанных дочерних */ 79 int UnreadChildCountMy; /*!< \brief Количество непрочитанных дочерних мне */ 80 int Special; /*!< \brief Спец-данные */ 81 82 QTreeWidgetItem* Item; /*!< \brief Слинкованный элемент дерева */ 83 84 AMessageInfoGUI () 85 { 86 // AMessageInfo 87 ID = -1; 88 IDTopic = -1; 89 IDParent = -1; 90 IDUser = -1; 91 IDForum = -1; 92 IDArticle = -1; 93 UserTitleColor = -1; 94 95 // AMessageInfoGUI 96 IsInfoLoaded = false; 97 IsRead = true; 98 HasChild = false; 99 IsBodyLoaded = false; 100 IsChildLoaded = false; 101 HasUnreadChild = false; 102 HasUnreadChildMy = false; 103 UnreadChildCount = -1; 104 UnreadChildCountMy = -1; 105 Special = -1; 106 107 Item = NULL; 108 } 109 72 110 } AMessageInfoEx; 73 111 … … 75 113 * \brief Список сообщений для отображения в дереве в GUI 76 114 */ 77 typedef QList<AMessageInfoEx> AMessageInfoExList; 78 79 /*! 80 * \brief Информация о топике для отображения дерева в GUI 81 */ 82 typedef struct ATopicInfo : AMessageInfoEx 83 { 84 bool HasChild; /*!< \brief Есть ли дочерние сообщения */ 85 int HasUnreadChild; /*!< \brief Есть ли дочерние непрочитанные сообщения 0 - нет, 1 - да, 2 - есть непрочитанные для текущего пользователя */ 86 } ATopicInfo; 115 typedef QList<AMessageInfoGUI> AMessageInfoGUIList; 87 116 88 117 /*! 89 118 * \brief Список сообщений для отображения в дереве в GUI 90 119 */ 91 typedef QList<A TopicInfo> ATopicInfoList;120 typedef QList<AMessageInfoGUI*> AMessageInfoGUIPtrList; 92 121 93 122 /*! -
branches/message_tree/storage/istorage.h
r177 r181 136 136 137 137 /*! 138 * \brief Заполняет полную информацию о топиках за исключением тела самого сообщения, 139 * тело сообщения будет запрошено при помощи IAStorage::GetMessageBody, по мере необходимости. 140 * \param list Список топиков. 138 * \brief Заполняет информацию о топиках 139 * Поля списка (кроме ID и Item) предполагаются заполненными значениями полей по умолчанию (см. AMessageInfoGUI::AMessageInfoGUI()) и не меняются без необходимости. 140 * Функция должна заполнить все поля AMessageInfo плюс установить флаги IsRead, HasUnreadChild, HasUnreadChildMy в актуальные значения. 141 * Функция НЕ должна устанавливать флаг IsInfoLoaded (устанавливается вызвающим кодом) 142 * \param list Список топиков (с установленным полем ID, по которому будет производиться дальнейшее заполнение информацией). 141 143 * \param id_me ID текущего пользователя 142 144 * \param progress Прогресс выполнения операции. 143 145 */ 144 virtual bool getTopicInfoList (A TopicInfoList& list, int id_me, IProgress* progress = NULL) = 0;146 virtual bool getTopicInfoList (AMessageInfoGUIPtrList& list, int id_me, IProgress* progress = NULL) = 0; 145 147 146 148 /*! … … 152 154 * \param progress Прогресс выполнения операции. 153 155 */ 154 virtual bool getTopicMessageList (int id_topic, A TopicInfoList& list, int id_me, IProgress* progress = NULL) = 0;156 virtual bool getTopicMessageList (int id_topic, AMessageInfoGUIList& list, int id_me, IProgress* progress = NULL) = 0; 155 157 156 158 /*! -
branches/message_tree/storage/mysql_storage.cpp
r179 r181 1943 1943 //---------------------------------------------------------------------------------------------- 1944 1944 1945 bool AMySQLStorage::getTopicInfoList (A TopicInfoList& list, int id_me, IProgress* progress)1945 bool AMySQLStorage::getTopicInfoList (AMessageInfoGUIPtrList& list, int id_me, IProgress* progress) 1946 1946 { 1947 1947 if (progress != NULL) … … 1953 1953 for (int i = 0; i < list.count(); i++) 1954 1954 { 1955 ids += QString::number(list[i] .ID);1955 ids += QString::number(list[i]->ID); 1956 1956 1957 1957 if (i < list.count() - 1) … … 1992 1992 return returnError(AMySQLDatabase::getLastError()); 1993 1993 1994 query_select->setForwardOnly(true); 1995 1994 1996 if (query_select->exec() == false) 1995 1997 return returnError(query_select->getLastError()); … … 2000 2002 2001 2003 for (int i = 0; i < list.count(); i++) 2002 if (id == list[i].ID) 2004 { 2005 AMessageInfoGUI* info = list[i]; 2006 2007 if (id == info->ID) 2003 2008 { 2004 list[i].IDTopic = query_select->value(1).toInt(); 2005 list[i].IDParent = query_select->value(2).toInt(); 2006 list[i].IDUser = query_select->value(3).toInt(); 2007 list[i].IDForum = query_select->value(4).toInt(); 2008 list[i].Subject = query_select->value(5).toString(); 2009 list[i].MessageName = query_select->value(6).toString(); 2010 list[i].UserNick = query_select->value(7).toString(); 2011 list[i].IDArticle = query_select->value(8).toInt(); 2012 list[i].MessageDate = query_select->value(9).toDateTime(); 2013 list[i].UpdateDate = query_select->value(10).toDateTime(); 2014 list[i].UserRole = query_select->value(11).toString(); 2015 list[i].UserTitle = query_select->value(12).toString(); 2016 list[i].UserTitleColor = query_select->value(13).toInt(); 2017 list[i].LastModerated = query_select->value(14).toDateTime(); 2018 list[i].HasChild = query_select->value(15).toInt(); 2019 2020 list[i].IsRead = true; 2021 list[i].HasUnreadChild = 0; 2009 // AMessageInfo 2010 info->IDTopic = query_select->value(1).toInt(); 2011 info->IDParent = query_select->value(2).toInt(); 2012 info->IDUser = query_select->value(3).toInt(); 2013 info->IDForum = query_select->value(4).toInt(); 2014 info->Subject = query_select->value(5).toString(); 2015 info->MessageName = query_select->value(6).toString(); 2016 info->UserNick = query_select->value(7).toString(); 2017 info->IDArticle = query_select->value(8).toInt(); 2018 info->MessageDate = query_select->value(9).toDateTime(); 2019 info->UpdateDate = query_select->value(10).toDateTime(); 2020 info->UserRole = query_select->value(11).toString(); 2021 info->UserTitle = query_select->value(12).toString(); 2022 info->UserTitleColor = query_select->value(13).toInt(); 2023 info->LastModerated = query_select->value(14).toDateTime(); 2024 info->HasChild = query_select->value(15).toInt(); 2025 2026 // AMessageInfoGUI (в остальные данные не вмешиваемся) 2027 info->IsInfoLoaded = true; 2022 2028 2023 2029 break; 2024 2030 } 2025 } 2026 2027 // 2028 // получение списка непрочитаных 2031 } 2032 } 2033 2034 // 2035 // получение списка непрочитаных топиков 2029 2036 // 2030 2037 … … 2042 2049 return returnError(AMySQLDatabase::getLastError()); 2043 2050 2051 query_select_unread->setForwardOnly(true); 2052 2044 2053 if (query_select_unread->exec() == false) 2045 2054 return returnError(query_select_unread->getLastError()); … … 2050 2059 2051 2060 for (int i = 0; i < list.count(); i++) 2052 if (id == list[i].ID) 2061 { 2062 AMessageInfoGUI* info = list[i]; 2063 2064 if (id == info->ID) 2053 2065 { 2054 list[i].IsRead = false;2066 info->IsRead = false; 2055 2067 break; 2056 2068 } 2069 } 2057 2070 } 2058 2071 … … 2077 2090 return returnError(AMySQLDatabase::getLastError()); 2078 2091 2092 query_select_unread_child->setForwardOnly(true); 2093 2079 2094 if (query_select_unread_child->exec() == false) 2080 2095 return returnError(query_select_unread_child->getLastError()); … … 2086 2101 2087 2102 for (int i = 0; i < list.count(); i++) 2088 if (id == list[i].ID) 2103 { 2104 AMessageInfoGUI* info = list[i]; 2105 2106 if (id == info->ID) 2089 2107 { 2090 2108 if (id_parent_user > 1) 2091 list[i].HasUnreadChild = 2;2109 info->HasUnreadChildMy = true; 2092 2110 else 2093 list[i].HasUnreadChild = 1;2111 info->HasUnreadChild = true; 2094 2112 2095 2113 break; 2096 2114 } 2115 } 2097 2116 } 2098 2117 … … 2101 2120 //---------------------------------------------------------------------------------------------- 2102 2121 2103 bool AMySQLStorage::getTopicMessageList (int id_topic, A TopicInfoList& list, int id_me, IProgress* progress)2122 bool AMySQLStorage::getTopicMessageList (int id_topic, AMessageInfoGUIList& list, int id_me, IProgress* progress) 2104 2123 { 2124 /* 2105 2125 if (progress != NULL) 2106 2126 progress->onProgress(0); … … 2212 2232 2213 2233 return returnSuccess(); 2234 */ 2235 returnError(QString::fromUtf8("AMySQLStorage::getTopicMessageList")); 2214 2236 } 2215 2237 //---------------------------------------------------------------------------------------------- -
branches/message_tree/storage/mysql_storage.h
r177 r181 57 57 bool getUnreadCount (AUnreadForumCountInfoList& list, IProgress* progress = NULL); 58 58 bool getForumTopicList (int id_forum, int count, QList<int>& list, IProgress* progress = NULL); 59 bool getTopicInfoList (A TopicInfoList& list, int id_me, IProgress* progress = NULL);60 bool getTopicMessageList (int id_topic, A TopicInfoList& list, int id_me, IProgress* progress = NULL);59 bool getTopicInfoList (AMessageInfoGUIPtrList& list, int id_me, IProgress* progress = NULL); 60 bool getTopicMessageList (int id_topic, AMessageInfoGUIList& list, int id_me, IProgress* progress = NULL); 61 61 bool getMessageBody (int id_message, QString& body, IProgress* progress = NULL); 62 62 bool setIDsAsRead (const QList<int>& list, AIDSet type, bool read, QDateTime date, IProgress* progress = NULL); -
branches/message_tree/sysheaders.h
r179 r181 82 82 #define DEBUG_MSG(x) QMessageBox::critical(0, QString::fromUtf8("Ошибка!"), x) 83 83 84 /*! 85 * \brief Макрос для отладки и легкого вывода алерта (числа), в релизе использоваться не должен. 86 * \param x число для вывода. 87 */ 88 #define DEBUG_INT(x) DEBUG_MSG(QString::number(x)) 89 84 90 #ifndef Q_WS_WIN 85 91 -
branches/message_tree/version.h
r179 r181 20 20 * \brief Дата билда (заменяется автоматически при каждом билде в version.h, что и приводит к смене номера ревизии) 21 21 */ 22 #define AVALON_DATE "Пнд Мар 23 11:39:19MSK 2009"22 #define AVALON_DATE "Пнд Мар 23 20:37:20 MSK 2009" 23 23 24 24 #endif
Note: See TracChangeset
for help on using the changeset viewer.
