O.G.A.S. English

Мастерская

Мастерская подробно: окно платформы, панели, окна графа, пульта, библиотеки и помощника, вид узлов на холсте, пульт программы и его оформление. С чего начать — С чего начать.

Введение

Документ описывает устройство мастерской — окна платформы в Windows — и пульта рабочего процесса. Хозяева: функция ui (связь и окно), функция canvas (документ пульта), функция graph (смысл сквозных объектов). Первые шаги — С чего начать, защита окна — Защита, 3.10, методы — Методы мастерской и пульта.

1 Назначение мастерской

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

Пульт — полноценный графический интерфейс рабочего процесса.

Что мастерская делает для человека:

2 Окно в Windows и функция ui

Платформа работает в WSL2, а окно является программой Windows. Мастерская — программа ogas-window.exe на Tauri 2 и системном WebView2. Функция ui — OS-процесс Linux, в своём описании помеченный interactive:

1) ожидает соединения на 127.0.0.1 (порт ui.window.port; 0 — любой свободный порт при каждом запуске) и создаёт токен сессии; 2) запускает программу окна (WSL позволяет запускать программы Windows из Linux) и передаёт ей порт и токен в командной строке; 3) принимает одно окно: первое сообщение — ui.window.hello с токеном, иначе соединение закрывается; 4) передаёт запросы окна ядру через своё соединение, а события ядра — окну уведомлением event; 5) хранит для окна имя программы, лицо которой попросил показать запуск (6.6), и сообщает о такой просьбе уже открытому окну.

Сообщения — тот же JSON-RPC 2.0 по одному на строку, что на шине, только по TCP. Окну доступны методы функций, а из методов ядра — только core.status, core.health, core.event.subscribe и core.shutdown. На методы ui.window.* отвечает сама функция ui. Выход из мастерской (2.1) после подтверждения человека отправляет core.shutdown, и экземпляр останавливается. Остановка экземпляра закрывает окно и убирает значок у часов. HTTP-сервер, браузерный клиент, Electron и окно Linux через WSLg не используются.

Обоснование отказа от окна Linux через WSLg. Переключение раскладки RU/EN в окно WSLg не передаётся (Weston задаёт раскладку один раз на сессию), отсутствуют дробный масштаб, методы ввода Windows и экранный диктор. В программе Windows эти возможности работают штатно.

Размещение программы окна. Путь задаёт настройка ui.window.exe (в том виде, в каком его видит WSL); при пустой настройке используется bin/ogas-window.exe из поставки, затем результат make window в исходниках. Рабочая папка окна — на диске Windows. Если WSL не позволяет запускать программы Windows, окно не открывается, и экземпляр работает через командную строку.

2.1 Значок у часов

Закрытое окно уходит к значку у часов, а платформа работает дальше (там же, таблица 5).

Автоматического запуска нет: после перезагрузки компьютера программы не работают, пока человек не запустит O.G.A.S.

2.2 Уведомления

Уведомление — программы (узел «Уведомить», Программа: граф и запуски, 24.6) или самой мастерской — стоит там, где его увидят:

Одновременно видны четыре последних, каждое — 12 секунд. Поверх окна щелчок по уведомлению убирает его. В углу экрана щелчок возвращает окно O.G.A.S., а крестик на уведомлении убирает его, не открывая окна; когда уведомлений не осталось, окно в углу закрывается.

О чём зовёт сама мастерская:

О вопросе программы, которая сейчас в окне, поверх окна не зовут: он там уже обведён, а его вкладка отмечена (6.8). О её сбое не зовут в мастерской — он назван на полосе сверху, — но зовут на её лице, где полосы нет. В углу экрана зовут о том и другом всегда: человека в окне нет. Об окончании запуска не зовут; звука нет.

Уведомление не хранится: кто его не видел, тот не видел. Пока платформа не работает, звать некому.

3 Страница окна

Интерфейс — страница, встроенная в ogas-window.exe: HTML, CSS и модули JavaScript без сборщика и без готовой библиотеки интерфейса (functions/ui/window/ui/). Вторая страница — окно уведомлений в углу экрана (notice.html, 2.2): она не держит ничего своего, а показывает то, что ей передала программа окна, в цветах и шрифте мастерской. Кнопки, поля и списки реализованы собственным кодом. Страница обновляется собственным кодом, изменяющим только изменившиеся элементы, поэтому фокус, курсор и ввод через методы ввода при перерисовке сохраняются. Поле графа рисуется в SVG.

Ввод, раскладки, методы ввода, масштаб экрана и экранный диктор обеспечивает WebView2. Доступность мастерской: каждое действие доступно с клавиатуры (5.1), фокус виден, контраст обеих схем проверен, у кнопок-значков есть слова для диктора; холст графа и лист пульта диктор целиком не читает. Контраст цветов по умолчанию обеих схем и темы пульта проверяет make ci: буквы отличаются от фона не меньше чем в 4,5 раза, линия, которая что-то отмечает, и край поля — не меньше чем в 3 раза (WCAG 2.1, 1.4.3 и 1.4.11). Размеры ui.* задаются в CSS-пикселях, масштаб экрана применяет WebView2. Шрифт по умолчанию встроен (DejaVu Sans). ui.font.source = system — шрифт интерфейса Windows, file — файл из WSL: функция ui читает его и отдаёт окну методом ui.window.font.

Странице разрешено брать сценарии, стили и шрифты только из самой программы окна, изображения — из неё и из адресов, в которых данные лежат внутри; в сеть страница не обращается. Это политика содержимого окна (functions/ui/window/tauri.conf.json); рисунки пульта окно показывает такими адресами (Защита, 3.12).

4 Каркас

Уровни мастерской (правило 2.5 Правила разработки):

мастерская (окно платформы)
  область: марка, полоса сверху, сторона слева, сторона справа
    бар → подраздел бара
  хост
    нижний бар: капсулы свёрнутых окон
    окно на хосте (виды окон — таблица 1): вкладка-капсула и тело
      тело: колонка слева, рабочее поле, панель выбранного
        категория → подкатегория → строка или команда

Каркас: бары-капсулы по краям и вкладки-капсулы на окнах; окна на хосте свободно перемещаются. У окна нет рамки Windows, все области рисует страница:

Бары — разделы по смыслу, а не по тому, как устроен код. Над пунктами раздела — его логотип: знак раздела, а с подписями — и его название; он ничего не открывает и не нажимается — у этих баров и у баров над холстом графа (5.4). Открывают пункты; подписи открывает полоска сбоку, сворачивает бар шеврон. Окно называет в своём описании бар своего раздела и место в нём, но бара не возглавляет. Кнопок программы — запуска, остановки, повтора, ввода — на барах нет: они на пульте, на лице программы и в баре управления над холстом графа (5.4). - хост в центре — окна; поверх его нижнего края — нижний бар со свёрнутыми окнами (раздел 5).

