1
0
mirror of synced 2025-01-11 05:42:15 +01:00

feat: Allow command palette to work with previous results

This commit is contained in:
WerWolv 2024-12-23 23:42:45 +01:00
parent 9274fac8e1
commit 2ae69e8e72
4 changed files with 39 additions and 10 deletions

View File

@ -380,7 +380,7 @@ namespace hex {
}; };
using DisplayCallback = std::function<std::string(std::string)>; using DisplayCallback = std::function<std::string(std::string)>;
using ExecuteCallback = std::function<void(std::string)>; using ExecuteCallback = std::function<std::optional<std::string>(std::string)>;
using QueryCallback = std::function<std::vector<QueryResult>(std::string)>; using QueryCallback = std::function<std::vector<QueryResult>(std::string)>;
struct Entry { struct Entry {
@ -416,7 +416,7 @@ namespace hex {
const std::string &command, const std::string &command,
const UnlocalizedString &unlocalizedDescription, const UnlocalizedString &unlocalizedDescription,
const impl::DisplayCallback &displayCallback, const impl::DisplayCallback &displayCallback,
const impl::ExecuteCallback &executeCallback = [](auto) {}); const impl::ExecuteCallback &executeCallback = [](auto) { return std::nullopt; });
/** /**
* @brief Adds a new command handler to the command palette * @brief Adds a new command handler to the command palette

View File

@ -5,6 +5,7 @@
#include <imgui.h> #include <imgui.h>
#include <vector> #include <vector>
#include <hex/api/content_registry.hpp>
namespace hex::plugin::builtin { namespace hex::plugin::builtin {
@ -35,7 +36,7 @@ namespace hex::plugin::builtin {
struct CommandResult { struct CommandResult {
std::string displayResult; std::string displayResult;
std::string matchedCommand; std::string matchedCommand;
std::function<void(std::string)> executeCallback; ContentRegistry::CommandPaletteCommands::impl::ExecuteCallback executeCallback;
}; };
bool m_commandPaletteOpen = false; bool m_commandPaletteOpen = false;
@ -54,4 +55,4 @@ namespace hex::plugin::builtin {
std::vector<CommandResult> getCommandResults(const std::string &input); std::vector<CommandResult> getCommandResults(const std::string &input);
}; };
} }

View File

@ -264,6 +264,17 @@ namespace hex::plugin::builtin {
return hex::format("Error: {}", *evaluator.getLastError()); return hex::format("Error: {}", *evaluator.getLastError());
else else
return std::string("???"); return std::string("???");
}, [](auto input) -> std::optional<std::string> {
wolv::math_eval::MathEvaluator<long double> evaluator;
evaluator.registerStandardVariables();
evaluator.registerStandardFunctions();
std::optional<long double> result = evaluator.evaluate(input);
if (result.has_value()) {
return hex::format("= {}", result.value());
} else {
return std::nullopt;
}
}); });
ContentRegistry::CommandPaletteCommands::add( ContentRegistry::CommandPaletteCommands::add(
@ -275,6 +286,7 @@ namespace hex::plugin::builtin {
}, },
[](auto input) { [](auto input) {
hex::openWebpage(input); hex::openWebpage(input);
return std::nullopt;
}); });
ContentRegistry::CommandPaletteCommands::add( ContentRegistry::CommandPaletteCommands::add(
@ -286,6 +298,7 @@ namespace hex::plugin::builtin {
}, },
[](auto input) { [](auto input) {
hex::executeCommand(input); hex::executeCommand(input);
return std::nullopt;
}); });
ContentRegistry::CommandPaletteCommands::addHandler( ContentRegistry::CommandPaletteCommands::addHandler(

View File

@ -86,11 +86,20 @@ namespace hex::plugin::builtin {
// Execute the currently selected command when pressing enter // Execute the currently selected command when pressing enter
if (ImGui::IsItemFocused() && (ImGui::IsKeyPressed(ImGuiKey_Enter, false) || ImGui::IsKeyPressed(ImGuiKey_KeypadEnter, false))) { if (ImGui::IsItemFocused() && (ImGui::IsKeyPressed(ImGuiKey_Enter, false) || ImGui::IsKeyPressed(ImGuiKey_KeypadEnter, false))) {
bool closePalette = true;
if (!m_lastResults.empty()) { if (!m_lastResults.empty()) {
auto &[displayResult, matchedCommand, callback] = m_lastResults.front(); auto &[displayResult, matchedCommand, callback] = m_lastResults.front();
callback(matchedCommand);
if (auto result = callback(matchedCommand); result.has_value()) {
m_commandBuffer = result.value();
closePalette = false;
m_focusInputTextBox = true;
}
}
if (closePalette) {
ImGui::CloseCurrentPopup();
} }
ImGui::CloseCurrentPopup();
} }
// Focus the input text box when the popup is opened // Focus the input text box when the popup is opened
@ -113,11 +122,15 @@ namespace hex::plugin::builtin {
// Allow executing a command by clicking on it or selecting it with the keyboard and pressing enter // Allow executing a command by clicking on it or selecting it with the keyboard and pressing enter
if (ImGui::Selectable(displayResult.c_str(), false, ImGuiSelectableFlags_NoAutoClosePopups)) { if (ImGui::Selectable(displayResult.c_str(), false, ImGuiSelectableFlags_NoAutoClosePopups)) {
callback(matchedCommand); if (auto result = callback(matchedCommand); result.has_value())
m_commandBuffer = result.value();
break; break;
} }
if (ImGui::IsItemFocused() && (ImGui::IsKeyDown(ImGuiKey_Enter) || ImGui::IsKeyDown(ImGuiKey_KeypadEnter))) { if (ImGui::IsItemFocused() && (ImGui::IsKeyDown(ImGuiKey_Enter) || ImGui::IsKeyDown(ImGuiKey_KeypadEnter))) {
callback(matchedCommand); if (auto result = callback(matchedCommand); result.has_value())
m_commandBuffer = result.value();
break; break;
} }
} }
@ -161,6 +174,8 @@ namespace hex::plugin::builtin {
this->focusInputTextBox(); this->focusInputTextBox();
m_commandBuffer = currCommand + " "; m_commandBuffer = currCommand + " ";
m_lastResults = this->getCommandResults(currCommand); m_lastResults = this->getCommandResults(currCommand);
return std::nullopt;
}; };
if (type == ContentRegistry::CommandPaletteCommands::Type::SymbolCommand) { if (type == ContentRegistry::CommandPaletteCommands::Type::SymbolCommand) {
@ -201,11 +216,11 @@ namespace hex::plugin::builtin {
for (const auto &[description, callback] : queryCallback(processedInput)) { for (const auto &[description, callback] : queryCallback(processedInput)) {
if (type == ContentRegistry::CommandPaletteCommands::Type::SymbolCommand) { if (type == ContentRegistry::CommandPaletteCommands::Type::SymbolCommand) {
if (auto [match, value] = MatchCommand(input, command); match != MatchType::NoMatch) { if (auto [match, value] = MatchCommand(input, command); match != MatchType::NoMatch) {
results.push_back({ hex::format("{} ({})", command, description), "", callback }); results.push_back({ hex::format("{} ({})", command, description), "", [callback](auto ... args){ callback(args...); return std::nullopt; } });
} }
} else if (type == ContentRegistry::CommandPaletteCommands::Type::KeywordCommand) { } else if (type == ContentRegistry::CommandPaletteCommands::Type::KeywordCommand) {
if (auto [match, value] = MatchCommand(input, command + " "); match != MatchType::NoMatch) { if (auto [match, value] = MatchCommand(input, command + " "); match != MatchType::NoMatch) {
results.push_back({ hex::format("{} ({})", command, description), "", callback }); results.push_back({ hex::format("{} ({})", command, description), "", [callback](auto ... args){ callback(args...); return std::nullopt; } });
} }
} }
} }