More about undo/redo in pcbnew

This commit is contained in:
charras 2009-08-08 10:08:37 +00:00
parent 148a574e6f
commit 514de91ee3
6 changed files with 73 additions and 72 deletions

View File

@ -569,15 +569,6 @@ enum main_id {
ID_POPUP_PCB_SELECT_WIDTH6, ID_POPUP_PCB_SELECT_WIDTH6,
ID_POPUP_PCB_SELECT_WIDTH7, ID_POPUP_PCB_SELECT_WIDTH7,
ID_POPUP_PCB_SELECT_WIDTH8, ID_POPUP_PCB_SELECT_WIDTH8,
ID_POPUP_PCB_SELECT_VIASIZE,
ID_POPUP_PCB_SELECT_VIASIZE1,
ID_POPUP_PCB_SELECT_VIASIZE2,
ID_POPUP_PCB_SELECT_VIASIZE3,
ID_POPUP_PCB_SELECT_VIASIZE4,
ID_POPUP_PCB_SELECT_VIASIZE5,
ID_POPUP_PCB_SELECT_VIASIZE6,
ID_POPUP_PCB_SELECT_VIASIZE7,
ID_POPUP_PCB_SELECT_VIASIZE8,
ID_POPUP_PCB_EDIT_TRACKSEG, ID_POPUP_PCB_EDIT_TRACKSEG,
ID_POPUP_PCB_EDIT_TRACK_MNU, ID_POPUP_PCB_EDIT_TRACK_MNU,
ID_POPUP_PCB_EDIT_NET, ID_POPUP_PCB_EDIT_NET,
@ -613,13 +604,6 @@ enum main_id {
ID_POPUP_PCB_MOVE_TRACK_NODE, ID_POPUP_PCB_MOVE_TRACK_NODE,
ID_POPUP_PCB_BREAK_TRACK, ID_POPUP_PCB_BREAK_TRACK,
ID_POPUP_PCB_PLACE_MOVED_TRACK_NODE, ID_POPUP_PCB_PLACE_MOVED_TRACK_NODE,
ID_POPUP_PCB_VIA_EDITING,
ID_POPUP_PCB_VIA_HOLE_TO_DEFAULT,
ID_POPUP_PCB_VIA_HOLE_TO_VALUE,
ID_POPUP_PCB_VIA_HOLE_ENTER_VALUE,
ID_POPUP_PCB_VIA_HOLE_EXPORT,
ID_POPUP_PCB_VIA_HOLE_RESET_TO_DEFAULT,
ID_POPUP_PCB_VIA_HOLE_EXPORT_TO_OTHERS,
ID_POPUP_PCB_DRAG_TRACK_SEGMENT_KEEP_SLOPE, ID_POPUP_PCB_DRAG_TRACK_SEGMENT_KEEP_SLOPE,
ID_POPUP_PCB_DRAG_TRACK_SEGMENT, ID_POPUP_PCB_DRAG_TRACK_SEGMENT,
ID_POPUP_PCB_MOVE_TRACK_SEGMENT, ID_POPUP_PCB_MOVE_TRACK_SEGMENT,
@ -630,6 +614,26 @@ enum main_id {
ID_POPUP_PCB_UNUSED8, ID_POPUP_PCB_UNUSED8,
ID_POPUP_PCB_END_RANGE, ID_POPUP_PCB_END_RANGE,
// Via edition
ID_POPUP_VIA_EDIT_START_RANGE,
ID_POPUP_PCB_SELECT_VIASIZE,
ID_POPUP_PCB_SELECT_VIASIZE1,
ID_POPUP_PCB_SELECT_VIASIZE2,
ID_POPUP_PCB_SELECT_VIASIZE3,
ID_POPUP_PCB_SELECT_VIASIZE4,
ID_POPUP_PCB_SELECT_VIASIZE5,
ID_POPUP_PCB_SELECT_VIASIZE6,
ID_POPUP_PCB_SELECT_VIASIZE7,
ID_POPUP_PCB_SELECT_VIASIZE8,
ID_POPUP_PCB_VIA_EDITING,
ID_POPUP_PCB_VIA_HOLE_TO_DEFAULT,
ID_POPUP_PCB_VIA_HOLE_TO_VALUE,
ID_POPUP_PCB_VIA_HOLE_ENTER_VALUE,
ID_POPUP_PCB_VIA_HOLE_EXPORT,
ID_POPUP_PCB_VIA_HOLE_RESET_TO_DEFAULT,
ID_POPUP_PCB_VIA_HOLE_EXPORT_TO_OTHERS,
ID_POPUP_VIA_EDIT_END_RANGE,
// reserve a block of MAX_ITEMS_IN_PICKER ids for the item selection popup // reserve a block of MAX_ITEMS_IN_PICKER ids for the item selection popup
ID_POPUP_PCB_ITEM_SELECTION_START, ID_POPUP_PCB_ITEM_SELECTION_START,
ID_POPUP_PCB_ITEM_SELECTION_END = MAX_ITEMS_IN_PICKER + ID_POPUP_PCB_ITEM_SELECTION_START, ID_POPUP_PCB_ITEM_SELECTION_END = MAX_ITEMS_IN_PICKER + ID_POPUP_PCB_ITEM_SELECTION_START,

View File

@ -356,13 +356,13 @@ public:
// Board handling // Board handling
void RemoveStruct( BOARD_ITEM* Item, wxDC* DC ); void RemoveStruct( BOARD_ITEM* Item, wxDC* DC );
void Via_Edit_Control( wxDC* DC, int command_type, SEGVIA* via );
// Hightlight functions: // Hightlight functions:
int Select_High_Light( wxDC* DC ); int Select_High_Light( wxDC* DC );
void Hight_Light( wxDC* DC ); void Hight_Light( wxDC* DC );
// Track and via edition: // Track and via edition:
void Via_Edit_Control( wxCommandEvent& event );
void DisplayTrackSettings(); void DisplayTrackSettings();
/** /**

View File

@ -164,11 +164,20 @@ void SwapData( BOARD_ITEM* aItem, BOARD_ITEM* aImage )
case TYPE_TRACK: case TYPE_TRACK:
case TYPE_VIA: case TYPE_VIA:
case TYPE_ZONE:
EXCHG( ( (TRACK*) aItem )->m_Start, ( (TRACK*) aImage )->m_Start ); EXCHG( ( (TRACK*) aItem )->m_Start, ( (TRACK*) aImage )->m_Start );
EXCHG( ( (TRACK*) aItem )->m_End, ( (TRACK*) aImage )->m_End ); EXCHG( ( (TRACK*) aItem )->m_End, ( (TRACK*) aImage )->m_End );
EXCHG( ( (TRACK*) aItem )->m_Width, ( (TRACK*) aImage )->m_Width ); EXCHG( ( (TRACK*) aItem )->m_Width, ( (TRACK*) aImage )->m_Width );
EXCHG( ( (TRACK*) aItem )->m_Shape, ( (TRACK*) aImage )->m_Shape ); EXCHG( ( (TRACK*) aItem )->m_Shape, ( (TRACK*) aImage )->m_Shape );
{
int itmp = ((TRACK*) aItem )->GetDrillValue();
if( ((TRACK*) aItem )->IsDrillDefault() )
itmp = -1;
int atmp = ((TRACK*) aImage )->GetDrillValue();
if( ((TRACK*) aImage )->IsDrillDefault() )
atmp = -1;
( (TRACK*) aItem )->SetDrillValue( atmp );
( (TRACK*) aImage )->SetDrillValue(itmp);
}
break; break;
case TYPE_TEXTE: case TYPE_TEXTE:
@ -202,6 +211,7 @@ void SwapData( BOARD_ITEM* aItem, BOARD_ITEM* aImage )
} }
break; break;
case TYPE_ZONE:
default: default:
wxMessageBox( wxT( "SwapData() error: unexpected type" ) ); wxMessageBox( wxT( "SwapData() error: unexpected type" ) );
break; break;

View File

@ -104,15 +104,6 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
case ID_POPUP_PCB_SELECT_WIDTH6: case ID_POPUP_PCB_SELECT_WIDTH6:
case ID_POPUP_PCB_SELECT_WIDTH7: case ID_POPUP_PCB_SELECT_WIDTH7:
case ID_POPUP_PCB_SELECT_WIDTH8: case ID_POPUP_PCB_SELECT_WIDTH8:
case ID_POPUP_PCB_SELECT_VIASIZE:
case ID_POPUP_PCB_SELECT_VIASIZE1:
case ID_POPUP_PCB_SELECT_VIASIZE2:
case ID_POPUP_PCB_SELECT_VIASIZE3:
case ID_POPUP_PCB_SELECT_VIASIZE4:
case ID_POPUP_PCB_SELECT_VIASIZE5:
case ID_POPUP_PCB_SELECT_VIASIZE6:
case ID_POPUP_PCB_SELECT_VIASIZE7:
case ID_POPUP_PCB_SELECT_VIASIZE8:
case ID_POPUP_PCB_MOVE_TRACK_NODE: case ID_POPUP_PCB_MOVE_TRACK_NODE:
case ID_POPUP_PCB_DRAG_TRACK_SEGMENT_KEEP_SLOPE: case ID_POPUP_PCB_DRAG_TRACK_SEGMENT_KEEP_SLOPE:
case ID_POPUP_PCB_DRAG_TRACK_SEGMENT: case ID_POPUP_PCB_DRAG_TRACK_SEGMENT:
@ -135,12 +126,6 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
case ID_POPUP_ROTATE_BLOCK: case ID_POPUP_ROTATE_BLOCK:
case ID_POPUP_COPY_BLOCK: case ID_POPUP_COPY_BLOCK:
case ID_POPUP_PCB_VIA_EDITING: case ID_POPUP_PCB_VIA_EDITING:
case ID_POPUP_PCB_VIA_HOLE_TO_DEFAULT:
case ID_POPUP_PCB_VIA_HOLE_TO_VALUE:
case ID_POPUP_PCB_VIA_HOLE_ENTER_VALUE:
case ID_POPUP_PCB_VIA_HOLE_EXPORT:
case ID_POPUP_PCB_VIA_HOLE_RESET_TO_DEFAULT:
case ID_POPUP_PCB_VIA_HOLE_EXPORT_TO_OTHERS:
case ID_POPUP_PCB_EDIT_DRAWING: case ID_POPUP_PCB_EDIT_DRAWING:
case ID_POPUP_PCB_GETINFO_MARKER: case ID_POPUP_PCB_GETINFO_MARKER:
break; break;
@ -1058,9 +1043,6 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
g_DesignSettings.m_UseConnectedTrackWidth = true; g_DesignSettings.m_UseConnectedTrackWidth = true;
break; break;
case ID_POPUP_PCB_SELECT_VIASIZE:
break;
case ID_AUX_TOOLBAR_PCB_VIA_SIZE: case ID_AUX_TOOLBAR_PCB_VIA_SIZE:
{ {
int ii = m_SelViaSizeBox->GetChoice(); int ii = m_SelViaSizeBox->GetChoice();
@ -1072,24 +1054,6 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
} }
break; break;
case ID_POPUP_PCB_SELECT_VIASIZE1:
case ID_POPUP_PCB_SELECT_VIASIZE2:
case ID_POPUP_PCB_SELECT_VIASIZE3:
case ID_POPUP_PCB_SELECT_VIASIZE4:
case ID_POPUP_PCB_SELECT_VIASIZE5:
case ID_POPUP_PCB_SELECT_VIASIZE6:
case ID_POPUP_PCB_SELECT_VIASIZE7:
case ID_POPUP_PCB_SELECT_VIASIZE8:
case ID_POPUP_PCB_VIA_EDITING:
case ID_POPUP_PCB_VIA_HOLE_TO_DEFAULT:
case ID_POPUP_PCB_VIA_HOLE_TO_VALUE:
case ID_POPUP_PCB_VIA_HOLE_ENTER_VALUE:
case ID_POPUP_PCB_VIA_HOLE_EXPORT:
case ID_POPUP_PCB_VIA_HOLE_RESET_TO_DEFAULT:
case ID_POPUP_PCB_VIA_HOLE_EXPORT_TO_OTHERS:
Via_Edit_Control( &dc, id, (SEGVIA*) GetScreen()->GetCurItem() );
break;
case ID_POPUP_PCB_MOVE_TRACK_SEGMENT: case ID_POPUP_PCB_MOVE_TRACK_SEGMENT:
DrawPanel->MouseToCursorSchema(); DrawPanel->MouseToCursorSchema();
Start_MoveOneNodeOrSegment( (TRACK*) GetScreen()->GetCurItem(), Start_MoveOneNodeOrSegment( (TRACK*) GetScreen()->GetCurItem(),

View File

@ -194,10 +194,13 @@ BEGIN_EVENT_TABLE( WinEDA_PcbFrame, WinEDA_BasePcbFrame )
EVT_MENU_RANGE( ID_POPUP_PCB_START_RANGE, ID_POPUP_PCB_END_RANGE, EVT_MENU_RANGE( ID_POPUP_PCB_START_RANGE, ID_POPUP_PCB_END_RANGE,
WinEDA_PcbFrame::Process_Special_Functions ) WinEDA_PcbFrame::Process_Special_Functions )
// Annulation de commande en cours // popup menus
EVT_MENU_RANGE( ID_POPUP_GENERAL_START_RANGE, ID_POPUP_GENERAL_END_RANGE, EVT_MENU_RANGE( ID_POPUP_GENERAL_START_RANGE, ID_POPUP_GENERAL_END_RANGE,
WinEDA_PcbFrame::Process_Special_Functions ) WinEDA_PcbFrame::Process_Special_Functions )
EVT_MENU_RANGE( ID_POPUP_VIA_EDIT_START_RANGE, ID_POPUP_VIA_EDIT_END_RANGE,
WinEDA_PcbFrame::Via_Edit_Control )
// PopUp Menus pour Zooms traites dans drawpanel.cpp // PopUp Menus pour Zooms traites dans drawpanel.cpp
END_EVENT_TABLE() END_EVENT_TABLE()

View File

@ -1,5 +1,5 @@
/**********************************************/ /**********************************************/
/* vi_edit.cpp: som editing function for vias */ /* vi_edit.cpp: some editing function for vias */
/**********************************************/ /**********************************************/
#include "fctsys.h" #include "fctsys.h"
@ -12,7 +12,7 @@
/**********************************************************************************/ /**********************************************************************************/
void WinEDA_PcbFrame::Via_Edit_Control( wxDC* DC, int command_type, SEGVIA* via ) void WinEDA_PcbFrame::Via_Edit_Control( wxCommandEvent& event )
/**********************************************************************************/ /**********************************************************************************/
/* /*
@ -21,8 +21,17 @@ void WinEDA_PcbFrame::Via_Edit_Control( wxDC* DC, int command_type, SEGVIA* via
{ {
int ii; int ii;
TRACK* via_struct; TRACK* via_struct;
SEGVIA* via = (SEGVIA*) GetCurItem();
wxClientDC dc( DrawPanel );
DrawPanel->CursorOff( &dc );
DrawPanel->PrepareGraphicContext( &dc );
switch( command_type ) wxASSERT( via->Type() == TYPE_VIA);
PICKED_ITEMS_LIST itemsListPicker;
ITEM_PICKER picker( NULL, UR_CHANGED );
switch( event.GetId() )
{ {
case ID_POPUP_PCB_SELECT_VIASIZE1: case ID_POPUP_PCB_SELECT_VIASIZE1:
case ID_POPUP_PCB_SELECT_VIASIZE2: case ID_POPUP_PCB_SELECT_VIASIZE2:
@ -33,21 +42,22 @@ void WinEDA_PcbFrame::Via_Edit_Control( wxDC* DC, int command_type, SEGVIA* via
case ID_POPUP_PCB_SELECT_VIASIZE7: case ID_POPUP_PCB_SELECT_VIASIZE7:
case ID_POPUP_PCB_SELECT_VIASIZE8: // selec the new current value for via size (via diameter) case ID_POPUP_PCB_SELECT_VIASIZE8: // selec the new current value for via size (via diameter)
DrawPanel->MouseToCursorSchema(); DrawPanel->MouseToCursorSchema();
ii = command_type - ID_POPUP_PCB_SELECT_VIASIZE1; ii = event.GetId() - ID_POPUP_PCB_SELECT_VIASIZE1;
g_DesignSettings.m_CurrentViaSize = g_DesignSettings.m_ViaSizeHistory[ii]; g_DesignSettings.m_CurrentViaSize = g_DesignSettings.m_ViaSizeHistory[ii];
DisplayTrackSettings(); DisplayTrackSettings();
break; break;
case ID_POPUP_PCB_VIA_HOLE_ENTER_VALUE: // Enter a new alternate value for drill via case ID_POPUP_PCB_VIA_HOLE_ENTER_VALUE: // Enter a new alternate value for drill via
InstallPcbOptionsFrame( wxDefaultPosition, DC, ID_PCB_TRACK_SIZE_SETUP ); InstallPcbOptionsFrame( wxDefaultPosition, &dc, ID_PCB_TRACK_SIZE_SETUP );
DrawPanel->MouseToCursorSchema(); DrawPanel->MouseToCursorSchema();
case ID_POPUP_PCB_VIA_HOLE_TO_VALUE: // Set the drill via to custom case ID_POPUP_PCB_VIA_HOLE_TO_VALUE: // Set the drill via to custom
if( (g_DesignSettings.m_ViaDrillCustomValue > 0) && (g_DesignSettings.m_ViaDrillCustomValue < via->m_Width) ) if( (g_DesignSettings.m_ViaDrillCustomValue > 0) && (g_DesignSettings.m_ViaDrillCustomValue < via->m_Width) )
{ {
via->Draw( DrawPanel, DC, GR_XOR ); SaveCopyInUndoList(via, UR_CHANGED);
via->Draw( DrawPanel, &dc, GR_XOR );
via->SetDrillValue( g_DesignSettings.m_ViaDrillCustomValue ); via->SetDrillValue( g_DesignSettings.m_ViaDrillCustomValue );
via->Draw( DrawPanel, DC, GR_OR ); via->Draw( DrawPanel, &dc, GR_OR );
GetScreen()->SetModify(); GetScreen()->SetModify();
} }
else else
@ -70,19 +80,24 @@ void WinEDA_PcbFrame::Via_Edit_Control( wxDC* DC, int command_type, SEGVIA* via
{ {
if( via_struct->m_Width != via->m_Width ) if( via_struct->m_Width != via->m_Width )
continue; continue;
via_struct->Draw( DrawPanel, DC, GR_XOR ); picker.m_PickedItem = via_struct;
picker.m_Link = via_struct->Copy();
itemsListPicker.PushItem(picker);
via_struct->Draw( DrawPanel, &dc, GR_XOR );
via_struct->SetDrillValue( via->GetDrillValue() ); via_struct->SetDrillValue( via->GetDrillValue() );
via_struct->Draw( DrawPanel, DC, GR_OR ); via_struct->Draw( DrawPanel, &dc, GR_OR );
} }
} }
SaveCopyInUndoList(itemsListPicker, UR_CHANGED);
GetScreen()->SetModify(); GetScreen()->SetModify();
break; break;
case ID_POPUP_PCB_VIA_HOLE_TO_DEFAULT: case ID_POPUP_PCB_VIA_HOLE_TO_DEFAULT:
via->Draw( DrawPanel, DC, GR_XOR ); SaveCopyInUndoList(via, UR_CHANGED);
via->Draw( DrawPanel, &dc, GR_XOR );
via->SetDrillDefault(); via->SetDrillDefault();
via->Draw( DrawPanel, DC, GR_OR ); via->Draw( DrawPanel, &dc, GR_OR );
GetScreen()->SetModify(); GetScreen()->SetModify();
break; break;
@ -94,12 +109,16 @@ void WinEDA_PcbFrame::Via_Edit_Control( wxDC* DC, int command_type, SEGVIA* via
{ {
if( ! via_struct->IsDrillDefault() ) if( ! via_struct->IsDrillDefault() )
{ {
via_struct->Draw( DrawPanel, DC, GR_XOR ); picker.m_PickedItem = via_struct;
picker.m_Link = via_struct->Copy();
itemsListPicker.PushItem(picker);
via_struct->Draw( DrawPanel, &dc, GR_XOR );
via_struct->SetDrillDefault(); via_struct->SetDrillDefault();
via_struct->Draw( DrawPanel, DC, GR_OR ); via_struct->Draw( DrawPanel, &dc, GR_OR );
} }
} }
} }
SaveCopyInUndoList(itemsListPicker, UR_CHANGED);
GetScreen()->SetModify(); GetScreen()->SetModify();
break; break;
@ -109,5 +128,6 @@ void WinEDA_PcbFrame::Via_Edit_Control( wxDC* DC, int command_type, SEGVIA* via
break; break;
} }
DrawPanel->CursorOn( &dc );
DrawPanel->MouseToCursorSchema(); DrawPanel->MouseToCursorSchema();
} }