Data Studio — поверхность авторинга
Data Studio — это одно окно для всего: просмотр, поиск, редактирование ячеек, авторинг строк/столбцов/вкладок, создание и удаление таблиц, и холст записи, показывающий, из чего состоит запись.
В основе всего этого лежит одно правило: таблица канонична. Studio пишет в источник (локальный файл / Google-таблицу), никогда в SO, и подтверждает каждое изменение автоматическим повторным импортом.
Tools ▸ SheetForge ▸ Data Studio открывает его — единственная точка входа авторинга в меню. Плагины ему не нужны: всё описанное ниже работает только со встроенными типами core, а плагин добавляет поверх формы и пространства ключей только для чтения (см. С плагинами и без них).
Окно авторинга только одно. Более старое окно Workbench — исходное окно на IMGUI — было удалено, и всё, что оно умело, теперь делает Studio. См. Что случилось с Workbench, если вы обновляетесь с прежней версии.
Что на экране
Верхняя панель
- Плашка активного источника называет провайдера. Она затемнена, когда нет активных настроек.
- ↓ Pull from source запускает импорт.
- ↑ Push to source несёт плашку, считающую ожидающие изменения.
- Кнопка Discard стоит рядом и отбрасывает все изменения, подготовленные в окне. Сначала она просит подтверждение с указанием количества, и она ложится единым шагом
Ctrl+Z, так что подготовленное вернётся, если вы отбросите по ошибке. Источник при этом никогда не затрагивается. - Значки
isolated/draft. - Счётчики ⛔/⚠. Клик по счётчику переходит к первой ошибке/предупреждению.
- Переполняющее меню ⋯, содержащее Выполнить экспорт, Отправить в Google Таблицу, Экспортировать переводы…, Импортировать переводы…, Проверка состояния, Открыть отчёт по локализации и Настройки темы…. Вне источника Google API строка отправки в Google остаётся видимой, но отключённой, с причиной, прикреплённой к метке; обе строки перевода ведут себя так же, когда в проекте нет ни одной таблицы локализации.
Боковая панель
- Наверху находится пункт All — сквозной поиск по всем таблицам, описан ниже.
- Затем каждая таблица со своим количеством строк, своей цветной точкой и меткой ● на любой таблице, несущей подготовленные изменения. Плашка верхней панели даёт общее число; а это говорит, из каких таблиц оно набралось.
- Таблицы сгруппированы в разделы по собственной метке группы
@styleтаблицы. Правый клик по таблице ▸ Group & color ✎, чтобы её задать; таблицы без метки остаются в разделе по умолчанию. - Под таблицами — группа READ-ONLY, перечисляющая реестры кода, зарегистрированные плагинами.
- Здесь же живут честные значки:
parse failedна вкладке, отсутствующей в предпросмотре,name clash, когда реестр кода претендует на имя настоящей таблицы, и уведомление о карантине, описанное ниже. - Каждый пункт правого клика, который в данный момент заблокирован, остаётся видимым с прикреплённой причиной.
Таблица
- Прилипающий четырёхстрочный заголовок: буква столбца исходной таблицы над сырыми ячейками
@name/@type/@desc. Столбец A несёт маркеры, поэтому данные начинаются с B. - Поле с настоящим номером строки таблицы, и плашка ссылок для каждой строки:
shared N, когда на эту строку указывают две или более записей,↩ 1, когда указывает ровно одна, ничего, когда ни одна. - Буква и номер строки — те же координаты, что печатает отчёт об ошибках, так что на «строку 5, столбец C» можно указать напрямую. Щелчок по ним выделяет столбец или строку для действий над несколькими целями и перетаскиваний — см. Выбор строк и столбцов ниже.
- Буква принадлежит месту, а не столбцу. Переместите столбец, и она покажет букву позиции, в которой он окажется после отражения. То же правило даёт добавленному, но ещё не отправленному столбцу букву, которую он вот-вот получит.
- Правка структуры живёт в меню правого клика. Заголовок столбца предлагает свойства, перемещение, вставку с любой стороны и удаление; поле номера строки предлагает переместить вверх, переместить вниз и удалить. Заблокированный пункт остаётся видимым с причиной.
- Заголовок столбца также предлагает Закрепить до этого столбца, которая удерживает этот столбец и всё, что левее него, вне горизонтальной прокрутки (см. ниже).
- Остальная часть меню столбца — ширина столбца, автоподбор, скрытие, фильтр, очистка данных столбца и пункты сортировки — описана ниже, в разделе Ширина столбца, скрытие и фильтры по столбцам. Ручка для изменения размера перетаскиванием находится у правого края каждой буквенной ячейки.
- Внутри ячейки-ссылки подсвечиваются только сломанные фрагменты списка.
Холст
- Открывается под таблицей, когда вы активируете строку.
- Запись, которую вы открыли, находится в середине: то, что она потребляет, приходит слева, то, что потребляет её, стоит справа. Сегментированный переключатель над холстом выбирает, как далеко в каждую сторону.
- Перетащите ручку, чтобы изменить размер,
Escзакрывает холст. - Каждая карточка узла показывает свои порты ссылок и свои обычные столбцы как редактируемые строки значений, так что холст — это второе место для редактирования, а не картинка (см. Редактирование на холсте ниже).
Инспектор узла
Внизу справа от холста. Он несёт:
- адрес ячейки узла (клик фокусирует эту ячейку в таблице);
- примечание «общая запись» / «этот ключ не существует» / «эта запись новая»;
- список Used by (клик по записи переходит к ней);
- встроенное действие Go to this sheet;
- Duplicate and split / Cancel new row, где они применимы.
Problems
Нижняя панель несёт ту же диагностику, что производит импорт, отрисованную тем же рендерером отчёта. Конвейер является источником истины; окно никогда не изобретает сообщение. Клик по строке фокусирует проблемную ячейку и открывает её холст.
Доменные панели
Правая панель с одним сегментом на каждую панель, зарегистрированную плагином, сворачиваемая, запоминающая, какая из них была открыта. Она отрисовывается, только когда плагин регистрирует панель, — при отсутствии зарегистрированных панелей нет и пустого блока, потому что пустой блок как бы заявляет, что чего-то не хватает.
Push modal
Diff перед записью: вкладка · ключ строки · поле · старое → новое для каждого подготовленного изменения, плюс примечание, когда некоторые правки изолированы. Раздел Addressables перечисляет каждую регистрацию ассета, которую сделает отражение (добавление · перемещение · создание группы — см. Редактирование ячейки). Cancel ничего не записывает.
Редактирование ячейки
- Виджет следует за
@type.@type, который он читает, — тот, что на экране, так что столбец, который вы добавили или изменили тип, но ещё не отправили, уже получает виджет этого типа.- Обязательный
bool— это переключатель; необязательныйboolоткрывает тот же пикер, что использует ячейка enum, поскольку у него три состояния. Enum<T>отображается как своё значение плюс ▾ и открывает то же окно пикера с поиском, что использует ячейка-ссылка. Нераспознанное значение остаётся вверху списка, а не переписывается молча. Там, где enum определён в таблице, пикер заканчивается пунктом «Add a new member…». Пустая необязательная ячейка показывает — или — (по умолчанию).- Столбец
RecordId@Tabполучает выпадающий список ссылок (ниже). - Столбец
AssetRef@Groupполучает пикер ассетов и принимает перетаскивание (ниже). - Столбцы
Color/AnimationCurve/Gradientполучают собственные поля цвета, кривой и градиента Unity (ниже). - Всё остальное — это канонический сырой текст: числа, строки, ключи,
List<>не-ссылок, wrapper'ы, пользовательские типы, потому что именно этот текст проходит round-trip через парсер.
- Обязательный
- У ячеек-ссылок всегда есть выпадающий список. Ячейка
RecordId@Tab— это текстовое поле плюс кнопка ▾; ввод ключа вручную по-прежнему работает. Кнопка присутствует, даже когда целевая таблица сейчас не предлагает кандидатов: это состояние обычно означает, что прямо сейчас что-то сломано, а это именно тот момент, когда вам нужен инструмент, и пикер об этом сообщает и предлагает создать запись вместо открытия пустого списка.- Ячейка
List<RecordId@Tab>получает+▾. Пикер остаётся открытым, и каждая строка — это чекбокс, так что отметить три записи можно за один визит. Отметка добавляет, снятие отметки удаляет этот элемент, и каждая отметка — это собственный шаг отмены. - Порядок элементов — это не то, на что отвечает выпадающий список. Меняйте порядок элементов на холсте, где у каждого элемента списка своя строка ▲▼.
- Скалярная ячейка заменяет своё значение и закрывается, а ключ, уже находящийся в ячейке, помечен, так что выбрать его дважды нельзя.
- Ячейка
- Необязательный столбец можно вернуть в пустое состояние. Там, где столбец объявляет
?или=default, пикеры — ссылок, enum и необязательного bool в равной мере — несут строку «оставить пустым», помеченную значением, к которому откатится ячейка. У обязательного столбца такой строки нет, поскольку там пустая ячейка — это ошибка. - Создайте недостающую запись прямо из ячейки. Если нужного вам ключа не существует, нажмите + Create a new … record в пикере: поле поиска превращается в поле ключа, предзаполненное общим префиксом таблицы. Введите имя, нажмите Enter, и строка будет создана и записана в эту ячейку одним шагом
Ctrl+Z.- Эта строка не предлагается, когда это не сработало бы. В пространство ключей, которым владеет код, добавить нельзя, и пикер сообщает об этом предложением. Источник только для чтения, выполняющийся конвейер или таблица из xlsx блокируют это тем же шлюзом, что использует холст.
- У ячеек ассетов есть пикер, и они принимают перетаскивание. Ячейка
AssetRef@Group— это текстовое поле плюс кнопка ⊙, в духе объектного поля Unity. Каким бы способом ни пришёл ассет, правила одни и те же.- ⊙ открывает пикер ассетов SheetForge: адреса, уже присутствующие в этой группе, — суженные до
<Type>столбца, если он задан, с вложенными ассетами, перечисленными после их родителя в видеparent[sub], — с поиском и отмеченным текущим значением. Строка ⊙ Обзор проекта… под списком открывает собственный пикер объектов Unity, отфильтрованный по этому типу. - Вы также можете перетащить ассеты из окна Project на ячейку: один ассет для скалярного столбца, любое количество для
List<>(добавляются по порядку; ключ, уже присутствующий в ячейке, пропускается). - Ассет, уже зарегистрированный в этой группе, сохраняет свой адрес. Ассет, который ещё не адресуем, подготавливается к регистрации: ячейка сразу получает его адрес — имя файла без расширения, — а запись группы, и сама группа, если её ещё не существует, создаются при отражении, после успешной записи таблицы. До этого момента в проекте ничего не меняется, а отмена подготовленного изменения не меняет вообще ничего.
- Ассет, зарегистрированный в другой группе, сначала спрашивает подтверждение — диалог называет обе группы и то, сколько других ячеек ссылается на него через старую, — а затем подготавливает перемещение.
- Отклоняется, со всплывающим уведомлением, объясняющим почему: объекты сцены, папки, несколько ассетов, перетащенных на скалярную ячейку, ассет, не удовлетворяющий типу столбца, и адрес, уже используемый другим ассетом в этой группе.
- Подготовленные регистрации отображаются в Push modal в разделе Addressables и учитываются в плашке верхней панели.
Ctrl+Zубирает значение ячейки и регистрацию вместе; повторный ввод ячейки так, что на адрес больше ничего не ссылается, снимает регистрацию тем же шагом, так что устаревшая регистрация никогда не выживает сама по себе. - Каждая ячейка ассета также несёт постоянную кнопку ↗ справа: нажмите её, и окно Project показывает и выделяет этот ассет — ячейка списка выделяет все ассеты, которые она содержит, и показывает первый, а адрес
parent[sub]показывает сам вложенный объект. Ctrl+клик (Cmd+клик на macOS) по ячейке делает то же самое, а обычный клик по-прежнему редактирует текст. Когда адрес не разрешается в ассет, кнопка остаётся видимой, но неактивной, с причиной в подсказке. - Правый клик по ячейке даёт Показать в проекте — это касается и ячеек списка тоже — а на необязательном столбце — Очистить (по умолчанию). Строки значений на холсте несут ту же кнопку показа, потому что это тот же виджет.
- Problems сообщает
UnknownAssetKeyиAssetTypeMismatchещё до отражения, а подготовленная регистрация не является ошибкой — проекция уже учитывает её. Без пакета Addressables кнопка ⊙ и перетаскивание отключены, с причиной в подсказке; ввод адреса вручную по-прежнему работает.
- ⊙ открывает пикер ассетов SheetForge: адреса, уже присутствующие в этой группе, — суженные до
- Ячейки ассетов показывают сам ассет. Когда адрес ячейки
AssetRefразрешается, рядом с текстом появляется небольшая миниатюра — для любого типа ассета, для которого редактор умеет рисовать превью, размером так, что высота строки никогда не меняется; ячейкаList<>показывает миниатюру своего первого элемента.- Щёлкните по миниатюре, и откроется плавающий увеличенный вид; на холсте записи ассеты-изображения отрисовываются крупно прямо на карточке.
- Адрес, который не разрешается, просто не показывает миниатюру — кнопка ↗ уже несёт причину.
- Ячейки
AssetRef<AudioClip>воспроизводят звук. Кнопка воспроизведения рядом с адресом клипа проигрывает его через собственный канал предпрослушивания редактора; повторное нажатие останавливает, как и переход дальше — смена ячейки, закрытие окна, доменный reload.- Когда сборка редактора не может предоставить возможность предпрослушивания, кнопка остаётся видимой, но неактивной, с причиной в подсказке. На ячейке, чей ассет не является аудиоклипом, кнопки просто нет.
- Ячейки цвета, кривой и градиента — это нативные поля. Скалярная ячейка
Color,AnimationCurveилиGradientи есть поле цвета, поле кривой или поле градиента Unity — вся ячейка целиком, никакого сырого текста.- Каждое изменение фиксирует канонический текст (см. Синтаксис таблиц). Серия изменений — перетаскивание в пикере цвета, сессия в редакторе кривой — объединяется в один шаг отмены, по тому же правилу, что и набор текста.
- На необязательном столбце пустая ячейка показывает —. Щёлкните по ней, чтобы открыть поле со значением по умолчанию для этого типа, и правый клик ▸ Очистить (по умолчанию), чтобы снова её очистить.
List<Color>,List<AnimationCurve>иList<Gradient>— это редакторы-плашки: одна плашка на элемент (образец цвета, миниатюра кривой, полоса градиента) и плашка+. Клик открывает всплывающее окно с нативным полем для каждого элемента, а также ▲▼ и ✕; добавление, удаление, изменение порядка и правка каждого элемента — это отдельный шаг отмены, потому что порядок списка — это данные. Списки других типов остаются каноническим текстом.- Строки значений на холсте используют ровно те же виджеты.
- Ограничьте столбец ассетов типом из формы столбца. В форме свойств столбца — а также в формах добавления столбца и создания таблицы — рядом с полем
@typeвсегда стоит кнопка Тип…; она активна, пока вводимая запись — этоAssetRef@Group, а в остальных случаях остаётся неактивной, с подсказкой, объясняющей причину. Она перечисляет типы ассетов, которые может загрузить проект (с поиском, короткое имя с полным именем в подзаголовке), и переписывает поле вAssetRef@Group<Type>, оставляяList<>,?и=defaultнетронутыми; Без ограничения (любой ассет) убирает<…>. Ввод ограничения вручную тоже работает. Подсказка в заголовке столбца показывает разрешённое полное имя типа. - То, что вы печатаете, — это то, что вы видите, немедленно. Текст таблицы — это baseline плюс ваши подготовленные изменения, так что он никогда не ждёт проверки. Зафиксированное значение показывает свой подготовленный цвет в момент фиксации — будь то значение, выбранное из выпадающего списка, визуальная правка значения или быстрый набор текста, даже пока ячейка ещё в фокусе. Более тяжёлый предпросмотр (Problems, счётчики, плашки, холст) пересчитывается один раз за серию редактирования, а не на каждое нажатие клавиши. Исключение — одноразовый жест на холсте, который перерисовывается на месте.
- Никакой встроенной проверки по мере набора — диагностика поступает только по одному каналу (валидатор предварительной проверки/импорта), показывается в Problems.
- + Row добавляет запись с предложенным id (определение общего префикса, безопасное от коллизий). Каждое подготовленное изменение — правки ячеек, правки ключей, добавления строк, отмена всего — это шаг Ctrl+Z / Ctrl+Y. Закрытие окна с подготовленными изменениями предлагает сохранить/отбросить/отменить.
- ↑ Push to source запускает общий диспетчер: предварительная проверка → запись обратно для конкретного источника → автоматический повторный импорт. Переименования ключей по-прежнему спрашивают «будет обновлено N ссылок — продолжить?», а отправка в Google по-прежнему показывает одобрение плана прежде, чем что-либо отправляется.
- Честные шлюзы:
- источник только для чтения (Google ExportUrl) отключает редактирование и отправку с причиной при наведении;
- вкладка, происходящая из xlsx, доступна только для чтения со значком (запись обратно пропускает xlsx);
- пока выполняется импорт/экспорт/отправка, pull и push отключены.
Выбор строк и столбцов — и их перетаскивание
Координаты сетки — это ручки, точно как в электронной таблице.
- Щёлкните по номеру строки, чтобы выделить строку; щёлкните по букве столбца, чтобы выделить столбец.
- Ctrl+клик добавляет ещё элементы в выделение; Shift+клик захватывает диапазон от последнего клика.
- Заголовок и тело подсвечивают всё выделенное, а ячейка, в которой стоит клавиатурный фокус, рисует контур выделения, следующий за перемещениями стрелками.
- Переключение листа сбрасывает выделение — те же номера указывали бы там на другие столбцы, — а меню несут пункт Снять выделение.
- Перетащите выделение, чтобы переместить его. Возьмитесь за выделенный номер строки (или букву столбца) и перетащите: линия вставки показывает, куда попадёт результат, а отпускание перемещает выделение туда как один шаг
Ctrl+Z.- Несмежное выделение — скажем, строки 2, 5 и 9 — прибывает собранным в точке отпускания в том порядке, в котором вы его выделяли.
- Пока сортировка, поиск или фильтр закрепляют видимый порядок, перемещение строк остаётся отклонённым по той же причине, по которой пункты меню отключают сами себя, — и начало перетаскивания сообщает об этом в момент, когда оно должно было бы начаться, вместо того чтобы молча не двигаться.
- Меню правого клика действуют на всё выделение. При выделении нескольких столбцов Ширина столбца…, Автоподбор ширины столбца, Скрыть столбец, перемещения ◀▶, удаление и Очистить данные столбца… применяются к каждому выделенному столбцу; при выделении нескольких строк перемещения и удаление охватывают их все — каждый пакет как один шаг отмены.
- Пункты, имеющие смысл только для одной цели за раз, — свойства, фильтр, сортировка, заморозка, вставка — стоят отдельно, в своём разделе для одиночной цели.
- Заблокированный пункт остаётся видимым с причиной, как и везде.
Выделение — это жест уровня отображения: ничего в нём не подготавливается и не записывается, пока какое-то действие его не использует.
Сами меню теперь — один компонент. Каждое контекстное и выпадающее меню в Studio — заголовки столбцов, поля номеров строк, ⋯ панели инструментов, боковая панель, узлы и линии холста, меню ячеек — имеет одну и ту же форму: озаглавленные разделы, галочки, навигация с клавиатуры и отключённые пункты, которые остаются на месте с причиной. Это та же форма, что и у меню веб-приложения, так что между ними не нужно ничему переучиваться.
Редактирование на холсте
Холст редактирует тот же буфер подготовки, что и таблица. Всё описанное ниже является обычным подготовленным изменением: оно показывается в Push modal, это один шаг Ctrl+Z, и оно записывается обратно той же цепочкой предварительной проверки и повторного импорта.
Что рисуется
Всё течёт в одном направлении: материалы слева, то, что их использует, справа, с открытой вами записью между ними.
Сегментированный переключатель над холстом выбирает, как далеко в каждую сторону:
- материалы → это → used by — по одному шагу в каждую сторону;
- только материалы — два шага, чтобы проследить цепочку сборки;
- только used by.
У таблицы без собственных столбцов-ссылок нет ничего слева, поэтому она предлагает только последний из этих вариантов. Ограничение по шагам существует, чтобы один широко используемый материал не вылил на экран весь проект целиком. Чтобы увидеть дальше, дважды щёлкните соседа, сделав его новым терминусом.
- Одна и та же запись, достигнутая дважды, — это по-прежнему один узел.
- Запись, которая не существует, всё равно отрисовывается, помеченная как сломанная, потому что связь, которую вы не видите, — это связь, которую вы не можете исправить.
- Цикл тоже не скрывается: ребро, которое его замыкает, проходит обратно по полосе под карточками, пунктиром, так что вы можете проследить, куда оно возвращается.
Раскладка детерминирована — одни и те же данные всегда производят одну и ту же картину. Позиции узлов можно перетаскивать на время сессии, и перетаскивание намеренно не сохраняется.
Что находится на узле
Заголовок несёт ключ, подзаголовок (свою таблицу, либо человекочитаемое имя, предоставленное плагином), адрес ячейки и значок, считающий, кто ещё указывает на эту запись.
Под ним всегда видны порты ссылок. Порт — это место, куда подключается линия, так что скрыть один означало бы солгать картиной. Каждый порт показывает заполненную или пустую точку, то, что он принимает, и то, сколько связей подключено. Порт списка показывает свои элементы по порядку, каждый с элементами управления перемещением и удалением, потому что порядок списка — это данные.
Обычные столбцы сворачиваются в группу «n значений», открытую на терминусе и закрытую в остальных местах. Каждая строка — это строка значения, в которую можно вводить текст, — тот же виджет, что использует таблица, применяемый через тот же шлюз. Точки портов подкрашены цветом таблицы, которую они принимают, так что одна цепочка читается как один цвет.
Карточка показывает ту же проекцию, что и таблица. Столбец, подготовленный в этом пакете — ещё не отражённый, включая обязательные и ссылочные типы, — уже присутствует на карточке, помеченный как ожидающий тем же способом, каким его помечает заголовок таблицы, вместе с подсказкой: подготовленный столбец-ссылка появляется как порт, подготовленный обычный столбец — как строка значения, подготовленное переименование показывает новое имя поверх исходного значения, а подготовленное удаление убирает строку и с карточки тоже. Добавление обязательного столбца к уже заполненной таблице не оставляет карточки пустыми, пока пустые ячейки ещё заполняются, — холст продолжает показывать таблицу такой, какой она будет после отражения, точно так же, как это делает сетка.
На правом краю карточки — единственная исходящая точка. То, что экспортирует эта запись, — это она сама, поэтому точка одна. Перетаскивание из неё задаёт противоположный вопрос («где я использую это?») по сравнению с перетаскиванием порта («на что это указывает?»).
Эта точка отрисовывается, только когда какая-то таблица в проекте на самом деле имеет столбец, принимающий эту таблицу, потому что точка, которой некуда идти, — это affordance, гарантированно обречённый на провал. Проверяется схема, а не данные: столбец, объявляющий RecordId@ThisSheet, держит точку живой ещё до того, как кто-либо написал хоть одну строку.
Жесты и меню
Точка — это ручка. Нажатие на точку порта запускает жест, а нажатие где-либо ещё на строке — нет, так что ничто не захватывается случайно. Нажать и отпустить без движения — это всё ещё клик.
- Заголовок карточки — это её собственная ручка:
- щёлкните по нему, чтобы выбрать карточку, — это также поднимает её над любой перекрывающей её карточкой;
- перетащите его, чтобы переместить карточку на время сессии;
- дважды щёлкните по нему, чтобы сделать эту запись новым терминусом.
- Правый клик по пустому холсту → New record. Открывается каскадный пикер: левая панель перечисляет таблицы, на которые нацелены нарисованные в данный момент порты, правая панель несёт поиск, создание и список записей, а третья страница спрашивает, какой порт получает запись, когда подходит больше одного.
- Плагин может сузить или расширить этот список таблиц. Таблица, которую он объявил, но которую не принимает ни один порт на экране, остаётся в списке с прикреплённой причиной, а не исчезает.
- Здесь нет «новой записи» вне контекста — каждая запись, рождённая на холсте, рождается связанной. Отдельная строка — это то, для чего служит + Row таблицы.
- Щёлкните по пустой точке порта, или правый клик по узлу → Connect, чтобы связать этот столбец. Пикер открывается у курсора и представляет собой тот же список ключей с поиском, что использует таблица.
- Две строки заголовка говорят, что принимает слот и в какую ячейку будет записан выбор.
- Каждая строка несёт ключ, его отображаемое имя и то, сколько мест уже на него указывает, а ключи, уже связанные здесь, помечены, а не молча дублируются.
- Если нужной вам записи ещё не существует, поле поиска становится полем ключа с заполненным общим префиксом таблицы. Введите имя, нажмите Enter, и она будет создана и связана одним жестом, который отменяет один
Ctrl+Z. Имя, которое пусто или уже занято, сообщает об этом (и где) вместо того, чтобы что-либо создавать.
- Запись, которую вы создаёте на холсте, становится холстом. Представление переходит к ней так же, как это делает двойной клик по карточке, так что новая запись оказывается в середине со связью, которую вы только что создали, рядом с ней. (Форк — исключение: смысл форка в том, что этот терминус сохраняет собственную копию, поэтому представление остаётся на месте.)
- Перетащите из пустой точки порта, и линия последует за курсором: отпустите её на карточке, чтобы связать, на пустом холсте, чтобы открыть там пикер.
- Перетаскивание из исходящей точки идёт в обратную сторону. Отпустите над карточкой, и холст найдёт, какой из её столбцов может принять эту запись — один кандидат связывается сразу, несколько спрашивают какой. Отпускание на пустом холсте открывает зеркальный каскад таблиц, которые могли бы её принять, включая таблицы не на экране.
- Пока перетаскивание активно, всё несвязанное тускнеет, а порты, способные принять запись, светятся, так что допустимые цели видны, а не угадываются.
- Каждый завершённый жест отвечает коротким всплывающим уведомлением, называющим ячейку, в которую он записал, — а когда это важно, что связь замкнула цикл или что запись теперь общая с кем-то ещё.
- Подхватите связь, которая уже подключена. Перетаскивание заполненного порта с одиночной ссылкой снимает именно эту линию, точно как выдёргивание кабеля из розетки. Отпустите её на другой карточке, чтобы перенацелить, либо на другом порту, чтобы переместить связь между двумя ячейками — всё ещё один шаг отмены, и ни одна ячейка не записывается, пока не устоят оба плана. Отпустите её туда же, откуда она была, или нажмите
Esc, чтобы ничего не менять.- Отпускание на пустом холсте открывает пикер этой ячейки у курсора, с отключением, предложенным как строка внутри него, а не выполненным на месте: рука, которая соскользнула, не должна стирать связь.
- Клик по такой точке без движения вместо этого выбирает эту линию, так что два жеста никогда не отнимают что-либо друг у друга.
- Заполненный скалярный порт всё ещё остаётся допустимой целью для чужого перетаскивания — отпускание на него означает замену.
- У портов списка нет единственной линии, которую можно поднять, поэтому они всегда начинают новую связь. Удаление или изменение порядка одного элемента — это то, для чего служит собственная строка ✕ / ▲▼ элемента.
- Тело линии предназначено для выбора, а не для перетаскивания. Щёлкните в любом месте вдоль линии — кликабельная полоса следует за каждым сегментом её пути, — чтобы выбрать её и открыть инспектор линии.
Deleteили правый клик ▸ Disconnect отвязывает её. Перенацеливание — это жест порта, описанный выше, так что для каждого действия есть ровно один способ. - Правый клик по узлу → Delete this record. Один диалог называет всё, что уйдёт: сколько связей указывает на запись и сколько подготовленных правок на этой строке будет отброшено.
- Форк общей записи. Когда запись используется в нескольких местах, инспектор узла предлагает Duplicate and split. Он клонирует каждый столбец в новый ключ (предложенный из префикса таблицы) и перенацеливает на копию только связи этого холста. Один шаг отмены, а запись, которую использует все остальные, остаётся нетронутой.
- Инспектор линии открывается с выбранной линией. Он говорит, что одна строка — это один токен: ячейку, в которой записана связь, и весь текст этой ячейки, разбитый на токены с отметкой на том, который представляет эта строка.
- Когда плагин, открывший ребро, его описывает, одна строка редактирует часть токена, не являющуюся ключом (
add:10изattack:add:10). Редактирование этой строки переписывает только остаток; изменение того, на что указывает связь, — это перенацеливание, то есть жест порта. - Отсюда же можно открыть запись, на которую указывает связь, либо разорвать её.
- Когда плагин, открывший ребро, его описывает, одна строка редактирует часть токена, не являющуюся ключом (
- Клавиша
Deleteсчитывает выделение и спрашивает, что это выделение означает здесь.- При выбранной линии она её отвязывает.
- При выбранной карточке это зависит от того, является ли карточка записью, которую вы открыли. На терминусе — карточке в середине, записи, о которой и есть этот экран, — она удаляет запись, через тот же диалог подтверждения, что и пункт меню.
- На любой другой карточке она разом обрезает все связи между этой карточкой и этим экраном, потому что отсюда эта карточка — материал, а не предмет. Это один шаг отмены, с планами, объединёнными в цепочку так, что столбец-список теряет все свои совпадающие элементы, а не все, кроме последнего, а связь, которую не удалось обрезать, говорит почему, а не молчит.
- (Правый клик ▸ Delete this record всегда означает удаление, на какой бы карточке это ни было, — клавиша — это сокращение, чей смысл следует за выделением, строка меню — явная.)
- У карточки, нарисованной плагином и не являющейся строкой таблицы, нечего удалять или отвязывать, так что клавиша на ней ничего не делает.
- Новая запись, ни с чем не связанная, не отрисовывается на чужом холсте. Новая строка появляется здесь только пока подготовленная связь привязывает её к чему-то на экране — иначе одна незаконченная строка в таблице следовала бы за каждым холстом в проекте.
- Из-за этого ничего не теряется. Создание записи из холста немедленно перенаправляет представление на неё, так что только что созданная строка — это то, на что вы смотрите. Строка, созданная в таблице, остаётся в таблице. А строка, которая в итоге ни с чем не связана, называется в списке отбрасываемых диалога отражения прежде, чем она будет отброшена, независимо от того, была ли она когда-либо отрисована.
- Ctrl/Cmd + колесо масштабирует холст между 25 % и 200 %, удерживая точку под курсором неподвижной. Процент в заголовке холста — это кнопка, возвращающая к 100 %. Обычное колесо по-прежнему прокручивает.
- Перетаскивание средней кнопкой мыши — или Alt + левая кнопка — панорамирует. Курсор меняется, пока вы удерживаете кнопку, так что ясно, что перемещается вид, а не что-то на нём.
- Перетаскивание одной левой кнопкой по-прежнему означает «выбрать и связать», поэтому панорамирование получило собственную кнопку. Alt + левая — тот же жест для мышей и трекпадов без средней кнопки.
- Панорамирование останавливается на краю содержимого: это scroll view, а не бесконечная плоскость, так что вы не можете потерять граф в пустом пространстве.
Отключение и отказы
Отключение сообщает, что произойдёт, прежде чем вы нажмёте. В очистке никогда не отказывают, но строка меню разъясняет последствие:
- необязательный столбец со значением по умолчанию откатывается к этому значению, так что линия уходит, а запись всё равно разрешается во время выполнения;
- необязательный столбец без значения по умолчанию просто становится пустым;
- обязательный столбец становится пустой ячейкой, о которой сообщает Problems — вы можете подготовить это, и предварительная проверка остановит отражение, пока вы не заполните её;
- список просто теряет этот один элемент.
Проверка живёт в одном канале; холст никогда не запускает свой собственный второй.
Две вещи действительно отклоняются, а не подделываются, и меню говорит, какие:
- Линию, которая не называет, в какой ячейке она записана, нельзя редактировать. Ядро заполняет это само для ссылок, которые само же читает; плагин, добавляющий линию вручную, предоставляет это (либо честно опускает).
- Связь, зарытая внутри пользовательского типа — например, имя характеристики внутри значения
Modifier, — редактируема, только если плагин, открывший это ребро, также подключилIAuthorableEdgeContributor. Иначе линия доступна только для отображения.
Дублирующиеся ключи, источники только для чтения, вкладки из xlsx и выполняющийся импорт отключают авторинг на холсте точно так же, как они отключают его в таблице, каждый со своей причиной в строке меню.
Правка структуры
Всё описанное ниже подготавливается как правка ячейки — видно немедленно, отменяемо, подтверждается одной записью обратно. В Studio эти возможности живут в меню правого клика, описанных выше (заголовок столбца · поле строки · таблица в боковой панели). Workbench помещает те же операции на кнопки панели инструментов.
Studio также держит постоянные кнопки на строке заголовка таблицы, рядом с её именем, так что самые используемые можно найти, не зная о существовании меню правого клика. Среди них — + Row и + Column, добавляющая столбец в конец. Та же строка несёт значок переименования таблицы ✎, переключатель строки @overlap, а также элементы поиска и сортировки. Правый клик по заголовку по-прежнему остаётся способом поместить новый столбец в конкретную позицию.
- Столбцы: добавление, удаление, перемещение и редактирование свойств на месте.
- Форма свойств (properties ✎ на заголовке) редактирует имя,
@type,@descи@overlapодновременно. Изменяются только ячейки маркеров; ячейки данных столбца сохраняются на 100% (никакой потери данных из-за удаления-и-добавления заново). @overlap— это чекбокс. Строка создаётся автоматически при первой необходимости, а чекбокс отключён для ключевых столбцов, которые всегда уникальны.- Ввод
@typeпроверяется по мере набора. Затем предварительная проверка удостоверяется, что каждая существующая ячейка совместима с новым типом, прежде чем что-либо будет записано.
- Форма свойств (properties ✎ на заголовке) редактирует имя,
- Маркеры: добавление/удаление необязательной строки
@overlap. Собственная метка группы@styleи цвет таблицы подготавливаются тем же путём (правый клик в боковой панели ▸ Group & color ✎), так что группировка и раскраска отправляются в таблицу как любая другая правка, а не хранятся в локальном состоянии редактора. - Строки: удаление; изменение порядка кнопками ▲▼ (в Studio — «move up» / «move down» в меню поля строки).
- Изменение порядка столбцов — любое количество перемещений, подтверждаемое одним отражением. Столбцы в ожидании (новодобавленные) тоже можно переставлять, вплоть до самого начала, впереди существующих столбцов.
- Комментарии и пустые строки сохраняются при любых правках структуры.
WYSIWYG: таблица — это живой предпросмотр состояния после отражения
Всё, что вы подготовили, сразу же становится тем, что вы видите:
- Добавленный столбец появляется мгновенно — и вы можете заполнить его ячейки в том же пакете (как для существующих, так и для новых строк). Именно так вы добавляете обязательный столбец к уже заполненной вкладке: добавьте его и одновременно заполните значения. Незаполненные обязательные ячейки будут отловлены предварительной проверкой.
- Удалённые столбцы/строки исчезают мгновенно. Сводка подготовленных изменений перечисляет, что ожидает применения (
Deleted: column 'hp'·Added: column 'mp') — только для отображения. - В одном пакете всё свободно смешивается: правки значений, добавления строк, множественные добавления/удаления столбцов, переключение маркеров и изменения порядка — никаких ограничений вида «одна операция на пакет».
- Удаление столбца/строки, у которой уже есть подготовленные правки (или отмена заполненного нового столбца), спрашивает «N правок будет потеряно — продолжить?» — ничего не отбрасывается молча.
Переименование вкладки и обмены A↔B — ссылки следуют за данными
Переименование вкладки («Переименовать вкладку ✎») переименовывает источник и обновляет каждую ссылку @type на вкладку по всем таблицам (RecordId@Foo → RecordId@Bar, включая списки и пользовательские формы), после диалога подтверждения. Переименование источника означает переименование файла с сохранением расширения — локально, и изменение заголовка с нетронутым содержимым — в Google.
Взаимные обмены именами (A↔B) и циклы поддерживаются в одном пакете: подготовка любой из половин первой работает одинаково, ссылки следуют за данными через атомарную перезапись при обмене.
- Локально содержимое файлов обменивается за один проход записи, с очисткой устаревших файлов со старым расширением.
- Google упорядочивает изменения заголовков топологически, используя временный заголовок, чтобы избежать даже кратковременного дубликата.
Повторный импорт автоматически берёт на себя очистку: переименование сгенерированного класса, удаление файла старого класса, перерегистрацию запечённого SO и адреса Addressables.
Переименование ключа (RecordId) с распространением ссылок
Редактируйте ячейку ключа прямо в таблице. При отражении каждая ячейка на каждой вкладке, ссылающаяся на этот ключ (скаляры RecordId@ThisTab и элементы списков), обновляется одновременно, после подтверждения «будет обновлено N ссылок — продолжить?». Работает как для локального, так и для Google-пути. Границы:
- Распространение затрагивает только ячейки baseline. Текст, который вы только что набрали в том же пакете, никогда не переписывается молча; вместо этого предварительная проверка отлавливает повисшую ссылку, чтобы вы исправили её осознанно.
- Если распространение затронуло бы вкладку, происходящую из xlsx, всё отражение целиком блокируется, потому что частичное отражение никогда не допускается. Отредактируйте эту книгу напрямую и выполните повторный импорт.
- Вторичный целочисленный ключ (
IntId) редактируется тем же способом.
Ctrl+Z / Ctrl+Y — подключены к нативному Undo Unity
Каждое подготовленное изменение интегрируется с нативным Undo Unity:
- правки ячеек;
- правки ключей;
- добавление/удаление/отмена столбца;
- добавление/удаление строки;
- переключение маркеров;
- изменения порядка;
- правки свойств;
- переименования вкладок;
- связи и отвязывания на холсте;
- перетаскивания ассетов вместе с регистрациями, которые они подготавливают;
- даже «отменить все правки».
Есть две границы, которые нужно знать:
- Во время набора текста в текстовом поле само поле первым перехватывает Ctrl+Z (стандартное поведение Windows).
- После успешного отражения история подготовленных изменений очищается — Ctrl+Z действует только в пределах сессии до отражения. Изменения, уже записанные в таблицу, отменяются редактированием самой таблицы.
Подготовленные правки переживают повторные импорты
Подготовленные правки несут логический адрес (вкладка · ключ строки · поле), а не физический номер строки, и заново разрешаются непосредственно перед отражением. Поэтому ваши подготовленные изменения переживают автоматические повторные импорты и фоновые изменения baseline.
Правка становится изолированной, когда таблица изменилась извне так, что это ломает разрешение адреса — ключ строки был переименован снаружи, строка была удалена, или ключ теперь конфликтует. Изолированная правка исключается из отражения и показывается со значком «изолирована». Она не отбрасывается молча и не блокирует остальную часть вашей сессии; вы можете отдельно отменить её после подтверждения.
Предварительная проверка — сначала проверка, потом отражение
Запись обратно сначала проверяет всё спроецированное состояние в памяти — целостность ссылок, уникальность @overlap, ключи и типы ассетов (при этом регистрации, подготовленные в этой сессии, считаются уже существующими), а также любые доменные валидаторы плагинов. Если проверка не проходит, ничего не записывается, и вы получаете полный отчёт. Запись начинается только после того, как всё спроецированное состояние проходит проверку; подготовленные регистрации Addressables выполняются после успешной записи таблицы и до автоматического повторного импорта, а отражение, единственное подготовленное изменение которого — регистрация, всё равно выполняет её и делает повторный импорт (см. Источники, экспорт и отправка).
Создание / удаление таблицы
- Создать из одного из двух встроенных шаблонов, из шаблона, зарегистрированного плагином, либо с нуля, определяя поля самостоятельно. Один клик создаёт локальный файл или вкладку Google (после предупреждения).
- Встроенные шаблоны — это Пример предмета (только базовые типы) и Enum definitions, который раскладывает лист
@enum(см. ниже). - Шаблон, зарегистрированный плагином, доступен только когда его предоставляет плагин — например, вкладки демо-навыка из Plugin Demo.
- Встроенные шаблоны — это Пример предмета (только базовые типы) и Enum definitions, который раскладывает лист
- Если вы создаёте в источник, отличный от того, из которого вы сейчас импортируете, диалог сообщает об этом прежде, чем действовать. Автоматический повторный импорт прочитал бы старый источник и никогда не увидел бы новую вкладку, поэтому создание переключает источник импорта на тот, в который вы создали, и сохраняет это в ассет настроек.
- Удалить очищает всё сразу: источник, baseline, запечённый SO и сгенерированный
.cs(строгое предупреждение + подтверждение).
Сквозной поиск по таблицам (пункт All)
Первый пункт в боковой панели — All: введите термин, и он ищет по id и значениям полей каждой таблицы по частичному совпадению, перечисляя таблицу · ключ · поле · значение, по 50 строк на страницу. С пустым полем он просматривает каждую запись в каждой таблице.
Он читает запечённые базы данных, поэтому сначала нужен один успешный импорт, и он прямо об этом сообщает, если такового ещё не было. Результаты обновляются сами, когда импорт завершается или меняются активные настройки, вместо того чтобы показывать устаревший ответ.
Строка результата — это дверь, а не просто пункт списка. Дважды щёлкните по ней — или выделите её и нажмите Enter — и эта таблица откроется с выделенной найденной ячейкой; одиночный клик только выделяет строку. Поскольку результаты приходят из запечённых данных, результат может называть таблицу, которую текущая сессия ещё не загрузила, — такая строка не переходит по клику, и краткое уведомление под списком объясняет почему, вместо того чтобы просто ничего не делать.
Открытие таблицы, не прошедшей импорт (карантин)
Раньше ошибка проверки оставляла вас без возможности её исправить: импорт проваливался, поэтому в окне не появлялось никакой таблицы, и единственным способом двигаться дальше было открыть саму таблицу. Теперь это перевёрнуто.
Получение и сохранение отделены от проверки. Пока источник был прочитан полностью, таблицы сохраняются как снимок baseline, даже если проверка провалилась, — поэтому Studio их открывает, показывает каждую ошибку напротив проблемных ячеек и позволяет исправить и отправить точно так же, как обычно.
Что остаётся заблокированным — это результат: генерация кода и запекание не выполняются, пока количество ошибок не станет нулевым, так что принцип «никакой частичной сборки» сохраняется там, где ему и место, — на выходе.
- Вам сообщают, а не оставляют гадать. Консоль сообщает, что таблицы были сохранены и что именно заблокировано. Боковая панель несёт уведомление
⛔ N error(s) — code generation and baking are blocked, которое при клике переходит к первой ошибке, а значки ошибок по каждой таблице берутся из той же диагностики проекции, что вы уже видите в Problems. Таблица, которую вообще не удалось разобрать, сообщает об этом вместо того, чтобы выглядеть пустой. - Отправка вашего исправления спрашивает один раз. Пока таблица в карантине, запись обратно показывает дополнительное подтверждение: существующие ошибки остаются, а новая ошибка, которую вносит эта правка, тоже записывается — проверка её не остановит. Всё, что она находит, перечисляется как предупреждение в отчёте этого отражения, а автоматический повторный импорт затем заново проверяет всю таблицу. На здоровой таблице ничего не меняется: предварительная проверка по-прежнему остаётся жёстким шлюзом.
- Выходы остаются закрытыми. Экспорт и отправка в живую таблицу оба отклоняются, пока действует карантин, потому что оба вставляют последние успешно запечённые значения в более новые таблицы — что откатило бы именно те значения, которые кто-то только что исправил. Сборка останавливается проверкой актуальности по той же причине, и окно «Начало работы» тоже показывает это состояние.
- Флаг снимается ровно в одном месте — в момент, когда импорт проходит весь путь до запекания. Ни один более ранний шаг не может его снять, поэтому более поздний сбой не может оставить после себя ложное «всё чисто».
Сортировка и фильтр (только для отображения)
Studio добавляет сортировку по таблице (любой столбец, по возрастанию/убыванию, сравнение с учётом типа, сохраняется для каждого проекта) и текстовый фильтр. Оба изменяют только порядок отображения: поле нумерации сохраняет настоящие номера строк таблицы, и ни сортировка, ни фильтр никак не затрагивают подготовку, отражение, отправку или экспорт.
Пока сортировка или фильтр активны, пункты перемещения строк в меню поля отключаются сами и объясняют почему, потому что «видимый сосед» не был бы настоящим соседом. Фильтры значений по столбцам и скрытие столбцов, описанные ниже, следуют тому же правилу.
Замороженные столбцы (только для отображения)
Правый клик по заголовку столбца ▸ Закрепить до этого столбца — и этот столбец, а также каждый столбец слева от него, перемещается в собственную панель вне горизонтальной прокрутки, так что ключ остаётся видимым, пока вы прокручиваете до дальнего столбца. Открепить столбцы освобождает их. Как минимум один столбец должен оставаться прокручиваемым, поэтому заморозка последнего отклоняется с указанной причиной. У таблицы с единственным столбцом нечего замораживать.
То, что заморожено, — это количество столбцов слева, а не конкретный именованный столбец. Так что перемещение столбца меняет, какие из них удерживаются, точно так же, как ведут себя замороженные области в электронной таблице.
Как и сортировка с фильтром, это настройка представления, хранящаяся для каждой таблицы в настройках проекта. Она никогда не достигает самой таблицы, поэтому работает на таблицах только для чтения и происходящих из xlsx, а также пока выполняется импорт, и не появляется ни в отправке, ни в экспорте.
Ширина столбца, скрытие и фильтры по столбцам (только для отображения)
Любой столбец — как на листах данных, так и на листах определений enum — можно вручную изменить в размере: перетащите ручку у правого края буквенной ячейки столбца, дважды щёлкните по ручке, чтобы вернуться к измеренной подгонке, или используйте Ширина столбца… в меню столбца для точного числа и Автоподбор ширины столбца, чтобы измерить заново. Нижний предел — 24 px, верхнего предела нет. Ширины сохраняются для каждого листа и восстанавливаются, когда лист или редактор возвращаются, а автоподбор измеряет каждую строку — не только видимые, — так что фильтр не может заставить ширины скакать.
То же меню столбца несёт остальной набор возможностей электронной таблицы:
- Скрыть столбец / Показать скрытые столбцы ({count}) — скрытие — это настройка представления: буквы по-прежнему называют настоящие позиции листа (A · C · D), жирная граничная линия в заголовке и в теле отмечает, где сидят скрытые столбцы, а плашка на панели инструментов их считает. Последний видимый столбец отказывается скрываться, с указанной причиной. Скрытые столбцы по-прежнему существуют везде остальном — холст, проверка, Export и Push видят лист без изменений.
- Фильтр… — чек-лист значений столбца (с пунктом (Пусто) для пустых ячеек) плюс одно условие: содержит / не содержит / пусто / не пусто для любого столбца, и равно / не равно / больше / меньше / больше или равно / меньше или равно для числовых столбцов. Если ничего не отмечено, проходит каждое значение, и условие всё равно применяется. Фильтр сочетается с полем поиска, вновь добавленные строки всегда остаются видимыми, плашка на панели инструментов считает отфильтрованные столбцы, а Очистить фильтр снимает один.
- Очистить данные столбца… — после подтверждения очищает значение этого столбца в каждой строке (включая отфильтрованные строки и подготовленные новые строки) одним шагом отмены. Ключевой столбец отказывает — в нём живёт имя каждой строки; переименуйте её в её ячейке, — а обязательный столбец честно сообщает об ошибках, пока не будет заполнен заново. Столбец, в котором нечего очищать, ничего не подготавливает.
- Сортировать по возрастанию / по убыванию / порядок листа — сортировка по листу, теперь также в меню столбца, с галочкой на активном выборе.
Как и сортировка с замороженными столбцами, всё это только для отображения: настройки представления для каждого листа, которые никогда не достигают листа, отправки или экспорта.
Листы определений enum
Таблица, определяющая enum (см. Синтаксис таблиц), не имеет записей, поэтому Studio даёт ей собственную сетку вместо таблицы записей. Эта сетка показывает один столбец на каждый enum, его члены перечислены по порядку, со значком Enum definitions в боковой панели и количеством того, сколько enum она несёт. Она читается как любой другой лист: буквы столбцов вверху, настоящие номера строк листа в поле нумерации, те же меню правого клика в том же порядке, а подготовленные изменения помечены теми же цветами, что использует таблица данных.
Структура листа авторится на месте точно так же, как структура листа данных:
- Определите новый enum кнопкой + Enum на строке заголовка (единственный способ поместить первый enum на лист определений, где их ещё нет) либо из меню правого клика заголовка столбца в выбранной позиции. Форма принимает имя, необязательный базовый тип и описание, а также первые члены — хотя бы один, потому что enum без членов нельзя импортировать. Порядок членов — это их целочисленные значения.
- Переименуйте enum — и каждая ячейка
@type, ссылающаяся на него на всех листах, переписывается в том же пакете, так что повторный импорт после записи по-прежнему разрешается. Правьте базовый тип и описание на месте — строки маркеров показываются, даже если на листе их ещё нет, и создаются, когда изменение отражается. - Удалите enum — отклоняется, пока его использует хотя бы один лист, с указанием использующих столбцов. Меняйте порядок столбцов свободно; позиция столбца enum не несёт смысла, так что это всегда безопасно.
- Всё подготавливается как любая другая правка: видно немедленно, один шаг
Ctrl+Zна жест, записывается одним отражением. Каждое решение — допустимо ли имя или оно уже занято, допустим ли член, разрешён ли базовый тип, используется ли ещё enum — принимает тот же код, что проверяет импорт, так что форма и повторный импорт не могут разойтись во мнениях. Заблокированное действие остаётся в своём меню с указанной причиной, вместо того чтобы исчезать.
Строки членов по-прежнему только добавляются в конец, и сортировки нет, потому что позиция члена и есть его значение — перестановка членов заново пронумеровала бы данные, уже запечённые в ассеты.
Ячейки показывают ровно то, что говорит таблица: член, зафиксированный синтаксисом Name=value, отображается ровно так, как записан. Проверка дубликатов сравнивает только часть с именем, поэтому подготовка Rare на листе, где уже есть Rare=10, отклоняется, а не удваивается.
Чтобы добавить член, вам даже не нужно открывать лист. Выпадающий список ячейки Enum<T> в любом месте проекта несёт внизу «Add a new member…»: введите имя, и оно будет подготовлено в лист enum одним шагом Ctrl+Z, помеченным как подготовленное, пока следующее отражение его не запишет.
Эта строка отсутствует — а не присутствует и не проваливается — у enum, который плагин зарегистрировал из C#, потому что этим таблица не владеет.
Веб-приложение авторит эти листы точно так же, по тем же правилам — см. SheetForge Web.
Переход от ошибки в консоли к ячейке
Когда импорт или отражение находит ошибки, понятный человеку отчёт консоли добавляет рядом с координатой каждой ошибки кликабельную ссылку «Открыть в Data Studio». Клик по ней открывает Studio, переключается на нужную вкладку и выделяет ячейку (полоса слева на строке и рамка вокруг ячейки). Ошибки без конкретной ячейки (на уровне файла/вкладки) просто переключают фокус на вкладку.
Ссылка добавляется только в понятный человеку отчёт; машиночитаемая строка координат, на которую опираются CI и скрапинг логов, остаётся нетронутой.
Проверка состояния
⋯ ▸ Проверка состояния на панели инструментов Studio выполняет быструю диагностику без обращения к сети. Она выводит ✓/✗ с предлагаемым исправлением для каждого из:
- активных настроек;
- доступности источника — существует ли локальная папка, либо путь к Google id + ключу сервисного аккаунта;
- наличия baseline импорта;
- актуальности сгенерированного кода/запечённых SO/addressables.
Итоговый диалог сообщает, сколько проверок требует внимания.
Активные настройки импорта
Когда в проекте есть больше одного ассета SheetForgeSettings, панель инструментов показывает выпадающий список для выбора того, который активен. Выбор одного сразу активирует его и перестраивает представление; меню, импорты и окно авторинга следуют активному выбору. При единственном ассете настроек выпадающий список скрыт.
Активный выбор хранится для каждого проекта и каждого пользователя отдельно, так что он никогда не затрагивает систему контроля версий. Вы также можете управлять им из окна «Начало работы» (Tools ▸ SheetForge ▸ Getting Started) либо из инспектора ассета настроек, который показывает значок «активный» или кнопку «Сделать активной».
Защитные механизмы
- Обнаружение внешних изменений для локальных источников.
- Предупреждение при закрытии, если есть подготовленные изменения.
- Якоря поколений подготовки, которые защищают от работы с устаревшей таблицей.
- Осведомлённость о режиме: при источнике только для чтения (Google ExportUrl) отправка / отражение / правка структуры / удаление отключены, с объяснением при наведении мыши.
- Индикаторы прогресса во время импорта/экспорта/отправки, всегда очищаются (
try/finally), локализованы. - Неправильно ведущее себя расширение не может обрушить окно: переопределения холста, виджеты и действия вызываются внутри try/catch, а сбой — это предупреждение в консоли на английском, пока остальная часть окна продолжает работать.
Что нужно знать перед переименованием (необратимо после отражения)
- Переименование столбца / изменение
@typeперегенерирует сгенерированное поле (имя/тип), так что код игры, ссылающийся на это поле, нужно обновить вручную. Диалог подтверждения явно предупреждает об этом, а возникающий разрыв компиляции безопасно прерывается автоцепочкой с предложением конкретных действий. Значения столбца сохраняются. - Переименование вкладки меняет имя сгенерированного класса (
FooDatabase→BarDatabase) — то же правило. - Взаимные обмены и циклы подчиняются тем же правилам, что и обычные переименования (см. раздел о переименовании вкладки выше). Отклоняется только настоящий конфликт — два переименования в одно и то же имя.
- Вкладки, происходящие из xlsx, исключены из переименования. Форма объясняет почему, и кнопка Apply отключена; переименуйте лист в самой книге, затем выполните повторный импорт.
- В Google остаётся один пограничный случай: две обменивающиеся вкладки, ссылающиеся друг на друга, не перенаправляются (локально это работает полностью корректно) — см. Возможности и ограничения.
- После отражения эти изменения нельзя отменить через Ctrl+Z (таблица уже записана).
Тестовая правка (временная настройка SO)
В инспекторе запечённого SO есть переключатель «тестовая правка» (по умолчанию выключен = только для чтения). Включите его, чтобы временно подкорректировать значения SO и опробовать числа во время выполнения — это никогда не записывается в таблицу и исчезает при следующем повторном импорте. Записи можно быстро найти по codeName/id, как в редакторе, так и в режиме Play.
Отдельная кнопка Workbench «предпросмотреть мои подготовленные значения на SO» ушла вместе с этим окном. Оверлей, которым она управляла, всё ещё остаётся публичным API для инструмента, которому он нужен: EphemeralSoApply применяет то, что может достоверно вычислить, и отказывается от столбцов в ожидании и ячеек с ошибкой разбора, а не подделывает их. Переключатель выше покрывает повседневный случай.
С плагинами и без них
Всё, что перечислено как Без плагина (только core), работает в обычном проекте. Каждая строка С плагином — это то, что добавляет доменный плагин. Всё это задействовано во встроенном Plugin Demo, так что вы можете увидеть каждую возможность в работе, прежде чем писать свою собственную (Создание плагинов).
- Таблицы, ячейки, строки
- Без плагина: полная таблица, редактирование ячеек, добавление строк, подготовка, Ctrl+Z, отправка.
- С плагином: без изменений.
- Импорт / Отправка
- Без плагина: импорт из активного источника; отправка через ту же цепочку предварительной проверки + повторного импорта.
- С плагином: без изменений.
- Problems
- Без плагина: четыре базовые проверки core (ключи, ссылки,
@overlap, ключи ассетов). - С плагином: плюс ваши правила
IDomainValidator. Демо предупреждает о нерастормаживаемом цикле реакции и о записи-сироте.
- Без плагина: четыре базовые проверки core (ключи, ссылки,
- Что показывает холст
- Без плагина: открытая вами запись, из чего она состоит и что её использует, разложенные детерминированно.
- С плагином: плюс ваше переопределение для вкладки через
ISheetForgeGraphPlugin— идентичности, не являющиеся записями таблицы, связи, которые ядро не может увидеть, столбцы, закреплённые доменным порядком (абсолютным или отсчитываемым от записи на экране), и человекочитаемое имя, под которым известна запись. Демо наращивает узлы событий и блок кода вокруг записиExampleActions, закрепляет стадии каста записиExampleSkills, и превращаетfireballв Fireball на карточке и в пикере.
- Отрисованные рёбра
- Без плагина: каждая ссылка
RecordId@Tab, которую видит сканер ядра (скаляры, элементы списков, значения по умолчанию, внутренности wrapper'ов). - С плагином: плюс рёбра, объявленные
IEdgeContributor, и любое дополнительное ребро, которое раскрывает переопределение холста. Демо открывает ссылку на характеристику, зарытую внутри значения мини-синтаксисаModifier.
- Без плагина: каждая ссылка
- Редактирование на холсте
- Без плагина: создание, подключение, отключение, перенацеливание, форк, удаление и инлайн-редактирование значений для каждого столбца; новые записи можно создавать в таблицах, на которые нацелены нарисованные порты.
- С плагином: плюс
IAuthorableGraphShapeдля решения, где могут создаваться новые записи,IAuthorableEdgeContributor, делающий собственное ребро поставщика редактируемым, иIEdgeTokenEditor, раскрывающий часть его токена, не являющуюся ключом. Поставщик демо переписывает мини-синтаксисmodifier, когда вы связываете или отвязываете характеристику, и предлагает свойop:valueкак одну редактируемую строку в инспекторе линии.
- Виджеты ячеек
- Без плагина: встроенные ветки (переключатель, пикер выбора, пикер ссылок, пикер ассетов с перетаскиванием, поля цвета / кривой / градиента, списки плашек для списков этих трёх типов, сырой текст).
- С плагином: плюс ваш
IStudioCellEditorProviderдля одного именованного типа ячейки. Вообще без кода виджетаStudioCellEditorHintназывает одну из семи встроенных форм (выпадающий список, многострочное поле, ползунок, переключатель, цвет, кривая, градиент) для этого типа вместо него. Зарегистрированный виджет побеждает; подсказка побеждает над стандартным поведением core — включая встроенные подсказки цвета / кривой / градиента, когда пакет регистрирует подсказку под тем же именем типа.
- Меню и панели
- Без плагина: только встроенные пункты.
- С плагином: плюс ваши регистрации
ISheetForgeStudioPlugin— команды в конце инспектора, меню строки, меню заголовка столбца, меню узла холста и верхней панели ⋯, правая сводная панель и значок рядом с заголовком столбца. Демо подготавливает торможение реакции на одной строке, заполняет целый столбец одним шагом отмены и подводит итог сборки навыка индикатором времени каста.
- Богатые панели
- Без плагина: ничего.
- С плагином:
IStudioPanelProviderрисует произвольную панель UIToolkit. Зарегистрированная под тем же id, что и описанная панель, она побеждает здесь, а браузер рисует описанную.
- Боковая панель
- Без плагина: только ваши таблицы.
- С плагином: плюс заблокированные реестры кода в стиле
_Refs(ISheetForgeCodeRegistryPlugin), показанные как сетка ключ/метка/raises только для чтения; рёбра, указывающие на эти ключи, не отрисовываются как сломанные.
- Над холстом
- Без плагина: ничего (core не поставляет ни одного виджета).
- С плагином: ваш
IStudioGraphWidget. Демо показывает полосу фиксированных стадий (VALIDATE → CAST → COMMIT → DELIVER → APPLY), заполняемую из строки терминуса.
- Инспектор узла
- Без плагина: адрес, список used-by, «Go to this sheet», «Duplicate and split».
- С плагином: плюс ваши кнопки
IStudioInspectorAction. Демо подготавливаетbrakeSeconds = 0.25на нерастормаживаемой реакции (обычная, отменяемая подготовленная правка).
- Цвета и метки
- Без плагина: встроенные пресеты плюс собственный цвет
@styleкаждой таблицы. - С плагином: плюс ваш пресет
ISheetForgeThemePluginи строкиISheetForgeStringsPlugin— зарегистрированные в Core, поэтому метки того же пакета также появляются и в браузере.
- Без плагина: встроенные пресеты плюс собственный цвет
Начало работы с пустым проектом
Открытая без активных настроек импорта, Studio показывает панель «Get started» вместо таблицы — встроенные кнопки для создания ассета настроек, импорта демо Plugin/Core, либо открытия «Начала работы». Она исчезает, как только настройки появляются.
Ещё быстрее: перетащите папку на окно, или один файл .tsv/.csv/.xlsx, чья родительская папка будет использована. После подтверждения это создаёт ассет настроек импорта, который читает из этой папки, и делает его активным. Если у вас уже есть активные настройки, диалог сообщает об этом и предлагает создать новый и переключиться.
Что случилось с Workbench
Исходное окно Workbench на IMGUI было удалено. Оно разделяло со Studio сессию авторинга, движок сборки/проверки и путь отражения, так что поведенчески ничего не потеряно — а три вещи, которые предлагало только оно, были перенесены заранее:
| Возможность Workbench | Где она теперь находится |
|---|---|
| Вкладка All — сквозной поиск по всем таблицам с постраничной навигацией | Пункт All вверху боковой панели Studio (тот же поиск, тот же размер страницы) |
| Знакомство через перетаскивание | Само окно Studio принимает перетаскивание (см. выше) |
| Панель Google автозаполнение gid / списка живых вкладок | Инспектор ассета настроек, раздел Google Sheets |
Одна возможность была не перенесена, а убрана: кнопка Workbench для предпросмотра подготовленных значений поверх запечённых SO. Переключатель тестовая правка в инспекторе SO покрывает ту же потребность (см. Тестовая правка выше).
Если у вас есть код или заметки, ссылающиеся на него: обновлять пункт меню не нужно — его никогда и не было, — а инспектор настроек, инспектор запечённого SO и галерея шаблонов окна «Начало работы» — все открывают Data Studio.
Похожие страницы
- Синтаксис таблиц — на соответствие чему проверяет форма свойств
- Источники, экспорт и отправка — что делает «отражение» для каждого источника
- Создание плагинов — написание переопределений холста, реестров кода, виджетов и действий, которые подхватывает Studio
- Ядро авторинга — движок, на котором построено это окно
- Возможности и ограничения — полный список ограничений авторинга