Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
K
kicad-source-mirror
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
kicad-source-mirror
Commits
c7187652
Commit
c7187652
authored
Aug 06, 2009
by
charras
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
More about undo/redo in pcbnew
parent
5699ee3b
Changes
12
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
258 additions
and
294 deletions
+258
-294
class_undoredo_container.cpp
common/class_undoredo_container.cpp
+4
-10
schematic_undo_redo.cpp
eeschema/schematic_undo_redo.cpp
+18
-17
class_undoredo_container.h
include/class_undoredo_container.h
+3
-3
wxBasePcbFrame.h
include/wxBasePcbFrame.h
+0
-3
wxPcbStruct.h
include/wxPcbStruct.h
+14
-6
block.cpp
pcbnew/block.cpp
+41
-18
board_undo_redo.cpp
pcbnew/board_undo_redo.cpp
+37
-30
dialog_edit_module.cpp
pcbnew/dialog_edit_module.cpp
+8
-0
editedge.cpp
pcbnew/editedge.cpp
+25
-18
initpcb.cpp
pcbnew/initpcb.cpp
+105
-186
modedit.cpp
pcbnew/modedit.cpp
+2
-2
modules.cpp
pcbnew/modules.cpp
+1
-1
No files found.
common/class_undoredo_container.cpp
View file @
c7187652
...
@@ -292,12 +292,12 @@ bool PICKED_ITEMS_LIST::SetPickedItemStatus( UndoRedoOpType aStatus, unsigned aI
...
@@ -292,12 +292,12 @@ bool PICKED_ITEMS_LIST::SetPickedItemStatus( UndoRedoOpType aStatus, unsigned aI
}
}
/** function RemovePicke
dItem
/** function RemovePicke
r
* remove one entry (one picker) from the list of picked items
* remove one entry (one picker) from the list of picked items
* @param aIdx = index of the picker in the picked list
* @param aIdx = index of the picker in the picked list
* @return true if ok, or false if did not exist
* @return true if ok, or false if did not exist
*/
*/
bool
PICKED_ITEMS_LIST
::
RemovePicke
dItem
(
unsigned
aIdx
)
bool
PICKED_ITEMS_LIST
::
RemovePicke
r
(
unsigned
aIdx
)
{
{
if
(
aIdx
>=
m_ItemsList
.
size
()
)
if
(
aIdx
>=
m_ItemsList
.
size
()
)
return
false
;
return
false
;
...
@@ -308,17 +308,11 @@ bool PICKED_ITEMS_LIST::RemovePickedItem( unsigned aIdx )
...
@@ -308,17 +308,11 @@ bool PICKED_ITEMS_LIST::RemovePickedItem( unsigned aIdx )
/** Function CopyList
/** Function CopyList
* copy all data from aSource
* copy all data from aSource
*
Items picked are not copied. just pointer
on them are copied
*
Picked items are not copied. just pointers
on them are copied
*/
*/
void
PICKED_ITEMS_LIST
::
CopyList
(
const
PICKED_ITEMS_LIST
&
aSource
)
void
PICKED_ITEMS_LIST
::
CopyList
(
const
PICKED_ITEMS_LIST
&
aSource
)
{
{
ITEM_PICKER
picker
;
m_ItemsList
=
aSource
.
m_ItemsList
;
// Vector's copy
for
(
unsigned
ii
=
0
;
ii
<
aSource
.
GetCount
();
ii
++
)
{
picker
=
aSource
.
m_ItemsList
[
ii
];
PushItem
(
picker
);
}
}
}
...
...
eeschema/schematic_undo_redo.cpp
View file @
c7187652
...
@@ -274,37 +274,38 @@ void WinEDA_SchematicFrame::SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList,
...
@@ -274,37 +274,38 @@ void WinEDA_SchematicFrame::SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList,
SCH_ITEM
*
CopyOfItem
;
SCH_ITEM
*
CopyOfItem
;
PICKED_ITEMS_LIST
*
commandToUndo
=
new
PICKED_ITEMS_LIST
();
PICKED_ITEMS_LIST
*
commandToUndo
=
new
PICKED_ITEMS_LIST
();
commandToUndo
->
m_TransformPoint
=
aTransformPoint
;
commandToUndo
->
m_TransformPoint
=
aTransformPoint
;
// Copy picker list:
commandToUndo
->
CopyList
(
aItemsList
);
ITEM_PICKER
itemWrapper
;
// Verify list, and creates data if needed
for
(
unsigned
ii
=
0
;
ii
<
commandToUndo
->
GetCount
();
ii
++
)
for
(
unsigned
ii
=
0
;
ii
<
aItemsList
.
GetCount
();
ii
++
)
{
{
SCH_ITEM
*
item
=
(
SCH_ITEM
*
)
aItemsList
.
GetPickedItem
(
ii
);
SCH_ITEM
*
item
=
(
SCH_ITEM
*
)
commandToUndo
->
GetPickedItem
(
ii
);
if
(
item
==
NULL
)
wxASSERT
(
item
);
continue
;
UndoRedoOpType
command
=
aItemsList
.
GetPickedItemStatus
(
ii
);
UndoRedoOpType
command
=
commandToUndo
->
GetPickedItemStatus
(
ii
);
if
(
command
==
UR_UNSPECIFIED
)
if
(
command
==
UR_UNSPECIFIED
)
{
{
command
=
aTypeCommand
;
command
=
aTypeCommand
;
commandToUndo
->
SetPickedItemStatus
(
command
,
ii
);
}
}
itemWrapper
.
m_PickedItem
=
item
;
itemWrapper
.
m_PickedItemType
=
item
->
Type
();
itemWrapper
.
m_UndoRedoStatus
=
command
;
itemWrapper
.
m_Link
=
aItemsList
.
GetPickedItemLink
(
ii
);
switch
(
command
)
switch
(
command
)
{
{
case
UR_CHANGED
:
/* Create a copy of item */
case
UR_CHANGED
:
/* Create a copy of item */
if
(
itemWrapper
.
m_Link
==
NULL
)
/* If needed, create a copy of item, and put in undo list
itemWrapper
.
m_Link
=
DuplicateStruct
(
item
);
* in the picker, as link
if
(
itemWrapper
.
m_Link
)
* If this link is not null, the copy is already done
commandToUndo
->
PushItem
(
itemWrapper
);
*/
if
(
commandToUndo
->
GetPickedItemLink
(
ii
)
==
NULL
)
commandToUndo
->
SetPickedItemLink
(
DuplicateStruct
(
item
),
ii
);
wxASSERT
(
commandToUndo
->
GetPickedItemLink
(
ii
)
);
break
;
break
;
case
UR_MOVED
:
case
UR_MOVED
:
case
UR_MIRRORED_Y
:
case
UR_MIRRORED_Y
:
case
UR_NEW
:
case
UR_NEW
:
case
UR_DELETED
:
case
UR_DELETED
:
commandToUndo
->
PushItem
(
itemWrapper
);
break
;
break
;
default
:
default
:
...
@@ -325,7 +326,7 @@ void WinEDA_SchematicFrame::SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList,
...
@@ -325,7 +326,7 @@ void WinEDA_SchematicFrame::SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList,
/* Clear redo list, because after new save there is no redo to do */
/* Clear redo list, because after new save there is no redo to do */
GetScreen
()
->
ClearUndoORRedoList
(
GetScreen
()
->
m_RedoList
);
GetScreen
()
->
ClearUndoORRedoList
(
GetScreen
()
->
m_RedoList
);
}
}
else
else
// Should not occur
delete
commandToUndo
;
delete
commandToUndo
;
}
}
...
...
include/class_undoredo_container.h
View file @
c7187652
...
@@ -196,12 +196,12 @@ public:
...
@@ -196,12 +196,12 @@ public:
*/
*/
bool
SetPickedItemStatus
(
UndoRedoOpType
aStatus
,
unsigned
aIdx
);
bool
SetPickedItemStatus
(
UndoRedoOpType
aStatus
,
unsigned
aIdx
);
/** function RemovePicke
dItem
/** function RemovePicke
r
* remùove one entry (one picker) from the list of picked items
* remove one entry (one picker) from the list of picked items
* @param aIdx = index of the picker in the picked list
* @param aIdx = index of the picker in the picked list
* @return true if ok, or false if did not exist
* @return true if ok, or false if did not exist
*/
*/
bool
RemovePicke
dItem
(
unsigned
aIdx
);
bool
RemovePicke
r
(
unsigned
aIdx
);
/** Function CopyList
/** Function CopyList
* copy all data from aSource
* copy all data from aSource
...
...
include/wxBasePcbFrame.h
View file @
c7187652
...
@@ -121,9 +121,6 @@ public:
...
@@ -121,9 +121,6 @@ public:
int
ReadSetup
(
FILE
*
File
,
int
*
LineNum
);
int
ReadSetup
(
FILE
*
File
,
int
*
LineNum
);
int
ReadGeneralDescrPcb
(
FILE
*
File
,
int
*
LineNum
);
int
ReadGeneralDescrPcb
(
FILE
*
File
,
int
*
LineNum
);
// PCB handling
bool
Clear_Pcb
(
bool
query
);
/**
/**
* Function PcbGeneralLocateAndDisplay
* Function PcbGeneralLocateAndDisplay
...
...
include/wxPcbStruct.h
View file @
c7187652
...
@@ -254,6 +254,13 @@ public:
...
@@ -254,6 +254,13 @@ public:
int
SavePcbFormatAscii
(
FILE
*
File
);
int
SavePcbFormatAscii
(
FILE
*
File
);
bool
WriteGeneralDescrPcb
(
FILE
*
File
);
bool
WriteGeneralDescrPcb
(
FILE
*
File
);
// BOARD handling
/** function Clear_Pcb()
* delete all and reinitialize the current board
* @param aQuery = true to prompt user for confirmation, false to initialize silently
*/
bool
Clear_Pcb
(
bool
aQuery
);
/**
/**
* Function RecreateBOMFileFromBoard
* Function RecreateBOMFileFromBoard
* Recreates a .cmp file from the current loaded board
* Recreates a .cmp file from the current loaded board
...
@@ -348,12 +355,6 @@ public:
...
@@ -348,12 +355,6 @@ public:
// loading modules: see WinEDA_BasePcbFrame
// loading modules: see WinEDA_BasePcbFrame
// Board handling
// Board handling
void
Erase_Zones
(
bool
query
);
void
Erase_Segments_Pcb
(
bool
is_edges
,
bool
query
);
void
Erase_Pistes
(
wxDC
*
DC
,
int
masque_type
,
bool
query
);
void
Erase_Modules
(
bool
query
);
void
Erase_Textes_Pcb
(
bool
query
);
void
Erase_Marqueurs
();
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
);
void
Via_Edit_Control
(
wxDC
*
DC
,
int
command_type
,
SEGVIA
*
via
);
...
@@ -655,6 +656,13 @@ public:
...
@@ -655,6 +656,13 @@ public:
virtual
void
OnSelectGrid
(
wxCommandEvent
&
event
);
virtual
void
OnSelectGrid
(
wxCommandEvent
&
event
);
void
LoadModuleFromBoard
(
wxCommandEvent
&
event
);
void
LoadModuleFromBoard
(
wxCommandEvent
&
event
);
// BOARD handling
/** function Clear_Pcb()
* delete all and reinitialize the current board
* @param aQuery = true to prompt user for confirmation, false to initialize silently
*/
bool
Clear_Pcb
(
bool
aQuery
);
/* handlers for block commands */
/* handlers for block commands */
int
ReturnBlockCommand
(
int
key
);
int
ReturnBlockCommand
(
int
key
);
virtual
void
HandleBlockPlace
(
wxDC
*
DC
);
virtual
void
HandleBlockPlace
(
wxDC
*
DC
);
...
...
pcbnew/block.cpp
View file @
c7187652
...
@@ -417,7 +417,6 @@ int WinEDA_PcbFrame::HandleBlockEnd( wxDC* DC )
...
@@ -417,7 +417,6 @@ int WinEDA_PcbFrame::HandleBlockEnd( wxDC* DC )
*/
*/
void
WinEDA_PcbFrame
::
Block_SelectItems
()
void
WinEDA_PcbFrame
::
Block_SelectItems
()
{
{
BOARD_ITEM
*
PtStruct
;
int
masque_layer
;
int
masque_layer
;
GetScreen
()
->
m_BlockLocate
.
Normalize
();
GetScreen
()
->
m_BlockLocate
.
Normalize
();
...
@@ -428,7 +427,6 @@ void WinEDA_PcbFrame::Block_SelectItems()
...
@@ -428,7 +427,6 @@ void WinEDA_PcbFrame::Block_SelectItems()
/* Effacement des modules */
/* Effacement des modules */
if
(
Block_Include_Modules
)
if
(
Block_Include_Modules
)
{
{
;
for
(
MODULE
*
module
=
m_Pcb
->
m_Modules
;
module
!=
NULL
;
module
=
module
->
Next
()
)
for
(
MODULE
*
module
=
m_Pcb
->
m_Modules
;
module
!=
NULL
;
module
=
module
->
Next
()
)
{
{
if
(
module
->
HitTest
(
GetScreen
()
->
m_BlockLocate
)
)
if
(
module
->
HitTest
(
GetScreen
()
->
m_BlockLocate
)
)
...
@@ -463,7 +461,7 @@ void WinEDA_PcbFrame::Block_SelectItems()
...
@@ -463,7 +461,7 @@ void WinEDA_PcbFrame::Block_SelectItems()
if
(
!
Block_Include_Edges_Items
)
if
(
!
Block_Include_Edges_Items
)
masque_layer
&=
~
EDGE_LAYER
;
masque_layer
&=
~
EDGE_LAYER
;
for
(
PtStruct
=
m_Pcb
->
m_Drawings
;
PtStruct
!=
NULL
;
PtStruct
=
PtStruct
->
Next
()
)
for
(
BOARD_ITEM
*
PtStruct
=
m_Pcb
->
m_Drawings
;
PtStruct
!=
NULL
;
PtStruct
=
PtStruct
->
Next
()
)
{
{
bool
select_me
=
false
;
bool
select_me
=
false
;
switch
(
PtStruct
->
Type
()
)
switch
(
PtStruct
->
Type
()
)
...
@@ -512,19 +510,25 @@ void WinEDA_PcbFrame::Block_SelectItems()
...
@@ -512,19 +510,25 @@ void WinEDA_PcbFrame::Block_SelectItems()
}
}
}
}
/*
Effacement des Zones
*/
/*
Zone selection
*/
if
(
Block_Include_Zones
)
if
(
Block_Include_Zones
)
{
{
#if 0
/* This section can creates problems if selected:
* m_Pcb->m_Zone can have a *lot* of items (100 000 is easily possible)
* so it is not selected (and TODO: will be removed, one day)
*/
for( SEGZONE* pt_segm = m_Pcb->m_Zone; pt_segm != NULL; pt_segm = pt_segm->Next() )
for( SEGZONE* pt_segm = m_Pcb->m_Zone; pt_segm != NULL; pt_segm = pt_segm->Next() )
{
{ /* Segments used in Zone filling selection */
if( pt_segm->HitTest( GetScreen()->m_BlockLocate ) )
if( pt_segm->HitTest( GetScreen()->m_BlockLocate ) )
{
{
picker
.
m_PickedItem
=
PtStruct
;
picker.m_PickedItem =
pt_segm
;
picker
.
m_PickedItemType
=
PtStruct
->
Type
();
picker.m_PickedItemType =
pt_segm
->Type();
itemsList->PushItem( picker );
itemsList->PushItem( picker );
}
}
}
}
#endif
for
(
int
ii
=
0
;
ii
<
m_Pcb
->
GetAreaCount
();
ii
++
)
for
(
int
ii
=
0
;
ii
<
m_Pcb
->
GetAreaCount
();
ii
++
)
{
{
if
(
m_Pcb
->
GetArea
(
ii
)
->
HitTest
(
GetScreen
()
->
m_BlockLocate
)
)
if
(
m_Pcb
->
GetArea
(
ii
)
->
HitTest
(
GetScreen
()
->
m_BlockLocate
)
)
...
@@ -536,7 +540,7 @@ void WinEDA_PcbFrame::Block_SelectItems()
...
@@ -536,7 +540,7 @@ void WinEDA_PcbFrame::Block_SelectItems()
}
}
}
}
}
}
}
}
/**************************************************************************/
/**************************************************************************/
...
@@ -630,13 +634,20 @@ void WinEDA_PcbFrame::Block_Delete()
...
@@ -630,13 +634,20 @@ void WinEDA_PcbFrame::Block_Delete()
case
TYPE_TEXTE
:
// a text on a layer
case
TYPE_TEXTE
:
// a text on a layer
case
TYPE_TRACK
:
// a track segment (segment on a copper layer)
case
TYPE_TRACK
:
// a track segment (segment on a copper layer)
case
TYPE_VIA
:
// a via (like atrack segment on a copper layer)
case
TYPE_VIA
:
// a via (like atrack segment on a copper layer)
case
TYPE_ZONE
:
// a segment used to fill a zome area (segment on a copper layer)
case
TYPE_MARKER_PCB
:
// a marker used to show something
case
TYPE_COTATION
:
// a dimension (graphic item)
case
TYPE_COTATION
:
// a dimension (graphic item)
case
TYPE_MIRE
:
// a target (graphic item)
case
TYPE_MIRE
:
// a target (graphic item)
item
->
UnLink
();
item
->
UnLink
();
break
;
break
;
// These items are deleted, but not put in undo list
case
TYPE_MARKER_PCB
:
// a marker used to show something
case
TYPE_ZONE
:
// a segment used to fill a zome area (segment on a copper layer)
item
->
UnLink
();
itemsList
->
RemovePicker
(
ii
);
ii
--
;
item
->
DeleteStructure
();
break
;
default
:
default
:
wxMessageBox
(
wxT
(
"WinEDA_PcbFrame::Block_Delete( ) error: unexpected type"
)
);
wxMessageBox
(
wxT
(
"WinEDA_PcbFrame::Block_Delete( ) error: unexpected type"
)
);
break
;
break
;
...
@@ -696,7 +707,6 @@ void WinEDA_PcbFrame::Block_Rotate()
...
@@ -696,7 +707,6 @@ void WinEDA_PcbFrame::Block_Rotate()
m_Pcb
->
m_Status_Pcb
=
0
;
m_Pcb
->
m_Status_Pcb
=
0
;
break
;
break
;
case
TYPE_ZONE
:
// a segment used to fill a zone area (segment on a copper layer)
case
TYPE_ZONE_CONTAINER
:
case
TYPE_ZONE_CONTAINER
:
case
TYPE_DRAWSEGMENT
:
case
TYPE_DRAWSEGMENT
:
case
TYPE_TEXTE
:
case
TYPE_TEXTE
:
...
@@ -704,6 +714,11 @@ void WinEDA_PcbFrame::Block_Rotate()
...
@@ -704,6 +714,11 @@ void WinEDA_PcbFrame::Block_Rotate()
case
TYPE_COTATION
:
case
TYPE_COTATION
:
break
;
break
;
// This item is not put in undo list
case
TYPE_ZONE
:
// a segment used to fill a zome area (segment on a copper layer)
itemsList
->
RemovePicker
(
ii
);
ii
--
;
break
;
default
:
default
:
wxMessageBox
(
wxT
(
"WinEDA_PcbFrame::Block_Rotate( ) error: unexpected type"
)
);
wxMessageBox
(
wxT
(
"WinEDA_PcbFrame::Block_Rotate( ) error: unexpected type"
)
);
...
@@ -763,7 +778,6 @@ void WinEDA_PcbFrame::Block_Flip()
...
@@ -763,7 +778,6 @@ void WinEDA_PcbFrame::Block_Flip()
m_Pcb
->
m_Status_Pcb
=
0
;
m_Pcb
->
m_Status_Pcb
=
0
;
break
;
break
;
case
TYPE_ZONE
:
// a segment used to fill a zone area (segment on a copper layer)
case
TYPE_ZONE_CONTAINER
:
case
TYPE_ZONE_CONTAINER
:
case
TYPE_DRAWSEGMENT
:
case
TYPE_DRAWSEGMENT
:
case
TYPE_TEXTE
:
case
TYPE_TEXTE
:
...
@@ -771,6 +785,12 @@ void WinEDA_PcbFrame::Block_Flip()
...
@@ -771,6 +785,12 @@ void WinEDA_PcbFrame::Block_Flip()
case
TYPE_COTATION
:
case
TYPE_COTATION
:
break
;
break
;
// This item is not put in undo list
case
TYPE_ZONE
:
// a segment used to fill a zome area (segment on a copper layer)
itemsList
->
RemovePicker
(
ii
);
ii
--
;
break
;
default
:
default
:
wxMessageBox
(
wxT
(
"WinEDA_PcbFrame::Block_Flip( ) error: unexpected type"
)
);
wxMessageBox
(
wxT
(
"WinEDA_PcbFrame::Block_Flip( ) error: unexpected type"
)
);
...
@@ -825,7 +845,6 @@ void WinEDA_PcbFrame::Block_Move()
...
@@ -825,7 +845,6 @@ void WinEDA_PcbFrame::Block_Move()
m_Pcb
->
m_Status_Pcb
=
0
;
m_Pcb
->
m_Status_Pcb
=
0
;
break
;
break
;
case
TYPE_ZONE
:
// a segment used to fill a zome area (segment on a copper layer)
case
TYPE_ZONE_CONTAINER
:
case
TYPE_ZONE_CONTAINER
:
case
TYPE_DRAWSEGMENT
:
case
TYPE_DRAWSEGMENT
:
case
TYPE_TEXTE
:
case
TYPE_TEXTE
:
...
@@ -833,6 +852,12 @@ void WinEDA_PcbFrame::Block_Move()
...
@@ -833,6 +852,12 @@ void WinEDA_PcbFrame::Block_Move()
case
TYPE_COTATION
:
case
TYPE_COTATION
:
break
;
break
;
// This item is not put in undo list
case
TYPE_ZONE
:
// a segment used to fill a zome area (segment on a copper layer)
itemsList
->
RemovePicker
(
ii
);
ii
--
;
break
;
default
:
default
:
wxMessageBox
(
wxT
(
"WinEDA_PcbFrame::Block_Move( ) error: unexpected type"
)
);
wxMessageBox
(
wxT
(
"WinEDA_PcbFrame::Block_Move( ) error: unexpected type"
)
);
break
;
break
;
...
@@ -905,10 +930,8 @@ void WinEDA_PcbFrame::Block_Duplicate()
...
@@ -905,10 +930,8 @@ void WinEDA_PcbFrame::Block_Duplicate()
case
TYPE_ZONE
:
// a segment used to fill a zome area (segment on a copper layer)
case
TYPE_ZONE
:
// a segment used to fill a zome area (segment on a copper layer)
{
{
SEGZONE
*
track
=
(
SEGZONE
*
)
item
;
// SEG_ZONE items are not copied or put in undo list
SEGZONE
*
new_track
=
(
SEGZONE
*
)
track
->
Copy
();
// they must be recreated by zone filling
newitem
=
new_track
;
m_Pcb
->
m_Track
.
PushFront
(
new_track
);
}
}
break
;
break
;
...
...
pcbnew/board_undo_redo.cpp
View file @
c7187652
...
@@ -126,11 +126,14 @@ void SwapData( BOARD_ITEM* aItem, BOARD_ITEM* aImage )
...
@@ -126,11 +126,14 @@ void SwapData( BOARD_ITEM* aItem, BOARD_ITEM* aImage )
}
}
// Swap layers:
// Swap layers:
if
(
aItem
->
Type
()
!=
TYPE_MODULE
)
// Modules have a global swap function
{
int
layer
,
layerimg
;
int
layer
,
layerimg
;
layer
=
aItem
->
GetLayer
();
layer
=
aItem
->
GetLayer
();
layerimg
=
aImage
->
GetLayer
();
layerimg
=
aImage
->
GetLayer
();
aItem
->
SetLayer
(
layerimg
);
aItem
->
SetLayer
(
layerimg
);
aImage
->
SetLayer
(
layer
);
aImage
->
SetLayer
(
layer
);
}
switch
(
aItem
->
Type
()
)
switch
(
aItem
->
Type
()
)
{
{
...
@@ -211,7 +214,7 @@ BOARD_ITEM* DuplicateStruct( BOARD_ITEM* aItem )
...
@@ -211,7 +214,7 @@ BOARD_ITEM* DuplicateStruct( BOARD_ITEM* aItem )
{
{
if
(
aItem
==
NULL
)
if
(
aItem
==
NULL
)
{
{
wxMessageBox
(
wxT
(
"DuplicateStruct
error: NULL struct
"
)
);
wxMessageBox
(
wxT
(
"DuplicateStruct
() error: NULL aItem
"
)
);
return
NULL
;
return
NULL
;
}
}
...
@@ -380,28 +383,31 @@ void WinEDA_PcbFrame::SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList,
...
@@ -380,28 +383,31 @@ void WinEDA_PcbFrame::SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList,
PICKED_ITEMS_LIST
*
commandToUndo
=
new
PICKED_ITEMS_LIST
();
PICKED_ITEMS_LIST
*
commandToUndo
=
new
PICKED_ITEMS_LIST
();
commandToUndo
->
m_TransformPoint
=
aTransformPoint
;
commandToUndo
->
m_TransformPoint
=
aTransformPoint
;
// Copy picker list:
commandToUndo
->
CopyList
(
aItemsList
);
ITEM_PICKER
itemWrapper
;
// Verify list, and creates data if needed
for
(
unsigned
ii
=
0
;
ii
<
commandToUndo
->
GetCount
();
ii
++
)
for
(
unsigned
ii
=
0
;
ii
<
aItemsList
.
GetCount
();
ii
++
)
{
{
BOARD_ITEM
*
item
=
(
BOARD_ITEM
*
)
aItemsList
.
GetPickedItem
(
ii
);
BOARD_ITEM
*
item
=
(
BOARD_ITEM
*
)
commandToUndo
->
GetPickedItem
(
ii
);
UndoRedoOpType
command
=
aItemsList
.
GetPickedItemStatus
(
ii
);
UndoRedoOpType
command
=
commandToUndo
->
GetPickedItemStatus
(
ii
);
if
(
command
==
UR_UNSPECIFIED
)
if
(
command
==
UR_UNSPECIFIED
)
{
command
=
aTypeCommand
;
command
=
aTypeCommand
;
commandToUndo
->
SetPickedItemStatus
(
command
,
ii
);
}
wxASSERT
(
item
);
wxASSERT
(
item
);
itemWrapper
.
m_PickedItem
=
item
;
itemWrapper
.
m_PickedItemType
=
item
->
Type
();
itemWrapper
.
m_UndoRedoStatus
=
command
;
itemWrapper
.
m_Link
=
aItemsList
.
GetPickedItemLink
(
ii
);
switch
(
command
)
switch
(
command
)
{
{
case
UR_CHANGED
:
/* If needed, create a copy of item, and put in undo list */
case
UR_CHANGED
:
if
(
itemWrapper
.
m_Link
==
NULL
)
// When not null, the copy is already done
/* If needed, create a copy of item, and put in undo list
itemWrapper
.
m_Link
=
DuplicateStruct
(
item
);
* in the picker, as link
if
(
itemWrapper
.
m_Link
)
* If this link is not null, the copy is already done
commandToUndo
->
PushItem
(
itemWrapper
);
*/
if
(
commandToUndo
->
GetPickedItemLink
(
ii
)
==
NULL
)
commandToUndo
->
SetPickedItemLink
(
DuplicateStruct
(
item
),
ii
);
wxASSERT
(
commandToUndo
->
GetPickedItemLink
(
ii
)
);
break
;
break
;
case
UR_MOVED
:
case
UR_MOVED
:
...
@@ -410,7 +416,6 @@ void WinEDA_PcbFrame::SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList,
...
@@ -410,7 +416,6 @@ void WinEDA_PcbFrame::SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList,
case
UR_FLIPPED
:
case
UR_FLIPPED
:
case
UR_NEW
:
case
UR_NEW
:
case
UR_DELETED
:
case
UR_DELETED
:
commandToUndo
->
PushItem
(
itemWrapper
);
break
;
break
;
default
:
default
:
...
@@ -428,10 +433,10 @@ void WinEDA_PcbFrame::SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList,
...
@@ -428,10 +433,10 @@ void WinEDA_PcbFrame::SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList,
/* Save the copy in undo list */
/* Save the copy in undo list */
GetScreen
()
->
PushCommandToUndoList
(
commandToUndo
);
GetScreen
()
->
PushCommandToUndoList
(
commandToUndo
);
/* Clear redo list, because after
new save there is no redo to do
*/
/* Clear redo list, because after
a new command one cannot redo a command
*/
GetScreen
()
->
ClearUndoORRedoList
(
GetScreen
()
->
m_RedoList
);
GetScreen
()
->
ClearUndoORRedoList
(
GetScreen
()
->
m_RedoList
);
}
}
else
else
// Should not occur
delete
commandToUndo
;
delete
commandToUndo
;
}
}
...
@@ -452,21 +457,23 @@ void WinEDA_PcbFrame::PutDataInPreviousState( PICKED_ITEMS_LIST* aList, bool aRe
...
@@ -452,21 +457,23 @@ void WinEDA_PcbFrame::PutDataInPreviousState( PICKED_ITEMS_LIST* aList, bool aRe
{
{
item
=
(
BOARD_ITEM
*
)
aList
->
GetPickedItem
(
ii
);
item
=
(
BOARD_ITEM
*
)
aList
->
GetPickedItem
(
ii
);
wxASSERT
(
item
);
wxASSERT
(
item
);
#if 1
if
(
aList
->
GetPickedItemStatus
(
ii
)
!=
UR_DELETED
)
if
(
aList
->
GetPickedItemStatus
(
ii
)
!=
UR_DELETED
)
{
{
if
(
!
TestForExistingItem
(
GetBoard
(),
item
)
)
if
(
!
TestForExistingItem
(
GetBoard
(),
item
)
)
{
{
// Remove this non existant item
// Remove this non existant item
aList
->
RemovePicke
dItem
(
ii
);
aList
->
RemovePicke
r
(
ii
);
ii
--
;
// the current item was removed, ii points now the next item
ii
--
;
// the current item was removed, ii points now the next item
// whe must decrement it because it will be incremented
// whe must decrement it because it will be incremented
not_found
=
true
;
not_found
=
true
;
continue
;
continue
;
}
}
}
}
#endif
item
->
m_Flags
=
0
;
item
->
m_Flags
=
0
;
// see if
on
e must rebuild ratsnets and pointers lists
// see if
w
e must rebuild ratsnets and pointers lists
switch
(
item
->
Type
()
)
switch
(
item
->
Type
()
)
{
{
case
TYPE_MODULE
:
case
TYPE_MODULE
:
...
@@ -528,9 +535,9 @@ void WinEDA_PcbFrame::PutDataInPreviousState( PICKED_ITEMS_LIST* aList, bool aRe
...
@@ -528,9 +535,9 @@ void WinEDA_PcbFrame::PutDataInPreviousState( PICKED_ITEMS_LIST* aList, bool aRe
}
}
if
(
not_found
)
if
(
not_found
)
wxMessageBox
(
wxT
(
"Incomplete undo/redo
command: item
not found"
)
);
wxMessageBox
(
wxT
(
"Incomplete undo/redo
operation: some items
not found"
)
);
// Rebuild pointers and rastnest
// Rebuild pointers and rastnest
that can be changed.
if
(
reBuild_ratsnest
)
if
(
reBuild_ratsnest
)
Compile_Ratsnest
(
NULL
,
true
);
Compile_Ratsnest
(
NULL
,
true
);
}
}
...
@@ -542,8 +549,8 @@ void WinEDA_PcbFrame::GetBoardFromUndoList( wxCommandEvent& event )
...
@@ -542,8 +549,8 @@ void WinEDA_PcbFrame::GetBoardFromUndoList( wxCommandEvent& event )
/** Function GetBoardFromUndoList
/** Function GetBoardFromUndoList
* Undo the last edition:
* Undo the last edition:
* - Save the current board in Redo list
* - Save the current board
state
in Redo list
* - Get an old version of the board from Undo list
* - Get an old version of the board
state
from Undo list
* @return none
* @return none
*/
*/
{
{
...
@@ -612,7 +619,7 @@ void PCB_SCREEN::ClearUndoORRedoList( UNDO_REDO_CONTAINER& aList, int aItemCount
...
@@ -612,7 +619,7 @@ void PCB_SCREEN::ClearUndoORRedoList( UNDO_REDO_CONTAINER& aList, int aItemCount
unsigned
icnt
=
aList
.
m_CommandsList
.
size
();
unsigned
icnt
=
aList
.
m_CommandsList
.
size
();
if
(
aItemCount
>
0
)
if
(
aItemCount
>
0
)
icnt
=
aItemCount
;
icnt
=
aItemCount
;
bool
displ_error
=
true
;
for
(
unsigned
ii
=
0
;
ii
<
icnt
;
ii
++
)
for
(
unsigned
ii
=
0
;
ii
<
icnt
;
ii
++
)
{
{
if
(
aList
.
m_CommandsList
.
size
()
==
0
)
if
(
aList
.
m_CommandsList
.
size
()
==
0
)
...
...
pcbnew/dialog_edit_module.cpp
View file @
c7187652
...
@@ -533,6 +533,14 @@ void WinEDA_ModulePropertiesFrame::OnOkClick( wxCommandEvent& event )
...
@@ -533,6 +533,14 @@ void WinEDA_ModulePropertiesFrame::OnOkClick( wxCommandEvent& event )
bool
change_layer
=
FALSE
;
bool
change_layer
=
FALSE
;
wxPoint
modpos
;
wxPoint
modpos
;
if
(
m_CurrentModule
->
m_Flags
==
0
)
// this is a simple edition, we must create an undo entry
{
if
(
m_Parent
->
m_Ident
==
PCB_FRAME
)
m_Parent
->
SaveCopyInUndoList
(
m_CurrentModule
,
UR_CHANGED
);
else
m_Parent
->
SaveCopyInUndoList
(
m_CurrentModule
,
UR_MODEDIT
);
}
if
(
m_DC
)
if
(
m_DC
)
{
{
m_Parent
->
DrawPanel
->
CursorOff
(
m_DC
);
m_Parent
->
DrawPanel
->
CursorOff
(
m_DC
);
...
...
pcbnew/editedge.cpp
View file @
c7187652
...
@@ -20,8 +20,8 @@ static void Montre_Position_NewSegment( WinEDA_DrawPanel* panel, wxDC* DC, bool
...
@@ -20,8 +20,8 @@ static void Montre_Position_NewSegment( WinEDA_DrawPanel* panel, wxDC* DC, bool
static
void
Move_Segment
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
bool
erase
);
static
void
Move_Segment
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
bool
erase
);
/* Variables locales : */
/* Variables locales : */
static
wxPoint
cursor_pos
;
// position originelle du curseur souris (fct deplacement)
static
wxPoint
s_InitialPosition
;
// position originelle du curseur souris (fct deplacement)
static
wxPoint
cursor_pos0
;
// position courante du curseur souris
static
wxPoint
s_LastPosition
;
// position courante du curseur souris
/****************************************************************************/
/****************************************************************************/
void
WinEDA_PcbFrame
::
Start_Move_DrawItem
(
DRAWSEGMENT
*
drawitem
,
wxDC
*
DC
)
void
WinEDA_PcbFrame
::
Start_Move_DrawItem
(
DRAWSEGMENT
*
drawitem
,
wxDC
*
DC
)
...
@@ -34,7 +34,7 @@ void WinEDA_PcbFrame::Start_Move_DrawItem( DRAWSEGMENT* drawitem, wxDC* DC )
...
@@ -34,7 +34,7 @@ void WinEDA_PcbFrame::Start_Move_DrawItem( DRAWSEGMENT* drawitem, wxDC* DC )
return
;
return
;
drawitem
->
Draw
(
DrawPanel
,
DC
,
GR_XOR
);
drawitem
->
Draw
(
DrawPanel
,
DC
,
GR_XOR
);
drawitem
->
m_Flags
|=
IS_MOVED
;
drawitem
->
m_Flags
|=
IS_MOVED
;
cursor_pos
=
cursor_pos0
=
GetScreen
()
->
m_Curseur
;
s_InitialPosition
=
s_LastPosition
=
GetScreen
()
->
m_Curseur
;
drawitem
->
DisplayInfo
(
this
);
drawitem
->
DisplayInfo
(
this
);
DrawPanel
->
ManageCurseur
=
Move_Segment
;
DrawPanel
->
ManageCurseur
=
Move_Segment
;
DrawPanel
->
ForceCloseManageCurseur
=
Exit_EditEdge
;
DrawPanel
->
ForceCloseManageCurseur
=
Exit_EditEdge
;
...
@@ -54,6 +54,7 @@ void WinEDA_PcbFrame::Place_DrawItem( DRAWSEGMENT* drawitem, wxDC* DC )
...
@@ -54,6 +54,7 @@ void WinEDA_PcbFrame::Place_DrawItem( DRAWSEGMENT* drawitem, wxDC* DC )
if
(
drawitem
==
NULL
)
if
(
drawitem
==
NULL
)
return
;
return
;
SaveCopyInUndoList
(
drawitem
,
UR_MOVED
,
s_LastPosition
-
s_InitialPosition
);
drawitem
->
Draw
(
DrawPanel
,
DC
,
GR_OR
);
drawitem
->
Draw
(
DrawPanel
,
DC
,
GR_OR
);
DrawPanel
->
ManageCurseur
=
NULL
;
DrawPanel
->
ManageCurseur
=
NULL
;
DrawPanel
->
ForceCloseManageCurseur
=
NULL
;
DrawPanel
->
ForceCloseManageCurseur
=
NULL
;
...
@@ -82,13 +83,10 @@ static void Move_Segment( WinEDA_DrawPanel* panel, wxDC* DC, bool erase )
...
@@ -82,13 +83,10 @@ static void Move_Segment( WinEDA_DrawPanel* panel, wxDC* DC, bool erase )
Segment
->
Draw
(
panel
,
DC
,
GR_XOR
);
Segment
->
Draw
(
panel
,
DC
,
GR_XOR
);
wxPoint
delta
;
wxPoint
delta
;
delta
.
x
=
panel
->
GetScreen
()
->
m_Curseur
.
x
-
cursor_pos
.
x
;
delta
=
panel
->
GetScreen
()
->
m_Curseur
-
s_LastPosition
;
delta
.
y
=
panel
->
GetScreen
()
->
m_Curseur
.
y
-
cursor_pos
.
y
;
Segment
->
m_Start
+=
delta
;
Segment
->
m_Start
.
x
+=
delta
.
x
;
Segment
->
m_End
+=
delta
;
Segment
->
m_Start
.
y
+=
delta
.
y
;
s_LastPosition
=
panel
->
GetScreen
()
->
m_Curseur
;
Segment
->
m_End
.
x
+=
delta
.
x
;
Segment
->
m_End
.
y
+=
delta
.
y
;
cursor_pos
=
panel
->
GetScreen
()
->
m_Curseur
;
Segment
->
Draw
(
panel
,
DC
,
GR_XOR
);
Segment
->
Draw
(
panel
,
DC
,
GR_XOR
);
DisplayOpt
.
DisplayDrawItems
=
t_fill
;
DisplayOpt
.
DisplayDrawItems
=
t_fill
;
...
@@ -151,10 +149,12 @@ void WinEDA_PcbFrame::Delete_Drawings_All_Layer( DRAWSEGMENT* Segment, wxDC* DC
...
@@ -151,10 +149,12 @@ void WinEDA_PcbFrame::Delete_Drawings_All_Layer( DRAWSEGMENT* Segment, wxDC* DC
if
(
!
IsOK
(
this
,
msg
)
)
if
(
!
IsOK
(
this
,
msg
)
)
return
;
return
;
PICKED_ITEMS_LIST
pickList
;
ITEM_PICKER
picker
(
NULL
,
UR_DELETED
);
BOARD_ITEM
*
PtNext
;
BOARD_ITEM
*
PtNext
;
for
(
BOARD_ITEM
*
item
=
GetBoard
()
->
m_Drawings
;
item
;
item
=
PtNext
)
for
(
BOARD_ITEM
*
item
=
GetBoard
()
->
m_Drawings
;
item
;
item
=
PtNext
)
{
{
GetScreen
()
->
SetModify
();
PtNext
=
item
->
Next
();
PtNext
=
item
->
Next
();
switch
(
item
->
Type
()
)
switch
(
item
->
Type
()
)
...
@@ -165,7 +165,9 @@ void WinEDA_PcbFrame::Delete_Drawings_All_Layer( DRAWSEGMENT* Segment, wxDC* DC
...
@@ -165,7 +165,9 @@ void WinEDA_PcbFrame::Delete_Drawings_All_Layer( DRAWSEGMENT* Segment, wxDC* DC
if
(
item
->
GetLayer
()
==
layer
)
if
(
item
->
GetLayer
()
==
layer
)
{
{
item
->
Draw
(
DrawPanel
,
DC
,
GR_XOR
);
item
->
Draw
(
DrawPanel
,
DC
,
GR_XOR
);
item
->
DeleteStructure
();
item
->
UnLink
();
picker
.
m_PickedItem
=
item
;
pickList
.
PushItem
(
picker
);
}
}
break
;
break
;
...
@@ -174,6 +176,12 @@ void WinEDA_PcbFrame::Delete_Drawings_All_Layer( DRAWSEGMENT* Segment, wxDC* DC
...
@@ -174,6 +176,12 @@ void WinEDA_PcbFrame::Delete_Drawings_All_Layer( DRAWSEGMENT* Segment, wxDC* DC
break
;
break
;
}
}
}
}
if
(
pickList
.
GetCount
()
)
{
GetScreen
()
->
SetModify
();
SaveCopyInUndoList
(
Segment
,
UR_DELETED
);
}
}
}
...
@@ -195,7 +203,7 @@ static void Exit_EditEdge( WinEDA_DrawPanel* Panel, wxDC* DC )
...
@@ -195,7 +203,7 @@ static void Exit_EditEdge( WinEDA_DrawPanel* Panel, wxDC* DC )
else
else
{
{
wxPoint
pos
=
Panel
->
GetScreen
()
->
m_Curseur
;
wxPoint
pos
=
Panel
->
GetScreen
()
->
m_Curseur
;
Panel
->
GetScreen
()
->
m_Curseur
=
cursor_pos0
;
Panel
->
GetScreen
()
->
m_Curseur
=
s_InitialPosition
;
Panel
->
ManageCurseur
(
Panel
,
DC
,
TRUE
);
Panel
->
ManageCurseur
(
Panel
,
DC
,
TRUE
);
Panel
->
GetScreen
()
->
m_Curseur
=
pos
;
Panel
->
GetScreen
()
->
m_Curseur
=
pos
;
Segment
->
m_Flags
=
0
;
Segment
->
m_Flags
=
0
;
...
@@ -247,6 +255,7 @@ DRAWSEGMENT* WinEDA_PcbFrame::Begin_DrawSegment( DRAWSEGMENT* Segment,
...
@@ -247,6 +255,7 @@ DRAWSEGMENT* WinEDA_PcbFrame::Begin_DrawSegment( DRAWSEGMENT* Segment,
{
{
if
(
Segment
->
m_Shape
==
S_SEGMENT
)
if
(
Segment
->
m_Shape
==
S_SEGMENT
)
{
{
SaveCopyInUndoList
(
Segment
,
UR_NEW
);
GetBoard
()
->
Add
(
Segment
);
GetBoard
()
->
Add
(
Segment
);
GetScreen
()
->
SetModify
();
GetScreen
()
->
SetModify
();
...
@@ -287,17 +296,15 @@ void WinEDA_PcbFrame::End_Edge( DRAWSEGMENT* Segment, wxDC* DC )
...
@@ -287,17 +296,15 @@ void WinEDA_PcbFrame::End_Edge( DRAWSEGMENT* Segment, wxDC* DC )
Segment
->
Draw
(
DrawPanel
,
DC
,
GR_OR
);
Segment
->
Draw
(
DrawPanel
,
DC
,
GR_OR
);
/* Effacement si Longueur nulle */
/* Effacement si Longueur nulle */
if
(
(
Segment
->
m_Start
.
x
==
Segment
->
m_End
.
x
)
if
(
Segment
->
m_Start
==
Segment
->
m_End
)
&&
(
Segment
->
m_Start
.
y
==
Segment
->
m_End
.
y
)
)
Segment
->
DeleteStructure
();
Segment
->
DeleteStructure
();
else
else
{
{
Segment
->
m_Flags
=
0
;
Segment
->
m_Flags
=
0
;
GetBoard
()
->
Add
(
Segment
);
GetBoard
()
->
Add
(
Segment
);
GetScreen
()
->
SetModify
();
GetScreen
()
->
SetModify
();
SaveCopyInUndoList
(
Segment
,
UR_NEW
);
}
}
DrawPanel
->
ManageCurseur
=
NULL
;
DrawPanel
->
ManageCurseur
=
NULL
;
...
...
pcbnew/initpcb.cpp
View file @
c7187652
This diff is collapsed.
Click to expand it.
pcbnew/modedit.cpp
View file @
c7187652
...
@@ -364,8 +364,8 @@ void WinEDA_ModuleEditFrame::Process_Special_Functions( wxCommandEvent& event )
...
@@ -364,8 +364,8 @@ void WinEDA_ModuleEditFrame::Process_Special_Functions( wxCommandEvent& event )
if
(
GetBoard
()
->
m_Modules
)
if
(
GetBoard
()
->
m_Modules
)
GetBoard
()
->
m_Modules
->
m_Flags
=
0
;
GetBoard
()
->
m_Modules
->
m_Flags
=
0
;
//
if either m_Reference or m_Value are gone, reinstate
them -
//
if either m_Reference or m_Value are gone, reinstall
them -
//
otherwise it becomes hard to see what you are working with in the layout!
//
otherwise you cannot see what you are doing on board
if
(
GetBoard
()
&&
GetBoard
()
->
m_Modules
)
if
(
GetBoard
()
&&
GetBoard
()
->
m_Modules
)
{
{
TEXTE_MODULE
*
ref
=
GetBoard
()
->
m_Modules
->
m_Reference
;
TEXTE_MODULE
*
ref
=
GetBoard
()
->
m_Modules
->
m_Reference
;
...
...
pcbnew/modules.cpp
View file @
c7187652
...
@@ -122,7 +122,7 @@ void WinEDA_PcbFrame::StartMove_Module( MODULE* module, wxDC* DC )
...
@@ -122,7 +122,7 @@ void WinEDA_PcbFrame::StartMove_Module( MODULE* module, wxDC* DC )
if
(
g_Show_Ratsnest
)
if
(
g_Show_Ratsnest
)
DrawGeneralRatsnest
(
DC
);
DrawGeneralRatsnest
(
DC
);
if
(
g_DragSegmentList
)
/*
Anormal
! */
if
(
g_DragSegmentList
)
/*
Should not occur
! */
{
{
EraseDragListe
();
EraseDragListe
();
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment