More safety against deleting view in view widget

This commit is contained in:
Matthias Koefferlein 2022-09-03 16:59:27 +02:00
parent 0bbf4ad81c
commit 81eab3f1db
4 changed files with 52 additions and 14 deletions

View File

@ -2661,6 +2661,14 @@ public:
*/ */
void unregister_plugin (lay::Plugin *pi); void unregister_plugin (lay::Plugin *pi);
/**
* @brief Gets the options the view was created with
*/
unsigned int options () const
{
return m_options;
}
private: private:
// event handlers used to connect to the layout object's events // event handlers used to connect to the layout object's events
void signal_hier_changed (); void signal_hier_changed ();
@ -2828,11 +2836,6 @@ private:
void merge_dither_pattern (lay::LayerPropertiesList &props); void merge_dither_pattern (lay::LayerPropertiesList &props);
protected: protected:
unsigned int options () const
{
return m_options;
}
lay::Plugin *active_plugin () const lay::Plugin *active_plugin () const
{ {
return mp_active_plugin; return mp_active_plugin;

View File

@ -785,6 +785,14 @@ public:
return mp_plugin_declaration; 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) * @brief Associate a service with the plugin declaration for that service (setter)
* *

View File

@ -109,19 +109,35 @@ LayoutViewWidget::LayoutViewWidget (lay::LayoutView *source, db::Manager *mgr, b
LayoutViewWidget::~LayoutViewWidget () LayoutViewWidget::~LayoutViewWidget ()
{ {
delete mp_view; lay::LayoutView *view = mp_view;
mp_view = 0; 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 QSize
LayoutViewWidget::sizeHint () const LayoutViewWidget::sizeHint () const
{ {
return mp_view->size_hint (); return mp_view ? mp_view->size_hint () : QFrame::sizeHint ();
} }
bool bool
LayoutViewWidget::eventFilter(QObject *obj, QEvent *event) LayoutViewWidget::eventFilter(QObject *obj, QEvent *event)
{ {
if (! mp_view) {
return QFrame::eventFilter (obj, event);
}
bool taken = false; bool taken = false;
bool res = mp_view->event_filter (obj, event, taken); bool res = mp_view->event_filter (obj, event, taken);
if (taken) { if (taken) {
@ -133,37 +149,41 @@ LayoutViewWidget::eventFilter(QObject *obj, QEvent *event)
void LayoutViewWidget::showEvent (QShowEvent *) void LayoutViewWidget::showEvent (QShowEvent *)
{ {
mp_view->show_event (); if (mp_view) {
mp_view->show_event ();
}
} }
void LayoutViewWidget::hideEvent (QHideEvent *) void LayoutViewWidget::hideEvent (QHideEvent *)
{ {
mp_view->hide_event (); if (mp_view) {
mp_view->hide_event ();
}
} }
QWidget *LayoutViewWidget::layer_control_frame () QWidget *LayoutViewWidget::layer_control_frame ()
{ {
return view ()->layer_control_frame (); return !mp_view ? 0 : mp_view->layer_control_frame ();
} }
QWidget *LayoutViewWidget::hierarchy_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 () QWidget *LayoutViewWidget::libraries_frame ()
{ {
return view ()->libraries_frame (); return !mp_view ? 0 : mp_view->libraries_frame ();
} }
QWidget *LayoutViewWidget::bookmarks_frame () QWidget *LayoutViewWidget::bookmarks_frame ()
{ {
return view ()->bookmarks_frame (); return !mp_view ? 0 : mp_view->bookmarks_frame ();
} }
QWidget *LayoutViewWidget::editor_options_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 () LayoutView::~LayoutView ()
{ {
close (); close ();
if (mp_widget) {
mp_widget->view_deleted (this);
}
} }
QWidget *LayoutView::widget () QWidget *LayoutView::widget ()

View File

@ -799,6 +799,10 @@ signals:
void layer_order_changed (); void layer_order_changed ();
private: private:
friend class LayoutView;
void view_deleted (lay::LayoutView *view);
LayoutView *mp_view; LayoutView *mp_view;
}; };