Files
BiLauncher/doc/qml/BuildsDialog.md
T
2026-10-11 22:32:13 +03:00

6.7 KiB

BuildsDialog.qml

Окно пользовательских сборок. Слева список, справа карточка выбранной сборки: имя, сервер, версия Minecraft, модлоадер. Отсюда сборку ставят, делают активной и удаляют.

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

Открывается из Main по кнопке активной сборки.

Свойства

Свойство Что это
backend (required) LauncherBackend
editIndex сборка, открытая в карточке; −1 — ничего не открыто
loading карточка сейчас заполняется данными сборки, обработчики полей ничего не записывают

editIndex не связан с активной сборкой. Щелчок по строке списка только открывает карточку, а активной сборку делает отдельная кнопка. Иначе случайный щелчок запускал бы архивацию .minecraft.

Как устроено окно

Модальный Dialog 880×600. Пока идёт смена сборки (backend.switching), окно закрывается только кнопкой, а список и карточка выключены.

Слева (260 px) список сборок. У активной пометка «активна», при наведении появляется корзина. Ниже строка «+ Новая сборка»: создаёт сборку с первым свободным именем вида «Сборка N» и сразу открывает её.

Справа карточка в Flickable, потому что может не поместиться по высоте:

  • название и адрес сервера (LabelledField);
  • версия Minecraft. Это не выпадающий список, а поле, которое открывает VersionPickerDialog: версий около тысячи, и выбирать их удобнее в окне с категориями и поиском;
  • четыре строки LoaderRow: 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 и обновляет строку комплектности: установка могла закончиться, пока окно открыто.


При создании этого документа использовался ИИ.