aboutsummaryrefslogtreecommitdiff
path: root/src/ui/controls
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/controls')
-rw-r--r--src/ui/controls/Button.cpp2
-rw-r--r--src/ui/controls/CheckBox.cpp2
-rw-r--r--src/ui/controls/Control.cpp16
-rw-r--r--src/ui/controls/ControlHost.cpp5
-rw-r--r--src/ui/controls/IconButton.cpp2
-rw-r--r--src/ui/controls/TextHostControlService.cpp2
-rw-r--r--src/ui/controls/Window.cpp20
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() {