Commit cc72e585 authored by Maciej Suminski's avatar Maciej Suminski

Fixed segfault in arc drawing tool (GAL footprint editor).

parent 143f52eb
...@@ -83,18 +83,17 @@ int DRAWING_TOOL::DrawLine( const TOOL_EVENT& aEvent ) ...@@ -83,18 +83,17 @@ int DRAWING_TOOL::DrawLine( const TOOL_EVENT& aEvent )
{ {
m_frame->SetToolID( ID_MODEDIT_LINE_TOOL, wxCURSOR_PENCIL, _( "Add graphic line" ) ); m_frame->SetToolID( ID_MODEDIT_LINE_TOOL, wxCURSOR_PENCIL, _( "Add graphic line" ) );
MODULE* module = m_board->m_Modules; EDGE_MODULE* line = new EDGE_MODULE( m_board->m_Modules );
EDGE_MODULE* line = new EDGE_MODULE( module );
while( drawSegment( S_SEGMENT, reinterpret_cast<DRAWSEGMENT*&>( line ), startingPoint ) ) while( drawSegment( S_SEGMENT, reinterpret_cast<DRAWSEGMENT*&>( line ), startingPoint ) )
{ {
if( line ) if( line )
{ {
m_frame->OnModify(); m_frame->OnModify();
m_frame->SaveCopyInUndoList( module, UR_MODEDIT ); m_frame->SaveCopyInUndoList( m_board->m_Modules, UR_MODEDIT );
line->SetParent( m_board->m_Modules );
line->SetLocalCoord(); line->SetLocalCoord();
line->SetParent( module ); m_board->m_Modules->GraphicalItems().PushFront( line );
module->GraphicalItems().PushFront( line );
startingPoint = line->GetEnd(); startingPoint = line->GetEnd();
} }
else else
...@@ -102,7 +101,7 @@ int DRAWING_TOOL::DrawLine( const TOOL_EVENT& aEvent ) ...@@ -102,7 +101,7 @@ int DRAWING_TOOL::DrawLine( const TOOL_EVENT& aEvent )
startingPoint = boost::none; startingPoint = boost::none;
} }
line = new EDGE_MODULE( module ); line = new EDGE_MODULE( m_board->m_Modules );
} }
} }
else else
...@@ -142,21 +141,20 @@ int DRAWING_TOOL::DrawCircle( const TOOL_EVENT& aEvent ) ...@@ -142,21 +141,20 @@ int DRAWING_TOOL::DrawCircle( const TOOL_EVENT& aEvent )
{ {
m_frame->SetToolID( ID_MODEDIT_CIRCLE_TOOL, wxCURSOR_PENCIL, _( "Add graphic circle" ) ); m_frame->SetToolID( ID_MODEDIT_CIRCLE_TOOL, wxCURSOR_PENCIL, _( "Add graphic circle" ) );
MODULE* module = m_board->m_Modules; EDGE_MODULE* circle = new EDGE_MODULE( m_board->m_Modules );
EDGE_MODULE* circle = new EDGE_MODULE( module );
while( drawSegment( S_CIRCLE, reinterpret_cast<DRAWSEGMENT*&>( circle ) ) ) while( drawSegment( S_CIRCLE, reinterpret_cast<DRAWSEGMENT*&>( circle ) ) )
{ {
if( circle ) if( circle )
{ {
m_frame->OnModify(); m_frame->OnModify();
m_frame->SaveCopyInUndoList( module, UR_MODEDIT ); m_frame->SaveCopyInUndoList( m_board->m_Modules, UR_MODEDIT );
circle->SetParent( m_board->m_Modules );
circle->SetLocalCoord(); circle->SetLocalCoord();
circle->SetParent( module ); m_board->m_Modules->GraphicalItems().PushFront( circle );
module->GraphicalItems().PushFront( circle );
} }
circle = new EDGE_MODULE( module ); circle = new EDGE_MODULE( m_board->m_Modules );
} }
} }
else else
...@@ -191,21 +189,20 @@ int DRAWING_TOOL::DrawArc( const TOOL_EVENT& aEvent ) ...@@ -191,21 +189,20 @@ int DRAWING_TOOL::DrawArc( const TOOL_EVENT& aEvent )
{ {
m_frame->SetToolID( ID_MODEDIT_ARC_TOOL, wxCURSOR_PENCIL, _( "Add graphic arc" ) ); m_frame->SetToolID( ID_MODEDIT_ARC_TOOL, wxCURSOR_PENCIL, _( "Add graphic arc" ) );
MODULE* module = m_board->m_Modules; EDGE_MODULE* arc = new EDGE_MODULE( m_board->m_Modules );
EDGE_MODULE* arc = new EDGE_MODULE( module );
while( drawArc( reinterpret_cast<DRAWSEGMENT*&>( arc ) ) ) while( drawArc( reinterpret_cast<DRAWSEGMENT*&>( arc ) ) )
{ {
if( arc ) if( arc )
{ {
m_frame->OnModify(); m_frame->OnModify();
m_frame->SaveCopyInUndoList( module, UR_MODEDIT ); m_frame->SaveCopyInUndoList( m_board->m_Modules, UR_MODEDIT );
arc->SetParent( m_board->m_Modules );
arc->SetLocalCoord(); arc->SetLocalCoord();
arc->SetParent( module ); m_board->m_Modules->GraphicalItems().PushFront( arc );
module->GraphicalItems().PushFront( arc );
} }
arc = new EDGE_MODULE( module ); arc = new EDGE_MODULE( m_board->m_Modules );
} }
} }
else else
...@@ -642,9 +639,8 @@ int DRAWING_TOOL::PlaceDXF( const TOOL_EVENT& aEvent ) ...@@ -642,9 +639,8 @@ int DRAWING_TOOL::PlaceDXF( const TOOL_EVENT& aEvent )
int dlgResult = dlg.ShowModal(); int dlgResult = dlg.ShowModal();
const std::list<BOARD_ITEM*>& list = dlg.GetImportedItems(); const std::list<BOARD_ITEM*>& list = dlg.GetImportedItems();
MODULE* module = m_board->m_Modules;
if( dlgResult != wxID_OK || module == NULL || list.empty() ) if( dlgResult != wxID_OK || m_board->m_Modules == NULL || list.empty() )
{ {
setTransitions(); setTransitions();
...@@ -672,7 +668,7 @@ int DRAWING_TOOL::PlaceDXF( const TOOL_EVENT& aEvent ) ...@@ -672,7 +668,7 @@ int DRAWING_TOOL::PlaceDXF( const TOOL_EVENT& aEvent )
{ {
if( m_editModules ) if( m_editModules )
{ {
converted = new EDGE_MODULE( module ); converted = new EDGE_MODULE( m_board->m_Modules );
*static_cast<DRAWSEGMENT*>( converted ) = *static_cast<DRAWSEGMENT*>( item ); *static_cast<DRAWSEGMENT*>( converted ) = *static_cast<DRAWSEGMENT*>( item );
converted->Move( wxPoint( delta.x, delta.y ) ); converted->Move( wxPoint( delta.x, delta.y ) );
preview.Add( converted ); preview.Add( converted );
...@@ -690,7 +686,7 @@ int DRAWING_TOOL::PlaceDXF( const TOOL_EVENT& aEvent ) ...@@ -690,7 +686,7 @@ int DRAWING_TOOL::PlaceDXF( const TOOL_EVENT& aEvent )
{ {
if( m_editModules ) if( m_editModules )
{ {
converted = new TEXTE_MODULE( module ); converted = new TEXTE_MODULE( m_board->m_Modules );
*static_cast<TEXTE_PCB*>( converted ) = *static_cast<TEXTE_PCB*>( item ); *static_cast<TEXTE_PCB*>( converted ) = *static_cast<TEXTE_PCB*>( item );
converted->Move( wxPoint( delta.x, delta.y ) ); converted->Move( wxPoint( delta.x, delta.y ) );
preview.Add( converted ); preview.Add( converted );
...@@ -760,16 +756,15 @@ int DRAWING_TOOL::PlaceDXF( const TOOL_EVENT& aEvent ) ...@@ -760,16 +756,15 @@ int DRAWING_TOOL::PlaceDXF( const TOOL_EVENT& aEvent )
else if( evt->IsClick( BUT_LEFT ) ) else if( evt->IsClick( BUT_LEFT ) )
{ {
// Place the drawing // Place the drawing
if( m_editModules ) if( m_editModules )
{ {
m_frame->SaveCopyInUndoList( module, UR_MODEDIT ); m_frame->SaveCopyInUndoList( m_board->m_Modules, UR_MODEDIT );
module->SetLastEditTime(); m_board->m_Modules->SetLastEditTime();
for( KIGFX::VIEW_GROUP::iter it = preview.Begin(), end = preview.End(); it != end; ++it ) for( KIGFX::VIEW_GROUP::iter it = preview.Begin(), end = preview.End(); it != end; ++it )
{ {
BOARD_ITEM* item = static_cast<BOARD_ITEM*>( *it ); BOARD_ITEM* item = static_cast<BOARD_ITEM*>( *it );
module->Add( item ); m_board->m_Modules->Add( item );
switch( item->Type() ) switch( item->Type() )
{ {
...@@ -843,16 +838,14 @@ int DRAWING_TOOL::SetAnchor( const TOOL_EVENT& aEvent ) ...@@ -843,16 +838,14 @@ int DRAWING_TOOL::SetAnchor( const TOOL_EVENT& aEvent )
{ {
if( evt->IsClick( BUT_LEFT ) ) if( evt->IsClick( BUT_LEFT ) )
{ {
MODULE* module = m_board->m_Modules; m_frame->SaveCopyInUndoList( m_board->m_Modules, UR_MODEDIT );
m_frame->SaveCopyInUndoList( module, UR_MODEDIT );
// set the new relative internal local coordinates of footprint items // set the new relative internal local coordinates of footprint items
VECTOR2I cursorPos = controls->GetCursorPosition(); VECTOR2I cursorPos = controls->GetCursorPosition();
wxPoint moveVector = module->GetPosition() - wxPoint( cursorPos.x, cursorPos.y ); wxPoint moveVector = m_board->m_Modules->GetPosition() - wxPoint( cursorPos.x, cursorPos.y );
module->MoveAnchorPosition( moveVector ); m_board->m_Modules->MoveAnchorPosition( moveVector );
module->ViewUpdate(); m_board->m_Modules->ViewUpdate();
// Usually, we do not need to change twice the anchor position, // Usually, we do not need to change twice the anchor position,
// so deselect the active tool // so deselect the active tool
...@@ -1435,7 +1428,6 @@ int DRAWING_TOOL::placeTextModule() ...@@ -1435,7 +1428,6 @@ int DRAWING_TOOL::placeTextModule()
{ {
TEXTE_MODULE* text = new TEXTE_MODULE( NULL ); TEXTE_MODULE* text = new TEXTE_MODULE( NULL );
const BOARD_DESIGN_SETTINGS& dsnSettings = m_frame->GetDesignSettings(); const BOARD_DESIGN_SETTINGS& dsnSettings = m_frame->GetDesignSettings();
MODULE* module = m_board->m_Modules;
// Add a VIEW_GROUP that serves as a preview for the new item // Add a VIEW_GROUP that serves as a preview for the new item
KIGFX::VIEW_GROUP preview( m_view ); KIGFX::VIEW_GROUP preview( m_view );
...@@ -1501,8 +1493,8 @@ int DRAWING_TOOL::placeTextModule() ...@@ -1501,8 +1493,8 @@ int DRAWING_TOOL::placeTextModule()
continue; continue;
m_controls->ShowCursor( false ); m_controls->ShowCursor( false );
text->SetParent( module ); // it has to set after the settings dialog text->SetParent( m_board->m_Modules ); // it has to set after the settings dialog
// otherwise the dialog stores it in undo buffer // otherwise the dialog stores it in undo buffer
preview.Add( text ); preview.Add( text );
} }
else else
...@@ -1514,8 +1506,8 @@ int DRAWING_TOOL::placeTextModule() ...@@ -1514,8 +1506,8 @@ int DRAWING_TOOL::placeTextModule()
text->ClearFlags(); text->ClearFlags();
// Module has to be saved before any modification is made // Module has to be saved before any modification is made
m_frame->SaveCopyInUndoList( module, UR_MODEDIT ); m_frame->SaveCopyInUndoList( m_board->m_Modules, UR_MODEDIT );
module->GraphicalItems().PushFront( text ); m_board->m_Modules->GraphicalItems().PushFront( text );
m_view->Add( text ); m_view->Add( text );
text->ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY ); text->ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment