15 #include <unordered_map>
22 namespace visualization {
29 std::string CalcShortcutText(
KeyName key) {
63 auto it = this->id2idx_.find(item_id);
64 if (it != this->id2idx_.end()) {
65 return &this->items_[it->second];
67 for (
auto &item : this->items_) {
101 for (
auto &kv : impl_->id2idx_) {
102 if (
int(kv.second) >= index) {
106 impl_->id2idx_[item_id] = impl_->items_.size();
107 impl_->items_.insert(impl_->items_.begin() + index,
108 {item_id, name, key, nullptr});
113 std::shared_ptr<MenuBase> submenu) {
114 for (
auto &kv : impl_->id2idx_) {
115 if (
int(kv.second) >= index) {
119 auto imgui_submenu = std::dynamic_pointer_cast<MenuImgui>(submenu);
120 impl_->items_.insert(impl_->items_.begin() + index,
121 {NO_ITEM, name, KEY_NONE, imgui_submenu,
122 imgui_submenu->impl_.get()});
126 for (
auto &kv : impl_->id2idx_) {
127 if (
int(kv.second) >= index) {
131 impl_->items_.insert(
132 impl_->items_.begin() + index,
133 {NO_ITEM,
"", KEY_NONE, nullptr, nullptr, false, false, true});
139 auto *item = impl_->FindMenuItem(item_id);
141 return item->is_enabled_;
147 auto *item = impl_->FindMenuItem(item_id);
149 item->is_enabled_ = enabled;
154 auto *item = impl_->FindMenuItem(item_id);
156 return item->is_checked_;
162 auto *item = impl_->FindMenuItem(item_id);
164 item->is_checked_ = checked;
169 auto em =
std::ceil(ImGui::GetTextLineHeight());
170 auto padding = ImGui::GetStyle().FramePadding;
175 return impl_->submenu_visibility_changed_;
183 size.x = ImGui::GetIO().DisplaySize.x;
185 auto padding = ImGui::GetStyle().FramePadding;
186 ImGui::PushStyleVar(ImGuiStyleVar_FramePadding,
189 impl_->submenu_visibility_changed_ =
false;
190 ImGui::BeginMainMenuBar();
191 for (
auto &item : impl_->items_) {
193 bool submenu_visible = item.submenu_impl_->submenu_visible_;
194 auto id = item.submenu_->Draw(
context, item.name_.c_str(),
199 if (submenu_visible != item.submenu_impl_->submenu_visible_) {
200 impl_->submenu_visibility_changed_ =
true;
210 ImDrawList *draw_list = ImGui::GetWindowDrawList();
211 draw_list->AddLine(ImVec2(0, y), ImVec2(
size.x, y),
212 context.theme.menubar_border_color.ToABGR32(), 1.0f);
214 ImGui::EndMainMenuBar();
216 ImGui::PopStyleVar();
234 auto *font = ImGui::GetFont();
235 int em = int(
std::ceil(ImGui::GetTextLineHeight()));
236 int padding =
context.theme.default_margin;
237 int name_width = 0, shortcut_width = 0;
238 for (
auto &item : impl_->items_) {
239 auto size1 = font->CalcTextSizeA(
float(
context.theme.font_size), 10000,
240 10000, item.name_.c_str());
241 auto shortcut = CalcShortcutText(item.shortcut_key_);
242 auto size2 = font->CalcTextSizeA(
float(
context.theme.font_size), 10000,
243 10000, shortcut.c_str());
247 int width = padding + name_width + 2 * em + shortcut_width + 2 * em +
250 ImGui::SetNextWindowContentSize(ImVec2(
float(
width), 0));
251 ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding,
252 ImVec2(0,
float(
context.theme.default_margin)));
253 ImGui::PushStyleVar(ImGuiStyleVar_PopupRounding,
254 float(
context.theme.font_size) / 3.0f);
255 ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing,
256 ImVec2(
float(
context.theme.default_margin),
257 float(
context.theme.default_margin)));
259 if (ImGui::BeginMenu(
name, is_enabled)) {
260 impl_->submenu_visible_ =
true;
262 for (
size_t i = 0; i < impl_->items_.size(); ++i) {
263 auto &item = impl_->items_[i];
264 if (item.is_separator_) {
266 }
else if (item.submenu_) {
267 ImGui::SetCursorPosX(
float(padding));
268 auto possibility = item.submenu_->Draw(
269 context, item.name_.c_str(), is_enabled);
271 activate_id = possibility;
276 auto y = ImGui::GetCursorPosY();
277 if (ImGui::MenuItem(
"",
"",
false, item.is_enabled_)) {
278 activate_id = item.id_;
284 ImGui::SetCursorPos(ImVec2(
float(padding), y));
285 auto shortcut_text = CalcShortcutText(item.shortcut_key_);
286 ImGui::MenuItem(item.name_.c_str(), shortcut_text.c_str(),
287 item.is_checked_, item.is_enabled_);
292 impl_->submenu_visible_ =
false;
295 ImGui::PopStyleVar(3);
MiniVec< float, N > ceil(const MiniVec< float, N > &a)
static const float EXTRA_PADDING_Y
Generic file read and write utility for python interface.