diff --git a/builder/builder.cpp b/builder/builder.cpp index 935dd895f..bea45fafa 100644 --- a/builder/builder.cpp +++ b/builder/builder.cpp @@ -14,13 +14,13 @@ #include Builder::Builder() { - connect(AssetManager::instance(), &AssetManager::importFinished, this, &Builder::onImportFinished, Qt::QueuedConnection); - connect(AssetManager::instance(), &AssetManager::buildSuccessful, this, &Builder::onBuildSuccessful, Qt::QueuedConnection); + connect(Editor::assets(), &AssetManager::importFinished, this, &Builder::onImportFinished, Qt::QueuedConnection); + connect(Editor::assets(), &AssetManager::buildSuccessful, this, &Builder::onBuildSuccessful, Qt::QueuedConnection); } void Builder::setPlatform(const TString &platform) { - ProjectSettings *project = ProjectSettings::instance(); - EditorSettings::instance()->loadSettings(); + ProjectSettings *project = Editor::project(); + Editor::settings()->loadSettings(); if(platform.isEmpty()) { for(const TString &it : project->platforms()) { m_platformsToBuild.push(it); @@ -38,7 +38,7 @@ void Builder::setPlatform(const TString &platform) { builder->convertFile(nullptr); } - AssetManager::instance()->rescan(); + Editor::assets()->rescan(); } } @@ -53,12 +53,12 @@ bool Builder::package(const TString &target) { return false; } - StringList list(File::list(ProjectSettings::instance()->importPath())); + StringList list(File::list(Editor::project()->importPath())); for(auto &it : list) { if(File::isFile(it)) { Url info(it); - TString origin = AssetManager::instance()->uuidToPath(info.baseName()); + TString origin = Editor::assets()->uuidToPath(info.baseName()); aInfo() << "\tCoping:" << origin.data(); File inFile(it); @@ -86,7 +86,7 @@ bool Builder::package(const TString &target) { } void Builder::onImportFinished() { - ProjectSettings *project = ProjectSettings::instance(); + ProjectSettings *project = Editor::project(); NativeCodeBuilder *builder = project->currentBuilder(); @@ -100,7 +100,7 @@ void Builder::onImportFinished() { } void Builder::onBuildSuccessful() { - ProjectSettings *project = ProjectSettings::instance(); + ProjectSettings *project = Editor::project(); TString targetPath = project->targetPath() + "/" + project->currentPlatformName(); if(!File::exists(targetPath) && !File::mkPath(targetPath)) { @@ -130,7 +130,7 @@ void Builder::onBuildSuccessful() { if(!m_platformsToBuild.empty()) { project->setCurrentPlatform(m_platformsToBuild.top()); m_platformsToBuild.pop(); - AssetManager::instance()->rescan(); + Editor::assets()->rescan(); return; } diff --git a/builder/main.cpp b/builder/main.cpp index 7d224cf51..868e98a9e 100644 --- a/builder/main.cpp +++ b/builder/main.cpp @@ -87,18 +87,17 @@ int main(int argc, char *argv[]) { Engine engine; Engine::setPlatformAdaptor(&EditorPlatform::instance()); - ProjectSettings::instance()->init(parser.value(sourceFileOption).toStdString(), parser.value(targetDirectoryOption).toStdString()); - ProjectSettings::instance()->loadSettings(); + Editor::project()->init(parser.value(sourceFileOption).toStdString(), parser.value(targetDirectoryOption).toStdString()); - PluginManager::instance()->init(&engine); - AssetManager::instance()->init(); + Editor::plugins()->init(&engine); + Editor::assets()->init(); - ProjectSettings::instance()->loadPlatforms(); + Editor::project()->loadPlatforms(); - if(!PluginManager::instance()->rescanProject(ProjectSettings::instance()->pluginsPath())) { + if(!Editor::plugins()->rescanProject(Editor::project()->pluginsPath())) { aWarning() << "Not all plugins were loaded."; } - PluginManager::instance()->initSystems(); + Editor::plugins()->initSystems(); Builder builder; diff --git a/editor/editor.qbs b/editor/editor.qbs index 5ddea99b1..c6d647351 100644 --- a/editor/editor.qbs +++ b/editor/editor.qbs @@ -3,7 +3,8 @@ import qbs Project { id: editor property stringList srcFiles: [ - "src/**/*.cpp" + "src/**/*.cpp", + "src/*.h" ] property stringList incPaths: [ diff --git a/editor/includes/editor.h b/editor/includes/editor.h index 92e391b60..25769b51d 100644 --- a/editor/includes/editor.h +++ b/editor/includes/editor.h @@ -13,10 +13,59 @@ #define EDITOR_EXPORT #endif +class ProjectSettings; +class EditorSettings; +class AssetManager; +class PluginManager; + +class AssetEditor; +class EditorGadget; + +class DocumentModel; + class EDITOR_EXPORT Editor : public Object { + A_OBJECT(Editor, Object, General) + public: Editor(); ~Editor(); + + static void init(); + + static void backup(); + static void restore(); + + static void addEditor(AssetEditor *editor); + static void closeEditor(AssetEditor *editor); + + static AssetEditor *openFile(const TString &path); + + static AssetEditor *currentEditor(); + static void setCurrentEditor(AssetEditor *editor); + + static std::list documents(); + + static void addGadget(EditorGadget *gadget); + static std::list gadgets(); + + static EditorSettings *settings(); + static ProjectSettings *project(); + static AssetManager *assets(); + static PluginManager *plugins(); + +protected: + static std::list s_gadgets; + + static AssetEditor *s_currentEditor; + + static EditorSettings *s_editorSettings; + static ProjectSettings *s_projectSettings; + + static AssetManager *s_assetManager; + static PluginManager *s_pluginManager; + + static DocumentModel *s_documentModel; + }; #endif // EDITOR_H diff --git a/editor/includes/editor/asseteditor.h b/editor/includes/editor/asseteditor.h index d4c7e7fdb..a54bec2e7 100644 --- a/editor/includes/editor/asseteditor.h +++ b/editor/includes/editor/asseteditor.h @@ -57,6 +57,9 @@ class EDITOR_EXPORT AssetEditor : public QWidget { virtual bool allowSaveAs() const; + virtual void backup(); + virtual void restore(); + signals: void updated(); diff --git a/editor/includes/editor/assetmanager.h b/editor/includes/editor/assetmanager.h index d8d9fb522..8bcd70c36 100644 --- a/editor/includes/editor/assetmanager.h +++ b/editor/includes/editor/assetmanager.h @@ -19,7 +19,8 @@ class EDITOR_EXPORT AssetManager : public QObject { Q_OBJECT public: - static AssetManager *instance(); + AssetManager(); + ~AssetManager(); void init(); @@ -84,10 +85,6 @@ public slots: protected slots: void onPerform(); -private: - AssetManager(); - ~AssetManager(); - protected: friend class BaseAssetProvider; diff --git a/editor/includes/editor/editorsettings.h b/editor/includes/editor/editorsettings.h index 7fe9f8a6d..9646d71be 100644 --- a/editor/includes/editor/editorsettings.h +++ b/editor/includes/editor/editorsettings.h @@ -17,8 +17,6 @@ class EDITOR_EXPORT EditorSettings : public Object { public: EditorSettings(); - static EditorSettings *instance(); - void registerValue(const TString &name, const Variant &value, const TString &annotation = TString()); Variant value(const TString &name); diff --git a/editor/includes/editor/pluginmanager.h b/editor/includes/editor/pluginmanager.h index 57585ac70..d3f63eea0 100644 --- a/editor/includes/editor/pluginmanager.h +++ b/editor/includes/editor/pluginmanager.h @@ -39,8 +39,8 @@ class EDITOR_EXPORT PluginManager : public QAbstractItemModel { }; public: - static PluginManager *instance(); - static void destroy(); + PluginManager(); + ~PluginManager(); void init(Engine *engine); @@ -70,10 +70,6 @@ public slots: void reloadPlugin(const TString &path); private: - PluginManager(); - - ~PluginManager(); - int columnCount(const QModelIndex &) const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; diff --git a/editor/includes/editor/projectsettings.h b/editor/includes/editor/projectsettings.h index 9aab1bfd3..a929e4009 100644 --- a/editor/includes/editor/projectsettings.h +++ b/editor/includes/editor/projectsettings.h @@ -26,8 +26,6 @@ class EDITOR_EXPORT ProjectSettings : public Object { ProjectSettings(); ~ProjectSettings() {} - static ProjectSettings *instance(); - void init(const TString &project, const TString &target = TString()); void loadPlatforms(); diff --git a/editor/includes/viewport/tasks/gridrender.h b/editor/includes/viewport/tasks/gridrender.h index 354a603c3..198c50afa 100644 --- a/editor/includes/viewport/tasks/gridrender.h +++ b/editor/includes/viewport/tasks/gridrender.h @@ -37,9 +37,9 @@ class GridRender : public PipelineTask { m_outputs.push_back(std::make_pair("Result", nullptr)); - connect(EditorSettings::instance(), _SIGNAL(updated()), this, _SLOT(loadSettings())); + connect(Editor::settings(), _SIGNAL(updated()), this, _SLOT(loadSettings())); - EditorSettings::instance()->registerValue(gGridColor, Vector4(0.4f, 0.4f, 0.4f, 0.4f), "editor=Color"); + Editor::settings()->registerValue(gGridColor, Vector4(0.4f, 0.4f, 0.4f, 0.4f), "editor=Color"); loadSettings(); } @@ -49,7 +49,7 @@ class GridRender : public PipelineTask { } void loadSettings() { - m_gridColor = EditorSettings::instance()->value(gGridColor).toVector4(); + m_gridColor = Editor::settings()->value(gGridColor).toVector4(); if(m_grid) { m_grid->setVector4("mainColor", &m_gridColor); } diff --git a/editor/includes/viewport/tasks/outlinerender.h b/editor/includes/viewport/tasks/outlinerender.h index bab548c7f..e89b1dcab 100644 --- a/editor/includes/viewport/tasks/outlinerender.h +++ b/editor/includes/viewport/tasks/outlinerender.h @@ -51,17 +51,17 @@ class Outline : public PipelineTask { m_outputs.push_back(std::make_pair("Result", nullptr)); - connect(EditorSettings::instance(), _SIGNAL(updated()), this, _SLOT(loadSettings())); + connect(Editor::settings(), _SIGNAL(updated()), this, _SLOT(loadSettings())); - EditorSettings::instance()->registerValue(gOutlineColor, Vector4(1.0f, 0.5f, 0.0f, 1.0f), "editor=Color"); - EditorSettings::instance()->registerValue(gOutlineWidth, 1.0f); + Editor::settings()->registerValue(gOutlineColor, Vector4(1.0f, 0.5f, 0.0f, 1.0f), "editor=Color"); + Editor::settings()->registerValue(gOutlineWidth, 1.0f); loadSettings(); } void loadSettings() { - m_color = EditorSettings::instance()->value(gOutlineColor).toVector4(); - m_width = EditorSettings::instance()->value(gOutlineWidth).toFloat(); + m_color = Editor::settings()->value(gOutlineColor).toVector4(); + m_width = Editor::settings()->value(gOutlineWidth).toFloat(); if(m_combineMaterial) { m_combineMaterial->setFloat("width", &m_width); diff --git a/worldeditor/src/main/documentmodel.cpp b/editor/src/documentmodel.cpp similarity index 85% rename from worldeditor/src/main/documentmodel.cpp rename to editor/src/documentmodel.cpp index 7c8d9b041..89caf4445 100644 --- a/worldeditor/src/main/documentmodel.cpp +++ b/editor/src/documentmodel.cpp @@ -12,8 +12,8 @@ #include DocumentModel::DocumentModel() { - for(auto &it : PluginManager::instance()->extensions("editor")) { - addEditor(reinterpret_cast(PluginManager::instance()->getPluginObject(it))); + for(auto &it : Editor::plugins()->extensions("editor")) { + addEditor(reinterpret_cast(Editor::plugins()->getPluginObject(it))); } } @@ -44,22 +44,8 @@ void DocumentModel::addEditor(AssetEditor *editor) { connect(editor, &AssetEditor::dropAsset, this, &DocumentModel::onLoadAsset); } -void DocumentModel::newFile(AssetEditor *editor) { - if(editor->checkSave()) { - closeFile(editor); - editor->onNewAsset(); - } -} - -void DocumentModel::openFile(AssetEditor *editor) { - if(editor->checkSave()) { - closeFile(editor); - editor->onOpenAsset(); - } -} - AssetEditor *DocumentModel::openFile(const TString &path) { - AssetConverterSettings *settings = AssetManager::instance()->fetchSettings(path); + AssetConverterSettings *settings = Editor::assets()->fetchSettings(path); AssetEditor *editor = nullptr; diff --git a/worldeditor/src/main/documentmodel.h b/editor/src/documentmodel.h similarity index 80% rename from worldeditor/src/main/documentmodel.h rename to editor/src/documentmodel.h index 864fa2018..b84a653f5 100644 --- a/worldeditor/src/main/documentmodel.h +++ b/editor/src/documentmodel.h @@ -3,11 +3,9 @@ #include -#include +#include -class AssetEditor; - -class DocumentModel : public QObject { +class EDITOR_EXPORT DocumentModel : public QObject { Q_OBJECT public: @@ -16,9 +14,6 @@ class DocumentModel : public QObject { void addEditor(AssetEditor *editor); - void newFile(AssetEditor *editor); - void openFile(AssetEditor *editor); - AssetEditor *openFile(const TString &path); std::list documents(); diff --git a/editor/src/editor.cpp b/editor/src/editor.cpp index 70c909f7d..96f40b810 100644 --- a/editor/src/editor.cpp +++ b/editor/src/editor.cpp @@ -1,5 +1,15 @@ #include +#include "projectsettings.h" +#include "editorsettings.h" +#include "pluginmanager.h" + +#include "documentmodel.h" + +#include "editor/editorgadget.h" +#include "editor/asseteditor.h" +#include "editor/assetmanager.h" + /*! \module Editor @@ -8,6 +18,17 @@ \brief Contains Editor management classes. */ +std::list Editor::s_gadgets; + +AssetEditor *Editor::s_currentEditor = nullptr; + +EditorSettings *Editor::s_editorSettings = nullptr; +ProjectSettings *Editor::s_projectSettings = nullptr; +AssetManager *Editor::s_assetManager = nullptr; +PluginManager *Editor::s_pluginManager = nullptr; + +DocumentModel *Editor::s_documentModel = nullptr; + Editor::Editor() { } @@ -15,3 +36,120 @@ Editor::Editor() { Editor::~Editor() { } + +void Editor::init() { + s_documentModel = new DocumentModel; + + for(auto &it : Editor::plugins()->extensions("gadget")) { + addGadget(reinterpret_cast(Editor::plugins()->getPluginObject(it))); + } +} + +void Editor::backup() { + if(s_documentModel) { + for(auto it : s_documentModel->documents()) { + it->backup(); + } + } +} + +void Editor::restore() { + if(s_documentModel) { + for(auto it : s_documentModel->documents()) { + it->restore(); + } + } +} + +void Editor::addEditor(AssetEditor *editor) { + if(s_documentModel) { + s_documentModel->addEditor(editor); + } +} + +void Editor::closeEditor(AssetEditor *editor) { + if(s_documentModel) { + s_documentModel->closeFile(editor); + } +} + +AssetEditor *Editor::openFile(const TString &path) { + if(s_documentModel) { + return s_documentModel->openFile(path); + } + return nullptr; +} + +AssetEditor *Editor::currentEditor() { + return s_currentEditor; +} + +void Editor::setCurrentEditor(AssetEditor *editor) { + foreach(auto it, s_gadgets) { + if(s_currentEditor) { + QObject::disconnect(it, &EditorGadget::updated, s_currentEditor, &AssetEditor::onUpdated); + QObject::disconnect(it, &EditorGadget::objectsSelected, s_currentEditor, &AssetEditor::onObjectsSelected); + + QObject::disconnect(s_currentEditor, &AssetEditor::objectsChanged, it, &EditorGadget::onObjectsChanged); + } + + QObject::connect(it, &EditorGadget::updated, editor, &AssetEditor::onUpdated); + QObject::connect(it, &EditorGadget::objectsSelected, editor, &AssetEditor::onObjectsSelected); + + QObject::connect(editor, &AssetEditor::objectsChanged, it, &EditorGadget::onObjectsChanged); + + it->setCurrentEditor(editor); + } + + s_currentEditor = editor; +} + +std::list Editor::documents() { + if(s_documentModel) { + return s_documentModel->documents(); + } + return std::list(); +} + +void Editor::addGadget(EditorGadget *gadget) { + if(gadget) { + s_gadgets.push_back(gadget); + + QObject::connect(s_documentModel, &DocumentModel::updated, gadget, &EditorGadget::onUpdated); + QObject::connect(s_documentModel, &DocumentModel::selectionChanaged, gadget, &EditorGadget::onSelectionChanged); + + QObject::connect(gadget, &EditorGadget::objectsSelected, s_documentModel, &DocumentModel::selectionChanaged); + } +} + +std::list Editor::gadgets() { + return s_gadgets; +} + +EditorSettings *Editor::settings() { + if(s_editorSettings == nullptr) { + s_editorSettings = new EditorSettings; + } + return s_editorSettings; +} + +ProjectSettings *Editor::project() { + if(s_projectSettings == nullptr) { + s_projectSettings = new ProjectSettings; + } + return s_projectSettings; +} + +AssetManager *Editor::assets() { + if(s_assetManager == nullptr) { + s_assetManager = new AssetManager; + } + return s_assetManager; +} + +PluginManager *Editor::plugins() { + if(s_pluginManager == nullptr) { + s_pluginManager = new PluginManager; + } + return s_pluginManager; +} diff --git a/editor/src/editor/assetconverter.cpp b/editor/src/editor/assetconverter.cpp index b37d1c65d..8a3ea995f 100644 --- a/editor/src/editor/assetconverter.cpp +++ b/editor/src/editor/assetconverter.cpp @@ -162,7 +162,7 @@ void AssetConverterSettings::resetIcon(const TString &uuid) { Returns icon assotiatited with current asset \a uuid. */ QImage AssetConverterSettings::icon(const TString &uuid) { - TString iconPath(ProjectSettings::instance()->iconPath() + "/" + uuid + ".png"); + TString iconPath(Editor::project()->iconPath() + "/" + uuid + ".png"); for(auto &it : m_subItems) { if(it.second.info.uuid == uuid) { @@ -331,7 +331,7 @@ TString AssetConverterSettings::destination() const { Returns the absolute destination file path. */ TString AssetConverterSettings::absoluteDestination() const { - return ProjectSettings::instance()->importPath() + "/" + m_info.uuid; + return Editor::project()->importPath() + "/" + m_info.uuid; } /*! \internal @@ -415,7 +415,7 @@ AssetConverter::ReturnCode AssetConverterSettings::saveBinary(const Variant &dat types.insert(it.toList().begin()->toString()); } - ProjectSettings::instance()->reportTypes(types); + Editor::project()->reportTypes(types); file.write(Bson::save(data)); file.close(); diff --git a/editor/src/editor/asseteditor.cpp b/editor/src/editor/asseteditor.cpp index a380c55c6..e0771420d 100644 --- a/editor/src/editor/asseteditor.cpp +++ b/editor/src/editor/asseteditor.cpp @@ -36,12 +36,12 @@ void AssetEditor::onOpenAsset() { } dialog.addFilter(assetType(), list); - dialog.setDirectory(ProjectSettings::instance()->contentPath()); + dialog.setDirectory(Editor::project()->contentPath()); if(dialog.exec()) { TString path(dialog.getSelectedFile()); if(!path.isEmpty()) { - loadAsset(AssetManager::instance()->fetchSettings(path)); + loadAsset(Editor::assets()->fetchSettings(path)); } } } @@ -60,6 +60,14 @@ bool AssetEditor::allowSaveAs() const { return true; } +void AssetEditor::backup() { + +} + +void AssetEditor::restore() { + +} + void AssetEditor::saveAsset(const TString &path) { Q_UNUSED(path) @@ -170,7 +178,7 @@ void AssetEditor::onSaveAs() { dialog.setWindowTitle(TString("Save ") + assetType); dialog.addFilter(assetType, list); - dialog.setDirectory(ProjectSettings::instance()->contentPath()); + dialog.setDirectory(Editor::project()->contentPath()); if(dialog.exec()) { TString path(dialog.getSelectedFile()); diff --git a/editor/src/editor/assetmanager.cpp b/editor/src/editor/assetmanager.cpp index 24428f62e..9af999075 100644 --- a/editor/src/editor/assetmanager.cpp +++ b/editor/src/editor/assetmanager.cpp @@ -62,11 +62,6 @@ AssetManager::~AssetManager() { } } -AssetManager *AssetManager::instance() { - static AssetManager instance; - return &instance; -} - void AssetManager::init() { registerConverter(new AnimConverter); registerConverter(new TextConverter); @@ -77,8 +72,8 @@ void AssetManager::init() { registerConverter(new MapConverter); registerConverter(new ControlSchemeConverter); - for(auto &it : PluginManager::instance()->extensions("converter")) { - AssetConverter *converter = reinterpret_cast(PluginManager::instance()->getPluginObject(it)); + for(auto &it : Editor::plugins()->extensions("converter")) { + AssetConverter *converter = reinterpret_cast(Editor::plugins()->getPluginObject(it)); if(converter) { registerConverter(converter); } @@ -88,9 +83,9 @@ void AssetManager::init() { void AssetManager::rescan() { m_force = false; - TString target = ProjectSettings::instance()->targetPath(); + TString target = Editor::project()->targetPath(); if(target.isEmpty()) { - bool update = ProjectSettings::instance()->projectSdk() != SDK_VERSION; + bool update = Editor::project()->projectSdk() != SDK_VERSION; if(update) { getChangedUUIDs(); } @@ -106,7 +101,7 @@ void AssetManager::rescan() { Engine::resourceSystem()->setCleanImport(m_force); - emit directoryChanged(ProjectSettings::instance()->contentPath().data()); + emit directoryChanged(Editor::project()->contentPath().data()); reimport(); } @@ -145,7 +140,7 @@ bool AssetManager::pushToImport(AssetConverterSettings *settings) { TString AssetManager::pathToLocal(const TString &source) const { Url info(source); - if(!source.contains(ProjectSettings::instance()->contentPath())) { + if(!source.contains(Editor::project()->contentPath())) { TString path = info.name(); TString sub; if(info.suffix().isEmpty()) { @@ -154,12 +149,12 @@ TString AssetManager::pathToLocal(const TString &source) const { } return TString(".embedded/") + path + sub; } - return TString(info.relativeFilePath(ProjectSettings::instance()->contentPath())); + return TString(info.relativeFilePath(Editor::project()->contentPath())); } void AssetManager::getChangedUUIDs() { uint32_t current = 0; - StringList currentStr = ProjectSettings::instance()->projectSdk().split('.'); + StringList currentStr = Editor::project()->projectSdk().split('.'); if(currentStr.size() >= 2) { current = VERSION_CHECK(currentStr.front().toInt(), currentStr.back().toInt()); } @@ -168,7 +163,7 @@ void AssetManager::getChangedUUIDs() { uint32_t target = VERSION_CHECK(targetStr.front().toInt(), targetStr.back().toInt()); if(current < target) { - File file(ProjectSettings::instance()->resourcePath() + "/uuid.txt"); + File file(Editor::project()->resourcePath() + "/uuid.txt"); if(file.open(File::Read | File::Text)) { for(auto &it : Json::load(file.readAll()).toMap()) { m_changedUUIDs.push_back(std::make_pair(it.first, it.second.toString())); @@ -184,7 +179,7 @@ void AssetManager::fixUUIDs() { } aInfo() << "Fixing dependencies"; - for(auto &path : File::list(ProjectSettings::instance()->contentPath())) { + for(auto &path : File::list(Editor::project()->contentPath())) { std::ifstream file(path.toStdString(), std::ios::binary | std::ios::ate); if(!file) { continue; @@ -275,7 +270,7 @@ void AssetManager::makePrefab(const TString &source, const TString &target) { TString name = source.right(index + 1); Actor *actor = dynamic_cast(Engine::findObject(id.toLong())); if(actor) { - TString path = ProjectSettings::instance()->contentPath() + "/" + target + "/" + name + ".fab"; + TString path = Editor::project()->contentPath() + "/" + target + "/" + name + ".fab"; PrefabConverter *converter = dynamic_cast(getConverter(path)); if(converter) { @@ -302,7 +297,7 @@ void AssetManager::makePrefab(const TString &source, const TString &target) { bool AssetManager::import(const TString &source, const TString &target) { TString path; if(!Url(target).isAbsolute()) { - path = ProjectSettings::instance()->contentPath() + "/"; + path = Editor::project()->contentPath() + "/"; } path += target + "/"; @@ -334,7 +329,7 @@ AssetConverterSettings *AssetManager::fetchSettings(const TString &source) { settings->setConverter(converter); } else { TString suffix(Url(source).suffix().toLower()); - CodeBuilder *currentBuilder = ProjectSettings::instance()->currentBuilder(); + CodeBuilder *currentBuilder = Editor::project()->currentBuilder(); CodeBuilder *builder = nullptr; for(auto it : m_builders) { if(it && (dynamic_cast(it) == nullptr || it == currentBuilder)) { @@ -467,14 +462,14 @@ void AssetManager::dumpBundle() { VariantMap values; - values[gEntry] = ProjectSettings::instance()->firstMap(); - values[gCompany] = ProjectSettings::instance()->projectCompany(); - values[gProjectName] = ProjectSettings::instance()->projectName(); - values[gProjectVersion] = ProjectSettings::instance()->projectVersion(); + values[gEntry] = Editor::project()->firstMap(); + values[gCompany] = Editor::project()->projectCompany(); + values[gProjectName] = Editor::project()->projectName(); + values[gProjectVersion] = Editor::project()->projectVersion(); root[gSettings] = values; - File file(ProjectSettings::instance()->importPath() + "/" + gIndex); + File file(Editor::project()->importPath() + "/" + gIndex); if(file.open(File::Write)) { file.write(Json::save(root, 0)); file.close(); @@ -498,9 +493,9 @@ void AssetManager::onPerform() { } for(CodeBuilder *it : std::as_const(m_builders)) { - it->rescanSources(ProjectSettings::instance()->contentPath()); + it->rescanSources(Editor::project()->contentPath()); NativeCodeBuilder *native = dynamic_cast(it); - if(!it->isEmpty() && (native == nullptr || (native == ProjectSettings::instance()->currentBuilder() && ProjectSettings::instance()->targetPath().isEmpty()))) { + if(!it->isEmpty() && (native == nullptr || (native == Editor::project()->currentBuilder() && Editor::project()->targetPath().isEmpty()))) { if(it->isOutdated()) { result = true; @@ -515,7 +510,7 @@ void AssetManager::onPerform() { } // Cleanup bundle - for(auto &path : File::list(ProjectSettings::instance()->importPath())) { + for(auto &path : File::list(Editor::project()->importPath())) { TString fileName(Url(path).name()); if(!File::isDir(path) && fileName != gIndex && uuidToPath(fileName).isEmpty()) { File::remove(path); @@ -525,7 +520,7 @@ void AssetManager::onPerform() { ResourceSystem::Dictionary &indices = Engine::resourceSystem()->indices(); auto tmp = indices; for(auto &index : tmp) { - if(index.second.uuid.isEmpty() || (!File::exists(ProjectSettings::instance()->importPath() + "/" + index.second.uuid))) { + if(index.second.uuid.isEmpty() || (!File::exists(Editor::project()->importPath() + "/" + index.second.uuid))) { indices.erase(index.second.uuid); } } @@ -570,7 +565,7 @@ void AssetManager::convert(AssetConverterSettings *settings) { m_converterSettings[pathToLocal(path)] = settings; TString uuid = settings->subItem(it).uuid; - if(File::exists(ProjectSettings::instance()->importPath() + "/" + uuid)) { + if(File::exists(Editor::project()->importPath() + "/" + uuid)) { Engine::reloadResource(uuid); emit imported(); } @@ -613,7 +608,7 @@ std::list AssetManager::builders() const { } void AssetManager::registerAsset(const TString &source, const ResourceSystem::ResourceInfo &info) { - if(File::exists(ProjectSettings::instance()->importPath() + "/" + info.uuid)) { + if(File::exists(Editor::project()->importPath() + "/" + info.uuid)) { TString path = pathToLocal(source); ResourceSystem::Dictionary &indices = Engine::resourceSystem()->indices(); diff --git a/editor/src/editor/baseassetprovider.cpp b/editor/src/editor/baseassetprovider.cpp index 43c6c338f..cb4ac6150 100644 --- a/editor/src/editor/baseassetprovider.cpp +++ b/editor/src/editor/baseassetprovider.cpp @@ -57,8 +57,8 @@ void BaseAssetProvider::init(bool force) { m_dirWatcher->removePaths(paths); } - ProjectSettings *mgr = ProjectSettings::instance(); - TString resourcePath(ProjectSettings::instance()->resourcePath()); + ProjectSettings *mgr = Editor::project(); + TString resourcePath(mgr->resourcePath()); bool watch = false; onDirectoryChangedForce(resourcePath + "/engine", force); @@ -78,7 +78,7 @@ void BaseAssetProvider::init(bool force) { void BaseAssetProvider::onFileChanged(const TString &path) { onFileChangedForce(path); - AssetManager::instance()->reimport(); + Editor::assets()->reimport(); } /*! Internal file change handler with \a force import option @@ -94,7 +94,7 @@ void BaseAssetProvider::onFileChanged(const TString &path) { */ void BaseAssetProvider::onFileChangedForce(const TString &path, bool force) { if(File::exists(path) && Url(path).suffix() != gMetaExt) { - AssetManager *mgr = AssetManager::instance(); + AssetManager *mgr = Editor::assets(); AssetConverterSettings *settings = mgr->fetchSettings(path); if(settings) { if(force || settings->isOutdated()) { @@ -125,7 +125,7 @@ void BaseAssetProvider::onDirectoryChanged(const TString &path) { } } - AssetManager::instance()->directoryChanged(path); + Editor::assets()->directoryChanged(path); } /*! Internal directory change handler with optional watching and force import @@ -167,14 +167,14 @@ void BaseAssetProvider::removeResource(const TString &source) { return; } - ProjectSettings *project = ProjectSettings::instance(); - AssetManager *asset = AssetManager::instance(); + ProjectSettings *mgr = Editor::project(); + AssetManager *asset = Editor::assets(); Engine::unloadResource(asset->pathToLocal(source)); TString uuid(asset->unregisterAsset(source)); if(!uuid.isEmpty()) { - File::remove(project->importPath() + "/" + uuid); - File::remove(project->iconPath() + "/" + uuid + ".png"); + File::remove(mgr->importPath() + "/" + uuid); + File::remove(mgr->iconPath() + "/" + uuid + ".png"); } File::remove(source + "." + gMetaExt); @@ -184,7 +184,7 @@ void BaseAssetProvider::removeResource(const TString &source) { if(settings) { CodeBuilder *builder = settings->builder(); if(builder) { - builder->rescanSources(project->contentPath()); + builder->rescanSources(mgr->contentPath()); builder->makeOutdated(); builder->buildProject(); } @@ -210,7 +210,7 @@ void BaseAssetProvider::removeResource(const TString &source) { \sa AssetManager::registerAsset(), AssetConverter::renameAsset() */ void BaseAssetProvider::renameResource(const TString &oldName, const TString &newName) { - AssetManager *asset = AssetManager::instance(); + AssetManager *asset = Editor::assets(); ResourceSystem::Dictionary &indices(Engine::resourceSystem()->indices()); @@ -227,9 +227,9 @@ void BaseAssetProvider::renameResource(const TString &oldName, const TString &ne if(File::rename(oldName, newName)) { std::map back; - ProjectSettings *project = ProjectSettings::instance(); + ProjectSettings *mgr = Editor::project(); for(auto it = indices.cbegin(); it != indices.cend();) { - TString path(project->contentPath() + "/" + it->first); + TString path(mgr->contentPath() + "/" + it->first); if(path.startsWith(oldName)) { back[path] = it->second; it = indices.erase(it); @@ -306,7 +306,7 @@ void BaseAssetProvider::duplicateResource(const TString &source) { File::copy(source + "." + gMetaExt, filePath + "." + gMetaExt); } - AssetManager *asset = AssetManager::instance(); + AssetManager *asset = Editor::assets(); AssetConverterSettings *targetSettings = asset->fetchSettings(filePath); if(targetSettings) { targetSettings->newSettings(); diff --git a/editor/src/editor/codebuilder.cpp b/editor/src/editor/codebuilder.cpp index 92c4f538e..742770880 100644 --- a/editor/src/editor/codebuilder.cpp +++ b/editor/src/editor/codebuilder.cpp @@ -45,7 +45,7 @@ AssetConverter::ReturnCode CodeBuilder::convertFile(AssetConverterSettings *) { } void CodeBuilder::buildSuccessful(bool flag) { - AssetManager::instance()->onBuildSuccessful(flag, this); + Editor::assets()->onBuildSuccessful(flag, this); } AssetConverterSettings *CodeBuilder::createSettings() { diff --git a/editor/src/editor/editorsettings.cpp b/editor/src/editor/editorsettings.cpp index 20b711f20..f78e0d00c 100644 --- a/editor/src/editor/editorsettings.cpp +++ b/editor/src/editor/editorsettings.cpp @@ -14,11 +14,6 @@ EditorSettings::EditorSettings() : } -EditorSettings *EditorSettings::instance() { - static EditorSettings instance; - return &instance; -} - void EditorSettings::registerValue(const TString &name, const Variant &value, const TString &annotation) { blockSignals(true); setProperty(name.data(), value); diff --git a/editor/src/editor/nativecodebuilder.cpp b/editor/src/editor/nativecodebuilder.cpp index bb7e95b9b..bea371f4d 100644 --- a/editor/src/editor/nativecodebuilder.cpp +++ b/editor/src/editor/nativecodebuilder.cpp @@ -34,13 +34,13 @@ NativeCodeBuilder::NativeCodeBuilder() { connect(&m_process, _SIGNAL(readyReadStandardOutput()), this, _SLOT(onReadOutput()) ); connect(&m_process, _SIGNAL(readyReadStandardError()), this, _SLOT(onReadError()) ); - ProjectSettings *project = ProjectSettings::instance(); + ProjectSettings *mgr = Editor::project(); - TString idName = project->projectName().remove(' ').toLower(); + TString idName = mgr->projectName().remove(' ').toLower(); idName.remove('_'); m_values["${idName}"] = idName; - TString sdk(project->sdkPath()); + TString sdk(mgr->sdkPath()); m_incPath = { sdk + "/include/engine", @@ -66,9 +66,9 @@ NativeCodeBuilder::NativeCodeBuilder() { }; m_defines = { - TString("COMPANY_NAME=\"\\\"%1\\\"\"").arg(project->projectCompany()), - TString("PRODUCT_NAME=\"\\\"%1\\\"\"").arg(project->projectName()), - TString("PRODUCT_VERSION=\"\\\"%1\\\"\"").arg(project->projectVersion()) + TString("COMPANY_NAME=\"\\\"%1\\\"\"").arg(mgr->projectCompany()), + TString("PRODUCT_NAME=\"\\\"%1\\\"\"").arg(mgr->projectName()), + TString("PRODUCT_VERSION=\"\\\"%1\\\"\"").arg(mgr->projectVersion()) }; } @@ -78,8 +78,8 @@ bool NativeCodeBuilder::buildProject() { void NativeCodeBuilder::onBuildFinished(int exitCode) { if(exitCode == 0) { - if(ProjectSettings::instance()->targetPath().isEmpty()) { - PluginManager::instance()->reloadPlugin(m_artifact); + if(Editor::project()->targetPath().isEmpty()) { + Editor::plugins()->reloadPlugin(m_artifact); } } @@ -100,7 +100,7 @@ void NativeCodeBuilder::onReadError() { void NativeCodeBuilder::generateProject() { aInfo() << name() << "Generating project"; - ProjectSettings *mgr = ProjectSettings::instance(); + ProjectSettings *mgr = Editor::project(); m_project = mgr->generatedPath() + "/"; @@ -191,8 +191,8 @@ void NativeCodeBuilder::generateLoader(const TString &dst, const StringList &mod } } - TString name = ProjectSettings::instance()->projectName() + "-editor"; - for(auto &it : PluginManager::instance()->plugins()) { + TString name = Editor::project()->projectName() + "-editor"; + for(auto &it : Editor::plugins()->plugins()) { Url info(it); if(name != info.baseName()) { m_values[gEditorLibrariesList].append(TString(12, ' ') + "\"" + info.baseName() + "\",\n"); diff --git a/editor/src/editor/pluginmanager.cpp b/editor/src/editor/pluginmanager.cpp index 5d955ef96..83d3a6f47 100644 --- a/editor/src/editor/pluginmanager.cpp +++ b/editor/src/editor/pluginmanager.cpp @@ -117,7 +117,7 @@ bool PluginManager::setData(const QModelIndex &index, const QVariant &value, int auto &plugin = *std::next(m_plugins.begin(), index.row()); plugin.enabled = value.toBool(); - auto &plugins = ProjectSettings::instance()->plugins(); + auto &plugins = Editor::project()->plugins(); plugins[plugin.name] = plugin.enabled; syncWhiteList(); @@ -147,17 +147,6 @@ QModelIndex PluginManager::parent(const QModelIndex &child) const { return QModelIndex(); } -PluginManager *PluginManager::instance() { - if(m_instance == nullptr) { - m_instance = new PluginManager; - } - return m_instance; -} - -void PluginManager::destroy() { - delete m_instance; -} - void PluginManager::init(Engine *engine) { m_engine = engine; @@ -194,7 +183,7 @@ bool PluginManager::loadPlugin(const TString &path, bool reload) { plug.tags.push_front("Beta"); } - if(plug.path.contains(ProjectSettings::instance()->pluginsPath().data())) { + if(plug.path.contains(Editor::project()->pluginsPath().data())) { plug.tags.push_back("Project"); m_whiteList.push_back(plug.name); } @@ -388,7 +377,7 @@ void PluginManager::deserializeComponents(const ComponentBackup &backup) { void PluginManager::syncWhiteList() { StringList toRemove; - auto &plugins = ProjectSettings::instance()->plugins(); + auto &plugins = Editor::project()->plugins(); for(auto &it : plugins) { if(it.second) { if(std::find(m_initialWhiteList.begin(), m_initialWhiteList.end(), it.first) != m_initialWhiteList.end()) { @@ -410,7 +399,7 @@ void PluginManager::syncWhiteList() { plugins.erase(it); } } - ProjectSettings::instance()->saveSettings(); + Editor::project()->saveSettings(); } StringList PluginManager::plugins() const { diff --git a/editor/src/editor/projectsettings.cpp b/editor/src/editor/projectsettings.cpp index 6bd5ccfe7..1f8be10c5 100644 --- a/editor/src/editor/projectsettings.cpp +++ b/editor/src/editor/projectsettings.cpp @@ -48,11 +48,6 @@ ProjectSettings::ProjectSettings() { m_myProjectsPath = path.toStdString(); } -ProjectSettings *ProjectSettings::instance() { - static ProjectSettings instance; - return &instance; -} - void ProjectSettings::init(const TString &project, const TString &target) { m_projectPath = project; @@ -82,10 +77,11 @@ void ProjectSettings::init(const TString &project, const TString &target) { File::mkPath(m_pluginsPath); setCurrentPlatform(); + loadSettings(); } void ProjectSettings::loadPlatforms() { - for(auto &it : AssetManager::instance()->builders()) { + for(auto &it : Editor::assets()->builders()) { for(auto &platform : it->platforms()) { m_supportedPlatforms[platform] = it; } @@ -388,7 +384,7 @@ NativeCodeBuilder *ProjectSettings::currentBuilder(const TString &platform) cons void ProjectSettings::reportTypes(const std::set &types) { TString projectModule = TString("Module") + projectName(); for(auto &it : types) { - TString name = PluginManager::instance()->getModuleName(it); + TString name = Editor::plugins()->getModuleName(it); if(!name.isEmpty() && name != projectModule) { m_autoModules.insert(name); } diff --git a/modules/editor/buildtools/converter/androidbuilder.cpp b/modules/editor/buildtools/converter/androidbuilder.cpp index 9d3140668..20697daab 100644 --- a/modules/editor/buildtools/converter/androidbuilder.cpp +++ b/modules/editor/buildtools/converter/androidbuilder.cpp @@ -22,7 +22,7 @@ namespace { AndroidBuilder::AndroidBuilder() { setName("[AndroidBuilder]"); - EditorSettings *settings = EditorSettings::instance(); + EditorSettings *settings = Editor::settings(); settings->registerValue(gAndroidJava, "", gEditorPath); settings->registerValue(gAndroidSdk, "", gEditorPath); @@ -38,7 +38,7 @@ AndroidBuilder::AndroidBuilder() { bool AndroidBuilder::buildProject() { if(m_outdated && !m_process.isRunning()) { - EditorSettings *settings = EditorSettings::instance(); + EditorSettings *settings = Editor::settings(); TString sdkPath = settings->value(gAndroidSdk).toString(); if(sdkPath.isEmpty()) { @@ -54,7 +54,7 @@ bool AndroidBuilder::buildProject() { TString toolChains = ndkPath + "/toolchains/llvm/prebuilt/windows-x86_64"; - TString javaPath = EditorSettings::instance()->value(gAndroidJava).toString(); + TString javaPath = Editor::settings()->value(gAndroidJava).toString(); if(javaPath.isEmpty()) { aCritical() << name() << "Can't find the Java by the path:" << javaPath; return false; @@ -65,7 +65,7 @@ bool AndroidBuilder::buildProject() { generateProject(); - ProjectSettings *mgr = ProjectSettings::instance(); + ProjectSettings *mgr = Editor::project(); m_projectPath = mgr->cachePath() + "/" + mgr->currentPlatformName() + "/release"; m_artifact = mgr->cachePath() + "/" + mgr->currentPlatformName() + "/base.apk"; m_keystorePath = mgr->cachePath() + "/" + mgr->currentPlatformName() + "/debug.keystore"; @@ -112,7 +112,7 @@ bool AndroidBuilder::buildProject() { void AndroidBuilder::generateProject() { NativeCodeBuilder::generateProject(); - ProjectSettings *mgr = ProjectSettings::instance(); + ProjectSettings *mgr = Editor::project(); updateTemplate(":/templates/android/AndroidManifest.xml", mgr->platformsPath() + "/android/AndroidManifest.xml"); updateTemplate(":/templates/android/res/xml/backup_rules.xml", mgr->platformsPath() + "/android/res/xml/backup_rules.xml"); @@ -183,7 +183,7 @@ bool AndroidBuilder::compileNative(const TString &tools, const TString &arch) { args.push_back(TString("-I") + it); } - args.push_back(TString("-L") + ProjectSettings::instance()->sdkPath() + "/android/" + arch + "/static"); + args.push_back(TString("-L") + Editor::project()->sdkPath() + "/android/" + arch + "/static"); for(auto &it : m_libs) { args.push_back(TString("-l") + it); @@ -200,7 +200,7 @@ bool AndroidBuilder::compileNative(const TString &tools, const TString &arch) { } bool AndroidBuilder::compileResources(const TString &tools) { - ProjectSettings *mgr = ProjectSettings::instance(); + ProjectSettings *mgr = Editor::project(); TString compiled = mgr->cachePath() + "/" + mgr->currentPlatformName() + "/compiled"; @@ -235,7 +235,7 @@ bool AndroidBuilder::compileResources(const TString &tools) { } bool AndroidBuilder::linkResources(const TString &tools, const TString &sdk) { - ProjectSettings *mgr = ProjectSettings::instance(); + ProjectSettings *mgr = Editor::project(); StringList args; @@ -304,7 +304,7 @@ bool AndroidBuilder::makeKeystore(const TString &java) { } bool AndroidBuilder::signPackage(const TString &java, const TString &tools) { - ProjectSettings *mgr = ProjectSettings::instance(); + ProjectSettings *mgr = Editor::project(); StringList args; @@ -344,7 +344,7 @@ bool AndroidBuilder::package() { zip_fileinfo zi = {0}; - StringList list(File::list(ProjectSettings::instance()->importPath())); + StringList list(File::list(Editor::project()->importPath())); for(auto &it : list) { Url info(it); diff --git a/modules/editor/buildtools/converter/linuxbuilder.cpp b/modules/editor/buildtools/converter/linuxbuilder.cpp index 38341ba86..1abd30eb5 100644 --- a/modules/editor/buildtools/converter/linuxbuilder.cpp +++ b/modules/editor/buildtools/converter/linuxbuilder.cpp @@ -31,7 +31,7 @@ LinuxBuilder::LinuxBuilder() { } bool LinuxBuilder::isEmpty() const { - return (ProjectSettings::instance()->currentPlatformName() != "linux"); + return (Editor::project()->currentPlatformName() != "linux"); } bool LinuxBuilder::buildProject() { @@ -40,7 +40,7 @@ bool LinuxBuilder::buildProject() { generateProject(); - ProjectSettings *mgr = ProjectSettings::instance(); + ProjectSettings *mgr = Editor::project(); TString product = mgr->projectName(); TString path = mgr->cachePath() + "/" + mgr->currentPlatformName() + "/" + gMode + "/"; @@ -51,7 +51,7 @@ bool LinuxBuilder::buildProject() { if(mgr->targetPath().isEmpty()) { m_artifact = path + gPrefix + product + gShared; } else { - m_libPath.push_back(ProjectSettings::instance()->sdkPath() + "/linux/x86/static"); + m_libPath.push_back(mgr->sdkPath() + "/linux/x86/static"); m_artifact = path + product; } diff --git a/modules/editor/buildtools/converter/vsbuilder.cpp b/modules/editor/buildtools/converter/vsbuilder.cpp index 27c0f9e18..e1b4eb9cf 100644 --- a/modules/editor/buildtools/converter/vsbuilder.cpp +++ b/modules/editor/buildtools/converter/vsbuilder.cpp @@ -44,11 +44,11 @@ VsBuilder::VsBuilder() { m_libsPref = ""; m_libsSuff = ".lib"; m_libsSep = ";"; m_defSep = ";"; - ProjectSettings *project = ProjectSettings::instance(); + ProjectSettings *mgr = Editor::project(); m_defines = { - TString("COMPANY_NAME=\"%1\"").arg(project->projectCompany()), - TString("PRODUCT_NAME=\"%1\"").arg(project->projectName()), - TString("PRODUCT_VERSION=\"%1\"").arg(project->projectVersion()) + TString("COMPANY_NAME=\"%1\"").arg(mgr->projectCompany()), + TString("PRODUCT_NAME=\"%1\"").arg(mgr->projectName()), + TString("PRODUCT_VERSION=\"%1\"").arg(mgr->projectVersion()) }; } @@ -56,7 +56,7 @@ bool VsBuilder::buildProject() { if(m_outdated && !m_process.isRunning()) { generateProject(); - ProjectSettings *mgr = ProjectSettings::instance(); + ProjectSettings *mgr = Editor::project(); StringList args; @@ -88,7 +88,7 @@ bool VsBuilder::buildProject() { void VsBuilder::generateProject() { NativeCodeBuilder::generateProject(); - ProjectSettings *mgr = ProjectSettings::instance(); + ProjectSettings *mgr = Editor::project(); m_project = mgr->cachePath() + "/" + mgr->currentPlatformName() + "/"; diff --git a/modules/editor/buildtools/converter/xcodebuilder.cpp b/modules/editor/buildtools/converter/xcodebuilder.cpp index ad9c95c70..bd4bfdf17 100644 --- a/modules/editor/buildtools/converter/xcodebuilder.cpp +++ b/modules/editor/buildtools/converter/xcodebuilder.cpp @@ -28,11 +28,11 @@ XcodeBuilder::XcodeBuilder() { m_defPref = TString(5, '\t'); m_defSep = ",\n"; - ProjectSettings *project = ProjectSettings::instance(); + ProjectSettings *mgr = Editor::project(); m_defines = { - TString("COMPANY_NAME=\"%1\"").arg(project->projectCompany()), - TString("PRODUCT_NAME=\"%1\"").arg(project->projectName()), - TString("PRODUCT_VERSION=\"%1\"").arg(project->projectVersion()) + TString("COMPANY_NAME=\"%1\"").arg(mgr->projectCompany()), + TString("PRODUCT_NAME=\"%1\"").arg(mgr->projectName()), + TString("PRODUCT_VERSION=\"%1\"").arg(mgr->projectVersion()) }; } @@ -40,7 +40,7 @@ bool XcodeBuilder::buildProject() { if(m_outdated && !m_process.isRunning()) { m_process.setWorkingDirectory(m_project); - ProjectSettings *mgr = ProjectSettings::instance(); + ProjectSettings *mgr = Editor::project(); m_values[gPlatformsPath] = mgr->platformsPath(); m_values[gCachePath] = mgr->cachePath(); @@ -89,7 +89,7 @@ bool XcodeBuilder::buildProject() { void XcodeBuilder::generateProject() { NativeCodeBuilder::generateProject(); - ProjectSettings *mgr = ProjectSettings::instance(); + ProjectSettings *mgr = Editor::project(); if(mgr->currentPlatformName() == "tvos") { m_values[gSdkName] = "appletvos"; diff --git a/modules/editor/particletools/converter/effectgraph.cpp b/modules/editor/particletools/converter/effectgraph.cpp index 64c89e5a8..644176041 100644 --- a/modules/editor/particletools/converter/effectgraph.cpp +++ b/modules/editor/particletools/converter/effectgraph.cpp @@ -54,7 +54,7 @@ void EffectGraph::scanForFunctions() { StringList paths = { ":/modules", - ProjectSettings::instance()->contentPath() + Editor::project()->contentPath() }; for(auto &path : paths) { diff --git a/modules/editor/shadertools/converter/shaderbuilder.cpp b/modules/editor/shadertools/converter/shaderbuilder.cpp index 858879c49..078a1c24c 100644 --- a/modules/editor/shadertools/converter/shaderbuilder.cpp +++ b/modules/editor/shadertools/converter/shaderbuilder.cpp @@ -362,7 +362,7 @@ void ShaderBuilder::compileData(VariantMap &data) { uint32_t version = 430; bool es = false; - NativeCodeBuilder *builder = ProjectSettings::instance()->currentBuilder(); + NativeCodeBuilder *builder = Editor::project()->currentBuilder(); if(builder->isEmbedded()) { version = 300; es = true; @@ -532,7 +532,7 @@ bool ShaderBuilder::parseShaderFormat(const TString &path, VariantMap &user, int define += "\n#define USE_GBUFFER"; - NativeCodeBuilder *builder = ProjectSettings::instance()->currentBuilder(); + NativeCodeBuilder *builder = Editor::project()->currentBuilder(); if(builder && !builder->isEmbedded()) { define += "\n#define USE_SSBO"; } @@ -939,10 +939,10 @@ void ShaderBuilder::init() { TString ShaderBuilder::loadIncludes(const TString &path, const TString &define, const PragmaMap &pragmas) { StringList paths; - paths.push_back(ProjectSettings::instance()->contentPath() + "/"); + paths.push_back(Editor::project()->contentPath() + "/"); paths.push_back(":/shaders/"); - paths.push_back(ProjectSettings::instance()->resourcePath() + "/engine/shaders/"); - paths.push_back(ProjectSettings::instance()->resourcePath() + "/editor/shaders/"); + paths.push_back(Editor::project()->resourcePath() + "/engine/shaders/"); + paths.push_back(Editor::project()->resourcePath() + "/editor/shaders/"); for(const TString &it : paths) { QFile file((it + path).data()); diff --git a/modules/editor/shadertools/converter/shadergraph.cpp b/modules/editor/shadertools/converter/shadergraph.cpp index 66f452308..a2b68a773 100644 --- a/modules/editor/shadertools/converter/shadergraph.cpp +++ b/modules/editor/shadertools/converter/shadergraph.cpp @@ -242,7 +242,7 @@ void ShaderGraph::scanForCustomFunctions() { QStringList paths = { ":/shaders/functions", - ProjectSettings::instance()->contentPath().data() + Editor::project()->contentPath().data() }; for(auto &path : paths) { @@ -482,7 +482,7 @@ VariantMap ShaderGraph::data(bool editor, ShaderRootNode *root) { define += "\n#define METAL"; } - NativeCodeBuilder *builder = ProjectSettings::instance()->currentBuilder(); + NativeCodeBuilder *builder = Editor::project()->currentBuilder(); if(root->materialType() == ShaderRootNode::Surface && builder && !builder->isEmbedded()) { define += "\n#define USE_SSBO"; } diff --git a/modules/editor/shadertools/editor/shadercodedialog.cpp b/modules/editor/shadertools/editor/shadercodedialog.cpp index 7bd6ed5d5..c76dabe4f 100644 --- a/modules/editor/shadertools/editor/shadercodedialog.cpp +++ b/modules/editor/shadertools/editor/shadercodedialog.cpp @@ -18,7 +18,7 @@ ShaderCodeDialog::ShaderCodeDialog(QWidget *parent) : connect(ui->comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(showShader())); - m_codeEditor = reinterpret_cast(PluginManager::instance()->getPluginObject("CodeEdit")); + m_codeEditor = reinterpret_cast(Editor::plugins()->getPluginObject("CodeEdit")); if(m_codeEditor) { ui->verticalLayout->addWidget(m_codeEditor); } else { diff --git a/modules/editor/spineimporter/converter/spineconverter.cpp b/modules/editor/spineimporter/converter/spineconverter.cpp index e45cb534d..5489175ca 100644 --- a/modules/editor/spineimporter/converter/spineconverter.cpp +++ b/modules/editor/spineimporter/converter/spineconverter.cpp @@ -371,7 +371,7 @@ void SpineConverter::importAtlas(SpineConverterSettings *settings) { switch(currentState) { case State::FileName: { TString path = (info.absoluteDir() + "/" + it).toStdString(); - settings->m_texture = AssetManager::instance()->pathToUuid(path); + settings->m_texture = Editor::assets()->pathToUuid(path); currentState++; } break; diff --git a/modules/editor/texteditor/editor/textwidget.cpp b/modules/editor/texteditor/editor/textwidget.cpp index 82b75f62c..34769567f 100644 --- a/modules/editor/texteditor/editor/textwidget.cpp +++ b/modules/editor/texteditor/editor/textwidget.cpp @@ -73,7 +73,7 @@ TextWidget::TextWidget(QWidget *parent) : option.setFlags(option.flags() | QTextOption::AddSpaceForLineAndParagraphSeparators); document()->setDefaultTextOption(option); - EditorSettings *settings = EditorSettings::instance(); + EditorSettings *settings = Editor::settings(); settings->registerValue(gFont, gDefaultFont); settings->registerValue(gZoom, 100); @@ -137,8 +137,8 @@ void TextWidget::saveFile(const QString &path) { } void TextWidget::checkClassMap() { - for(auto &it : PluginManager::instance()->extensions("converter")) { - AssetConverter *converter = reinterpret_cast(PluginManager::instance()->getPluginObject(it)); + for(auto &it : Editor::plugins()->extensions("converter")) { + AssetConverter *converter = reinterpret_cast(Editor::plugins()->getPluginObject(it)); if(converter) { for(TString &format : converter->suffixes()) { if(format.toLower() == Url(m_fileName.toStdString()).suffix()) { @@ -840,7 +840,7 @@ void TextWidget::insertFromMimeData(const QMimeData *source) { } void TextWidget::onApplySettings() { - EditorSettings *s = EditorSettings::instance(); + EditorSettings *s = Editor::settings(); TString name = s->property(gFont).toString(); if(name.isEmpty()) { name = gDefaultFont; diff --git a/modules/editor/texturetools/converter/textureconverter.cpp b/modules/editor/texturetools/converter/textureconverter.cpp index 41491a97f..34cda5905 100644 --- a/modules/editor/texturetools/converter/textureconverter.cpp +++ b/modules/editor/texturetools/converter/textureconverter.cpp @@ -373,7 +373,7 @@ Texture *TextureConverter::convertTexture(TextureImportSettings *settings) const if(settings->compressed()) { int method = Texture::BC7; // Desktop - TString platform = ProjectSettings::instance()->currentPlatformName(); + TString platform = Editor::project()->currentPlatformName(); if(platform.contains("webgl")) { method = Texture::BC3; if(channels == 3) { diff --git a/modules/editor/tiledimporter/converter/tiledmapconverter.cpp b/modules/editor/tiledimporter/converter/tiledmapconverter.cpp index 2c6235d8c..6fe207ed6 100644 --- a/modules/editor/tiledimporter/converter/tiledmapconverter.cpp +++ b/modules/editor/tiledimporter/converter/tiledmapconverter.cpp @@ -99,7 +99,7 @@ AssetConverter::ReturnCode TiledMapConverter::convertFile(AssetConverterSettings settings->setSubItem(tilesetName, resInfo); } } else { - source = Url(info.dir() + "/" + source).relativeFilePath(ProjectSettings::instance()->contentPath()); + source = Url(info.dir() + "/" + source).relativeFilePath(Editor::project()->contentPath()); tileSet = Engine::loadResource(source); } @@ -200,7 +200,7 @@ void TiledMapConverter::parseTileset(const pugi::xml_node &parent, const TString while(element) { if(std::string(element.name()) == "image") { Url info(path + "/" + element.attribute("source").as_string()); - TString source(info.relativeFilePath(ProjectSettings::instance()->contentPath())); + TString source(info.relativeFilePath(Editor::project()->contentPath())); tileSet.setTexture(Engine::loadResource(source)); } else if(std::string(element.name()) == "tileoffset") { diff --git a/modules/editor/timeline/editor/timelinecontroller.cpp b/modules/editor/timeline/editor/timelinecontroller.cpp index 441bc6c2b..62945f0bc 100644 --- a/modules/editor/timeline/editor/timelinecontroller.cpp +++ b/modules/editor/timeline/editor/timelinecontroller.cpp @@ -64,8 +64,8 @@ void TimelineController::setClip(AnimationClip *clip) { if(m_clip) { TString uuid = Engine::reference(m_clip); - TString path = AssetManager::instance()->uuidToPath(uuid); - m_clipSettings = AssetManager::instance()->fetchSettings(path); + TString path = Editor::assets()->uuidToPath(uuid); + m_clipSettings = Editor::assets()->fetchSettings(path); } emit updated(); } diff --git a/modules/editor/timeline/editor/timelineedit.cpp b/modules/editor/timeline/editor/timelineedit.cpp index ebc7324d9..16b9c5841 100644 --- a/modules/editor/timeline/editor/timelineedit.cpp +++ b/modules/editor/timeline/editor/timelineedit.cpp @@ -61,7 +61,7 @@ TimelineEdit::~TimelineEdit() { void TimelineEdit::saveClip() { AnimationClip *clip = m_model->clip(); if(clip) { - File file(AssetManager::instance()->uuidToPath(Engine::reference(clip))); + File file(Editor::assets()->uuidToPath(Engine::reference(clip))); if(file.open(File::Write)) { VariantMap data = clip->saveUserData(); @@ -109,7 +109,7 @@ void TimelineEdit::updateClips() { AnimationStateMachine *stateMachine = m_animator->stateMachine(); if(stateMachine) { for(auto it : stateMachine->states()) { - Url info(AssetManager::instance()->uuidToPath(Engine::reference(it->m_clip))); + Url info(Editor::assets()->uuidToPath(Engine::reference(it->m_clip))); m_clips[info.baseName()] = it->m_clip; } if(!m_clips.empty()) { diff --git a/modules/editor/webtools/converter/emscriptenbuilder.cpp b/modules/editor/webtools/converter/emscriptenbuilder.cpp index 9b404a934..f5d0a6f20 100644 --- a/modules/editor/webtools/converter/emscriptenbuilder.cpp +++ b/modules/editor/webtools/converter/emscriptenbuilder.cpp @@ -17,11 +17,11 @@ EmscriptenBuilder::EmscriptenBuilder() { connect(&m_process, _SIGNAL(finished(int)), this, _SLOT(onBuildFinished(int))); - EditorSettings *settings = EditorSettings::instance(); + EditorSettings *settings = Editor::settings(); settings->registerValue(gEmscriptenPath, "", "editor=Path"); - m_libPath.push_back(ProjectSettings::instance()->sdkPath() + "/emscripten/x86/static"); + m_libPath.push_back(Editor::project()->sdkPath() + "/emscripten/x86/static"); m_libs.push_back("vorbis"); m_libs.push_back("vorbisfile"); @@ -30,14 +30,14 @@ EmscriptenBuilder::EmscriptenBuilder() { } bool EmscriptenBuilder::isEmpty() const { - return (ProjectSettings::instance()->currentPlatformName() != "webgl"); + return (Editor::project()->currentPlatformName() != "webgl"); } bool EmscriptenBuilder::buildProject() { if(m_outdated && !m_process.isRunning()) { aInfo() << name() << "Build started."; - m_emPath = EditorSettings::instance()->value(gEmscriptenPath).toString(); + m_emPath = Editor::settings()->value(gEmscriptenPath).toString(); #ifdef _WIN32 m_binary = m_emPath + "/upstream/emscripten/emcc.bat"; #endif @@ -48,7 +48,7 @@ bool EmscriptenBuilder::buildProject() { generateProject(); - ProjectSettings *mgr = ProjectSettings::instance(); + ProjectSettings *mgr = Editor::project(); m_artifact = mgr->cachePath() + "/" + mgr->currentPlatformName() + "/release"; File::mkPath(m_artifact); diff --git a/modules/vms/angel/src/converters/angelbuilder.cpp b/modules/vms/angel/src/converters/angelbuilder.cpp index cf0d00dee..c26e96754 100644 --- a/modules/vms/angel/src/converters/angelbuilder.cpp +++ b/modules/vms/angel/src/converters/angelbuilder.cpp @@ -105,8 +105,8 @@ void AngelBuilder::init() { bool AngelBuilder::buildProject() { if(m_outdated) { - AssetManager *assetMgr = AssetManager::instance(); - ProjectSettings *project = ProjectSettings::instance(); + AssetManager *assetMgr = Editor::assets(); + ProjectSettings *project = Editor::project(); if(m_sources.empty()) { File::remove(project->importPath() + "/" + g_persistentUUID); diff --git a/thirdparty/next/inc/core/astring.h b/thirdparty/next/inc/core/astring.h index e0bcead4f..76977e8ac 100644 --- a/thirdparty/next/inc/core/astring.h +++ b/thirdparty/next/inc/core/astring.h @@ -82,8 +82,8 @@ class NEXT_LIBRARY_EXPORT TString { bool startsWith(const TString &str) const; - int indexOf(const TString &str) const; - int indexOf(const char ch) const; + int indexOf(const TString &str, uint32_t offset = 0) const; + int indexOf(const char ch, uint32_t offset = 0) const; TString mid(int position, int n) const; diff --git a/thirdparty/next/src/core/astring.cpp b/thirdparty/next/src/core/astring.cpp index fddc9cf62..89f795b46 100644 --- a/thirdparty/next/src/core/astring.cpp +++ b/thirdparty/next/src/core/astring.cpp @@ -224,14 +224,14 @@ bool TString::startsWith(const TString &str) const { /*! Returns the index position of the first occurrence of the string \a str in this string. Returns -1 if \a str is not found. */ -int TString::indexOf(const TString &str) const { - return m_data.find(str.m_data); +int TString::indexOf(const TString &str, uint32_t offset) const { + return m_data.find(str.m_data, offset); } /*! Returns the index position of the first occurrence of the character \a ch in this string. Returns -1 if \a ch is not found. */ -int TString::indexOf(const char ch) const { - return m_data.find(ch); +int TString::indexOf(const char ch, uint32_t offset) const { + return m_data.find(ch, offset); } /*! Returns a string that contains \a n characters of this string, starting at the specified \a position index up to, but not including. diff --git a/worldeditor/src/main.cpp b/worldeditor/src/main.cpp index 3c4997f17..03762300b 100644 --- a/worldeditor/src/main.cpp +++ b/worldeditor/src/main.cpp @@ -67,16 +67,14 @@ int main(int argc, char *argv[]) { splash.show(); app.processEvents(); - MainWindow window(&engine); + MainWindow window; splash.finish(&window); - window.onOpenProject(project); + window.onOpenProject(project, engine); window.show(); int result = app.exec(); - PluginManager::destroy(); - return result; } diff --git a/worldeditor/src/main/mainwindow.cpp b/worldeditor/src/main/mainwindow.cpp index dd82d89fe..b5d6699a0 100644 --- a/worldeditor/src/main/mainwindow.cpp +++ b/worldeditor/src/main/mainwindow.cpp @@ -26,8 +26,6 @@ #include #include -#include "documentmodel.h" - // System #include #include "config.h" @@ -51,22 +49,16 @@ namespace { const char *gWorkspace("main.workspace"); }; -MainWindow::MainWindow(Engine *engine, QWidget *parent) : +MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow), m_currentWorkspace(":/Workspaces/Default.ws"), - m_engine(engine), m_queue(nullptr), - m_documentModel(nullptr), - m_editorSettings(EditorSettings::instance()), - m_projectSettings(ProjectSettings::instance()), m_editorSettingsBrowser(new EditorSettingsBrowser(this)), m_projectSettingsBrowser(new ProjectSettingsBrowser(this)), m_contentBrowser(new ContentBrowser(this)), m_consoleOutput(new ConsoleManager(this)), m_preview(nullptr), - m_mainEditor(nullptr), - m_currentEditor(nullptr), m_builder(new QProcess(this)) { qRegisterMetaType ("Vector2"); @@ -76,7 +68,7 @@ MainWindow::MainWindow(Engine *engine, QWidget *parent) : qRegisterMetaType ("uint32_t"); QLocale locale(QLocale::English, QLocale::UnitedStates); - m_editorSettings->registerValue("General/Language", TString(locale.bcp47Name().toStdString()), "editor=Locale"); + Editor::settings()->registerValue("General/Language", TString(locale.bcp47Name().toStdString()), "editor=Locale"); ui->setupUi(this); @@ -126,36 +118,13 @@ MainWindow::~MainWindow() { delete ui; } -void MainWindow::addGadget(EditorGadget *gadget) { - m_gadgets.push_back(gadget); - - ui->toolWidget->addToolWindow(gadget, QToolWindowManager::NoArea); - - connect(m_documentModel, &DocumentModel::updated, gadget, &EditorGadget::onUpdated); - connect(m_documentModel, &DocumentModel::selectionChanaged, gadget, &EditorGadget::onSelectionChanged); - - connect(gadget, &EditorGadget::objectsSelected, m_documentModel, &DocumentModel::selectionChanaged); -} - AssetEditor *MainWindow::openEditor(const TString &path) { - if(m_documentModel == nullptr) { - return nullptr; - } - - AssetEditor *editor = m_documentModel->openFile(path); + AssetEditor *editor = Editor::openFile(path); if(editor) { if(ui->toolWidget->areaFor(editor) == nullptr) { - QWidget *neighbor = m_mainEditor; - for(auto &it : findChildren()) { - if(it->inherits(editor->metaObject()->className())) { - neighbor = it; - break; - } - } - ui->toolWidget->removeToolWindow(editor); editor->setParent(this); - ui->toolWidget->addToolWindow(editor, QToolWindowManager::ReferenceAddTo, ui->toolWidget->areaFor(neighbor)); + ui->toolWidget->addToolWindow(editor, QToolWindowManager::ReferenceAddTo, ui->toolWidget->areaFor(Editor::currentEditor())); } else { ui->toolWidget->activateToolWindow(editor); } @@ -171,36 +140,34 @@ void MainWindow::onOpenEditor(const TString &path) { void MainWindow::closeEvent(QCloseEvent *event) { QMainWindow::closeEvent(event); - TString str = m_projectSettings->projectId(); + TString str = Editor::project()->projectId(); if(!str.isEmpty()) { QSettings settings(COMPANY_NAME, EDITOR_NAME); // Save status for open editors - if(m_documentModel) { - VariantList editors; + VariantList editors; - for(auto &it : m_documentModel->documents()) { - VariantMap editorState = it->saveState(); + for(auto &it : Editor::documents()) { + VariantMap editorState = it->saveState(); - VariantList documents; - for(auto &doc : it->openedDocuments()) { - documents.push_back({doc->source()}); - } + VariantList documents; + for(auto &doc : it->openedDocuments()) { + documents.push_back({doc->source()}); + } - VariantList params = {documents, editorState}; + VariantList params = {documents, editorState}; - editors.push_back(params); + editors.push_back(params); - ui->toolWidget->activateToolWindow(it); - if(!it->checkSave()) { - event->ignore(); - return; - } + ui->toolWidget->activateToolWindow(it); + if(!it->checkSave()) { + event->ignore(); + return; } - - settings.setValue(str.data(), Json::save(editors).data()); } + settings.setValue(str.data(), Json::save(editors).data()); + // Save workspace settings.setValue(gGeometry, saveGeometry()); settings.setValue(gWindows, ui->toolWidget->saveState()); @@ -211,36 +178,53 @@ void MainWindow::closeEvent(QCloseEvent *event) { } void MainWindow::on_actionNew_triggered() { - m_documentModel->newFile(m_currentEditor); + AssetEditor *editor = Editor::currentEditor(); + if(editor && editor->checkSave()) { + Editor::closeEditor(editor); + editor->onNewAsset(); + } } void MainWindow::on_actionOpen_triggered() { - m_documentModel->openFile(m_currentEditor); + AssetEditor *editor = Editor::currentEditor(); + if(editor && editor->checkSave()) { + Editor::closeEditor(editor); + editor->onOpenAsset(); + } } void MainWindow::on_actionSave_triggered() { if(!Engine::isGameMode()) { - m_currentEditor->onSave(); + Editor::currentEditor()->onSave(); } else { QApplication::beep(); } } void MainWindow::on_actionSave_As_triggered() { - if(!Engine::isGameMode() && m_currentEditor->allowSaveAs()) { - m_currentEditor->onSaveAs(); + if(!Engine::isGameMode()) { + AssetEditor *editor = Editor::currentEditor(); + if(editor && editor->allowSaveAs()) { + editor->onSaveAs(); + } } } void MainWindow::on_actionUndo_triggered() { if(!Engine::isGameMode()) { - m_currentEditor->undoRedo()->undo(); + AssetEditor *editor = Editor::currentEditor(); + if(editor) { + editor->undoRedo()->undo(); + } } } void MainWindow::on_actionRedo_triggered() { if(!Engine::isGameMode()) { - m_currentEditor->undoRedo()->redo(); + AssetEditor *editor = Editor::currentEditor(); + if(editor) { + editor->undoRedo()->redo(); + } } } @@ -260,14 +244,14 @@ void MainWindow::setGameMode(bool mode) { if(m_preview) { if(mode) { if(m_preview->parent() == nullptr) { - ui->toolWidget->moveToolWindow(m_preview, QToolWindowManager::ReferenceAddTo, ui->toolWidget->areaFor(m_mainEditor)); + ui->toolWidget->moveToolWindow(m_preview, QToolWindowManager::ReferenceAddTo, ui->toolWidget->areaFor(Editor::currentEditor())); } - static_cast(m_mainEditor)->backupScenes(); + Editor::backup(); ui->toolWidget->activateToolWindow(m_preview); m_preview->onActivate(); } else { - ui->toolWidget->activateToolWindow(m_mainEditor); - static_cast(m_mainEditor)->restoreBackupScenes(); + ui->toolWidget->activateToolWindow(Editor::currentEditor()); + Editor::restore(); m_preview->setPaused(false); ui->pauseButton->setChecked(false); @@ -284,29 +268,28 @@ void MainWindow::setGameMode(bool mode) { Engine::setGameMode(mode); } -void MainWindow::onOpenProject(const TString &path) { +void MainWindow::onOpenProject(const TString &path, Engine &engine) { ProjectModel::addProject(path); - m_projectSettings->init(path); - m_projectSettings->loadSettings(); + Editor::project()->init(path); - PluginManager::instance()->init(m_engine); + Editor::plugins()->init(&engine); m_queue = new ImportQueue; connect(m_queue, &ImportQueue::importFinished, this, &MainWindow::onImportFinished, Qt::QueuedConnection); - AssetManager::instance()->init(); + Editor::assets()->init(); - m_projectSettings->loadPlatforms(); + Editor::project()->loadPlatforms(); // Read settings early for converters - m_editorSettings->loadSettings(); + Editor::settings()->loadSettings(); - if(!PluginManager::instance()->rescanProject(m_projectSettings->pluginsPath())) { - m_projectSettings->currentBuilder(m_projectSettings->currentPlatformName())->makeOutdated(); + if(!Editor::plugins()->rescanProject(Editor::project()->pluginsPath())) { + Editor::project()->currentBuilder(Editor::project()->currentPlatformName())->makeOutdated(); } - AssetManager::instance()->rescan(); + Editor::assets()->rescan(); - for(const TString &it : m_projectSettings->platforms()) { + for(const TString &it : Editor::project()->platforms()) { QString name = it.data(); name.replace(0, 1, name.at(0).toUpper()); QAction *action = ui->menuBuild_Project->addAction(tr("Build for %1").arg(name)); @@ -318,31 +301,31 @@ void MainWindow::onOpenProject(const TString &path) { } void MainWindow::onImportFinished() { - PluginManager::instance()->initSystems(); + Editor::plugins()->initSystems(); - m_documentModel = new DocumentModel; + Editor::init(); - m_mainEditor = new SceneComposer(this); - m_documentModel->addEditor(m_mainEditor); + SceneComposer *composer = new SceneComposer(this); + Editor::addEditor(composer); m_preview = new Preview(this); - m_editorSettings->loadSettings(); + Editor::settings()->loadSettings(); m_editorSettingsBrowser->init(); m_projectSettingsBrowser->init(); PropertyEditor *property = new PropertyEditor(this); connect(m_contentBrowser, &ContentBrowser::assetsSelected, property, &PropertyEditor::onObjectSelected); - addGadget(property); - addGadget(new HierarchyBrowser(this)); + Editor::addGadget(property); + Editor::addGadget(new HierarchyBrowser(this)); - for(auto &it : PluginManager::instance()->extensions("gadget")) { - addGadget(reinterpret_cast(PluginManager::instance()->getPluginObject(it))); + for(auto it : Editor::gadgets()) { + ui->toolWidget->addToolWindow(it, QToolWindowManager::NoArea); } - ui->toolWidget->addToolWindow(m_preview, QToolWindowManager::NoArea); - ui->toolWidget->addToolWindow(m_mainEditor, QToolWindowManager::NoArea); + ui->toolWidget->addToolWindow(m_preview, QToolWindowManager::NoArea); + ui->toolWidget->addToolWindow(composer, QToolWindowManager::NoArea); foreach(QWidget *it, ui->toolWidget->toolWindows()) { QAction *action = new QAction(it->windowTitle(), ui->menuWindow); @@ -357,10 +340,10 @@ void MainWindow::onImportFinished() { QSettings settings(COMPANY_NAME, EDITOR_NAME); // Load last session state - QVariant windows = settings.value(gWindows); m_currentWorkspace = settings.value(gWorkspace, m_currentWorkspace).toString(); ui->toolPanel->setVisible(true); ui->toolWidget->setVisible(true); + QVariant windows = settings.value(gWindows); if(!windows.isValid() || !ui->toolWidget->restoreState(windows)) { on_actionReset_Workspace_triggered(); } else { @@ -372,7 +355,7 @@ void MainWindow::onImportFinished() { } } // Open the same editors with documents from the last session - QVariant map = settings.value(m_projectSettings->projectId().data()); + QVariant map = settings.value(Editor::project()->projectId().data()); if(map.isValid()) { VariantList editors = Json::load(map.toString().toStdString()).toList(); if(!editors.empty()) { @@ -396,15 +379,15 @@ void MainWindow::onImportFinished() { } } - if(m_mainEditor->openedDocuments().empty()) { - AssetManager *mgr = AssetManager::instance(); - TString firstMap = mgr->uuidToPath(m_projectSettings->firstMap()); + if(composer->openedDocuments().empty()) { + AssetManager *mgr = Editor::assets(); + TString firstMap = mgr->uuidToPath(Editor::project()->firstMap()); AssetConverterSettings *mapSettings = mgr->fetchSettings(firstMap); if(mapSettings) { openEditor(firstMap); } else { - m_mainEditor->onNewAsset(); + static_cast(composer)->onNewAsset(); } } @@ -421,12 +404,12 @@ void MainWindow::onImportFinished() { ui->menuWindow->setEnabled(true); ui->menuBuild_Project->setEnabled(true); - PluginManager::instance()->syncWhiteList(); + Editor::plugins()->syncWhiteList(); TString version(SDK_VERSION); - if(m_projectSettings->projectSdk() != version) { - m_projectSettings->setProjectSdk(version); - m_projectSettings->saveSettings(); + if(Editor::project()->projectSdk() != version) { + Editor::project()->setProjectSdk(version); + Editor::project()->saveSettings(); } setGameMode(false); @@ -455,7 +438,7 @@ void MainWindow::onToolWindowVisibilityChanged(QWidget *toolWindow, bool visible void MainWindow::on_actionSave_Workspace_triggered() { FileDialog dialog; - dialog.setDirectory(m_projectSettings->templatePath() + "/workspaces"); + dialog.setDirectory(Editor::project()->templatePath() + "/workspaces"); dialog.setWindowTitle("Save Workspace"); dialog.setMode(FileDialog::SaveFile); dialog.addFilter("Workspaces", { "*.ws" }); @@ -529,48 +512,33 @@ void MainWindow::onBuildProject() { void MainWindow::onCurrentToolWindowChanged(QWidget *toolWindow) { AssetEditor *editor = dynamic_cast(toolWindow); - if(editor == m_currentEditor) { + if(editor == Editor::currentEditor()) { return; } if(editor) { - foreach(auto it, m_gadgets) { - if(m_currentEditor) { - disconnect(it, &EditorGadget::updated, m_currentEditor, &AssetEditor::onUpdated); - disconnect(it, &EditorGadget::objectsSelected, m_currentEditor, &AssetEditor::onObjectsSelected); + AssetEditor *currentEditor = Editor::currentEditor(); + if(currentEditor) { + disconnect(ui->actionCut, &QAction::triggered, currentEditor, &AssetEditor::onCutAction); + disconnect(ui->actionCopy, &QAction::triggered, currentEditor, &AssetEditor::onCopyAction); + disconnect(ui->actionPaste, &QAction::triggered, currentEditor, &AssetEditor::onPasteAction); - disconnect(m_currentEditor, &AssetEditor::objectsChanged, it, &EditorGadget::onObjectsChanged); - } - - connect(it, &EditorGadget::updated, editor, &AssetEditor::onUpdated); - connect(it, &EditorGadget::objectsSelected, editor, &AssetEditor::onObjectsSelected); - - connect(editor, &AssetEditor::objectsChanged, it, &EditorGadget::onObjectsChanged); - - it->setCurrentEditor(editor); + disconnect(currentEditor, &AssetEditor::copyPasteChanged, this, &MainWindow::onCopyPasteChanged); } - if(m_currentEditor) { - disconnect(ui->actionCut, &QAction::triggered, m_currentEditor, &AssetEditor::onCutAction); - disconnect(ui->actionCopy, &QAction::triggered, m_currentEditor, &AssetEditor::onCopyAction); - disconnect(ui->actionPaste, &QAction::triggered, m_currentEditor, &AssetEditor::onPasteAction); + Editor::setCurrentEditor(editor); + if(editor) { + editor->onActivated(); - disconnect(m_currentEditor, &AssetEditor::copyPasteChanged, this, &MainWindow::onCopyPasteChanged); - } - - m_currentEditor = editor; - if(m_currentEditor) { - m_currentEditor->onActivated(); + ui->actionCut->setEnabled(editor->isCopyActionAvailable()); + ui->actionCopy->setEnabled(editor->isCopyActionAvailable()); + ui->actionPaste->setEnabled(editor->isPasteActionAvailable()); - ui->actionCut->setEnabled(m_currentEditor->isCopyActionAvailable()); - ui->actionCopy->setEnabled(m_currentEditor->isCopyActionAvailable()); - ui->actionPaste->setEnabled(m_currentEditor->isPasteActionAvailable()); + connect(ui->actionCut, &QAction::triggered, editor, &AssetEditor::onCutAction); + connect(ui->actionCopy, &QAction::triggered, editor, &AssetEditor::onCopyAction); + connect(ui->actionPaste, &QAction::triggered, editor, &AssetEditor::onPasteAction); - connect(ui->actionCut, &QAction::triggered, m_currentEditor, &AssetEditor::onCutAction); - connect(ui->actionCopy, &QAction::triggered, m_currentEditor, &AssetEditor::onCopyAction); - connect(ui->actionPaste, &QAction::triggered, m_currentEditor, &AssetEditor::onPasteAction); - - connect(m_currentEditor, &AssetEditor::copyPasteChanged, this, &MainWindow::onCopyPasteChanged); + connect(editor, &AssetEditor::copyPasteChanged, this, &MainWindow::onCopyPasteChanged); } } else { Preview *preview = dynamic_cast(toolWindow); @@ -581,36 +549,39 @@ void MainWindow::onCurrentToolWindowChanged(QWidget *toolWindow) { } void MainWindow::onCopyPasteChanged() { - ui->actionCut->setEnabled(m_currentEditor->isCopyActionAvailable()); - ui->actionCopy->setEnabled(m_currentEditor->isCopyActionAvailable()); - ui->actionPaste->setEnabled(m_currentEditor->isPasteActionAvailable()); + AssetEditor *editor = Editor::currentEditor(); + ui->actionCut->setEnabled(editor->isCopyActionAvailable()); + ui->actionCopy->setEnabled(editor->isCopyActionAvailable()); + ui->actionPaste->setEnabled(editor->isPasteActionAvailable()); } void MainWindow::on_menuFile_aboutToShow() { - QString name; - QString type; - if(m_currentEditor) { - type = QString(" %1").arg(m_currentEditor->assetType().data()); - if(!m_currentEditor->openedDocuments().empty()) { - AssetConverterSettings *settings = m_currentEditor->openedDocuments().front(); - name = QString(" \"%1\"").arg(settings->source().data()); + TString name; + TString type; + AssetEditor *editor = Editor::currentEditor(); + if(editor) { + type = TString(" %1").arg(editor->assetType()); + if(!editor->openedDocuments().empty()) { + AssetConverterSettings *settings = editor->openedDocuments().front(); + name = TString(" \"%1\"").arg(settings->source()); } if(name.isEmpty()) { name = type; } - ui->actionSave_As->setEnabled(m_currentEditor->allowSaveAs()); + ui->actionSave_As->setEnabled(editor->allowSaveAs()); } - ui->actionNew->setText(tr("New%1").arg(type)); - ui->actionOpen->setText(tr("Open%1").arg(type)); - ui->actionSave->setText(tr("Save%1").arg(name)); - ui->actionSave_As->setText(tr("Save%1 As...").arg(name)); + ui->actionNew->setText(tr("New%1").arg(type.data())); + ui->actionOpen->setText(tr("Open%1").arg(type.data())); + ui->actionSave->setText(tr("Save%1").arg(name.data())); + ui->actionSave_As->setText(tr("Save%1 As...").arg(name.data())); } void MainWindow::on_menuEdit_aboutToShow() { - ui->actionUndo->setText(tr("Undo %1").arg(m_currentEditor->undoRedo()->undoText().data())); + UndoStack *stack = Editor::currentEditor()->undoRedo(); + ui->actionUndo->setText(tr("Undo %1").arg(stack->undoText().data())); - ui->actionRedo->setText(tr("Redo %1").arg(m_currentEditor->undoRedo()->redoText().data())); + ui->actionRedo->setText(tr("Redo %1").arg(stack->redoText().data())); } void MainWindow::changeEvent(QEvent *event) { @@ -649,7 +620,7 @@ void MainWindow::build(QString platform) { TString dir = dialog.getSelectedFile(); if(!dir.isEmpty()) { QStringList args; - args << "-s" << m_projectSettings->projectPath().data() << "-t" << dir.data(); + args << "-s" << Editor::project()->projectPath().data() << "-t" << dir.data(); if(!platform.isEmpty()) { args << "-p" << platform; diff --git a/worldeditor/src/main/mainwindow.h b/worldeditor/src/main/mainwindow.h index 3382181b2..b10e05946 100644 --- a/worldeditor/src/main/mainwindow.h +++ b/worldeditor/src/main/mainwindow.h @@ -12,10 +12,6 @@ class ImportQueue; -class ProjectModel; -class FeedManager; -class DocumentModel; - class Preview; class AssetEditor; class EditorGadget; @@ -25,9 +21,6 @@ class ProjectSettingsBrowser; class ContentBrowser; class ConsoleManager; -class ProjectSettings; -class EditorSettings; - namespace Ui { class MainWindow; } @@ -36,13 +29,13 @@ class MainWindow : public QMainWindow { Q_OBJECT public: - explicit MainWindow(Engine *engine, QWidget *parent = nullptr); + explicit MainWindow(QWidget *parent = nullptr); ~MainWindow() override; public slots: void onOpenEditor(const TString &path); - void onOpenProject(const TString &path); + void onOpenProject(const TString &path, Engine &engine); signals: void readBuildLogs(QString log); @@ -53,8 +46,6 @@ public slots: void timerEvent(QTimerEvent *) override; - void addGadget(EditorGadget *gadget); - AssetEditor *openEditor(const TString &path); void resetGeometry(); @@ -73,17 +64,8 @@ public slots: QString m_currentWorkspace; - std::list m_gadgets; - - Engine *m_engine; - ImportQueue *m_queue; - DocumentModel *m_documentModel; - - EditorSettings *m_editorSettings; - ProjectSettings *m_projectSettings; - EditorSettingsBrowser *m_editorSettingsBrowser; ProjectSettingsBrowser *m_projectSettingsBrowser; ContentBrowser *m_contentBrowser; @@ -91,9 +73,6 @@ public slots: Preview *m_preview; - AssetEditor *m_mainEditor; - AssetEditor *m_currentEditor; - QProcess *m_builder; private slots: diff --git a/worldeditor/src/managers/assetimporter/iconrender.cpp b/worldeditor/src/managers/assetimporter/iconrender.cpp index ff3b2ad3b..90efb664f 100644 --- a/worldeditor/src/managers/assetimporter/iconrender.cpp +++ b/worldeditor/src/managers/assetimporter/iconrender.cpp @@ -49,7 +49,7 @@ void IconRender::readPixels(void *object) { const QImage IconRender::render(const TString &uuid) { Camera::setCurrent(m_camera); - Actor *object = AssetManager::instance()->createActor(uuid); + Actor *object = Editor::assets()->createActor(uuid); if(object) { object->setParent(m_scene); diff --git a/worldeditor/src/managers/assetimporter/importqueue.cpp b/worldeditor/src/managers/assetimporter/importqueue.cpp index 890fb79c2..d08a4ca28 100644 --- a/worldeditor/src/managers/assetimporter/importqueue.cpp +++ b/worldeditor/src/managers/assetimporter/importqueue.cpp @@ -14,7 +14,7 @@ ImportQueue::ImportQueue(QWidget *parent) : ui(new Ui::ImportQueue) { ui->setupUi(this); - AssetManager *manager = AssetManager::instance(); + AssetManager *manager = Editor::assets(); connect(manager, &AssetManager::importStarted, this, &ImportQueue::onStarted); connect(manager, &AssetManager::imported, this, &ImportQueue::onProcessed); connect(manager, &AssetManager::importFinished, this, &ImportQueue::onImportFinished); diff --git a/worldeditor/src/managers/plugindialog/plugindialog.cpp b/worldeditor/src/managers/plugindialog/plugindialog.cpp index 4bdb1578e..7d67e7ae7 100644 --- a/worldeditor/src/managers/plugindialog/plugindialog.cpp +++ b/worldeditor/src/managers/plugindialog/plugindialog.cpp @@ -154,7 +154,7 @@ PluginDialog::PluginDialog(QWidget *parent) : setWindowFlags(windowFlags() ^ Qt::WindowContextHelpButtonHint); - m_filter->setSourceModel(PluginManager::instance()); + m_filter->setSourceModel(Editor::plugins()); ui->listView->setModel(m_filter); ui->listView->setItemDelegate(new PluginDelegate()); @@ -162,7 +162,7 @@ PluginDialog::PluginDialog(QWidget *parent) : ui->notification->setProperty("notification", true); ui->notification->setVisible(false); - connect(PluginManager::instance(), &PluginManager::listChanged, ui->notification, &QWidget::show); + connect(Editor::plugins(), &PluginManager::listChanged, ui->notification, &QWidget::show); } PluginDialog::~PluginDialog() { @@ -171,7 +171,7 @@ PluginDialog::~PluginDialog() { void PluginDialog::on_loadButton_clicked() { FileDialog dialog; - dialog.setDirectory(ProjectSettings::instance()->pluginsPath()); + dialog.setDirectory(Editor::project()->pluginsPath()); dialog.setWindowTitle("Please select Thunder Engine Plugin"); dialog.setMode(FileDialog::OpenFile); dialog.addFilter("Plugins", { "*.dll" }); @@ -179,7 +179,7 @@ void PluginDialog::on_loadButton_clicked() { if(dialog.exec()) { TString path = dialog.getSelectedFile(); if(!path.isEmpty()) { - PluginManager::instance()->loadPlugin(path); + Editor::plugins()->loadPlugin(path); } } } @@ -194,7 +194,7 @@ void PluginDialog::on_restartButton_clicked() { qApp->quit(); Process::startDetached(qApp->arguments().first().toStdString(), - {ProjectSettings::instance()->projectPath()}, + {Editor::project()->projectPath()}, TString(), ProcessEnvironment::systemEnvironment()); } diff --git a/worldeditor/src/screens/componentbrowser/componentmodel.cpp b/worldeditor/src/screens/componentbrowser/componentmodel.cpp index d155d4b5f..2b0d4feb6 100644 --- a/worldeditor/src/screens/componentbrowser/componentmodel.cpp +++ b/worldeditor/src/screens/componentbrowser/componentmodel.cpp @@ -10,7 +10,7 @@ const char *gURI("uri"); ComponentModel::ComponentModel() : BaseObjectModel(nullptr) { - connect(AssetManager::instance(), &AssetManager::buildSuccessful, this, &ComponentModel::update); + connect(Editor::assets(), &AssetManager::buildSuccessful, this, &ComponentModel::update); } ComponentModel *ComponentModel::instance() { diff --git a/worldeditor/src/screens/contentbrowser/commitrevert.cpp b/worldeditor/src/screens/contentbrowser/commitrevert.cpp index d0f101b0b..3cafd6785 100644 --- a/worldeditor/src/screens/contentbrowser/commitrevert.cpp +++ b/worldeditor/src/screens/contentbrowser/commitrevert.cpp @@ -53,8 +53,8 @@ void CommitRevert::on_commitButton_clicked() { AssetConverterSettings *settings = dynamic_cast(m_propertyObject); if(settings && settings->isModified()) { settings->saveSettings(); - AssetManager::instance()->pushToImport(settings); - AssetManager::instance()->reimport(); + Editor::assets()->pushToImport(settings); + Editor::assets()->reimport(); } ui->commitButton->setEnabled(false); @@ -87,8 +87,8 @@ void CommitRevert::checkImportSettings(AssetConverterSettings *settings) { } if(result == QMessageBox::Yes) { settings->saveSettings(); - AssetManager::instance()->pushToImport(settings); - AssetManager::instance()->reimport(); + Editor::assets()->pushToImport(settings); + Editor::assets()->reimport(); } if(result == QMessageBox::No) { settings->loadSettings(); diff --git a/worldeditor/src/screens/contentbrowser/contentbrowser.cpp b/worldeditor/src/screens/contentbrowser/contentbrowser.cpp index 00c05461b..e371211e4 100644 --- a/worldeditor/src/screens/contentbrowser/contentbrowser.cpp +++ b/worldeditor/src/screens/contentbrowser/contentbrowser.cpp @@ -110,7 +110,7 @@ class ContentTreeFilter : public QSortFilterProxyModel { bool canDropMimeData(const QMimeData *data, Qt::DropAction, int, int, const QModelIndex &parent) const { QModelIndex origin = mapToSource(parent); - ProjectSettings *mgr = ProjectSettings::instance(); + ProjectSettings *mgr = Editor::project(); TString target(mgr->contentPath()); if(origin.isValid() && origin.parent().isValid()) { @@ -138,14 +138,14 @@ class ContentTreeFilter : public QSortFilterProxyModel { bool dropMimeData(const QMimeData *data, Qt::DropAction, int, int, const QModelIndex &parent) { QModelIndex origin = mapToSource(parent); - TString target(ProjectSettings::instance()->contentPath()); + TString target(Editor::project()->contentPath()); if(origin.isValid() && origin.parent().isValid()) { target = static_cast(sourceModel())->path(origin); } if(data->hasUrls()) { for(const QUrl &url : data->urls()) { - AssetManager::instance()->import(url.toLocalFile().toStdString(), target); + Editor::assets()->import(url.toLocalFile().toStdString(), target); } } else if(data->hasFormat(gMimeContent)) { if(!target.isEmpty()) { @@ -154,13 +154,13 @@ class ContentTreeFilter : public QSortFilterProxyModel { for(QString path : data->data(gMimeContent).split(';')) { if(!path.isEmpty()) { - AssetManager::instance()->renameResource(path.toStdString(), target + path.toStdString()); + Editor::assets()->renameResource(path.toStdString(), target + path.toStdString()); } } } else if(data->hasFormat(gMimeObject)) { for(QString path : data->data(gMimeObject).split(';')) { if(!path.isEmpty()) { - AssetManager::instance()->makePrefab(path.toStdString(), target); + Editor::assets()->makePrefab(path.toStdString(), target); } } } @@ -314,14 +314,14 @@ void ContentBrowser::createContextMenus() { m_creationMenu.addAction(a); std::set paths; - for(auto it : AssetManager::instance()->builders()) { + for(auto it : Editor::assets()->builders()) { TString path(it->templatePath()); if(!path.isEmpty()) { paths.insert(path); } } - for(auto &it : AssetManager::instance()->converters()) { + for(auto &it : Editor::assets()->converters()) { TString path(it->templatePath()); if(!path.isEmpty()) { paths.insert(path); @@ -394,7 +394,7 @@ void ContentBrowser::onFilterMenuTriggered(QAction *) { } void ContentBrowser::onFilterMenuAboutToShow() { - for(auto &it : AssetManager::instance()->labels()) { + for(auto &it : Editor::assets()->labels()) { if(!it.isEmpty()) { QAction *child = m_filterMenu->findChild(it.data()); if(child == nullptr) { @@ -432,7 +432,7 @@ void ContentBrowser::onItemDuplicate() { QModelIndex origin = filter->mapToSource(view->currentIndex()); TString path(m_contentTree->path(origin)); - AssetManager::instance()->duplicateResource(dynamic_cast(view) != nullptr ? Url(path).name() : path); + Editor::assets()->duplicateResource(dynamic_cast(view) != nullptr ? Url(path).name() : path); } } @@ -455,7 +455,7 @@ void ContentBrowser::onItemDelete() { foreach(auto &it, view->selectionModel()->selectedIndexes()) { QModelIndex origin = filter->mapToSource(it); - AssetManager::instance()->removeResource(m_contentTree->path(origin)); + Editor::assets()->removeResource(m_contentTree->path(origin)); } emit model->layoutAboutToBeChanged(); @@ -515,7 +515,7 @@ void ContentBrowser::on_contentTree_customContextMenuRequested(const QPoint &pos void ContentBrowser::on_contentList_clicked(const QModelIndex &index) { const QModelIndex origin = m_listProxy->mapToSource(index); - m_settings = AssetManager::instance()->fetchSettings(m_contentTree->path(origin)); + m_settings = Editor::assets()->fetchSettings(m_contentTree->path(origin)); if(m_settings) { if(m_commitRevert) { m_commitRevert->setObject(m_settings); @@ -543,7 +543,7 @@ void ContentBrowser::importAsset() { TString target(m_contentTree->path(origin)); foreach(auto &it, files) { - AssetManager::instance()->import(it, target); + Editor::assets()->import(it, target); } } @@ -556,7 +556,7 @@ void ContentBrowser::changeEvent(QEvent *event) { void ContentBrowser::showInGraphicalShell() { QModelIndexList list = ui->contentList->selectionModel()->selectedIndexes(); - TString path(ProjectSettings::instance()->contentPath()); + TString path(Editor::project()->contentPath()); if(!list.isEmpty()) { QModelIndex origin = m_listProxy->mapToSource(list.first()); path = m_contentTree->path(origin); diff --git a/worldeditor/src/screens/contentbrowser/contenttree.cpp b/worldeditor/src/screens/contentbrowser/contenttree.cpp index 1bea13402..e2dad2759 100644 --- a/worldeditor/src/screens/contentbrowser/contenttree.cpp +++ b/worldeditor/src/screens/contentbrowser/contenttree.cpp @@ -24,8 +24,8 @@ ContentTree::ContentTree() : m_folder = QImage(":/Style/styles/dark/images/folder.svg"); - connect(AssetManager::instance(), &AssetManager::directoryChanged, this, &ContentTree::update); - connect(AssetManager::instance(), &AssetManager::iconUpdated, this, &ContentTree::onRendered); + connect(Editor::assets(), &AssetManager::directoryChanged, this, &ContentTree::update); + connect(Editor::assets(), &AssetManager::iconUpdated, this, &ContentTree::onRendered); } int ContentTree::columnCount(const QModelIndex &) const { @@ -76,7 +76,7 @@ bool ContentTree::setData(const QModelIndex &index, const QVariant &value, int r if(source.isEmpty()) { File::mkDir(dest); } else { - AssetManager *mgr = AssetManager::instance(); + AssetManager *mgr = Editor::assets(); AssetConverter *converter = mgr->getConverter(dest); if(converter) { converter->createFromTemplate(dest); @@ -94,7 +94,7 @@ bool ContentTree::setData(const QModelIndex &index, const QVariant &value, int r } m_newAsset->setParent(nullptr); } else { - AssetManager::instance()->renameResource(url.absoluteFilePath(), dest); + Editor::assets()->renameResource(url.absoluteFilePath(), dest); } } } break; @@ -119,13 +119,13 @@ TString ContentTree::path(const QModelIndex &index) const { } } - return TString(ProjectSettings::instance()->contentPath()); + return TString(Editor::project()->contentPath()); } void ContentTree::onRendered(const TString &uuid) { - AssetManager *asset = AssetManager::instance(); + AssetManager *asset = Editor::assets(); - TString path(ProjectSettings::instance()->contentPath() + "/" + asset->uuidToPath(uuid)); + TString path(Editor::project()->contentPath() + "/" + asset->uuidToPath(uuid)); AssetConverterSettings *settings = asset->fetchSettings(path); if(settings) { settings->resetIcon(uuid); @@ -148,8 +148,8 @@ void ContentTree::onRendered(const TString &uuid) { bool ContentTree::reimportResource(const QModelIndex &index) { QObject *item = getObject(index); if(item) { - AssetManager::instance()->pushToImport(item->objectName().toStdString()); - AssetManager::instance()->reimport(); + Editor::assets()->pushToImport(item->objectName().toStdString()); + Editor::assets()->reimport(); } return true; } @@ -158,7 +158,7 @@ bool ContentTree::removeResource(const QModelIndex &index) { if(index.isValid()) { QObject *item = getObject(index); if(item) { - AssetManager::instance()->removeResource(item->objectName().toStdString()); + Editor::assets()->removeResource(item->objectName().toStdString()); item->setParent(nullptr); delete item; } @@ -197,14 +197,14 @@ QModelIndex ContentTree::setNewAsset(const TString &name, const TString &source, } void ContentTree::update() { - TString contentPath(ProjectSettings::instance()->contentPath()); + TString contentPath(Editor::project()->contentPath()); QObject *parent = m_rootItem->findChild(contentPath.data()); if(parent == nullptr) { parent = m_content; } clean(parent); - AssetManager *mgr = AssetManager::instance(); + AssetManager *mgr = Editor::assets(); StringList list = File::list(contentPath); for(TString &path : list) { diff --git a/worldeditor/src/screens/editorsettings/editorsettingsbrowser.cpp b/worldeditor/src/screens/editorsettings/editorsettingsbrowser.cpp index 2a6cc52ba..be89db285 100644 --- a/worldeditor/src/screens/editorsettings/editorsettingsbrowser.cpp +++ b/worldeditor/src/screens/editorsettings/editorsettingsbrowser.cpp @@ -50,7 +50,7 @@ EditorSettingsBrowser::~EditorSettingsBrowser() { } void EditorSettingsBrowser::init() { - ui->propertiesWidget->onObjectSelected(EditorSettings::instance()); + ui->propertiesWidget->onObjectSelected(Editor::settings()); QStringList groups; QAbstractItemModel *m = ui->propertiesWidget->model(); @@ -66,7 +66,7 @@ void EditorSettingsBrowser::init() { } void EditorSettingsBrowser::onSettingsUpdated(const Object::ObjectList &objects, const TString &property, Variant value) { - EditorSettings::instance()->setValue(property, value); + Editor::settings()->setValue(property, value); } void EditorSettingsBrowser::on_groups_clicked(const QModelIndex &index) { diff --git a/worldeditor/src/screens/projectbrowser/projectbrowser.cpp b/worldeditor/src/screens/projectbrowser/projectbrowser.cpp index 5c10f01d5..3b2c4a1ac 100644 --- a/worldeditor/src/screens/projectbrowser/projectbrowser.cpp +++ b/worldeditor/src/screens/projectbrowser/projectbrowser.cpp @@ -32,7 +32,7 @@ ProjectBrowser::~ProjectBrowser() { void ProjectBrowser::onNewProject() { FileDialog dialog; - dialog.setDirectory(ProjectSettings::instance()->myProjectsPath()); + dialog.setDirectory(Editor::project()->myProjectsPath()); dialog.setWindowTitle("Create New Project"); dialog.setMode(FileDialog::SaveFile); dialog.addFilter("Project Files", { TString("*") + gProjectExt }); @@ -58,7 +58,7 @@ void ProjectBrowser::onNewProject() { void ProjectBrowser::onImportProject() { FileDialog dialog; - dialog.setDirectory(ProjectSettings::instance()->myProjectsPath()); + dialog.setDirectory(Editor::project()->myProjectsPath()); dialog.setWindowTitle("Import Existing Project"); dialog.setMode(FileDialog::OpenFile); dialog.addFilter("Project Files", { TString("*") + gProjectExt }); diff --git a/worldeditor/src/screens/projectsettings/projectsettingsbrowser.cpp b/worldeditor/src/screens/projectsettings/projectsettingsbrowser.cpp index d13e544e4..9160dda30 100644 --- a/worldeditor/src/screens/projectsettings/projectsettingsbrowser.cpp +++ b/worldeditor/src/screens/projectsettings/projectsettingsbrowser.cpp @@ -19,11 +19,11 @@ ProjectSettingsBrowser::~ProjectSettingsBrowser() { } void ProjectSettingsBrowser::init() { - ui->projectWidget->onObjectSelected({ProjectSettings::instance()}); + ui->projectWidget->onObjectSelected(Editor::project()); } void ProjectSettingsBrowser::onSettingsUpdated(const Object::ObjectList &list, const TString &property, Variant value) { - ProjectSettings::instance()->setProperty(property.data(), value); + Editor::project()->setProperty(property.data(), value); } void ProjectSettingsBrowser::changeEvent(QEvent *event) { diff --git a/worldeditor/src/screens/propertyedit/custom/filepath/pathedit.cpp b/worldeditor/src/screens/propertyedit/custom/filepath/pathedit.cpp index a57726141..13ea907ad 100644 --- a/worldeditor/src/screens/propertyedit/custom/filepath/pathedit.cpp +++ b/worldeditor/src/screens/propertyedit/custom/filepath/pathedit.cpp @@ -32,7 +32,7 @@ void PathEdit::onFileDialog() { Url url(m_path); FileDialog dialog; - dialog.setDirectory(url.dir().isEmpty() ? ProjectSettings::instance()->contentPath() : url.absoluteDir()); + dialog.setDirectory(url.dir().isEmpty() ? Editor::project()->contentPath() : url.absoluteDir()); if(!m_file) { dialog.setWindowTitle("Open Directory"); diff --git a/worldeditor/src/screens/propertyedit/custom/objectselect/assetlist.cpp b/worldeditor/src/screens/propertyedit/custom/objectselect/assetlist.cpp index 3e37924bf..0f2d81508 100644 --- a/worldeditor/src/screens/propertyedit/custom/objectselect/assetlist.cpp +++ b/worldeditor/src/screens/propertyedit/custom/objectselect/assetlist.cpp @@ -20,8 +20,8 @@ AssetList::AssetList() : BaseObjectModel(nullptr), m_cellSzie(64, 64) { - connect(AssetManager::instance(), &AssetManager::importFinished, this, &AssetList::update); - connect(AssetManager::instance(), &AssetManager::iconUpdated, this, &AssetList::onRendered); + connect(Editor::assets(), &AssetManager::importFinished, this, &AssetList::update); + connect(Editor::assets(), &AssetManager::iconUpdated, this, &AssetList::onRendered); update(); } @@ -73,7 +73,7 @@ Qt::ItemFlags AssetList::flags(const QModelIndex &index) const { } void AssetList::onRendered(const TString &uuid) { - AssetManager *mgr = AssetManager::instance(); + AssetManager *mgr = Editor::assets(); TString path = mgr->uuidToPath(uuid); QObject *item = m_rootItem->findChild(path.data()); if(item) { @@ -94,7 +94,7 @@ void AssetList::onRendered(const TString &uuid) { void AssetList::update() { clear(); - AssetManager *mgr = AssetManager::instance(); + AssetManager *mgr = Editor::assets(); for(auto &it : Engine::resourceSystem()->indices()) { QObject *item = new QObject(m_rootItem); diff --git a/worldeditor/src/screens/propertyedit/custom/objectselect/objectselect.cpp b/worldeditor/src/screens/propertyedit/custom/objectselect/objectselect.cpp index 2a2e5f50a..22efc2b23 100644 --- a/worldeditor/src/screens/propertyedit/custom/objectselect/objectselect.cpp +++ b/worldeditor/src/screens/propertyedit/custom/objectselect/objectselect.cpp @@ -111,9 +111,9 @@ void ObjectSelect::setTemplateData(const Variant &data) { } if(!uuid.isEmpty()) { - TString path = AssetManager::instance()->uuidToPath(uuid); + TString path = Editor::assets()->uuidToPath(uuid); name = Url(path).baseName().data(); - AssetConverterSettings *settings = AssetManager::instance()->fetchSettings(path); + AssetConverterSettings *settings = Editor::assets()->fetchSettings(path); if(settings) { m_icon->setIcon(QPixmap::fromImage(settings->icon(uuid))); } @@ -132,12 +132,12 @@ void ObjectSelect::onDialog() { sBrowser->setTypeFilter(m_type.data()); TString path; if(m_data.type() == MetaType::STRING) { - path = AssetManager::instance()->uuidToPath(m_data.toString()); + path = Editor::assets()->uuidToPath(m_data.toString()); } else { Object *object = (m_data.data() == nullptr) ? nullptr : *(reinterpret_cast(m_data.data())); path = Engine::reference(object); } - sBrowser->onAssetSelected(AssetManager::instance()->uuidToPath(path).data()); + sBrowser->onAssetSelected(Editor::assets()->uuidToPath(path).data()); } else { sBrowser->onSetRootObject(m_scene); sBrowser->setTypeFilter(m_type.data()); @@ -182,7 +182,7 @@ void ObjectSelect::onAssetSelected(QString asset) { sBrowser->hide(); disconnect(sBrowser, nullptr, this, nullptr); - TString uuid = AssetManager::instance()->pathToUuid(asset.toStdString()); + TString uuid = Editor::assets()->pathToUuid(asset.toStdString()); if(m_data.type() == MetaType::STRING) { m_data = uuid; } else { @@ -212,8 +212,8 @@ void ObjectSelect::onDragEnter(QDragEnterEvent *event) { } } } else if(event->mimeData()->hasFormat(gMimeContent) && !m_type.isEmpty()) { - TString path(ProjectSettings::instance()->contentPath() + "/" + event->mimeData()->data(gMimeContent).toStdString()); - if(AssetManager::instance()->assetTypeName(path) == m_type) { + TString path(Editor::project()->contentPath() + "/" + event->mimeData()->data(gMimeContent).toStdString()); + if(Editor::assets()->assetTypeName(path) == m_type) { event->acceptProposedAction(); return; } @@ -244,8 +244,8 @@ void ObjectSelect::onDrop(QDropEvent *event) { } } else if(event->mimeData()->hasFormat(gMimeContent)) { - TString path(ProjectSettings::instance()->contentPath() + "/" + event->mimeData()->data(gMimeContent).toStdString()); - path = AssetManager::instance()->pathToUuid(path); + TString path(Editor::project()->contentPath() + "/" + event->mimeData()->data(gMimeContent).toStdString()); + path = Editor::assets()->pathToUuid(path); if(m_data.type() == MetaType::STRING) { m_data = path; } else { diff --git a/worldeditor/src/screens/propertyedit/propertyeditor.cpp b/worldeditor/src/screens/propertyedit/propertyeditor.cpp index 606c9008e..1295f9759 100644 --- a/worldeditor/src/screens/propertyedit/propertyeditor.cpp +++ b/worldeditor/src/screens/propertyedit/propertyeditor.cpp @@ -53,9 +53,9 @@ PropertyEdit *createCustomEditor(int userType, QWidget *parent, const TString &e else if(editor == "Color") return new ColorEdit(parent); else if(editor == "Asset" || editor == "Component") return new ObjectSelect(parent); - for(auto &it : PluginManager::instance()->extensions("property")) { + for(auto &it : Editor::plugins()->extensions("property")) { if(it == editor) { - PropertyEdit *edit = reinterpret_cast(PluginManager::instance()->getPluginObject(it)); + PropertyEdit *edit = reinterpret_cast(Editor::plugins()->getPluginObject(it)); if(edit) { edit->setParent(parent); return edit; diff --git a/worldeditor/src/screens/scenecomposer/objectcontroller.cpp b/worldeditor/src/screens/scenecomposer/objectcontroller.cpp index 66a0d79a1..aba0863c6 100644 --- a/worldeditor/src/screens/scenecomposer/objectcontroller.cpp +++ b/worldeditor/src/screens/scenecomposer/objectcontroller.cpp @@ -193,11 +193,11 @@ ObjectController::ObjectController(SceneComposer *editor) : m_canceled(false), m_local(false) { - connect(AssetManager::instance(), &AssetManager::prefabCreated, this, &ObjectController::onPrefabCreated); + connect(Editor::assets(), &AssetManager::prefabCreated, this, &ObjectController::onPrefabCreated); connect(this, &ObjectController::sceneUpdated, this, &ObjectController::onUpdated); - EditorSettings::instance()->registerValue(gBackgroundColor, Vector4(0.2f, 0.2f, 0.2f, 0.0f), "editor=Color"); - EditorSettings::instance()->registerValue(gIsolationColor, Vector4(0.0f, 0.3f, 0.55f, 0.0f), "editor=Color"); + Editor::settings()->registerValue(gBackgroundColor, Vector4(0.2f, 0.2f, 0.2f, 0.0f), "editor=Color"); + Editor::settings()->registerValue(gIsolationColor, Vector4(0.0f, 0.3f, 0.55f, 0.0f), "editor=Color"); m_tools = { new SelectTool(this), @@ -219,7 +219,7 @@ void ObjectController::init(Viewport *viewport) { m_rayCast = new ViewportRaycast; m_rayCast->setController(this); - Object::connect(EditorSettings::instance(), _SIGNAL(updated()), m_rayCast, _SLOT(onApplySettings())); + Object::connect(Editor::settings(), _SIGNAL(updated()), m_rayCast, _SLOT(onApplySettings())); PipelineContext *pipeline = viewport->pipelineContext(); pipeline->insertRenderTask(m_rayCast, pipeline->renderTasks().back()); @@ -376,7 +376,7 @@ VariantList ObjectController::dumpSelected() const { void ObjectController::onApplySettings() { if(m_activeCamera) { - m_activeCamera->setColor(EditorSettings::instance()->value(m_isolatedPrefab ? gIsolationColor : gBackgroundColor).toVector4()); + m_activeCamera->setColor(Editor::settings()->value(m_isolatedPrefab ? gIsolationColor : gBackgroundColor).toVector4()); } } @@ -565,7 +565,7 @@ void ObjectController::onUpdateSelected() { void ObjectController::onDrop(QDropEvent *event) { StringList list = TString(event->mimeData()->data(gMimeContent)).split(";"); - AssetManager *mgr = AssetManager::instance(); + AssetManager *mgr = Editor::assets(); for(TString &str : list) { if(!str.isEmpty()) { if(mgr->assetTypeName(str) == Map::metaClass()->name()) { @@ -605,7 +605,7 @@ void ObjectController::onDragEnter(QDragEnterEvent *event) { event->acceptProposedAction(); StringList list = TString(event->mimeData()->data(gMimeContent)).split(";"); - AssetManager *mgr = AssetManager::instance(); + AssetManager *mgr = Editor::assets(); for(TString &str : list) { if(!str.isEmpty()) { TString type = mgr->assetTypeName(str); diff --git a/worldeditor/src/screens/scenecomposer/scenecomposer.cpp b/worldeditor/src/screens/scenecomposer/scenecomposer.cpp index c3dd670d4..c5ab26657 100644 --- a/worldeditor/src/screens/scenecomposer/scenecomposer.cpp +++ b/worldeditor/src/screens/scenecomposer/scenecomposer.cpp @@ -42,8 +42,6 @@ #include "screens/componentbrowser/componentbrowser.h" -#include "main/documentmodel.h" - Q_DECLARE_METATYPE(Object *) Q_DECLARE_METATYPE(Scene *) Q_DECLARE_METATYPE(Actor *) @@ -205,8 +203,8 @@ SceneComposer::SceneComposer(QWidget *parent) : connect(ui->camera2DButton, &QPushButton::toggled, this, &SceneComposer::onCamera2D); connect(ui->localButton, &QPushButton::toggled, this, &SceneComposer::onLocal); - connect(PluginManager::instance(), &PluginManager::pluginReloaded, m_controller, &ObjectController::onUpdateSelected); - connect(AssetManager::instance(), &AssetManager::buildSuccessful, this, &SceneComposer::onRepickSelected); + connect(Editor::plugins(), &PluginManager::pluginReloaded, m_controller, &ObjectController::onUpdateSelected); + connect(Editor::assets(), &AssetManager::buildSuccessful, this, &SceneComposer::onRepickSelected); ui->camera2DButton->setProperty("checkgreen", true); @@ -404,7 +402,7 @@ void SceneComposer::onRepickSelected() { emit selectionChanged(); } -void SceneComposer::backupScenes() { +void SceneComposer::backup() { m_backupScenes.clear(); World *world = Engine::world(); @@ -421,7 +419,7 @@ void SceneComposer::backupScenes() { } } -void SceneComposer::restoreBackupScenes() { +void SceneComposer::restore() { if(!m_backupScenes.empty()) { emit objectsHierarchyChanged(nullptr); emit selectionChanged(); @@ -510,7 +508,7 @@ void SceneComposer::changeParent(const Object::ObjectList &objects, Object *pare void SceneComposer::onScreenshot(QImage image) { if(!image.isNull()) { QRect rect((image.width() - image.height()) / 2, 0, image.height(), image.height()); - image.copy(rect).scaled(128, 128).save((ProjectSettings::instance()->iconPath() + "/auto.png").data()); + image.copy(rect).scaled(128, 128).save((Editor::project()->iconPath() + "/auto.png").data()); } } @@ -767,8 +765,8 @@ void SceneComposer::onPrefabIsolate() { } TString uuid = Engine::reference(actor->prefab()); - TString path = AssetManager::instance()->uuidToPath(uuid); - enterToIsolation(AssetManager::instance()->fetchSettings(path.data())); + TString path = Editor::assets()->uuidToPath(uuid); + enterToIsolation(Editor::assets()->fetchSettings(path.data())); } } @@ -830,7 +828,7 @@ bool SceneComposer::loadScene(const TString &path, bool additive) { scene->setParent(Engine::world()); scene->setName(Url(path).baseName()); - AssetConverterSettings *settings = AssetManager::instance()->fetchSettings(path); + AssetConverterSettings *settings = Editor::assets()->fetchSettings(path); if(settings && std::find(m_settings.begin(), m_settings.end(), settings) == m_settings.end()) { m_settings.push_back(settings); m_sceneSettings[scene->uuid()] = settings; @@ -867,7 +865,7 @@ void SceneComposer::saveScene(const TString &path, Scene *scene) { void SceneComposer::saveSceneAs(Scene *scene) { if(scene) { FileDialog dialog; - dialog.setDirectory(ProjectSettings::instance()->contentPath()); + dialog.setDirectory(Editor::project()->contentPath()); dialog.setWindowTitle("Save Scene"); dialog.setMode(FileDialog::SaveFile); dialog.addFilter("Map", { TString("*.map") }); @@ -881,7 +879,7 @@ void SceneComposer::saveSceneAs(Scene *scene) { Url info(path); scene->setName(info.baseName()); saveScene(path, scene); - AssetConverterSettings *settings = AssetManager::instance()->fetchSettings(path); + AssetConverterSettings *settings = Editor::assets()->fetchSettings(path); m_sceneSettings[scene->uuid()] = settings; } } @@ -940,7 +938,7 @@ void SceneComposer::saveIsolated(Prefab *prefab) { actor->setParent(prefab); TString data = Json::save(Engine::toVariant(prefab), 0); if(!data.isEmpty()) { - File file(AssetManager::instance()->uuidToPath(Engine::reference(prefab))); + File file(Editor::assets()->uuidToPath(Engine::reference(prefab))); if(file.open(File::Write)) { file.write(data); file.close(); diff --git a/worldeditor/src/screens/scenecomposer/scenecomposer.h b/worldeditor/src/screens/scenecomposer/scenecomposer.h index 5ce0c29a5..320dfb80d 100644 --- a/worldeditor/src/screens/scenecomposer/scenecomposer.h +++ b/worldeditor/src/screens/scenecomposer/scenecomposer.h @@ -27,8 +27,8 @@ class SceneComposer : public AssetEditor { VariantMap saveState() override; void restoreState(const VariantMap &data) override; - void backupScenes(); - void restoreBackupScenes(); + void backup() override; + void restore() override; void takeScreenshot();