diff --git a/src/core/feedsmodel.cpp b/src/core/feedsmodel.cpp index 31cbd9d4b..16b83725d 100644 --- a/src/core/feedsmodel.cpp +++ b/src/core/feedsmodel.cpp @@ -4,6 +4,7 @@ #include "core/databasefactory.h" #include "core/feedsmodelstandardcategory.h" #include "core/feedsmodelstandardfeed.h" +#include "core/textfactory.h" #include "gui/iconthemefactory.h" #include "gui/iconfactory.h" @@ -130,6 +131,37 @@ int FeedsModel::rowCount(const QModelIndex &parent) const { return parent_item->childCount(); } +QList FeedsModel::messagesForFeeds(const QList &feeds) { + QList messages; + + QSqlDatabase database = DatabaseFactory::getInstance()->addConnection(objectName()); + QSqlQuery query_read_msg(database); + query_read_msg.setForwardOnly(true); + query_read_msg.prepare("SELECT title, url, author, date_created, contents " + "FROM Messages " + "WHERE deleted = 0 AND feed = :feed;"); + + foreach (FeedsModelFeed *feed, feeds) { + query_read_msg.bindValue(":feed", feed->id()); + + if (query_read_msg.exec()) { + while (query_read_msg.next()) { + Message message; + + message.m_title = query_read_msg.value(0).toString(); + message.m_url = query_read_msg.value(1).toString(); + message.m_author = query_read_msg.value(2).toString(); + message.m_created = TextFactory::parseDateTime(query_read_msg.value(3).value()); + message.m_contents = query_read_msg.value(4).toString(); + + messages.append(message); + } + } + } + + return messages; +} + int FeedsModel::columnCount(const QModelIndex &parent) const { if (parent.isValid()) { return static_cast(parent.internalPointer())->columnCount(); @@ -316,7 +348,7 @@ void FeedsModel::loadFromDatabase() { QList FeedsModel::feedsForIndex(const QModelIndex &index) { FeedsModelRootItem *item = itemForIndex(index); - return getFeeds(item); + return feedsForItem(item); } FeedsModelFeed *FeedsModel::feedForIndex(const QModelIndex &index) { @@ -423,11 +455,11 @@ bool FeedsModel::markFeedsDeleted(const QList &feeds, } } -QHash FeedsModel::getAllCategories() { - return getCategories(m_rootItem); +QHash FeedsModel::allCategories() { + return categoriesForItem(m_rootItem); } -QHash FeedsModel::getCategories(FeedsModelRootItem *root) { +QHash FeedsModel::categoriesForItem(FeedsModelRootItem *root) { QHash categories; QList parents; @@ -453,11 +485,11 @@ QHash FeedsModel::getCategories(FeedsModelRootItem *ro return categories; } -QList FeedsModel::getAllFeeds() { - return getFeeds(m_rootItem); +QList FeedsModel::allFeeds() { + return feedsForItem(m_rootItem); } -QList FeedsModel::getFeeds(FeedsModelRootItem *root) { +QList FeedsModel::feedsForItem(FeedsModelRootItem *root) { QList feeds; if (root->kind() == FeedsModelRootItem::Feed) { @@ -491,7 +523,7 @@ QList FeedsModel::getFeeds(FeedsModelRootItem *root) { } void FeedsModel::assembleFeeds(FeedAssignment feeds) { - QHash categories = getAllCategories(); + QHash categories = allCategories(); foreach (const FeedAssignmentItem &feed, feeds) { if (feed.first == NO_PARENT_CATEGORY) { diff --git a/src/core/feedsmodel.h b/src/core/feedsmodel.h index 0ea0369cd..45700ba6b 100644 --- a/src/core/feedsmodel.h +++ b/src/core/feedsmodel.h @@ -2,6 +2,9 @@ #define FEEDSMODEL_H #include + +#include "core/messagesmodel.h" + #include @@ -30,20 +33,23 @@ class FeedsModel : public QAbstractItemModel { int columnCount(const QModelIndex &parent) const; int rowCount(const QModelIndex &parent) const; + // Returns all (undeleted) messages for given feeds. + QList messagesForFeeds(const QList &feeds); + // Returns all categories, each pair // consists of ID of parent item and pointer to category. - QHash getAllCategories(); + QHash allCategories(); // Returns categories from the subtree with given root node, each pair // consists of ID of parent item and pointer to category. - QHash getCategories(FeedsModelRootItem *root); + QHash categoriesForItem(FeedsModelRootItem *root); // Returns list of all feeds contained in the model. - QList getAllFeeds(); + QList allFeeds(); // Get list of feeds from tree with particular item // as root. If root itself is a feed, then it is returned. - QList getFeeds(FeedsModelRootItem *root); + QList feedsForItem(FeedsModelRootItem *root); // Returns list of feeds which belong to given indexes. // NOTE: If index is "category", then all child feeds are contained in the @@ -84,6 +90,7 @@ class FeedsModel : public QAbstractItemModel { // Signals that SOME data of this model need // to be reloaded by ALL attached views. + // NOTE: This reloads all parent valid indexes too. void reloadChangedLayout(QModelIndexList list); protected: diff --git a/src/gui/feedmessageviewer.cpp b/src/gui/feedmessageviewer.cpp index f4b5e9221..2dcf296ca 100644 --- a/src/gui/feedmessageviewer.cpp +++ b/src/gui/feedmessageviewer.cpp @@ -136,10 +136,6 @@ void FeedMessageViewer::createConnections() { m_messagesBrowser, SLOT(clear())); connect(m_messagesView, SIGNAL(currentMessageChanged(Message)), m_messagesBrowser, SLOT(navigateToMessage(Message))); - - connect(m_messagesView, SIGNAL(openMessagesInNewspaperViewRequested(QList)), - m_messagesBrowser, SLOT(navigateToMessages(QList))); - connect(m_messagesView, SIGNAL(openMessageNewTabRequested(Message)), FormMain::getInstance()->m_ui->m_tabWidget, SLOT(addBrowserWithMessage(Message))); @@ -152,6 +148,9 @@ void FeedMessageViewer::createConnections() { m_feedsView, SLOT(updateCountsOfSelectedFeeds())); connect(m_feedsView, SIGNAL(feedsNeedToBeReloaded(int)), m_messagesView, SLOT(reloadSelections(int))); + connect(m_feedsView, SIGNAL(newspaperModeRequested(QList)), + FormMain::getInstance()->m_ui->m_tabWidget, + SLOT(addBrowserWithMessages(QList))); // Downloader connections. connect(m_feedDownloaderThread, SIGNAL(finished()), @@ -194,6 +193,8 @@ void FeedMessageViewer::createConnections() { SIGNAL(triggered()), m_feedsView, SLOT(addNewCategory())); connect(FormMain::getInstance()->m_ui->m_actionEditSelectedFeedCategory, SIGNAL(triggered()), m_feedsView, SLOT(editSelectedItem())); + connect(FormMain::getInstance()->m_ui->m_actionViewSelectedItemsNewspaperMode, + SIGNAL(triggered()), m_feedsView, SLOT(openSelectedFeedsInNewspaperMode())); } void FeedMessageViewer::initialize() { diff --git a/src/gui/feedmessageviewer.h b/src/gui/feedmessageviewer.h index 8c9e07708..d79e5b7af 100644 --- a/src/gui/feedmessageviewer.h +++ b/src/gui/feedmessageviewer.h @@ -3,6 +3,8 @@ #include "gui/tabcontent.h" +#include "core/messagesmodel.h" + class WebBrowser; class FeedsView; @@ -33,10 +35,12 @@ class FeedMessageViewer : public TabContent { void quitDownloader(); public slots: + // Feed updates. void updateSelectedFeeds(); void updateAllFeeds(); - protected slots: + protected slots: + // Reacts on feed updates. void onFeedUpdatesProgress(FeedsModelFeed *feed, int current, int total); void onFeedUpdatesFinished(); diff --git a/src/gui/feedsview.cpp b/src/gui/feedsview.cpp index 4e89b68b9..c344494a3 100644 --- a/src/gui/feedsview.cpp +++ b/src/gui/feedsview.cpp @@ -53,7 +53,7 @@ QList FeedsView::selectedFeeds() const { } QList FeedsView::allFeeds() const { - return m_sourceModel->getAllFeeds(); + return m_sourceModel->allFeeds(); } FeedsModelCategory *FeedsView::isCurrentIndexCategory() const { @@ -133,6 +133,17 @@ void FeedsView::markAllFeedsRead() { markAllFeedsReadStatus(1); } +void FeedsView::openSelectedFeedsInNewspaperMode() { + // TODO: oznacit vybrane feedy jako prectene zde + // protoze je uzivatel otvira v newspaperu -> jsou prectene automaticky + + QList messages = m_sourceModel->messagesForFeeds(selectedFeeds()); + + if (!messages.isEmpty()) { + emit newspaperModeRequested(messages); + } +} + void FeedsView::updateCountsOfSelectedFeeds(bool update_total_too) { foreach (FeedsModelFeed *feed, selectedFeeds()) { feed->updateCounts(update_total_too); diff --git a/src/gui/feedsview.h b/src/gui/feedsview.h index 2d6c16afd..dd4778970 100644 --- a/src/gui/feedsview.h +++ b/src/gui/feedsview.h @@ -3,6 +3,8 @@ #include +#include "core/messagesmodel.h" + // TODO: http://soundguyrob.files.wordpress.com/2011/03/screen-shot-2011-03-01-at-7-45-23-pm.jpg // přepsat počet nepřečtených zpráv podle screenshotu (tedy smazat asi sloupec "unread") @@ -54,6 +56,9 @@ class FeedsView : public QTreeView { void markAllFeedsReadStatus(int read); void markAllFeedsRead(); + // Newspaper accessors. + void openSelectedFeedsInNewspaperMode(); + // Feed clearers. void setSelectedFeedsClearStatus(int clear); void clearSelectedFeeds(); @@ -68,6 +73,7 @@ class FeedsView : public QTreeView { // Reloads counts for all feeds. void updateCountsOfAllFeeds(bool update_total_too = true); + // Reloads counts for particular feed. void updateCountsOfParticularFeed(FeedsModelFeed *feed, bool update_total_too = true); protected: @@ -92,6 +98,9 @@ class FeedsView : public QTreeView { // Emitted if user selects new feeds. void feedsSelected(const QList &feed_ids); + // Requests opening of given messages in newspaper mode. + void newspaperModeRequested(const QList &messages); + private: QMenu *m_contextMenuCategoriesFeeds; QMenu *m_contextMenuEmptySpace; diff --git a/src/gui/formcategorydetails.cpp b/src/gui/formcategorydetails.cpp index 547e453dd..1a17a8dac 100644 --- a/src/gui/formcategorydetails.cpp +++ b/src/gui/formcategorydetails.cpp @@ -15,7 +15,7 @@ FormCategoryDetails::FormCategoryDetails(FeedsModel *model, QWidget *parent) : QDialog(parent), m_editableCategory(NULL) { initialize(); - loadCategories(model->getAllCategories().values(), + loadCategories(model->allCategories().values(), model->rootItem()); setWindowTitle(tr("Add new category")); diff --git a/src/gui/formcategorydetails.h b/src/gui/formcategorydetails.h index da02437c2..bbd1ab715 100644 --- a/src/gui/formcategorydetails.h +++ b/src/gui/formcategorydetails.h @@ -17,7 +17,7 @@ class FeedsModelRootItem; class FormCategoryDetailsAnswer { public: int m_dialogCode; - FeedsModelCategory *m_outputItem; + FeedsModelCategory *m_outputCategory; FeedsModelRootItem *m_outputParentItem; }; diff --git a/src/gui/formmain.cpp b/src/gui/formmain.cpp index 71c65aa3d..53de209f1 100755 --- a/src/gui/formmain.cpp +++ b/src/gui/formmain.cpp @@ -233,6 +233,7 @@ void FormMain::setupIcons() { m_ui->m_actionOpenSelectedSourceArticlesInternally->setIcon(IconThemeFactory::getInstance()->fromTheme("document-open")); m_ui->m_actionOpenSelectedSourceArticlesExternally->setIcon(IconThemeFactory::getInstance()->fromTheme("document-open")); m_ui->m_actionOpenSelectedMessagesInternally->setIcon(IconThemeFactory::getInstance()->fromTheme("document-open")); + m_ui->m_actionViewSelectedItemsNewspaperMode->setIcon(IconThemeFactory::getInstance()->fromTheme("document-multiple")); // Setup icons for underlying components: opened web browsers... foreach (WebBrowser *browser, WebBrowser::runningWebBrowsers()) { diff --git a/src/gui/formmain.ui b/src/gui/formmain.ui index 22af37c41..0d0593897 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 - 21 + 20 @@ -102,6 +93,7 @@ + @@ -392,6 +384,14 @@ Mark all messages in all feeds read. This does not take message filters into account. + + + View selected items in newspaper mode + + + Displays all messages from selected feeds/categories in a new "newspaper mode" tab. + + diff --git a/src/gui/tabwidget.cpp b/src/gui/tabwidget.cpp index d564545f8..14a808d32 100644 --- a/src/gui/tabwidget.cpp +++ b/src/gui/tabwidget.cpp @@ -181,6 +181,12 @@ int TabWidget::addBrowserWithMessage(const Message &message) { return new_index; } +int TabWidget::addBrowserWithMessages(const QList &messages) { + int new_index = addBrowser(false, true); + static_cast(widget(new_index))->navigateToMessages(messages); + return new_index; +} + int TabWidget::addEmptyBrowser() { return addBrowser(false, true); } diff --git a/src/gui/tabwidget.h b/src/gui/tabwidget.h index d4a6cc216..b533362a0 100644 --- a/src/gui/tabwidget.h +++ b/src/gui/tabwidget.h @@ -77,7 +77,9 @@ class TabWidget : public QTabWidget { // Closes all "closable" tabs except the active tab. void closeAllTabsExceptCurrent(); + // Open single or multiple (newspaper mode) messages in new tab. int addBrowserWithMessage(const Message &message); + int addBrowserWithMessages(const QList &messages); // Adds new WebBrowser tab to global TabWidget. int addEmptyBrowser(); diff --git a/src/gui/webbrowser.cpp b/src/gui/webbrowser.cpp index 0cc4e1e67..e4288730c 100644 --- a/src/gui/webbrowser.cpp +++ b/src/gui/webbrowser.cpp @@ -174,7 +174,7 @@ void WebBrowser::navigateToMessage(const Message &message) { message.m_contents, message.m_created.toString(Qt::DefaultLocaleShortDate)); - QString layout_wrapper = SkinFactory::getInstance()->getCurrentMarkupLayout().arg(tr("Newspaper view"), + QString layout_wrapper = SkinFactory::getInstance()->getCurrentMarkupLayout().arg(message.m_title, message_layout); m_webView->setHtml(layout_wrapper);