aboutsummaryrefslogtreecommitdiff
path: root/src/ui
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/components/Menu.cpp17
-rw-r--r--src/ui/controls/Control.cpp17
-rw-r--r--src/ui/host/WindowHost.cpp2
3 files changed, 23 insertions, 13 deletions
diff --git a/src/ui/components/Menu.cpp b/src/ui/components/Menu.cpp
index 873e7ce0..c6db8e4a 100644
--- a/src/ui/components/Menu.cpp
+++ b/src/ui/components/Menu.cpp
@@ -25,10 +25,8 @@ MenuItem::MenuItem() {
MenuItem::MenuItem(String text) : MenuItem() { SetText(std::move(text)); }
MenuItem::~MenuItem() {
- if (!container_->GetWindowHost()) {
- delete container_;
- delete text_;
- }
+ container_->RemoveFromParent();
+ delete container_;
}
void MenuItem::SetText(String text) { text_->SetText(std::move(text)); }
@@ -39,13 +37,12 @@ Menu::Menu() {
}
Menu::~Menu() {
- if (!container_->GetWindowHost()) {
- delete container_;
- }
-
for (auto item : items_) {
delete item;
}
+
+ container_->RemoveFromParent();
+ delete container_;
}
void Menu::AddItem(Component* item, gsl::index index) {
@@ -100,9 +97,7 @@ PopupMenu::PopupMenu(controls::Control* attached_control)
PopupMenu::~PopupMenu() {
delete menu_;
- if (!popup_->GetWindowHost()) {
- delete popup_;
- }
+ delete popup_;
}
controls::Control* PopupMenu::GetRootControl() { return popup_; }
diff --git a/src/ui/controls/Control.cpp b/src/ui/controls/Control.cpp
index bda8cb35..36d5cd60 100644
--- a/src/ui/controls/Control.cpp
+++ b/src/ui/controls/Control.cpp
@@ -32,17 +32,32 @@ Control::Control() {
}
Control::~Control() {
- for (const auto child : children_) delete child;
+ if (auto_delete_children_) {
+ for (const auto child : children_) {
+ delete child;
+ }
+ }
}
host::WindowHost* Control::GetWindowHost() const { return window_host_; }
+Index Control::IndexOf(Control* child) const {
+ for (Index i = 0; i < children_.size(); ++i) {
+ if (children_[i] == child) return i;
+ }
+ return -1;
+}
+
void Control::TraverseDescendants(
const std::function<void(Control*)>& predicate) {
predicate(this);
for (auto c : GetChildren()) c->TraverseDescendants(predicate);
}
+void Control::RemoveFromParent() {
+ if (parent_) parent_->RemoveChild(parent_->IndexOf(this));
+}
+
bool Control::HasFocus() {
auto host = GetWindowHost();
if (host == nullptr) return false;
diff --git a/src/ui/host/WindowHost.cpp b/src/ui/host/WindowHost.cpp
index 26d48f89..2d09a895 100644
--- a/src/ui/host/WindowHost.cpp
+++ b/src/ui/host/WindowHost.cpp
@@ -118,7 +118,7 @@ WindowHost::WindowHost(controls::Control* root_control)
CreateNativeWindow();
}
-WindowHost::~WindowHost() {}
+WindowHost::~WindowHost() { delete native_window_; }
gsl::not_null<platform::gui::INativeWindow*> WindowHost::CreateNativeWindow() {
const auto ui_application = IUiApplication::GetInstance();