Libedit: fixed draw artefacts when editing a graphic symbol. fixed minor issues in undo and abort commands when editing graphic items.
This commit is contained in:
parent
0c24113dc0
commit
bd022c23a3
|
@ -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() )
|
||||
{
|
||||
|
|
|
@ -75,7 +75,6 @@ void WinEDA_LibeditFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos )
|
|||
}
|
||||
else
|
||||
{
|
||||
SaveCopyInUndoList( m_component );
|
||||
PlacePin( DC );
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue