diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/platform/gui/sdl/Window.cpp | 36 | ||||
| -rw-r--r-- | src/ui/components/Menu.cpp | 19 | ||||
| -rw-r--r-- | src/ui/components/Select.cpp | 2 | ||||
| -rw-r--r-- | src/ui/render/FlexLayoutRenderObject.cpp | 7 |
4 files changed, 35 insertions, 29 deletions
diff --git a/src/platform/gui/sdl/Window.cpp b/src/platform/gui/sdl/Window.cpp index ad08d3f2..9bb0733a 100644 --- a/src/platform/gui/sdl/Window.cpp +++ b/src/platform/gui/sdl/Window.cpp @@ -16,6 +16,7 @@ #include <SDL3/SDL_events.h> #include <SDL3/SDL_video.h> #include <cassert> +#include <cmath> #include <memory> #include <optional> @@ -252,12 +253,13 @@ void SdlWindow::DoCreateWindow() { flags |= SDL_WINDOW_POPUP_MENU; sdl_window_ = SDL_CreatePopupWindow( parent_->sdl_window_, client_rect_.left - parent_position.x, - client_rect_.top - parent_position.y, client_rect_.width, - client_rect_.height, flags); + client_rect_.top - parent_position.y, std::ceil(client_rect_.width), + std::ceil(client_rect_.height), flags); sdl_is_popup_ = true; } else { - sdl_window_ = SDL_CreateWindow(title_.c_str(), client_rect_.width, - client_rect_.height, flags); + sdl_window_ = + SDL_CreateWindow(title_.c_str(), std::ceil(client_rect_.width), + std::ceil(client_rect_.height), flags); sdl_is_popup_ = false; } @@ -274,19 +276,19 @@ void SdlWindow::DoCreateWindow() { CreateEvent_.Raise(nullptr); - if (!IsWayland() || sdl_is_popup_) { - Point parent_position{}; - if (parent_) { - parent_position = parent_->GetClientRect().GetLeftTop(); - } - CheckSdlReturn(SDL_SetWindowPosition(sdl_window_, - client_rect_.left - parent_position.x, - client_rect_.top - parent_position.y)); - } - - if (!sdl_is_popup_) { + if (!sdl_is_popup_ && !IsWayland()) { CheckSdlReturn(SDL_SetWindowParent( sdl_window_, parent_ == nullptr ? nullptr : parent_->sdl_window_)); + + if (!IsWayland()) { + Point parent_position{}; + if (parent_) { + parent_position = parent_->GetClientRect().GetLeftTop(); + } + CheckSdlReturn(SDL_SetWindowPosition( + sdl_window_, client_rect_.left - parent_position.x, + client_rect_.top - parent_position.y)); + } } DoUpdateCursor(); @@ -328,8 +330,8 @@ void SdlWindow::DoUpdateClientRect() { "Wayland doesn't support set position of non-popup window."); } - CheckSdlReturn( - SDL_SetWindowSize(sdl_window_, client_rect_.width, client_rect_.height)); + CheckSdlReturn(SDL_SetWindowSize(sdl_window_, std::ceil(client_rect_.width), + std::ceil(client_rect_.height))); } void SdlWindow::DoUpdateParent() { diff --git a/src/ui/components/Menu.cpp b/src/ui/components/Menu.cpp index ea1afc07..9170c6d2 100644 --- a/src/ui/components/Menu.cpp +++ b/src/ui/components/Menu.cpp @@ -8,22 +8,22 @@ #include "cru/ui/controls/TextBlock.h" #include "cru/ui/controls/Window.h" #include "cru/ui/helper/ClickDetector.h" -#include "cru/ui/style/StyleRuleSet.h" namespace cru::ui::components { MenuItem::MenuItem() { container_.SetChild(&text_); container_.GetStyleRuleSet()->SetParent( ThemeManager::GetInstance()->GetResourceStyleRuleSet("menuitem.style")); - container_.ClickEvent()->AddHandler([this](const helper::ClickEventArgs&) { - if (this->on_click_) this->on_click_(); - }); } MenuItem::MenuItem(std::string text) : MenuItem() { SetText(std::move(text)); } void MenuItem::SetText(std::string text) { text_.SetText(std::move(text)); } +IEvent<const helper::ClickEventArgs&>* MenuItem::ClickEvent() { + return container_.ClickEvent(); +} + Menu::Menu() { container_.SetFlexDirection(controls::FlexDirection::Vertical); container_.SetItemCrossAlign(controls::FlexCrossAlignment::Stretch); @@ -66,11 +66,12 @@ void Menu::ClearItems() { void Menu::AddTextItemAt(std::string text, Index index, std::function<void()> on_click) { MenuItem* item = new MenuItem(std::move(text)); - item->SetOnClick([this, index, on_click = std::move(on_click)] { - auto on_item_click = on_item_click_; - on_click(); - if (on_item_click) on_item_click(index); - }); + item->ClickEvent()->AddSpyOnlyHandler( + [this, index, on_click = std::move(on_click)] { + auto on_item_click = on_item_click_; + on_click(); + if (on_item_click) on_item_click(index); + }); item->SetDeleteByParent(true); AddItemAt(item, index); } diff --git a/src/ui/components/Select.cpp b/src/ui/components/Select.cpp index 5dbb727c..da81017f 100644 --- a/src/ui/components/Select.cpp +++ b/src/ui/components/Select.cpp @@ -11,6 +11,8 @@ Select::Select() { left_bottom); popup_menu_.Show(); }); + + popup_menu_.GetPopup()->SetAttachedControl(&button_); } Select::~Select() {} diff --git a/src/ui/render/FlexLayoutRenderObject.cpp b/src/ui/render/FlexLayoutRenderObject.cpp index 4c7762e3..f4936f15 100644 --- a/src/ui/render/FlexLayoutRenderObject.cpp +++ b/src/ui/render/FlexLayoutRenderObject.cpp @@ -299,9 +299,10 @@ Size FlexLayoutMeasureContentImpl( if (max_main_length.IsSpecified() && total_length > max_main_length.GetLengthOrUndefined()) { - CruLogWarn( - kLogTag, - "(Measure) Children's main axis length exceeds required max length."); + CruLogWarn(kLogTag, + "(Measure) Children's main axis length {} exceeds required max " + "length {}.", + total_length, max_main_length.GetLengthOrUndefined()); total_length = max_main_length.GetLengthOrUndefined(); } else if (min_main_length.IsSpecified() && total_length < min_main_length.GetLengthOrUndefined()) { |
