From e504d619c1a51f39c3183a38d7a563b00bc17714 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Tue, 17 Dec 2013 09:09:21 +0100 Subject: [PATCH] All messages methods working, some tweaks. --- src/core/messagesmodel.cpp | 56 +++++++++++++++++++++++++++++------ src/core/messagesmodel.h | 5 +++- src/gui/feedmessageviewer.cpp | 2 ++ src/gui/formmain.ui | 15 ++-------- src/gui/messagesview.cpp | 36 ++++++++++++++++++++++ src/gui/messagesview.h | 4 +++ 6 files changed, 96 insertions(+), 22 deletions(-) diff --git a/src/core/messagesmodel.cpp b/src/core/messagesmodel.cpp index 927757ae9..abd6e7a6c 100644 --- a/src/core/messagesmodel.cpp +++ b/src/core/messagesmodel.cpp @@ -58,18 +58,21 @@ void MessagesModel::setupFonts() { void MessagesModel::loadMessages(const QList feed_ids) { // Conversion of parameter. m_currentFeeds = feed_ids; - QStringList stringy_ids; - stringy_ids.reserve(feed_ids.count()); - foreach (int feed_id, feed_ids) { + setFilter(QString("feed IN (%1) AND deleted = 0").arg(textualFeeds().join(", "))); + select(); + fetchAll(); +} + +QStringList MessagesModel::textualFeeds() const { + QStringList stringy_ids; + stringy_ids.reserve(m_currentFeeds.count()); + + foreach (int feed_id, m_currentFeeds) { stringy_ids.append(QString::number(feed_id)); } - // TODO: Enable when time is right. - setFilter(QString("feed IN (%1) AND deleted = 0").arg(stringy_ids.join(", "))); - //setFilter(QString("deleted = 0").arg(stringy_ids.join(","))); - select(); - fetchAll(); + return stringy_ids; } int MessagesModel::messageId(int row_index) const { @@ -316,6 +319,9 @@ bool MessagesModel::switchBatchMessageImportance(const QModelIndexList &messages query_delete_msg.bindValue(":id", message_id); query_delete_msg.bindValue(":important", importance == 1 ? 0 : 1); + + // TODO: dat u vsech funkci ty execy do ifu a kdyz + // vratijou false tak udela rollback a vratit funkci s hodnotou false. query_delete_msg.exec(); } @@ -414,7 +420,39 @@ bool MessagesModel::setAllMessagesDeleted(int deleted) { } bool MessagesModel::setAllMessagesRead(int read) { - return false; + QSqlDatabase db_handle = database(); + + if (!db_handle.transaction()) { + qWarning("Starting transaction for all message read change."); + return false; + } + + QSqlQuery query_read_msg(db_handle); + if (!query_read_msg.prepare(QString("UPDATE messages SET read = :read " + "WHERE feed IN (%1) AND deleted = 0").arg(textualFeeds().join(", ")))) { + qWarning("Query preparation failed for message read change."); + + db_handle.rollback(); + return false; + } + + query_read_msg.bindValue(":read", read); + + if (!query_read_msg.exec()) { + qDebug("Query execution for all message read change failed."); + db_handle.rollback(); + } + + // Commit changes. + if (db_handle.commit()) { + // FULLY reload the model if underlying data is changed. + select(); + fetchAll(); + return true; + } + else { + return db_handle.rollback(); + } } QVariant MessagesModel::headerData(int section, diff --git a/src/core/messagesmodel.h b/src/core/messagesmodel.h index 17edc341a..fc52677ae 100644 --- a/src/core/messagesmodel.h +++ b/src/core/messagesmodel.h @@ -81,13 +81,16 @@ class MessagesModel : public QSqlTableModel { // Loads messages of given feeds. void loadMessages(const QList feed_ids); - private: + protected: + QStringList textualFeeds() const; + // Sets up header data. void setupHeaderData(); // Creates "normal" and "bold" fonts. void setupFonts(); + private: QList m_currentFeeds; QList m_headerData; QList m_tooltipData; diff --git a/src/gui/feedmessageviewer.cpp b/src/gui/feedmessageviewer.cpp index c722a01b8..5ff229989 100644 --- a/src/gui/feedmessageviewer.cpp +++ b/src/gui/feedmessageviewer.cpp @@ -58,6 +58,8 @@ 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, + SIGNAL(triggered()), m_messagesView, SLOT(setAllMessagesRead())); } void FeedMessageViewer::initialize() { diff --git a/src/gui/formmain.ui b/src/gui/formmain.ui index 31289e2d8..32564427a 100644 --- a/src/gui/formmain.ui +++ b/src/gui/formmain.ui @@ -338,10 +338,7 @@ Mark &all messages read - Mark all messages read. - - - + Mark all messages from selected feeds read. This does NOT take message filters into account. @@ -349,10 +346,7 @@ Mark a&ll messages unread - Mark all messages unread. - - - + Mark all messages from selected feeds unread. This does NOT take message filters into account. @@ -371,10 +365,7 @@ Dele&te all messages - Delete all messages. - - - + Delete all messages from selected feeds. This does NOT take message filters into account. diff --git a/src/gui/messagesview.cpp b/src/gui/messagesview.cpp index bb80b0363..bbe2abd8a 100644 --- a/src/gui/messagesview.cpp +++ b/src/gui/messagesview.cpp @@ -299,6 +299,42 @@ void MessagesView::switchSelectedMessagesImportance() { reselectIndexes(selected_indexes); } +void MessagesView::setAllMessagesReadStatus(int read) { + QModelIndex current_index = selectionModel()->currentIndex(); + QModelIndex mapped_current_index = m_proxyModel->mapToSource(current_index); + QModelIndexList selected_indexes = selectionModel()->selectedRows(); + QModelIndexList mapped_indexes = m_proxyModel->mapListToSource(selected_indexes); + + m_sourceModel->setAllMessagesRead(read); + sortByColumn(header()->sortIndicatorSection(), header()->sortIndicatorOrder()); + + selected_indexes = m_proxyModel->mapListFromSource(mapped_indexes, true); + current_index = m_proxyModel->mapFromSource(m_sourceModel->index(mapped_current_index.row(), + mapped_current_index.column())); + + if (read == 0) { + // User selected to mark some messages as unread, if one + // of them will be marked as current, then it will be read again. + blockSignals(true); + setCurrentIndex(current_index); + blockSignals(false); + } + else { + setCurrentIndex(current_index); + } + + scrollTo(current_index); + reselectIndexes(selected_indexes); +} + +void MessagesView::setAllMessagesRead() { + setAllMessagesReadStatus(1); +} + +void MessagesView::setAllMessagesUnread() { + setAllMessagesReadStatus(0); +} + void MessagesView::reselectIndexes(const QModelIndexList &indexes) { selectionModel()->clearSelection(); diff --git a/src/gui/messagesview.h b/src/gui/messagesview.h index c1d3483c3..ae7bb7f7e 100755 --- a/src/gui/messagesview.h +++ b/src/gui/messagesview.h @@ -36,6 +36,10 @@ class MessagesView : public QTreeView { void deleteSelectedMessages(); void switchSelectedMessagesImportance(); + void setAllMessagesReadStatus(int read); + void setAllMessagesRead(); + void setAllMessagesUnread(); + protected slots: // Marks given indexes as selected. void reselectIndexes(const QModelIndexList &indexes);