## Стили элементов

Настрока стилей (просто набора свойств, а не объектов класса `Style`), используемых в настройках, описывается в статье
[Настройка интерфейса (gui)](./Интерфейс-(gui)).

***

## Свойства

Список разрешений экрана, доступных для прямой установки одной кнопкой:  
```python
k = get_from_hard_config("window_w_div_h", float)
preferences.resolutions = tuple((i, int(i/k)) for i in (640, 960, 1200, 1366, 1920))
```

Время (в минутах), которое можно устанавливать для автосохранения (`0` - отключить автосохранение):  
`preferences.autosave_times = (0.5, 1, 2, 3, 5, 7, 10, 15, 0)`

***

## Разделы

Список разделов инициализируется так:  
`preferences.tabs = ['Screen', 'Sounds', 'Other', 'Language']`

Добавить новый раздел `RPG`, чтобы добавить туда потом РПГ-настройки:  
`preferences.tabs.append('RPG')`

Раздел, открываемый по умолчанию:  
`preferences.tab = preferences.tabs[0]`

***

## Система элементов

Система элементов экрана настроек позволяет добавлять/менять/удалять настройки
без необходимости полностью переписывать скрин настроек.  
Эта система может показаться запутанной или переусложнённой, но она гораздо лучше того, что было до этого,
и позволяет за несколько десятков строк описать то, что на языке скринов занимало в 10 раз больше места.

Пример создания списка из 1 элемента в созданном выше разделе настроек `RPG`:
```python
preferences.content['RPG'] = [
	[['bool', '["Usual moving - run"!t]', Function(getattr, config, 'default_moving_is_run'), ToggleDict(config, 'default_moving_is_run')]],
]
```

Используется 2 квадратные скобки подряд:
первая отвечает за элемент `hbox` (размещает элементы горизонтально друг за другом),
в котором находится `bool`-элемент.  
В данном примере в `hbox`-контейнере находится лишь 1 элемент, и поэтому это выглядит странно,
но так бывает далеко не всегда.

Несколько элементов в 1 "горизонтальном контейнере" помещаются так:
```python
... = [
	[
		['btn', ...],
		['str', ...],
		['btn', ...],
	]
]
```

***

## Пустота

Иногда нужно сделать отступ между `hbox`-контейнерами.  
Тогда межну ними нужно поместить `None` (без квадратных скобок):

```python
... = [
	[...],
	None,
	[...],
]
```

***

## Строка

Элемент строки может содержать от 2 до 5 параметров:  
`['str', 'Your text', text_size = -1, xsize = -1, text_align = 'left']`

Обязательные параметры:
* `'str'` - означает, что этим элементом является строка,
* `'Your text'` - ваш текст.

Необязательные параметры:
* `text_size = -1` - размер текста (`-1` - auto),
* `xsize = -1` - ширина текстового поля (`-1` - auto),
* `text_align = 'left'` - выравнивание текста по горизонтали в текстовом поле.

***

## Логическое

Логический элемент (да/нет или включено/выключено) содержит 4 параметра:  
`['bool', 'Your text', function_for_get, function_for_set]`

Все параметры являются обязательными:
* `'bool'` - означает, что это логический переключатель,
* `'Your text'` - текст кнопки-переключателя,
* `function_for_get` - функция для получения текущего значения (без аргументов),
* `function_for_set` - функция для смены значения на противоположное текущему (без аргументов).

***

## Кнопка

`['btn', 'Your text', for_get, function_for_set, size = (100, 25)]`

Параметры:
* `'btn'` - означает, что этот элемент - кнопка,
* `'Your text'` - текст вашей кнопки,
* `for_get` - параметр, нужный для (не) выделения кнопки, принимает 1 из вариантов:
	+ `None` - никогда не выделять,
	+ `(function_for_get, result)` - кортёж из 2 элементов: функция для получения текущего значения и значение,
		при котором кнопку нужно выделить.
* `function_for_set` - фунция, выполняемая при нажатии,
* `size = (100, 25)` - размер кнопки (единственный необязательный параметр).

***

## Полоса

Горизонтальная полоса (bar) используется, например, для отображения громкости звуковых микшеров:  
`['bar', 'Your text', obj, 'prop', min_value, max_value, function_for_minus, function_for_plus]`

На самом деле это сразу 4 элемента:
строка с названием, кнопка для уменьшения, изображение полосы и кнопка для увеличения.

Все параметры обязательны:
* `'bar'` - означает, что этот элемент - полоса,
* `'Your text'` - текст для строки,
* `obj` - объект (или `dict`), у которого берётся свойство `prop` (`None` для глобального пространства имён),
* `'prop'` - название свойства или метода, которые берутся у объекта `obj` для получения текущего значения,
* `min_value` - минимально возможное значение (полоса пуста),
* `max_value` - максимально возможное значение (полоса заполнена),
* `function_for_minus` - функция для уменьшения значения (должна проверять, что значение не будет меньше минимального),
* `function_for_plus` - функция для увеличения значения (должна проверять, что значение не будет больше максимального).

***

## Функция как контейнер с элементами

Иногда требуется динамически определять, какие элементы должны отображаться в меню настроек.  
Для этого вместо контейнера элементов (`hbox`) нужно указать функцию, которая будет возвращать список этих контейнеров
в любом количестве с любыми наборами элементов.

***

## Функция для текста

Любой элемент вместо текста может принимать функцию, которая будет динамически возвращать нужный текст.

***

## Тэги текста для интерполяции

В квадратных скобках можно указать код (например, имя переменной), результат которого будет вставлен в текст:  
`"start [your code] end"` -> `"start " + str(eval(your code)) + " end"`
```python
var_name = 123
# "Value of var_name = [var_name]" -> "Value of var_name = 123"
```

После кода можно поставить `!` и набор символов, которые определённым образом изменят его результат:
* `t` - перевод `"['text to translate'!t]:"` -> `_('text to translate') + ":"`,
* `i` - повторная (двойная) интерполяция (интерполяция результата интерполяции):
```python
who = "Name"
welcome = "Hello, [who]!"
# "[welcome!i]" -> "Hello, Name!"

translate russian strings:
	old "Hello, [who]!"
	new "Привет, [who!t]!"
	old "Name"
	new "Имя"
# "[welcome!ti]" -> "Привет, Имя!"
```
* `q` - экранировать символ `{` (чтобы он не воспринимался как открытие тэгов вроде `{b}` или `{color}`),
* `[[` - экранизация для символа `[`, чтобы не делать интерполяцию: `[[var_name!t]`.

Символы для изменения регистра символов (только для англ. символов):
* `u` - от upper, перевести символы в верхний регистр,
* `l` - от lower, перевести символы в нижний регистр,
* `c` - от capitalize, перевести первый символ в верхний регистр, а остальные - в нижний.

***

Примеры использования лучше будет смотреть напрямую в `Ren-Engine/rpy/screens/preferences.rpy`.

***

[Далее ->](./Горячие-клавиши)  
[<- Назад](./Настройка-паузы)
