OberonCore
https://forum.oberoncore.ru/

Как обработать запрос Consider от внедрённого отображения?
https://forum.oberoncore.ru/viewtopic.php?f=24&t=6922
Страница 1 из 1

Автор:  Александр К [ Суббота, 25 Март, 2023 12:22 ]
Заголовок сообщения:  Как обработать запрос Consider от внедрённого отображения?

Я посылаю на выполнение контейнером TextModels.Model (или же контейнером является TextViews - пока не разобрался) запрос от встроенного отображения:
Код:
TYPE
   MyProposal* = RECORD (Models.Proposal)
   END;
...
VAR myProposal;
innerView.context.Consider (myProposal);

Далее импортирую эту запись в модуль, в котором и создаю текстовый контейнер. Но вот как обработать этот запрос?
Неужели надо обязательно переопределять Context?
Код:
TYPE
   MyContext = POINTER TO RECORD (TextModels.Context);
   END;

Но в этом случае придётся заново переписывать все абстрактные методы (Attr, Pos, ThisModel, GetSize, Normalize), а это такой геморрой... Одним словом - лень. Нельзя ли как-нибудь попроще?

Автор:  Иван Денисов [ Суббота, 25 Март, 2023 14:09 ]
Заголовок сообщения:  Re: Как обработать запрос Consider от внедрённого отображени

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

"Далее импортирую эту запись в модуль, в котором и создаю текстовый контейнер"
точно контейнер, а не модель или вид?

Автор:  Александр К [ Суббота, 25 Март, 2023 19:08 ]
Заголовок сообщения:  Re: Как обработать запрос Consider от внедрённого отображени

Да, вид:
Код:
t := TextModels.dir.New();
v := TextViews.dir.New(t);

Как я понял, вот это текстовое отображение, контейнер, связывается с внедрённым отображением посредством Models.Context. Там даже реализована возможность изменять размеры внедрённого отображения через innerView.context.SetSize (w, h). Кстати, когда я сам пробовал реализовать это, то в контексте реализовывал метод:
Код:
PROCEDURE (obj: Context) SetSize (w, h: INTEGER);
BEGIN
   Properties.PreferredSize (obj.innerView, 50 * Ports.point, 60 * Ports.point, 100 * Ports.point, 200 * Ports.point, 55 * Ports.point, 150 * Ports.point, w, h);

Правда никакого эффекта не получил.

Неужели придётся переписывать весь TextViews ради реакции на Proposal?

Автор:  Александр К [ Суббота, 25 Март, 2023 19:17 ]
Заголовок сообщения:  Re: Как обработать запрос Consider от внедрённого отображени

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

Автор:  Иван Денисов [ Среда, 29 Март, 2023 20:59 ]
Заголовок сообщения:  Re: Как обработать запрос Consider от внедрённого отображени

Получить модель контекста, куда встроено ваше отображение, довольно просто через
v.context.ThisModel()

останется только привести к типу текстовой модели, и можете подключать сканнер и форматтер, чтобы писать в неё
v.context.ThisModel()(TextModels.Model)


Пример модуля для вашей задачи:
Код:
MODULE DemoContextPrint;

IMPORT Views, Ports, Models, Controllers, TextMappers, TextModels, Properties;

TYPE
   View = POINTER TO RECORD (Views.View) END;

   PROCEDURE (v: View) Restore (f: Views.Frame; l, t, r, b: INTEGER);
   VAR w, h: INTEGER;
   BEGIN
      v.context.GetSize(w, h);
      f.DrawOval(0, 0, w, h, Ports.fill, Ports.blue);
   END Restore;

   PROCEDURE (v: View) HandleCtrlMsg (f: Views.Frame;
      VAR msg: Controllers.Message; VAR focus: Views.View);
   VAR wr: TextMappers.Formatter;
   BEGIN
      WITH msg: Controllers.TrackMsg DO
         wr.ConnectTo(v.context.ThisModel()(TextModels.Model));
         wr.WriteString("test"); wr.WriteLn;
      ELSE END
   END HandleCtrlMsg;

   PROCEDURE (v: View) HandlePropMsg (VAR msg: Properties.Message);
   BEGIN
      WITH msg: Properties.FocusPref DO
         msg.hotFocus := TRUE
      ELSE END
   END HandlePropMsg;

   PROCEDURE Deposit*;
   VAR v: View;
   BEGIN
      NEW(v);
      Views.Deposit(v)
   END Deposit;

