2021-01-11 20:31:40 +01:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <hex.hpp>
|
|
|
|
|
2021-01-13 17:41:16 +01:00
|
|
|
#include <hex/helpers/utils.hpp>
|
|
|
|
|
2021-01-11 20:31:40 +01:00
|
|
|
#include <functional>
|
|
|
|
#include <map>
|
|
|
|
#include <string>
|
|
|
|
#include <string_view>
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
#include <nlohmann/json.hpp>
|
|
|
|
|
|
|
|
namespace hex {
|
|
|
|
|
2021-01-12 16:50:15 +01:00
|
|
|
class View;
|
2021-01-11 23:54:12 +01:00
|
|
|
namespace lang { class ASTNode; }
|
2021-01-22 18:01:39 +01:00
|
|
|
namespace lang { class Evaluator; }
|
2021-01-30 22:39:06 +01:00
|
|
|
namespace dp { class Node; }
|
2021-01-11 23:54:12 +01:00
|
|
|
|
2021-01-12 16:50:15 +01:00
|
|
|
/*
|
|
|
|
The Content Registry is the heart of all features in ImHex that are in some way extendable by Plugins.
|
|
|
|
It allows you to add/register new content that will be picked up and used by the ImHex core or by other
|
|
|
|
plugins when needed.
|
|
|
|
*/
|
2021-01-20 20:16:24 +01:00
|
|
|
struct ContentRegistry {
|
2021-01-11 20:31:40 +01:00
|
|
|
ContentRegistry() = delete;
|
|
|
|
|
2021-01-12 16:50:15 +01:00
|
|
|
/* Settings Registry. Allows adding of new entries into the ImHex preferences window. */
|
2021-01-11 20:31:40 +01:00
|
|
|
struct Settings {
|
|
|
|
Settings() = delete;
|
|
|
|
|
|
|
|
struct Entry {
|
|
|
|
std::string name;
|
2021-02-13 15:15:32 +01:00
|
|
|
std::function<bool(std::string_view, nlohmann::json&)> callback;
|
2021-01-11 20:31:40 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
static void load();
|
|
|
|
static void store();
|
|
|
|
|
2021-02-13 15:15:32 +01:00
|
|
|
static void add(std::string_view unlocalizedCategory, std::string_view unlocalizedName, s64 defaultValue, const std::function<bool(std::string_view, nlohmann::json&)> &callback);
|
|
|
|
static void add(std::string_view unlocalizedCategory, std::string_view unlocalizedName, std::string_view defaultValue, const std::function<bool(std::string_view, nlohmann::json&)> &callback);
|
2021-01-11 20:31:40 +01:00
|
|
|
|
2021-02-13 15:15:32 +01:00
|
|
|
static void write(std::string_view unlocalizedCategory, std::string_view unlocalizedName, s64 value);
|
|
|
|
static void write(std::string_view unlocalizedCategory, std::string_view unlocalizedName, std::string_view value);
|
|
|
|
static void write(std::string_view unlocalizedCategory, std::string_view unlocalizedName, const std::vector<std::string>& value);
|
2021-02-01 19:03:28 +01:00
|
|
|
|
2021-02-13 15:15:32 +01:00
|
|
|
static s64 read(std::string_view unlocalizedCategory, std::string_view unlocalizedName, s64 defaultValue);
|
|
|
|
static std::string read(std::string_view unlocalizedCategory, std::string_view unlocalizedName, std::string_view defaultValue);
|
|
|
|
static std::vector<std::string> read(std::string_view unlocalizedCategory, std::string_view unlocalizedName, const std::vector<std::string>& defaultValue = { });
|
2021-02-01 19:03:28 +01:00
|
|
|
|
2021-01-11 20:31:40 +01:00
|
|
|
static std::map<std::string, std::vector<Entry>>& getEntries();
|
2021-02-16 23:42:35 +01:00
|
|
|
static std::optional<nlohmann::json> getSetting(std::string_view unlocalizedCategory, std::string_view unlocalizedName);
|
2021-01-11 20:31:40 +01:00
|
|
|
static nlohmann::json& getSettingsData();
|
|
|
|
};
|
2021-01-11 21:11:03 +01:00
|
|
|
|
2021-01-12 16:50:15 +01:00
|
|
|
/* Events Registry. Allows to define new events that can be used by other plugins later on subscribe to */
|
2021-01-11 21:11:03 +01:00
|
|
|
struct Events {
|
2021-01-11 21:42:21 +01:00
|
|
|
Events() = delete;
|
|
|
|
|
2021-01-11 21:11:03 +01:00
|
|
|
static auto get(std::string_view name);
|
|
|
|
};
|
2021-01-11 23:02:55 +01:00
|
|
|
|
2021-01-12 16:50:15 +01:00
|
|
|
/* Command Palette Command Registry. Allows adding of new commands to the command palette */
|
2021-01-11 23:02:55 +01:00
|
|
|
struct CommandPaletteCommands {
|
|
|
|
CommandPaletteCommands() = delete;
|
|
|
|
|
|
|
|
enum class Type : u32 {
|
|
|
|
SymbolCommand,
|
|
|
|
KeywordCommand
|
|
|
|
};
|
|
|
|
|
|
|
|
struct Entry {
|
|
|
|
Type type;
|
|
|
|
std::string command;
|
2021-02-13 15:15:32 +01:00
|
|
|
std::string unlocalizedDescription;
|
2021-02-08 19:56:04 +01:00
|
|
|
std::function<std::string(std::string)> displayCallback;
|
|
|
|
std::function<void(std::string)> executeCallback;
|
2021-01-11 23:02:55 +01:00
|
|
|
};
|
|
|
|
|
2021-02-13 15:15:32 +01:00
|
|
|
static void add(Type type, std::string_view command, std::string_view unlocalizedDescription, const std::function<std::string(std::string)> &displayCallback, const std::function<void(std::string)> &executeCallback = [](auto){});
|
2021-01-12 16:50:15 +01:00
|
|
|
static std::vector<Entry>& getEntries();
|
2021-01-11 23:02:55 +01:00
|
|
|
};
|
2021-01-11 23:54:12 +01:00
|
|
|
|
2021-01-12 16:50:15 +01:00
|
|
|
/* Pattern Language Function Registry. Allows adding of new functions that may be used inside the pattern language */
|
2021-01-11 23:54:12 +01:00
|
|
|
struct PatternLanguageFunctions {
|
|
|
|
PatternLanguageFunctions() = delete;
|
|
|
|
|
|
|
|
constexpr static u32 UnlimitedParameters = 0xFFFF'FFFF;
|
|
|
|
constexpr static u32 MoreParametersThan = 0x8000'0000;
|
|
|
|
constexpr static u32 LessParametersThan = 0x4000'0000;
|
|
|
|
constexpr static u32 NoParameters = 0x0000'0000;
|
|
|
|
|
|
|
|
struct Function {
|
|
|
|
u32 parameterCount;
|
2021-01-22 18:01:39 +01:00
|
|
|
std::function<hex::lang::ASTNode*(hex::lang::Evaluator&, std::vector<hex::lang::ASTNode*>)> func;
|
2021-01-11 23:54:12 +01:00
|
|
|
};
|
|
|
|
|
2021-01-22 18:01:39 +01:00
|
|
|
static void add(std::string_view name, u32 parameterCount, const std::function<hex::lang::ASTNode*(hex::lang::Evaluator&, std::vector<hex::lang::ASTNode*>)> &func);
|
2021-01-12 16:50:15 +01:00
|
|
|
static std::map<std::string, ContentRegistry::PatternLanguageFunctions::Function>& getEntries();
|
|
|
|
};
|
|
|
|
|
|
|
|
/* View Registry. Allows adding of new windows */
|
|
|
|
struct Views {
|
|
|
|
Views() = delete;
|
|
|
|
|
2021-01-13 17:41:16 +01:00
|
|
|
template<hex::derived_from<View> T, typename ... Args>
|
2021-02-03 00:56:33 +01:00
|
|
|
static void add(Args&& ... args) {
|
|
|
|
return add(std::make_unique<T>(std::forward<Args>(args)...));
|
2021-01-12 16:50:15 +01:00
|
|
|
}
|
|
|
|
|
2021-02-03 00:56:33 +01:00
|
|
|
static std::vector<std::unique_ptr<View>>& getEntries();
|
2021-01-12 16:50:15 +01:00
|
|
|
|
|
|
|
private:
|
2021-02-03 00:56:33 +01:00
|
|
|
static void add(std::unique_ptr<View> &&view);
|
2021-01-12 16:50:15 +01:00
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Tools Registry. Allows adding new entries to the tools window */
|
|
|
|
struct Tools {
|
2021-01-13 01:24:27 +01:00
|
|
|
Tools() = delete;
|
|
|
|
|
2021-01-13 13:18:03 +01:00
|
|
|
struct Entry {
|
|
|
|
std::string name;
|
|
|
|
std::function<void()> function;
|
|
|
|
};
|
2021-01-12 16:50:15 +01:00
|
|
|
|
2021-02-13 15:15:32 +01:00
|
|
|
static void add(std::string_view unlocalizedName, const std::function<void()> &function);
|
2021-01-13 13:18:03 +01:00
|
|
|
|
|
|
|
static std::vector<Entry>& getEntries();
|
2021-01-11 23:54:12 +01:00
|
|
|
};
|
2021-01-13 01:24:27 +01:00
|
|
|
|
|
|
|
/* Data Inspector Registry. Allows adding of new types to the data inspector */
|
|
|
|
struct DataInspector {
|
|
|
|
DataInspector() = delete;
|
|
|
|
|
|
|
|
enum class NumberDisplayStyle {
|
|
|
|
Decimal,
|
|
|
|
Hexadecimal,
|
|
|
|
Octal
|
|
|
|
};
|
|
|
|
|
2021-03-02 22:09:38 +01:00
|
|
|
using DisplayFunction = std::function<std::string()>;
|
2021-01-13 01:24:27 +01:00
|
|
|
using GeneratorFunction = std::function<DisplayFunction(const std::vector<u8>&, std::endian, NumberDisplayStyle)>;
|
|
|
|
|
|
|
|
struct Entry {
|
2021-02-13 15:15:32 +01:00
|
|
|
std::string unlocalizedName;
|
2021-01-13 01:24:27 +01:00
|
|
|
size_t requiredSize;
|
|
|
|
GeneratorFunction generatorFunction;
|
|
|
|
};
|
|
|
|
|
2021-02-13 15:15:32 +01:00
|
|
|
static void add(std::string_view unlocalizedName, size_t requiredSize, GeneratorFunction function);
|
2021-01-13 01:24:27 +01:00
|
|
|
|
|
|
|
static std::vector<Entry>& getEntries();
|
|
|
|
};
|
2021-01-30 22:39:06 +01:00
|
|
|
|
2021-02-19 17:36:10 +01:00
|
|
|
/* Data Processor Node Registry. Allows adding new processor nodes to be used in the data processor */
|
2021-01-30 22:39:06 +01:00
|
|
|
struct DataProcessorNode {
|
|
|
|
using CreatorFunction = std::function<dp::Node*()>;
|
|
|
|
struct Entry {
|
|
|
|
std::string category;
|
|
|
|
std::string name;
|
|
|
|
CreatorFunction creatorFunction;
|
|
|
|
};
|
|
|
|
|
|
|
|
template<hex::derived_from<dp::Node> T, typename ... Args>
|
2021-02-13 15:15:32 +01:00
|
|
|
static void add(std::string_view unlocalizedCategory, std::string_view unlocalizedName, Args&& ... args) {
|
|
|
|
add(Entry{ unlocalizedCategory.data(), unlocalizedName.data(), [args...]{ return new T(std::forward<Args>(args)...); } });
|
2021-01-30 22:39:06 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
static void addSeparator();
|
|
|
|
|
|
|
|
static std::vector<Entry>& getEntries();
|
|
|
|
private:
|
|
|
|
static void add(const Entry &entry);
|
|
|
|
};
|
2021-02-11 00:35:30 +01:00
|
|
|
|
2021-02-19 17:36:10 +01:00
|
|
|
/* Language Registry. Allows together with the LangEntry class and the _lang user defined literal to add new languages */
|
2021-02-11 00:35:30 +01:00
|
|
|
struct Language {
|
|
|
|
static void registerLanguage(std::string_view name, std::string_view languageCode);
|
|
|
|
static void addLocalizations(std::string_view languageCode, const LanguageDefinition &definition);
|
|
|
|
|
|
|
|
static std::map<std::string, std::string>& getLanguages();
|
|
|
|
static std::map<std::string, std::vector<LanguageDefinition>>& getLanguageDefinitions();
|
|
|
|
};
|
2021-02-18 12:09:19 +01:00
|
|
|
|
2021-02-19 17:36:10 +01:00
|
|
|
/* Interface Registry. Allows adding new items to various interfaces */
|
2021-02-18 12:09:19 +01:00
|
|
|
struct Interface {
|
|
|
|
using DrawCallback = std::function<void()>;
|
|
|
|
|
|
|
|
static void addWelcomeScreenEntry(const DrawCallback &function);
|
|
|
|
static void addFooterItem(const DrawCallback &function);
|
|
|
|
|
|
|
|
static std::vector<DrawCallback>& getWelcomeScreenEntries();
|
|
|
|
static std::vector<DrawCallback>& getFooterItems();
|
|
|
|
};
|
2021-01-11 20:31:40 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|