Пытаясь научиться разрабатывать приложения с графическим интерфейсом с помощью 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.