OberonCore
https://forum.oberoncore.ru/

Вложенные вьюшки
https://forum.oberoncore.ru/viewtopic.php?f=24&t=6880
Страница 1 из 1

Автор:  Александр К [ Понедельник, 02 Январь, 2023 09:19 ]
Заголовок сообщения:  Вложенные вьюшки

Как динамически вставить в одну вьюшку в другую в заданном месте? Например, имеется тип:
Код:
stamp = POINTER TO RECORD (Views.View)
      sought, fixed: BOOLEAN;
   END;

его отрисовка и поведение и инициация:
Код:
PROCEDURE GetThickness (f: Views.Frame): INTEGER;
BEGIN
   RETURN 10 * f.dot
END GetThickness;

PROCEDURE GetSideSize (f: Views.Frame): INTEGER;
BEGIN
   RETURN 100 * f.dot
END GetSideSize;

PROCEDURE (obj: stamp) Restore (f: Views.Frame; l, t, r, b: INTEGER);
VAR
   sideSize, thickness, space: INTEGER;
BEGIN
   sideSize := GetSideSize (f);
   thickness := GetThickness (f);
   space := thickness * 2;
   f.DrawRect (0, 0, sideSize, sideSize, thickness, Ports.grey25)   
END Restore;

PROCEDURE (obj: stamp) HandleCtrlMsg (f: Views.Frame; VAR msg: Controllers.Message; VAR focus: Views.View);
VAR
   sideSize, thickness, space: INTEGER;
BEGIN
   WITH msg: Controllers.TrackMsg DO
      IF ~obj.fixed THEN
         sideSize := GetSideSize (f);
         thickness := GetThickness (f);
         space := thickness * 2;
         IF obj.sought THEN
            f.DrawLine (space, space, sideSize - space, sideSize - space, thickness, Ports.red);
            f.DrawLine (sideSize - space, space, space, sideSize - space, thickness, Ports.red);
            f.DrawLine (sideSize - space, space, space, sideSize - space, thickness, Ports.red);
         ELSE
            f.DrawLine (space, 40 * f.dot, 50 * f.dot, sideSize - space, thickness, Ports.green);
            f.DrawLine (50 * f.dot, sideSize - space, sideSize - space, space, thickness, Ports.green);
         END
      END
   ELSE
   END
END HandleCtrlMsg;

PROCEDURE (obj: stamp) Init (flag: BOOLEAN), NEW;
BEGIN
   obj.fixed := FALSE;
   obj.sought := flag
END InitT;

Создаю два объекта и инициализирую их по-разному:
Код:
NEW (obj1);
obj1.Init (TRUE);
NEW (obj2);
obj2.Init (FALSE);

Как вставить эти две въюшки динамически одну под другой в третью, предположим в белый квадрат и как динамически их удалить оттуда?

Автор:  Иван Денисов [ Понедельник, 02 Январь, 2023 14:59 ]
Заголовок сообщения:  Re: Вложенные вьюшки

Размещает другой вид на кадре команда
Код:
Views.InstallFrame(host: Frame; view: View; x, y, level: INTEGER; focus: BOOLEAN)

Однако перед тем как размещать, вы для неё должны сделать "контекст". Это такой объект, который размеры задаёт.
Посмотрите пример ObxTwins, там как раз показано, как сделать контекст, и как нарисовать — тоже.
Если будут вопросы, пишите, сделаем примерчик попроще.

Автор:  adimetrius [ Понедельник, 02 Январь, 2023 17:29 ]
Заголовок сообщения:  Re: Вложенные вьюшки

Смысл приведенного фрагмента программы неясен, я хочу уточнить.

В ответ на сообщение Controllers.TrackMsg вы рисуете что-то на холсте в зависимости от состояния переменной - от obj.sought.

Скорее всего, это нарисованное немедленно исчезнет с экрана, если вообще станет заметно. Поскольку по окончании отработки щелчка мышью ББ попробует перерисовать экран (ну, почти), для этого вызовет ваш Restore, и все вернется на прежнее место.
Поэтому вопрос.
Если вы хотите, чтобы что-то было нарисовано, пока не отпущена мышь - надо организовать цикл, напр
REPEAT ... f.Input(_, _, isDown, _) UNTIL ~isDown
Если вы хотите, чтобы после щелчка объект и далее отрисовывался иначе - то нужно изменить состояние obj, сообщить ББ, что obj требует отрисовки Views.Update(obj, Views.keepFrames) и учесть это в Restore - в зависимости от состояния рисовать stamp по-разному.

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