OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 11:11

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
СообщениеДобавлено: Воскресенье, 15 Январь, 2023 02:09 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Предлагаю отдельно обсудить.
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.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 15 Январь, 2023 02:13 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1163
я не очень понял: оно же будет доставляться только активному контролу, нет? или иначе его надо броадкастить (и тогда теряются автоматические преобразования координат)? в смысле — оно доставляется контролу «под мышкой», и получается, что все контролы должы быть в курсе реализации hover тогда. или я совсем неправильно вообразил?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 15 Январь, 2023 02:25 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
А что такое активный контрол ;) таковой неизвестен фреймворку.

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 15 Январь, 2023 02:54 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1163
adimetrius писал(а):
А что такое активный контрол ;) таковой неизвестен фреймворку.
front/marked. ;-)

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB