Share multi-unit updating code between Sym Props and Edit Field.

Fixes https://gitlab.com/kicad/code/kicad/issues/4103
This commit is contained in:
Jeff Young 2020-03-30 14:14:44 +01:00
parent 7f8f17bd82
commit cbef95256b
4 changed files with 67 additions and 24 deletions

View File

@ -32,6 +32,7 @@
#include <widgets/wx_grid.h>
#include <ee_collectors.h>
#include <class_library.h>
#include <eeschema_settings.h>
#include <fields_grid_table.h>
@ -483,27 +484,17 @@ bool DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::TransferDataFromWindow()
// parts.
if( m_cmp->GetUnitCount() > 1 )
{
const LIB_ID thisLibId = m_cmp->GetLibId();
const wxString thisRef = m_cmp->GetRef( &( GetParent()->GetCurrentSheet() ) );
int thisUnit = m_cmp->GetUnit();
std::vector<SCH_COMPONENT*> otherUnits;
SCH_REFERENCE_LIST components;
GetParent()->GetCurrentSheet().GetComponents( components );
CollectOtherUnits( GetParent()->GetCurrentSheet(), m_cmp, &otherUnits );
for( unsigned i = 0; i < components.GetCount(); i++ )
for( SCH_COMPONENT* otherUnit : otherUnits )
{
SCH_REFERENCE component = components[i];
if( component.GetLibPart()->GetLibId() == thisLibId
&& component.GetRef() == thisRef
&& component.GetUnit() != thisUnit )
{
SCH_COMPONENT* otherUnit = component.GetComp();
GetParent()->SaveCopyInUndoList( otherUnit, UR_CHANGED, true /* append */);
otherUnit->GetField( VALUE )->SetText( m_fields->at( VALUE ).GetText() );
otherUnit->GetField( FOOTPRINT )->SetText( m_fields->at( FOOTPRINT ).GetText() );
otherUnit->GetField( DATASHEET )->SetText( m_fields->at( DATASHEET ).GetText() );
}
GetParent()->SaveCopyInUndoList( otherUnit, UR_CHANGED, true /* append */);
otherUnit->GetField( VALUE )->SetText( m_fields->at( VALUE ).GetText() );
otherUnit->GetField( FOOTPRINT )->SetText( m_fields->at( FOOTPRINT ).GetText() );
otherUnit->GetField( DATASHEET )->SetText( m_fields->at( DATASHEET ).GetText() );
GetParent()->RefreshItem( otherUnit );
}
}

View File

@ -29,6 +29,8 @@
#include <confirm.h>
#include <kicad_string.h>
#include <sch_base_frame.h>
#include <sch_edit_frame.h>
#include <ee_collectors.h>
#include <sch_component.h>
#include <class_libentry.h>
#include <lib_field.h>
@ -242,12 +244,13 @@ DIALOG_SCH_EDIT_ONE_FIELD::DIALOG_SCH_EDIT_ONE_FIELD( SCH_BASE_FRAME* aParent,
void DIALOG_SCH_EDIT_ONE_FIELD::UpdateField( SCH_FIELD* aField, SCH_SHEET_PATH* aSheetPath )
{
EDA_ITEM* parent = aField->GetParent();
SCH_EDIT_FRAME* editFrame = dynamic_cast<SCH_EDIT_FRAME*>( GetParent() );
SCH_ITEM* parent = dynamic_cast<SCH_ITEM*>( aField->GetParent() );
int fieldType = aField->GetId();
if( parent && parent->Type() == SCH_COMPONENT_T && aField->GetId() == REFERENCE )
if( parent && parent->Type() == SCH_COMPONENT_T && fieldType == REFERENCE )
{
wxASSERT( aSheetPath );
static_cast<SCH_COMPONENT*>( parent )->SetRef( aSheetPath, m_text );
}
@ -268,6 +271,24 @@ void DIALOG_SCH_EDIT_ONE_FIELD::UpdateField( SCH_FIELD* aField, SCH_SHEET_PATH*
aField->SetText( m_text );
updateText( aField );
// The value, footprint and datasheet fields should be kept in sync in multi-unit
// parts.
if( editFrame && parent && parent->Type() == SCH_COMPONENT_T
&& ( fieldType == VALUE || fieldType == FOOTPRINT || fieldType == DATASHEET ) )
{
SCH_COMPONENT* thisUnit = static_cast<SCH_COMPONENT*>( parent );
std::vector<SCH_COMPONENT*> otherUnits;
CollectOtherUnits( editFrame->GetCurrentSheet(), thisUnit, &otherUnits );
for( SCH_COMPONENT* otherUnit : otherUnits )
{
editFrame->SaveCopyInUndoList( otherUnit, UR_CHANGED, true /* append */);
otherUnit->GetField( fieldType )->SetText( m_text );
editFrame->RefreshItem( otherUnit );
}
}
if( positioningModified && parent )
static_cast<SCH_ITEM*>( parent )->ClearFieldsAutoplaced();
parent->ClearFieldsAutoplaced();
}

View File

@ -25,7 +25,6 @@
#include <macros.h>
#include <trace_helpers.h>
#include <ee_collectors.h>
#include <lib_item.h>
#include <sch_bus_entry.h>
@ -33,6 +32,7 @@
#include <sch_line.h>
#include <sch_sheet_path.h>
#include <transform.h>
#include "sch_reference_list.h"
const KICAD_T EE_COLLECTOR::AllItems[] = {
@ -166,3 +166,28 @@ bool EE_COLLECTOR::IsDraggableJunction() const
return false;
}
void CollectOtherUnits( SCH_SHEET_PATH& aSheet, SCH_COMPONENT* aUnit,
std::vector<SCH_COMPONENT*>* otherUnits )
{
if( aUnit->GetUnitCount() > 1 )
{
const LIB_ID thisLibId = aUnit->GetLibId();
const wxString thisRef = aUnit->GetRef( &aSheet );
int thisUnit = aUnit->GetUnit();
SCH_REFERENCE_LIST components;
aSheet.GetComponents( components );
for( unsigned i = 0; i < components.GetCount(); i++ )
{
SCH_REFERENCE component = components[i];
if( component.GetRef() == thisRef && component.GetUnit() != thisUnit )
otherUnits->push_back( component.GetComp() );
}
}
}

View File

@ -30,7 +30,10 @@
#include <collector.h>
#include <dialogs/dialog_schematic_find.h>
#include <sch_item.h>
#include <sch_sheet_path.h>
class SCH_SHEET_PATH;
class SCH_COMPONENT;
/**
@ -123,4 +126,7 @@ public:
};
void CollectOtherUnits( SCH_SHEET_PATH& aSheet, SCH_COMPONENT* aUnit,
std::vector<SCH_COMPONENT*>* otherUnits );
#endif // EE_COLLECTORS_H