OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 13:05

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




Начать новую тему Ответить на тему  [ Сообщений: 57 ]  На страницу 1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: Вторник, 20 Август, 2013 23:54 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
В качестве зарядки для ума сегодня рассмотрели теоретическую возможность оформления подсветки скобок (а так же автокомплита) посредством встраивания в текстовый документ специального якоря, внутри которого могла бы происходить обработка сигналов, приходящих в родительский контейнер, и соответствующие бескровные изменения на лету.

Таким образом, посредством встраивания вьюшки может происходить уточнение назначения текстового документа, введение новой функциональности и всё тому подобное. Как бы, бб даёт нам тексты вообще, и чисто случайно оказывается, что рядом лежит компилятор, а теперь мы встраиваем девелоперские якоря и уже точно фиксируем то, что этот текст является исходником. Якоря в тексте - фича сезона "Весна-лето 2013" :D

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

Причины этого, в принципе, понятны, в бесконечных документах может быть неограниченно много отображений, роутинг каждого сообщения в каждое из отображений занимал бы довольно много времени.

Вместе с этим, непонятно, почему не предусмотрена возможность создания спец-отображений, которые могли бы получать соответствующее сообщение даже находясь в невидимой зоне. Избегать злоупотребления можно было бы специальными механизмами, всё же лучше ограничения, чем полная невозможность.

Однако, в самих текстах есть вполне конкретные средства взаимодействия с внедрёнными отображениями, через хендлер HandlePropMsg. Вот что удалось выяснить:
  • TextSetters.Pref приходит в отображение, когда оно есть на экране. Это и понятно, сеттеры вроде как занимаются размещением блоков текста на фрейме, подготавливая их к отрисовке.
  • TextControllers.FilterPref приходит когда юзер производит активность мышью, но в эту активность не включена прокрутка. То есть, движения и нажатия кнопок. Важный момент, FilterPref приходят даже когда отображения не видно на экране. Это уже интереснее
  • TextModels.Pref это самая интересная фича. Сообщение приходит на каждый чих. Оно инициируется напрямую из TextModels.Reader при каждом чтении, то есть, почти всегда, реально, это самый надёжный способ узнать про активность в документе (прокрутка, движение курсора, ввод текста, всё подряд). При этом, сообщение событийное, то есть не нужны экшны и обёртывание отображений или контроллеров.

Далее, как мы уже знаем из прошлых сообщений про якоря, отображение внутри контейнера может получить доступ к своему предку. Но остаётся проблема, отображение получает сигналы в остальные хендлеры (Model, View, Ctrl) только когда оно видимое. А эти хендлеры нам нужны, чтобы получать самое важное сообщение в рамках задачи автокомплита - сообщение TextModels.UpdateMsg.

Решение нам подсказывает документация (а на самом деле - исходник DevMarkers). Можно создать отображение и внедрить его в текст таким образом, что для текста ничего не изменится. В свою очередь само отображение не будет давать себя сохранять в документе, используя метод Stores.Store.ExternalizeAs.

Итак, всё готово, чтобы приступить к набору текстов в ББ.


Последний раз редактировалось Пётр Кушнир Среда, 21 Август, 2013 00:13, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 21 Август, 2013 00:07 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Реализуем два отображения.
Первое - стандартный якорь. Висит в тексте, сохраняется, загружается.
В нём будем слушать три сообщения, о которых я говорил ранее. Для начала будем реагировать на самое надёжное, TextModels.Pref.
Реагируя на него мы понимаем, что-то или кто-то меняет текст, в котором мы сейчас находимся.

Реализуем второе отображение.
Назовём его курсором. Напишем такой код в первом отображении, который будет размещать единственный курсор в видимой области текстового отображения, если его там нет, а так же код будет следить за тем, чтобы курсор был единственный в тексте. Вставка/удаление курсора никак не влияет на содержимое текста. Это даёт нам возможность манипулировать курсором постоянно. В то же время, курсор, находясь в видимой области, получает все возможные сообщения.

Остаётся пара шагов, сделать вставку курсора в текст отложенным действием (как выяснилась, если изменить модель сразу по получении TextModels.Pref то будет ошибка), и реализовать метод курсора ThisModel, для того чтобы курсор мог ловить модельные сообщения от текста.

Вуаля. Мы получили без всяких обёрток и прочей сложной фигни способ реагирования на изменения в тексте документа. Можете изучить документацию по TextModels.UpdateMsg это реально мощное сообщение, почти все операции будут подконтрольны нашему курсору.

Для проверки концепции реализуем вывод в лог символов, введённых в текст. Ровно таким же способом можно реализовать отслеживание позиции текстового курсора для мгновенных реакций, типа подстановки угаданного слова, или там, замены аттрибутов перед скобками.

