OberonCore
https://forum.oberoncore.ru/

Прокрутка документов и StdScrollbars
https://forum.oberoncore.ru/viewtopic.php?f=134&t=6943
Страница 1 из 2

Автор:  arisu [ Суббота, 13 Май, 2023 21:39 ]
Заголовок сообщения:  Прокрутка документов и StdScrollbars

окей, я на днях постараюсь адаптировать.

кстати, скроллбары в mainline работают немного неверно, если их мышью таскать. попробуйте: он очень быстро уходит в десинк, если схватить за ползунок и тащить его вниз. если хотите — можете взять у меня в LC StdScrollbars и адаптировать вычисления. там, в принципе, просто можно взять весь код кроме рисовалки (а рисовалку старую засунуть).

p.s.: не будете против, если я в StdWindows ещё фильтры засуну, чтобы можно было потом перетащить код жестов (ну, то, что на видео в теме LC) на mainline без особых напрягов? это просто список объектов-фильтров, по умолчанию он пустой, и делает ничего.

Автор:  arisu [ Четверг, 18 Май, 2023 09:27 ]
Заголовок сообщения:  Re: BlackBox 2.0

я, по ходу, совсем переделал StdScrollbars, фирменная вещь, надо брать. потому что там скроллинг вправо-влево вообще был сломан (любой скроллинг, где partSize ненулевой, тащемта). проверить просто: открываем любую форму как документ. тащим таб в правый трек (чтобы появился скроллбар). пытаемся таскать knob. страшна.

Автор:  arisu [ Четверг, 18 Май, 2023 10:13 ]
Заголовок сообщения:  Re: BlackBox 2.0

и заодно предлагаю добавить в Ports процедуры для преобразований HSV ↔ RGB. они маленькие, но очень полезные для, например, darken/brighten. о! или вообще сделать модуль Colors, куда и цветов больше докинуть, и всякое для работы с цветами. в 2023-м манипулировать цветами надо намного чаще, чем в 90-х, а модуль можно сделать полностью герметичным (за исключением импорта [S]Math). сейчас у себя так и сделаю, наверное.

Автор:  Иван Денисов [ Четверг, 18 Май, 2023 13:03 ]
Заголовок сообщения:  Re: BlackBox 2.0

arisu писал(а):
я, по ходу, совсем переделал StdScrollbars, фирменная вещь, надо брать. потому что там скроллинг вправо-влево вообще был сломан (любой скроллинг, где partSize ненулевой, тащемта). проверить просто: открываем любую форму как документ. тащим таб в правый трек (чтобы появился скроллбар). пытаемся таскать knob. страшна.

Просто из вашей сборки можно попробовать перенести, или там существенные переделки под ветку blackbox20 нужны?

Автор:  arisu [ Четверг, 18 Май, 2023 15:24 ]
Заголовок сообщения:  Re: BlackBox 2.0

Иван Денисов писал(а):
Просто из вашей сборки можно попробовать перенести, или там существенные переделки под ветку blackbox20 нужны?
только выкинуть мою рисовалку и аккуратно воткнуть старую. чуть-чуть изменений в том, что `Recalc()` кладёт вычисленые параметры в запись, а не возвращает, рисовалку надо будет с учётом этого подрихтовать. остальное должно работать, там чисто немного рефакторинга, да математика другая.

p.s.: а, я ещё поле `isV` переименовал в `vertical`. надо переименовать обратно (или поправить StdDocuments).

Автор:  Иван Денисов [ Четверг, 18 Май, 2023 15:34 ]
Заголовок сообщения:  Re: BlackBox 2.0

arisu писал(а):
Иван Денисов писал(а):
Просто из вашей сборки можно попробовать перенести, или там существенные переделки под ветку blackbox20 нужны?
только выкинуть мою рисовалку и аккуратно воткнуть старую. чуть-чуть изменений в том, что `Recalc()` кладёт вычисленые параметры в запись, а не возвращает, рисовалку надо будет с учётом этого подрихтовать. остальное должно работать, там чисто немного рефакторинга, да математика другая.

p.s.: а, я ещё поле `isV` переименовал в `vertical`. надо переименовать обратно (или поправить StdDocuments).

хорошо, я попробую, скролы надо починить

Автор:  Иван Денисов [ Пятница, 19 Май, 2023 20:32 ]
Заголовок сообщения:  Re: BlackBox 2.0

Перенёс ваш код для StdScrollbars, и вот заметил такой момент, что ни в старом варианте, ни в новом до конца вид не прокручивается, там должно до красной полоски и ещё поле документа в пять пикселей примерно, а прокручивается только до синей линии. Сможете помочь это исправить?

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

