diff --git a/plugins/builtin/include/content/views/view_data_inspector.hpp b/plugins/builtin/include/content/views/view_data_inspector.hpp index 00d915a9d..95989dd40 100644 --- a/plugins/builtin/include/content/views/view_data_inspector.hpp +++ b/plugins/builtin/include/content/views/view_data_inspector.hpp @@ -56,7 +56,7 @@ namespace hex::plugin::builtin { void drawInspectorRows(); void drawInspectorRow(InspectorCacheEntry& entry); - ContentRegistry::DataInspector::impl::DisplayFunction createPatternErrorDisplayFunction(); + ContentRegistry::DataInspector::impl::DisplayFunction createPatternErrorDisplayFunction(const std::fs::path &path); private: bool m_shouldInvalidate = true; diff --git a/plugins/builtin/romfs/lang/en_US.json b/plugins/builtin/romfs/lang/en_US.json index 5a55072f9..05d468987 100644 --- a/plugins/builtin/romfs/lang/en_US.json +++ b/plugins/builtin/romfs/lang/en_US.json @@ -781,6 +781,7 @@ "hex.builtin.view.data_inspector.custom_row.title": "Adding custom rows", "hex.builtin.view.data_inspector.custom_row.hint": "It's possible to define custom data inspector rows by placing pattern language scripts in the /scripts/inspectors folder.\n\nCheck the documentation for more information.", "hex.builtin.view.data_inspector.toggle_endianness": "Toggle Endianness", + "hex.builtin.view.data_inspector.open_pattern": "Open Source File", "hex.builtin.view.data_processor.continuous_evaluation": "Continuous Evaluation", "hex.builtin.view.data_processor.help_text": "Right click to add a new node", "hex.builtin.view.data_processor.menu.file.load_processor": "Load data processor...", diff --git a/plugins/builtin/source/content/views/view_data_inspector.cpp b/plugins/builtin/source/content/views/view_data_inspector.cpp index 54d714279..78a77131d 100644 --- a/plugins/builtin/source/content/views/view_data_inspector.cpp +++ b/plugins/builtin/source/content/views/view_data_inspector.cpp @@ -185,7 +185,7 @@ namespace hex::plugin::builtin { void ViewDataInspector::executeInspector(const std::string& code, const std::fs::path& path, const std::map& inVariables) { if (m_runtime.executeString(code, pl::api::Source::DefaultSource, {}, inVariables, true) != 0) { - auto displayFunction = createPatternErrorDisplayFunction(); + auto displayFunction = createPatternErrorDisplayFunction(path); // Insert the inspector containing the error message into the list m_workData.emplace_back( @@ -226,7 +226,13 @@ namespace hex::plugin::builtin { try { // Set up the display function using the pattern's formatter - auto displayFunction = [pattern,value = pattern->getFormattedValue()] { + auto displayFunction = [pattern, value = pattern->getFormattedValue(), path] { + ContentRegistry::DataInspector::drawMenuItems([&] { + if (ImGui::MenuItemEx("hex.builtin.view.data_inspector.open_pattern"_lang, ICON_VS_FOLDER_OPENED)) { + fs::openFileExternal(path); + } + }); + auto drawer = ui::VisualizerDrawer(); if (const auto &inlineVisualizeArgs = pattern->getAttributeArguments("hex::inline_visualize"); !inlineVisualizeArgs.empty()) { drawer.drawVisualizer(ContentRegistry::PatternLanguage::impl::getInlineVisualizers(), inlineVisualizeArgs, *pattern, true); @@ -603,7 +609,7 @@ namespace hex::plugin::builtin { } } - ContentRegistry::DataInspector::impl::DisplayFunction ViewDataInspector::createPatternErrorDisplayFunction() { + ContentRegistry::DataInspector::impl::DisplayFunction ViewDataInspector::createPatternErrorDisplayFunction(const std::fs::path &path) { // Generate error message std::string errorMessage; if (const auto &compileErrors = m_runtime.getCompileErrors(); !compileErrors.empty()) { @@ -615,7 +621,13 @@ namespace hex::plugin::builtin { } // Create a dummy display function that displays the error message - auto displayFunction = [errorMessage = std::move(errorMessage)] { + auto displayFunction = [errorMessage = std::move(errorMessage), path] { + ContentRegistry::DataInspector::drawMenuItems([&, path] { + if (ImGui::MenuItemEx("hex.builtin.view.data_inspector.open_pattern"_lang, ICON_VS_FOLDER_OPENED)) { + fs::openFileExternal(path); + } + }); + ImGuiExt::HelpHover( errorMessage.c_str(), "hex.builtin.view.data_inspector.execution_error"_lang,