Added simple bookmarks / comments feature. No saving yet though
This commit is contained in:
parent
3827919a32
commit
985e924e9d
@ -4,7 +4,6 @@ project(HexEditor)
|
|||||||
set(CMAKE_CXX_STANDARD 20)
|
set(CMAKE_CXX_STANDARD 20)
|
||||||
|
|
||||||
find_package(PkgConfig REQUIRED)
|
find_package(PkgConfig REQUIRED)
|
||||||
pkg_search_module(CRYPTO REQUIRED crypto)
|
|
||||||
pkg_search_module(GLFW REQUIRED glfw3)
|
pkg_search_module(GLFW REQUIRED glfw3)
|
||||||
pkg_search_module(GLM REQUIRED glm)
|
pkg_search_module(GLM REQUIRED glm)
|
||||||
pkg_search_module(CRYPTO REQUIRED libcrypto)
|
pkg_search_module(CRYPTO REQUIRED libcrypto)
|
||||||
@ -50,6 +49,7 @@ add_executable(ImHex
|
|||||||
source/views/view_strings.cpp
|
source/views/view_strings.cpp
|
||||||
source/views/view_data_inspector.cpp
|
source/views/view_data_inspector.cpp
|
||||||
source/views/view_disassembler.cpp
|
source/views/view_disassembler.cpp
|
||||||
|
source/views/view_bookmarks.cpp
|
||||||
|
|
||||||
libs/glad/source/glad.c
|
libs/glad/source/glad.c
|
||||||
|
|
||||||
|
@ -12,7 +12,9 @@ namespace hex {
|
|||||||
FileDropped,
|
FileDropped,
|
||||||
ByteSelected,
|
ByteSelected,
|
||||||
|
|
||||||
SelectionChangeRequest
|
SelectionChangeRequest,
|
||||||
|
|
||||||
|
AddBookmark
|
||||||
};
|
};
|
||||||
|
|
||||||
struct EventHandler {
|
struct EventHandler {
|
||||||
|
35
include/views/view_bookmarks.hpp
Normal file
35
include/views/view_bookmarks.hpp
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "views/view.hpp"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <list>
|
||||||
|
|
||||||
|
#include "utils.hpp"
|
||||||
|
|
||||||
|
namespace hex {
|
||||||
|
|
||||||
|
namespace prv { class Provider; }
|
||||||
|
|
||||||
|
struct Bookmark {
|
||||||
|
Region region;
|
||||||
|
|
||||||
|
std::vector<char> name;
|
||||||
|
std::vector<char> comment;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ViewBookmarks : public View {
|
||||||
|
public:
|
||||||
|
explicit ViewBookmarks(prv::Provider* &dataProvider);
|
||||||
|
~ViewBookmarks() override;
|
||||||
|
|
||||||
|
void createView() override;
|
||||||
|
void createMenu() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
prv::Provider* &m_dataProvider;
|
||||||
|
|
||||||
|
std::list<Bookmark> m_bookmarks;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
@ -11,6 +11,7 @@
|
|||||||
#include "views/view_strings.hpp"
|
#include "views/view_strings.hpp"
|
||||||
#include "views/view_data_inspector.hpp"
|
#include "views/view_data_inspector.hpp"
|
||||||
#include "views/view_disassembler.hpp"
|
#include "views/view_disassembler.hpp"
|
||||||
|
#include "views/view_bookmarks.hpp"
|
||||||
|
|
||||||
#include "providers/provider.hpp"
|
#include "providers/provider.hpp"
|
||||||
|
|
||||||
@ -22,6 +23,7 @@ int main() {
|
|||||||
// Shared Data
|
// Shared Data
|
||||||
std::vector<hex::lang::PatternData*> patternData;
|
std::vector<hex::lang::PatternData*> patternData;
|
||||||
hex::prv::Provider *dataProvider = nullptr;
|
hex::prv::Provider *dataProvider = nullptr;
|
||||||
|
|
||||||
// Create views
|
// Create views
|
||||||
window.addView<hex::ViewHexEditor>(dataProvider, patternData);
|
window.addView<hex::ViewHexEditor>(dataProvider, patternData);
|
||||||
window.addView<hex::ViewPattern>(dataProvider, patternData);
|
window.addView<hex::ViewPattern>(dataProvider, patternData);
|
||||||
@ -31,6 +33,7 @@ int main() {
|
|||||||
window.addView<hex::ViewInformation>(dataProvider);
|
window.addView<hex::ViewInformation>(dataProvider);
|
||||||
window.addView<hex::ViewStrings>(dataProvider);
|
window.addView<hex::ViewStrings>(dataProvider);
|
||||||
window.addView<hex::ViewDisassembler>(dataProvider);
|
window.addView<hex::ViewDisassembler>(dataProvider);
|
||||||
|
window.addView<hex::ViewBookmarks>(dataProvider);
|
||||||
window.addView<hex::ViewTools>();
|
window.addView<hex::ViewTools>();
|
||||||
window.addView<hex::ViewHelp>();
|
window.addView<hex::ViewHelp>();
|
||||||
|
|
||||||
|
99
source/views/view_bookmarks.cpp
Normal file
99
source/views/view_bookmarks.cpp
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
#include "views/view_bookmarks.hpp"
|
||||||
|
|
||||||
|
#include "providers/provider.hpp"
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
namespace hex {
|
||||||
|
|
||||||
|
ViewBookmarks::ViewBookmarks(prv::Provider* &dataProvider) : View("Bookmarks"), m_dataProvider(dataProvider) {
|
||||||
|
View::subscribeEvent(Events::AddBookmark, [this](const void *userData) {
|
||||||
|
Bookmark bookmark;
|
||||||
|
bookmark.region = *reinterpret_cast<const Region*>(userData);
|
||||||
|
bookmark.name.resize(64);
|
||||||
|
bookmark.comment.resize(0xF'FFFF);
|
||||||
|
|
||||||
|
std::memset(bookmark.name.data(), 0x00, 64);
|
||||||
|
std::memset(bookmark.comment.data(), 0x00, 0xF'FFFF);
|
||||||
|
|
||||||
|
std::strcpy(bookmark.name.data(), ("Bookmark " + std::to_string(this->m_bookmarks.size() + 1)).c_str());
|
||||||
|
|
||||||
|
this->m_bookmarks.push_back(bookmark);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
ViewBookmarks::~ViewBookmarks() {
|
||||||
|
View::unsubscribeEvent(Events::AddBookmark);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ViewBookmarks::createView() {
|
||||||
|
if (ImGui::Begin("Bookmarks", &this->getWindowOpenState())) {
|
||||||
|
if (ImGui::BeginChild("##scrolling")) {
|
||||||
|
|
||||||
|
u32 id = 1;
|
||||||
|
std::list<Bookmark>::const_iterator bookmarkToRemove = this->m_bookmarks.end();
|
||||||
|
for (auto iter = this->m_bookmarks.begin(); iter != this->m_bookmarks.end(); iter++) {
|
||||||
|
auto &[region, name, comment] = *iter;
|
||||||
|
|
||||||
|
if (ImGui::CollapsingHeader((std::string(name.data()) + "###" + std::to_string((u64)comment.data())).c_str())) {
|
||||||
|
ImGui::TextUnformatted("Information");
|
||||||
|
ImGui::Separator();
|
||||||
|
ImGui::Text("0x%08lx : 0x%08lx (%lu bytes)", region.address, region.address + region.size - 1, region.size);
|
||||||
|
|
||||||
|
{
|
||||||
|
u8 bytes[10] = { 0 };
|
||||||
|
this->m_dataProvider->read(region.address, bytes, std::min(region.size, size_t(10)));
|
||||||
|
|
||||||
|
std::string bytesString;
|
||||||
|
for (u8 i = 0; i < std::min(region.size, size_t(10)); i++) {
|
||||||
|
bytesString += hex::format("%02X ", bytes[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (region.size > 10) {
|
||||||
|
bytesString.pop_back();
|
||||||
|
bytesString += "...";
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::TextColored(ImColor(0xFF9BC64D), bytesString.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ImGui::Button("Jump to"))
|
||||||
|
View::postEvent(Events::SelectionChangeRequest, ®ion);
|
||||||
|
|
||||||
|
ImGui::SameLine(0, 15);
|
||||||
|
|
||||||
|
if (ImGui::Button("Remove"))
|
||||||
|
bookmarkToRemove = iter;
|
||||||
|
|
||||||
|
ImGui::NewLine();
|
||||||
|
ImGui::TextUnformatted("Name");
|
||||||
|
ImGui::Separator();
|
||||||
|
ImGui::PushID(id);
|
||||||
|
ImGui::InputText("##nolabel", name.data(), 64);
|
||||||
|
ImGui::PopID();
|
||||||
|
ImGui::NewLine();
|
||||||
|
ImGui::TextUnformatted("Comment");
|
||||||
|
ImGui::Separator();
|
||||||
|
ImGui::PushID(id + 1);
|
||||||
|
ImGui::InputTextMultiline("##nolabel", comment.data(), 0xF'FFFF);
|
||||||
|
ImGui::PopID();
|
||||||
|
ImGui::NewLine();
|
||||||
|
|
||||||
|
id += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bookmarkToRemove != this->m_bookmarks.end())
|
||||||
|
this->m_bookmarks.erase(bookmarkToRemove);
|
||||||
|
|
||||||
|
ImGui::EndChild();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ImGui::End();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ViewBookmarks::createMenu() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -264,6 +264,13 @@ namespace hex {
|
|||||||
ImGui::EndMenu();
|
ImGui::EndMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ImGui::MenuItem("Create bookmark", nullptr, false, this->m_memoryEditor.DataPreviewAddr != -1 && this->m_memoryEditor.DataPreviewAddrEnd != -1)) {
|
||||||
|
size_t start = std::min(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
|
||||||
|
size_t end = std::max(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
|
||||||
|
Region selectionRegion = { start, end - start + 1 };
|
||||||
|
|
||||||
|
View::postEvent(Events::AddBookmark, &selectionRegion);
|
||||||
|
}
|
||||||
|
|
||||||
ImGui::EndMenu();
|
ImGui::EndMenu();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user