Skip to content

Архитектура

На этой странице рассматриваются некоторые важные части libtuner и Tuner, которые полезно учитывать при создании плагинов.

Дерево объектов

Тюнер использует собственную структуру дерева объектов, которая несовместима со структурой Gtk.Widget. Это блокирует использование функции template в Gtk.Builder.

Tuner.Widget и Tuner.Binding

Все элементы интерфейса создаются с помощью Tuner.Widget. Некоторые виджеты не работают без присвоения им свойства binding. Tuner.Привязка — это простой инструмент, который привязывает определенное свойство виджета (например, active во внутреннем виджете Tuner.Switch) к требуемому бэкенду.

В следующем примере создаётся Tuner.Switch с привязкой к Tuner.Setting, который реализует бэкенд GSettings. Когда приложение запустится, будет создан Adw.SwitchRow, и свойство active будет привязано к ключу allow-volume-above-100-percent. Это позволит изменить свойство active в Adw.SwitchRow для изменения значения GSettings, также при независимом изменении значения GSettings, переключение будет синхронизировано.

blp
Tuner.Switch {
    title: _("Over Amplification");

    binding: Tuner.Setting {
        schema-id: "org.gnome.desktop.sound";
        schema-key: "allow-volume-above-100-percent";
    }
}

Система объединения и приоритетов

Система объединения в Тюнере позволяет расширить интерфейс уже существующих плагинов за счёт других плагинов.

В Tuner есть разные приоритеты — плагинов (plugin priority), страниц (page priorirty) и групп (group priority).

  • Приоритет плагинов (plugin priority) определяет порядок, в котором они загружаются. Если два плагина попытаются добавить Tuner.Page с одинаковым tag, плагин с более высоким приоритетом будет указывать всю информацию о странице (icon, title и другое). Их содержимое будет объединено. Кроме того, если плагин с более высоким приоритетом не устанавливает значок, можно использовать значок из плагина с более низким приоритетом, если он у него есть.

  • Приоритет страниц (page priority) определяет порядок расположения страниц в боковой панели. Чем ниже приоритет, тем выше будет отображаться страница в списке. Это не относится к внутренним страницам.

  • Tuner.Group имеют собственные приоритеты, которые определяют порядок в списке групп. Группа с низким приоритетом будет отображаться выше в интерфейсе страницы. Группы также обладают свойством tag, если две группы имеют одинаковый tag, они будут объединены, виджеты из группы с более высоким приоритетом плагина будут располагаться выше в интерфейсе результирующей группы.

For example, this system allows Tweaks and Panel plugins to exist separately and independently. Например, эта система позволяет плагинам Расширенных настроек (Tweaks) и Панельного режима (Panel) существовать отдельно и независимо друг от друга.

Загружен только плагин Панельного режима (Panel)

Плагин Панельного режиима (Panel) устанавливает свой собственный значок для строки.

Загружен только плагин Панельного режима (Panel)

Загружен только плагин Расширенных настроек (Tweaks)

Плагин Расширенных настроек (Tweaks) устанавливает свой собственный значок для строки.

Загружен только плагин Расширенных настроек (Tweaks)

Расширенные настройки (Tweaks) и Панельный режим (Panel) загружены вместе

The icon for the row is set using the Tweaks plugin since it has higher priority. Значок для строки устанавливается с плагином Расширенных настроек (Tweaks), поскольку он имеет более высокий приоритет.

Their content was merged and despite the fact that the panel plugin had a lower priority, the group from the panel plugin turned out to be higher because the priority of this group was lower than the priority of the groups from the tweaks plugin. Их содержимое было объединено, и, несмотря на то, что плагин Панельного режима (Panel) имел более низкий приоритет, его группа оказалась выше, потому что приоритет этой группы был ниже, чем приоритет групп из плагина Расширенных настроек (Tweaks).

Расширенные настройки (Tweaks) и Панельный режим (Panel) загружены вместе

Опубликовано под лицензией GPL-3.0+. Содержание доступно по лицензии CC BY-SA 4.0, если не указано иное.