1 // For license of this file, see <project-root-folder>/LICENSE.md. 2 3 #include "services/abstract/unreadnode.h" 4 5 #include "database/databasequeries.h" 6 #include "miscellaneous/application.h" 7 #include "miscellaneous/iconfactory.h" 8 9 #include <QThread> 10 UnreadNode(RootItem * parent_item)11UnreadNode::UnreadNode(RootItem* parent_item) : RootItem(parent_item) { 12 setKind(RootItem::Kind::Unread); 13 setId(ID_UNREAD); 14 setIcon(qApp->icons()->fromTheme(QSL("mail-mark-unread"))); 15 setTitle(tr("Unread articles")); 16 setDescription(tr("You can find all unread articles here.")); 17 } 18 undeletedMessages() const19QList<Message> UnreadNode::undeletedMessages() const { 20 QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className()); 21 22 return DatabaseQueries::getUndeletedUnreadMessages(database, getParentServiceRoot()->accountId()); 23 } 24 updateCounts(bool including_total_count)25void UnreadNode::updateCounts(bool including_total_count) { 26 Q_UNUSED(including_total_count) 27 28 bool is_main_thread = QThread::currentThread() == qApp->thread(); 29 QSqlDatabase database = is_main_thread ? 30 qApp->database()->driver()->connection(metaObject()->className()) : 31 qApp->database()->driver()->connection(QSL("feed_upd")); 32 int account_id = getParentServiceRoot()->accountId(); 33 34 m_totalCount = m_unreadCount = DatabaseQueries::getUnreadMessageCounts(database, account_id); 35 } 36 cleanMessages(bool clean_read_only)37bool UnreadNode::cleanMessages(bool clean_read_only) { 38 if (clean_read_only) { 39 return true; 40 } 41 42 ServiceRoot* service = getParentServiceRoot(); 43 QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className()); 44 45 if (DatabaseQueries::cleanUnreadMessages(database, service->accountId())) { 46 service->updateCounts(true); 47 service->itemChanged(service->getSubTree()); 48 service->requestReloadMessageList(true); 49 return true; 50 } 51 else { 52 return false; 53 } 54 } 55 markAsReadUnread(RootItem::ReadStatus status)56bool UnreadNode::markAsReadUnread(RootItem::ReadStatus status) { 57 if (status == RootItem::ReadStatus::Unread) { 58 // NOTE: We do not need to mark already unread messages as unread. 59 return true; 60 } 61 62 ServiceRoot* service = getParentServiceRoot(); 63 auto* cache = dynamic_cast<CacheForServiceRoot*>(service); 64 65 if (cache != nullptr) { 66 cache->addMessageStatesToCache(service->customIDSOfMessagesForItem(this), status); 67 } 68 69 QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className()); 70 71 if (DatabaseQueries::markUnreadMessagesRead(database, service->accountId())) { 72 service->updateCounts(false); 73 service->itemChanged(service->getSubTree()); 74 service->requestReloadMessageList(status == RootItem::ReadStatus::Read); 75 return true; 76 } 77 else { 78 return false; 79 } 80 } 81 countOfUnreadMessages() const82int UnreadNode::countOfUnreadMessages() const { 83 return m_unreadCount; 84 } 85 countOfAllMessages() const86int UnreadNode::countOfAllMessages() const { 87 return m_totalCount; 88 } 89