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