Drawing tools used to crash when the drawing tool was interrupted - fixed.

This commit is contained in:
Maciej Suminski 2014-07-09 15:02:56 +02:00
parent b42091bc06
commit a6484f1acb
2 changed files with 53 additions and 32 deletions

View File

@ -83,13 +83,16 @@ int DRAWING_TOOL::DrawLine( TOOL_EVENT& aEvent )
MODULE* module = m_board->m_Modules;
EDGE_MODULE* line = new EDGE_MODULE( module );
while( drawSegment( S_SEGMENT, line ) )
while( drawSegment( S_SEGMENT, reinterpret_cast<DRAWSEGMENT*&>( line ) ) )
{
if( line )
{
m_frame->OnModify();
m_frame->SaveCopyInUndoList( module, UR_MODEDIT );
line->SetLocalCoord();
line->SetParent( module );
module->GraphicalItems().PushFront( line );
}
line = new EDGE_MODULE( module );
}
@ -101,10 +104,13 @@ int DRAWING_TOOL::DrawLine( TOOL_EVENT& aEvent )
DRAWSEGMENT* line = new DRAWSEGMENT;
while( drawSegment( S_SEGMENT, line ) )
{
if( line )
{
m_board->Add( line );
m_frame->OnModify();
m_frame->SaveCopyInUndoList( line, UR_NEW );
}
line = new DRAWSEGMENT;
}
@ -126,13 +132,16 @@ int DRAWING_TOOL::DrawCircle( TOOL_EVENT& aEvent )
MODULE* module = m_board->m_Modules;
EDGE_MODULE* circle = new EDGE_MODULE( module );
while( drawSegment( S_CIRCLE, circle ) )
while( drawSegment( S_CIRCLE, reinterpret_cast<DRAWSEGMENT*&>( circle ) ) )
{
if( circle )
{
m_frame->OnModify();
m_frame->SaveCopyInUndoList( module, UR_MODEDIT );
circle->SetLocalCoord();
circle->SetParent( module );
module->GraphicalItems().PushFront( circle );
}
circle = new EDGE_MODULE( module );
}
@ -144,10 +153,13 @@ int DRAWING_TOOL::DrawCircle( TOOL_EVENT& aEvent )
DRAWSEGMENT* circle = new DRAWSEGMENT;
while( drawSegment( S_CIRCLE, circle ) )
{
if( circle )
{
m_board->Add( circle );
m_frame->OnModify();
m_frame->SaveCopyInUndoList( circle, UR_NEW );
}
circle = new DRAWSEGMENT;
}
@ -169,13 +181,16 @@ int DRAWING_TOOL::DrawArc( TOOL_EVENT& aEvent )
MODULE* module = m_board->m_Modules;
EDGE_MODULE* arc = new EDGE_MODULE( module );
while( drawArc( arc ) )
while( drawArc( reinterpret_cast<DRAWSEGMENT*&>( arc ) ) )
{
if( arc )
{
m_frame->OnModify();
m_frame->SaveCopyInUndoList( module, UR_MODEDIT );
arc->SetLocalCoord();
arc->SetParent( module );
module->GraphicalItems().PushFront( arc );
}
arc = new EDGE_MODULE( module );
}
@ -187,10 +202,13 @@ int DRAWING_TOOL::DrawArc( TOOL_EVENT& aEvent )
DRAWSEGMENT* arc = new DRAWSEGMENT;
while( drawArc( arc ) )
{
if( arc )
{
m_board->Add( arc );
m_frame->OnModify();
m_frame->SaveCopyInUndoList( arc, UR_NEW );
}
arc = new DRAWSEGMENT;
}
@ -939,7 +957,7 @@ int DRAWING_TOOL::SetAnchor( TOOL_EVENT& aEvent )
}
bool DRAWING_TOOL::drawSegment( int aShape, DRAWSEGMENT* aGraphic )
bool DRAWING_TOOL::drawSegment( int aShape, DRAWSEGMENT*& aGraphic )
{
// Only two shapes are currently supported
assert( aShape == S_SEGMENT || aShape == S_CIRCLE );
@ -989,6 +1007,7 @@ bool DRAWING_TOOL::drawSegment( int aShape, DRAWSEGMENT* aGraphic )
preview.Clear();
updatePreview = true;
delete aGraphic;
aGraphic = NULL;
break;
}
@ -1049,7 +1068,8 @@ bool DRAWING_TOOL::drawSegment( int aShape, DRAWSEGMENT* aGraphic )
else // User has clicked twice in the same spot
{ // a clear sign that the current drawing is finished
delete aGraphic; // but only if at least one graphic was created
started = false; // otherwise - force user to draw more or cancel
aGraphic = NULL; // otherwise - force user to draw more or cancel
started = false;
}
preview.Clear();
@ -1081,7 +1101,7 @@ bool DRAWING_TOOL::drawSegment( int aShape, DRAWSEGMENT* aGraphic )
}
bool DRAWING_TOOL::drawArc( DRAWSEGMENT* aGraphic )
bool DRAWING_TOOL::drawArc( DRAWSEGMENT*& aGraphic )
{
bool clockwise = true; // drawing direction of the arc
double startAngle = 0.0f; // angle of the first arc line
@ -1121,6 +1141,7 @@ bool DRAWING_TOOL::drawArc( DRAWSEGMENT* aGraphic )
preview.Clear();
preview.ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY );
delete aGraphic;
aGraphic = NULL;
break;
}

View File

@ -156,14 +156,14 @@ private:
///> be already created. The tool deletes the object if it is not added to a BOARD.
///> @return False if the tool was cancelled before the origin was set or origin and end are
///> the same point.
bool drawSegment( int aShape, DRAWSEGMENT* aGraphic );
bool drawSegment( int aShape, DRAWSEGMENT*& aGraphic );
///> Starts drawing an arc.
///> @param aGraphic is an object that is going to be used by the tool for drawing. It has to
///> be already created. The tool deletes the object if it is not added to a BOARD.
///> @return False if the tool was cancelled before the origin was set or origin and end are
///> the same point.
bool drawArc( DRAWSEGMENT* aGraphic );
bool drawArc( DRAWSEGMENT*& aGraphic );
///> Draws a polygon, that is added as a zone or a keepout area.
///> @param aKeepout decides if the drawn polygon is a zone or a keepout area.