Бар — одна капсула в трёх состояниях:

Бар правого края — то же самое зеркально: значки у внешнего края, подписи — к хосту. Шеврон смотрит туда, куда уйдёт капсула. Бары левого края не настраиваются; панели правого края, их названия, порядок и программы на них человек составляет в библиотеке (5.6). Свёртка и подписи сохраняются до закрытия мастерской.

Размеры капсул считаются от клетки ui.layout.cell в шестидесятых долях клетки: логотип 40, плитка подраздела 32, шаг подраздела 44, разделитель 2 на 33, полоска подписей 17, шеврон 27, скругление 9. Высота вкладки окна — 0,8 клетки.

Код каркаса отделён от содержимого окон: shell.js (области, бары, окна и жесты), faces.js (лица капсул), windows.js (геометрия окон), lib/look.js и style.css (токены), lib/glyphs.js (знаки). Тело окна по разделу 5 рисует host/frame.js, а каждое окно на хосте — свой файл в host/, который только наполняет его части: изменение окна настроек не затрагивает граф. Пульт рисует pulpit/surface.js — один код для шага «Вид» и для лица программы (6.1), не знающий ни о каркасе, ни о теле окна; лицо программы — face.js. Применяются правила 2.1 и 2.5 (Правила разработки).

5 Окна на хосте

Окно на хосте — вкладка-капсула сверху (название, кнопки окна, шеврон свёртки) и под ней тело окна.

Журнал — окно, такое же, как остальные (данные предоставляет функция observe): постоянного места на хосте у него нет, оно перемещается, прилипает, разворачивается и закрывается. Журнал показывает последние записи страницей, а кнопка «Показать ещё» над ними добавляет более старые, пока они есть: журнал не укорачивается, и вся его история доступна из окна.

5.1 Тело окна

Тело каждого окна на хосте устроено одинаково:

Состав тела каждого окна приведён в таблице 1.

Таблица 1 — Состав тела окон

Окно Колонка слева Рабочее поле Панель выбранного
журнал программы «Запуски» запуски выбранной программы: когда, каким событием начат, состояние — у сбоя с причиной, у остановленного — кем, — размер и кнопка «Очистить» (Программа: граф и запуски, 12.6). Управление программой — включение, события, ввод и вывод — в окне графа (5.4, 5.5) запуск: «Сведения» — состояние, время, размер, можно ли продолжить, «Хранить» и «Не хранить»; «События» — его строки из журнала запуска; «Результаты» — файлы, которые он оставил: картинка видна, звук и видео играют, текстовый файл читается — его начало, — остальное названо именем и размером; у каждого файла «Открыть» — программой Windows, которая открывает такие файлы, — и «Показать в папке» (Защита, 3.13)
граф виды узлов, установленные модули по названиям, переменные программы и процессы; инструменты и управление программой — в барах холста у левого края (5.4) граф процесса: узлы по 5.3, рамки и развёрнутые группы — области холста с телом внутри узел: «Общая информация» (название и описание словами человека, и только они; читается, правится по знаку «Редактировать»), «Детали» (идентификатор, вид, модуль, порты, у узла-модуля — память, состояние) и «Правка» строками по частям (модуль, параметры узла, Модули, раздел 10, поля самого узла — память и, у узла службы, правило наложения, — и что подать узлу при проверке); группа: «Общая информация» (название и описание), «Детали» (идентификатор, название, состав, строки лица и переменные лица со значениями, состояние в запуске) и «Правка» строками (названия входов и выходов лица, начальные значения переменных лица); переменная: «Информация» (имя, тип, начальное значение, «Помнить», кто ею пользуется) и «Правка» строками в двух частях — «Переменная» (имя, тип) и «Значение» (начальное значение, «Помнить»), — с кнопкой «Удалить»
пульт то, что лежит на открытой вкладке, по её вместилищам — у вместилища вкладок только открытая вкладка, на любой глубине; щелчок выбирает элемент на листе (6.7) — и украшения набора: щелчок ставит ещё одно пульт: вкладки разделов и лист открытого раздела (раздел 6) на шаге «Вид» — элемент: «Правка» строками (подпись, вид элемента, раздел, вид — как элемент нарисован, то, что задаётся у его вида, у кнопки события — что она несёт с собой, место и размер на листе; «Раньше», «Позже», «Убрать из раскладки», «Удалить элемент») и «Информация» (вид, объекты, раздел, место и размер, отметка); раздел: название, ширина и высота листа, подложка — цвет и рисунок — и «Убрать раздел»; пульт, по знаку «Оформление»: ключи темы, рисунки пульта и свои виды
настройки «Состояние», крупные разделы и их подразделы настройки подраздела и «Сбросить всё» его раздела; у «Состояния» — состояние ядра и функций настройка: «Правка» (значение, «Записать», «Сбросить») и «Информация» (объяснение, ключ, умолчание, допустимые значения)
библиотека «Программы», «Модули», «Нейросети»; «Панели справа» — панели программ и «Новая панель» список программ с «Создать программу» и «Принять программу»; список модулей с созданием модуля; нейросети по видам — с размером, модулями, которые берут их по умолчанию, и папкой, откуда их берут, с полем другой папки; у панели — её название, место среди панелей, программы на ней и те, что можно поставить программа: «Сведения» — на каких панелях стоит, предлагается ли графом, «Открыть», «Открыть в мастерской», «Передать программу», «Удалить программу»; «Где видна» — отметки панелей и колонки графа; модуль: «Сведения» — описание, версия, нейросети, которые он называет, и «Удалить модуль»; «Где виден» — колонка графа; нейросеть: размер, кому нужна, как лежит, «Удалить нейросеть» (5.6)
модули «Модули программы» модули, которые берут узлы программы на экране, — неустановленный помечен, — и установка её окружения модуль: «Информация» — описание, версия, порты, параметры; «Проверка» — тестовый вызов и его ответ. Создают и удаляют модули в библиотеке (5.6)
журнал платформы «События» — события платформы без событий запусков, «Проблемы» строки событий или открытые проблемы событие — его поля; проблема — её поля и «Решено». Выбранная проблема выделяет свой узел и сужает журнал до своего запуска: его строки показаны целиком

У узла и у группы панель открывается на «Общей информации»: первое, что нужно знать о коробке на холсте, — что она делает и зачем стоит. Вкладка, на которую человек перешёл, остаётся выбранной и у следующего узла.

