CConsole improvements

* Pad the autocomplete list with 18 to keep all items in view
* Show help text for ConCommand as well
+ Small code cleanup
This commit is contained in:
Amos 2022-02-23 15:56:03 +01:00
parent 0c069db90c
commit 9506a5141a
5 changed files with 69 additions and 44 deletions

View File

@ -139,7 +139,7 @@ void CConsole::Think(void)
} }
} }
while ((int)m_vsvHistory.size() > 512) while (static_cast<int>(m_vsvHistory.size()) > 512)
{ {
m_vsvHistory.erase(m_vsvHistory.begin()); m_vsvHistory.erase(m_vsvHistory.begin());
} }
@ -212,7 +212,7 @@ void CConsole::BasePanel(bool* bDraw)
ImGui::PushItemWidth(footer_width_to_reserve - 80); ImGui::PushItemWidth(footer_width_to_reserve - 80);
if (ImGui::IsWindowAppearing()) { ImGui::SetKeyboardFocusHere(); } if (ImGui::IsWindowAppearing()) { ImGui::SetKeyboardFocusHere(); }
if (ImGui::InputText("##input", m_szInputBuf, IM_ARRAYSIZE(m_szInputBuf), input_text_flags, &TextEditCallbackStub, (void*)this)) if (ImGui::InputText("##input", m_szInputBuf, IM_ARRAYSIZE(m_szInputBuf), input_text_flags, &TextEditCallbackStub, reinterpret_cast<void*>(this)))
{ {
if (m_nSuggestPos != -1) if (m_nSuggestPos != -1)
{ {
@ -248,9 +248,15 @@ void CConsole::BasePanel(bool* bDraw)
m_bReclaimFocus = false; m_bReclaimFocus = false;
} }
int nPad = 0;
if (static_cast<int>(m_vsvSuggest.size()) > 1)
{
// Pad with 18 to keep all items in view.
nPad = 18;
}
m_vecSuggestWindowPos = ImGui::GetItemRectMin(); m_vecSuggestWindowPos = ImGui::GetItemRectMin();
m_vecSuggestWindowPos.y += ImGui::GetItemRectSize().y; m_vecSuggestWindowPos.y += ImGui::GetItemRectSize().y;
m_vecSuggestWindowSize = ImVec2(500, std::clamp((int)m_vsvSuggest.size() * (int)ImGui::GetTextLineHeight(), 37, 122)); m_vecSuggestWindowSize = ImVec2(500, nPad + std::clamp(static_cast<int>(m_vsvSuggest.size()) * 18, 37, 122));
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button("Submit")) if (ImGui::Button("Submit"))
@ -372,7 +378,7 @@ bool CConsole::CanAutoComplete(void)
memmove(szCurInputBuf, m_szInputBuf, strlen(m_szInputBuf) + 1); memmove(szCurInputBuf, m_szInputBuf, strlen(m_szInputBuf) + 1);
FindFromPartial(); FindFromPartial();
} }
if ((int)m_vsvSuggest.size() <= 0) if (static_cast<int>(m_vsvSuggest.size()) <= 0)
{ {
m_nSuggestPos = -1; m_nSuggestPos = -1;
return false; return false;
@ -413,25 +419,35 @@ void CConsole::FindFromPartial(void)
if (std::find(m_vsvSuggest.begin(), m_vsvSuggest.end(), g_vsvAllConVars[i]) == m_vsvSuggest.end()) if (std::find(m_vsvSuggest.begin(), m_vsvSuggest.end(), g_vsvAllConVars[i]) == m_vsvSuggest.end())
{ {
std::string svValue; std::string svValue;
ConVar* pConVar = g_pCVar->FindVar(g_vsvAllConVars[i].c_str()); ConCommandBase* pCommandBase = g_pCVar->FindCommandBase(g_vsvAllConVars[i].c_str());
if (pConVar != nullptr)
{
svValue = "= \""; // Assign default value to string if its a ConVar.
svValue.append(pConVar->GetString());
svValue.append("\"");
if (pCommandBase != nullptr)
{
if (!pCommandBase->IsCommand())
{
ConVar* pConVar = reinterpret_cast<ConVar*>(pCommandBase);
svValue = "= ["; // Assign default value to string if its a ConVar.
svValue.append(pConVar->GetString());
svValue.append("]");
}
if (con_suggestion_helptext->GetBool()) if (con_suggestion_helptext->GetBool())
{ {
std::string svHelpText = pConVar->GetHelpText(); if (pCommandBase->GetHelpText())
if (!svHelpText.empty())
{ {
svValue.append(" | [" + svHelpText + "]"); std::string svHelpText = pCommandBase->GetHelpText();
if (!svHelpText.empty())
{
svValue.append(" | \"" + svHelpText + "\"");
}
} }
if (pCommandBase->GetUsageText())
std::string svUsageText = pConVar->GetUsageText();
if (!svUsageText.empty())
{ {
svValue.append(" | [" + svUsageText + "]"); std::string svUsageText = pCommandBase->GetUsageText();
if (!svUsageText.empty())
{
svValue.append(" | \"" + svUsageText + "\"");
}
} }
} }
} }
@ -459,7 +475,7 @@ void CConsole::ProcessCommand(const char* pszCommand)
std::this_thread::sleep_for(std::chrono::milliseconds(1)); std::this_thread::sleep_for(std::chrono::milliseconds(1));
m_nHistoryPos = -1; m_nHistoryPos = -1;
for (int i = (int)m_vsvHistory.size() - 1; i >= 0; i--) for (int i = static_cast<int>(m_vsvHistory.size()) - 1; i >= 0; i--)
{ {
if (Stricmp(m_vsvHistory[i].c_str(), pszCommand) == 0) if (Stricmp(m_vsvHistory[i].c_str(), pszCommand) == 0)
{ {
@ -476,7 +492,7 @@ void CConsole::ProcessCommand(const char* pszCommand)
else if (Stricmp(pszCommand, "HELP") == 0) else if (Stricmp(pszCommand, "HELP") == 0)
{ {
AddLog("Commands:"); AddLog("Commands:");
for (int i = 0; i < (int)m_vsvCommands.size(); i++) for (int i = 0; i < static_cast<int>(m_vsvCommands.size()); i++)
{ {
AddLog("- %s", m_vsvCommands[i].c_str()); AddLog("- %s", m_vsvCommands[i].c_str());
} }
@ -497,8 +513,8 @@ void CConsole::ProcessCommand(const char* pszCommand)
} }
else if (Stricmp(pszCommand, "HISTORY") == 0) else if (Stricmp(pszCommand, "HISTORY") == 0)
{ {
int nFirst = (int)m_vsvHistory.size() - 10; int nFirst = static_cast<int>(m_vsvHistory.size()) - 10;
for (int i = nFirst > 0 ? nFirst : 0; i < (int)m_vsvHistory.size(); i++) for (int i = nFirst > 0 ? nFirst : 0; i < static_cast<int>(m_vsvHistory.size()); i++)
{ {
AddLog("%3d: %s\n", i, m_vsvHistory[i].c_str()); AddLog("%3d: %s\n", i, m_vsvHistory[i].c_str());
} }
@ -543,7 +559,7 @@ int CConsole::TextEditCallback(ImGuiInputTextCallbackData* iData)
} }
else if (iData->EventKey == ImGuiKey_DownArrow) else if (iData->EventKey == ImGuiKey_DownArrow)
{ {
if (m_nSuggestPos < (int)m_vsvSuggest.size() - 1) if (m_nSuggestPos < static_cast<int>(m_vsvSuggest.size()) - 1)
{ {
m_nSuggestPos++; m_nSuggestPos++;
m_bSuggestMoved = true; m_bSuggestMoved = true;
@ -557,7 +573,7 @@ int CConsole::TextEditCallback(ImGuiInputTextCallbackData* iData)
{ {
if (m_nHistoryPos == -1) if (m_nHistoryPos == -1)
{ {
m_nHistoryPos = (int)m_vsvHistory.size() - 1; m_nHistoryPos = static_cast<int>(m_vsvHistory.size()) - 1;
} }
else if (m_nHistoryPos > 0) else if (m_nHistoryPos > 0)
{ {
@ -568,7 +584,7 @@ int CConsole::TextEditCallback(ImGuiInputTextCallbackData* iData)
{ {
if (m_nHistoryPos != -1) if (m_nHistoryPos != -1)
{ {
if (++m_nHistoryPos >= (int)m_vsvHistory.size()) if (++m_nHistoryPos >= static_cast<int>(m_vsvHistory.size()))
{ {
m_nHistoryPos = -1; m_nHistoryPos = -1;
} }
@ -636,7 +652,7 @@ int CConsole::TextEditCallback(ImGuiInputTextCallbackData* iData)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
int CConsole::TextEditCallbackStub(ImGuiInputTextCallbackData* iData) int CConsole::TextEditCallbackStub(ImGuiInputTextCallbackData* iData)
{ {
CConsole* pConsole = (CConsole*)iData->UserData; CConsole* pConsole = reinterpret_cast<CConsole*>(iData->UserData);
return pConsole->TextEditCallback(iData); return pConsole->TextEditCallback(iData);
} }

View File

@ -19,7 +19,7 @@ ConVar::ConVar(const char* pszName, const char* pszDefaultValue, int nFlags, con
ConVar* pNewConVar = reinterpret_cast<ConVar*>(MemAlloc_Wrapper(sizeof(ConVar))); // Allocate new memory with StdMemAlloc else we crash. ConVar* pNewConVar = reinterpret_cast<ConVar*>(MemAlloc_Wrapper(sizeof(ConVar))); // Allocate new memory with StdMemAlloc else we crash.
memset(pNewConVar, '\0', sizeof(ConVar)); // Set all to null. memset(pNewConVar, '\0', sizeof(ConVar)); // Set all to null.
pNewConVar->m_ConCommandBase.m_pConCommandBaseVTable = g_pConVarVtable.RCast<void*>(); pNewConVar->m_pConCommandBaseVTable = g_pConVarVtable.RCast<void*>();
pNewConVar->m_pIConVarVTable = g_pIConVarVtable.RCast<void*>(); pNewConVar->m_pIConVarVTable = g_pIConVarVtable.RCast<void*>();
ConVar_Register(pNewConVar, pszName, pszDefaultValue, nFlags, pszHelpString, bMin, fMin, bMax, fMax, pCallback, pszUsageString); ConVar_Register(pNewConVar, pszName, pszDefaultValue, nFlags, pszHelpString, bMin, fMin, bMax, fMax, pCallback, pszUsageString);
@ -132,7 +132,7 @@ void ConVar::Init(void) const
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void ConVar::AddFlags(int nFlags) void ConVar::AddFlags(int nFlags)
{ {
m_pParent->m_ConCommandBase.m_nFlags |= nFlags; m_pParent->m_nFlags |= nFlags;
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -141,7 +141,7 @@ void ConVar::AddFlags(int nFlags)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void ConVar::RemoveFlags(int nFlags) void ConVar::RemoveFlags(int nFlags)
{ {
m_ConCommandBase.m_nFlags &= ~nFlags; m_nFlags &= ~nFlags;
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -150,7 +150,7 @@ void ConVar::RemoveFlags(int nFlags)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
const char* ConVar::GetBaseName(void) const const char* ConVar::GetBaseName(void) const
{ {
return m_pParent->m_ConCommandBase.m_pszName; return m_pParent->m_pszName;
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -159,7 +159,7 @@ const char* ConVar::GetBaseName(void) const
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
const char* ConVar::GetHelpText(void) const const char* ConVar::GetHelpText(void) const
{ {
return m_pParent->m_ConCommandBase.m_pszHelpString; return m_pParent->m_pszHelpString;
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -168,7 +168,7 @@ const char* ConVar::GetHelpText(void) const
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
const char* ConVar::GetUsageText(void) const const char* ConVar::GetUsageText(void) const
{ {
return m_pParent->m_ConCommandBase.m_pszUsageString; return m_pParent->m_pszUsageString;
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -214,7 +214,7 @@ Color ConVar::GetColor(void) const
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
const char* ConVar::GetString(void) const const char* ConVar::GetString(void) const
{ {
if (m_ConCommandBase.m_nFlags & FCVAR_NEVER_AS_STRING) if (m_nFlags & FCVAR_NEVER_AS_STRING)
{ {
return "FCVAR_NEVER_AS_STRING"; return "FCVAR_NEVER_AS_STRING";
} }
@ -308,7 +308,7 @@ void ConVar::SetValue(int nValue)
m_Value.m_fValue = flValue; m_Value.m_fValue = flValue;
m_Value.m_fValue = nValue; m_Value.m_fValue = nValue;
if (!(m_ConCommandBase.m_nFlags & FCVAR_NEVER_AS_STRING)) if (!(m_nFlags & FCVAR_NEVER_AS_STRING))
{ {
char szTempValue[32]; char szTempValue[32];
snprintf(szTempValue, sizeof(szTempValue), "%d", m_Value.m_nValue); snprintf(szTempValue, sizeof(szTempValue), "%d", m_Value.m_nValue);
@ -338,7 +338,7 @@ void ConVar::SetValue(float flValue)
m_Value.m_fValue = flValue; m_Value.m_fValue = flValue;
m_Value.m_nValue = (int)m_Value.m_fValue; m_Value.m_nValue = (int)m_Value.m_fValue;
if (!(m_ConCommandBase.m_nFlags & FCVAR_NEVER_AS_STRING)) if (!(m_nFlags & FCVAR_NEVER_AS_STRING))
{ {
char szTempValue[32]; char szTempValue[32];
snprintf(szTempValue, sizeof(szTempValue), "%f", m_Value.m_fValue); snprintf(szTempValue, sizeof(szTempValue), "%f", m_Value.m_fValue);
@ -392,7 +392,7 @@ void ConVar::SetValue(const char* pszValue)
m_Value.m_nValue = (int)(m_Value.m_fValue); m_Value.m_nValue = (int)(m_Value.m_fValue);
} }
if (!(m_ConCommandBase.m_nFlags & FCVAR_NEVER_AS_STRING)) if (!(m_nFlags & FCVAR_NEVER_AS_STRING))
{ {
ChangeStringValue(pszNewValue, flOldValue); ChangeStringValue(pszNewValue, flOldValue);
} }
@ -560,7 +560,7 @@ bool ConVar::ClampValue(float& flValue)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
bool ConVar::IsRegistered(void) const bool ConVar::IsRegistered(void) const
{ {
return m_pParent->m_ConCommandBase.m_bRegistered; return m_pParent->m_bRegistered;
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -582,20 +582,20 @@ bool ConVar::IsFlagSet(ConVar* pConVar, int nFlags)
if (cm_debug_cmdquery->GetBool()) if (cm_debug_cmdquery->GetBool())
{ {
printf("--------------------------------------------------\n"); printf("--------------------------------------------------\n");
printf(" Flaged: %08X\n", pConVar->m_ConCommandBase.m_nFlags); printf(" Flaged: %08X\n", pConVar->m_nFlags);
} }
if (cm_return_false_cmdquery_cheats->GetBool()) if (cm_return_false_cmdquery_cheats->GetBool())
{ {
// Mask off FCVAR_CHEATS and FCVAR_DEVELOPMENTONLY. // Mask off FCVAR_CHEATS and FCVAR_DEVELOPMENTONLY.
pConVar->m_ConCommandBase.RemoveFlags(FCVAR_DEVELOPMENTONLY | FCVAR_CHEAT); pConVar->RemoveFlags(FCVAR_DEVELOPMENTONLY | FCVAR_CHEAT);
} }
else // Mask off FCVAR_DEVELOPMENTONLY. else // Mask off FCVAR_DEVELOPMENTONLY.
{ {
pConVar->m_ConCommandBase.RemoveFlags(FCVAR_DEVELOPMENTONLY); pConVar->RemoveFlags(FCVAR_DEVELOPMENTONLY);
} }
if (cm_debug_cmdquery->GetBool()) if (cm_debug_cmdquery->GetBool())
{ {
printf(" Masked: %08X\n", pConVar->m_ConCommandBase.m_nFlags); printf(" Masked: %08X\n", pConVar->m_nFlags);
printf(" Verify: %08X\n", nFlags); printf(" Verify: %08X\n", nFlags);
printf("--------------------------------------------------\n"); printf("--------------------------------------------------\n");
} }
@ -610,7 +610,7 @@ bool ConVar::IsFlagSet(ConVar* pConVar, int nFlags)
return false; return false;
} }
// Return false on every FCVAR_DEVELOPMENTONLY query. // Return false on every FCVAR_DEVELOPMENTONLY query.
return pConVar->m_ConCommandBase.HasFlags(nFlags) != 0; return pConVar->HasFlags(nFlags) != 0;
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------

View File

@ -82,7 +82,7 @@ dq offset RegisterConVar; #STR: "Convar '%s' is flagged as both FCVAR_ARCHIVE an
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Purpose: A console variable // Purpose: A console variable
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
class ConVar class ConVar : public ConCommandBase
{ {
public: public:
ConVar(void){}; ConVar(void){};
@ -140,7 +140,6 @@ public:
int m_nValue; int m_nValue;
}; };
ConCommandBase m_ConCommandBase {}; //0x0000
void* m_pIConVarVTable {}; //0x0040 void* m_pIConVarVTable {}; //0x0040
ConVar* m_pParent {}; //0x0048 ConVar* m_pParent {}; //0x0048
const char* m_pszDefaultValue{}; //0x0050 const char* m_pszDefaultValue{}; //0x0050

View File

@ -147,7 +147,7 @@ bool ConCommand::IsCommand(void) const
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
bool ConCommandBase::IsCommand(void) const bool ConCommandBase::IsCommand(void) const
{ {
return true; return m_pConCommandBaseVTable != g_pConVarVtable.RCast<void*>();
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -255,6 +255,15 @@ const char* ConCommandBase::GetHelpText(void) const
return m_pszHelpString; return m_pszHelpString;
} }
//-----------------------------------------------------------------------------
// Purpose: Returns the ConCommandBase usage text.
// Output : const char*
//-----------------------------------------------------------------------------
const char* ConCommandBase::GetUsageText(void) const
{
return m_pszUsageString;
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Purpose: Copies string using local new/delete operators // Purpose: Copies string using local new/delete operators
// Input : *szFrom - // Input : *szFrom -

View File

@ -91,6 +91,7 @@ public:
int GetFlags(void) const; int GetFlags(void) const;
ConCommandBase* GetNext(void) const; ConCommandBase* GetNext(void) const;
const char* GetHelpText(void) const; const char* GetHelpText(void) const;
const char* GetUsageText(void) const;
char* CopyString(const char* szFrom) const; char* CopyString(const char* szFrom) const;