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
304525db
Commit
304525db
authored
Aug 03, 2009
by
charras
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
undo/redo rework: fixed some problems ans crashes (not all) in libedit and modedit
parent
8d5a6531
Changes
20
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
461 additions
and
372 deletions
+461
-372
zoom.cpp
common/zoom.cpp
+0
-1
cvstruct.h
cvpcb/cvstruct.h
+13
-0
libedit_undo_redo.cpp
eeschema/libedit_undo_redo.cpp
+4
-14
schematic_undo_redo.cpp
eeschema/schematic_undo_redo.cpp
+4
-0
wxGerberFrame.h
gerbview/wxGerberFrame.h
+12
-0
class_undoredo_container.h
include/class_undoredo_container.h
+3
-1
wxBasePcbFrame.h
include/wxBasePcbFrame.h
+10
-0
wxPcbStruct.h
include/wxPcbStruct.h
+21
-4
block_module_editor.cpp
pcbnew/block_module_editor.cpp
+7
-7
board_undo_redo.cpp
pcbnew/board_undo_redo.cpp
+83
-87
class_module.cpp
pcbnew/class_module.cpp
+7
-3
class_pad.cpp
pcbnew/class_pad.cpp
+1
-2
edgemod.cpp
pcbnew/edgemod.cpp
+19
-32
edit.cpp
pcbnew/edit.cpp
+2
-0
editmod.cpp
pcbnew/editmod.cpp
+0
-1
modedit.cpp
pcbnew/modedit.cpp
+6
-6
modedit_onclick.cpp
pcbnew/modedit_onclick.cpp
+14
-10
modedit_undo_redo.cpp
pcbnew/modedit_undo_redo.cpp
+42
-31
move-drag_pads.cpp
pcbnew/move-drag_pads.cpp
+52
-14
onrightclick.cpp
pcbnew/onrightclick.cpp
+161
-159
No files found.
common/zoom.cpp
View file @
304525db
...
...
@@ -219,7 +219,6 @@ void WinEDA_DrawPanel::AddMenuZoom( wxMenu* MasterMenu )
maxZoomIds
=
ID_POPUP_ZOOM_LEVEL_END
-
ID_POPUP_ZOOM_LEVEL_START
;
maxZoomIds
=
(
(
size_t
)
maxZoomIds
<
GetScreen
()
->
m_ZoomList
.
GetCount
()
)
?
maxZoomIds
:
GetScreen
()
->
m_ZoomList
.
GetCount
();
wxLogDebug
(
_T
(
"%d zoom IDs used."
),
maxZoomIds
);
/* Populate zoom submenu. */
for
(
i
=
0
;
i
<
(
size_t
)
maxZoomIds
;
i
++
)
...
...
cvpcb/cvstruct.h
View file @
304525db
...
...
@@ -229,6 +229,19 @@ public:
{
}
/** Function SaveCopyInUndoList (overloaded).
* Creates a new entry in undo list of commands.
* add a list of pickers to handle a list of items
* @param aItemsList = the list of items modified by the command to undo
* @param aTypeCommand = command type (see enum UndoRedoOpType)
* @param aTransformPoint = the reference point of the transformation, for commands like move
*/
virtual
void
SaveCopyInUndoList
(
PICKED_ITEMS_LIST
&
aItemsList
,
UndoRedoOpType
aTypeCommand
,
const
wxPoint
&
aTransformPoint
=
wxPoint
(
0
,
0
)
)
{
// currently: do nothing in cvpcb.
}
DECLARE_EVENT_TABLE
()
};
...
...
eeschema/libedit_undo_redo.cpp
View file @
304525db
...
...
@@ -26,7 +26,7 @@ void WinEDA_LibeditFrame::SaveCopyInUndoList( EDA_BaseStruct* ItemToCopy,
CopyItem
=
CopyLibEntryStruct
(
this
,
(
EDA_LibComponentStruct
*
)
ItemToCopy
);
lastcmd
=
new
PICKED_ITEMS_LIST
();
ITEM_PICKER
wrapper
(
CopyItem
);
ITEM_PICKER
wrapper
(
CopyItem
,
UR_LIBEDIT
);
lastcmd
->
PushItem
(
wrapper
);
GetScreen
()
->
PushCommandToUndoList
(
lastcmd
);
/* Clear current flags (which can be temporary set by a current edit command) */
...
...
@@ -34,17 +34,7 @@ void WinEDA_LibeditFrame::SaveCopyInUndoList( EDA_BaseStruct* ItemToCopy,
item
->
m_Flags
=
0
;
/* Clear redo list, because after new save there is no redo to do */
while
(
(
lastcmd
=
GetScreen
()
->
PopCommandFromRedoList
(
)
)
!=
NULL
)
{
while
(
1
)
{
wrapper
=
lastcmd
->
PopItem
();
if
(
wrapper
.
m_PickedItem
==
NULL
)
break
;
// All items are removed
delete
wrapper
.
m_PickedItem
;
}
delete
lastcmd
;
}
GetScreen
()
->
ClearUndoORRedoList
(
GetScreen
()
->
m_RedoList
);
}
...
...
@@ -62,7 +52,7 @@ void WinEDA_LibeditFrame::GetComponentFromRedoList(wxCommandEvent& event)
return
;
PICKED_ITEMS_LIST
*
lastcmd
=
new
PICKED_ITEMS_LIST
();
ITEM_PICKER
wrapper
(
CurrentLibEntry
);
ITEM_PICKER
wrapper
(
CurrentLibEntry
,
UR_LIBEDIT
);
lastcmd
->
PushItem
(
wrapper
);
GetScreen
()
->
PushCommandToUndoList
(
lastcmd
);
...
...
@@ -95,7 +85,7 @@ void WinEDA_LibeditFrame::GetComponentFromUndoList(wxCommandEvent& event)
return
;
PICKED_ITEMS_LIST
*
lastcmd
=
new
PICKED_ITEMS_LIST
();
ITEM_PICKER
wrapper
(
CurrentLibEntry
);
ITEM_PICKER
wrapper
(
CurrentLibEntry
,
UR_LIBEDIT
);
lastcmd
->
PushItem
(
wrapper
);
GetScreen
()
->
PushCommandToRedoList
(
lastcmd
);
...
...
eeschema/schematic_undo_redo.cpp
View file @
304525db
...
...
@@ -509,6 +509,10 @@ void SCH_SCREEN::ClearUndoORRedoList( UNDO_REDO_CONTAINER& aList, int aItemCount
case
UR_NEW
:
// Do nothing, items are in use
break
;
case
UR_LIBEDIT
:
// Libedit save always a copy of the current item
delete
item
;
// So, the picker is always owner of the picked item
break
;
case
UR_DELETED
:
delete
item
;
// Delete the picked item, because it was deleted from schematic
break
;
...
...
gerbview/wxGerberFrame.h
View file @
304525db
...
...
@@ -175,6 +175,18 @@ public:
const
wxPoint
&
aTransformPoint
=
wxPoint
(
0
,
0
)
)
{
}
/** Function SaveCopyInUndoList (overloaded).
* Creates a new entry in undo list of commands.
* add a list of pickers to handle a list of items
* @param aItemsList = the list of items modified by the command to undo
* @param aTypeCommand = command type (see enum UndoRedoOpType)
* @param aTransformPoint = the reference point of the transformation, for commands like move
*/
virtual
void
SaveCopyInUndoList
(
PICKED_ITEMS_LIST
&
aItemsList
,
UndoRedoOpType
aTypeCommand
,
const
wxPoint
&
aTransformPoint
=
wxPoint
(
0
,
0
)
)
{
// currently: do nothing in gerbview.
}
DECLARE_EVENT_TABLE
()
...
...
include/class_undoredo_container.h
View file @
304525db
...
...
@@ -60,7 +60,9 @@ enum UndoRedoOpType {
UR_MIRRORED_Y
,
// mirrored item, undo by mirror Y
UR_ROTATED
,
// Rotated item, undo by rotating it
UR_FLIPPED
,
// flipped (board items only), undo by flipping it
UR_WIRE_IMAGE
// Specific to eeschema: handle wires changes
UR_WIRE_IMAGE
,
// Specific to eeschema: handle wires changes
UR_MODEDIT
,
// Specific to the module editor (modedit creates a full copy of the current module when changed)
UR_LIBEDIT
// Specific to the component editor (libedit creates a full copy of the current component when changed)
};
class
ITEM_PICKER
...
...
include/wxBasePcbFrame.h
View file @
304525db
...
...
@@ -310,6 +310,16 @@ public:
virtual
void
SaveCopyInUndoList
(
BOARD_ITEM
*
aItemToCopy
,
UndoRedoOpType
aTypeCommand
,
const
wxPoint
&
aTransformPoint
=
wxPoint
(
0
,
0
)
)
=
0
;
/** Function SaveCopyInUndoList (virtual pure, overloaded).
* Creates a new entry in undo list of commands.
* add a list of pickers to handle a list of items
* @param aItemsList = the list of items modified by the command to undo
* @param aTypeCommand = command type (see enum UndoRedoOpType)
* @param aTransformPoint = the reference point of the transformation, for commands like move
*/
virtual
void
SaveCopyInUndoList
(
PICKED_ITEMS_LIST
&
aItemsList
,
UndoRedoOpType
aTypeCommand
,
const
wxPoint
&
aTransformPoint
=
wxPoint
(
0
,
0
)
)
=
0
;
// layerhandling:
// (See pcbnew/sel_layer.cpp for description of why null_layer parameter is provided)
...
...
include/wxPcbStruct.h
View file @
304525db
...
...
@@ -143,7 +143,7 @@ public:
* @param aTypeCommand = command type (see enum UndoRedoOpType)
* @param aTransformPoint = the reference point of the transformation, for commands like move
*/
v
oid
SaveCopyInUndoList
(
BOARD_ITEM
*
aItemToCopy
,
UndoRedoOpType
aTypeCommand
,
v
irtual
void
SaveCopyInUndoList
(
BOARD_ITEM
*
aItemToCopy
,
UndoRedoOpType
aTypeCommand
,
const
wxPoint
&
aTransformPoint
=
wxPoint
(
0
,
0
)
);
/** Function SaveCopyInUndoList (overloaded).
...
...
@@ -153,7 +153,7 @@ public:
* @param aTypeCommand = command type (see enum UndoRedoOpType)
* @param aTransformPoint = the reference point of the transformation, for commands like move
*/
v
oid
SaveCopyInUndoList
(
PICKED_ITEMS_LIST
&
aItemsList
,
UndoRedoOpType
aTypeCommand
,
v
irtual
void
SaveCopyInUndoList
(
PICKED_ITEMS_LIST
&
aItemsList
,
UndoRedoOpType
aTypeCommand
,
const
wxPoint
&
aTransformPoint
=
wxPoint
(
0
,
0
)
);
/** Function PutDataInPreviousState()
...
...
@@ -650,9 +650,26 @@ public:
/* Undo and redo functions */
public
:
virtual
void
SaveCopyInUndoList
(
BOARD_ITEM
*
ItemToCopy
,
UndoRedoOpType
aTypeCommand
=
UR_UNSPECIFIED
,
/** Function SaveCopyInUndoList.
* Creates a new entry in undo list of commands.
* add a picker to handle aItemToCopy
* @param aItem = the board item modified by the command to undo
* @param aTypeCommand = command type (see enum UndoRedoOpType)
* @param aTransformPoint = the reference point of the transformation, for commands like move
*/
virtual
void
SaveCopyInUndoList
(
BOARD_ITEM
*
aItem
,
UndoRedoOpType
aTypeCommand
,
const
wxPoint
&
aTransformPoint
=
wxPoint
(
0
,
0
)
);
/** Function SaveCopyInUndoList (overloaded).
* Creates a new entry in undo list of commands.
* add a list of pickers to handle a list of items
* @param aItemsList = the list of items modified by the command to undo
* @param aTypeCommand = command type (see enum UndoRedoOpType)
* @param aTransformPoint = the reference point of the transformation, for commands like move
*/
virtual
void
SaveCopyInUndoList
(
PICKED_ITEMS_LIST
&
aItemsList
,
UndoRedoOpType
aTypeCommand
,
const
wxPoint
&
aTransformPoint
=
wxPoint
(
0
,
0
)
);
private
:
void
GetComponentFromUndoList
(
wxCommandEvent
&
event
);
void
GetComponentFromRedoList
(
wxCommandEvent
&
event
);
...
...
pcbnew/block_module_editor.cpp
View file @
304525db
...
...
@@ -152,7 +152,7 @@ int WinEDA_ModuleEditFrame::HandleBlockEnd( wxDC* DC )
case
BLOCK_DELETE
:
/* Delete */
ItemsCount
=
MarkItemsInBloc
(
Currentmodule
,
GetScreen
()
->
m_BlockLocate
);
if
(
ItemsCount
)
SaveCopyInUndoList
(
Currentmodule
);
SaveCopyInUndoList
(
Currentmodule
,
UR_CHANGED
);
DeleteMarkedItems
(
Currentmodule
);
break
;
...
...
@@ -163,7 +163,7 @@ int WinEDA_ModuleEditFrame::HandleBlockEnd( wxDC* DC )
case
BLOCK_ROTATE
:
ItemsCount
=
MarkItemsInBloc
(
Currentmodule
,
GetScreen
()
->
m_BlockLocate
);
if
(
ItemsCount
)
SaveCopyInUndoList
(
Currentmodule
);
SaveCopyInUndoList
(
Currentmodule
,
UR_CHANGED
);
RotateMarkedItems
(
Currentmodule
,
GetScreen
()
->
m_BlockLocate
.
Centre
()
);
break
;
...
...
@@ -173,7 +173,7 @@ int WinEDA_ModuleEditFrame::HandleBlockEnd( wxDC* DC )
case
BLOCK_INVERT
:
/* mirror */
ItemsCount
=
MarkItemsInBloc
(
Currentmodule
,
GetScreen
()
->
m_BlockLocate
);
if
(
ItemsCount
)
SaveCopyInUndoList
(
Currentmodule
);
SaveCopyInUndoList
(
Currentmodule
,
UR_CHANGED
);
MirrorMarkedItems
(
Currentmodule
,
GetScreen
()
->
m_BlockLocate
.
Centre
()
);
break
;
...
...
@@ -240,14 +240,14 @@ void WinEDA_ModuleEditFrame::HandleBlockPlace( wxDC* DC )
case
BLOCK_MOVE
:
/* Move */
case
BLOCK_PRESELECT_MOVE
:
/* Move with preselection list*/
GetScreen
()
->
m_BlockLocate
.
ClearItemsList
();
SaveCopyInUndoList
(
Currentmodule
);
SaveCopyInUndoList
(
Currentmodule
,
UR_CHANGED
);
MoveMarkedItems
(
Currentmodule
,
GetScreen
()
->
m_BlockLocate
.
m_MoveVector
);
DrawPanel
->
Refresh
(
TRUE
);
break
;
case
BLOCK_COPY
:
/* Copy */
GetScreen
()
->
m_BlockLocate
.
ClearItemsList
();
SaveCopyInUndoList
(
Currentmodule
);
SaveCopyInUndoList
(
Currentmodule
,
UR_CHANGED
);
CopyMarkedItems
(
Currentmodule
,
GetScreen
()
->
m_BlockLocate
.
m_MoveVector
);
break
;
...
...
@@ -258,12 +258,12 @@ void WinEDA_ModuleEditFrame::HandleBlockPlace( wxDC* DC )
case
BLOCK_MIRROR_X
:
case
BLOCK_MIRROR_Y
:
case
BLOCK_INVERT
:
/* Mirror by popup menu, from block move */
SaveCopyInUndoList
(
Currentmodule
);
SaveCopyInUndoList
(
Currentmodule
,
UR_CHANGED
);
MirrorMarkedItems
(
Currentmodule
,
GetScreen
()
->
m_BlockLocate
.
Centre
()
);
break
;
case
BLOCK_ROTATE
:
SaveCopyInUndoList
(
Currentmodule
);
SaveCopyInUndoList
(
Currentmodule
,
UR_CHANGED
);
RotateMarkedItems
(
Currentmodule
,
GetScreen
()
->
m_BlockLocate
.
Centre
()
);
break
;
...
...
pcbnew/board_undo_redo.cpp
View file @
304525db
This diff is collapsed.
Click to expand it.
pcbnew/class_module.cpp
View file @
304525db
...
...
@@ -102,7 +102,8 @@ void MODULE::Copy( MODULE* aModule )
m_Reference
->
Copy
(
aModule
->
m_Reference
);
m_Value
->
Copy
(
aModule
->
m_Value
);
/* Copie des structures auxiliaires: Pads */
/* Copy auxiliary data: Pads */
m_Pads
.
DeleteAll
();
for
(
D_PAD
*
pad
=
aModule
->
m_Pads
;
pad
;
pad
=
pad
->
Next
()
)
{
D_PAD
*
newpad
=
new
D_PAD
(
this
);
...
...
@@ -111,7 +112,8 @@ void MODULE::Copy( MODULE* aModule )
m_Pads
.
PushBack
(
newpad
);
}
/* Copy des structures auxiliaires: Drawings */
/* Copy auxiliary data: Drawings */
m_Drawings
.
DeleteAll
();
for
(
BOARD_ITEM
*
item
=
aModule
->
m_Drawings
;
item
;
item
=
item
->
Next
()
)
{
switch
(
item
->
Type
()
)
...
...
@@ -131,11 +133,13 @@ void MODULE::Copy( MODULE* aModule )
break
;
default
:
wxMessageBox
(
wxT
(
"
Internal Err: CopyModule: type indefini
"
)
);
wxMessageBox
(
wxT
(
"
MODULE::Copy() Internal Err: unknown type
"
)
);
break
;
}
}
/* Copy auxiliary data: 3D_Drawings info */
m_3D_Drawings
.
DeleteAll
();
for
(
S3D_MASTER
*
item
=
aModule
->
m_3D_Drawings
;
item
;
item
=
item
->
Next
()
)
{
if
(
item
->
m_Shape3DName
.
IsEmpty
()
)
// do not copy empty shapes.
...
...
pcbnew/class_pad.cpp
View file @
304525db
...
...
@@ -191,8 +191,7 @@ void D_PAD::Copy( D_PAD* source )
m_Offset
=
source
->
m_Offset
;
// Offset de la forme
m_Size
=
source
->
m_Size
;
// Dimension ( pour orient 0 )
m_DeltaSize
=
source
->
m_DeltaSize
;
// delta sur formes rectangle -> trapezes
m_Pos0
=
source
->
m_Pos0
;
// Coord relatives a l'ancre du pad en
// orientation 0
m_Pos0
=
source
->
m_Pos0
;
/* Coord relatives a l'ancre du pad en orientation 0 */
m_Rayon
=
source
->
m_Rayon
;
// rayon du cercle exinscrit du pad
m_PadShape
=
source
->
m_PadShape
;
// forme CERCLE, PAD_RECT PAD_OVAL PAD_TRAPEZOID ou libre
m_Attribut
=
source
->
m_Attribut
;
// NORMAL, PAD_SMD, PAD_CONN, Bit 7 = STACK
...
...
pcbnew/edgemod.cpp
View file @
304525db
...
...
@@ -60,15 +60,11 @@ void WinEDA_ModuleEditFrame::Place_EdgeMod( EDGE_MODULE* Edge, wxDC* DC )
{
if
(
Edge
==
NULL
)
return
;
Edge
->
m_Start
.
x
-=
MoveVector
.
x
;
Edge
->
m_Start
.
y
-=
MoveVector
.
y
;
Edge
->
m_End
.
x
-=
MoveVector
.
x
;
Edge
->
m_End
.
y
-=
MoveVector
.
y
;
Edge
->
m_Start
-=
MoveVector
;
Edge
->
m_End
-=
MoveVector
;
Edge
->
m_Start0
.
x
-=
MoveVector
.
x
;
Edge
->
m_Start0
.
y
-=
MoveVector
.
y
;
Edge
->
m_End0
.
x
-=
MoveVector
.
x
;
Edge
->
m_End0
.
y
-=
MoveVector
.
y
;
Edge
->
m_Start0
-=
MoveVector
;
Edge
->
m_End0
-=
MoveVector
;
Edge
->
Draw
(
DrawPanel
,
DC
,
GR_OR
);
Edge
->
m_Flags
=
0
;
...
...
@@ -131,10 +127,8 @@ static void ShowEdgeModule( WinEDA_DrawPanel* panel, wxDC* DC, bool erase )
Edge
->
m_End
=
screen
->
m_Curseur
;
/* Mise a jour des coord relatives */
Edge
->
m_End0
.
x
=
Edge
->
m_End
.
x
-
Module
->
m_Pos
.
x
;
Edge
->
m_End0
.
y
=
Edge
->
m_End
.
y
-
Module
->
m_Pos
.
y
;
RotatePoint
(
(
int
*
)
&
Edge
->
m_End0
.
x
,
(
int
*
)
&
Edge
->
m_End0
.
y
,
-
Module
->
m_Orient
);
Edge
->
m_End0
=
Edge
->
m_End
-
Module
->
m_Pos
;
RotatePoint
(
&
Edge
->
m_End0
,
-
Module
->
m_Orient
);
Edge
->
Draw
(
panel
,
DC
,
GR_XOR
);
...
...
@@ -155,7 +149,7 @@ void WinEDA_ModuleEditFrame::Edit_Edge_Width( EDGE_MODULE* Edge )
{
MODULE
*
Module
=
GetBoard
()
->
m_Modules
;
SaveCopyInUndoList
(
Module
);
SaveCopyInUndoList
(
Module
,
UR_MODEDIT
);
if
(
Edge
==
NULL
)
{
...
...
@@ -205,7 +199,7 @@ void WinEDA_ModuleEditFrame::Edit_Edge_Layer( EDGE_MODULE* Edge )
return
;
}
SaveCopyInUndoList
(
Module
);
SaveCopyInUndoList
(
Module
,
UR_MODEDIT
);
if
(
Edge
==
NULL
)
{
...
...
@@ -341,7 +335,7 @@ EDGE_MODULE* WinEDA_ModuleEditFrame::Begin_Edge_Module( EDGE_MODULE* Edge,
if
(
Edge
==
NULL
)
/* Start a new edge item */
{
SaveCopyInUndoList
(
module
);
SaveCopyInUndoList
(
module
,
UR_MODEDIT
);
Edge
=
new
EDGE_MODULE
(
module
);
MoveVector
.
x
=
MoveVector
.
y
=
0
;
...
...
@@ -372,11 +366,9 @@ EDGE_MODULE* WinEDA_ModuleEditFrame::Begin_Edge_Module( EDGE_MODULE* Edge,
Edge
->
m_End
=
Edge
->
m_Start
;
/* Initialise the relative coordinates */
Edge
->
m_Start0
.
x
=
Edge
->
m_Start
.
x
-
module
->
m_Pos
.
x
;
Edge
->
m_Start0
.
y
=
Edge
->
m_Start
.
y
-
module
->
m_Pos
.
y
;
Edge
->
m_Start0
=
Edge
->
m_Start
-
module
->
m_Pos
;
RotatePoint
(
(
int
*
)
&
Edge
->
m_Start0
.
x
,
(
int
*
)
&
Edge
->
m_Start0
.
y
,
-
module
->
m_Orient
);
RotatePoint
(
&
Edge
->
m_Start0
,
-
module
->
m_Orient
);
Edge
->
m_End0
=
Edge
->
m_Start0
;
module
->
Set_Rectangle_Encadrement
();
...
...
@@ -401,9 +393,9 @@ EDGE_MODULE* WinEDA_ModuleEditFrame::Begin_Edge_Module( EDGE_MODULE* Edge,
// insert _after_ Edge, which is the same as inserting _before_ Edge->Next()
module
->
m_Drawings
.
Insert
(
newedge
,
Edge
->
Next
()
);
Edge
->
m_Flags
=
0
;
Edge
=
newedge
;
Edge
=
newedge
;
// point now new item
Edge
->
m_Flags
=
IS_NEW
;
Edge
->
m_Width
=
ModuleSegmentWidth
;
...
...
@@ -411,11 +403,9 @@ EDGE_MODULE* WinEDA_ModuleEditFrame::Begin_Edge_Module( EDGE_MODULE* Edge,
Edge
->
m_End
=
Edge
->
m_Start
;
/* Mise a jour des coord relatives */
Edge
->
m_Start0
.
x
=
Edge
->
m_Start
.
x
-
module
->
m_Pos
.
x
;
Edge
->
m_Start0
.
y
=
Edge
->
m_Start
.
y
-
module
->
m_Pos
.
y
;
Edge
->
m_Start0
=
Edge
->
m_Start
-
module
->
m_Pos
;
RotatePoint
(
(
int
*
)
&
Edge
->
m_Start0
.
x
,
(
int
*
)
&
Edge
->
m_Start0
.
y
,
-
module
->
m_Orient
);
RotatePoint
(
&
Edge
->
m_Start0
,
-
module
->
m_Orient
);
Edge
->
m_End0
=
Edge
->
m_Start0
;
...
...
@@ -425,7 +415,7 @@ EDGE_MODULE* WinEDA_ModuleEditFrame::Begin_Edge_Module( EDGE_MODULE* Edge,
}
}
else
DisplayError
(
this
,
wxT
(
"Begin_Edge() error"
)
);
wxMessageBox
(
wxT
(
"Begin_Edge() error"
)
);
}
return
Edge
;
}
...
...
@@ -439,16 +429,13 @@ void WinEDA_ModuleEditFrame::End_Edge_Module( EDGE_MODULE* Edge, wxDC* DC )
{
MODULE
*
Module
=
GetBoard
()
->
m_Modules
;
/* If last segment length is 0: deletion */
if
(
Edge
)
{
if
(
(
Edge
->
m_Start
.
x
==
Edge
->
m_End
.
x
)
&&
(
Edge
->
m_Start
.
y
==
Edge
->
m_End
.
y
)
)
{
Edge
->
m_Flags
=
0
;
/* If last segment length is 0: remove it */
if
(
Edge
->
m_Start
==
Edge
->
m_End
)
Edge
->
DeleteStructure
();
}
}
Edge
->
m_Flags
=
0
;
Module
->
Set_Rectangle_Encadrement
();
Module
->
m_LastEdit_Time
=
time
(
NULL
);
GetScreen
()
->
SetModify
();
...
...
pcbnew/edit.cpp
View file @
304525db
...
...
@@ -821,6 +821,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
case
ID_POPUP_PCB_IMPORT_PAD_SETTINGS
:
DrawPanel
->
MouseToCursorSchema
();
SaveCopyInUndoList
(
GetCurItem
()
->
GetParent
(),
UR_CHANGED
);
Import_Pad_Settings
(
(
D_PAD
*
)
GetCurItem
(),
true
);
break
;
...
...
@@ -835,6 +836,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
break
;
case
ID_POPUP_PCB_DELETE_PAD
:
SaveCopyInUndoList
(
GetCurItem
()
->
GetParent
(),
UR_CHANGED
);
DeletePad
(
(
D_PAD
*
)
GetCurItem
()
);
SetCurItem
(
NULL
);
DrawPanel
->
MouseToCursorSchema
();
...
...
pcbnew/editmod.cpp
View file @
304525db
...
...
@@ -110,7 +110,6 @@ void WinEDA_ModuleEditFrame::Place_Ancre( MODULE* pt_mod )
}
pt_mod
->
Set_Rectangle_Encadrement
();
DrawPanel
->
Refresh
();
}
...
...
pcbnew/modedit.cpp
View file @
304525db
...
...
@@ -475,20 +475,20 @@ void WinEDA_ModuleEditFrame::Process_Special_Functions( wxCommandEvent& event )
break
;
case
ID_POPUP_PCB_DELETE_PAD
:
SaveCopyInUndoList
(
GetBoard
()
->
m_Modules
);
SaveCopyInUndoList
(
GetBoard
()
->
m_Modules
,
UR_MODEDIT
);
DeletePad
(
(
D_PAD
*
)
GetScreen
()
->
GetCurItem
()
);
SetCurItem
(
NULL
);
DrawPanel
->
MouseToCursorSchema
();
break
;
case
ID_POPUP_PCB_IMPORT_PAD_SETTINGS
:
SaveCopyInUndoList
(
GetBoard
()
->
m_Modules
);
SaveCopyInUndoList
(
GetBoard
()
->
m_Modules
,
UR_MODEDIT
);
DrawPanel
->
MouseToCursorSchema
();
Import_Pad_Settings
(
(
D_PAD
*
)
GetScreen
()
->
GetCurItem
(),
true
);
break
;
case
ID_POPUP_PCB_GLOBAL_IMPORT_PAD_SETTINGS
:
SaveCopyInUndoList
(
GetBoard
()
->
m_Modules
);
SaveCopyInUndoList
(
GetBoard
()
->
m_Modules
,
UR_MODEDIT
);
Global_Import_Pad_Settings
(
(
D_PAD
*
)
GetScreen
()
->
GetCurItem
(),
true
);
DrawPanel
->
MouseToCursorSchema
();
break
;
...
...
@@ -526,7 +526,7 @@ void WinEDA_ModuleEditFrame::Process_Special_Functions( wxCommandEvent& event )
break
;
case
ID_POPUP_PCB_DELETE_TEXTMODULE
:
SaveCopyInUndoList
(
GetBoard
()
->
m_Modules
);
SaveCopyInUndoList
(
GetBoard
()
->
m_Modules
,
UR_MODEDIT
);
DeleteTextModule
(
(
TEXTE_MODULE
*
)
GetScreen
()
->
GetCurItem
()
);
SetCurItem
(
NULL
);
DrawPanel
->
MouseToCursorSchema
();
...
...
@@ -586,7 +586,7 @@ void WinEDA_ModuleEditFrame::Process_Special_Functions( wxCommandEvent& event )
break
;
case
ID_POPUP_PCB_DELETE_EDGE
:
SaveCopyInUndoList
(
GetBoard
()
->
m_Modules
);
SaveCopyInUndoList
(
GetBoard
()
->
m_Modules
,
UR_MODEDIT
);
DrawPanel
->
MouseToCursorSchema
();
RemoveStruct
(
GetScreen
()
->
GetCurItem
()
);
SetCurItem
(
NULL
);
...
...
@@ -597,7 +597,7 @@ void WinEDA_ModuleEditFrame::Process_Special_Functions( wxCommandEvent& event )
case
ID_MODEDIT_MODULE_SCALE
:
case
ID_MODEDIT_MODULE_SCALEX
:
case
ID_MODEDIT_MODULE_SCALEY
:
SaveCopyInUndoList
(
GetBoard
()
->
m_Modules
);
SaveCopyInUndoList
(
GetBoard
()
->
m_Modules
,
UR_MODEDIT
);
Transform
(
(
MODULE
*
)
GetScreen
()
->
GetCurItem
(),
id
);
redraw
=
true
;
break
;
...
...
pcbnew/modedit_onclick.cpp
View file @
304525db
...
...
@@ -31,12 +31,12 @@ void WinEDA_ModuleEditFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos )
switch
(
DrawStruct
->
Type
()
)
{
case
TYPE_TEXTE_MODULE
:
SaveCopyInUndoList
(
GetBoard
()
->
m_Modules
);
SaveCopyInUndoList
(
GetBoard
()
->
m_Modules
,
UR_MODEDIT
);
PlaceTexteModule
(
(
TEXTE_MODULE
*
)
DrawStruct
,
DC
);
break
;
case
TYPE_EDGE_MODULE
:
SaveCopyInUndoList
(
GetBoard
()
->
m_Modules
);
SaveCopyInUndoList
(
GetBoard
()
->
m_Modules
,
UR_MODEDIT
);
Place_EdgeMod
(
(
EDGE_MODULE
*
)
DrawStruct
,
DC
);
break
;
...
...
@@ -118,7 +118,7 @@ void WinEDA_ModuleEditFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos )
DrawStruct
=
ModeditLocateAndDisplay
();
if
(
DrawStruct
&&
(
DrawStruct
->
m_Flags
==
0
)
)
{
SaveCopyInUndoList
(
GetBoard
()
->
m_Modules
);
SaveCopyInUndoList
(
GetBoard
()
->
m_Modules
,
UR_MODEDIT
);
RemoveStruct
(
DrawStruct
);
SetCurItem
(
DrawStruct
=
NULL
);
}
...
...
@@ -126,26 +126,30 @@ void WinEDA_ModuleEditFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos )
break
;
case
ID_MODEDIT_PLACE_ANCHOR
:
SaveCopyInUndoList
(
GetBoard
()
->
m_Modules
);
Place_Ancre
(
GetBoard
()
->
m_Modules
);
GetBoard
()
->
m_Modules
->
m_Flags
=
0
;
{
MODULE
*
module
=
GetBoard
()
->
m_Modules
;
module
->
m_Flags
=
0
;
SaveCopyInUndoList
(
module
,
UR_MODEDIT
);
Place_Ancre
(
module
);
// set the new relatives internal coordinates of items
GetScreen
()
->
m_Curseur
=
wxPoint
(
0
,
0
);
Recadre_Trace
(
TRUE
);
Place_Module
(
GetBoard
()
->
m_Modules
,
DC
);
RedrawActiveWindow
(
DC
,
TRUE
);
// Replace the module in position 0, to recalculate absolutes coordinates of items
module
->
SetPosition
(
wxPoint
(
0
,
0
)
);
SetToolID
(
0
,
wxCURSOR_ARROW
,
wxEmptyString
);
SetCurItem
(
NULL
);
DrawPanel
->
Refresh
();
}
break
;
case
ID_TEXT_COMMENT_BUTT
:
SaveCopyInUndoList
(
GetBoard
()
->
m_Modules
);
SaveCopyInUndoList
(
GetBoard
()
->
m_Modules
,
UR_MODEDIT
);
CreateTextModule
(
GetBoard
()
->
m_Modules
,
DC
);
break
;
case
ID_MODEDIT_ADD_PAD
:
if
(
GetBoard
()
->
m_Modules
)
{
SaveCopyInUndoList
(
GetBoard
()
->
m_Modules
);
SaveCopyInUndoList
(
GetBoard
()
->
m_Modules
,
UR_MODEDIT
);
AddPad
(
GetBoard
()
->
m_Modules
,
true
);
}
break
;
...
...
pcbnew/modedit_undo_redo.cpp
View file @
304525db
...
...
@@ -12,23 +12,28 @@
#include "protos.h"
/**************************************************************************/
void
WinEDA_ModuleEditFrame
::
SaveCopyInUndoList
(
BOARD_ITEM
*
ItemToCopy
,
UndoRedoOpType
aTypeCommand
,
const
wxPoint
&
aTransformPoint
)
/************************************************************************/
/** Function SaveCopyInUndoList.
* Creates a new entry in undo list of commands.
* add a picker to handle aItemToCopy
* @param aItem = the board item modified by the command to undo
* @param aTypeCommand = command type (see enum UndoRedoOpType)
* @param aTransformPoint = the reference point of the transformation, for commands like move
*/
void
WinEDA_ModuleEditFrame
::
SaveCopyInUndoList
(
BOARD_ITEM
*
aItem
,
UndoRedoOpType
aTypeCommand
,
const
wxPoint
&
aTransformPoint
)
{
EDA_BaseStruct
*
item
;
MODULE
*
CopyItem
;
EDA_BaseStruct
*
item
;
MODULE
*
CopyItem
;
PICKED_ITEMS_LIST
*
lastcmd
;
CopyItem
=
new
MODULE
(
GetBoard
()
);
CopyItem
->
Copy
(
(
MODULE
*
)
ItemToCopy
);
CopyItem
->
Copy
(
(
MODULE
*
)
aItem
);
CopyItem
->
SetParent
(
GetBoard
()
);
lastcmd
=
new
PICKED_ITEMS_LIST
();
ITEM_PICKER
wrapper
(
CopyItem
);
lastcmd
->
PushItem
(
wrapper
);
ITEM_PICKER
wrapper
(
CopyItem
,
UR_MODEDIT
);
lastcmd
->
PushItem
(
wrapper
);
GetScreen
()
->
PushCommandToUndoList
(
lastcmd
);
/* Clear current flags (which can be temporary set by a current edit command) */
...
...
@@ -36,22 +41,28 @@ void WinEDA_ModuleEditFrame::SaveCopyInUndoList( BOARD_ITEM* ItemToCopy,
item
->
m_Flags
=
0
;
/* Clear redo list, because after new save there is no redo to do */
while
(
(
lastcmd
=
GetScreen
()
->
PopCommandFromRedoList
(
)
)
!=
NULL
)
{
while
(
1
)
{
wrapper
=
lastcmd
->
PopItem
();
if
(
wrapper
.
m_PickedItem
==
NULL
)
break
;
// All items are removed
delete
wrapper
.
m_PickedItem
;
}
delete
lastcmd
;
}
GetScreen
()
->
ClearUndoORRedoList
(
GetScreen
()
->
m_RedoList
);
}
/** Function SaveCopyInUndoList (overloaded).
* Creates a new entry in undo list of commands.
* add a list of pickers to handle a list of items
* @param aItemsList = the list of items modified by the command to undo
* @param aTypeCommand = command type (see enum UndoRedoOpType)
* @param aTransformPoint = the reference point of the transformation, for commands like move
*/
void
WinEDA_ModuleEditFrame
::
SaveCopyInUndoList
(
PICKED_ITEMS_LIST
&
aItemsList
,
UndoRedoOpType
aTypeCommand
,
const
wxPoint
&
aTransformPoint
)
{
// Currently Unused in modedit
wxMessageBox
(
wxT
(
"SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList..) not yet in use"
)
);
}
/*********************************************************/
void
WinEDA_ModuleEditFrame
::
GetComponentFromRedoList
(
wxCommandEvent
&
event
)
void
WinEDA_ModuleEditFrame
::
GetComponentFromRedoList
(
wxCommandEvent
&
event
)
/*********************************************************/
/* Redo the last edition:
...
...
@@ -59,15 +70,15 @@ void WinEDA_ModuleEditFrame::GetComponentFromRedoList(wxCommandEvent& event)
* - Get old version of the current edited library component
*/
{
if
(
GetScreen
()
->
GetRedoCommandCount
()
<=
0
)
if
(
GetScreen
()
->
GetRedoCommandCount
()
<=
0
)
return
;
PICKED_ITEMS_LIST
*
lastcmd
=
new
PICKED_ITEMS_LIST
();
ITEM_PICKER
wrapper
(
GetBoard
()
->
m_Modules
.
PopFront
()
);
lastcmd
->
PushItem
(
wrapper
);
ITEM_PICKER
wrapper
(
GetBoard
()
->
m_Modules
.
PopFront
(),
UR_MODEDIT
);
lastcmd
->
PushItem
(
wrapper
);
GetScreen
()
->
PushCommandToUndoList
(
lastcmd
);
lastcmd
=
GetScreen
()
->
PopCommandFromRedoList
(
);
lastcmd
=
GetScreen
()
->
PopCommandFromRedoList
();
wrapper
=
lastcmd
->
PopItem
();
...
...
@@ -82,7 +93,7 @@ void WinEDA_ModuleEditFrame::GetComponentFromRedoList(wxCommandEvent& event)
/***************************************************************************/
void
WinEDA_ModuleEditFrame
::
GetComponentFromUndoList
(
wxCommandEvent
&
event
)
void
WinEDA_ModuleEditFrame
::
GetComponentFromUndoList
(
wxCommandEvent
&
event
)
/***************************************************************************/
/* Undo the last edition:
...
...
@@ -90,15 +101,15 @@ void WinEDA_ModuleEditFrame::GetComponentFromUndoList(wxCommandEvent& event)
* - Get old version of the current edited library component
*/
{
if
(
GetScreen
()
->
GetUndoCommandCount
()
<=
0
)
if
(
GetScreen
()
->
GetUndoCommandCount
()
<=
0
)
return
;
PICKED_ITEMS_LIST
*
lastcmd
=
new
PICKED_ITEMS_LIST
();
ITEM_PICKER
wrapper
(
GetBoard
()
->
m_Modules
.
PopFront
()
);
lastcmd
->
PushItem
(
wrapper
);
ITEM_PICKER
wrapper
(
GetBoard
()
->
m_Modules
.
PopFront
(),
UR_MODEDIT
);
lastcmd
->
PushItem
(
wrapper
);
GetScreen
()
->
PushCommandToRedoList
(
lastcmd
);
lastcmd
=
GetScreen
()
->
PopCommandFromUndoList
(
);
lastcmd
=
GetScreen
()
->
PopCommandFromUndoList
();
wrapper
=
lastcmd
->
PopItem
();
...
...
pcbnew/move-drag_pads.cpp
View file @
304525db
...
...
@@ -9,6 +9,7 @@
#include "confirm.h"
#include "pcbnew.h"
#include "trigo.h"
#include "block_commande.h"
#include "drag.h"
...
...
@@ -310,7 +311,6 @@ void WinEDA_BasePcbFrame::PlacePad( D_PAD* Pad, wxDC* DC )
{
int
dX
,
dY
;
TRACK
*
Track
;
DRAG_SEGM
*
pt_drag
;
MODULE
*
Module
;
if
(
Pad
==
NULL
)
...
...
@@ -318,13 +318,60 @@ void WinEDA_BasePcbFrame::PlacePad( D_PAD* Pad, wxDC* DC )
Module
=
(
MODULE
*
)
Pad
->
GetParent
();
ITEM_PICKER
picker
(
NULL
,
UR_CHANGED
);
PICKED_ITEMS_LIST
pickList
;
/* Save dragged track segments in undo list */
for
(
DRAG_SEGM
*
pt_drag
=
g_DragSegmentList
;
pt_drag
;
pt_drag
=
pt_drag
->
Pnext
)
{
Track
=
pt_drag
->
m_Segm
;
// Set the old state
wxPoint
t_start
=
Track
->
m_Start
;
wxPoint
t_end
=
Track
->
m_End
;
if
(
pt_drag
->
m_Pad_Start
)
Track
->
m_Start
=
Pad_OldPos
;
if
(
pt_drag
->
m_Pad_End
)
Track
->
m_End
=
Pad_OldPos
;
picker
.
m_PickedItem
=
Track
;
pickList
.
PushItem
(
picker
);
}
/* Save old module and old items values */
wxPoint
pad_curr_position
=
Pad
->
m_Pos
;
Pad
->
m_Pos
=
Pad_OldPos
;
if
(
g_DragSegmentList
==
NULL
)
SaveCopyInUndoList
(
Module
,
UR_CHANGED
);
else
{
picker
.
m_PickedItem
=
Module
;
pickList
.
PushItem
(
picker
);
}
if
(
g_DragSegmentList
)
SaveCopyInUndoList
(
pickList
,
UR_CHANGED
);
/* Placement du pad */
Pad
->
m_Pos
=
pad_curr_position
;
Pad
->
Draw
(
DrawPanel
,
DC
,
GR_XOR
);
/* Save old module */
Pad
->
m_Pos
=
Pad_OldPos
;
SaveCopyInUndoList
(
Module
,
UR_CHANGED
);
Pad
->
m_Pos
=
GetScreen
()
->
m_Curseur
;
/* Redraw dragged track segments */
for
(
DRAG_SEGM
*
pt_drag
=
g_DragSegmentList
;
pt_drag
;
pt_drag
=
pt_drag
->
Pnext
)
{
Track
=
pt_drag
->
m_Segm
;
// Set the new state
if
(
pt_drag
->
m_Pad_Start
)
Track
->
m_Start
=
Pad
->
m_Pos
;
if
(
pt_drag
->
m_Pad_End
)
Track
->
m_End
=
Pad
->
m_Pos
;
Track
->
SetState
(
EDIT
,
OFF
);
if
(
DC
)
Track
->
Draw
(
DrawPanel
,
DC
,
GR_OR
);
}
/* Compute local coordinates (i.e refer to Module position and for Module orient = 0)*/
dX
=
Pad
->
m_Pos
.
x
-
Pad_OldPos
.
x
;
...
...
@@ -342,15 +389,6 @@ void WinEDA_BasePcbFrame::PlacePad( D_PAD* Pad, wxDC* DC )
Module
->
Set_Rectangle_Encadrement
();
Module
->
m_LastEdit_Time
=
time
(
NULL
);
/* Tracage des segments dragges */
pt_drag
=
g_DragSegmentList
;
for
(
;
pt_drag
;
pt_drag
=
pt_drag
->
Pnext
)
{
Track
=
pt_drag
->
m_Segm
;
Track
->
SetState
(
EDIT
,
OFF
);
if
(
DC
)
Track
->
Draw
(
DrawPanel
,
DC
,
GR_OR
);
}
EraseDragListe
();
...
...
pcbnew/onrightclick.cpp
View file @
304525db
This diff is collapsed.
Click to expand it.
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