MCPcopy Create free account
hub / github.com/cinder/Cinder / GetTypingSelectRequest

Method GetTypingSelectRequest

src/imgui/imgui_widgets.cpp:7441–7535  ·  view source on GitHub ↗

[Experimental] Currently not exposed in public API. Consume character inputs and return search request, if any. This would typically only be called on the focused window or location you want to grab inputs for, e.g. if (ImGui::IsWindowFocused(...)) if (ImGuiTypingSelectRequest* req = ImGui::GetTypingSelectRequest()) focus_idx = ImGui::TypingSelectFindMatch(req, my_items.size(), [](void*, int n) {

Source from the content-addressed store, hash-verified

7439// focus_idx = ImGui::TypingSelectFindMatch(req, my_items.size(), [](void*, int n) { return my_items[n]->Name; }, &my_items, -1);
7440// However the code is written in a way where calling it from multiple locations is safe (e.g. to obtain buffer).
7441ImGuiTypingSelectRequest* ImGui::GetTypingSelectRequest(ImGuiTypingSelectFlags flags)
7442{
7443 ImGuiContext& g = *GImGui;
7444 ImGuiTypingSelectState* data = &g.TypingSelectState;
7445 ImGuiTypingSelectRequest* out_request = &data->Request;
7446
7447 // Clear buffer
7448 const float TYPING_SELECT_RESET_TIMER = 1.80f; // FIXME: Potentially move to IO config.
7449 const int TYPING_SELECT_SINGLE_CHAR_COUNT_FOR_LOCK = 4; // Lock single char matching when repeating same char 4 times
7450 if (data->SearchBuffer[0] != 0)
7451 {
7452 bool clear_buffer = false;
7453 clear_buffer |= (g.NavFocusScopeId != data->FocusScope);
7454 clear_buffer |= (data->LastRequestTime + TYPING_SELECT_RESET_TIMER < g.Time);
7455 clear_buffer |= g.NavAnyRequest;
7456 clear_buffer |= g.ActiveId != 0 && g.NavActivateId == 0; // Allow temporary SPACE activation to not interfere
7457 clear_buffer |= IsKeyPressed(ImGuiKey_Escape) || IsKeyPressed(ImGuiKey_Enter);
7458 clear_buffer |= IsKeyPressed(ImGuiKey_Backspace) && (flags & ImGuiTypingSelectFlags_AllowBackspace) == 0;
7459 //if (clear_buffer) { IMGUI_DEBUG_LOG("GetTypingSelectRequest(): Clear SearchBuffer.\n"); }
7460 if (clear_buffer)
7461 data->Clear();
7462 }
7463
7464 // Append to buffer
7465 const int buffer_max_len = IM_ARRAYSIZE(data->SearchBuffer) - 1;
7466 int buffer_len = (int)ImStrlen(data->SearchBuffer);
7467 bool select_request = false;
7468 for (ImWchar w : g.IO.InputQueueCharacters)
7469 {
7470 const int w_len = ImTextCountUtf8BytesFromStr(&w, &w + 1);
7471 if (w < 32 || (buffer_len == 0 && ImCharIsBlankW(w)) || (buffer_len + w_len > buffer_max_len)) // Ignore leading blanks
7472 continue;
7473 char w_buf[5];
7474 ImTextCharToUtf8(w_buf, (unsigned int)w);
7475 if (data->SingleCharModeLock && w_len == out_request->SingleCharSize && memcmp(w_buf, data->SearchBuffer, w_len) == 0)
7476 {
7477 select_request = true; // Same character: don't need to append to buffer.
7478 continue;
7479 }
7480 if (data->SingleCharModeLock)
7481 {
7482 data->Clear(); // Different character: clear
7483 buffer_len = 0;
7484 }
7485 memcpy(data->SearchBuffer + buffer_len, w_buf, w_len + 1); // Append
7486 buffer_len += w_len;
7487 select_request = true;
7488 }
7489 g.IO.InputQueueCharacters.resize(0);
7490
7491 // Handle backspace
7492 if ((flags & ImGuiTypingSelectFlags_AllowBackspace) && IsKeyPressed(ImGuiKey_Backspace, ImGuiInputFlags_Repeat))
7493 {
7494 char* p = (char*)(void*)ImTextFindPreviousUtf8Codepoint(data->SearchBuffer, data->SearchBuffer + buffer_len);
7495 *p = 0;
7496 buffer_len = (int)(p - data->SearchBuffer);
7497 }
7498

Callers

nothing calls this directly

Calls 7

ImCharIsBlankWFunction · 0.85
ImTextCharToUtf8Function · 0.85
ClearMethod · 0.45
resizeMethod · 0.45

Tested by

no test coverage detected