Eeschema schematic object improvements.
* Move SCH_ITEM::Place() code into SCH_EDIT_FRAME so schematic item objects no longer have any knowledge of the schematic frame window or undo/redo containers.
This commit is contained in:
parent
5a96588eec
commit
152b8d91e3
|
@ -80,37 +80,6 @@ SCH_ITEM::~SCH_ITEM()
|
|||
}
|
||||
|
||||
|
||||
void SCH_ITEM::Place( SCH_EDIT_FRAME* aFrame, wxDC* aDC )
|
||||
{
|
||||
SCH_SCREEN* screen = aFrame->GetScreen();
|
||||
|
||||
if( IsNew() )
|
||||
{
|
||||
if( !screen->CheckIfOnDrawList( this ) ) // don't want a loop!
|
||||
screen->AddToDrawList( this );
|
||||
|
||||
aFrame->SetRepeatItem( this );
|
||||
aFrame->SaveCopyInUndoList( this, UR_NEW );
|
||||
}
|
||||
else
|
||||
{
|
||||
aFrame->SaveUndoItemInUndoList( this );
|
||||
}
|
||||
|
||||
m_Flags = 0;
|
||||
screen->SetModify();
|
||||
screen->SetCurItem( NULL );
|
||||
aFrame->GetCanvas()->SetMouseCapture( NULL, NULL );
|
||||
aFrame->GetCanvas()->EndMouseCapture();
|
||||
|
||||
if( aDC )
|
||||
{
|
||||
EDA_CROSS_HAIR_MANAGER( aFrame->GetCanvas(), aDC ); // Erase schematic cursor
|
||||
Draw( aFrame->GetCanvas(), aDC, wxPoint( 0, 0 ), GR_DEFAULT_DRAWMODE );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool SCH_ITEM::IsConnected( const wxPoint& aPosition ) const
|
||||
{
|
||||
if( m_Flags & STRUCT_DELETED || m_Flags & SKIP_STRUCT )
|
||||
|
|
|
@ -43,15 +43,17 @@
|
|||
static int s_LastShape = '\\';
|
||||
|
||||
|
||||
SCH_BUS_ENTRY* SCH_EDIT_FRAME::CreateBusEntry( wxDC* DC, int entry_type )
|
||||
SCH_BUS_ENTRY* SCH_EDIT_FRAME::CreateBusEntry( wxDC* aDC, int aType )
|
||||
{
|
||||
SCH_SCREEN* screen = GetScreen();
|
||||
|
||||
// Create and place a new bus entry at cursor position
|
||||
SCH_BUS_ENTRY* BusEntry = new SCH_BUS_ENTRY( GetScreen()->GetCrossHairPosition(), s_LastShape,
|
||||
entry_type );
|
||||
BusEntry->SetFlags( IS_NEW );
|
||||
BusEntry->Place( this, DC );
|
||||
OnModify();
|
||||
return BusEntry;
|
||||
SCH_BUS_ENTRY* busEntry = new SCH_BUS_ENTRY( screen->GetCrossHairPosition(), s_LastShape,
|
||||
aType );
|
||||
busEntry->SetFlags( IS_NEW );
|
||||
GetScreen()->SetCurItem( busEntry );
|
||||
addCurrentItemToList( aDC );
|
||||
return busEntry;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -76,10 +76,7 @@ void SCH_EDIT_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition )
|
|||
case SCH_FIELD_T:
|
||||
case SCH_BITMAP_T:
|
||||
case SCH_NO_CONNECT_T:
|
||||
item->Place( this, aDC );
|
||||
GetScreen()->SetCurItem( NULL );
|
||||
GetScreen()->TestDanglingEnds();
|
||||
m_canvas->Refresh( true );
|
||||
addCurrentItemToList( aDC );
|
||||
return;
|
||||
|
||||
case SCH_LINE_T: // May already be drawing segment.
|
||||
|
@ -133,12 +130,9 @@ void SCH_EDIT_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition )
|
|||
}
|
||||
else
|
||||
{
|
||||
item->Place( this, aDC );
|
||||
m_canvas->SetAutoPanRequest( false );
|
||||
addCurrentItemToList( aDC );
|
||||
}
|
||||
|
||||
GetScreen()->TestDanglingEnds();
|
||||
m_canvas->Refresh( true );
|
||||
break;
|
||||
|
||||
case ID_JUNCTION_BUTT:
|
||||
|
@ -150,30 +144,22 @@ void SCH_EDIT_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition )
|
|||
}
|
||||
else
|
||||
{
|
||||
item->Place( this, aDC );
|
||||
m_canvas->SetAutoPanRequest( false );
|
||||
addCurrentItemToList( aDC );
|
||||
}
|
||||
|
||||
GetScreen()->TestDanglingEnds();
|
||||
m_canvas->Refresh( true );
|
||||
break;
|
||||
|
||||
case ID_WIRETOBUS_ENTRY_BUTT:
|
||||
case ID_BUSTOBUS_ENTRY_BUTT:
|
||||
if( ( item == NULL ) || ( item->GetFlags() == 0 ) )
|
||||
{
|
||||
item = CreateBusEntry( aDC, ( GetToolId() == ID_WIRETOBUS_ENTRY_BUTT ) ?
|
||||
CreateBusEntry( aDC, ( GetToolId() == ID_WIRETOBUS_ENTRY_BUTT ) ?
|
||||
WIRE_TO_BUS : BUS_TO_BUS );
|
||||
GetScreen()->SetCurItem( item );
|
||||
m_canvas->SetAutoPanRequest( true );
|
||||
}
|
||||
else
|
||||
{
|
||||
item->Place( this, aDC );
|
||||
GetScreen()->SetCurItem( NULL );
|
||||
GetScreen()->TestDanglingEnds();
|
||||
m_canvas->Refresh( true );
|
||||
m_canvas->SetAutoPanRequest( false );
|
||||
addCurrentItemToList( aDC );
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -204,9 +190,9 @@ void SCH_EDIT_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition )
|
|||
}
|
||||
else
|
||||
{
|
||||
item->Place( this, aDC );
|
||||
m_canvas->SetAutoPanRequest( false );
|
||||
addCurrentItemToList( aDC );
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case ID_ADD_IMAGE_BUTT:
|
||||
|
@ -217,9 +203,9 @@ void SCH_EDIT_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition )
|
|||
}
|
||||
else
|
||||
{
|
||||
item->Place( this, aDC );
|
||||
m_canvas->SetAutoPanRequest( false );
|
||||
addCurrentItemToList( aDC );
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case ID_LABEL_BUTT:
|
||||
|
@ -230,11 +216,9 @@ void SCH_EDIT_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition )
|
|||
}
|
||||
else
|
||||
{
|
||||
item->Place( this, aDC );
|
||||
m_canvas->SetAutoPanRequest( false );
|
||||
GetScreen()->TestDanglingEnds();
|
||||
m_canvas->Refresh( true );
|
||||
addCurrentItemToList( aDC );
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case ID_GLABEL_BUTT:
|
||||
|
@ -251,26 +235,27 @@ void SCH_EDIT_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition )
|
|||
}
|
||||
else
|
||||
{
|
||||
item->Place( this, aDC );
|
||||
m_canvas->SetAutoPanRequest( false );
|
||||
GetScreen()->TestDanglingEnds();
|
||||
m_canvas->Refresh( true );
|
||||
addCurrentItemToList( aDC );
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case ID_SHEET_SYMBOL_BUTT:
|
||||
if( ( item == NULL ) || ( item->GetFlags() == 0 ) )
|
||||
{
|
||||
GetScreen()->SetCurItem( CreateSheet( aDC ) );
|
||||
item = CreateSheet( aDC );
|
||||
|
||||
if( item != NULL )
|
||||
{
|
||||
GetScreen()->SetCurItem( item );
|
||||
m_canvas->SetAutoPanRequest( true );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
item->Place( this, aDC );
|
||||
m_canvas->SetAutoPanRequest( false );
|
||||
GetScreen()->TestDanglingEnds();
|
||||
m_canvas->Refresh( true );
|
||||
addCurrentItemToList( aDC );
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case ID_IMPORT_HLABEL_BUTT:
|
||||
|
@ -290,10 +275,9 @@ void SCH_EDIT_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition )
|
|||
}
|
||||
else if( (item->Type() == SCH_SHEET_PIN_T) && (item->GetFlags() != 0) )
|
||||
{
|
||||
item->Place( this, aDC );
|
||||
GetScreen()->TestDanglingEnds();
|
||||
m_canvas->Refresh( true );
|
||||
addCurrentItemToList( aDC );
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case ID_SCH_PLACE_COMPONENT:
|
||||
|
@ -304,11 +288,9 @@ void SCH_EDIT_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition )
|
|||
}
|
||||
else
|
||||
{
|
||||
item->Place( this, aDC );
|
||||
m_canvas->SetAutoPanRequest( false );
|
||||
GetScreen()->TestDanglingEnds();
|
||||
m_canvas->Refresh( true );
|
||||
addCurrentItemToList( aDC );
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case ID_PLACE_POWER_BUTT:
|
||||
|
@ -320,11 +302,9 @@ void SCH_EDIT_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition )
|
|||
}
|
||||
else
|
||||
{
|
||||
item->Place( this, aDC );
|
||||
m_canvas->SetAutoPanRequest( false );
|
||||
GetScreen()->TestDanglingEnds();
|
||||
m_canvas->Refresh( true );
|
||||
addCurrentItemToList( aDC );
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
@ -477,30 +477,6 @@ int SCH_SHEET::GetMinHeight() const
|
|||
}
|
||||
|
||||
|
||||
void SCH_SHEET::Place( SCH_EDIT_FRAME* frame, wxDC* DC )
|
||||
{
|
||||
/* Place list structures for new sheet. */
|
||||
if( IsNew() )
|
||||
{
|
||||
// fix size and position of the new sheet
|
||||
// using the last values set by the m_mouseCaptureCallback function
|
||||
frame->GetCanvas()->SetMouseCapture( NULL, NULL );
|
||||
|
||||
if( !frame->EditSheet( this, DC ) )
|
||||
{
|
||||
frame->GetScreen()->SetCurItem( NULL );
|
||||
Draw( frame->GetCanvas(), DC, wxPoint( 0, 0 ), g_XorMode );
|
||||
delete this;
|
||||
return;
|
||||
}
|
||||
|
||||
frame->SetSheetNumberAndCount();
|
||||
}
|
||||
|
||||
SCH_ITEM::Place( frame, DC ); //puts it on the GetDrawItems().
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Delete sheet labels which do not have corresponding hierarchical label.
|
||||
*/
|
||||
|
|
|
@ -148,8 +148,6 @@ public:
|
|||
*/
|
||||
SCH_SHEET* GetParent() const { return (SCH_SHEET*) m_Parent; }
|
||||
|
||||
void Place( SCH_EDIT_FRAME* frame, wxDC* DC );
|
||||
|
||||
/**
|
||||
* Function Save
|
||||
* writes the data structures for this object out to a FILE in "*.sch"
|
||||
|
@ -342,8 +340,6 @@ public:
|
|||
*/
|
||||
virtual bool Load( LINE_READER& aLine, wxString& aErrorMsg );
|
||||
|
||||
void Place( SCH_EDIT_FRAME* frame, wxDC* DC );
|
||||
|
||||
void DisplayInfo( EDA_DRAW_FRAME* frame );
|
||||
|
||||
/* there is no member for orientation in sch_sheet, to preserve file
|
||||
|
|
|
@ -126,32 +126,6 @@ void SCH_SHEET_PIN::SetNumber( int aNumber )
|
|||
}
|
||||
|
||||
|
||||
void SCH_SHEET_PIN::Place( SCH_EDIT_FRAME* aFrame, wxDC* aDC )
|
||||
{
|
||||
SCH_SHEET* sheet = (SCH_SHEET*) GetParent();
|
||||
|
||||
wxCHECK_RET( (sheet != NULL) && (sheet->Type() == SCH_SHEET_T),
|
||||
wxT( "Cannot place sheet pin in invalid schematic sheet object." ) );
|
||||
|
||||
if( IsNew() )
|
||||
{
|
||||
aFrame->SaveCopyInUndoList( sheet, UR_CHANGED );
|
||||
sheet->AddPin( this );
|
||||
}
|
||||
else // Sheet pin already existed and was only moved.
|
||||
{
|
||||
aFrame->SaveUndoItemInUndoList( sheet );
|
||||
}
|
||||
|
||||
ClearFlags();
|
||||
sheet->Draw( aFrame->GetCanvas(), aDC, wxPoint( 0, 0 ), GR_DEFAULT_DRAWMODE );
|
||||
|
||||
// Make sure we don't call the abort move function.
|
||||
aFrame->GetCanvas()->SetMouseCapture( NULL, NULL );
|
||||
aFrame->GetCanvas()->EndMouseCapture();
|
||||
}
|
||||
|
||||
|
||||
void SCH_SHEET_PIN::SetEdge( int aEdge )
|
||||
{
|
||||
SCH_SHEET* Sheet = (SCH_SHEET*) GetParent();
|
||||
|
|
|
@ -204,7 +204,7 @@ void SCH_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
|
|||
|
||||
case ID_POPUP_SCH_END_SHEET:
|
||||
m_canvas->MoveCursorToCrossHair();
|
||||
item->Place( this, &dc );
|
||||
addCurrentItemToList( &dc );
|
||||
break;
|
||||
|
||||
case ID_POPUP_SCH_RESIZE_SHEET:
|
||||
|
@ -330,11 +330,7 @@ void SCH_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
|
|||
item = screen->GetCurItem();
|
||||
|
||||
if( item )
|
||||
{
|
||||
item->Place( this, &dc );
|
||||
screen->TestDanglingEnds( m_canvas, &dc );
|
||||
screen->SetCurItem( NULL );
|
||||
}
|
||||
addCurrentItemToList( &dc );
|
||||
|
||||
break;
|
||||
|
||||
|
|
|
@ -902,3 +902,80 @@ bool SCH_EDIT_FRAME::isAutoSaveRequired() const
|
|||
|
||||
return SheetList.IsAutoSaveRequired();
|
||||
}
|
||||
|
||||
|
||||
void SCH_EDIT_FRAME::addCurrentItemToList( wxDC* aDC )
|
||||
{
|
||||
SCH_SCREEN* screen = GetScreen();
|
||||
SCH_ITEM* item = screen->GetCurItem();
|
||||
|
||||
wxCHECK_RET( item != NULL, wxT( "Cannot add current item to list." ) );
|
||||
|
||||
m_canvas->SetAutoPanRequest( false );
|
||||
|
||||
SCH_ITEM* undoItem = item;
|
||||
|
||||
if( item->Type() == SCH_SHEET_PIN_T )
|
||||
{
|
||||
SCH_SHEET* sheet = (SCH_SHEET*) item->GetParent();
|
||||
|
||||
wxCHECK_RET( (sheet != NULL) && (sheet->Type() == SCH_SHEET_T),
|
||||
wxT( "Cannot place sheet pin in invalid schematic sheet object." ) );
|
||||
|
||||
undoItem = sheet;
|
||||
}
|
||||
|
||||
if( item->IsNew() )
|
||||
{
|
||||
if( item->Type() == SCH_SHEET_T )
|
||||
{
|
||||
// Fix the size and position of the new sheet using the last values set by
|
||||
// the m_mouseCaptureCallback function.
|
||||
m_canvas->SetMouseCapture( NULL, NULL );
|
||||
|
||||
if( !EditSheet( (SCH_SHEET*)item, aDC ) )
|
||||
{
|
||||
screen->SetCurItem( NULL );
|
||||
item->Draw( m_canvas, aDC, wxPoint( 0, 0 ), g_XorMode );
|
||||
delete item;
|
||||
return;
|
||||
}
|
||||
|
||||
SetSheetNumberAndCount();
|
||||
}
|
||||
|
||||
if( undoItem == item )
|
||||
{
|
||||
if( !screen->CheckIfOnDrawList( item ) ) // don't want a loop!
|
||||
screen->AddToDrawList( item );
|
||||
|
||||
SetRepeatItem( item );
|
||||
|
||||
SaveCopyInUndoList( undoItem, UR_NEW );
|
||||
}
|
||||
else
|
||||
{
|
||||
SaveCopyInUndoList( undoItem, UR_CHANGED );
|
||||
( (SCH_SHEET*)undoItem )->AddPin( (SCH_SHEET_PIN*) item );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
SaveUndoItemInUndoList( undoItem );
|
||||
}
|
||||
|
||||
item->ClearFlags();
|
||||
screen->SetModify();
|
||||
screen->SetCurItem( NULL );
|
||||
m_canvas->SetMouseCapture( NULL, NULL );
|
||||
m_canvas->EndMouseCapture();
|
||||
|
||||
if( item->IsConnectable() )
|
||||
screen->TestDanglingEnds();
|
||||
|
||||
if( aDC )
|
||||
{
|
||||
EDA_CROSS_HAIR_MANAGER( m_canvas, aDC ); // Erase schematic cursor
|
||||
undoItem->Draw( m_canvas, aDC, wxPoint( 0, 0 ), GR_DEFAULT_DRAWMODE );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -179,15 +179,6 @@ public:
|
|||
int aDrawMode,
|
||||
int aColor = -1 ) = 0;
|
||||
|
||||
/**
|
||||
* Function Place
|
||||
* place the schematic item into the draw list.
|
||||
* <p>
|
||||
* If the schematic item is a new item or is modified, it is added to undo list.
|
||||
* </p>
|
||||
*/
|
||||
virtual void Place( SCH_EDIT_FRAME* aFrame, wxDC* aDC );
|
||||
|
||||
/**
|
||||
* Function Move
|
||||
* moves the item by \a aMoveVector to a new position.
|
||||
|
|
|
@ -181,6 +181,14 @@ protected:
|
|||
*/
|
||||
virtual bool isAutoSaveRequired() const;
|
||||
|
||||
/**
|
||||
* Function addCurrentItemToList
|
||||
* adds the item currently being edited to the schematic and adds the changes to
|
||||
* the undo/redo container.
|
||||
*
|
||||
* @param aDC A pointer the device context to draw on when not NULL.
|
||||
*/
|
||||
void addCurrentItemToList( wxDC* aDC );
|
||||
|
||||
public:
|
||||
SCH_EDIT_FRAME( wxWindow* father,
|
||||
|
|
Loading…
Reference in New Issue