Add support for applying the autocomplete for fonticons with the enter key
- This also closes the fonticon sequence
This commit is contained in:
parent
256c96d413
commit
e70b329614
@ -443,13 +443,15 @@ namespace Components
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextRenderer::AutocompleteFill(const FontIconAutocompleteContext& context, Game::ScreenPlacement* scrPlace, Game::field_t* edit)
|
void TextRenderer::AutocompleteFill(const FontIconAutocompleteContext& context, Game::ScreenPlacement* scrPlace, Game::field_t* edit, const bool closeFontIcon)
|
||||||
{
|
{
|
||||||
if (context.selectedOffset >= context.resultOffset + context.resultCount)
|
if (context.selectedOffset >= context.resultOffset + context.resultCount)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const auto selectedResultIndex = context.selectedOffset - context.resultOffset;
|
const auto selectedResultIndex = context.selectedOffset - context.resultOffset;
|
||||||
std::string remainingFillData = context.results[selectedResultIndex].materialName.substr(context.lastQuery.size());
|
std::string remainingFillData = context.results[selectedResultIndex].materialName.substr(context.lastQuery.size());
|
||||||
|
if (closeFontIcon)
|
||||||
|
remainingFillData += ":";
|
||||||
const std::string moveData(&edit->buffer[edit->cursor]);
|
const std::string moveData(&edit->buffer[edit->cursor]);
|
||||||
|
|
||||||
const auto remainingBufferCharacters = std::extent_v<decltype(Game::field_t::buffer)> - edit->cursor - moveData.size() - 1;
|
const auto remainingBufferCharacters = std::extent_v<decltype(Game::field_t::buffer)> - edit->cursor - moveData.size() - 1;
|
||||||
@ -480,8 +482,17 @@ namespace Components
|
|||||||
AutocompleteDown(context);
|
AutocompleteDown(context);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
case Game::K_ENTER:
|
||||||
|
case Game::K_KP_ENTER:
|
||||||
|
if(context.resultCount > 0)
|
||||||
|
{
|
||||||
|
AutocompleteFill(context, scrPlace, edit, true);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
case Game::K_TAB:
|
case Game::K_TAB:
|
||||||
AutocompleteFill(context, scrPlace, edit);
|
AutocompleteFill(context, scrPlace, edit, false);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case Game::K_ESCAPE:
|
case Game::K_ESCAPE:
|
||||||
@ -498,10 +509,28 @@ namespace Components
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool TextRenderer::HandleFontIconAutocompleteKey(const int localClientNum, const FontIconAutocompleteInstance autocompleteInstance, const int key)
|
||||||
|
{
|
||||||
|
assert(autocompleteInstance < FONT_ICON_ACI_COUNT);
|
||||||
|
if (autocompleteInstance >= FONT_ICON_ACI_COUNT)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
auto& autocompleteContext = autocompleteContextArray[autocompleteInstance];
|
||||||
|
if (!autocompleteContext.autocompleteActive)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if(autocompleteInstance == FONT_ICON_ACI_CONSOLE)
|
||||||
|
return AutocompleteHandleKeyDown(autocompleteContext, key, Game::scrPlaceFull, Game::g_consoleField);
|
||||||
|
|
||||||
|
if(autocompleteInstance == FONT_ICON_ACI_CHAT)
|
||||||
|
return AutocompleteHandleKeyDown(autocompleteContext, key, &Game::scrPlaceView[localClientNum], &Game::playerKeys[localClientNum].chatField);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void TextRenderer::Console_Key_Hk(const int localClientNum, const int key)
|
void TextRenderer::Console_Key_Hk(const int localClientNum, const int key)
|
||||||
{
|
{
|
||||||
auto& autocompleteContext = autocompleteContextArray[FONT_ICON_ACI_CONSOLE];
|
if (HandleFontIconAutocompleteKey(localClientNum, FONT_ICON_ACI_CONSOLE, key))
|
||||||
if (autocompleteContext.autocompleteActive && AutocompleteHandleKeyDown(autocompleteContext, key, Game::scrPlaceFull, Game::g_consoleField))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Utils::Hook::Call<void(int, int)>(0x4311E0)(localClientNum, key);
|
Utils::Hook::Call<void(int, int)>(0x4311E0)(localClientNum, key);
|
||||||
@ -509,8 +538,7 @@ namespace Components
|
|||||||
|
|
||||||
bool TextRenderer::ChatHandleKeyDown(const int localClientNum, const int key)
|
bool TextRenderer::ChatHandleKeyDown(const int localClientNum, const int key)
|
||||||
{
|
{
|
||||||
auto& autocompleteContext = autocompleteContextArray[FONT_ICON_ACI_CHAT];
|
return HandleFontIconAutocompleteKey(localClientNum, FONT_ICON_ACI_CHAT, key);
|
||||||
return autocompleteContext.autocompleteActive && AutocompleteHandleKeyDown(autocompleteContext, key, &Game::scrPlaceView[localClientNum], &Game::playerKeys[localClientNum].chatField);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr auto Message_Key = 0x5A7E50;
|
constexpr auto Message_Key = 0x5A7E50;
|
||||||
|
@ -42,6 +42,16 @@ namespace Components
|
|||||||
|
|
||||||
class TextRenderer : public Component
|
class TextRenderer : public Component
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
enum FontIconAutocompleteInstance : unsigned
|
||||||
|
{
|
||||||
|
FONT_ICON_ACI_CONSOLE,
|
||||||
|
FONT_ICON_ACI_CHAT,
|
||||||
|
|
||||||
|
FONT_ICON_ACI_COUNT
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
struct FontIconTableEntry
|
struct FontIconTableEntry
|
||||||
{
|
{
|
||||||
std::string iconName;
|
std::string iconName;
|
||||||
@ -56,14 +66,6 @@ namespace Components
|
|||||||
unsigned char v;
|
unsigned char v;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum FontIconAutocompleteInstance
|
|
||||||
{
|
|
||||||
FONT_ICON_ACI_CONSOLE,
|
|
||||||
FONT_ICON_ACI_CHAT,
|
|
||||||
|
|
||||||
FONT_ICON_ACI_COUNT
|
|
||||||
};
|
|
||||||
|
|
||||||
class FontIconAutocompleteResult
|
class FontIconAutocompleteResult
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -237,6 +239,8 @@ namespace Components
|
|||||||
static float GetNormalizedFontIconWidth(const FontIconInfo& fontIcon);
|
static float GetNormalizedFontIconWidth(const FontIconInfo& fontIcon);
|
||||||
static float GetFontIconWidth(const FontIconInfo& fontIcon, const Game::Font_s* font, float xScale);
|
static float GetFontIconWidth(const FontIconInfo& fontIcon, const Game::Font_s* font, float xScale);
|
||||||
|
|
||||||
|
static bool HandleFontIconAutocompleteKey(int localClientNum, FontIconAutocompleteInstance autocompleteInstance, int key);
|
||||||
|
|
||||||
TextRenderer();
|
TextRenderer();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -253,7 +257,7 @@ namespace Components
|
|||||||
|
|
||||||
static void AutocompleteUp(FontIconAutocompleteContext& context);
|
static void AutocompleteUp(FontIconAutocompleteContext& context);
|
||||||
static void AutocompleteDown(FontIconAutocompleteContext& context);
|
static void AutocompleteDown(FontIconAutocompleteContext& context);
|
||||||
static void AutocompleteFill(const FontIconAutocompleteContext& context, Game::ScreenPlacement* scrPlace, Game::field_t* edit);
|
static void AutocompleteFill(const FontIconAutocompleteContext& context, Game::ScreenPlacement* scrPlace, Game::field_t* edit, bool closeFontIcon);
|
||||||
static bool AutocompleteHandleKeyDown(FontIconAutocompleteContext& context, int key, Game::ScreenPlacement* scrPlace, Game::field_t* edit);
|
static bool AutocompleteHandleKeyDown(FontIconAutocompleteContext& context, int key, Game::ScreenPlacement* scrPlace, Game::field_t* edit);
|
||||||
static void Console_Key_Hk(int localClientNum, int key);
|
static void Console_Key_Hk(int localClientNum, int key);
|
||||||
static bool ChatHandleKeyDown(int localClientNum, int key);
|
static bool ChatHandleKeyDown(int localClientNum, int key);
|
||||||
|
Loading…
Reference in New Issue
Block a user