Fix exit behavior and memory leak in pl_editor

Fixes https://gitlab.com/kicad/code/kicad/-/issues/4887
This commit is contained in:
Jon Evans 2020-07-16 18:54:12 -04:00
parent ad99d85390
commit eb37c89a7b
3 changed files with 11 additions and 4 deletions

View File

@ -87,6 +87,8 @@ void PL_DRAW_PANEL_GAL::DisplayWorksheet()
selTool->GetSelection().Clear(); selTool->GetSelection().Clear();
m_view->Clear(); m_view->Clear();
m_pageDrawItem.reset();
// Obviously, always show the page limit: // Obviously, always show the page limit:
m_edaFrame->SetShowPageLimits( true ); m_edaFrame->SetShowPageLimits( true );
auto painter = m_view->GetPainter(); auto painter = m_view->GetPainter();
@ -110,8 +112,8 @@ void PL_DRAW_PANEL_GAL::DisplayWorksheet()
// Not also this item has no peer in WS_DATA_MODEL list. // Not also this item has no peer in WS_DATA_MODEL list.
const int penWidth = 0; // This value is to use the default thickness line const int penWidth = 0; // This value is to use the default thickness line
constexpr double markerSize = Millimeter2iu( 5 ); constexpr double markerSize = Millimeter2iu( 5 );
WS_DRAW_ITEM_PAGE* pageDrawing = new WS_DRAW_ITEM_PAGE( penWidth, markerSize ); m_pageDrawItem = std::make_unique<WS_DRAW_ITEM_PAGE>( penWidth, markerSize );
m_view->Add( pageDrawing ); m_view->Add( m_pageDrawItem.get() );
selTool->RebuildSelection(); selTool->RebuildSelection();
@ -125,9 +127,9 @@ void PL_DRAW_PANEL_GAL::DisplayWorksheet()
VECTOR2D( size_x * 1.5, size_y * 1.5) ); VECTOR2D( size_x * 1.5, size_y * 1.5) );
m_view->SetBoundary( boundary ); m_view->SetBoundary( boundary );
pageDrawing->SetPageSize( m_edaFrame->GetPageSizeIU() ); m_pageDrawItem->SetPageSize( m_edaFrame->GetPageSizeIU() );
wxPoint originCoord = static_cast<PL_EDITOR_FRAME*>( m_edaFrame )->ReturnCoordOriginCorner(); wxPoint originCoord = static_cast<PL_EDITOR_FRAME*>( m_edaFrame )->ReturnCoordOriginCorner();
pageDrawing->SetMarkerPos( originCoord ); m_pageDrawItem->SetMarkerPos( originCoord );
} }

View File

@ -54,6 +54,8 @@ protected:
///> Currently used worksheet ///> Currently used worksheet
std::unique_ptr<KIGFX::WS_PROXY_VIEW_ITEM> m_worksheet; std::unique_ptr<KIGFX::WS_PROXY_VIEW_ITEM> m_worksheet;
std::unique_ptr<WS_DRAW_ITEM_PAGE> m_pageDrawItem;
}; };

View File

@ -300,6 +300,9 @@ void PL_EDITOR_FRAME::OnCloseWindow( wxCloseEvent& aEvent )
// do not show the window because we do not want any paint event // do not show the window because we do not want any paint event
Show( false ); Show( false );
// clean up the data before the view is destroyed
WS_DATA_MODEL::GetTheInstance().ClearList();
// On Linux, m_propertiesPagelayout must be destroyed // On Linux, m_propertiesPagelayout must be destroyed
// before deleting the main frame to avoid a crash when closing // before deleting the main frame to avoid a crash when closing
m_propertiesPagelayout->Destroy(); m_propertiesPagelayout->Destroy();