Draw an arbitrary US keyboard layout to visualize translated keys
| 21970 | |
| 21971 | // Draw an arbitrary US keyboard layout to visualize translated keys |
| 21972 | void ImGui::DebugRenderKeyboardPreview(ImDrawList* draw_list) |
| 21973 | { |
| 21974 | const float scale = ImGui::GetFontSize() / 13.0f; |
| 21975 | const ImVec2 key_size = ImVec2(35.0f, 35.0f) * scale; |
| 21976 | const float key_rounding = 3.0f * scale; |
| 21977 | const ImVec2 key_face_size = ImVec2(25.0f, 25.0f) * scale; |
| 21978 | const ImVec2 key_face_pos = ImVec2(5.0f, 3.0f) * scale; |
| 21979 | const float key_face_rounding = 2.0f * scale; |
| 21980 | const ImVec2 key_label_pos = ImVec2(7.0f, 4.0f) * scale; |
| 21981 | const ImVec2 key_step = ImVec2(key_size.x - 1.0f, key_size.y - 1.0f); |
| 21982 | const float key_row_offset = 9.0f * scale; |
| 21983 | |
| 21984 | ImVec2 board_min = GetCursorScreenPos(); |
| 21985 | ImVec2 board_max = ImVec2(board_min.x + 3 * key_step.x + 2 * key_row_offset + 10.0f, board_min.y + 3 * key_step.y + 10.0f); |
| 21986 | ImVec2 start_pos = ImVec2(board_min.x + 5.0f - key_step.x, board_min.y); |
| 21987 | |
| 21988 | struct KeyLayoutData { int Row, Col; const char* Label; ImGuiKey Key; }; |
| 21989 | const KeyLayoutData keys_to_display[] = |
| 21990 | { |
| 21991 | { 0, 0, "", ImGuiKey_Tab }, { 0, 1, "Q", ImGuiKey_Q }, { 0, 2, "W", ImGuiKey_W }, { 0, 3, "E", ImGuiKey_E }, { 0, 4, "R", ImGuiKey_R }, |
| 21992 | { 1, 0, "", ImGuiKey_CapsLock }, { 1, 1, "A", ImGuiKey_A }, { 1, 2, "S", ImGuiKey_S }, { 1, 3, "D", ImGuiKey_D }, { 1, 4, "F", ImGuiKey_F }, |
| 21993 | { 2, 0, "", ImGuiKey_LeftShift },{ 2, 1, "Z", ImGuiKey_Z }, { 2, 2, "X", ImGuiKey_X }, { 2, 3, "C", ImGuiKey_C }, { 2, 4, "V", ImGuiKey_V } |
| 21994 | }; |
| 21995 | |
| 21996 | // Elements rendered manually via ImDrawList API are not clipped automatically. |
| 21997 | // While not strictly necessary, here IsItemVisible() is used to avoid rendering these shapes when they are out of view. |
| 21998 | Dummy(board_max - board_min); |
| 21999 | if (!IsItemVisible()) |
| 22000 | return; |
| 22001 | draw_list->PushClipRect(board_min, board_max, true); |
| 22002 | for (int n = 0; n < IM_COUNTOF(keys_to_display); n++) |
| 22003 | { |
| 22004 | const KeyLayoutData* key_data = &keys_to_display[n]; |
| 22005 | ImVec2 key_min = ImVec2(start_pos.x + key_data->Col * key_step.x + key_data->Row * key_row_offset, start_pos.y + key_data->Row * key_step.y); |
| 22006 | ImVec2 key_max = key_min + key_size; |
| 22007 | draw_list->AddRectFilled(key_min, key_max, IM_COL32(204, 204, 204, 255), key_rounding); |
| 22008 | draw_list->AddRect(key_min, key_max, IM_COL32(24, 24, 24, 255), key_rounding); |
| 22009 | ImVec2 face_min = ImVec2(key_min.x + key_face_pos.x, key_min.y + key_face_pos.y); |
| 22010 | ImVec2 face_max = ImVec2(face_min.x + key_face_size.x, face_min.y + key_face_size.y); |
| 22011 | draw_list->AddRect(face_min, face_max, IM_COL32(193, 193, 193, 255), key_face_rounding, ImDrawFlags_None, 2.0f); |
| 22012 | draw_list->AddRectFilled(face_min, face_max, IM_COL32(252, 252, 252, 255), key_face_rounding); |
| 22013 | ImVec2 label_min = ImVec2(key_min.x + key_label_pos.x, key_min.y + key_label_pos.y); |
| 22014 | draw_list->AddText(label_min, IM_COL32(64, 64, 64, 255), key_data->Label); |
| 22015 | if (IsKeyDown(key_data->Key)) |
| 22016 | draw_list->AddRectFilled(key_min, key_max, IM_COL32(255, 0, 0, 128), key_rounding); |
| 22017 | } |
| 22018 | draw_list->PopClipRect(); |
| 22019 | } |
| 22020 | |
| 22021 | // Helper tool to diagnose between text encoding issues and font loading issues. Pass your UTF-8 string and verify that there are correct. |
| 22022 | void ImGui::DebugTextEncoding(const char* str) |
nothing calls this directly
no test coverage detected