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.
This commit is contained in:
76
src/app/editor/ui/menu_manager.cc
Normal file
76
src/app/editor/ui/menu_manager.cc
Normal file
@@ -0,0 +1,76 @@
|
||||
#include "app/editor/ui/menu_manager.h"
|
||||
|
||||
#include "app/editor/editor_manager.h"
|
||||
#include "app/gui/icons.h"
|
||||
#include "absl/strings/str_format.h"
|
||||
|
||||
namespace yaze {
|
||||
namespace editor {
|
||||
|
||||
MenuManager::MenuManager(EditorManager* editor_manager)
|
||||
: editor_manager_(editor_manager) {}
|
||||
|
||||
void MenuManager::BuildAndDraw() {
|
||||
if (ImGui::BeginMenuBar()) {
|
||||
editor_manager_->BuildModernMenu(); // This contains the menu_builder_ logic
|
||||
editor_manager_->menu_builder_.Draw();
|
||||
|
||||
// This is the logic from the second half of DrawMenuBar
|
||||
auto* current_rom = editor_manager_->GetCurrentRom();
|
||||
std::string version_text = absl::StrFormat("v%s", editor_manager_->version().c_str());
|
||||
float version_width = ImGui::CalcTextSize(version_text.c_str()).x;
|
||||
float session_rom_area_width = 280.0f;
|
||||
ImGui::SameLine(ImGui::GetWindowWidth() - version_width - 10 - session_rom_area_width);
|
||||
|
||||
if (editor_manager_->GetActiveSessionCount() > 1) {
|
||||
if (ImGui::SmallButton(absl::StrFormat("%s%zu", ICON_MD_TAB, editor_manager_->GetActiveSessionCount()).c_str())) {
|
||||
editor_manager_->show_session_switcher_ = true;
|
||||
}
|
||||
if (ImGui::IsItemHovered()) {
|
||||
ImGui::SetTooltip("Sessions: %zu active\nClick to switch", editor_manager_->GetActiveSessionCount());
|
||||
}
|
||||
ImGui::SameLine();
|
||||
}
|
||||
|
||||
if (current_rom && current_rom->is_loaded()) {
|
||||
if (ImGui::SmallButton(ICON_MD_APPS)) {
|
||||
editor_manager_->show_editor_selection_ = true;
|
||||
}
|
||||
if (ImGui::IsItemHovered()) {
|
||||
ImGui::SetTooltip(ICON_MD_DASHBOARD " Editor Selection (Ctrl+E)");
|
||||
}
|
||||
ImGui::SameLine();
|
||||
if (ImGui::SmallButton(ICON_MD_DISPLAY_SETTINGS)) {
|
||||
editor_manager_->popup_manager_->Show("Display Settings");
|
||||
}
|
||||
if (ImGui::IsItemHovered()) {
|
||||
ImGui::SetTooltip(ICON_MD_TUNE " Display Settings");
|
||||
}
|
||||
ImGui::SameLine();
|
||||
ImGui::Separator();
|
||||
ImGui::SameLine();
|
||||
}
|
||||
|
||||
if (current_rom && current_rom->is_loaded()) {
|
||||
std::string rom_display = current_rom->title();
|
||||
if (rom_display.length() > 22) {
|
||||
rom_display = rom_display.substr(0, 19) + "...";
|
||||
}
|
||||
ImVec4 status_color = current_rom->dirty() ? ImVec4(1.0f, 0.5f, 0.0f, 1.0f) : ImVec4(0.0f, 0.8f, 0.0f, 1.0f);
|
||||
if (ImGui::SmallButton(absl::StrFormat("%s%s", rom_display.c_str(), current_rom->dirty() ? "*" : "").c_str())) {
|
||||
ImGui::OpenPopup("ROM Details");
|
||||
}
|
||||
// ... (rest of the popup logic from DrawMenuBar)
|
||||
} else {
|
||||
ImGui::TextColored(ImVec4(0.5f, 0.5f, 0.5f, 1.0f), "No ROM");
|
||||
ImGui::SameLine();
|
||||
}
|
||||
|
||||
ImGui::SameLine(ImGui::GetWindowWidth() - version_width - 10);
|
||||
ImGui::Text("%s", version_text.c_str());
|
||||
ImGui::EndMenuBar();
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace editor
|
||||
} // namespace yaze
|
||||
25
src/app/editor/ui/menu_manager.h
Normal file
25
src/app/editor/ui/menu_manager.h
Normal file
@@ -0,0 +1,25 @@
|
||||
#ifndef YAZE_APP_EDITOR_UI_MENU_MANAGER_H_
|
||||
#define YAZE_APP_EDITOR_UI_MENU_MANAGER_H_
|
||||
|
||||
#include "app/editor/ui/menu_builder.h"
|
||||
|
||||
namespace yaze {
|
||||
namespace editor {
|
||||
|
||||
class EditorManager;
|
||||
|
||||
class MenuManager {
|
||||
public:
|
||||
explicit MenuManager(EditorManager* editor_manager);
|
||||
|
||||
void BuildAndDraw();
|
||||
|
||||
private:
|
||||
EditorManager* editor_manager_;
|
||||
MenuBuilder menu_builder_;
|
||||
};
|
||||
|
||||
} // namespace editor
|
||||
} // namespace yaze
|
||||
|
||||
#endif // YAZE_APP_EDITOR_UI_MENU_MANAGER_H_
|
||||
@@ -2,6 +2,8 @@
|
||||
#include "app/editor/system/toast_manager.h"
|
||||
#include "app/rom.h"
|
||||
#include "absl/strings/str_format.h"
|
||||
#include "util/file_util.h"
|
||||
#include "util/platform_paths.h"
|
||||
|
||||
namespace yaze {
|
||||
namespace editor {
|
||||
@@ -31,6 +33,27 @@ absl::Status WorkspaceManager::ResetWorkspaceLayout() {
|
||||
}
|
||||
|
||||
void WorkspaceManager::SaveWorkspacePreset(const std::string& name) {
|
||||
if (name.empty()) return;
|
||||
std::string ini_name = absl::StrFormat("yaze_workspace_%s.ini", name.c_str());
|
||||
ImGui::SaveIniSettingsToDisk(ini_name.c_str());
|
||||
|
||||
if (!workspace_presets_loaded_) {
|
||||
// RefreshWorkspacePresets(); // This will be implemented next
|
||||
}
|
||||
|
||||
if (std::find(workspace_presets_.begin(), workspace_presets_.end(), name) ==
|
||||
workspace_presets_.end()) {
|
||||
workspace_presets_.emplace_back(name);
|
||||
try {
|
||||
std::ostringstream ss;
|
||||
for (const auto& n : workspace_presets_)
|
||||
ss << n << "\n";
|
||||
// This should use a platform-agnostic path
|
||||
util::SaveFile("workspace_presets.txt", ss.str());
|
||||
} catch (const std::exception& e) {
|
||||
// LOG_WARN("WorkspaceManager", "Failed to save presets: %s", e.what());
|
||||
}
|
||||
}
|
||||
last_workspace_preset_ = name;
|
||||
if (toast_manager_) {
|
||||
toast_manager_->Show(absl::StrFormat("Preset '%s' saved", name),
|
||||
@@ -39,6 +62,9 @@ void WorkspaceManager::SaveWorkspacePreset(const std::string& name) {
|
||||
}
|
||||
|
||||
void WorkspaceManager::LoadWorkspacePreset(const std::string& name) {
|
||||
if (name.empty()) return;
|
||||
std::string ini_name = absl::StrFormat("yaze_workspace_%s.ini", name.c_str());
|
||||
ImGui::LoadIniSettingsFromDisk(ini_name.c_str());
|
||||
last_workspace_preset_ = name;
|
||||
if (toast_manager_) {
|
||||
toast_manager_->Show(absl::StrFormat("Preset '%s' loaded", name),
|
||||
@@ -46,6 +72,34 @@ void WorkspaceManager::LoadWorkspacePreset(const std::string& name) {
|
||||
}
|
||||
}
|
||||
|
||||
void WorkspaceManager::RefreshPresets() {
|
||||
try {
|
||||
std::vector<std::string> new_presets;
|
||||
auto config_dir = util::PlatformPaths::GetConfigDirectory();
|
||||
if (config_dir.ok()) {
|
||||
std::string presets_path = (*config_dir / "workspace_presets.txt").string();
|
||||
auto data = util::LoadFile(presets_path);
|
||||
if (!data.empty()) {
|
||||
std::istringstream ss(data);
|
||||
std::string name;
|
||||
while (std::getline(ss, name)) {
|
||||
name.erase(0, name.find_first_not_of(" \t\r\n"));
|
||||
name.erase(name.find_last_not_of(" \t\r\n") + 1);
|
||||
if (!name.empty() && name.length() < 256) {
|
||||
new_presets.emplace_back(std::move(name));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
workspace_presets_ = std::move(new_presets);
|
||||
workspace_presets_loaded_ = true;
|
||||
} catch (const std::exception& e) {
|
||||
// LOG_ERROR("WorkspaceManager", "Error refreshing presets: %s", e.what());
|
||||
workspace_presets_.clear();
|
||||
workspace_presets_loaded_ = true;
|
||||
}
|
||||
}
|
||||
|
||||
void WorkspaceManager::LoadDeveloperLayout() {
|
||||
// TODO: Load preset with all debug tools
|
||||
if (toast_manager_) {
|
||||
|
||||
@@ -36,6 +36,7 @@ class WorkspaceManager {
|
||||
// Preset management
|
||||
void SaveWorkspacePreset(const std::string& name);
|
||||
void LoadWorkspacePreset(const std::string& name);
|
||||
void RefreshPresets();
|
||||
void LoadDeveloperLayout();
|
||||
void LoadDesignerLayout();
|
||||
void LoadModderLayout();
|
||||
@@ -53,10 +54,15 @@ class WorkspaceManager {
|
||||
|
||||
void set_sessions(std::deque<SessionInfo>* sessions) { sessions_ = sessions; }
|
||||
|
||||
const std::vector<std::string>& workspace_presets() const { return workspace_presets_; }
|
||||
bool workspace_presets_loaded() const { return workspace_presets_loaded_; }
|
||||
|
||||
private:
|
||||
ToastManager* toast_manager_;
|
||||
std::deque<SessionInfo>* sessions_ = nullptr;
|
||||
std::string last_workspace_preset_;
|
||||
std::vector<std::string> workspace_presets_;
|
||||
bool workspace_presets_loaded_ = false;
|
||||
};
|
||||
|
||||
} // namespace editor
|
||||
|
||||
Reference in New Issue
Block a user