Экран настроек - TrueCat17/Ren-Engine GitHub Wiki
Настрока стилей, используемых в настройках, описывается в статье Настройка интерфейса (стили).
Настройка простых gui
-свойств - в статье
Настройка интерфейса (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
- множитель для размера текста относительноstyle.menu_text.text_size
, -
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 = (5, 1)]
Параметры:
-
'btn'
- означает, что этот элемент - кнопка, -
'Your text'
- текст вашей кнопки, -
for_get
- параметр, нужный для (не) выделения кнопки, принимает 1 из вариантов:-
None
- никогда не выделять, -
(function_for_get, result)
- кортёж из 2 элементов: функция для получения текущего значения и значение, при котором кнопку нужно выделить.
-
-
function_for_set
- фунция, выполняемая при нажатии, -
size = (5, 1)
- соотношение ширины к высоте кнопки, а также множитель к высоте относительноstyle.[prefs_]menu_button.ysize
(единственный необязательный параметр, значение по умолчанию берётся изgui.prefs_std_btn_params
).
Горизонтальная полоса (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
.