b751f98e91
* ui/ux: Initial recreation of the hex editor view * ui/ux: Added back support for editing cells * ux: Make scrolling and selecting bytes feel nice again * ui/ux: Improved byte selecting, added footer * sys: Make math evaluator more generic to support integer only calculations * patterns: Moved value formatting into pattern language * ui/ux: Added Goto and Search popups, improved selection * ui: Added better tooltips for bookmarks and patterns * sys: Use worse hex search algorithm on macOS Sadly it still doesn't support `std::boyer_moore_horsepool_searcher` * ui: Added back missing events, menu items and shortcuts * fix: Bookmark highlighting being rendered off by one * fix: Various macOS build errors * fix: size_t is not u64 on macos * fix: std::fmod and std::pow not working with integer types on macos * fix: Missing semicolons * sys: Added proper integer pow function * ui: Added back support for custom encodings * fix: Editor not jumping to selection when selection gets changed * ui: Turn Hexii setting into a data visualizer * sys: Added back remaining shortcuts * sys: Remove old hex editor files * sys: Moved more legacy things away from the hex editor view, updated localization * fix: Hex editor scrolling behaving weirdly and inconsistently * sys: Cleaned up Hex editor code * sys: Added selection color setting, localized all new settings * fix: Search feature not working correctly * ui: Replace custom ImGui::Disabled function with native ImGui ones * ui: Fix bookmark tooltip rendering issues * fix: Another size_t not being 64 bit issue on MacOS
134 lines
4.1 KiB
C++
134 lines
4.1 KiB
C++
#pragma once
|
|
|
|
#include <hex.hpp>
|
|
|
|
#include <list>
|
|
#include <map>
|
|
#include <string_view>
|
|
#include <functional>
|
|
|
|
#include <hex/api/imhex_api.hpp>
|
|
#include <hex/helpers/fs.hpp>
|
|
|
|
#define EVENT_DEF(event_name, ...) \
|
|
struct event_name final : public hex::Event<__VA_ARGS__> { \
|
|
constexpr static auto id = [] { return hex::EventId(); }(); \
|
|
explicit event_name(Callback func) noexcept : Event(std::move(func)) { } \
|
|
}
|
|
|
|
struct GLFWwindow;
|
|
|
|
namespace pl {
|
|
class Pattern;
|
|
}
|
|
|
|
namespace hex {
|
|
|
|
class EventId {
|
|
public:
|
|
explicit constexpr EventId(const char *func = __builtin_FUNCTION(), u32 line = __builtin_LINE()) {
|
|
this->m_hash = line ^ 123456789;
|
|
for (auto c : std::string_view(func)) {
|
|
this->m_hash = (this->m_hash >> 5) | (this->m_hash << 27);
|
|
this->m_hash ^= c;
|
|
}
|
|
}
|
|
|
|
constexpr bool operator==(const EventId &rhs) const = default;
|
|
|
|
private:
|
|
u32 m_hash;
|
|
};
|
|
|
|
struct EventBase {
|
|
EventBase() noexcept = default;
|
|
};
|
|
|
|
template<typename... Params>
|
|
struct Event : public EventBase {
|
|
using Callback = std::function<void(Params...)>;
|
|
|
|
explicit Event(Callback func) noexcept : m_func(std::move(func)) { }
|
|
|
|
void operator()(Params... params) const noexcept {
|
|
this->m_func(params...);
|
|
}
|
|
|
|
private:
|
|
Callback m_func;
|
|
};
|
|
|
|
class EventManager {
|
|
public:
|
|
using EventList = std::list<std::pair<EventId, EventBase *>>;
|
|
|
|
template<typename E>
|
|
static EventList::iterator subscribe(typename E::Callback function) {
|
|
return s_events.insert(s_events.end(), std::make_pair(E::id, new E(function)));
|
|
}
|
|
|
|
template<typename E>
|
|
static void subscribe(void *token, typename E::Callback function) {
|
|
s_tokenStore.insert(std::make_pair(token, subscribe<E>(function)));
|
|
}
|
|
|
|
static void unsubscribe(EventList::iterator iter) noexcept {
|
|
s_events.remove(*iter);
|
|
}
|
|
|
|
template<typename E>
|
|
static void unsubscribe(void *token) noexcept {
|
|
auto iter = std::find_if(s_tokenStore.begin(), s_tokenStore.end(), [&](auto &item) {
|
|
return item.first == token && item.second->first == E::id;
|
|
});
|
|
|
|
if (iter != s_tokenStore.end()) {
|
|
s_events.remove(*iter->second);
|
|
}
|
|
}
|
|
|
|
template<typename E>
|
|
static void post(auto &&...args) noexcept {
|
|
for (const auto &[id, event] : s_events) {
|
|
if (id == E::id)
|
|
(*static_cast<E *const>(event))(std::forward<decltype(args)>(args)...);
|
|
}
|
|
}
|
|
|
|
private:
|
|
static std::map<void *, EventList::iterator> s_tokenStore;
|
|
static EventList s_events;
|
|
};
|
|
|
|
/* Default Events */
|
|
EVENT_DEF(EventFileLoaded, std::fs::path);
|
|
EVENT_DEF(EventFileUnloaded);
|
|
EVENT_DEF(EventDataChanged);
|
|
EVENT_DEF(EventHighlightingChanged);
|
|
EVENT_DEF(EventWindowClosing, GLFWwindow *);
|
|
EVENT_DEF(EventRegionSelected, Region);
|
|
EVENT_DEF(EventProjectFileStore);
|
|
EVENT_DEF(EventProjectFileLoad);
|
|
EVENT_DEF(EventSettingsChanged);
|
|
EVENT_DEF(EventAbnormalTermination, int);
|
|
EVENT_DEF(EventOSThemeChanged);
|
|
EVENT_DEF(EventProviderCreated, prv::Provider *);
|
|
EVENT_DEF(EventProviderChanged, prv::Provider *, prv::Provider *);
|
|
EVENT_DEF(EventFrameBegin);
|
|
EVENT_DEF(EventFrameEnd);
|
|
EVENT_DEF(EventWindowInitialized);
|
|
|
|
EVENT_DEF(RequestOpenWindow, std::string);
|
|
EVENT_DEF(RequestSelectionChange, Region);
|
|
EVENT_DEF(RequestAddBookmark, Region, std::string, std::string, color_t);
|
|
EVENT_DEF(RequestSetPatternLanguageCode, std::string);
|
|
EVENT_DEF(RequestChangeWindowTitle, std::string);
|
|
EVENT_DEF(RequestCloseImHex, bool);
|
|
EVENT_DEF(RequestOpenFile, std::fs::path);
|
|
EVENT_DEF(RequestChangeTheme, u32);
|
|
EVENT_DEF(RequestOpenPopup, std::string);
|
|
EVENT_DEF(RequestCreateProvider, std::string, hex::prv::Provider **);
|
|
|
|
EVENT_DEF(QuerySelection, std::optional<Region> &);
|
|
|
|
} |