aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ui/components/Component.cpp10
-rw-r--r--src/ui/components/Menu.cpp2
-rw-r--r--src/ui/controls/Control.cpp5
-rw-r--r--src/ui/controls/TextHostControlService.cpp4
4 files changed, 18 insertions, 3 deletions
diff --git a/src/ui/components/Component.cpp b/src/ui/components/Component.cpp
index 01db8710..d0525a1c 100644
--- a/src/ui/components/Component.cpp
+++ b/src/ui/components/Component.cpp
@@ -4,4 +4,14 @@
namespace cru::ui::components {
void Component::OnPrepareDelete() { GetRootControl()->RemoveFromParent(); }
+
+void Component::DeleteIfDeleteByParent(bool delete_later) {
+ if (delete_by_parent_) {
+ if (delete_later) {
+ DeleteLater();
+ } else {
+ delete this;
+ }
+ }
+}
} // namespace cru::ui::components
diff --git a/src/ui/components/Menu.cpp b/src/ui/components/Menu.cpp
index 65c1e810..04227d66 100644
--- a/src/ui/components/Menu.cpp
+++ b/src/ui/components/Menu.cpp
@@ -33,7 +33,7 @@ Menu::Menu() {
Menu::~Menu() {
for (auto item : items_) {
- delete item;
+ item->DeleteIfDeleteByParent(false);
}
}
diff --git a/src/ui/controls/Control.cpp b/src/ui/controls/Control.cpp
index cf0cc11f..93213ecf 100644
--- a/src/ui/controls/Control.cpp
+++ b/src/ui/controls/Control.cpp
@@ -27,6 +27,11 @@ Control::Control() {
}
Control::~Control() {
+ if (host::WindowHost::IsInEventHandling()) {
+ // Don't delete control during event handling. Use DeleteLater.
+ std::terminate();
+ }
+
in_destruction_ = true;
RemoveFromParent();
}
diff --git a/src/ui/controls/TextHostControlService.cpp b/src/ui/controls/TextHostControlService.cpp
index 06c1651f..99090951 100644
--- a/src/ui/controls/TextHostControlService.cpp
+++ b/src/ui/controls/TextHostControlService.cpp
@@ -148,8 +148,7 @@ std::vector<TextControlMovePattern> TextControlMovePattern::kDefaultPatterns = {
TextHostControlService::TextHostControlService(Control* control)
: control_(control),
- text_host_control_(dynamic_cast<ITextHostControl*>(control)),
- context_menu_(new components::PopupMenu()) {
+ text_host_control_(dynamic_cast<ITextHostControl*>(control)) {
SetUpShortcuts();
SetupOneHandler(&Control::MouseMoveEvent,
@@ -701,6 +700,7 @@ void TextHostControlService::SetUpShortcuts() {
void TextHostControlService::OpenContextMenu(const Point& position,
ContextMenuItem items) {
CRU_LOG_TAG_DEBUG("Open context menu.");
+ context_menu_.reset(new components::PopupMenu());
auto menu = context_menu_->GetMenu();
menu->ClearItems();
if (items & ContextMenuItem::kSelectAll) {