16 namespace visualization {
20 float CalcSwitchWidth(
float height) {
return height * 1.55f; }
22 static int g_next_toggle_id = 1;
45 impl_->on_clicked_ = on_clicked;
50 auto em = ImGui::GetTextLineHeight();
51 auto padding = ImGui::GetStyle().FramePadding;
52 auto text_size = ImGui::GetFont()->CalcTextSizeA(
53 float(
context.theme.font_size), constraints.
width, 10000,
54 impl_->name_.c_str());
56 auto switch_width = CalcSwitchWidth(
height);
57 return Size(
int(switch_width +
std::ceil(text_size.x + 2.0f * padding.x)),
64 ImGui::SetCursorScreenPos(
65 ImVec2(
float(
frame.x),
float(
frame.y) - ImGui::GetScrollY()));
72 ImVec2 p = ImGui::GetCursorScreenPos();
73 ImDrawList* draw_list = ImGui::GetWindowDrawList();
77 float radius =
height * 0.50f;
79 ImGui::InvisibleButton(impl_->name_.c_str(), ImVec2(
width,
height));
84 if (ImGui::IsItemHovered()) {
91 if (ImGui::IsItemHovered()) {
99 if (ImGui::IsItemClicked()) {
100 impl_->is_on_ = !impl_->is_on_;
103 draw_list->AddRectFilled(p, ImVec2(p.x +
width, p.y +
height), track_color,
105 draw_list->AddRect(p, ImVec2(p.x +
width, p.y +
height),
108 (impl_->is_on_ ? 1.0f : 0.0f) * (
width - 2.0f * radius);
109 draw_list->AddCircleFilled(
110 ImVec2(p.x + radius + thumb_offset, p.y + radius), radius - 1.5f,
114 if (impl_->on_clicked_) {
115 impl_->on_clicked_(impl_->is_on_);
121 ImGui::TextUnformatted(impl_->name_.c_str());
122 ImGui::PopItemWidth();
DrawResult Draw(const DrawContext &context) override
ToggleSwitch(const char *title)
Size CalcPreferredSize(const LayoutContext &context, const Constraints &constraints) const override
void SetOnClicked(std::function< void(bool)> on_clicked)
MiniVec< float, N > ceil(const MiniVec< float, N > &a)
uint32_t colorToImguiRGBA(const Color &color)
Generic file read and write utility for python interface.
std::string to_string(const T &n)
std::function< void(bool)> on_clicked_