ADS: Cleanup workspace manager workflow

- Add workspace presets
- Add reset button to workspace manager
- Fix last workspace settings save/restore
- Move functionality from DesignModeWidget to DockManager
- Remove factory default workspace
- Cleanup a few if statements

Task-number: QDS-1699
Change-Id: I282dd6162a5a36041f8cd2aacd7407750d54cc22
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Henning Gruendl
2020-03-02 15:13:20 +01:00
committed by Henning Gründl
parent fb843d3442
commit 5683f2df85
12 changed files with 388 additions and 251 deletions

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<QtAdvancedDockingSystem version="1" containers="1">
<container floating="false">
<splitter orientation="Horizontal" count="3">
<splitter orientation="Vertical" count="2">
<area tabs="3" current="Library">
<widget name="Library" closed="false"/>
<widget name="Navigator" closed="false"/>
<widget name="DebugView" closed="false"/>
</area>
<area tabs="3" current="Projects">
<widget name="Projects" closed="false"/>
<widget name="FileSystem" closed="false"/>
<widget name="OpenDocuments" closed="false"/>
</area>
<sizes>653 436</sizes>
</splitter>
<splitter orientation="Vertical" count="4">
<area tabs="2" current="FormEditor">
<widget name="FormEditor" closed="false"/>
<widget name="TextEditor" closed="false"/>
</area>
<area tabs="1" current="Editor3D">
<widget name="Editor3D" closed="false"/>
</area>
<area tabs="2" current="Timelines">
<widget name="StatesEditor" closed="true"/>
<widget name="Timelines" closed="true"/>
</area>
<area tabs="1" current="OutputPane">
<widget name="OutputPane" closed="true"/>
</area>
<sizes>600 600 0 0</sizes>
</splitter>
<splitter orientation="Vertical" count="2">
<area tabs="1" current="Properties">
<widget name="Properties" closed="false"/>
</area>
<area tabs="1" current="ConnectionView">
<widget name="ConnectionView" closed="false"/>
</area>
<sizes>762 327</sizes>
</splitter>
<sizes>376 1127 376</sizes>
</splitter>
</container>
</QtAdvancedDockingSystem>

View File

@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<QtAdvancedDockingSystem version="1" containers="1">
<container floating="false">
<splitter orientation="Horizontal" count="3">
<splitter orientation="Vertical" count="2">
<area tabs="3" current="Library">
<widget name="Library" closed="false"/>
<widget name="Navigator" closed="false"/>
<widget name="DebugView" closed="false"/>
</area>
<area tabs="3" current="Projects">
<widget name="Projects" closed="false"/>
<widget name="FileSystem" closed="false"/>
<widget name="OpenDocuments" closed="false"/>
</area>
<sizes>600 400</sizes>
</splitter>
<splitter orientation="Vertical" count="3">
<area tabs="2" current="FormEditor">
<widget name="FormEditor" closed="false"/>
<widget name="TextEditor" closed="false"/>
</area>
<area tabs="2" current="Timelines">
<widget name="StatesEditor" closed="false"/>
<widget name="Timelines" closed="false"/>
</area>
<area tabs="1" current="OutputPane">
<widget name="OutputPane" closed="true"/>
</area>
<sizes>700 150 150</sizes>
</splitter>
<splitter orientation="Vertical" count="2">
<area tabs="1" current="Properties">
<widget name="Properties" closed="false"/>
</area>
<area tabs="1" current="ConnectionView">
<widget name="ConnectionView" closed="false"/>
</area>
<sizes>700 300</sizes>
</splitter>
<sizes>200 600 200</sizes>
</splitter>
</container>
</QtAdvancedDockingSystem>

View File

