diff options
author | Janek Bevendorff <janek@jbev.net> | 2021-11-10 03:09:30 +0300 |
---|---|---|
committer | Janek Bevendorff <janek@jbev.net> | 2021-11-22 14:58:04 +0300 |
commit | 70e62d90db5510143a786d08cb4ce590fe7c0658 (patch) | |
tree | 482c1b666cb2303de4e190084e749e6ce9362933 /src/gui | |
parent | e5822974ac580c0dc3cf3eeea250235453c1f3ae (diff) |
Add "Restore Entries" feature
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/DatabaseWidget.cpp | 20 | ||||
-rw-r--r-- | src/gui/DatabaseWidget.h | 1 | ||||
-rw-r--r-- | src/gui/MainWindow.cpp | 10 | ||||
-rw-r--r-- | src/gui/MainWindow.ui | 18 |
4 files changed, 48 insertions, 1 deletions
diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 6d88a6613..1183810b3 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -475,6 +475,26 @@ void DatabaseWidget::deleteSelectedEntries() deleteEntries(std::move(selectedEntries)); } +void DatabaseWidget::restoreSelectedEntries() +{ + const QModelIndexList selected = m_entryView->selectionModel()->selectedRows(); + if (selected.isEmpty()) { + return; + } + + // Resolve entries from the selection model + QList<Entry*> selectedEntries; + for (auto& index : selected) { + selectedEntries.append(m_entryView->entryFromIndex(index)); + } + + for (auto* entry : selectedEntries) { + if (entry->previousParentGroup()) { + entry->setGroup(entry->previousParentGroup()); + } + } +} + void DatabaseWidget::deleteEntries(QList<Entry*> selectedEntries, bool confirm) { if (selectedEntries.isEmpty()) { diff --git a/src/gui/DatabaseWidget.h b/src/gui/DatabaseWidget.h index 3909dfd77..c329b98fa 100644 --- a/src/gui/DatabaseWidget.h +++ b/src/gui/DatabaseWidget.h @@ -164,6 +164,7 @@ public slots: void createEntry(); void cloneEntry(); void deleteSelectedEntries(); + void restoreSelectedEntries(); void deleteEntries(QList<Entry*> entries, bool confirm = true); void focusOnEntries(bool editIfFocused = false); void focusOnGroups(bool editIfFocused = false); diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 1f99448b1..5aa39ad58 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -129,6 +129,7 @@ MainWindow::MainWindow() m_countDefaultAttributes = m_ui->menuEntryCopyAttribute->actions().size(); m_entryContextMenu = new QMenu(this); + m_entryContextMenu->setSeparatorsCollapsible(true); m_entryContextMenu->addAction(m_ui->actionEntryCopyUsername); m_entryContextMenu->addAction(m_ui->actionEntryCopyPassword); m_entryContextMenu->addAction(m_ui->menuEntryCopyAttribute->menuAction()); @@ -146,6 +147,8 @@ MainWindow::MainWindow() m_entryContextMenu->addSeparator(); m_entryContextMenu->addAction(m_ui->actionEntryOpenUrl); m_entryContextMenu->addAction(m_ui->actionEntryDownloadIcon); + m_entryContextMenu->addSeparator(); + m_entryContextMenu->addAction(m_ui->actionEntryRestore); m_entryNewContextMenu = new QMenu(this); m_entryNewContextMenu->addAction(m_ui->actionEntryNew); @@ -275,6 +278,7 @@ MainWindow::MainWindow() m_ui->actionEntryAutoTypeSequence->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_V); m_ui->actionEntryOpenUrl->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_U); m_ui->actionEntryCopyURL->setShortcut(Qt::CTRL + Qt::Key_U); + m_ui->actionEntryRestore->setShortcut(Qt::CTRL + Qt::Key_R); // Prevent conflicts with global Mac shortcuts (force Control on all platforms) #ifdef Q_OS_MAC @@ -291,6 +295,7 @@ MainWindow::MainWindow() m_ui->actionEntryNew->setShortcutVisibleInContextMenu(true); m_ui->actionEntryEdit->setShortcutVisibleInContextMenu(true); m_ui->actionEntryDelete->setShortcutVisibleInContextMenu(true); + m_ui->actionEntryRestore->setShortcutVisibleInContextMenu(true); m_ui->actionEntryClone->setShortcutVisibleInContextMenu(true); m_ui->actionEntryTotp->setShortcutVisibleInContextMenu(true); m_ui->actionEntryDownloadIcon->setShortcutVisibleInContextMenu(true); @@ -374,6 +379,7 @@ MainWindow::MainWindow() m_ui->actionEntryClone->setIcon(icons()->icon("entry-clone")); m_ui->actionEntryEdit->setIcon(icons()->icon("entry-edit")); m_ui->actionEntryDelete->setIcon(icons()->icon("entry-delete")); + m_ui->actionEntryRestore->setIcon(icons()->icon("entry-restore")); m_ui->actionEntryAutoType->setIcon(icons()->icon("auto-type")); m_ui->actionEntryAutoTypeSequence->setIcon(icons()->icon("auto-type")); m_ui->actionEntryAutoTypeUsername->setIcon(icons()->icon("auto-type")); @@ -461,6 +467,7 @@ MainWindow::MainWindow() m_actionMultiplexer.connect(m_ui->actionEntryClone, SIGNAL(triggered()), SLOT(cloneEntry())); m_actionMultiplexer.connect(m_ui->actionEntryEdit, SIGNAL(triggered()), SLOT(switchToEntryEdit())); m_actionMultiplexer.connect(m_ui->actionEntryDelete, SIGNAL(triggered()), SLOT(deleteSelectedEntries())); + m_actionMultiplexer.connect(m_ui->actionEntryRestore, SIGNAL(triggered()), SLOT(restoreSelectedEntries())); m_actionMultiplexer.connect(m_ui->actionEntryTotp, SIGNAL(triggered()), SLOT(showTotp())); m_actionMultiplexer.connect(m_ui->actionEntrySetupTotp, SIGNAL(triggered()), SLOT(setupTotp())); @@ -800,6 +807,9 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode) m_ui->actionEntryClone->setEnabled(singleEntrySelected); m_ui->actionEntryEdit->setEnabled(singleEntrySelected); m_ui->actionEntryDelete->setEnabled(entriesSelected); + m_ui->actionEntryRestore->setVisible(entriesSelected && recycleBinSelected); + m_ui->actionEntryRestore->setEnabled(entriesSelected && recycleBinSelected); + m_ui->actionEntryRestore->setText(tr("Restore Entry(s)", "", dbWidget->numberOfSelectedEntries())); m_ui->actionEntryMoveUp->setVisible(!sorted); m_ui->actionEntryMoveDown->setVisible(!sorted); m_ui->actionEntryMoveUp->setEnabled(singleEntrySelected && !sorted && entryIndex > 0); diff --git a/src/gui/MainWindow.ui b/src/gui/MainWindow.ui index 8b36b97aa..f83e8077d 100644 --- a/src/gui/MainWindow.ui +++ b/src/gui/MainWindow.ui @@ -216,7 +216,7 @@ <x>0</x> <y>0</y> <width>800</width> - <height>22</height> + <height>21</height> </rect> </property> <property name="contextMenuPolicy"> @@ -283,6 +283,9 @@ <property name="title"> <string>&Entries</string> </property> + <property name="separatorsCollapsible"> + <bool>true</bool> + </property> <widget class="QMenu" name="menuEntryCopyAttribute"> <property name="enabled"> <bool>false</bool> @@ -330,6 +333,8 @@ <addaction name="separator"/> <addaction name="actionEntryAddToAgent"/> <addaction name="actionEntryRemoveFromAgent"/> + <addaction name="separator"/> + <addaction name="actionEntryRestore"/> </widget> <widget class="QMenu" name="menuGroups"> <property name="title"> @@ -1068,6 +1073,17 @@ <string>Clone Group...</string> </property> </action> + <action name="actionEntryRestore"> + <property name="text"> + <string>Restore Entry(s)</string> + </property> + <property name="toolTip"> + <string>Restore Entry(s)</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+R</string> + </property> + </action> </widget> <customwidgets> <customwidget> |