Changeset 30


Ignore:
Timestamp:
05/26/08 04:57:31 (4 years ago)
Author:
antonbatenev.ya.ru
Message:
  • добавление метода пометки сообщений как непрочитаных в хранилище;
  • начало работы над контекстным меню деревьев;
Location:
trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/avalon.sql

    r28 r30  
    8686  `has_child` tinyint(1) NOT NULL COMMENT 'флаг наличия дочерних сообщений', 
    8787  PRIMARY KEY  (`id`), 
    88   KEY `ix_parent` (`id_parent`) 
     88  KEY `ix_parent` (`id_parent`), 
     89  KEY `ix_topic` (`id_topic`) 
    8990) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='сообщения'; 
    9091SET character_set_client = @saved_cs_client; 
     
    204205/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; 
    205206 
    206 -- Dump completed on 2008-05-25  0:38:57 
     207-- Dump completed on 2008-05-25 23:11:51 
  • trunk/forum_tree.cpp

    r28 r30  
    2929        setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
    3030 
     31        setContextMenuPolicy(Qt::CustomContextMenu); 
     32 
    3133        setColumnCount(2); 
    3234 
     
    3840 
    3941        connect(this, SIGNAL(itemSelectionChanged()), this, SLOT(selection_changed())); 
     42        connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(context_menu_request(const QPoint&))); 
    4043 
    4144        Reload(); 
     
    226229//---------------------------------------------------------------------------------------------- 
    227230 
     231QTreeWidgetItem* AForumTree::GetSelectedForumItem () 
     232{ 
     233        QList<QTreeWidgetItem*> list_selected = selectedItems(); 
     234 
     235        if (list_selected.count() == 0) 
     236                return NULL; 
     237 
     238        QTreeWidgetItem* item_selected = list_selected[0]; 
     239 
     240        bool is_group = item_selected->childCount(); 
     241 
     242        if (is_group == true) 
     243                return NULL; 
     244 
     245        return item_selected; 
     246} 
     247//---------------------------------------------------------------------------------------------- 
     248 
    228249void AForumTree::selection_changed () 
    229250{ 
    230         QList<QTreeWidgetItem*> list_selected = selectedItems(); 
    231  
    232         if (list_selected.count() == 0) 
    233         { 
     251        ForumTreeWidgetItem* forum_item = static_cast<ForumTreeWidgetItem*>(GetSelectedForumItem()); 
     252 
     253        if (forum_item != NULL) 
     254                m_message_tree->ChangeForum(forum_item->PTag()); 
     255        else 
    234256                m_message_tree->ChangeForum(NULL); 
    235                 return; 
    236         } 
    237  
    238         QTreeWidgetItem* item_selected = list_selected[0]; 
    239  
    240         bool is_group = item_selected->childCount(); 
    241  
    242         if (is_group == true) 
    243         { 
    244                 m_message_tree->ChangeForum(NULL); 
    245                 return; 
    246         } 
    247  
    248         ForumTreeWidgetItem* forum_item = static_cast<ForumTreeWidgetItem*>(item_selected); 
    249  
    250         m_message_tree->ChangeForum(forum_item->PTag()); 
    251 } 
    252 //---------------------------------------------------------------------------------------------- 
     257} 
     258//---------------------------------------------------------------------------------------------- 
     259 
     260void AForumTree::ChangeUnreadCount (int count) 
     261{ 
     262        ForumTreeWidgetItem* forum_item = static_cast<ForumTreeWidgetItem*>(GetSelectedForumItem()); 
     263 
     264        if (forum_item == NULL) 
     265                return; 
     266 
     267        QString text = forum_item->text(1); 
     268 
     269        int old_count = 0; 
     270 
     271        if (text != "-") 
     272                old_count = text.toInt(); 
     273 
     274        old_count += count; 
     275 
     276        if (old_count != 0) 
     277        { 
     278                forum_item->setText(1, QString::number(old_count)); 
     279 
     280                QFont font = forum_item->font(1); 
     281                font.setBold(true); 
     282                forum_item->setFont(1, font); 
     283        } 
     284        else 
     285        { 
     286                forum_item->setText(1, "-"); 
     287 
     288                QFont font = forum_item->font(1); 
     289                font.setBold(false); 
     290                forum_item->setFont(1, font); 
     291        } 
     292} 
     293//---------------------------------------------------------------------------------------------- 
     294 
     295void AForumTree::context_menu_request (const QPoint& pos) 
     296{ 
     297QMessageBox::critical(m_parent, QString::fromUtf8("Ошибка!"), QString::fromUtf8("Не выбрано хранилище данных")); 
     298        (new QMenu("abcd"))->exec(pos); 
     299} 
     300//---------------------------------------------------------------------------------------------- 
  • trunk/forum_tree.h

    r28 r30  
    3838                IMessageView* m_message_view; 
    3939 
     40                // возвращает текущий выделенный элемент форума или NULL, если группа 
     41                QTreeWidgetItem* GetSelectedForumItem (); 
     42 
    4043        // IForumTree 
    4144        public: 
     
    4750                void ReloadUnread (); 
    4851 
     52                // изменение количества непрочитанных сообщений 
     53                void ChangeUnreadCount (int count); 
     54 
    4955        private slots: 
    5056 
    5157                void selection_changed (); 
     58 
     59                void context_menu_request (const QPoint& pos); 
    5260}; 
    5361//---------------------------------------------------------------------------------------------- 
  • trunk/iforum_tree.h

    r26 r30  
    2020                // перезагрузка количества непрочитаных 
    2121                virtual void ReloadUnread () = 0; 
     22 
     23                // изменение количества непрочитанных сообщений 
     24                virtual void ChangeUnreadCount (int count) = 0; 
    2225}; 
    2326//---------------------------------------------------------------------------------------------- 
  • trunk/message_tree.cpp

    r29 r30  
    307307//---------------------------------------------------------------------------------------------- 
    308308 
     309QTreeWidgetItem* AMessageTree::GetSelectedItem () 
     310{ 
     311        QList<QTreeWidgetItem*> list_selected = selectedItems(); 
     312 
     313        if (list_selected.size() == 0) 
     314                return NULL; 
     315 
     316        return list_selected.at(0); 
     317} 
     318//---------------------------------------------------------------------------------------------- 
     319 
    309320void AMessageTree::timer_on_timer () 
    310321{ 
    311         m_timer.stop(); 
     322        MessageTreeWidgetItem* item = static_cast<MessageTreeWidgetItem*>(GetSelectedItem()); 
     323 
     324        if (item != NULL) 
     325                MakeItemAsRead(item); 
    312326} 
    313327//---------------------------------------------------------------------------------------------- 
     
    315329void AMessageTree::selection_changed () 
    316330{ 
    317         QList<QTreeWidgetItem*> list_selected = selectedItems(); 
    318  
    319         if (list_selected.size() == 0) 
    320                 return; 
    321  
    322         MessageTreeWidgetItem* item = static_cast<MessageTreeWidgetItem*>(list_selected.at(0)); 
     331        MessageTreeWidgetItem* item = static_cast<MessageTreeWidgetItem*>(GetSelectedItem()); 
     332 
     333        if (item == NULL) 
     334                return; 
    323335 
    324336        if (item->PTag()->IsMessageLoaded == false) 
     
    358370} 
    359371//---------------------------------------------------------------------------------------------- 
     372 
     373void AMessageTree::MakeItemAsRead (QTreeWidgetItem* widget_item) 
     374{ 
     375        MessageTreeWidgetItem* item = static_cast<MessageTreeWidgetItem*>(widget_item); 
     376 
     377        AMessageInfoEx* info = item->PTag(); 
     378 
     379        // пометить как прочитаное в хранилище 
     380        std::auto_ptr<IStorage> storage(AStorageFactory::GetStorage()); 
     381 
     382        if (storage.get() == NULL) 
     383        { 
     384                QMessageBox::critical(m_parent, QString::fromUtf8("Ошибка!"), QString::fromUtf8("Не выбрано хранилище данных")); 
     385                return; 
     386        } 
     387 
     388        if (storage->SetMessageAsRead(info->ID, true, NULL) == false) 
     389        { 
     390                storage->ShowError(m_parent); 
     391                return; 
     392        } 
     393 
     394        // пометка как прочитанного в дереве сообщений 
     395        if (info->IsRead == true) 
     396                return; 
     397 
     398        info->IsRead = true; 
     399 
     400        if (info->UnreadChildCount != 0) 
     401                item->setIcon(0, m_child_unread); 
     402        else 
     403                item->setIcon(0, m_message_read); 
     404 
     405        MessageTreeWidgetItem* parent_item = static_cast<MessageTreeWidgetItem*>(item->parent()); 
     406 
     407        while (parent_item != NULL) 
     408        { 
     409                AMessageInfoEx* parent_info = parent_item->PTag(); 
     410 
     411                parent_info->UnreadChildCount--; 
     412 
     413                if (parent_info->IsRead == true && parent_info->UnreadChildCount == 0) 
     414                        parent_item->setIcon(0, m_message_read); 
     415 
     416                parent_item = static_cast<MessageTreeWidgetItem*>(parent_item->parent()); 
     417        } 
     418 
     419        // уменьшение количества непрочитанных в дереве форума 
     420        m_forum_tree->ChangeUnreadCount(-1); 
     421} 
     422//---------------------------------------------------------------------------------------------- 
  • trunk/message_tree.h

    r29 r30  
    4343                QTimer m_timer; 
    4444 
     45                // возвращает текущий выделенный элемент 
     46                QTreeWidgetItem* GetSelectedItem (); 
     47 
     48                // разворачивает ветку до непрочитанных сообщений 
    4549                void ExpandUnreadChild (QTreeWidgetItem* item); 
     50 
     51                // построение ветки 
    4652                void BuildTree (QTreeWidgetItem* parent, AMessageInfoExList* list); 
     53 
     54                // пометка сообщения как прочитанного 
     55                void MakeItemAsRead (QTreeWidgetItem* item); 
    4756 
    4857        // IMessageTree 
  • trunk/storage/istorage.h

    r29 r30  
    5757                // возвращает тело сообщения 
    5858                virtual bool GetMessageInfo (int id_message, QString& body, IProgress* progress = NULL) = 0; 
     59 
     60                // пометить сообщение как прочитанное/непрочитанное 
     61                virtual bool SetMessageAsRead (int id_message, bool read, IProgress* progress = NULL) = 0; 
    5962}; 
    6063//---------------------------------------------------------------------------------------------- 
  • trunk/storage/mysql_storage.cpp

    r29 r30  
    17121712} 
    17131713//---------------------------------------------------------------------------------------------- 
     1714 
     1715bool AMySQLStorage::SetMessageAsRead (int id_message, bool read, IProgress* progress) 
     1716{ 
     1717        if (progress != NULL) 
     1718                progress->OnProgress(0); 
     1719 
     1720        QString sql; 
     1721 
     1722        // 
     1723        // получение тела сообщения 
     1724        // 
     1725 
     1726        if (read == true) 
     1727        { 
     1728                sql += "DELETE FROM\n"; 
     1729                sql += "        `unread`\n"; 
     1730                sql += "WHERE\n"; 
     1731                sql += "        `id_message` = " + QString::number(id_message); 
     1732        } 
     1733        else 
     1734        { 
     1735                sql += "REPLACE INTO `unread`\n"; 
     1736                sql += "(\n"; 
     1737                sql += "        `id_message`,\n"; 
     1738                sql += "        `id_forum`,\n"; 
     1739                sql += "        `id_topic`,\n"; 
     1740                sql += "        `message_date`\n"; 
     1741                sql += ")\n"; 
     1742                sql += "SELECT\n"; 
     1743                sql += "        `id`,\n"; 
     1744                sql += "        `id_forum`,\n"; 
     1745                sql += "        `id_topic`,\n"; 
     1746                sql += "        `message_date`\n"; 
     1747                sql += "FROM\n"; 
     1748                sql += "        `message`\n"; 
     1749                sql += "WHERE\n"; 
     1750                sql += "        `id_message` = " + QString::number(id_message); 
     1751        } 
     1752 
     1753        std::auto_ptr<AQuery> query(CreateQuery(sql, false)); 
     1754 
     1755        if (query.get() == NULL) 
     1756                return ReturnError(AMySQLDatabase::LastError()); 
     1757 
     1758        if (query->exec() == false) 
     1759                return ReturnError(query->LastError()); 
     1760 
     1761        return ReturnSuccess(); 
     1762} 
     1763//---------------------------------------------------------------------------------------------- 
  • trunk/storage/mysql_storage.h

    r29 r30  
    6868                // возвращает тело сообщения 
    6969                bool GetMessageInfo (int id_message, QString& body, IProgress* progress = NULL); 
     70 
     71                // пометить сообщение как прочитанное/непрочитанное 
     72                bool SetMessageAsRead (int id_message, bool read, IProgress* progress = NULL); 
    7073}; 
    7174//---------------------------------------------------------------------------------------------- 
Note: See TracChangeset for help on using the changeset viewer.