Added event system and make use of it for data invalidation

This commit is contained in:
WerWolv
2020-11-12 09:38:52 +01:00
parent e3df658b4a
commit 3a6d19eca4
13 changed files with 355 additions and 179 deletions

45
include/event.hpp Normal file
View File

@@ -0,0 +1,45 @@
#pragma once
#include <vector>
#include <functional>
namespace hex {
enum class Events {
DataChanged
};
struct EventHandler {
void *sender;
Events eventType;
std::function<void(void*)> callback;
};
class EventManager {
public:
void post(Events eventType, void *userData) {
for (auto &handler : this->m_eventHandlers)
if (eventType == handler.eventType)
handler.callback(userData);
}
void subscribe(Events eventType, void *sender, std::function<void(void*)> callback) {
for (auto &handler : this->m_eventHandlers)
if (eventType == handler.eventType && sender == handler.sender)
return;
this->m_eventHandlers.push_back(EventHandler { sender, eventType, callback });
}
void unsubscribe(Events eventType, void *sender) {
std::erase_if(this->m_eventHandlers, [&eventType, &sender](EventHandler handler) {
return eventType == handler.eventType && sender == handler.sender;
});
}
private:
std::vector<EventHandler> m_eventHandlers;
};
}

View File

@@ -4,6 +4,8 @@
#include "imgui.h"
#include "event.hpp"
namespace hex {
class View {
@@ -14,6 +16,22 @@ namespace hex {
virtual void createView() = 0;
virtual void createMenu() { }
virtual bool handleShortcut(int key, int mods) { return false; }
protected:
void subscribeEvent(Events eventType, std::function<void(void*)> callback) {
View::s_eventManager.subscribe(eventType, this, callback);
}
void unsubscribeEvent(Events eventType) {
View::s_eventManager.unsubscribe(eventType, this);
}
void postEvent(Events eventType, void *userData = nullptr) {
View::s_eventManager.post(eventType, userData);
}
private:
static inline EventManager s_eventManager;
};
}

View File

@@ -1,28 +0,0 @@
#pragma once
#include "views/view.hpp"
#include <cstdio>
namespace hex {
namespace prv { class Provider; }
class ViewEntropy : public View {
public:
explicit ViewEntropy(prv::Provider* &dataProvider);
~ViewEntropy() override;
void createView() override;
void createMenu() override;
private:
prv::Provider* &m_dataProvider;
bool m_windowOpen = true;
double m_entropy = 0;
float m_valueCounts[256] = { 0 };
bool m_shouldInvalidate = true;
};
}

View File

@@ -20,6 +20,7 @@ namespace hex {
prv::Provider* &m_dataProvider;
bool m_windowOpen = true;
bool m_shouldInvalidate = true;
int m_currHashFunction = 0;
int m_hashStart = 0, m_hashEnd = 0;
static constexpr const char* HashFunctionNames[] = { "CRC16", "CRC32", "MD5", "SHA-1", "SHA-256" };

View File

@@ -36,6 +36,11 @@ namespace hex {
char m_searchBuffer[0xFFFF] = { 0 };
s64 m_lastSearchIndex = 0;
std::vector<std::pair<u64, u64>> m_lastSearch;
u64 m_gotoAddress = 0;
void drawSearchPopup();
void drawGotoPopup();
};
}

View File

@@ -0,0 +1,37 @@
#pragma once
#include "views/view.hpp"
#include <array>
#include <cstdio>
#include <string>
#include <vector>
namespace hex {
namespace prv { class Provider; }
class ViewInformation : public View {
public:
explicit ViewInformation(prv::Provider* &dataProvider);
~ViewInformation() override;
void createView() override;
void createMenu() override;
private:
prv::Provider* &m_dataProvider;
bool m_windowOpen = true;
float m_averageEntropy = 0;
float m_highestBlockEntropy = 0;
std::vector<float> m_blockEntropy;
std::array<float, 256> m_valueCounts = { 0 };
bool m_shouldInvalidate = true;
std::string m_fileDescription;
std::string m_mimeType;
};
}