Вложения:
notSide.png
notSide.png [ 9.22 КБ | Просмотров: 6204 ]

Автор:  arisu [ Пятница, 19 Май, 2023 23:58 ]
Заголовок сообщения:  Re: Прокрутка документов и StdScrollbars

окей, я на днях постараюсь посмотреть, что там происходит. раз уж взялся — будем допиливать, а то некультурно так оставлять. ;-)

Автор:  arisu [ Суббота, 20 Май, 2023 12:34 ]
Заголовок сообщения:  Re: Прокрутка документов и StdScrollbars

всё, моя починить. обновления и в StdDocuments (неправильные вычисления границ), и в StdScrollbars (неправильные вычисления, неправильная отрисовка при таскании кноба).

простите, на mainline не адаптировал (сейчас на это силов и временов нет), но там не так много изменений, можно просто дифом глянуть.

Автор:  Иван Денисов [ Понедельник, 22 Май, 2023 20:40 ]
Заголовок сообщения:  Re: Прокрутка документов и StdScrollbars

arisu писал(а):
всё, моя починить. обновления и в StdDocuments (неправильные вычисления границ), и в StdScrollbars (неправильные вычисления, неправильная отрисовка при таскании кноба).

простите, на mainline не адаптировал (сейчас на это силов и временов нет), но там не так много изменений, можно просто дифом глянуть.

Спасибо, внёс правки. Стало лучше!

Автор:  Иван Денисов [ Понедельник, 22 Май, 2023 20:52 ]
Заголовок сообщения:  Re: Прокрутка документов и StdScrollbars

Заметил, что в режиме маски, у меня ползунки не перемещаются мышью, только колёсиком. У вас также?

Автор:  Иван Денисов [ Понедельник, 22 Май, 2023 20:59 ]
Заголовок сообщения:  Re: Прокрутка документов и StdScrollbars

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

Автор:  arisu [ Понедельник, 22 Май, 2023 23:13 ]
Заголовок сообщения:  Re: Прокрутка документов и StdScrollbars

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

блин, надо себе тудушник уже нормальный сделать. есть же вот BBCB, ну! ;-)

Автор:  Иван Денисов [ Суббота, 27 Май, 2023 22:02 ]
Заголовок сообщения:  Re: Прокрутка документов и StdScrollbars

Заметил ещё такой недочёт появился, что полоска стала появляться не справа документа, а бывает сдвинута от края.
Самый простой вариант воспроизвести ошибку — F1, F2.
Вложение:
scrollbarposition.png
scrollbarposition.png [ 75.8 КБ | Просмотров: 5790 ]


Arusi, у вас также воспроизводится ошибка, или это я что-то не так может перенёс?

Автор:  arisu [ Суббота, 27 Май, 2023 22:41 ]
Заголовок сообщения:  Re: Прокрутка документов и StdScrollbars

а, там всё интересней: если менять размеры треков, то видно, что она дёргается, как будто где-то потеряли обработчик изменения размеров (у меня тоже). я подозреваю примерно, в чём дело. спасибо, постараюсь посмотреть ASAP и сказать, что фиксить.

Автор:  arisu [ Понедельник, 29 Май, 2023 02:01 ]
Заголовок сообщения:  Re: Прокрутка документов и StdScrollbars

в общем, доклада́ю. бага два. баг нумеро уно в отцеплении окон: там надо починить DoOpen:
заменить
Код:
   IF (d # NIL) & (d.context # NIL) THEN view := Views.CopyOf(view, Views.shallow); d := NIL END

на:
Код:
   IF (d # NIL) & (d.context # NIL) THEN
      IF FALSE THEN
         view := Views.CopyOf(view, Views.shallow); d := NIL
      ELSE   (* need to do it this way, otherwise BAD THINGS HAPPENS! *)
         d := DuplicateAs(d, Documents.dir);
         view := d.ThisView()
      END
   END;

`DuplicateAs()` забрать из `StdWindows`, например. это чинит скроллбары (в том числе баг с «двойным» скроллбаром).

баг нумеро до: надо в `StdDocuments.Restore()` заменить:
Код:
   IF m.unit = 0 THEN DoRecalc(d, f.unit, forceRecalc) END;

на:
Код:
VAR
   …
   dw, dh: INTEGER;

   (* k8: we need to recalc if document size was changed. fixes bug with scrollbars in subwindows. *)
   d.context.GetSize(^dw, ^dh);
   IF (m.unit = 0) OR (d.prevW # dw) OR (d.prevH # dh) THEN DoRecalc(d, f.unit, forceRecalc) END;
   d.prevW := dw; d.prevH := dh;

и добавить поля `prevW, prevH: INTEGER` в запись документа.

и мелкобаг нумеро тре, бонусный: в StdScrollbars, в процедуте `TrackShaft()` в конце заменить:
Код:
      f.Input(x, y, mod, isDown)
   UNTIL ~isDown

на:
Код:
      IF f.rider # NIL THEN f.Input(x, y, mod, isDown) END
   UNTIL (f.rider = NIL) OR ~isDown


rationale: в StdDocuments раньше всё это дело охранял просто `m.unit`, но и то не очень надёжно. теперь мы во-первых, создаём фрэймы документа ещё до того, как отрисуется его окно (а потом окно рисуется, и размеры могут опять поменяться; а один restore в невидимую область уже был, `m.unit` установлена); а во-вторых, при изменении размеров треков юнит каков был — таков и есть. а размеры поменялись. надо пересчитать скроллбары и прочее — а никто этого не делает. точнее, делают, но очень потом, не вовремя, и не всегда.

потому надо помнить размеры документа с прошлой отрисовки, и если они поменялись — то рихтовать всё заново.

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

от так уот.

p.s.: там ещё тонкости механики с subwindows, в которые я здесь вникать не буду. скажу только, что они ответственны за то, что слово для леса и мира одно^w^w^w^w^w^w скроллбары для недубликатов более-менее работали при изменени размеров именно потому, что не-дубликаты.

Автор:  arisu [ Понедельник, 29 Май, 2023 02:59 ]
Заголовок сообщения:  Re: Прокрутка документов и StdScrollbars

насчёт скролла только колесом в режиме маски: я не понял логики. штука в том, что `StdDocuments.Scroll()` делает вот такую проверку: `& (~msg.focus OR ~HasFocus(mv, g))`. в режиме маски у нас всегда есть элемент с фокусом, поэтому ой. я ни разу не понял, зачем оно там: это очень похоже на ошибку копипасты.

с колесом я делаю так: посылаю сообщение Scroll, если оно никем не обработано (т.е. msg.done = FALSE), то посылаю сообщение Wheel. дальше штатно.

в `Scroll()` же сообщение Scroll тоже посылается, но затем флаг done игнорируется, если есть фокус. я сильно подозреваю, что должно быть вот так: `IF (g = NIL) OR ~msg.done OR ~msg.focus OR ~HasFocus(mv, g) THEN` — т.е. везде `OR`, а не `&`. себе так и сделал, посмотрю, что сломается. ;-)

Автор:  Иван Денисов [ Понедельник, 29 Май, 2023 10:10 ]
Заголовок сообщения:  Re: Прокрутка документов и StdScrollbars

Перенёс правки, как их понял, и теперь положение скролбаров явно лучше!

Заменил на OR тоже, стало обрабатываться перемещение ползунка. Пока не вижу, какие от этого могут быть проблемы.

При откреплении окна правда что-то всё равно неверно вычисляется, и появляется горизонтальная полоса прокрутки.

"Расщепление" лифта полосы прокрутки тоже пока имеет место быть.

Еще такой заметил недочёт, что полоса прокрутки рисуется много раз при прокрутке документа в сторону колесом.

Вложение:
vlcsnap-2023-05-29-14h07m31s965.png
vlcsnap-2023-05-29-14h07m31s965.png [ 181.79 КБ | Просмотров: 5657 ]


Может быть эти два недочёта как-то связаны с тем, как берётся квадрат для пиксель-буферизованного скролла?

Автор:  arisu [ Понедельник, 29 Май, 2023 10:15 ]
Заголовок сообщения:  Re: Прокрутка документов и StdScrollbars

это у вас баг с битмаповым скроллом и отцеплеными окнами — то, о чём я в теме LC писал. для отцепленых окон всегда используется битмаповый скролл, а он в принципе неработоспособен. замените в `Views.ScrollFrame()` строчку `bitmapScrolling := TRUE;` на `bitmapScrolling := FALSE;`. всё равно эта штука толком не работает — и не будет, пока я там всё полностью не перепишу.

Автор:  Иван Денисов [ Понедельник, 29 Май, 2023 10:25 ]
Заголовок сообщения:  Re: Прокрутка документов и StdScrollbars

Иван Денисов писал(а):
Заменил на OR тоже, стало обрабатываться перемещение ползунка. Пока не вижу, какие от этого могут быть проблемы.

Заметил, что изменилось. Если Ctrl зажат, то раньше если курсор был над полем ввода в режиме маски, то шла прокрутка документа, а теперь не идёт.

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