16#include <unordered_set>
21#define IMGUI_DEFINE_MATH_OPERATORS
22#include "absl/status/status.h"
23#include "absl/status/statusor.h"
24#include "absl/strings/ascii.h"
25#include "absl/strings/match.h"
26#include "absl/strings/str_format.h"
27#include "absl/strings/str_split.h"
28#include "absl/strings/strip.h"
29#include "imgui/imgui.h"
30#include "imgui/imgui_internal.h"
74#include "yaze_config.h"
88#ifdef YAZE_ENABLE_TESTING
94#ifdef YAZE_ENABLE_GTEST
111 absl::string_view name) {
112 const std::string lower = absl::AsciiStrToLower(std::string(name));
114 const std::string candidate = absl::AsciiStrToLower(
116 if (candidate == lower) {
124 if (panel_id.size() > 2 && panel_id[0] ==
's' &&
125 absl::ascii_isdigit(panel_id[1])) {
126 const size_t dot = panel_id.find(
'.');
127 if (dot != absl::string_view::npos) {
128 return std::string(panel_id.substr(dot + 1));
131 return std::string(panel_id);
150 std::string category =
172#ifdef YAZE_BUILD_AGENT_UI
173void EditorManager::ShowAIAgent() {
180void EditorManager::ShowChatHistory() {
186 : project_manager_(&toast_manager_), rom_file_manager_(&toast_manager_) {
187 std::stringstream ss;
188 ss << YAZE_VERSION_MAJOR <<
"." << YAZE_VERSION_MINOR <<
"."
189 << YAZE_VERSION_PATCH;
272 if (!rom_path.empty()) {
289 absl::StrFormat(
"Failed to reload ROM: %s", status.message()),
300 absl::StrFormat(
"Failed to save project: %s", status.message()),
305 [
this](
const std::string& type) {
307 if (!folder_path.empty()) {
308 if (type ==
"code") {
312 editor_set->GetAssemblyEditor()->OpenFolder(folder_path);
315 }
else if (type ==
"assets") {
319 absl::StrFormat(
"%s folder set: %s", type.c_str(),
320 folder_path.c_str()),
369 {.card_id =
"dashboard.main",
370 .display_name =
"Dashboard",
371 .window_title =
" Dashboard",
373 .category =
"Dashboard",
374 .shortcut_hint =
"F1",
408#ifdef YAZE_ENABLE_TESTING
412 LOG_DEBUG(
"EditorManager",
"Session switched to %zu via observer", new_index);
416 LOG_INFO(
"EditorManager",
"Session %zu created via observer", index);
420#ifdef YAZE_ENABLE_TESTING
425 LOG_INFO(
"EditorManager",
"Session %zu closed via observer", index);
429#ifdef YAZE_ENABLE_TESTING
435 LOG_INFO(
"EditorManager",
"ROM loaded in session %zu via observer", index);
441#ifdef YAZE_ENABLE_TESTING
443 test_manager.RegisterTestSuite(std::make_unique<test::IntegratedTestSuite>());
444 test_manager.RegisterTestSuite(
445 std::make_unique<test::PerformanceTestSuite>());
446 test_manager.RegisterTestSuite(std::make_unique<test::UITestSuite>());
447 test_manager.RegisterTestSuite(
448 std::make_unique<test::RomDependentTestSuite>());
451 test_manager.RegisterTestSuite(std::make_unique<test::E2ETestSuite>());
452 test_manager.RegisterTestSuite(
453 std::make_unique<test::ZSCustomOverworldTestSuite>());
457#ifdef YAZE_ENABLE_GTEST
458 test_manager.RegisterTestSuite(std::make_unique<test::UnitTestSuite>());
467 test_manager.UpdateResourceStats();
471 const std::string& filename) {
484 if (!filename.empty()) {
495 .display_name =
"CPU Debugger",
496 .window_title =
" CPU Debugger",
498 .category =
"Emulator",
501 .display_name =
"PPU Viewer",
502 .window_title =
" PPU Viewer",
504 .category =
"Emulator",
507 .display_name =
"Memory Viewer",
508 .window_title =
" Memory Viewer",
510 .category =
"Emulator",
513 .display_name =
"Breakpoints",
514 .window_title =
" Breakpoints",
516 .category =
"Emulator",
519 .display_name =
"Performance",
520 .window_title =
" Performance",
522 .category =
"Emulator",
525 .display_name =
"AI Agent",
526 .window_title =
" AI Agent",
528 .category =
"Emulator",
531 .display_name =
"Save States",
532 .window_title =
" Save States",
534 .category =
"Emulator",
537 .display_name =
"Keyboard Config",
538 .window_title =
" Keyboard Config",
540 .category =
"Emulator",
543 .display_name =
"Virtual Controller",
544 .window_title =
" Virtual Controller",
546 .category =
"Emulator",
549 .display_name =
"APU Debugger",
550 .window_title =
" APU Debugger",
552 .category =
"Emulator",
555 .display_name =
"Audio Mixer",
556 .window_title =
" Audio Mixer",
558 .category =
"Emulator",
563 .display_name =
"Hex Editor",
566 .category =
"Memory",
579 LOG_WARN(
"EditorManager",
"Failed to load user settings: %s",
590 LOG_INFO(
"EditorManager",
"WASM Control and Session APIs initialized");
599 flags.overworld.kSaveOverworldEntrances =
628 LOG_INFO(
"EditorManager",
"ROM load options applied: preset=%s",
648 [
this](
const std::string& template_name) {
666#ifdef YAZE_BUILD_AGENT_UI
714 absl::StrFormat(
"Failed to save ROM: %s", status.message()),
722 auto status = current_editor->Undo();
725 absl::StrFormat(
"Undo failed: %s", status.message()),
733 auto status = current_editor->Redo();
736 absl::StrFormat(
"Redo failed: %s", status.message()),
770 [
this](
bool visible,
bool expanded) {
777 [
this](
const std::string& category) {
804 [
this](
const std::string& category,
const std::string& path) {
805 if (category ==
"Assembly") {
808 editor_set->GetAssemblyEditor()->ChangeActiveFile(path);
826#ifdef YAZE_ENABLE_TESTING
850 const std::string& editor_name,
const std::string& panels_str) {
851 const bool has_editor = !editor_name.empty();
852 const bool has_panels = !panels_str.empty();
854 if (!has_editor && !has_panels) {
859 "Processing startup flags: editor='%s', panels='%s'",
860 editor_name.c_str(), panels_str.c_str());
862 std::optional<EditorType> editor_type_to_open =
863 has_editor ? ParseEditorTypeFromString(editor_name) : std::nullopt;
864 if (has_editor && !editor_type_to_open.has_value()) {
865 LOG_WARN(
"EditorManager",
"Unknown editor specified via flag: %s",
866 editor_name.c_str());
867 }
else if (editor_type_to_open.has_value()) {
879 bool applied_category_from_panel =
false;
881 for (absl::string_view token :
882 absl::StrSplit(panels_str,
',', absl::SkipWhitespace())) {
886 std::string panel_name = std::string(absl::StripAsciiWhitespace(token));
887 LOG_DEBUG(
"EditorManager",
"Attempting to open panel: '%s'",
890 const std::string lower_name = absl::AsciiStrToLower(panel_name);
891 if (lower_name ==
"welcome" || lower_name ==
"welcome_screen") {
897 if (lower_name ==
"dashboard" || lower_name ==
"dashboard.main" ||
898 lower_name ==
"editor_selection") {
910 if (absl::StartsWith(panel_name,
"Room ")) {
913 int room_id = std::stoi(panel_name.substr(5));
914 editor_set->GetDungeonEditor()->add_room(room_id);
915 }
catch (
const std::exception& e) {
916 LOG_WARN(
"EditorManager",
"Invalid room ID format: %s",
923 std::optional<std::string> resolved_panel;
925 resolved_panel = panel_name;
927 for (
const auto& [prefixed_id, descriptor] :
929 const std::string base_id = StripSessionPrefix(prefixed_id);
930 const std::string card_lower = absl::AsciiStrToLower(base_id);
931 const std::string display_lower =
932 absl::AsciiStrToLower(descriptor.display_name);
934 if (card_lower == lower_name || display_lower == lower_name) {
935 resolved_panel = base_id;
941 if (!resolved_panel.has_value()) {
943 "Unknown panel '%s' from --open_panels (known count: %zu)",
950 const auto* descriptor =
952 if (descriptor && !applied_category_from_panel &&
955 applied_category_from_panel =
true;
956 }
else if (!applied_category_from_panel &&
957 descriptor && descriptor->category.empty() &&
958 !last_known_category.empty()) {
962 LOG_WARN(
"EditorManager",
"Failed to show panel '%s'",
963 resolved_panel->c_str());
982 const bool sidebar_visible =
1009 std::string panels_str;
1010 for (
size_t i = 0; i < config.
open_panels.size(); ++i) {
1048 std::vector<std::function<void()>> actions_to_execute;
1050 for (
auto& action : actions_to_execute) {
1102 static Rom* last_test_rom =
nullptr;
1104 if (last_test_rom != current_rom) {
1107 "EditorManager::Update - ROM changed, updating TestManager: %p -> "
1109 (
void*)last_test_rom, (
void*)current_rom);
1111 last_test_rom = current_rom;
1131 std::unordered_set<std::string> active_editor_categories;
1135 for (
size_t session_idx = 0;
1140 if (!session || !session->rom.is_loaded()) {
1144 for (
auto* editor : session->editors.active_editors_) {
1146 std::string category =
1148 active_editor_categories.insert(category);
1155 active_editor_categories.insert(
"Emulator");
1163 if (sidebar_category.empty() && !all_categories.empty()) {
1164 sidebar_category = all_categories[0];
1169 auto has_rom_callback = [
this]() ->
bool {
1171 return rom && rom->is_loaded();
1178 all_categories, active_editor_categories,
1199 current_rom->dirty()) {
1206 auto st = current_rom->SaveToFile(s);
1219 if (!current_editor_set) {
1222 return absl::OkStatus();
1228 return absl::OkStatus();
1251 if (current_rom && current_rom->is_loaded()) {
1272 return absl::OkStatus();
1292 static bool show_display_settings =
false;
1294 if (ImGui::BeginMenuBar()) {
1297 ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0));
1298 ImGui::PushStyleColor(ImGuiCol_ButtonHovered,
1300 ImGui::PushStyleColor(ImGuiCol_ButtonActive,
1320 ImGui::PopStyleColor(4);
1322 if (ImGui::IsItemHovered()) {
1324 ?
"Hide Activity Bar (Ctrl+B)"
1325 :
"Show Activity Bar (Ctrl+B)";
1326 ImGui::SetTooltip(
"%s", tooltip);
1339 ImGui::EndMenuBar();
1342 if (show_display_settings) {
1345 show_display_settings =
false;
1350 bool visible =
true;
1351 ImGui::ShowDemoWindow(&visible);
1358 bool visible =
true;
1359 ImGui::ShowMetricsWindow(&visible);
1368 bool* hex_visibility =
1370 if (hex_visibility && *hex_visibility) {
1371 editor_set->GetMemoryEditor()->Update(*hex_visibility);
1375 bool visible =
true;
1376 editor_set->GetAssemblyEditor()->Update(visible);
1395#ifdef YAZE_ENABLE_TESTING
1396 if (show_test_dashboard_) {
1398 test_manager.UpdateResourceStats();
1399 test_manager.DrawTestDashboard(&show_test_dashboard_);
1438 bool visible =
true;
1483 if (file_name.empty()) {
1484 return absl::OkStatus();
1488 if (absl::StrContains(file_name,
".yaze")) {
1495 return absl::OkStatus();
1503 std::move(temp_rom), file_name);
1504 if (!session_or.ok()) {
1505 return session_or.status();
1514 label_provider.SetPreferHMagicNames(
1516 LOG_INFO(
"EditorManager",
"Initialized ResourceLabelProvider for LoadRom");
1518#ifdef YAZE_ENABLE_TESTING
1523 manager.AddFile(file_name);
1536 return absl::OkStatus();
1542 if (!current_rom || !current_editor_set) {
1543 return absl::FailedPreconditionError(
"No ROM or editor set loaded");
1546 auto start_time = std::chrono::steady_clock::now();
1548#ifdef __EMSCRIPTEN__
1550 auto loading_handle =
1552 ?
static_cast<app::platform::WasmLoadingManager::LoadingHandle
>(
1554 : app::platform::WasmLoadingManager::BeginLoading(
1555 "Loading Editor Assets");
1558 constexpr float kStartProgress = 0.10f;
1559 constexpr float kEndProgress = 1.0f;
1560 constexpr int kTotalSteps = 11;
1561 int current_step = 0;
1562 auto update_progress = [&](
const std::string& message) {
1565 kStartProgress + (kEndProgress - kStartProgress) *
1566 (
static_cast<float>(current_step) / kTotalSteps);
1567 app::platform::WasmLoadingManager::UpdateProgress(loading_handle, progress);
1568 app::platform::WasmLoadingManager::UpdateMessage(loading_handle, message);
1571 auto cleanup_loading = [&]() {
1572 app::platform::WasmLoadingManager::EndLoading(loading_handle);
1574 struct LoadingGuard {
1575 std::function<void()> cleanup;
1576 bool dismissed =
false;
1581 void dismiss() { dismissed =
true; }
1582 } loading_guard{cleanup_loading};
1584 (void)passed_handle;
1594 current_editor_set->GetOverworldEditor()->Initialize();
1595 current_editor_set->GetMessageEditor()->Initialize();
1596 current_editor_set->GetGraphicsEditor()->Initialize();
1597 current_editor_set->GetScreenEditor()->Initialize();
1598 current_editor_set->GetSpriteEditor()->Initialize();
1599 current_editor_set->GetPaletteEditor()->Initialize();
1600 current_editor_set->GetAssemblyEditor()->Initialize();
1601 current_editor_set->GetMusicEditor()->Initialize();
1604 current_editor_set->GetDungeonEditor()->Initialize(
renderer_, current_rom);
1606#ifdef __EMSCRIPTEN__
1607 update_progress(
"Loading graphics sheets...");
1611 if (!current_session) {
1612 return absl::FailedPreconditionError(
"No active ROM session");
1621 current_session->game_data.gfx_bitmaps;
1624 auto* game_data = ¤t_session->game_data;
1625 current_editor_set->GetDungeonEditor()->SetGameData(game_data);
1626 current_editor_set->GetOverworldEditor()->SetGameData(game_data);
1627 current_editor_set->GetGraphicsEditor()->SetGameData(game_data);
1628 current_editor_set->GetScreenEditor()->SetGameData(game_data);
1629 current_editor_set->GetPaletteEditor()->SetGameData(game_data);
1630 current_editor_set->GetSpriteEditor()->SetGameData(game_data);
1631 current_editor_set->GetMessageEditor()->SetGameData(game_data);
1633#ifdef __EMSCRIPTEN__
1634 update_progress(
"Loading overworld...");
1638#ifdef __EMSCRIPTEN__
1639 update_progress(
"Loading dungeons...");
1643#ifdef __EMSCRIPTEN__
1644 update_progress(
"Loading screen editor...");
1648#ifdef __EMSCRIPTEN__
1649 update_progress(
"Loading graphics editor...");
1653#ifdef __EMSCRIPTEN__
1654 update_progress(
"Loading settings...");
1659#ifdef __EMSCRIPTEN__
1660 update_progress(
"Loading sprites...");
1664#ifdef __EMSCRIPTEN__
1665 update_progress(
"Loading messages...");
1669#ifdef __EMSCRIPTEN__
1670 update_progress(
"Loading music...");
1674#ifdef __EMSCRIPTEN__
1675 update_progress(
"Loading palettes...");
1679#ifdef __EMSCRIPTEN__
1680 update_progress(
"Finishing up...");
1685 auto* settings = current_editor_set->GetSettingsPanel();
1694 if (
auto* settings = current_editor_set->GetSettingsPanel()) {
1703#ifdef __EMSCRIPTEN__
1705 loading_guard.dismiss();
1706 app::platform::WasmLoadingManager::EndLoading(loading_handle);
1709 auto end_time = std::chrono::steady_clock::now();
1710 auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(
1711 end_time - start_time);
1712 LOG_DEBUG(
"EditorManager",
"ROM assets loaded in %lld ms", duration.count());
1714 return absl::OkStatus();
1735 if (!current_rom || !current_editor_set) {
1736 return absl::FailedPreconditionError(
"No ROM or editor set loaded");
1742 *current_rom, current_editor_set->GetScreenEditor()->dungeon_maps_));
1758 return absl::FailedPreconditionError(
"No ROM loaded");
1766 if (save_status.ok()) {
1771 session->filepath = filename;
1777 manager.AddFile(filename);
1785 LOG_INFO(
"EditorManager",
"OpenRomOrProject called with: '%s'",
1787 if (filename.empty()) {
1788 LOG_INFO(
"EditorManager",
"Empty filename provided, skipping load.");
1789 return absl::OkStatus();
1792#ifdef __EMSCRIPTEN__
1794 auto loading_handle =
1795 app::platform::WasmLoadingManager::BeginLoading(
"Loading ROM");
1796 app::platform::WasmLoadingManager::UpdateMessage(loading_handle,
1797 "Reading ROM file...");
1799 struct LoadingGuard {
1800 app::platform::WasmLoadingManager::LoadingHandle handle;
1801 bool dismissed =
false;
1804 app::platform::WasmLoadingManager::EndLoading(handle);
1806 void dismiss() { dismissed =
true; }
1807 } loading_guard{loading_handle};
1810 if (absl::StrContains(filename,
".yaze")) {
1821#ifdef __EMSCRIPTEN__
1822 app::platform::WasmLoadingManager::UpdateProgress(loading_handle, 0.05f);
1823 app::platform::WasmLoadingManager::UpdateMessage(loading_handle,
1824 "Loading ROM data...");
1830 std::move(temp_rom), filename);
1831 if (!session_or.ok()) {
1832 return session_or.status();
1847 label_provider.SetPreferHMagicNames(
1849 LOG_INFO(
"EditorManager",
"Initialized ResourceLabelProvider for ROM-only load");
1853#ifdef YAZE_ENABLE_TESTING
1854 LOG_DEBUG(
"EditorManager",
"Setting ROM in TestManager - %p ('%s')",
1868#ifdef __EMSCRIPTEN__
1869 app::platform::WasmLoadingManager::UpdateProgress(loading_handle, 0.10f);
1870 app::platform::WasmLoadingManager::UpdateMessage(loading_handle,
1871 "Initializing editors...");
1874 loading_guard.dismiss();
1888 return absl::OkStatus();
1910 if (file_path.empty()) {
1911 return absl::OkStatus();
1918 auto validation_status = new_project.
Validate();
1919 if (!validation_status.ok()) {
1921 validation_status.message()),
1944 if (rom_path.empty()) {
1945 return absl::OkStatus();
1955 if (!load_status.ok()) {
1958 absl::StrFormat(
"Could not load ROM '%s': %s. Please select a new ROM.",
1963 if (rom_path.empty()) {
1964 return absl::OkStatus();
1973 if (!session_or.ok()) {
1974 return session_or.status();
1987#ifdef YAZE_ENABLE_TESTING
1988 LOG_DEBUG(
"EditorManager",
"Setting ROM in TestManager - %p ('%s')",
2024 LOG_INFO(
"EditorManager",
"Initialized ResourceLabelProvider with project labels");
2042 return absl::OkStatus();
2069 for (
const auto& file : manager.GetRecentFiles()) {
2081 :
"untitled_project";
2085 if (file_path.empty()) {
2086 return absl::OkStatus();
2090 if (file_path.find(
".yaze") == std::string::npos) {
2091 file_path +=
".yaze";
2099 if (save_status.ok()) {
2102 manager.AddFile(file_path);
2111 absl::StrFormat(
"Failed to save project: %s", save_status.message()),
2123 return absl::OkStatus();
2128 return absl::FailedPreconditionError(
"No project is currently open");
2135 return absl::OkStatus();
2140 return absl::InvalidArgumentError(
"Invalid ROM pointer");
2149 if (session && &session->rom == rom) {
2153 return absl::OkStatus();
2159 return absl::NotFoundError(
"ROM not found in existing sessions");
2206 EditorType type,
size_t session_index)
const {
2207 const char* base_name =
kEditorNames[
static_cast<int>(type)];
2211 : std::string(base_name);
2229#ifdef YAZE_BUILD_AGENT_UI
2251 : manager_(manager),
2252 prev_rom_(manager->GetCurrentRom()),
2253 prev_editor_set_(manager->GetCurrentEditorSet()),
2254 prev_session_id_(manager->GetCurrentSessionId()) {
2261 manager_->session_coordinator_->SwitchToSession(prev_session_id_);
2311 absl::StrFormat(
"Failed to load project file: %s", status.message()),
2323 size_t session_id) {
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
static TimingManager & Get()
float Update()
Update the timing manager (call once per frame)
void SetRomContext(Rom *rom)
void SetProjectContext(project::YazeProject *project)
void SetAsarWrapperContext(core::AsarWrapper *asar_wrapper)
void Initialize(ToastManager *toast_manager, ProposalDrawer *proposal_drawer, RightPanelManager *right_panel_manager, PanelManager *panel_manager)
void SwitchToEditor(EditorType type, bool force_visible=false, bool from_dialog=false)
Switch to an editor, optionally forcing visibility.
void Initialize(const Dependencies &deps)
void JumpToDungeonRoom(int room_id)
Jump to a specific dungeon room.
void JumpToOverworldMap(int map_id)
Jump to a specific overworld map.
SessionScope(EditorManager *manager, size_t session_id)
The EditorManager controls the main editor window and manages the various editor classes.
absl::Status SaveProjectAs()
std::unique_ptr< SessionCoordinator > session_coordinator_
void OnSessionClosed(size_t index) override
Called when a session is closed.
StartupVisibility welcome_mode_override_
void InitializeTestSuites()
std::unique_ptr< GlobalEditorContext > editor_context_
absl::Status SaveRomAs(const std::string &filename)
project::YazeProject current_project_
AgentUiController agent_ui_
absl::Status LoadProjectWithRom()
MenuBuilder menu_builder_
void ConfigureSession(RomSession *session)
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_
bool HasDuplicateSession(const std::string &filepath)
absl::Status RepairCurrentProject()
std::unique_ptr< LayoutManager > layout_manager_
std::unique_ptr< DashboardPanel > dashboard_panel_
void ProcessStartupActions(const AppConfig &config)
std::string GenerateUniqueEditorTitle(EditorType type, size_t session_index) const
void DrawMenuBar()
Draw the main menu bar.
void ShowProjectManagement()
Injects dependencies into all editors within an EditorSet.
void DuplicateCurrentSession()
void Initialize(gfx::IRenderer *renderer, const std::string &filename="")
EditorRegistry editor_registry_
void ApplyStartupVisibilityOverrides()
void ResetWorkspaceLayout()
absl::Status CreateNewProject(const std::string &template_name="Basic ROM Hack")
layout_designer::LayoutDesignerWindow layout_designer_
ToastManager toast_manager_
LayoutCoordinator layout_coordinator_
absl::Status LoadAssets(uint64_t loading_handle=0)
auto GetCurrentEditorSet() const -> EditorSet *
void OnSessionRomLoaded(size_t index, RomSession *session) override
Called when a ROM is loaded into a session.
std::unique_ptr< MenuOrchestrator > menu_orchestrator_
ProjectFileEditor project_file_editor_
void ApplyLayoutPreset(const std::string &preset_name)
void ApplyStartupVisibility(const AppConfig &config)
~EditorManager() override
auto GetCurrentEditor() const -> Editor *
bool show_rom_load_options_
absl::Status SaveProject()
std::unique_ptr< RightPanelManager > right_panel_manager_
std::unique_ptr< core::VersionManager > version_manager_
StartupVisibility sidebar_mode_override_
void JumpToOverworldMap(int map_id)
void OnSessionSwitched(size_t new_index, RomSession *session) override
Called when the active session changes.
RomLoadOptionsDialog rom_load_options_dialog_
absl::Status LoadRom()
Load a ROM file into a new or existing session.
std::vector< std::function< void()> > deferred_actions_
void OpenEditorAndPanelsFromFlags(const std::string &editor_name, const std::string &panels_str)
StartupVisibility dashboard_mode_override_
void ShowProjectFileEditor()
static bool IsPanelBasedEditor(EditorType type)
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
void OnSessionCreated(size_t index, RomSession *session) override
Called when a new session is created.
void QueueDeferredAction(std::function< void()> action)
SelectionPropertiesPanel selection_properties_panel_
WindowDelegate window_delegate_
std::unique_ptr< ActivityBar > activity_bar_
ShortcutManager shortcut_manager_
void HideCurrentEditorPanels()
EditorDependencies::SharedClipboard shared_clipboard_
void SwitchToEditor(EditorType editor_type, bool force_visible=false, bool from_dialog=false)
UserSettings user_settings_
WorkspaceManager workspace_manager_
auto GetCurrentRom() const -> Rom *
ProposalDrawer proposal_drawer_
void ConfigureEditorDependencies(EditorSet *editor_set, Rom *rom, size_t session_id)
WelcomeScreen welcome_screen_
std::unique_ptr< ProjectManagementPanel > project_management_panel_
absl::Status OpenRomOrProject(const std::string &filename)
void RemoveSession(size_t index)
PanelManager panel_manager_
std::unique_ptr< PopupManager > popup_manager_
std::unique_ptr< UICoordinator > ui_coordinator_
EditorActivator editor_activator_
absl::Status SaveRom()
Save the current ROM file.
absl::Status SetCurrentRom(Rom *rom)
RomFileManager rom_file_manager_
void ResetCurrentEditorLayout()
static EditorType GetEditorTypeFromCategory(const std::string &category)
static std::vector< std::string > GetAllEditorCategories()
Get all editor categories in display order for sidebar.
static bool IsPanelBasedEditor(EditorType type)
static std::string GetEditorCategory(EditorType type)
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)
SettingsPanel * GetSettingsPanel() const
void ProcessDeferredActions()
Process all queued deferred actions.
void ResetWorkspaceLayout()
Reset the workspace layout to defaults.
void ProcessLayoutRebuild(EditorType current_editor_type, bool is_emulator_visible)
Process pending layout rebuild requests.
void ResetCurrentEditorLayout(EditorType editor_type, size_t session_id)
Reset current editor layout to its default configuration.
void ApplyLayoutPreset(const std::string &preset_name, size_t session_id)
Apply a named layout preset.
void Initialize(const Dependencies &deps)
Initialize with all dependencies.
void ToggleSidebarVisibility()
void SetUndoCallback(std::function< void()> cb)
void SetShowCommandPaletteCallback(std::function< void()> cb)
void SetOnCategorySelectedCallback(std::function< void(const std::string &)> callback)
void SetSidebarStateChangedCallback(std::function< void(bool, bool)> cb)
void SetFileBrowserPath(const std::string &category, const std::string &path)
void SetShowPanelBrowserCallback(std::function< void()> cb)
void SetShowSearchCallback(std::function< void()> cb)
const PanelDescriptor * GetPanelDescriptor(size_t session_id, const std::string &base_card_id) const
void SetCategoryChangedCallback(std::function< void(const std::string &)> cb)
bool * GetVisibilityFlag(size_t session_id, const std::string &base_card_id)
void SetOnPanelClickedCallback(std::function< void(const std::string &)> callback)
void SetShowShortcutsCallback(std::function< void()> cb)
bool ShowPanel(size_t session_id, const std::string &base_card_id)
void RegisterPanel(size_t session_id, const PanelDescriptor &base_info)
std::string GetActiveCategory() const
void EnableFileBrowser(const std::string &category, const std::string &root_path="")
void SetShowEmulatorCallback(std::function< void()> cb)
void SetPanelExpanded(bool expanded)
void SetShowSettingsCallback(std::function< void()> cb)
void DrawAllVisiblePanels()
Draw all visible EditorPanel instances (central drawing)
bool IsSidebarVisible() const
void SetRedoCallback(std::function< void()> cb)
static constexpr const char * kDashboardCategory
const std::unordered_map< std::string, PanelDescriptor > & GetAllPanelDescriptors() const
Get all panel descriptors (for layout designer, panel browser, etc.)
void SetSidebarVisible(bool visible)
void SetSaveRomCallback(std::function< void()> cb)
void SetShowHelpCallback(std::function< void()> cb)
void SetActiveCategory(const std::string &category)
void SetFileClickedCallback(std::function< void(const std::string &category, const std::string &path)> callback)
void HideAllPanelsInCategory(size_t session_id, const std::string &category)
absl::Status LoadFile(const std::string &filepath)
Load a project file into the editor.
void SetProject(project::YazeProject *project)
Set the project pointer for label import operations.
void set_active(bool active)
Set whether the editor window is active.
void SetToastManager(ToastManager *toast_manager)
Set toast manager for notifications.
absl::Status FinalizeProjectCreation(const std::string &project_name, const std::string &project_path)
Complete project creation after ROM is loaded.
absl::Status SetProjectRom(const std::string &rom_path)
Set the ROM for the current project.
absl::Status CreateNewProject(const std::string &template_name="")
absl::Status ImportProject(const std::string &project_path)
project::YazeProject & GetCurrentProject()
absl::Status LoadRom(Rom *rom, const std::string &filename)
absl::Status SaveRom(Rom *rom)
absl::Status SaveRomAs(Rom *rom, const std::string &filename)
void Open(Rom *rom, const std::string &rom_filename)
Open the dialog after ROM detection.
void SetConfirmCallback(std::function< void(const LoadOptions &)> callback)
Set callback for when options are confirmed.
void Draw(bool *p_open)
Draw the dialog (wrapper around Show)
void SetSessionInfo(size_t session_id, size_t total_sessions)
Set session information.
void SetRom(Rom *rom)
Set the current ROM for dirty status and filename display.
void SetEnabled(bool enabled)
Enable or disable the status bar.
void Initialize(GlobalEditorContext *context)
void Draw()
Draw the status bar.
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 SetOpenAgentCallback(std::function< void()> callback)
Set callback for opening AI Agent.
void SetOpenRomCallback(std::function< void()> callback)
Set callback for opening ROM.
void SetNewProjectWithTemplateCallback(std::function< void(const std::string &)> callback)
Set callback for creating project with template.
void SetOpenProjectCallback(std::function< void(const std::string &)> callback)
Set callback for opening project.
void set_panel_manager(PanelManager *manager)
void Draw()
Draw the designer window (call every frame)
bool IsOpen() const
Check if designer window is open.
void Initialize(PanelManager *panel_manager, yaze::editor::LayoutManager *layout_manager=nullptr, yaze::editor::EditorManager *editor_manager=nullptr)
Initialize the designer with manager references.
bool is_audio_focus_mode() const
void set_renderer(gfx::IRenderer *renderer)
bool is_snes_initialized() const
auto running() const -> bool
void set_panel_manager(editor::PanelManager *manager)
auto mutable_gfx_sheets()
Get mutable reference to all graphics sheets.
Defines an abstract interface for all rendering operations.
static RecentFilesManager & GetInstance()
void SetCurrentRom(Rom *rom)
static TestManager & Get()
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...
static std::string ShowOpenFolderDialog()
ShowOpenFolderDialog opens a file dialog and returns the selected folder path. Uses global feature fl...
#define ICON_MD_VIDEOGAME_ASSET
#define ICON_MD_BUG_REPORT
#define ICON_MD_AUDIOTRACK
#define ICON_MD_DASHBOARD
#define ICON_MD_SPORTS_ESPORTS
#define ICON_MD_AUDIO_FILE
#define ICON_MD_SMART_TOY
#define ICON_MD_MENU_OPEN
#define LOG_DEBUG(category, format,...)
#define LOG_WARN(category, format,...)
#define LOG_INFO(category, format,...)
#define PRINT_IF_ERROR(expression)
std::string GetEditorName(EditorType type)
std::string StripSessionPrefix(absl::string_view panel_id)
std::optional< EditorType > ParseEditorTypeFromString(absl::string_view name)
constexpr std::array< const char *, 14 > kEditorNames
void ConfigureMenuShortcuts(const ShortcutDependencies &deps, ShortcutManager *shortcut_manager)
void ConfigureEditorShortcuts(const ShortcutDependencies &deps, ShortcutManager *shortcut_manager)
void ExecuteShortcuts(const ShortcutManager &shortcut_manager)
ImVec4 GetSurfaceContainerHighestVec4()
ImVec4 GetTextSecondaryVec4()
ImVec4 GetSurfaceContainerHighVec4()
void RegisterZ3edTestSuites()
absl::Status LoadGameData(Rom &rom, GameData &data, const LoadOptions &options)
Loads all Zelda3-specific game data from a generic ROM.
absl::Status SaveAllGraphicsData(Rom &rom, const std::array< gfx::Bitmap, kNumGfxSheets > &sheets)
Saves all graphics sheets back to ROM.
void SetPreferHmagicSpriteNames(bool prefer)
absl::Status SaveDungeonMaps(Rom &rom, std::vector< DungeonMap > &dungeon_maps)
Save the dungeon maps to the ROM.
ResourceLabelProvider & GetResourceLabels()
Get the global ResourceLabelProvider instance.
#define RETURN_IF_ERROR(expr)
Configuration options for the application startup.
std::string startup_editor
StartupVisibility welcome_mode
std::vector< std::string > open_panels
StartupVisibility sidebar_mode
StartupVisibility dashboard_mode
LayoutManager * layout_manager
PanelManager * panel_manager
std::function< EditorSet *()> get_current_editor_set
std::function< void(std::function< void()>)> queue_deferred_action
ToastManager * toast_manager
RightPanelManager * right_panel_manager
UICoordinator * ui_coordinator
std::function< size_t()> get_current_session_id
Unified dependency container for all editor types.
project::YazeProject * project
ToastManager * toast_manager
SharedClipboard * shared_clipboard
gfx::IRenderer * renderer
ShortcutManager * shortcut_manager
UserSettings * user_settings
core::VersionManager * version_manager
PanelManager * panel_manager
PopupManager * popup_manager
All dependencies required by LayoutCoordinator.
PanelManager * panel_manager
ToastManager * toast_manager
UICoordinator * ui_coordinator
RightPanelManager * right_panel_manager
LayoutManager * layout_manager
bool save_overworld_items
std::string selected_preset
bool save_overworld_exits
bool enable_custom_overworld
bool save_overworld_entrances
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
PanelManager * panel_manager
bool sidebar_panel_expanded
bool show_welcome_on_startup
std::string sidebar_active_category
bool prefer_hmagic_sprite_names
float autosave_interval_secs
std::vector< std::string > recent_files
Modern project structure with comprehensive settings consolidation.
absl::Status RepairProject()
bool project_opened() const
void InitializeResourceLabelProvider()
Initialize the global ResourceLabelProvider with this project's labels.
std::unordered_map< std::string, std::unordered_map< std::string, std::string > > resource_labels
std::string assets_folder
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