223 lines
7.0 KiB
C++
223 lines
7.0 KiB
C++
#include "app/editor/code/memory_editor.h"
|
|
|
|
#include "absl/strings/str_format.h"
|
|
#include "app/gui/core/icons.h"
|
|
#include "app/gui/core/style.h"
|
|
#include "imgui/imgui.h"
|
|
|
|
namespace yaze {
|
|
namespace editor {
|
|
|
|
void MemoryEditorWithDiffChecker::DrawToolbar() {
|
|
// Modern compact toolbar with icon-only buttons
|
|
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(6, 4));
|
|
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(4, 4));
|
|
|
|
if (ImGui::Button(ICON_MD_LOCATION_SEARCHING " Jump")) {
|
|
ImGui::OpenPopup("JumpToAddress");
|
|
}
|
|
if (ImGui::IsItemHovered()) {
|
|
ImGui::SetTooltip("Jump to specific address");
|
|
}
|
|
|
|
ImGui::SameLine();
|
|
if (ImGui::Button(ICON_MD_SEARCH " Search")) {
|
|
ImGui::OpenPopup("SearchPattern");
|
|
}
|
|
if (ImGui::IsItemHovered()) {
|
|
ImGui::SetTooltip("Search for hex pattern");
|
|
}
|
|
|
|
ImGui::SameLine();
|
|
if (ImGui::Button(ICON_MD_BOOKMARK " Bookmarks")) {
|
|
ImGui::OpenPopup("Bookmarks");
|
|
}
|
|
if (ImGui::IsItemHovered()) {
|
|
ImGui::SetTooltip("Manage address bookmarks");
|
|
}
|
|
|
|
ImGui::SameLine();
|
|
ImGui::Text(ICON_MD_MORE_VERT);
|
|
ImGui::SameLine();
|
|
|
|
// Show current address
|
|
if (current_address_ != 0) {
|
|
ImGui::TextColored(ImVec4(0.4f, 0.8f, 1.0f, 1.0f),
|
|
ICON_MD_LOCATION_ON " 0x%06X", current_address_);
|
|
}
|
|
|
|
ImGui::PopStyleVar(2);
|
|
ImGui::Separator();
|
|
|
|
DrawJumpToAddressPopup();
|
|
DrawSearchPopup();
|
|
DrawBookmarksPopup();
|
|
}
|
|
|
|
void MemoryEditorWithDiffChecker::DrawJumpToAddressPopup() {
|
|
if (ImGui::BeginPopupModal("JumpToAddress", nullptr, ImGuiWindowFlags_AlwaysAutoResize)) {
|
|
ImGui::TextColored(ImVec4(0.4f, 0.8f, 1.0f, 1.0f),
|
|
ICON_MD_LOCATION_SEARCHING " Jump to Address");
|
|
ImGui::Separator();
|
|
ImGui::Spacing();
|
|
|
|
ImGui::SetNextItemWidth(200);
|
|
if (ImGui::InputText("##jump_addr", jump_address_, IM_ARRAYSIZE(jump_address_),
|
|
ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_EnterReturnsTrue)) {
|
|
// Parse and jump on Enter key
|
|
unsigned int addr;
|
|
if (sscanf(jump_address_, "%X", &addr) == 1) {
|
|
current_address_ = addr;
|
|
ImGui::CloseCurrentPopup();
|
|
}
|
|
}
|
|
ImGui::TextDisabled("Format: 0x1C800 or 1C800");
|
|
|
|
ImGui::Spacing();
|
|
ImGui::Separator();
|
|
ImGui::Spacing();
|
|
|
|
if (ImGui::Button(ICON_MD_CHECK " Go", ImVec2(120, 0))) {
|
|
unsigned int addr;
|
|
if (sscanf(jump_address_, "%X", &addr) == 1) {
|
|
current_address_ = addr;
|
|
}
|
|
ImGui::CloseCurrentPopup();
|
|
}
|
|
ImGui::SameLine();
|
|
if (ImGui::Button(ICON_MD_CANCEL " Cancel", ImVec2(120, 0))) {
|
|
ImGui::CloseCurrentPopup();
|
|
}
|
|
ImGui::EndPopup();
|
|
}
|
|
}
|
|
|
|
void MemoryEditorWithDiffChecker::DrawSearchPopup() {
|
|
if (ImGui::BeginPopupModal("SearchPattern", nullptr, ImGuiWindowFlags_AlwaysAutoResize)) {
|
|
ImGui::TextColored(ImVec4(0.4f, 0.8f, 0.4f, 1.0f),
|
|
ICON_MD_SEARCH " Search Hex Pattern");
|
|
ImGui::Separator();
|
|
ImGui::Spacing();
|
|
|
|
ImGui::SetNextItemWidth(300);
|
|
if (ImGui::InputText("##search_pattern", search_pattern_, IM_ARRAYSIZE(search_pattern_),
|
|
ImGuiInputTextFlags_EnterReturnsTrue)) {
|
|
// TODO: Implement search
|
|
ImGui::CloseCurrentPopup();
|
|
}
|
|
ImGui::TextDisabled("Use ?? for wildcard (e.g. FF 00 ?? 12)");
|
|
ImGui::Spacing();
|
|
|
|
// Quick preset patterns
|
|
ImGui::Text(ICON_MD_LIST " Quick Patterns:");
|
|
if (ImGui::SmallButton("LDA")) {
|
|
snprintf(search_pattern_, sizeof(search_pattern_), "A9 ??");
|
|
}
|
|
ImGui::SameLine();
|
|
if (ImGui::SmallButton("STA")) {
|
|
snprintf(search_pattern_, sizeof(search_pattern_), "8D ?? ??");
|
|
}
|
|
ImGui::SameLine();
|
|
if (ImGui::SmallButton("JSR")) {
|
|
snprintf(search_pattern_, sizeof(search_pattern_), "20 ?? ??");
|
|
}
|
|
|
|
ImGui::Spacing();
|
|
ImGui::Separator();
|
|
ImGui::Spacing();
|
|
|
|
if (ImGui::Button(ICON_MD_SEARCH " Search", ImVec2(120, 0))) {
|
|
// TODO: Implement search using hex-search handler
|
|
ImGui::CloseCurrentPopup();
|
|
}
|
|
ImGui::SameLine();
|
|
if (ImGui::Button(ICON_MD_CANCEL " Cancel", ImVec2(120, 0))) {
|
|
ImGui::CloseCurrentPopup();
|
|
}
|
|
ImGui::EndPopup();
|
|
}
|
|
}
|
|
|
|
void MemoryEditorWithDiffChecker::DrawBookmarksPopup() {
|
|
if (ImGui::BeginPopupModal("Bookmarks", nullptr, ImGuiWindowFlags_AlwaysAutoResize)) {
|
|
ImGui::TextColored(ImVec4(1.0f, 0.843f, 0.0f, 1.0f),
|
|
ICON_MD_BOOKMARK " Memory Bookmarks");
|
|
ImGui::Separator();
|
|
ImGui::Spacing();
|
|
|
|
if (bookmarks_.empty()) {
|
|
ImGui::TextDisabled(ICON_MD_INFO " No bookmarks yet");
|
|
ImGui::Spacing();
|
|
ImGui::Separator();
|
|
ImGui::Spacing();
|
|
|
|
if (ImGui::Button(ICON_MD_ADD " Add Current Address", ImVec2(250, 0))) {
|
|
Bookmark new_bookmark;
|
|
new_bookmark.address = current_address_;
|
|
new_bookmark.name = absl::StrFormat("Bookmark %zu", bookmarks_.size() + 1);
|
|
new_bookmark.description = "User-defined bookmark";
|
|
bookmarks_.push_back(new_bookmark);
|
|
}
|
|
} else {
|
|
// Bookmarks table
|
|
ImGui::BeginChild("##bookmarks_list", ImVec2(500, 300), true);
|
|
if (ImGui::BeginTable("##bookmarks_table", 3,
|
|
ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg |
|
|
ImGuiTableFlags_Resizable)) {
|
|
ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed, 150);
|
|
ImGui::TableSetupColumn("Address", ImGuiTableColumnFlags_WidthFixed, 100);
|
|
ImGui::TableSetupColumn("Description", ImGuiTableColumnFlags_WidthStretch);
|
|
ImGui::TableHeadersRow();
|
|
|
|
for (size_t i = 0; i < bookmarks_.size(); ++i) {
|
|
const auto& bm = bookmarks_[i];
|
|
ImGui::PushID(static_cast<int>(i));
|
|
|
|
ImGui::TableNextRow();
|
|
ImGui::TableNextColumn();
|
|
if (ImGui::Selectable(bm.name.c_str(), false, ImGuiSelectableFlags_SpanAllColumns)) {
|
|
current_address_ = bm.address;
|
|
ImGui::CloseCurrentPopup();
|
|
}
|
|
|
|
ImGui::TableNextColumn();
|
|
ImGui::TextColored(ImVec4(0.4f, 0.8f, 1.0f, 1.0f), "0x%06X", bm.address);
|
|
|
|
ImGui::TableNextColumn();
|
|
ImGui::TextDisabled("%s", bm.description.c_str());
|
|
|
|
ImGui::PopID();
|
|
}
|
|
ImGui::EndTable();
|
|
}
|
|
ImGui::EndChild();
|
|
|
|
ImGui::Spacing();
|
|
if (ImGui::Button(ICON_MD_ADD " Add Bookmark", ImVec2(150, 0))) {
|
|
Bookmark new_bookmark;
|
|
new_bookmark.address = current_address_;
|
|
new_bookmark.name = absl::StrFormat("Bookmark %zu", bookmarks_.size() + 1);
|
|
new_bookmark.description = "User-defined bookmark";
|
|
bookmarks_.push_back(new_bookmark);
|
|
}
|
|
ImGui::SameLine();
|
|
if (ImGui::Button(ICON_MD_CLEAR_ALL " Clear All", ImVec2(150, 0))) {
|
|
bookmarks_.clear();
|
|
}
|
|
}
|
|
|
|
ImGui::Spacing();
|
|
ImGui::Separator();
|
|
ImGui::Spacing();
|
|
|
|
if (ImGui::Button(ICON_MD_CLOSE " Close", ImVec2(250, 0))) {
|
|
ImGui::CloseCurrentPopup();
|
|
}
|
|
|
|
ImGui::EndPopup();
|
|
}
|
|
}
|
|
|
|
} // namespace editor
|
|
} // namespace yaze
|