Skip to content

Commit

Permalink
Support tearing off tags menu
Browse files Browse the repository at this point in the history
* Closes #11649 - tags menu can be torn off to set and unset tags without having to dive into the context menu every time.

* Tags menu will hide when database is locked or view is switched away from the main database view (eg, settings)
  • Loading branch information
droidmonkey committed Jan 12, 2025
1 parent f3b0810 commit bcb0437
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 3 deletions.
14 changes: 11 additions & 3 deletions src/gui/MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -820,15 +820,15 @@ void MainWindow::updateSetTagsMenu()
if (dbWidget) {
// Enumerate tags applied to the selected entries
QSet<QString> selectedTags;
for (auto entry : dbWidget->entryView()->selectedEntries()) {
for (auto tag : entry->tagList()) {
for (const auto entry : dbWidget->entryView()->selectedEntries()) {
for (const auto& tag : entry->tagList()) {
selectedTags.insert(tag);
}
}

// Add known database tags as actions and set checked if
// a selected entry has that tag
for (auto tag : dbWidget->database()->tagList()) {
for (const auto& tag : dbWidget->database()->tagList()) {
auto action = m_ui->menuTags->addAction(icons()->icon("tag"), tag);
action->setCheckable(true);
action->setChecked(selectedTags.contains(tag));
Expand Down Expand Up @@ -938,6 +938,14 @@ void MainWindow::updateMenuActionState()
m_ui->menuEntryCopyAttribute->setEnabled(singleEntryOrEditing);
m_ui->menuEntryTotp->setEnabled(singleEntrySelected);
m_ui->menuTags->setEnabled(multiEntrySelected);
// Handle tear-off tags menu
if (m_ui->menuTags->menuAction()->isVisible()) {
if (!databaseUnlocked) {
m_ui->menuTags->hideTearOffMenu();
} else {
updateSetTagsMenu();
}
}
m_ui->actionEntryAutoType->setEnabled(singleEntrySelected && dbWidget->currentEntryHasAutoTypeEnabled());
m_ui->actionEntryAutoType->menu()->setEnabled(singleEntrySelected && dbWidget->currentEntryHasAutoTypeEnabled());
m_ui->actionEntryAutoTypeSequence->setText(singleEntrySelected
Expand Down
3 changes: 3 additions & 0 deletions src/gui/MainWindow.ui
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,9 @@
<addaction name="actionEntrySetupTotp"/>
</widget>
<widget class="QMenu" name="menuTags">
<property name="tearOffEnabled">
<bool>true</bool>
</property>
<property name="title">
<string>Tags</string>
</property>
Expand Down
14 changes: 14 additions & 0 deletions src/gui/styles/base/BaseStyle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2636,7 +2636,21 @@ void BaseStyle::drawControl(ControlElement element,
}
break;
}
case CE_MenuTearoff: {
if (option->state & State_Selected) {
painter->fillRect(option->rect, option->palette.brush(QPalette::Highlight));
painter->setPen(QPen(option->palette.highlightedText().color(), 1, Qt::DashLine));
} else {
painter->fillRect(option->rect, option->palette.brush(QPalette::Button));
painter->setPen(QPen(option->palette.buttonText().color(), 1, Qt::DashLine));
}

painter->drawLine(option->rect.x() + 2,
option->rect.y() + option->rect.height() / 2,
option->rect.x() + option->rect.width() - 4,
option->rect.y() + option->rect.height() / 2);
break;
}
case CE_MenuItem: {
auto menuItem = qstyleoption_cast<const QStyleOptionMenuItem*>(option);
if (!menuItem)
Expand Down

0 comments on commit bcb0437

Please sign in to comment.