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
def53707
Commit
def53707
authored
May 14, 2014
by
Maciej Suminski
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
TOOL_MANAGER is no longer static. Reworked autoregistration of TOOL_ACTIONs.
parent
ae4f41c3
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
70 additions
and
60 deletions
+70
-60
action_manager.cpp
common/tool/action_manager.cpp
+4
-0
context_menu.cpp
common/tool/context_menu.cpp
+6
-9
tool_manager.cpp
common/tool/tool_manager.cpp
+1
-8
tool_action.h
include/tool/tool_action.h
+13
-4
tool_manager.h
include/tool/tool_manager.h
+14
-13
wxBasePcbFrame.h
include/wxBasePcbFrame.h
+1
-1
basepcbframe.cpp
pcbnew/basepcbframe.cpp
+2
-2
board_undo_redo.cpp
pcbnew/board_undo_redo.cpp
+2
-2
edit.cpp
pcbnew/edit.cpp
+3
-3
pcbframe.cpp
pcbnew/pcbframe.cpp
+5
-5
pcb_tools.cpp
pcbnew/tools/pcb_tools.cpp
+19
-13
No files found.
common/tool/action_manager.cpp
View file @
def53707
...
...
@@ -50,6 +50,7 @@ void ACTION_MANAGER::RegisterAction( TOOL_ACTION* aAction )
// action name without specifying at least toolName is not valid
assert
(
aAction
->
GetName
().
find
(
'.'
,
0
)
!=
std
::
string
::
npos
);
// TOOL_ACTIONs must have unique names & ids
assert
(
m_actionNameIndex
.
find
(
aAction
->
m_name
)
==
m_actionNameIndex
.
end
()
);
assert
(
m_actionIdIndex
.
find
(
aAction
->
m_id
)
==
m_actionIdIndex
.
end
()
);
...
...
@@ -60,6 +61,8 @@ void ACTION_MANAGER::RegisterAction( TOOL_ACTION* aAction )
if
(
aAction
->
HasHotKey
()
)
m_actionHotKeys
[
aAction
->
m_currentHotKey
].
push_back
(
aAction
);
aAction
->
setActionMgr
(
this
);
}
...
...
@@ -69,6 +72,7 @@ void ACTION_MANAGER::UnregisterAction( TOOL_ACTION* aAction )
m_actionIdIndex
.
erase
(
aAction
->
m_id
);
// Indicate that the ACTION_MANAGER no longer care about the object
aAction
->
setActionMgr
(
NULL
);
aAction
->
setId
(
-
1
);
if
(
aAction
->
HasHotKey
()
)
...
...
common/tool/context_menu.cpp
View file @
def53707
...
...
@@ -73,14 +73,8 @@ CONTEXT_MENU::CONTEXT_MENU( const CONTEXT_MENU& aMenu ) :
void
CONTEXT_MENU
::
setupEvents
()
{
Connect
(
wxEVT_MENU_HIGHLIGHT
,
wxEventHandler
(
CONTEXT_MENU
::
onMenuEvent
),
NULL
,
this
);
Connect
(
wxEVT_COMMAND_MENU_SELECTED
,
wxEventHandler
(
CONTEXT_MENU
::
onMenuEvent
),
NULL
,
this
);
// Workaround for the case when mouse cursor never reaches menu (it hangs up tools using menu)
wxMenuEvent
menuEvent
(
wxEVT_MENU_HIGHLIGHT
,
-
1
,
this
);
AddPendingEvent
(
menuEvent
);
Connect
(
wxEVT_MENU_HIGHLIGHT
,
wxEventHandler
(
CONTEXT_MENU
::
onMenuEvent
),
NULL
,
this
);
Connect
(
wxEVT_COMMAND_MENU_SELECTED
,
wxEventHandler
(
CONTEXT_MENU
::
onMenuEvent
),
NULL
,
this
);
}
...
...
@@ -191,8 +185,11 @@ void CONTEXT_MENU::onMenuEvent( wxEvent& aEvent )
}
}
assert
(
m_tool
);
// without tool & tool manager we cannot handle events
// forward the action/update event to the TOOL_MANAGER
TOOL_MANAGER
::
Instance
().
ProcessEvent
(
*
evt
);
if
(
evt
&&
m_tool
)
m_tool
->
GetManager
()
->
ProcessEvent
(
*
evt
);
}
...
...
common/tool/tool_manager.cpp
View file @
def53707
...
...
@@ -103,14 +103,6 @@ TOOL_MANAGER::TOOL_MANAGER() :
TOOL_MANAGER
::~
TOOL_MANAGER
()
{
DeleteAll
();
delete
m_actionMgr
;
}
void
TOOL_MANAGER
::
DeleteAll
()
{
std
::
map
<
TOOL_BASE
*
,
TOOL_STATE
*>::
iterator
it
,
it_end
;
...
...
@@ -122,6 +114,7 @@ void TOOL_MANAGER::DeleteAll()
}
m_toolState
.
clear
();
delete
m_actionMgr
;
}
...
...
include/tool/tool_action.h
View file @
def53707
...
...
@@ -52,12 +52,12 @@ public:
m_currentHotKey
(
aDefaultHotKey
),
m_menuItem
(
aMenuItem
),
m_menuDescription
(
aMenuDesc
),
m_id
(
-
1
)
{
TOOL_MANAGER
::
Instance
().
RegisterAction
(
this
);
TOOL_MANAGER
::
GetActionList
().
push_back
(
this
);
}
~
TOOL_ACTION
()
{
TOOL_MANAGER
::
Instance
().
UnregisterAction
(
this
);
TOOL_MANAGER
::
GetActionList
().
remove
(
this
);
}
bool
operator
==
(
const
TOOL_ACTION
&
aRhs
)
const
...
...
@@ -195,6 +195,12 @@ private:
m_id
=
aId
;
}
/// Assigns ACTION_MANAGER object that handles the TOOL_ACTION.
void
setActionMgr
(
ACTION_MANAGER
*
aManager
)
{
m_actionMgr
=
aManager
;
}
/// Name of the action (convention is: app.[tool.]action.name)
std
::
string
m_name
;
...
...
@@ -219,11 +225,14 @@ private:
/// Unique ID for fast matching. Assigned by ACTION_MANAGER.
int
m_id
;
/// Action manager that handles this TOOL_ACTION.
ACTION_MANAGER
*
m_actionMgr
;
/// Origin of the action
// const TOOL_BASE* m_origin;
// const TOOL_BASE* m_origin;
/// Originating UI object
// wxWindow* m_uiOrigin;
// wxWindow* m_uiOrigin;
};
#endif
include/tool/tool_manager.h
View file @
def53707
...
...
@@ -48,20 +48,10 @@ class wxWindow;
class
TOOL_MANAGER
{
public
:
static
TOOL_MANAGER
&
Instance
()
{
static
TOOL_MANAGER
manager
;
return
manager
;
}
TOOL_MANAGER
();
~
TOOL_MANAGER
();
/**
* Deletes all the tools that were registered in the TOOL_MANAGER.
*/
void
DeleteAll
();
/**
* Generates an unique ID from for a tool with given name.
*/
...
...
@@ -251,9 +241,20 @@ public:
m_passEvent
=
true
;
}
private
:
TOOL_MANAGER
();
/**
* Returns list of TOOL_ACTIONs. TOOL_ACTIONs add themselves to the list upon their
* creation.
* @return List of TOOL_ACTIONs.
*/
static
std
::
list
<
TOOL_ACTION
*>&
GetActionList
()
{
// TODO I am afraid this approach won't work when we reach multitab version of kicad.
static
std
::
list
<
TOOL_ACTION
*>
actionList
;
return
actionList
;
}
private
:
struct
TOOL_STATE
;
typedef
std
::
pair
<
TOOL_EVENT_LIST
,
TOOL_STATE_FUNC
>
TRANSITION
;
...
...
include/wxBasePcbFrame.h
View file @
def53707
...
...
@@ -90,7 +90,7 @@ protected:
/// main window.
wxAuiToolBar
*
m_auxiliaryToolBar
;
TOOL_MANAGER
&
m_toolManager
;
TOOL_MANAGER
*
m_toolManager
;
TOOL_DISPATCHER
*
m_toolDispatcher
;
void
updateGridSelectBox
();
...
...
pcbnew/basepcbframe.cpp
View file @
def53707
...
...
@@ -133,10 +133,10 @@ END_EVENT_TABLE()
PCB_BASE_FRAME
::
PCB_BASE_FRAME
(
KIWAY
*
aKiway
,
wxWindow
*
aParent
,
FRAME_T
aFrameType
,
const
wxString
&
aTitle
,
const
wxPoint
&
aPos
,
const
wxSize
&
aSize
,
long
aStyle
,
const
wxString
&
aFrameName
)
:
EDA_DRAW_FRAME
(
aKiway
,
aParent
,
aFrameType
,
aTitle
,
aPos
,
aSize
,
aStyle
,
aFrameName
),
m_toolManager
(
TOOL_MANAGER
::
Instance
()
)
EDA_DRAW_FRAME
(
aKiway
,
aParent
,
aFrameType
,
aTitle
,
aPos
,
aSize
,
aStyle
,
aFrameName
)
{
m_Pcb
=
NULL
;
m_toolManager
=
NULL
;
m_toolDispatcher
=
NULL
;
m_DisplayPadFill
=
true
;
// How to draw pads
...
...
pcbnew/board_undo_redo.cpp
View file @
def53707
...
...
@@ -637,7 +637,7 @@ void PCB_EDIT_FRAME::GetBoardFromUndoList( wxCommandEvent& aEvent )
// Inform tools that undo command was issued
TOOL_EVENT
event
(
TC_MESSAGE
,
TA_UNDO_REDO
,
AS_GLOBAL
);
m_toolManager
.
ProcessEvent
(
event
);
m_toolManager
->
ProcessEvent
(
event
);
/* Get the old list */
PICKED_ITEMS_LIST
*
List
=
GetScreen
()
->
PopCommandFromUndoList
();
...
...
@@ -660,7 +660,7 @@ void PCB_EDIT_FRAME::GetBoardFromRedoList( wxCommandEvent& aEvent )
// Inform tools that redo command was issued
TOOL_EVENT
event
(
TC_MESSAGE
,
TA_UNDO_REDO
,
AS_GLOBAL
);
m_toolManager
.
ProcessEvent
(
event
);
m_toolManager
->
ProcessEvent
(
event
);
/* Get the old list */
PICKED_ITEMS_LIST
*
List
=
GetScreen
()
->
PopCommandFromRedoList
();
...
...
pcbnew/edit.cpp
View file @
def53707
...
...
@@ -1391,15 +1391,15 @@ void PCB_EDIT_FRAME::OnSelectTool( wxCommandEvent& aEvent )
// Cancel the current tool
// TODO while sending a lot of cancel events works for sure, it is not the most
// elegant way to cancel a tool, this should be probably done another way
while
(
m_toolManager
.
GetCurrentTool
()
->
GetName
()
!=
"pcbnew.InteractiveSelection"
&&
while
(
m_toolManager
->
GetCurrentTool
()
->
GetName
()
!=
"pcbnew.InteractiveSelection"
&&
trials
++
<
MAX_TRIALS
)
{
TOOL_EVENT
cancel
(
TC_ANY
,
TA_CANCEL_TOOL
);
m_toolManager
.
ProcessEvent
(
cancel
);
m_toolManager
->
ProcessEvent
(
cancel
);
}
if
(
!
actionName
.
empty
()
)
m_toolManager
.
RunAction
(
actionName
);
m_toolManager
->
RunAction
(
actionName
);
}
}
else
...
...
pcbnew/pcbframe.cpp
View file @
def53707
...
...
@@ -495,9 +495,9 @@ void PCB_EDIT_FRAME::SetBoard( BOARD* aBoard )
ViewReloadBoard
(
aBoard
);
// update the tool manager with the new board and its view.
m_toolManager
.
SetEnvironment
(
aBoard
,
GetGalCanvas
()
->
GetView
(),
GetGalCanvas
()
->
GetViewControls
(),
this
);
m_toolManager
.
ResetTools
(
TOOL_BASE
::
MODEL_RELOAD
);
m_toolManager
->
SetEnvironment
(
aBoard
,
GetGalCanvas
()
->
GetView
(),
GetGalCanvas
()
->
GetViewControls
(),
this
);
m_toolManager
->
ResetTools
(
TOOL_BASE
::
MODEL_RELOAD
);
}
}
...
...
@@ -677,9 +677,9 @@ void PCB_EDIT_FRAME::UseGalCanvas( bool aEnable )
ViewReloadBoard
(
m_Pcb
);
GetGalCanvas
()
->
GetView
()
->
RecacheAllItems
();
m_toolManager
.
SetEnvironment
(
m_Pcb
,
GetGalCanvas
()
->
GetView
(),
m_toolManager
->
SetEnvironment
(
m_Pcb
,
GetGalCanvas
()
->
GetView
(),
GetGalCanvas
()
->
GetViewControls
(),
this
);
m_toolManager
.
ResetTools
(
TOOL_BASE
::
MODEL_RELOAD
);
m_toolManager
->
ResetTools
(
TOOL_BASE
::
MODEL_RELOAD
);
GetGalCanvas
()
->
StartDrawing
();
}
...
...
pcbnew/tools/pcb_tools.cpp
View file @
def53707
...
...
@@ -24,6 +24,7 @@
#include <wx/wx.h>
#include <wx/event.h>
#include <boost/foreach.hpp>
#include <wxPcbStruct.h>
#include <wxBasePcbFrame.h>
...
...
@@ -45,8 +46,8 @@
void
PCB_EDIT_FRAME
::
setupTools
()
{
// Create the manager and dispatcher & route draw panel events to the dispatcher
m_toolManager
=
TOOL_MANAGER
::
Instance
()
;
m_toolDispatcher
=
new
TOOL_DISPATCHER
(
&
m_toolManager
,
this
);
m_toolManager
=
new
TOOL_MANAGER
;
m_toolDispatcher
=
new
TOOL_DISPATCHER
(
m_toolManager
,
this
);
GetGalCanvas
()
->
SetEventDispatcher
(
m_toolDispatcher
);
// Connect handlers to toolbar buttons
...
...
@@ -59,26 +60,31 @@ void PCB_EDIT_FRAME::setupTools()
wxCommandEventHandler
(
PCB_EDIT_FRAME
::
onGenericCommand
),
NULL
,
this
);
#endif
// Register actions
std
::
list
<
TOOL_ACTION
*>&
actionList
=
m_toolManager
->
GetActionList
();
BOOST_FOREACH
(
TOOL_ACTION
*
action
,
actionList
)
m_toolManager
->
RegisterAction
(
action
);
// Register tools
m_toolManager
.
RegisterTool
(
new
SELECTION_TOOL
);
m_toolManager
.
RegisterTool
(
new
ROUTER_TOOL
);
m_toolManager
.
RegisterTool
(
new
EDIT_TOOL
);
m_toolManager
.
RegisterTool
(
new
DRAWING_TOOL
);
m_toolManager
.
RegisterTool
(
new
POINT_EDITOR
);
m_toolManager
.
RegisterTool
(
new
PCBNEW_CONTROL
);
m_toolManager
->
RegisterTool
(
new
SELECTION_TOOL
);
m_toolManager
->
RegisterTool
(
new
ROUTER_TOOL
);
m_toolManager
->
RegisterTool
(
new
EDIT_TOOL
);
m_toolManager
->
RegisterTool
(
new
DRAWING_TOOL
);
m_toolManager
->
RegisterTool
(
new
POINT_EDITOR
);
m_toolManager
->
RegisterTool
(
new
PCBNEW_CONTROL
);
m_toolManager
.
SetEnvironment
(
NULL
,
GetGalCanvas
()
->
GetView
(),
GetGalCanvas
()
->
GetViewControls
(),
this
);
m_toolManager
.
ResetTools
(
TOOL_BASE
::
RUN
);
m_toolManager
->
SetEnvironment
(
NULL
,
GetGalCanvas
()
->
GetView
(),
GetGalCanvas
()
->
GetViewControls
(),
this
);
m_toolManager
->
ResetTools
(
TOOL_BASE
::
RUN
);
// Run the selection tool, it is supposed to be always active
m_toolManager
.
InvokeTool
(
"pcbnew.InteractiveSelection"
);
m_toolManager
->
InvokeTool
(
"pcbnew.InteractiveSelection"
);
}
void
PCB_EDIT_FRAME
::
destroyTools
()
{
m_toolManager
.
DeleteAll
()
;
delete
m_toolManager
;
delete
m_toolDispatcher
;
}
...
...
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