kicad学习笔记5:事件处理

文章详细介绍了如何定义并关联pickerSubTool事件,包括在actions.h和actions.cpp中创建TOOL_ACTION,通过PCB_PICKER_TOOL类的setTransitions()方法将事件与处理函数Go绑定,以及在Main函数中处理事件。EDIT_TOOL::pickReferencePoint()负责调用该事件。
摘要由CSDN通过智能技术生成

1.pickerSubTool事件

1.1 定义事件

actions.h文件中定义一个TOOL_ACTION

class ACTIONS
{
  static TOOL_ACTION pickerSubTool;
}

actions.cpp文件中实现

TOOL_ACTION ACTIONS::pickerSubTool( "common.InteractivePicker.pickerSubTool",
        AS_GLOBAL );

1.2 关联事件与事件处理函数

void PCB_PICKER_TOOL::setTransitions()
{
 
    Go( &PCB_PICKER_TOOL::Main, ACTIONS::pickerSubTool.MakeEvent() );
}

事件处理函数与Go在同一个文件中,也就是说在事件处理函数中关联事件与事件处理函数

int PCB_PICKER_TOOL::Main( const TOOL_EVENT& aEvent )
{
    VECTOR2D cursorPos;

    while( TOOL_EVENT* evt = Wait() )
    {
        setCursor();
        cursorPos =  controls->GetMousePosition();

        if( m_snap )
        {
            grid.SetSnap( !evt->Modifier( MD_SHIFT ) );
            grid.SetUseGrid( getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
            cursorPos = grid.BestSnapAnchor( cursorPos, nullptr );
            controls->ForceCursorPosition( true, cursorPos );
        }
}

注意:PCB_PICKER_TOOL::Main和PCB_PICKER_TOOL::setTransitions()都在PCB_PICKER_TOOL类中定义。

MakeEvent()是TOOL_ACTION的一个函数,该函数创造一个TOOL_ACTION实例:

TOOL_EVENT TOOL_ACTION::MakeEvent() const
{
    if( IsActivation() )
        return TOOL_EVENT( TC_COMMAND, TA_ACTIVATE, m_name, m_scope, m_param );
    else if( IsNotification() )
        return TOOL_EVENT( TC_MESSAGE, TA_NONE, m_name, m_scope, m_param );
    else
        return TOOL_EVENT( TC_COMMAND, TA_ACTION, m_name, m_scope, m_param );
}

TOOL_ACTION构造函数:

  TOOL_EVENT( TOOL_EVENT_CATEGORY aCategory, TOOL_ACTIONS aAction,
            const std::string& aExtraParam, TOOL_ACTION_SCOPE aScope = AS_GLOBAL,
            void* aParameter = nullptr ) :
        m_category( aCategory ),
        m_actions( aAction ),
        m_scope( aScope ),
        m_mouseButtons( 0 ),
        m_keyCode( 0 ),
        m_modifiers( 0 ),
        m_param( aParameter ),
        m_firstResponder( nullptr )
    {
        if( aCategory == TC_COMMAND || aCategory == TC_MESSAGE )
            m_commandStr = aExtraParam;

        init();
    }

1.3事件的调用

edit_tool.cpp文件中调用

 EDIT_TOOL::pickReferencePoint(...)
 {
 ...
   m_toolMgr->RunAction( ACTIONS::pickerSubTool, true );
   ...
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haimianjie2012

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值