如何处理 Spec 2 工具栏中的事件/检测按住 SHIFT 键?
How to handle the event / detect hold SHIFT key in Spec 2 toolbars?
我有一个工具栏 (SpToolbarPresenter
) 作为实例变量 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:
因为没有它我会收到一个奇怪的错误,例如“#cull: was sent to nil”。
此代码适用于第二个工具栏的按钮(我在工具栏上有两个),但不适用于第一个!第一个工具栏的按钮永远不会获得事件,因此永远不会调用 onCmd
。
那么,如何 1) 在单击工具栏的按钮时检测按住 SHIFT 或 2) 修复此代码,以便所有按钮都会收到此事件?任何帮助都会有用。
PS。 Windows 10,规格 2,Pharo-9.0.0+build.940.sha.deeec198ef752789431ee24667709a4a3ff87bda (64 Bit)
修复可能是:
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
测试:
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 ] ] ]
另外,即使没有直接关系,我也不得不说:使用完整的variable/method名字!它将使您的代码更具可读性:)
我有一个工具栏 (SpToolbarPresenter
) 作为实例变量 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:
因为没有它我会收到一个奇怪的错误,例如“#cull: was sent to nil”。
此代码适用于第二个工具栏的按钮(我在工具栏上有两个),但不适用于第一个!第一个工具栏的按钮永远不会获得事件,因此永远不会调用 onCmd
。
那么,如何 1) 在单击工具栏的按钮时检测按住 SHIFT 或 2) 修复此代码,以便所有按钮都会收到此事件?任何帮助都会有用。
PS。 Windows 10,规格 2,Pharo-9.0.0+build.940.sha.deeec198ef752789431ee24667709a4a3ff87bda (64 Bit)
修复可能是:
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
测试:
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 ] ] ]
另外,即使没有直接关系,我也不得不说:使用完整的variable/method名字!它将使您的代码更具可读性:)