# SeasonalBuildsDialog.qml Каталог сезонных сборок с сервера лаунчера. Таблица показывает всё, что нужно, чтобы решить, ставить сборку или нет. Остальное делает одна кнопка: создаёт запись сборки, ставит версию игры, модлоадер и Java и раскладывает файлы. Как это устроено, описано в [LauncherBackend](../cpp/LauncherBackend.md#сезонные-сборки). Открывается из [Main](Main.md) кнопкой в правом нижнем углу (`openCatalog()`). ## Свойства | | | |---|---| | `backend` (required) | `LauncherBackend` | | `selectedId` | выбранная строка, по `id` сборки | | `columns` | описание колонок: ключ, заголовок, ширина, выравнивание | Выбранная строка хранится по `id`, а не по индексу: список может обновиться, пока окно открыто, и индекс начал бы указывать на другую сборку. ## Таблица Колонки: название, версия, модлоадер с версией, число модов, начало и конец сезона, статус («не установлена», «установлена», «доступно обновление»). Ширины заданы в одном месте, `columns`, и их используют и шапка, и строки. Таблица собрана из `Row` с колонками фиксированной ширины, а не из `TableView`. В проекте нет ни одной модели на `QAbstractItemModel`, строки приходят из C++ готовыми `QVariantMap`, и заводить модель ради семи колонок не стоит. Строки приходят уже отсортированными и сведёнными с локальными записями: окно ничего не считает. Пустой список и ошибка сервера выглядят одинаково пусто, поэтому причина пишется прямо на месте строк: «загрузка…», «сборок пока нет» или текст `seasonalCatalogError` красным. Под таблицей описание выбранной сборки, ревизия, размер архива и установленная ревизия, если она есть. Описания длинные и в таблицу не помещаются, а решение принимают как раз по ним. ## Кнопки - **Обновить список** — `refreshSeasonalCatalog(true)`, мимо кэша. Выключена, пока идёт загрузка. - **Установить / Обновить** — `installSeasonalBuild(id)`. Подпись зависит от `updateAvailable`. Выключена, пока лаунчер чем-то занят (`busy`): установка занимает и панель загрузки, и `.minecraft` целиком. Двойной щелчок по строке делает то же, что кнопка установки. Каталог обновляется при каждом открытии окна (`refreshSeasonalCatalog(false)`). Свежий кэш отвечает без сети. Окно закрывается по Esc и щелчку мимо него и во время установки: отменить установку можно только на панели загрузки главного окна, которую модальное окно перекрывает. Установка при закрытии окна продолжается. --- При создании этого документа использовался ИИ.