Files
yaze/src/app/editor/editor.h
scawful e769cea1d9 feat: Introduce Debugging and Testing Guide with enhanced startup options
- Added a new document, E5-debugging-guide.md, providing comprehensive strategies for debugging and testing the `yaze` application, including logging practices and testing frameworks.
- Updated E2-development-guide.md to include a new section on debugging and testing, detailing quick debugging methods using command-line flags for specific editors and UI cards.
- Enhanced the main application to support command-line flags for opening specific editors and cards on startup, improving the developer experience.
- Refactored the Controller class to handle startup editor and card initialization based on command-line inputs.
2025-10-09 17:19:36 -04:00

155 lines
4.0 KiB
C++

#ifndef YAZE_APP_CORE_EDITOR_H
#define YAZE_APP_CORE_EDITOR_H
#include <array>
#include <vector>
#include <functional>
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/str_format.h"
#include "app/editor/system/command_manager.h"
#include "app/editor/system/extension_manager.h"
#include "app/editor/system/history_manager.h"
#include "app/editor/system/popup_manager.h"
#include "app/editor/system/shortcut_manager.h"
namespace yaze {
/**
* @namespace yaze::editor
* @brief Editors are the view controllers for the application.
*/
namespace editor {
struct EditorContext {
CommandManager command_manager;
ExtensionManager extension_manager;
HistoryManager history_manager;
PopupManager* popup_manager = nullptr;
ShortcutManager shortcut_manager;
// Session identification for multi-session support
// Used by child panels to create unique ImGui IDs
size_t session_id = 0;
// Cross-session shared clipboard for editor data transfers
struct SharedClipboard {
// Overworld tile16 selection payload
bool has_overworld_tile16 = false;
std::vector<int> overworld_tile16_ids;
int overworld_width = 0; // in tile16 units
int overworld_height = 0; // in tile16 units
void Clear() {
has_overworld_tile16 = false;
overworld_tile16_ids.clear();
overworld_width = 0;
overworld_height = 0;
}
} shared_clipboard;
};
enum class EditorType {
kUnknown,
kAssembly,
kDungeon,
kEmulator,
kGraphics,
kMusic,
kOverworld,
kPalette,
kScreen,
kSprite,
kMessage,
kHex,
kAgent,
kSettings,
};
constexpr std::array<const char*, 14> kEditorNames = {
"Unknown",
"Assembly", "Dungeon", "Emulator", "Graphics", "Music", "Overworld",
"Palette", "Screen", "Sprite", "Message", "Hex", "Agent", "Settings",
};
/**
* @class Editor
* @brief Interface for editor classes.
*
* Provides basic editing operations that each editor should implement.
*/
class Editor {
public:
Editor() = default;
virtual ~Editor() = default;
// Initialization of the editor, no ROM assets.
virtual void Initialize() = 0;
// Initialization of ROM assets.
virtual absl::Status Load() = 0;
// Save the editor state.
virtual absl::Status Save() = 0;
// Update the editor state, ran every frame.
virtual absl::Status Update() = 0;
virtual absl::Status Cut() = 0;
virtual absl::Status Copy() = 0;
virtual absl::Status Paste() = 0;
virtual absl::Status Undo() = 0;
virtual absl::Status Redo() = 0;
virtual absl::Status Find() = 0;
virtual absl::Status Clear() { return absl::OkStatus(); }
EditorType type() const { return type_; }
void set_context(EditorContext* context) { context_ = context; }
bool* active() { return &active_; }
void set_active(bool active) { active_ = active; }
// ROM loading state helpers (default implementations)
virtual bool IsRomLoaded() const { return false; }
virtual std::string GetRomStatus() const { return "ROM state not implemented"; }
protected:
bool active_ = false;
EditorType type_;
EditorContext* context_ = nullptr;
// Helper method to create session-aware card titles for multi-session support
std::string MakeCardTitle(const std::string& base_title) const {
if (context_ && context_->session_id > 0) {
return absl::StrFormat("%s [S%zu]", base_title, context_->session_id);
}
return base_title;
}
// Helper method for ROM access with safety check
template<typename T>
absl::StatusOr<T> SafeRomAccess(std::function<T()> accessor, const std::string& operation = "") const {
if (!IsRomLoaded()) {
return absl::FailedPreconditionError(
operation.empty() ? "ROM not loaded" :
absl::StrFormat("%s: ROM not loaded", operation));
}
try {
return accessor();
} catch (const std::exception& e) {
return absl::InternalError(absl::StrFormat(
"%s: %s", operation.empty() ? "ROM access failed" : operation, e.what()));
}
}
};
} // namespace editor
} // namespace yaze
#endif // YAZE_APP_CORE_EDITOR_H