[英]How to handle the event / detect hold SHIFT key in Spec 2 toolbars?
我有一個工具欄( 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:
因為沒有它我會收到一個奇怪的錯誤,例如“#cull: was sent to nil”。
此代碼適用於第二個工具欄的按鈕(我在工具欄上有兩個),但不適用於第一個,第一個工具欄的按鈕永遠不會獲得事件,因此永遠不會調用onCmd
。
那么,如何 1)在單擊工具欄按鈕時檢測按住 SHIFT 或 2)修復此代碼,以便所有按鈕都會收到此事件? 任何幫助都會很有用。
PS。 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
然后為它們創建新的處理程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.