«Общую информацию» сначала читают: название и описание — или слова о том, что описания нет. Это слова человека, и других на вкладке нет: что о себе говорит вид или модуль, открывает знак «?» в «Деталях». Под ними один знак — «Редактировать». По нему слова становятся полями — название и описание в несколько строк (Программа: граф и запуски, раздел 4), — а под полями стоят три знака: «По умолчанию» — вернуть название, которое узел носит сам, и убрать описание, сразу; «Сохранить изменения» — положить набранное в узел; «Выйти из редактирования» — вернуться к чтению, оставив набранное и не сохранённое. Enter в поле названия сохраняет, как знак. У другого узла информация снова читается. В графе включённой программы знака «Редактировать» нет: слова читают, но не правят.

«Правка» узла и группы — строками, по частям. Части узла-модуля: «Модуль», «Параметры», «Видно на узле» — какие параметры стоят на узле строками (5.3) — и «Узел» — поля самого узла; у узла платформы — «Параметры», «Видно на узле» и «Узел»; у группы — «Входы», «Выходы» и «Переменные». Часть, в которой нет строк, не показывается. Строка — название, поле и в конце строки два знака: «Вернуть значение по умолчанию» и «Сохранить изменения»; концы полей всех строк стоят на одной линии. Подсказка, открытая знаком «?», встаёт под своей строкой, и строка остаётся на месте. В узкой панели — той, что поставлена сбоку, — название строки стоит над полем, знаки остаются в конце. У строки модуля знака возврата нет: умолчания у модуля нет. Что подать узлу, запущенному одним, набирают в полях событий на холсте (5.5).

У узла-модуля «Детали» показывают порты из манифеста, а «Правка» — модуль узла и поле для каждого его параметра по схеме манифеста; в пустом поле видно умолчание (Модули, раздел 10). Знак «?» у инструмента, вида узла, порта и параметра показывает подсказку из словаря хозяина: у модуля — module.<id>.input|output.<порт>.help и module.<id>.param.<имя>.help, у узлов платформы — тексты graph.* функции графа.

Поля самого узла — то, что человек задаёт узлу помимо параметров: память узла-модуля и правило наложения узла службы (Программа: граф и запуски, разделы 5, 13). Какие это поля и при каком модуле поле имеет смысл, говорит вид узла (node_fields, Методы графа, раздел 1); окно своего списка не держит и поле, которое при этом модуле ничего не значит, не показывает. Пустое поле убирает поле из узла, и действует правило хозяина: своя память, наложение queue.

Набранное в панели попадает в документ, когда человек сохраняет. Так правятся узел, группа, переменная программы и подпись слота пульта — правило одно, и строки одни (Правила разработки, 2.9):

Набранное и не сохранённое не пропадает (Правила разработки, 3.1.5). Когда панель уходит к другому узлу или закрывается, оно остаётся ждать в панели своего узла: окно говорит об этом, узел носит точку перед знаком вида, и при возвращении набранное стоит в своих строках. У переменной точка стоит после её имени в колонке, у слота пульта — после его подписи на полоске. «Сохранить» графа записывает граф, каким он стоит в окне, «Сохранить» пульта — пульт: набранного и не сохранённого в них нет, оно остаётся в панели, и окно об этом говорит. После шага назад, сохранения и вставки панель показывает то, что стоит в документе, а набранное и не сохранённое остаётся в строках. Уход к другому процессу и закрытие мастерской о нём спрашивают и называют его среди того, что пропадёт.

Память узла-модуля «Детали» называют там же, где узел: своя она или общая — тогда с именем и с узлами, которые её делят, — и что из неё сохранено: размер, время и работает ли с ней сейчас модуль (module.state.list, Методы модулей, раздел 2). Кнопка «Очистить память» есть, когда сохранено хоть что-то; она зовёт module.state.clear, и отказ хозяина — память занята поднятым модулем — говорится в окне.

Включение программы, события, остановка, повтор и продолжение — сквозные объекты графа в окне процесса, в баре управления над холстом графа (5.4) и на пульте, а не кнопки каркаса. Второй кнопки запуска со своим смыслом нет.

5.2 Допустимые соединения выбранного узла

Когда в окне графа выбран узел, в колонке слева появляются две группы допустимых соединений:

Строка списка — не узел, а порт: модуль, который достаёт из файла картинку и текст, стоит в списке двумя строками. Так человек выбирает не модуль, а получаемый результат, и порт для ребра определён однозначно. В строке названы оба порта в том порядке, в каком пойдёт пакет — success → join.input; типы, описания и пометки отображаются в панели.

Состав списков определяет функция графа (process.node.candidates, Методы графа), а не окно: правило совместимости одно и то же у списка и у проверки графа. В список попадают только действительно допустимые соединения.

Панель выбранного показывает кандидата так же, как узел с холста: что это, что даёт выбранный порт (module.<id>.output.<порт>.help, у узлов платформы graph.kind.<вид>.input.<порт>.help и .output.<порт>.help из папки вида), какого типа данные и что с ними сделает получатель. Отдельными пометками — «на этом входе уже есть источник» (появится слияние) и «это холодный вход» (узел его не ожидает). Оценок и рекомендаций панель не содержит: платформа сообщает только известные ей сведения.

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

Выбор не смещается автоматически. Узел, выбранный на холсте, остаётся опорным: колонка привязана к нему, пока человек просматривает кандидатов. Щелчок по строке показывает кандидата в панели, но списки не пересобирает. Соединение делает выбранным новый узел, и колонка перестраивается относительно него.

5.3 Вид узла на холсте

На экране группа называется узлом: собранное из узлов — собранный узел, и слова «группа» мастерская не говорит. Инструмент — «Собрать в узел», действия на ярлычке — «Развернуть», «Свернуть», «Разобрать узел», в баре управления — «Вынести в отдельный процесс» (5.4), название по умолчанию — «Узел», там, где собранный узел нужно отличить от обычного, — «собранный узел». «Группа» остаётся термином документов и формата (Термины).

У всего, что стоит на холсте, одна форма:

Названия:

Вызов процесса. Его порты — входы и выходы вызываемого процесса под именами, которые им дал человек; в «Правке» — выбор процесса и по полю на каждую его переменную, в пустом поле видно значение, с которого переменная начинает сама (Программа: граф и запуски, раздел 18). В запуске вызов показывает самое громкое из того, что делают узлы вызываемого графа, как свёрнутая группа.

Связи идут под прямым углом от точки выхода к точке входа и обходят узлы. Цвет линии — тип данных выхода, от которого она идёт: у текста, картинки и файла свои цвета (ui.color.type_*), связь с любыми данными (json) и связь, тип которой хозяин порта не назвал, рисуется цветом связи графа. Тем же цветом закрашена точка порта, а подсказка порта называет тип словом. Пунктир — связь от переменной или постоянной, яркая и толстая линия — подсвеченная (5.4).

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

