21 template<uint32_t BufSize = 256,
float InputBarWidth = 220.0f,
typename StringType>
22 static bool SearchWidget(StringType& SearchStr,
23 const char* Hint =
"Search...",
24 bool* GrabFocus =
nullptr)
26 ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 1.0f);
28 bool Modified =
false;
29 bool Searching =
false;
31 const float AreaPosX = ImGui::GetCursorPosX();
32 const float FramePaddingX = ImGui::GetStyle().FramePadding.x;
33 const float FramePaddingY = ImGui::GetStyle().FramePadding.y;
36 ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f);
37 ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(28.0f, FramePaddingY));
40 ImGui::SetNextItemAllowOverlap();
41 ImGui::SetNextItemWidth(InputBarWidth);
43 if constexpr (std::is_same_v<StringType, std::string>)
45 char SearchBuf[BufSize + 1]{};
46 strncpy(SearchBuf, SearchStr.c_str(), BufSize);
48 if (ImGui::InputText(
"##Search", SearchBuf, BufSize))
50 SearchStr = SearchBuf;
53 else if (ImGui::IsItemDeactivatedAfterEdit())
55 SearchStr = SearchBuf;
59 Searching = (SearchBuf[0] !=
'\0');
63 static_assert(std::is_same_v<
decltype(&SearchStr[0]),
char*>,
"SearchStr parameter must be std::string& or char*");
64 if (ImGui::InputText(
"##Search", SearchStr, BufSize))
68 else if (ImGui::IsItemDeactivatedAfterEdit())
73 Searching = SearchStr[0] !=
'\0';
76 LK_UI_DEBUG_BOUNDING_BOX(RGBA32::NiceBlue);
78 const ImVec2 InputBarPosStart = ImGui::GetItemRectMin();
79 const ImVec2 InputBarPosEnd = ImGui::GetItemRectMax();
82 const ImVec2 InputBarSize(
83 InputBarPosEnd.x - InputBarPosStart.x,
84 InputBarPosEnd.y - InputBarPosStart.y
88 if (GrabFocus && *GrabFocus)
90 if (ImGui::IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows)
91 && !ImGui::IsAnyItemActive()
92 && !ImGui::IsMouseClicked(0))
94 ImGui::SetKeyboardFocusHere(-1);
97 if (ImGui::IsItemFocused())
100 LK_CORE_DEBUG_TAG(
"SearchWidget",
"Setting GrabFocus to false");
105 const ImRect ItemRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax());
106 ImGui::RenderNavCursor(ItemRect, ImGui::GetID(
"##Search"));
108 ImGui::SameLine(AreaPosX + 5.0f);
114 const ImVec2 IconSize(ImGui::GetTextLineHeight(), ImGui::GetTextLineHeight());
115 LK_CORE_ASSERT((IconSize.x > 0) && (IconSize.y > 0));
119 const float IconYOffset = FramePaddingY - 3.0f;
120 ImGui::SetCursorPosY(ImGui::GetCursorPosY() + IconYOffset);
122 FEditorResources::SearchIcon,
126 ImVec4(1.0f, 1.0f, 1.0f, 0.20f),
127 ImVec4(0.0f, 0.0f, 0.0f, 0.0f)
129 ImGui::SetCursorPosY(ImGui::GetCursorPosY() - IconYOffset);
136 ImGui::SetCursorPosY(ImGui::GetCursorPosY() - FramePaddingY + 2.0f);
137 ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.50f, 0.50f, 0.50f, 1.0f));
138 ImGui::TextUnformatted(Hint);
139 ImGui::PopStyleColor();
140 ImGui::SetCursorPosY(ImGui::GetCursorPosY() + FramePaddingY - 2.0f);
147 static constexpr float SpacingX = 4.0f;
148 const float LineHeight = ImGui::GetItemRectSize().y - (FramePaddingY / 2.0f);
149 ImGui::SameLine(0.0f, InputBarSize.x - (2.0f * IconSize.x) - FramePaddingX - SpacingX);
150 ImGui::SetCursorPosY(ImGui::GetCursorPosY() + FramePaddingY);
151 if (ImGui::InvisibleButton(
"##Clear", ImVec2(LineHeight, LineHeight)))
153 if constexpr (std::is_same_v<StringType, std::string>)
159 std::memset(SearchStr, 0, BufSize);
164 ImGui::SetCursorPosY(ImGui::GetCursorPosY() - FramePaddingY);
167 if (ImGui::IsItemHovered())
169 ImGui::SetMouseCursor(ImGuiMouseCursor_Arrow);
170 UI::SetTooltip(LK_FMT_LIB::format(
"StartPos: ({}, {}) EndPos: ({}, {}) InputBarSize: ({}, {})",
171 InputBarPosStart.x, InputBarPosStart.y,
172 InputBarPosEnd.x, InputBarPosEnd.y,
173 InputBarSize.x, InputBarSize.y));
178 FEditorResources::ClearIcon,
179 IM_COL32(150, 150, 150, 200),
180 IM_COL32(170, 170, 170, 255),
181 IM_COL32(160, 160, 160, 150),
182 UI::RectExpanded(UI::GetItemRect(), -1.0f, -1.0f)
186 LK_UI_DEBUG_BOUNDING_BOX(RGBA32::BrightGreen);
189 ImGui::SetCursorScreenPos(ImVec2(InputBarPosEnd.x, ImGui::GetCursorScreenPos().y));
194 ImGui::SetCursorPosY(ImGui::GetCursorPosY() - 1.0f);
195 ImGui::PopStyleVar(2);
200 static bool OptionsButton();