diff --git a/src/core/messagesmodel.cpp b/src/core/messagesmodel.cpp index db4d5cff7..d4180080c 100755 --- a/src/core/messagesmodel.cpp +++ b/src/core/messagesmodel.cpp @@ -29,7 +29,8 @@ MessagesModel::MessagesModel(QObject *parent) - : QSqlTableModel(parent, qApp->database()->connection("MessagesModel", DatabaseFactory::FromSettings)) { + : QSqlTableModel(parent, qApp->database()->connection("MessagesModel", DatabaseFactory::FromSettings)), + m_messageMode(MessagesFromFeeds), m_messageFilter(NoHighlighting) { setObjectName("MessagesModel"); setupFonts(); setupIcons(); @@ -69,9 +70,11 @@ void MessagesModel::loadMessages(const QList feed_ids) { m_currentFeeds = feed_ids; if (feed_ids.size() == 1 && feed_ids[0] == ID_RECYCLE_BIN) { + m_messageMode = MessagesFromRecycleBin; setFilter("is_deleted = 1"); } else { + m_messageMode = MessagesFromFeeds; QString assembled_ids = textualFeeds().join(", "); setFilter(QString("feed IN (%1) AND is_deleted = 0").arg(assembled_ids)); @@ -82,8 +85,8 @@ void MessagesModel::loadMessages(const QList feed_ids) { fetchAll(); } -void MessagesModel::filterMessages(MessagesModel::DisplayFilter filter) { - m_filter = filter; +void MessagesModel::filterMessages(MessagesModel::MessageFilter filter) { + m_messageFilter = filter; emit layoutAboutToBeChanged(); emit layoutChanged(); } @@ -167,8 +170,7 @@ QVariant MessagesModel::data(const QModelIndex &idx, int role) const { return QSqlTableModel::data(index(idx.row(), MSG_DB_TITLE_INDEX, idx.parent())); } */ - else if (index_column != MSG_DB_IMPORTANT_INDEX && - index_column != MSG_DB_READ_INDEX) { + else if (index_column != MSG_DB_IMPORTANT_INDEX && index_column != MSG_DB_READ_INDEX) { return QSqlTableModel::data(idx, role); } else { @@ -180,26 +182,17 @@ QVariant MessagesModel::data(const QModelIndex &idx, int role) const { return QSqlTableModel::data(idx, role); case Qt::FontRole: - return QSqlTableModel::data(index(idx.row(), - MSG_DB_READ_INDEX)).toInt() == 1 ? - m_normalFont : - m_boldFont; + return QSqlTableModel::data(index(idx.row(), MSG_DB_READ_INDEX)).toInt() == 1 ? m_normalFont : m_boldFont; case Qt::ForegroundRole: - switch (m_filter) { - case DisplayImportant: - return QSqlTableModel::data(index(idx.row(), - MSG_DB_IMPORTANT_INDEX)).toInt() == 1 ? - QColor(Qt::blue) : - QVariant(); + switch (m_messageFilter) { + case HighlightImportant: + return QSqlTableModel::data(index(idx.row(), MSG_DB_IMPORTANT_INDEX)).toInt() == 1 ? QColor(Qt::blue) : QVariant(); - case DisplayUnread: - return QSqlTableModel::data(index(idx.row(), - MSG_DB_READ_INDEX)).toInt() == 0 ? - QColor(Qt::blue) : - QVariant(); + case HighlightUnread: + return QSqlTableModel::data(index(idx.row(), MSG_DB_READ_INDEX)).toInt() == 0 ? QColor(Qt::blue) : QVariant(); - case DisplayAll: + case NoHighlighting: default: return QVariant(); } @@ -208,14 +201,10 @@ QVariant MessagesModel::data(const QModelIndex &idx, int role) const { int index_column = idx.column(); if (index_column == MSG_DB_READ_INDEX) { - return QSqlTableModel::data(idx).toInt() == 1 ? - m_readIcon : - m_unreadIcon; + return QSqlTableModel::data(idx).toInt() == 1 ? m_readIcon : m_unreadIcon; } else if (index_column == MSG_DB_IMPORTANT_INDEX) { - return QSqlTableModel::data(idx).toInt() == 1 ? - m_favoriteIcon : - QVariant(); + return QSqlTableModel::data(idx).toInt() == 1 ? m_favoriteIcon : QVariant(); } else { return QVariant(); @@ -242,8 +231,7 @@ bool MessagesModel::setMessageRead(int row_index, int read) { } // Rewrite "visible" data in the model. - bool working_change = setData(index(row_index, MSG_DB_READ_INDEX), - read); + bool working_change = setData(index(row_index, MSG_DB_READ_INDEX), read); if (!working_change) { // If rewriting in the model failed, then cancel all actions. @@ -257,8 +245,7 @@ bool MessagesModel::setMessageRead(int row_index, int read) { QSqlQuery query_read_msg(db_handle); query_read_msg.setForwardOnly(true); - if (!query_read_msg.prepare("UPDATE messages SET is_read = :read " - "WHERE id = :id")) { + if (!query_read_msg.prepare("UPDATE Messages SET is_read = :read WHERE id = :id;")) { qWarning("Query preparation failed for message read change."); db_handle.rollback(); @@ -313,8 +300,7 @@ bool MessagesModel::switchMessageImportance(int row_index) { QSqlQuery query_importance_msg(db_handle); query_importance_msg.setForwardOnly(true); - if (!query_importance_msg.prepare("UPDATE messages SET is_important = :important " - "WHERE id = :id")) { + if (!query_importance_msg.prepare("UPDATE Messages SET is_important = :important WHERE id = :id;")) { qWarning("Query preparation failed for message importance switch."); db_handle.rollback(); @@ -323,16 +309,14 @@ bool MessagesModel::switchMessageImportance(int row_index) { message_id = messageId(row_index); query_importance_msg.bindValue(":id", message_id); - query_importance_msg.bindValue(":important", - current_importance == 1 ? 0 : 1); + query_importance_msg.bindValue(":important", current_importance == 1 ? 0 : 1); query_importance_msg.exec(); // Commit changes. if (db_handle.commit()) { // If commit succeeded, then emit changes, so that view // can reflect. - emit dataChanged(index(row_index, 0), - index(row_index, columnCount() - 1)); + emit dataChanged(index(row_index, 0), index(row_index, columnCount() - 1)); return true; } else { @@ -352,8 +336,8 @@ bool MessagesModel::switchBatchMessageImportance(const QModelIndexList &messages message_ids.append(QString::number(messageId(message.row()))); } - if (query_read_msg.exec(QString("UPDATE messages SET is_important = NOT is_important " - "WHERE id IN (%1)").arg(message_ids.join(", ")))) { + if (query_read_msg.exec(QString("UPDATE Messages SET is_important = NOT is_important " + "WHERE id IN (%1);").arg(message_ids.join(", ")))) { select(); fetchAll(); @@ -365,8 +349,7 @@ bool MessagesModel::switchBatchMessageImportance(const QModelIndexList &messages } } -bool MessagesModel::setBatchMessagesDeleted(const QModelIndexList &messages, - int deleted) { +bool MessagesModel::setBatchMessagesDeleted(const QModelIndexList &messages, int deleted) { QSqlDatabase db_handle = database(); QSqlQuery query_read_msg(db_handle); QStringList message_ids; @@ -378,9 +361,17 @@ bool MessagesModel::setBatchMessagesDeleted(const QModelIndexList &messages, message_ids.append(QString::number(messageId(message.row()))); } - if (query_read_msg.exec(QString("UPDATE messages SET is_deleted = %2 " - "WHERE id IN (%1)").arg(message_ids.join(", "), - QString::number(deleted)))) { + QString sql_delete_query; + + if (m_messageMode == MessagesFromFeeds) { + sql_delete_query = QString("UPDATE Messages SET is_deleted = %2 WHERE id IN (%1);").arg(message_ids.join(", "), + QString::number(deleted)); + } + else { + sql_delete_query = QString("DELETE FROM Messages WHERE id in (%1);").arg(message_ids.join(", ")); + } + + if (query_read_msg.exec(sql_delete_query)) { select(); fetchAll(); @@ -404,9 +395,8 @@ bool MessagesModel::setBatchMessagesRead(const QModelIndexList &messages, int re message_ids.append(QString::number(messageId(message.row()))); } - if (query_read_msg.exec(QString("UPDATE messages SET is_read = %2 " - "WHERE id IN (%1)").arg(message_ids.join(", "), - QString::number(read)))) { + if (query_read_msg.exec(QString("UPDATE Messages SET is_read = %2 " + "WHERE id IN (%1);").arg(message_ids.join(", "), QString::number(read)))) { select(); fetchAll(); @@ -418,9 +408,7 @@ bool MessagesModel::setBatchMessagesRead(const QModelIndexList &messages, int re } } -QVariant MessagesModel::headerData(int section, - Qt::Orientation orientation, - int role) const { +QVariant MessagesModel::headerData(int section, Qt::Orientation orientation, int role) const { Q_UNUSED(orientation) switch (role) { diff --git a/src/core/messagesmodel.h b/src/core/messagesmodel.h index eac0651a3..ce4da6515 100644 --- a/src/core/messagesmodel.h +++ b/src/core/messagesmodel.h @@ -50,10 +50,15 @@ class MessagesModel : public QSqlTableModel { public: // Enum which describes basic filtering schemes // for messages. - enum DisplayFilter { - DisplayAll = 100, - DisplayUnread = 101, - DisplayImportant = 102 + enum MessageFilter { + NoHighlighting = 100, + HighlightUnread = 101, + HighlightImportant = 102 + }; + + enum MessageMode { + MessagesFromFeeds, + MessagesFromRecycleBin }; // Constructors and destructors. @@ -104,7 +109,7 @@ class MessagesModel : public QSqlTableModel { // Loads messages of given feeds. void loadMessages(const QList feed_ids); - void filterMessages(DisplayFilter filter); + void filterMessages(MessageFilter filter); signals: // Emitted if some persistent change is made which affects @@ -126,7 +131,8 @@ class MessagesModel : public QSqlTableModel { void setupIcons(); private: - DisplayFilter m_filter; + MessageMode m_messageMode; + MessageFilter m_messageFilter; QList m_currentFeeds; QList m_headerData; @@ -140,6 +146,6 @@ class MessagesModel : public QSqlTableModel { QIcon m_unreadIcon; }; -Q_DECLARE_METATYPE(MessagesModel::DisplayFilter) +Q_DECLARE_METATYPE(MessagesModel::MessageFilter) #endif // MESSAGESMODEL_H diff --git a/src/gui/feedmessageviewer.cpp b/src/gui/feedmessageviewer.cpp index 5804fc5fe..f8f6aea8e 100755 --- a/src/gui/feedmessageviewer.cpp +++ b/src/gui/feedmessageviewer.cpp @@ -195,8 +195,8 @@ void FeedMessageViewer::createConnections() { // Filtering & searching. connect(m_toolBarMessages, SIGNAL(messageSearchPatternChanged(QString)), m_messagesView, SLOT(searchMessages(QString))); - connect(m_toolBarMessages, SIGNAL(messageFilterChanged(MessagesModel::DisplayFilter)), - m_messagesView, SLOT(filterMessages(MessagesModel::DisplayFilter))); + connect(m_toolBarMessages, SIGNAL(messageFilterChanged(MessagesModel::MessageFilter)), + m_messagesView, SLOT(filterMessages(MessagesModel::MessageFilter))); // Message changers. connect(m_messagesView, SIGNAL(currentMessagesRemoved()), m_messagesBrowser, SLOT(clear())); diff --git a/src/gui/feedsview.cpp b/src/gui/feedsview.cpp index 72d581e01..b800c583f 100755 --- a/src/gui/feedsview.cpp +++ b/src/gui/feedsview.cpp @@ -561,29 +561,25 @@ void FeedsView::setupAppearance() { void FeedsView::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) { QTreeView::selectionChanged(selected, deselected); - m_selectedFeeds.clear(); + QList selected_feeds = selectedFeeds(); + QList selected_ids; - foreach (FeedsModelFeed *feed, selectedFeeds()) { + if (!selected_feeds.isEmpty()) { + foreach (FeedsModelFeed *feed, selected_feeds) { #if defined(DEBUG) - QModelIndex index_for_feed = m_sourceModel->indexForItem(feed); + QModelIndex index_for_feed = m_sourceModel->indexForItem(feed); - qDebug("Selecting feed '%s' (source index [%d, %d]).", qPrintable(feed->title()), index_for_feed.row(), index_for_feed.column()); + qDebug("Selecting feed '%s' (source index [%d, %d]).", qPrintable(feed->title()), index_for_feed.row(), index_for_feed.column()); #endif - m_selectedFeeds << feed->id(); - } - - if (m_selectedFeeds.isEmpty() && selectionModel()->selectedIndexes().size() > 0) { - QModelIndex selected_index = selectionModel()->selectedIndexes().at(0); - QModelIndex mapped_index = model()->mapToSource(selected_index); - FeedsModelRootItem *item = sourceModel()->itemForIndex(mapped_index); - - if (item->kind() == FeedsModelRootItem::RecycleBin) { - m_selectedFeeds.append(ID_RECYCLE_BIN); + selected_ids << feed->id(); } } + else if (selectedRecycleBin() != NULL) { + selected_ids << ID_RECYCLE_BIN; + } - emit feedsSelected(m_selectedFeeds); + emit feedsSelected(selected_ids); } void FeedsView::keyPressEvent(QKeyEvent *event) { diff --git a/src/gui/feedsview.h b/src/gui/feedsview.h index 116448161..c881cd107 100644 --- a/src/gui/feedsview.h +++ b/src/gui/feedsview.h @@ -174,7 +174,6 @@ class FeedsView : public QTreeView { QMenu *m_contextMenuEmptySpace; QMenu *m_contextMenuRecycleBin; - QList m_selectedFeeds; FeedsModel *m_sourceModel; FeedsProxyModel *m_proxyModel; diff --git a/src/gui/formupdate.cpp b/src/gui/formupdate.cpp index 24f779e2d..86abad591 100755 --- a/src/gui/formupdate.cpp +++ b/src/gui/formupdate.cpp @@ -224,7 +224,7 @@ void FormUpdate::startUpdate() { // Initialie downloader. m_downloader = new Downloader(this); - connect(m_downloader, SIGNAL(progress(qint64,qint64)), this, SLOT(updateProgress(qint64,qint64))); + //connect(m_downloader, SIGNAL(progress(qint64,qint64)), this, SLOT(updateProgress(qint64,qint64))); connect(m_downloader, SIGNAL(completed(QNetworkReply::NetworkError,QByteArray)), this, SLOT(updateCompleted(QNetworkReply::NetworkError,QByteArray))); } diff --git a/src/gui/messagestoolbar.cpp b/src/gui/messagestoolbar.cpp index 763f75b8b..3b63e3d2d 100755 --- a/src/gui/messagestoolbar.cpp +++ b/src/gui/messagestoolbar.cpp @@ -106,7 +106,7 @@ void MessagesToolBar::handleMessageHighlighterChange(QAction *action) { m_btnMessageHighlighter->setIcon(action->icon()); m_btnMessageHighlighter->setToolTip(action->text()); - emit messageFilterChanged(action->data().value()); + emit messageFilterChanged(action->data().value()); } void MessagesToolBar::initializeSearchBox() { @@ -128,11 +128,11 @@ void MessagesToolBar::initializeSearchBox() { void MessagesToolBar::initializeHighlighter() { m_menuMessageHighlighter = new QMenu(tr("Menu for highlighting messages"), this); m_menuMessageHighlighter->addAction(qApp->icons()->fromTheme("mail-mark-read"), - tr("No extra highlighting"))->setData(QVariant::fromValue(MessagesModel::DisplayAll)); + tr("No extra highlighting"))->setData(QVariant::fromValue(MessagesModel::NoHighlighting)); m_menuMessageHighlighter->addAction(qApp->icons()->fromTheme("mail-mark-unread"), - tr("Highlight unread messages"))->setData(QVariant::fromValue(MessagesModel::DisplayUnread)); + tr("Highlight unread messages"))->setData(QVariant::fromValue(MessagesModel::HighlightUnread)); m_menuMessageHighlighter->addAction(qApp->icons()->fromTheme("mail-mark-favorite"), - tr("Highlight important messages"))->setData(QVariant::fromValue(MessagesModel::DisplayImportant)); + tr("Highlight important messages"))->setData(QVariant::fromValue(MessagesModel::HighlightImportant)); m_btnMessageHighlighter = new QToolButton(this); m_btnMessageHighlighter->setToolTip(tr("Display all messages")); diff --git a/src/gui/messagestoolbar.h b/src/gui/messagestoolbar.h index 48adedb07..65c74f6bc 100644 --- a/src/gui/messagestoolbar.h +++ b/src/gui/messagestoolbar.h @@ -56,7 +56,7 @@ class MessagesToolBar : public BaseToolBar { void messageSearchPatternChanged(const QString &pattern); // Emitted if message filter is changed. - void messageFilterChanged(MessagesModel::DisplayFilter filter); + void messageFilterChanged(MessagesModel::MessageFilter filter); private slots: // Called when highlighter gets changed. diff --git a/src/gui/messagesview.cpp b/src/gui/messagesview.cpp index d4837e874..e48e7bd40 100755 --- a/src/gui/messagesview.cpp +++ b/src/gui/messagesview.cpp @@ -420,7 +420,7 @@ void MessagesView::searchMessages(const QString &pattern) { } } -void MessagesView::filterMessages(MessagesModel::DisplayFilter filter) { +void MessagesView::filterMessages(MessagesModel::MessageFilter filter) { m_sourceModel->filterMessages(filter); } diff --git a/src/gui/messagesview.h b/src/gui/messagesview.h index 77249afb8..edd7e1bf5 100755 --- a/src/gui/messagesview.h +++ b/src/gui/messagesview.h @@ -72,15 +72,15 @@ class MessagesView : public QTreeView { void setSelectedMessagesReadStatus(int read); void markSelectedMessagesRead(); void markSelectedMessagesUnread(); - void deleteSelectedMessages(); void switchSelectedMessagesImportance(); + void deleteSelectedMessages(); void selectNextItem(); void selectPreviousItem(); // Searchs the visible message according to given pattern. void searchMessages(const QString &pattern); - void filterMessages(MessagesModel::DisplayFilter filter); + void filterMessages(MessagesModel::MessageFilter filter); protected slots: // Marks given indexes as selected.