From 322055b34a9609d1701eea1ea5f678a315c9b5b7 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 25 Nov 2020 23:48:45 +0100 Subject: [PATCH] Windows destruction refactoring --- radio/src/thirdparty/libopenui/src/carousel.h | 19 ++++++++++++++----- radio/src/thirdparty/libopenui/src/dialog.h | 8 +++++--- radio/src/thirdparty/libopenui/src/menu.h | 5 +++-- .../thirdparty/libopenui/src/modal_window.cpp | 4 ++-- .../thirdparty/libopenui/src/modal_window.h | 2 +- radio/src/thirdparty/libopenui/src/table.cpp | 3 +++ radio/src/thirdparty/libopenui/src/table.h | 14 ++++++++++---- radio/src/thirdparty/libopenui/src/window.cpp | 16 +++++++++++----- radio/src/thirdparty/libopenui/src/window.h | 2 +- 9 files changed, 50 insertions(+), 23 deletions(-) diff --git a/radio/src/thirdparty/libopenui/src/carousel.h b/radio/src/thirdparty/libopenui/src/carousel.h index 1bcbeeaef..661fa58b5 100644 --- a/radio/src/thirdparty/libopenui/src/carousel.h +++ b/radio/src/thirdparty/libopenui/src/carousel.h @@ -22,7 +22,8 @@ #include #include "button.h" -class CarouselItem { +class CarouselItem +{ public: CarouselItem(Window * front, Window * back): front(front), @@ -43,7 +44,8 @@ class CarouselItem { std::function selectHandler; }; -class CarouselWindow: public Window { +class CarouselWindow: public Window +{ friend class Carousel; public: @@ -53,9 +55,13 @@ class CarouselWindow: public Window { { } - ~CarouselWindow() override + void deleteLater(bool detach = true, bool trash = true) override { + if (_deleted) + return; + clear(); + Window::deleteLater(detach, trash); } void addItem(CarouselItem * item) @@ -66,13 +72,15 @@ class CarouselWindow: public Window { void clear() { + // children will be deleted later (front and back) + children.clear(); + for (auto & item: items) { item->front->deleteLater(); item->back->deleteLater(); delete item; } items.clear(); - Window::clear(); } void select(int index, bool scroll = true) @@ -92,7 +100,8 @@ class CarouselWindow: public Window { void update(); }; -class Carousel: public Window { +class Carousel: public Window +{ public: Carousel(Window * parent, const rect_t & rect): Window(parent, rect, NO_SCROLLBAR) diff --git a/radio/src/thirdparty/libopenui/src/dialog.h b/radio/src/thirdparty/libopenui/src/dialog.h index 3e8816aae..c0282b365 100644 --- a/radio/src/thirdparty/libopenui/src/dialog.h +++ b/radio/src/thirdparty/libopenui/src/dialog.h @@ -24,15 +24,17 @@ class Dialog; -class DialogWindowContent: public ModalWindowContent { +class DialogWindowContent: public ModalWindowContent +{ friend class Dialog; public: DialogWindowContent(Dialog * parent, const rect_t & rect); - ~DialogWindowContent() override + void deleteLater(bool detach = true, bool trash = true) override { - form.detach(); + form.deleteLater(true, false); + ModalWindowContent::deleteLater(detach, trash); } #if defined(DEBUG_WINDOWS) diff --git a/radio/src/thirdparty/libopenui/src/menu.h b/radio/src/thirdparty/libopenui/src/menu.h index 2af7ca085..ff9a7d88d 100644 --- a/radio/src/thirdparty/libopenui/src/menu.h +++ b/radio/src/thirdparty/libopenui/src/menu.h @@ -139,9 +139,10 @@ class MenuWindowContent: public ModalWindowContent public: explicit MenuWindowContent(Menu * parent); - ~MenuWindowContent() override + void deleteLater(bool detach = true, bool trash = true) override { - body.detach(); + body.deleteLater(true, false); + ModalWindowContent::deleteLater(detach, trash); } #if defined(DEBUG_WINDOWS) diff --git a/radio/src/thirdparty/libopenui/src/modal_window.cpp b/radio/src/thirdparty/libopenui/src/modal_window.cpp index 6d5b73d44..5ddf49cc9 100644 --- a/radio/src/thirdparty/libopenui/src/modal_window.cpp +++ b/radio/src/thirdparty/libopenui/src/modal_window.cpp @@ -28,14 +28,14 @@ ModalWindow::ModalWindow(Window * parent): Layer::push(this); } -void ModalWindow::deleteLater(bool detach) +void ModalWindow::deleteLater(bool detach, bool trash) { if (_deleted) return; Layer::pop(this); - Window::deleteLater(detach); + Window::deleteLater(detach, trash); } void ModalWindow::paint(BitmapBuffer * dc) diff --git a/radio/src/thirdparty/libopenui/src/modal_window.h b/radio/src/thirdparty/libopenui/src/modal_window.h index 3fb396fb4..bdf6ba125 100644 --- a/radio/src/thirdparty/libopenui/src/modal_window.h +++ b/radio/src/thirdparty/libopenui/src/modal_window.h @@ -33,7 +33,7 @@ class ModalWindow: public Window } #endif - void deleteLater(bool detach=true) override; + void deleteLater(bool detach = true, bool trash = true) override; void paint(BitmapBuffer * dc) override; diff --git a/radio/src/thirdparty/libopenui/src/table.cpp b/radio/src/thirdparty/libopenui/src/table.cpp index 4df8b9090..06764889b 100644 --- a/radio/src/thirdparty/libopenui/src/table.cpp +++ b/radio/src/thirdparty/libopenui/src/table.cpp @@ -39,6 +39,9 @@ void Table::Body::checkEvents() { Window::checkEvents(); + if (_deleted) + return; + coord_t y = 0; for (auto line: lines) { coord_t x = 10; diff --git a/radio/src/thirdparty/libopenui/src/table.h b/radio/src/thirdparty/libopenui/src/table.h index 0e3c248cf..136622ef1 100644 --- a/radio/src/thirdparty/libopenui/src/table.h +++ b/radio/src/thirdparty/libopenui/src/table.h @@ -140,7 +140,8 @@ class Table: public FormField void paint(BitmapBuffer * dc) override; }; - class Body: public Window { + class Body: public Window + { friend class Table; public: @@ -244,10 +245,15 @@ class Table: public FormField } #endif - ~Table() override + void deleteLater(bool detach = true, bool trash = true) override { - header.detach(); - body.detach(); + if (_deleted) + return; + + header.deleteLater(true, false); + body.deleteLater(true, false); + + FormField::deleteLater(detach, trash); } void setColumnsWidth(const coord_t values[]) diff --git a/radio/src/thirdparty/libopenui/src/window.cpp b/radio/src/thirdparty/libopenui/src/window.cpp index 1d8933311..548bbac32 100644 --- a/radio/src/thirdparty/libopenui/src/window.cpp +++ b/radio/src/thirdparty/libopenui/src/window.cpp @@ -67,13 +67,15 @@ void Window::detach() } } -void Window::deleteLater(bool detach) +void Window::deleteLater(bool detach, bool trash) { if (_deleted) return; TRACE_WINDOWS("Delete %p %s", this, getWindowDebugString().c_str()); + _deleted = true; + if (static_cast(focusWindow) == static_cast(this)) { focusWindow = nullptr; } @@ -83,13 +85,15 @@ void Window::deleteLater(bool detach) else parent = nullptr; + deleteChildren(); + if (closeHandler) { closeHandler(); } - trash.push_back(this); - - _deleted = true; + if (trash) { + Window::trash.push_back(this); + } } void Window::clear() @@ -325,7 +329,9 @@ void Window::checkEvents() { auto copy = children; for (auto child: copy) { - child->checkEvents(); + if (!child->deleted()) { + child->checkEvents(); + } } if (this == Window::focusWindow) { diff --git a/radio/src/thirdparty/libopenui/src/window.h b/radio/src/thirdparty/libopenui/src/window.h index 65332561d..d30cc2d62 100644 --- a/radio/src/thirdparty/libopenui/src/window.h +++ b/radio/src/thirdparty/libopenui/src/window.h @@ -137,7 +137,7 @@ class Window focusHandler = std::move(handler); } - virtual void deleteLater(bool detach=true); + virtual void deleteLater(bool detach = true, bool trash = true); void clear();