36#include <wx/clipbrd.h>
82 wxASSERT_MSG(
stateStack.empty(), wxT(
"StateStack not empty!" ) );
162 auto state = std::make_unique<TOOL_STATE>( *
this );
228 std::map<TOOL_BASE*, TOOL_STATE*>::iterator it, it_end;
232 delete it->second->cofunc;
244 wxT(
"Adding two tools with the same name may result in unexpected behavior.") );
246 wxT(
"Adding two tools with the same ID may result in unexpected behavior.") );
248 wxT(
"Adding two tools of the same type may result in unexpected behavior.") );
251 wxS(
"TOOL_MANAGER::RegisterTool: Registering tool %s with ID %d" ),
302 wxASSERT_MSG(
false, wxString::Format(
"Could not find action %s.", aActionName ) );
331 COMMIT* aCommit,
bool aFromAPI )
344 event.SetParameter( aParam );
355 std::atomic<SYNCRONOUS_TOOL_STATE> synchronousControl =
STS_FINISHED;
357 event.SetSynchronous( &synchronousControl );
358 event.SetCommit( aCommit );
389 wxASSERT_MSG( aFromAPI, wxT(
"Deferred actions have no way of guaranteeing the "
390 "lifetime of the COMMIT object" ) );
391 event.SetCommit( aCommit );
448 wxASSERT( aTool !=
nullptr );
463 wxASSERT( aTool !=
nullptr );
465 wxString msg = wxString::Format( wxS(
"TOOL_MANAGER::runTool - running tool %s" ), aTool->
GetName() );
470 wxASSERT_MSG(
false, wxT(
"You cannot run unregistered tools" ) );
519 for(
auto id : tmpList )
527 for(
auto id : tmpList )
553 wxLogTrace(
kicadTraceToolStack, wxS(
"TOOL_MANAGER::ShutdownTool - no tool with name %s" ),
560 wxASSERT( aTool !=
nullptr );
566 TOOL_MANAGER::ID_LIST::iterator it = std::find(
m_activeTools.begin(),
582 wxS(
"TOOL_MANAGER::ShutdownTool - Shutting down tool %s" ),
598 std::map<TOOL_ID, TOOL_STATE*>::const_iterator it =
m_toolIdIndex.find( aId );
601 return it->second->theTool;
609 std::map<std::string, TOOL_STATE*>::const_iterator it =
m_toolNameIndex.find( aName );
612 return it->second->theTool;
639 tool->
Reset( aReason );
660 wxS(
"TOOL_MANAGER initialization of tool '%s' failed" ),
687 if( tool == aToolId )
732 wxCHECK( st->
cofunc,
nullptr );
747 bool handled =
false;
749 wxLogTrace(
kicadTraceToolStack, wxS(
"TOOL_MANAGER::dispatchInternal - received event: %s" ),
758 bool increment =
true;
785 wxS(
"TOOL_MANAGER::dispatchInternal - Waking tool %s for event: %s" ),
801 wxS(
"TOOL_MANAGER::dispatchInternal - tool %s stopped passing "
816 bool finished =
false;
824 if( tr.first.Matches( aEvent ) )
826 auto func_copy = tr.second;
837 st->
vcSettings = std::move( viewControlSettings );
843 wxS(
"TOOL_MANAGER::dispatchInternal - Running tool %s for "
870 wxLogTrace(
kicadTraceToolStack, wxS(
"TOOL_MANAGER::dispatchInternal - %s handle event: %s" ),
871 ( handled ? wxS(
"Did" ) : wxS(
"Did not" ) ), aEvent.
Format() );
888 wxLogTrace(
kicadTraceToolStack, wxS(
"TOOL_MANAGER::dispatchActivation - Received event: %s" ),
898 wxS(
"TOOL_MANAGER::dispatchActivation - Running tool %s for event: %s" ),
899 tool->second->theTool->GetName(), aEvent.
Format() );
901 runTool( tool->second->theTool );
942 for(
const std::pair<const TOOL_ID, TOOL_STATE*>& idState :
m_toolIdIndex )
947 if( vc.m_forceCursorPosition )
957 std::unique_ptr<ACTION_MENU> menu( m->
Clone() );
962 if( wxWindow* frame =
dynamic_cast<wxWindow*
>(
m_frame ) )
963 frame->PopupMenu( menu.get() );
966 if( menu->GetSelected() >= 0 )
993 for(
const std::pair<
const TOOL_ID,
1027 if( !aState->
Pop() )
1033 aState->
idle =
true;
1059#if defined( __WXMAC__ )
1060 wxTheApp->ProcessPendingEvents();
1083 return active->vcSettings;
1091 static int currentId;
1136 it->second = std::nullopt;
1142 std::optional<VECTOR2D>
cursor = it->second;
1205 wxLogTrace(
kicadTraceToolStack, wxS(
"TOOL_MANAGER::processEvent - %s handle event: %s" ),
1206 ( handled ?
"Did" :
"Did not" ), aEvent.
Format() );
1231 return !it->second->idle;
Manage TOOL_ACTION objects.
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
Represent a set of changes (additions, deletions or modifications) of a data model (e....
bool Call(ArgType aArg)
Start execution of a coroutine, passing args as its arguments.
void KiYield()
Stop execution of the coroutine and returns control to the caller.
bool Resume()
Resume execution of a previously yielded coroutine.
void RunMainStack(std::function< void()> func)
Run a functor inside the application main stack context.
The base frame for deriving all KiCad main window classes.
virtual void UpdateStatusBar()
Update the status bar information.
A base class for most all the KiCad significant classes used in schematics and boards.
An interface for classes handling user events controlling the view behavior such as zooming,...
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
A type-safe container of any type.
bool has_value() const noexcept
Report whether there is a contained object or not.
Base window classes and related definitions.
const wxChar *const kicadTraceToolStack
Flag to enable tracing of the tool handling stack.
void AddTransactionBreadcrumb(const wxString &aMsg, const wxString &aCategory)
Add a transaction breadcrumb.
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
Structure to keep VIEW_CONTROLS settings for easy store/restore operations.
VECTOR2D m_forcedPosition
Forced cursor position (world coordinates).
bool m_forceCursorPosition
Is the forced cursor position enabled.
wxLogTrace helper definitions.
VECTOR2< double > VECTOR2D
VECTOR2D ToVECTOR2D(const wxPoint &aPoint)