diff --git a/pcbnew/board_commit.cpp b/pcbnew/board_commit.cpp index 8dc2ae0618..80a5b903fd 100644 --- a/pcbnew/board_commit.cpp +++ b/pcbnew/board_commit.cpp @@ -41,7 +41,7 @@ using namespace std::placeholders; BOARD_COMMIT::BOARD_COMMIT( PCB_TOOL_BASE* aTool ) { m_toolMgr = aTool->GetManager(); - m_editModules = aTool->EditingModules(); + m_editModules = aTool->IsFootprintEditor(); } diff --git a/pcbnew/dialogs/dialog_print_pcbnew.cpp b/pcbnew/dialogs/dialog_print_pcbnew.cpp index ad52fb6ed9..4ae9e1d3b6 100644 --- a/pcbnew/dialogs/dialog_print_pcbnew.cpp +++ b/pcbnew/dialogs/dialog_print_pcbnew.cpp @@ -446,7 +446,7 @@ int PCBNEW_CONTROL::Print( const TOOL_EVENT& aEvent ) PCBNEW_PRINTOUT_SETTINGS settings( m_frame->GetPageSettings() ); DIALOG_PRINT_PCBNEW dlg( (PCB_BASE_EDIT_FRAME*) m_frame, &settings ); - if( m_editModules ) + if( m_isFootprintEditor ) dlg.ForcePrintBorder( false ); dlg.ShowModal(); diff --git a/pcbnew/footprint_edit_frame.cpp b/pcbnew/footprint_edit_frame.cpp index 47356dbbe3..5717eebc2e 100644 --- a/pcbnew/footprint_edit_frame.cpp +++ b/pcbnew/footprint_edit_frame.cpp @@ -889,15 +889,15 @@ void FOOTPRINT_EDIT_FRAME::setupTools() m_toolManager->RegisterTool( new GROUP_TOOL ); m_toolManager->RegisterTool( new CONVERT_TOOL ); - m_toolManager->GetTool()->SetEditModules( true ); - m_toolManager->GetTool()->SetEditModules( true ); - m_toolManager->GetTool()->SetEditModules( true ); - m_toolManager->GetTool()->SetEditModules( true ); - m_toolManager->GetTool()->SetEditModules( true ); - m_toolManager->GetTool()->SetEditModules( true ); - m_toolManager->GetTool()->SetEditModules( true ); - m_toolManager->GetTool()->SetEditModules( true ); - m_toolManager->GetTool()->SetEditModules( true ); + m_toolManager->GetTool()->SetIsFootprintEditor( true ); + m_toolManager->GetTool()->SetIsFootprintEditor( true ); + m_toolManager->GetTool()->SetIsFootprintEditor( true ); + m_toolManager->GetTool()->SetIsFootprintEditor( true ); + m_toolManager->GetTool()->SetIsFootprintEditor( true ); + m_toolManager->GetTool()->SetIsFootprintEditor( true ); + m_toolManager->GetTool()->SetIsFootprintEditor( true ); + m_toolManager->GetTool()->SetIsFootprintEditor( true ); + m_toolManager->GetTool()->SetIsFootprintEditor( true ); m_toolManager->GetTool()->SetFootprintFrame( true ); m_toolManager->InitTools(); diff --git a/pcbnew/tools/drawing_tool.cpp b/pcbnew/tools/drawing_tool.cpp index a33f0b74a6..3bc4f42e71 100644 --- a/pcbnew/tools/drawing_tool.cpp +++ b/pcbnew/tools/drawing_tool.cpp @@ -232,11 +232,11 @@ DRAWING_TOOL::MODE DRAWING_TOOL::GetDrawingMode() const int DRAWING_TOOL::DrawLine( const TOOL_EVENT& aEvent ) { - if( m_editModules && !m_frame->GetModel() ) + if( m_isFootprintEditor && !m_frame->GetModel() ) return 0; - MODULE* module = dynamic_cast( m_frame->GetModel() ); - PCB_SHAPE* line = m_editModules ? new FP_SHAPE( module ) : new PCB_SHAPE; + MODULE* parentFootprint = dynamic_cast( m_frame->GetModel() ); + PCB_SHAPE* line = m_isFootprintEditor ? new FP_SHAPE( parentFootprint ) : new PCB_SHAPE; BOARD_COMMIT commit( m_frame ); SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::LINE ); OPT startingPoint = boost::make_optional( false, VECTOR2D( 0, 0 ) ); @@ -255,7 +255,7 @@ int DRAWING_TOOL::DrawLine( const TOOL_EVENT& aEvent ) { if( line ) { - if( m_editModules ) + if( m_isFootprintEditor ) static_cast( line )->SetLocalCoord(); commit.Add( line ); @@ -267,7 +267,7 @@ int DRAWING_TOOL::DrawLine( const TOOL_EVENT& aEvent ) startingPoint = NULLOPT; } - line = m_editModules ? new FP_SHAPE( module ) : new PCB_SHAPE; + line = m_isFootprintEditor ? new FP_SHAPE( parentFootprint ) : new PCB_SHAPE; line->SetShape( S_SEGMENT ); line->SetFlags( IS_NEW ); } @@ -278,11 +278,11 @@ int DRAWING_TOOL::DrawLine( const TOOL_EVENT& aEvent ) int DRAWING_TOOL::DrawRectangle( const TOOL_EVENT& aEvent ) { - if( m_editModules && !m_frame->GetModel() ) + if( m_isFootprintEditor && !m_frame->GetModel() ) return 0; - MODULE* module = dynamic_cast( m_frame->GetModel() ); - PCB_SHAPE* rect = m_editModules ? new FP_SHAPE( module ) : new PCB_SHAPE; + MODULE* parentFootprint = dynamic_cast( m_frame->GetModel() ); + PCB_SHAPE* rect = m_isFootprintEditor ? new FP_SHAPE( parentFootprint ) : new PCB_SHAPE; BOARD_COMMIT commit( m_frame ); SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::RECTANGLE ); OPT startingPoint = boost::make_optional( false, VECTOR2D( 0, 0 ) ); @@ -301,7 +301,7 @@ int DRAWING_TOOL::DrawRectangle( const TOOL_EVENT& aEvent ) { if( rect ) { - if( m_editModules ) + if( m_isFootprintEditor ) static_cast( rect )->SetLocalCoord(); commit.Add( rect ); @@ -310,7 +310,7 @@ int DRAWING_TOOL::DrawRectangle( const TOOL_EVENT& aEvent ) m_toolMgr->RunAction( PCB_ACTIONS::selectItem, true, rect ); } - rect = m_editModules ? new FP_SHAPE( module ) : new PCB_SHAPE; + rect = m_isFootprintEditor ? new FP_SHAPE( parentFootprint ) : new PCB_SHAPE; rect->SetShape( S_RECT ); rect->SetFlags(IS_NEW ); startingPoint = NULLOPT; @@ -322,11 +322,11 @@ int DRAWING_TOOL::DrawRectangle( const TOOL_EVENT& aEvent ) int DRAWING_TOOL::DrawCircle( const TOOL_EVENT& aEvent ) { - if( m_editModules && !m_frame->GetModel() ) + if( m_isFootprintEditor && !m_frame->GetModel() ) return 0; - MODULE* module = dynamic_cast( m_frame->GetModel() ); - PCB_SHAPE* circle = m_editModules ? new FP_SHAPE( module ) : new PCB_SHAPE; + MODULE* parentFootprint = dynamic_cast( m_frame->GetModel() ); + PCB_SHAPE* circle = m_isFootprintEditor ? new FP_SHAPE( parentFootprint ) : new PCB_SHAPE; BOARD_COMMIT commit( m_frame ); SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::CIRCLE ); OPT startingPoint = boost::make_optional( false, VECTOR2D( 0, 0 ) ); @@ -345,7 +345,7 @@ int DRAWING_TOOL::DrawCircle( const TOOL_EVENT& aEvent ) { if( circle ) { - if( m_editModules ) + if( m_isFootprintEditor ) static_cast( circle )->SetLocalCoord(); commit.Add( circle ); @@ -354,7 +354,7 @@ int DRAWING_TOOL::DrawCircle( const TOOL_EVENT& aEvent ) m_toolMgr->RunAction( PCB_ACTIONS::selectItem, true, circle ); } - circle = m_editModules ? new FP_SHAPE( module ) : new PCB_SHAPE; + circle = m_isFootprintEditor ? new FP_SHAPE( parentFootprint ) : new PCB_SHAPE; circle->SetShape( S_CIRCLE ); circle->SetFlags( IS_NEW ); startingPoint = NULLOPT; @@ -366,11 +366,11 @@ int DRAWING_TOOL::DrawCircle( const TOOL_EVENT& aEvent ) int DRAWING_TOOL::DrawArc( const TOOL_EVENT& aEvent ) { - if( m_editModules && !m_frame->GetModel() ) + if( m_isFootprintEditor && !m_frame->GetModel() ) return 0; - MODULE* module = dynamic_cast( m_frame->GetModel() ); - PCB_SHAPE* arc = m_editModules ? new FP_SHAPE( module ) : new PCB_SHAPE; + MODULE* parentFootprint = dynamic_cast( m_frame->GetModel() ); + PCB_SHAPE* arc = m_isFootprintEditor ? new FP_SHAPE( parentFootprint ) : new PCB_SHAPE; BOARD_COMMIT commit( m_frame ); SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::ARC ); bool immediateMode = aEvent.HasPosition(); @@ -386,7 +386,7 @@ int DRAWING_TOOL::DrawArc( const TOOL_EVENT& aEvent ) { if( arc ) { - if( m_editModules ) + if( m_isFootprintEditor ) static_cast( arc )->SetLocalCoord(); commit.Add( arc ); @@ -395,7 +395,7 @@ int DRAWING_TOOL::DrawArc( const TOOL_EVENT& aEvent ) m_toolMgr->RunAction( PCB_ACTIONS::selectItem, true, arc ); } - arc = m_editModules ? new FP_SHAPE( module ) : new PCB_SHAPE; + arc = m_isFootprintEditor ? new FP_SHAPE( parentFootprint ) : new PCB_SHAPE; arc->SetShape( S_ARC ); arc->SetFlags( IS_NEW ); immediateMode = false; @@ -407,7 +407,7 @@ int DRAWING_TOOL::DrawArc( const TOOL_EVENT& aEvent ) int DRAWING_TOOL::PlaceText( const TOOL_EVENT& aEvent ) { - if( m_editModules && !m_frame->GetModel() ) + if( m_isFootprintEditor && !m_frame->GetModel() ) return 0; BOARD_ITEM* text = NULL; @@ -497,7 +497,7 @@ int DRAWING_TOOL::PlaceText( const TOOL_EVENT& aEvent ) PCB_LAYER_ID layer = m_frame->GetActiveLayer(); // Init the new item attributes - if( m_editModules ) + if( m_isFootprintEditor ) { FP_TEXT* fpText = new FP_TEXT( (MODULE*) m_frame->GetModel() ); @@ -628,7 +628,7 @@ void DRAWING_TOOL::constrainDimension( DIMENSION* aDim ) int DRAWING_TOOL::DrawDimension( const TOOL_EVENT& aEvent ) { - if( m_editModules && !m_frame->GetModel() ) + if( m_isFootprintEditor && !m_frame->GetModel() ) return 0; TOOL_EVENT originalEvent = aEvent; @@ -988,7 +988,7 @@ int DRAWING_TOOL::PlaceImportedGraphics( const TOOL_EVENT& aEvent ) // Note: PlaceImportedGraphics() will convert PCB_SHAPE_T and PCB_TEXT_T to footprint // items if needed - DIALOG_IMPORT_GFX dlg( m_frame, m_editModules ); + DIALOG_IMPORT_GFX dlg( m_frame, m_isFootprintEditor ); int dlgResult = dlg.ShowModal(); std::list>& list = dlg.GetImportedItems(); @@ -1012,7 +1012,7 @@ int DRAWING_TOOL::PlaceImportedGraphics( const TOOL_EVENT& aEvent ) if( dlg.ShouldGroupItems() ) { - if( m_editModules ) + if( m_isFootprintEditor ) grp = new PCB_GROUP( m_frame->GetBoard()->GetFirstModule() ); else grp = new PCB_GROUP( m_frame->GetBoard() ); @@ -1023,7 +1023,7 @@ int DRAWING_TOOL::PlaceImportedGraphics( const TOOL_EVENT& aEvent ) { EDA_ITEM* item = ptr.get(); - if( m_editModules ) + if( m_isFootprintEditor ) wxASSERT( item->Type() == PCB_FP_SHAPE_T || item->Type() == PCB_FP_TEXT_T ); else wxASSERT( item->Type() == PCB_SHAPE_T || item->Type() == PCB_TEXT_T ); @@ -1157,7 +1157,7 @@ int DRAWING_TOOL::PlaceImportedGraphics( const TOOL_EVENT& aEvent ) int DRAWING_TOOL::SetAnchor( const TOOL_EVENT& aEvent ) { - wxASSERT( m_editModules ); + wxASSERT( m_isFootprintEditor ); if( !m_frame->GetModel() ) return 0; @@ -1798,7 +1798,7 @@ bool DRAWING_TOOL::getSourceZoneForAction( ZONE_MODE aMode, ZONE_CONTAINER** aZo int DRAWING_TOOL::DrawZone( const TOOL_EVENT& aEvent ) { - if( m_editModules && !m_frame->GetModel() ) + if( m_isFootprintEditor && !m_frame->GetModel() ) return 0; ZONE_MODE zoneMode = aEvent.Parameter(); diff --git a/pcbnew/tools/edit_tool.cpp b/pcbnew/tools/edit_tool.cpp index b068f877d2..8b48525f07 100644 --- a/pcbnew/tools/edit_tool.cpp +++ b/pcbnew/tools/edit_tool.cpp @@ -158,13 +158,13 @@ bool EDIT_TOOL::Init() m_selectionTool = static_cast( m_toolMgr->FindTool( "pcbnew.InteractiveSelection" ) ); wxASSERT_MSG( m_selectionTool, "pcbnew.InteractiveSelection tool is not available" ); - auto editingModuleCondition = + auto inFootprintEditor = [ this ] ( const SELECTION& aSelection ) { - return m_editModules; + return m_isFootprintEditor; }; - auto singleModuleCondition = SELECTION_CONDITIONS::OnlyType( PCB_MODULE_T ) + auto singleFootprintCondition = SELECTION_CONDITIONS::OnlyType( PCB_MODULE_T ) && SELECTION_CONDITIONS::Count( 1 ); auto noActiveToolCondition = @@ -198,7 +198,7 @@ bool EDIT_TOOL::Init() menu.AddItem( PCB_ACTIONS::rotateCcw, SELECTION_CONDITIONS::NotEmpty ); menu.AddItem( PCB_ACTIONS::rotateCw, SELECTION_CONDITIONS::NotEmpty ); menu.AddItem( PCB_ACTIONS::flip, SELECTION_CONDITIONS::NotEmpty ); - menu.AddItem( PCB_ACTIONS::mirror, editingModuleCondition && SELECTION_CONDITIONS::NotEmpty ); + menu.AddItem( PCB_ACTIONS::mirror, inFootprintEditor && SELECTION_CONDITIONS::NotEmpty ); menu.AddItem( ACTIONS::doDelete, SELECTION_CONDITIONS::NotEmpty ); menu.AddItem( PCB_ACTIONS::properties, SELECTION_CONDITIONS::Count( 1 ) @@ -222,9 +222,9 @@ bool EDIT_TOOL::Init() // Footprint actions menu.AddSeparator( 150 ); - menu.AddItem( PCB_ACTIONS::editFpInFpEditor, singleModuleCondition, 150 ); - menu.AddItem( PCB_ACTIONS::updateFootprint, singleModuleCondition, 150 ); - menu.AddItem( PCB_ACTIONS::changeFootprint, singleModuleCondition, 150 ); + menu.AddItem( PCB_ACTIONS::editFpInFpEditor, singleFootprintCondition, 150 ); + menu.AddItem( PCB_ACTIONS::updateFootprint, singleFootprintCondition, 150 ); + menu.AddItem( PCB_ACTIONS::changeFootprint, singleFootprintCondition, 150 ); return true; } @@ -490,7 +490,7 @@ int EDIT_TOOL::doMoveSelection( TOOL_EVENT aEvent, bool aPickReference ) m_dragging = true; // When editing footprints, all items have the same parent - if( EditingModules() ) + if( IsFootprintEditor() ) { m_commit->Modify( selection.Front() ); } @@ -960,12 +960,12 @@ int EDIT_TOOL::Rotate( const TOOL_EVENT& aEvent ) const int rotateAngle = TOOL_EVT_UTILS::GetEventRotationAngle( *editFrame, aEvent ); // When editing footprints, all items have the same parent - if( EditingModules() ) + if( IsFootprintEditor() ) m_commit->Modify( selection.Front() ); for( auto item : selection ) { - if( !item->IsNew() && !EditingModules() ) + if( !item->IsNew() && !IsFootprintEditor() ) { m_commit->Modify( item ); @@ -1060,7 +1060,7 @@ int EDIT_TOOL::Mirror( const TOOL_EVENT& aEvent ) wxPoint mirrorPoint( refPoint.x, refPoint.y ); // When editing footprints, all items have the same parent - if( EditingModules() ) + if( IsFootprintEditor() ) m_commit->Modify( selection.Front() ); for( EDA_ITEM* item : selection ) @@ -1073,7 +1073,7 @@ int EDIT_TOOL::Mirror( const TOOL_EVENT& aEvent ) case PCB_FP_ZONE_AREA_T: case PCB_PAD_T: // Only create undo entry for items on the board - if( !item->IsNew() && !EditingModules() ) + if( !item->IsNew() && !IsFootprintEditor() ) m_commit->Modify( item ); break; @@ -1156,7 +1156,7 @@ int EDIT_TOOL::Flip( const TOOL_EVENT& aEvent ) updateModificationPoint( selection ); // Flip around the anchor for footprints, and the bounding box center for board items - VECTOR2I modPoint = EditingModules() ? VECTOR2I( 0, 0 ) : selection.GetCenter(); + VECTOR2I modPoint = IsFootprintEditor() ? VECTOR2I( 0, 0 ) : selection.GetCenter(); // If only one item selected, flip around the selection or item anchor point (instead // of the bounding box center) to avoid moving the item anchor @@ -1171,12 +1171,12 @@ int EDIT_TOOL::Flip( const TOOL_EVENT& aEvent ) bool leftRight = frame()->Settings().m_FlipLeftRight; // When editing footprints, all items have the same parent - if( EditingModules() ) + if( IsFootprintEditor() ) m_commit->Modify( selection.Front() ); for( EDA_ITEM* item : selection ) { - if( !item->IsNew() && !EditingModules() ) + if( !item->IsNew() && !IsFootprintEditor() ) m_commit->Modify( item ); if( item->Type() == PCB_GROUP_T ) @@ -1467,14 +1467,14 @@ int EDIT_TOOL::MoveExact( const TOOL_EVENT& aEvent ) selCenter += translation; // When editing footprints, all items have the same parent - if( EditingModules() ) + if( IsFootprintEditor() ) m_commit->Modify( selection.Front() ); for( EDA_ITEM* selItem : selection ) { BOARD_ITEM* item = static_cast( selItem ); - if( !item->IsNew() && !EditingModules() ) + if( !item->IsNew() && !IsFootprintEditor() ) { m_commit->Modify( item ); @@ -1563,7 +1563,7 @@ int EDIT_TOOL::Duplicate( const TOOL_EVENT& aEvent ) BOARD_ITEM* dupe_item = nullptr; BOARD_ITEM* orig_item = static_cast( item ); - if( m_editModules ) + if( m_isFootprintEditor ) { MODULE* editModule = editFrame->GetBoard()->GetFirstModule(); dupe_item = editModule->DuplicateItem( orig_item ); @@ -1679,7 +1679,7 @@ int EDIT_TOOL::CreateArray( const TOOL_EVENT& aEvent ) // we have a selection to work on now, so start the tool process PCB_BASE_FRAME* editFrame = getEditFrame(); - ARRAY_CREATOR array_creator( *editFrame, m_editModules, selection ); + ARRAY_CREATOR array_creator( *editFrame, m_isFootprintEditor, selection ); array_creator.Invoke(); return 0; @@ -1852,7 +1852,7 @@ int EDIT_TOOL::copyToClipboard( const TOOL_EVENT& aEvent ) selection.SetReferencePoint( refPoint ); io.SetBoard( board() ); - io.SaveSelection( selection, m_editModules ); + io.SaveSelection( selection, m_isFootprintEditor ); frame()->SetStatusText( _( "Selection copied" ) ); } diff --git a/pcbnew/tools/group_tool.cpp b/pcbnew/tools/group_tool.cpp index 3219d845fb..65aef4af8e 100644 --- a/pcbnew/tools/group_tool.cpp +++ b/pcbnew/tools/group_tool.cpp @@ -353,7 +353,7 @@ int GROUP_TOOL::Group( const TOOL_EVENT& aEvent ) if( selection.Empty() ) m_toolMgr->RunAction( PCB_ACTIONS::selectionCursor, true ); - if( m_editModules ) + if( m_isFootprintEditor ) { MODULE* module = board->GetFirstModule(); @@ -411,7 +411,7 @@ int GROUP_TOOL::Ungroup( const TOOL_EVENT& aEvent ) if( group ) { - if( m_editModules ) + if( m_isFootprintEditor ) { MODULE* module = board->GetFirstModule(); diff --git a/pcbnew/tools/pad_tool.cpp b/pcbnew/tools/pad_tool.cpp index 1c6b0dc92e..2088d7287a 100644 --- a/pcbnew/tools/pad_tool.cpp +++ b/pcbnew/tools/pad_tool.cpp @@ -89,7 +89,7 @@ bool PAD_TOOL::Init() menu.AddSeparator( 400 ); - if( m_editModules ) + if( m_isFootprintEditor ) { menu.AddItem( PCB_ACTIONS::enumeratePads, SELECTION_CONDITIONS::ShowAlways, 400 ); menu.AddItem( PCB_ACTIONS::recombinePad, recombineCondition, 400 ); diff --git a/pcbnew/tools/pcb_tool_base.cpp b/pcbnew/tools/pcb_tool_base.cpp index ec771c14b4..7b3a4949d8 100644 --- a/pcbnew/tools/pcb_tool_base.cpp +++ b/pcbnew/tools/pcb_tool_base.cpp @@ -24,7 +24,6 @@ #include "pcb_tool_base.h" #include -#include #include #include #include @@ -59,25 +58,26 @@ void PCB_TOOL_BASE::doInteractiveItemPlacement( const std::string& aTool, aPlacer->m_frame = frame(); aPlacer->m_modifiers = 0; - auto makeNewItem = [&] ( VECTOR2I aPosition ) - { - if( frame()->GetModel() ) - newItem = aPlacer->CreateItem(); - - if( newItem ) - { - newItem->SetPosition( (wxPoint) aPosition ); - preview.Add( newItem.get() ); - - if( newItem->Type() == PCB_MODULE_T ) + auto makeNewItem = + [&]( VECTOR2I aPosition ) { - auto module = dyn_cast( newItem.get() ); + if( frame()->GetModel() ) + newItem = aPlacer->CreateItem(); - // footprints have more drawable parts - module->RunOnChildren( std::bind( &KIGFX::VIEW_GROUP::Add, &preview, _1 ) ); - } - } - }; + if( newItem ) + { + newItem->SetPosition( (wxPoint) aPosition ); + preview.Add( newItem.get() ); + + if( newItem->Type() == PCB_MODULE_T ) + { + auto module = dyn_cast( newItem.get() ); + + // footprints have more drawable parts + module->RunOnChildren( std::bind( &KIGFX::VIEW_GROUP::Add, &preview, _1 ) ); + } + } + }; if( aOptions & IPO_SINGLE_CLICK ) makeNewItem( controls()->GetCursorPosition() ); @@ -102,15 +102,16 @@ void PCB_TOOL_BASE::doInteractiveItemPlacement( const std::string& aTool, VECTOR2I cursorPos = controls()->GetCursorPosition(); aPlacer->m_modifiers = evt->Modifier(); - auto cleanup = [&] () - { - newItem = nullptr; - preview.Clear(); - view()->Update( &preview ); - controls()->SetAutoPan( false ); - controls()->CaptureCursor( false ); - controls()->ShowCursor( true ); - }; + auto cleanup = + [&] () + { + newItem = nullptr; + preview.Clear(); + view()->Update( &preview ); + controls()->SetAutoPan( false ); + controls()->CaptureCursor( false ); + controls()->ShowCursor( true ); + }; if( evt->IsCancelInteractive() ) { @@ -230,7 +231,6 @@ void PCB_TOOL_BASE::doInteractiveItemPlacement( const std::string& aTool, view()->Update( &preview ); } } - else if( newItem && evt->IsMotion() ) { // track the cursor @@ -240,9 +240,10 @@ void PCB_TOOL_BASE::doInteractiveItemPlacement( const std::string& aTool, // Show a preview of the item view()->Update( &preview ); } - else + { evt->SetPassEvent(); + } } view()->Remove( &preview ); @@ -252,8 +253,7 @@ void PCB_TOOL_BASE::doInteractiveItemPlacement( const std::string& aTool, bool PCB_TOOL_BASE::Init() { // A basic context manu. Many (but not all) tools will choose to override this. - - auto& ctxMenu = m_menu.GetMenu(); + CONDITIONAL_MENU& ctxMenu = m_menu.GetMenu(); // cancel current tool goes in main context menu at the top if present ctxMenu.AddItem( ACTIONS::cancelInteractive, SELECTION_CONDITIONS::ShowAlways, 1 ); @@ -289,17 +289,17 @@ PCB_DRAW_PANEL_GAL* PCB_TOOL_BASE::canvas() const const PCBNEW_SELECTION& PCB_TOOL_BASE::selection() const { - auto selTool = m_toolMgr->GetTool(); - const auto& selection = selTool->GetSelection(); - return selection; + SELECTION_TOOL* selTool = m_toolMgr->GetTool(); + + return selTool->GetSelection(); } PCBNEW_SELECTION& PCB_TOOL_BASE::selection() { - auto selTool = m_toolMgr->GetTool(); - auto& selection = selTool->GetSelection(); - return selection; + SELECTION_TOOL* selTool = m_toolMgr->GetTool(); + + return selTool->GetSelection(); } diff --git a/pcbnew/tools/pcb_tool_base.h b/pcbnew/tools/pcb_tool_base.h index 9a30916cb5..d97d72e21b 100644 --- a/pcbnew/tools/pcb_tool_base.h +++ b/pcbnew/tools/pcb_tool_base.h @@ -2,6 +2,7 @@ * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2016 CERN + * Copyright (C) 2017-2020 KiCad Developers, see AUTHORS.txt for contributors. * @author Tomasz Wlostowski * * This program is free software; you can redistribute it and/or @@ -56,12 +57,14 @@ struct INTERACTIVE_PLACER_BASE } virtual std::unique_ptr CreateItem() = 0; + virtual void SnapItem( BOARD_ITEM *aItem ); + virtual bool PlaceItem( BOARD_ITEM *aItem, BOARD_COMMIT& aCommit ); PCB_BASE_EDIT_FRAME* m_frame; - BOARD* m_board; - int m_modifiers; + BOARD* m_board; + int m_modifiers; }; @@ -73,8 +76,8 @@ public: * * Creates a tool with given id & name. The name must be unique. */ PCB_TOOL_BASE( TOOL_ID aId, const std::string& aName ) : - TOOL_INTERACTIVE ( aId, aName ), - m_editModules( false ) + TOOL_INTERACTIVE ( aId, aName ), + m_isFootprintEditor( false ) {}; /** @@ -82,8 +85,8 @@ public: * * Creates a tool with given name. The name must be unique. */ PCB_TOOL_BASE( const std::string& aName ) : - TOOL_INTERACTIVE ( aName ), - m_editModules( false ) + TOOL_INTERACTIVE ( aName ), + m_isFootprintEditor( false ) {}; virtual ~PCB_TOOL_BASE() {}; @@ -92,24 +95,16 @@ public: virtual void Reset( RESET_REASON aReason ) override; /** - * Function SetEditModules() + * Function SetIsFootprintEditor() * * Toggles edit module mode. When enabled, one may select parts of footprints individually * (graphics, pads, etc.), so they can be modified. * @param aEnabled decides if the mode should be enabled. */ - void SetEditModules( bool aEnabled ) - { - m_editModules = aEnabled; - } - - bool EditingModules() const - { - return m_editModules; - } + void SetIsFootprintEditor( bool aEnabled ) { m_isFootprintEditor = aEnabled; } + bool IsFootprintEditor() const { return m_isFootprintEditor; } protected: - /** * Options for placing items interactively. */ @@ -128,7 +123,6 @@ protected: IPO_REPEAT = 0x08 }; - /** * Helper function for performing a common interactive idiom: * wait for a left click, place an item there (perhaps with a @@ -171,11 +165,15 @@ protected: } const PCB_DISPLAY_OPTIONS& displayOptions() const; + PCB_DRAW_PANEL_GAL* canvas() const; + const PCBNEW_SELECTION& selection() const; + PCBNEW_SELECTION& selection(); - bool m_editModules; +protected: + bool m_isFootprintEditor; }; #endif diff --git a/pcbnew/tools/pcbnew_control.cpp b/pcbnew/tools/pcbnew_control.cpp index 16b1b1d0b1..2e3c5ec57a 100644 --- a/pcbnew/tools/pcbnew_control.cpp +++ b/pcbnew/tools/pcbnew_control.cpp @@ -409,7 +409,7 @@ int PCBNEW_CONTROL::GridSetOrigin( const TOOL_EVENT& aEvent ) } else { - if( m_editModules && !getEditFrame()->GetModel() ) + if( m_isFootprintEditor && !getEditFrame()->GetModel() ) return 0; std::string tool = aEvent.GetCommandStr().get(); @@ -446,7 +446,7 @@ int PCBNEW_CONTROL::GridResetOrigin( const TOOL_EVENT& aEvent ) int PCBNEW_CONTROL::DeleteItemCursor( const TOOL_EVENT& aEvent ) { - if( m_editModules && !m_frame->GetBoard()->GetFirstModule() ) + if( m_isFootprintEditor && !m_frame->GetBoard()->GetFirstModule() ) return 0; std::string tool = aEvent.GetCommandStr().get(); @@ -493,7 +493,7 @@ int PCBNEW_CONTROL::DeleteItemCursor( const TOOL_EVENT& aEvent ) GENERAL_COLLECTOR collector; collector.m_Threshold = KiROUND( getView()->ToWorld( HITTEST_THRESHOLD_PIXELS ) ); - if( m_editModules ) + if( m_isFootprintEditor ) collector.Collect( board, GENERAL_COLLECTOR::ModuleItems, (wxPoint) aPos, guide ); else collector.Collect( board, GENERAL_COLLECTOR::BoardLevelItems, (wxPoint) aPos, guide ); @@ -635,7 +635,7 @@ int PCBNEW_CONTROL::Paste( const TOOL_EVENT& aEvent ) if( !frame()->IsType( FRAME_FOOTPRINT_EDITOR ) && !frame()->IsType( FRAME_PCB_EDITOR ) ) return 0; - bool editModules = m_editModules || frame()->IsType( FRAME_FOOTPRINT_EDITOR ); + bool editModules = m_isFootprintEditor || frame()->IsType( FRAME_FOOTPRINT_EDITOR ); if( clipItem->Type() == PCB_T ) { diff --git a/pcbnew/tools/selection_tool.cpp b/pcbnew/tools/selection_tool.cpp index 6fec078e94..35be558493 100644 --- a/pcbnew/tools/selection_tool.cpp +++ b/pcbnew/tools/selection_tool.cpp @@ -534,8 +534,8 @@ bool SELECTION_TOOL::selectPoint( const VECTOR2I& aWhere, bool aOnDrag, ExitGroup(); } - collector.Collect( board(), m_editModules ? GENERAL_COLLECTOR::ModuleItems - : GENERAL_COLLECTOR::AllBoardItems, + collector.Collect( board(), m_isFootprintEditor ? GENERAL_COLLECTOR::ModuleItems + : GENERAL_COLLECTOR::AllBoardItems, (wxPoint) aWhere, guide ); // Remove unselectable items @@ -769,7 +769,7 @@ bool SELECTION_TOOL::selectMultiple() SELECTION_LOCK_FLAGS SELECTION_TOOL::CheckLock() { - if( !m_locked || m_editModules ) + if( !m_locked || m_isFootprintEditor ) return SELECTION_UNLOCKED; bool containsLocked = false; @@ -1632,8 +1632,8 @@ void SELECTION_TOOL::RebuildSelection() return SEARCH_RESULT::CONTINUE; }; - board()->Visit( inspector, nullptr, m_editModules ? GENERAL_COLLECTOR::ModuleItems - : GENERAL_COLLECTOR::AllBoardItems ); + board()->Visit( inspector, nullptr, m_isFootprintEditor ? GENERAL_COLLECTOR::ModuleItems + : GENERAL_COLLECTOR::AllBoardItems ); } @@ -1860,7 +1860,7 @@ bool SELECTION_TOOL::Selectable( const BOARD_ITEM* aItem, bool checkVisibilityOn // If it is, and we are not editing the footprint, it should not be selectable bool zoneInFootprint = zone->GetParent() && zone->GetParent()->Type() == PCB_MODULE_T; - if( zoneInFootprint && !m_editModules && !checkVisibilityOnly ) + if( zoneInFootprint && !m_isFootprintEditor && !checkVisibilityOnly ) return false; // zones can exist on multiple layers! @@ -1888,7 +1888,7 @@ bool SELECTION_TOOL::Selectable( const BOARD_ITEM* aItem, bool checkVisibilityOn case PCB_MODULE_T: { // In modedit, we do not want to select the module itself. - if( m_editModules ) + if( m_isFootprintEditor ) return false; // Allow selection of footprints if some part of the footprint is visible. @@ -1920,20 +1920,20 @@ bool SELECTION_TOOL::Selectable( const BOARD_ITEM* aItem, bool checkVisibilityOn // Multiple selection is only allowed in modedit mode. In pcbnew, you have to select // module subparts one by one, rather than with a drag selection. This is so you can // pick up items under an (unlocked) module without also moving the module's sub-parts. - if( !m_editModules && !checkVisibilityOnly ) + if( !m_isFootprintEditor && !checkVisibilityOnly ) { if( m_multiple && !settings->GetHighContrast() ) return false; } - if( !m_editModules && !view()->IsVisible( aItem ) ) + if( !m_isFootprintEditor && !view()->IsVisible( aItem ) ) return false; break; case PCB_FP_SHAPE_T: // Module edge selections are only allowed in modedit mode. - if( !m_editModules && !checkVisibilityOnly ) + if( !m_isFootprintEditor && !checkVisibilityOnly ) return false; break; @@ -1943,7 +1943,7 @@ bool SELECTION_TOOL::Selectable( const BOARD_ITEM* aItem, bool checkVisibilityOn // Multiple selection is only allowed in modedit mode. In pcbnew, you have to select // module subparts one by one, rather than with a drag selection. This is so you can // pick up items under an (unlocked) module without also moving the module's sub-parts. - if( !m_editModules && !checkVisibilityOnly ) + if( !m_isFootprintEditor && !checkVisibilityOnly ) { if( m_multiple ) return false; diff --git a/pcbnew/tools/zone_create_helper.cpp b/pcbnew/tools/zone_create_helper.cpp index 49690d1923..814c8bffe1 100644 --- a/pcbnew/tools/zone_create_helper.cpp +++ b/pcbnew/tools/zone_create_helper.cpp @@ -102,9 +102,9 @@ std::unique_ptr ZONE_CREATE_HELPER::createNewZone( bool aKeepout // The new zone is a ZONE_CONTAINER if created in the board editor // and a MODULE_ZONE_CONTAINER if created in the footprint editor - wxASSERT( !m_tool.m_editModules || ( parent->Type() == PCB_MODULE_T ) ); + wxASSERT( !m_tool.m_isFootprintEditor || ( parent->Type() == PCB_MODULE_T ) ); - std::unique_ptr newZone = m_tool.m_editModules ? + std::unique_ptr newZone = m_tool.m_isFootprintEditor ? std::make_unique( parent ) : std::make_unique( parent ); @@ -235,8 +235,8 @@ void ZONE_CREATE_HELPER::commitZone( std::unique_ptr aZone ) if( graphicPolygonsLayers.Contains( m_params.m_layer ) ) { - auto poly = m_tool.m_editModules ? new FP_SHAPE((MODULE *) parent ) - : new PCB_SHAPE(); + auto poly = m_tool.m_isFootprintEditor ? new FP_SHAPE((MODULE *) parent ) + : new PCB_SHAPE(); poly->SetShape ( S_POLYGON ); poly->SetLayer( m_params.m_layer ); poly->SetPolyShape ( *aZone->Outline() ); @@ -249,8 +249,8 @@ void ZONE_CREATE_HELPER::commitZone( std::unique_ptr aZone ) for( auto seg = outline->CIterateSegments( 0 ); seg; seg++ ) { - PCB_SHAPE* new_seg = m_tool.m_editModules ? new FP_SHAPE( (MODULE *) parent ) - : new PCB_SHAPE(); + auto* new_seg = m_tool.m_isFootprintEditor ? new FP_SHAPE((MODULE *) parent ) + : new PCB_SHAPE(); new_seg->SetShape( S_SEGMENT ); new_seg->SetLayer( m_params.m_layer ); new_seg->SetStart( wxPoint( seg.Get().A.x, seg.Get().A.y ) );