@@ -817,26 +817,45 @@ void MainWindow::updateCopyAttributesMenu()
817
817
818
818
void MainWindow::updateSetTagsMenu ()
819
819
{
820
- // Remove all existing actions
821
- m_ui->menuTags ->clear ();
820
+ auto actionForTag = [](const QMenu* menu, const QString& tag) -> QAction* {
821
+ for (const auto action : menu->actions ()) {
822
+ if (action->text () == tag) {
823
+ return action;
824
+ }
825
+ }
826
+ return nullptr ;
827
+ };
822
828
823
829
auto dbWidget = m_ui->tabWidget ->currentDatabaseWidget ();
824
830
if (dbWidget) {
825
831
// Enumerate tags applied to the selected entries
826
832
QSet<QString> selectedTags;
827
- for (auto entry : dbWidget->entryView ()->selectedEntries ()) {
828
- for (auto tag : entry->tagList ()) {
833
+ for (const auto entry : dbWidget->entryView ()->selectedEntries ()) {
834
+ for (const auto & tag : entry->tagList ()) {
829
835
selectedTags.insert (tag);
830
836
}
831
837
}
832
838
833
839
// Add known database tags as actions and set checked if
834
840
// a selected entry has that tag
835
- for (auto tag : dbWidget->database ()->tagList ()) {
836
- auto action = m_ui->menuTags ->addAction (icons ()->icon (" tag" ), tag);
837
- action->setCheckable (true );
838
- action->setChecked (selectedTags.contains (tag));
839
- m_setTagsMenuActions->addAction (action);
841
+ const auto tagList = dbWidget->database ()->tagList ();
842
+ for (const auto & tag : tagList) {
843
+ auto action = actionForTag (m_ui->menuTags , tag);
844
+ if (action) {
845
+ action->setChecked (selectedTags.contains (tag));
846
+ } else {
847
+ action = m_ui->menuTags ->addAction (icons ()->icon (" tag" ), tag);
848
+ action->setCheckable (true );
849
+ action->setChecked (selectedTags.contains (tag));
850
+ m_setTagsMenuActions->addAction (action);
851
+ }
852
+ }
853
+
854
+ // Remove missing tags
855
+ for (const auto action : m_ui->menuTags ->actions ()) {
856
+ if (!tagList.contains (action->text ())) {
857
+ action->deleteLater ();
858
+ }
840
859
}
841
860
}
842
861
@@ -942,6 +961,14 @@ void MainWindow::updateMenuActionState()
942
961
m_ui->menuEntryCopyAttribute ->setEnabled (singleEntryOrEditing);
943
962
m_ui->menuEntryTotp ->setEnabled (singleEntrySelected);
944
963
m_ui->menuTags ->setEnabled (multiEntrySelected);
964
+ // Handle tear-off tags menu
965
+ if (m_ui->menuTags ->isTearOffMenuVisible ()) {
966
+ if (!databaseUnlocked) {
967
+ m_ui->menuTags ->hideTearOffMenu ();
968
+ } else {
969
+ updateSetTagsMenu ();
970
+ }
971
+ }
945
972
m_ui->actionEntryAutoType ->setEnabled (singleEntrySelected && dbWidget->currentEntryHasAutoTypeEnabled ());
946
973
m_ui->actionEntryAutoType ->menu ()->setEnabled (singleEntrySelected && dbWidget->currentEntryHasAutoTypeEnabled ());
947
974
m_ui->actionEntryAutoTypeSequence ->setText (singleEntrySelected
0 commit comments