From c12b0c55687320df6f3ba7f02d6eabca80a69353 Mon Sep 17 00:00:00 2001 From: Jonathan White Date: Sat, 21 Dec 2024 23:25:45 -0500 Subject: [PATCH] Improve related splitter UX * Prevent group pane from being hidden just by dragging. Introduce new View menu setting to hide the group pane. * Replace the preview panel "close" icon with a "collapse down" icon making the intention clearer. * Better organize the view menu --- COPYING | 1 + .../scalable/actions/arrow-collapse-down.svg | 1 + share/icons/icons.qrc | 1 + share/translations/keepassxc_en.ts | 8 ++++++++ src/core/Config.cpp | 1 + src/core/Config.h | 1 + src/gui/DatabaseWidget.cpp | 15 +++++++++++++-- src/gui/DatabaseWidget.h | 1 + src/gui/EntryPreviewWidget.cpp | 2 +- src/gui/MainWindow.cpp | 5 +++++ src/gui/MainWindow.ui | 18 ++++++++++++++++++ 11 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 share/icons/application/scalable/actions/arrow-collapse-down.svg diff --git a/COPYING b/COPYING index 806db11af..8c10cc5f0 100644 --- a/COPYING +++ b/COPYING @@ -141,6 +141,7 @@ Copyright: 2022 KeePassXC Team License: MIT Files: share/icons/application/scalable/actions/application-exit.svg + share/icons/application/scalable/actions/arrow-collapse-down.svg share/icons/application/scalable/actions/attributes-copy.svg share/icons/application/scalable/actions/auto-type.svg share/icons/application/scalable/actions/bitwarden.svg diff --git a/share/icons/application/scalable/actions/arrow-collapse-down.svg b/share/icons/application/scalable/actions/arrow-collapse-down.svg new file mode 100644 index 000000000..27cfc42f2 --- /dev/null +++ b/share/icons/application/scalable/actions/arrow-collapse-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/icons.qrc b/share/icons/icons.qrc index 31fa6abe4..61afa202d 100644 --- a/share/icons/icons.qrc +++ b/share/icons/icons.qrc @@ -6,6 +6,7 @@ application/256x256/apps/keepassxc.png application/scalable/actions/application-exit.svg + application/scalable/actions/arrow-collapse-down.svg application/scalable/actions/attributes-copy.svg application/scalable/actions/auto-type.svg application/scalable/actions/bitwarden.svg diff --git a/share/translations/keepassxc_en.ts b/share/translations/keepassxc_en.ts index 89daa5176..eee9960d6 100644 --- a/share/translations/keepassxc_en.ts +++ b/share/translations/keepassxc_en.ts @@ -5845,6 +5845,14 @@ We recommend you use the AppImage available on our downloads page. Empty Recycle Bin + + Show Group Panel + + + + Toggle Show Group Panel + + ManageDatabase diff --git a/src/core/Config.cpp b/src/core/Config.cpp index a0c27a177..93110db8d 100644 --- a/src/core/Config.cpp +++ b/src/core/Config.cpp @@ -96,6 +96,7 @@ static const QHash configStrings = { {Config::GUI_HideMenubar, {QS("GUI/HideMenubar"), Roaming, false}}, {Config::GUI_HideToolbar, {QS("GUI/HideToolbar"), Roaming, false}}, {Config::GUI_MovableToolbar, {QS("GUI/MovableToolbar"), Roaming, false}}, + {Config::GUI_HideGroupPanel, {QS("GUI/HideGroupPanel"), Roaming, false}}, {Config::GUI_HidePreviewPanel, {QS("GUI/HidePreviewPanel"), Roaming, false}}, {Config::GUI_AlwaysOnTop, {QS("GUI/GUI_AlwaysOnTop"), Local, false}}, {Config::GUI_ToolButtonStyle, {QS("GUI/ToolButtonStyle"), Roaming, Qt::ToolButtonIconOnly}}, diff --git a/src/core/Config.h b/src/core/Config.h index 2b531186f..745e0bb75 100644 --- a/src/core/Config.h +++ b/src/core/Config.h @@ -77,6 +77,7 @@ public: GUI_HideMenubar, GUI_HideToolbar, GUI_MovableToolbar, + GUI_HideGroupPanel, GUI_HidePreviewPanel, GUI_AlwaysOnTop, GUI_ToolButtonStyle, diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 731ca0ade..76a15a376 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -124,6 +124,8 @@ DatabaseWidget::DatabaseWidget(QSharedPointer db, QWidget* parent) m_groupSplitter->setStretchFactor(0, 100); m_groupSplitter->setStretchFactor(1, 0); m_groupSplitter->setSizes({1, 1}); + // Initial visibility based on config value + m_groupSplitter->setVisible(!config()->get(Config::GUI_HideGroupPanel).toBool()); auto rightHandSideWidget = new QWidget(m_mainSplitter); auto rightHandSideVBox = new QVBoxLayout(); @@ -136,12 +138,11 @@ DatabaseWidget::DatabaseWidget(QSharedPointer db, QWidget* parent) rightHandSideWidget->setLayout(rightHandSideVBox); m_entryView = new EntryView(rightHandSideWidget); - m_mainSplitter->setChildrenCollapsible(true); + m_mainSplitter->setChildrenCollapsible(false); m_mainSplitter->addWidget(m_groupSplitter); m_mainSplitter->addWidget(rightHandSideWidget); m_mainSplitter->setStretchFactor(0, 0); m_mainSplitter->setStretchFactor(1, 100); - m_mainSplitter->setCollapsible(1, false); m_mainSplitter->setSizes({1, 1}); m_previewSplitter->setOrientation(Qt::Vertical); @@ -213,6 +214,7 @@ DatabaseWidget::DatabaseWidget(QSharedPointer db, QWidget* parent) connect(m_databaseOpenWidget, SIGNAL(dialogFinished(bool)), SLOT(loadDatabase(bool))); connect(this, SIGNAL(currentChanged(int)), SLOT(emitCurrentModeChanged())); connect(this, SIGNAL(requestGlobalAutoType(const QString&)), parent, SLOT(performGlobalAutoType(const QString&))); + connect(config(), &Config::changed, this, &DatabaseWidget::onConfigChanged); // clang-format on connectDatabaseSignals(); @@ -404,6 +406,15 @@ void DatabaseWidget::setSplitterSizes(const QHash> } } +void DatabaseWidget::onConfigChanged(Config::ConfigKey key) +{ + if (key == Config::GUI_HideGroupPanel) { + // Toggle the group splitter visibility and reset the size + m_groupSplitter->setVisible(!config()->get(Config::GUI_HideGroupPanel).toBool()); + setSplitterSizes({{Config::GUI_SplitterState, QList({})}}); + } +} + void DatabaseWidget::setSearchStringForAutoType(const QString& search) { m_searchStringForAutoType = search; diff --git a/src/gui/DatabaseWidget.h b/src/gui/DatabaseWidget.h index 42988d8ac..fe5ed5428 100644 --- a/src/gui/DatabaseWidget.h +++ b/src/gui/DatabaseWidget.h @@ -270,6 +270,7 @@ private slots: // Database autoreload slots void reloadDatabaseFile(); void restoreGroupEntryFocus(const QUuid& groupUuid, const QUuid& EntryUuid); + void onConfigChanged(Config::ConfigKey key); private: int addChildWidget(QWidget* w); diff --git a/src/gui/EntryPreviewWidget.cpp b/src/gui/EntryPreviewWidget.cpp index 8d81e0163..03fcb6f7c 100644 --- a/src/gui/EntryPreviewWidget.cpp +++ b/src/gui/EntryPreviewWidget.cpp @@ -49,7 +49,7 @@ EntryPreviewWidget::EntryPreviewWidget(QWidget* parent) // Entry m_ui->entryTotpButton->setIcon(icons()->icon("totp")); - m_ui->entryCloseButton->setIcon(icons()->icon("dialog-close")); + m_ui->entryCloseButton->setIcon(icons()->icon("arrow-collapse-down")); m_ui->toggleUsernameButton->setIcon(icons()->onOffIcon("password-show", true)); m_ui->togglePasswordButton->setIcon(icons()->onOffIcon("password-show", true)); m_ui->toggleEntryNotesButton->setIcon(icons()->onOffIcon("password-show", true)); diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index faf6952ea..d47971261 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -2006,6 +2006,11 @@ void MainWindow::initViewMenu() applySettingsChanges(); }); + m_ui->actionShowGroupPanel->setChecked(!config()->get(Config::GUI_HideGroupPanel).toBool()); + connect(m_ui->actionShowGroupPanel, &QAction::toggled, this, [](bool checked) { + config()->set(Config::GUI_HideGroupPanel, !checked); + }); + m_ui->actionShowPreviewPanel->setChecked(!config()->get(Config::GUI_HidePreviewPanel).toBool()); connect(m_ui->actionShowPreviewPanel, &QAction::toggled, this, [](bool checked) { config()->set(Config::GUI_HidePreviewPanel, !checked); diff --git a/src/gui/MainWindow.ui b/src/gui/MainWindow.ui index 828a11a63..c7a4550d9 100644 --- a/src/gui/MainWindow.ui +++ b/src/gui/MainWindow.ui @@ -380,9 +380,13 @@ + + + + @@ -1086,6 +1090,20 @@ Import… + + + true + + + true + + + Show Group Panel + + + Toggle Show Group Panel + +