#pragma once #include #include #include #include #include #include #include #include #include #include namespace pl::ptrn { class Pattern; } namespace hex::plugin::builtin { class ViewPatternEditor : public View { public: ViewPatternEditor(); ~ViewPatternEditor() override; void drawAlwaysVisible() override; void drawContent() override; private: struct PatternVariable { bool inVariable; bool outVariable; pl::core::Token::ValueType type; pl::core::Token::Literal value; }; enum class EnvVarType { Integer, Float, String, Bool }; struct EnvVar { u64 id; std::string name; pl::core::Token::Literal value; EnvVarType type; bool operator==(const EnvVar &other) const { return this->id == other.id; } }; enum class DangerousFunctionPerms : u8 { Ask, Allow, Deny }; private: std::unique_ptr m_parserRuntime; std::vector m_possiblePatternFiles; u32 m_selectedPatternFile = 0; bool m_runAutomatically = false; bool m_lastEvaluationProcessed = true; bool m_lastEvaluationResult = false; std::optional m_lastEvaluationError; std::vector> m_lastEvaluationLog; std::map m_lastEvaluationOutVars; std::atomic m_runningEvaluators = 0; std::atomic m_runningParsers = 0; bool m_hasUnevaluatedChanges = false; bool m_acceptPatternWindowOpen = false; TextEditor m_textEditor; std::vector> m_console; std::map m_patternVariables; u64 m_envVarIdCounter; std::list m_envVarEntries; std::atomic m_dangerousFunctionCalled = false; std::atomic m_dangerousFunctionsAllowed = DangerousFunctionPerms::Ask; bool m_syncPatternSourceCode = false; bool m_autoLoadPatterns = true; private: void drawConsole(ImVec2 size); void drawEnvVars(ImVec2 size); void drawVariableSettings(ImVec2 size); void drawPatternTooltip(pl::ptrn::Pattern *pattern); void loadPatternFile(const std::fs::path &path); void parsePattern(const std::string &code); void evaluatePattern(const std::string &code); void registerEvents(); void registerMenuItems(); void registerHandlers(); }; }