diff --git a/src/gameui/IConsole.cpp b/src/gameui/IConsole.cpp index d3d416fb..5e8bb071 100644 --- a/src/gameui/IConsole.cpp +++ b/src/gameui/IConsole.cpp @@ -406,6 +406,110 @@ void CConsole::DrawOptionsPanel(void) ImGui::EndPopup(); } +//----------------------------------------------------------------------------- +// Purpose: returns flag texture index for CommandBase (must be aligned with resource.h!) +// in the future we should build the texture procedurally with use of popcnt. +// Input : nFlags - +//----------------------------------------------------------------------------- +static int GetFlagTextureIndex(const int flags) +{ + switch (flags) // All indices for single/dual flag textures. + { + case FCVAR_DEVELOPMENTONLY: + return 9; + case FCVAR_GAMEDLL: + return 10; + case FCVAR_CLIENTDLL: + return 11; + case FCVAR_REPLICATED: + return 12; + case FCVAR_CHEAT: + return 13; + case FCVAR_RELEASE: + return 14; + case FCVAR_MATERIAL_SYSTEM_THREAD: + return 15; + case FCVAR_DEVELOPMENTONLY | FCVAR_GAMEDLL: + return 16; + case FCVAR_DEVELOPMENTONLY | FCVAR_CLIENTDLL: + return 17; + case FCVAR_DEVELOPMENTONLY | FCVAR_REPLICATED: + return 18; + case FCVAR_DEVELOPMENTONLY | FCVAR_CHEAT: + return 19; + case FCVAR_DEVELOPMENTONLY | FCVAR_MATERIAL_SYSTEM_THREAD: + return 20; + case FCVAR_REPLICATED | FCVAR_CHEAT: + return 21; + case FCVAR_REPLICATED | FCVAR_RELEASE: + return 22; + case FCVAR_GAMEDLL | FCVAR_CHEAT: + return 23; + case FCVAR_GAMEDLL | FCVAR_RELEASE: + return 24; + case FCVAR_CLIENTDLL | FCVAR_CHEAT: + return 25; + case FCVAR_CLIENTDLL | FCVAR_RELEASE: + return 26; + case FCVAR_MATERIAL_SYSTEM_THREAD | FCVAR_CHEAT: + return 27; + case FCVAR_MATERIAL_SYSTEM_THREAD | FCVAR_RELEASE: + return 28; + case COMMAND_COMPLETION_MARKER: + return 29; + + default: // Hit when flag is zero/non-indexed or 3+ bits are set. + + const unsigned int v = __popcnt(flags); + switch (v) + { + case 0: + return 0; // Pink checker texture (FCVAR_NONE) + case 1: + return 1; // Yellow checker texture (non-indexed). + default: + + // If 3 or more bits are set, we test the flags + // and display the appropriate checker texture. + const bool mul = v > 2; + + if (flags & FCVAR_DEVELOPMENTONLY) + { + return mul ? 4 : 3; + } + else if (flags & FCVAR_CHEAT) + { + return mul ? 6 : 5; + } + else if (flags & FCVAR_RELEASE && // RELEASE command but no context restriction. + !(flags & FCVAR_SERVER_CAN_EXECUTE) && + !(flags & FCVAR_CLIENTCMD_CAN_EXECUTE)) + { + return mul ? 8 : 7; + } + + // Rainbow checker texture (user needs to manually check flags). + // These commands are not restricted if ran from the same context. + return 2; + } + } +} + +//----------------------------------------------------------------------------- +// Purpose: adds an icon hint to the suggest panel +// Input : &cvarInfo - +// &flagIconHandles - +//----------------------------------------------------------------------------- +static void AddHint(const ConVarFlags::FlagDesc_t& cvarInfo, const vector& flagIconHandles) +{ + const int hintTexIdx = GetFlagTextureIndex(cvarInfo.bit); + const MODULERESOURCE& hintRes = flagIconHandles[hintTexIdx]; + + ImGui::Image(hintRes.m_idIcon, ImVec2(float(hintRes.m_nWidth), float(hintRes.m_nHeight))); + ImGui::SameLine(); + ImGui::Text("%s", cvarInfo.shortdesc); +}; + //----------------------------------------------------------------------------- // Purpose: draws the autocomplete panel with results based on user input //----------------------------------------------------------------------------- @@ -450,16 +554,6 @@ void CConsole::DrawAutoCompletePanel(void) if (ImGui::IsItemHovered(ImGuiHoveredFlags_RectOnly) && suggest.flags != COMMAND_COMPLETION_MARKER) { - const std::function fnAddHint = [&](const ConVarFlags::FlagDesc_t& cvarInfo) - { - const int hintTexIdx = GetFlagTextureIndex(cvarInfo.bit); - const MODULERESOURCE& hintRes = m_vecFlagIcons[hintTexIdx]; - - ImGui::Image(hintRes.m_idIcon, ImVec2(float(hintRes.m_nWidth), float(hintRes.m_nHeight))); - ImGui::SameLine(); - ImGui::Text("%s", cvarInfo.shortdesc); - }; - ImGui::BeginTooltip(); bool isFlagSet = false; @@ -470,12 +564,12 @@ void CConsole::DrawAutoCompletePanel(void) if (suggest.flags & info.bit) { isFlagSet = true; - fnAddHint(info); + AddHint(info, m_vecFlagIcons); } } if (!isFlagSet) // Display the FCVAR_NONE flag if no flags are set. { - fnAddHint(g_ConVarFlags.m_FlagsToDesc[0]); + AddHint(g_ConVarFlags.m_FlagsToDesc[0], m_vecFlagIcons); } ImGui::EndTooltip(); @@ -623,6 +717,29 @@ void CConsole::ResetAutoCompleteData(void) m_vecSuggest.clear(); } +//----------------------------------------------------------------------------- +// Purpose: format appends the value string +//----------------------------------------------------------------------------- +static void AppendValueString(string& targetString, const char* const toAppend) +{ + targetString.append(" = ["); // Assign current value to string if its a ConVar. + targetString.append(toAppend); + targetString.append("]"); +} + +//----------------------------------------------------------------------------- +// Purpose: format appends the doc string +//----------------------------------------------------------------------------- +static void AppendDocString(string& targetString, const char* const toAppend) +{ + if (VALID_CHARSTAR(toAppend)) + { + targetString.append(" - \""); + targetString.append(toAppend); + targetString.append("\""); + } +} + //----------------------------------------------------------------------------- // Purpose: find ConVars/ConCommands from user input and add to vector // - Ignores ConVars marked FCVAR_HIDDEN @@ -658,28 +775,16 @@ void CConsole::CreateSuggestionsFromPartial(void) { string docString; + // Assign current value to string if its a ConVar. if (!commandBase->IsCommand()) { - const ConVar* conVar = reinterpret_cast(commandBase); - - docString = " = ["; // Assign current value to string if its a ConVar. - docString.append(conVar->GetString()); - docString.append("]"); + const ConVar* const conVar = reinterpret_cast(commandBase); + AppendValueString(docString, conVar->GetString()); } if (con_suggest_helptext.GetBool()) { - std::function fnAppendDocString = [&](string& targetString, const char* toAppend) - { - if (VALID_CHARSTAR(toAppend)) - { - targetString.append(" - \""); - targetString.append(toAppend); - targetString.append("\""); - } - }; - - fnAppendDocString(docString, commandBase->GetHelpText()); - fnAppendDocString(docString, commandBase->GetUsageText()); + AppendDocString(docString, commandBase->GetHelpText()); + AppendDocString(docString, commandBase->GetUsageText()); } m_vecSuggest.push_back(ConAutoCompleteSuggest_s(commandName + docString, commandBase->GetFlags())); } @@ -828,95 +933,6 @@ bool CConsole::LoadFlagIcons(void) return ret; } -//----------------------------------------------------------------------------- -// Purpose: returns flag texture index for CommandBase (must be aligned with resource.h!) -// in the future we should build the texture procedurally with use of popcnt. -// Input : nFlags - -//----------------------------------------------------------------------------- -int CConsole::GetFlagTextureIndex(const int flags) const -{ - switch (flags) // All indices for single/dual flag textures. - { - case FCVAR_DEVELOPMENTONLY: - return 9; - case FCVAR_GAMEDLL: - return 10; - case FCVAR_CLIENTDLL: - return 11; - case FCVAR_REPLICATED: - return 12; - case FCVAR_CHEAT: - return 13; - case FCVAR_RELEASE: - return 14; - case FCVAR_MATERIAL_SYSTEM_THREAD: - return 15; - case FCVAR_DEVELOPMENTONLY | FCVAR_GAMEDLL: - return 16; - case FCVAR_DEVELOPMENTONLY | FCVAR_CLIENTDLL: - return 17; - case FCVAR_DEVELOPMENTONLY | FCVAR_REPLICATED: - return 18; - case FCVAR_DEVELOPMENTONLY | FCVAR_CHEAT: - return 19; - case FCVAR_DEVELOPMENTONLY | FCVAR_MATERIAL_SYSTEM_THREAD: - return 20; - case FCVAR_REPLICATED | FCVAR_CHEAT: - return 21; - case FCVAR_REPLICATED | FCVAR_RELEASE: - return 22; - case FCVAR_GAMEDLL | FCVAR_CHEAT: - return 23; - case FCVAR_GAMEDLL | FCVAR_RELEASE: - return 24; - case FCVAR_CLIENTDLL | FCVAR_CHEAT: - return 25; - case FCVAR_CLIENTDLL | FCVAR_RELEASE: - return 26; - case FCVAR_MATERIAL_SYSTEM_THREAD | FCVAR_CHEAT: - return 27; - case FCVAR_MATERIAL_SYSTEM_THREAD | FCVAR_RELEASE: - return 28; - case COMMAND_COMPLETION_MARKER: - return 29; - - default: // Hit when flag is zero/non-indexed or 3+ bits are set. - - const unsigned int v = __popcnt(flags); - switch (v) - { - case 0: - return 0; // Pink checker texture (FCVAR_NONE) - case 1: - return 1; // Yellow checker texture (non-indexed). - default: - - // If 3 or more bits are set, we test the flags - // and display the appropriate checker texture. - bool mul = v > 2; - - if (flags & FCVAR_DEVELOPMENTONLY) - { - return mul ? 4 : 3; - } - else if (flags & FCVAR_CHEAT) - { - return mul ? 6 : 5; - } - else if (flags & FCVAR_RELEASE && // RELEASE command but no context restriction. - !(flags & FCVAR_SERVER_CAN_EXECUTE) && - !(flags & FCVAR_CLIENTCMD_CAN_EXECUTE)) - { - return mul ? 8 : 7; - } - - // Rainbow checker texture (user needs to manually check flags). - // These commands are not restricted if ran from the same context. - return 2; - } - } -} - //----------------------------------------------------------------------------- // Purpose: console input box callback // Input : *iData - diff --git a/src/gameui/IConsole.h b/src/gameui/IConsole.h index 117d862e..0c61f164 100644 --- a/src/gameui/IConsole.h +++ b/src/gameui/IConsole.h @@ -37,7 +37,6 @@ private: void DetermineAutoCompleteWindowRect(void); bool LoadFlagIcons(void); - int GetFlagTextureIndex(const int flags) const; int TextEditCallback(ImGuiInputTextCallbackData* pData); static int TextEditCallbackStub(ImGuiInputTextCallbackData* pData);