diff --git a/resources/text/CHANGELOG b/resources/text/CHANGELOG index 8b3a54d5f..49f0b2b30 100755 --- a/resources/text/CHANGELOG +++ b/resources/text/CHANGELOG @@ -9,7 +9,7 @@ Main: Added: ▪ RSS Guard now automatically switches to SQLite backend if MySQL is not available on program startup. -▪ Opened web browser tabs now can be saved. (issue #126) +▪ Newspaper view now allows marking individual messages read/unread/starred/unstarred. ▪ Added experimental support for tweakable statusbar. (issue #158) ▪ Opening of download manager when new file download starts is now optional. (issue #165) diff --git a/src/gui/feedmessageviewer.cpp b/src/gui/feedmessageviewer.cpp index 68f598dcf..f16dc9ea9 100755 --- a/src/gui/feedmessageviewer.cpp +++ b/src/gui/feedmessageviewer.cpp @@ -262,9 +262,9 @@ void FeedMessageViewer::createConnections() { // Message openers. connect(m_messagesView, SIGNAL(openMessagesInNewspaperView(RootItem*,QList)), - form_main->m_ui->m_tabWidget, SLOT(addBrowserWithMessages(RootItem*,QList))); - connect(m_feedsView, SIGNAL(openMessagesInNewspaperView(QList)), - form_main->m_ui->m_tabWidget, SLOT(addBrowserWithMessages(QList))); + m_messagesView, SLOT(createNewspaperView(RootItem*,QList))); + connect(m_feedsView, SIGNAL(openMessagesInNewspaperView(RootItem*,QList)), + m_messagesView, SLOT(createNewspaperView(RootItem*,QList))); // Toolbar forwardings. connect(form_main->m_ui->m_actionAddFeedIntoSelectedAccount, SIGNAL(triggered()), diff --git a/src/gui/feedsview.cpp b/src/gui/feedsview.cpp index 11f68f3f0..37312e078 100755 --- a/src/gui/feedsview.cpp +++ b/src/gui/feedsview.cpp @@ -319,10 +319,11 @@ void FeedsView::markAllItemsRead() { } void FeedsView::openSelectedItemsInNewspaperMode() { - const QList messages = m_sourceModel->messagesForItem(selectedItem()); + RootItem *selected_item = selectedItem(); + const QList messages = m_sourceModel->messagesForItem(selected_item); if (!messages.isEmpty()) { - emit openMessagesInNewspaperView(messages); + emit openMessagesInNewspaperView(selected_item, messages); } } diff --git a/src/gui/feedsview.h b/src/gui/feedsview.h index e90721679..ac983d090 100755 --- a/src/gui/feedsview.h +++ b/src/gui/feedsview.h @@ -99,7 +99,7 @@ class FeedsView : public QTreeView { void itemSelected(RootItem *item); // Requests opening of given messages in newspaper mode. - void openMessagesInNewspaperView(const QList &messages); + void openMessagesInNewspaperView(RootItem *root, const QList &messages); private slots: void markSelectedItemReadStatus(RootItem::ReadStatus read); diff --git a/src/gui/messagepreviewer.cpp b/src/gui/messagepreviewer.cpp index 243bedcf9..b740809ba 100644 --- a/src/gui/messagepreviewer.cpp +++ b/src/gui/messagepreviewer.cpp @@ -88,13 +88,14 @@ void MessagePreviewer::loadMessage(const Message &message, RootItem *root) { m_message = message; m_root = root; - m_actionMarkRead->setEnabled(!message.m_isRead); - m_actionMarkUnread->setEnabled(message.m_isRead); - m_actionSwitchImportance->setChecked(message.m_isImportant); - if (!m_root.isNull()) { - m_ui->m_lblTitle->setText(message.m_title); - m_ui->m_txtMessage->setHtml(prepareHtmlForMessage(message)); + updateButtons(); + m_actionSwitchImportance->setChecked(m_message.m_isImportant); + + m_ui->m_lblTitle->setText(m_message.m_title); + m_ui->m_txtMessage->setHtml(prepareHtmlForMessage(m_message)); + + updateTitle(); show(); m_ui->m_txtMessage->verticalScrollBar()->triggerAction(QScrollBar::SliderToMinimum); @@ -119,6 +120,9 @@ void MessagePreviewer::markMessageAsRead() { RootItem::Read); emit requestMessageListReload(false); + m_message.m_isRead = true; + updateButtons(); + updateTitle(); } } } @@ -141,6 +145,9 @@ void MessagePreviewer::markMessageAsUnread() { RootItem::Unread); emit requestMessageListReload(false); + m_message.m_isRead = false; + updateButtons(); + updateTitle(); } } } @@ -163,14 +170,26 @@ void MessagePreviewer::switchMessageImportance(bool checked) { m_root->getParentServiceRoot()->onBeforeSwitchMessageImportance(m_root.data(), QList() << ImportanceChange(m_message, m_message.m_isImportant ? - RootItem::NotImportant : - RootItem::Important)); + RootItem::NotImportant : + RootItem::Important)); emit requestMessageListReload(false); + m_message.m_isImportant = checked; } } } +void MessagePreviewer::updateButtons() { + m_actionMarkRead->setEnabled(!m_message.m_isRead); + m_actionMarkUnread->setEnabled(m_message.m_isRead); +} + +void MessagePreviewer::updateTitle() { + QFont fon = m_ui->m_lblTitle->font(); + fon.setBold(!m_message.m_isRead); + m_ui->m_lblTitle->setFont(fon); +} + QString MessagePreviewer::prepareHtmlForMessage(const Message &message) { QString html = QString("

[url] %1

").arg(message.m_url); diff --git a/src/gui/messagepreviewer.h b/src/gui/messagepreviewer.h index 124910c4c..24e10885d 100644 --- a/src/gui/messagepreviewer.h +++ b/src/gui/messagepreviewer.h @@ -54,6 +54,8 @@ class MessagePreviewer : public QWidget { void requestMessageListReload(bool mark_current_as_read); private: + void updateButtons(); + void updateTitle(); QString prepareHtmlForMessage(const Message &message); QToolBar *m_toolBar; diff --git a/src/gui/messagepreviewer.ui b/src/gui/messagepreviewer.ui index 2965eddf7..0166bd4d3 100644 --- a/src/gui/messagepreviewer.ui +++ b/src/gui/messagepreviewer.ui @@ -46,7 +46,7 @@ true - 0 + 5 Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse diff --git a/src/gui/messagesview.cpp b/src/gui/messagesview.cpp index 79bc5d96b..d789d02da 100755 --- a/src/gui/messagesview.cpp +++ b/src/gui/messagesview.cpp @@ -24,6 +24,7 @@ #include "network-web/webfactory.h" #include "gui/dialogs/formmain.h" #include "gui/messagebox.h" +#include "gui/newspaperpreviewer.h" #include "gui/styleditemdelegatewithoutfocus.h" #include @@ -466,6 +467,17 @@ void MessagesView::filterMessages(MessagesModel::MessageHighlighter filter) { m_sourceModel->highlightMessages(filter); } +void MessagesView::createNewspaperView(RootItem *selected_item, const QList &messages) { + NewspaperPreviewer *prev = new NewspaperPreviewer(selected_item, messages, this); + int index = qApp->mainForm()->tabWidget()->addTab(prev, + qApp->icons()->fromTheme(QSL("item-newspaper")), + tr("Newspaper view"), + TabBar::Closable); + qApp->mainForm()->tabWidget()->setCurrentIndex(index); + + connect(prev, SIGNAL(requestMessageListReload(bool)), this, SLOT(reloadSelections(bool))); +} + void MessagesView::adjustColumns() { if (header()->count() > 0 && !m_columnsAdjusted) { m_columnsAdjusted = true; diff --git a/src/gui/messagesview.h b/src/gui/messagesview.h index 5c5f66bec..f553f511b 100755 --- a/src/gui/messagesview.h +++ b/src/gui/messagesview.h @@ -78,6 +78,8 @@ class MessagesView : public QTreeView { void searchMessages(const QString &pattern); void filterMessages(MessagesModel::MessageHighlighter filter); + void createNewspaperView(RootItem *selected_item, const QList &messages); + private slots: // Marks given indexes as selected. void reselectIndexes(const QModelIndexList &indexes); diff --git a/src/gui/newspaperpreviewer.cpp b/src/gui/newspaperpreviewer.cpp index 0d9ddd66c..108fa1ee6 100644 --- a/src/gui/newspaperpreviewer.cpp +++ b/src/gui/newspaperpreviewer.cpp @@ -18,11 +18,15 @@ #include "gui/newspaperpreviewer.h" #include "gui/messagepreviewer.h" +#include "gui/dialogs/formmain.h" +#include "miscellaneous/application.h" + +#include NewspaperPreviewer::NewspaperPreviewer(RootItem *root, QList messages, QWidget *parent) : TabContent(parent), m_ui(new Ui::NewspaperPreviewer), m_root(root), m_messages(messages) { - m_ui->setupUi(this); + m_ui->setupUi(this); connect(m_ui->m_btnShowMoreMessages, SIGNAL(clicked(bool)), this, SLOT(showMoreMessages())); showMoreMessages(); } @@ -32,12 +36,13 @@ NewspaperPreviewer::~NewspaperPreviewer() { void NewspaperPreviewer::showMoreMessages() { if (!m_root.isNull()) { + int current_scroll = m_ui->scrollArea->verticalScrollBar()->value(); + for (int i = 0; i < 10 && !m_messages.isEmpty(); i++) { Message msg = m_messages.takeFirst(); MessagePreviewer *prev = new MessagePreviewer(this); connect(prev, SIGNAL(requestMessageListReload(bool)), this, SIGNAL(requestMessageListReload(bool))); - prev->setFixedHeight(300); prev->loadMessage(msg, m_root); m_ui->m_layout->insertWidget(m_ui->m_layout->count() - 2, prev); @@ -45,14 +50,12 @@ void NewspaperPreviewer::showMoreMessages() { m_ui->m_btnShowMoreMessages->setText(tr("Show more messages (%n remaining)", "", m_messages.size())); m_ui->m_btnShowMoreMessages->setEnabled(!m_messages.isEmpty()); - - // TODO: pokračovat, pridat signal void requestMessageListReload(bool mark_current_as_read); - // ktery bude forwardovar tentyz signal z toho message previeweru kazdeho - // a ten signal navazat na obnoveni seznamu zprav - // - // taky opravit spojeni v pripade ze se zada o novinovy nahled z feedviewu + m_ui->scrollArea->verticalScrollBar()->setValue(current_scroll); } else { - // TODO: ukazat chybu + qApp->showGuiMessage(tr("Cannot show more messages"), + tr("Cannot show more messages because parent feed was removed."), + QSystemTrayIcon::Warning, + qApp->mainForm(), true); } } diff --git a/src/gui/tabwidget.cpp b/src/gui/tabwidget.cpp index 8a4a183bd..6d7320bd1 100755 --- a/src/gui/tabwidget.cpp +++ b/src/gui/tabwidget.cpp @@ -26,7 +26,6 @@ #include "gui/feedmessageviewer.h" #include "gui/plaintoolbutton.h" #include "gui/dialogs/formmain.h" -#include "gui/newspaperpreviewer.h" #include #include @@ -240,11 +239,6 @@ int TabWidget::insertTab(int index, QWidget *widget, const QString &label, const return tab_index; } -int TabWidget::addBrowserWithMessages(RootItem *root, const QList &messages) { - NewspaperPreviewer *prev = new NewspaperPreviewer(root, messages, this); - return addTab(prev, qApp->icons()->fromTheme(QSL("item-newspaper")), tr("Newspaper view"), TabBar::Closable); -} - void TabWidget::changeIcon(int index, const QIcon &new_icon) { setTabIcon(index, new_icon); } diff --git a/src/gui/tabwidget.h b/src/gui/tabwidget.h index b5f5f828c..e5b8c37c9 100755 --- a/src/gui/tabwidget.h +++ b/src/gui/tabwidget.h @@ -111,9 +111,6 @@ 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 addBrowserWithMessages(RootItem *root, const QList &messages); - private: PlainToolButton *m_btnMainMenu; QMenu *m_menuMain;