Files
yaze/src/app/editor/system/editor_registry.cc
scawful 1ef0419de0 refactor(editor): enhance sidebar UI and card registration in SettingsEditor
- Updated the sidebar UI in EditorCardRegistry to improve visibility and theming consistency using ThemeManager.
- Refactored SettingsEditor to register multiple settings cards, enhancing modularity and organization of settings.
- Improved the layout and interaction of category tabs, ensuring a more intuitive user experience.

Benefits:
- Streamlines the settings management process, leading to a more organized and efficient user interface.
- Enhances maintainability by clearly defining card registration and visibility logic within the editor framework.
2025-10-15 14:20:08 -04:00

251 lines
7.4 KiB
C++

#include "editor_registry.h"
#include "absl/strings/str_format.h"
#include "app/editor/editor.h"
#include <unordered_set>
namespace yaze {
namespace editor {
// Static mappings for editor types
const std::unordered_map<EditorType, std::string> EditorRegistry::kEditorCategories = {
{EditorType::kDungeon, "Dungeon"},
{EditorType::kOverworld, "Overworld"},
{EditorType::kGraphics, "Graphics"},
{EditorType::kPalette, "Palette"},
{EditorType::kSprite, "Sprite"},
{EditorType::kScreen, "Screen"},
{EditorType::kMessage, "Message"},
{EditorType::kMusic, "Music"},
{EditorType::kAssembly, "Assembly"},
{EditorType::kEmulator, "Emulator"},
{EditorType::kHex, "Hex"},
{EditorType::kAgent, "Agent"},
{EditorType::kSettings, "System"}
};
const std::unordered_map<EditorType, std::string> EditorRegistry::kEditorNames = {
{EditorType::kDungeon, "Dungeon Editor"},
{EditorType::kOverworld, "Overworld Editor"},
{EditorType::kGraphics, "Graphics Editor"},
{EditorType::kPalette, "Palette Editor"},
{EditorType::kSprite, "Sprite Editor"},
{EditorType::kScreen, "Screen Editor"},
{EditorType::kMessage, "Message Editor"},
{EditorType::kMusic, "Music Editor"},
{EditorType::kAssembly, "Assembly Editor"},
{EditorType::kEmulator, "Emulator Editor"},
{EditorType::kHex, "Hex Editor"},
{EditorType::kAgent, "Agent Editor"},
{EditorType::kSettings, "Settings Editor"}
};
const std::unordered_map<EditorType, bool> EditorRegistry::kCardBasedEditors = {
{EditorType::kDungeon, true},
{EditorType::kOverworld, true},
{EditorType::kGraphics, true},
{EditorType::kPalette, true},
{EditorType::kSprite, true},
{EditorType::kScreen, true},
{EditorType::kMessage, true},
{EditorType::kMusic, true},
{EditorType::kAssembly, true},
{EditorType::kEmulator, true},
{EditorType::kHex, true},
{EditorType::kAgent, false}, // Agent: Traditional UI
{EditorType::kSettings, true} // Settings: Now card-based for better organization
};
bool EditorRegistry::IsCardBasedEditor(EditorType type) {
auto it = kCardBasedEditors.find(type);
return it != kCardBasedEditors.end() && it->second;
}
std::string EditorRegistry::GetEditorCategory(EditorType type) {
auto it = kEditorCategories.find(type);
if (it != kEditorCategories.end()) {
return it->second;
}
return "Unknown";
}
EditorType EditorRegistry::GetEditorTypeFromCategory(const std::string& category) {
for (const auto& [type, cat] : kEditorCategories) {
if (cat == category) {
return type; // Return first match
}
}
return EditorType::kSettings; // Default fallback
}
void EditorRegistry::JumpToDungeonRoom(int room_id) {
auto it = registered_editors_.find(EditorType::kDungeon);
if (it != registered_editors_.end() && it->second) {
// TODO: Implement dungeon room jumping
// This would typically call a method on the dungeon editor
printf("[EditorRegistry] Jumping to dungeon room %d\n", room_id);
}
}
void EditorRegistry::JumpToOverworldMap(int map_id) {
auto it = registered_editors_.find(EditorType::kOverworld);
if (it != registered_editors_.end() && it->second) {
// TODO: Implement overworld map jumping
// This would typically call a method on the overworld editor
printf("[EditorRegistry] Jumping to overworld map %d\n", map_id);
}
}
void EditorRegistry::SwitchToEditor(EditorType editor_type) {
ValidateEditorType(editor_type);
auto it = registered_editors_.find(editor_type);
if (it != registered_editors_.end() && it->second) {
// Deactivate all other editors
for (auto& [type, editor] : registered_editors_) {
if (type != editor_type && editor) {
editor->set_active(false);
}
}
// Activate the target editor
it->second->set_active(true);
printf("[EditorRegistry] Switched to %s\n", GetEditorDisplayName(editor_type).c_str());
}
}
void EditorRegistry::HideCurrentEditorCards() {
for (auto& [type, editor] : registered_editors_) {
if (editor && IsCardBasedEditor(type)) {
// TODO: Hide cards for this editor
printf("[EditorRegistry] Hiding cards for %s\n", GetEditorDisplayName(type).c_str());
}
}
}
void EditorRegistry::ShowEditorCards(EditorType editor_type) {
ValidateEditorType(editor_type);
if (IsCardBasedEditor(editor_type)) {
// TODO: Show cards for this editor
printf("[EditorRegistry] Showing cards for %s\n", GetEditorDisplayName(editor_type).c_str());
}
}
void EditorRegistry::ToggleEditorCards(EditorType editor_type) {
ValidateEditorType(editor_type);
if (IsCardBasedEditor(editor_type)) {
// TODO: Toggle cards for this editor
printf("[EditorRegistry] Toggling cards for %s\n", GetEditorDisplayName(editor_type).c_str());
}
}
std::vector<EditorType> EditorRegistry::GetEditorsInCategory(const std::string& category) const {
std::vector<EditorType> editors;
for (const auto& [type, cat] : kEditorCategories) {
if (cat == category) {
editors.push_back(type);
}
}
return editors;
}
std::vector<std::string> EditorRegistry::GetAvailableCategories() const {
std::vector<std::string> categories;
std::unordered_set<std::string> seen;
for (const auto& [type, category] : kEditorCategories) {
if (seen.find(category) == seen.end()) {
categories.push_back(category);
seen.insert(category);
}
}
return categories;
}
std::string EditorRegistry::GetEditorDisplayName(EditorType type) const {
auto it = kEditorNames.find(type);
if (it != kEditorNames.end()) {
return it->second;
}
return "Unknown Editor";
}
void EditorRegistry::RegisterEditor(EditorType type, Editor* editor) {
ValidateEditorType(type);
if (!editor) {
throw std::invalid_argument("Editor pointer cannot be null");
}
registered_editors_[type] = editor;
printf("[EditorRegistry] Registered %s\n", GetEditorDisplayName(type).c_str());
}
void EditorRegistry::UnregisterEditor(EditorType type) {
ValidateEditorType(type);
auto it = registered_editors_.find(type);
if (it != registered_editors_.end()) {
registered_editors_.erase(it);
printf("[EditorRegistry] Unregistered %s\n", GetEditorDisplayName(type).c_str());
}
}
Editor* EditorRegistry::GetEditor(EditorType type) const {
ValidateEditorType(type);
auto it = registered_editors_.find(type);
if (it != registered_editors_.end()) {
return it->second;
}
return nullptr;
}
bool EditorRegistry::IsEditorActive(EditorType type) const {
ValidateEditorType(type);
auto it = registered_editors_.find(type);
if (it != registered_editors_.end() && it->second) {
return it->second->active();
}
return false;
}
bool EditorRegistry::IsEditorVisible(EditorType type) const {
ValidateEditorType(type);
auto it = registered_editors_.find(type);
if (it != registered_editors_.end() && it->second) {
return it->second->active();
}
return false;
}
void EditorRegistry::SetEditorActive(EditorType type, bool active) {
ValidateEditorType(type);
auto it = registered_editors_.find(type);
if (it != registered_editors_.end() && it->second) {
it->second->set_active(active);
}
}
bool EditorRegistry::IsValidEditorType(EditorType type) const {
return kEditorCategories.find(type) != kEditorCategories.end();
}
void EditorRegistry::ValidateEditorType(EditorType type) const {
if (!IsValidEditorType(type)) {
throw std::invalid_argument(
absl::StrFormat("Invalid editor type: %d", static_cast<int>(type)));
}
}
} // namespace editor
} // namespace yaze