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

问题描述

我有一个工具栏 (SpToolbarPresenter) 作为实例 var toolbar,我有一个 #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 键。但是,我仍然需要 #action:,因为没有它我会收到一个奇怪的错误,比如“#cul​​l: was sent to nil”。

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

那么,如何 1) 在单击工具栏按钮时检测按住 SHIFT 或 2) 修复此代码,以便所有按钮都会收到此事件?任何帮助都会有所帮助。

附注。 Windows 10,规范 2,Pharo-9.0.0+build.940.sha.deeec198ef752789431ee24667709a4a3ff87bda (64 Bit)

解决方法

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

updatePresenter

    commands do: [ :aCommand | 
        | button |
        button := self newToolbarButton
                   label: aCommand name;
                   action: [  ];
                   help: aCommand help.
        toolbar addItem: button.
        button eventHandler whenMouseDownDo: [ :event | 
            event shiftPressed ifTrue: [
                self onCmd: aCommand name event: event ] ] ]

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

,

修复方法可能是:

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 个按钮,然后为它们创建新的处理程序。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...