Распространение событий в Morphic GUI

У меня есть изображение для Squeak Morphic GUI, которое содержит некоторые прозрачные части и, следовательно, не должно принимать никаких событий мыши и т. Д., Но должно быть видимым, но оно должно быть видно перед другими морфами.

Вот почему я подумал, что было бы полезно распространить появляющиеся мышиные события на основные морфы. Кто-нибудь знает решение моей проблемы или другое предложение для ее решения.

    V                         <- mouseDownEvent
_____________________________ <- transparent image (BorderedMorph)
  _____    _____     _____
_|     |___|    |___|     |__ <- buttons waiting for click and drop events

_____________________________ <- basic morph

Я надеюсь, что это иллюстрирует мою проблему.

2 ответа

По умолчанию события морфической мыши обрабатываются самым верхним морфом. Тем не менее, родительский морф способен перехватывать #mouseDown детям, использующим #mouseDownPriority,

Ваше прозрачное изображение получает все клики, потому что оно самое верхнее. Взгляни на #rejectsEvent:, Это объединяет #isLocked а также #visible отклонить события. Вы можете переопределить это, чтобы отклонить события, даже если они видны.

Например:

MyMorph>>rejectsEvent: anEvent
  ^ true "Ignores all events."

Лучшее, что я могу придумать, это что-то вроде следующего (в порядке увеличения плавности и уменьшения вероятности работы)

  1. Запишите событие, уберите прозрачное изображение и воспроизведите событие. Это кажется неэффективным и плохим способом сделать это.
  2. Каким-то образом отследите, что находится за вашим прозрачным изображением, и передайте ему событие. Я не знаком с этими библиотеками, поэтому я не знаю, возможно ли это сделать таким образом. Если у вас есть контроль над другими слоями, это наиболее вероятный путь. (Вы можете напрямую вызывать их функции "события мыши произошли" с помощью mouseDownEvent, хотя вам все равно нужно определить, кто из них получит его).
  3. Просто объявите это как что-то, что не передает ему события мыши на любом доступном уровне. Окна OSD имеют тенденцию делать это, я не уверен как. Если вы можете сделать это таким образом, я бы посоветовал это... но, учитывая, что вы задаете этот вопрос, вы, вероятно, не можете.
Другие вопросы по тегам