Skip to content

Commit

Permalink
moved workspaces interaction to manager
Browse files Browse the repository at this point in the history
  • Loading branch information
Eism committed Feb 21, 2025
1 parent dbea52c commit b8414b5
Show file tree
Hide file tree
Showing 18 changed files with 144 additions and 115 deletions.
4 changes: 3 additions & 1 deletion src/app/configs/workspaces.cfg
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
{
"default_workspace_name": "Default",
"builtin_workspace_files": "Default.mws"
"builtin_workspace_files": [
"Default.mws"
]
}
2 changes: 2 additions & 0 deletions src/appshell/view/notationstatusbarmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,8 @@ QVariant NotationStatusBarModel::currentWorkspaceItem()
.arg(muse::TranslatableString("workspace", "Workspace:"),
String::fromStdString(workspaceConfiguration()->currentWorkspaceName()));

m_currentWorkspaceItem->setAction(action);

#ifdef MUSE_MODULE_WORKSPACE
m_currentWorkspaceItem->setSubitems(m_workspacesMenuModel->items());
#endif
Expand Down
16 changes: 12 additions & 4 deletions src/framework/stubs/workspace/workspacemanagerstub.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,6 @@ IWorkspacePtr WorkspaceManagerStub::currentWorkspace() const
return p;
}

void WorkspaceManagerStub::prepareCurrentWorkspaceForChange()
{
}

async::Notification WorkspaceManagerStub::currentWorkspaceAboutToBeChanged() const
{
return async::Notification();
Expand Down Expand Up @@ -70,3 +66,15 @@ IWorkspacePtr WorkspaceManagerStub::cloneWorkspace(const IWorkspacePtr&, const s
{
return std::make_shared<WorkspaceStub>();
}

void muse::workspace::WorkspaceManagerStub::changeCurrentWorkspace(const std::string&)
{
}

void muse::workspace::WorkspaceManagerStub::createAndAppendNewWorkspace()
{
}

void muse::workspace::WorkspaceManagerStub::openConfigureWorkspacesDialog()
{
}
5 changes: 4 additions & 1 deletion src/framework/stubs/workspace/workspacemanagerstub.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ class WorkspaceManagerStub : public IWorkspaceManager
IWorkspacePtr defaultWorkspace() const override;

IWorkspacePtr currentWorkspace() const override;
void prepareCurrentWorkspaceForChange() override;
async::Notification currentWorkspaceAboutToBeChanged() const override;
async::Notification currentWorkspaceChanged() const override;

Expand All @@ -40,6 +39,10 @@ class WorkspaceManagerStub : public IWorkspaceManager
async::Notification workspacesListChanged() const override;

IWorkspacePtr cloneWorkspace(const IWorkspacePtr& workspace, const std::string& newWorkspaceName) const override;

void changeCurrentWorkspace(const std::string& newWorkspaceName) override;
void createAndAppendNewWorkspace() override;
void openConfigureWorkspacesDialog() override;
};
}

Expand Down
8 changes: 4 additions & 4 deletions src/framework/stubs/workspace/workspacestub.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,6 @@ std::string WorkspaceStub::name() const
return std::string();
}

void WorkspaceStub::setName(const std::string&)
{
}

bool WorkspaceStub::isBuiltin() const
{
return false;
Expand Down Expand Up @@ -61,3 +57,7 @@ async::Notification WorkspaceStub::reloadNotification()
{
return async::Notification();
}

void muse::workspace::WorkspaceStub::assignNewName(const std::string&)
{
}
2 changes: 1 addition & 1 deletion src/framework/stubs/workspace/workspacestub.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ class WorkspaceStub : public IWorkspace
{
public:
std::string name() const override;
void setName(const std::string& name) override;

bool isBuiltin() const override;
bool isEdited() const override;
Expand All @@ -38,6 +37,7 @@ class WorkspaceStub : public IWorkspace
Ret setRawData(const DataKey& key, const QByteArray& data) override;

void reset() override;
void assignNewName(const std::string& newName) override;

async::Notification reloadNotification() override;
};
Expand Down
40 changes: 20 additions & 20 deletions src/framework/workspace/internal/workspace.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,26 +54,6 @@ std::string Workspace::name() const
return io::completeBasename(m_file->filePath()).toStdString();
}

void Workspace::setName(const std::string& name)
{
io::path_t filePath = m_file->filePath();
io::path_t newPath = io::absoluteDirpath(filePath) + "/" + name + "." + io::suffix(filePath);

if (filePath == newPath) {
return;
}

Ret ret = doSave();
if (!ret) {
LOGE() << "Failed to save workspace, error: " << ret.toString();
}

fileSystem()->move(filePath, newPath);

m_file = std::make_shared<WorkspaceFile>(newPath);
load();
}

