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 и обновляет строку комплектности: установка
могла закончиться, пока окно открыто.
При создании этого документа использовался ИИ.