12#define IMGUI_DEFINE_MATH_OPERATORS
14#include "absl/status/status.h"
15#include "absl/status/statusor.h"
16#include "absl/strings/match.h"
17#include "absl/strings/str_cat.h"
18#include "absl/strings/str_format.h"
47#include "imgui/imgui.h"
52#ifdef YAZE_ENABLE_TESTING
58#ifdef YAZE_ENABLE_GTEST
77#include "imgui/misc/cpp/imgui_stdlib.h"
79#include "yaze_config.h"
84using util::FileDialogWrapper;
107 std::string category =
118void EditorManager::ShowAIAgent() {
119 agent_editor_.set_active(
true);
122void EditorManager::ShowChatHistory() {
128 : blank_editor_set_(nullptr, &user_settings_),
129 project_manager_(&toast_manager_),
130 rom_file_manager_(&toast_manager_) {
131 std::stringstream ss;
132 ss << YAZE_VERSION_MAJOR <<
"." << YAZE_VERSION_MINOR <<
"."
133 << YAZE_VERSION_PATCH;
200#ifdef YAZE_ENABLE_TESTING
202 test_manager.RegisterTestSuite(std::make_unique<test::IntegratedTestSuite>());
203 test_manager.RegisterTestSuite(
204 std::make_unique<test::PerformanceTestSuite>());
205 test_manager.RegisterTestSuite(std::make_unique<test::UITestSuite>());
206 test_manager.RegisterTestSuite(
207 std::make_unique<test::RomDependentTestSuite>());
210 test_manager.RegisterTestSuite(std::make_unique<test::E2ETestSuite>());
211 test_manager.RegisterTestSuite(
212 std::make_unique<test::ZSCustomOverworldTestSuite>());
216#ifdef YAZE_ENABLE_GTEST
217 test_manager.RegisterTestSuite(std::make_unique<test::UnitTestSuite>());
226 test_manager.UpdateResourceStats();
241 const std::string& filename) {
251 if (!filename.empty()) {
261 .display_name =
"CPU Debugger",
263 .category =
"Emulator",
266 .display_name =
"PPU Viewer",
268 .category =
"Emulator",
271 .display_name =
"Memory Viewer",
273 .category =
"Emulator",
276 .display_name =
"Breakpoints",
278 .category =
"Emulator",
281 .display_name =
"Performance",
283 .category =
"Emulator",
286 .display_name =
"AI Agent",
288 .category =
"Emulator",
291 .display_name =
"Save States",
293 .category =
"Emulator",
296 .display_name =
"Keyboard Config",
298 .category =
"Emulator",
301 .display_name =
"APU Debugger",
303 .category =
"Emulator",
306 .display_name =
"Audio Mixer",
308 .category =
"Emulator",
317 .display_name =
"Hex Editor",
319 .category =
"Memory",
328 agent_editor_.Initialize();
334 if (agent_editor_.GetChatWidget()) {
335 agent_editor_.GetChatWidget()->SetChatHistoryPopup(
342 [
this](std::filesystem::path* output_path) -> absl::Status {
345 absl::StatusOr<yaze::test::ScreenshotArtifact> result;
348 switch (agent_editor_.GetChatWidget()->capture_mode()) {
349 case CaptureMode::kFullWindow:
350 result = yaze::test::CaptureHarnessScreenshot(
"");
353 case CaptureMode::kActiveEditor:
354 result = yaze::test::CaptureActiveWindow(
"");
357 result = yaze::test::CaptureHarnessScreenshot(
"");
361 case CaptureMode::kSpecificWindow: {
362 const char* window_name =
363 agent_editor_.GetChatWidget()->specific_window_name();
364 if (window_name && std::strlen(window_name) > 0) {
365 result = yaze::test::CaptureWindowByName(window_name,
"");
368 result = yaze::test::CaptureActiveWindow(
"");
371 result = yaze::test::CaptureActiveWindow(
"");
374 result = yaze::test::CaptureHarnessScreenshot(
"");
381 return result.status();
383 *output_path = result->file_path;
384 return absl::OkStatus();
387 [
this](
const std::filesystem::path& image_path,
388 const std::string& prompt) -> absl::Status {
390 const char* api_key = std::getenv(
"GEMINI_API_KEY");
391 if (!api_key || std::strlen(api_key) == 0) {
392 return absl::FailedPreconditionError(
393 "GEMINI_API_KEY environment variable not set");
399 config.
model =
"gemini-2.5-flash";
407 if (!response.ok()) {
408 return response.status();
414 agent_msg.
message = response->text_response;
416 agent_editor_.GetChatWidget()->SetRomContext(
GetCurrentRom());
418 return absl::OkStatus();
420 agent_editor_.GetChatWidget()->SetMultimodalCallbacks(multimodal_callbacks);
426 [
this](
const std::string& proposal_id) -> absl::Status {
432 absl::StrFormat(
"%s View proposal %s in drawer to accept",
436 return absl::OkStatus();
440 [
this](
const std::string& proposal_id) -> absl::Status {
446 absl::StrFormat(
"%s View proposal %s in drawer to reject",
450 return absl::OkStatus();
454 []() -> absl::StatusOr<std::vector<std::string>> {
456 return std::vector<std::string>{};
460 [
this](
const std::string& proposal_id) -> absl::StatusOr<std::string> {
464 return "See diff in proposal drawer";
467 agent_editor_.GetChatWidget()->SetZ3EDCommandCallbacks(z3ed_callbacks);
479 automation_callbacks.
focus_proposal = [
this](
const std::string& proposal_id) {
483 agent_editor_.GetChatWidget()->SetAutomationCallbacks(automation_callbacks);
485 harness_telemetry_bridge_.SetChatWidget(agent_editor_.GetChatWidget());
492 LOG_WARN(
"EditorManager",
"Failed to load user settings: %s",
538#ifdef YAZE_ENABLE_TESTING
561 const std::string& cards_str) {
562 if (editor_name.empty()) {
566 LOG_INFO(
"EditorManager",
"Processing startup flags: editor='%s', cards='%s'",
567 editor_name.c_str(), cards_str.c_str());
571 if (GetEditorName(
static_cast<EditorType>(i)) == editor_name) {
572 editor_type_to_open =
static_cast<EditorType>(i);
578 LOG_WARN(
"EditorManager",
"Unknown editor specified via flag: %s",
579 editor_name.c_str());
585 auto* editor = editor_set
586 ->active_editors_[
static_cast<int>(editor_type_to_open)];
588 editor->set_active(
true);
595 std::stringstream ss(cards_str);
596 std::string card_name;
597 while (std::getline(ss, card_name,
',')) {
599 card_name.erase(0, card_name.find_first_not_of(
" \t"));
600 card_name.erase(card_name.find_last_not_of(
" \t") + 1);
602 LOG_DEBUG(
"EditorManager",
"Attempting to open card: '%s'",
605 if (card_name ==
"Rooms List") {
606 editor_set->dungeon_editor_.show_room_selector_ =
true;
607 }
else if (card_name ==
"Room Matrix") {
608 editor_set->dungeon_editor_.show_room_matrix_ =
true;
609 }
else if (card_name ==
"Entrances List") {
610 editor_set->dungeon_editor_.show_entrances_list_ =
true;
611 }
else if (card_name ==
"Room Graphics") {
612 editor_set->dungeon_editor_.show_room_graphics_ =
true;
613 }
else if (card_name ==
"Object Editor") {
614 editor_set->dungeon_editor_.show_object_editor_ =
true;
615 }
else if (card_name ==
"Palette Editor") {
616 editor_set->dungeon_editor_.show_palette_editor_ =
true;
617 }
else if (absl::StartsWith(card_name,
"Room ")) {
619 int room_id = std::stoi(card_name.substr(5));
620 editor_set->dungeon_editor_.add_room(room_id);
621 }
catch (
const std::exception& e) {
622 LOG_WARN(
"EditorManager",
"Invalid room ID format: %s",
626 LOG_WARN(
"EditorManager",
"Unknown card name for Dungeon Editor: %s",
684 status_ = agent_editor_.Update();
687 if (agent_editor_.GetChatWidget()) {
688 agent_editor_.GetChatWidget()->Draw();
693 if (ImGui::GetCurrentContext()) {
694 ImDrawList* bg_draw_list = ImGui::GetBackgroundDrawList();
695 const ImGuiViewport* viewport = ImGui::GetMainViewport();
698 auto current_theme = theme_manager.GetCurrentTheme();
702 ImVec2 grid_pos = viewport->WorkPos;
703 ImVec2 grid_size = viewport->WorkSize;
704 bg_renderer.RenderDockingBackground(bg_draw_list, grid_pos, grid_size,
705 current_theme.primary);
709 static Rom* last_test_rom =
nullptr;
711 if (last_test_rom != current_rom) {
714 "EditorManager::Update - ROM changed, updating TestManager: %p -> "
716 (
void*)last_test_rom, (
void*)current_rom);
718 last_test_rom = current_rom;
729 current_rom->dirty()) {
736 auto st = current_rom->SaveToFile(s);
750 if (!current_editor_set) {
752 return absl::OkStatus();
758 return absl::OkStatus();
765 for (
size_t session_idx = 0; session_idx <
sessions_.size(); ++session_idx) {
767 if (!session.rom.is_loaded())
773 for (
auto editor : session.editors.active_editors_) {
774 if (*editor->active()) {
777 if (overworld_editor.jump_to_tab() != -1) {
780 session.editors.dungeon_editor_.add_room(
781 overworld_editor.jump_to_tab());
789 if (is_card_based_editor) {
798 std::string editor_name = GetEditorName(editor->type());
800 absl::StrFormat(
"%s Error: %s", editor_name,
status_.message()),
806 std::string window_title =
810 ImGui::SetNextWindowSize(ImGui::GetMainViewport()->WorkSize,
811 ImGuiCond_FirstUseEver);
812 ImGui::SetNextWindowPos(ImGui::GetMainViewport()->WorkPos,
813 ImGuiCond_FirstUseEver);
815 if (ImGui::Begin(window_title.c_str(), editor->active(),
816 ImGuiWindowFlags_None)) {
825 std::string editor_name = GetEditorName(editor->type());
848 if (current_rom && current_rom->is_loaded()) {
849 agent_editor_.SetRomContext(current_rom);
855 current_editor_set) {
859 std::vector<std::string> active_categories;
860 for (
size_t session_idx = 0; session_idx <
sessions_.size();
863 if (!session.rom.is_loaded())
866 for (
auto editor : session.editors.active_editors_) {
869 if (std::find(active_categories.begin(), active_categories.end(),
870 category) == active_categories.end()) {
871 active_categories.push_back(category);
878 std::string sidebar_category;
882 std::find(active_categories.begin(), active_categories.end(),
884 active_categories.end()) {
888 else if (!active_categories.empty()) {
889 sidebar_category = active_categories[0];
894 if (!sidebar_category.empty()) {
896 auto category_switch_callback = [
this](
const std::string& new_category) {
903 auto collapse_callback = [
this]() {
910 category_switch_callback, collapse_callback);
921 return absl::OkStatus();
943 static bool show_display_settings =
false;
945 if (ImGui::BeginMenuBar()) {
964 if (show_display_settings) {
967 show_display_settings =
false;
973 ImGui::ShowDemoWindow(&visible);
981 ImGui::ShowMetricsWindow(&visible);
990 bool* hex_visibility =
992 if (hex_visibility && *hex_visibility) {
993 editor_set->memory_editor_.Update(*hex_visibility);
998 editor_set->assembly_editor_.Update(visible);
1017#ifdef YAZE_ENABLE_TESTING
1018 if (show_test_dashboard_) {
1020 test_manager.UpdateResourceStats();
1021 test_manager.DrawTestDashboard(&show_test_dashboard_);
1046 bool visible =
true;
1047 ImGui::Begin(
"Palette Editor", &visible);
1049 status_ = editor_set->palette_editor_.Update();
1055 absl::StrFormat(
"Palette Editor Error: %s",
status_.message()),
1066 bool visible =
true;
1109 if (file_name.empty()) {
1110 return absl::OkStatus();
1116 return absl::OkStatus();
1124 if (!session_or.ok()) {
1125 return session_or.status();
1130#ifdef YAZE_ENABLE_TESTING
1135 manager.AddFile(file_name);
1146 return absl::OkStatus();
1152 if (!current_rom || !current_editor_set) {
1153 return absl::FailedPreconditionError(
"No ROM or editor set loaded");
1156 auto start_time = std::chrono::steady_clock::now();
1165 current_editor_set->overworld_editor_.Initialize();
1166 current_editor_set->message_editor_.Initialize();
1167 current_editor_set->graphics_editor_.Initialize();
1168 current_editor_set->screen_editor_.Initialize();
1169 current_editor_set->sprite_editor_.Initialize();
1170 current_editor_set->palette_editor_.Initialize();
1171 current_editor_set->assembly_editor_.Initialize();
1172 current_editor_set->music_editor_.Initialize();
1173 current_editor_set->settings_editor_.Initialize();
1175 current_editor_set->dungeon_editor_.Initialize(
renderer_, current_rom);
1189 auto end_time = std::chrono::steady_clock::now();
1190 auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(
1191 end_time - start_time);
1192 LOG_DEBUG(
"EditorManager",
"ROM assets loaded in %lld ms", duration.count());
1194 return absl::OkStatus();
1215 if (!current_rom || !current_editor_set) {
1216 return absl::FailedPreconditionError(
"No ROM or editor set loaded");
1222 *current_rom, current_editor_set->screen_editor_.dungeon_maps_));
1238 if (!current_rom || !current_editor_set) {
1239 return absl::FailedPreconditionError(
"No ROM or editor set loaded");
1244 *current_rom, current_editor_set->screen_editor_.dungeon_maps_));
1254 if (save_status.ok()) {
1256 if (current_session_idx <
sessions_.size()) {
1257 sessions_[current_session_idx].filepath = filename;
1261 manager.AddFile(filename);
1269 if (filename.empty()) {
1270 return absl::OkStatus();
1272 if (absl::StrContains(filename,
".yaze")) {
1280 if (!session_or.ok()) {
1281 return session_or.status();
1291#ifdef YAZE_ENABLE_TESTING
1292 LOG_DEBUG(
"EditorManager",
"Setting ROM in TestManager - %p ('%s')",
1299 editor_set->assembly_editor_.OpenFolder(
1310 return absl::OkStatus();
1326 if (file_path.empty()) {
1327 return absl::OkStatus();
1334 auto validation_status = new_project.
Validate();
1335 if (!validation_status.ok()) {
1337 validation_status.message()),
1353 if (!session_or.ok()) {
1354 return session_or.status();
1364#ifdef YAZE_ENABLE_TESTING
1365 LOG_DEBUG(
"EditorManager",
"Setting ROM in TestManager - %p ('%s')",
1372 editor_set->assembly_editor_.OpenFolder(
1402 return absl::OkStatus();
1427 for (
const auto& file : manager.GetRecentFiles()) {
1439 :
"untitled_project";
1443 if (file_path.empty()) {
1444 return absl::OkStatus();
1448 if (file_path.find(
".yaze") == std::string::npos) {
1449 file_path +=
".yaze";
1457 if (save_status.ok()) {
1460 manager.AddFile(file_path);
1469 absl::StrFormat(
"Failed to save project: %s", save_status.message()),
1479 if (project_path.ends_with(
".zsproj")) {
1482 "ZScream project imported successfully. Please configure ROM and "
1490 return absl::OkStatus();
1495 return absl::FailedPreconditionError(
"No project is currently open");
1502 return absl::OkStatus();
1507 return absl::InvalidArgumentError(
"Invalid ROM pointer");
1510 for (
size_t i = 0; i <
sessions_.size(); ++i) {
1517 return absl::OkStatus();
1522 return absl::NotFoundError(
"ROM not found in existing sessions");
1541 absl::StrFormat(
"New session created (Session %zu)",
sessions_.size()),
1547 "Tip: Use Workspace → Sessions → Session Switcher for quick navigation",
1601#ifdef YAZE_ENABLE_TESTING
1612 for (
size_t i = 0; i <
sessions_.size(); ++i) {
1614 sessions_[i].custom_name !=
"[CLOSED SESSION]") {
1629 if (session.custom_name !=
"[CLOSED SESSION]") {
1637 EditorType type,
size_t session_index)
const {
1638 const char* base_name =
kEditorNames[
static_cast<int>(type)];
1647 return std::string(base_name);
1682 for (
auto* editor : editor_set->active_editors_) {
1683 if (editor->type() == editor_type) {
1684 editor->toggle_active();
1689 if (*editor->active()) {
1696 ImGuiID dockspace_id = ImGui::GetID(
"MainDockSpace");
1701 for (
auto* other : editor_set->active_editors_) {
1731 : manager_(manager),
1732 prev_rom_(manager->GetCurrentRom()),
1733 prev_editor_set_(manager->GetCurrentEditorSet()),
1734 prev_session_id_(manager->GetCurrentSessionId()) {
1742 manager_->session_coordinator_->SwitchToSession(prev_session_id_);
1747 if (session.filepath == filepath) {
1778 size_t session_id) {
The Rom class is used to load, save, and modify Rom data.
static TimingManager & Get()
float Update()
Update the timing manager (call once per frame)
absl::StatusOr< AgentResponse > GenerateMultimodalResponse(const std::string &image_path, const std::string &prompt)
bool * GetVisibilityFlag(size_t session_id, const std::string &base_card_id)
Get visibility flag pointer for a card.
void DrawSidebar(size_t session_id, const std::string &category, const std::vector< std::string > &active_categories={}, std::function< void(const std::string &)> on_category_switch=nullptr, std::function< void()> on_collapse=nullptr)
Draw sidebar for a category with session filtering.
void RegisterCard(size_t session_id, const CardInfo &base_info)
Register a card for a specific session.
void SetActiveCategory(const std::string &category)
Set active category (for sidebar)
void DrawCardBrowser(size_t session_id, bool *p_open)
Draw visual card browser/toggler.
void HideAllCardsInCategory(size_t session_id, const std::string &category)
Hide all cards in a category for a session.
bool ShowCard(size_t session_id, const std::string &base_card_id)
Show a card programmatically.
std::string GetActiveCategory() const
Get active category (for sidebar)
SessionScope(EditorManager *manager, size_t session_id)
The EditorManager controls the main editor window and manages the various editor classes.
absl::Status SaveProjectAs()
std::deque< RomSession > sessions_
static bool IsCardBasedEditor(EditorType type)
std::unique_ptr< SessionCoordinator > session_coordinator_
void InitializeTestSuites()
absl::Status SaveRomAs(const std::string &filename)
project::YazeProject current_project_
void DrawContextSensitiveCardControl()
void HideCurrentEditorCards()
MenuBuilder menu_builder_
void JumpToDungeonRoom(int room_id)
void SwitchToSession(size_t index)
size_t GetActiveSessionCount() const
absl::Status OpenProject()
ProjectManager project_manager_
void CloseCurrentSession()
gfx::IRenderer * renderer_
EditorCardRegistry card_registry_
bool HasDuplicateSession(const std::string &filepath)
void SwitchToEditor(EditorType editor_type)
absl::Status RepairCurrentProject()
EditorSelectionDialog editor_selection_dialog_
std::unique_ptr< LayoutManager > layout_manager_
std::string GenerateUniqueEditorTitle(EditorType type, size_t session_index) const
void DrawMenuBar()
Draw the main menu bar.
void DuplicateCurrentSession()
void Initialize(gfx::IRenderer *renderer, const std::string &filename="")
EditorRegistry editor_registry_
AgentChatHistoryPopup agent_chat_history_popup_
absl::Status CreateNewProject(const std::string &template_name="Basic ROM Hack")
ToastManager toast_manager_
auto GetCurrentEditorSet() const -> EditorSet *
std::unique_ptr< MenuOrchestrator > menu_orchestrator_
ProjectFileEditor project_file_editor_
absl::Status SaveProject()
void OpenEditorAndCardsFromFlags(const std::string &editor_name, const std::string &cards_str)
void JumpToOverworldMap(int map_id)
absl::Status LoadRom()
Load a ROM file into a new or existing session.
absl::Status Update()
Main update loop for the editor application.
size_t GetCurrentSessionIndex() const
absl::Status ImportProject(const std::string &project_path)
size_t GetCurrentSessionId() const
WindowDelegate window_delegate_
ShortcutManager shortcut_manager_
EditorDependencies::SharedClipboard shared_clipboard_
UserSettings user_settings_
WorkspaceManager workspace_manager_
auto GetCurrentRom() const -> Rom *
ProposalDrawer proposal_drawer_
void ConfigureEditorDependencies(EditorSet *editor_set, Rom *rom, size_t session_id)
Injects dependencies into all editors within an EditorSet.
WelcomeScreen welcome_screen_
absl::Status LoadAssets()
absl::Status OpenRomOrProject(const std::string &filename)
void RemoveSession(size_t index)
std::unique_ptr< PopupManager > popup_manager_
std::unique_ptr< UICoordinator > ui_coordinator_
absl::Status SaveRom()
Save the current ROM file.
absl::Status SetCurrentRom(Rom *rom)
RomFileManager rom_file_manager_
static EditorType GetEditorTypeFromCategory(const std::string &category)
static bool IsCardBasedEditor(EditorType type)
static std::string GetEditorCategory(EditorType type)
void ClearRecentEditors()
Clear recent editors (for new ROM sessions)
void SetSelectionCallback(std::function< void(EditorType)> callback)
Set callback for when editor is selected.
void MarkRecentlyUsed(EditorType type)
Mark an editor as recently used.
bool Show(bool *p_open=nullptr)
Show the dialog.
Contains a complete set of editors for a single ROM instance.
size_t session_id() const
void ApplyDependencies(const EditorDependencies &dependencies)
void set_user_settings(UserSettings *settings)
virtual absl::Status Update()=0
Manipulates the Overworld and OverworldMap data in a Rom.
void SetToastManager(ToastManager *toast_manager)
Set toast manager for notifications.
absl::Status CreateNewProject(const std::string &template_name="")
project::YazeProject & GetCurrentProject()
void FocusProposal(const std::string &proposal_id)
absl::Status LoadRom(Rom *rom, const std::string &filename)
absl::Status SaveRom(Rom *rom)
absl::Status SaveRomAs(Rom *rom, const std::string &filename)
void Show(const std::string &message, ToastType type=ToastType::kInfo, float ttl_seconds=3.0f)
void SetNewProjectCallback(std::function< void()> callback)
Set callback for creating new project.
void SetOpenRomCallback(std::function< void()> callback)
Set callback for opening ROM.
void SetOpenProjectCallback(std::function< void(const std::string &)> callback)
Set callback for opening project.
void set_card_registry(EditorCardRegistry *registry)
void set_renderer(gfx::IRenderer *renderer)
void set_card_registry(editor::EditorCardRegistry *registry)
Defines an abstract interface for all rendering operations.
static BackgroundRenderer & Get()
static ThemeManager & Get()
static RecentFilesManager & GetInstance()
absl::Status ShowHarnessActiveTests()
absl::Status ShowHarnessDashboard()
void SetCurrentRom(Rom *rom)
static TestManager & Get()
absl::Status ReplayLastPlan()
static std::string ShowSaveFileDialog(const std::string &default_name="", const std::string &default_extension="")
ShowSaveFileDialog opens a save file dialog and returns the selected filepath. Uses global feature fl...
static std::string ShowOpenFileDialog()
ShowOpenFileDialog opens a file dialog and returns the selected filepath. Uses global feature flag to...
#define ICON_MD_VIDEOGAME_ASSET
#define ICON_MD_BUG_REPORT
#define ICON_MD_AUDIOTRACK
#define ICON_MD_SCREENSHOT
#define ICON_MD_MUSIC_NOTE
#define ICON_MD_AUDIO_FILE
#define ICON_MD_SMART_TOY
#define LOG_DEBUG(category, format,...)
#define LOG_WARN(category, format,...)
#define LOG_INFO(category, format,...)
#define PRINT_IF_ERROR(expression)
#define RETURN_IF_ERROR(expression)
#define ASSIGN_OR_RETURN(type_variable_name, expression)
std::string GetEditorName(EditorType type)
constexpr std::array< const char *, 14 > kEditorNames
constexpr const char * kDungeonEditorName
constexpr const char * kMessageEditorName
constexpr const char * kGraphicsEditorName
constexpr const char * kScreenEditorName
void ConfigureMenuShortcuts(const ShortcutDependencies &deps, ShortcutManager *shortcut_manager)
constexpr const char * kSettingsEditorName
constexpr const char * kMusicEditorName
constexpr const char * kOverworldEditorName
constexpr const char * kAssemblyEditorName
constexpr const char * kSpriteEditorName
void ConfigureEditorShortcuts(const ShortcutDependencies &deps, ShortcutManager *shortcut_manager)
void ExecuteShortcuts(const ShortcutManager &shortcut_manager)
constexpr const char * kPaletteEditorName
void RegisterZ3edTestSuites()
absl::Status SaveDungeonMaps(Rom &rom, std::vector< DungeonMap > &dungeon_maps)
Save the dungeon maps to the ROM.
Main namespace for the application.
absl::StatusOr< std::array< gfx::Bitmap, kNumGfxSheets > > LoadAllGraphicsData(Rom &rom, bool defer_render)
This function iterates over all graphics sheets in the Rom and loads them into memory....
absl::Status SaveAllGraphicsData(Rom &rom, std::array< gfx::Bitmap, kNumGfxSheets > &gfx_sheets)
Unified dependency container for all editor types.
ToastManager * toast_manager
SharedClipboard * shared_clipboard
gfx::IRenderer * renderer
ShortcutManager * shortcut_manager
UserSettings * user_settings
PopupManager * popup_manager
EditorCardRegistry * card_registry
Represents a single session, containing a ROM and its associated editors.
core::FeatureFlags::Flags feature_flags
SessionCoordinator * session_coordinator
WorkspaceManager * workspace_manager
EditorRegistry * editor_registry
MenuOrchestrator * menu_orchestrator
ToastManager * toast_manager
RomFileManager * rom_file_manager
EditorManager * editor_manager
ProjectManager * project_manager
UICoordinator * ui_coordinator
PopupManager * popup_manager
bool show_welcome_on_startup
float autosave_interval_secs
std::vector< std::string > recent_files
Modern project structure with comprehensive settings consolidation.
absl::Status RepairProject()
bool project_opened() const
absl::Status ImportZScreamProject(const std::string &zscream_project_path)
std::string labels_filename
std::string GetDisplayName() const
WorkspaceSettings workspace_settings
absl::Status Open(const std::string &project_path)
absl::Status Validate() const
core::FeatureFlags::Flags feature_flags