bool Workspace::isBuiltin() const
{
io::path_t builtinWorkspacePath = this->builtinWorkspacePath();
Expand Down Expand Up @@ -136,6 +116,26 @@ void Workspace::reset()
reload();
}

void Workspace::assignNewName(const std::string& newName)
{
io::path_t filePath = m_file->filePath();
io::path_t newPath = io::absoluteDirpath(filePath) + "/" + newName + "." + io::suffix(filePath);

if (filePath == newPath) {
return;
}

Ret ret = doSave();
if (!ret) {
LOGE() << "Failed to save workspace, error: " << ret.toString();
}

fileSystem()->move(filePath, newPath);

m_file = std::make_shared<WorkspaceFile>(newPath);
load();
}

async::Notification Workspace::reloadNotification()
{
return m_reloadNotification;
Expand Down
2 changes: 1 addition & 1 deletion src/framework/workspace/internal/workspace.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ class Workspace : public IWorkspace, public Injectable, public async::Asyncable
Workspace(const io::path_t& filePath, const Workspace* other, const modularity::ContextPtr& iocCtx);

std::string name() const override;
void setName(const std::string& name) override;

bool isBuiltin() const override;
bool isEdited() const override;
Expand All @@ -55,6 +54,7 @@ class Workspace : public IWorkspace, public Injectable, public async::Asyncable
Ret setRawData(const DataKey& key, const QByteArray& data) override;

void reset() override;
void assignNewName(const std::string& newName) override;

async::Notification reloadNotification() override;

Expand Down
63 changes: 3 additions & 60 deletions src/framework/workspace/internal/workspaceactioncontroller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,75 +35,18 @@ void WorkspaceActionController::init()
dispatcher()->reg(this, "create-workspace", this, &WorkspaceActionController::createNewWorkspace);
}

void WorkspaceActionController::prepareCurrentWorkspaceForChange()
{
manager()->prepareCurrentWorkspaceForChange();
}

void WorkspaceActionController::selectWorkspace(const ActionData& args)
{
prepareCurrentWorkspaceForChange();

std::string selectedWorkspace = !args.empty() ? args.arg<std::string>(0) : "";
setCurrentWorkspaceName(selectedWorkspace);
manager()->changeCurrentWorkspace(selectedWorkspace);
}

void WorkspaceActionController::openConfigureWorkspacesDialog()
{
prepareCurrentWorkspaceForChange();

RetVal<Val> result = interactive()->open("muse://workspace/select?sync=true");
if (!result.ret) {
return;
}

std::string selectedWorkspace = result.val.toString();
setCurrentWorkspaceName(selectedWorkspace);
manager()->openConfigureWorkspacesDialog();
}

void muse::workspace::WorkspaceActionController::createNewWorkspace()
{
prepareCurrentWorkspaceForChange();

IWorkspacePtrList workspaces = manager()->workspaces();

QStringList workspaceNames;
for (const IWorkspacePtr& workspace: workspaces) {
workspaceNames << QString::fromStdString(workspace->name());
}

UriQuery uri("muse://workspace/create");
uri.addParam("sync", Val(true));
uri.addParam("workspaceNames", Val(workspaceNames.join(',')));

RetVal<Val> obj = interactive()->open(uri);
if (!obj.ret) {
return;
}

QVariantMap meta = obj.val.toQVariant().toMap();
QString name = meta.value("name").toString();
IF_ASSERT_FAILED(!name.isEmpty()) {
return;
}

IWorkspacePtr newWorkspace = manager()->cloneWorkspace(manager()->currentWorkspace(), name.toStdString());
if (!newWorkspace) {
return;
}

workspaces.emplace_back(newWorkspace);

manager()->setWorkspaces(workspaces);

setCurrentWorkspaceName(name.toStdString());
}

void WorkspaceActionController::setCurrentWorkspaceName(const std::string& workspaceName)
{
if (configuration()->currentWorkspaceName() == workspaceName || workspaceName.empty()) {
return;
}

configuration()->setCurrentWorkspaceName(workspaceName);
manager()->createAndAppendNewWorkspace();
}
4 changes: 0 additions & 4 deletions src/framework/workspace/internal/workspaceactioncontroller.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,9 @@ class WorkspaceActionController : public Injectable, public actions::Actionable
void init();

