From 4d1cdfd4ff32078b274d02121c2e3dbfe9f8c07a Mon Sep 17 00:00:00 2001 From: Wayne Stambaugh Date: Thu, 24 Feb 2011 17:29:43 -0500 Subject: [PATCH] Schematic component library editor delete item improvements. * Merge two duplicate case statement and delete pin code paths into a single delete function. * Make all delete commands use new delete function. * Fix a few set tool ID calls to use default cursor instead of arrow cursor. --- eeschema/class_libentry.cpp | 7 +-- eeschema/libedit_onleftclick.cpp | 30 +++--------- eeschema/libeditframe.cpp | 82 +++++++++++++++++++++----------- eeschema/libeditframe.h | 10 +++- eeschema/pinedit.cpp | 40 +--------------- 5 files changed, 75 insertions(+), 94 deletions(-) diff --git a/eeschema/class_libentry.cpp b/eeschema/class_libentry.cpp index c7fd6bc205..913fda6959 100644 --- a/eeschema/class_libentry.cpp +++ b/eeschema/class_libentry.cpp @@ -426,14 +426,15 @@ from component %s in library %s." ), LIB_DRAW_ITEM_LIST::iterator i; - if( aDc != NULL ) - aItem->Draw( aPanel, aDc, wxPoint( 0, 0 ), -1, g_XorMode, NULL, DefaultTransform ); - for( i = drawings.begin(); i < drawings.end(); i++ ) { if( *i == aItem ) { + if( aDc != NULL ) + aItem->Draw( aPanel, aDc, wxPoint( 0, 0 ), -1, g_XorMode, NULL, DefaultTransform ); + drawings.erase( i ); + SetModified(); break; } } diff --git a/eeschema/libedit_onleftclick.cpp b/eeschema/libedit_onleftclick.cpp index 5de328d072..ef0b6a33d5 100644 --- a/eeschema/libedit_onleftclick.cpp +++ b/eeschema/libedit_onleftclick.cpp @@ -70,23 +70,11 @@ void LIB_EDIT_FRAME::OnLeftClick( wxDC* DC, const wxPoint& aPosition ) break; case ID_LIBEDIT_DELETE_ITEM_BUTT: - DrawEntry = LocateItemUsingCursor( aPosition ); - - if( DrawEntry == NULL ) - { - DisplayCmpDoc(); - break; - } - - SaveCopyInUndoList( m_component ); - - if( DrawEntry->Type() == LIB_PIN_T ) - DeletePin( DC, m_component, (LIB_PIN*) DrawEntry ); + if( LocateItemUsingCursor( aPosition ) ) + deleteItem( DC ); else - m_component->RemoveDrawItem( DrawEntry, DrawPanel, DC ); + DisplayCmpDoc(); - DrawEntry = NULL; - OnModify( ); break; case ID_LIBEDIT_ANCHOR_ITEM_BUTT: @@ -96,7 +84,7 @@ void LIB_EDIT_FRAME::OnLeftClick( wxDC* DC, const wxPoint& aPosition ) break; default: - DisplayError( this, wxT( "LIB_EDIT_FRAME::OnLeftClick error" ) ); + wxFAIL_MSG( wxString::Format( wxT( "Unhandled command ID %d" ), GetToolId() ) ); SetToolID( ID_NO_TOOL_SELECTED, DrawPanel->GetDefaultCursor(), wxEmptyString ); break; } @@ -132,7 +120,7 @@ void LIB_EDIT_FRAME::OnLeftDClick( wxDC* DC, const wxPoint& aPosition ) else return; - DrawPanel->m_IgnoreMouseEvents = TRUE; + DrawPanel->m_IgnoreMouseEvents = true; switch( m_drawItem->Type() ) { @@ -179,15 +167,11 @@ void LIB_EDIT_FRAME::OnLeftDClick( wxDC* DC, const wxPoint& aPosition ) } break; - default: - wxString msg; - msg.Printf( wxT( "LIB_EDIT_FRAME::OnLeftDClick Error: unknown StructType %d" ), - m_drawItem->Type() ); - DisplayError( this, msg ); + wxFAIL_MSG( wxT( "Unhandled item <" ) + m_drawItem->GetClass() + wxT( ">" ) ); break; } DrawPanel->MoveCursorToCrossHair(); - DrawPanel->m_IgnoreMouseEvents = FALSE; + DrawPanel->m_IgnoreMouseEvents = false; } diff --git a/eeschema/libeditframe.cpp b/eeschema/libeditframe.cpp index ae2a4300a8..e170efb2d1 100644 --- a/eeschema/libeditframe.cpp +++ b/eeschema/libeditframe.cpp @@ -666,7 +666,7 @@ void LIB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event ) break; case ID_LIBEDIT_EDIT_PIN_BY_PIN: - g_EditPinByPinIsOn = m_HToolBar->GetToolState(ID_LIBEDIT_EDIT_PIN_BY_PIN); + g_EditPinByPinIsOn = m_HToolBar->GetToolState( ID_LIBEDIT_EDIT_PIN_BY_PIN ); break; case ID_POPUP_LIBEDIT_END_CREATE_ITEM: @@ -720,27 +720,9 @@ void LIB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event ) } case ID_POPUP_LIBEDIT_DELETE_ITEM: - if( m_drawItem == NULL ) - break; - DrawPanel->MoveCursorToCrossHair(); - DrawPanel->CrossHairOff( &dc ); - SaveCopyInUndoList( m_component ); + if( m_drawItem ) + deleteItem( &dc ); - if( m_drawItem->Type() == LIB_PIN_T ) - { - DeletePin( &dc, m_component, (LIB_PIN*) m_drawItem ); - } - else - { - if( DrawPanel->IsMouseCaptured() ) - DrawPanel->m_endMouseCaptureCallback( DrawPanel, &dc ); - else - m_component->RemoveDrawItem( m_drawItem, DrawPanel, &dc ); - } - - m_drawItem = NULL; - OnModify( ); - DrawPanel->CrossHairOn( &dc ); break; case ID_POPUP_LIBEDIT_MOVE_ITEM_REQUEST: @@ -919,7 +901,9 @@ void LIB_EDIT_FRAME::TempCopyComponent() { if( m_tempCopyComponent ) delete m_tempCopyComponent; + m_tempCopyComponent = NULL; + if( m_component ) m_tempCopyComponent = new LIB_COMPONENT( *m_component ); } @@ -1037,7 +1021,7 @@ void LIB_EDIT_FRAME::OnSelectTool( wxCommandEvent& aEvent ) switch( id ) { case ID_NO_TOOL_SELECTED: - SetToolID( id, wxCURSOR_ARROW, wxEmptyString ); + SetToolID( id, DrawPanel->GetDefaultCursor(), wxEmptyString ); break; case ID_LIBEDIT_PIN_BUTT: @@ -1051,7 +1035,7 @@ void LIB_EDIT_FRAME::OnSelectTool( wxCommandEvent& aEvent ) wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED ); cmd.SetId( ID_LIBEDIT_EDIT_PIN ); GetEventHandler()->ProcessEvent( cmd ); - SetToolID( ID_NO_TOOL_SELECTED, wxCURSOR_ARROW, wxEmptyString ); + SetToolID( ID_NO_TOOL_SELECTED, DrawPanel->GetDefaultCursor(), wxEmptyString ); } break; @@ -1080,15 +1064,15 @@ void LIB_EDIT_FRAME::OnSelectTool( wxCommandEvent& aEvent ) break; case ID_LIBEDIT_IMPORT_BODY_BUTT: - SetToolID( id, wxCURSOR_ARROW, _( "Import" ) ); + SetToolID( id, DrawPanel->GetDefaultCursor(), _( "Import" ) ); LoadOneSymbol(); - SetToolID( ID_NO_TOOL_SELECTED, wxCURSOR_ARROW, wxEmptyString ); + SetToolID( ID_NO_TOOL_SELECTED, DrawPanel->GetDefaultCursor(), wxEmptyString ); break; case ID_LIBEDIT_EXPORT_BODY_BUTT: - SetToolID( id, wxCURSOR_ARROW, _( "Export" ) ); + SetToolID( id, DrawPanel->GetDefaultCursor(), _( "Export" ) ); SaveOneSymbol(); - SetToolID( ID_NO_TOOL_SELECTED, wxCURSOR_ARROW, wxEmptyString ); + SetToolID( ID_NO_TOOL_SELECTED, DrawPanel->GetDefaultCursor(), wxEmptyString ); break; case ID_LIBEDIT_DELETE_ITEM_BUTT: @@ -1107,3 +1091,47 @@ void LIB_EDIT_FRAME::OnSelectTool( wxCommandEvent& aEvent ) DrawPanel->m_IgnoreMouseEvents = false; } + + +void LIB_EDIT_FRAME::deleteItem( wxDC* aDC ) +{ + wxCHECK_RET( m_drawItem != NULL, wxT( "No drawing item selected to delete." ) ); + + DrawPanel->CrossHairOff( aDC ); + SaveCopyInUndoList( m_component ); + + if( m_drawItem->Type() == LIB_PIN_T ) + { + LIB_PIN* pin = (LIB_PIN*) m_drawItem; + wxPoint pos = pin->GetPosition(); + + m_component->RemoveDrawItem( (LIB_DRAW_ITEM*) pin, DrawPanel, aDC ); + + if( g_EditPinByPinIsOn == false ) + { + LIB_PIN* tmp = m_component->GetNextPin(); + + while( tmp != NULL ) + { + pin = tmp; + tmp = m_component->GetNextPin( pin ); + + if( pin->GetPosition() != pos ) + continue; + + m_component->RemoveDrawItem( (LIB_DRAW_ITEM*) pin ); + } + } + } + else + { + if( DrawPanel->IsMouseCaptured() ) + DrawPanel->m_endMouseCaptureCallback( DrawPanel, aDC ); + else + m_component->RemoveDrawItem( m_drawItem, DrawPanel, aDC ); + } + + m_drawItem = NULL; + OnModify(); + DrawPanel->CrossHairOn( aDC ); +} diff --git a/eeschema/libeditframe.h b/eeschema/libeditframe.h index 513476915d..1f08f63088 100644 --- a/eeschema/libeditframe.h +++ b/eeschema/libeditframe.h @@ -204,7 +204,7 @@ public: */ void ClearTempCopyComponent(); - bool IsEditingDrawItem() { return m_drawItem && m_drawItem->InEditMode(); } + bool IsEditingDrawItem() { return m_drawItem && m_drawItem->InEditMode(); } private: @@ -225,6 +225,13 @@ private: void DisplayCmpDoc(); + /** + * Function deleteItem + * deletes the currently selected draw item. + * @param aDC The device context to draw upon when removing item. + */ + void deleteItem( wxDC* aDC ); + // General editing public: void SaveCopyInUndoList( EDA_ITEM* ItemToCopy, int flag_type_command = 0 ); @@ -235,7 +242,6 @@ private: // Editing pins void CreatePin( wxDC* DC ); - void DeletePin( wxDC* DC, LIB_COMPONENT* LibEntry, LIB_PIN* Pin ); void StartMovePin( wxDC* DC ); // Editing anchor diff --git a/eeschema/pinedit.cpp b/eeschema/pinedit.cpp index af1572a0a2..da8d9e1af4 100644 --- a/eeschema/pinedit.cpp +++ b/eeschema/pinedit.cpp @@ -367,43 +367,6 @@ static void DrawMovePin( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosi } -/* - * Delete pin at the current mouse position. - * If g_EditPinByPinIsOn == false: - * All pins at the same position will be erased. - * Otherwise only the pin of the current unit and convert will be erased. - */ -void LIB_EDIT_FRAME::DeletePin( wxDC* DC, LIB_COMPONENT* LibEntry, LIB_PIN* Pin ) -{ - LIB_PIN* tmp; - wxPoint PinPos; - - if( LibEntry == NULL || Pin == NULL ) - return; - - PinPos = Pin->GetPosition(); - LibEntry->RemoveDrawItem( (LIB_DRAW_ITEM*) Pin, DrawPanel, DC ); - - if( g_EditPinByPinIsOn == false ) - { - tmp = LibEntry->GetNextPin(); - - while( tmp != NULL ) - { - Pin = tmp; - tmp = LibEntry->GetNextPin( Pin ); - - if( Pin->GetPosition() != PinPos ) - continue; - - LibEntry->RemoveDrawItem( (LIB_DRAW_ITEM*) Pin ); - } - } - - OnModify( ); -} - - /* * Create a new pin. */ @@ -450,8 +413,7 @@ void LIB_EDIT_FRAME::CreatePin( wxDC* DC ) if( pin->m_Flags & IS_CANCELLED ) { - DeletePin( NULL, m_component, pin ); - m_drawItem = NULL; + deleteItem( DC ); } else {