2 августа 2009 г.

Группирование кнопок

При добавлении в окно программы нескольких кнопок возникает вопрос о их расположении. Для того, чтобы упростить программистам работу в GTK+ существует класс GtkButtonBox, подклассами которого являются горизонтальный контейнер GtkHButtonBox и вертикальный GtkVButtonBox. В стандартной теме Ubuntu кнопки имеют большой размер, поэтому на скриншоте это выглядит не очень красиво.


На этом скриншоте представлены все шесть типов расположения кнопок в горизонтальном контейнере.

  • Gtk::BUTTONBOX_DEFAULT_STYLE - стиль по умолчанию, соответствует Gtk::BUTTONBOX_EDGE

  • Gtk::BUTTONBOX_SPREAD - равные расстояния между кнопками, такое же расстояние между первой/последней кнопкой и границей виджета

  • Gtk::BUTTONBOX_EDGE - первая/последняя кнопки прижимаются к границам виджета, остальные располагаются равноудалённо друг от друга

  • Gtk::BUTTONBOX_START - все кнопки прижимаются к левой/верхней границе виджета

  • Gtk::BUTTONBOX_END - все кнопки прижимаются к правой/нижней границе виджета

  • Gtk::BUTTONBOX_CENTER - кнопки располагаются по центру виджета


Тип размещения устанавливается методом set_layout(), а добавление - методом add(). Для вертикального контейнера все действия аналогичны.

Полный код программы:

<?php
 
$window = new GtkWindow();
$window->set_position(Gtk::WIN_POS_CENTER);
$window->set_size_request(450, -1);
$window->connect_simple('destroy', array('Gtk', 'main_quit'));
 
$hbox_main = new GtkHBox();
$hbox_main->pack_start($vbox = new GtkVBox(), TRUE, TRUE, 5);
 
$array = array(
'Default Style' => Gtk::BUTTONBOX_DEFAULT_STYLE,
'Spread' => Gtk::BUTTONBOX_SPREAD,
'Edge' => Gtk::BUTTONBOX_EDGE,
'Start' => Gtk::BUTTONBOX_START,
'End' => Gtk::BUTTONBOX_END,
'Center' => Gtk::BUTTONBOX_CENTER
);
 
foreach ($array as $key => $value)
{
$box = new GtkHButtonBox();
$box->set_layout($value);
$box->add(GtkButton::new_from_stock(Gtk::STOCK_YES));
$box->add(GtkButton::new_from_stock(Gtk::STOCK_CANCEL));
$box->add(GtkButton::new_from_stock(Gtk::STOCK_NO));
$frame = new GtkFrame($key);
$frame->set_shadow_type(Gtk::SHADOW_IN);
$frame->add($box);
$vbox->pack_start($frame, FALSE, FALSE, 5);
}
 
$window->add($hbox_main);
$window->show_all();
Gtk::main();
 
?>

4 комментария:

shirokoff комментирует...

А если кнопки не входят по ширине можно ли реализовать прокрутку кнопок, чтобы увидеть скрытую с одной стороны кнопку ценой сокрытия кнопки с другой стороны?

Shecspi комментирует...

Я недавно встретил необходимость реализовать подобный функционал, на пока не знаю, как это сделать. Но такая возможность имеется, пример служит файловый менеджер Nautilus.

shirokoff комментирует...

http://nautilus.sourcearchive.com/documentation/2.8.2-2/nautilus-switchable-navigation-bar_8c-source.html

в строке 222 комментарий
помоему под ним есть реализация сокращений в хлебных крошках, может ошибаюсь, но пробовал разобраться, что-то не получается, с си не знаком.

Существуют ли учебники или справочники на русском по php-gtk?

Shecspi комментирует...

Я попробую покопаться поглубже в этом вопросе, если что-то найду - напишу соответствующую статью.
По поводу учебника. Насколько мне известно, мой блог является единственным в русскоязычном сегменте интернета на тему PHP-GTK.