Спустя некоторое время возвращаюсь к теме примеров и уроков по языку Vala.
Для создания графического интерфейса многие программисты используют Gtk.
Gtk окна састоят из самых разных
виджетов. И переключатели и кнопик и окна - всё еаследуется от этого класса. В Gtk как правило не надо явно указывать в какой точке должен находится тот или иной виджет и какого он размера. Достаточно просто описать как виджеты связаны друг с другом. Можно вспомнить hello world
using Gtk;
int main (string[] args) {
Gtk.init (ref args);
var window = new Window (); // создаём окно
window.title = "First GTK+ Program";
window.border_width = 10;
window.window_position = WindowPosition.CENTER;
window.set_default_size (350, 70);
window.destroy.connect (Gtk.main_quit);
var button = new Button.with_label ("Click me!");
button.clicked.connect (() => {
button.label = "Thank you";
});
window.add (button); // указываем что внутри окна должна быть кнопка
window.show_all ();
Gtk.main ();
return 0;
}
Класс Window унаследован от абстрактного класса Bin, который может содержать только один виджет. А что, если нам нужно добавить в окно несколько кнопок? Рассмотрим следующий
пример.
spin_box = new SpinButton.with_range (0, 130, 1); // создаём несколько виджетов
slider = new Scale.with_range (Orientation.HORIZONTAL, 0, 130, 1);
var hbox = new Box (Orientation.HORIZONTAL, 5); // создаём контейнер спосбный хранить несколько виджетов
hbox.add (spin_box); // добавляем виджеты в контейнер
hbox.add (slider);
add (hbox); // добавляем контейнер в окно
Существует несколько контейеров. К примеру
Box позволяет расположить элеметы управления один за другим строго по горизонтали либо по вертикали, а
FlowBox позволяет создать нечто вроде таблицы, в которой виджеты будут переносится на новую строку, если им не хватает места. Вам не нужно об этом волноватся об этом, Gtk сделает это самостоятельно.
Как быть если какой-то виджет не влезает на экран? Специально для таких целей существует
ScrolledWindow. Вот
пример.
Иногда возникает ситуация, когда нужно поместить какой-то достаточно длинный текст на кнопку или метку. В этом случае возникает проблема - невозможно уменьшить размер окна, если какой то виджет не влазит. Как быть в этом случае? У Label есть нужеое нам
свойство. А как быть с кнопкой? Возможно, вы уже обратили внимание, что кнопка унаследована от Bin. Это означает, что кнопка содержит внутри себя виджет. Но как узнать какого он типа? У Bin есть один единственный метод, позволяющий получить этот виджет. А взяв виджет можно узнать его тип
using Gtk;
void main(string[] args) {
Gtk.init(ref args);
var b = new Button.with_label("Click me (0)");
stdout.printf(@"$(b.get_child().get_type().name())\n");
}
Собирав и запустив полуаем результат
GtkLabel
Значит точно так же можно уменьшить размер кнопки -
((Gtk.Label)button.get_child()).ellipsize = Pango.EllipsizeMode.END;
Спасибо за внимание.