Merge pull request #10722 from Eism/save_state_after_workspace_change

[MU4] Fixed saving/restoring state of ui when changing workspace
This commit is contained in:
RomanPudashkin 2022-03-15 14:29:48 +02:00 committed by GitHub
commit b81b7d6670
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 64 additions and 15 deletions

View file

@ -172,7 +172,15 @@ void DockWindow::init()
uiConfiguration()->windowGeometryChanged().onNotify(this, [this]() {
if (!m_quiting) {
resetWindowState();
updatePageState();
}
});
workspaceManager()->currentWorkspaceAboutToBeChanged().onNotify(this, [this]() {
if (DockPageView* page = currentPage()) {
m_workspaceChanging = true;
savePageState(page->objectName());
m_workspaceChanging = false;
}
});
@ -515,11 +523,22 @@ void DockWindow::restorePageState(const QString& pageName)
{
TRACEFUNC;
ValNt<QByteArray> pageStateValNt = uiConfiguration()->pageState(pageName);
/// NOTE: Do not restore geometry
bool ok = restoreLayout(uiConfiguration()->pageState(pageName), true /*restoreRelativeToMainWindow*/);
bool ok = restoreLayout(pageStateValNt.val, true /*restoreRelativeToMainWindow*/);
if (!ok) {
LOGE() << "Could not restore the state of " << pageName << "!";
}
if (!pageStateValNt.notification.isConnected()) {
pageStateValNt.notification.onNotify(this, [this, pageName]() {
bool isCurrentPage = m_currentPage && (m_currentPage->objectName() == pageName);
if (isCurrentPage && !m_quiting && !m_workspaceChanging) {
updatePageState();
}
});
}
}
bool DockWindow::restoreLayout(const QByteArray& layout, bool restoreRelativeToMainWindow)
@ -545,7 +564,7 @@ QByteArray DockWindow::windowState() const
return layoutSaver.serializeLayout();
}
void DockWindow::resetWindowState()
void DockWindow::updatePageState()
{
QString currentPageUriBackup = currentPageUri();

View file

@ -27,13 +27,16 @@
#include "framework/uicomponents/view/qmllistproperty.h"
#include "async/asyncable.h"
#include "async/asyncable.h"
#include "modularity/ioc.h"
#include "async/asyncable.h"
#include "workspace/iworkspacemanager.h"
#include "ui/iuiconfiguration.h"
#include "async/asyncable.h"
#include "internal/istartupscenario.h"
#include "idockwindow.h"
#include "idockwindowprovider.h"
#include "idockwindow.h"
#include "internal/dockbase.h"
namespace KDDockWidgets {
@ -54,8 +57,9 @@ class DockWindow : public QQuickItem, public IDockWindow, public async::Asyncabl
Q_PROPERTY(QQmlListProperty<mu::dock::DockToolBarView> toolBars READ toolBarsProperty)
Q_PROPERTY(QQmlListProperty<mu::dock::DockPageView> pages READ pagesProperty)
INJECT(dock, IDockWindowProvider, dockWindowProvider)
INJECT(dock, ui::IUiConfiguration, uiConfiguration)
INJECT(dock, workspace::IWorkspaceManager, workspaceManager)
INJECT(dock, IDockWindowProvider, dockWindowProvider)
INJECT(dock, appshell::IStartupScenario, startupScenario)
public:
@ -118,7 +122,7 @@ private:
void savePageState(const QString& pageName);
void restorePageState(const QString& pageName);
void resetWindowState();
void updatePageState();
bool restoreLayout(const QByteArray& layout, bool restoreRelativeToMainWindow = false);
void initDocks(DockPageView* page);
@ -134,6 +138,7 @@ private:
async::Channel<QStringList> m_docksOpenStatusChanged;
bool m_quiting = false;
bool m_workspaceChanging = false;
};
}

View file

