90 lines
6.2 KiB
Markdown
90 lines
6.2 KiB
Markdown
|
|
# DarkCombo
|
||
|
|
|
||
|
|
## Обзор компонента
|
||
|
|
|
||
|
|
`Minecraft_launcher` — десктопный лаунчер Minecraft на Qt Quick. Всё окно оформлено вручную в
|
||
|
|
тёмной теме, а стиль Qt Quick Controls принудительно выставлен в `Basic` (`main.cpp`), потому что
|
||
|
|
нативные стили игнорируют пользовательские `contentItem` и `background`. Из-за этого каждый
|
||
|
|
стандартный элемент управления, попадающий в интерфейс, приходится переопределять самому.
|
||
|
|
|
||
|
|
`DarkCombo` — как раз такое переопределение: выпадающий список в общем тёмном стиле окна.
|
||
|
|
Компонент не добавляет логики, он целиком про внешний вид — фон, рамку, стрелку, делегат строки и
|
||
|
|
всплывающую панель. К нему обращаются всюду, где нужен выпадающий список внутри диалогов: выбор
|
||
|
|
версии модлоадера, выбор Java, поля в настройках.
|
||
|
|
|
||
|
|
## Место в проекте и зависимости
|
||
|
|
|
||
|
|
Импортирует `QtQuick` и `QtQuick.Controls 2.15`; собственных C++-типов не использует.
|
||
|
|
|
||
|
|
Объявлен в `QML_FILES` модуля `Minecraft_launcher` (см. `CMakeLists.txt`), поэтому доступен по
|
||
|
|
имени `DarkCombo` в любом файле того же модуля без явного импорта.
|
||
|
|
|
||
|
|
Используется в [LoaderRow](LoaderRow.md) — список версий модлоадера — и дважды в [Main](Main.md):
|
||
|
|
в выпадающих списках профиля и сборки на главном окне.
|
||
|
|
|
||
|
|
Компонент ссылается на ресурсы `images/Profile_Box/Asset_23.svg` и
|
||
|
|
`images/Profile_Box/Asset_24.svg` — они перечислены в `RESOURCES` того же QML-модуля, отдельного
|
||
|
|
подключения не требуют.
|
||
|
|
|
||
|
|
## Иерархия и роль
|
||
|
|
|
||
|
|
Корневой тип — `ComboBox` из Qt Quick Controls. Всё поведение (модель, `currentIndex`,
|
||
|
|
`activated`, `displayText`, клавиатурная навигация) наследуется без изменений; `DarkCombo`
|
||
|
|
переопределяет только четыре визуальных слота базового типа:
|
||
|
|
|
||
|
|
| Слот | Что даёт `DarkCombo` |
|
||
|
|
|------|----------------------|
|
||
|
|
| `indicator` | стрелка из SVG-ресурса вместо двойного шеврона Basic-стиля; при открытом списке (`down`) картинка меняется |
|
||
|
|
| `contentItem` | текст текущего значения белым, с обрезкой справа многоточием и отступом под стрелку |
|
||
|
|
| `background` | тёмный прямоугольник со скруглением 6 px; рамка подсвечивается акцентным цветом при фокусе |
|
||
|
|
| `delegate` | строка списка: белый текст, подсветка фона у элемента под курсором |
|
||
|
|
| `popup` | всплывающая панель шириной с сам комбобокс, высотой не более 220 px, с вертикальным индикатором прокрутки |
|
||
|
|
|
||
|
|
## Свойства
|
||
|
|
|
||
|
|
Собственных свойств компонент не объявляет — доступен весь набор свойств `ComboBox`
|
||
|
|
(`model`, `currentIndex`, `currentText`, `displayText`, `editable` и прочие).
|
||
|
|
|
||
|
|
Внутри `delegate` объявлены два обязательных свойства делегата, они относятся к строке списка,
|
||
|
|
а не к самому комбобоксу:
|
||
|
|
|
||
|
|
| Свойство | Тип | По умолчанию | Обязательное | Описание |
|
||
|
|
|----------|-----|--------------|--------------|----------|
|
||
|
|
| `modelData` | `var` | — | **Да** | Значение строки модели; выводится текстом в строке списка. Модель ожидается плоской — списком строк, а не объектов. |
|
||
|
|
| `index` | `int` | — | **Да** | Позиция строки; сравнивается с `highlightedIndex` комбобокса, чтобы подсветить строку под курсором. |
|
||
|
|
|
||
|
|
## Сигналы
|
||
|
|
|
||
|
|
Собственных сигналов нет. Наследуются сигналы `ComboBox`, из которых на практике используется
|
||
|
|
`activated(int index)` — выбор строки пользователем (в отличие от `currentIndexChanged`, он не
|
||
|
|
срабатывает при программной смене значения).
|
||
|
|
|
||
|
|
## Методы
|
||
|
|
|
||
|
|
Собственных функций нет.
|
||
|
|
|
||
|
|
## Взаимодействие с другими компонентами
|
||
|
|
|
||
|
|
Компонент самодостаточен и ничего не знает ни о бэкенде, ни о родителе: модель приходит извне
|
||
|
|
через `model`, результат выбора родитель получает через унаследованный `activated`. Так,
|
||
|
|
[LoaderRow](LoaderRow.md) передаёт в `model` список подписей версий модлоадера и в обработчике
|
||
|
|
`activated` переводит индекс обратно в номер версии.
|
||
|
|
|
||
|
|
Поскольку модель ожидается списком строк, вызывающий код обычно сам приводит массив объектов к
|
||
|
|
массиву подписей перед присваиванием.
|
||
|
|
|
||
|
|
## Пример использования
|
||
|
|
|
||
|
|
```qml
|
||
|
|
DarkCombo {
|
||
|
|
width: 200
|
||
|
|
height: 32
|
||
|
|
model: ["1.21.1", "1.20.6", "1.20.4"]
|
||
|
|
onActivated: (index) => console.log("выбрано:", model[index])
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
При создании этого документа использовался ИИ.
|