载入中...
搜索中...
未找到
ControlPrimitives.h
浏览该文件的文档.
1#pragma once
2
3#include <imgui.h>
4
5#include <cstdint>
6#include <string>
7#include <vector>
8
10
12enum class ControlEdit : uint8_t { Unchanged = 0, Changed };
13
15inline ControlEdit button(const char *label, float width = 0.f, float height = 0.f) {
16 const bool changed = (width > 0.f || height > 0.f) ? ImGui::Button(label, ImVec2(width, height))
18 : ImGui::Button(label);
20}
21
23inline ControlEdit checkbox(const char *label, bool &value) {
25 return ImGui::Checkbox(label, &value) ? ControlEdit::Changed : ControlEdit::Unchanged;
26}
27
29inline ControlEdit slider(const char *label, float &value, float minimum, float maximum,
30 const char *format = "%.3f") {
32 return ImGui::SliderFloat(label, &value, minimum, maximum, format) ? ControlEdit::Changed
34}
35
37inline ControlEdit combo(const char *label, int &selected,
38 const std::vector<const char *> &items) {
39 const bool changed = !items.empty() &&
41 ImGui::Combo(label, &selected, items.data(),
42 static_cast<int>(items.size()));
44}
45
46namespace detail {
53inline int resizeInput(ImGuiInputTextCallbackData *data) {
54 if (data->EventFlag != ImGuiInputTextFlags_CallbackResize) return 0;
55 auto *value = static_cast<std::string *>(data->UserData);
56 value->resize(static_cast<size_t>(data->BufTextLen));
57 data->Buf = value->data();
58 return 0;
59}
60} // namespace detail
61
63inline ControlEdit inputText(const char *label, std::string &value, bool multiline = false,
64 ImVec2 multilineSize = ImVec2(0.f, 96.f)) {
65 if (value.capacity() == 0) value.reserve(64);
66 const ImGuiInputTextFlags flags = ImGuiInputTextFlags_CallbackResize;
67 const bool changed = multiline
68 ? ImGui::InputTextMultiline(label, value.data(), value.capacity() + 1,
69 multilineSize, flags, detail::resizeInput,
70 &value)
72 : ImGui::InputText(label, value.data(), value.capacity() + 1, flags,
74 value.resize(std::char_traits<char>::length(value.c_str()));
76}
77
79inline ControlEdit inputTextWithHint(const char *label, const char *hint, std::string &value) {
80 if (value.capacity() == 0) value.reserve(64);
81 const bool changed = ImGui::InputTextWithHint(
82 label, hint, value.data(), value.capacity() + 1, ImGuiInputTextFlags_CallbackResize,
84 value.resize(std::char_traits<char>::length(value.c_str()));
86}
87
88} // namespace eve::ui::controls
double value
std::string label
float maximum[3]
float minimum[3]
std::uint32_t height
std::uint32_t width
int detail
int resizeInput(ImGuiInputTextCallbackData *data)
Grows an owning string for ImGui's synchronous resize callback.
ControlEdit slider(const char *label, float &value, float minimum, float maximum, const char *format="%.3f")
Shared immediate renderer for scalar sliders.
ControlEdit button(const char *label, float width=0.f, float height=0.f)
Shared immediate renderer for retained and EditorHost buttons.
ControlEdit combo(const char *label, int &selected, const std::vector< const char * > &items)
Shared immediate renderer for indexed combo boxes.
ControlEdit inputText(const char *label, std::string &value, bool multiline=false, ImVec2 multilineSize=ImVec2(0.f, 96.f))
UTF-8 owning text editor with automatic buffer growth.
ControlEdit inputTextWithHint(const char *label, const char *hint, std::string &value)
UTF-8 owning single-line editor with placeholder text and automatic growth.
ControlEdit checkbox(const char *label, bool &value)
Shared immediate renderer for retained and EditorHost checkboxes.
ControlEdit
Result of drawing one immediate control in the current frame.