Refactor project structure: remove labeling.h and update references to use project.h, enhancing code clarity and maintainability
This commit is contained in:
@@ -4,13 +4,20 @@
|
||||
|
||||
#include <cstdint>
|
||||
#include <cstring>
|
||||
#include <fstream>
|
||||
#include <memory>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
|
||||
#include "absl/status/statusor.h"
|
||||
#include "absl/strings/str_format.h"
|
||||
#include "absl/strings/string_view.h"
|
||||
#include "app/core/constants.h"
|
||||
#include "app/gui/icons.h"
|
||||
#include "imgui/imgui.h"
|
||||
#include "imgui/misc/cpp/imgui_stdlib.h"
|
||||
|
||||
namespace yaze {
|
||||
namespace app {
|
||||
@@ -93,6 +100,40 @@ uint32_t ldle3(uint8_t const *const p_arr) { return ldle(p_arr, 3); }
|
||||
|
||||
} // namespace
|
||||
|
||||
std::string UppercaseHexByte(uint8_t byte, bool leading) {
|
||||
if (leading) {
|
||||
std::string result = absl::StrFormat("0x%02X", byte);
|
||||
return result;
|
||||
}
|
||||
std::string result = absl::StrFormat("%02X", byte);
|
||||
return result;
|
||||
}
|
||||
std::string UppercaseHexWord(uint16_t word, bool leading) {
|
||||
if (leading) {
|
||||
std::string result = absl::StrFormat("0x%04X", word);
|
||||
return result;
|
||||
}
|
||||
std::string result = absl::StrFormat("%04X", word);
|
||||
return result;
|
||||
}
|
||||
std::string UppercaseHexLong(uint32_t dword) {
|
||||
std::string result = absl::StrFormat("0x%06X", dword);
|
||||
return result;
|
||||
}
|
||||
std::string UppercaseHexLongLong(uint64_t qword) {
|
||||
std::string result = absl::StrFormat("0x%08X", qword);
|
||||
return result;
|
||||
}
|
||||
|
||||
bool StringReplace(std::string &str, const std::string &from,
|
||||
const std::string &to) {
|
||||
size_t start = str.find(from);
|
||||
if (start == std::string::npos) return false;
|
||||
|
||||
str.replace(start, from.length(), to);
|
||||
return true;
|
||||
}
|
||||
|
||||
std::shared_ptr<ExperimentFlags::Flags> ExperimentFlags::flags_;
|
||||
|
||||
uint32_t Get24LocalFromPC(uint8_t *data, int addr, bool pc) {
|
||||
|
||||
@@ -19,6 +19,14 @@ namespace app {
|
||||
*/
|
||||
namespace core {
|
||||
|
||||
std::string UppercaseHexByte(uint8_t byte, bool leading = false);
|
||||
std::string UppercaseHexWord(uint16_t word, bool leading = false);
|
||||
std::string UppercaseHexLong(uint32_t dword);
|
||||
std::string UppercaseHexLongLong(uint64_t qword);
|
||||
|
||||
bool StringReplace(std::string &str, const std::string &from,
|
||||
const std::string &to);
|
||||
|
||||
/**
|
||||
* @class ExperimentFlags
|
||||
* @brief A class to manage experimental feature flags.
|
||||
|
||||
@@ -2,7 +2,6 @@ set(
|
||||
YAZE_APP_CORE_SRC
|
||||
app/core/common.cc
|
||||
app/core/controller.cc
|
||||
app/core/labeling.cc
|
||||
app/emu/emulator.cc
|
||||
app/core/project.cc
|
||||
app/core/utils/file_util.cc
|
||||
|
||||
@@ -1,178 +0,0 @@
|
||||
#include "app/core/labeling.h"
|
||||
|
||||
#include <cstdint>
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
|
||||
#include "absl/strings/str_format.h"
|
||||
|
||||
#include "app/gui/icons.h"
|
||||
#include "imgui/imgui.h"
|
||||
#include "imgui/misc/cpp/imgui_stdlib.h"
|
||||
|
||||
namespace yaze {
|
||||
namespace app {
|
||||
namespace core {
|
||||
|
||||
std::string UppercaseHexByte(uint8_t byte, bool leading) {
|
||||
if (leading) {
|
||||
std::string result = absl::StrFormat("0x%02X", byte);
|
||||
return result;
|
||||
}
|
||||
std::string result = absl::StrFormat("%02X", byte);
|
||||
return result;
|
||||
}
|
||||
std::string UppercaseHexWord(uint16_t word, bool leading) {
|
||||
if (leading) {
|
||||
std::string result = absl::StrFormat("0x%04X", word);
|
||||
return result;
|
||||
}
|
||||
std::string result = absl::StrFormat("%04X", word);
|
||||
return result;
|
||||
}
|
||||
std::string UppercaseHexLong(uint32_t dword) {
|
||||
std::string result = absl::StrFormat("0x%06X", dword);
|
||||
return result;
|
||||
}
|
||||
std::string UppercaseHexLongLong(uint64_t qword) {
|
||||
std::string result = absl::StrFormat("0x%08X", qword);
|
||||
return result;
|
||||
}
|
||||
|
||||
bool StringReplace(std::string& str, const std::string& from,
|
||||
const std::string& to) {
|
||||
size_t start = str.find(from);
|
||||
if (start == std::string::npos) return false;
|
||||
|
||||
str.replace(start, from.length(), to);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ResourceLabelManager::LoadLabels(const std::string& filename) {
|
||||
std::ifstream file(filename);
|
||||
if (!file.is_open()) {
|
||||
// Create the file if it does not exist
|
||||
std::ofstream create_file(filename);
|
||||
if (!create_file.is_open()) {
|
||||
return false;
|
||||
}
|
||||
create_file.close();
|
||||
file.open(filename);
|
||||
if (!file.is_open()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
filename_ = filename;
|
||||
|
||||
std::string line;
|
||||
while (std::getline(file, line)) {
|
||||
std::istringstream iss(line);
|
||||
std::string type, key, value;
|
||||
if (std::getline(iss, type, ',') && std::getline(iss, key, ',') &&
|
||||
std::getline(iss, value)) {
|
||||
labels_[type][key] = value;
|
||||
}
|
||||
}
|
||||
labels_loaded_ = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ResourceLabelManager::SaveLabels() {
|
||||
if (!labels_loaded_) {
|
||||
return false;
|
||||
}
|
||||
std::ofstream file(filename_);
|
||||
if (!file.is_open()) {
|
||||
return false;
|
||||
}
|
||||
for (const auto& type_pair : labels_) {
|
||||
for (const auto& label_pair : type_pair.second) {
|
||||
file << type_pair.first << "," << label_pair.first << ","
|
||||
<< label_pair.second << std::endl;
|
||||
}
|
||||
}
|
||||
file.close();
|
||||
return true;
|
||||
}
|
||||
|
||||
void ResourceLabelManager::DisplayLabels(bool* p_open) {
|
||||
if (!labels_loaded_) {
|
||||
ImGui::Text("No labels loaded.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (ImGui::Begin("Resource Labels", p_open)) {
|
||||
for (const auto& type_pair : labels_) {
|
||||
if (ImGui::TreeNode(type_pair.first.c_str())) {
|
||||
for (const auto& label_pair : type_pair.second) {
|
||||
std::string label_id = type_pair.first + "_" + label_pair.first;
|
||||
ImGui::Text("%s: %s", label_pair.first.c_str(),
|
||||
label_pair.second.c_str());
|
||||
}
|
||||
ImGui::TreePop();
|
||||
}
|
||||
}
|
||||
|
||||
if (ImGui::Button("Update Labels")) {
|
||||
if (SaveLabels()) {
|
||||
ImGui::Text("Labels updated successfully!");
|
||||
} else {
|
||||
ImGui::Text("Failed to update labels.");
|
||||
}
|
||||
}
|
||||
}
|
||||
ImGui::End();
|
||||
}
|
||||
|
||||
void ResourceLabelManager::EditLabel(const std::string& type,
|
||||
const std::string& key,
|
||||
const std::string& newValue) {
|
||||
labels_[type][key] = newValue;
|
||||
}
|
||||
|
||||
void ResourceLabelManager::SelectableLabelWithNameEdit(
|
||||
bool selected, const std::string& type, const std::string& key,
|
||||
const std::string& defaultValue) {
|
||||
std::string label = CreateOrGetLabel(type, key, defaultValue);
|
||||
ImGui::Selectable(label.c_str(), selected,
|
||||
ImGuiSelectableFlags_AllowDoubleClick);
|
||||
std::string label_id = type + "_" + key;
|
||||
if (ImGui::IsItemHovered() && ImGui::IsMouseClicked(ImGuiMouseButton_Right)) {
|
||||
ImGui::OpenPopup(label_id.c_str());
|
||||
}
|
||||
|
||||
if (ImGui::BeginPopupContextItem(label_id.c_str())) {
|
||||
std::string* new_label = &labels_[type][key];
|
||||
if (ImGui::InputText("##Label", new_label,
|
||||
ImGuiInputTextFlags_EnterReturnsTrue)) {
|
||||
labels_[type][key] = *new_label;
|
||||
}
|
||||
if (ImGui::Button(ICON_MD_CLOSE)) {
|
||||
ImGui::CloseCurrentPopup();
|
||||
}
|
||||
ImGui::EndPopup();
|
||||
}
|
||||
}
|
||||
|
||||
std::string ResourceLabelManager::GetLabel(const std::string& type,
|
||||
const std::string& key) {
|
||||
return labels_[type][key];
|
||||
}
|
||||
|
||||
std::string ResourceLabelManager::CreateOrGetLabel(
|
||||
const std::string& type, const std::string& key,
|
||||
const std::string& defaultValue) {
|
||||
if (labels_.find(type) == labels_.end()) {
|
||||
labels_[type] = std::unordered_map<std::string, std::string>();
|
||||
}
|
||||
if (labels_[type].find(key) == labels_[type].end()) {
|
||||
labels_[type][key] = defaultValue;
|
||||
}
|
||||
return labels_[type][key];
|
||||
}
|
||||
|
||||
} // namespace core
|
||||
} // namespace app
|
||||
} // namespace yaze
|
||||
@@ -1,54 +0,0 @@
|
||||
#ifndef YAZE_APP_CORE_LABELING_H_
|
||||
#define YAZE_APP_CORE_LABELING_H_
|
||||
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
|
||||
#include "absl/strings/string_view.h"
|
||||
|
||||
namespace yaze {
|
||||
namespace app {
|
||||
namespace core {
|
||||
|
||||
std::string UppercaseHexByte(uint8_t byte, bool leading = false);
|
||||
std::string UppercaseHexWord(uint16_t word, bool leading = false);
|
||||
std::string UppercaseHexLong(uint32_t dword);
|
||||
std::string UppercaseHexLongLong(uint64_t qword);
|
||||
|
||||
bool StringReplace(std::string& str, const std::string& from,
|
||||
const std::string& to);
|
||||
|
||||
// Default types
|
||||
static constexpr absl::string_view kDefaultTypes[] = {
|
||||
"Dungeon Names", "Dungeon Room Names", "Overworld Map Names"};
|
||||
|
||||
struct ResourceLabelManager {
|
||||
bool LoadLabels(const std::string& filename);
|
||||
bool SaveLabels();
|
||||
void DisplayLabels(bool* p_open);
|
||||
void EditLabel(const std::string& type, const std::string& key,
|
||||
const std::string& newValue);
|
||||
void SelectableLabelWithNameEdit(bool selected, const std::string& type,
|
||||
const std::string& key,
|
||||
const std::string& defaultValue);
|
||||
std::string GetLabel(const std::string& type, const std::string& key);
|
||||
std::string CreateOrGetLabel(const std::string& type, const std::string& key,
|
||||
const std::string& defaultValue);
|
||||
|
||||
bool labels_loaded_ = false;
|
||||
std::string filename_;
|
||||
struct ResourceType {
|
||||
std::string key_name;
|
||||
std::string display_description;
|
||||
};
|
||||
|
||||
std::unordered_map<std::string, std::unordered_map<std::string, std::string>>
|
||||
labels_;
|
||||
};
|
||||
|
||||
} // namespace core
|
||||
} // namespace app
|
||||
} // namespace yaze
|
||||
|
||||
#endif // YAZE_APP_CORE_LABELING_H_
|
||||
@@ -1,9 +1,16 @@
|
||||
#include "project.h"
|
||||
|
||||
#include <fstream>
|
||||
#include <string>
|
||||
|
||||
#include "app/gui/icons.h"
|
||||
#include "imgui/imgui.h"
|
||||
#include "imgui/misc/cpp/imgui_stdlib.h"
|
||||
|
||||
namespace yaze {
|
||||
namespace app {
|
||||
|
||||
absl::Status Project::Open(const std::string &project_path) {
|
||||
absl::Status Project::Open(const std::string& project_path) {
|
||||
filepath = project_path;
|
||||
name = project_path.substr(project_path.find_last_of("/") + 1);
|
||||
|
||||
@@ -54,5 +61,128 @@ absl::Status Project::Save() {
|
||||
return absl::OkStatus();
|
||||
}
|
||||
|
||||
bool ResourceLabelManager::LoadLabels(const std::string& filename) {
|
||||
std::ifstream file(filename);
|
||||
if (!file.is_open()) {
|
||||
// Create the file if it does not exist
|
||||
std::ofstream create_file(filename);
|
||||
if (!create_file.is_open()) {
|
||||
return false;
|
||||
}
|
||||
create_file.close();
|
||||
file.open(filename);
|
||||
if (!file.is_open()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
filename_ = filename;
|
||||
|
||||
std::string line;
|
||||
while (std::getline(file, line)) {
|
||||
std::istringstream iss(line);
|
||||
std::string type, key, value;
|
||||
if (std::getline(iss, type, ',') && std::getline(iss, key, ',') &&
|
||||
std::getline(iss, value)) {
|
||||
labels_[type][key] = value;
|
||||
}
|
||||
}
|
||||
labels_loaded_ = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ResourceLabelManager::SaveLabels() {
|
||||
if (!labels_loaded_) {
|
||||
return false;
|
||||
}
|
||||
std::ofstream file(filename_);
|
||||
if (!file.is_open()) {
|
||||
return false;
|
||||
}
|
||||
for (const auto& type_pair : labels_) {
|
||||
for (const auto& label_pair : type_pair.second) {
|
||||
file << type_pair.first << "," << label_pair.first << ","
|
||||
<< label_pair.second << std::endl;
|
||||
}
|
||||
}
|
||||
file.close();
|
||||
return true;
|
||||
}
|
||||
|
||||
void ResourceLabelManager::DisplayLabels(bool* p_open) {
|
||||
if (!labels_loaded_) {
|
||||
ImGui::Text("No labels loaded.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (ImGui::Begin("Resource Labels", p_open)) {
|
||||
for (const auto& type_pair : labels_) {
|
||||
if (ImGui::TreeNode(type_pair.first.c_str())) {
|
||||
for (const auto& label_pair : type_pair.second) {
|
||||
std::string label_id = type_pair.first + "_" + label_pair.first;
|
||||
ImGui::Text("%s: %s", label_pair.first.c_str(),
|
||||
label_pair.second.c_str());
|
||||
}
|
||||
ImGui::TreePop();
|
||||
}
|
||||
}
|
||||
|
||||
if (ImGui::Button("Update Labels")) {
|
||||
if (SaveLabels()) {
|
||||
ImGui::Text("Labels updated successfully!");
|
||||
} else {
|
||||
ImGui::Text("Failed to update labels.");
|
||||
}
|
||||
}
|
||||
}
|
||||
ImGui::End();
|
||||
}
|
||||
|
||||
void ResourceLabelManager::EditLabel(const std::string& type,
|
||||
const std::string& key,
|
||||
const std::string& newValue) {
|
||||
labels_[type][key] = newValue;
|
||||
}
|
||||
|
||||
void ResourceLabelManager::SelectableLabelWithNameEdit(
|
||||
bool selected, const std::string& type, const std::string& key,
|
||||
const std::string& defaultValue) {
|
||||
std::string label = CreateOrGetLabel(type, key, defaultValue);
|
||||
ImGui::Selectable(label.c_str(), selected,
|
||||
ImGuiSelectableFlags_AllowDoubleClick);
|
||||
std::string label_id = type + "_" + key;
|
||||
if (ImGui::IsItemHovered() && ImGui::IsMouseClicked(ImGuiMouseButton_Right)) {
|
||||
ImGui::OpenPopup(label_id.c_str());
|
||||
}
|
||||
|
||||
if (ImGui::BeginPopupContextItem(label_id.c_str())) {
|
||||
std::string* new_label = &labels_[type][key];
|
||||
if (ImGui::InputText("##Label", new_label,
|
||||
ImGuiInputTextFlags_EnterReturnsTrue)) {
|
||||
labels_[type][key] = *new_label;
|
||||
}
|
||||
if (ImGui::Button(ICON_MD_CLOSE)) {
|
||||
ImGui::CloseCurrentPopup();
|
||||
}
|
||||
ImGui::EndPopup();
|
||||
}
|
||||
}
|
||||
|
||||
std::string ResourceLabelManager::GetLabel(const std::string& type,
|
||||
const std::string& key) {
|
||||
return labels_[type][key];
|
||||
}
|
||||
|
||||
std::string ResourceLabelManager::CreateOrGetLabel(
|
||||
const std::string& type, const std::string& key,
|
||||
const std::string& defaultValue) {
|
||||
if (labels_.find(type) == labels_.end()) {
|
||||
labels_[type] = std::unordered_map<std::string, std::string>();
|
||||
}
|
||||
if (labels_[type].find(key) == labels_[type].end()) {
|
||||
labels_[type][key] = defaultValue;
|
||||
}
|
||||
return labels_[type][key];
|
||||
}
|
||||
|
||||
} // namespace app
|
||||
} // namespace yaze
|
||||
|
||||
@@ -65,6 +65,34 @@ struct Project : public core::ExperimentFlags {
|
||||
std::string keybindings_file = "";
|
||||
};
|
||||
|
||||
// Default types
|
||||
static constexpr absl::string_view kDefaultTypes[] = {
|
||||
"Dungeon Names", "Dungeon Room Names", "Overworld Map Names"};
|
||||
|
||||
struct ResourceLabelManager {
|
||||
bool LoadLabels(const std::string& filename);
|
||||
bool SaveLabels();
|
||||
void DisplayLabels(bool* p_open);
|
||||
void EditLabel(const std::string& type, const std::string& key,
|
||||
const std::string& newValue);
|
||||
void SelectableLabelWithNameEdit(bool selected, const std::string& type,
|
||||
const std::string& key,
|
||||
const std::string& defaultValue);
|
||||
std::string GetLabel(const std::string& type, const std::string& key);
|
||||
std::string CreateOrGetLabel(const std::string& type, const std::string& key,
|
||||
const std::string& defaultValue);
|
||||
|
||||
bool labels_loaded_ = false;
|
||||
std::string filename_;
|
||||
struct ResourceType {
|
||||
std::string key_name;
|
||||
std::string display_description;
|
||||
};
|
||||
|
||||
std::unordered_map<std::string, std::unordered_map<std::string, std::string>>
|
||||
labels_;
|
||||
};
|
||||
|
||||
class RecentFilesManager {
|
||||
public:
|
||||
RecentFilesManager() : RecentFilesManager(kRecentFilesFilename) {}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#include "dungeon_editor.h"
|
||||
|
||||
#include "app/core/labeling.h"
|
||||
#include "app/core/platform/renderer.h"
|
||||
#include "app/gfx/snes_palette.h"
|
||||
#include "app/gui/canvas.h"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#define YAZE_APP_EDITOR_DUNGEONEDITOR_H
|
||||
|
||||
#include "app/core/common.h"
|
||||
#include "app/core/labeling.h"
|
||||
#include "app/core/project.h"
|
||||
#include "app/editor/graphics/gfx_group_editor.h"
|
||||
#include "app/editor/graphics/palette_editor.h"
|
||||
#include "app/editor/utils/editor.h"
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
#include "absl/strings/string_view.h"
|
||||
#include "app/core/common.h"
|
||||
#include "app/core/constants.h"
|
||||
#include "app/core/labeling.h"
|
||||
#include "app/core/project.h"
|
||||
#include "app/gfx/bitmap.h"
|
||||
#include "app/gfx/snes_palette.h"
|
||||
#include "app/gfx/snes_tile.h"
|
||||
@@ -476,9 +476,7 @@ class Rom : public core::ExperimentFlags {
|
||||
return palette_groups_.dungeon_main.mutable_palette(i);
|
||||
}
|
||||
|
||||
core::ResourceLabelManager* resource_label() {
|
||||
return &resource_label_manager_;
|
||||
}
|
||||
ResourceLabelManager* resource_label() { return &resource_label_manager_; }
|
||||
VersionConstants version_constants() const {
|
||||
return kVersionConstantsMap.at(version_);
|
||||
}
|
||||
@@ -561,7 +559,7 @@ class Rom : public core::ExperimentFlags {
|
||||
std::array<gfx::Bitmap, kNumLinkSheets> link_graphics_;
|
||||
|
||||
// Label manager for unique resource names.
|
||||
core::ResourceLabelManager resource_label_manager_;
|
||||
ResourceLabelManager resource_label_manager_;
|
||||
|
||||
// All palette groups in the game
|
||||
gfx::PaletteGroupMap palette_groups_;
|
||||
|
||||
@@ -6,7 +6,6 @@ add_executable(
|
||||
cli/handlers/tile16_transfer.cc
|
||||
app/rom.cc
|
||||
app/core/common.cc
|
||||
app/core/labeling.cc
|
||||
app/editor/utils/gfx_context.cc
|
||||
${YAZE_APP_EMU_SRC}
|
||||
${YAZE_APP_GFX_SRC}
|
||||
|
||||
@@ -11,7 +11,6 @@ add_executable(
|
||||
test/zelda3/sprite_builder_test.cc
|
||||
app/rom.cc
|
||||
app/core/common.cc
|
||||
app/core/labeling.cc
|
||||
app/editor/utils/gfx_context.cc
|
||||
${ASAR_STATIC_SRC}
|
||||
${YAZE_APP_CORE_SRC}
|
||||
|
||||
Reference in New Issue
Block a user