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

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

## Свойства

Список разрешений экрана, доступных для прямой установки одной кнопкой:

    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`:

    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 "горизонтальном контейнере" помещаются так:

    ... = [
        [
            ['btn', ...],
            ['str', ...],
            ['btn', ...],
        ]
    ]

## Пустота

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

    ... = [
        [...],
        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"`

    var_name = 123
    # "Value of var_name = [var_name]" -> "Value of var_name = 123"

После кода можно поставить `!` и набор символов, которые определённым образом изменят его результат:

- `t` - перевод `"['text to translate'!t]:"` -> `_('text to translate') + ":"`,
- `i` - повторная (двойная) интерполяция (интерполяция результата интерполяции):

    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`.

Далее ->
<- Назад