49 const ImGuiViewport* viewport = ImGui::GetMainViewport();
50 const float width = std::min(600.0f, viewport->Size.x * 0.6f);
51 const float x = viewport->Pos.x + (viewport->Size.x - width) * 0.5f;
52 const float y = viewport->Pos.y + viewport->Size.y * 0.15f;
54 ImGui::SetNextWindowPos(ImVec2(x, y), ImGuiCond_Always);
55 ImGui::SetNextWindowSize(ImVec2(width, 0), ImGuiCond_Always);
56 ImGui::SetNextWindowFocus();
58 constexpr ImGuiWindowFlags kFlags =
59 ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize |
60 ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoSavedSettings |
61 ImGuiWindowFlags_AlwaysAutoResize;
63 if (!ImGui::Begin(
"##CommandPalettePopup", &
visible_, kFlags)) {
70 ImGui::SetKeyboardFocusHere();
73 ImGui::SetNextItemWidth(-1);
74 bool input_changed = ImGui::InputTextWithHint(
80 std::vector<CommandEntry> results;
84 if (results.empty()) {
87 if (results.empty()) {
90 if (results.size() > 20)
98 if (ImGui::IsKeyPressed(ImGuiKey_DownArrow)) {
102 if (ImGui::IsKeyPressed(ImGuiKey_UpArrow)) {
111 const float max_height = 400.0f;
112 if (ImGui::BeginChild(
114 ImVec2(0, std::min(max_height,
115 static_cast<float>(results.size()) *
116 ImGui::GetTextLineHeightWithSpacing())),
118 for (
int i = 0; i < static_cast<int>(results.size()); ++i) {
119 const auto& cmd = results[i];
124 if (ImGui::Selectable(
"##cmd", is_selected,
125 ImGuiSelectableFlags_SpanAvailWidth)) {
129 if (is_selected && ImGui::IsKeyPressed(ImGuiKey_Enter)) {
133 ImGui::SameLine(0, 0);
136 ImGui::TextDisabled(
"[%s]", cmd.category.c_str());
140 ImGui::TextUnformatted(cmd.name.c_str());
143 if (!cmd.shortcut.empty()) {
144 float shortcut_width = ImGui::CalcTextSize(cmd.shortcut.c_str()).x;
145 float avail = ImGui::GetContentRegionAvail().x;
146 if (avail > shortcut_width + 8) {
147 ImGui::SameLine(ImGui::GetWindowWidth() - shortcut_width -
148 ImGui::GetStyle().WindowPadding.x);
149 ImGui::TextDisabled(
"%s", cmd.shortcut.c_str());