aboutsummaryrefslogtreecommitdiff
path: root/src/ui
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/CMakeLists.txt2
-rw-r--r--src/ui/components/Menu.cpp6
-rw-r--r--src/ui/components/PopupButton.cpp2
-rw-r--r--src/ui/components/Select.cpp31
-rw-r--r--src/ui/helper/ClickDetector.cpp11
5 files changed, 49 insertions, 3 deletions
diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt
index 9ad0df08..56205db0 100644
--- a/src/ui/CMakeLists.txt
+++ b/src/ui/CMakeLists.txt
@@ -3,6 +3,8 @@ add_library(cru_ui SHARED
ThemeManager.cpp
components/Component.cpp
components/Menu.cpp
+ components/PopupButton.cpp
+ components/Select.cpp
controls/Button.cpp
controls/CheckBox.cpp
controls/Container.cpp
diff --git a/src/ui/components/Menu.cpp b/src/ui/components/Menu.cpp
index 74909c85..ae00a2b2 100644
--- a/src/ui/components/Menu.cpp
+++ b/src/ui/components/Menu.cpp
@@ -92,8 +92,10 @@ void PopupMenu::SetPosition(const Point& position) {
void PopupMenu::Show() {
popup_.GetWindowHost()->RelayoutWithSize(Size::Infinate(), true);
- popup_.GetWindowHost()->GetNativeWindow()->SetVisibility(
- platform::gui::WindowVisibilityType::Show);
+ auto native_window = popup_.GetWindowHost()->GetNativeWindow();
+ native_window->SetVisibility(platform::gui::WindowVisibilityType::Show);
+ native_window->RequestFocus();
+ native_window->SetToForeground();
}
void PopupMenu::Close() { popup_.GetWindowHost()->GetNativeWindow()->Close(); }
diff --git a/src/ui/components/PopupButton.cpp b/src/ui/components/PopupButton.cpp
index 606d5fd8..8eed7c09 100644
--- a/src/ui/components/PopupButton.cpp
+++ b/src/ui/components/PopupButton.cpp
@@ -7,7 +7,7 @@ namespace cru::ui::components {
PopupMenuTextButton::PopupMenuTextButton() : popup_menu_(&button_) {
button_.SetChild(&button_text_);
button_.ClickEvent()->AddHandler([this](const helper::ClickEventArgs& args) {
- popup_menu_.SetPosition(args.GetDownPoint());
+ popup_menu_.SetPosition(args.GetDownPointOfScreen());
popup_menu_.Show();
});
}
diff --git a/src/ui/components/Select.cpp b/src/ui/components/Select.cpp
new file mode 100644
index 00000000..9f9fbfae
--- /dev/null
+++ b/src/ui/components/Select.cpp
@@ -0,0 +1,31 @@
+#include "cru/ui/components/Select.h"
+
+namespace cru::ui::components {
+Select::Select() {
+ button_.SetChild(&button_text_);
+ button_.ClickEvent()->AddHandler([this](const helper::ClickEventArgs& args) {
+ popup_menu_.SetPosition(args.GetDownPoint());
+ popup_menu_.Show();
+ });
+}
+
+Select::~Select() { button_.RemoveFromParent(); }
+
+void Select::SetItems(std::vector<String> items) {
+ popup_menu_.GetMenu()->ClearItems();
+ for (Index i = 0; i < items.size(); i++) {
+ popup_menu_.GetMenu()->AddTextItem(std::move(items[i]),
+ [this, i] { SetSelectedIndex(i); });
+ }
+}
+
+void Select::SetSelectedIndex(Index index) {
+ selected_index_ = index;
+ if (index >= 0 && index < items_.size()) {
+ button_text_.SetText(items_[index]);
+ } else {
+ button_text_.SetText({});
+ }
+ item_selected_event_.Raise(index);
+}
+} // namespace cru::ui::components
diff --git a/src/ui/helper/ClickDetector.cpp b/src/ui/helper/ClickDetector.cpp
index 981e9e04..a10133e9 100644
--- a/src/ui/helper/ClickDetector.cpp
+++ b/src/ui/helper/ClickDetector.cpp
@@ -3,10 +3,21 @@
#include "cru/common/Logger.h"
#include "cru/ui/DebugFlags.h"
#include "cru/ui/controls/Control.h"
+#include "cru/ui/host/WindowHost.h"
#include <optional>
namespace cru::ui::helper {
+Point ClickEventArgs::GetDownPointOfScreen() const {
+ auto window_host = sender_->GetWindowHost();
+ if (window_host != nullptr) {
+ auto window = window_host->GetNativeWindow();
+ return down_point_ + window->GetClientRect().GetLeftTop();
+ } else {
+ return down_point_;
+ }
+}
+
ClickDetector::ClickDetector(controls::Control* control) {
Expects(control);
control_ = control;