From 81eab3f1dbe670af7be448f4ec438f2a25603e0e Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 3 Sep 2022 16:59:27 +0200 Subject: [PATCH] More safety against deleting view in view widget --- src/laybasic/laybasic/layLayoutViewBase.h | 13 ++++--- src/laybasic/laybasic/layPlugin.h | 8 +++++ src/layview/layview/layLayoutView_qt.cc | 41 ++++++++++++++++++----- src/layview/layview/layLayoutView_qt.h | 4 +++ 4 files changed, 52 insertions(+), 14 deletions(-) diff --git a/src/laybasic/laybasic/layLayoutViewBase.h b/src/laybasic/laybasic/layLayoutViewBase.h index 0ed2f28cf..b50a8d412 100644 --- a/src/laybasic/laybasic/layLayoutViewBase.h +++ b/src/laybasic/laybasic/layLayoutViewBase.h @@ -2661,6 +2661,14 @@ public: */ void unregister_plugin (lay::Plugin *pi); + /** + * @brief Gets the options the view was created with + */ + unsigned int options () const + { + return m_options; + } + private: // event handlers used to connect to the layout object's events void signal_hier_changed (); @@ -2828,11 +2836,6 @@ private: void merge_dither_pattern (lay::LayerPropertiesList &props); protected: - unsigned int options () const - { - return m_options; - } - lay::Plugin *active_plugin () const { return mp_active_plugin; diff --git a/src/laybasic/laybasic/layPlugin.h b/src/laybasic/laybasic/layPlugin.h index 7fb074a42..a8f57bcd7 100644 --- a/src/laybasic/laybasic/layPlugin.h +++ b/src/laybasic/laybasic/layPlugin.h @@ -785,6 +785,14 @@ public: return mp_plugin_declaration; } + /** + * @brief Gets the plugin parent + */ + Plugin *plugin_parent () + { + return mp_parent; + } + /** * @brief Associate a service with the plugin declaration for that service (setter) * diff --git a/src/layview/layview/layLayoutView_qt.cc b/src/layview/layview/layLayoutView_qt.cc index e5bb2b62f..26bc8a78e 100644 --- a/src/layview/layview/layLayoutView_qt.cc +++ b/src/layview/layview/layLayoutView_qt.cc @@ -109,19 +109,35 @@ LayoutViewWidget::LayoutViewWidget (lay::LayoutView *source, db::Manager *mgr, b LayoutViewWidget::~LayoutViewWidget () { - delete mp_view; + lay::LayoutView *view = mp_view; mp_view = 0; + delete view; +} + +void +LayoutViewWidget::view_deleted (lay::LayoutView *view) +{ + if (view != mp_view) { + return; + } + + // creates a new view so the view is never invalid + mp_view = new LayoutView (view->manager (), view->is_editable (), view->plugin_parent (), this, view->options ()); } QSize LayoutViewWidget::sizeHint () const { - return mp_view->size_hint (); + return mp_view ? mp_view->size_hint () : QFrame::sizeHint (); } bool LayoutViewWidget::eventFilter(QObject *obj, QEvent *event) { + if (! mp_view) { + return QFrame::eventFilter (obj, event); + } + bool taken = false; bool res = mp_view->event_filter (obj, event, taken); if (taken) { @@ -133,37 +149,41 @@ LayoutViewWidget::eventFilter(QObject *obj, QEvent *event) void LayoutViewWidget::showEvent (QShowEvent *) { - mp_view->show_event (); + if (mp_view) { + mp_view->show_event (); + } } void LayoutViewWidget::hideEvent (QHideEvent *) { - mp_view->hide_event (); + if (mp_view) { + mp_view->hide_event (); + } } QWidget *LayoutViewWidget::layer_control_frame () { - return view ()->layer_control_frame (); + return !mp_view ? 0 : mp_view->layer_control_frame (); } QWidget *LayoutViewWidget::hierarchy_control_frame () { - return view ()->hierarchy_control_frame (); + return !mp_view ? 0 : mp_view->hierarchy_control_frame (); } QWidget *LayoutViewWidget::libraries_frame () { - return view ()->libraries_frame (); + return !mp_view ? 0 : mp_view->libraries_frame (); } QWidget *LayoutViewWidget::bookmarks_frame () { - return view ()->bookmarks_frame (); + return !mp_view ? 0 : mp_view->bookmarks_frame (); } QWidget *LayoutViewWidget::editor_options_frame () { - return view ()->editor_options_frame (); + return !mp_view ? 0 : mp_view->editor_options_frame (); } // ------------------------------------------------------------- @@ -458,6 +478,9 @@ LayoutView::init_ui () LayoutView::~LayoutView () { close (); + if (mp_widget) { + mp_widget->view_deleted (this); + } } QWidget *LayoutView::widget () diff --git a/src/layview/layview/layLayoutView_qt.h b/src/layview/layview/layLayoutView_qt.h index c1d7faaee..1c3c4ca4b 100644 --- a/src/layview/layview/layLayoutView_qt.h +++ b/src/layview/layview/layLayoutView_qt.h @@ -799,6 +799,10 @@ signals: void layer_order_changed (); private: + friend class LayoutView; + + void view_deleted (lay::LayoutView *view); + LayoutView *mp_view; };