@@ -92,10 +92,12 @@ namespace ADS
QString m_workspaceName; QString m_workspaceName;
bool m_workspaceListDirty = true; bool m_workspaceListDirty = true;
QStringList m_workspaces; QStringList m_workspaces;
QSet<QString> m_workspacePresets;
QHash<QString, QDateTime> m_workspaceDateTimes; QHash<QString, QDateTime> m_workspaceDateTimes;
QString m_workspaceToRestoreAtStartup; QString m_workspaceToRestoreAtStartup;
bool m_autorestoreLastWorkspace; // This option is set in the Workspace Manager! bool m_autorestoreLastWorkspace; // This option is set in the Workspace Manager!
QSettings *m_settings = nullptr; QSettings *m_settings = nullptr;
QString m_workspacePresetsPath;
/** /**
* Private data constructor * Private data constructor
@@ -127,17 +129,15 @@ namespace ADS
void hideFloatingWidgets() void hideFloatingWidgets()
{ {
// Hide updates of floating widgets from user // Hide updates of floating widgets from user
for (auto floatingWidget : m_floatingWidgets) { // TODO qAsConst() for (auto floatingWidget : m_floatingWidgets) // TODO qAsConst()
floatingWidget->hide(); floatingWidget->hide();
} }
}
void markDockWidgetsDirty() void markDockWidgetsDirty()
{ {
for (auto dockWidget : m_dockWidgetsMap) { // TODO qAsConst() for (auto dockWidget : m_dockWidgetsMap) // TODO qAsConst()
dockWidget->setProperty("dirty", true); dockWidget->setProperty("dirty", true);
} }
}
/** /**
* Restores the container with the given index * Restores the container with the given index
@@ -153,9 +153,8 @@ namespace ADS
bool DockManagerPrivate::restoreContainer(int index, DockingStateReader &stream, bool testing) bool DockManagerPrivate::restoreContainer(int index, DockingStateReader &stream, bool testing)
{ {
if (testing) { if (testing)
index = 0; index = 0;
}
bool result = false; bool result = false;
if (index >= m_containers.count()) { if (index >= m_containers.count()) {
@@ -183,22 +182,21 @@ namespace ADS
{ {
Q_UNUSED(version) // TODO version is not needed, why is it in here in the first place? Q_UNUSED(version) // TODO version is not needed, why is it in here in the first place?
if (state.isEmpty()) { if (state.isEmpty())
return false; return false;
}
DockingStateReader stateReader(state); DockingStateReader stateReader(state);
stateReader.readNextStartElement();
if (!stateReader.readNextStartElement()) if (!stateReader.readNextStartElement())
return false; return false;
if (stateReader.name() != "QtAdvancedDockingSystem") {
if (stateReader.name() != "QtAdvancedDockingSystem")
return false; return false;
}
qCInfo(adsLog) << stateReader.attributes().value("version"); qCInfo(adsLog) << stateReader.attributes().value("version");
bool ok; bool ok;
int v = stateReader.attributes().value("version").toInt(&ok); int v = stateReader.attributes().value("version").toInt(&ok);
if (!ok || v > CurrentVersion) { if (!ok || v > CurrentVersion)
return false; return false;
}
stateReader.setFileVersion(v); stateReader.setFileVersion(v);
bool result = true; bool result = true;
@@ -210,9 +208,9 @@ namespace ADS
while (stateReader.readNextStartElement()) { while (stateReader.readNextStartElement()) {
if (stateReader.name() == "container") { if (stateReader.name() == "container") {
result = restoreContainer(dockContainerCount, stateReader, testing); result = restoreContainer(dockContainerCount, stateReader, testing);
if (!result) { if (!result)
break; break;
}
dockContainerCount++; dockContainerCount++;
} }
} }
@@ -265,9 +263,9 @@ namespace ADS
if (!dockWidget || dockWidget->isClosed()) { if (!dockWidget || dockWidget->isClosed()) {
int index = dockArea->indexOfFirstOpenDockWidget(); int index = dockArea->indexOfFirstOpenDockWidget();
if (index < 0) { if (index < 0)
continue; continue;
}
dockArea->setCurrentIndex(index); dockArea->setCurrentIndex(index);
} else { } else {
dockArea->internalSetCurrentDockWidget(dockWidget); dockArea->internalSetCurrentDockWidget(dockWidget);
@@ -336,25 +334,17 @@ namespace ADS
d->m_dockAreaOverlay = new DockOverlay(this, DockOverlay::ModeDockAreaOverlay); d->m_dockAreaOverlay = new DockOverlay(this, DockOverlay::ModeDockAreaOverlay);
d->m_containerOverlay = new DockOverlay(this, DockOverlay::ModeContainerOverlay); d->m_containerOverlay = new DockOverlay(this, DockOverlay::ModeContainerOverlay);
d->m_containers.append(this); d->m_containers.append(this);
//d->loadStylesheet();
} }
DockManager::~DockManager() DockManager::~DockManager()
{ {
// If the factory default workspace is still loaded, create a default workspace just in case
// the layout changed as there is no tracking of layout changes.
if (isFactoryDefaultWorkspace(d->m_workspaceName)
&& !isDefaultWorkspace(d->m_workspaceName)) {
createWorkspace(Constants::DEFAULT_NAME);
openWorkspace(Constants::DEFAULT_NAME);
}
emit aboutToUnloadWorkspace(d->m_workspaceName); emit aboutToUnloadWorkspace(d->m_workspaceName);
save(); save();
saveStartupWorkspace();
for (auto floatingWidget : d->m_floatingWidgets) { for (auto floatingWidget : d->m_floatingWidgets)
delete floatingWidget; delete floatingWidget;
}
delete d; delete d;
} }
@@ -385,6 +375,8 @@ namespace ADS
void DockManager::setSettings(QSettings *settings) { d->m_settings = settings; } void DockManager::setSettings(QSettings *settings) { d->m_settings = settings; }
void DockManager::setWorkspacePresetsPath(const QString &path) { d->m_workspacePresetsPath = path; }
DockAreaWidget *DockManager::addDockWidget(DockWidgetArea area, DockAreaWidget *DockManager::addDockWidget(DockWidgetArea area,
DockWidget *dockWidget, DockWidget *dockWidget,
DockAreaWidget *dockAreaWidget) DockAreaWidget *dockAreaWidget)
@@ -393,6 +385,24 @@ namespace ADS
return DockContainerWidget::addDockWidget(area, dockWidget, dockAreaWidget); return DockContainerWidget::addDockWidget(area, dockWidget, dockAreaWidget);
} }
void DockManager::initialize()
{
syncWorkspacePresets();
QString workspace = ADS::Constants::DEFAULT_WORKSPACE;
// Determine workspace to restore at startup
if (autoRestorLastWorkspace()) {
QString lastWS = lastWorkspace();
if (!lastWS.isEmpty() && workspaces().contains(lastWS))
workspace = lastWS;
else
qDebug() << "Couldn't restore last workspace!";
}
openWorkspace(workspace);
}
DockAreaWidget *DockManager::addDockWidgetTab(DockWidgetArea area, DockWidget *dockWidget) DockAreaWidget *DockManager::addDockWidgetTab(DockWidgetArea area, DockWidget *dockWidget)
{ {
DockAreaWidget *areaWidget = lastAddedDockAreaWidget(area); DockAreaWidget *areaWidget = lastAddedDockAreaWidget(area);
@@ -415,9 +425,8 @@ namespace ADS
{ {
d->m_dockWidgetsMap.insert(dockWidget->objectName(), dockWidget); d->m_dockWidgetsMap.insert(dockWidget->objectName(), dockWidget);
DockAreaWidget *oldDockArea = dockWidget->dockAreaWidget(); DockAreaWidget *oldDockArea = dockWidget->dockAreaWidget();
if (oldDockArea) { if (oldDockArea)
oldDockArea->removeDockWidget(dockWidget); oldDockArea->removeDockWidget(dockWidget);
}
dockWidget->setDockManager(this); dockWidget->setDockManager(this);
FloatingDockContainer *floatingWidget = new FloatingDockContainer(dockWidget); FloatingDockContainer *floatingWidget = new FloatingDockContainer(dockWidget);
@@ -480,9 +489,8 @@ namespace ADS
stream.writeStartElement("QtAdvancedDockingSystem"); stream.writeStartElement("QtAdvancedDockingSystem");
stream.writeAttribute("version", QString::number(version)); stream.writeAttribute("version", QString::number(version));
stream.writeAttribute("containers", QString::number(d->m_containers.count())); stream.writeAttribute("containers", QString::number(d->m_containers.count()));
for (auto container : d->m_containers) { for (auto container : d->m_containers)
container->saveState(stream); container->saveState(stream);
}
stream.writeEndElement(); stream.writeEndElement();
stream.writeEndDocument(); stream.writeEndDocument();
@@ -493,9 +501,8 @@ namespace ADS
{ {
// Prevent multiple calls as long as state is not restore. This may // Prevent multiple calls as long as state is not restore. This may
// happen, if QApplication::processEvents() is called somewhere // happen, if QApplication::processEvents() is called somewhere
if (d->m_restoringState) { if (d->m_restoringState)
return false; return false;
}
// We hide the complete dock manager here. Restoring the state means // We hide the complete dock manager here. Restoring the state means
// that DockWidgets are removed from the DockArea internal stack layout // that DockWidgets are removed from the DockArea internal stack layout
@@ -506,17 +513,16 @@ namespace ADS
// events until this function is finished, the user will not see this // events until this function is finished, the user will not see this
// hiding // hiding
bool isHidden = this->isHidden(); bool isHidden = this->isHidden();
if (!isHidden) { if (!isHidden)
hide(); hide();
}
d->m_restoringState = true; d->m_restoringState = true;
emit restoringState(); emit restoringState();
bool result = d->restoreState(state, version); bool result = d->restoreState(state, version);
d->m_restoringState = false; d->m_restoringState = false;
emit stateRestored(); emit stateRestored();
if (!isHidden) { if (!isHidden)
show(); show();
}
return result; return result;
} }
@@ -524,13 +530,12 @@ namespace ADS
void DockManager::showEvent(QShowEvent *event) void DockManager::showEvent(QShowEvent *event)
{ {
Super::showEvent(event); Super::showEvent(event);
if (d->m_uninitializedFloatingWidgets.empty()) { if (d->m_uninitializedFloatingWidgets.empty())
return; return;
}
for (auto floatingWidget : d->m_uninitializedFloatingWidgets) { for (auto floatingWidget : d->m_uninitializedFloatingWidgets)
floatingWidget->show(); floatingWidget->show();
}
d->m_uninitializedFloatingWidgets.clear(); d->m_uninitializedFloatingWidgets.clear();
} }
@@ -553,8 +558,7 @@ namespace ADS
void DockManager::showWorkspaceMananger() void DockManager::showWorkspaceMananger()
{ {
// Save current workspace save(); // Save current workspace
save();
WorkspaceDialog workspaceDialog(this, parentWidget()); WorkspaceDialog workspaceDialog(this, parentWidget());
workspaceDialog.setAutoLoadWorkspace(autoRestorLastWorkspace()); workspaceDialog.setAutoLoadWorkspace(autoRestorLastWorkspace());
@@ -565,30 +569,22 @@ namespace ADS
workspaceDialog.autoLoadWorkspace()); workspaceDialog.autoLoadWorkspace());
} }
bool DockManager::isFactoryDefaultWorkspace(const QString &workspace) const bool DockManager::isWorkspacePreset(const QString &workspace) const
{ {
return workspace == QLatin1String(Constants::FACTORY_DEFAULT_NAME); return d->m_workspacePresets.contains(workspace);
}
bool DockManager::isDefaultWorkspace(const QString &workspace) const
{
return workspace == QLatin1String(Constants::DEFAULT_NAME);
} }
bool DockManager::save() bool DockManager::save()
{ {
if (isFactoryDefaultWorkspace(activeWorkspace()))
return true;
emit aboutToSaveWorkspace(); emit aboutToSaveWorkspace();
bool result = write(saveState(), parentWidget()); bool result = write(activeWorkspace(), saveState(), parentWidget());
if (result) { if (result) {
d->m_workspaceDateTimes.insert(activeWorkspace(), QDateTime::currentDateTime()); d->m_workspaceDateTimes.insert(activeWorkspace(), QDateTime::currentDateTime());
} else { } else {
QMessageBox::warning(parentWidget(), QMessageBox::warning(parentWidget(),
tr("Cannot Save Session"), tr("Cannot Save Workspace"),
tr("Could not save session to file %1") tr("Could not save workspace to file %1")
.arg(workspaceNameToFileName(d->m_workspaceName) .arg(workspaceNameToFileName(d->m_workspaceName)
.toUserOutput())); .toUserOutput()));
} }
@@ -624,15 +620,13 @@ namespace ADS
QFileInfoList workspaceFiles QFileInfoList workspaceFiles
= workspaceDir.entryInfoList(QStringList() << QLatin1String("*.wrk"), = workspaceDir.entryInfoList(QStringList() << QLatin1String("*.wrk"),
QDir::NoFilter, QDir::NoFilter,
QDir::Time); // TODO Choose different extension QDir::Time);
for (const QFileInfo &fileInfo : workspaceFiles) { for (const QFileInfo &fileInfo : workspaceFiles) {
QString filename = fileInfo.completeBaseName(); QString filename = fileInfo.completeBaseName();
filename.replace("_", " "); filename.replace("_", " ");
d->m_workspaceDateTimes.insert(filename, fileInfo.lastModified()); d->m_workspaceDateTimes.insert(filename, fileInfo.lastModified());
//if (name != QLatin1String(Constants::DEFAULT_NAME))
tmp.insert(filename); tmp.insert(filename);
} }
//d->m_workspaces.prepend(QLatin1String(Constants::DEFAULT_NAME));
d->m_workspaceListDirty = false; d->m_workspaceListDirty = false;
d->m_workspaces = Utils::toList(tmp); d->m_workspaces = Utils::toList(tmp);
@@ -640,6 +634,23 @@ namespace ADS
return d->m_workspaces; return d->m_workspaces;
} }
QSet<QString> DockManager::workspacePresets() const
{
if (d->m_workspacePresets.isEmpty()) {
QDir workspacePresetsDir(d->m_workspacePresetsPath);
QFileInfoList workspacePresetsFiles
= workspacePresetsDir.entryInfoList(QStringList() << QLatin1String("*.wrk"),
QDir::NoFilter,
QDir::Time);
for (const QFileInfo &fileInfo : workspacePresetsFiles) {
QString filename = fileInfo.completeBaseName();
filename.replace("_", " ");
d->m_workspacePresets.insert(filename);
}
}
return d->m_workspacePresets;
}
QDateTime DockManager::workspaceDateTime(const QString &workspace) const QDateTime DockManager::workspaceDateTime(const QString &workspace) const
{ {
return d->m_workspaceDateTimes.value(workspace); return d->m_workspaceDateTimes.value(workspace);
@@ -661,12 +672,21 @@ namespace ADS
{ {
if (workspaces().contains(workspace)) if (workspaces().contains(workspace))
return false; return false;
bool result = write(workspace, saveState(), parentWidget());
if (result) {
d->m_workspaces.insert(1, workspace); d->m_workspaces.insert(1, workspace);
d->m_workspaceDateTimes.insert(workspace, QDateTime::currentDateTime()); d->m_workspaceDateTimes.insert(workspace, QDateTime::currentDateTime());
emit workspaceListChanged(); emit workspaceListChanged();
} else {
QMessageBox::warning(parentWidget(),
tr("Cannot Save Workspace"),
tr("Could not save workspace to file %1")
.arg(workspaceNameToFileName(d->m_workspaceName)
.toUserOutput()));
}
return true; return result;
} }
bool DockManager::openWorkspace(const QString &workspace) bool DockManager::openWorkspace(const QString &workspace)
@@ -674,7 +694,7 @@ namespace ADS
// Do nothing if we have that workspace already loaded, exception if the // Do nothing if we have that workspace already loaded, exception if the
// workspace is the default virgin workspace we still want to be able to // workspace is the default virgin workspace we still want to be able to
// load the default workspace. // load the default workspace.
if (workspace == d->m_workspaceName) // && !isFactoryDefaultWorkspace(workspace)) if (workspace == d->m_workspaceName && !isWorkspacePreset(workspace))
return true; return true;
if (!workspaces().contains(workspace)) if (!workspaces().contains(workspace))
@@ -684,38 +704,45 @@ namespace ADS
if (!d->m_workspaceName.isEmpty()) { if (!d->m_workspaceName.isEmpty()) {
// Allow everyone to set something in the workspace and before saving // Allow everyone to set something in the workspace and before saving
emit aboutToUnloadWorkspace(d->m_workspaceName); emit aboutToUnloadWorkspace(d->m_workspaceName);
if (!save()) { if (!save())
return false; return false;
} }
}
// Try loading the file // Try loading the file
QByteArray data; QByteArray data = loadWorkspace(workspace);
Utils::FilePath fileName = workspaceNameToFileName(workspace); if (data.isEmpty())
if (fileName.exists()) {
QFile file(fileName.toString());
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QMessageBox::warning(parentWidget(),
tr("Cannot Restore Workspace"),
tr("Could not restore workspace %1")
.arg(fileName.toUserOutput()));
return false; return false;
}
data = file.readAll();
file.close();
}
emit openingWorkspace(workspace); emit openingWorkspace(workspace);
// If data was loaded from file try to restore its state // If data was loaded from file try to restore its state
if (!data.isNull() && !restoreState(data)) { if (!data.isNull() && !restoreState(data))
return false; return false;
}
d->m_workspaceName = workspace; d->m_workspaceName = workspace;
emit workspaceLoaded(workspace); emit workspaceLoaded(workspace);
return true; return true;
} }
bool DockManager::reloadActiveWorkspace()
{
if (!workspaces().contains(activeWorkspace()))
return false;
// Try loading the file
QByteArray data = loadWorkspace(activeWorkspace());
if (data.isEmpty())
return false;
// If data was loaded from file try to restore its state
if (!data.isNull() && !restoreState(data))
return false;
emit workspaceReloaded(activeWorkspace());
return true;
}
/** /**
* \brief Shows a dialog asking the user to confirm deleting the workspace \p workspace * \brief Shows a dialog asking the user to confirm deleting the workspace \p workspace
*/ */
@@ -742,6 +769,7 @@ namespace ADS
// Remove workspace from internal list // Remove workspace from internal list
if (!d->m_workspaces.contains(workspace)) if (!d->m_workspaces.contains(workspace))
return false; return false;
d->m_workspaces.removeOne(workspace); d->m_workspaces.removeOne(workspace);
emit workspacesRemoved(); emit workspacesRemoved();
@@ -752,8 +780,7 @@ namespace ADS
if (fi.exists()) if (fi.exists())
return fi.remove(); return fi.remove();
return false; // TODO If we allow temporary workspaces without writing them to file return false;
// directly, this needs to be true otherwise in all those cases it will return false.
} }
void DockManager::deleteWorkspaces(const QStringList &workspaces) void DockManager::deleteWorkspaces(const QStringList &workspaces)
@@ -787,36 +814,111 @@ namespace ADS
return deleteWorkspace(original); return deleteWorkspace(original);
} }
bool DockManager::write(const QByteArray &data, QString *errorString) const bool DockManager::resetWorkspacePreset(const QString &workspace)
{ {
Utils::FilePath fileName = workspaceNameToFileName(activeWorkspace()); if (!isWorkspacePreset(workspace))
return false;
Utils::FilePath filename = workspaceNameToFileName(workspace);
if (!QFile::remove(filename.toString()))
return false;
QDir presetsDir(d->m_workspacePresetsPath);
QString presetName = workspace;
presetName.replace(" ", "_");
presetName.append(".wrk");
bool result = QFile::copy(presetsDir.filePath(presetName), filename.toString());
if (result)
d->m_workspaceDateTimes.insert(workspace, QDateTime::currentDateTime());
return result;
}
bool DockManager::write(const QString &workspace, const QByteArray &data, QString *errorString) const
{
Utils::FilePath filename = workspaceNameToFileName(workspace);
QDir tmp; QDir tmp;
tmp.mkpath(fileName.toFileInfo().path()); tmp.mkpath(filename.toFileInfo().path());
Utils::FileSaver fileSaver(fileName.toString(), QIODevice::Text); Utils::FileSaver fileSaver(filename.toString(), QIODevice::Text);
if (!fileSaver.hasError()) { if (!fileSaver.hasError())
fileSaver.write(data); fileSaver.write(data);
}
bool ok = fileSaver.finalize(); bool ok = fileSaver.finalize();
if (!ok && errorString) { if (!ok && errorString)
*errorString = fileSaver.errorString(); *errorString = fileSaver.errorString();
}
return ok; return ok;
} }
#ifdef QT_GUI_LIB bool DockManager::write(const QString &workspace, const QByteArray &data, QWidget *parent) const
bool DockManager::write(const QByteArray &data, QWidget *parent) const
{ {
QString errorString; QString errorString;
const bool success = write(data, &errorString); const bool success = write(workspace, data, &errorString);
if (!success) if (!success)
QMessageBox::critical(parent, QMessageBox::critical(parent,
QCoreApplication::translate("Utils::FileSaverBase", "File Error"), QCoreApplication::translate("Utils::FileSaverBase", "File Error"),
errorString); errorString);
return success; return success;
} }
#endif // QT_GUI_LIB
QByteArray DockManager::loadWorkspace(const QString &workspace) const
{
QByteArray data;
Utils::FilePath fileName = workspaceNameToFileName(workspace);
if (fileName.exists()) {
QFile file(fileName.toString());
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QMessageBox::warning(parentWidget(),
tr("Cannot Restore Workspace"),
tr("Could not restore workspace %1")
.arg(fileName.toUserOutput()));
return data;
}
data = file.readAll();
file.close();
}
return data;
}
void DockManager::syncWorkspacePresets()
{
// Get a list of all workspace presets
QSet<QString> presets = workspacePresets();
// Get a list of all available workspaces
QSet<QString> availableWorkspaces = Utils::toSet(workspaces());
presets.subtract(availableWorkspaces);
// Copy all missing workspace presets over to the local workspace folder
QDir presetsDir(d->m_workspacePresetsPath);
QDir workspaceDir(QFileInfo(d->m_settings->fileName()).path() + QLatin1String("/workspaces"));
for (const auto &preset : presets) {
QString filename = preset;
filename.replace(" ", "_");
filename.append(".wrk");
QString filePath = presetsDir.filePath(filename);
QFile file(filePath);
if (file.exists()) {
file.copy(workspaceDir.filePath(filename));
d->m_workspaceListDirty = true;
}
}
// After copying over missing workspace presets, update the workspace list
workspaces();
}
void DockManager::saveStartupWorkspace()
{
QTC_ASSERT(d->m_settings, return );
d->m_settings->setValue(Constants::STARTUP_WORKSPACE_SETTINGS_KEY, activeWorkspace());
}
} // namespace ADS } // namespace ADS

