aboutsummaryrefslogtreecommitdiff
path: root/src/ui/controls/popup_menu.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/controls/popup_menu.cpp')
-rw-r--r--src/ui/controls/popup_menu.cpp58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/ui/controls/popup_menu.cpp b/src/ui/controls/popup_menu.cpp
new file mode 100644
index 00000000..88ea8f17
--- /dev/null
+++ b/src/ui/controls/popup_menu.cpp
@@ -0,0 +1,58 @@
+#include "popup_menu.hpp"
+
+#include "ui/window.hpp"
+#include "text_block.hpp"
+#include "list_item.hpp"
+#include "linear_layout.hpp"
+#include "ui/events/ui_event.hpp"
+
+namespace cru::ui::controls
+{
+ Window* CreatePopupMenu(const Point& anchor, const std::vector<MenuItemInfo>& items, Window* parent)
+ {
+ const auto popup = Window::CreatePopup(parent);
+
+ popup->lose_focus_event.AddHandler([popup](events::FocusChangeEventArgs& args)
+ {
+ if (args.IsWindow())
+ popup->Close();
+ });
+
+ const auto create_menu_item = [popup](const String& text, const std::function<void()>& action) -> ListItem*
+ {
+ auto text_block = TextBlock::Create(text);
+ text_block->GetLayoutParams()->width.alignment = Alignment::Start;
+
+ auto list_item = CreateWithLayout<ListItem>(
+ LayoutSideParams::Stretch(Alignment::Center),
+ LayoutSideParams::Content(Alignment::Start),
+ ControlList{ text_block }
+ );
+
+ list_item->mouse_click_event.AddHandler([popup, action](events::MouseButtonEventArgs& args)
+ {
+ if (args.GetMouseButton() == MouseButton::Left)
+ {
+ action();
+ popup->Close();
+ }
+ });
+
+ return list_item;
+ };
+
+ const auto menu = LinearLayout::Create(LinearLayout::Orientation::Vertical);
+
+ menu->SetBordered(true);
+
+ for (const auto& item : items)
+ menu->AddChild(create_menu_item(item.first, item.second));
+
+ popup->AddChild(menu);
+
+ popup->SetSizeFitContent();
+ popup->SetWindowPosition(anchor);
+
+ return popup;
+ }
+}