#pragma once #include #include #include #include #include #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: enum class DangerousFunctionPerms : u8 { Ask, Allow, Deny }; private: using PlData = ProviderExtraData::Data::PatternLanguage; std::unique_ptr m_parserRuntime; std::vector m_possiblePatternFiles; u32 m_selectedPatternFile = 0; bool m_runAutomatically = false; bool m_triggerEvaluation = false; bool m_lastEvaluationProcessed = true; bool m_lastEvaluationResult = false; std::atomic m_runningEvaluators = 0; std::atomic m_runningParsers = 0; bool m_hasUnevaluatedChanges = false; bool m_acceptPatternWindowOpen = false; TextEditor m_textEditor; std::atomic m_dangerousFunctionCalled = false; std::atomic m_dangerousFunctionsAllowed = DangerousFunctionPerms::Ask; bool m_syncPatternSourceCode = false; bool m_autoLoadPatterns = true; std::map> m_sectionWindowDrawer; ui::HexEditor m_sectionHexEditor; private: void drawConsole(ImVec2 size, const std::vector> &console); void drawEnvVars(ImVec2 size, std::list &envVars); void drawVariableSettings(ImVec2 size, std::map &patternVariables); void drawSectionSelector(ImVec2 size, std::map §ions); void drawPatternTooltip(pl::ptrn::Pattern *pattern); void loadPatternFile(const std::fs::path &path, prv::Provider *provider); void parsePattern(const std::string &code, prv::Provider *provider); void evaluatePattern(const std::string &code, prv::Provider *provider); void registerEvents(); void registerMenuItems(); void registerHandlers(); void appendEditorText(const std::string &text); void appendVariable(const std::string &type); void appendArray(const std::string &type, size_t size); }; }