diff --git a/src/core/feedsmodel.cpp b/src/core/feedsmodel.cpp index 28410b974..2976c032a 100755 --- a/src/core/feedsmodel.cpp +++ b/src/core/feedsmodel.cpp @@ -206,6 +206,12 @@ int FeedsModel::rowCount(const QModelIndex &parent) const { } } +void FeedsModel::reloadCountsOfWholeModel() { + m_rootItem->updateCounts(true); + reloadWholeLayout(); + notifyWithCounts(); +} + void FeedsModel::removeItem(const QModelIndex &index) { if (index.isValid()) { QModelIndex parent_index = index.parent(); @@ -395,8 +401,11 @@ void FeedsModel::reloadChangedItem(RootItem *item) { reloadChangedLayout(QModelIndexList() << index_item); } -void FeedsModel::onItemDataChanged(RootItem *item) { - reloadChangedItem(item); +void FeedsModel::onItemDataChanged(QList items) { + foreach (RootItem *item, items) { + reloadChangedItem(item); + } + notifyWithCounts(); } @@ -421,7 +430,7 @@ bool FeedsModel::addServiceAccount(ServiceRoot *root) { // Connect. connect(root, SIGNAL(readFeedsFilterInvalidationRequested()), this, SIGNAL(readFeedsFilterInvalidationRequested())); - connect(root, SIGNAL(dataChanged(RootItem*)), this, SLOT(onItemDataChanged(RootItem*))); + connect(root, SIGNAL(dataChanged(QList)), this, SLOT(onItemDataChanged(QList))); root->start(); return true; diff --git a/src/core/feedsmodel.h b/src/core/feedsmodel.h index 8e6adc4ee..40542a10b 100755 --- a/src/core/feedsmodel.h +++ b/src/core/feedsmodel.h @@ -59,6 +59,8 @@ class FeedsModel : public QAbstractItemModel { return m_rootItem->countOfUnreadMessages(); } + void reloadCountsOfWholeModel(); + // Removes item with given index. // NOTE: Also deletes item from memory. void removeItem(const QModelIndex &index); @@ -156,7 +158,7 @@ class FeedsModel : public QAbstractItemModel { } private slots: - void onItemDataChanged(RootItem *item); + void onItemDataChanged(QList items); // Is executed when next auto-update round could be done. void executeNextAutoUpdate(); diff --git a/src/core/messagesmodel.cpp b/src/core/messagesmodel.cpp index 2a5766b90..28c96b3ca 100755 --- a/src/core/messagesmodel.cpp +++ b/src/core/messagesmodel.cpp @@ -361,12 +361,9 @@ bool MessagesModel::switchBatchMessageImportance(const QModelIndexList &messages } bool MessagesModel::setBatchMessagesDeleted(const QModelIndexList &messages, int deleted) { - QSqlQuery query_read_msg(database()); QStringList message_ids; QList message_ids_num; - query_read_msg.setForwardOnly(true); - // Obtain IDs of all desired messages. foreach (const QModelIndex &message, messages) { int message_id = messageId(message.row()); @@ -375,8 +372,15 @@ bool MessagesModel::setBatchMessagesDeleted(const QModelIndexList &messages, int message_ids.append(QString::number(message_id)); } + if (!m_selectedItem->getParentServiceRoot()->onBeforeMessagesDelete(m_selectedItem, message_ids_num)) { + return false; + } + + QSqlQuery query_read_msg(database()); QString sql_delete_query; + query_read_msg.setForwardOnly(true); + if (m_selectedItem->kind() != RootItemKind::Bin) { sql_delete_query = QString(QSL("UPDATE Messages SET is_deleted = %2 WHERE id IN (%1);")).arg(message_ids.join(QSL(", ")), QString::number(deleted)); @@ -388,13 +392,7 @@ bool MessagesModel::setBatchMessagesDeleted(const QModelIndexList &messages, int if (query_read_msg.exec(sql_delete_query)) { fetchAllData(); - - - //emit messageCountsChanged(); - - // TODO: counts changed - zde pokracovat podle metod setbarchmessageread - //emit messageCountsChanged(m_selectedItem.mode(), true, false); - return true; + return m_selectedItem->getParentServiceRoot()->onAfterMessagesDelete(m_selectedItem, message_ids_num); } else { return false; diff --git a/src/gui/feedmessageviewer.cpp b/src/gui/feedmessageviewer.cpp index 55809c6fe..b661e4c32 100755 --- a/src/gui/feedmessageviewer.cpp +++ b/src/gui/feedmessageviewer.cpp @@ -235,7 +235,6 @@ void FeedMessageViewer::onFeedUpdatesStarted() { void FeedMessageViewer::onFeedUpdatesProgress(Feed *feed, int current, int total) { // Some feed got updated. - m_feedsView->updateCountsOfParticularFeed(feed, true); qApp->mainForm()->statusBar()->showProgressFeeds((current * 100.0) / total, //: Text display in status bar when particular feed is updated. tr("Updated feed '%1'").arg(feed->title())); @@ -328,9 +327,6 @@ void FeedMessageViewer::createConnections() { // If user selects feeds, load their messages. connect(m_feedsView, SIGNAL(itemSelected(RootItem*)), m_messagesView, SLOT(loadFeeds(RootItem*))); - // If user changes status of some messages, recalculate message counts. - connect(m_messagesView->sourceModel(), SIGNAL(messageCountsChanged()), m_feedsView, SLOT(receiveMessageCountsChange())); - // State of many messages is changed, then we need // to reload selections. connect(m_feedsView, SIGNAL(feedsNeedToBeReloaded(bool)), m_messagesView, SLOT(reloadSelections(bool))); @@ -498,7 +494,7 @@ void FeedMessageViewer::showDbCleanupAssistant() { qApp->feedUpdateLock()->unlock(); m_messagesView->reloadSelections(false); - m_feedsView->updateCountsOfAllFeeds(true); + m_feedsView->sourceModel()->reloadCountsOfWholeModel(); } else { qApp->showGuiMessage(tr("Cannot cleanup database"), diff --git a/src/gui/feedsview.cpp b/src/gui/feedsview.cpp index a9da540bc..50ff62c75 100755 --- a/src/gui/feedsview.cpp +++ b/src/gui/feedsview.cpp @@ -169,60 +169,14 @@ void FeedsView::updateAllItemsOnStartup() { void FeedsView::clearSelectedFeeds() { m_sourceModel->markItemCleared(selectedItem(), false); - updateCountsOfSelectedFeeds(true); - emit feedsNeedToBeReloaded(true); } void FeedsView::clearAllFeeds() { m_sourceModel->markItemCleared(m_sourceModel->rootItem(), false); - updateCountsOfAllFeeds(true); - emit feedsNeedToBeReloaded(true); } -void FeedsView::receiveMessageCountsChange() { - - // TODO: toto vymazat, prepocitani cisel unread/all - // a upozorneni na zmenu itemu provede ten item - // zde jen nechat tu invalidaci read filteru - - // If the change came from recycle bin mode, then: - // a) total count of message was changed AND no message was restored - some messages - // were permanently deleted from recycle bin --> we need to update counts of - // just recycle bin, including total counts. - // b) total count of message was changed AND some message was restored - some messages - // were restored --> we need to update counts from all items and bin, including total counts. - // c) total count of message was not changed - state of some messages was switched, no - // deletings or restorings were made --> update counts of just recycle bin, excluding total counts. - // - // If the change came from feed mode, then: - // a) total count of message was changed - some messages were deleted --> we need to update - // counts of recycle bin, including total counts and update counts of selected feeds, including - // total counts. - // b) total count of message was not changed - some messages switched state --> we need to update - // counts of just selected feeds. - /* - if (mode == FeedsSelection::MessagesFromRecycleBin) { - if (total_msg_count_changed) { - if (any_msg_restored) { - updateCountsOfAllFeeds(true); - } - else { - updateCountsOfRecycleBin(true); - } - } - else { - updateCountsOfRecycleBin(false); - } - } - else { - updateCountsOfSelectedFeeds(total_msg_count_changed); - }*/ - - m_proxyModel->invalidateReadFeedsFilter(); -} - void FeedsView::editSelectedItem() { if (!qApp->feedUpdateLock()->tryLock()) { // Lock was not obtained because @@ -320,8 +274,6 @@ void FeedsView::deleteSelectedItem() { void FeedsView::markSelectedItemReadStatus(RootItem::ReadStatus read) { m_sourceModel->markItemRead(selectedItem(), read); - updateCountsOfSelectedFeeds(false); - emit feedsNeedToBeReloaded(read == 1); } @@ -335,8 +287,6 @@ void FeedsView::markSelectedItemsUnread() { void FeedsView::markAllItemsReadStatus(RootItem::ReadStatus read) { m_sourceModel->markItemRead(m_sourceModel->rootItem(), read); - updateCountsOfAllFeeds(false); - emit feedsNeedToBeReloaded(read == 1); } @@ -357,88 +307,6 @@ void FeedsView::openSelectedItemsInNewspaperMode() { } } -void FeedsView::emptyRecycleBin() { - if (MessageBox::show(qApp->mainForm(), QMessageBox::Question, tr("Permanently delete messages"), - tr("You are about to permanenty delete all messages from your recycle bin."), - tr("Do you really want to empty your recycle bin?"), - QString(), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) { - // TODO: pridat metodu cisteni standardniho kose nebo vsech kosu. - //m_sourceModel->recycleBin()->empty(); - updateCountsOfSelectedFeeds(true); - - emit feedsNeedToBeReloaded(true); - } -} - -void FeedsView::restoreRecycleBin() { - // TODO: pridat metodu cisteni standardniho kose nebo vsech kosu. - //m_sourceModel->recycleBin()->restore(); - updateCountsOfAllFeeds(true); - - emit feedsNeedToBeReloaded(true); -} - -void FeedsView::updateCountsOfSelectedFeeds(bool update_total_too) { - foreach (Feed *feed, selectedFeeds()) { - feed->updateCounts(update_total_too); - } - - QModelIndexList selected_indexes = m_proxyModel->mapListToSource(selectionModel()->selectedRows()); - - if (update_total_too) { - // Number of items in recycle bin has changed. - - // TODO: pridat metodu cisteni standardniho kose nebo vsech kosu. - //m_sourceModel->recycleBin()->updateCounts(true); - - // We need to refresh data for recycle bin too. - - // TODO: pridat metodu cisteni standardniho kose nebo vsech kosu. - //selected_indexes.append(m_sourceModel->indexForItem(m_sourceModel->recycleBin())); - } - - // Make sure that selected view reloads changed indexes. - m_sourceModel->reloadChangedLayout(selected_indexes); - m_sourceModel->notifyWithCounts(); -} - -void FeedsView::updateCountsOfRecycleBin(bool update_total_too) { - - // TODO: pridat metodu cisteni standardniho kose nebo vsech kosu. - //m_sourceModel->recycleBin()->updateCounts(update_total_too); - //m_sourceModel->reloadChangedLayout(QModelIndexList() << m_sourceModel->indexForItem(m_sourceModel->recycleBin())); - m_sourceModel->notifyWithCounts(); -} - -void FeedsView::updateCountsOfAllFeeds(bool update_total_too) { - foreach (Feed *feed, allFeeds()) { - feed->updateCounts(update_total_too); - } - - if (update_total_too) { - // Number of items in recycle bin has changed. - - // TODO: pridat metodu cisteni standardniho kose nebo vsech kosu. - //m_sourceModel->recycleBin()->updateCounts(true); - } - - // Make sure that all views reloads its data. - m_sourceModel->reloadWholeLayout(); - m_sourceModel->notifyWithCounts(); -} - -void FeedsView::updateCountsOfParticularFeed(Feed *feed, bool update_total_too) { - QModelIndex index = m_sourceModel->indexForItem(feed); - - if (index.isValid()) { - feed->updateCounts(update_total_too); - m_sourceModel->reloadChangedLayout(QModelIndexList() << index); - } - - m_proxyModel->invalidateReadFeedsFilter(); - m_sourceModel->notifyWithCounts(); -} - void FeedsView::selectNextItem() { QModelIndex index_next = moveCursor(QAbstractItemView::MoveDown, Qt::NoModifier); @@ -457,6 +325,10 @@ void FeedsView::selectPreviousItem() { } } +void FeedsView::switchVisibility() { + setVisible(!isVisible()); +} + QMenu *FeedsView::initializeContextMenuCategories(RootItem *clicked_item) { if (m_contextMenuCategories == NULL) { m_contextMenuCategories = new QMenu(tr("Context menu for categories"), this); diff --git a/src/gui/feedsview.h b/src/gui/feedsview.h index bcda5a42c..316eefd3b 100755 --- a/src/gui/feedsview.h +++ b/src/gui/feedsview.h @@ -79,10 +79,6 @@ class FeedsView : public QTreeView { // Newspaper accessors. void openSelectedItemsInNewspaperMode(); - // Recycle bin operators. - void emptyRecycleBin(); - void restoreRecycleBin(); - // Feed clearers. void clearSelectedFeeds(); void clearAllFeeds(); @@ -92,30 +88,25 @@ class FeedsView : public QTreeView { void editSelectedItem(); void deleteSelectedItem(); - // Is called when counts of messages are changed externally, - // typically from message view. - void receiveMessageCountsChange(); - - // Reloads counts for selected feeds. - void updateCountsOfSelectedFeeds(bool update_total_too); - - // Reloads counts of recycle bin. - void updateCountsOfRecycleBin(bool update_total_too); - - // Reloads counts for all feeds. - void updateCountsOfAllFeeds(bool update_total_too); - - // Reloads counts for particular feed. - void updateCountsOfParticularFeed(Feed *feed, bool update_total_too); - // Selects next/previous item (feed/category) in the list. void selectNextItem(); void selectPreviousItem(); // Switches visibility of the widget. - void switchVisibility() { - setVisible(!isVisible()); - } + void switchVisibility(); + + signals: + // Emitted if user/application requested updating of some feeds. + void feedsUpdateRequested(const QList feeds); + + // Emitted if currently selected feeds needs to be reloaded. + void feedsNeedToBeReloaded(bool mark_current_index_read); + + // Emitted if user selects new feeds. + void itemSelected(RootItem *item); + + // Requests opening of given messages in newspaper mode. + void openMessagesInNewspaperView(const QList &messages); private slots: void markSelectedItemReadStatus(RootItem::ReadStatus read); @@ -143,20 +134,6 @@ class FeedsView : public QTreeView { // Show custom context menu. void contextMenuEvent(QContextMenuEvent *event); - signals: - // Emitted if user/application requested updating of some feeds. - void feedsUpdateRequested(const QList feeds); - - // Emitted if currently selected feeds needs to be reloaded. - void feedsNeedToBeReloaded(bool mark_current_index_read); - - // Emitted if user selects new feeds. - void itemSelected(RootItem *item); - - // Requests opening of given messages in newspaper mode. - void openMessagesInNewspaperView(const QList &messages); - - private: QMenu *m_contextMenuCategories; QMenu *m_contextMenuFeeds; QMenu *m_contextMenuEmptySpace; diff --git a/src/main.cpp b/src/main.cpp index 2ed89e78e..b6e79d56f 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -72,6 +72,9 @@ int main(int argc, char *argv[]) { return EXIT_FAILURE; } + // Register needed metatypes. + qRegisterMetaType >("QList"); + // Add an extra path for non-system icon themes and set current icon theme // and skin. qApp->icons()->setupSearchPaths(); diff --git a/src/services/abstract/serviceroot.cpp b/src/services/abstract/serviceroot.cpp index 31b710841..7d6539ce6 100755 --- a/src/services/abstract/serviceroot.cpp +++ b/src/services/abstract/serviceroot.cpp @@ -31,6 +31,6 @@ FeedsModel *ServiceRoot::feedsModel() const { return m_feedsModel; } -void ServiceRoot::itemChanged(RootItem *item) { - emit dataChanged(item); +void ServiceRoot::itemChanged(QList items) { + emit dataChanged(items); } diff --git a/src/services/abstract/serviceroot.h b/src/services/abstract/serviceroot.h index 67144f59b..99fe34acd 100755 --- a/src/services/abstract/serviceroot.h +++ b/src/services/abstract/serviceroot.h @@ -67,7 +67,7 @@ class ServiceRoot : public RootItem { // "loading" dialog přes view a toto zavolat, nasledně signalovat virtual bool loadMessagesForItem(RootItem *item, QSqlTableModel *model) = 0; - // Called BEFORE this read status update is stored in DB, + // Called BEFORE this read status update (triggered by user in message list) is stored in DB, // when false is returned, change is aborted. // This is the place to make some other changes like updating // some ONLINE service or something. @@ -75,7 +75,7 @@ class ServiceRoot : public RootItem { // "read" is status which is ABOUT TO BE SET. virtual bool onBeforeSetMessagesRead(RootItem *selected_item, QList message_db_ids, ReadStatus read) = 0; - // Called AFTER this read status update is stored in DB, + // Called AFTER this read status update (triggered by user in message list) is stored in DB, // when false is returned, change is aborted. // Here service root should inform (via signals) // which items are actually changed. @@ -99,17 +99,25 @@ class ServiceRoot : public RootItem { // "changes" - list of pairs - virtual bool onAfterSwitchMessageImportance(RootItem *selected_item, QList > changes) = 0; + // Called BEFORE the list of messages is about to be deleted + // by the user from message list. + virtual bool onBeforeMessagesDelete(RootItem *selected_item, QList message_db_ids) = 0; + + // Called AFTER the list of messages is about to be deleted + // by the user from message list. + virtual bool onAfterMessagesDelete(RootItem *selected_item, QList message_db_ids) = 0; + // Access to feed model. FeedsModel *feedsModel() const; // Obvious method to wrap dataChanged(...) signal // which can be used by items themselves or any // other component. - void itemChanged(RootItem *item); + void itemChanged(QList items); signals: // Emitted if data in any item belonging to this root are changed. - void dataChanged(RootItem *item); + void dataChanged(QList items); void readFeedsFilterInvalidationRequested(); private: diff --git a/src/services/standard/standardfeed.cpp b/src/services/standard/standardfeed.cpp index 844bb8d67..801d9e09f 100755 --- a/src/services/standard/standardfeed.cpp +++ b/src/services/standard/standardfeed.cpp @@ -215,7 +215,7 @@ void StandardFeed::fetchMetadataForItself() { // Notify the model about fact, that it needs to reload new information about // this item, particularly the icon. - serviceRoot()->itemChanged(this); + serviceRoot()->itemChanged(QList() << this); } else { qApp->showGuiMessage(tr("Metadata not fetched"), @@ -731,6 +731,10 @@ int StandardFeed::updateMessages(const QList &messages) { qDebug("Transaction commit for message downloader failed."); } + else { + updateCounts(true); + serviceRoot()->itemChanged(QList() << this); + } return updated_messages; } diff --git a/src/services/standard/standardserviceroot.cpp b/src/services/standard/standardserviceroot.cpp index 1219de7ca..4269baa6c 100755 --- a/src/services/standard/standardserviceroot.cpp +++ b/src/services/standard/standardserviceroot.cpp @@ -157,6 +157,15 @@ bool StandardServiceRoot::markFeedsReadUnread(QList items, ReadStatus rea // Commit changes. if (db_handle.commit()) { + // Messages are cleared, now inform model about need to reload data. + QList itemss; + + foreach (Feed *feed, items) { + feed->updateCounts(true); + itemss.append(feed); + } + + emit dataChanged(itemss); return true; } else { @@ -191,6 +200,9 @@ bool StandardServiceRoot::markRecycleBinReadUnread(RootItem::ReadStatus read) { // Commit changes. if (db_handle.commit()) { + m_recycleBin->updateCounts(true); + + emit dataChanged(QList() << m_recycleBin); return true; } else { @@ -200,12 +212,6 @@ bool StandardServiceRoot::markRecycleBinReadUnread(RootItem::ReadStatus read) { bool StandardServiceRoot::cleanFeeds(QList items, bool clean_read_only) { QSqlDatabase db_handle = qApp->database()->connection(QSL("StandardServiceRoot"), DatabaseFactory::FromSettings); - - if (!db_handle.transaction()) { - qWarning("Starting transaction for feeds clearing."); - return false; - } - QSqlQuery query_delete_msg(db_handle); query_delete_msg.setForwardOnly(true); @@ -213,8 +219,6 @@ bool StandardServiceRoot::cleanFeeds(QList items, bool clean_read_only) { if (!query_delete_msg.prepare(QString("UPDATE Messages SET is_deleted = :deleted " "WHERE feed IN (%1) AND is_deleted = 0 AND is_read = 1;").arg(textualFeedIds(items).join(QSL(", "))))) { qWarning("Query preparation failed for feeds clearing."); - - db_handle.rollback(); return false; } } @@ -222,8 +226,6 @@ bool StandardServiceRoot::cleanFeeds(QList items, bool clean_read_only) { if (!query_delete_msg.prepare(QString("UPDATE Messages SET is_deleted = :deleted " "WHERE feed IN (%1) AND is_deleted = 0;").arg(textualFeedIds(items).join(QSL(", "))))) { qWarning("Query preparation failed for feeds clearing."); - - db_handle.rollback(); return false; } } @@ -232,15 +234,22 @@ bool StandardServiceRoot::cleanFeeds(QList items, bool clean_read_only) { if (!query_delete_msg.exec()) { qDebug("Query execution for feeds clearing failed."); - db_handle.rollback(); - } - - // Commit changes. - if (db_handle.commit()) { - return true; + return false; } else { - return db_handle.rollback(); + // Messages are cleared, now inform model about need to reload data. + QList itemss; + + foreach (Feed *feed, items) { + feed->updateCounts(true); + itemss.append(feed); + } + + m_recycleBin->updateCounts(true); + itemss.append(m_recycleBin); + + emit dataChanged(itemss); + return true; } } @@ -533,7 +542,7 @@ bool StandardServiceRoot::loadMessagesForItem(RootItem *item, QSqlTableModel *mo QString filter_clause = stringy_ids.join(QSL(", ")); - model->setFilter(QString(QSL("feed IN (%1) AND is_deleted = 0")).arg(filter_clause)); + model->setFilter(QString(QSL("feed IN (%1) AND is_deleted = 0 AND is_pdeleted = 0")).arg(filter_clause)); qDebug("Loading messages from feeds: %s.", qPrintable(filter_clause)); } @@ -554,7 +563,7 @@ bool StandardServiceRoot::onAfterSetMessagesRead(RootItem *selected_item, QList< selected_item->updateCounts(false); - emit dataChanged(selected_item); + emit dataChanged(QList() << selected_item); emit readFeedsFilterInvalidationRequested(); return true; } @@ -575,8 +584,34 @@ bool StandardServiceRoot::onAfterSwitchMessageImportance(RootItem *selected_item return true; } +bool StandardServiceRoot::onBeforeMessagesDelete(RootItem *selected_item, QList message_db_ids) { + Q_UNUSED(selected_item) + Q_UNUSED(message_db_ids) + + return true; +} + +bool StandardServiceRoot::onAfterMessagesDelete(RootItem *selected_item, QList message_db_ids) { + Q_UNUSED(message_db_ids) + + // User deleted some messages he selected in message list. + selected_item->updateCounts(true); + + if (selected_item->kind() == RootItemKind::Bin) { + emit dataChanged(QList() << m_recycleBin); + } + else { + m_recycleBin->updateCounts(true); + emit dataChanged(QList() << selected_item << m_recycleBin); + } + + + emit readFeedsFilterInvalidationRequested(); + return true; +} + void StandardServiceRoot::assembleCategories(CategoryAssignment categories) { - QHash assignments; + QHash assignments; assignments.insert(NO_PARENT_CATEGORY, this); // Add top-level categories. diff --git a/src/services/standard/standardserviceroot.h b/src/services/standard/standardserviceroot.h index 93d25c864..c25abad7a 100755 --- a/src/services/standard/standardserviceroot.h +++ b/src/services/standard/standardserviceroot.h @@ -66,6 +66,9 @@ class StandardServiceRoot : public ServiceRoot { bool onBeforeSwitchMessageImportance(RootItem *selected_item, QList > changes); bool onAfterSwitchMessageImportance(RootItem *selected_item, QList > changes); + bool onBeforeMessagesDelete(RootItem *selected_item, QList message_db_ids); + bool onAfterMessagesDelete(RootItem *selected_item, QList message_db_ids); + // Returns all standard categories which are lying under given root node. // This does NOT include the root node even if the node is category. QHash categoriesForItem(RootItem *root); diff --git a/src/services/tt-rss/ttrssserviceroot.h b/src/services/tt-rss/ttrssserviceroot.h index 130d519d2..7fc16f69a 100755 --- a/src/services/tt-rss/ttrssserviceroot.h +++ b/src/services/tt-rss/ttrssserviceroot.h @@ -52,6 +52,14 @@ class TtRssServiceRoot : public ServiceRoot { bool onAfterSwitchMessageImportance(RootItem *selected_item, QList > changes) { return false; } + + bool onBeforeMessagesDelete(RootItem *selected_item, QList message_db_ids) { + return false; + } + + bool onAfterMessagesDelete(RootItem *selected_item, QList message_db_ids) { + return false; + } }; #endif // TTRSSSERVICEROOT_H