ImHex/source/views/view_patches.cpp

94 lines
3.6 KiB
C++
Raw Normal View History

2020-11-29 01:06:41 +00:00
#include "views/view_patches.hpp"
#include <hex/providers/provider.hpp>
2020-11-29 01:06:41 +00:00
#include <hex/helpers/utils.hpp>
2020-11-29 23:03:12 +00:00
#include "helpers/project_file_handler.hpp"
2020-11-29 01:06:41 +00:00
#include <string>
using namespace std::literals::string_literals;
namespace hex {
ViewPatches::ViewPatches() : View("hex.view.patches.title"_lang) {
2021-01-21 09:53:12 +00:00
View::subscribeEvent(Events::ProjectFileStore, [](auto) {
auto provider = SharedData::currentProvider;
if (provider != nullptr)
ProjectFile::setPatches(provider->getPatches());
2020-11-29 23:03:12 +00:00
});
2021-01-21 09:53:12 +00:00
View::subscribeEvent(Events::ProjectFileLoad, [](auto) {
auto provider = SharedData::currentProvider;
if (provider != nullptr)
provider->getPatches() = ProjectFile::getPatches();
2020-11-29 23:03:12 +00:00
});
2020-11-29 01:06:41 +00:00
}
ViewPatches::~ViewPatches() {
2020-11-29 23:03:12 +00:00
View::unsubscribeEvent(Events::ProjectFileStore);
View::unsubscribeEvent(Events::ProjectFileLoad);
2020-11-29 01:06:41 +00:00
}
void ViewPatches::drawContent() {
if (ImGui::Begin("hex.view.patches.title"_lang, &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) {
auto provider = SharedData::currentProvider;
2020-11-29 01:06:41 +00:00
if (provider != nullptr && provider->isReadable()) {
2020-11-29 01:06:41 +00:00
if (ImGui::BeginTable("##patchesTable", 3, ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_Sortable |
ImGuiTableFlags_Reorderable | ImGuiTableFlags_RowBg | ImGuiTableFlags_ScrollY)) {
ImGui::TableSetupScrollFreeze(0, 1);
ImGui::TableSetupColumn("hex.view.patches.offset"_lang);
ImGui::TableSetupColumn("hex.view.patches.orig"_lang);
ImGui::TableSetupColumn("hex.view.patches.patch"_lang);
2020-11-29 01:06:41 +00:00
ImGui::TableHeadersRow();
auto& patches = provider->getPatches();
2020-11-29 01:06:41 +00:00
u32 index = 0;
for (const auto &[address, patch] : patches) {
ImGui::TableNextRow();
ImGui::TableNextColumn();
if (ImGui::Selectable(("##patchLine" + std::to_string(index)).c_str(), false, ImGuiSelectableFlags_SpanAllColumns)) {
Region selectRegion = { address, 1 };
2021-01-21 09:53:12 +00:00
View::postEvent(Events::SelectionChangeRequest, selectRegion);
2020-11-29 01:06:41 +00:00
}
if (ImGui::IsMouseReleased(1) && ImGui::IsItemHovered()) {
ImGui::OpenPopup("PatchContextMenu");
this->m_selectedPatch = address;
}
ImGui::SameLine();
ImGui::Text("0x%08lX", address);
ImGui::TableNextColumn();
u8 previousValue = 0x00;
provider->readRaw(address, &previousValue, sizeof(u8));
2020-11-29 01:06:41 +00:00
ImGui::Text("0x%02X", previousValue);
ImGui::TableNextColumn();
ImGui::Text("0x%02X", patch);
index += 1;
}
if (ImGui::BeginPopup("PatchContextMenu")) {
if (ImGui::MenuItem("hex.view.patches.remove"_lang)) {
2020-11-29 01:06:41 +00:00
patches.erase(this->m_selectedPatch);
2020-11-29 23:03:12 +00:00
ProjectFile::markDirty();
2020-11-29 01:06:41 +00:00
}
ImGui::EndPopup();
}
ImGui::EndTable();
}
}
}
ImGui::End();
}
void ViewPatches::drawMenu() {
2020-11-29 01:06:41 +00:00
}
}