private:
void prepareCurrentWorkspaceForChange();

void selectWorkspace(const muse::actions::ActionData& args);
void openConfigureWorkspacesDialog();
void createNewWorkspace();

void setCurrentWorkspaceName(const std::string& workspaceName);
};
}

Expand Down
6 changes: 3 additions & 3 deletions src/framework/workspace/internal/workspaceconfiguration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,11 @@ io::paths_t WorkspaceConfiguration::builtinWorkspacesFilePaths() const
{
io::paths_t result;

StringList builtinWorkspacesFiles = String::fromStdString(m_config.value("builtin_workspace_files").toString()).split(';');
ValList builtinWorkspacesFiles = m_config.value("builtin_workspace_files").toList();
io::path_t appDir = globalConfiguration()->appDataPath();

for (const String& builtinWorkspaceFile : builtinWorkspacesFiles) {
result.emplace_back(appDir + "/workspaces/" + builtinWorkspaceFile);
for (const Val& builtinWorkspaceFileVal : builtinWorkspacesFiles) {
result.emplace_back(appDir + "/workspaces/" + builtinWorkspaceFileVal.toString());
}

return result;
Expand Down
74 changes: 69 additions & 5 deletions src/framework/workspace/internal/workspacemanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
*/
#include "workspacemanager.h"

#include "types/uri.h"

#include "log.h"

using namespace muse;
Expand Down Expand Up @@ -66,11 +68,6 @@ IWorkspacePtr WorkspaceManager::currentWorkspace() const
return m_currentWorkspace;
}

void WorkspaceManager::prepareCurrentWorkspaceForChange()
{
m_currentWorkspaceAboutToBeChanged.notify();
}

async::Notification WorkspaceManager::currentWorkspaceAboutToBeChanged() const
{
return m_currentWorkspaceAboutToBeChanged;
Expand Down Expand Up @@ -114,6 +111,68 @@ IWorkspacePtr WorkspaceManager:: cloneWorkspace(const IWorkspacePtr& workspace,
return std::make_shared<Workspace>(makeNewWorkspacePath(newWorkspaceName), dynamic_cast<Workspace*>(workspace.get()), iocContext());
}

void WorkspaceManager::changeCurrentWorkspace(const std::string& newWorkspaceName)
{
if (configuration()->currentWorkspaceName() == newWorkspaceName || newWorkspaceName.empty()) {
return;
}

prepareCurrentWorkspaceForChange();

configuration()->setCurrentWorkspaceName(newWorkspaceName);
}

void WorkspaceManager::createAndAppendNewWorkspace()
{
prepareCurrentWorkspaceForChange();

IWorkspacePtrList workspaces = this->workspaces();

QStringList workspaceNames;
for (const IWorkspacePtr& workspace: workspaces) {
workspaceNames << QString::fromStdString(workspace->name());
}

UriQuery uri("muse://workspace/create");
uri.addParam("sync", Val(true));
uri.addParam("workspaceNames", Val(workspaceNames.join(',')));

RetVal<Val> obj = interactive()->open(uri);
if (!obj.ret) {
return;
}

QVariantMap meta = obj.val.toQVariant().toMap();
QString name = meta.value("name").toString();
IF_ASSERT_FAILED(!name.isEmpty()) {
return;
}

IWorkspacePtr newWorkspace = cloneWorkspace(currentWorkspace(), name.toStdString());
if (!newWorkspace) {
return;
}

workspaces.emplace_back(newWorkspace);

setWorkspaces(workspaces);

configuration()->setCurrentWorkspaceName(name.toStdString());
}

void WorkspaceManager::openConfigureWorkspacesDialog()
{
prepareCurrentWorkspaceForChange();

RetVal<Val> result = interactive()->open("muse://workspace/select?sync=true");
if (!result.ret) {
return;
}

std::string selectedWorkspace = result.val.toString();
changeCurrentWorkspace(selectedWorkspace);
}

WorkspacePtr WorkspaceManager::doNewWorkspace(const std::string& workspaceName) const
{
return std::make_shared<Workspace>(makeNewWorkspacePath(workspaceName), iocContext());
Expand Down Expand Up @@ -366,3 +425,8 @@ void WorkspaceManager::saveCurrentWorkspace()
LOGE() << "failed save current workspace, err: " << ret.toString();
}
}

void WorkspaceManager::prepareCurrentWorkspaceForChange()
{
m_currentWorkspaceAboutToBeChanged.notify();
}
Loading

0 comments on commit b8414b5

Please sign in to comment.