@@ -856,26 +856,45 @@ void MainWindow::updateCopyAttributesMenu()
856
856
857
857
void MainWindow::updateSetTagsMenu ()
858
858
{
859
- // Remove all existing actions
860
- m_ui->menuTags ->clear ();
859
+ auto actionForTag = [](const QMenu* menu, const QString& tag) -> QAction* {
860
+ for (const auto action : menu->actions ()) {
861
+ if (action->text () == tag) {
862
+ return action;
863
+ }
864
+ }
865
+ return nullptr ;
866
+ };
861
867
862
868
auto dbWidget = m_ui->tabWidget ->currentDatabaseWidget ();
863
869
if (dbWidget) {
864
870
// Enumerate tags applied to the selected entries
865
871
QSet<QString> selectedTags;
866
- for (auto entry : dbWidget->entryView ()->selectedEntries ()) {
867
- for (auto tag : entry->tagList ()) {
872
+ for (const auto entry : dbWidget->entryView ()->selectedEntries ()) {
873
+ for (const auto & tag : entry->tagList ()) {
868
874
selectedTags.insert (tag);
869
875
}
870
876
}
871
877
872
878
// Add known database tags as actions and set checked if
873
879
// a selected entry has that tag
874
- for (auto tag : dbWidget->database ()->tagList ()) {
875
- auto action = m_ui->menuTags ->addAction (icons ()->icon (" tag" ), tag);
876
- action->setCheckable (true );
877
- action->setChecked (selectedTags.contains (tag));
878
- m_setTagsMenuActions->addAction (action);
880
+ const auto tagList = dbWidget->database ()->tagList ();
881
+ for (const auto & tag : tagList) {
882
+ auto action = actionForTag (m_ui->menuTags , tag);
883
+ if (action) {
884
+ action->setChecked (selectedTags.contains (tag));
885
+ } else {
886
+ action = m_ui->menuTags ->addAction (icons ()->icon (" tag" ), tag);
887
+ action->setCheckable (true );
888
+ action->setChecked (selectedTags.contains (tag));
889
+ m_setTagsMenuActions->addAction (action);
890
+ }
891
+ }
892
+
893
+ // Remove missing tags
894
+ for (const auto action : m_ui->menuTags ->actions ()) {
895
+ if (!tagList.contains (action->text ())) {
896
+ action->deleteLater ();
897
+ }
879
898
}
880
899
}
881
900
@@ -981,6 +1000,14 @@ void MainWindow::updateMenuActionState()
981
1000
m_ui->menuEntryCopyAttribute ->setEnabled (singleEntryOrEditing);
982
1001
m_ui->menuEntryTotp ->setEnabled (singleEntrySelected);
983
1002
m_ui->menuTags ->setEnabled (multiEntrySelected);
1003
+ // Handle tear-off tags menu
1004
+ if (m_ui->menuTags ->isTearOffMenuVisible ()) {
1005
+ if (!databaseUnlocked) {
1006
+ m_ui->menuTags ->hideTearOffMenu ();
1007
+ } else {
1008
+ updateSetTagsMenu ();
1009
+ }
1010
+ }
984
1011
m_ui->actionEntryAutoType ->setEnabled (singleEntrySelected && dbWidget->currentEntryHasAutoTypeEnabled ());
985
1012
m_ui->actionEntryAutoType ->menu ()->setEnabled (singleEntrySelected && dbWidget->currentEntryHasAutoTypeEnabled ());
986
1013
m_ui->actionEntryAutoTypeSequence ->setText (singleEntrySelected
0 commit comments