diff --git a/src/core/messagesmodel.cpp b/src/core/messagesmodel.cpp index 8e4bb6d15..016a4aaf6 100755 --- a/src/core/messagesmodel.cpp +++ b/src/core/messagesmodel.cpp @@ -264,7 +264,7 @@ bool MessagesModel::setMessageRead(int row_index, int read) { // can reflect. emit dataChanged(index(row_index, 0), index(row_index, columnCount() - 1)); - emit feedCountsChanged(false); + emit messageCountsChanged(false); return true; } else { @@ -341,7 +341,7 @@ bool MessagesModel::switchBatchMessageImportance(const QModelIndexList &messages select(); fetchAll(); - //emit feedCountsChanged(false); + //emit messageCountsChanged(false); return true; } else { @@ -375,7 +375,7 @@ bool MessagesModel::setBatchMessagesDeleted(const QModelIndexList &messages, int select(); fetchAll(); - emit feedCountsChanged(true); + emit messageCountsChanged(true); return true; } else { @@ -400,7 +400,7 @@ bool MessagesModel::setBatchMessagesRead(const QModelIndexList &messages, int re select(); fetchAll(); - emit feedCountsChanged(true); + emit messageCountsChanged(true); return true; } else { @@ -411,9 +411,37 @@ bool MessagesModel::setBatchMessagesRead(const QModelIndexList &messages, int re bool MessagesModel::setBatchMessagesRestored(const QModelIndexList &messages) { // TODO: Model -> setBatchMessagesRestored(); // obnovime zpravy, po obnoveni je treba jako ve funkci setBatchMessagesDeleted - // pres feedCountsChanged dat informaci ze pocty zprav se zmenily, ale oni + // pres messageCountsChanged dat informaci ze pocty zprav se zmenily, ale oni // se zmenily nejen ve vybranych kanalech (je vybran odkadkovy kos) ale v kanalech do kterych patri - return true; + + if (m_messageMode == MessagesFromFeeds) { + qDebug("Cannot restore non-deleted messages."); + return false; + } + + QSqlDatabase db_handle = database(); + QSqlQuery query_read_msg(db_handle); + QStringList message_ids; + + query_read_msg.setForwardOnly(true); + + // Obtain IDs of all desired messages. + foreach (const QModelIndex &message, messages) { + message_ids.append(QString::number(messageId(message.row()))); + } + + QString sql_delete_query = QString("UPDATE Messages SET is_deleted = 0 WHERE id IN (%1);").arg(message_ids.join(", ")); + + if (query_read_msg.exec(sql_delete_query)) { + select(); + fetchAll(); + + emit messageCountsChanged(true); + return true; + } + else { + return false; + } } QVariant MessagesModel::headerData(int section, Qt::Orientation orientation, int role) const { diff --git a/src/core/messagesmodel.h b/src/core/messagesmodel.h index 1421d42bf..3dfcad06e 100644 --- a/src/core/messagesmodel.h +++ b/src/core/messagesmodel.h @@ -113,9 +113,8 @@ class MessagesModel : public QSqlTableModel { void filterMessages(MessageFilter filter); signals: - // Emitted if some persistent change is made which affects - // count of "unread/all" messages. - void feedCountsChanged(bool total_message_number_changed = true); + // Emitted if some persistent change is made which affects count of "unread/all" messages. + void messageCountsChanged(bool total_message_number_changed); protected: // Returns selected feed ids in concatenated textual form, diff --git a/src/gui/feedmessageviewer.cpp b/src/gui/feedmessageviewer.cpp index 596fb1a9f..e550cc41f 100755 --- a/src/gui/feedmessageviewer.cpp +++ b/src/gui/feedmessageviewer.cpp @@ -80,12 +80,8 @@ void FeedMessageViewer::saveSize() { m_feedsView->saveExpandedStates(); // Store offsets of splitters. - settings->setValue(APP_CFG_GUI, - "splitter_feeds", - QString(m_feedSplitter->saveState().toBase64())); - settings->setValue(APP_CFG_GUI, - "splitter_messages", - QString(m_messageSplitter->saveState().toBase64())); + settings->setValue(APP_CFG_GUI, "splitter_feeds", QString(m_feedSplitter->saveState().toBase64())); + settings->setValue(APP_CFG_GUI, "splitter_messages", QString(m_messageSplitter->saveState().toBase64())); // States of splitters are stored, let's store // widths of columns. @@ -93,12 +89,8 @@ void FeedMessageViewer::saveSize() { int width_column_date = m_messagesView->columnWidth(MSG_DB_DCREATED_INDEX); if (width_column_author != 0 && width_column_date != 0) { - settings->setValue(APP_CFG_GUI, - KEY_MESSAGES_VIEW + QString::number(MSG_DB_AUTHOR_INDEX), - width_column_author); - settings->setValue(APP_CFG_GUI, - KEY_MESSAGES_VIEW + QString::number(MSG_DB_DCREATED_INDEX), - width_column_date); + settings->setValue(APP_CFG_GUI, KEY_MESSAGES_VIEW + QString::number(MSG_DB_AUTHOR_INDEX), width_column_author); + settings->setValue(APP_CFG_GUI, KEY_MESSAGES_VIEW + QString::number(MSG_DB_DCREATED_INDEX), width_column_date); } // Store "visibility" of toolbars and list headers. @@ -117,14 +109,12 @@ void FeedMessageViewer::loadSize() { m_messageSplitter->restoreState(QByteArray::fromBase64(settings->value(APP_CFG_GUI, "splitter_messages").toString().toLocal8Bit())); // Splitters are restored, now, restore widths of columns. - m_messagesView->setColumnWidth(MSG_DB_AUTHOR_INDEX, - settings->value(APP_CFG_GUI, - KEY_MESSAGES_VIEW + QString::number(MSG_DB_AUTHOR_INDEX), - default_msg_section_size).toInt()); - m_messagesView->setColumnWidth(MSG_DB_DCREATED_INDEX, - settings->value(APP_CFG_GUI, - KEY_MESSAGES_VIEW + QString::number(MSG_DB_DCREATED_INDEX), - default_msg_section_size).toInt()); + m_messagesView->setColumnWidth(MSG_DB_AUTHOR_INDEX, settings->value(APP_CFG_GUI, + KEY_MESSAGES_VIEW + QString::number(MSG_DB_AUTHOR_INDEX), + default_msg_section_size).toInt()); + m_messagesView->setColumnWidth(MSG_DB_DCREATED_INDEX, settings->value(APP_CFG_GUI, + KEY_MESSAGES_VIEW + QString::number(MSG_DB_DCREATED_INDEX), + default_msg_section_size).toInt()); } void FeedMessageViewer::quit() { @@ -155,8 +145,7 @@ void FeedMessageViewer::setListHeadersEnabled(bool enable) { m_messagesView->header()->setVisible(enable); } -void FeedMessageViewer::updateTrayIconStatus(int unread_messages, - int total_messages) { +void FeedMessageViewer::updateTrayIconStatus(int unread_messages, int total_messages) { Q_UNUSED(total_messages) if (SystemTrayIcon::isSystemTrayActivated()) { @@ -191,10 +180,8 @@ void FeedMessageViewer::createConnections() { FormMain *form_main = qApp->mainForm(); // Filtering & searching. - connect(m_toolBarMessages, SIGNAL(messageSearchPatternChanged(QString)), - m_messagesView, SLOT(searchMessages(QString))); - connect(m_toolBarMessages, SIGNAL(messageFilterChanged(MessagesModel::MessageFilter)), - m_messagesView, SLOT(filterMessages(MessagesModel::MessageFilter))); + connect(m_toolBarMessages, SIGNAL(messageSearchPatternChanged(QString)), m_messagesView, SLOT(searchMessages(QString))); + connect(m_toolBarMessages, SIGNAL(messageFilterChanged(MessagesModel::MessageFilter)), m_messagesView, SLOT(filterMessages(MessagesModel::MessageFilter))); // Message changers. connect(m_messagesView, SIGNAL(currentMessagesRemoved()), m_messagesBrowser, SLOT(clear())); @@ -204,14 +191,14 @@ void FeedMessageViewer::createConnections() { connect(m_feedsView, SIGNAL(feedsSelected(QList)), m_messagesView, SLOT(loadFeeds(QList))); // If user changes status of some messages, recalculate message counts. - connect(m_messagesView, SIGNAL(feedCountsChanged(bool)), m_feedsView, SLOT(updateCountsOfSelectedFeeds(bool))); + connect(m_messagesView, SIGNAL(messageCountsChanged(bool)), m_feedsView, SLOT(updateCountsOfSelectedFeeds(bool))); // State of many messages is changed, then we need // to reload selections. connect(m_feedsView, SIGNAL(feedsNeedToBeReloaded(int)), m_messagesView, SLOT(reloadSelections(int))); // If counts of unread/all messages change, update the tray icon. - connect(m_feedsView, SIGNAL(feedCountsChanged(int,int)), this, SLOT(updateTrayIconStatus(int,int))); + connect(m_feedsView, SIGNAL(messageCountsChanged(int, int)), this, SLOT(updateTrayIconStatus(int, int))); // Message openers. connect(m_messagesView, SIGNAL(openMessagesInNewspaperView(QList)), diff --git a/src/gui/feedsview.h b/src/gui/feedsview.h index 887534bb6..44a21dc5a 100644 --- a/src/gui/feedsview.h +++ b/src/gui/feedsview.h @@ -123,7 +123,7 @@ class FeedsView : public QTreeView { // Notifies other components about messages // counts. inline void notifyWithCounts() { - emit feedCountsChanged(m_sourceModel->countOfUnreadMessages(), m_sourceModel->countOfAllMessages()); + emit messageCountsChanged(m_sourceModel->countOfUnreadMessages(), m_sourceModel->countOfAllMessages()); } // Selects next/previous item (feed/category) in the list. @@ -157,7 +157,7 @@ class FeedsView : public QTreeView { void feedsUpdateRequested(const QList feeds); // Emitted if counts of messages are changed. - void feedCountsChanged(int unread_messages, int total_messages); + void messageCountsChanged(int unread_messages, int total_messages); // Emitted if currently selected feeds needs to be reloaded. void feedsNeedToBeReloaded(int mark_current_index_read); diff --git a/src/gui/messagesview.cpp b/src/gui/messagesview.cpp index 371f65219..68d3453e3 100755 --- a/src/gui/messagesview.cpp +++ b/src/gui/messagesview.cpp @@ -50,7 +50,7 @@ MessagesView::~MessagesView() { void MessagesView::createConnections() { // Forward feed counts changes. - connect(m_sourceModel, SIGNAL(feedCountsChanged(bool)), this, SIGNAL(feedCountsChanged(bool))); + connect(m_sourceModel, SIGNAL(messageCountsChanged(bool)), this, SIGNAL(messageCountsChanged(bool))); // Make sure that source message is opened // in new tab on double click. @@ -368,23 +368,24 @@ void MessagesView::restoreSelectedMessages() { QModelIndexList selected_indexes = selectionModel()->selectedRows(); QModelIndexList mapped_indexes = m_proxyModel->mapListToSource(selected_indexes); - m_sourceModel->setBatchMessagesRestored(mapped_indexes); - sortByColumn(header()->sortIndicatorSection(), header()->sortIndicatorOrder()); + if (m_sourceModel->setBatchMessagesRestored(mapped_indexes)) { + sortByColumn(header()->sortIndicatorSection(), header()->sortIndicatorOrder()); - int row_count = m_sourceModel->rowCount(); - if (row_count > 0) { - QModelIndex last_item = current_index.row() < row_count ? - m_proxyModel->index(current_index.row(), - MSG_DB_TITLE_INDEX) : - m_proxyModel->index(row_count - 1, - MSG_DB_TITLE_INDEX); + int row_count = m_sourceModel->rowCount(); + if (row_count > 0) { + QModelIndex last_item = current_index.row() < row_count ? + m_proxyModel->index(current_index.row(), + MSG_DB_TITLE_INDEX) : + m_proxyModel->index(row_count - 1, + MSG_DB_TITLE_INDEX); - setCurrentIndex(last_item); - scrollTo(last_item); - reselectIndexes(QModelIndexList() << last_item); - } - else { - emit currentMessagesRemoved(); + setCurrentIndex(last_item); + scrollTo(last_item); + reselectIndexes(QModelIndexList() << last_item); + } + else { + emit currentMessagesRemoved(); + } } } diff --git a/src/gui/messagesview.h b/src/gui/messagesview.h index 05aced6b2..15a7cd49a 100755 --- a/src/gui/messagesview.h +++ b/src/gui/messagesview.h @@ -115,7 +115,7 @@ class MessagesView : public QTreeView { // Emitted if counts of unread/total messages has changed // because of user interaction with list of messages. - void feedCountsChanged(bool total_message_number_changed = true); + void messageCountsChanged(bool total_message_number_changed); private: QMenu *m_contextMenu;