OberonCore
https://forum.oberoncore.ru/

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

Автор:  arisu [ Пятница, 12 Май, 2023 18:01 ]
Заголовок сообщения:  Позиционирование и размеры документа StdDocuments

ещё мелкобаг: вчисления размера секций в StdDocuments не учитывает скроллбары. чтобы увидеть, почему это нужно, надо поставить в `StdDocuments.InitDefaults()` — `p.sbSide := left;` (т.е. скроллбары слева). и тут же внизу возникает горизонтальный скроллбар, который делает ничего. чтобы починить, надо в `PollSection` сделать так:
к переменным добавить:
Код:
   sbsize: INTEGER;
   m: StdModel;

и заменить старый код:
Код:
   IF msg.vertical THEN
      ps := h (* f.b - f.t *); vs := b + t; p := -v.y
   ELSE
      ps := w (* f.r - f.l *) ; vs := r + l;  p := -v.x
   END;

на новый:
Код:
   IF v.model IS StdModel THEN
      m := v.model(AS StdModel);
      IF m.unit > 0 THEN sbsize := m.param.sbThickness * (Ports.point - Ports.point MOD m.unit)
      ELSE sbsize := 0
      END
   ELSE m := NIL; sbsize := 0
   END;
   IF msg.vertical THEN
      ps := h (*f.b - f.t*); vs := b + t; p := -v.y;
      IF (m # NIL) & ~m.showH THEN sbsize := 0 END
   ELSE
      ps := w (*f.r - f.l*); vs := r + l; p := -v.x;
      IF (m # NIL) & ~m.showV THEN sbsize := 0 END
   END;
   vs := MAX(0, vs - sbsize);

каюсь: очень люблю вертикальные скроллбары слева. попробовал — а оно глючит! с фиксом — больше не глючит. я не очень уверен, что всё правильно, но вроде бы да.

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

Решил попробовать. Но почему-то если менять размеры документа на разные опции, то документ всё время сдвигается вправо.

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

ага, вот я боялся, что что-то сломается. похоже, править надо не там, а в UpdateScrollbars. сейчас джинн снова думать будет.

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

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

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

arisu писал(а):
а, нет. он сдвигается даже без моих правок. ладно, с наскоку не вышло, скроллбар слева глючит в принципе. возможно, Антон Александрович может что-то посоветовать — это, вроде бы, по большей части он писал — и StdDocuments, и скроллбары?

Да, верно. Я еще проверил ветку `blackbox20dev20dirty` там тоже двигается документ. Сегодня что-то я уже должен другим заняться. Но может на выходных поизучаю скроллы. Там ещё есть проблема сейчас в `blackbox20` что бегунок на полосе прокрутки раздваивается, если окно отсоединить. Не знаю, видели ли вы такое, и исправляли ли в вашей сборке?

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

Иван Денисов писал(а):
Там ещё есть проблема сейчас в `blackbox20` что бегунок на полосе прокрутки раздваивается, если окно отсоединить. Не знаю, видели ли вы такое, и исправляли ли в вашей сборке?
нет, не видел, а то отрепортил бы. я, в принципе, никогда окна не отсоединяю, потому и не замечал.

p.s.: ага, проверил. если изменить размер окна потом — то всё становится нормально. вообще загадка, гыг. как будто клип-регион где-то глючит.

Автор:  arisu [ Пятница, 12 Май, 2023 21:45 ]
Заголовок сообщения:  Re: BlackBox 2.0

в общем, там забавно с поехавшими документами.

внутри документа хранятся координаты модельки документа без учёта обрамления и скроллбаров. при изменении размера документа делается так:
1. doc.PollRect
2. doc.SetRect

и тут штука такая: `PollRect()` возвращает прямоугольник уже с учётом левого отступа для скроллбара. а потом точно те же координаты передаются в `SetRect()`, и к ним пришпандоривается ещё один отступ для скроллбара.

пока этот отступ нулевой — всё в порядке. но как только он не нулевой… в общем, нарушена симметричность операций `PollRect()` и `SetRect()` для документа.

проблема в том, что `PollRect()` — возможно, я не очень понимаю пока — должен возвращать реальный прямоугольник для документа, без бордюрчиков и прочего. а `SetRect()` совершенно не в курсе, сочинили ли ему координаты, или просто передали то, что раньше вернул `PollRect()`. поэтому восстановить симметричность сложновато. возвращать неправленое не вариант: тогда текст игнорирует левый скроллбар.

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

в общем, экспериментальный вариант фикса такой (все изменения в StdDocuments):
1. заменяем PollRect на:
Код:
   PROCEDURE (d: Document) PollRect* (OUT l, t, r, b: INTEGER);
   BEGIN
      DoRecalc(d, 0, ~forceRecalc);
      l := (*d.clipper.l +*) d.model.l; t := (*d.clipper.t +*) d.model.t;
      r := (*d.clipper.l +*) d.model.r; b := (*d.clipper.t +*) d.model.b
      END
   END PollRect;

2. заменяем GetRect на:
Код:
   PROCEDURE (d: Document) GetRect* (f_: Views.Frame; view: Views.View; OUT l, t, r, b: INTEGER);
   VAR c: Models.Context;
   BEGIN ASSERT(view # NIL, 20); c := view.context; ASSERT(c # NIL, 21);
      IF view = d.model.view THEN
         d.PollRect(l, t, r, b);
         INC(l, d.clipper.l); INC(t, d.clipper.t);
         INC(r, d.clipper.l); INC(b, d.clipper.t);
         INC(l, d.x); INC(t, d.y); INC(r, d.x); INC(b, d.y)
      ELSE HALT(126)
      END
   END GetRect;

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

с первого взгляда это работает, что может нечаянно слететь — не знаю. ну, для случая «скроллбар справа» не поменялось вообще ничего, так что как работало — так и будет работать. скроллбар слева вроде бы тоже починился. и фикс в `PollSection()` тоже нужен, да.

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

Супер. Фикс похоже работает, документ больше не двигается при изменении параметра размеров документа.
Полоса прокрутки слева выглядит весьма эстетично, если шириной 8 поставить.
Вложение:
scrollLeft.png
scrollLeft.png [ 72.57 КБ | Просмотров: 7912 ]


Ещё хочу документы выделять не фоном потом, а рамочкой. Надо будет успеть до релиза доделать.

Автор:  arisu [ Пятница, 12 Май, 2023 23:46 ]
Заголовок сообщения:  Re: BlackBox 2.0

я себе вообще вот такую сделал.

Вложения:
2023_05_12_23_45_32_33x79.png
2023_05_12_23_45_32_33x79.png [ 490 байт | Просмотров: 7909 ]

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