# BuildsDialog.qml Окно пользовательских сборок. Слева список, справа карточка выбранной сборки: имя, сервер, версия Minecraft, модлоадер. Отсюда сборку ставят, делают активной и удаляют. Сборка — это версия игры, модлоадер и адрес сервера плюс собственное содержимое `.minecraft` (моды, конфиги, миры). Активная сборка одна, её файлы разложены в `.minecraft`, остальные лежат в архивах. Подробнее в [BuildSwitcher](../cpp/BuildSwitcher.md). Открывается из [Main](Main.md) по кнопке активной сборки. ## Свойства | Свойство | Что это | |----------|---------| | `backend` (required) | `LauncherBackend` | | `editIndex` | сборка, открытая в карточке; −1 — ничего не открыто | | `loading` | карточка сейчас заполняется данными сборки, обработчики полей ничего не записывают | `editIndex` не связан с активной сборкой. Щелчок по строке списка только открывает карточку, а активной сборку делает отдельная кнопка. Иначе случайный щелчок запускал бы архивацию `.minecraft`. ## Как устроено окно Модальный `Dialog` 880×600. Пока идёт смена сборки (`backend.switching`), окно закрывается только кнопкой, а список и карточка выключены. **Слева** (260 px) список сборок. У активной пометка «активна», при наведении появляется корзина. Ниже строка «+ Новая сборка»: создаёт сборку с первым свободным именем вида «Сборка N» и сразу открывает её. **Справа** карточка в `Flickable`, потому что может не поместиться по высоте: - название и адрес сервера ([LabelledField](LabelledField.md)); - версия Minecraft. Это не выпадающий список, а поле, которое открывает [VersionPickerDialog](VersionPickerDialog.md): версий около тысячи, и выбирать их удобнее в окне с категориями и поиском; - четыре строки [LoaderRow](LoaderRow.md): Forge, Fabric, NeoForge, Quilt; - строка комплектности: «можно запускать» или «не хватает N файлов» и первый из них (`checkInstallation()`). **Внизу** кнопки «Установить» (`installCustomBuild()`), «Сделать активной» (запись в `activeBuildIndex`) и «Закрыть». Первые две выключены, пока `busy`. «Сделать активной» выключена ещё и для уже активной сборки. Прогресс установки и смены сборки показывают панели главного окна. ## Сохранение по ходу Отдельной кнопки «Сохранить» нет. Каждое поле записывается сразу после правки через `commit(fields)` → `updateCustomBuild()`. Иначе пришлось бы как-то показывать несохранённые правки при переключении между сборками в списке. Чтобы открытие сборки не записывало её саму в себя, на время `selectBuild()` выставляется `loading`, и `commit()` в это время ничего не делает. ## Модлоадеры `loaderPanel` держит четыре строки и следит, чтобы был отмечен не больше чем один модлоадер: игра запускается с одним профилем из `versions/`. Ни одной отметки — ванильная сборка. - `applyBuild(loader, loaderVersion)` — раздать данные сборки строкам; - `selectedRow()` — отмеченная строка или `null`; - `keepOnly(row)` — снять отметки с остальных (на `userChecked` строки); - `commitSelection()` — записать `loader`, `loaderVersion` и пустой `resolvedVersionId` (на `changed` строки). Профиль модлоадера появится только после установки, а до этого сборка запускается как ванильная. Строки получают `gameVersion` привязкой к выбранной версии, поэтому смена версии игры сама перезапрашивает их списки. ## Удаление `askRemove(index)` берёт `customBuildRemovalInfo()` и открывает подтверждение. Текст зависит от трёх признаков: - `hasArchive` — вместе со сборкой удалится её архив, моды, конфиги и миры будет не вернуть; - `active` — содержимое `.minecraft` принадлежит этой сборке, оно будет очищено, и на его место развернётся следующая; - `lastOne` — для последней сборки содержимое `.minecraft` остаётся как есть. Индекс запоминается в самом окне подтверждения, потому что к моменту ответа под курсором может оказаться другая строка. `performRemove(index)` удаляет сборку и открывает соседнюю (ту же позицию или последнюю), а если сборок не осталось, очищает карточку. ## Когда окно открывается `onAboutToShow` просит обновить каталог версий и открывает активную сборку (или первую). Через `Connections` окно слушает `installedVersionsChanged` и обновляет строку комплектности: установка могла закончиться, пока окно открыто. --- При создании этого документа использовался ИИ.