END DemoContextPrint.

"DemoContextPrint.Deposit; StdCmds.PasteView"

Автор:  Иван Денисов [ Среда, 29 Март, 2023 22:08 ]
Заголовок сообщения:  Re: Как обработать запрос Consider от внедрённого отображени

Александр К писал(а):
Там даже реализована возможность изменять размеры внедрённого отображения через innerView.context.SetSize (w, h). Кстати, когда я сам пробовал реализовать это, то в контексте реализовывал метод:
Код:
PROCEDURE (obj: Context) SetSize (w, h: INTEGER);
BEGIN
   Properties.PreferredSize (obj.innerView, 50 * Ports.point, 60 * Ports.point, 100 * Ports.point, 200 * Ports.point, 55 * Ports.point, 150 * Ports.point, w, h);

Правда никакого эффекта не получил.


Тут немного иначе, контекст как разу нужен, чтобы вы из родительского вида указать размеры.

Типовая реализация такая:
Код:
   PROCEDURE (c: Context) SetSize (w, h: INTEGER);
   BEGIN c.w := w; c.h := h
   END SetSize;



И потом из Restore уже перед установкой встроенных видов, передать их контекстам требуемые размеры.
Вот кусочек реального кода, который рисует у меня кнопки на панели инструментов:
Код:
   PROCEDURE (v: PanelView) Restore* (f: Views.Frame; l_, t_, r_, b_: INTEGER);
   VAR w, h, last: INTEGER; button: PanelButton; asc, dsc, fw: INTEGER;
   BEGIN
      v.context.GetSize(w, h);
      f.DrawRect(0, 0, w, panelHeightPx * Ports.point, - 1, param.backgroundColor);
      button := v.root;
      WHILE button # NIL DO
         button.context.SetSize(button.w * Ports.point, button.h  * Ports.point);
         Views.InstallFrame(f, button, button.x * Ports.point, button.y * Ports.point, 0, TRUE);
         last := button.x * Ports.point + button.w * Ports.point;
         button := button.next;
      END;
      
      fontStatus.GetBounds(asc, dsc, fw);
      f.DrawString(last + 200 * Ports.point, h DIV 2 + (asc - dsc) DIV 2, param.statusColor, status, fontStatus)
   END Restore;

Автор:  Александр К [ Суббота, 01 Апрель, 2023 16:21 ]
Заголовок сообщения:  Re: Как обработать запрос Consider от внедрённого отображени

Цитата:
останется только привести к типу текстовой модели, и можете подключать сканнер и форматтер, чтобы писать в неё
v.context.ThisModel()(TextModels.Model)

Нет, писать я собираюсь в контейнер и именно в тот момент, когда происходит событие во встроенном отображении, например при попадании в мишень. Для этого у типа Context в модуле Models есть метод:
Код:
(c: Context) Consider (VAR p: Proposal), NEW, EMPTY;

Но как им воспользоваться применительно к текстовому TextViews?

Автор:  Иван Денисов [ Суббота, 01 Апрель, 2023 21:37 ]
Заголовок сообщения:  Re: Как обработать запрос Consider от внедрённого отображени

Никак, текстовый контекст никак не поддерживает такие "предложения". Это метод и механизм для каких-то других пользовательских контекстов.

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

Автор:  arisu [ Суббота, 01 Апрель, 2023 22:19 ]
Заголовок сообщения:  Re: Как обработать запрос Consider от внедрённого отображени

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

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

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

механизм предложений (proposals) служит немного для другой цели. если вам очень надо создать контейнер, который будет содержать текст и ваш view — то вам таки опять в ObxTwins, где показано, как делать контейнеры-«хозяева». а если вы хотите внедрять ваш view в произвольный текстовый документ, и чтобы он в этот же документ писал результаты… а точно так надо, это точно не оверинжиниринг опять?

Автор:  Иван Денисов [ Воскресенье, 02 Апрель, 2023 06:19 ]
Заголовок сообщения:  Re: Как обработать запрос Consider от внедрённого отображени

А вот вопрос, мишень внедрена в текстовое отображение? Или текстовое отображение является встроенным в некий ваш вид, как и мишень?

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