Refactor Workspace
class
* Extract `WorkspacesManager` class that manages global interactions with workspaces (using static methods for now) * Introduce `find` method * Rewrite `workspaces()` method. Now, it returns const ref. * Extract `initWorkspaces` method to manage updating workspaces clearer
This commit is contained in:
parent
c94866ab54
commit
88d6c46df2
9 changed files with 215 additions and 207 deletions
|
@ -313,7 +313,7 @@ void MuseScore::showPalette(bool visible)
|
|||
{
|
||||
QAction* a = getAction("toggle-palette");
|
||||
if (!paletteWidget) {
|
||||
Workspace::currentWorkspace->read();
|
||||
WorkspacesManager::currentWorkspace()->read();
|
||||
preferencesChanged();
|
||||
updateIcons();
|
||||
|
||||
|
|
|
@ -522,15 +522,9 @@ void MuseScore::preferencesChanged(bool fromWorkspace)
|
|||
playId->setEnabled(!noSeq && seq && seq->isRunning());
|
||||
|
||||
// change workspace
|
||||
if (!fromWorkspace && preferences.getString(PREF_APP_WORKSPACE) != Workspace::currentWorkspace->name()) {
|
||||
Workspace* workspace = 0;
|
||||
for (Workspace* w: Workspace::workspaces()) {
|
||||
if (w->name() == preferences.getString(PREF_APP_WORKSPACE)) {
|
||||
workspace = w;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!fromWorkspace && preferences.getString(PREF_APP_WORKSPACE) != WorkspacesManager::currentWorkspace()->name()) {
|
||||
Workspace* workspace = WorkspacesManager::find(preferences.getString(PREF_APP_WORKSPACE));
|
||||
|
||||
if (workspace)
|
||||
mscore->changeWorkspace(workspace);
|
||||
}
|
||||
|
@ -821,9 +815,9 @@ bool MuseScore::importExtension(QString path)
|
|||
if (workspacesDir.exists() && !MScore::noGui) {
|
||||
auto wsList = workspacesDir.entryInfoList(QStringList("*.workspace"), QDir::Files);
|
||||
if (!wsList.isEmpty()) {
|
||||
Workspace::refreshWorkspaces();
|
||||
WorkspacesManager::refreshWorkspaces();
|
||||
emit workspacesChanged();
|
||||
changeWorkspace(Workspace::workspaces().last());
|
||||
changeWorkspace(WorkspacesManager::workspaces().last());
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
@ -887,21 +881,18 @@ bool MuseScore::uninstallExtension(QString extensionId)
|
|||
mscore->reloadInstrumentTemplates();
|
||||
mscore->updateInstrumentDialog();
|
||||
if (refreshWorkspaces) {
|
||||
const auto& curWorkspaceName = Workspace::currentWorkspace->name();
|
||||
Workspace::refreshWorkspaces();
|
||||
const auto curWorkspaceName = WorkspacesManager::currentWorkspace()->name();
|
||||
WorkspacesManager::refreshWorkspaces();
|
||||
emit workspacesChanged();
|
||||
auto ws = Workspace::workspaces();
|
||||
auto ws = WorkspacesManager::workspaces();
|
||||
//If current worksapce is alive, do nothing
|
||||
//Select first available workspace in the list otherwise
|
||||
bool curWorkspaceDisappeared = true;
|
||||
for (auto workspace : ws) {
|
||||
if (workspace->name() == curWorkspaceName) {
|
||||
curWorkspaceDisappeared = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
bool curWorkspaceDisappeared = false;
|
||||
if (WorkspacesManager::find(curWorkspaceName))
|
||||
curWorkspaceDisappeared = true;
|
||||
|
||||
if (curWorkspaceDisappeared)
|
||||
changeWorkspace(Workspace::workspaces().last());
|
||||
changeWorkspace(WorkspacesManager::workspaces().last());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -2029,7 +2020,7 @@ void MuseScore::retranslate()
|
|||
showMidiImportButton->setText(tr("Show MIDI import panel"));
|
||||
|
||||
Shortcut::retranslate();
|
||||
Workspace::retranslate();
|
||||
WorkspacesManager::retranslateAll();
|
||||
|
||||
if (paletteWorkspace)
|
||||
paletteWorkspace->retranslate();
|
||||
|
@ -4462,7 +4453,7 @@ void MuseScore::writeSettings()
|
|||
settings.setValue("splitter", splitter->saveState());
|
||||
settings.endGroup();
|
||||
|
||||
Workspace::currentWorkspace->save();
|
||||
WorkspacesManager::currentWorkspace()->save();
|
||||
if (keyEditor && keyEditor->dirty())
|
||||
keyEditor->save();
|
||||
if (chordStyleEditor)
|
||||
|
@ -5446,8 +5437,8 @@ PaletteWorkspace* MuseScore::getPaletteWorkspace()
|
|||
emptyModel->setParent(paletteWorkspace);
|
||||
masterPaletteModel->setParent(paletteWorkspace);
|
||||
|
||||
if (Workspace::currentWorkspace)
|
||||
connect(paletteWorkspace, &PaletteWorkspace::userPaletteChanged, Workspace::currentWorkspace, QOverload<>::of(&Workspace::setDirty), Qt::UniqueConnection);
|
||||
if (WorkspacesManager::currentWorkspace())
|
||||
connect(paletteWorkspace, &PaletteWorkspace::userPaletteChanged, WorkspacesManager::currentWorkspace(), QOverload<>::of(&Workspace::setDirty), Qt::UniqueConnection);
|
||||
}
|
||||
|
||||
return paletteWorkspace;
|
||||
|
@ -7661,7 +7652,7 @@ int main(int argc, char* av[])
|
|||
#ifndef Q_OS_MAC
|
||||
qApp->setWindowIcon(*icons[int(Icons::window_ICON)]);
|
||||
#endif
|
||||
Workspace::initWorkspace();
|
||||
WorkspacesManager::initCurrentWorkspace();
|
||||
}
|
||||
|
||||
mscore = new MuseScore();
|
||||
|
@ -7690,10 +7681,10 @@ int main(int argc, char* av[])
|
|||
setMscoreLocale(sw->language());
|
||||
Workspace::writeGlobalToolBar();
|
||||
Workspace::writeGlobalGUIState();
|
||||
for (auto ws : Workspace::workspaces()) {
|
||||
if (ws->name().compare(sw->workspace()) == 0)
|
||||
mscore->changeWorkspace(ws, true);
|
||||
}
|
||||
Workspace* targetWorkspace = WorkspacesManager::find(sw->workspace());
|
||||
if (targetWorkspace)
|
||||
mscore->changeWorkspace(targetWorkspace, true);
|
||||
|
||||
preferences.setPreference(PREF_UI_APP_STARTUP_SHOWTOURS, sw->showTours());
|
||||
delete sw;
|
||||
|
||||
|
|
|
@ -1129,9 +1129,9 @@ void PreferenceDialog::apply()
|
|||
MScore::defaultStyleForPartsHasChanged();
|
||||
}
|
||||
|
||||
Workspace::retranslate();
|
||||
preferences.setPreference(PREF_APP_WORKSPACE, Workspace::currentWorkspace->name());
|
||||
mscore->changeWorkspace(Workspace::currentWorkspace);
|
||||
WorkspacesManager::retranslateAll();
|
||||
preferences.setPreference(PREF_APP_WORKSPACE, WorkspacesManager::currentWorkspace()->name());
|
||||
mscore->changeWorkspace(WorkspacesManager::currentWorkspace());
|
||||
emit mscore->workspacesChanged();
|
||||
|
||||
emit preferencesChanged();
|
||||
|
|
|
@ -146,7 +146,7 @@ StartupWizardPage3::StartupWizardPage3(QWidget* parent)
|
|||
setTitle(tr("Workspace"));
|
||||
QLabel* label = new QLabel(tr("Choose your workspace"), this);
|
||||
QStringList workspaceList;
|
||||
for (auto workspace : Workspace::workspaces())
|
||||
for (auto workspace : WorkspacesManager::workspaces())
|
||||
workspaceList.append(qApp->translate("workspace", workspace->name().toUtf8().constData()));
|
||||
_workspaces = new QComboBox(this);
|
||||
_workspaces->addItems(workspaceList);
|
||||
|
|
|
@ -76,8 +76,8 @@ ToolbarEditor::ToolbarEditor(QWidget* parent)
|
|||
|
||||
void ToolbarEditor::init()
|
||||
{
|
||||
QString name = Workspace::currentWorkspace->name();
|
||||
bool writable = !Workspace::currentWorkspace->readOnly();
|
||||
QString name = WorkspacesManager::currentWorkspace()->name();
|
||||
bool writable = !WorkspacesManager::currentWorkspace()->readOnly();
|
||||
if (!writable) {
|
||||
name += " " + tr("(not changeable)");
|
||||
}
|
||||
|
@ -100,7 +100,7 @@ void ToolbarEditor::init()
|
|||
|
||||
void ToolbarEditor::accepted()
|
||||
{
|
||||
if (Workspace::currentWorkspace->readOnly())
|
||||
if (WorkspacesManager::currentWorkspace()->readOnly())
|
||||
return;
|
||||
// Updates the toolbars
|
||||
mscore->setNoteInputMenuEntries(*(new_toolbars->at(0)));
|
||||
|
@ -109,7 +109,7 @@ void ToolbarEditor::accepted()
|
|||
mscore->populateNoteInputMenu();
|
||||
mscore->populateFileOperations();
|
||||
mscore->populatePlaybackControls();
|
||||
Workspace::currentWorkspace->setDirty(true);
|
||||
WorkspacesManager::currentWorkspace()->setDirty(true);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------
|
||||
|
|
|
@ -32,11 +32,9 @@
|
|||
|
||||
namespace Ms {
|
||||
|
||||
bool Workspace::workspacesRead = false;
|
||||
//std::unordered_map<std::string, QVariant> Workspace::localPreferences {};
|
||||
Workspace* Workspace::currentWorkspace = nullptr;
|
||||
|
||||
QList<Workspace*> Workspace::_workspaces {};
|
||||
bool WorkspacesManager::isWorkspacesListDirty = true;
|
||||
Workspace* WorkspacesManager::m_currentWorkspace = nullptr;
|
||||
QList<Workspace*> WorkspacesManager::m_workspaces {};
|
||||
|
||||
QList<QPair<QAction*, QString>> Workspace::actionToStringList {};
|
||||
QList<QPair<QMenu* , QString>> Workspace::menuToStringList {};
|
||||
|
@ -95,8 +93,8 @@ static QString defaultWorkspaceTranslatableName(const QString& editedWorkspaceNa
|
|||
void MuseScore::undoWorkspace()
|
||||
{
|
||||
// TODO: make a separate session start backup?
|
||||
Workspace::currentWorkspace->read();
|
||||
Workspace::currentWorkspace->setDirty(false);
|
||||
WorkspacesManager::currentWorkspace()->read();
|
||||
WorkspacesManager::currentWorkspace()->setDirty(false);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------
|
||||
|
@ -116,8 +114,7 @@ void MuseScore::showWorkspaceMenu()
|
|||
}
|
||||
menuWorkspaces->clear();
|
||||
|
||||
const QList<Workspace*> pl = Workspace::workspaces();
|
||||
for (Workspace* p : pl) {
|
||||
for (Workspace* p : WorkspacesManager::workspaces()) {
|
||||
QAction* a = workspaces->addAction(qApp->translate("Ms::Workspace", p->name().toUtf8()));
|
||||
a->setCheckable(true);
|
||||
a->setData(p->path());
|
||||
|
@ -131,12 +128,12 @@ void MuseScore::showWorkspaceMenu()
|
|||
menuWorkspaces->addAction(a);
|
||||
|
||||
a = new QAction(tr("Edit"), this);
|
||||
a->setDisabled(Workspace::currentWorkspace->readOnly());
|
||||
a->setDisabled(WorkspacesManager::currentWorkspace()->readOnly());
|
||||
connect(a, SIGNAL(triggered()), SLOT(editWorkspace()));
|
||||
menuWorkspaces->addAction(a);
|
||||
|
||||
a = new QAction(tr("Delete"), this);
|
||||
a->setDisabled(Workspace::currentWorkspace->readOnly());
|
||||
a->setDisabled(WorkspacesManager::currentWorkspace()->readOnly());
|
||||
connect(a, SIGNAL(triggered()), SLOT(deleteWorkspace()));
|
||||
menuWorkspaces->addAction(a);
|
||||
|
||||
|
@ -156,13 +153,8 @@ void MuseScore::deleteWorkspace()
|
|||
QAction* a = workspaces->checkedAction();
|
||||
if (!a)
|
||||
return;
|
||||
Workspace* workspace = 0;
|
||||
for (Workspace* p : Workspace::workspaces()) {
|
||||
if (p->name() == a->text()) {
|
||||
workspace = p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Workspace* workspace = WorkspacesManager::find(a->text());
|
||||
if (!workspace)
|
||||
return;
|
||||
|
||||
|
@ -176,12 +168,12 @@ void MuseScore::deleteWorkspace()
|
|||
if (reply != QMessageBox::Yes)
|
||||
return;
|
||||
|
||||
Workspace::workspaces().removeOne(workspace);
|
||||
WorkspacesManager::remove(workspace->name());
|
||||
QFile f(workspace->path());
|
||||
f.remove();
|
||||
delete workspace;
|
||||
Workspace::currentWorkspace = Workspace::workspaces().first();
|
||||
changeWorkspace(Workspace::currentWorkspace);
|
||||
WorkspacesManager::setCurrentWorkspace(WorkspacesManager::workspaces().first());
|
||||
changeWorkspace(WorkspacesManager::currentWorkspace());
|
||||
updateIcons();
|
||||
}
|
||||
|
||||
|
@ -200,7 +192,7 @@ void MuseScore::changeWorkspace(QAction* a)
|
|||
|
||||
void MuseScore::changeWorkspace(const QString& name)
|
||||
{
|
||||
for (Workspace* p :Workspace::workspaces()) {
|
||||
for (Workspace* p : WorkspacesManager::workspaces()) {
|
||||
if (qApp->translate("Ms::Workspace", p->name().toUtf8()) == name) {
|
||||
changeWorkspace(p);
|
||||
return;
|
||||
|
@ -216,20 +208,20 @@ void MuseScore::changeWorkspace(const QString& name)
|
|||
void MuseScore::changeWorkspace(Workspace* p, bool first)
|
||||
{
|
||||
if (!first) {
|
||||
Workspace::currentWorkspace->save();
|
||||
if (Workspace::currentWorkspace)
|
||||
disconnect(getPaletteWorkspace(), &PaletteWorkspace::userPaletteChanged, Workspace::currentWorkspace, QOverload<>::of(&Workspace::setDirty));
|
||||
WorkspacesManager::currentWorkspace()->save();
|
||||
if (WorkspacesManager::currentWorkspace())
|
||||
disconnect(getPaletteWorkspace(), &PaletteWorkspace::userPaletteChanged, WorkspacesManager::currentWorkspace(), QOverload<>::of(&Workspace::setDirty));
|
||||
}
|
||||
|
||||
|
||||
p->read();
|
||||
Workspace::currentWorkspace = p;
|
||||
WorkspacesManager::setCurrentWorkspace(p);
|
||||
if (!first) {
|
||||
updateIcons();
|
||||
preferencesChanged(true);
|
||||
}
|
||||
|
||||
connect(getPaletteWorkspace(), &PaletteWorkspace::userPaletteChanged, Workspace::currentWorkspace, QOverload<>::of(&Workspace::setDirty), Qt::UniqueConnection);
|
||||
connect(getPaletteWorkspace(), &PaletteWorkspace::userPaletteChanged, WorkspacesManager::currentWorkspace(), QOverload<>::of(&Workspace::setDirty), Qt::UniqueConnection);
|
||||
|
||||
preferences.setPreference(PREF_APP_WORKSPACE, p->name());
|
||||
emit mscore->workspacesChanged();
|
||||
|
@ -262,17 +254,13 @@ void MuseScore::updateIcons()
|
|||
// initWorkspace
|
||||
//---------------------------------------------------------
|
||||
|
||||
void Workspace::initWorkspace()
|
||||
void WorkspacesManager::initCurrentWorkspace()
|
||||
{
|
||||
for (Workspace* p : Workspace::workspaces()) {
|
||||
if (p->name() == preferences.getString(PREF_APP_WORKSPACE)) {
|
||||
currentWorkspace = p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
Q_ASSERT(!Workspace::workspaces().empty());
|
||||
if (currentWorkspace == 0)
|
||||
currentWorkspace = Workspace::workspaces().at(0);
|
||||
initWorkspaces();
|
||||
m_currentWorkspace = find(preferences.getString(PREF_APP_WORKSPACE));
|
||||
Q_ASSERT(!workspaces().empty());
|
||||
if (m_currentWorkspace == 0)
|
||||
m_currentWorkspace = workspaces().at(0);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------
|
||||
|
@ -309,7 +297,7 @@ Workspace::Workspace()
|
|||
/// creating all the necessary directories.
|
||||
//---------------------------------------------------------
|
||||
|
||||
QString Workspace::makeUserWorkspacePath(const QString& name)
|
||||
QString WorkspacesManager::makeUserWorkspacePath(const QString& name)
|
||||
{
|
||||
const QString ext(".workspace");
|
||||
QDir dir;
|
||||
|
@ -327,7 +315,7 @@ QString Workspace::makeUserWorkspacePath(const QString& name)
|
|||
void Workspace::write()
|
||||
{
|
||||
if (_path.isEmpty())
|
||||
_path = Workspace::makeUserWorkspacePath(_name);
|
||||
_path = WorkspacesManager::makeUserWorkspacePath(_name);
|
||||
|
||||
MQZipWriter f(_path);
|
||||
f.setCreationPermissions(
|
||||
|
@ -622,7 +610,7 @@ extern QString readRootFile(MQZipReader*, QList<QString>&);
|
|||
// read
|
||||
//---------------------------------------------------------
|
||||
|
||||
void Workspace::readWorkspaceFile(const QString& path, std::function<void(XmlReader&)> readWorkspace)
|
||||
void WorkspacesManager::readWorkspaceFile(const QString& path, std::function<void(XmlReader&)> readWorkspace)
|
||||
{
|
||||
MQZipReader f(path);
|
||||
QList<QString> images;
|
||||
|
@ -671,13 +659,13 @@ void Workspace::read()
|
|||
|
||||
preferences.updateLocalPreferences();
|
||||
|
||||
readWorkspaceFile(_path, [this](XmlReader& e) { read(e); });
|
||||
WorkspacesManager::readWorkspaceFile(_path, [this](XmlReader& e) { read(e); });
|
||||
}
|
||||
|
||||
std::unique_ptr<PaletteTree> Workspace::getPaletteTree() const
|
||||
{
|
||||
std::unique_ptr<PaletteTree> paletteTree(new PaletteTree);
|
||||
readWorkspaceFile(_path, [&](XmlReader& e) {
|
||||
WorkspacesManager::readWorkspaceFile(_path, [&](XmlReader& e) {
|
||||
while (e.readNextStartElement()) {
|
||||
if (e.name() == "PaletteBox")
|
||||
paletteTree->read(e);
|
||||
|
@ -1047,7 +1035,7 @@ void Workspace::ensureWorkspaceSaved()
|
|||
else
|
||||
setName(tr(translatableName().toUtf8()));
|
||||
|
||||
_path = Workspace::makeUserWorkspacePath(translatableName().isEmpty() ? name() : translatableName());
|
||||
_path = WorkspacesManager::makeUserWorkspacePath(translatableName().isEmpty() ? name() : translatableName());
|
||||
|
||||
write();
|
||||
|
||||
|
@ -1120,98 +1108,97 @@ static QStringList findWorkspaceFiles()
|
|||
// workspaces
|
||||
//---------------------------------------------------------
|
||||
|
||||
QList<Workspace*>& Workspace::workspaces()
|
||||
void WorkspacesManager::initWorkspaces()
|
||||
{
|
||||
if (!workspacesRead) {
|
||||
QList<Workspace*> oldWorkspaces(_workspaces);
|
||||
QList<Workspace*> editedWorkpaces;
|
||||
|
||||
for (const QString& path : findWorkspaceFiles()) {
|
||||
Workspace* p = 0;
|
||||
QFileInfo fi(path);
|
||||
QString name(fi.completeBaseName());
|
||||
if (!isWorkspacesListDirty)
|
||||
return;
|
||||
|
||||
QList<Workspace*> oldWorkspaces(m_workspaces);
|
||||
QList<Workspace*> editedWorkpaces;
|
||||
|
||||
for (const QString& path : findWorkspaceFiles()) {
|
||||
Workspace* p = 0;
|
||||
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(defaultWorkspaces.begin(), defaultWorkspaces.end(), name) != defaultWorkspaces.end();
|
||||
const bool isEditedDefault = std::find(defaultEditedWorkpaces.begin(), defaultEditedWorkpaces.end(), name) != defaultEditedWorkpaces.end();
|
||||
|
||||
const bool translate = isDefault || isEditedDefault;
|
||||
const bool translate = isDefault || isEditedDefault;
|
||||
|
||||
for (Workspace* w : _workspaces) {
|
||||
if (w->name() == name || (translate && w->translatableName() == name)) {
|
||||
p = w;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (p)
|
||||
oldWorkspaces.removeOne(p);
|
||||
else {
|
||||
p = new Workspace;
|
||||
_workspaces.append(p);
|
||||
}
|
||||
|
||||
p->setPath(path);
|
||||
p->setName(name);
|
||||
|
||||
if (translate)
|
||||
p->setTranslatableName(name);
|
||||
|
||||
p->setReadOnly(!fi.isWritable());
|
||||
|
||||
if (isEditedDefault)
|
||||
editedWorkpaces.push_back(p);
|
||||
}
|
||||
|
||||
for (Workspace* old : oldWorkspaces)
|
||||
_workspaces.removeOne(old);
|
||||
|
||||
// Delete default workspaces if there are corresponding user-edited ones
|
||||
for (Workspace* ew : editedWorkpaces) {
|
||||
const QString uneditedName = defaultWorkspaceTranslatableName(ew->translatableName());
|
||||
if (uneditedName.isEmpty())
|
||||
continue;
|
||||
|
||||
for (auto it = _workspaces.begin(); it != _workspaces.end(); ++it) {
|
||||
Workspace* w = *it;
|
||||
if (w->translatableName() == uneditedName) {
|
||||
_workspaces.erase(it);
|
||||
delete w;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (_workspaces.empty())
|
||||
qFatal("No workspaces found");
|
||||
|
||||
if (oldWorkspaces.contains(Workspace::currentWorkspace))
|
||||
Workspace::currentWorkspace = _workspaces.first();
|
||||
|
||||
qDeleteAll(oldWorkspaces);
|
||||
|
||||
// hack
|
||||
for (int i = 0; i < _workspaces.size(); i++) {
|
||||
const QString& trName = _workspaces[i]->translatableName();
|
||||
if (trName == defaultWorkspaces[0] || trName == defaultEditedWorkpaces[0]) {
|
||||
_workspaces.move(i, 0);
|
||||
for (Workspace* w : m_workspaces) {
|
||||
if (w->name() == name || (translate && w->translatableName() == name)) {
|
||||
p = w;
|
||||
break;
|
||||
}
|
||||
}
|
||||
retranslate(&_workspaces);
|
||||
workspacesRead = true;
|
||||
|
||||
if (p)
|
||||
oldWorkspaces.removeOne(p);
|
||||
else {
|
||||
p = new Workspace;
|
||||
m_workspaces.append(p);
|
||||
}
|
||||
|
||||
p->setPath(path);
|
||||
p->setName(name);
|
||||
|
||||
if (translate)
|
||||
p->setTranslatableName(name);
|
||||
|
||||
p->setReadOnly(!fi.isWritable());
|
||||
|
||||
if (isEditedDefault)
|
||||
editedWorkpaces.push_back(p);
|
||||
}
|
||||
|
||||
return _workspaces;
|
||||
for (Workspace* old : oldWorkspaces)
|
||||
m_workspaces.removeOne(old);
|
||||
|
||||
// Delete default workspaces if there are corresponding user-edited ones
|
||||
for (Workspace* ew : editedWorkpaces) {
|
||||
const QString uneditedName = defaultWorkspaceTranslatableName(ew->translatableName());
|
||||
if (uneditedName.isEmpty())
|
||||
continue;
|
||||
|
||||
for (auto it = m_workspaces.begin(); it != m_workspaces.end(); ++it) {
|
||||
Workspace* w = *it;
|
||||
if (w->translatableName() == uneditedName) {
|
||||
m_workspaces.erase(it);
|
||||
delete w;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (m_workspaces.empty())
|
||||
qFatal("No workspaces found");
|
||||
|
||||
if (oldWorkspaces.contains(WorkspacesManager::currentWorkspace()))
|
||||
WorkspacesManager::setCurrentWorkspace(m_workspaces.first());
|
||||
|
||||
qDeleteAll(oldWorkspaces);
|
||||
|
||||
// hack
|
||||
for (int i = 0; i < m_workspaces.size(); i++) {
|
||||
const QString& trName = m_workspaces[i]->translatableName();
|
||||
if (trName == defaultWorkspaces[0] || trName == defaultEditedWorkpaces[0]) {
|
||||
m_workspaces.move(i, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
retranslate(m_workspaces);
|
||||
isWorkspacesListDirty = false;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------
|
||||
// refreshWorkspaces
|
||||
//---------------------------------------------------------
|
||||
|
||||
QList<Workspace*>& Workspace::refreshWorkspaces()
|
||||
void WorkspacesManager::refreshWorkspaces()
|
||||
{
|
||||
workspacesRead = false;
|
||||
return workspaces();
|
||||
isWorkspacesListDirty = true;
|
||||
initWorkspaces();
|
||||
}
|
||||
|
||||
const Workspace* Workspace::sourceWorkspace() const
|
||||
|
@ -1221,33 +1208,34 @@ const Workspace* Workspace::sourceWorkspace() const
|
|||
if (translatableName() == sourceName || name() == sourceName)
|
||||
return this;
|
||||
|
||||
for (const Workspace* w : workspaces()) {
|
||||
for (const Workspace* w : WorkspacesManager::workspaces()) {
|
||||
if (w->translatableName() == sourceName || w->name() == sourceName)
|
||||
return w;
|
||||
}
|
||||
|
||||
return workspaces()[0];
|
||||
return WorkspacesManager::workspaces()[0];
|
||||
}
|
||||
|
||||
//---------------------------------------------------------
|
||||
// retranslate
|
||||
//---------------------------------------------------------
|
||||
|
||||
void Workspace::retranslate(QList<Workspace*>* workspacesList)
|
||||
void WorkspacesManager::retranslate(QList<Workspace*>& workspacesList)
|
||||
{
|
||||
if (!workspacesList)
|
||||
workspacesList = &workspaces();
|
||||
for (auto w : *workspacesList) {
|
||||
if (!w->translatableName().isEmpty())
|
||||
w->setName(tr(w->translatableName().toLatin1().constData()));
|
||||
for (auto w : workspacesList) {
|
||||
if (!w->translatableName().isEmpty()) {
|
||||
auto transName = qApp->translate("Ms::Workspace", w->translatableName().toLatin1().constData());
|
||||
w->setName(transName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void WorkspacesManager::retranslateAll()
|
||||
{
|
||||
retranslate(m_workspaces);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------
|
||||
// createNewWorkspace
|
||||
//---------------------------------------------------------
|
||||
|
||||
Workspace* Workspace::createNewWorkspace(const QString& name)
|
||||
Workspace* WorkspacesManager::createNewWorkspace(const QString& name)
|
||||
{
|
||||
Workspace* w = new Workspace;
|
||||
w->setName(name);
|
||||
|
@ -1256,7 +1244,7 @@ Workspace* Workspace::createNewWorkspace(const QString& name)
|
|||
w->setReadOnly(false);
|
||||
w->write();
|
||||
|
||||
_workspaces.append(w);
|
||||
m_workspaces.append(w);
|
||||
return w;
|
||||
}
|
||||
|
||||
|
@ -1376,7 +1364,7 @@ QString Workspace::findStringFromMenu(QMenu* menu)
|
|||
|
||||
void Workspace::rename(const QString& s)
|
||||
{
|
||||
const QString newPath = Workspace::makeUserWorkspacePath(s);
|
||||
const QString newPath = WorkspacesManager::makeUserWorkspacePath(s);
|
||||
|
||||
QFile file(_path);
|
||||
if (file.exists())
|
||||
|
|
|
@ -31,11 +31,9 @@ class XmlWriter;
|
|||
//---------------------------------------------------------
|
||||
// Workspace
|
||||
//---------------------------------------------------------
|
||||
|
||||
class Workspace : public QObject {
|
||||
Q_OBJECT
|
||||
|
||||
static QList<Workspace*> _workspaces;
|
||||
static QList<QPair<QAction*, QString>> actionToStringList;
|
||||
static QList<QPair<QMenu*, QString>> menuToStringList;
|
||||
|
||||
|
@ -66,9 +64,6 @@ class Workspace : public QObject {
|
|||
void readGlobalMenuBar();
|
||||
void readGlobalGUIState();
|
||||
|
||||
static QString makeUserWorkspacePath(const QString& name);
|
||||
static void readWorkspaceFile(const QString& path, std::function<void(XmlReader&)> readWorkspace);
|
||||
|
||||
private slots:
|
||||
void ensureWorkspaceSaved();
|
||||
|
||||
|
@ -97,13 +92,6 @@ class Workspace : public QObject {
|
|||
bool readOnly() const { return _readOnly; }
|
||||
void setReadOnly(bool val) { _readOnly = val; }
|
||||
|
||||
static void initWorkspace();
|
||||
static Workspace* currentWorkspace;
|
||||
static QList<Workspace*>& workspaces();
|
||||
static Workspace* createNewWorkspace(const QString& name);
|
||||
static bool workspacesRead;
|
||||
static QList<Workspace*>& refreshWorkspaces();
|
||||
|
||||
const Workspace* sourceWorkspace() const;
|
||||
|
||||
std::unique_ptr<PaletteTree> getPaletteTree() const;
|
||||
|
@ -123,8 +111,49 @@ class Workspace : public QObject {
|
|||
static void writeGlobalMenuBar(QMenuBar* mb);
|
||||
static void writeGlobalToolBar();
|
||||
static void writeGlobalGUIState();
|
||||
};
|
||||
|
||||
static void retranslate(QList<Workspace*>* workspacesList = 0);
|
||||
class WorkspacesManager {
|
||||
private:
|
||||
static void initWorkspaces();
|
||||
|
||||
public:
|
||||
static Workspace* createNewWorkspace(const QString& name);
|
||||
static void refreshWorkspaces();
|
||||
|
||||
static QString makeUserWorkspacePath(const QString& name);
|
||||
static void readWorkspaceFile(const QString& path, std::function<void(XmlReader&)> readWorkspace);
|
||||
static void retranslate(QList<Workspace*>& workspacesList);
|
||||
static void retranslateAll();
|
||||
|
||||
static Workspace* find(const QString& name) {
|
||||
for (auto w : m_workspaces) {
|
||||
if (w->name() == name)
|
||||
return w;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static void remove(const QString& name) {
|
||||
m_workspaces.removeOne(find(name));
|
||||
}
|
||||
|
||||
static const QList<Workspace*>& workspaces() {
|
||||
if (isWorkspacesListDirty)
|
||||
initWorkspaces();
|
||||
return m_workspaces;
|
||||
}
|
||||
|
||||
//replace with `const Workspace*` in future
|
||||
static Workspace* currentWorkspace() { return m_currentWorkspace; }
|
||||
static void setCurrentWorkspace(Workspace* currWorkspace) { m_currentWorkspace = currWorkspace; }
|
||||
|
||||
static void initCurrentWorkspace();
|
||||
|
||||
private:
|
||||
static QList<Workspace*> m_workspaces;
|
||||
static Workspace* m_currentWorkspace;
|
||||
static bool isWorkspacesListDirty;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -76,7 +76,7 @@ void WorkspaceComboBox::updateWorkspaces()
|
|||
return;
|
||||
|
||||
clear();
|
||||
const QList<Workspace*> pl = Workspace::workspaces();
|
||||
const QList<Workspace*> pl = WorkspacesManager::workspaces();
|
||||
int idx = 0;
|
||||
int curIdx = -1;
|
||||
for (Workspace* p : pl) {
|
||||
|
@ -103,8 +103,8 @@ void WorkspaceComboBox::workspaceSelected(int idx)
|
|||
if (idx < 0)
|
||||
return;
|
||||
|
||||
Workspace* w = Workspace::workspaces().at(idx);
|
||||
if (w != Workspace::currentWorkspace) {
|
||||
Workspace* w = WorkspacesManager::workspaces().at(idx);
|
||||
if (w != WorkspacesManager::currentWorkspace()) {
|
||||
blockUpdateWorkspaces = true;
|
||||
_mscore->changeWorkspace(w);
|
||||
blockUpdateWorkspaces = false;
|
||||
|
|
|
@ -37,7 +37,7 @@ void MuseScore::createNewWorkspace()
|
|||
|
||||
void MuseScore::editWorkspace()
|
||||
{
|
||||
if (!Workspace::currentWorkspace && !Workspace::currentWorkspace->readOnly())
|
||||
if (!WorkspacesManager::currentWorkspace() && !WorkspacesManager::currentWorkspace()->readOnly())
|
||||
return;
|
||||
if (!_workspaceDialog)
|
||||
_workspaceDialog = new WorkspaceDialog();
|
||||
|
@ -73,11 +73,11 @@ void WorkspaceDialog::display()
|
|||
{
|
||||
// TODO: clear search box?
|
||||
if (editMode) {
|
||||
componentsCheck->setChecked(Workspace::currentWorkspace->getSaveComponents());
|
||||
toolbarsCheck->setChecked(Workspace::currentWorkspace->getSaveToolbars());
|
||||
menubarCheck->setChecked(Workspace::currentWorkspace->getSaveMenuBar());
|
||||
componentsCheck->setChecked(WorkspacesManager::currentWorkspace()->getSaveComponents());
|
||||
toolbarsCheck->setChecked(WorkspacesManager::currentWorkspace()->getSaveToolbars());
|
||||
menubarCheck->setChecked(WorkspacesManager::currentWorkspace()->getSaveMenuBar());
|
||||
prefsCheck->setChecked(preferences.getUseLocalPreferences());
|
||||
nameLineEdit->setText(Workspace::currentWorkspace->name());
|
||||
nameLineEdit->setText(WorkspacesManager::currentWorkspace()->name());
|
||||
setWindowTitle(tr("Edit Workspace"));
|
||||
}
|
||||
else {
|
||||
|
@ -103,10 +103,10 @@ void WorkspaceDialog::accepted()
|
|||
s = s.replace( QRegExp( "[" + QRegExp::escape( "\\/:*?\"<>|" ) + "]" ), "_" ); //FAT/NTFS special chars
|
||||
|
||||
for (;;) {
|
||||
if (editMode && s == Workspace::currentWorkspace->name())
|
||||
if (editMode && s == WorkspacesManager::currentWorkspace()->name())
|
||||
break;
|
||||
bool notFound = true;
|
||||
for (Workspace* p : Workspace::workspaces()) {
|
||||
for (Workspace* p : WorkspacesManager::workspaces()) {
|
||||
if ((qApp->translate("Ms::Workspace", p->name().toUtf8()).toLower() == s.toLower())) {
|
||||
notFound = false;
|
||||
break;
|
||||
|
@ -126,22 +126,22 @@ void WorkspaceDialog::accepted()
|
|||
}
|
||||
|
||||
if (!editMode) {
|
||||
if (Workspace::currentWorkspace->dirty())
|
||||
Workspace::currentWorkspace->save();
|
||||
Workspace::currentWorkspace = Workspace::createNewWorkspace(s);
|
||||
if (WorkspacesManager::currentWorkspace()->dirty())
|
||||
WorkspacesManager::currentWorkspace()->save();
|
||||
WorkspacesManager::setCurrentWorkspace(WorkspacesManager::createNewWorkspace(s));
|
||||
preferences.updateLocalPreferences();
|
||||
}
|
||||
|
||||
Workspace::currentWorkspace->setSaveComponents(componentsCheck->isChecked());
|
||||
Workspace::currentWorkspace->setSaveToolbars(toolbarsCheck->isChecked());
|
||||
Workspace::currentWorkspace->setSaveMenuBar(menubarCheck->isChecked());
|
||||
WorkspacesManager::currentWorkspace()->setSaveComponents(componentsCheck->isChecked());
|
||||
WorkspacesManager::currentWorkspace()->setSaveToolbars(toolbarsCheck->isChecked());
|
||||
WorkspacesManager::currentWorkspace()->setSaveMenuBar(menubarCheck->isChecked());
|
||||
preferences.setUseLocalPreferences(prefsCheck->isChecked());
|
||||
Workspace::currentWorkspace->save();
|
||||
WorkspacesManager::currentWorkspace()->save();
|
||||
|
||||
if (editMode && Workspace::currentWorkspace->name() != s)
|
||||
Workspace::currentWorkspace->rename(s);
|
||||
if (editMode && WorkspacesManager::currentWorkspace()->name() != s)
|
||||
WorkspacesManager::currentWorkspace()->rename(s);
|
||||
|
||||
preferences.setPreference(PREF_APP_WORKSPACE, Workspace::currentWorkspace->name());
|
||||
preferences.setPreference(PREF_APP_WORKSPACE, WorkspacesManager::currentWorkspace()->name());
|
||||
emit mscore->workspacesChanged();
|
||||
close();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue