Распространение событий в Morphic GUI - PullRequest
9 голосов
/ 19 января 2010

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

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

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

_____________________________ <- basic morph

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

Ответы [ 2 ]

2 голосов
/ 18 июля 2012

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

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

Например:

MyMorph>>rejectsEvent: anEvent
  ^ true "Ignores all events."
2 голосов
/ 14 июля 2010

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

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