@ -600,9 +600,13 @@ double UiConfiguration::dpi() const
return screen ? screen->logicalDotsPerInch() : 100;
}
QByteArray UiConfiguration::pageState(const QString& pageName) const
mu::ValNt<QByteArray> UiConfiguration::pageState(const QString& pageName) const
{
return m_uiArrangement.state(pageName);
ValNt<QByteArray> result;
result.val = m_uiArrangement.state(pageName);
result.notification = m_uiArrangement.stateChanged(pageName);
return result;
}
void UiConfiguration::setPageState(const QString& pageName, const QByteArray& state)

View file

@ -80,7 +80,7 @@ public:
void setPhysicalDotsPerInch(std::optional<double> dpi) override;
QByteArray pageState(const QString& pageName) const override;
ValNt<QByteArray> pageState(const QString& pageName) const override;
void setPageState(const QString& pageName, const QByteArray& state) override;
QByteArray windowGeometry() const override;

View file

@ -25,10 +25,13 @@
#include <optional>
#include "modularity/imoduleexport.h"
#include "retval.h"
#include "async/notification.h"
#include "async/channel.h"
#include "actions/actiontypes.h"
#include "modularity/imoduleexport.h"
#include "uitypes.h"
class QByteArray;
@ -79,7 +82,7 @@ public:
//! NOTE Maybe set from command line
virtual void setPhysicalDotsPerInch(std::optional<double> dpi) = 0;
virtual QByteArray pageState(const QString& pageName) const = 0;
virtual ValNt<QByteArray> pageState(const QString& pageName) const = 0;
virtual void setPageState(const QString& pageName, const QByteArray& state) = 0;
virtual QByteArray windowGeometry() const = 0;

View file

@ -66,6 +66,11 @@ IWorkspacePtr WorkspaceManager::currentWorkspace() const
return m_currentWorkspace;
}
async::Notification WorkspaceManager::currentWorkspaceAboutToBeChanged() const
{
return m_currentWorkspaceAboutToBeChanged;
}
async::Notification WorkspaceManager::currentWorkspaceChanged() const
{
return m_currentWorkspaceChanged;
@ -140,6 +145,10 @@ Ret WorkspaceManager::removeMissingWorkspaces(const IWorkspacePtrList& newWorksp
}
}
if (!containsWorkspace(newWorkspaceList, m_currentWorkspace)) {
m_currentWorkspace = nullptr;
}
return make_ret(Ret::Code::Ok);
}
@ -152,8 +161,12 @@ Ret WorkspaceManager::removeWorkspace(const IWorkspacePtr& workspace)
for (auto it = m_workspaces.begin(); it != m_workspaces.end(); ++it) {
if (it->get()->name() == workspaceName) {
m_workspaces.erase(it);
return fileSystem()->remove(it->get()->filePath());
Ret ret = fileSystem()->remove(it->get()->filePath());
if (ret) {
m_workspaces.erase(it);
}
return ret;
}
}
@ -266,6 +279,8 @@ void WorkspaceManager::setupCurrentWorkspace()
return;
}
m_currentWorkspaceAboutToBeChanged.notify();
saveCurrentWorkspace();
//! NOTE Perhaps we need to unload the current workspace (clear memory)

View file

@ -47,6 +47,7 @@ public:
IWorkspacePtr defaultWorkspace() const override;
IWorkspacePtr currentWorkspace() const override;
async::Notification currentWorkspaceAboutToBeChanged() const override;
async::Notification currentWorkspaceChanged() const override;
IWorkspacePtrList workspaces() const override;
@ -81,6 +82,7 @@ private:
WorkspacePtr m_defaultWorkspace;
WorkspacePtr m_currentWorkspace;
async::Notification m_currentWorkspaceAboutToBeChanged;
async::Notification m_currentWorkspaceChanged;
std::vector<WorkspacePtr> m_workspaces;

View file

@ -41,6 +41,7 @@ public:
//! NOTE Current selected by a user, writable, optionally managed
virtual IWorkspacePtr currentWorkspace() const = 0;
virtual async::Notification currentWorkspaceAboutToBeChanged() const = 0;
virtual async::Notification currentWorkspaceChanged() const = 0;
virtual IWorkspacePtrList workspaces() const = 0;