Remove story in library + save/load variables
Some checks are pending
Build-StoryEditor / build_linux (push) Waiting to run
Build-StoryEditor / build_win32 (push) Waiting to run
Deploy-Documentation / deploy (push) Waiting to run

This commit is contained in:
anthony@rabine.fr 2025-04-25 23:40:21 +02:00
parent 47552d4719
commit 6ec1f39db7
7 changed files with 116 additions and 8 deletions

View file

@ -208,6 +208,24 @@ public:
return result; return result;
} }
static std::string ValueTypeToString(ValueType type) {
switch (type) {
case ValueType::INTEGER: return "Integer";
case ValueType::FLOAT: return "Float";
case ValueType::BOOL: return "Bool";
case ValueType::STRING: return "String";
default: return "Unknown";
}
}
static ValueType StringToValueType(const std::string& type) {
if (type == "Integer") return ValueType::INTEGER;
if (type == "Float") return ValueType::FLOAT;
if (type == "Bool") return ValueType::BOOL;
if (type == "String") return ValueType::STRING;
throw std::runtime_error("[variable.h] StringToValueType(): Invalid value type string");
}
private: private:
std::string m_variableName; // nom humain std::string m_variableName; // nom humain
ValueType m_valueType; ValueType m_valueType;

View file

@ -501,6 +501,40 @@ bool StoryProject::Load(ResourceManager &manager)
ModelFromJson(j); ModelFromJson(j);
m_initialized = true; m_initialized = true;
} }
if (j.contains("variables"))
{
nlohmann::json variablesData = j["variables"];
for (const auto &obj : variablesData)
{
auto v = std::make_shared<Variable>(obj["label"].get<std::string>());
v->SetUuid(obj["uuid"].get<std::string>());
v->SetValueType(Variable::StringToValueType(obj["type"].get<std::string>()));
v->SetScalePower(obj["scale"].get<int>());
v->SetConstant(obj["constant"].get<bool>());
v->SetVariableName(obj["name"].get<std::string>());
if (v->IsFloat())
{
v->SetFloatValue(std::stof(obj["value"].get<std::string>()));
}
else if (v->IsInteger())
{
v->SetIntegerValue(std::stoi(obj["value"].get<std::string>()));
}
else if (v->IsString())
{
v->SetTextValue(obj["value"].get<std::string>());
}
else if (v->IsBool())
{
v->SetBoolValue(obj["value"].get<std::string>() == "true");
}
m_variables.push_back(v);
}
}
} }
} }
} }
@ -542,6 +576,40 @@ void StoryProject::Save(ResourceManager &manager)
ModelToJson(model); ModelToJson(model);
j["pages"] = model; j["pages"] = model;
nlohmann::json variablesData;
for (const auto &v : m_variables)
{
std::string value;
if (v->IsFloat())
{
value = std::to_string(v->GetFloatValue());
}
else if (v->IsInteger())
{
value = std::to_string(v->GetIntegerValue());
}
else if (v->IsString())
{
value = v->GetStringValue();
}
else if (v->IsBool())
{
value = v->GetBoolValue() ? "true" : "false";
}
nlohmann::json obj = {{"name", v->GetVariableName()},
{"label", v->GetLabel()},
{"uuid", v->GetUuid()},
{"value", value},
{"scale", v->GetScalePower()},
{"constant", v->IsConstant()},
{"type", Variable::ValueTypeToString(v->GetValueType())}};
variablesData.push_back(obj);
}
j["variables"] = variablesData;
std::ofstream o(m_project_file_path); std::ofstream o(m_project_file_path);
o << std::setw(4) << j << std::endl; o << std::setw(4) << j << std::endl;
} }
@ -553,6 +621,7 @@ void StoryProject::Clear()
m_working_dir = ""; m_working_dir = "";
m_project_file_path = ""; m_project_file_path = "";
m_initialized = false; m_initialized = false;
m_variables.clear();
} }

View file

@ -104,6 +104,21 @@ std::shared_ptr<StoryProject> LibraryManager::GetStory(const std::string &uuid)
return current; return current;
} }
void LibraryManager::RemoveStory(const std::string &uuid)
{
for (const auto &s : m_projectsList)
{
if (s->GetUuid() == uuid)
{
// Just rename the project file, keep the whole directory
auto oldname = s->GetProjectFilePath();
std::filesystem::rename(oldname, oldname + "__removed");
break;
}
}
Scan();
}
std::string LibraryManager::IndexFileName() const std::string LibraryManager::IndexFileName() const
{ {
auto p = std::filesystem::path(m_library_path) / "index.ost"; auto p = std::filesystem::path(m_library_path) / "index.ost";

View file

@ -45,6 +45,7 @@ public:
std::string GetStoreUrl() const { return m_storeUrl; } std::string GetStoreUrl() const { return m_storeUrl; }
void AddStory(IStoryDb::Info &info, int origin); void AddStory(IStoryDb::Info &info, int origin);
void RemoveStory(const std::string &uuid);
void ParseCommunityStore(const std::string &jsonFileName); void ParseCommunityStore(const std::string &jsonFileName);
void ParseCommercialStore(const std::string &jsonFileName); void ParseCommercialStore(const std::string &jsonFileName);

View file

@ -481,6 +481,8 @@ void LibraryWindow::Draw()
); );
} }
std::string rmUuid;
if (ImGui::BeginTable("library_table", 3, tableFlags)) if (ImGui::BeginTable("library_table", 3, tableFlags))
{ {
ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed); ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed);
@ -539,11 +541,16 @@ void LibraryWindow::Draw()
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::SmallButton("Remove")) if (ImGui::SmallButton("Remove"))
{ {
rmUuid = p->GetUuid();
} }
ImGui::PopID(); ImGui::PopID();
} }
ImGui::EndTable(); ImGui::EndTable();
if (!rmUuid.empty())
{
m_libraryManager.RemoveStory(rmUuid);
}
} }
ImGui::EndTabItem(); ImGui::EndTabItem();
} }

View file

@ -924,11 +924,11 @@ void MainWindow::RefreshProjectInformation()
void MainWindow::CloseProject() void MainWindow::CloseProject()
{ {
// if (m_story) if (m_story)
// { {
// m_story->Clear(); m_story->Clear();
// m_story.reset(); m_story.reset();
// } }
m_resources.Clear(); m_resources.Clear();

View file

@ -15,8 +15,6 @@ VariablesWindow::VariablesWindow(IStoryManager &proj)
void VariablesWindow::Initialize() void VariablesWindow::Initialize()
{ {
} }