Такие дела. Код в аттаче. Курсор красненький, якорь чёрненький.
Изображение
На написание модуля потрачено 3 часа, всего было 6 тыс. нажатий клавиш. Такая вот статистика.


Вложения:
Ctrl.odc [6.74 КБ]
Скачиваний: 766
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 21 Август, 2013 00:22 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
В предоставленном примере никак пока не обрабатываются различные нештатные ситуации, типа удаления курсора руками, или прочее.
В целом, алгоритм действий такой - жмём коммандер внизу модуля, набираем тексты под якорем, а когда наберём достаточно много, то прокрутка скроет якорь, а курсор сам переместится в левый верхний угол.
Возможно, для него лучше подойдёт форма тонкой линии вверху документа, которая будет всегда переносить строку после себя.
Дальнейшие шаги такие - в обработку изменений текста встраиваются механизмы, например, частичного фонового разбора исходника, некие механизмы подбора, и результирующая строка в блоке выделения подставляется под текстовый курсор. Пользователь жмёт дальше символ - выделение забивается, подбирается новый вариант.
Но это уже отдельный проект, конечно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 21 Август, 2013 15:46 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Да это же автокомплит! :mrgreen:
Изображение


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 21 Август, 2013 15:54 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Если вам чего-то в ББ не хватает, то это только по причине вашей лени.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Август, 2013 15:53 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Поступательное развитие механизмов, которые приведут к автокомплиту можно наблюдать здесь https://bitbucket.org/akastargazer/bb.o ... 3200cefd02
А можно даже поделиться ценной информацией насчёт модных молодёжных тенденций в области автокомплита и прочего анализа исходных данных за промежуток времени меньший, чем среднее время зрительной реакции человека.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Август, 2013 20:01 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Пётр Кушнир писал(а):
Поступательное развитие механизмов, которые приведут к автокомплиту можно наблюдать здесь https://bitbucket.org/akastargazer/bb.o ... 3200cefd02
А можно даже поделиться ценной информацией насчёт модных молодёжных тенденций в области автокомплита и прочего анализа исходных данных за промежуток времени меньший, чем среднее время зрительной реакции человека.

Пётр, а возможно ли к разрабатываему вами подходу прикрутить подсветку парных скобок? Привел в приличный вид: viewtopic.php?f=47&t=4376&p=81825#p81825
Все работает там почти идеально за исключением того, что обертки дают отстойный побочный эффект!!! Большой текст при прокрутке начинает мелькать и тормозить. А раз тут механизм без оберток, то и тормозов таких не дожно быть ведь. А то обидно, такая фишка пропадает из-за этого мелькания.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Август, 2013 21:16 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Да, модуль ypkTextProbe предоставляет функции низкоуровневого слежения за текстовой моделью, в том числе и за перемещением курсора.
Просто разместите в тексте якорь ypkTextProbe и он сразу начнёт вещать в межмодульную шину об изменениях.
А в своём модуле реализуйте что-то типа
Код:
   PROCEDURE HandleBusMsg* (VAR msg: ANYREC);
   BEGIN
      WITH msg: ypkTextProbe.NotifyMsg DO
         IF (msg.model = TextViews.FocusText()) THEN (* работаем только с сообщениями из активного текста *)
            ваш код по работе со скобками
         END
      ELSE END
   END HandleBusMsg;

Подробнее про сообщение NotifyMsg можно узнать в документации. Единственная проблема - таких сообщений будет много, ведь они сообщают о наиболее низкоуровневых операциях, поэтому возможно вам придётся чуть оптимизировать код.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 26 Август, 2013 11:23 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Как выяснилось, работа с TextModels.Pref имеет один недостаток, если в тексте после позиции якоря находится ещё одно отображение, то сообщение Pref направляется ему, а не якорю. И ещё обнаружилось, что даже TextSetters.Pref долетают до якоря только если он находится в окрестности видимой области текста, не превышающей длину кэша TextModels.Reader. Такая вот неприятность.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 26 Август, 2013 12:47 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 717
Откуда: Барнаул
Пётр Кушнир писал(а):
Такая вот неприятность.

Пётр, а как ты планируешь обойти ещё одну неприятность в области автодополнения кода, когда имя модуля может не совпадать с именем файла, да и реализаций модуля(т.е. файлов) может быть несколько, например под разное окружение: Windows, Linux, A2 и т.п.?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 26 Август, 2013 13:34 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Kemet писал(а):
...имя модуля может не совпадать с именем файла, да и реализаций модуля(т.е. файлов) может быть несколько, например под разное окружение: Windows, Linux, A2 и т.п.?
Я считаю, что без введения понятия "проекта" тут не обойтись. Стандартные соглашения ББ тесноваты. А системе автодополнения всё равно, кто ей подсунет словарь.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 26 Август, 2013 16:02 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Пётр Кушнир писал(а):
Как выяснилось ... Такая вот неприятность.