Связь выбирают нажатием: выбранная связь шире остальных, а панель говорит, что она соединяет, — откуда и куда, узлом и портом, какие данные она несёт и через сколько точек ведена, — и держит кнопку «Удалить связь»; то же делает Delete. Узлы остаются, удаление — шаг истории. Выбор узла, группы или пустого места холста снимает выбор связи. В графе включённой программы связь выбирают, чтобы прочесть, но не удаляют.

Сигналы. Когда человек тянет связь, порты, к которым её можно подвести, светятся зелёным, а остальные притушены. Порт под указателем, к которому подвести нельзя, — красный, и причина названа словами функции графа: типы данных не совпадают, узел тот же, в узел связи не входят, такая связь уже есть, связь пересекла бы границу рамки не через её порты или замкнула бы круг вне рамки, на вход уже ведёт связь другого рода; когда мешает только лицо группы — связь пересекла бы её границу через порт, которого на лице нет, — окно называет эту группу и говорит, что отметить. Вход, на котором уже есть источник, — янтарный: соединить можно, появится слияние. В запуске подсвечен узел, который работает; упавший узел и узел, ждущий ответа человека, мигают; узел, ждущий сигнала или времени, и узел модуля, шаг которого ждёт своей очереди к модулю, подсвечены ровно. Сигнал не подаётся одним цветом: у него есть ещё знак или форма.

Состояние узла в запуске показывают два знака:

Тело узла цвет от запуска не меняет: оно обычное или выбранное. Свёрнутая группа показывает самое громкое из того, что делают её узлы: сбой раньше вопроса человеку, вопрос раньше работы и ожидания; когда ничего не происходит — что запуск через неё прошёл. Состояние группы словами — «стоит», «работает», «ошибка», «частично», «готово», «остановлена» (Программа: граф и запуски, раздел 17) — называет её панель. Кто просил систему убрать движение, мигания не видит: состояние говорят значок и цвет кольца.

Что узел делает, окно узнаёт от запуска, за которым следит: о том, что шаг модуля ждёт своей очереди к модулю, начался и кончился, и о том, что ветка встала, говорит событие node.changed, остальное — контрольная точка, которую окно перечитывает по каждому такому событию (Обмен с ядром, раздел 7). Окно, которое пришло к запуску, когда тот уже шёл, начала шагов не слышало: о шагах модулей, которые идут или ждут очереди, оно спрашивает process.run.status (Методы графа). Пакет у узла модуля, о шаге которого не сказано, что он идёт, ждёт своей очереди.

5.4 Бары холста

Поверх холста, у его левого края, стоят два бара: сверху бар инструментов, под ним бар управления. Оба — та же капсула, что бары мастерской (раздел 4), в три четверти их размера: они стоят над работой, а не рядом с ней. Холст прокручивается под ними, а в начале прокрутки левый край графа стоит правее баров — в любом масштабе: место под бары с холстом не сжимается. Каждый бар сворачивается до шапки и показывает подписи сам, как любой бар: подписи открывает полоска сбоку, свёртку — шеврон, а логотип бара — знак без действия.

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

Это те же сквозные объекты программы и те же команды, что на пульте: список команд один, и второй кнопки с другим смыслом нет (Правила разработки, 2.9). «Запуск» события пульта даёт событию то, что набрано на его узле (5.5). Команда, которую сейчас выполнить нельзя, — запуск у выключенной программы, остановка без идущего запуска, повтор, когда последний запуск события не упал, — притушена; нажатая, она говорит причину словами. Значение переменной включённой программы пишут в поле её узла на холсте и в «Деталях» её панели — так пишут и переменную, которую берёт параметр и узла которой на холсте нет; переменная, нажатая в баре «Пульт», открывается там. Вопрос запуска отвечают на узле «Вопрос», вывод показывают узлы «Показать» (5.5); на пульте всё это остаётся. Окно процесса держит только историю запусков. Пока процесс не выбран, бара управления нет.

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

Шаги. Программу собирают в одном окне — окне графа. В его правом верхнем углу стоят три знака шагов: «Граф» — рабочий граф, «Граф интерфейса» — свой холст с отражениями и графическими узлами (6.8), «Вид» — лист интерфейса, где элементы расставляют и оформляют (6.3, 6.5). Знак шага, на котором человек сейчас, выделен; нажатый, знак другого шага меняет то, что показывает окно, на месте: размер, место и панель окна остаются. Выбранное переходит с шага на шаг: графический узел — это элемент на листе, и обратно. Каждый шаг помнит свой масштаб и сдвиг. Граф рядом с листом не показывается: на шаге «Вид» граф не нужен, а понадобится — к нему возвращаются знаком. Отдельного окна пульта и пункта «Пульт» в баре «Мастерская» нет. На шаге «Вид» включённая программа показывает на листе настоящие значения.

Бар инструментов держит инструменты графа — «Выделение», «Связь», «Крупнее», «Мельче», «Весь граф» — и поиск. В колонке окна этих инструментов нет: у действия одно место. Колонке остаётся то, что кладут на холст, — виды узлов, установленные модули, переменные и процессы — и допустимые соединения выбранного узла (5.2).

Модули в колонке стоят разделом «Модули» под видами узлов: каждый установленный модуль — готовый узел по своему названию, в порядке названий. Нажатый, модуль — инструмент, который ставит его узел; перенесённый на холст, он ставится там, где его отпустили. Узел встаёт сразу со своим модулем и называется по нему (echo_1); выбирать модуль в панели не нужно. Безликого вида «Модуль» в колонке нет. Пока модулей нет, раздел так и говорит, и его строка открывает окно «Модули», где их устанавливают.

Поиск по названию ищет узел на холсте по его названию — своему или по умолчанию — и по идентификатору; большие и малые буквы не различаются. Поле поиска открывает знак «Найти» в баре инструментов или клавиша Ctrl+F; оно встаёт поверх холста рядом с барами. Найденное подсвечено, остальное притушено, и поле говорит, сколько найдено, а после выбора — который из них выбран («2 / 3»); Enter выбирает следующий найденный узел и прокручивает холст так, что узел встаёт посередине того, что не закрыто барами и панелью, Shift+Enter — предыдущий; за последним идёт первый. Найденные идут в том порядке, в каком читают граф: слева направо, а в одном столбце — сверху вниз. Esc закрывает поиск раньше, чем снимает выделение; повторное нажатие «Найти» тоже закрывает. Поле поиска места над работой не занимает: панель из-за него не сдвигается. Узел внутри свёрнутого собранного узла находят по собранному узлу: подсвечен и выбирается он.

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

Подсвеченное выделено, остальное притушено: подсвеченная связь толще и ярче, у подсвеченного узла вторая граница — обводка снаружи его собственной, так что подсвеченное видно и там, где притушить нечего. Выбранная группа считается всем, что в ней лежит; свёрнутая и развёрнутая группа подсвечена, если подсвечен хоть один её узел. Пока ничего не выбрано, ничего не притушено. Граф включённой программы подсвечивают и смотрят в любом масштабе, но не правят: «Связь» и «Собрать в узел» там недоступны.

