diff --git a/resources/graphics/icons/mini-kfaenza/recycle-bin-empty.png b/resources/graphics/icons/mini-kfaenza/recycle-bin-empty.png index acbc49820..ab34ad257 100644 Binary files a/resources/graphics/icons/mini-kfaenza/recycle-bin-empty.png and b/resources/graphics/icons/mini-kfaenza/recycle-bin-empty.png differ diff --git a/resources/graphics/icons/mini-kfaenza/recycle-bin-restore-all.png b/resources/graphics/icons/mini-kfaenza/recycle-bin-restore-all.png new file mode 100644 index 000000000..cd9f6d9f9 Binary files /dev/null and b/resources/graphics/icons/mini-kfaenza/recycle-bin-restore-all.png differ diff --git a/resources/graphics/icons/mini-kfaenza/recycle-bin-restore.png b/resources/graphics/icons/mini-kfaenza/recycle-bin-restore-one.png similarity index 100% rename from resources/graphics/icons/mini-kfaenza/recycle-bin-restore.png rename to resources/graphics/icons/mini-kfaenza/recycle-bin-restore-one.png diff --git a/src/core/messagesmodel.cpp b/src/core/messagesmodel.cpp index d4180080c..8e4bb6d15 100755 --- a/src/core/messagesmodel.cpp +++ b/src/core/messagesmodel.cpp @@ -365,7 +365,7 @@ bool MessagesModel::setBatchMessagesDeleted(const QModelIndexList &messages, int 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)); + QString::number(deleted)); } else { sql_delete_query = QString("DELETE FROM Messages WHERE id in (%1);").arg(message_ids.join(", ")); @@ -408,6 +408,14 @@ 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 + // se zmenily nejen ve vybranych kanalech (je vybran odkadkovy kos) ale v kanalech do kterych patri + return true; +} + QVariant MessagesModel::headerData(int section, Qt::Orientation orientation, int role) const { Q_UNUSED(orientation) diff --git a/src/core/messagesmodel.h b/src/core/messagesmodel.h index ce4da6515..1421d42bf 100644 --- a/src/core/messagesmodel.h +++ b/src/core/messagesmodel.h @@ -102,6 +102,7 @@ class MessagesModel : public QSqlTableModel { bool switchBatchMessageImportance(const QModelIndexList &messages); bool setBatchMessagesDeleted(const QModelIndexList &messages, int deleted); bool setBatchMessagesRead(const QModelIndexList &messages, int read); + bool setBatchMessagesRestored(const QModelIndexList &messages); // Fetches ALL available data to the model. void fetchAll(); diff --git a/src/gui/feedmessageviewer.cpp b/src/gui/feedmessageviewer.cpp index f8f6aea8e..637e6e0af 100755 --- a/src/gui/feedmessageviewer.cpp +++ b/src/gui/feedmessageviewer.cpp @@ -235,6 +235,8 @@ void FeedMessageViewer::createConnections() { SIGNAL(triggered()), m_messagesView, SLOT(switchSelectedMessagesImportance())); connect(form_main->m_ui->m_actionDeleteSelectedMessages, SIGNAL(triggered()), m_messagesView, SLOT(deleteSelectedMessages())); + connect(form_main->m_ui->m_actionRestoreSelectedMessagesFromRecycleBin, + SIGNAL(triggered()), m_messagesView, SLOT(restoreSelectedMessages())); connect(form_main->m_ui->m_actionMarkSelectedMessagesAsRead, SIGNAL(triggered()), m_messagesView, SLOT(markSelectedMessagesRead())); connect(form_main->m_ui->m_actionMarkSelectedMessagesAsUnread, @@ -269,7 +271,7 @@ void FeedMessageViewer::createConnections() { SIGNAL(triggered()), m_feedsView, SLOT(openSelectedFeedsInNewspaperMode())); connect(form_main->m_ui->m_actionEmptyRecycleBin, SIGNAL(triggered()), m_feedsView, SLOT(emptyRecycleBin())); - connect(form_main->m_ui->m_actionRestoreAllMessages, + connect(form_main->m_ui->m_actionRestoreRecycleBin, SIGNAL(triggered()), m_feedsView, SLOT(restoreRecycleBin())); connect(form_main->m_ui->m_actionDeleteSelectedFeedCategory, SIGNAL(triggered()), m_feedsView, SLOT(deleteSelectedItem())); diff --git a/src/gui/feedsview.cpp b/src/gui/feedsview.cpp index b800c583f..c192500b9 100755 --- a/src/gui/feedsview.cpp +++ b/src/gui/feedsview.cpp @@ -521,7 +521,7 @@ void FeedsView::initializeContextMenuEmptySpace() { void FeedsView::initializeContextMenuRecycleBin() { m_contextMenuRecycleBin = new QMenu(tr("Context menu for recycle bin"), this); m_contextMenuRecycleBin->addActions(QList() << - qApp->mainForm()->m_ui->m_actionRestoreAllMessages << + qApp->mainForm()->m_ui->m_actionRestoreRecycleBin << qApp->mainForm()->m_ui->m_actionEmptyRecycleBin); } diff --git a/src/gui/formmain.cpp b/src/gui/formmain.cpp index 40278b747..78423ca7d 100755 --- a/src/gui/formmain.cpp +++ b/src/gui/formmain.cpp @@ -127,7 +127,7 @@ QList FormMain::allActions() { actions << m_ui->m_actionDefragmentDatabase; // Add recycle bin actions. - actions << m_ui->m_actionRestoreAllMessages; + actions << m_ui->m_actionRestoreRecycleBin; actions << m_ui->m_actionEmptyRecycleBin; return actions; @@ -222,7 +222,8 @@ void FormMain::setupIcons() { // Recycle bin. m_ui->m_actionEmptyRecycleBin->setIcon(icon_theme_factory->fromTheme("recycle-bin-empty")); - m_ui->m_actionRestoreAllMessages->setIcon(icon_theme_factory->fromTheme("recycle-bin-restore")); + m_ui->m_actionRestoreRecycleBin->setIcon(icon_theme_factory->fromTheme("recycle-bin-restore-all")); + m_ui->m_actionRestoreSelectedMessagesFromRecycleBin->setIcon(icon_theme_factory->fromTheme("recycle-bin-restore-one")); // Web browser. m_ui->m_actionAddBrowser->setIcon(icon_theme_factory->fromTheme("list-add")); diff --git a/src/gui/formmain.ui b/src/gui/formmain.ui index 286b079de..959065135 100755 --- a/src/gui/formmain.ui +++ b/src/gui/formmain.ui @@ -170,7 +170,8 @@ &Recycle bin - + + @@ -598,11 +599,16 @@ &Empty recycle bin - + &Restore all messages + + + Restore &selected messages + + diff --git a/src/gui/messagesview.cpp b/src/gui/messagesview.cpp index e48e7bd40..371f65219 100755 --- a/src/gui/messagesview.cpp +++ b/src/gui/messagesview.cpp @@ -155,7 +155,8 @@ void MessagesView::initializeContextMenu() { qApp->mainForm()->m_ui->m_actionMarkSelectedMessagesAsRead << qApp->mainForm()->m_ui->m_actionMarkSelectedMessagesAsUnread << qApp->mainForm()->m_ui->m_actionSwitchImportanceOfSelectedMessages << - qApp->mainForm()->m_ui->m_actionDeleteSelectedMessages); + qApp->mainForm()->m_ui->m_actionDeleteSelectedMessages << + qApp->mainForm()->m_ui->m_actionRestoreSelectedMessagesFromRecycleBin); } void MessagesView::mousePressEvent(QMouseEvent *event) { @@ -357,6 +358,36 @@ void MessagesView::deleteSelectedMessages() { } } +void MessagesView::restoreSelectedMessages() { + QModelIndex current_index = selectionModel()->currentIndex(); + + if (!current_index.isValid()) { + return; + } + + QModelIndexList selected_indexes = selectionModel()->selectedRows(); + QModelIndexList mapped_indexes = m_proxyModel->mapListToSource(selected_indexes); + + 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); + + setCurrentIndex(last_item); + scrollTo(last_item); + reselectIndexes(QModelIndexList() << last_item); + } + else { + emit currentMessagesRemoved(); + } +} + void MessagesView::switchSelectedMessagesImportance() { QModelIndex current_index = selectionModel()->currentIndex(); diff --git a/src/gui/messagesview.h b/src/gui/messagesview.h index edd7e1bf5..05aced6b2 100755 --- a/src/gui/messagesview.h +++ b/src/gui/messagesview.h @@ -74,6 +74,7 @@ class MessagesView : public QTreeView { void markSelectedMessagesUnread(); void switchSelectedMessagesImportance(); void deleteSelectedMessages(); + void restoreSelectedMessages(); void selectNextItem(); void selectPreviousItem();