View File

@@ -60,8 +60,7 @@ QT_END_NAMESPACE
namespace ADS { namespace ADS {
namespace Constants { namespace Constants {
const char FACTORY_DEFAULT_NAME[] = "factorydefault"; const char DEFAULT_WORKSPACE[] = "Essentials"; // This needs to align with a name of the shipped presets
const char DEFAULT_NAME[] = "default";
const char STARTUP_WORKSPACE_SETTINGS_KEY[] = "QML/Designer/StartupWorkspace"; const char STARTUP_WORKSPACE_SETTINGS_KEY[] = "QML/Designer/StartupWorkspace";
const char AUTO_RESTORE_WORKSPACE_SETTINGS_KEY[] = "QML/Designer/AutoRestoreLastWorkspace"; const char AUTO_RESTORE_WORKSPACE_SETTINGS_KEY[] = "QML/Designer/AutoRestoreLastWorkspace";
} // namespace Constants } // namespace Constants
@@ -271,6 +270,13 @@ public:
*/ */
void setSettings(QSettings *settings); void setSettings(QSettings *settings);
/**
* Set the path to the workspace presets folder.
*/
void setWorkspacePresetsPath(const QString &path);
void initialize();
/** /**
* Adds dockwidget into the given area. * Adds dockwidget into the given area.
* If DockAreaWidget is not null, then the area parameter indicates the area * If DockAreaWidget is not null, then the area parameter indicates the area
@@ -445,12 +451,14 @@ public:
QString lastWorkspace() const; QString lastWorkspace() const;
bool autoRestorLastWorkspace() const; bool autoRestorLastWorkspace() const;
QStringList workspaces(); QStringList workspaces();
QSet<QString> workspacePresets() const;
QDateTime workspaceDateTime(const QString &workspace) const; QDateTime workspaceDateTime(const QString &workspace) const;
Utils::FilePath workspaceNameToFileName(const QString &workspaceName) const; Utils::FilePath workspaceNameToFileName(const QString &workspaceName) const;
bool createWorkspace(const QString &workspace); bool createWorkspace(const QString &workspace);
bool openWorkspace(const QString &workspace); bool openWorkspace(const QString &workspace);
bool reloadActiveWorkspace();
bool confirmWorkspaceDelete(const QStringList &workspaces); bool confirmWorkspaceDelete(const QStringList &workspaces);
bool deleteWorkspace(const QString &workspace); bool deleteWorkspace(const QString &workspace);
@@ -459,22 +467,28 @@ public:
bool cloneWorkspace(const QString &original, const QString &clone); bool cloneWorkspace(const QString &original, const QString &clone);
bool renameWorkspace(const QString &original, const QString &newName); bool renameWorkspace(const QString &original, const QString &newName);
bool resetWorkspacePreset(const QString &workspace);
bool save(); bool save();
bool isFactoryDefaultWorkspace(const QString &workspace) const; bool isWorkspacePreset(const QString &workspace) const;
bool isDefaultWorkspace(const QString &workspace) const;
signals: signals:
void aboutToUnloadWorkspace(QString workspaceName); void aboutToUnloadWorkspace(QString workspaceName);
void aboutToLoadWorkspace(QString workspaceName); void aboutToLoadWorkspace(QString workspaceName);
void workspaceLoaded(QString workspaceName); void workspaceLoaded(QString workspaceName);
void workspaceReloaded(QString workspaceName);
void aboutToSaveWorkspace(); void aboutToSaveWorkspace();
private: private:
bool write(const QByteArray &data, QString *errorString) const; bool write(const QString &workspace, const QByteArray &data, QString *errorString) const;
#ifdef QT_GUI_LIB bool write(const QString &workspace, const QByteArray &data, QWidget *parent) const;
bool write(const QByteArray &data, QWidget *parent) const;
#endif QByteArray loadWorkspace(const QString &workspace) const;
void syncWorkspacePresets();
void saveStartupWorkspace();
}; // class DockManager }; // class DockManager
} // namespace ADS } // namespace ADS

View File

@@ -64,9 +64,9 @@ QValidator::State WorkspaceValidator::validate(QString &input, int &pos) const
{ {
Q_UNUSED(pos) Q_UNUSED(pos)
if (input.contains(QLatin1Char('/')) || input.contains(QLatin1Char(':')) static QRegExp rx("[a-zA-Z0-9 ()\\-]*");
|| input.contains(QLatin1Char('\\')) || input.contains(QLatin1Char('?'))
|| input.contains(QLatin1Char('*')) || input.contains(QLatin1Char('_'))) if (!rx.exactMatch(input))
return QValidator::Invalid; return QValidator::Invalid;
if (m_workspaces.contains(input)) if (m_workspaces.contains(input))
@@ -158,15 +158,22 @@ WorkspaceDialog::WorkspaceDialog(DockManager *manager, QWidget *parent)
&QAbstractButton::clicked, &QAbstractButton::clicked,
m_ui.workspaceView, m_ui.workspaceView,
&WorkspaceView::renameCurrentWorkspace); &WorkspaceView::renameCurrentWorkspace);
connect(m_ui.btReset,
&QAbstractButton::clicked,
m_ui.workspaceView,
&WorkspaceView::resetCurrentWorkspace);
connect(m_ui.workspaceView, connect(m_ui.workspaceView,
&WorkspaceView::activated, &WorkspaceView::activated,
m_ui.workspaceView, m_ui.workspaceView,
&WorkspaceView::switchToCurrentWorkspace); &WorkspaceView::switchToCurrentWorkspace);
connect(m_ui.workspaceView,
connect(m_ui.workspaceView, &WorkspaceView::selected, this, &WorkspaceDialog::updateActions); &WorkspaceView::selected,
connect(m_ui.workspaceView, &WorkspaceView::workspaceSwitched, this, &QDialog::reject); this,
&WorkspaceDialog::updateActions);
m_ui.whatsAWorkspaceLabel->setOpenExternalLinks(true); m_ui.whatsAWorkspaceLabel->setOpenExternalLinks(true);
updateActions(m_ui.workspaceView->selectedWorkspaces());
} }
void WorkspaceDialog::setAutoLoadWorkspace(bool check) void WorkspaceDialog::setAutoLoadWorkspace(bool check)
@@ -190,16 +197,20 @@ void WorkspaceDialog::updateActions(const QStringList &workspaces)
m_ui.btDelete->setEnabled(false); m_ui.btDelete->setEnabled(false);
m_ui.btRename->setEnabled(false); m_ui.btRename->setEnabled(false);
m_ui.btClone->setEnabled(false); m_ui.btClone->setEnabled(false);
m_ui.btReset->setEnabled(false);
m_ui.btSwitch->setEnabled(false); m_ui.btSwitch->setEnabled(false);
return; return;
} }
const bool defaultIsSelected = workspaces.contains("default"); // TODO use const var const bool presetIsSelected = Utils::anyOf(workspaces, [this](const QString &workspace) {
return m_manager->isWorkspacePreset(workspace);
});
const bool activeIsSelected = Utils::anyOf(workspaces, [this](const QString &workspace) { const bool activeIsSelected = Utils::anyOf(workspaces, [this](const QString &workspace) {
return workspace == m_manager->activeWorkspace(); return workspace == m_manager->activeWorkspace();
}); });
m_ui.btDelete->setEnabled(!defaultIsSelected && !activeIsSelected); m_ui.btDelete->setEnabled(!activeIsSelected && !presetIsSelected);
m_ui.btRename->setEnabled(workspaces.size() == 1 && !defaultIsSelected); m_ui.btRename->setEnabled(workspaces.size() == 1 && !presetIsSelected);
m_ui.btClone->setEnabled(workspaces.size() == 1); m_ui.btClone->setEnabled(workspaces.size() == 1);
m_ui.btReset->setEnabled(presetIsSelected);
m_ui.btSwitch->setEnabled(workspaces.size() == 1); m_ui.btSwitch->setEnabled(workspaces.size() == 1);
} }

View File

@@ -60,6 +60,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QPushButton" name="btReset">
<property name="text">
<string>Reset</string>
</property>
</widget>
</item>
<item> <item>
<widget class="QPushButton" name="btSwitch"> <widget class="QPushButton" name="btSwitch">
<property name="text"> <property name="text">

View File

@@ -50,6 +50,7 @@ namespace ADS {
WorkspaceModel::WorkspaceModel(DockManager *manager, QObject *parent) WorkspaceModel::WorkspaceModel(DockManager *manager, QObject *parent)
: QAbstractTableModel(parent) : QAbstractTableModel(parent)
, m_manager(manager) , m_manager(manager)
, m_currentSortColumn(0)
{ {
m_sortedWorkspaces = m_manager->workspaces(); m_sortedWorkspaces = m_manager->workspaces();
connect(m_manager, &DockManager::workspaceLoaded, this, &WorkspaceModel::resetWorkspaces); connect(m_manager, &DockManager::workspaceLoaded, this, &WorkspaceModel::resetWorkspaces);
@@ -134,19 +135,18 @@ QVariant WorkspaceModel::data(const QModelIndex &index, int role) const
break; break;
case Qt::FontRole: { case Qt::FontRole: {
QFont font; QFont font;
if (m_manager->isDefaultWorkspace(workspaceName)) if (m_manager->isWorkspacePreset(workspaceName))
font.setItalic(true); font.setItalic(true);
else else
font.setItalic(false); font.setItalic(false);
if (m_manager->activeWorkspace() == workspaceName if (m_manager->activeWorkspace() == workspaceName)
&& !m_manager->isFactoryDefaultWorkspace(workspaceName))
font.setBold(true); font.setBold(true);
else else
font.setBold(false); font.setBold(false);
result = font; result = font;
} break; } break;
case DefaultWorkspaceRole: case PresetWorkspaceRole:
result = m_manager->isDefaultWorkspace(workspaceName); result = m_manager->isWorkspacePreset(workspaceName);
break; break;
case LastWorkspaceRole: case LastWorkspaceRole:
result = m_manager->lastWorkspace() == workspaceName; result = m_manager->lastWorkspace() == workspaceName;
@@ -163,7 +163,7 @@ QVariant WorkspaceModel::data(const QModelIndex &index, int role) const
QHash<int, QByteArray> WorkspaceModel::roleNames() const QHash<int, QByteArray> WorkspaceModel::roleNames() const
{ {
static QHash<int, QByteArray> extraRoles{{Qt::DisplayRole, "workspaceName"}, static QHash<int, QByteArray> extraRoles{{Qt::DisplayRole, "workspaceName"},
{DefaultWorkspaceRole, "defaultWorkspace"}, {PresetWorkspaceRole, "presetWorkspace"},
{LastWorkspaceRole, "activeWorkspace"}, {LastWorkspaceRole, "activeWorkspace"},
{ActiveWorkspaceRole, "lastWorkspace"}}; {ActiveWorkspaceRole, "lastWorkspace"}};
return QAbstractTableModel::roleNames().unite(extraRoles); return QAbstractTableModel::roleNames().unite(extraRoles);
@@ -171,6 +171,9 @@ QHash<int, QByteArray> WorkspaceModel::roleNames() const
void WorkspaceModel::sort(int column, Qt::SortOrder order) void WorkspaceModel::sort(int column, Qt::SortOrder order)
{ {
m_currentSortColumn = column;
m_currentSortOrder = order;
beginResetModel(); beginResetModel();
const auto cmp = [this, column, order](const QString &s1, const QString &s2) { const auto cmp = [this, column, order](const QString &s1, const QString &s2) {
bool isLess; bool isLess;
@@ -186,16 +189,10 @@ void WorkspaceModel::sort(int column, Qt::SortOrder order)
endResetModel(); endResetModel();
} }
bool WorkspaceModel::isDefaultVirgin() const
{
return false; //m_manager->isFactoryDefaultWorkspace(); // TODO
}
void WorkspaceModel::resetWorkspaces() void WorkspaceModel::resetWorkspaces()
{ {
beginResetModel();
m_sortedWorkspaces = m_manager->workspaces(); m_sortedWorkspaces = m_manager->workspaces();
endResetModel(); sort(m_currentSortColumn, m_currentSortOrder);
} }
void WorkspaceModel::newWorkspace(QWidget *parent) void WorkspaceModel::newWorkspace(QWidget *parent)
@@ -225,9 +222,10 @@ void WorkspaceModel::deleteWorkspaces(const QStringList &workspaces)
{ {
if (!m_manager->confirmWorkspaceDelete(workspaces)) if (!m_manager->confirmWorkspaceDelete(workspaces))
return; return;
beginResetModel();
m_manager->deleteWorkspaces(workspaces); m_manager->deleteWorkspaces(workspaces);
endResetModel(); m_sortedWorkspaces = m_manager->workspaces();
sort(m_currentSortColumn, m_currentSortOrder);
} }
void WorkspaceModel::renameWorkspace(QWidget *parent, const QString &workspace) void WorkspaceModel::renameWorkspace(QWidget *parent, const QString &workspace)
@@ -242,6 +240,12 @@ void WorkspaceModel::renameWorkspace(QWidget *parent, const QString &workspace)
}); });
} }
void WorkspaceModel::resetWorkspace(const QString &workspace)
{
if (m_manager->resetWorkspacePreset(workspace) && workspace == m_manager->activeWorkspace())
m_manager->reloadActiveWorkspace();
}
void WorkspaceModel::switchToWorkspace(const QString &workspace) void WorkspaceModel::switchToWorkspace(const QString &workspace)
{ {
m_manager->openWorkspace(workspace); m_manager->openWorkspace(workspace);
@@ -255,13 +259,14 @@ void WorkspaceModel::runWorkspaceNameInputDialog(WorkspaceNameInputDialog *works
QString newWorkspace = workspaceInputDialog->value(); QString newWorkspace = workspaceInputDialog->value();
if (newWorkspace.isEmpty() || m_manager->workspaces().contains(newWorkspace)) if (newWorkspace.isEmpty() || m_manager->workspaces().contains(newWorkspace))
return; return;
beginResetModel();
createWorkspace(newWorkspace); createWorkspace(newWorkspace);
m_sortedWorkspaces = m_manager->workspaces(); m_sortedWorkspaces = m_manager->workspaces();
endResetModel(); sort(m_currentSortColumn, m_currentSortOrder);
if (workspaceInputDialog->isSwitchToRequested()) if (workspaceInputDialog->isSwitchToRequested())
switchToWorkspace(newWorkspace); switchToWorkspace(newWorkspace);
emit workspaceCreated(newWorkspace); emit workspaceCreated(newWorkspace);
} }
} }

View File

@@ -49,7 +49,7 @@ class WorkspaceModel : public QAbstractTableModel
Q_OBJECT Q_OBJECT
public: public:
enum { DefaultWorkspaceRole = Qt::UserRole + 1, LastWorkspaceRole, ActiveWorkspaceRole }; enum { PresetWorkspaceRole = Qt::UserRole + 1, LastWorkspaceRole, ActiveWorkspaceRole };
explicit WorkspaceModel(DockManager *manager, QObject *parent = nullptr); explicit WorkspaceModel(DockManager *manager, QObject *parent = nullptr);
@@ -64,8 +64,6 @@ public:
QHash<int, QByteArray> roleNames() const override; QHash<int, QByteArray> roleNames() const override;
void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override; void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override;
Q_SCRIPTABLE bool isDefaultVirgin() const;
signals: signals:
void workspaceSwitched(); void workspaceSwitched();
void workspaceCreated(const QString &workspaceName); void workspaceCreated(const QString &workspaceName);
@@ -76,6 +74,7 @@ public:
void cloneWorkspace(QWidget *parent, const QString &workspace); void cloneWorkspace(QWidget *parent, const QString &workspace);
void deleteWorkspaces(const QStringList &workspaces); void deleteWorkspaces(const QStringList &workspaces);
void renameWorkspace(QWidget *parent, const QString &workspace); void renameWorkspace(QWidget *parent, const QString &workspace);
void resetWorkspace(const QString &workspace);
void switchToWorkspace(const QString &workspace); void switchToWorkspace(const QString &workspace);
private: private:
@@ -84,6 +83,8 @@ private:
QStringList m_sortedWorkspaces; QStringList m_sortedWorkspaces;
DockManager *m_manager; DockManager *m_manager;
int m_currentSortColumn;
Qt::SortOrder m_currentSortOrder = Qt::AscendingOrder;
}; };
} // namespace ADS } // namespace ADS

View File

@@ -84,7 +84,7 @@ WorkspaceView::WorkspaceView(QWidget *parent)
{ {
setItemDelegate(new RemoveItemFocusDelegate(this)); setItemDelegate(new RemoveItemFocusDelegate(this));
setSelectionBehavior(QAbstractItemView::SelectRows); setSelectionBehavior(QAbstractItemView::SelectRows);
setSelectionMode(QAbstractItemView::ExtendedSelection); setSelectionMode(QAbstractItemView::SingleSelection);
setWordWrap(false); setWordWrap(false);
setRootIsDecorated(false); setRootIsDecorated(false);
setSortingEnabled(true); setSortingEnabled(true);
@@ -145,6 +145,11 @@ void WorkspaceView::renameCurrentWorkspace()
m_workspaceModel.renameWorkspace(this, currentWorkspace()); m_workspaceModel.renameWorkspace(this, currentWorkspace());
} }
void WorkspaceView::resetCurrentWorkspace()
{
m_workspaceModel.resetWorkspace(currentWorkspace());
}
void WorkspaceView::switchToCurrentWorkspace() void WorkspaceView::switchToCurrentWorkspace()
{ {
m_workspaceModel.switchToWorkspace(currentWorkspace()); m_workspaceModel.switchToWorkspace(currentWorkspace());
@@ -187,8 +192,7 @@ void WorkspaceView::keyPressEvent(QKeyEvent *event)
return; return;
} }
const QStringList workspaces = selectedWorkspaces(); const QStringList workspaces = selectedWorkspaces();
if (!workspaces.contains("default") if (!Utils::anyOf(workspaces, [this](const QString &workspace) {
&& !Utils::anyOf(workspaces, [this](const QString &workspace) {
return workspace == m_manager->activeWorkspace(); return workspace == m_manager->activeWorkspace();
})) { })) {
deleteWorkspaces(workspaces); deleteWorkspaces(workspaces);

View File

@@ -57,6 +57,7 @@ public:
void deleteSelectedWorkspaces(); void deleteSelectedWorkspaces();
void cloneCurrentWorkspace(); void cloneCurrentWorkspace();
void renameCurrentWorkspace(); void renameCurrentWorkspace();
void resetCurrentWorkspace();
void switchToCurrentWorkspace(); void switchToCurrentWorkspace();
QString currentWorkspace(); QString currentWorkspace();
@@ -64,6 +65,8 @@ public:
void selectActiveWorkspace(); void selectActiveWorkspace();
void selectWorkspace(const QString &workspaceName); void selectWorkspace(const QString &workspaceName);
QStringList selectedWorkspaces() const;
signals: signals:
void activated(const QString &workspace); void activated(const QString &workspace);
void selected(const QStringList &workspaces); void selected(const QStringList &workspaces);
@@ -74,7 +77,6 @@ private:
void keyPressEvent(QKeyEvent *event) override; void keyPressEvent(QKeyEvent *event) override;
void deleteWorkspaces(const QStringList &workspaces); void deleteWorkspaces(const QStringList &workspaces);
QStringList selectedWorkspaces() const;
static WorkspaceDialog *castToWorkspaceDialog(QWidget *widget); static WorkspaceDialog *castToWorkspaceDialog(QWidget *widget);

View File

@@ -56,6 +56,7 @@
#include <coreplugin/idocument.h> #include <coreplugin/idocument.h>
#include <coreplugin/inavigationwidgetfactory.h> #include <coreplugin/inavigationwidgetfactory.h>
#include <utils/algorithm.h>
#include <utils/fileutils.h> #include <utils/fileutils.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
@@ -230,9 +231,12 @@ void DesignModeWidget::setup()
actionManager.createDefaultAddResourceHandler(); actionManager.createDefaultAddResourceHandler();
actionManager.polishActions(); actionManager.polishActions();
auto settings = Core::ICore::settings(QSettings::UserScope);
m_dockManager = new ADS::DockManager(this); m_dockManager = new ADS::DockManager(this);
m_dockManager->setConfigFlags(ADS::DockManager::DefaultNonOpaqueConfig); m_dockManager->setConfigFlags(ADS::DockManager::DefaultNonOpaqueConfig);
m_dockManager->setSettings(Core::ICore::settings(QSettings::UserScope)); m_dockManager->setSettings(settings);
m_dockManager->setWorkspacePresetsPath(Core::ICore::resourcePath() + QLatin1String("/qmldesigner/workspacePresets/"));
QString sheet = QString::fromUtf8(Utils::FileReader::fetchQrc(":/qmldesigner/dockwidgets.css")); QString sheet = QString::fromUtf8(Utils::FileReader::fetchQrc(":/qmldesigner/dockwidgets.css"));
m_dockManager->setStyleSheet(Theme::replaceCssColors(sheet)); m_dockManager->setStyleSheet(Theme::replaceCssColors(sheet));
@@ -369,32 +373,7 @@ void DesignModeWidget::setup()
if (currentDesignDocument()) if (currentDesignDocument())
setupNavigatorHistory(currentDesignDocument()->textEditor()); setupNavigatorHistory(currentDesignDocument()->textEditor());
// Get a list of all available workspaces m_dockManager->initialize();
QStringList workspaces = m_dockManager->workspaces();
QString workspace = ADS::Constants::FACTORY_DEFAULT_NAME;
// If there is no factory default workspace create one and write the xml file
if (!workspaces.contains(ADS::Constants::FACTORY_DEFAULT_NAME)) {
createFactoryDefaultWorkspace();
// List of workspaces needs to be updated
workspaces = m_dockManager->workspaces();
}
// Determine workspace to restore at startup
if (m_dockManager->autoRestorLastWorkspace()) {
QString lastWorkspace = m_dockManager->lastWorkspace();
if (!lastWorkspace.isEmpty() && workspaces.contains(lastWorkspace))
workspace = lastWorkspace;
else
qDebug() << "Couldn't restore last workspace!";
}
if (workspace.isNull() && workspaces.contains(ADS::Constants::DEFAULT_NAME)) {
workspace = ADS::Constants::DEFAULT_NAME;
}
m_dockManager->openWorkspace(workspace);
viewManager().enableWidgets(); viewManager().enableWidgets();
readSettings(); readSettings();
show(); show();
@@ -419,7 +398,11 @@ void DesignModeWidget::aboutToShowWorkspaces()
menu->addSeparator(); menu->addSeparator();
for (const auto &workspace : m_dockManager->workspaces()) // Sort the list of workspaces
auto sortedWorkspaces = m_dockManager->workspaces();
Utils::sort(sortedWorkspaces);
for (const auto &workspace : sortedWorkspaces)
{ {
QAction *action = ag->addAction(workspace); QAction *action = ag->addAction(workspace);
action->setData(workspace); action->setData(workspace);
@@ -430,87 +413,6 @@ void DesignModeWidget::aboutToShowWorkspaces()
menu->addActions(ag->actions()); menu->addActions(ag->actions());
} }
void DesignModeWidget::createFactoryDefaultWorkspace()
{
ADS::DockAreaWidget* centerArea = nullptr;
ADS::DockAreaWidget* leftArea = nullptr;
ADS::DockAreaWidget* rightArea = nullptr;
ADS::DockAreaWidget* bottomArea = nullptr;
// Iterate over all widgets and only get the central once to start with creating the factory
// default workspace layout.
for (const WidgetInfo &widgetInfo : viewManager().widgetInfos()) {
if (widgetInfo.placementHint == widgetInfo.CentralPane) {
ADS::DockWidget *dockWidget = m_dockManager->findDockWidget(widgetInfo.uniqueId);
if (centerArea)
m_dockManager->addDockWidget(ADS::CenterDockWidgetArea, dockWidget, centerArea);
else
centerArea = m_dockManager->addDockWidget(ADS::CenterDockWidgetArea, dockWidget);
}
}
// Iterate over all widgets and get the remaining left, right and bottom widgets
for (const WidgetInfo &widgetInfo : viewManager().widgetInfos()) {
if (widgetInfo.placementHint == widgetInfo.LeftPane) {
ADS::DockWidget *dockWidget = m_dockManager->findDockWidget(widgetInfo.uniqueId);
if (leftArea)
m_dockManager->addDockWidget(ADS::CenterDockWidgetArea, dockWidget, leftArea);
else
leftArea = m_dockManager->addDockWidget(ADS::LeftDockWidgetArea, dockWidget, centerArea);
}
if (widgetInfo.placementHint == widgetInfo.RightPane) {
ADS::DockWidget *dockWidget = m_dockManager->findDockWidget(widgetInfo.uniqueId);
if (rightArea)
m_dockManager->addDockWidget(ADS::CenterDockWidgetArea, dockWidget, rightArea);
else
rightArea = m_dockManager->addDockWidget(ADS::RightDockWidgetArea, dockWidget, centerArea);
}
if (widgetInfo.placementHint == widgetInfo.BottomPane) {
ADS::DockWidget *dockWidget = m_dockManager->findDockWidget(widgetInfo.uniqueId);
if (bottomArea)
m_dockManager->addDockWidget(ADS::CenterDockWidgetArea, dockWidget, bottomArea);
else
bottomArea = m_dockManager->addDockWidget(ADS::BottomDockWidgetArea, dockWidget, centerArea);
}
}
// Iterate over all 'special' widgets
QStringList specialWidgets = {"Projects", "FileSystem", "OpenDocuments"};
ADS::DockAreaWidget* leftBottomArea = nullptr;
for (const QString &uniqueId : specialWidgets) {
ADS::DockWidget *dockWidget = m_dockManager->findDockWidget(uniqueId);
if (leftBottomArea)
m_dockManager->addDockWidget(ADS::CenterDockWidgetArea, dockWidget, leftBottomArea);
else
leftBottomArea = m_dockManager->addDockWidget(ADS::BottomDockWidgetArea, dockWidget, leftArea);
}
// Add the last widget 'OutputPane' as the bottom bottom area
ADS::DockWidget *dockWidget = m_dockManager->findDockWidget("OutputPane");
m_dockManager->addDockWidget(ADS::BottomDockWidgetArea, dockWidget, bottomArea);
// TODO This is just a test
auto splitter = centerArea->dockContainer()->rootSplitter();
splitter->setSizes({100, 800, 100});
// TODO
m_dockManager->createWorkspace(ADS::Constants::FACTORY_DEFAULT_NAME);
// Write the xml file
Utils::FilePath fileName = m_dockManager->workspaceNameToFileName(ADS::Constants::FACTORY_DEFAULT_NAME);
QString errorString;
Utils::FileSaver fileSaver(fileName.toString(), QIODevice::Text);
QByteArray data = m_dockManager->saveState();
if (!fileSaver.hasError()) {
fileSaver.write(data);
}
if (!fileSaver.finalize()) {
errorString = fileSaver.errorString();
}
}
void DesignModeWidget::toolBarOnGoBackClicked() void DesignModeWidget::toolBarOnGoBackClicked()
{ {
if (m_navigatorHistoryCounter > 0) { if (m_navigatorHistoryCounter > 0) {

View File

@@ -104,8 +104,6 @@ private: // functions
void aboutToShowWorkspaces(); void aboutToShowWorkspaces();
void createFactoryDefaultWorkspace();
private: // variables private: // variables
SwitchSplitTabWidget* m_centralTabWidget = nullptr; SwitchSplitTabWidget* m_centralTabWidget = nullptr;