1
0
mirror of synced 2025-02-17 18:59:21 +01:00

impr: Fix input field selection in command palette

This commit is contained in:
WerWolv 2023-12-06 16:20:06 +01:00
parent 370ca740e3
commit 5d24f1b691
3 changed files with 17 additions and 11 deletions

View File

@ -41,6 +41,7 @@ namespace hex::plugin::builtin {
bool m_commandPaletteOpen = false; bool m_commandPaletteOpen = false;
bool m_justOpened = false; bool m_justOpened = false;
bool m_focusInputTextBox = false; bool m_focusInputTextBox = false;
bool m_moveCursorToEnd = false;
std::string m_commandBuffer; std::string m_commandBuffer;
std::vector<CommandResult> m_lastResults; std::vector<CommandResult> m_lastResults;

View File

@ -15,7 +15,7 @@ namespace hex::plugin::builtin {
ContentRegistry::CommandPaletteCommands::add( ContentRegistry::CommandPaletteCommands::add(
ContentRegistry::CommandPaletteCommands::Type::SymbolCommand, ContentRegistry::CommandPaletteCommands::Type::SymbolCommand,
"#", "=",
"hex.builtin.command.calc.desc", "hex.builtin.command.calc.desc",
[](auto input) { [](auto input) {
wolv::math_eval::MathEvaluator<long double> evaluator; wolv::math_eval::MathEvaluator<long double> evaluator;
@ -24,7 +24,7 @@ namespace hex::plugin::builtin {
std::optional<long double> result = evaluator.evaluate(input); std::optional<long double> result = evaluator.evaluate(input);
if (result.has_value()) if (result.has_value())
return hex::format("#{0} = {1}", input.data(), result.value()); return hex::format("{0} = {1}", input.data(), result.value());
else if (evaluator.hasError()) else if (evaluator.hasError())
return hex::format("Error: {}", *evaluator.getLastError()); return hex::format("Error: {}", *evaluator.getLastError());
else else

View File

@ -53,24 +53,29 @@ namespace hex::plugin::builtin {
if (ImGui::InputText("##command_input", this->m_commandBuffer)) { if (ImGui::InputText("##command_input", this->m_commandBuffer)) {
this->m_lastResults = this->getCommandResults(this->m_commandBuffer); this->m_lastResults = this->getCommandResults(this->m_commandBuffer);
} }
ImGui::PopStyleVar(2); ImGui::PopStyleVar(2);
ImGui::PopStyleColor(3); ImGui::PopStyleColor(3);
ImGui::PopItemWidth(); ImGui::PopItemWidth();
ImGui::SetItemDefaultFocus(); ImGui::SetItemDefaultFocus();
// Handle giving back focus to the input text box if (this->m_moveCursorToEnd) {
if (this->m_focusInputTextBox) {
ImGui::SetKeyboardFocusHere(-1);
ImGui::ActivateItemByID(ImGui::GetID("##command_input"));
auto textState = ImGui::GetInputTextState(ImGui::GetID("##command_input")); auto textState = ImGui::GetInputTextState(ImGui::GetID("##command_input"));
if (textState != nullptr) { if (textState != nullptr) {
textState->Stb.cursor = textState->Stb.cursor =
textState->Stb.select_start = textState->Stb.select_start =
textState->Stb.select_end = this->m_commandBuffer.size(); textState->Stb.select_end = this->m_commandBuffer.size();
} }
this->m_moveCursorToEnd = false;
}
// Handle giving back focus to the input text box
if (this->m_focusInputTextBox) {
ImGui::SetKeyboardFocusHere(-1);
ImGui::ActivateItemByID(ImGui::GetID("##command_input"));
this->m_focusInputTextBox = false; this->m_focusInputTextBox = false;
this->m_moveCursorToEnd = true;
} }
// Execute the currently selected command when pressing enter // Execute the currently selected command when pressing enter
@ -148,7 +153,7 @@ namespace hex::plugin::builtin {
auto AutoComplete = [this, currCommand = command](auto) { auto AutoComplete = [this, currCommand = command](auto) {
this->focusInputTextBox(); this->focusInputTextBox();
this->m_commandBuffer = currCommand; this->m_commandBuffer = currCommand + " ";
this->m_lastResults = this->getCommandResults(currCommand); this->m_lastResults = this->getCommandResults(currCommand);
}; };
@ -160,7 +165,7 @@ namespace hex::plugin::builtin {
if (match != MatchType::PerfectMatch) if (match != MatchType::PerfectMatch)
results.push_back({ command + " (" + Lang(unlocalizedDescription) + ")", "", AutoComplete }); results.push_back({ command + " (" + Lang(unlocalizedDescription) + ")", "", AutoComplete });
else { else {
auto matchedCommand = input.substr(command.length()); auto matchedCommand = wolv::util::trim(input.substr(command.length()));
results.push_back({ displayCallback(matchedCommand), matchedCommand, executeCallback }); results.push_back({ displayCallback(matchedCommand), matchedCommand, executeCallback });
} }
} }
@ -172,7 +177,7 @@ namespace hex::plugin::builtin {
if (match != MatchType::PerfectMatch) if (match != MatchType::PerfectMatch)
results.push_back({ command + " (" + Lang(unlocalizedDescription) + ")", "", AutoComplete }); results.push_back({ command + " (" + Lang(unlocalizedDescription) + ")", "", AutoComplete });
else { else {
auto matchedCommand = input.substr(command.length() + 1); auto matchedCommand = wolv::util::trim(input.substr(command.length() + 1));
results.push_back({ displayCallback(matchedCommand), matchedCommand, executeCallback }); results.push_back({ displayCallback(matchedCommand), matchedCommand, executeCallback });
} }
} }
@ -185,7 +190,7 @@ namespace hex::plugin::builtin {
auto processedInput = input; auto processedInput = input;
if (processedInput.starts_with(command)) if (processedInput.starts_with(command))
processedInput = processedInput.substr(command.length()); processedInput = wolv::util::trim(processedInput.substr(command.length()));
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) {