Add loadState() function to DockWindowManager
Just changing the preference for hiding or showing a dock window does not actually trigger a state change. To enable that, the preferences pack manager must manually instruct the DockWindowManager to save its state into the preferences before storing a preference pack, and must instruct the DockWindowManager to load its new state from the preferences after loading a pack.
This commit is contained in:
@@ -381,6 +381,21 @@ void DockWindowManager::saveState()
|
||||
}
|
||||
}
|
||||
|
||||
void DockWindowManager::loadState()
|
||||
{
|
||||
ParameterGrp::handle hPref = App::GetApplication().GetUserParameter().GetGroup("BaseApp")
|
||||
->GetGroup("MainWindow")->GetGroup("DockWindows");
|
||||
const QList<DockWindowItem>& dockItems = d->_dockWindowItems.dockWidgets();
|
||||
for (QList<DockWindowItem>::ConstIterator it = dockItems.begin(); it != dockItems.end(); ++it) {
|
||||
QDockWidget* dw = findDockWidget(d->_dockedWindows, it->name);
|
||||
if (dw) {
|
||||
QByteArray dockName = it->name.toLatin1();
|
||||
bool visible = hPref->GetBool(dockName.constData(), it->visibility);
|
||||
dw->setVisible(visible);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QDockWidget* DockWindowManager::findDockWidget(const QList<QDockWidget*>& dw, const QString& name) const
|
||||
{
|
||||
for (QList<QDockWidget*>::ConstIterator it = dw.begin(); it != dw.end(); ++it) {
|
||||
|
||||
@@ -88,6 +88,7 @@ public:
|
||||
QList<QWidget*> getDockWindows() const;
|
||||
|
||||
void saveState();
|
||||
void loadState();
|
||||
void retranslate();
|
||||
|
||||
private Q_SLOTS:
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
#include "Base/Parameter.h"
|
||||
#include "Base/Interpreter.h"
|
||||
#include "Base/Console.h"
|
||||
#include "DockWindowManager.h"
|
||||
|
||||
#include <App/Application.h>
|
||||
|
||||
@@ -204,7 +205,14 @@ bool PreferencePackManager::apply(const std::string& preferencePackName) const
|
||||
std::lock_guard<std::mutex> lock(_mutex);
|
||||
if (auto preferencePack = _preferencePacks.find(preferencePackName); preferencePack != _preferencePacks.end()) {
|
||||
BackupCurrentConfig();
|
||||
return preferencePack->second.apply();
|
||||
bool wasApplied = preferencePack->second.apply();
|
||||
if (wasApplied) {
|
||||
// If the visibility state of the dock windows was changed we have to manually reload their state
|
||||
Gui::DockWindowManager* pDockMgr = Gui::DockWindowManager::instance();
|
||||
pDockMgr->loadState();
|
||||
|
||||
// TODO: Are there other things that have to be manually triggered?
|
||||
}
|
||||
}
|
||||
else {
|
||||
throw std::runtime_error("No such Preference Pack: " + preferencePackName);
|
||||
@@ -215,9 +223,14 @@ void copyTemplateParameters(Base::Reference<ParameterGrp> templateGroup, const s
|
||||
{
|
||||
auto userParameterHandle = App::GetApplication().GetParameterGroupByPath(path.c_str());
|
||||
|
||||
// Ensure that the DockWindowManager has saved its current state:
|
||||
Gui::DockWindowManager* pDockMgr = Gui::DockWindowManager::instance();
|
||||
pDockMgr->saveState();
|
||||
|
||||
auto boolMap = templateGroup->GetBoolMap();
|
||||
for (const auto& kv : boolMap) {
|
||||
auto currentValue = userParameterHandle->GetBool(kv.first.c_str(), kv.second);
|
||||
Base::Console().Message("Parameter %s = %d\n", kv.first.c_str(), currentValue);
|
||||
outputGroup->SetBool(kv.first.c_str(), currentValue);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user