From 66a15f6acfde3340b2009090b17237bdf24c066c Mon Sep 17 00:00:00 2001 From: Jeff Young Date: Sat, 16 Dec 2023 16:11:45 +0000 Subject: [PATCH] Re-factor frame pointer out of generator API. --- pcbnew/board.cpp | 1 + pcbnew/generators/pcb_tuning_pattern.cpp | 152 +++++++++++------------ pcbnew/pcb_edit_frame.cpp | 39 ------ pcbnew/pcb_generator.cpp | 16 +-- pcbnew/pcb_generator.h | 17 +-- pcbnew/tools/generator_tool.cpp | 64 +++++++--- 6 files changed, 138 insertions(+), 151 deletions(-) diff --git a/pcbnew/board.cpp b/pcbnew/board.cpp index a84a4d7ce9..0a73f7dc2c 100644 --- a/pcbnew/board.cpp +++ b/pcbnew/board.cpp @@ -57,6 +57,7 @@ #include #include #include +#include #include #include #include diff --git a/pcbnew/generators/pcb_tuning_pattern.cpp b/pcbnew/generators/pcb_tuning_pattern.cpp index 5ab91f04e6..a77abdc1ef 100644 --- a/pcbnew/generators/pcb_tuning_pattern.cpp +++ b/pcbnew/generators/pcb_tuning_pattern.cpp @@ -267,21 +267,16 @@ public: BOARD_CONNECTED_ITEM* aStartItem, LENGTH_TUNING_MODE aMode ); - void EditStart( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, - BOARD_COMMIT* aCommit ) override; + void EditStart( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit ) override; - bool Update( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, - BOARD_COMMIT* aCommit ) override; + bool Update( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit ) override; - void EditPush( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, - BOARD_COMMIT* aCommit, const wxString& aCommitMsg = wxEmptyString, - int aCommitFlags = 0 ) override; + void EditPush( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit, + const wxString& aCommitMsg = wxEmptyString, int aCommitFlags = 0 ) override; - void EditRevert( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, - BOARD_COMMIT* aCommit ) override; + void EditRevert( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit ) override; - void Remove( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, - BOARD_COMMIT* aCommit ) override; + void Remove( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit ) override; bool MakeEditPoints( std::shared_ptr points ) const override; @@ -443,8 +438,8 @@ protected: bool removeToBaseline( PNS::ROUTER* aRouter, int aLayer, SHAPE_LINE_CHAIN& aBaseLine ); - bool resetToBaseline( PNS::ROUTER* aRouter, int aLayer, PCB_BASE_EDIT_FRAME* aFrame, - SHAPE_LINE_CHAIN& aBaseLine, bool aPrimary ); + bool resetToBaseline( GENERATOR_TOOL* aTool, int aLayer, SHAPE_LINE_CHAIN& aBaseLine, + bool aPrimary ); SHAPE_LINE_CHAIN getRectShape() const; @@ -664,8 +659,7 @@ PCB_TUNING_PATTERN* PCB_TUNING_PATTERN::CreateNew( GENERATOR_TOOL* aTool, return pattern; } -void PCB_TUNING_PATTERN::EditStart( GENERATOR_TOOL* aTool, BOARD* aBoard, - PCB_BASE_EDIT_FRAME* aFrame, BOARD_COMMIT* aCommit ) +void PCB_TUNING_PATTERN::EditStart( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit ) { if( aCommit ) { @@ -705,7 +699,7 @@ void PCB_TUNING_PATTERN::EditStart( GENERATOR_TOOL* aTool, BOARD* aBoard, &pnsItem, nullptr, layer, &constraint ) ) { m_settings.SetTargetLength( constraint.m_Value ); - aFrame->GetToolManager()->PostEvent( EVENTS::SelectedItemsModified ); + aTool->GetManager()->PostEvent( EVENTS::SelectedItemsModified ); } } else @@ -719,7 +713,7 @@ void PCB_TUNING_PATTERN::EditStart( GENERATOR_TOOL* aTool, BOARD* aBoard, &pnsItem, &coupledItem, layer, &constraint ) ) { m_settings.SetTargetLength( constraint.m_Value ); - aFrame->GetToolManager()->PostEvent( EVENTS::SelectedItemsModified ); + aTool->GetManager()->PostEvent( EVENTS::SelectedItemsModified ); } } else @@ -728,7 +722,7 @@ void PCB_TUNING_PATTERN::EditStart( GENERATOR_TOOL* aTool, BOARD* aBoard, &pnsItem, &coupledItem, layer, &constraint ) ) { m_settings.m_targetSkew = constraint.m_Value; - aFrame->GetToolManager()->PostEvent( EVENTS::SelectedItemsModified ); + aTool->GetManager()->PostEvent( EVENTS::SelectedItemsModified ); } } } @@ -973,8 +967,7 @@ bool PCB_TUNING_PATTERN::removeToBaseline( PNS::ROUTER* aRouter, int aLayer, } -void PCB_TUNING_PATTERN::Remove( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, - BOARD_COMMIT* aCommit ) +void PCB_TUNING_PATTERN::Remove( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit ) { SetFlags( IN_EDIT ); @@ -982,21 +975,19 @@ void PCB_TUNING_PATTERN::Remove( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_ PNS::ROUTER* router = aTool->Router(); int layer = GetLayer(); - int undoFlags = 0; // Ungroup first so that undo works if( !GetItems().empty() ) { PCB_GENERATOR* group = this; - PICKED_ITEMS_LIST undoList; + PICKED_ITEMS_LIST ungroupList; for( BOARD_ITEM* member : group->GetItems() ) - undoList.PushItem( ITEM_PICKER( nullptr, member, UNDO_REDO::UNGROUP ) ); + ungroupList.PushItem( ITEM_PICKER( nullptr, member, UNDO_REDO::UNGROUP ) ); - group->RemoveAll(); + aCommit->Stage( ungroupList ); - aFrame->SaveCopyInUndoList( undoList, UNDO_REDO::UNGROUP ); - undoFlags |= APPEND_UNDO; + group->GetItems().clear(); } aCommit->Remove( this ); @@ -1034,14 +1025,10 @@ void PCB_TUNING_PATTERN::Remove( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_ } for( BOARD_ITEM* item : routerAddedItems ) - { aCommit->Add( item ); - } - - aCommit->Push( "Remove Tuning Pattern", undoFlags ); - - undoFlags |= APPEND_UNDO; } + + aCommit->Push( "Remove Tuning Pattern" ); } @@ -1119,16 +1106,16 @@ bool PCB_TUNING_PATTERN::recoverBaseline( PNS::ROUTER* aRouter ) } -bool PCB_TUNING_PATTERN::resetToBaseline( PNS::ROUTER* aRouter, int aLayer, - PCB_BASE_EDIT_FRAME* aFrame, SHAPE_LINE_CHAIN& aBaseLine, - bool aPrimary ) +bool PCB_TUNING_PATTERN::resetToBaseline( GENERATOR_TOOL* aTool, int aLayer, + SHAPE_LINE_CHAIN& aBaseLine, bool aPrimary ) { - PNS::NODE* world = aRouter->GetWorld(); - VECTOR2I startSnapPoint, endSnapPoint; + KIGFX::VIEW* view = aTool->GetManager()->GetView(); + PNS::ROUTER* router = aTool->Router(); + PNS::NODE* world = router->GetWorld(); + VECTOR2I startSnapPoint, endSnapPoint; - std::optional pnsLine = getPNSLine( aBaseLine.CPoint( 0 ), - aBaseLine.CPoint( -1 ), aRouter, aLayer, - startSnapPoint, endSnapPoint ); + std::optional pnsLine = getPNSLine( aBaseLine.CPoint( 0 ), aBaseLine.CPoint( -1 ), + router, aLayer, startSnapPoint, endSnapPoint ); if( !pnsLine ) { @@ -1150,10 +1137,13 @@ bool PCB_TUNING_PATTERN::resetToBaseline( PNS::ROUTER* aRouter, int aLayer, straightChain.Simplify(); } - for( PNS::LINKED_ITEM* pnsItem : pnsLine->Links() ) + if( view ) { - if( BOARD_ITEM* item = pnsItem->Parent() ) - aFrame->GetCanvas()->GetView()->Hide( item, true, true ); + for( PNS::LINKED_ITEM* pnsItem : pnsLine->Links() ) + { + if( BOARD_ITEM* item = pnsItem->Parent() ) + view->Hide( item, true, true ); + } } branch->Remove( *pnsLine ); @@ -1194,14 +1184,13 @@ bool PCB_TUNING_PATTERN::resetToBaseline( PNS::ROUTER* aRouter, int aLayer, } } - aRouter->CommitRouting( branch ); + router->CommitRouting( branch ); return true; } -bool PCB_TUNING_PATTERN::Update( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, - BOARD_COMMIT* aCommit ) +bool PCB_TUNING_PATTERN::Update( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit ) { PNS::ROUTER* router = aTool->Router(); PNS_KICAD_IFACE* iface = aTool->GetInterface(); @@ -1220,7 +1209,7 @@ bool PCB_TUNING_PATTERN::Update( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_ } else { - if( resetToBaseline( router, layer, aFrame, *m_baseLine, true ) ) + if( resetToBaseline( aTool, layer, *m_baseLine, true ) ) { m_origin = m_baseLine->CPoint( 0 ); m_end = m_baseLine->CPoint( -1 ); @@ -1233,7 +1222,7 @@ bool PCB_TUNING_PATTERN::Update( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_ if( m_tuningMode == DIFF_PAIR ) { - if( !resetToBaseline( router, layer, aFrame, *m_baseLineCoupled, false ) ) + if( !resetToBaseline( aTool, layer, *m_baseLineCoupled, false ) ) { initBaseLines( router, layer, aBoard ); return false; @@ -1293,20 +1282,27 @@ bool PCB_TUNING_PATTERN::Update( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_ default: statusMessage = _( "unknown" ); break; } - m_tuningInfo.Printf( wxS( "%s (%s)" ), - aFrame->MessageTextFromValue( (double) placer->TuningResult() ), - statusMessage ); + wxString result; + EDA_UNITS userUnits = EDA_UNITS::MILLIMETRES; + + if( aTool->GetManager()->GetSettings() ) + userUnits = static_cast( aTool->GetManager()->GetSettings()->m_System.units ); + + result = EDA_UNIT_UTILS::UI::MessageTextFromValue( pcbIUScale, userUnits, + (double) placer->TuningResult() ); + + m_tuningInfo.Printf( wxS( "%s (%s)" ), result, statusMessage ); return true; } -void PCB_TUNING_PATTERN::EditPush( GENERATOR_TOOL* aTool, BOARD* aBoard, - PCB_BASE_EDIT_FRAME* aFrame, BOARD_COMMIT* aCommit, +void PCB_TUNING_PATTERN::EditPush( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit, const wxString& aCommitMsg, int aCommitFlags ) { ClearFlags( IN_EDIT ); + KIGFX::VIEW* view = aTool->GetManager()->GetView(); PNS::ROUTER* router = aTool->Router(); SHAPE_LINE_CHAIN bounds = getRectShape(); PICKED_ITEMS_LIST groupUndoList; @@ -1331,7 +1327,9 @@ void PCB_TUNING_PATTERN::EditPush( GENERATOR_TOOL* aTool, BOARD* aBoard, for( BOARD_ITEM* item : routerRemovedItems ) { - aFrame->GetCanvas()->GetView()->Hide( item, false ); + if( view ) + view->Hide( item, false ); + aCommit->Remove( item ); } @@ -1350,26 +1348,26 @@ void PCB_TUNING_PATTERN::EditPush( GENERATOR_TOOL* aTool, BOARD* aBoard, aCommit->Stage( groupUndoList ); aCommit->Add( item ); } - - if( aCommitMsg.IsEmpty() ) - aCommit->Push( _( "Edit Tuning Pattern" ), aCommitFlags ); - else - aCommit->Push( aCommitMsg, aCommitFlags ); - - aCommitFlags |= APPEND_UNDO; } + + if( aCommitMsg.IsEmpty() ) + aCommit->Push( _( "Edit Tuning Pattern" ), aCommitFlags ); + else + aCommit->Push( aCommitMsg, aCommitFlags ); } -void PCB_TUNING_PATTERN::EditRevert( GENERATOR_TOOL* aTool, BOARD* aBoard, - PCB_BASE_EDIT_FRAME* aFrame, BOARD_COMMIT* aCommit ) +void PCB_TUNING_PATTERN::EditRevert( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit ) { ClearFlags( IN_EDIT ); - for( const GENERATOR_PNS_CHANGES& pnsCommit : aTool->GetRouterChanges() ) + if( KIGFX::VIEW* view = aTool->GetManager()->GetView() ) { - for( BOARD_ITEM* item : pnsCommit.removedItems ) - aFrame->GetCanvas()->GetView()->Hide( item, false ); + for( const GENERATOR_PNS_CHANGES& pnsCommit : aTool->GetRouterChanges() ) + { + for( BOARD_ITEM* item : pnsCommit.removedItems ) + view->Hide( item, false ); + } } aTool->Router()->StopRouting(); @@ -1802,9 +1800,9 @@ void PCB_TUNING_PATTERN::ShowPropertiesDialog( PCB_BASE_EDIT_FRAME* aEditFrame ) m_settings = settings; GENERATOR_TOOL* generatorTool = aEditFrame->GetToolManager()->GetTool(); - EditStart( generatorTool, GetBoard(), aEditFrame, &commit ); - Update( generatorTool, GetBoard(), aEditFrame, &commit ); - EditPush( generatorTool, GetBoard(), aEditFrame, &commit ); + EditStart( generatorTool, GetBoard(), &commit ); + Update( generatorTool, GetBoard(), &commit ); + EditPush( generatorTool, GetBoard(), &commit ); } } @@ -2059,8 +2057,8 @@ int DRAWING_TOOL::PlaceTuningPattern( const TOOL_EVENT& aEvent ) if( dummyPattern ) { - dummyPattern->EditStart( generatorTool, m_board, m_frame, nullptr ); - dummyPattern->Update( generatorTool, m_board, m_frame, nullptr ); + dummyPattern->EditStart( generatorTool, m_board, nullptr ); + dummyPattern->Update( generatorTool, m_board, nullptr ); m_preview.FreeItems(); @@ -2083,8 +2081,8 @@ int DRAWING_TOOL::PlaceTuningPattern( const TOOL_EVENT& aEvent ) { if( m_tuningPattern && m_tuningPattern->GetPosition() != m_tuningPattern->GetEnd() ) { - m_tuningPattern->EditStart( generatorTool, m_board, m_frame, nullptr ); - m_tuningPattern->Update( generatorTool, m_board, m_frame, nullptr ); + m_tuningPattern->EditStart( generatorTool, m_board, nullptr ); + m_tuningPattern->Update( generatorTool, m_board, nullptr ); m_preview.FreeItems(); @@ -2111,7 +2109,7 @@ int DRAWING_TOOL::PlaceTuningPattern( const TOOL_EVENT& aEvent ) if( m_tuningPattern ) { // First click already made; clean up tuning pattern preview - m_tuningPattern->EditRevert( generatorTool, m_board, m_frame, nullptr ); + m_tuningPattern->EditRevert( generatorTool, m_board, nullptr ); delete m_tuningPattern; m_tuningPattern = nullptr; @@ -2185,9 +2183,9 @@ int DRAWING_TOOL::PlaceTuningPattern( const TOOL_EVENT& aEvent ) // Second click; we're done BOARD_COMMIT commit( m_frame ); - m_tuningPattern->EditStart( generatorTool, m_board, m_frame, &commit ); - m_tuningPattern->Update( generatorTool, m_board, m_frame, &commit ); - m_tuningPattern->EditPush( generatorTool, m_board, m_frame, &commit, _( "Tune" ) ); + m_tuningPattern->EditStart( generatorTool, m_board, &commit ); + m_tuningPattern->Update( generatorTool, m_board, &commit ); + m_tuningPattern->EditPush( generatorTool, m_board, &commit, _( "Tune" ) ); for( BOARD_ITEM* item : m_tuningPattern->GetItems() ) item->SetSelected(); diff --git a/pcbnew/pcb_edit_frame.cpp b/pcbnew/pcb_edit_frame.cpp index 55d8264463..c9bfab67cb 100644 --- a/pcbnew/pcb_edit_frame.cpp +++ b/pcbnew/pcb_edit_frame.cpp @@ -488,45 +488,6 @@ PCB_EDIT_FRAME::PCB_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) : this ); Bind( EDA_EVT_CLOSE_NET_INSPECTOR_DIALOG, &PCB_EDIT_FRAME::onCloseNetInspectorDialog, this ); Bind( EDA_EVT_UNITS_CHANGED, &PCB_EDIT_FRAME::onUnitsChanged, this ); - - PROPERTY_MANAGER::Instance().RegisterListener( TYPE_HASH( BOARD_ITEM ), - [&]( INSPECTABLE* aItem, PROPERTY_BASE* aProperty, COMMIT* aCommit ) - { - // Special case: propagate lock from generated items to parent generator - - BOARD_ITEM* item = dynamic_cast( aItem ); - - if( item && aProperty->Name() == _HKI( "Locked" ) ) - { - if( PCB_GENERATOR* generator = dynamic_cast( item->GetParentGroup() ) ) - { - if( aCommit->GetStatus( generator ) != CHT_MODIFY ) - aCommit->Modify( generator ); - - // Must set generator to unlocked first or item->IsLocked() will just - // return the parent's locked state. - generator->SetLocked( false ); - generator->SetLocked( item->IsLocked() ); - } - } - } ); - - PROPERTY_MANAGER::Instance().RegisterListener( TYPE_HASH( PCB_GENERATOR ), - [&]( INSPECTABLE* aItem, PROPERTY_BASE* aProperty, COMMIT* aCommit ) - { - // Special case: regenerator generators when their properties change - - if( PCB_GENERATOR* generator = dynamic_cast( aItem ) ) - { - BOARD_COMMIT* commit = static_cast( aCommit ); - GENERATOR_TOOL* generatorTool = GetToolManager()->GetTool(); - - generator->EditStart( generatorTool, GetBoard(), this, commit ); - generator->Update( generatorTool, GetBoard(), this, commit ); - generator->EditPush( generatorTool, GetBoard(), this, commit ); - } - } ); - m_acceptedExts.emplace( KiCadPcbFileExtension, &PCB_ACTIONS::ddAppendBoard ); m_acceptedExts.emplace( LegacyPcbFileExtension, &PCB_ACTIONS::ddAppendBoard ); DragAcceptFiles( true ); diff --git a/pcbnew/pcb_generator.cpp b/pcbnew/pcb_generator.cpp index ddfc9b4865..3a8c2563ce 100644 --- a/pcbnew/pcb_generator.cpp +++ b/pcbnew/pcb_generator.cpp @@ -36,36 +36,32 @@ PCB_GENERATOR::~PCB_GENERATOR() } -void PCB_GENERATOR::EditStart( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, - BOARD_COMMIT* aCommit ) +void PCB_GENERATOR::EditStart( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit ) { aCommit->Modify( this ); } -void PCB_GENERATOR::EditPush( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, - BOARD_COMMIT* aCommit, const wxString& aCommitMsg, int aCommitFlags ) +void PCB_GENERATOR::EditPush( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit, + const wxString& aCommitMsg, int aCommitFlags ) { aCommit->Push( aCommitMsg, aCommitFlags ); } -void PCB_GENERATOR::EditRevert( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, - BOARD_COMMIT* aCommit ) +void PCB_GENERATOR::EditRevert( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit ) { aCommit->Revert(); } -void PCB_GENERATOR::Remove( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, - BOARD_COMMIT* aCommit ) +void PCB_GENERATOR::Remove( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit ) { aCommit->Remove( this ); } -bool PCB_GENERATOR::Update( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, - BOARD_COMMIT* aCommit ) +bool PCB_GENERATOR::Update( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit ) { return true; } diff --git a/pcbnew/pcb_generator.h b/pcbnew/pcb_generator.h index 2409723568..553e8bc227 100644 --- a/pcbnew/pcb_generator.h +++ b/pcbnew/pcb_generator.h @@ -47,21 +47,16 @@ public: virtual ~PCB_GENERATOR(); - virtual void EditStart( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, - BOARD_COMMIT* aCommit ); + virtual void EditStart( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit ); - virtual void EditPush( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, - BOARD_COMMIT* aCommit, const wxString& aCommitMsg = wxEmptyString, - int aCommitFlags = 0 ); + virtual void EditPush( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit, + const wxString& aCommitMsg = wxEmptyString, int aCommitFlags = 0 ); - virtual void EditRevert( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, - BOARD_COMMIT* aCommit ); + virtual void EditRevert( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit ); - virtual void Remove( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, - BOARD_COMMIT* aCommit ); + virtual void Remove( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit ); - virtual bool Update( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, - BOARD_COMMIT* aCommit ); + virtual bool Update( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit ); #define STATUS_ITEMS_ONLY true diff --git a/pcbnew/tools/generator_tool.cpp b/pcbnew/tools/generator_tool.cpp index 8dd09c3d27..1d2e0efd23 100644 --- a/pcbnew/tools/generator_tool.cpp +++ b/pcbnew/tools/generator_tool.cpp @@ -37,6 +37,42 @@ GENERATOR_TOOL::GENERATOR_TOOL() : GENERATOR_TOOL_PNS_PROXY( "pcbnew.Generators" ), m_mgrDialog( nullptr ) { + PROPERTY_MANAGER::Instance().RegisterListener( TYPE_HASH( BOARD_ITEM ), + [&]( INSPECTABLE* aItem, PROPERTY_BASE* aProperty, COMMIT* aCommit ) + { + // Special case: propagate lock from generated items to parent generator + + BOARD_ITEM* item = dynamic_cast( aItem ); + + if( item && aProperty->Name() == _HKI( "Locked" ) ) + { + if( PCB_GENERATOR* generator = dynamic_cast( item->GetParentGroup() ) ) + { + if( aCommit->GetStatus( generator ) != CHT_MODIFY ) + aCommit->Modify( generator ); + + // Must set generator to unlocked first or item->IsLocked() will just + // return the parent's locked state. + generator->SetLocked( false ); + generator->SetLocked( item->IsLocked() ); + } + } + } ); + + PROPERTY_MANAGER::Instance().RegisterListener( TYPE_HASH( PCB_GENERATOR ), + [&]( INSPECTABLE* aItem, PROPERTY_BASE* aProperty, COMMIT* aCommit ) + { + // Special case: regenerator generators when their properties change + + if( PCB_GENERATOR* generator = dynamic_cast( aItem ) ) + { + BOARD_COMMIT* commit = static_cast( aCommit ); + + generator->EditStart( this, board(), commit ); + generator->Update( this, board(), commit ); + generator->EditPush( this, board(), commit ); + } + } ); } @@ -143,9 +179,9 @@ int GENERATOR_TOOL::RegenerateAllOfType( const TOOL_EVENT& aEvent ) if( commitMsg.IsEmpty() ) commitMsg.Printf( _( "Update %s" ), generator->GetPluralName() ); - generator->EditStart( this, board(), frame(), &commit ); - generator->Update( this, board(), frame(), &commit ); - generator->EditPush( this, board(), frame(), &commit, commitMsg, commitFlags ); + generator->EditStart( this, board(), &commit ); + generator->Update( this, board(), &commit ); + generator->EditPush( this, board(), &commit, commitMsg, commitFlags ); commitFlags |= APPEND_UNDO; } @@ -194,9 +230,9 @@ int GENERATOR_TOOL::RegenerateSelected( const TOOL_EVENT& aEvent ) for( PCB_GENERATOR* gen : generators ) { - gen->EditStart( this, board(), frame(), &commit ); - gen->Update( this, board(), frame(), &commit ); - gen->EditPush( this, board(), frame(), &commit, _( "Regenerate Selected" ), commitFlags ); + gen->EditStart( this, board(), &commit ); + gen->Update( this, board(), &commit ); + gen->EditPush( this, board(), &commit, _( "Regenerate Selected" ), commitFlags ); commitFlags |= APPEND_UNDO; } @@ -213,9 +249,9 @@ int GENERATOR_TOOL::RegenerateItem( const TOOL_EVENT& aEvent ) PCB_GENERATOR* gen = aEvent.Parameter(); - gen->EditStart( this, board(), frame(), &commit ); - gen->Update( this, board(), frame(), &commit ); - gen->EditPush( this, board(), frame(), &commit, _( "Regenerate Item" ), commitFlags ); + gen->EditStart( this, board(), &commit ); + gen->Update( this, board(), &commit ); + gen->EditPush( this, board(), &commit, _( "Regenerate Item" ), commitFlags ); frame()->RefreshCanvas(); return 0; @@ -232,27 +268,27 @@ int GENERATOR_TOOL::GenEditAction( const TOOL_EVENT& aEvent ) if( aEvent.IsAction( &PCB_ACTIONS::genStartEdit ) ) { - gen->EditStart( this, board(), frame(), commit ); + gen->EditStart( this, board(), commit ); } else if( aEvent.IsAction( &PCB_ACTIONS::genUpdateEdit ) ) { - gen->Update( this, board(), frame(), commit ); + gen->Update( this, board(), commit ); } else if( aEvent.IsAction( &PCB_ACTIONS::genPushEdit ) ) { - gen->EditPush( this, board(), frame(), commit, wxEmptyString ); + gen->EditPush( this, board(), commit, wxEmptyString ); wxASSERT( commit->Empty() ); } else if( aEvent.IsAction( &PCB_ACTIONS::genRevertEdit ) ) { - gen->EditRevert( this, board(), frame(), commit ); + gen->EditRevert( this, board(), commit ); wxASSERT( commit->Empty() ); } else if( aEvent.IsAction( &PCB_ACTIONS::genRemove ) ) { - gen->Remove( this, board(), frame(), commit ); + gen->Remove( this, board(), commit ); } return 0;