diff --git a/src/logic/Console.cpp b/src/logic/Console.cpp index 5d4fb8a2..fa820494 100644 --- a/src/logic/Console.cpp +++ b/src/logic/Console.cpp @@ -171,18 +171,11 @@ std::string Console::submitCommand(std::string command) Logic::Console::Command& Console::registerCommand(const std::string& command, Callback callback) { auto tokens = Utils::splitAndRemoveEmpty(command, ' '); - std::vector generators; - auto simpleGen = [](std::string token) -> std::vector { - Suggestion suggestion = std::make_shared(SuggestionBase{{token}}); - return {suggestion}; - }; - for (const auto& token : tokens) - { - generators.push_back(std::bind(simpleGen, token)); - } auto sanitizedCommand = Utils::join(tokens.begin(), tokens.end(), " "); bool requiresWorld = true; - m_Commands.push_back({sanitizedCommand, generators, callback, generators.size(), requiresWorld}); + m_Commands.push_back({sanitizedCommand, {}, callback, tokens.size(), requiresWorld}); + for (auto& token : tokens) + m_Commands.back().registerAutoComplete({token}); return m_Commands.back(); } diff --git a/src/logic/Console.h b/src/logic/Console.h index 38c329f0..7d0ccb48 100644 --- a/src/logic/Console.h +++ b/src/logic/Console.h @@ -70,15 +70,34 @@ namespace Logic // whether this command is disabled while no world is loaded bool requiresWorld; + /** + * A commands, that requires a world will not be visible/available when no world is loaded + */ Command& setRequiresWorld(bool value) { requiresWorld = value; return *this; } + /** + * creates and registers a simple suggestion generator from vector + * @param rows suggestions + * @return reference to Command + */ + Command& registerAutoComplete(const std::vector& rows) + { + std::vector suggestions; + for (auto& row : rows) + suggestions.push_back(std::make_shared(SuggestionBase{{row}})); + auto generator = [s = std::move(suggestions)]() { + return s; + }; + return registerAutoComplete(std::move(generator)); + } + Command& registerAutoComplete(CandidateListGenerator generator) { - generators.push_back(generator); + generators.push_back(std::move(generator)); return *this; } }; diff --git a/src/target/REGoth.cpp b/src/target/REGoth.cpp index 76920fe9..6b3b5fac 100644 --- a/src/target/REGoth.cpp +++ b/src/target/REGoth.cpp @@ -141,16 +141,6 @@ void REGoth::initConsole() return suggestions; }; - // creates simple suggestion generator from iterables of string - auto simpleStringGenGen = [](const auto& stringContainer){ - return [stringContainer](){ - std::vector suggestions; - for (auto& token : stringContainer) - suggestions.push_back(std::make_shared(SuggestionBase{{std::move(token)}})); - return suggestions; - }; - }; - console.registerCommand("estimatedGPUMem", [this](const std::vector& args) -> std::string { World::WorldInstance& world = m_pEngine->getMainWorld().get(); @@ -216,7 +206,7 @@ void REGoth::initConsole() std::map camModes = { {"ThirdPerson", Logic::CameraController::ECameraMode::ThirdPerson}, - {"FirstPerson", Logic::CameraController::ECameraMode::FirstPerson, }, + {"FirstPerson", Logic::CameraController::ECameraMode::FirstPerson}, {"Free", Logic::CameraController::ECameraMode::Free}, {"Viewer", Logic::CameraController::ECameraMode::Viewer}, {"Static", Logic::CameraController::ECameraMode::Static}, @@ -238,7 +228,7 @@ void REGoth::initConsole() std::vector camModeNames; for (const auto& pair : camModes) camModeNames.push_back(pair.first); - commandCamera.registerAutoComplete(simpleStringGenGen(camModeNames)); + commandCamera.registerAutoComplete(camModeNames); console.registerCommand("test", [this](const std::vector& args) -> std::string { auto& worldInstance = m_pEngine->getMainWorld().get(); @@ -356,7 +346,7 @@ void REGoth::initConsole() for (const auto& pair : walkModes) walkModeNames.push_back(pair.first); - setWalkmode.registerAutoComplete(simpleStringGenGen(walkModeNames)); + setWalkmode.registerAutoComplete(walkModeNames); console.registerCommand("heroexport", [this](const std::vector& args) -> std::string { auto& s = m_pEngine->getMainWorld().get().getScriptEngine(); @@ -924,7 +914,7 @@ void REGoth::initConsole() } } - playsound.registerAutoComplete(simpleStringGenGen(playSoundFiles)); + playsound.registerAutoComplete(playSoundFiles); console.registerCommand("volume", [this](const std::vector& args) -> std::string { if (args.size() < 2)