diff options
Diffstat (limited to 'src/ui/controls')
| -rw-r--r-- | src/ui/controls/Button.cpp | 2 | ||||
| -rw-r--r-- | src/ui/controls/CheckBox.cpp | 2 | ||||
| -rw-r--r-- | src/ui/controls/Control.cpp | 16 | ||||
| -rw-r--r-- | src/ui/controls/ControlHost.cpp | 5 | ||||
| -rw-r--r-- | src/ui/controls/IconButton.cpp | 2 | ||||
| -rw-r--r-- | src/ui/controls/TextHostControlService.cpp | 2 | ||||
| -rw-r--r-- | src/ui/controls/Window.cpp | 20 |
7 files changed, 41 insertions, 8 deletions
diff --git a/src/ui/controls/Button.cpp b/src/ui/controls/Button.cpp index 4d897f08..d38ad108 100644 --- a/src/ui/controls/Button.cpp +++ b/src/ui/controls/Button.cpp @@ -13,8 +13,6 @@ Button::Button() GetStyleRuleSet()->SetParent(std::move(default_button_style)); } -Button::~Button() = default; - void Button::ApplyBorderStyle(const style::ApplyBorderStyleInfo& style) { GetContainerRenderObject()->ApplyBorderStyle(style); } diff --git a/src/ui/controls/CheckBox.cpp b/src/ui/controls/CheckBox.cpp index a6cac1a1..3090505e 100644 --- a/src/ui/controls/CheckBox.cpp +++ b/src/ui/controls/CheckBox.cpp @@ -17,8 +17,6 @@ CheckBox::CheckBox() [this](const helper::ClickEventArgs&) { Toggle(); }); } -CheckBox::~CheckBox() {} - void CheckBox::SetChecked(bool checked) { checked_ = checked; checked_change_event_.Raise(checked); diff --git a/src/ui/controls/Control.cpp b/src/ui/controls/Control.cpp index 548c9726..57937da2 100644 --- a/src/ui/controls/Control.cpp +++ b/src/ui/controls/Control.cpp @@ -111,6 +111,14 @@ void Control::InsertChildAt(Control* control, Index index) { OnChildInserted(control, index); if (host_) { + control->TraverseDescendents( + [this](Control* control) { + control->ControlHostChangeEvent_.Raise({nullptr, host_}); + }, + true); + } + + if (host_) { host_->ScheduleRelayout(); } } @@ -132,6 +140,14 @@ void Control::RemoveChildAt(Index index) { OnChildRemoved(control, index); if (host_) { + control->TraverseDescendents( + [this](Control* control) { + control->ControlHostChangeEvent_.Raise({host_, nullptr}); + }, + true); + } + + if (host_) { host_->ScheduleRelayout(); } } diff --git a/src/ui/controls/ControlHost.cpp b/src/ui/controls/ControlHost.cpp index 1dabb26f..bfd7e580 100644 --- a/src/ui/controls/ControlHost.cpp +++ b/src/ui/controls/ControlHost.cpp @@ -22,6 +22,11 @@ ControlHost::ControlHost(Control* root_control) ControlHost::~ControlHost() { root_control_->TraverseDescendents( [this](Control* control) { control->host_ = nullptr; }, true); + root_control_->TraverseDescendents( + [this](Control* control) { + control->ControlHostChangeEvent_.Raise({this, nullptr}); + }, + true); } platform::gui::INativeWindow* ControlHost::GetNativeWindow() { diff --git a/src/ui/controls/IconButton.cpp b/src/ui/controls/IconButton.cpp index e20e422f..ee6c9cac 100644 --- a/src/ui/controls/IconButton.cpp +++ b/src/ui/controls/IconButton.cpp @@ -22,8 +22,6 @@ IconButton::IconButton(std::string_view icon_svg_path_data_string, SetIconWithSvgPathDataString(icon_svg_path_data_string, view_port); } -IconButton::~IconButton() {} - void IconButton::SetIconFillColor(const Color& color) { SetIconFillBrush(platform::gui::IUiApplication::GetInstance() ->GetGraphicsFactory() diff --git a/src/ui/controls/TextHostControlService.cpp b/src/ui/controls/TextHostControlService.cpp index 9c57140c..9142bd69 100644 --- a/src/ui/controls/TextHostControlService.cpp +++ b/src/ui/controls/TextHostControlService.cpp @@ -695,7 +695,7 @@ void TextHostControlService::OpenContextMenu(const Point& position, ContextMenuItem items) { CruLogDebug(kLogTag, "Open context menu."); if (!context_menu_) { - context_menu_.reset(new components::PopupMenu()); + context_menu_.reset(new components::PopupMenu(control_)); } auto menu = context_menu_->GetMenu(); menu->ClearItems(); diff --git a/src/ui/controls/Window.cpp b/src/ui/controls/Window.cpp index 8f06013e..f4714efa 100644 --- a/src/ui/controls/Window.cpp +++ b/src/ui/controls/Window.cpp @@ -2,6 +2,7 @@ #include "cru/platform/gui/UiApplication.h" #include "cru/platform/gui/Window.h" #include "cru/ui/Base.h" +#include "cru/ui/controls/Control.h" #include "cru/ui/controls/ControlHost.h" #include <cassert> @@ -15,16 +16,33 @@ Window::Window() GetContainerRenderObject()->SetDefaultVerticalAlignment(Alignment::Stretch); } -Window* Window::CreatePopup() { +Window* Window::CreatePopup(Control* attached_control) { auto window = new Window(); window->GetNativeWindow()->SetStyleFlag( platform::gui::WindowStyleFlags::NoCaptionAndBorder); + window->SetAttachedControl(attached_control); window->SetGainFocusOnCreateAndDestroyWhenLoseFocus(true); return window; } +Control* Window::GetAttachedControl() { return attached_control_; } + void Window::SetAttachedControl(Control* control) { attached_control_ = control; + if (control) { + if (auto control_host = control->GetControlHost()) { + control_host_->GetNativeWindow()->SetParent( + control_host->GetNativeWindow()); + } + parent_window_guard_.Reset(control->ControlHostChangeEvent()->AddHandler( + [this](const ControlHostChangeEventArgs& args) { + control_host_->GetNativeWindow()->SetParent( + args.new_host ? args.new_host->GetNativeWindow() : nullptr); + })); + } else { + control_host_->GetNativeWindow()->SetParent(nullptr); + parent_window_guard_.Reset(); + } } platform::gui::INativeWindow* Window::GetNativeWindow() { |
