В этом приложении, как и в предыдущих примерах, создается главное окно с обработчиком события. Затем формируется список с двумя колонками, дизайн которого следует паттерну Модель-Вид-Контроллер (Model-View-Controller — MVC); класс
Gtk::ListStore
(модель) имеет две колонки типа
String
.
Далее создается виджет
Gtk::TReeView.
Класс
Gtk::treeViewColumn
конфигурирует эту колонку. Первая колонка называется «Destination», а для отображения клеток применяется класс рисовальщика
Gtk::CellRendererText
. Первая колонка модели (с номером 0) —
Gtk::ListStore
— служит значением текстового свойства. Итак, рисовальщики клеток наполняют древесную модель данными. В GTK+ 2.x есть несколько готовых рисовальщиков клеток, в том числе
Gtk::CellRendererText
,
Gtk::CellRendererPixbuf
и
Gtk::CellRendererToggle
. Далее в список добавляются три строки данных и устанавливается обработчик события
"changed"
, который будет вызываться, когда пользователь выберет другую строку. Этот обработчик изменит значение переменной
@city
, записав в нее текст из первой колонки только что выбранной строки.
Затем создается простой флажок (
Gtk::CheckButton
) и кнопка (
Gtk::Button
). Обработчик события нажатия кнопки вызовет метод
cmd_purchase
. Метка
@result
первоначально пуста, но позже в нее будет записана строка, определяющая вид заказанного билета.
Три переключателя создаются как члены одной группы, то есть в любой момент может быть выбран лишь один из них. Когда пользователь щелкает по любому переключателю, равнее выбранный сбрасывается. Первым параметром конструктору переключателя передается первый переключатель из той же группы. Поэтому у конструктора первого переключателя в группе этого параметра нет, а остальным передается ссылка на первый переключатель.
Виджеты нужно организовать на экране так, чтобы пользователю было удобно. Мы воспользовались комбинацией контейнеров
Gtk::НВох
и
Gtk::VBox
. Список расположен над флажком. Все три переключателя расположены вертикально справа от списка. А кнопка помещена под всеми остальными виджетами.
Метод
cmd_purchase
очень прост: он строит строку, отражающую состояние всех виджетов в момент нажатия кнопки. У переключателей и флажков есть метод
active?
, который возвращает
true
, если виджет отмечен. Построенная строка записывается в метку
@result
и потому появляется на экране.
Во многих приложениях интерфейс содержит меню. В следующем примере показано, как можно организовать меню в Ruby/GTK2. Заодно демонстрируется применение всплывающих подсказок — мелкая деталь, способная украсить любую программу.
В листинге 12.8 создается главное окно с меню, содержащим пункт