5.5 Проверка в графе

Собранное проверяют там же, где собирают: проба входит в сборку рабочего процесса, а не следует за ней в другом окне. Для этого на холсте стоит всё, чем процессу дают данные и чем он их показывает (Программа: граф и запуски, раздел 24):

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

Причина отказа видна в графе: под упавшим узлом короткая причина словами, во вкладке «Детали» его панели — подробности: код, слова модуля, запуск. Под узлом — не больше двух строк, целиком с кодом — в подсказке; словами служат слова, которые назвал сам отказ, а у отказа модуля без таких слов — то, что написал модуль: это и есть причина; у отказа платформы — слова его кода. Свёрнутый собранный узел говорит причину узла внутри. Шаг, который упал и прошёл на повторе, причины не показывает. Пробуют руками: дают данные и смотрят результат.

Ход шага модуля виден на узле: пока шаг модуля идёт в запуске, за которым следит окно, по низу узла идёт полоса — доля готовности, которую модуль присылает уведомлением progress (Модули, раздел 7); подсказка полосы называет долю в процентах. Модуль, который хода не присылает, полосы не получает: узел просто отмечен работающим. Новый шаг узла начинает полосу сначала, кончившийся шаг её убирает. Так долгий шаг — загрузка модели, рисование кадра — не выглядит зависшим.

Что умеет граф прямо на холсте:

5.6 Библиотека

Библиотека — окно всего, что у человека есть: программ — собранных здесь и принятых, — установленных модулей, нейросетей и заготовок интерфейса. Здесь вещь создают, принимают, передают, удаляют и решают, где её видно; собирают её в мастерской. Библиотека — первый пункт бара «Платформа».

5.7 Помощник

Помощник — окно, где человек даёт задачу словами, а подключённая сеть собирает программу или модуль инструментами платформы, проверяет и пробует их и говорит, что сделала (Методы служб платформы, раздел 6).

5.8 Вход для программ

В настройках, в разделе «Вход для программ», кроме самих настроек входа — открыт ли он, порт, сколько программ пускает, — стоят его состояние, ключ, скрытый до «Показать ключ», «Скопировать» и «Выпустить новый ключ» (Методы служб платформы, раздел 5). Новый ключ выгоняет все программы, вошедшие со старым.

5.9 Место, Windows и файлы

5.10 Профиль

Профиль — окно в баре «Платформа»: профиль человека на ogas.space, его отправки и доска обращений (Методы служб платформы, раздел 7; что от чего защищает — Защита, раздел 8). Всё, что человек делает на сайте, — отзыв, обращение, «Беру», сообщение об ошибке, — уходит отсюда и из библиотеки, подписанное профилем; регистрации на сайте нет.

6 Пульт

6.1 Назначение пульта

Пульт является полноценным графическим интерфейсом рабочего процесса. Человек собирает пульт сам, без написания кода: берёт в интерфейс то, что программа отдаёт (6.4), показывает это элементами на графе интерфейса (6.8), раскладывает элементы по разделам и листам (6.3) и задаёт им вид (6.5). Собирают его на шаге «Вид» окна графа, а пользуются во всё окно — на лице программы (6.6).

Неизменные свойства пульта:

Пульта на другом компьютере и нескольких пультов одного процесса нет.

Строение пульта собирают графом интерфейса (6.8).

6.2 Элементы пульта

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

Закрыто поведение элемента: что он показывает, что принимает и какую команду отправляет. Вид элемента заменяем (6.5): вид — рисунки и числа, а не код, поэтому причина, по которой набор закрыт, вида не касается.

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

Элементы делятся на четыре рода (таблица 2).

Таблица 2 — Роды элементов пульта

Род Назначение Элементы первого набора К чему прикрепляют
элемент показа показывает значение или состояние значение, полоса, индикатор переменная; у индикатора — состояние запуска события
элемент ввода человек задаёт значение поле, число, выключатель, выбор, вопрос переменная; у выключателя — также включение программы; у вопроса — вопрос человеку
элемент действия нажатие отправляет команду хозяину объекта кнопка событие, его остановка или повтор; вместилище этого же пульта — открыть его или вернуть его поля как было
украшение ничего не показывает и не принимает: оформляет лист надпись, рамка, рисунок ни к чему

Род элемента и вид объекта должны подходить друг другу: элемент показа не прикрепляют к запуску, элемент действия — к переменной. Недопустимое сочетание мастерская показывает до сохранения. Элемент, объект которого удалён из графа или перестал ему подходить — например, у переменной изменили тип, — с пульта не пропадает: он остаётся на своём месте и помечается.

Элемент прикрепляется к одному объекту или к нескольким — столько, сколько называет его описание:

Программа с настройками собирается из тех же элементов; для неё у элементов есть две вещи:

Вторая кнопка с тем же смыслом не допускается: документ, где в одном разделе стоят два элемента одного вида с одними и теми же объектами, функция пульта отклоняет. Один объект в разных разделах или в элементах разного вида допустим: кнопка остановки на каждом разделе, переменная — полем в настройках и значением на основном листе. Украшений правило не касается: у украшения нет объекта, и на листе их столько, сколько нужно.

Набор с единым оформлением по умолчанию пополняется от рабочего минимума: элемент добавляют, когда собранной программе его не хватает. Перечень элементов принадлежит функции canvas: окно его показывает, но своих элементов не добавляет. Каждый элемент — законченная часть в своей папке (Правила разработки, 2.10): описание, словарь и встроенные виды. Состав первого набора по видам, имена привязок и параметров — Форматы файлов, раздел 7. Разметку к картинке даёт вопрос с ответом «область», правку показанного текста — вопрос с ответом строкой, поле которого заполнено этим текстом (Программа: граф и запуски, раздел 9); разметка звука и запись с микрофона — работа модулей. Выбор нейросети, которую берёт узел, — тот же «Выбор», чьи варианты — нейросети одного вида из библиотеки, привязанный к переменной, из которой узел берёт параметр нейросети. Своего элемента для нейросети нет: элемент выбирает значение одинаково, откуда бы ни брались варианты.

6.3 Разделы и лист

Пульт состоит из разделов: «Основное», «Настройки» и любых других, которые завёл человек. Разделы — вкладки пульта. Элемент лежит в одном разделе.

У раздела свой лист — поле заданных ширины и высоты. У вкладок одного окна лист один: размер, заданный на одной вкладке, получают все вкладки окна, и не меньше, чем нужно тому, что стоит на любой из них. Размещение элементов на листе свободное: у элемента есть место и размер, человек помещает его куда хочет; при перетаскивании работает прилипание к сетке и к соседям. Элементы могут лежать один поверх другого — так рамка ложится под кнопки. Порядок элементов в документе — порядок, в котором они нарисованы, и порядок обхода клавишей Tab.

