Minor DRAWING_TOOL refactor

Automatically switch to a drawing layer, if a copper layer was
preselected. No annoying message boxes.
  Do not deactivate the tool on layer switch.
  Replaced setting updatePreview with direct calls to VIEW::update
  Line width is kept in m_lineWidth for all shapes.
This commit is contained in:
Maciej Suminski 2017-02-08 10:13:43 +01:00 committed by Maciej Suminski
parent 6c5e5c27e2
commit 2a9c6a6283
2 changed files with 114 additions and 122 deletions

View File

@ -1,7 +1,7 @@
/* /*
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2014 CERN * Copyright (C) 2014-2017 CERN
* Copyright (C) 2016 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 2016 KiCad Developers, see AUTHORS.txt for contributors.
* @author Maciej Suminski <maciej.suminski@cern.ch> * @author Maciej Suminski <maciej.suminski@cern.ch>
* *
@ -108,6 +108,7 @@ int DRAWING_TOOL::DrawLine( const TOOL_EVENT& aEvent )
m_frame->SetToolID( m_editModules ? ID_MODEDIT_LINE_TOOL : ID_PCB_ADD_LINE_BUTT, m_frame->SetToolID( m_editModules ? ID_MODEDIT_LINE_TOOL : ID_PCB_ADD_LINE_BUTT,
wxCURSOR_PENCIL, _( "Add graphic line" ) ); wxCURSOR_PENCIL, _( "Add graphic line" ) );
m_lineWidth = getSegmentWidth( getDrawingLayer() );
while( drawSegment( S_SEGMENT, line, startingPoint ) ) while( drawSegment( S_SEGMENT, line, startingPoint ) )
{ {
@ -141,6 +142,7 @@ int DRAWING_TOOL::DrawCircle( const TOOL_EVENT& aEvent )
m_frame->SetToolID( m_editModules ? ID_MODEDIT_CIRCLE_TOOL : ID_PCB_CIRCLE_BUTT, m_frame->SetToolID( m_editModules ? ID_MODEDIT_CIRCLE_TOOL : ID_PCB_CIRCLE_BUTT,
wxCURSOR_PENCIL, _( "Add graphic circle" ) ); wxCURSOR_PENCIL, _( "Add graphic circle" ) );
m_lineWidth = getSegmentWidth( getDrawingLayer() );
while( drawSegment( S_CIRCLE, circle ) ) while( drawSegment( S_CIRCLE, circle ) )
{ {
@ -169,6 +171,7 @@ int DRAWING_TOOL::DrawArc( const TOOL_EVENT& aEvent )
m_frame->SetToolID( m_editModules ? ID_MODEDIT_ARC_TOOL : ID_PCB_ARC_BUTT, m_frame->SetToolID( m_editModules ? ID_MODEDIT_ARC_TOOL : ID_PCB_ARC_BUTT,
wxCURSOR_PENCIL, _( "Add graphic arc" ) ); wxCURSOR_PENCIL, _( "Add graphic arc" ) );
m_lineWidth = getSegmentWidth( getDrawingLayer() );
while( drawArc( arc ) ) while( drawArc( arc ) )
{ {
@ -375,6 +378,7 @@ int DRAWING_TOOL::DrawDimension( const TOOL_EVENT& aEvent )
Activate(); Activate();
m_frame->SetToolID( ID_PCB_DIMENSION_BUTT, wxCURSOR_PENCIL, _( "Add dimension" ) ); m_frame->SetToolID( ID_PCB_DIMENSION_BUTT, wxCURSOR_PENCIL, _( "Add dimension" ) );
m_lineWidth = getSegmentWidth( getDrawingLayer() );
enum DIMENSION_STEPS enum DIMENSION_STEPS
{ {
@ -408,17 +412,17 @@ int DRAWING_TOOL::DrawDimension( const TOOL_EVENT& aEvent )
else if( evt->IsAction( &COMMON_ACTIONS::incWidth ) && step != SET_ORIGIN ) else if( evt->IsAction( &COMMON_ACTIONS::incWidth ) && step != SET_ORIGIN )
{ {
dimension->SetWidth( dimension->GetWidth() + WIDTH_STEP ); m_lineWidth += WIDTH_STEP;
dimension->SetWidth( m_lineWidth );
m_view->Update( &preview ); m_view->Update( &preview );
} }
else if( evt->IsAction( &COMMON_ACTIONS::decWidth ) && step != SET_ORIGIN ) else if( evt->IsAction( &COMMON_ACTIONS::decWidth ) && step != SET_ORIGIN )
{ {
int width = dimension->GetWidth(); if( m_lineWidth > WIDTH_STEP )
if( width > WIDTH_STEP )
{ {
dimension->SetWidth( width - WIDTH_STEP ); m_lineWidth -= WIDTH_STEP;
dimension->SetWidth( m_lineWidth );
m_view->Update( &preview ); m_view->Update( &preview );
} }
} }
@ -434,37 +438,29 @@ int DRAWING_TOOL::DrawDimension( const TOOL_EVENT& aEvent )
{ {
case SET_ORIGIN: case SET_ORIGIN:
{ {
LAYER_ID layer = m_frame->GetScreen()->m_Active_Layer; LAYER_ID layer = getDrawingLayer();
if( IsCopperLayer( layer ) || layer == Edge_Cuts ) // Init the new item attributes
{ dimension = new DIMENSION( m_board );
DisplayInfoMessage( NULL, _( "Dimension not allowed on Copper or Edge Cut layers" ) ); dimension->SetLayer( layer );
--step; dimension->SetOrigin( wxPoint( cursorPos.x, cursorPos.y ) );
} dimension->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
else dimension->Text().SetTextSize( m_board->GetDesignSettings().m_PcbTextSize );
{
// Init the new item attributes
dimension = new DIMENSION( m_board );
dimension->SetLayer( layer );
dimension->SetOrigin( wxPoint( cursorPos.x, cursorPos.y ) );
dimension->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
dimension->Text().SetTextSize( m_board->GetDesignSettings().m_PcbTextSize );
int width = m_board->GetDesignSettings().m_PcbTextWidth; int width = m_board->GetDesignSettings().m_PcbTextWidth;
maxThickness = Clamp_Text_PenSize( width, dimension->Text().GetTextSize() ); maxThickness = Clamp_Text_PenSize( width, dimension->Text().GetTextSize() );
if( width > maxThickness ) if( width > maxThickness )
width = maxThickness; width = maxThickness;
dimension->Text().SetThickness( width ); dimension->Text().SetThickness( width );
dimension->SetWidth( width ); dimension->SetWidth( width );
dimension->AdjustDimensionDetails(); dimension->AdjustDimensionDetails();
preview.Add( dimension ); preview.Add( dimension );
m_controls->SetAutoPan( true ); m_controls->SetAutoPan( true );
m_controls->CaptureCursor( true ); m_controls->CaptureCursor( true );
}
} }
break; break;
@ -584,7 +580,6 @@ int DRAWING_TOOL::PlaceDXF( const TOOL_EVENT& aEvent )
for( auto item : list ) for( auto item : list )
{ {
assert( item->Type() == PCB_LINE_T || item->Type() == PCB_TEXT_T ); assert( item->Type() == PCB_LINE_T || item->Type() == PCB_TEXT_T );
preview.Add( item ); preview.Add( item );
} }
@ -819,14 +814,12 @@ bool DRAWING_TOOL::drawSegment( int aShape, DRAWSEGMENT*& aGraphic,
if( aStartingPoint ) if( aStartingPoint )
{ {
LAYER_ID layer = m_frame->GetScreen()->m_Active_Layer;
// Init the new item attributes // Init the new item attributes
aGraphic->SetShape( (STROKE_T) aShape ); aGraphic->SetShape( (STROKE_T) aShape );
aGraphic->SetWidth( m_lineWidth ); aGraphic->SetWidth( m_lineWidth );
aGraphic->SetStart( wxPoint( aStartingPoint->x, aStartingPoint->y ) ); aGraphic->SetStart( wxPoint( aStartingPoint->x, aStartingPoint->y ) );
aGraphic->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) ); aGraphic->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
aGraphic->SetLayer( layer ); aGraphic->SetLayer( getDrawingLayer() );
if( aShape == S_SEGMENT ) if( aShape == S_SEGMENT )
line45 = *aGraphic; // used only for direction 45 mode with lines line45 = *aGraphic; // used only for direction 45 mode with lines
@ -841,7 +834,6 @@ bool DRAWING_TOOL::drawSegment( int aShape, DRAWSEGMENT*& aGraphic,
// Main loop: keep receiving events // Main loop: keep receiving events
while( OPT_TOOL_EVENT evt = Wait() ) while( OPT_TOOL_EVENT evt = Wait() )
{ {
bool updatePreview = false; // should preview be updated
cursorPos = m_controls->GetCursorPosition(); cursorPos = m_controls->GetCursorPosition();
// 45 degree angle constraint enabled with an option and toggled with Ctrl // 45 degree angle constraint enabled with an option and toggled with Ctrl
@ -862,17 +854,22 @@ bool DRAWING_TOOL::drawSegment( int aShape, DRAWSEGMENT*& aGraphic,
aGraphic->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) ); aGraphic->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
} }
updatePreview = true; m_view->Update( &preview );
} }
if( evt->IsCancel() || evt->IsActivate() || evt->IsAction( &COMMON_ACTIONS::layerChanged ) ) if( evt->IsCancel() || evt->IsActivate() )
{ {
preview.Clear(); preview.Clear();
updatePreview = true; m_view->Update( &preview );
delete aGraphic; delete aGraphic;
aGraphic = NULL; aGraphic = NULL;
break; break;
} }
else if( evt->IsAction( &COMMON_ACTIONS::layerChanged ) )
{
aGraphic->SetLayer( getDrawingLayer() );
m_view->Update( &preview );
}
else if( evt->IsClick( BUT_RIGHT ) ) else if( evt->IsClick( BUT_RIGHT ) )
{ {
m_menu.ShowContextMenu(); m_menu.ShowContextMenu();
@ -881,38 +878,28 @@ bool DRAWING_TOOL::drawSegment( int aShape, DRAWSEGMENT*& aGraphic,
{ {
if( !started ) if( !started )
{ {
LAYER_ID layer = m_frame->GetScreen()->m_Active_Layer; // Init the new item attributes
aGraphic->SetShape( (STROKE_T) aShape );
aGraphic->SetWidth( m_lineWidth );
aGraphic->SetStart( wxPoint( cursorPos.x, cursorPos.y ) );
aGraphic->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
aGraphic->SetLayer( getDrawingLayer() );
if( IsCopperLayer( layer ) ) if( aShape == S_SEGMENT )
{ line45 = *aGraphic; // used only for direction 45 mode with lines
DisplayInfoMessage( NULL, _( "Graphic not allowed on Copper layers" ) );
}
else
{
// Init the new item attributes
aGraphic->SetShape( (STROKE_T) aShape );
m_lineWidth = getSegmentWidth( layer );
aGraphic->SetWidth( m_lineWidth );
aGraphic->SetStart( wxPoint( cursorPos.x, cursorPos.y ) );
aGraphic->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
aGraphic->SetLayer( layer );
if( aShape == S_SEGMENT ) preview.Add( aGraphic );
line45 = *aGraphic; // used only for direction 45 mode with lines m_controls->SetAutoPan( true );
m_controls->CaptureCursor( true );
preview.Add( aGraphic ); started = true;
m_controls->SetAutoPan( true );
m_controls->CaptureCursor( true );
started = true;
}
} }
else else
{ {
if( aGraphic->GetEnd() == aGraphic->GetStart() || if( aGraphic->GetEnd() == aGraphic->GetStart() ||
( evt->IsDblClick( BUT_LEFT ) && aShape == S_SEGMENT ) ) ( evt->IsDblClick( BUT_LEFT ) && aShape == S_SEGMENT ) )
// User has clicked twice in the same spot // User has clicked twice in the same spot
{ // a clear sign that the current drawing is finished { // a clear sign that the current drawing is finished
// Now we have to add the helper line as well // Now we have to add the helper line as well
if( direction45 ) if( direction45 )
{ {
@ -946,28 +933,24 @@ bool DRAWING_TOOL::drawSegment( int aShape, DRAWSEGMENT*& aGraphic,
else else
aGraphic->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) ); aGraphic->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
updatePreview = true; m_view->Update( &preview );
} }
else if( evt->IsAction( &COMMON_ACTIONS::incWidth ) ) else if( evt->IsAction( &COMMON_ACTIONS::incWidth ) )
{ {
m_lineWidth += WIDTH_STEP; m_lineWidth += WIDTH_STEP;
aGraphic->SetWidth( m_lineWidth ); aGraphic->SetWidth( m_lineWidth );
updatePreview = true; line45.SetWidth( m_lineWidth );
}
else if( evt->IsAction( &COMMON_ACTIONS::decWidth ) )
{
if( m_lineWidth > (unsigned) WIDTH_STEP )
{
m_lineWidth -= WIDTH_STEP;
aGraphic->SetWidth( m_lineWidth );
updatePreview = true;
}
}
if( updatePreview )
m_view->Update( &preview ); m_view->Update( &preview );
}
else if( evt->IsAction( &COMMON_ACTIONS::decWidth ) && ( m_lineWidth > WIDTH_STEP ) )
{
m_lineWidth -= WIDTH_STEP;
aGraphic->SetWidth( m_lineWidth );
line45.SetWidth( m_lineWidth );
m_view->Update( &preview );
}
} }
m_controls->ShowCursor( false ); m_controls->ShowCursor( false );
@ -986,6 +969,7 @@ bool DRAWING_TOOL::drawArc( DRAWSEGMENT*& aGraphic )
double startAngle = 0.0f; // angle of the first arc line double startAngle = 0.0f; // angle of the first arc line
VECTOR2I cursorPos = m_controls->GetCursorPosition(); VECTOR2I cursorPos = m_controls->GetCursorPosition();
// Line from the arc center to its origin, to visualize its radius
DRAWSEGMENT helperLine; DRAWSEGMENT helperLine;
helperLine.SetShape( S_SEGMENT ); helperLine.SetShape( S_SEGMENT );
helperLine.SetLayer( Dwgs_User ); helperLine.SetLayer( Dwgs_User );
@ -1032,31 +1016,26 @@ bool DRAWING_TOOL::drawArc( DRAWSEGMENT*& aGraphic )
{ {
case SET_ORIGIN: case SET_ORIGIN:
{ {
LAYER_ID layer = m_frame->GetScreen()->m_Active_Layer; LAYER_ID layer = getDrawingLayer();
if( IsCopperLayer( layer ) ) if( layer == Edge_Cuts ) // dimensions are not allowed on EdgeCuts
{ layer = Dwgs_User;
DisplayInfoMessage( NULL, _( "Graphic not allowed on Copper layers" ) );
--step;
}
else
{
// Init the new item attributes
aGraphic->SetShape( S_ARC );
aGraphic->SetAngle( 0.0 );
aGraphic->SetWidth( getSegmentWidth( layer ) );
aGraphic->SetCenter( wxPoint( cursorPos.x, cursorPos.y ) );
aGraphic->SetLayer( layer );
helperLine.SetStart( aGraphic->GetCenter() ); // Init the new item attributes
helperLine.SetEnd( aGraphic->GetCenter() ); aGraphic->SetShape( S_ARC );
aGraphic->SetAngle( 0.0 );
aGraphic->SetWidth( m_lineWidth );
aGraphic->SetCenter( wxPoint( cursorPos.x, cursorPos.y ) );
aGraphic->SetLayer( layer );
preview.Add( aGraphic ); helperLine.SetStart( aGraphic->GetCenter() );
preview.Add( &helperLine ); helperLine.SetEnd( aGraphic->GetCenter() );
m_controls->SetAutoPan( true ); preview.Add( aGraphic );
m_controls->CaptureCursor( true ); preview.Add( &helperLine );
}
m_controls->SetAutoPan( true );
m_controls->CaptureCursor( true );
} }
break; break;
@ -1120,25 +1099,21 @@ bool DRAWING_TOOL::drawArc( DRAWSEGMENT*& aGraphic )
break; break;
} }
// Show a preview of the item
m_view->Update( &preview ); m_view->Update( &preview );
} }
else if( evt->IsAction( &COMMON_ACTIONS::incWidth ) ) else if( evt->IsAction( &COMMON_ACTIONS::incWidth ) )
{ {
aGraphic->SetWidth( aGraphic->GetWidth() + WIDTH_STEP ); m_lineWidth += WIDTH_STEP;
aGraphic->SetWidth( m_lineWidth );
m_view->Update( &preview ); m_view->Update( &preview );
} }
else if( evt->IsAction( &COMMON_ACTIONS::decWidth ) ) else if( evt->IsAction( &COMMON_ACTIONS::decWidth ) && m_lineWidth > WIDTH_STEP )
{ {
int width = aGraphic->GetWidth(); m_lineWidth -= WIDTH_STEP;
aGraphic->SetWidth( m_lineWidth );
if( width > WIDTH_STEP ) m_view->Update( &preview );
{
aGraphic->SetWidth( width - WIDTH_STEP );
m_view->Update( &preview );
}
} }
else if( evt->IsAction( &COMMON_ACTIONS::arcPosture ) ) else if( evt->IsAction( &COMMON_ACTIONS::arcPosture ) )
@ -1187,7 +1162,6 @@ int DRAWING_TOOL::drawZone( bool aKeepout )
// Main loop: keep receiving events // Main loop: keep receiving events
while( OPT_TOOL_EVENT evt = Wait() ) while( OPT_TOOL_EVENT evt = Wait() )
{ {
bool updatePreview = false; // should preview be updated
VECTOR2I cursorPos = m_controls->GetCursorPosition(); VECTOR2I cursorPos = m_controls->GetCursorPosition();
// Enable 45 degrees lines only mode by holding control // Enable 45 degrees lines only mode by holding control
@ -1206,7 +1180,7 @@ int DRAWING_TOOL::drawZone( bool aKeepout )
helperLine->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) ); helperLine->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
} }
updatePreview = true; m_view->Update( &preview );
} }
if( evt->IsCancel() || evt->IsActivate() ) if( evt->IsCancel() || evt->IsActivate() )
@ -1225,7 +1199,7 @@ int DRAWING_TOOL::drawZone( bool aKeepout )
} }
preview.FreeItems(); preview.FreeItems();
updatePreview = true; m_view->Update( &preview );
numPoints = 0; numPoints = 0;
} }
@ -1280,7 +1254,7 @@ int DRAWING_TOOL::drawZone( bool aKeepout )
} }
preview.FreeItems(); preview.FreeItems();
updatePreview = true; m_view->Update( &preview );
} }
else else
{ {
@ -1348,7 +1322,7 @@ int DRAWING_TOOL::drawZone( bool aKeepout )
} }
++numPoints; ++numPoints;
updatePreview = true; m_view->Update( &preview );
} }
} }
@ -1360,12 +1334,8 @@ int DRAWING_TOOL::drawZone( bool aKeepout )
else else
helperLine->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) ); helperLine->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
// Show a preview of the item
updatePreview = true;
}
if( updatePreview )
m_view->Update( &preview ); m_view->Update( &preview );
}
} }
m_controls->ShowCursor( false ); m_controls->ShowCursor( false );
@ -1429,4 +1399,23 @@ int DRAWING_TOOL::getSegmentWidth( unsigned int aLayer ) const
} }
const int DRAWING_TOOL::WIDTH_STEP = 100000; LAYER_ID DRAWING_TOOL::getDrawingLayer() const
{
LAYER_ID layer = m_frame->GetActiveLayer();
if( IsCopperLayer( layer ) )
{
if( layer == F_Cu )
layer = F_SilkS;
else if( layer == B_Cu )
layer = B_SilkS;
else
layer = Dwgs_User;
m_frame->SetActiveLayer( layer );
}
return layer;
}
const unsigned int DRAWING_TOOL::WIDTH_STEP = 100000;

View File

@ -1,7 +1,7 @@
/* /*
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2014 CERN * Copyright (C) 2014-2017 CERN
* @author Maciej Suminski <maciej.suminski@cern.ch> * @author Maciej Suminski <maciej.suminski@cern.ch>
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
@ -196,6 +196,9 @@ private:
///> Returns the appropriate width for a segment depending on the settings. ///> Returns the appropriate width for a segment depending on the settings.
int getSegmentWidth( unsigned int aLayer ) const; int getSegmentWidth( unsigned int aLayer ) const;
///> Selects a non-copper layer for drawing
LAYER_ID getDrawingLayer() const;
KIGFX::VIEW* m_view; KIGFX::VIEW* m_view;
KIGFX::VIEW_CONTROLS* m_controls; KIGFX::VIEW_CONTROLS* m_controls;
BOARD* m_board; BOARD* m_board;
@ -209,7 +212,7 @@ private:
TOOL_MENU m_menu; TOOL_MENU m_menu;
// How does line width change after one -/+ key press. // How does line width change after one -/+ key press.
static const int WIDTH_STEP; static const unsigned int WIDTH_STEP;
}; };
#endif /* __DRAWING_TOOL_H */ #endif /* __DRAWING_TOOL_H */