OberonCore
https://forum.oberoncore.ru/

Отклик на движение мыши - Controllers.TraceMsg
https://forum.oberoncore.ru/viewtopic.php?f=134&t=6888
Страница 1 из 1

Автор:  adimetrius [ Воскресенье, 15 Январь, 2023 02:09 ]
Заголовок сообщения:  Отклик на движение мыши - Controllers.TraceMsg

Предлагаю отдельно обсудить.
arisu писал(а):
ещё не хватает штатных сообщений MouseEnter/MouseLeave, чтобы сделать нормальный hover.


Предлагаю для этой задачи использовать сообщение Controllers.TraceMsg:
Код:
      Controllers.TraceMsg* = RECORD (Controllers.CursorMessage)
         (* (.x, .y) is the obsolete mouse point; it may coincide with actual, i.e (x,y) ≍ (gx,gy), when mouse has just 'moved inside'. Mind that x.y is frame coordinates, while gx,gy is global *)
         modifiers*: SET;   (*** IN *)
         cursor*: INTEGER;   (** OUT; Iff pointer position defined (.gx # MAX(INTEGER)), .cursor is preset to -1; it may be assigned a desired cursor index. Doing so enables (but does not bind) the framework to *not* send another PollCursorMsg *)
         gx*, gy*: INTEGER;   (** IN; global actual mouse coordinates (as opposed to .x, .y, the obsolete mouse coordinates). .gx = MAX(INTEGER) => new mouse point is undefined (i.e. mouse has moved out of host window) *)
      END;
      (** Sent along the point path (i.e. the path in frame forest of all frames that encompass a point) when mouse movement occurs. (x,y) is the obsolete mouse point in frame coords, while (gx,gy) is the actual mouse point in global coords, or MAX(INTEGER), if the latter is undefined *)

Вместо "мышь вошла" "мышь вышла", которые потребовали бы определенных вычислений со стороны ФВ, я предлагаю одно, оч похожее на TrackMsg. Оно означает "мышь покинула точку x,y (отн. кадра) и вошла в точку gx,gy в глобальных координатах". Отправляется оно из StdWindows, и, будучи расширением CursorMessage, 1) обеспечивает приведение координат при передаче ко вложенным кадрам и 2) доставляется без усилий со стороны контейнера до оконечных видов.

Виды, которые хотят изменять свое изображение, делают это штатным образом: обрабатывают TraceMsg
в HandleCtrlMsg и, если необходимо, запрашивают отрисовку посредством Views.Update.

Я опробовал его на простом крестике-закрывателе и на оконечном виде в приложении. Пока не опробовал, каково им пользоваться в контейнере, который хочет реагировать на прохождение мыши.

Автор:  arisu [ Воскресенье, 15 Январь, 2023 02:13 ]
Заголовок сообщения:  Re: Отклик на движение мыши - Controllers.TraceMsg

я не очень понял: оно же будет доставляться только активному контролу, нет? или иначе его надо броадкастить (и тогда теряются автоматические преобразования координат)? в смысле — оно доставляется контролу «под мышкой», и получается, что все контролы должы быть в курсе реализации hover тогда. или я совсем неправильно вообразил?

Автор:  adimetrius [ Воскресенье, 15 Январь, 2023 02:25 ]
Заголовок сообщения:  Re: Отклик на движение мыши - Controllers.TraceMsg

А что такое активный контрол ;) таковой неизвестен фреймворку.

Нет, оно отправляется, как все CursorMessages: вглубь по дереву кадров последовательно каждому кадру, который объемлет точку x,y. И, как принято в ББ, любой вид на маршруте сообщения может не пропустить его дальше, или преобразовать, и т.п. - т.е. сохраняется правило, что контейнер полностью управляет потоком сообщений к содержимому.

И нет, это не ШВ-сообщение, ведь оно расширение Controllers.Message

Автор:  arisu [ Воскресенье, 15 Январь, 2023 02:54 ]
Заголовок сообщения:  Re: Отклик на движение мыши - Controllers.TraceMsg

adimetrius писал(а):
А что такое активный контрол ;) таковой неизвестен фреймворку.
front/marked. ;-)

adimetrius писал(а):
Нет, оно отправляется, как все CursorMessages: вглубь по дереву кадров последовательно каждому кадру, который объемлет точку x,y.
вот! то есть, MouseEnter получается, а MouseLeave — неа, потому что упс. то есть, до контрола, над которым сейчас мышь, среда сообщение спустит; а тот, над которым мышь была до этого — сиротинушка. а он же должен узнать, что мышь уехала, и надо перерисоваться без hover state. то есть, получается, что самый верхний фрэйм всё равно должен отслеживать состояние hover — и тогда почему уже не сделать MouseEnter/MouseLeave? или я опять запутался?

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/