У меня есть панель инструментов (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, Spec 2, Pharo-9.0.0+build.940.sha.deeec198ef752789431ee24667709a4a3ff87bda (64 Bit)

.

RandomB

Ответов: 2

Ответы (2)

как говорит @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 кнопок, а затем создать для них новые обработчики.

2022 WebDevInsider