From bd022c23a375a2892265669fdd21c1e1d63c52ad Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Sat, 23 Oct 2010 15:49:14 +0200 Subject: [PATCH] Libedit: fixed draw artefacts when editing a graphic symbol. fixed minor issues in undo and abort commands when editing graphic items. --- eeschema/hotkeys.cpp | 8 ++----- eeschema/libedit_onleftclick.cpp | 1 - eeschema/libeditframe.cpp | 38 ++++++++++++-------------------- eeschema/libeditframe.h | 5 +++++ eeschema/pinedit.cpp | 18 ++++++++++++--- eeschema/symbdraw.cpp | 25 +++++++++++++++------ eeschema/symbedit.cpp | 2 +- 7 files changed, 55 insertions(+), 42 deletions(-) diff --git a/eeschema/hotkeys.cpp b/eeschema/hotkeys.cpp index fc1ee8f1c4..9fd6588f58 100644 --- a/eeschema/hotkeys.cpp +++ b/eeschema/hotkeys.cpp @@ -785,12 +785,8 @@ void WinEDA_LibeditFrame::OnHotKey( wxDC* DC, int hotkey, EDA_BaseStruct* DrawSt case HK_REPEAT_LAST: if( m_lastDrawItem && (m_lastDrawItem->m_Flags == 0) && ( m_lastDrawItem->Type() == COMPONENT_PIN_DRAW_TYPE ) ) - { RepeatPinItem( DC, (LIB_PIN*) m_lastDrawItem ); - } - else - wxBell(); - break; + break; case HK_EDIT: m_drawItem = LocateItemUsingCursor(); @@ -827,7 +823,7 @@ void WinEDA_LibeditFrame::OnHotKey( wxDC* DC, int hotkey, EDA_BaseStruct* DrawSt case HK_ROTATE: m_drawItem = LocateItemUsingCursor(); - if( m_drawItem && !m_drawItem->InEditMode() ) + if( m_drawItem ) { switch( m_drawItem->Type() ) { diff --git a/eeschema/libedit_onleftclick.cpp b/eeschema/libedit_onleftclick.cpp index 77efb28ab0..ad2fcc2fc8 100644 --- a/eeschema/libedit_onleftclick.cpp +++ b/eeschema/libedit_onleftclick.cpp @@ -75,7 +75,6 @@ void WinEDA_LibeditFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) } else { - SaveCopyInUndoList( m_component ); PlacePin( DC ); } break; diff --git a/eeschema/libeditframe.cpp b/eeschema/libeditframe.cpp index 9ae79009a2..a6714863e5 100644 --- a/eeschema/libeditframe.cpp +++ b/eeschema/libeditframe.cpp @@ -816,53 +816,31 @@ void WinEDA_LibeditFrame::Process_Special_Functions( wxCommandEvent& event ) case ID_POPUP_LIBEDIT_ROTATE_GRAPHIC_TEXT: if( m_drawItem == NULL && m_drawItem->Type() != COMPONENT_GRAPHIC_TEXT_DRAW_TYPE ) break; - DrawPanel->CursorOff( &dc ); DrawPanel->MouseToCursorSchema(); if( !m_drawItem->InEditMode() ) { SaveCopyInUndoList( m_component ); m_drawItem->SetUnit( m_unit ); - m_drawItem->Draw( DrawPanel, &dc, wxPoint( 0, 0 ), -1, g_XorMode, NULL, - DefaultTransform ); } m_drawItem->Rotate(); - - if( !m_drawItem->InEditMode() ) - { - m_drawItem->Draw( DrawPanel, &dc, wxPoint( 0, 0 ), -1, g_XorMode, NULL, - DefaultTransform ); - DrawPanel->Refresh(); - } - - DrawPanel->CursorOn( &dc ); + DrawPanel->Refresh(); break; case ID_POPUP_LIBEDIT_FIELD_ROTATE_ITEM: { if( m_drawItem == NULL || ( m_drawItem->Type() != COMPONENT_FIELD_DRAW_TYPE ) ) break; - DrawPanel->CursorOff( &dc ); DrawPanel->MouseToCursorSchema(); if( !m_drawItem->InEditMode() ) { SaveCopyInUndoList( m_component ); m_drawItem->SetUnit( m_unit ); - m_drawItem->Draw( DrawPanel, &dc, wxPoint( 0, 0 ), -1, g_XorMode, NULL, - DefaultTransform ); } m_drawItem->Rotate(); - - if( !m_drawItem->InEditMode() ) - { - m_drawItem->Draw( DrawPanel, &dc, wxPoint( 0, 0 ), -1, g_XorMode, NULL, - DefaultTransform ); - DrawPanel->Refresh(); - } - - DrawPanel->CursorOn( &dc ); + DrawPanel->Refresh(); break; } @@ -980,6 +958,7 @@ void WinEDA_LibeditFrame::TempCopyComponent() { if( m_tempCopyComponent ) delete m_tempCopyComponent; + m_tempCopyComponent = NULL; if( m_component ) m_tempCopyComponent = new LIB_COMPONENT( *m_component ); } @@ -990,8 +969,19 @@ void WinEDA_LibeditFrame::TempCopyComponent() */ void WinEDA_LibeditFrame::RestoreComponent() { + if( m_tempCopyComponent == NULL ) + return; if( m_component ) delete m_component; m_component = m_tempCopyComponent; m_tempCopyComponent = NULL; } + +/** Function ClearTempCopyComponent + * delete temporary copy of the current component and clear pointer + */ +void WinEDA_LibeditFrame::ClearTempCopyComponent() +{ + delete m_tempCopyComponent; + m_tempCopyComponent = NULL; +} diff --git a/eeschema/libeditframe.h b/eeschema/libeditframe.h index 20756781ee..823578c241 100644 --- a/eeschema/libeditframe.h +++ b/eeschema/libeditframe.h @@ -188,6 +188,11 @@ public: */ LIB_COMPONENT* GetTempCopyComponent() { return m_tempCopyComponent; } + /** Function ClearTempCopyComponent + * delete temporary copy of the current component and clear pointer + */ + void ClearTempCopyComponent(); + bool IsEditingDrawItem() { return m_drawItem && m_drawItem->InEditMode(); } private: diff --git a/eeschema/pinedit.cpp b/eeschema/pinedit.cpp index 694f575ce3..df3c58b29a 100644 --- a/eeschema/pinedit.cpp +++ b/eeschema/pinedit.cpp @@ -50,7 +50,8 @@ void WinEDA_LibeditFrame::OnRotatePin( wxCommandEvent& event ){ // Save old pin orientation LastPinOrient = pin -> m_Orient; - SaveCopyInUndoList( pin->GetParent() ); + if( !pin->InEditMode() ) + SaveCopyInUndoList( pin->GetParent() ); // Get the actual pin orientation index int orientationIndex = pin -> GetOrientationCodeIndex(pin -> m_Orient); @@ -159,7 +160,7 @@ void WinEDA_LibeditFrame::OnEditPin( wxCommandEvent& event ) if( pin->IsModified() || pin->IsNew() ) { - if( !pin->IsNew() ) + if( !pin->InEditMode() ) SaveCopyInUndoList( pin->GetParent() ); OnModify( ); @@ -192,7 +193,7 @@ static void AbortPinMove( WinEDA_DrawPanel* Panel, wxDC* DC ) if( CurrentPin->m_Flags & IS_NEW ) delete CurrentPin; else - CurrentPin->m_Flags = 0; + parent->RestoreComponent(); /* clear edit flags */ Panel->ManageCurseur = NULL; @@ -246,6 +247,13 @@ another pin. Continue?" ) ); } } + // Create Undo from GetTempCopyComponent() if exists ( i.e. after a pin move) + // or from m_component (pin add ...) + if( GetTempCopyComponent() ) + SaveCopyInUndoList( GetTempCopyComponent() ); + else + SaveCopyInUndoList( m_component ); + DrawPanel->ManageCurseur = NULL; DrawPanel->ForceCloseManageCurseur = NULL; OnModify( ); @@ -294,6 +302,8 @@ void WinEDA_LibeditFrame::StartMovePin( wxDC* DC ) LIB_PIN* CurrentPin = (LIB_PIN*) m_drawItem; wxPoint startPos; + TempCopyComponent(); + /* Mark pins for moving. */ Pin = m_component->GetNextPin(); for( ; Pin != NULL; Pin = m_component->GetNextPin( Pin ) ) @@ -466,6 +476,7 @@ void WinEDA_LibeditFrame::CreatePin( wxDC* DC ) } else { + ClearTempCopyComponent(); DrawPanel->ManageCurseur = DrawMovePin; DrawPanel->ForceCloseManageCurseur = AbortPinMove; if( DC ) @@ -609,6 +620,7 @@ void WinEDA_LibeditFrame::RepeatPinItem( wxDC* DC, LIB_PIN* SourcePin ) // Add this new pin in list, and creates pins for others parts if needed m_drawItem = Pin; + ClearTempCopyComponent(); PlacePin( DC ); m_lastDrawItem = Pin; diff --git a/eeschema/symbdraw.cpp b/eeschema/symbdraw.cpp index f724fe57ea..4d41db774d 100644 --- a/eeschema/symbdraw.cpp +++ b/eeschema/symbdraw.cpp @@ -69,7 +69,7 @@ void WinEDA_LibeditFrame::EditGraphicSymbol( wxDC* DC, LIB_DRAW_ITEM* DrawItem ) #endif // Save copy for undo if not in edit (edit command already handle the save copy) - if( DrawItem->m_Flags == 0 ) + if( !DrawItem->InEditMode() ) SaveCopyInUndoList( DrawItem->GetParent() ); if( m_drawSpecificUnit ) @@ -113,11 +113,11 @@ static void AbortSymbolTraceOn( WinEDA_DrawPanel* Panel, wxDC* DC ) if( newItem ) { delete item; - parent->SetDrawItem( NULL ); } else parent->RestoreComponent(); + parent->SetDrawItem( NULL ); Panel->Refresh(); } @@ -128,6 +128,10 @@ LIB_DRAW_ITEM* WinEDA_LibeditFrame::CreateGraphicItem( LIB_COMPONENT* LibEntry, DrawPanel->ForceCloseManageCurseur = AbortSymbolTraceOn; wxPoint drawPos = GetScreen()->GetCursorDrawPosition(); + // no temp copy -> the current version of component will be used for Undo + // This is normal when adding new items to the current component + ClearTempCopyComponent(); + switch( m_ID_current_state ) { case ID_LIBEDIT_BODY_ARC_BUTT: @@ -156,12 +160,12 @@ LIB_DRAW_ITEM* WinEDA_LibeditFrame::CreateGraphicItem( LIB_COMPONENT* LibEntry, // Enter the graphic text info DrawPanel->m_IgnoreMouseEvents = true; EditSymbolText( NULL, Text ); - DrawPanel->MouseToCursorSchema(); DrawPanel->m_IgnoreMouseEvents = false; + DrawPanel->MouseToCursorSchema(); if( Text->m_Text.IsEmpty() ) { - SAFE_DELETE( Text ); + delete Text; m_drawItem = NULL; } else @@ -186,7 +190,8 @@ LIB_DRAW_ITEM* WinEDA_LibeditFrame::CreateGraphicItem( LIB_COMPONENT* LibEntry, if( m_drawSpecificConvert ) m_drawItem->m_Convert = m_convert; - TempCopyComponent(); + // Draw initial symbol: + DrawPanel->ManageCurseur( DrawPanel, DC, false ); } else { @@ -282,13 +287,15 @@ static void SymbolDisplayDraw( WinEDA_DrawPanel* panel, wxDC* DC, bool erase ) if( item == NULL ) return; + item->SetEraseLastDrawItem( erase ); item->Draw( panel, DC, Screen->GetCursorDrawPosition(), -1, g_XorMode, NULL, DefaultTransform ); } /* - * Place the new graphic object in the list of component drawing objects. + * Place the new graphic object in the list of component drawing objects, + * or terminate a draw item edition */ void WinEDA_LibeditFrame::EndDrawGraphicItem( wxDC* DC ) { @@ -300,7 +307,11 @@ void WinEDA_LibeditFrame::EndDrawGraphicItem( wxDC* DC ) else SetCursor( wxCURSOR_ARROW ); - SaveCopyInUndoList( GetTempCopyComponent() ); + if( GetTempCopyComponent() ) // used when editing an existing item + SaveCopyInUndoList( GetTempCopyComponent() ); + else // When creating a new item, there is still no change for the current component + // So save it. + SaveCopyInUndoList( m_component ); if( m_drawItem->IsNew() ) m_component->AddDrawItem( m_drawItem ); diff --git a/eeschema/symbedit.cpp b/eeschema/symbedit.cpp index 9de5942cfa..de29bf5c07 100644 --- a/eeschema/symbedit.cpp +++ b/eeschema/symbedit.cpp @@ -236,5 +236,5 @@ void WinEDA_LibeditFrame::PlaceAncre() /* Redraw the symbol */ GetScreen()->m_Curseur.x = GetScreen()->m_Curseur.y = 0; Recadre_Trace( TRUE ); - GetScreen()->SetRefreshReq(); + DrawPanel->Refresh(); }