Лист растёт вместе с окном. Нарисованный размер листа — наименьший. Окно меньше него показывает лист целиком и уменьшенным, с тем же расположением элементов; мельче установленного предела лист не уменьшается — тогда поле прокручивается. Окно больше него лист заполняет целиком, подложка — тоже, и полос по бокам нет: элементы своего размера не меняют, а держатся края. По ширине элемент стоит слева, справа, по середине или тянется, по высоте — сверху, снизу, по середине или тянется: так он остаётся на месте относительно своего края, а растянутый занимает прибавку окна. Что элемент делает, задаёт строка «Когда окно больше» в его панели; без неё — его вид: поле, таблица, просмотр и строки тянутся по ширине, кнопка держится своей стороны листа — той половины, в которой стоит, — а таблица и просмотр, ниже которых на странице ничего нет, тянутся и по высоте; остальное держится левого верхнего угла. Рамка группы растёт вместе с тем, что в ней лежит. Причина выбора: экраны бывают разного размера, и готовую программу разворачивают во весь экран, а человеку важно, чтобы элемент стоял там, куда поставлен, — поэтому раскладка не перестраивается, а растягивается по правилам, которые видны и задаются в панели.

Проверка размеров. На шаге «Вид» лист расставляют в нарисованном размере. Знаки в баре над листом показывают его в окне другого размера — «Как нарисовано», «Узкое окно», «Широкое окно», «Весь экран»: в таком окне лист растёт, как на лице программы, а расставлять в нём нельзя; окно больше рабочей области показано целиком, уменьшенным.

Пульт работает без расстановки. Элемент, поставленный на пульт без раздела, попадает в раздел, открытый на шаге «Вид», а поставленный с графа — в первый раздел. Место и размер даёт функция пульта, а не окно. Расстановка и оформление выполняются над уже работающим пультом и условием его работы не являются.

Расстановка всегда свободная. У каждой страницы — вкладки окна или окна без вкладок — лист есть всегда, и всё, что на ней лежит на любой глубине, стоит на этом листе своим местом и размером; кнопки «дать лист» нет. Первое место — то, куда страница положила бы вещь сама (6.8): функция пульта даёт его, когда вещь поставлена без места. Поставленное в страницу, где уже что-то стоит, ложится под то, что стоит; на шаге листа.

Не размещённое. У элемента и у рамки на листе три состояния: на листе, не размещён и удалён. Не размещённый элемент есть в графе интерфейса со всеми привязками и видом, но места на листе у него нет: он лежит в колонке шага «Вид», в разделе «Не размещено», и оттуда его кладут на лист нажатием — на прежнее место, если оно ещё на листе, иначе туда, куда страница положила бы его сама. «Убрать из раскладки» в панели элемента и графического узла снимает его с листа; рамку снимают так же — в панели её вместилища на графе интерфейса, со всем, что в ней лежит. Новый графический узел, поставленный на графе интерфейса, сначала не размещён: функция пульта сама места ему не даёт. На лице программы не размещённого не видно, но его привязки работают: переменная пишется, вместилище показывается и прячется по своей. Кнопку события, элемент ввода и вопрос человеку нужно видеть, чтобы ими пользоваться: такой не размещённый элемент колонка помечает знаком предупреждения и говорит, что человек не сможет им пользоваться. «Удалить элемент» убирает его из программы.

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

Расставляют элементы на шаге «Вид» (5.4): лист там правится всегда, переключателя «Расставить» нет, а пользуются пультом на лице программы (6.6):

Шаг помогает руке, а не обязателен: место, заданное числом или с клавишей Alt, функция пульта на шаг не переводит. Порядок элементов рукой на листе не меняется — его меняют в панели, «Раньше» и «Позже»: элемент, поставленный позже, лежит поверх.

Числа листа — настройки функции пульта (Настройки, раздел 8): размер нового листа, шаг, отступ от края и промежуток, с которыми функция сама даёт место, и предел уменьшения листа на экране. Окно получает шаг, отступ и предел от функции пульта вместе с поверхностью и своих чисел не держит. Наименьший размер и размер по умолчанию называет описание каждого элемента. У процесса могут быть свои числа — на уровне настроек процесса; они передаются вместе с ним.

Формат документа — Форматы файлов, раздел 7.

6.4 В интерфейс: отражения

Что программа отдаёт интерфейсу, выбирает человек: узел целиком — его событие с остановкой, повтором и состоянием, вопрос, «Показать», ход шага, — вход, выход, параметр, переменную, собранный узел — его лицом. Уходит только выбранное: у модуля с кучей входов и выходов в интерфейс уходит то одно, что нужно. Взятое целиком — узел, лицо собранного узла — вбирает отражения своих строк, взятых по одной, и те, что завела функция пульта (6.8): отражение у вещи одно, и у строки тоже.

Действие стоит в панели выбранного, во вкладке «Правка», в части «В интерфейс»: у узла — строка на каждое, что можно взять, у переменной — она сама, у собранного узла — его лицо. «В интерфейс» ставит на граф интерфейса отражение (6.8) — узел, строки которого — эти объекты. Взятое строка называет «В интерфейсе» и говорит, сколько графических узлов его показывают; она предлагает виды элементов, которыми его показать или задать, — нажатый ставит такой элемент, связанный с отражением и не размещённый на листе (6.3), — и «Показать в интерфейсе». Брать можно и со стороны интерфейса: колонка графа интерфейса предлагает «Что есть в программе», и там же — включение программы, которого нет ни у одного узла (6.8).

Отражение — не узел рабочего графа. В документ графа оно не входит, рёбер у него нет, и запуск о нём не знает: это часть документа пульта, которая называет объекты графа. Причины:

«В интерфейс» делает с графом то, что человек сделал бы руками (Программа: граф и запуски, раздел 16):

Заведённые переменная и узел — обычная правка графа: она видна на холсте, отменяется вместе с прочими правками и у включённой программы недоступна. Параметр, уже взятый из переменной, свою переменную сохраняет: вторая не заводится.

На рабочем графе узел, что-то из которого в интерфейсе, носит знак на шапке, перед знаком своего вида, с подсказкой, сколько его отражений; переменная в колонке помечена. «Показать в графе» в панели отражения ведёт к оригиналу, «Показать в интерфейсе» в панели узла — к отражению. Удалённое отражение снимает привязки графических узлов к своим строкам; узел и переменные, заведённые для него, остаются в графе, пока их не уберёт человек.

Пульт на экране сверяется с графом на экране, а не с записанным: переменная, заведённая минуту назад, для пульта уже объект. Записывают оба документа — граф и пульт — каждый своим окном.

