mirror of
https://github.com/keepassxreboot/keepassxc.git
synced 2025-07-21 05:58:44 -04:00
Reset splitter sizes on database unlock
* Attempt to avoid issue with splitters not being appropriately calculated because the main window isn't sized yet. This can happen if the main window is hidden when the database is loaded and the splitter sizes are not recorded in the config file.
This commit is contained in:
parent
383c6d05d1
commit
6f42041837
4 changed files with 62 additions and 55 deletions
|
@ -1189,6 +1189,7 @@ void DatabaseWidget::loadDatabase(bool accepted)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (accepted) {
|
if (accepted) {
|
||||||
|
emit databaseAboutToUnlock();
|
||||||
replaceDatabase(openWidget->database());
|
replaceDatabase(openWidget->database());
|
||||||
switchToMainView();
|
switchToMainView();
|
||||||
processAutoOpen();
|
processAutoOpen();
|
||||||
|
@ -1281,6 +1282,7 @@ void DatabaseWidget::unlockDatabase(bool accepted)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
emit databaseAboutToUnlock();
|
||||||
QSharedPointer<Database> db;
|
QSharedPointer<Database> db;
|
||||||
if (senderDialog) {
|
if (senderDialog) {
|
||||||
db = senderDialog->database();
|
db = senderDialog->database();
|
||||||
|
|
|
@ -131,6 +131,7 @@ signals:
|
||||||
void databaseModified();
|
void databaseModified();
|
||||||
void databaseNonDataChanged();
|
void databaseNonDataChanged();
|
||||||
void databaseSaved();
|
void databaseSaved();
|
||||||
|
void databaseAboutToUnlock();
|
||||||
void databaseUnlocked();
|
void databaseUnlocked();
|
||||||
void databaseLockRequested();
|
void databaseLockRequested();
|
||||||
void databaseLocked();
|
void databaseLocked();
|
||||||
|
|
|
@ -33,7 +33,9 @@ DatabaseWidgetStateSync::DatabaseWidgetStateSync(QObject* parent)
|
||||||
m_listViewState = config()->get(Config::GUI_ListViewState).toByteArray();
|
m_listViewState = config()->get(Config::GUI_ListViewState).toByteArray();
|
||||||
m_searchViewState = config()->get(Config::GUI_SearchViewState).toByteArray();
|
m_searchViewState = config()->get(Config::GUI_SearchViewState).toByteArray();
|
||||||
|
|
||||||
connect(qApp, &QCoreApplication::aboutToQuit, this, &DatabaseWidgetStateSync::sync);
|
m_syncTimer.setSingleShot(true);
|
||||||
|
m_syncTimer.setInterval(100);
|
||||||
|
connect(&m_syncTimer, &QTimer::timeout, this, &DatabaseWidgetStateSync::sync);
|
||||||
}
|
}
|
||||||
|
|
||||||
DatabaseWidgetStateSync::~DatabaseWidgetStateSync()
|
DatabaseWidgetStateSync::~DatabaseWidgetStateSync()
|
||||||
|
@ -45,6 +47,7 @@ DatabaseWidgetStateSync::~DatabaseWidgetStateSync()
|
||||||
*/
|
*/
|
||||||
void DatabaseWidgetStateSync::sync()
|
void DatabaseWidgetStateSync::sync()
|
||||||
{
|
{
|
||||||
|
m_syncTimer.stop();
|
||||||
config()->set(Config::GUI_SplitterState, intListToVariant(m_splitterSizes.value(Config::GUI_SplitterState)));
|
config()->set(Config::GUI_SplitterState, intListToVariant(m_splitterSizes.value(Config::GUI_SplitterState)));
|
||||||
config()->set(Config::GUI_PreviewSplitterState,
|
config()->set(Config::GUI_PreviewSplitterState,
|
||||||
intListToVariant(m_splitterSizes.value(Config::GUI_PreviewSplitterState)));
|
intListToVariant(m_splitterSizes.value(Config::GUI_PreviewSplitterState)));
|
||||||
|
@ -58,14 +61,37 @@ void DatabaseWidgetStateSync::sync()
|
||||||
void DatabaseWidgetStateSync::setActive(DatabaseWidget* dbWidget)
|
void DatabaseWidgetStateSync::setActive(DatabaseWidget* dbWidget)
|
||||||
{
|
{
|
||||||
if (m_activeDbWidget) {
|
if (m_activeDbWidget) {
|
||||||
|
if (m_activeDbWidget->currentMode() != DatabaseWidget::Mode::LockedMode) {
|
||||||
|
// Update settings from previously active database if unlocked
|
||||||
|
updateAll();
|
||||||
|
}
|
||||||
disconnect(m_activeDbWidget, nullptr, this, nullptr);
|
disconnect(m_activeDbWidget, nullptr, this, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_activeDbWidget = dbWidget;
|
m_activeDbWidget = dbWidget;
|
||||||
|
|
||||||
if (m_activeDbWidget) {
|
if (m_activeDbWidget) {
|
||||||
// Give the database widget a chance to render itself before restoring the state
|
if (m_activeDbWidget->currentMode() != DatabaseWidget::Mode::LockedMode) {
|
||||||
QTimer::singleShot(0, this, [this] {
|
// Immediately apply settings to active database if already unlocked
|
||||||
|
applySplitterSizes();
|
||||||
|
applyViewState();
|
||||||
|
}
|
||||||
|
|
||||||
|
connect(m_activeDbWidget, SIGNAL(databaseAboutToUnlock()), SLOT(blockUpdates()));
|
||||||
|
connect(m_activeDbWidget, SIGNAL(databaseUnlocked()), SLOT(applySplitterSizes()));
|
||||||
|
connect(m_activeDbWidget, SIGNAL(databaseUnlocked()), SLOT(applyViewState()));
|
||||||
|
connect(m_activeDbWidget, &DatabaseWidget::databaseLocked, this, [this] { updateAll(true); });
|
||||||
|
connect(m_activeDbWidget, SIGNAL(splitterSizesChanged()), SLOT(updateSplitterSizes()));
|
||||||
|
connect(m_activeDbWidget, SIGNAL(entryViewStateChanged()), SLOT(updateViewState()));
|
||||||
|
connect(m_activeDbWidget, SIGNAL(listModeActivated()), SLOT(applyViewState()));
|
||||||
|
connect(m_activeDbWidget, SIGNAL(searchModeActivated()), SLOT(applyViewState()));
|
||||||
|
connect(m_activeDbWidget, SIGNAL(listModeAboutToActivate()), SLOT(blockUpdates()));
|
||||||
|
connect(m_activeDbWidget, SIGNAL(searchModeAboutToActivate()), SLOT(blockUpdates()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DatabaseWidgetStateSync::applySplitterSizes()
|
||||||
|
{
|
||||||
if (!m_activeDbWidget) {
|
if (!m_activeDbWidget) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -74,63 +100,32 @@ void DatabaseWidgetStateSync::setActive(DatabaseWidget* dbWidget)
|
||||||
|
|
||||||
m_activeDbWidget->setSplitterSizes(m_splitterSizes);
|
m_activeDbWidget->setSplitterSizes(m_splitterSizes);
|
||||||
|
|
||||||
if (m_activeDbWidget->isSearchActive()) {
|
|
||||||
restoreSearchView();
|
|
||||||
} else {
|
|
||||||
restoreListView();
|
|
||||||
}
|
|
||||||
|
|
||||||
m_blockUpdates = false;
|
m_blockUpdates = false;
|
||||||
});
|
|
||||||
|
|
||||||
connect(m_activeDbWidget, SIGNAL(splitterSizesChanged()), SLOT(updateSplitterSizes()));
|
|
||||||
connect(m_activeDbWidget, SIGNAL(entryViewStateChanged()), SLOT(updateViewState()));
|
|
||||||
connect(m_activeDbWidget, SIGNAL(listModeActivated()), SLOT(restoreListView()));
|
|
||||||
connect(m_activeDbWidget, SIGNAL(searchModeActivated()), SLOT(restoreSearchView()));
|
|
||||||
connect(m_activeDbWidget, SIGNAL(listModeAboutToActivate()), SLOT(blockUpdates()));
|
|
||||||
connect(m_activeDbWidget, SIGNAL(searchModeAboutToActivate()), SLOT(blockUpdates()));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Restore entry view list view state
|
* Restore entry view list view state
|
||||||
*
|
*
|
||||||
* NOTE:
|
* NOTE:
|
||||||
* States of entry view 'Hide Usernames'/'Hide Passwords' settings are global,
|
|
||||||
* i.e. they are the same for both list and search mode
|
|
||||||
*
|
|
||||||
* NOTE:
|
|
||||||
* If m_listViewState is empty, the list view has been activated for the first
|
* If m_listViewState is empty, the list view has been activated for the first
|
||||||
* time after starting with a clean (or invalid) config.
|
* time after starting with a clean (or invalid) config.
|
||||||
*/
|
*/
|
||||||
void DatabaseWidgetStateSync::restoreListView()
|
void DatabaseWidgetStateSync::applyViewState()
|
||||||
{
|
{
|
||||||
|
if (!m_activeDbWidget) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_blockUpdates = true;
|
||||||
|
|
||||||
|
if (m_activeDbWidget->isSearchActive()) {
|
||||||
|
if (!m_searchViewState.isEmpty()) {
|
||||||
|
m_activeDbWidget->setEntryViewState(m_searchViewState);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
if (!m_listViewState.isEmpty()) {
|
if (!m_listViewState.isEmpty()) {
|
||||||
m_activeDbWidget->setEntryViewState(m_listViewState);
|
m_activeDbWidget->setEntryViewState(m_listViewState);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_blockUpdates = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Restore entry view search view state
|
|
||||||
*
|
|
||||||
* NOTE:
|
|
||||||
* States of entry view 'Hide Usernames'/'Hide Passwords' settings are global,
|
|
||||||
* i.e. they are the same for both list and search mode
|
|
||||||
*
|
|
||||||
* NOTE:
|
|
||||||
* If m_searchViewState is empty, the search view has been activated for the
|
|
||||||
* first time after starting with a clean (or invalid) config. Thus, save the
|
|
||||||
* current state. Without this, m_searchViewState would remain empty until
|
|
||||||
* there is an actual view state change (e.g. column is resized)
|
|
||||||
*/
|
|
||||||
void DatabaseWidgetStateSync::restoreSearchView()
|
|
||||||
{
|
|
||||||
if (!m_searchViewState.isEmpty()) {
|
|
||||||
m_activeDbWidget->setEntryViewState(m_searchViewState);
|
|
||||||
} else {
|
|
||||||
m_searchViewState = m_activeDbWidget->entryViewState();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_blockUpdates = false;
|
m_blockUpdates = false;
|
||||||
|
@ -141,19 +136,25 @@ void DatabaseWidgetStateSync::blockUpdates()
|
||||||
m_blockUpdates = true;
|
m_blockUpdates = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DatabaseWidgetStateSync::updateAll(bool forceSync)
|
||||||
|
{
|
||||||
|
updateSplitterSizes();
|
||||||
|
updateViewState();
|
||||||
|
if (forceSync) {
|
||||||
|
sync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void DatabaseWidgetStateSync::updateSplitterSizes()
|
void DatabaseWidgetStateSync::updateSplitterSizes()
|
||||||
{
|
{
|
||||||
if (!m_blockUpdates) {
|
if (!m_blockUpdates) {
|
||||||
m_splitterSizes = m_activeDbWidget->splitterSizes();
|
m_splitterSizes = m_activeDbWidget->splitterSizes();
|
||||||
|
m_syncTimer.start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update entry view list/search view state
|
* Update entry view list/search view state
|
||||||
*
|
|
||||||
* NOTE:
|
|
||||||
* States of entry view 'Hide Usernames'/'Hide Passwords' settings are global,
|
|
||||||
* i.e. they are the same for both list and search mode
|
|
||||||
*/
|
*/
|
||||||
void DatabaseWidgetStateSync::updateViewState()
|
void DatabaseWidgetStateSync::updateViewState()
|
||||||
{
|
{
|
||||||
|
@ -167,7 +168,7 @@ void DatabaseWidgetStateSync::updateViewState()
|
||||||
m_listViewState = m_activeDbWidget->entryViewState();
|
m_listViewState = m_activeDbWidget->entryViewState();
|
||||||
}
|
}
|
||||||
|
|
||||||
sync();
|
m_syncTimer.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<int> DatabaseWidgetStateSync::variantToIntList(const QVariant& variant)
|
QList<int> DatabaseWidgetStateSync::variantToIntList(const QVariant& variant)
|
||||||
|
|
|
@ -32,13 +32,14 @@ public:
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void setActive(DatabaseWidget* dbWidget);
|
void setActive(DatabaseWidget* dbWidget);
|
||||||
void restoreListView();
|
void applySplitterSizes();
|
||||||
void restoreSearchView();
|
void applyViewState();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void blockUpdates();
|
void blockUpdates();
|
||||||
void updateSplitterSizes();
|
void updateSplitterSizes();
|
||||||
void updateViewState();
|
void updateViewState();
|
||||||
|
void updateAll(bool forceSync = false);
|
||||||
void sync();
|
void sync();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -48,6 +49,8 @@ private:
|
||||||
QPointer<DatabaseWidget> m_activeDbWidget;
|
QPointer<DatabaseWidget> m_activeDbWidget;
|
||||||
|
|
||||||
bool m_blockUpdates;
|
bool m_blockUpdates;
|
||||||
|
QTimer m_syncTimer;
|
||||||
|
|
||||||
QHash<Config::ConfigKey, QList<int>> m_splitterSizes;
|
QHash<Config::ConfigKey, QList<int>> m_splitterSizes;
|
||||||
|
|
||||||
QByteArray m_listViewState;
|
QByteArray m_listViewState;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue