Распространение событий в 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."
Лучшее, что я могу придумать, это что-то вроде следующего (в порядке увеличения плавности и уменьшения вероятности работы)
- Запишите событие, уберите прозрачное изображение и воспроизведите событие. Это кажется неэффективным и плохим способом сделать это.
- Каким-то образом отследите, что находится за вашим прозрачным изображением, и передайте ему событие. Я не знаком с этими библиотеками, поэтому я не знаю, возможно ли это сделать таким образом. Если у вас есть контроль над другими слоями, это наиболее вероятный путь. (Вы можете напрямую вызывать их функции "события мыши произошли" с помощью mouseDownEvent, хотя вам все равно нужно определить, кто из них получит его).
- Просто объявите это как что-то, что не передает ему события мыши на любом доступном уровне. Окна OSD имеют тенденцию делать это, я не уверен как. Если вы можете сделать это таким образом, я бы посоветовал это... но, учитывая, что вы задаете этот вопрос, вы, вероятно, не можете.