Закопал концепцию курсора в тексте, реализовал несохраняемую обёртку текстового контроллера. Но размещением обёртки при загрузке документа занимается всё тот же якорь-шпион. Таким образом, мы оставляем за собой возможность регулировать поведение сервиса автокомплита в разных документах.


Последний раз редактировалось Пётр Кушнир Понедельник, 26 Август, 2013 16:08, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 26 Август, 2013 16:06 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Kemet писал(а):
Пётр Кушнир писал(а):
Такая вот неприятность.

Пётр, а как ты планируешь обойти ещё одну неприятность в области автодополнения кода, когда имя модуля может не совпадать с именем файла, да и реализаций модуля(т.е. файлов) может быть несколько, например под разное окружение: Windows, Linux, A2 и т.п.?
Ну, ядро ББ как-то справляется, значит, способы есть.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 26 Август, 2013 16:09 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Пётр Кушнир писал(а):
Подробнее про сообщение NotifyMsg можно узнать в документации. Единственная проблема - таких сообщений будет много, ведь они сообщают о наиболее низкоуровневых операциях, поэтому возможно вам придётся чуть оптимизировать код.

В плане интерфейса ничего не изменилось, всё работает, как раньше.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 26 Август, 2013 16:17 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Пётр Кушнир писал(а):
Пётр Кушнир писал(а):
Как выяснилось ... Такая вот неприятность.

Закопал концепцию курсора в тексте, реализовал несохраняемую обёртку текстового контроллера. Но размещением обёртки при загрузке документа занимается всё тот же якорь-шпион. Таким образом, мы оставляем за собой возможность регулировать поведение сервиса автокомплита в разных документах.

Пётр, у тебя текст не мелькает при прокрутке?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 26 Август, 2013 16:27 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Нет.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 26 Август, 2013 19:02 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4695
Откуда: Россия, Орёл
Иван Денисов писал(а):
Пётр Кушнир писал(а):
Пётр Кушнир писал(а):
Как выяснилось ... Такая вот неприятность.

Закопал концепцию курсора в тексте, реализовал несохраняемую обёртку текстового контроллера. Но размещением обёртки при загрузке документа занимается всё тот же якорь-шпион. Таким образом, мы оставляем за собой возможность регулировать поведение сервиса автокомплита в разных документах.

Пётр, у тебя текст не мелькает при прокрутке?

Тут стоит указывать в каком окружении: под wine - проблемы с большими текстами есть.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 26 Август, 2013 21:55 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Борис, насколько я понял, Иван интересовался о влиянии новой обёртки на флики. Я коротко ответил, уходил с работы.
Могу пояснить, что в принципе, обёртка контроллера не должна влиять на флики при прокрутке, так как прокрутка основную нагрузку производит перерасчётом сеттеров, которые при большой длительности действительно могут задержать перерисовку и вызвать флик.
А насчёт обёртки отображения, которую реализовал Иван, я пробовал её, она на моём компьютере лишь немного замедляет прокрутку, однако никаких морганий нет.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 26 Август, 2013 22:22 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Между тем, наконец-то реализовал связку механизма, который следит за вводом пользователя и механизма, который предоставляет функции словаря. И оно даже работает.
http://www.youtube.com/watch?v=ZEc1erqb ... e=youtu.be
Практической ценности у автокомплита ключевых слов конечно нет, руки не успевают среагировать на подсказку и набирают всё сами :) Но если реализовать службу, которая будет дополнять словарь всякими полезными словами, например названиями модулей и процедур, то наверное, автокомплит будет иметь смысл. И даже заслужит себе звание отдельного компонента.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 27 Август, 2013 13:14 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Возник такой вопрос, какие ещё функции по контролю над исходником могут быть полезны человеку, помимо автоподстановки окончаний слов и всяких названий полей/методов/сигнатур процедур и функций?
Вот, например, подсветка скобочек под курсором. Автогенерация тела процедуры/цикла/рекорда после ввода заголовка. Что ещё?
Нужны идеи для того, чтобы нарастить функциональные возможности механизма якоря/обёртки и потом уже переключиться в режим наращивания мощности конкретных прикладных механизмов.


Последний раз редактировалось Пётр Кушнир Вторник, 27 Август, 2013 16:03, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 57 ]  На страницу 1, 2, 3  След.

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


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

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


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

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