Пытаясь научиться разрабатывать приложения с графическим интерфейсом с помощью Gtk и Vala, я не смог найти много ресурсов, документирующих эту особенность языка, поэтому я решил собрать свои выводы здесь.

Введение

Язык программирования Vala имеет простую нотацию для взаимодействия с файлами пользовательского интерфейса Gtk (например, сгенерированными в Glade). Он использует языковые атрибуты, которые заставляют Vala генерировать код для привязки к объектам, на которые есть ссылки в вашем шаблоне. Это заботится о большей части шаблонного кода, связанного с аналогичным подходом с использованием Gtk Builder.

Ссылка на ваш файл шаблона

Чтобы работать с шаблонами, вы должны сначала использовать атрибут [GtkTemplate], чтобы сообщить Vala, какой шаблон использовать. Для этого вам нужно создать класс, соответствующий элементу шаблона вашего файла пользовательского интерфейса. Например, если ваш файл выглядит следующим образом…

<template class=”Window” parent="GtkApplicationWindow">...

… тогда ваш связанный код Vala будет выглядеть так.

[GtkTemplate (ui = "/resource/path/to/your/template.ui")]
class Window : Gtk.ApplicationWindow {...}

Теперь вы сможете запустить свое приложение и увидеть, что оно показывает дизайн из вашего шаблона.

Примечание. Классы, указанные в шаблоне, должны включать все пространства имен, в которых находятся эти классы (например, если ваш класс Bar находится в пространстве имен Foo, ваш шаблон должен указывать класс как FooBar.

Примечание. Путь к шаблону в примере — это путь к ресурсу, который использует GResource Framework.

Доступ к объектам из вашего шаблона

Чтобы получить доступ к объектам, определенным в вашем шаблоне, вам нужно определить их как членов вашего класса и сообщить Vala, что объект взят из шаблона с использованием атрибута [GtkChild]. Например, если ваш шаблон содержит объект GtkEntry с id из Foo, вот так...

<object class="GtkEntry" id="Foo">...</object>

Затем, если вы хотите получить доступ к его содержимому, это будет выглядеть следующим образом…

[GtkTemplate (ui = "/resource/path/to/your/template.ui")]
class Window : Gtk.ApplicationWindow {
  [GtkChild]
  private Gtk.Entry Foo;
  public string get_foo () {
    return Foo.text;
  }
  ...
}

Если вы хотите получить доступ к нескольким объектам, просто дайте им уникальный идентификатор и добавьте перед ними атрибут [GtkChild].

Обработка сигналов, определенных в вашем шаблоне

Вероятно, вы также захотите обрабатывать сигналы, поступающие от объектов вашего шаблона. К счастью, это так же просто, как ссылаться на объекты с помощью атрибута [GtkCallback]. Допустим, у вас есть GtkButton, у которого есть обратный вызов для сигнала clicked, как показано ниже...

<object class="GtkButton" id="Bar">
  <signal name="clicked" handler="on_bar_clicked" .../>
</object>

…тогда вы можете определить функцию обратного вызова с помощью…

[GtkCallback]
private void on_bar_clicked (Gtk.Button source) {
  ...
}

Ресурсы

https://wiki.gnome.org/Projects/Vala/Documentation — обратите внимание на раздел Начало работы.

https://wiki.gnome.org/Projects/Vala/Manual/Attributes — см. атрибуты Gtk.