From ebf83fc88624e99c11a0e997d6f27af583735390 Mon Sep 17 00:00:00 2001 From: Jonathan White Date: Sun, 12 Feb 2023 15:59:03 -0500 Subject: [PATCH 1/6] Enable buddy fields in group and entry edit pages * Fixes #9060 * You can now press Alt + [letter] to skip between fields on the group and entry edit pages. * Also move the expire checkbox to the right hand column and use the standard eye icon button for notes reveal. Only show notes reveal button if the hide notes setting is enabled. --- share/translations/keepassxc_en.ts | 40 ++-- src/gui/entry/EditEntryWidget.cpp | 8 +- src/gui/entry/EditEntryWidgetMain.ui | 269 ++++++++++++++++----------- 3 files changed, 180 insertions(+), 137 deletions(-) diff --git a/share/translations/keepassxc_en.ts b/share/translations/keepassxc_en.ts index d4a880dfee..c4c0e95cdd 100644 --- a/share/translations/keepassxc_en.ts +++ b/share/translations/keepassxc_en.ts @@ -2840,84 +2840,80 @@ Would you like to correct it? Notes field - - Toggle the checkbox to reveal the notes section. - - Username field - Toggle notes visible + Expiration field - Notes: + Expiration Presets - Expiration field + Expiration presets - Expiration Presets + Presets - Expiration presets + Url field - Presets + Download favicon for URL - Password: + Title field - URL: + Password field - Url field + Toggle expiration - Download favicon for URL + Tags list - Title: + &Username: - Title field + &Title: - Username: + &Password: - Password field + UR&L: - Toggle expiration + &Notes: - Expires: + Toggle notes visibility - Tags: + T&ags: - Tags list + &Expires: diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index b2977d6fd7..af28bab680 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -168,7 +168,7 @@ void EditEntryWidget::setupMain() } }); - connect(m_mainUi->notesEnabled, SIGNAL(toggled(bool)), this, SLOT(toggleHideNotes(bool))); + connect(m_mainUi->revealNotesButton, &QToolButton::clicked, this, &EditEntryWidget::toggleHideNotes); m_mainUi->expirePresets->setMenu(createPresetsMenu()); connect(m_mainUi->expirePresets->menu(), SIGNAL(triggered(QAction*)), this, SLOT(useExpiryPreset(QAction*))); @@ -839,7 +839,7 @@ void EditEntryWidget::useExpiryPreset(QAction* action) void EditEntryWidget::toggleHideNotes(bool visible) { m_mainUi->notesEdit->setVisible(visible); - m_mainUi->notesHint->setVisible(!visible); + m_mainUi->revealNotesButton->setIcon(icons()->onOffIcon("password-show", visible)); } Entry* EditEntryWidget::currentEntry() const @@ -898,10 +898,10 @@ void EditEntryWidget::setForms(Entry* entry, bool restore) m_mainUi->tagsList->completion(m_db->tagList()); m_mainUi->expireCheck->setEnabled(!m_history); m_mainUi->expireDatePicker->setReadOnly(m_history); - m_mainUi->notesEnabled->setChecked(!config()->get(Config::Security_HideNotes).toBool()); + m_mainUi->revealNotesButton->setIcon(icons()->onOffIcon("password-show", false)); + m_mainUi->revealNotesButton->setVisible(config()->get(Config::Security_HideNotes).toBool()); m_mainUi->notesEdit->setReadOnly(m_history); m_mainUi->notesEdit->setVisible(!config()->get(Config::Security_HideNotes).toBool()); - m_mainUi->notesHint->setVisible(config()->get(Config::Security_HideNotes).toBool()); if (config()->get(Config::GUI_MonospaceNotes).toBool()) { m_mainUi->notesEdit->setFont(Font::fixedFont()); } else { diff --git a/src/gui/entry/EditEntryWidgetMain.ui b/src/gui/entry/EditEntryWidgetMain.ui index 19dbf31fde..6fe6637e76 100644 --- a/src/gui/entry/EditEntryWidgetMain.ui +++ b/src/gui/entry/EditEntryWidgetMain.ui @@ -6,7 +6,7 @@ 0 0 - 539 + 400 523 @@ -33,11 +33,11 @@ 0 0 - 539 + 400 523 - + 0 @@ -56,7 +56,37 @@ 8 - + + + + Title field + + + + + + + &Username: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + usernameComboBox + + + + + + + Qt::StrongFocus + + + Password field + + + + @@ -77,21 +107,34 @@ - - - - true - - - Toggle the checkbox to reveal the notes section. - - - Qt::AlignTop - - - + + + + &Title: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + titleEdit + + + + + + + &Password: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + passwordEdit + + + @@ -99,41 +142,34 @@ - - + + + + Qt::StrongFocus + + + Tags list + + + + + + + 8 + - + - Toggle notes visible + Toggle expiration - Toggle notes visible + Toggle expiration - Notes: + - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - 8 - @@ -168,24 +204,17 @@ - - - - Password: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - URL: + UR&L: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + urlEdit + @@ -215,80 +244,98 @@ - - - - Title: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - Title field - - - - - - - Username: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - Qt::StrongFocus - - - Password field - - - - - - - 0 - + + - - - Toggle expiration + + + &Notes: - - Toggle expiration + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - Expires: + + notesEdit + + + + 6 + + + + + Qt::Horizontal + + + + 5 + 20 + + + + + + + + Toggle notes visibility + + + Toggle notes visibility + + + + 14 + 14 + + + + true + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + - Tags: + T&ags: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + tagsList + - - - - Qt::StrongFocus + + + + &Expires: - - Tags list + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + expireCheck @@ -325,7 +372,7 @@ expireCheck expireDatePicker expirePresets - notesEnabled + revealNotesButton notesEdit From a1da8195cf5eeee5700d2b32265d5d2056f0806f Mon Sep 17 00:00:00 2001 From: Jonathan White Date: Sun, 12 Feb 2023 16:00:50 -0500 Subject: [PATCH 2/6] Fix overflow of text in default auto-type sequence preview * Fixes #9083 --- src/gui/EntryPreviewWidget.ui | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/gui/EntryPreviewWidget.ui b/src/gui/EntryPreviewWidget.ui index 6e0ce5ec99..c251da3f51 100644 --- a/src/gui/EntryPreviewWidget.ui +++ b/src/gui/EntryPreviewWidget.ui @@ -6,7 +6,7 @@ 0 0 - 508 + 530 257 @@ -177,7 +177,7 @@ - 0 + 2 false @@ -753,7 +753,7 @@ Default Sequence - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing @@ -771,6 +771,9 @@ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + true + From a8f668cdb1f3f35a6afb4a23368cbd555ac2ce6a Mon Sep 17 00:00:00 2001 From: Jonathan White Date: Mon, 13 Feb 2023 23:47:52 -0500 Subject: [PATCH 3/6] Add copy title shortcut (Ctrl + I) * Closes #9109 --- src/gui/MainWindow.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index ea2ab4fc3e..dd6aed185f 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -289,6 +289,7 @@ MainWindow::MainWindow() m_ui->actionEntryMoveDown->setShortcut(Qt::CTRL + Qt::ALT + Qt::Key_Down); m_ui->actionEntryCopyUsername->setShortcut(Qt::CTRL + Qt::Key_B); m_ui->actionEntryCopyPassword->setShortcut(Qt::CTRL + Qt::Key_C); + m_ui->actionEntryCopyTitle->setShortcut(Qt::CTRL + Qt::Key_I); 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); @@ -322,6 +323,7 @@ MainWindow::MainWindow() m_ui->actionEntryAutoTypeSequence->setShortcutVisibleInContextMenu(true); m_ui->actionEntryOpenUrl->setShortcutVisibleInContextMenu(true); m_ui->actionEntryCopyURL->setShortcutVisibleInContextMenu(true); + m_ui->actionEntryCopyTitle->setShortcutVisibleInContextMenu(true); m_ui->actionEntryAddToAgent->setShortcutVisibleInContextMenu(true); m_ui->actionEntryRemoveFromAgent->setShortcutVisibleInContextMenu(true); #endif From 6c0283217d4e81f32351a111049cefcf5090083c Mon Sep 17 00:00:00 2001 From: Jonathan White Date: Sun, 19 Feb 2023 06:28:38 -0800 Subject: [PATCH 4/6] Fix issues with menu actions being enabled incorrectly --- src/gui/MainWindow.cpp | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index dd6aed185f..1460c9db12 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -146,6 +146,9 @@ MainWindow::MainWindow() m_entryContextMenu->addAction(m_ui->actionEntryOpenUrl); m_entryContextMenu->addAction(m_ui->actionEntryDownloadIcon); m_entryContextMenu->addSeparator(); + m_entryContextMenu->addAction(m_ui->actionEntryAddToAgent); + m_entryContextMenu->addAction(m_ui->actionEntryRemoveFromAgent); + m_entryContextMenu->addSeparator(); m_entryContextMenu->addAction(m_ui->actionEntryRestore); m_entryNewContextMenu = new QMenu(this); @@ -192,18 +195,8 @@ MainWindow::MainWindow() connect(sshAgent(), SIGNAL(error(QString)), this, SLOT(showErrorMessage(QString))); connect(sshAgent(), SIGNAL(enabledChanged(bool)), this, SLOT(agentEnabled(bool))); m_ui->settingsWidget->addSettingsPage(new AgentSettingsPage()); - - m_entryContextMenu->addSeparator(); - m_entryContextMenu->addAction(m_ui->actionEntryAddToAgent); - m_entryContextMenu->addAction(m_ui->actionEntryRemoveFromAgent); - - m_ui->actionEntryAddToAgent->setIcon(icons()->icon("utilities-terminal")); - m_ui->actionEntryRemoveFromAgent->setIcon(icons()->icon("utilities-terminal")); #endif - m_ui->actionEntryAddToAgent->setVisible(false); - m_ui->actionEntryRemoveFromAgent->setVisible(false); - initViewMenu(); #if defined(WITH_XC_KEESHARE) @@ -418,6 +411,8 @@ MainWindow::MainWindow() m_ui->actionEntryCopyPasswordTotp->setIcon(icons()->icon("totp-copy-password")); m_ui->actionEntryTotpQRCode->setIcon(icons()->icon("qrcode")); m_ui->actionEntrySetupTotp->setIcon(icons()->icon("totp-edit")); + m_ui->actionEntryAddToAgent->setIcon(icons()->icon("utilities-terminal")); + m_ui->actionEntryRemoveFromAgent->setIcon(icons()->icon("utilities-terminal")); m_ui->menuTags->setIcon(icons()->icon("tag-multiple")); m_ui->actionEntryDownloadIcon->setIcon(icons()->icon("favicon-download")); m_ui->actionGroupSortAsc->setIcon(icons()->icon("sort-alphabetical-ascending")); @@ -697,6 +692,7 @@ MainWindow::MainWindow() statusBar()->addPermanentWidget(m_statusBarLabel); restoreConfigState(); + setMenuActionState(); } MainWindow::~MainWindow() @@ -887,6 +883,7 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode) bool inWelcomeWidget = (currentIndex == WelcomeScreen); bool inDatabaseTabWidgetOrWelcomeWidget = inDatabaseTabWidget || inWelcomeWidget; + m_ui->actionDatabaseClose->setEnabled(true); m_ui->actionDatabaseMerge->setEnabled(inDatabaseTabWidget); m_ui->actionDatabaseNew->setEnabled(inDatabaseTabWidgetOrWelcomeWidget); m_ui->actionDatabaseOpen->setEnabled(inDatabaseTabWidgetOrWelcomeWidget); @@ -1044,6 +1041,13 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode) // Only disable the action in the database menu so that the // menu remains active in the toolbar, if necessary m_ui->actionLockDatabase->setEnabled(false); + // Never show in these modes + m_ui->actionEntryMoveUp->setVisible(false); + m_ui->actionEntryMoveDown->setVisible(false); + m_ui->actionEntryRestore->setVisible(false); + m_ui->actionEntryAddToAgent->setVisible(false); + m_ui->actionEntryRemoveFromAgent->setVisible(false); + m_ui->actionGroupEmptyRecycleBin->setVisible(false); m_searchWidgetAction->setEnabled(false); break; @@ -1051,7 +1055,6 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode) default: Q_ASSERT(false); } - m_ui->actionDatabaseClose->setEnabled(true); } else { const auto entryActions = m_ui->menuEntries->actions(); for (auto action : entryActions) { @@ -1074,6 +1077,13 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode) m_ui->actionExportCsv->setEnabled(false); m_ui->actionExportHtml->setEnabled(false); m_ui->actionDatabaseMerge->setEnabled(false); + // Hide entry-specific actions + m_ui->actionEntryMoveUp->setVisible(false); + m_ui->actionEntryMoveDown->setVisible(false); + m_ui->actionEntryRestore->setVisible(false); + m_ui->actionEntryAddToAgent->setVisible(false); + m_ui->actionEntryRemoveFromAgent->setVisible(false); + m_ui->actionGroupEmptyRecycleBin->setVisible(false); m_searchWidgetAction->setEnabled(false); } From c93a9044d8c6e323efae5c158164bafd325502ff Mon Sep 17 00:00:00 2001 From: Jonathan White Date: Sun, 26 Feb 2023 20:43:38 -0500 Subject: [PATCH 5/6] Add password widget action usage accessibility description --- share/translations/keepassxc_en.ts | 4 ++++ src/gui/PasswordWidget.ui | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/share/translations/keepassxc_en.ts b/share/translations/keepassxc_en.ts index c4c0e95cdd..3b5ae5f4a8 100644 --- a/share/translations/keepassxc_en.ts +++ b/share/translations/keepassxc_en.ts @@ -6203,6 +6203,10 @@ Do you want to overwrite it? Password quality + + Toggle password visibilty using Control + H. Open the password generator using Control + G. + + PickcharsDialog diff --git a/src/gui/PasswordWidget.ui b/src/gui/PasswordWidget.ui index 4419ad79bc..34cae29e15 100644 --- a/src/gui/PasswordWidget.ui +++ b/src/gui/PasswordWidget.ui @@ -27,7 +27,11 @@ 0 - + + + Toggle password visibilty using Control + H. Open the password generator using Control + G. + + From 950566912e3e92163418db19ca460b19c877f3c3 Mon Sep 17 00:00:00 2001 From: Jonathan White Date: Sun, 26 Feb 2023 15:18:30 -0500 Subject: [PATCH 6/6] Add F6 shortcut to focus search --- src/gui/MainWindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 1460c9db12..aa9e339910 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -1427,7 +1427,7 @@ void MainWindow::keyPressEvent(QKeyEvent* event) } else if (event->key() == Qt::Key_F2) { dbWidget->focusOnEntries(true); return; - } else if (event->key() == Qt::Key_F3) { + } else if (event->key() == Qt::Key_F3 || event->key() == Qt::Key_F6) { focusSearchWidget(); return; } else if (event->key() == Qt::Key_Escape && dbWidget->isSearchActive()) {