Smalltalk 如何处理Spec 2工具栏中的事件/检测按住SHIFT键?

Smalltalk 如何处理Spec 2工具栏中的事件/检测按住SHIFT键?,smalltalk,pharo,Smalltalk,Pharo,我有一个工具栏SpToolbarPresenter作为实例变量工具栏,我有一个updatePresenter实现作为: updatePresenter cmds isEmpty ifTrue: [ ^ self ]. btnHandlers := cmds collect: [ :cmd | | btn | btn := SpToolbarButtonPresenter

我有一个工具栏SpToolbarPresenter作为实例变量工具栏,我有一个updatePresenter实现作为:

updatePresenter

    cmds isEmpty ifTrue: [ ^ self ].

    btnHandlers := cmds collect: [ :cmd | 
                          | btn |
                          btn := SpToolbarButtonPresenter new
                                     label: cmd name;
                                     action: [];
                                     help: cmd help.
                          toolbar addItem: btn.
                          (SpEventHandler for: btn) whenMouseDownDo: [ :ev | 
                              self onCmd: cmd name event: ev ] ]
我使用SpEventHandler而不是action:因为我想在单击工具栏按钮时检测按住SHIFT键。但是,我仍然需要该操作:因为没有它,我会得到一个奇怪的错误,如cull:被发送到nil

这段代码适用于第二个工具栏的按钮我在工具栏上有两个按钮,但第一个按钮不适用!第一个工具栏的按钮永远不会获取事件,因此永远不会调用onCmd

所以,如何在单击工具栏按钮时检测按住SHIFT键,或2修复此代码,以便所有按钮都将获得此事件?任何帮助都是有用的

PS.Windows 10,规范2,Pharo-9.0.0+build.940.sha.deeec198EF752789431EE24667709A4 A3FF87BDA 64位

修复程序可能是:

updatePresenter

    cmds do: [ :cmd | 
        | btn |
        btn := SpToolbarButtonPresenter new
                   label: cmd name;
                   action: [  ];
                   help: cmd help.
        toolbar addItem: btn.
        btn eventHandler whenMouseDownDo: [ :ev | 
            self onCmd: cmd name event: ev ] ]
测试-它的工作。想法是使用按钮的eventHandler,然后为它们创建新的处理程序。

修复可能是:

updatePresenter

    cmds do: [ :cmd | 
        | btn |
        btn := SpToolbarButtonPresenter new
                   label: cmd name;
                   action: [  ];
                   help: cmd help.
        toolbar addItem: btn.
        btn eventHandler whenMouseDownDo: [ :ev | 
            self onCmd: cmd name event: ev ] ]

测试-它的工作。我们的想法是使用按钮的eventHandler,然后为它们创建新的处理程序。

正如@RandomB所说,但也添加了一个shiftPressed测试:


此外,即使没有直接关系,我也不能避免说:使用完整的变量/方法名!它将使您的代码更具可读性:

正如@RandomB所说,但也添加了一个shiftPressed测试:

此外,即使没有直接关系,我也不能避免说:使用完整的变量/方法名!这将使您的代码更具可读性: