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 13, 2025
1 parent bcc7ec8 commit c5cfc5c
Show file tree
Hide file tree
Showing 14 changed files with 135 additions and 106 deletions.
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
4 changes: 4 additions & 0 deletions src/framework/stubs/workspace/workspacestub.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,3 +61,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
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();
}
18 changes: 13 additions & 5 deletions src/framework/workspace/internal/workspacemanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,19 +22,23 @@
#ifndef MUSE_WORKSPACE_WORKSPACEMANAGER_H
#define MUSE_WORKSPACE_WORKSPACEMANAGER_H

#include "iworkspacemanager.h"
#include "async/asyncable.h"

#include "modularity/ioc.h"
#include "async/asyncable.h"
#include "../iworkspaceconfiguration.h"
#include "io/ifilesystem.h"
#include "iinteractive.h"
#include "../iworkspaceconfiguration.h"

#include "workspace.h"

#include "iworkspacemanager.h"

namespace muse::workspace {
class WorkspaceManager : public IWorkspaceManager, public Injectable, public async::Asyncable
{
Inject<IWorkspaceConfiguration> configuration = { this };
Inject<io::IFileSystem> fileSystem = { this };
Inject<IInteractive> interactive = { this };
Inject<IWorkspaceConfiguration> configuration = { this };

public:

Expand All @@ -48,7 +52,6 @@ class WorkspaceManager : public IWorkspaceManager, public Injectable, public asy
IWorkspacePtr defaultWorkspace() const override;

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

Expand All @@ -58,6 +61,10 @@ class WorkspaceManager : public IWorkspaceManager, public Injectable, public asy

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

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

private:
void load();

Expand All @@ -72,6 +79,7 @@ class WorkspaceManager : public IWorkspaceManager, public Injectable, public asy
void setupDefaultWorkspace();
void setupCurrentWorkspace();
void saveCurrentWorkspace();
void prepareCurrentWorkspaceForChange();

Ret removeMissingWorkspaces(const IWorkspacePtrList& newWorkspaceList);
Ret removeWorkspace(const IWorkspacePtr& workspace);
Expand Down
Loading

0 comments on commit c5cfc5c

Please sign in to comment.