Re-factor frame pointer out of generator API.

This commit is contained in:
Jeff Young 2023-12-16 16:11:45 +00:00
parent ea3c87f243
commit 66a15f6acf
6 changed files with 138 additions and 151 deletions

View File

@ -57,6 +57,7 @@
#include <project/project_local_settings.h> #include <project/project_local_settings.h>
#include <ratsnest/ratsnest_data.h> #include <ratsnest/ratsnest_data.h>
#include <reporter.h> #include <reporter.h>
#include <tool/tool_manager.h>
#include <tool/selection_conditions.h> #include <tool/selection_conditions.h>
#include <string_utils.h> #include <string_utils.h>
#include <core/thread_pool.h> #include <core/thread_pool.h>

View File

@ -267,21 +267,16 @@ public:
BOARD_CONNECTED_ITEM* aStartItem, BOARD_CONNECTED_ITEM* aStartItem,
LENGTH_TUNING_MODE aMode ); LENGTH_TUNING_MODE aMode );
void EditStart( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, void EditStart( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit ) override;
BOARD_COMMIT* aCommit ) override;
bool Update( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, bool Update( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit ) override;
BOARD_COMMIT* aCommit ) override;
void EditPush( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, void EditPush( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit,
BOARD_COMMIT* aCommit, const wxString& aCommitMsg = wxEmptyString, const wxString& aCommitMsg = wxEmptyString, int aCommitFlags = 0 ) override;
int aCommitFlags = 0 ) override;
void EditRevert( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, void EditRevert( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit ) override;
BOARD_COMMIT* aCommit ) override;
void Remove( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, void Remove( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit ) override;
BOARD_COMMIT* aCommit ) override;
bool MakeEditPoints( std::shared_ptr<EDIT_POINTS> points ) const override; bool MakeEditPoints( std::shared_ptr<EDIT_POINTS> points ) const override;
@ -443,8 +438,8 @@ protected:
bool removeToBaseline( PNS::ROUTER* aRouter, int aLayer, SHAPE_LINE_CHAIN& aBaseLine ); bool removeToBaseline( PNS::ROUTER* aRouter, int aLayer, SHAPE_LINE_CHAIN& aBaseLine );
bool resetToBaseline( PNS::ROUTER* aRouter, int aLayer, PCB_BASE_EDIT_FRAME* aFrame, bool resetToBaseline( GENERATOR_TOOL* aTool, int aLayer, SHAPE_LINE_CHAIN& aBaseLine,
SHAPE_LINE_CHAIN& aBaseLine, bool aPrimary ); bool aPrimary );
SHAPE_LINE_CHAIN getRectShape() const; SHAPE_LINE_CHAIN getRectShape() const;
@ -664,8 +659,7 @@ PCB_TUNING_PATTERN* PCB_TUNING_PATTERN::CreateNew( GENERATOR_TOOL* aTool,
return pattern; return pattern;
} }
void PCB_TUNING_PATTERN::EditStart( GENERATOR_TOOL* aTool, BOARD* aBoard, void PCB_TUNING_PATTERN::EditStart( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit )
PCB_BASE_EDIT_FRAME* aFrame, BOARD_COMMIT* aCommit )
{ {
if( aCommit ) if( aCommit )
{ {
@ -705,7 +699,7 @@ void PCB_TUNING_PATTERN::EditStart( GENERATOR_TOOL* aTool, BOARD* aBoard,
&pnsItem, nullptr, layer, &constraint ) ) &pnsItem, nullptr, layer, &constraint ) )
{ {
m_settings.SetTargetLength( constraint.m_Value ); m_settings.SetTargetLength( constraint.m_Value );
aFrame->GetToolManager()->PostEvent( EVENTS::SelectedItemsModified ); aTool->GetManager()->PostEvent( EVENTS::SelectedItemsModified );
} }
} }
else else
@ -719,7 +713,7 @@ void PCB_TUNING_PATTERN::EditStart( GENERATOR_TOOL* aTool, BOARD* aBoard,
&pnsItem, &coupledItem, layer, &constraint ) ) &pnsItem, &coupledItem, layer, &constraint ) )
{ {
m_settings.SetTargetLength( constraint.m_Value ); m_settings.SetTargetLength( constraint.m_Value );
aFrame->GetToolManager()->PostEvent( EVENTS::SelectedItemsModified ); aTool->GetManager()->PostEvent( EVENTS::SelectedItemsModified );
} }
} }
else else
@ -728,7 +722,7 @@ void PCB_TUNING_PATTERN::EditStart( GENERATOR_TOOL* aTool, BOARD* aBoard,
&pnsItem, &coupledItem, layer, &constraint ) ) &pnsItem, &coupledItem, layer, &constraint ) )
{ {
m_settings.m_targetSkew = constraint.m_Value; 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, void PCB_TUNING_PATTERN::Remove( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit )
BOARD_COMMIT* aCommit )
{ {
SetFlags( IN_EDIT ); SetFlags( IN_EDIT );
@ -982,21 +975,19 @@ void PCB_TUNING_PATTERN::Remove( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_
PNS::ROUTER* router = aTool->Router(); PNS::ROUTER* router = aTool->Router();
int layer = GetLayer(); int layer = GetLayer();
int undoFlags = 0;
// Ungroup first so that undo works // Ungroup first so that undo works
if( !GetItems().empty() ) if( !GetItems().empty() )
{ {
PCB_GENERATOR* group = this; PCB_GENERATOR* group = this;
PICKED_ITEMS_LIST undoList; PICKED_ITEMS_LIST ungroupList;
for( BOARD_ITEM* member : group->GetItems() ) 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 ); group->GetItems().clear();
undoFlags |= APPEND_UNDO;
} }
aCommit->Remove( this ); aCommit->Remove( this );
@ -1034,14 +1025,10 @@ void PCB_TUNING_PATTERN::Remove( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_
} }
for( BOARD_ITEM* item : routerAddedItems ) for( BOARD_ITEM* item : routerAddedItems )
{
aCommit->Add( item ); 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, bool PCB_TUNING_PATTERN::resetToBaseline( GENERATOR_TOOL* aTool, int aLayer,
PCB_BASE_EDIT_FRAME* aFrame, SHAPE_LINE_CHAIN& aBaseLine, SHAPE_LINE_CHAIN& aBaseLine, bool aPrimary )
bool aPrimary )
{ {
PNS::NODE* world = aRouter->GetWorld(); KIGFX::VIEW* view = aTool->GetManager()->GetView();
VECTOR2I startSnapPoint, endSnapPoint; PNS::ROUTER* router = aTool->Router();
PNS::NODE* world = router->GetWorld();
VECTOR2I startSnapPoint, endSnapPoint;
std::optional<PNS::LINE> pnsLine = getPNSLine( aBaseLine.CPoint( 0 ), std::optional<PNS::LINE> pnsLine = getPNSLine( aBaseLine.CPoint( 0 ), aBaseLine.CPoint( -1 ),
aBaseLine.CPoint( -1 ), aRouter, aLayer, router, aLayer, startSnapPoint, endSnapPoint );
startSnapPoint, endSnapPoint );
if( !pnsLine ) if( !pnsLine )
{ {
@ -1150,10 +1137,13 @@ bool PCB_TUNING_PATTERN::resetToBaseline( PNS::ROUTER* aRouter, int aLayer,
straightChain.Simplify(); straightChain.Simplify();
} }
for( PNS::LINKED_ITEM* pnsItem : pnsLine->Links() ) if( view )
{ {
if( BOARD_ITEM* item = pnsItem->Parent() ) for( PNS::LINKED_ITEM* pnsItem : pnsLine->Links() )
aFrame->GetCanvas()->GetView()->Hide( item, true, true ); {
if( BOARD_ITEM* item = pnsItem->Parent() )
view->Hide( item, true, true );
}
} }
branch->Remove( *pnsLine ); 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; return true;
} }
bool PCB_TUNING_PATTERN::Update( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, bool PCB_TUNING_PATTERN::Update( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit )
BOARD_COMMIT* aCommit )
{ {
PNS::ROUTER* router = aTool->Router(); PNS::ROUTER* router = aTool->Router();
PNS_KICAD_IFACE* iface = aTool->GetInterface(); PNS_KICAD_IFACE* iface = aTool->GetInterface();
@ -1220,7 +1209,7 @@ bool PCB_TUNING_PATTERN::Update( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_
} }
else else
{ {
if( resetToBaseline( router, layer, aFrame, *m_baseLine, true ) ) if( resetToBaseline( aTool, layer, *m_baseLine, true ) )
{ {
m_origin = m_baseLine->CPoint( 0 ); m_origin = m_baseLine->CPoint( 0 );
m_end = m_baseLine->CPoint( -1 ); 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( m_tuningMode == DIFF_PAIR )
{ {
if( !resetToBaseline( router, layer, aFrame, *m_baseLineCoupled, false ) ) if( !resetToBaseline( aTool, layer, *m_baseLineCoupled, false ) )
{ {
initBaseLines( router, layer, aBoard ); initBaseLines( router, layer, aBoard );
return false; return false;
@ -1293,20 +1282,27 @@ bool PCB_TUNING_PATTERN::Update( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_
default: statusMessage = _( "unknown" ); break; default: statusMessage = _( "unknown" ); break;
} }
m_tuningInfo.Printf( wxS( "%s (%s)" ), wxString result;
aFrame->MessageTextFromValue( (double) placer->TuningResult() ), EDA_UNITS userUnits = EDA_UNITS::MILLIMETRES;
statusMessage );
if( aTool->GetManager()->GetSettings() )
userUnits = static_cast<EDA_UNITS>( 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; return true;
} }
void PCB_TUNING_PATTERN::EditPush( GENERATOR_TOOL* aTool, BOARD* aBoard, void PCB_TUNING_PATTERN::EditPush( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit,
PCB_BASE_EDIT_FRAME* aFrame, BOARD_COMMIT* aCommit,
const wxString& aCommitMsg, int aCommitFlags ) const wxString& aCommitMsg, int aCommitFlags )
{ {
ClearFlags( IN_EDIT ); ClearFlags( IN_EDIT );
KIGFX::VIEW* view = aTool->GetManager()->GetView();
PNS::ROUTER* router = aTool->Router(); PNS::ROUTER* router = aTool->Router();
SHAPE_LINE_CHAIN bounds = getRectShape(); SHAPE_LINE_CHAIN bounds = getRectShape();
PICKED_ITEMS_LIST groupUndoList; PICKED_ITEMS_LIST groupUndoList;
@ -1331,7 +1327,9 @@ void PCB_TUNING_PATTERN::EditPush( GENERATOR_TOOL* aTool, BOARD* aBoard,
for( BOARD_ITEM* item : routerRemovedItems ) for( BOARD_ITEM* item : routerRemovedItems )
{ {
aFrame->GetCanvas()->GetView()->Hide( item, false ); if( view )
view->Hide( item, false );
aCommit->Remove( item ); aCommit->Remove( item );
} }
@ -1350,26 +1348,26 @@ void PCB_TUNING_PATTERN::EditPush( GENERATOR_TOOL* aTool, BOARD* aBoard,
aCommit->Stage( groupUndoList ); aCommit->Stage( groupUndoList );
aCommit->Add( item ); 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, void PCB_TUNING_PATTERN::EditRevert( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit )
PCB_BASE_EDIT_FRAME* aFrame, BOARD_COMMIT* aCommit )
{ {
ClearFlags( IN_EDIT ); ClearFlags( IN_EDIT );
for( const GENERATOR_PNS_CHANGES& pnsCommit : aTool->GetRouterChanges() ) if( KIGFX::VIEW* view = aTool->GetManager()->GetView() )
{ {
for( BOARD_ITEM* item : pnsCommit.removedItems ) for( const GENERATOR_PNS_CHANGES& pnsCommit : aTool->GetRouterChanges() )
aFrame->GetCanvas()->GetView()->Hide( item, false ); {
for( BOARD_ITEM* item : pnsCommit.removedItems )
view->Hide( item, false );
}
} }
aTool->Router()->StopRouting(); aTool->Router()->StopRouting();
@ -1802,9 +1800,9 @@ void PCB_TUNING_PATTERN::ShowPropertiesDialog( PCB_BASE_EDIT_FRAME* aEditFrame )
m_settings = settings; m_settings = settings;
GENERATOR_TOOL* generatorTool = aEditFrame->GetToolManager()->GetTool<GENERATOR_TOOL>(); GENERATOR_TOOL* generatorTool = aEditFrame->GetToolManager()->GetTool<GENERATOR_TOOL>();
EditStart( generatorTool, GetBoard(), aEditFrame, &commit ); EditStart( generatorTool, GetBoard(), &commit );
Update( generatorTool, GetBoard(), aEditFrame, &commit ); Update( generatorTool, GetBoard(), &commit );
EditPush( generatorTool, GetBoard(), aEditFrame, &commit ); EditPush( generatorTool, GetBoard(), &commit );
} }
} }
@ -2059,8 +2057,8 @@ int DRAWING_TOOL::PlaceTuningPattern( const TOOL_EVENT& aEvent )
if( dummyPattern ) if( dummyPattern )
{ {
dummyPattern->EditStart( generatorTool, m_board, m_frame, nullptr ); dummyPattern->EditStart( generatorTool, m_board, nullptr );
dummyPattern->Update( generatorTool, m_board, m_frame, nullptr ); dummyPattern->Update( generatorTool, m_board, nullptr );
m_preview.FreeItems(); m_preview.FreeItems();
@ -2083,8 +2081,8 @@ int DRAWING_TOOL::PlaceTuningPattern( const TOOL_EVENT& aEvent )
{ {
if( m_tuningPattern && m_tuningPattern->GetPosition() != m_tuningPattern->GetEnd() ) if( m_tuningPattern && m_tuningPattern->GetPosition() != m_tuningPattern->GetEnd() )
{ {
m_tuningPattern->EditStart( generatorTool, m_board, m_frame, nullptr ); m_tuningPattern->EditStart( generatorTool, m_board, nullptr );
m_tuningPattern->Update( generatorTool, m_board, m_frame, nullptr ); m_tuningPattern->Update( generatorTool, m_board, nullptr );
m_preview.FreeItems(); m_preview.FreeItems();
@ -2111,7 +2109,7 @@ int DRAWING_TOOL::PlaceTuningPattern( const TOOL_EVENT& aEvent )
if( m_tuningPattern ) if( m_tuningPattern )
{ {
// First click already made; clean up tuning pattern preview // 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; delete m_tuningPattern;
m_tuningPattern = nullptr; m_tuningPattern = nullptr;
@ -2185,9 +2183,9 @@ int DRAWING_TOOL::PlaceTuningPattern( const TOOL_EVENT& aEvent )
// Second click; we're done // Second click; we're done
BOARD_COMMIT commit( m_frame ); BOARD_COMMIT commit( m_frame );
m_tuningPattern->EditStart( generatorTool, m_board, m_frame, &commit ); m_tuningPattern->EditStart( generatorTool, m_board, &commit );
m_tuningPattern->Update( generatorTool, m_board, m_frame, &commit ); m_tuningPattern->Update( generatorTool, m_board, &commit );
m_tuningPattern->EditPush( generatorTool, m_board, m_frame, &commit, _( "Tune" ) ); m_tuningPattern->EditPush( generatorTool, m_board, &commit, _( "Tune" ) );
for( BOARD_ITEM* item : m_tuningPattern->GetItems() ) for( BOARD_ITEM* item : m_tuningPattern->GetItems() )
item->SetSelected(); item->SetSelected();

View File

@ -488,45 +488,6 @@ PCB_EDIT_FRAME::PCB_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
this ); this );
Bind( EDA_EVT_CLOSE_NET_INSPECTOR_DIALOG, &PCB_EDIT_FRAME::onCloseNetInspectorDialog, this ); Bind( EDA_EVT_CLOSE_NET_INSPECTOR_DIALOG, &PCB_EDIT_FRAME::onCloseNetInspectorDialog, this );
Bind( EDA_EVT_UNITS_CHANGED, &PCB_EDIT_FRAME::onUnitsChanged, 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<BOARD_ITEM*>( aItem );
if( item && aProperty->Name() == _HKI( "Locked" ) )
{
if( PCB_GENERATOR* generator = dynamic_cast<PCB_GENERATOR*>( 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<PCB_GENERATOR*>( aItem ) )
{
BOARD_COMMIT* commit = static_cast<BOARD_COMMIT*>( aCommit );
GENERATOR_TOOL* generatorTool = GetToolManager()->GetTool<GENERATOR_TOOL>();
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( KiCadPcbFileExtension, &PCB_ACTIONS::ddAppendBoard );
m_acceptedExts.emplace( LegacyPcbFileExtension, &PCB_ACTIONS::ddAppendBoard ); m_acceptedExts.emplace( LegacyPcbFileExtension, &PCB_ACTIONS::ddAppendBoard );
DragAcceptFiles( true ); DragAcceptFiles( true );

View File

@ -36,36 +36,32 @@ PCB_GENERATOR::~PCB_GENERATOR()
} }
void PCB_GENERATOR::EditStart( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, void PCB_GENERATOR::EditStart( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit )
BOARD_COMMIT* aCommit )
{ {
aCommit->Modify( this ); aCommit->Modify( this );
} }
void PCB_GENERATOR::EditPush( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, void PCB_GENERATOR::EditPush( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit,
BOARD_COMMIT* aCommit, const wxString& aCommitMsg, int aCommitFlags ) const wxString& aCommitMsg, int aCommitFlags )
{ {
aCommit->Push( aCommitMsg, aCommitFlags ); aCommit->Push( aCommitMsg, aCommitFlags );
} }
void PCB_GENERATOR::EditRevert( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, void PCB_GENERATOR::EditRevert( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit )
BOARD_COMMIT* aCommit )
{ {
aCommit->Revert(); aCommit->Revert();
} }
void PCB_GENERATOR::Remove( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, void PCB_GENERATOR::Remove( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit )
BOARD_COMMIT* aCommit )
{ {
aCommit->Remove( this ); aCommit->Remove( this );
} }
bool PCB_GENERATOR::Update( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, bool PCB_GENERATOR::Update( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit )
BOARD_COMMIT* aCommit )
{ {
return true; return true;
} }

View File

@ -47,21 +47,16 @@ public:
virtual ~PCB_GENERATOR(); virtual ~PCB_GENERATOR();
virtual void EditStart( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, virtual void EditStart( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit );
BOARD_COMMIT* aCommit );
virtual void EditPush( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, virtual void EditPush( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit,
BOARD_COMMIT* aCommit, const wxString& aCommitMsg = wxEmptyString, const wxString& aCommitMsg = wxEmptyString, int aCommitFlags = 0 );
int aCommitFlags = 0 );
virtual void EditRevert( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, virtual void EditRevert( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit );
BOARD_COMMIT* aCommit );
virtual void Remove( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, virtual void Remove( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit );
BOARD_COMMIT* aCommit );
virtual bool Update( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, virtual bool Update( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit );
BOARD_COMMIT* aCommit );
#define STATUS_ITEMS_ONLY true #define STATUS_ITEMS_ONLY true

View File

@ -37,6 +37,42 @@ GENERATOR_TOOL::GENERATOR_TOOL() :
GENERATOR_TOOL_PNS_PROXY( "pcbnew.Generators" ), GENERATOR_TOOL_PNS_PROXY( "pcbnew.Generators" ),
m_mgrDialog( nullptr ) 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<BOARD_ITEM*>( aItem );
if( item && aProperty->Name() == _HKI( "Locked" ) )
{
if( PCB_GENERATOR* generator = dynamic_cast<PCB_GENERATOR*>( 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<PCB_GENERATOR*>( aItem ) )
{
BOARD_COMMIT* commit = static_cast<BOARD_COMMIT*>( 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() ) if( commitMsg.IsEmpty() )
commitMsg.Printf( _( "Update %s" ), generator->GetPluralName() ); commitMsg.Printf( _( "Update %s" ), generator->GetPluralName() );
generator->EditStart( this, board(), frame(), &commit ); generator->EditStart( this, board(), &commit );
generator->Update( this, board(), frame(), &commit ); generator->Update( this, board(), &commit );
generator->EditPush( this, board(), frame(), &commit, commitMsg, commitFlags ); generator->EditPush( this, board(), &commit, commitMsg, commitFlags );
commitFlags |= APPEND_UNDO; commitFlags |= APPEND_UNDO;
} }
@ -194,9 +230,9 @@ int GENERATOR_TOOL::RegenerateSelected( const TOOL_EVENT& aEvent )
for( PCB_GENERATOR* gen : generators ) for( PCB_GENERATOR* gen : generators )
{ {
gen->EditStart( this, board(), frame(), &commit ); gen->EditStart( this, board(), &commit );
gen->Update( this, board(), frame(), &commit ); gen->Update( this, board(), &commit );
gen->EditPush( this, board(), frame(), &commit, _( "Regenerate Selected" ), commitFlags ); gen->EditPush( this, board(), &commit, _( "Regenerate Selected" ), commitFlags );
commitFlags |= APPEND_UNDO; commitFlags |= APPEND_UNDO;
} }
@ -213,9 +249,9 @@ int GENERATOR_TOOL::RegenerateItem( const TOOL_EVENT& aEvent )
PCB_GENERATOR* gen = aEvent.Parameter<PCB_GENERATOR*>(); PCB_GENERATOR* gen = aEvent.Parameter<PCB_GENERATOR*>();
gen->EditStart( this, board(), frame(), &commit ); gen->EditStart( this, board(), &commit );
gen->Update( this, board(), frame(), &commit ); gen->Update( this, board(), &commit );
gen->EditPush( this, board(), frame(), &commit, _( "Regenerate Item" ), commitFlags ); gen->EditPush( this, board(), &commit, _( "Regenerate Item" ), commitFlags );
frame()->RefreshCanvas(); frame()->RefreshCanvas();
return 0; return 0;
@ -232,27 +268,27 @@ int GENERATOR_TOOL::GenEditAction( const TOOL_EVENT& aEvent )
if( aEvent.IsAction( &PCB_ACTIONS::genStartEdit ) ) if( aEvent.IsAction( &PCB_ACTIONS::genStartEdit ) )
{ {
gen->EditStart( this, board(), frame(), commit ); gen->EditStart( this, board(), commit );
} }
else if( aEvent.IsAction( &PCB_ACTIONS::genUpdateEdit ) ) 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 ) ) else if( aEvent.IsAction( &PCB_ACTIONS::genPushEdit ) )
{ {
gen->EditPush( this, board(), frame(), commit, wxEmptyString ); gen->EditPush( this, board(), commit, wxEmptyString );
wxASSERT( commit->Empty() ); wxASSERT( commit->Empty() );
} }
else if( aEvent.IsAction( &PCB_ACTIONS::genRevertEdit ) ) else if( aEvent.IsAction( &PCB_ACTIONS::genRevertEdit ) )
{ {
gen->EditRevert( this, board(), frame(), commit ); gen->EditRevert( this, board(), commit );
wxASSERT( commit->Empty() ); wxASSERT( commit->Empty() );
} }
else if( aEvent.IsAction( &PCB_ACTIONS::genRemove ) ) else if( aEvent.IsAction( &PCB_ACTIONS::genRemove ) )
{ {
gen->Remove( this, board(), frame(), commit ); gen->Remove( this, board(), commit );
} }
return 0; return 0;