diff --git a/mscore/musescore.h b/mscore/musescore.h index a91c13ad0f4af..a96014978c10f 100644 --- a/mscore/musescore.h +++ b/mscore/musescore.h @@ -568,7 +568,7 @@ class MuseScore : public QMainWindow, public MuseScoreCore { void oscAction(); #endif void deleteWorkspace(); - void undoWorkspace(); + void resetWorkspace(); void showWorkspaceMenu(); void switchLayer(const QString&); void switchPlayMode(int); diff --git a/mscore/workspace.cpp b/mscore/workspace.cpp index 6b4994f9499ce..31506ffb596f8 100644 --- a/mscore/workspace.cpp +++ b/mscore/workspace.cpp @@ -40,12 +40,12 @@ QList WorkspacesManager::m_visibleWorkspaces {}; QList> Workspace::actionToStringList {}; QList> Workspace::menuToStringList {}; -static const std::vector defaultWorkspaces { +std::vector WorkspacesManager::defaultWorkspaces { QT_TRANSLATE_NOOP("Ms::Workspace", "Basic"), QT_TRANSLATE_NOOP("Ms::Workspace", "Advanced"), }; -static const std::vector defaultEditedWorkpaces { +std::vector WorkspacesManager::defaultEditedWorkspaces { QT_TRANSLATE_NOOP("Ms::Workspace", "Basic edited"), QT_TRANSLATE_NOOP("Ms::Workspace", "Advanced edited"), }; @@ -59,12 +59,12 @@ static QString editedWorkspaceTranslatableName(const QString& oldWorkspaceTransl if (oldWorkspaceTranslatableName.isEmpty()) return QString(); - const auto it = std::find(defaultWorkspaces.begin(), defaultWorkspaces.end(), oldWorkspaceTranslatableName); + const auto it = std::find(WorkspacesManager::defaultWorkspaces.begin(), WorkspacesManager::defaultWorkspaces.end(), oldWorkspaceTranslatableName); - if (it != defaultWorkspaces.end()) { - const int idx = it - defaultWorkspaces.begin(); - if (idx < int(defaultEditedWorkpaces.size())) - return defaultEditedWorkpaces[idx]; + if (it != WorkspacesManager::defaultWorkspaces.end()) { + const int idx = it - WorkspacesManager::defaultWorkspaces.begin(); + if (idx < int(WorkspacesManager::defaultEditedWorkspaces.size())) + return WorkspacesManager::defaultEditedWorkspaces[idx]; } return QString(); @@ -74,28 +74,37 @@ static QString editedWorkspaceTranslatableName(const QString& oldWorkspaceTransl // editedWorkspaceName //--------------------------------------------------------- -static QString defaultWorkspaceTranslatableName(const QString& editedWorkspaceName) +QString WorkspacesManager::defaultWorkspaceTranslatableName(const QString& editedWorkspaceName) { - const auto it = std::find(defaultEditedWorkpaces.begin(), defaultEditedWorkpaces.end(), editedWorkspaceName); + const auto it = std::find(WorkspacesManager::defaultEditedWorkspaces.begin(), WorkspacesManager::defaultEditedWorkspaces.end(), editedWorkspaceName); - if (it != defaultEditedWorkpaces.end()) { - const int idx = it - defaultEditedWorkpaces.begin(); - if (idx < int(defaultWorkspaces.size())) - return defaultWorkspaces[idx]; + if (it != WorkspacesManager::defaultEditedWorkspaces.end()) { + const int idx = it - WorkspacesManager::defaultEditedWorkspaces.begin(); + if (idx < int(WorkspacesManager::defaultWorkspaces.size())) + return WorkspacesManager::defaultWorkspaces[idx]; } return QString(); } -//--------------------------------------------------------- -// undoWorkspace -//--------------------------------------------------------- - -void MuseScore::undoWorkspace() +/** + * Reverts current workspace to the state of the `source` workspace + */ +void MuseScore::resetWorkspace() { - // TODO: make a separate session start backup? - WorkspacesManager::currentWorkspace()->read(); - WorkspacesManager::currentWorkspace()->setDirty(false); + //if currentWorkspace is the `edited` Basic or Advanced one, remove the edited and show the source one + if (WorkspacesManager::isDefaultEditedWorkspace(WorkspacesManager::currentWorkspace())) { + const QString& currWorkspaceName = WorkspacesManager::currentWorkspace()->translatableName(); + const QString& defaultWorkspaceName = WorkspacesManager::defaultWorkspaceTranslatableName(currWorkspaceName); + Q_ASSERT(!defaultWorkspaceName.isEmpty()); + Workspace* defaultWorkspace = WorkspacesManager::findByTranslatableName(defaultWorkspaceName); + Workspace* currWorkspace = WorkspacesManager::currentWorkspace(); + changeWorkspace(defaultWorkspace); + WorkspacesManager::remove(currWorkspace); + } + //else if currentWorkspace is a custom workspace, reset all palettes, toolbars, menus and GUI to the values defined in the source workspace + else + WorkspacesManager::currentWorkspace()->reset(); } //--------------------------------------------------------- @@ -115,7 +124,7 @@ void MuseScore::showWorkspaceMenu() } menuWorkspaces->clear(); - for (Workspace* p : WorkspacesManager::workspaces()) { + for (Workspace* p : WorkspacesManager::visibleWorkspaces()) { QAction* a = workspaces->addAction(qApp->translate("Ms::Workspace", p->name().toUtf8())); a->setCheckable(true); a->setData(p->path()); @@ -138,8 +147,8 @@ void MuseScore::showWorkspaceMenu() connect(a, SIGNAL(triggered()), SLOT(deleteWorkspace())); menuWorkspaces->addAction(a); - a = new QAction(tr("Undo Changes"), this); - connect(a, SIGNAL(triggered()), SLOT(undoWorkspace())); + a = new QAction(tr("Reset workspace"), this); + connect(a, SIGNAL(triggered()), SLOT(resetWorkspace())); menuWorkspaces->addAction(a); } @@ -169,10 +178,7 @@ void MuseScore::deleteWorkspace() if (reply != QMessageBox::Yes) return; - WorkspacesManager::remove(workspace->name()); - QFile f(workspace->path()); - f.remove(); - delete workspace; + WorkspacesManager::remove(workspace); WorkspacesManager::setCurrentWorkspace(WorkspacesManager::workspaces().first()); changeWorkspace(WorkspacesManager::currentWorkspace()); updateIcons(); @@ -208,12 +214,11 @@ void MuseScore::changeWorkspace(const QString& name) void MuseScore::changeWorkspace(Workspace* p, bool first) { - if (!first) { + if (!first) WorkspacesManager::currentWorkspace()->save(); - if (WorkspacesManager::currentWorkspace()) - disconnect(getPaletteWorkspace(), &PaletteWorkspace::userPaletteChanged, WorkspacesManager::currentWorkspace(), QOverload<>::of(&Workspace::setDirty)); - } + if (WorkspacesManager::currentWorkspace()) + disconnect(getPaletteWorkspace(), &PaletteWorkspace::userPaletteChanged, WorkspacesManager::currentWorkspace(), QOverload<>::of(&Workspace::setDirty)); p->read(); WorkspacesManager::setCurrentWorkspace(p); @@ -251,9 +256,17 @@ void MuseScore::updateIcons() } } -//--------------------------------------------------------- -// initWorkspace -//--------------------------------------------------------- +bool WorkspacesManager::isDefaultWorkspace(Workspace* workspace) + { + //returns true if @workspace's name is one of the "Basic/Advanced" + return std::find(defaultWorkspaces.begin(), defaultWorkspaces.end(), workspace->translatableName()) != defaultWorkspaces.end(); + } + +bool WorkspacesManager::isDefaultEditedWorkspace(Workspace* workspace) + { + //returns true if @workspace's name is one of the "Basic edited/Advanced edited" + return std::find(WorkspacesManager::defaultEditedWorkspaces.begin(), WorkspacesManager::defaultEditedWorkspaces.end(), workspace->translatableName()) != WorkspacesManager::defaultEditedWorkspaces.end(); + } void WorkspacesManager::initCurrentWorkspace() { @@ -264,6 +277,17 @@ void WorkspacesManager::initCurrentWorkspace() m_currentWorkspace = workspaces().at(0); } +void WorkspacesManager::remove(Workspace* workspace) + { + m_workspaces.removeOne(findByName(workspace->name())); + QFile f(workspace->path()); + f.remove(); + delete workspace; + isWorkspacesListDirty = true; + initWorkspaces(); + emit mscore->workspacesChanged(); + } + //--------------------------------------------------------- // writeFailed //--------------------------------------------------------- @@ -663,6 +687,20 @@ void Workspace::read() WorkspacesManager::readWorkspaceFile(_path, [this](XmlReader& e) { read(e); }); } +/** + Reset the workspace to the state of the source workspace. + Works for Custom workspaces ONLY! + */ +void Workspace::reset() + { + saveToolbars = saveMenuBar = saveComponents = false; + preferences.setUseLocalPreferences(false); + preferences.updateLocalPreferences(); + const Workspace* srcWorkspace = sourceWorkspace(); + WorkspacesManager::readWorkspaceFile(srcWorkspace->path(), [this](XmlReader& e) { read(e); }); + save(); + } + std::unique_ptr Workspace::getPaletteTree() const { std::unique_ptr paletteTree(new PaletteTree); @@ -1044,6 +1082,7 @@ void Workspace::ensureWorkspaceSaved() _readOnly = !fi.isWritable(); Q_ASSERT(!_readOnly); + WorkspacesManager::refreshWorkspaces(); preferences.setPreference(PREF_APP_WORKSPACE, name()); emit mscore->workspacesChanged(); } @@ -1118,8 +1157,8 @@ void WorkspacesManager::initWorkspaces() QFileInfo fi(path); QString name(fi.completeBaseName()); - const bool isDefault = std::find(defaultWorkspaces.begin(), defaultWorkspaces.end(), name) != defaultWorkspaces.end(); - const bool isEditedDefault = std::find(defaultEditedWorkpaces.begin(), defaultEditedWorkpaces.end(), name) != defaultEditedWorkpaces.end(); + const bool isDefault = std::find(WorkspacesManager::defaultWorkspaces.begin(), WorkspacesManager::defaultWorkspaces.end(), name) != WorkspacesManager::defaultWorkspaces.end(); + const bool isEditedDefault = std::find(WorkspacesManager::defaultEditedWorkspaces.begin(), WorkspacesManager::defaultEditedWorkspaces.end(), name) != WorkspacesManager::defaultEditedWorkspaces.end(); const bool translate = isDefault || isEditedDefault; @@ -1152,22 +1191,6 @@ void WorkspacesManager::initWorkspaces() for (Workspace* old : oldWorkspaces) m_workspaces.removeOne(old); - // Delete default workspaces if there are corresponding user-edited ones - m_visibleWorkspaces = m_workspaces; - for (Workspace* ew : editedWorkpaces) { - const QString uneditedName = defaultWorkspaceTranslatableName(ew->translatableName()); - if (uneditedName.isEmpty()) - continue; - - for (auto it = m_visibleWorkspaces.begin(); it != m_visibleWorkspaces.end(); ++it) { - Workspace* w = *it; - if (w->translatableName() == uneditedName) { - m_visibleWorkspaces.erase(it); - break; - } - } - } - if (m_workspaces.empty()) qFatal("No workspaces found"); @@ -1179,12 +1202,30 @@ void WorkspacesManager::initWorkspaces() // hack for (int i = 0; i < m_workspaces.size(); i++) { const QString& trName = m_workspaces[i]->translatableName(); - if (trName == defaultWorkspaces[0] || trName == defaultEditedWorkpaces[0]) { + if (trName == WorkspacesManager::defaultWorkspaces[0] || trName == WorkspacesManager::defaultEditedWorkspaces[0]) { m_workspaces.move(i, 0); break; } } + retranslate(m_workspaces); + + // Delete default workspaces if there are corresponding user-edited ones + m_visibleWorkspaces = m_workspaces; + for (Workspace* ew : editedWorkpaces) { + const QString uneditedName = defaultWorkspaceTranslatableName(ew->translatableName()); + if (uneditedName.isEmpty()) + continue; + + for (auto it = m_visibleWorkspaces.begin(); it != m_visibleWorkspaces.end(); ++it) { + Workspace* w = *it; + if (w->translatableName() == uneditedName) { + m_visibleWorkspaces.erase(it); + break; + } + } + } + isWorkspacesListDirty = false; } @@ -1200,7 +1241,7 @@ void WorkspacesManager::refreshWorkspaces() const Workspace* Workspace::sourceWorkspace() const { - const QString sourceName = _sourceWorkspaceName.isEmpty() ? defaultWorkspaces[0] : _sourceWorkspaceName; + const QString sourceName = _sourceWorkspaceName.isEmpty() ? WorkspacesManager::defaultWorkspaces[0] : _sourceWorkspaceName; if (translatableName() == sourceName || name() == sourceName) return this; @@ -1239,8 +1280,10 @@ Workspace* WorkspacesManager::createNewWorkspace(const QString& name) w->setDirty(false); w->setReadOnly(false); w->write(); + w->setSourceWorkspaceName(WorkspacesManager::currentWorkspace()->sourceWorkspaceName()); m_workspaces.append(w); + m_visibleWorkspaces.append(w); return w; } diff --git a/mscore/workspace.h b/mscore/workspace.h index d75dea28496f5..0930062bc3c16 100644 --- a/mscore/workspace.h +++ b/mscore/workspace.h @@ -91,8 +91,11 @@ class Workspace : public QObject { void read(); bool readOnly() const { return _readOnly; } void setReadOnly(bool val) { _readOnly = val; } + void reset(); const Workspace* sourceWorkspace() const; + void setSourceWorkspaceName(const QString& sourceWorkspaceName) { _sourceWorkspaceName = sourceWorkspaceName; } + QString sourceWorkspaceName() { return _sourceWorkspaceName; } std::unique_ptr getPaletteTree() const; @@ -142,10 +145,7 @@ class WorkspacesManager { return nullptr; } - static void remove(const QString& name) { - m_workspaces.removeOne(findByName(name)); - } - + static void remove(Workspace* workspace); static const QList& workspaces() { if (isWorkspacesListDirty || m_workspaces.isEmpty()) initWorkspaces(); @@ -156,13 +156,20 @@ class WorkspacesManager { if (isWorkspacesListDirty || m_visibleWorkspaces.isEmpty()) initWorkspaces(); return m_visibleWorkspaces; - } + } //replace with `const Workspace*` in future static Workspace* currentWorkspace() { return m_currentWorkspace; } static void setCurrentWorkspace(Workspace* currWorkspace) { m_currentWorkspace = currWorkspace; } static void initCurrentWorkspace(); + static bool isDefaultWorkspace(Workspace* workspace); + static bool isDefaultEditedWorkspace(Workspace* workspace); + static QString defaultWorkspaceTranslatableName(const QString& editedWorkspaceName); + + public: + static std::vector defaultWorkspaces; + static std::vector defaultEditedWorkspaces; private: static QList m_workspaces; diff --git a/mscore/workspacedialog.cpp b/mscore/workspacedialog.cpp index 92e0770c116fb..6c5653ae5e5bd 100644 --- a/mscore/workspacedialog.cpp +++ b/mscore/workspacedialog.cpp @@ -125,22 +125,31 @@ void WorkspaceDialog::accepted() break; } + Workspace* newWorkspace = editMode ? WorkspacesManager::currentWorkspace() : WorkspacesManager::createNewWorkspace(s); if (!editMode) { + //save current workspace if (WorkspacesManager::currentWorkspace()->dirty()) WorkspacesManager::currentWorkspace()->save(); - WorkspacesManager::setCurrentWorkspace(WorkspacesManager::createNewWorkspace(s)); - preferences.updateLocalPreferences(); } - WorkspacesManager::currentWorkspace()->setSaveComponents(componentsCheck->isChecked()); - WorkspacesManager::currentWorkspace()->setSaveToolbars(toolbarsCheck->isChecked()); - WorkspacesManager::currentWorkspace()->setSaveMenuBar(menubarCheck->isChecked()); + //update workspace properties with the dialog values + newWorkspace->setSaveComponents(componentsCheck->isChecked()); + newWorkspace->setSaveToolbars(toolbarsCheck->isChecked()); + newWorkspace->setSaveMenuBar(menubarCheck->isChecked()); preferences.setUseLocalPreferences(prefsCheck->isChecked()); - WorkspacesManager::currentWorkspace()->save(); + + //save newly created/edited workspace + newWorkspace->save(); - if (editMode && WorkspacesManager::currentWorkspace()->name() != s) - WorkspacesManager::currentWorkspace()->rename(s); + //rename if we edit name of the existing workspace + if (editMode && newWorkspace->name() != s) + newWorkspace->rename(s); + if (!editMode) { + mscore->changeWorkspace(newWorkspace); + preferences.updateLocalPreferences(); + } + preferences.setPreference(PREF_APP_WORKSPACE, WorkspacesManager::currentWorkspace()->name()); emit mscore->workspacesChanged(); close();