diff --git a/src/core/feeddownloader.cpp b/src/core/feeddownloader.cpp index c66e08b4b..ac90fcb6e 100644 --- a/src/core/feeddownloader.cpp +++ b/src/core/feeddownloader.cpp @@ -21,7 +21,8 @@ void FeedDownloader::updateFeeds(const QList &feeds) { for (int i = 0, total = feeds.size(); i < total; i++) { feeds.at(i)->update(); - qDebug("Made progress in feed updates: %d/%d.", i + 1, total); + qDebug("Made progress in feed updates: %d/%d (id of feed is %d).", + i + 1, total, feeds.at(i)->id()); emit progress(feeds.at(i), i + 1, total); } diff --git a/src/core/feedsmodel.cpp b/src/core/feedsmodel.cpp index 60e5b1d58..8a0ad2c83 100644 --- a/src/core/feedsmodel.cpp +++ b/src/core/feedsmodel.cpp @@ -282,13 +282,32 @@ QList FeedsModel::feedsForIndex(const QModelIndex &index) { return getFeeds(item); } +bool FeedsModel::isUnequal(FeedsModelFeed *lhs, FeedsModelFeed *rhs) { + return !isEqual(lhs, rhs); +} + +bool FeedsModel::isEqual(FeedsModelFeed *lhs, FeedsModelFeed *rhs) { + return lhs->id() == rhs->id(); +} + QList FeedsModel::feedsForIndexes(const QModelIndexList &indexes) { QList feeds; + // Get selected feeds for each index. foreach (const QModelIndex &index, indexes) { feeds.append(feedsForIndex(index)); } + // Now we obtained all feeds from corresponding indexes. + if (indexes.size() != feeds.size()) { + // Selection contains duplicate feeds (for + // example situation where feed and its parent category are both + // selected). So, remove duplicates from the list. + qSort(feeds.begin(), feeds.end(), isUnequal); + feeds.erase(std::unique(feeds.begin(), feeds.end(), isEqual), + feeds.end()); + } + return feeds; } diff --git a/src/core/feedsmodel.h b/src/core/feedsmodel.h index a5e8653ce..3a75dc650 100644 --- a/src/core/feedsmodel.h +++ b/src/core/feedsmodel.h @@ -54,6 +54,9 @@ class FeedsModel : public QAbstractItemModel { // Returns feeds contained within single index. QList feedsForIndex(const QModelIndex &index); + static bool isUnequal(FeedsModelFeed *lhs, FeedsModelFeed *rhs); + static bool isEqual(FeedsModelFeed *lhs, FeedsModelFeed *rhs); + public slots: // Signals that properties (probably counts) // of ALL items have changed. diff --git a/src/core/feedsmodelstandardfeed.cpp b/src/core/feedsmodelstandardfeed.cpp index ee6f6394c..c9ae5c45e 100755 --- a/src/core/feedsmodelstandardfeed.cpp +++ b/src/core/feedsmodelstandardfeed.cpp @@ -151,6 +151,8 @@ void FeedsModelStandardFeed::update() { "download_timeout", 5000).toInt(); + // TODO: Provide download time-measures debugging + // outputs here. QNetworkReply::NetworkError download_result = NetworkFactory::downloadFile(url(), download_timeout, feed_contents); diff --git a/src/core/feedsmodelstandardfeed.h b/src/core/feedsmodelstandardfeed.h index a22e4b3ae..1ea7ff241 100644 --- a/src/core/feedsmodelstandardfeed.h +++ b/src/core/feedsmodelstandardfeed.h @@ -18,6 +18,7 @@ class FeedsModelStandardFeed : public FeedsModelFeed { explicit FeedsModelStandardFeed(FeedsModelRootItem *parent_item = NULL); virtual ~FeedsModelStandardFeed(); + // Obtains data related to this feed. QVariant data(int column, int role) const; // Perform fetching of new messages. diff --git a/src/core/messagesmodel.cpp b/src/core/messagesmodel.cpp index 3bf8c5d06..d5b11049b 100644 --- a/src/core/messagesmodel.cpp +++ b/src/core/messagesmodel.cpp @@ -60,13 +60,17 @@ QList MessagesModel::currentFeeds() const { } -void MessagesModel::loadMessages(const QList feed_ids) { +void MessagesModel::loadMessages(const QList feed_ids) { // Conversion of parameter. m_currentFeeds = feed_ids; - setFilter(QString("feed IN (%1) AND deleted = 0").arg(textualFeeds().join(", "))); + QString assembled_ids = textualFeeds().join(", "); + + setFilter(QString("feed IN (%1) AND deleted = 0").arg(assembled_ids)); select(); fetchAll(); + + qDebug("Loading messages from feeds: %s.", qPrintable(assembled_ids)); } QStringList MessagesModel::textualFeeds() const { diff --git a/src/core/parsingfactory.cpp b/src/core/parsingfactory.cpp index ea0aa34a9..b376049c1 100644 --- a/src/core/parsingfactory.cpp +++ b/src/core/parsingfactory.cpp @@ -18,7 +18,10 @@ QList ParsingFactory::parseAsRSS20(const QString &data) { QList messages; QDomDocument xml_file; QDateTime current_time = QDateTime::currentDateTime(); + xml_file.setContent(data, true); + + // Pull out all messages. QDomNodeList messages_in_xml = xml_file.elementsByTagName("item"); for (int i = 0; i < messages_in_xml.size(); i++) { diff --git a/src/gui/feedmessageviewer.cpp b/src/gui/feedmessageviewer.cpp index 7602a4612..c0eccf44e 100644 --- a/src/gui/feedmessageviewer.cpp +++ b/src/gui/feedmessageviewer.cpp @@ -105,14 +105,22 @@ void FeedMessageViewer::updateSelectedFeeds() { } } +void FeedMessageViewer::updateAllFeeds() { + if (SystemFactory::getInstance()->applicationCloseLock()->tryLockForRead()) { + emit feedsUpdateRequested(m_feedsView->allFeeds()); + } + else { + qDebug("Lock for feed updates was NOT obtained."); + } +} + void FeedMessageViewer::onFeedUpdatesProgress(FeedsModelFeed *feed, int current, int total) { // Some feed got updated. - // Now we should change some widgets (reload counts + // TODO: Now we should change some widgets (reload counts // of messages for the feed, update status bar and so on). - // TODO: Don't update counts of all feeds here, // it is enough to update counts of update feed. m_feedsView->updateCountsOfAllFeeds(true); @@ -165,14 +173,16 @@ void FeedMessageViewer::createConnections() { SIGNAL(triggered()), m_messagesView, SLOT(openSelectedSourceMessagesInternally())); connect(FormMain::getInstance()->m_ui->m_actionOpenSelectedMessagesInternally, SIGNAL(triggered()), m_messagesView, SLOT(openSelectedMessagesInternally())); - connect(FormMain::getInstance()->m_ui->m_actionMarkAllMessagesAsRead, + connect(FormMain::getInstance()->m_ui->m_actionMarkFeedsAsRead, SIGNAL(triggered()), m_messagesView, SLOT(setAllMessagesRead())); - connect(FormMain::getInstance()->m_ui->m_actionMarkAllMessagesAsUnread, + connect(FormMain::getInstance()->m_ui->m_actionMarkFeedsAsUnread, SIGNAL(triggered()), m_messagesView, SLOT(setAllMessagesUnread())); connect(FormMain::getInstance()->m_ui->m_actionDeleteAllMessages, SIGNAL(triggered()), m_messagesView, SLOT(setAllMessagesDeleted())); connect(FormMain::getInstance()->m_ui->m_actionUpdateSelectedFeeds, SIGNAL(triggered()), this, SLOT(updateSelectedFeeds())); + connect(FormMain::getInstance()->m_ui->m_actionUpdateAllFeeds, + SIGNAL(triggered()), this, SLOT(updateAllFeeds())); } void FeedMessageViewer::initialize() { @@ -188,9 +198,9 @@ void FeedMessageViewer::initialize() { m_toolBar->addAction(FormMain::getInstance()->m_ui->m_actionAddNewFeed); m_toolBar->addAction(FormMain::getInstance()->m_ui->m_actionEditSelectedFeed); m_toolBar->addAction(FormMain::getInstance()->m_ui->m_actionDeleteSelectedFeeds); + m_toolBar->addAction(FormMain::getInstance()->m_ui->m_actionMarkFeedsAsRead); + m_toolBar->addAction(FormMain::getInstance()->m_ui->m_actionMarkFeedsAsUnread); m_toolBar->addSeparator(); - m_toolBar->addAction(FormMain::getInstance()->m_ui->m_actionMarkAllMessagesAsRead); - m_toolBar->addAction(FormMain::getInstance()->m_ui->m_actionMarkAllMessagesAsUnread); m_toolBar->addAction(FormMain::getInstance()->m_ui->m_actionDeleteAllMessages); // Finish web/message browser setup. diff --git a/src/gui/feedmessageviewer.h b/src/gui/feedmessageviewer.h index fc4b11bd2..8c9e07708 100644 --- a/src/gui/feedmessageviewer.h +++ b/src/gui/feedmessageviewer.h @@ -34,6 +34,7 @@ class FeedMessageViewer : public TabContent { public slots: void updateSelectedFeeds(); + void updateAllFeeds(); protected slots: void onFeedUpdatesProgress(FeedsModelFeed *feed, int current, int total); diff --git a/src/gui/formmain.cpp b/src/gui/formmain.cpp index 2a9c28864..16ef5d8ec 100755 --- a/src/gui/formmain.cpp +++ b/src/gui/formmain.cpp @@ -81,8 +81,8 @@ QList FormMain::getActions() { actions << m_ui->m_actionOpenSelectedSourceArticlesExternally << m_ui->m_actionOpenSelectedSourceArticlesInternally << m_ui->m_actionOpenSelectedMessagesInternally << - m_ui->m_actionMarkAllMessagesAsRead << - m_ui->m_actionMarkAllMessagesAsUnread << + m_ui->m_actionMarkFeedsAsRead << + m_ui->m_actionMarkFeedsAsUnread << m_ui->m_actionDeleteAllMessages << m_ui->m_actionMarkSelectedMessagesAsRead << m_ui->m_actionMarkSelectedMessagesAsUnread << @@ -225,8 +225,8 @@ void FormMain::setupIcons() { m_ui->m_actionAddNewCategory->setIcon(IconThemeFactory::getInstance()->fromTheme("document-new")); m_ui->m_actionAddNewFeed->setIcon(IconThemeFactory::getInstance()->fromTheme("document-new")); m_ui->m_actionEditSelectedFeed->setIcon(IconThemeFactory::getInstance()->fromTheme("gnome-other")); - m_ui->m_actionMarkAllMessagesAsRead->setIcon(IconThemeFactory::getInstance()->fromTheme("mail-mark-not-junk")); - m_ui->m_actionMarkAllMessagesAsUnread->setIcon(IconThemeFactory::getInstance()->fromTheme("mail-mark-important")); + m_ui->m_actionMarkFeedsAsRead->setIcon(IconThemeFactory::getInstance()->fromTheme("mail-mark-not-junk")); + m_ui->m_actionMarkFeedsAsUnread->setIcon(IconThemeFactory::getInstance()->fromTheme("mail-mark-important")); m_ui->m_actionMarkFeedsAsRead->setIcon(IconThemeFactory::getInstance()->fromTheme("mail-mark-not-junk")); m_ui->m_actionMarkSelectedMessagesAsRead->setIcon(IconThemeFactory::getInstance()->fromTheme("mail-mark-not-junk")); m_ui->m_actionMarkSelectedMessagesAsUnread->setIcon(IconThemeFactory::getInstance()->fromTheme("mail-mark-important")); diff --git a/src/gui/formmain.ui b/src/gui/formmain.ui index d67cce2b0..bac55005e 100644 --- a/src/gui/formmain.ui +++ b/src/gui/formmain.ui @@ -15,16 +15,7 @@ - - 0 - - - 0 - - - 0 - - + 0 @@ -48,7 +39,7 @@ 0 0 979 - 19 + 20 @@ -106,6 +97,7 @@ + @@ -113,8 +105,6 @@ - - @@ -324,29 +314,18 @@ - Mark selected feed(s)/category(ies) as read + Mark &selected feed(s) read - Mark selected feed(s)/category(ies) as read. - - - + Marks all messages (without message filters) from selected feeds as read. - + - Mark &all messages read + Mark selected feeds unread - Mark all messages from selected feeds read. This does NOT take message filters into account. - - - - - Mark a&ll messages unread - - - Mark all messages from selected feeds unread. This does NOT take message filters into account. + Marks all messages (without message filters) from selected feeds as unread. diff --git a/src/gui/messagesview.cpp b/src/gui/messagesview.cpp index 28ddec981..dc8d9f003 100644 --- a/src/gui/messagesview.cpp +++ b/src/gui/messagesview.cpp @@ -20,7 +20,6 @@ MessagesView::MessagesView(QWidget *parent) // Forward count changes to the view. createConnections(); - setModel(m_proxyModel); setupAppearance(); } @@ -113,7 +112,7 @@ void MessagesView::setupAppearance() { // Make sure that initial sorting is that unread messages are visible // first. // NOTE: This can be rewritten so that it's changeable. - sortByColumn(MSG_DB_DCREATED_INDEX, Qt::AscendingOrder); + sortByColumn(MSG_DB_DCREATED_INDEX, Qt::DescendingOrder); } void MessagesView::keyPressEvent(QKeyEvent *event) {