Skip to content

Commit

Permalink
Merge pull request #5409 from anatoly-os/workspace_fixes_22102019
Browse files Browse the repository at this point in the history
fix remaining bugs with workspaces
  • Loading branch information
anatoly-os committed Oct 22, 2019
1 parent b4ae6dd commit 84a94d6
Show file tree
Hide file tree
Showing 4 changed files with 128 additions and 69 deletions.
2 changes: 1 addition & 1 deletion mscore/musescore.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
153 changes: 98 additions & 55 deletions mscore/workspace.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,12 @@ QList<Workspace*> WorkspacesManager::m_visibleWorkspaces {};
QList<QPair<QAction*, QString>> Workspace::actionToStringList {};
QList<QPair<QMenu* , QString>> Workspace::menuToStringList {};

static const std::vector<QString> defaultWorkspaces {
std::vector<QString> WorkspacesManager::defaultWorkspaces {
QT_TRANSLATE_NOOP("Ms::Workspace", "Basic"),
QT_TRANSLATE_NOOP("Ms::Workspace", "Advanced"),
};

static const std::vector<QString> defaultEditedWorkpaces {
std::vector<QString> WorkspacesManager::defaultEditedWorkspaces {
QT_TRANSLATE_NOOP("Ms::Workspace", "Basic edited"),
QT_TRANSLATE_NOOP("Ms::Workspace", "Advanced edited"),
};
Expand All @@ -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();
Expand All @@ -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();
}

//---------------------------------------------------------
Expand All @@ -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());
Expand All @@ -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);
}

Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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()
{
Expand All @@ -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
//---------------------------------------------------------
Expand Down Expand Up @@ -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<PaletteTree> Workspace::getPaletteTree() const
{
std::unique_ptr<PaletteTree> paletteTree(new PaletteTree);
Expand Down Expand Up @@ -1044,6 +1082,7 @@ void Workspace::ensureWorkspaceSaved()
_readOnly = !fi.isWritable();
Q_ASSERT(!_readOnly);

WorkspacesManager::refreshWorkspaces();
preferences.setPreference(PREF_APP_WORKSPACE, name());
emit mscore->workspacesChanged();
}
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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");

Expand All @@ -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;
}

Expand All @@ -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;
Expand Down Expand Up @@ -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;
}

Expand Down
17 changes: 12 additions & 5 deletions mscore/workspace.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<PaletteTree> getPaletteTree() const;

Expand Down Expand Up @@ -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<Workspace*>& workspaces() {
if (isWorkspacesListDirty || m_workspaces.isEmpty())
initWorkspaces();
Expand All @@ -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<QString> defaultWorkspaces;
static std::vector<QString> defaultEditedWorkspaces;

private:
static QList<Workspace*> m_workspaces;
Expand Down
25 changes: 17 additions & 8 deletions mscore/workspacedialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down

0 comments on commit 84a94d6

Please sign in to comment.