6.5 Вид элемента и тема пульта

Графика — одна из основ пульта: пульт должен выглядеть интерфейсом этой программы, а не формой из одинаковых кнопок. Поведение элемента задаёт закрытый набор (6.2), вид заменяем. Слоёв графики три:

1) тема пульта — палитра, шрифт и скругления одного пульта; хранится в документе пульта; 2) подложка и украшения — цвет или рисунок под листом раздела и элементы-украшения: надписи, рамки, рисунки; 3) вид элемента — то, как нарисован сам элемент. У каждого элемента набора есть встроенные виды. Свой вид человек собирает из рисунков по состояниям элемента — «не нажата», «нажата», «недоступна», положения стрелки, деления полосы — и чисел к ним.

Вид — данные, а не код: файл описания и рисунки рядом с ним. Рисунки готовят в любом графическом редакторе; своего редактора платформа не содержит. Рисунки пульта и свои виды лежат в папке процесса и передаются вместе с ним (Программа: граф и запуски, раздел 1; Форматы файлов, 7.2).

Оформление набора едино по умолчанию: пульт без темы и своих видов рисуется встроенными видами. Оформление пульта с токенами ui.* мастерской не смешивается (раздел 7): на листе ничего не нарисовано цветами мастерской, и пульт выглядит одинаково в светлой и в тёмной мастерской и на лице программы. Цветами мастерской нарисованы только орудия расстановки — выделение, ручки, линия прилипания.

Тема — девять ключей: фон пульта, цвет элементов, цвет букв, цвет действия, цвет готового, цвет остановки, шрифт, высота букв и скругление углов. Цвет действия — кнопка события, заполнение полосы, включённый выключатель; цвет готового — индикатор прошедшего запуска и кнопка повтора; цвет остановки — кнопка остановки, сбой и отметка неработающего элемента. Цвет букв поверх заливки окно выбирает само — буквы или фон, что читается лучше; обводки и поля получаются из цвета букв и цвета элементов. Шрифт выбирают из четырёх: шрифт платформы, шрифт Windows, с засечками, равной ширины. Высота букв и скругление считаются в единицах листа и меняются вместе с ним.

Ключ темы, которого пульт не задал, берётся из настроек: раздел «Вид пульта по умолчанию» (Настройки, раздел 8). Так у человека один вид для всех его пультов и свой — для того, которому он его задал. Перечень ключей и то, что каждый принимает, — та же схема настроек функции пульта: второго описания нет.

Оформление задают на шаге «Вид»: знак «Оформление» в баре над листом открывает панель самого пульта — тему и рисунки. Цвет выбирают в окне выбора цвета системы, как в части «Свой вид»; ключ, который пульт не задал, показывает в строке серым то, что дают настройки, а знак «Вернуть» отпускает ключ к настройкам.

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

Украшения ставят из колонки шага «Вид», из перечня «Украшения»:

Украшение переносят, тянут и убирают, как любой элемент; подписи и другого вида у него нет.

Рисунки пульта лежат в папке процесса и уходят вместе с ним при передаче (Форматы файлов, 7.2 и 10.1). Рисунок добавляют в панели «Оформление»: кнопка открывает окно выбора файла Windows, и страница отдаёт функции пульта сам файл, а не путь к нему. Принимаются PNG, JPEG, GIF, WebP и SVG не крупнее заданного в настройках; файл проверяется по имени и по содержимому, и показывается только как изображение — ничего из него не исполняется. Рисунок, который назван подложкой или элементом, из папки не убирают, пока его не сняли с листа. Элемент и раздел, рисунка которых в папке нет, остаются на месте и помечены.

Визуальный редактор вида: вид элемента делают в его панели, в части «Свой вид». «Нарисовать свой вид» начинает вид от темы пульта, «Изменить вид» — от своего вида, которым элемент уже нарисован. В строках — состояние элемента, которое делают, и его цвета (фон, рамка, слова: выбираются в окне выбора цвета системы; состояние, кроме первого, берёт недостающее у первого), скругление и толщина рамки, узор — полосы, клетка или точки — с цветом и шагом, шрифт и высота букв, у полосы — цвет заполнения, и название вида. Сделанное видно на листе сразу, пока не сохранено; «Сохранить вид» отдаёт вид функции пульта своим видом процесса (ogas.look/1 с paint, Форматы файлов, 7.2), и элемент рисуется им, «Отменить» его бросает. Другим элементам того же вида сохранённый вид дают в строке «Вид»; уходит он с программой, как любой свой вид. Редактор пишет файлы вида, формат пульта он не меняет.

Вид элемента из рисунков. Вид — папка: описание look.json и рисунки, которые оно называет (Форматы файлов, 7.2). Описание говорит:

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

Вид элементу выбирают в его панели, в строке «Вид»: «Вид набора» или один из видов, сделанных для этого вида элемента. Встроенных видов шесть: «Клавиша» у кнопки, «Рычажок» у выключателя, «Лампа» у индикатора, «Трубка» и «Стрелка» у полосы, «Накладка» у рамки; тема пульта на них не действует — у вида свои цвета. Свой вид добавляют в панели «Оформление», в части «Свои виды»: кнопка открывает окно Windows для выбора папки вида, и функция пульта принимает папку целиком или отказывает и говорит, что в ней не так. Свой вид лежит в папке процесса и уходит вместе с ним; под именем встроенного вида он встаёт на его место. Вид, которым нарисован элемент, не убирают, пока элементу не дали другой.

Элемент, который называет вид, которого нет, вид другого элемента или вид, собранный с ошибкой, работает как обычно: он нарисован видом набора, а при расстановке помечен знаком с причиной.

Вид из рисунков описывают файлом look.json в папке вида, вид из цветов и чисел делают в панели элемента, в части «Свой вид» (выше).

6.6 Лицо программы

Лицо программы — пульт рабочего процесса во всё окно платформы, без каркаса мастерской: разделы пульта вкладками, лист открытого раздела и кнопка перехода в мастерскую. Окно на лице программы — размером с собранный интерфейс: лист в масштабе 1 и то, что вокруг него, — строка сверху, вкладки, поля; лист больше экрана уменьшается целиком, а окно — с ним, так что пустых полос сбоку нет. Окно, которое растянули или развернули во весь экран, лист заполняет целиком (6.3). Окно просит этот размер, когда лицо программы показано или у него сменился лист; размер, который человек потом задал окну рукой, остаётся. При переходе в мастерскую окно встаёт на прежнее место и в прежний размер. Так готовой программой пользуются, не открывая мастерскую. Окно и экземпляр — те же: лицо программы — второе, что показывает окно платформы, а не отдельная программа.

Как ядро передаёт имя программы запускаемому и работающему экземпляру — Устройство платформы, 3.6.3 и 5.3; методы функции ui — Методы мастерской и пульта, раздел 2.

6.7 Набор пульта

Что есть у пульта:

6.8 Граф интерфейса

Интерфейс программы собирают в два шага после рабочего графа: сначала граф интерфейса — что программа отдаёт интерфейсу и чем это показано: отражения того, что нужно, графические узлы и строение из них — окна, вкладки, группы, подгруппы, — потом место и внешний вид.

Граф интерфейса — отдельный граф на своём холсте. В рабочий граф он не входит, а ссылается на него: запуск о нём не знает, вставка и вызов процесса с ним не работают. Рабочий граф связан с ним только отражениями: то, что человек взял в интерфейс (6.4), стоит на графе интерфейса своим узлом.

Узлы графа интерфейса трёх родов:

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

Связи графа интерфейса четырёх родов:

Привязка записана в элементе и во вместилище, как у пульта: имя привязки и object_id сквозного объекта (Программа: граф и запуски, раздел 16); отражения записаны в документе пульта рядом с элементами (Форматы файлов, раздел 7). Объект, к которому привязан элемент и которого нет ни в одном отражении, функция пульта отражает сама — так пульт, собранный раньше или помощником, сразу виден со своими связями. У элемента столько привязок, сколько объектов он называет.

Пустой элемент — графический узел без вида: сначала его привязывают, потом выбирают, каким элементом ему быть. Он стоит первым в колонке графа интерфейса, а ещё его вытягивают связью от строки отражения в пустое место холста: там он встаёт уже привязанным. Привязанный, он предлагает в панели «Каким быть»: только виды, возможные для этого объекта и вида данных, подходящий первым — у выхода с текстом «Значение» и «Просмотр», у события «Кнопка», у входа без связей — ещё и элементы ввода его типа: такой элемент получает переменную с её узлом, холодная связь которого даёт вход, и строка отражения становится этой переменной. Пока вид не выбран, он записан с пометкой «вид не выбран», на лист не ложится и на лице не виден. Тот же список у готового элемента — «Сменить вид»: привязки, место и размер остаются там, где новый вид их принимает. Если связь элемента отпустили на строке, которую его вид не принимает, панель предлагает «Каким быть здесь»; на вход, к которому идут другие связи, элемент ввода не ставится — он спорил бы с графом, и мастерская так и говорит. Вместилищ это не касается: окно, вкладку и группу выбирают по строению.

Элементы — набор пульта. Каждый элемент набора с его привязками — графический узел: кнопка, выключатель, поле, число, выбор, вопрос, значение, полоса, индикатор; просмотр, который показывает то же, что узел «Показать», — текст, картинку, галерею, проигрыватель; выбор файла в переменную; таблица — список записей, например список чатов или лента писем, строками и столбцами: щелчок по строке пишет её ключ в переменную и может нажать событие, таблица показывает только записи, у которых поле равно значению переменной, — ленту открытого чата, — и ставит строки по полю; строки — список, который человек правит строками. Поле бывает многострочным и пишет по мере набора; на вопрос отвечают в том виде, в каком его задаёт узел вопроса, — картинкой и областью на картинке тоже (Форматы файлов, раздел 7; Программа: граф и запуски, раздел 9). Надпись и рисунок — украшения. Рамки в наборе нет: собрать элементы вместе — дело группы.

Связь графа интерфейса — не ребро рабочего графа: пакетов запуска она не несёт и рисуется по-своему.

Развилка остаётся в рабочем графе. Когда одно нажатие запускает несколько частей одного дела, от события уходит несколько связей, и ветки идут одновременно (Программа: граф и запуски, 10.2 и 12.2): так это работает от кнопки, таймера, сообщения и вызова. Своего разветвления у интерфейса нет (6.2). Иное дело — общий рубильник: одна кнопка, которая нажимает несколько событий, у каждого из которых свой запуск, своя остановка и своё состояние. Логики в нём нет — это несколько нажатий разом, — поэтому такая привязка в графе интерфейса допустима.

Где его собирают. Граф интерфейса — настоящий нодовый холст, свой: рабочего графа на нём нет, и линии интерфейса не идут через рабочие связи. Своего окна у него нет:

Заготовка интерфейса — вместилище со всем, что в нём лежит, сохранённое в библиотеке, чтобы поставить его в другую программу:

Три шага и граница между ними:

1) рабочий граф — процесс собран, работает и проверен прямо в графе (5.5); 2) граф интерфейса — что в интерфейсе есть, в чём оно лежит и к чему привязано; 3) сам интерфейс — где оно стоит и как выглядит: место, размер, тема, виды элементов (6.3, 6.5) — на шаге «Вид».

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

Где живёт граф интерфейса: там, где ему положено по правилам платформы, — в документе пульта workspace.json процесса, ogas.workspace/3; хозяин — функция canvas. У интерфейса программы один хозяин и один документ, второго файла для того же не заводят (Правила разработки, 2.4); новое встаёт в готовое место — документ и функцию, которые уже держат интерфейс программы (там же, 2.5); всё, что относится к процессу, лежит в его папке (Программа: граф и запуски, раздел 1). Рабочий граф (process.json, хозяин — функция графа) граф интерфейса только называет — по сквозным объектам, как пульт. Устройство документа — Форматы файлов, раздел 7.

7 Оформление оболочки

Цвета, шрифт, размеры букв, скругления, отступы, обводки и размеры областей самой мастерской (бары и вкладки-капсулы, хост, колонка слева, рабочее поле и панель выбранного у окон, граф и пульт) задаются настройками группы ui.* (Настройки, раздел 8). Значение из закрытого набора (язык, схема, источник шрифта) выбирается из списка во вкладке «Правка» панели выбранного: набор расширяется без изменения вида строки.

Единый вид оболочки. Оформление задаётся токенами ui.* (lib/look.js → CSS-переменные), общих классах style.css, лицах капсул faces.js и знаках lib/glyphs.js. Каркас (shell.js, windows.js) и окна на хосте (host/*) рисуют из одних токенов, классов, лиц и знаков (правило 2.9 Правила разработки).

Это оформление самой мастерской, а не пульта человека. Оформление пульта с токенами ui.* не смешивается.

7.1 Язык интерфейса

Мастерская использует общеупотребительный язык (правило 3.4 Правила разработки). Ниже изложено применение правила к словам мастерской.

8 Распределение отрисовки интерфейса

Функции не описывают мастерской способ отрисовки интерфейса. Мастерская рисует свои окна сама, а функции предоставляют ей данные своими запросами: process.open и process.snapshot — граф и запуск, canvas.get и canvas.snapshot — пульт, settings.schema — настройки, module.list — модули, observe.* — журнал и проблемы.

Обоснование:

При этом сохраняются: