From c90f78df080a9891930ee346b0ad87498ba5b697 Mon Sep 17 00:00:00 2001 From: rtk0c Date: Sun, 30 May 2021 23:00:41 -0700 Subject: Initial work on templates UI --- core/CMakeLists.txt | 5 +- core/locale/zh_CN.json | 8 +- core/src/Entrypoint/main.cpp | 6 +- core/src/Model/Project.cpp | 134 ++++++++++---- core/src/Model/Project.hpp | 22 ++- core/src/Model/Template/TableTemplate.cpp | 63 +++++-- core/src/Model/Template/TableTemplate.hpp | 12 +- core/src/Model/Template/Template.hpp | 45 +++++ core/src/Model/Template/Template_Main.cpp | 5 + core/src/Model/Template/Template_RTTI.cpp | 21 +++ core/src/Model/Template/fwd.hpp | 4 + core/src/Model/Workflow/Workflow.hpp | 2 +- core/src/Model/fwd.hpp | 2 + core/src/UI/Localization.hpp | 2 +- core/src/UI/UI.hpp | 1 + core/src/UI/UI_MainWindow.cpp | 13 +- core/src/UI/UI_Templates.cpp | 289 ++++++++++++++++++++++++++++++ core/src/UI/UI_Workflows.cpp | 12 +- 18 files changed, 568 insertions(+), 78 deletions(-) create mode 100644 core/src/Model/Template/Template.hpp create mode 100644 core/src/Model/Template/Template_Main.cpp create mode 100644 core/src/Model/Template/Template_RTTI.cpp create mode 100644 core/src/UI/UI_Templates.cpp (limited to 'core') diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 84f331e..a8fa7af 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -41,6 +41,8 @@ add_source_group(MODEL_MODULE_SOURCES ) add_source_group(MODEL_TEMPLATE_SOURCES + src/Model/Template/Template_Main.cpp + src/Model/Template/Template_RTTI.cpp src/Model/Template/TableTemplate.cpp ) @@ -67,11 +69,12 @@ set(UI_MODULE_SOURCES src/UI/Localization.cpp src/UI/States.cpp src/UI/UI_DatabaseView.cpp - src/UI/UI_Workflows.cpp src/UI/UI_Items.cpp src/UI/UI_MainWindow.cpp src/UI/UI_Settings.cpp + src/UI/UI_Templates.cpp src/UI/UI_Utils.cpp + src/UI/UI_Workflows.cpp ) add_source_group(UTILS_MODULE_SOURCES diff --git a/core/locale/zh_CN.json b/core/locale/zh_CN.json index e5df7ee..8e495d7 100644 --- a/core/locale/zh_CN.json +++ b/core/locale/zh_CN.json @@ -13,7 +13,8 @@ "MainWindow.Tab.Project": "\uf15b 项目", "MainWindow.Tab.DatabaseView": "\uf1c0 数据", "MainWindow.Tab.Items": "\uf466 物品", - "MainWindow.Tab.Workflows": "\uf5cb 工作流", + "MainWindow.Tab.Workflows": "\uf70e 工作流", + "MainWindow.Tab.Templates": "\uf0ce 模板", "Project.New": "新建项目...", "Project.New.DialogTitle": "新建项目向导", "Project.New.Name": "项目名称", @@ -28,8 +29,7 @@ "Project.Recents.NonePresent": "(暂无最近使用的项目)", "Project.Recents.Open.Tooltip": "打开该项目", "Project.Recents.Delete.Tooltip": "将该项目从最近使用列表中删除,项目本身将不受影响。", - "Project.InvalidProjectFormat": "无效的项目文件", - "ActiveProject.Close": "\uf00d 关闭项目", + "Project.InvalidProjectFormat": "无效的项目文件", "ActiveProject.OpenInFilesystem": "\uf07b 在文件系统中打开", "ActiveProject.Info.Name": "项目名称:", "ActiveProject.Info.Path": "项目路径:", @@ -65,4 +65,4 @@ "Workflow.Open.DialogTitle": "打开工作流", "Workflow.Manage": "管理工作流...", "Workflow.Manage.DialogTitle": "管理工作流", -} \ No newline at end of file +} diff --git a/core/src/Entrypoint/main.cpp b/core/src/Entrypoint/main.cpp index 2d0238e..152a1c8 100644 --- a/core/src/Entrypoint/main.cpp +++ b/core/src/Entrypoint/main.cpp @@ -156,11 +156,7 @@ int main(int argc, char* argv[]) GlobalStates::Init(); } else { fs::path path(dataDirOption); - if (fs::exists(path)) { - GlobalStates::Init(std::move(path)); - } else { - GlobalStates::Init(); - } + GlobalStates::Init(std::move(path)); } DEFER { diff --git a/core/src/Model/Project.cpp b/core/src/Model/Project.cpp index 2d7c82a..3cb3cb4 100644 --- a/core/src/Model/Project.cpp +++ b/core/src/Model/Project.cpp @@ -25,19 +25,19 @@ void ReadItemList(ItemList& list, const fs::path& filePath) } } -Project::Project(const fs::path& rootPath) - : mRootPath{ rootPath } +Project::Project(fs::path rootPath) + : mRootPath{ std::move(rootPath) } , mRootPathString{ mRootPath.string() } , Database(*this) { // TODO better diagnostic const char* kInvalidFormatErr = "Failed to load project: invalid format."; - std::ifstream ifs(rootPath / "cplt_project.json"); + std::ifstream ifs(mRootPath / "cplt_project.json"); if (!ifs) { std::string message; message += "Failed to load project file at '"; - message += rootPath.string(); + message += mRootPath.string(); message += "'."; throw std::runtime_error(message); } @@ -81,7 +81,7 @@ Project::Project(const fs::path& rootPath) } } -Project::Project(std::filesystem::path rootPath, std::string name) +Project::Project(fs::path rootPath, std::string name) : mRootPath{ std::move(rootPath) } , mRootPathString{ mRootPath.string() } , mName{ std::move(name) } @@ -99,6 +99,36 @@ const std::string& Project::GetPathString() const return mRootPathString; } +fs::path Project::GetDatabasesDirectory() const +{ + return mRootPath / "databases"; +} + +fs::path Project::GetItemsDirectory() const +{ + return mRootPath / "items"; +} + +fs::path Project::GetWorkflowsDirectory() const +{ + return mRootPath / "workflows"; +} + +fs::path Project::GetWorkflowPath(std::string_view name) const +{ + return (mRootPath / "workflows" / name).concat(".cplt-workflow"); +} + +fs::path Project::GetTemplatesDirectory() const +{ + return mRootPath / "templates"; +} + +fs::path Project::GetTemplatePath(std::string_view name) const +{ + return (mRootPath / "templates" / name).concat(".cplt-template"); +} + const std::string& Project::GetName() const { return mName; @@ -109,7 +139,7 @@ void Project::SetName(std::string name) mName = std::move(name); } -const decltype(Project::mWorkflows)& Project::GetWorkflows() const +const tsl::array_map& Project::GetWorkflows() const { return mWorkflows; } @@ -132,11 +162,12 @@ std::unique_ptr Project::CreateWorkflow(std::string_view name) } auto workflow = std::make_unique(); - auto [it, DISCARD] = mWorkflows.insert(name, WorkflowInfo{}); - auto& info = it.value(); - - info.Name = name; - info.Path = GetWorkflowPath(name); + auto [it, DISCARD] = mWorkflows.insert( + name, + WorkflowInfo{ + .Path = GetWorkflowPath(name), + .Name = std::string(name), + }); return workflow; } @@ -155,9 +186,9 @@ bool Project::RemoveWorkflow(std::string_view name) return true; } -bool Project::RenameWorkflow(std::string_view name, std::string_view newName) +bool Project::RenameWorkflow(std::string_view oldName, std::string_view newName) { - auto iter = mWorkflows.find(name); + auto iter = mWorkflows.find(oldName); if (iter == mWorkflows.end()) return false; auto info = std::move(iter.value()); @@ -173,6 +204,63 @@ bool Project::RenameWorkflow(std::string_view name, std::string_view newName) return true; } +const tsl::array_map& Project::GetTemplates() const +{ + return mTemplates; +} + +std::unique_ptr