Мастерская
Мастерская подробно: окно платформы, панели, окна графа, пульта, библиотеки и помощника, вид узлов на холсте, пульт программы и его оформление. С чего начать — С чего начать.
Введение
Документ описывает устройство мастерской — окна платформы в Windows — и пульта рабочего процесса. Хозяева: функция ui (связь и окно), функция canvas (документ пульта), функция graph (смысл сквозных объектов). Первые шаги — С чего начать, защита окна — Защита, 3.10, методы — Методы мастерской и пульта.
1 Назначение мастерской
Мастерская — окно платформы. В мастерской человек добавляет модули, собирает графы и пульты и пользуется ими. На один экземпляр приходится одна мастерская; внутри неё, в хосте — середине между панелями, — открываются окна.
Пульт — полноценный графический интерфейс рабочего процесса.
Что мастерская делает для человека:
- пульт показывается в одном окне платформы двумя способами: на шаге «Вид» окна графа внутри мастерской, где его собирают, и во всё окно, без каркаса мастерской, — на лице программы, где программой пользуются (6.6). Отдельной программой пульт не выносится;
- в мастерской открыто сразу несколько рабочих процессов; включённая программа не изменяется;
- включено может быть несколько программ сразу, каждое событие вызывает запуск (Программа: граф и запуски, раздел 2);
- O.G.A.S. является программой, а не службой: закрытое окно уходит к значку у часов, и платформа работает дальше — программы напоминают и принимают сообщения; останавливает её «Выйти» в меню значка, после подтверждения (2.1). Автоматического запуска нет: после перезагрузки компьютера программы не работают, пока человек не запустит O.G.A.S.;
- мастерская сама зовёт человека уведомлением о вопросе программы и о сбое запуска, об окончании запуска — нет (2.2);
- бары по краям — разделы по смыслу: слева «Мастерская» — создание — и «Платформа» — администрирование, где библиотека всего, что у человека есть; справа — панели программ, которые человек составил сам, по своим категориям; логотип раздела — знак без действия; журналов два — программы и платформы (раздел 4, 5.6).
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).
- Закрыть — значит спрятать. Кнопка «закрыть» на полосе сверху и на лице программы,
Alt+F4и закрытие с панели задач прячут окно: программа окна остаётся, а в области уведомлений Windows, у часов, стоит значок O.G.A.S. с подсказкой. Ничего не останавливается и не теряется: несохранённые правки, набранное и раскладка ждут в спрятанном окне. - Значок. Щелчок по нему возвращает окно таким, каким его спрятали; меню значка — «Открыть» и «Выйти».
- Где окно. Впервые за запуск спрятанное окно говорит, куда ушло, — уведомлением в углу экрана (2.2): платформа работает у часов, выйти — из меню значка.
- Выход. «Выйти» показывает окно и спрашивает, точно ли выйти, и называет, что будет потеряно — несохранённые правки, набранное, идущий запуск — и что программы выключатся и напоминать не будут. Согласие отправляет
core.shutdown, и программа окна закрывается вместе с экземпляром. - Повторный запуск ярлыка показывает спрятанное окно, как открывает заново отказавшее (Устройство платформы, 3.6.3).
- Пока значка нет. Значок появляется, когда страница окна дала ему слова на языке интерфейса. До этого — и если страница не поднялась — закрытие задаёт вопрос выхода: окно не пропадает без значка, через который его вернуть.
Автоматического запуска нет: после перезагрузки компьютера программы не работают, пока человек не запустит 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, все области рисует страница:
- марка — левый верхний угол;
- полоса сверху — имя программы, состояние и сообщения; справа кнопки окна Windows (свернуть, развернуть, закрыть). Перетаскивание полосы и марки перемещает окно;
- левый край — бар «Мастерская», создание: «Граф», «Модули» — модули программы на экране, — «Журнал программы», «Помощник» (5.7) и «Создать»: новая программа сразу открывается в окне графа; под ним бар «Платформа», администрирование: «Библиотека» (5.6), «Журнал платформы», «Настройки», «Профиль» (5.10), «Язык», «Тема», «Справка» — документация на сайте ogas.space в браузере — и «Выйти» (2.1);
- правый край — панели программ: каждая — категория, которую человек сделал и назвал в библиотеке, со значками программ, которые он на неё поставил (5.6). Щелчок по значку открывает собранную программу: её лицо занимает окно, и программа включается (6.6). Сама платформа на панель ничего не ставит.
Бары — разделы по смыслу, а не по тому, как устроен код. Над пунктами раздела — его логотип: знак раздела, а с подписями — и его название; он ничего не открывает и не нажимается — у этих баров и у баров над холстом графа (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 Окна на хосте
Окно на хосте — вкладка-капсула сверху (название, кнопки окна, шеврон свёртки) и под ней тело окна.
- Виды окон — по таблице 1. Открывается по одному окну каждого вида; несколько видов открыты одновременно.
- Несколько процессов открыты сразу. У каждого открытого процесса свои окна графа и журнала программы — по одному каждого вида, — и вкладка такого окна называет процесс: «Граф · Комикс». Два графа ставят рядом и смотрят сразу. Каждый процесс держит своё: документы, выбранное, набранное, историю правок, запуски; что пришло от платформы для одного процесса, ложится в него, какой бы процесс человек ни правил в это время. Процесс, с которым работают, — тот, чьё окно человек нажал последним: нажатие в окне процесса делает его процесс текущим раньше, чем что-нибудь в окне ответит на нажатие. Строка сверху, бары «Мастерская» и клавиши говорят о текущем процессе: «Граф» и «Журнал программы» открывают окно этого процесса, окно «Модули» показывает его модули. Процесс, выбранный в баре, в библиотеке или панелью программ, открывается рядом с открытыми, а открытый выходит вперёд; новый и ввезённый процесс тоже открываются рядом.
- Кнопки вкладки: сначала действия окна (у графа — «Сохранить» и «Проверить», на шаге «Вид» — «Сохранить»), затем «свернуть», «во всё окно» и «закрыть». «Сохранить» каждого окна пишет документ его хозяина и только его: граф — граф процесса, пульт — пульт; отказ хозяина говорится в том окне, чей документ он не принял.
- Действия с окном: перемещение за название, изменение размера за край, разворачивание на весь хост, свёртка шевроном в капсулу на том же месте, свёртка кнопкой «свернуть» в нижний бар и закрытие. Нажатие на название, которое никуда не повело, — щелчок: окно выходит вперёд и остаётся, как стояло. Окно, унесённое из развёрнутого на весь хост, принимает прежний размер, и его название остаётся под указателем.
- Окно — это его вкладка и тело, а не прямоугольник вокруг них. Пустое место в строке вкладки, правее капсулы, окну не принадлежит: вкладка окна позади, видимая в этом месте, доступна — нажатие на её название выводит то окно вперёд, её кнопки и шеврон работают.
- Вопрос мастерской — о закрытии, об уходе с процесса, о новом и ввозимом процессе — лежит поверх всех окон, сколько бы раз их ни выводили вперёд: окна накладываются друг на друга только внутри хоста.
- Свёрнутое в капсулу окно — это его капсула: столько места оно и занимает. Его переносят куда угодно, где капсула помещается, до самого края хоста; под указателем оно находится только там, где капсула, и ничем невидимым соседей не накрывает. Развёрнутое там, куда унесли капсулу, окно встаёт внутри хоста.
- Нижний бар. Окно, свёрнутое кнопкой «свернуть», уходит с хоста капсулой — название и шеврон — в ряд поверх нижнего края хоста, слева направо в том порядке, в каком окна туда уходили. Высота хоста от этого не меняется: капсулы лежат поверх окон под ними. Щелчок по капсуле или открытие окна из бара возвращает окно на прежнее место и размер. При отсутствии свёрнутых окон ряд не отображается.
- Окно стоит там, куда его поставили, и того размера, какой ему дали: ничто не даёт ему ни места, ни размера само. Отпущенное у края хоста, в его углу, над другим окном — оно остаётся там, куда его принесли, а другое окно — каким стояло. Свой край окно меняет только за захват этого края, и никакое другое окно при этом не двигается.
- Притяжение к краям — единственная помощь окну: стоять ровно. Край окна, которое несут, подошёл к краю другого окна или хоста ближе 12 точек — окно доезжает до него: встаёт вплотную рядом (боком к боку, верхом к низу) или вровень (верх к верху, бок к боку). Притягивают края окон, которые стоят рядом, — не тех, что далеко выше или ниже по линии; из двух краёв в пределах досягаемости — ближний. Размер окна не меняется. Так же притягивается край, который тянут. Развёрнутое на весь хост и свёрнутое в капсулу окно ничего не притягивает, капсула не притягивается.
- Когда хост меняет размер — окно мастерской растянули или сжали, — окна сохраняют свои доли хоста: окно, занимавшее половину хоста, по-прежнему занимает половину, стоявшие рядом стоят рядом. Так же раскладка встаёт на хост другого размера при запуске.
- Закрытие процесса — последнего его окна — при несохранённых правках сначала спрашивает, как закрытие мастерской: уйти, не сохраняя, или остаться (взамен вопроса при уходе на другой процесс: другой открывается рядом, и ничего не теряется). Процесс, который не открылся, окна не получает: открытые остаются, и отказ назван. Закрытие мастерской называет потерю каждого открытого процесса, при нескольких — с именем процесса.
- Хост бывает пустым. Сам хост окон не открывает: при запуске без сохранённой раскладки и после закрытия всех окон он пуст и посередине говорит, откуда открывают окна, — программу на панели программ или в «Библиотеке», новую кнопкой «Создать». Все окна, журнал тоже, человек открывает из баров. Причина: окно графа без процесса ничего не показывает, а мастерская работает и без окон — включённые программы идут, их лица открываются.
- Раскладка окон в документы процесса не пишется; окно процесса помнит, чей оно, и при запуске открываются процессы, которые показывали окна раскладки. Раскладка сохраняется между запусками на уровне пользователя, чтобы каждый запуск не начинался с перемещения окон. Хранит её функция
uiвconfig/layout.json, рядом сuser.json(Форматы файлов, 7.1): какие окна открыты, где, в каком порядке и что с ними — развёрнуто, свёрнуто на месте, в нижнем баре. Страница записывает раскладку, когда та перестала меняться, и сразу — перед остановкой платформы кнопкой закрытия окна или «Выйти» на баре «Платформа». При запуске окна встают туда, где их оставили, а если хост стал другого размера, — в тех же долях хоста. При отсутствии сохранённой раскладки хост пуст.
Журнал — окно, такое же, как остальные (данные предоставляет функция observe): постоянного места на хосте у него нет, оно перемещается, прилипает, разворачивается и закрывается. Журнал показывает последние записи страницей, а кнопка «Показать ещё» над ними добавляет более старые, пока они есть: журнал не укорачивается, и вся его история доступна из окна.
5.1 Тело окна
Тело каждого окна на хосте устроено одинаково:
- Колонка слева — категории и подкатегории окна. Категория с названием сворачивается. Щелчок по пункту выбирает, что показать в поле, а у графа и пульта — что поставить на поле. Вид узла ставят на холст и перетаскиванием: пункт выносят из колонки, за указателем идёт его название, и узел встаёт там, где его отпустили, — в теле рамки или в развёрнутой группе, если отпустили над ней; отпущенный мимо холста пункт ничего не ставит. Так же ложится узел, поставленный щелчком: щелчок по области с видом узла в руке ставит узел в неё, а не выбирает её. У окна графа колонка также показывает допустимые соединения выбранного узла (5.2).
- Рабочее поле справа — то, с чем работают: граф, строки журнала, настройки подраздела, список модулей или запусков.
- Поверх рабочего поля, у его левого и у его правого края, окно может держать свои бары: поле прокручивается под ними. У окна графа это бары холста (5.4).
- Панель выбранного появляется, когда в поле выбран элемент, и располагается поверх нижней части поля, с отступом от его краёв и правее того, что окно держит поверх поля: бары холста панель не закрывает. Панель, которую человек поставил рукой, тоже сдвигается правее них и сохраняет размер, насколько позволяет поле. Где бы ни был выбран элемент, поле под панелью не сдвигается; под последним элементом поля остаётся место, чтобы прокруткой вывести его из-под панели. У панели вкладки, у каждого окна свои: например, «Информация» и «Правка». Слева от вкладок крестик «закрыть».
- Панель переносят и растягивают: кому удобнее, ставит её сбоку. Переносят за свободную часть полосы вкладок, растягивают за край или угол; панель остаётся внутри рабочего поля и не становится меньше 240 на 120 — столько нужно вкладкам и строке под ними. Место и размер запоминаются по виду окна и переживают перезапуск (Форматы файлов, 7.1); когда поле стало меньше, панель остаётся в нём. Двойной щелчок по полосе возвращает панель на её место внизу. Под панелью, которую человек поставил сам, места под последним элементом поле не оставляет: её отодвигает человек.
- Панель закрывается крестиком, клавишей
Escи щелчком по пустому месту поля; с ней снимается выбор.Escсначала закрывает панель, а следующийEscсворачивает окно; свёрнутое окноEscне разворачивает — его открывает шеврон. Выбор другого элемента меняет содержимое панели. - Холст бесконечен: у него нет краёв и своего размера, он заполняет рабочее поле, а поле не прокручивается — холст переносят. Узлы стоят где угодно, левее и выше начала тоже. Сетка точек на холсте едет вместе с ним, когда его переносят и приближают. Процесс, открытый впервые за сеанс, показан от начала того, что на нём стоит, с местом для баров у левого края; дальше холст стоит там, куда его перенесли.
- Масштаб холста окна графа меняют колесом мыши — к указателю: место под указателем остаётся под ним, — и инструментами «Крупнее» и «Мельче» — к середине поля — и «Весь граф» в баре инструментов холста (5.4). Шаг — четверть, пределы — от четверти настоящего размера до двух; «Весь граф» ставит граф целиком в середину поля, рядом с барами, и маленький граф крупнее настоящего размера не делает. Число масштаба называет строка состояния. Масштаб и место холста — взгляд, а не правка: в документы они не пишутся, держатся до закрытия мастерской, и граф включённой программы смотрят в любом масштабе.
- Холст двигают мышью: нажатие левой кнопкой на пустом месте холста и перенос двигают холст за указателем — так смотрят, что лежит дальше, сколько угодно далеко в любую сторону; нажатие, которое никуда не ушло, остаётся щелчком по пустому месту и снимает выбор. Средняя кнопка двигает холст откуда угодно, и над узлом. С видом узла в руке левое нажатие ставит узел, а не двигает холст.
- Ничто не лежит поверх чужого. Область — рамка и развёрнутый узел из узлов — держит только то, что в ней лежит, и ни один узел не лежит на другом. После правки, которая ставит, переносит, соединяет, собирает, разбирает, сворачивает или разворачивает, из двух, что легли друг на друга, одно уступает место вместе со всем, что в нём: то, что рука только что поставила или перенесла, стоит, где его оставили; область уходит вниз из-под того, что стоит над ней, — как развёрнутый узел отодвигает соседей; остальное уходит вправо или вниз, куда короче. Уступившее может лечь на третье, и тогда уступает то. Граф включённой программы не двигается: в нём меняется только взгляд.
- Несколько узлов в окне графа выбирают нажатием с клавишей
CtrlилиShift: нажатие добавляет узел к выбранным или убирает из них, панель остаётся у узла, выбранного первым. Выбранные узлы перетаскивают, собирают в один узел инструментом «Собрать в узел» и убирают клавишейDeleteвместе; рамка переносится вместе с телом. Нажатие без клавиши на узел вне выбранных выбирает его одного. Узлы выбирают и рамкой: перенос по пустому месту холста с клавишейCtrlилиShiftрастягивает рамку, и отпущенная рамка добавляет к выбранным всё, что лежит в ней целиком: узлы и свёрнутые группы — открытая группа остаётся областью, и её узлы берутся по одному; перенос без клавиши, как прежде, двигает холст. Группу выбирают, отмечают и переносят так же: нажатием на свёрнутую группу или на область развёрнутой; переносится она со всем, что в ней лежит.Deleteубирает группу со всем, что в ней. Инструмент «Собрать в узел», взятый при выбранных узлах, собирает их сразу и уступает место «Выделению»; взятый без выбранного, он ждёт узла. Собранное сразу стоит одним компактным узлом на месте первого из собранных, а то, что стояло правее и ниже, подходит ближе на место, которое они занимали. - Заметки и точки на связях:
- заметка — текст на холсте к своей программе: что здесь делается и почему. В запуске она не участвует; её ставят из колонки («Заметка»), переносят, растягивают, правят и убирают, как узел, и, как узел, она ничего не закрывает. Текст пишут в панели; на холсте под шапкой цвета заметок (
ui.color.head_note) он стоит строка в строку, от двух до восьми строк, длинный прокручивается; - точка на связи — место, через которое связь ведут в обход; смысла она не вносит (Программа: граф и запуски, раздел 3, правило 8). Двойной щелчок по связи ставит точку там, где путь удлиняется меньше всего; точку носят рукой, двойной щелчок по ней убирает её; каждое действие — шаг истории. Между точками связь идёт с одним поворотом; точки связи, оба конца которой переносят, едут с узлами. В графе включённой программы точек не ставят и не двигают.
Deleteубирает выбранное в окне, которое впереди: узел или несколько выбранных узлов, связь или связь интерфейса — в окне графа, выбранные элементы — на шаге «Вид»; в других окнах клавиша ничего не делает. Граф включённой программы только для чтения (С чего начать, 7):Deleteузла не убирает, аCtrl+ZиCtrl+Yвозвращают и повторяют правки пульта, не трогая граф.Enterв поле пульта заканчивает ввод и записывает переменную, как уход из поля; запуск поEnterне начинается — его начинает только событие.- Стрелки сдвигают выбранное в окне, которое впереди: элементы по листу на шаге «Вид» (6.3), — на шаг листа, с клавишей
Alt— на единицу; узлы, группы и графические узлы на холсте окна графа — на клетку сетки, сAlt— на точку, и каждое нажатие — шаг истории; когда на холсте ничего не выбрано, стрелки переносят сам холст. В поле ввода стрелки остаются клавишами поля, в других окнах ничего не делают. - С клавиатуры делается всё, что делается рукой:
TabиShift+Tabпроходят по всему, что действует: кнопкам и полям, строкам колонки и журнала, ярлыку окна и полосе панели, узлам, группам, связям и их точкам, знакам ярлычка узла и глазам лица, графическим узлам и связям интерфейса, элементам и рамкам листа пульта, строкам таблицы, картинке вопроса. То, на чём фокус, обведено цветом акцента; окно, в которое пришёл фокус, выходит вперёд, и его процесс становится текущим;Enterили пробел выбирают, как нажатие, а сCtrlилиShift— отмечают ещё одно;- на ярлыке окна стрелки передвигают окно, с
Shift— тянут его правый и нижний края,Enterсворачивает и разворачивает; на полосе панели стрелки переносят панель, сShift— меняют её размер,Enterвозвращает её на место; - вид узла или модуль, выбранный в колонке клавишей, встаёт в середину видимой части холста и выбирается; соединяют узлы через колонку — «Соединить с тем, что есть» и «Добавить и соединить» (5.2);
Insertна связи ставит точку посередине её самого длинного колена; точку двигают стрелками и убираютDelete;- в какой собранный узел положить узел или группу, выбирают строкой «В собранном узле» во вкладке «Детали» (рукой — перенос с
Alt); рамку листа пульта переносят стрелками со всем, что в ней; - вопрос об области: первое нажатие стрелки кладёт четверть картинки в её середину, дальше стрелки двигают область, с
Shift— меняют размер; точки и кисть ведёт прицел: у точекEnter— «вот это»,Shift+Enter— «а это не брать»,Backspaceубирает последнюю; у кисти пробел красит, стрелки сShiftкрасят на ходу. - Ширина колонки —
ui.layout.side_w, высота панели —ui.layout.detail_h, отступ панели от краёв поля — дваui.space.pad, справа — от полосы прокрутки поля, если она есть, цвета —ui.color.side,ui.color.workиui.color.detail(Настройки, раздел 8).
Состав тела каждого окна приведён в таблице 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):
- пока строка не сохранена, набранное стоит в ней, а узел хранит прежнее; строка помечена, её знак «Сохранить изменения» выделен. Сохраняют этот знак или
Enter; каждая строка сохраняется сама; - «Вернуть значение по умолчанию» действует сразу: у узла не остаётся значения, и действует правило хозяина; у имени и типа переменной и у модуля узла умолчания нет, и знака нет;
- сохранение и возврат — по шагу истории. Сохранённое стоит в документе на экране, а в файл его запишет «Сохранить» окна, о чём окно и говорит;
- текст, который ещё не стал значением, — половина списка — не сохраняется: он остаётся в строке, и окно говорит почему;
- имя переменной сохраняет функция графа вместе со всем, что её называет: узлы, параметры, лица групп, место на пульте и запомненное значение идут за именем (Программа: граф и запуски, раздел 7). Окно говорит, сколько узлов пошло за именем, и называет процессы, где вызов даёт значение прежнему имени; отказанное имя остаётся в строке, отказ сказан словами функции графа;
- другой тип переменной начинает со своего пустого значения; пульт пишется и при включённой программе, поэтому подпись слота правится всегда.
Набранное и не сохранённое не пропадает (Правила разработки, 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), название по умолчанию — «Узел», там, где собранный узел нужно отличить от обычного, — «собранный узел». «Группа» остаётся термином документов и формата (Термины).
У всего, что стоит на холсте, одна форма:
- ярлычок над левым краем узла, от точки, где кончается скругление угла, — так под его нижним углом нет зазора; значок состояния стоит так же над правым углом. На ярлычке — метка вложения у того, внутри чего что-то лежит (Программа: граф и запуски, раздел 17), и, у выбранного узла, блок действий со значками; у узла без вложений и не выбранного ярлычка нет. Действия: удалить (подсказка значка называет и клавишу
Delete; в панели узла о клавишах ничего не сказано), копировать, у свёрнутой группы — развернуть, у развёрнутой — свернуть, у группы — ещё разобрать (Программа: граф и запуски, 17.1). Вынести группу в отдельный процесс — действие бара управления (5.4); отказ окно говорит словами причины и называет, о чём речь, — узлы, переменные или связи. Действие относится ко всему выбранному. В графе включённой программы у группы остаётся только «развернуть» и «свернуть»: они меняют взгляд, а не документ, и взгляд держится, пока открыт этот процесс; - шапка — название узла и справа от него знак вида; у области — рамки и развёрнутой группы — название стоит в начале шапки: область бывает шире окна. Цвет шапки говорит, что это за узел: у узла — семейство его вида (начало и конец, работа, ход, данные, ожидание — Виды узлов, приложение А), у группы — свой, шестой. Ярлычок того же цвета. Цвета — настройки
ui.color.head_*обеих схем (Настройки, раздел 8); красного, зелёного и янтарного среди них нет — они заняты сигналами. Кроме цвета, что это за узел, говорит знак вида. Оттенки — умолчания; человек меняет их в настройках; - строки портов — сначала входы, за ними выходы, за ними переменные, с которыми узел работает, у группы — переменные её лица. В строке порта стоят название порта и точка связи: у входа на левой границе узла, у выхода на правой. В строке переменной — её имя и отметка на границе, квадрат на углу: слева у переменной, которую читают, справа у той, которую записывают, с обеих сторон у той, с которой делают и то и другое (Программа: граф и запуски, 17.1). Рамка показывает свои порты на границах области, и строки переменной у неё нет;
- строки параметров — после переменных строкой «название: значение» стоят параметры, которые человек отметил в «Правке» узла, в части «Видно на узле»; по умолчанию не стоит ни одного. Значение — заданное, иначе то, что действует без него; выбор назван своим словом, взятое из переменной — переменной. Строка только для чтения: точки связи и глаза у неё нет, правят параметр в панели. Так граф читают, не открывая панель у каждого узла. Что видно на узле — вид графа, а не программа: отмечают это и в графе включённой программы, отметка сразу записывается в сохранённый документ, шагом истории не считается и правкой, которую надо сохранить, не делает;
- переключатель «на лицо» — знак глаза в каждой строке: открытый глаз — строка на лице, перечёркнутый — нет. Нажатие ставит и снимает отметку; переменную отмечают так же. У того, что лежит в группе, отметка относится к ближайшей группе; свёрнутая группа — узел группы вокруг неё, и её строки отмечают для внешнего лица. У узла и у свёрнутой группы верхнего уровня глаз ставит отметку заранее — на лицо узла, в который их соберут (Программа: граф и запуски, 17.1); подсказка глаза так и говорит. Свёрнутая группа показывает строками только своё лицо: чтобы вынести на него то, что внутри, её разворачивают. Отказ графа снять отметку с порта, через который идёт связь наружу, говорится словами. Свёрнутый узел строк того, что в нём лежит, не показывает, поэтому «Правка» собранного узла говорит, где отмечают лицо;
- свёрнутая рамка рисуется формой узла: на её ярлычке, как у узла из узлов, «Свернуть» и «Развернуть» и метка вложения, если в её теле что-то лежит; строки — только её порты, которыми её встречают снаружи; то, что лежит в теле, с холста убрано, а связи к нему приходят к боку рамки. Сворачивают и разворачивают её на месте, как группу, с той же уступкой места соседям; в графе включённой программы — только для взгляда;
- свёрнутая группа рисуется той же формой, и её строки — лицо; то, что в ней лежит, с холста убрано, а связи приходят к строкам лица. Сворачивают и разворачивают группу на месте: когда она разворачивается, то, что стоит справа от неё и под ней, отодвигается на размер её области, а когда сворачивается — возвращается; то, что лежит в самой группе, не двигается. В графе включённой программы документ не меняется: группа разворачивается для взгляда, и соседи уступают ей место в том, что видно, — по тому же правилу; выключенная программа показывает документ. Развёрнутая группа и рамка — область холста с телом внутри: шапка идёт поперёк верха области, у рамки граница пунктирная, у группы — сплошная. Связь тянут и от строки лица свёрнутой группы: она идёт от порта узла за этой строкой.
- перенос через границу — узел или узел из узлов, взятые с
Alt, переносят из одного узла из узлов в другой: пока их несут, область, из которой их взяли, за ними не тянется, а узел, в который они лягут, — самый глубокий под указателем в том же месте холста — подсвечен; отпущенные, они ложатся в него, а вне узлов из узлов — выходят на уровень своего места. Лицо следует за рёбрами (Программа: граф и запуски, раздел 17). БезAltперенос только двигает: область растягивается за своим, и ничто не выходит из неё и не входит в чужую.
Названия:
- узла — своё, заданное человеком в панели, или по умолчанию: вид словами, у модуля — название модуля, у вызова процесса — название вызываемого процесса (Программа: граф и запуски, раздел 4). На шапке одно название; пока своего нет, стоит название по умолчанию посередине шапки, а под своим мелко сказано, что это за узел;
- группы — одно: что это собранный узел, говорят её знак, шапка и уровень;
- порта — от хозяина: виду — его словарь, модулю — свой (Модули, таблица 2); у строки лица название может дать человек;
- идентификатора на шапке нет — это слово документа, а не человека: его говорят подсказка шапки и «Детали». Подсказка шапки — название, идентификатор, вид и описание узла, если оно есть. Точка перед знаком вида — в панели узла есть несохранённое.
Вызов процесса. Его порты — входы и выходы вызываемого процесса под именами, которые им дал человек; в «Правке» — выбор процесса и по полю на каждую его переменную, в пустом поле видно значение, с которого переменная начинает сама (Программа: граф и запуски, раздел 18). В запуске вызов показывает самое громкое из того, что делают узлы вызываемого графа, как свёрнутая группа.
Связи идут под прямым углом от точки выхода к точке входа и обходят узлы. Цвет линии — тип данных выхода, от которого она идёт: у текста, картинки и файла свои цвета (ui.color.type_*), связь с любыми данными (json) и связь, тип которой хозяин порта не назвал, рисуется цветом связи графа. Тем же цветом закрашена точка порта, а подсказка порта называет тип словом. Пунктир — связь от переменной или постоянной, яркая и толстая линия — подсвеченная (5.4).
Куда идёт связь, видно по стрелке: у входа линия кончается треугольником, который касается точки входа и растёт с толщиной линии; стрелка есть и у пунктирной связи. Вход, к которому идёт несколько связей, выше на строку для каждой из них, и у каждой связи своя точка: по разным связям приходят разные данные, и узел берёт то, что пришло первым. Выход, от которого связи идут к нескольким узлам, держит одну точку, а чуть дальше от неё стоит точка развилки, из которой линии расходятся: каждый узел получает одну и ту же копию. Подсказка входа называет число источников, подсказка развилки — сколько узлов получает данные.
Связь выбирают нажатием: выбранная связь шире остальных, а панель говорит, что она соединяет, — откуда и куда, узлом и портом, какие данные она несёт и через сколько точек ведена, — и держит кнопку «Удалить связь»; то же делает Delete. Узлы остаются, удаление — шаг истории. Выбор узла, группы или пустого места холста снимает выбор связи. В графе включённой программы связь выбирают, чтобы прочесть, но не удаляют.
Сигналы. Когда человек тянет связь, порты, к которым её можно подвести, светятся зелёным, а остальные притушены. Порт под указателем, к которому подвести нельзя, — красный, и причина названа словами функции графа: типы данных не совпадают, узел тот же, в узел связи не входят, такая связь уже есть, связь пересекла бы границу рамки не через её порты или замкнула бы круг вне рамки, на вход уже ведёт связь другого рода; когда мешает только лицо группы — связь пересекла бы её границу через порт, которого на лице нет, — окно называет эту группу и говорит, что отметить. Вход, на котором уже есть источник, — янтарный: соединить можно, появится слияние. В запуске подсвечен узел, который работает; упавший узел и узел, ждущий ответа человека, мигают; узел, ждущий сигнала или времени, и узел модуля, шаг которого ждёт своей очереди к модулю, подсвечены ровно. Сигнал не подаётся одним цветом: у него есть ещё знак или форма.
Состояние узла в запуске показывают два знака:
- значок над правым углом узла со знаком состояния: работает, ждёт сигнала или времени, ждёт своей очереди к модулю, ждёт ответа человека, не удался, выполнен, остановлен. Слова состояния — в подсказке значка и в панели выбранного;
- кольцо вокруг узла, пока в нём что-то происходит: ровное у работающего, ждущего сигнала или времени и ждущего очереди, мигающее у ждущего человека и у упавшего. Выполненный и остановленный узел носит один значок: законченный запуск оставляет холст спокойным.
Тело узла цвет от запуска не меняет: оно обычное или выбранное. Свёрнутая группа показывает самое громкое из того, что делают её узлы: сбой раньше вопроса человеку, вопрос раньше работы и ожидания; когда ничего не происходит — что запуск через неё прошёл. Состояние группы словами — «стоит», «работает», «ошибка», «частично», «готово», «остановлена» (Программа: граф и запуски, раздел 17) — называет её панель. Кто просил систему убрать движение, мигания не видит: состояние говорят значок и цвет кольца.
Что узел делает, окно узнаёт от запуска, за которым следит: о том, что шаг модуля ждёт своей очереди к модулю, начался и кончился, и о том, что ветка встала, говорит событие node.changed, остальное — контрольная точка, которую окно перечитывает по каждому такому событию (Обмен с ядром, раздел 7). Окно, которое пришло к запуску, когда тот уже шёл, начала шагов не слышало: о шагах модулей, которые идут или ждут очереди, оно спрашивает process.run.status (Методы графа). Пакет у узла модуля, о шаге которого не сказано, что он идёт, ждёт своей очереди.
5.4 Бары холста
Поверх холста, у его левого края, стоят два бара: сверху бар инструментов, под ним бар управления. Оба — та же капсула, что бары мастерской (раздел 4), в три четверти их размера: они стоят над работой, а не рядом с ней. Холст прокручивается под ними, а в начале прокрутки левый край графа стоит правее баров — в любом масштабе: место под бары с холстом не сжимается. Каждый бар сворачивается до шапки и показывает подписи сам, как любой бар: подписи открывает полоска сбоку, свёртку — шеврон, а логотип бара — знак без действия.
Бар управления держит команды программы и действия над выбранным там, где граф собирают и смотрят в работе: собранное включают, запускают и останавливают, не уходя с холста, и на нём же видят, какой узел работает (5.3). В баре стоят:
- переключатель программы — включить и выключить;
- у каждого события пульта — «Запуск», «Стоп» и «Повтор»; когда событий несколько, команда называет своё;
- «Продолжить» — когда запуск не идёт, а граф разрешает его продолжить, и рядом «Подтвердить повтор» — когда он просит на это согласия человека (Программа: граф и запуски, раздел 14);
- за командами — состояние каждого события своим цветом; по нажатию оно говорится словами в полосе сверху;
- подсветка — «Связанные» и «Того же вида»;
- «Собрать в узел» — собирает выбранные узлы в один узел;
- «Вынести в отдельный процесс» — выбранный собранный узел становится отдельным рабочим процессом, а на его месте остаётся узел, который этот процесс вызывает (Программа: граф и запуски, 17.1). На ярлычке узла этого действия нет.
Это те же сквозные объекты программы и те же команды, что на пульте: список команд один, и второй кнопки с другим смыслом нет (Правила разработки, 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.4); работающий узел отмечен на холсте (5.3); узел и группу запускают отдельно из панели;
- «Показать» под строками портов показывает то, что пришло: текст с переносом строк, число, список по пунктам, запись строками «поле: значение», картинку, звук и видео проигрывателем; файл другого вида и файл больше 64 МиБ — именем и размером; целиком то же видно в подсказке;
- поля события — по полю на каждое, что оно принимает: текст, число, «да/нет», список и данные набирают прямо на узле, и знак «Запустить» запускает событие с набранным; у таймера, часов и включения полей нет — данные даёт источник. Событие с полем файла без выбранного файла не запускается;
- поле постоянной правит её значение в графе: набранное помечено, пока его не внесли
Enter, и отменяется шагом назад; у включённой программы поле закрыто; - поле переменной у выключенной программы показывает начальное значение, у включённой — то, что держит программа, и пишет набранное;
- вопрос показан на своём узле: что спрошено, поле ответа, «Ответить» и «Отказаться», у «да/нет» — «Да» и «Нет»;
- файлы. Картинку, звук, видео и файл выбирают в поле события, постоянной, переменной и вопроса: файл передаётся процессу частями, в поле встаёт его имя, в значение — ссылка; файл ответа ложится к запуску, который спрашивает.
5.6 Библиотека
Библиотека — окно всего, что у человека есть: программ — собранных здесь и принятых, — установленных модулей, нейросетей и заготовок интерфейса. Здесь вещь создают, принимают, передают, удаляют и решают, где её видно; собирают её в мастерской. Библиотека — первый пункт бара «Платформа».
- Колонка слева — «Программы», «Модули», «Нейросети», «Заготовки интерфейса», «Источники» и «Панели справа»: панели программ, которые человек сделал, и «Новая панель».
- Программы. Над списком — «Создать программу» и «Принять программу» из папки (Сборка, установка и обслуживание, 5.6). У выбранной программы панель выбранного: «Сведения» — идентификатор, на каких панелях она стоит, предлагает ли её колонка графа; «Открыть» — её лицо (6.6), «Открыть в мастерской» — окно графа с ней, «Передать программу» — в папку, «Удалить программу» — после вопроса, который называет, что уйдёт вместе с ней; «Где видна» — отметка «На панели «…»» для каждой панели и «В колонке графа — чтобы собирать из неё другие программы»; «Нейросети» — какие нейросети берут модули программы по умолчанию, по строке на нейросеть с модулями, которые её берут, есть ли она в папке нейросетей и, если её нет, а модуль назвал, откуда её взять, — «Скачать» (5.6, «Источники»). «Сайт» — что ogas.space говорит о программе: её версия на витрине, отзывы с ответом автора, известные и решённые ошибки со словом автора; «Оставить отзыв» — у программы, которая есть на витрине: работает ли, слова, инкогнито, а версию, платформу и видеокарту окно ставит само; «Сообщить об ошибке» — что делали, что ждали, что вышло, кусок журнала; «Предложить на витрину» — название, описание, номер обращения, если это ответ на него; у автора вещи — «Ответить под отзывом», «Слово к ошибке» и «Решена в нынешней версии». Всё уходит посылкой профиля (5.10); без профиля вкладка ведёт в окно «Профиль».
- Модули. Над списком — имя нового модуля, «Создать модуль» и «Принять модуль»: папку модуля, которую прислали, кладут в папку данных и называют её путь; окно сначала показывает, что модуль принесёт, — название его словами, версию, файлы и размер, что он скачает при подготовке окружения, есть ли он здесь, — и ничего не пишет; принимают только модуль, которого здесь нет, и, как создание, после вопроса о доверии; отпечаток копии сверяется с показанным (
module.inspect,module.import, Методы модулей). У выбранного модуля: «Сведения» — описание, идентификатор, версия, «Передать модуль» — его папка вexports/modules/<id>папки данных — и «Удалить модуль» после вопроса — модуль, который держит программа, не удаляется, и строка состояния называет программы; «Где виден» — «В колонке графа». Создание модуля и установка окружения программы — код без песочницы, поэтому до первого такого действия в сеансе мастерская спрашивает о доверии, из какого бы окна его ни просили (Защита, 3.1). «Сайт» — то же, что у программы. - Панель программ — категория, которую человек делает сам: её название, место среди панелей («Панель выше», «Панель ниже»), программы на ней в своём порядке и «Удалить панель». Программу ставят на панель знаком «+», двигают знаками «выше» и «ниже», снимают крестом. Одна программа может стоять на нескольких панелях. Снятая с панели программа и удалённая панель программ не удаляют: программы остаются в библиотеке.
- Ничего не ставится само. Новая и принятая программа стоит только в библиотеке, пока человек не поставит её на панель. До первой правки есть одна пустая панель, названная словом своего раздела, «Программы»; её, как любую, переименовывают и удаляют.
- Колонка графа предлагает программы — вставить граф и вызвать (Программа: граф и запуски, раздел 18) — и модули, кроме тех, что человек скрыл в библиотеке. Программы и модули предлагаются, пока их не скрыли: из готовых программ собирают новую. Скрытое остаётся установленным: узел, который уже стоит в графе, работает, а вызов, который уже называет программу, её сохраняет.
- Хранит библиотеку функция
uiвconfig/library.json, рядом с раскладкой (Форматы файлов, 7.3); записывается она целиком после каждой правки. Удалённая из мастерской программа или модуль уходят из неё сами; программа, папку которой убрали руками, на панели не показывается. - Нейросети и другие большие данные, которыми пользуются модули разных программ, лежат в библиотеке одним экземпляром, без копий у каждого модуля, в папке нейросетей — по подпапке на каждый вид (Модули, раздел 11). Над их списком — папка нейросетей так, как её видит Windows, — туда кладут файл или папку нейросети или ссылку на них, — поле «Папка нейросетей», где называют другую папку, откуда их брать (настройка
modules.models_dir), и «Посмотреть папку снова». Ниже — виды, у каждого модули, которые его берут, и нейросети вида с размером и модулями, которые берут её, когда узел не выбрал другую; в панели нейросети — вид, размер, лежит ли она файлом, папкой или ссылкой, и «Удалить нейросеть» после вопроса: нейросеть, которую модуль берёт по умолчанию, не удаляется, и строка состояния называет модули. В сведениях модуля — виды нейросетей, которые он берёт, с нейросетью по умолчанию. - Заготовки интерфейса — вместилища графа интерфейса со всем, что в них лежит, сохранённые, чтобы ставить их в другие программы (6.8). Здесь их видно — название, сколько вместилищ и графических узлов — и удаляют после вопроса; делают и ставят их в графе интерфейса.
- Набор собранных узлов — это библиотека. Собранный узел — программа библиотеки, и колонка графа предлагает поставить его двумя способами с явным выбором: вставкой — своей копией, которую правят, не задевая других, — или вызовом по ссылке, и тогда правка программы доходит до всех мест, где её вызывают (Программа: граф и запуски, раздел 18). Закрытых собранных узлов нет: любой открывают и видят его граф. Своей версии у собранного узла нет. Другому человеку его передают папкой программы, как любую программу.
- Вид (во всех разделах). Над списком любого раздела — «Плитка» и «Таблица»; раздел помнит свой вид (
viewsбиблиотеки, Форматы файлов, 7.3), с начала — плитка. Плитка — превью и главное о вещи, таблица — столбцы, и щелчок по названию столбца сортирует по нему, второй — в обратном порядке. Что показано: - программа — превью: очертание её графа, узлы и связи; описание; сколько узлов и модулей; сколько весит сама и отдельно её окружение Python; когда менялась; сколько прошлых запусков хранит; на каких панелях стоит (
process.summary, Методы графа); - модуль — название и идентификатор, версия, сколько весит и сколько в нём файлов, какие нейросети берёт, как живёт: на шаг, на запуск или службой; модуль с испорченным манифестом помечен;
- нейросеть — имя, вид, сколько весит, лежит файлом, папкой или ссылкой, какие модули её берут, когда менялась;
- заготовка интерфейса — сколько в ней вместилищ и элементов;
- найденное в источнике — картинка, если источник её даёт (Civitai — первая картинка без пометки «для взрослых», витрина — поле
preview), название, автор, вид, сколько скачивали и отметили, лицензия, когда обновлялось, сколько весит, если источник говорит. Картинку окну приносит функция источников (Защита, 3.14): само окно в сеть не ходит. - Отбор и железо:
- «Найти здесь» отбирает вещи раздела по названию, описанию и сведениям, без различия заглавных и строчных;
- «Порядок» — по какому сведению стоят плитки и строки, как щелчок по столбцу таблицы; стрелка рядом его переворачивает;
- «Группами» — программы по панелям (программа на двух панелях стоит под обеими, ни на одной — последней), модули по тому, как живут, нейросети по видам с модулями, которые их берут, найденное в источнике — по задаче или типу. «Группами» и вид раздел помнит; нейросети показаны группами, пока человек не скажет иначе;
- над вещами — что есть у компьютера: видеокарта, её память и сколько свободно, память, ядра, место на диске нейросетей (
module.hardware, Методы модулей); - сведение «Видеопамять» на вещи: модулю — из его манифеста, программе — самого требовательного из её модулей, нейросети — её вес с запасом в пятую часть на работу, найденному в источнике — вес, который называет источник, а в панели — вес выбранных файлов модели (весов, частей, адаптеров, без настроек и описаний; из нескольких вариантов весов — самый тяжёлый, потому что загружается один); программе и модулю витрины — то, что говорит витрина;
- вещь, которой нужно больше видеопамяти, чем у самой большой видеокарты компьютера, помечена «не влезет в видеокарту»; выключатель «Только то, что запустится» прячет такие вещи и говорит, сколько спрятал. Вещь, о которой неизвестно, сколько ей нужно, не прячется; если видеокарту не нашли, выключатель недоступен.
- Источники — откуда программы, модули и нейросети скачивают по команде человека:
- Какие. Витрина O.G.A.S. — по умолчанию ogas.space — и другие витрины, которые назвал человек; Hugging Face; Civitai. Адрес каждого — настройка функции источников, так что вместо сайта можно назвать его зеркало (Настройки, раздел 8). В колонке слева под «Источниками» — каждый источник.
- Поиск. Над выдачей — строка поиска и «Найти»; рядом сказано, что запрос уходит на сайт источника. Пустой поиск показывает витрину целиком, а у Hugging Face и Civitai — самое скачиваемое. Строка выдачи — название, автор, сколько скачивали, вид.
- Отбор и порядок — как их называет источник (
sources.facets): у Hugging Face — задача (text-generation,text-to-image…) и библиотека (transformers,diffusers,gguf…), у Civitai — тип (Checkpoint,LORA,VAE…) и базовая модель (SD 1.5,SDXL 1.0,Flux.1 D…), у витрины — программа, модуль или нейросеть; порядок — самое скачиваемое, самое отмеченное, новое. Выбор фильтра или порядка ищет сразу; набранные слова уходят только по «Найти». - Панель выбранного — описание, лицензия, страница на сайте, сколько у вещи параметров и сколько ей нужно видеопамяти, если источник называет, и файлы с размерами. Файлы, которые при чтении исполняют код, помечены и сами не выбираются (Защита, 3.14).
- Файлы по ролям — веса, части модели по её папкам (
unet,vae,text_encoder…), адаптер, настройки, словарь, описание, картинки — с тем, чем один вариант весов отличается от другого: уровень квантования GGUF (Q4_K_M,Q8_0…), точность (fp16,fp32), урезанная или полная. Собственные файлы программы и модуля стоят под словом «Программа» или «Модуль»; вещь, у файлов которой одна роль, показана без заголовков. Витрина может назвать роль и вариант файла сама, а у программы и модуля — сколько им нужно видеопамяти (Форматы файлов, 17.1). - Версии и родня. У Civitai — версии модели, у каждой своя базовая модель и свои файлы; другая версия, выбранная в панели, читается заново, и скачивается та, что показана. У Hugging Face — от какой модели эта сделана (щелчок открывает её) и родственные: квантованные, дообученные, адаптеры, слияния — щелчок показывает их в выдаче с кнопкой «Искать по словам».
- Скачивание. Для нейросети человек выбирает вид — папку в папке нейросетей — и имя, под которым она встанет; вид заранее предложен по тому, как вещь называет источник, — задаче Hugging Face (
text-to-image) или типу Civitai (checkpoint,lora), — и его можно сменить; пока «Скачать» нажать нельзя, под кнопкой сказано, чего не хватает; «Скачать» показывает, сколько уйдёт на диск. Загрузки идут над выдачей с долей готовности и «Остановить». Кончившись, нейросеть встаёт в папку нейросетей, программа и модуль ждут «Принять программу» и «Принять модуль», заготовка интерфейса — «Принять заготовку» (без вопроса о доверии: кода в ней нет). Нейросеть, для которой источник требует вход, не скачивается, и строка состояния говорит почему: платформа ключей источников не хранит. - Проверенная витрина одна — ogas.space. Над выдачей другой витрины сказано, что её держат другие люди и никто не проверял. Программу или модуль оттуда платформа принимает только после вопроса о доверии — каждый раз, с адресом витрины, даже если в этом сеансе человек уже доверился модулям (Защита, 3.14).
5.7 Помощник
Помощник — окно, где человек даёт задачу словами, а подключённая сеть собирает программу или модуль инструментами платформы, проверяет и пробует их и говорит, что сделала (Методы служб платформы, раздел 6).
- Колонка — «Новая задача», «Сеть помощника» и задачи: у каждой знак её состояния — идёт, ответила, остановлена, упёрлась в предел, не вышла.
- Рабочее поле — разговор задачи: слова человека справа, ответы помощника слева, а между ними — что он делал, строками: ✓ — действие прошло, ✗ — отказано; наведённый указатель показывает, с чем действие звали и что оно ответило. Под разговором — поле для слов, «Отправить» (
Ctrl+Enter), пока задача идёт — «Стоп», у задачи, упёршейся в предел, — «Продолжить», переключатель доступа, «Попросить людей» и расход задачи: шагов и токенов. - Пометки платформы. Если сеть закончила ход, ничего не записав, платформа один раз напоминает ей об этом, и в разговоре стоит пометка. Если и после напоминания записано не было, под ответом сказано, что слова помощника о сделанном не подтверждены; если последняя попытка записать граф, пульт или файл модуля отказана, сказано, что не записалось.
- Доступ. «Только черновики» — помощник меняет лишь свои черновики и модули и ничего не включает. Расширенный доступ включают переключателем; перед этим окно предупреждает, что помощник сможет менять программы человека и включать их и что ответственность за его действия — на человеке.
- «Сеть помощника» открывает панель: выбор сети из готовых сетей OGAS SDK — выбранная ставится в папку модулей, — её настройки, поле ключа и, для локальной сети, нейросеть из папки нейросетей и программа, в чьём окружении Python она идёт. Ключ уходит в
.envмодуля сети и в окне не остаётся; поле говорит только, вписан ли он. - «Попросить людей» открывает окно «Профиль» на новом обращении с задачей, вписанной в него: обращение уходит из платформы, подписанное профилем (5.10). Окно открывает в браузере только страницы ogas.space — документацию из «Справки».
5.8 Вход для программ
В настройках, в разделе «Вход для программ», кроме самих настроек входа — открыт ли он, порт, сколько программ пускает, — стоят его состояние, ключ, скрытый до «Показать ключ», «Скопировать» и «Выпустить новый ключ» (Методы служб платформы, раздел 5). Новый ключ выгоняет все программы, вошедшие со старым.
5.9 Место, Windows и файлы
- Место на диске — в «Состоянии» окна настроек: сколько платформа занимает всего, предел, который ей дан (
core.disk_budget_gib), свободное на диске и сколько ещё можно занять, и ниже — по частям: программы, запуски, окружения Python, кэш, модули, нейросети, загрузки, журнал. Кэш Python и не принятые загрузки там же можно очистить: окно переспросит, недостающее скачается снова, когда понадобится. Остальное убирают там, где оно живёт: запуски — у программы, нейросети — в библиотеке, месяцы журнала — в журнале. Загрузка, установка окружения и запуск, которые не поместятся, не начинаются и говорят почему; сама платформа ничего не удаляет. - Ресурсы для модулей — в настройках модулей: сколько модулей выполняют шаг одновременно, сколько памяти и ядер процессора они занимают вместе. Модуль, вышедший за память, останавливается, и шаг говорит почему.
- Память и процессоры WSL — тоже в «Состоянии», ниже места. Это файл
.wslconfigWindows, общий для всех дистрибутивов Linux на компьютере; окно говорит это до записи, а действует запись, когда WSL запустится заново. - Файл из Windows программа получает двумя способами: нажатием поля для файла — откроется системное окно выбора, с папки настройки «Папка для выбора файла», сначала с файлами нужного вида, — или перетаскиванием файла из Проводника на это поле. Файл копирует Linux целиком, один раз; содержимое через окно не идёт. Отпущенный не туда файл не теряется молча: окно говорит, куда его отпустить. Папку в настройке, где она нужна (папка нейросетей), выбирают тем же окном — «Выбрать…».
- Сон — пока идёт запуск хоть одной программы, Windows не уходит в сон (настройка «Не засыпать во время запуска»): сон остановил бы WSL и запуск вместе с ним.
- Ярлыки — «Сделать ярлык» у программы в библиотеке кладёт на рабочий стол ярлык, который запускает платформу, включает программу и открывает её лицо; настройка «Запускать при входе в Windows» кладёт ярлык платформы в автозагрузку Windows и убирает его, когда её выключают. Ярлык запускает не
wsl.exe, а запускательogas-start.exe— программу Windows без окна, которая передаёт свои словаwsl.exeбез консоли и завершается: окно консоли не стоит на экране, пока платформа работает. Запускатель едет рядом с программой окна, и она кладёт его в%LOCALAPPDATA%\OGASна диске Windows; не вышло — ярлык запускаетwsl.exeсо свёрнутой консолью.
5.10 Профиль
Профиль — окно в баре «Платформа»: профиль человека на ogas.space, его отправки и доска обращений (Методы служб платформы, раздел 7; что от чего защищает — Защита, раздел 8). Всё, что человек делает на сайте, — отзыв, обращение, «Беру», сообщение об ошибке, — уходит отсюда и из библиотеки, подписанное профилем; регистрации на сайте нет.
- Первое окно. Платформа без профиля открывает это окно при запуске, пока человек не скажет «Позже» (настройка
profile.ask_at_start). Без профиля платформа работает; профиль нужен, только чтобы отправлять на сайт. - «Профиль» в колонке. Без профиля — карточка (имя, о себе, ссылки на свои места в других сетях, показывать ли страницу), «Создать профиль», «У меня уже есть профиль» и «Позже». Созданный профиль один раз показывает код восстановления крупно, с предупреждением переписать его на бумагу, «Сохранить файлом…» — в папку, выбранную окном Windows, с паролем по желанию — и «Я записал код», после которого код не показывается никогда. «У меня уже есть профиль» входит кодом или файлом ключа. С профилем — номер на сайте, начало ключа этого компьютера, карточка и «Сохранить карточку», «Отозвать все компьютеры, кроме этого», «Удалить профиль» — все три только главным ключом: кодом или файлом ключа с паролем, — и «Выйти на этом компьютере». Опасное нажимают дважды: первое нажатие меняет надпись на «Нажмите ещё раз».
- «Отправки» — «Проверить» и что стало с каждой отправкой: ждёт взгляда автора сайта, на сайте, принято, отклонено, отвечено; неотправленное — с причиной и «Отправить ещё раз»; пока посылка идёт — «считается задачка…», «уходит…». Ниже — письма: ответ на сообщение об ошибке, ошибка в своей вещи целиком, новый отзыв о своей вещи.
- «Сообщить об ошибке» — ошибка самой платформы: что делали, что ждали, что вышло, вывод
doctor, кусок журнала; версия уходит сама. Сообщение читает только автор сайта, ответ приходит письмом в «Отправки». - «Обращения» — доска обращений сайта, «Оставить обращение» (что программа делает, что на входе и выходе, нейросеть, видеокарта, пример, инкогнито) и «Беру» у каждого обращения.
- Новые письма и сменившиеся состояния, найденные взглядом на сайт при запуске, мастерская говорит в строке состояния.
6 Пульт
6.1 Назначение пульта
Пульт является полноценным графическим интерфейсом рабочего процесса. Человек собирает пульт сам, без написания кода: берёт в интерфейс то, что программа отдаёт (6.4), показывает это элементами на графе интерфейса (6.8), раскладывает элементы по разделам и листам (6.3) и задаёт им вид (6.5). Собирают его на шаге «Вид» окна графа, а пользуются во всё окно — на лице программы (6.6).
Неизменные свойства пульта:
- элемент пульта связан со сквозным объектом графа по
object_id: событием, переменной, состоянием запуска, вопросом или включением программы; смысл объекта — у графа (Программа: граф и запуски, раздел 16); - пульт ничего не вычисляет: действие элемента — событие или команда хозяину объекта, элемент ввода записывает переменную, элемент показа показывает переменную или состояние;
- документ пульта —
workspace.jsonпроцесса, хозяин — функцияcanvas; - раскладка окон мастерской в документ пульта не входит;
- пульт на шаге «Вид» и на лице программы рисует один и тот же код, и от каркаса мастерской этот код не зависит: собранное в мастерской выглядит на лице программы так же.
Пульта на другом компьютере и нескольких пультов одного процесса нет.
Строение пульта собирают графом интерфейса (6.8).
6.2 Элементы пульта
Набор элементов закрыт и пополняется платформой. Модуль собственных элементов не приносит: элемент интерфейса модуля означал бы внешний код в окне, а следовательно, песочницу, версии и постороннее оформление.
Закрыто поведение элемента: что он показывает, что принимает и какую команду отправляет. Вид элемента заменяем (6.5): вид — рисунки и числа, а не код, поэтому причина, по которой набор закрыт, вида не касается.
Элемент — это не узел. Элемент прикрепляется к сквозному объекту узла, процесса или группы и сочетается с другими: у одного модульного узла могут быть поля для его параметров, кнопка запуска и полоса с результатом.
Элементы делятся на четыре рода (таблица 2).
Таблица 2 — Роды элементов пульта
| Род | Назначение | Элементы первого набора | К чему прикрепляют |
|---|---|---|---|
| элемент показа | показывает значение или состояние | значение, полоса, индикатор | переменная; у индикатора — состояние запуска события |
| элемент ввода | человек задаёт значение | поле, число, выключатель, выбор, вопрос | переменная; у выключателя — также включение программы; у вопроса — вопрос человеку |
| элемент действия | нажатие отправляет команду хозяину объекта | кнопка | событие, его остановка или повтор; вместилище этого же пульта — открыть его или вернуть его поля как было |
| украшение | ничего не показывает и не принимает: оформляет лист | надпись, рамка, рисунок | ни к чему |
Род элемента и вид объекта должны подходить друг другу: элемент показа не прикрепляют к запуску, элемент действия — к переменной. Недопустимое сочетание мастерская показывает до сохранения. Элемент, объект которого удалён из графа или перестал ему подходить — например, у переменной изменили тип, — с пульта не пропадает: он остаётся на своём месте и помечается.
Элемент прикрепляется к одному объекту или к нескольким — столько, сколько называет его описание:
- кнопка события несёт с собой значения переменных, которые назвал человек: они уходят данными события, каждое под своим именем поля (Программа: граф и запуски, раздел 5). Значение берётся в момент нажатия и идёт с пакетом, поэтому запуски, вставшие в очередь, получают каждый своё;
- переменная, которую берут параметры нескольких узлов, даёт одному элементу ввода управлять ими всеми. Своего способа разветвления у пульта нет: разветвляет переменная.
Программа с настройками собирается из тех же элементов; для неё у элементов есть две вещи:
- подсказка. У каждого элемента, кроме украшения, может быть подсказка человека: что он задаёт и куда его крутить — «Больше шагов — чище картинка, но дольше». Окно показывает её при наведении и говорит экранному чтецу; правят её строкой «Подсказка» в панели элемента, рядом с подписью;
- «Вернуть как было». Кнопка, привязанная к вместилищу пульта (
resets), возвращает к начальному значению каждую переменную, которую пишут элементы ввода в нём на любой глубине: группу настроек, вкладку, окно. Начальные значения знает граф, и возврат — такая же запись человека, как набор в поле: событие изменения переменной его слышит (Программа: граф и запуски, раздел 5). Узлов «Запись» на каждую настройку для этого не нужно.
Вторая кнопка с тем же смыслом не допускается: документ, где в одном разделе стоят два элемента одного вида с одними и теми же объектами, функция пульта отклоняет. Один объект в разных разделах или в элементах разного вида допустим: кнопка остановки на каждом разделе, переменная — полем в настройках и значением на основном листе. Украшений правило не касается: у украшения нет объекта, и на листе их столько, сколько нужно.
Набор с единым оформлением по умолчанию пополняется от рабочего минимума: элемент добавляют, когда собранной программе его не хватает. Перечень элементов принадлежит функции canvas: окно его показывает, но своих элементов не добавляет. Каждый элемент — законченная часть в своей папке (Правила разработки, 2.10): описание, словарь и встроенные виды. Состав первого набора по видам, имена привязок и параметров — Форматы файлов, раздел 7. Разметку к картинке даёт вопрос с ответом «область», правку показанного текста — вопрос с ответом строкой, поле которого заполнено этим текстом (Программа: граф и запуски, раздел 9); разметка звука и запись с микрофона — работа модулей. Выбор нейросети, которую берёт узел, — тот же «Выбор», чьи варианты — нейросети одного вида из библиотеки, привязанный к переменной, из которой узел берёт параметр нейросети. Своего элемента для нейросети нет: элемент выбирает значение одинаково, откуда бы ни брались варианты.
6.3 Разделы и лист
Пульт состоит из разделов: «Основное», «Настройки» и любых других, которые завёл человек. Разделы — вкладки пульта. Элемент лежит в одном разделе.
У раздела свой лист — поле заданных ширины и высоты. У вкладок одного окна лист один: размер, заданный на одной вкладке, получают все вкладки окна, и не меньше, чем нужно тому, что стоит на любой из них. Размещение элементов на листе свободное: у элемента есть место и размер, человек помещает его куда хочет; при перетаскивании работает прилипание к сетке и к соседям. Элементы могут лежать один поверх другого — так рамка ложится под кнопки. Порядок элементов в документе — порядок, в котором они нарисованы, и порядок обхода клавишей Tab.
Лист растёт вместе с окном. Нарисованный размер листа — наименьший. Окно меньше него показывает лист целиком и уменьшенным, с тем же расположением элементов; мельче установленного предела лист не уменьшается — тогда поле прокручивается. Окно больше него лист заполняет целиком, подложка — тоже, и полос по бокам нет: элементы своего размера не меняют, а держатся края. По ширине элемент стоит слева, справа, по середине или тянется, по высоте — сверху, снизу, по середине или тянется: так он остаётся на месте относительно своего края, а растянутый занимает прибавку окна. Что элемент делает, задаёт строка «Когда окно больше» в его панели; без неё — его вид: поле, таблица, просмотр и строки тянутся по ширине, кнопка держится своей стороны листа — той половины, в которой стоит, — а таблица и просмотр, ниже которых на странице ничего нет, тянутся и по высоте; остальное держится левого верхнего угла. Рамка группы растёт вместе с тем, что в ней лежит. Причина выбора: экраны бывают разного размера, и готовую программу разворачивают во весь экран, а человеку важно, чтобы элемент стоял там, куда поставлен, — поэтому раскладка не перестраивается, а растягивается по правилам, которые видны и задаются в панели.
Проверка размеров. На шаге «Вид» лист расставляют в нарисованном размере. Знаки в баре над листом показывают его в окне другого размера — «Как нарисовано», «Узкое окно», «Широкое окно», «Весь экран»: в таком окне лист растёт, как на лице программы, а расставлять в нём нельзя; окно больше рабочей области показано целиком, уменьшенным.
Пульт работает без расстановки. Элемент, поставленный на пульт без раздела, попадает в раздел, открытый на шаге «Вид», а поставленный с графа — в первый раздел. Место и размер даёт функция пульта, а не окно. Расстановка и оформление выполняются над уже работающим пультом и условием его работы не являются.
Расстановка всегда свободная. У каждой страницы — вкладки окна или окна без вкладок — лист есть всегда, и всё, что на ней лежит на любой глубине, стоит на этом листе своим местом и размером; кнопки «дать лист» нет. Первое место — то, куда страница положила бы вещь сама (6.8): функция пульта даёт его, когда вещь поставлена без места. Поставленное в страницу, где уже что-то стоит, ложится под то, что стоит; на шаге листа.
Не размещённое. У элемента и у рамки на листе три состояния: на листе, не размещён и удалён. Не размещённый элемент есть в графе интерфейса со всеми привязками и видом, но места на листе у него нет: он лежит в колонке шага «Вид», в разделе «Не размещено», и оттуда его кладут на лист нажатием — на прежнее место, если оно ещё на листе, иначе туда, куда страница положила бы его сама. «Убрать из раскладки» в панели элемента и графического узла снимает его с листа; рамку снимают так же — в панели её вместилища на графе интерфейса, со всем, что в ней лежит. Новый графический узел, поставленный на графе интерфейса, сначала не размещён: функция пульта сама места ему не даёт. На лице программы не размещённого не видно, но его привязки работают: переменная пишется, вместилище показывается и прячется по своей. Кнопку события, элемент ввода и вопрос человеку нужно видеть, чтобы ими пользоваться: такой не размещённый элемент колонка помечает знаком предупреждения и говорит, что человек не сможет им пользоваться. «Удалить элемент» убирает его из программы.
Группа на листе — рамка вокруг того, что в ней лежит: рамку считает функция пульта — поля вокруг и голова с названием сверху, у вместилища вкладок голова — его переключатель; своих места и размера у рамки нет, кроме пустой группы, которая стоит, где её поставили. Поэтому то, что лежит в группе, всегда внутри неё: рамка растёт за своим. Поставленное в группу ложится под то, что в ней стоит, и то, что стоит под рамкой, опускается на столько, насколько рамка выросла. Вкладки вместилища вкладок внутри страницы лежат одна над другой в его рамке; видна открытая. Переключатель в голове рамки — одна строка: названия вкладок написаны буквами листа, как элементы, и растут и уменьшаются вместе с листом; что не поместилось, укорачивается многоточием, а не ложится на то, что держит рамка.
Расставляют элементы на шаге «Вид» (5.4): лист там правится всегда, переключателя «Расставить» нет, а пользуются пультом на лице программы (6.6):
- перенос — выбранный элемент несут указателем; нажатие выбирает элемент сразу, нажатие без движения ничего не меняет. Пока элемент в руке, он нарисован там, где его держат, поверх остальных, и называет своё место и размер; в документ пульта он попадает, когда его отпустили, одним шагом истории;
- размер — у выбранного элемента восемь ручек: по углам и по серединам сторон. Тянут сторону или угол; противоположная сторона остаётся на месте. Меньше наименьшего размера своего вида элемент не становится;
- прилипание — угол элемента встаёт на шаг листа; край, который подошёл к краю другого элемента, к краю листа или к отступу от края ближе половины шага, встаёт на эту черту, и черта показана линией через лист. Так два элемента встают вплотную или вровень, даже если сосед стоит мимо шага. С клавишей
Altне помогает ничто: элемент идёт за указателем по единице листа. Приём тот же, что у окон на хосте (раздел 5); - клавиши — стрелки сдвигают выбранный элемент на следующую черту шага, с
Alt— на единицу листа; - числа — место и размер элемента стоят строками в его панели, ширина и высота листа — в панели раздела: то, что рука делает приблизительно, там задают точно. Число, с которым элемент не помещается на листе или меньше своего наименьшего размера, в пульт не попадает: строка остаётся как набрана, окно называет причину. Лист не делают меньше того, что на нём стоит;
- несколько элементов выбирают нажатием с
CtrlилиShift— оно отмечает ещё один или отпускает отмеченный — и рамкой: перенос с той же клавишей по пустому месту листа растягивает её, и отпущенная рамка добавляет к выбранным элементы страницы, которые лежат в ней целиком. Нажатие на один из выбранных несёт их все: каждый уходит на столько же, и ни один — за край листа; стрелки сдвигают их так же,Deleteубирает все. Панель показывает элемент, выбранный первым, и над его строками — часть «Выбрано» с числом выбранных и шестью действиями выравнивания: левые, правые, верхние или нижние края — по крайнему из выбранных, середины по ширине или по высоте — по середине всех вместе. Каждое из этих действий — один шаг истории; ручек у нескольких выбранных нет: их несут, а не тянут; - за край листа элемент не выносится ни рукой, ни клавишей;
- рамка — рамку группы несут, нажав на неё: вместе с ней едет всё, что в ней лежит на любой глубине, пока рука держит — на глазах, а отпущенное встаёт одним шагом истории. Прилипает рамка, как элемент: к шагу и к краям того, чего она не держит. Своего размера у рамки нет: её растягивает то, что в ней.
Шаг помогает руке, а не обязателен: место, заданное числом или с клавишей Alt, функция пульта на шаг не переводит. Порядок элементов рукой на листе не меняется — его меняют в панели, «Раньше» и «Позже»: элемент, поставленный позже, лежит поверх.
Числа листа — настройки функции пульта (Настройки, раздел 8): размер нового листа, шаг, отступ от края и промежуток, с которыми функция сама даёт место, и предел уменьшения листа на экране. Окно получает шаг, отступ и предел от функции пульта вместе с поверхностью и своих чисел не держит. Наименьший размер и размер по умолчанию называет описание каждого элемента. У процесса могут быть свои числа — на уровне настроек процесса; они передаются вместе с ним.
Формат документа — Форматы файлов, раздел 7.
6.4 В интерфейс: отражения
Что программа отдаёт интерфейсу, выбирает человек: узел целиком — его событие с остановкой, повтором и состоянием, вопрос, «Показать», ход шага, — вход, выход, параметр, переменную, собранный узел — его лицом. Уходит только выбранное: у модуля с кучей входов и выходов в интерфейс уходит то одно, что нужно. Взятое целиком — узел, лицо собранного узла — вбирает отражения своих строк, взятых по одной, и те, что завела функция пульта (6.8): отражение у вещи одно, и у строки тоже.
Действие стоит в панели выбранного, во вкладке «Правка», в части «В интерфейс»: у узла — строка на каждое, что можно взять, у переменной — она сама, у собранного узла — его лицо. «В интерфейс» ставит на граф интерфейса отражение (6.8) — узел, строки которого — эти объекты. Взятое строка называет «В интерфейсе» и говорит, сколько графических узлов его показывают; она предлагает виды элементов, которыми его показать или задать, — нажатый ставит такой элемент, связанный с отражением и не размещённый на листе (6.3), — и «Показать в интерфейсе». Брать можно и со стороны интерфейса: колонка графа интерфейса предлагает «Что есть в программе», и там же — включение программы, которого нет ни у одного узла (6.8).
Отражение — не узел рабочего графа. В документ графа оно не входит, рёбер у него нет, и запуск о нём не знает: это часть документа пульта, которая называет объекты графа. Причины:
- ребро графа несёт пакеты; связь интерфейса, нарисованная на рабочем графе такой же линией, значила бы другое и путала бы оба;
- вставка процесса, вызов процесса узлом и превращение группы в процесс работают с графом, а об интерфейсе не знают (Программа: граф и запуски, разделы 16–18);
- пульт находит объект по
object_id, идёт за его переименованием и помечает пропавший объект (6.2) — ссылке этого достаточно.
«В интерфейс» делает с графом то, что человек сделал бы руками (Программа: граф и запуски, раздел 16):
- событие, вопрос, «Показать», вход, выход, переменная — объект уже есть: отражение называет его;
- параметр узла — заводится переменная с типом и значением параметра, параметр берёт её (
{ "variable": … }), отражение называет переменную; - вход, к которому привязывают элемент ввода, — заводятся переменная с типом входа и её узел, холодная связь которого даёт вход; строка отражения становится этой переменной. На вход, к которому уже идут связи, элемент ввода не ставится.
Заведённые переменная и узел — обычная правка графа: она видна на холсте, отменяется вместе с прочими правками и у включённой программы недоступна. Параметр, уже взятый из переменной, свою переменную сохраняет: вторая не заводится.
На рабочем графе узел, что-то из которого в интерфейсе, носит знак на шапке, перед знаком своего вида, с подсказкой, сколько его отражений; переменная в колонке помечена. «Показать в графе» в панели отражения ведёт к оригиналу, «Показать в интерфейсе» в панели узла — к отражению. Удалённое отражение снимает привязки графических узлов к своим строкам; узел и переменные, заведённые для него, остаются в графе, пока их не уберёт человек.
Пульт на экране сверяется с графом на экране, а не с записанным: переменная, заведённая минуту назад, для пульта уже объект. Записывают оба документа — граф и пульт — каждый своим окном.
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). Окно просит этот размер, когда лицо программы показано или у него сменился лист; размер, который человек потом задал окну рукой, остаётся. При переходе в мастерскую окно встаёт на прежнее место и в прежний размер. Так готовой программой пользуются, не открывая мастерскую. Окно и экземпляр — те же: лицо программы — второе, что показывает окно платформы, а не отдельная программа.
- Вход. Ярлык программы запускает платформу, включает эту программу и открывает её лицо. Запуск ярлыком — действие человека, поэтому программа включается им (Программа: граф и запуски, раздел 2). Обычный запуск открывает мастерскую. Из мастерской лицо программы открывает щелчок по её значку на панели программ (раздел 4) или «Открыть» в библиотеке (5.6); при несохранённых правках он сначала спрашивает, как уход с процесса (раздел 5).
- Состав. Сверху одна строка: название программы, её слова — состояние и отказы, — кнопка «В мастерскую» и кнопки окна Windows; под строкой пульт. Окно не имеет рамки Windows, поэтому его кнопки лицо рисует само, теми же знаками, что каркас.
- Запуск. Ярлык вызывает глагол
programс именем процесса (С чего начать, 2.2). Лицо появляется сразу, раньше чтения процесса, и до чтения ничего не содержит: мастерская на экране не мелькает, а чужой пульт под именем программы не показывается. Если экземпляр уже работает, его окно выходит вперёд и показывает лицо этой программы; программа, лицо которой было на экране до того, остаётся включённой. Процесс, который не открылся, оставляет на экране то, что было, — мастерскую или лицо прежней программы — и отказ словами. - Переход в мастерскую. Кнопка на лице программы показывает мастерскую с этим процессом. Программа остаётся включённой: запуски идут, вопросы ждут ответа, модули остаются загруженными. Причины: в мастерской смотрят, где остановился идущий запуск, и собирают другой процесс, пока этот работает (С чего начать, 7); включённую программу мастерская не изменяет и без остановки (Программа: граф и запуски, раздел 2).
- Отказ включения. Если программа не включилась, лицо называет причину словами отказа и оставляет переход в мастерскую.
- Закрытие. Закрытие окна на лице программы действует как закрытие мастерской: подтверждение, затем остановка платформы (раздел 1). Вопрос называет программу, а не мастерскую: мастерской на экране нет.
- Пользование, а не правка. На лице программы элементы действуют; место, размер и вид им задают на шаге «Вид». Нажатие и ввод на лице ничего не выбирают, клавиши мастерской —
Esc,Delete,Ctrl+Z— на лице не действуют.
Как ядро передаёт имя программы запускаемому и работающему экземпляру — Устройство платформы, 3.6.3 и 5.3; методы функции ui — Методы мастерской и пульта, раздел 2.
6.7 Набор пульта
Что есть у пульта:
- документ пульта — вместилища и элементы (Форматы файлов, раздел 7);
- первый набор элементов: кнопка, выключатель, поле, число, выбор, вопрос, значение, полоса, индикатор — каждый в своей папке у функции
canvas, рисунок каждого — у страницы окна;make ciсверяет одно с другим; - разделы — вкладки пульта; у раздела лист: в окне меньше нарисованного он уменьшается целиком, в окне больше — растёт, и элементы держатся краёв или тянутся; место и размер новому элементу даёт функция пульта;
- расстановка на листе (6.3): элемент несут и тянут за ручки указателем, сдвигают стрелками, место, размер и размер листа задают числами в панели; прилипание к шагу листа, к соседям и к отступу; числа листа — настройки функции пульта;
- оформление (6.5): тема пульта и вид по умолчанию в настройках, подложка раздела — цвет и рисунок, украшения — надпись, рамка, рисунок, рисунки в папке процесса, которые уходят с процессом при передаче;
- виды элементов (6.5): шесть встроенных видов и свои виды процесса — рисунки по состояниям, растяжение по девяти частям, количество заполнением, лентой кадров или стрелкой; вид выбирают в панели элемента;
- шаг «Вид» окна графа: колонка слева — то, что лежит на открытой вкладке: сама вкладка, затем каждое её вместилище, которое сейчас видно, — у вместилища вкладок только открытая вкладка, на любой глубине, как на листе, — и в каждом то, что лежит прямо в нём; вкладка, открытая на листе, открывает и свой раздел колонки. Щелчок выбирает элемент на листе и открывает его панель. Ставят на пульт в графе интерфейса (6.8) и видами элементов в части «В интерфейс» панели рабочего узла (6.4); пустая вкладка говорит об этом; нажатие на листе выбирает элемент и открывает его панель, ничего не нажимая (5.1); над листом — бар, как у холста графа, со знаком «Оформление»; у элемента, которому нечем работать, панель предлагает «Привязать на графе» — окно переходит на граф интерфейса с его графическим узлом выбранным; у привязанного — «Показать на графе»: окно переходит на граф интерфейса к отражению, к которому он привязан, с его графическим узлом выбранным и связью подсвеченной; у кнопки события в панели задают, какие переменные она несёт и под какими именами полей;
- элемент, объект которого удалён из графа или перестал подходить, остаётся на месте, говорит причину и ничего не делает;
- действие «В интерфейс» у узла, у переменной и у собранного узла и значок отражённого на рабочем графе (6.4).
6.8 Граф интерфейса
Интерфейс программы собирают в два шага после рабочего графа: сначала граф интерфейса — что программа отдаёт интерфейсу и чем это показано: отражения того, что нужно, графические узлы и строение из них — окна, вкладки, группы, подгруппы, — потом место и внешний вид.
Граф интерфейса — отдельный граф на своём холсте. В рабочий граф он не входит, а ссылается на него: запуск о нём не знает, вставка и вызов процесса с ним не работают. Рабочий граф связан с ним только отражениями: то, что человек взял в интерфейс (6.4), стоит на графе интерфейса своим узлом.
Узлы графа интерфейса трёх родов:
- отражения — то, что рабочий граф отдаёт интерфейсу: узел целиком, вход, выход, параметр, переменная, лицо собранного узла. Отражение рисуется узлом, его строки — сквозные объекты графа, точка каждой строки — справа; строка окрашена по типу данных, а у включённой программы показывает, что сейчас держит. Отражение одной вещи одно; оригинал удалён — его строка помечена «нет в графе»;
- элементы — набор элементов пульта (6.2): кнопка, поле, выключатель, индикатор, полоса и другие, каждый узлом;
- узлы-вместилища — окно, вкладка, группа, подгруппа: то, во что элементы складывают. Это одна группа на разных уровнях, как в рабочем графе: уровень, «Обернуть», «Свернуть», «Развернуть», «Разобрать» — те же (Программа: граф и запуски, раздел 17). Окно, вкладку и группу различает только то, как вместилище показывает то, что в нём лежит: всё сразу или по одному, с переключателем. Окно — вместилище верхнего уровня, окна показываются по одному, и программа начинается с первого; вкладка — вместилище в том, что показывает своё по одному; группа и подгруппа — в том, что показывает всё сразу. У вместилища задают название — окна, ярлыка вкладки, заголовка группы, — то, как оно показывает своё, и привязки к переменным (ниже). На слое «Обернуть» кладёт элемент или вместилище в новую группу на его месте, а «Разобрать» оставляет то, что вместилище держало, там, где оно лежало, и кнопка, которая его открывала, открывает вместилище выше; окно не оборачивают и не разбирают — ему не во что лечь, а его содержимому не остаётся окна.
Окно здесь — экран внутри одного окна программы, а не отдельное окно Windows: окно у платформы одно. Первое окно — окно самой программы: рамки на графе у него нет, и то, что в нём лежит, стоит на холсте само по себе. Окно рисуется рамкой, только когда человек сделал второе.
Связи графа интерфейса четырёх родов:
- вложенность: подгруппа лежит в группе, группа — во вкладке, вкладка — в окне;
- привязка: линия от строки графического узла к строке отражения — кнопка к событию, поле к переменной, просмотр к выходу или узлу отображения (Программа: граф и запуски, раздел 24). Графический узел и отражение связаны общим объектом: элемент называет объект, отражение держит его строкой;
- от процесса к интерфейсу: вместилище привязано к переменной программы — к переменной да-нет, по которой оно показано или спрятано, и к текстовой, которая называет открытую в нём вкладку. Процесс открывает вкладку или прячет группу узлом «Запись» в эту переменную — так программа сама управляет своим интерфейсом, а запуск об интерфейсе не знает. Переключив вкладку рукой, человек пишет ту же переменную;
- переход внутри интерфейса: кнопка открывает вкладку или окно, не заходя в процесс, — привязкой к вместилищу этого же графа; так же, привязкой
resets, кнопка возвращает поля вместилища к начальным значениям (6.2).
Привязка записана в элементе и во вместилище, как у пульта: имя привязки и object_id сквозного объекта (Программа: граф и запуски, раздел 16); отражения записаны в документе пульта рядом с элементами (Форматы файлов, раздел 7). Объект, к которому привязан элемент и которого нет ни в одном отражении, функция пульта отражает сама — так пульт, собранный раньше или помощником, сразу виден со своими связями. У элемента столько привязок, сколько объектов он называет.
Пустой элемент — графический узел без вида: сначала его привязывают, потом выбирают, каким элементом ему быть. Он стоит первым в колонке графа интерфейса, а ещё его вытягивают связью от строки отражения в пустое место холста: там он встаёт уже привязанным. Привязанный, он предлагает в панели «Каким быть»: только виды, возможные для этого объекта и вида данных, подходящий первым — у выхода с текстом «Значение» и «Просмотр», у события «Кнопка», у входа без связей — ещё и элементы ввода его типа: такой элемент получает переменную с её узлом, холодная связь которого даёт вход, и строка отражения становится этой переменной. Пока вид не выбран, он записан с пометкой «вид не выбран», на лист не ложится и на лице не виден. Тот же список у готового элемента — «Сменить вид»: привязки, место и размер остаются там, где новый вид их принимает. Если связь элемента отпустили на строке, которую его вид не принимает, панель предлагает «Каким быть здесь»; на вход, к которому идут другие связи, элемент ввода не ставится — он спорил бы с графом, и мастерская так и говорит. Вместилищ это не касается: окно, вкладку и группу выбирают по строению.
Элементы — набор пульта. Каждый элемент набора с его привязками — графический узел: кнопка, выключатель, поле, число, выбор, вопрос, значение, полоса, индикатор; просмотр, который показывает то же, что узел «Показать», — текст, картинку, галерею, проигрыватель; выбор файла в переменную; таблица — список записей, например список чатов или лента писем, строками и столбцами: щелчок по строке пишет её ключ в переменную и может нажать событие, таблица показывает только записи, у которых поле равно значению переменной, — ленту открытого чата, — и ставит строки по полю; строки — список, который человек правит строками. Поле бывает многострочным и пишет по мере набора; на вопрос отвечают в том виде, в каком его задаёт узел вопроса, — картинкой и областью на картинке тоже (Форматы файлов, раздел 7; Программа: граф и запуски, раздел 9). Надпись и рисунок — украшения. Рамки в наборе нет: собрать элементы вместе — дело группы.
Связь графа интерфейса — не ребро рабочего графа: пакетов запуска она не несёт и рисуется по-своему.
Развилка остаётся в рабочем графе. Когда одно нажатие запускает несколько частей одного дела, от события уходит несколько связей, и ветки идут одновременно (Программа: граф и запуски, 10.2 и 12.2): так это работает от кнопки, таймера, сообщения и вызова. Своего разветвления у интерфейса нет (6.2). Иное дело — общий рубильник: одна кнопка, которая нажимает несколько событий, у каждого из которых свой запуск, своя остановка и своё состояние. Логики в нём нет — это несколько нажатий разом, — поэтому такая привязка в графе интерфейса допустима.
Где его собирают. Граф интерфейса — настоящий нодовый холст, свой: рабочего графа на нём нет, и линии интерфейса не идут через рабочие связи. Своего окна у него нет:
- открывает его знак «Граф интерфейса» в правом верхнем углу окна графа, а знак «Граф» рядом возвращает к рабочему графу (5.4); отдельного пункта в баре «Мастерская» и знака в баре инструментов у него нет;
- графический узел рисуется так же, как рабочий (5.3), той же рукой: ярлычок — у элемента только у выбранного — с действиями «Убрать», «Собрать в узел», «Открыть на пульте»; шапка с названием, видом и знаком семейства, своего цвета — настройка
ui.color.head_interface; под шапкой строка на каждую привязку его вида — «Что нажимает», «Что показывает», «Что несёт с собой» — с тем, к чему она прикреплена, и с точкой на левом краю. Связь тянут от точки строки и отпускают на строке отражения: кнопка берёт событие, полоса — ход шага узла модуля, просмотр, значение и таблица — то, что дал выход или пришло на вход, поле — переменную. Если строка не даёт того, что берёт привязка, это сказано, и ничего не меняется. Строку прикрепляют и отпускают и в панели узла; - отражение рисуется узлом с шапкой цвета данных: что отражено — «Генерация · шаги», «Чат · сообщение». Его ярлычок — «Удалить отражение», «Собрать в узел», «Показать в графе»; панель называет, что отражено, и у каждой строки — виды элементов, которыми её показать или задать: нажатый ставит такой элемент, связанный со строкой, не размещённым. Удалённое отражение снимает привязки графических узлов к своим строкам;
- у узла графа интерфейса своё место: его ставит и переносит рука, как рабочий узел. Сначала отражения окна программы стоят столбцом слева, графические узлы — столбцом правее. Вместилище — вкладка, группа, другое окно — узел, собранный из узлов, и рисуется как группа рабочего графа: развёрнутое — область вокруг того, что в нём лежит, с меткой вложения на ярлычке и действиями «Убрать», «Свернуть», «В библиотеку», «Разобрать», «Собрать в узел»; свёрнутое — один узел того же уровня, на котором названо, что в нём лежит, и к которому приходят связи лежащего внутри. Переносится вместилище со всем содержимым. Отражения тоже собирают в узел; узел, в котором лежат одни отражения, — порядок на графе, на листе его нет;
- узлы графа интерфейса держатся того же правила, что рабочие (5.1): ничто не лежит поверх чужого. Из двух, что легли друг на друга, уступает то, что рука сейчас не трогала; уступают вправо или вниз, вместилище — со всем, что в нём;
- связь идёт так же, как ребро рабочего графа: под прямым углом от точки строки отражения — сначала прямо вправо, потом куда нужно — к точке строки графического узла, в обход узлов; связи интерфейса светлее шапок, их стрелки — цвета линии. Стрелка показывает, куда идут данные: у отражения — от кнопки, элемента ввода, вопроса и выбранной строки таблицы, которые дают их графу; у графического узла — к тому, что показывает, к переменным, которые несёт кнопка, и к переменным вместилища. Связи друг на друга не ложатся: те, что идут одним коридором, идут рядом, каждая своей дорожкой на поле узла друг от друга, и расходятся, не пересекаясь. Пока связь тянут от графического узла, строки отражений, которые её примут, светятся. Связь интерфейса выбирают нажатием, как рабочую (5.3): панель говорит, чья она, какой строки и к чему ведёт, а «Убрать связь» и
Deleteснимают эту привязку — графический узел и отражение остаются, у строки, которая держит несколько объектов, уходит только этот; - колонка окна графа на этом шаге предлагает сначала графические узлы каждого вида, ещё не прикреплённые, — новый графический узел не размещён на листе (6.3), его кладут на лист на шаге «Вид»; затем «Что есть в программе» — узел за узлом то, что можно отразить, и отдельно включение программы и её переменные: нажатое отражается и встаёт посередине видимой части холста, отражённое помечено, и нажатие выбирает его отражение; затем заготовки и украшения, а за ними всё, что предлагает рабочему графу. Новый узел встаёт посередине видимой части холста, во вместилище, выбранное на холсте;
- узел, не прикреплённый к рабочему графу, записывается и помечен «не связан с графом»: его ставят раньше, чем тянут связь. На пульте он ничего не делает, пока его не свяжут;
- отмеченные с
CtrlилиShiftузлы одного вместилища — графические и отражения — собираются в один узел действием на ярлычке или инструментом «Собрать в узел» бара управления, тем же, что у рабочих узлов; показывают вместилище вкладками или всё сразу в его панели;Deleteубирает выбранный узел; - выбранный графический узел выделяет свои связи и отражения, к которым прикреплён; выбранное отражение — свои связи;
- граф интерфейса записывает та же кнопка «Сохранить», и при включённой программе тоже: пульт пишется всегда.
Заготовка интерфейса — вместилище со всем, что в нём лежит, сохранённое в библиотеке, чтобы поставить его в другую программу:
- сохраняет её действие «В библиотеку» на ярлычке выбранного вместилища и в его панели; несохранённая правка пульта сперва записывается — заготовка делается из пульта таким, каким его видно, а пульт, который хозяин не записал, заготовки не даёт. Называется заготовка названием вместилища;
- в заготовку входят вложенные вместилища, элементы, их подписи, параметры, встроенные виды и места на холсте. Связи с рабочим графом и привязки вместилищ к переменным не входят: они ведут в узлы своей программы, и в другой их тянут заново. Кнопка, открывающая вместилище самой заготовки, открывает его и после; своего вида процесса заготовка не уносит — его рисунки лежат в папке той программы;
- колонка графа, пока графические узлы показаны, предлагает «Заготовки из библиотеки»: заготовка встаёт во вместилище, выбранное на холсте, посередине видимой части, а графические узлы в ней держат свои места друг относительно друга. Вместилища и элементы получают новые имена этого пульта; поставленная заготовка — собственная часть программы, и ни удаление заготовки, ни её новая версия поставленное не меняют;
- в библиотеке заготовки — раздел «Заготовки интерфейса»: название, сколько в ней вместилищ и графических узлов, «Удалить заготовку» после вопроса (5.6).
Три шага и граница между ними:
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). Значение из закрытого набора (язык, схема, источник шрифта) выбирается из списка во вкладке «Правка» панели выбранного: набор расширяется без изменения вида строки.
- Палитры. Обе палитры (
dark,light) принадлежат функции настроек. Незаданный цвет берётся из схемыui.scheme. Выбор схемы не записывает цвета в файл, сброс убирает заданное значение. - Текст поверх заливки берёт из
inkиink_on_accentболее контрастный к фону. - Только токены. Окно на хосте не пишет цвет, размер или шрифт числом прямо в коде.
Единый вид оболочки. Оформление задаётся токенами ui.* (lib/look.js → CSS-переменные), общих классах style.css, лицах капсул faces.js и знаках lib/glyphs.js. Каркас (shell.js, windows.js) и окна на хосте (host/*) рисуют из одних токенов, классов, лиц и знаков (правило 2.9 Правила разработки).
- Подпись кнопки стоит в центре кнопки по горизонтали и вертикали.
- Текст ряда списка, поля значения и справки начинается с начала ряда.
- Значок — знак из
lib/glyphs.jsв центре своей плитки, а не буква и не рисунок одного окна. - Вкладка-капсула окна на хосте (название, кнопки, шеврон свёртки) одна для всех окон и принадлежит каркасу. Окно рисует только содержимое тела и называет свои кнопки.
- Бар — одна капсула в трёх состояниях; бар правой стороны — то же лицо зеркально. Набор подразделов бара — список, а не новая раскладка.
- Новый вид элемента оболочки появляется сначала как общий примитив или токен, а потом занимает место в окне. Рисунок только для одного окна не допускается.
- Знак
?у ряда — справка, а не значок вида узла.
Это оформление самой мастерской, а не пульта человека. Оформление пульта с токенами ui.* не смешивается.
7.1 Язык интерфейса
Мастерская использует общеупотребительный язык (правило 3.4 Правила разработки). Ниже изложено применение правила к словам мастерской.
- Подписи, подсказки и сообщения — обычными словами. «данные», а не «пакет»; «запуск», а не «прогон»; «круг цикла», а не «итерация»; «панель», «окно», «значок», а не «бар», «хост», «слот», «шеврон». Слова из разработки применяются в документации, а не в окне.
- Термин — только в подробностях и рядом со своим объяснением: «шаг мог уже выполниться, и повтор сделает его ещё раз (неидемпотентный шаг)».
- Подсказка говорит, что будет, а не как устроено внутри.
- Ошибка говорит, что случилось и что делать. У каждого кода ошибки, который может увидеть человек, есть текст
error.<код>в словарях на обоих языках; код и сообщение функции — в журнале и в подробностях. - Журнал говорит событие словами его хозяина. У каждого события есть текст
event.<тип>в словаре того, кто его рассылает; строка журнала — время, эти слова и о какой части или запуске речь, а имя события, его уровень и поля — в панели строки.make ciпроверяет, что у каждого объявленного события текст есть. - Часть платформы называется своим именем, а не id. Каждая функция называет себя словами в своём словаре — текст
<id>.nameна обоих языках; этим именем часть называют шапка мастерской, раздел «Состояние» и строка журнала, а id остаётся в подробностях. Часть без имени называется по id.make ciпроверяет, что имя у каждой функции есть. - Имена значений, которые приходят из данных (поле
text, операцияequals), остаются как есть: их человек видит в своих данных. Рядом с ними даётся пояснение.
8 Распределение отрисовки интерфейса
Функции не описывают мастерской способ отрисовки интерфейса. Мастерская рисует свои окна сама, а функции предоставляют ей данные своими запросами: process.open и process.snapshot — граф и запуск, canvas.get и canvas.snapshot — пульт, settings.schema — настройки, module.list — модули, observe.* — журнал и проблемы.
Обоснование:
- мастерская является единственным потребителем данных функций для показа и входит в ту же поставку; отдельное описание интерфейса означало бы два описания одного и того же;
- интерфейса от посторонних авторов нет, а описания нужны именно для такого интерфейса;
- вид оболочки в любом случае принадлежит мастерской: токены
ui.*, общие классы и лица капсул (раздел 7).
При этом сохраняются:
- Снимок пульта.
canvas.snapshotотдаёт окну разделы, элементы с их местами и отметками и то, чем каждый объект процесса ставится на пульт, сrevisionдокумента; после каждой правки окно спрашивает у хозяина то же о пульте на экране (canvas.preview). Это данные для отрисовки, а не описание интерфейса: своих правил о пульте окно не держит. - Имена поверхностей при знакомстве. Функция объявляет
surfaces(graph.editor,canvas.editor) — это только имена для диагностики, ядро их не разбирает. - Недоступность. Окно называет в своём описании части платформы, которые оно показывает (
needs). Если такой части нет в платформе или она не работает, окно пишет над рабочим полем, какой части нет, или почему она не работает — словами кода ядра и с названием недостающей зависимости, — и показывает последние полученные данные (С чего начать, 8). Полоса сверху перечисляет остановившиеся части. Без словарей окно открывается и говорит своими словами, что надписи показаны ключами: функцияuiназываетi18nнеобязательной. - Обрыв связи. Знакомство после обрыва не повторяется — токен запуска одноразовый; мастерская показывает «Нет связи с платформой» (
ui.status.disconnected).