10 июня 2009 г.

Полосы прокрутки

Думаю, не стоит объяснять, что из себя представляют полосы прокрутки. Мы все ежедневно имеем с ними дело, например, листая HTML-страницу в браузере или длинный текстовый документ.
На представленном ниже скриншоте область с возможностью прокрутки располагается в правой верхней панели. В данный момент виден только вертикальный скролл, т.к. в программе установлено появление полос только при необходимости, т.е. когда содержимое выходит за пределы области виджета.



В PHP-GTK за полосы прокрутки отвечает специальный класс - GtkScrolledWindow.
$scroll = new GtkScrolledWindow;


С помощью метода set_policy() указываются правила появления полос прокрутки. Первым параметром назначаются правила для горизонтального скролла, вторым - для вертикального. Оба параметра являются обязательными. Они могут принимать любое из трёх значений:

  • Gtk::POLICY_ALWAYS - полоса прокрутки видна всегда;

  • Gtk::POLICY_NEVER - полоса прокрутки никогда не показывается;

  • Gtk::POLICY_AUTOMATIC - полоса прокрутки появляется автоматически при необходимости.


$scroll->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);


Для добавления содержимого в область прокрутки имеется два метода:

  • add() - используется в том случае, если у добавляемого виджета имеется встроенная поддержка прокручивания. К таким виджетам относится GtkTreeView, который будет рассматриваться в дальнейшем.

  • add_with_viewport() - используется, если виджет не поддерживает прокрутку. Это такие виджеты, как GtkLabel, GtkButton и т.д..


$vbox = new GtkVBox;
for ($i = 1; $i<= 10; $i++)
{
$vbox->pack_start(new GtkButton('Кнопка '.$i));
}
$scroll->add_with_viewport($vbox);


Полный код программы:
<?php
 
$window = new GtkWindow();
$window->set_size_request(400, 200);
$window->connect_simple('destroy', array('Gtk', 'main_quit'));
 
$hpaned = new GtkHPaned;
$vpaned = new GtkVPaned;
 
$left = new GtkFrame;
$left->set_shadow_type(Gtk::SHADOW_IN);
$left->add(new GtkLabel('Левая панель'));
 
$right_top = new GtkFrame;
$right_top->set_shadow_type(Gtk::SHADOW_IN);
$vbox = new GtkVBox;
for ($i = 1; $i<= 10; $i++)
{
$vbox->pack_start(new GtkButton('Кнопка '.$i));
}
$scroll = new GtkScrolledWindow;
$scroll->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
$scroll->add_with_viewport($vbox);
$right_top->add($scroll);
 
$right_bottom = new GtkFrame;
$right_bottom->set_shadow_type(Gtk::SHADOW_IN);
$right_bottom->add(new GtkLabel('Правая нижняя панель'));
 
$vpaned->add1($right_top);
$vpaned->add2($right_bottom);
 
$hpaned->add1($left);
$hpaned->add2($vpaned);
 
$window->add($hpaned);
$window->show_all();
Gtk::main();
 
?>

Комментариев нет: