diff options
Diffstat (limited to 'src/ui')
-rw-r--r-- | src/ui/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/ui/components/Menu.cpp | 6 | ||||
-rw-r--r-- | src/ui/components/PopupButton.cpp | 2 | ||||
-rw-r--r-- | src/ui/components/Select.cpp | 31 | ||||
-rw-r--r-- | src/ui/helper/ClickDetector.cpp | 11 |
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; |