27 мая 2009 г.

Перемещение частей окна.

В PHP-GTK 2 имеется возможность любой виджет сделать перемещаемым. Эти виджеты слева помечаются вертикальными точками, если в программе не указано иного. Это выглядит так:



Для этого используется контейнер GtkHandleBox(), который перемещается вместе с отображаемым в нём дочерним виджетом:
$handlebox = new GtkHandleBox();



Для добавления виджета в контейнер используется метод add():
$handlebox->add(new GtkLabel("Текстовая строка"));


Вот и всё. Сделаю одно маленькое замечание. В коде, приведённом ниже, для панели инструментов я явно указал размеры (set_size_request()), иначе при отрывании от окна она свернётся до возможного минимума.

Полный код программы:
<?php
 
$window = new GtkWindow();
$window->set_position(Gtk::WIN_POS_CENTER);
$window->set_size_request(400, -1);
$window->connect_simple('destroy', array('Gtk', 'main_quit'));
$vbox = new GtkVBox();
 
$handlebox1 = new GtkHandleBox();
$handlebox2 = new GtkHandleBox();
 
$toolbar = new GtkToolbar();
$toolbar->set_size_request(400, -1);
$open = GtkToolButton::new_from_stock(Gtk::STOCK_OPEN);
$close = GtkToolButton::new_from_stock(Gtk::STOCK_CLOSE);
$toolbar->insert($open, -1);
$toolbar->insert($close, -1);
 
$handlebox1->add($toolbar);
$handlebox2->add(new GtkLabel("Текстовые строки тоже\nвозможно оторвать от окна"));
 
$vbox->pack_start($handlebox1, FALSE, FALSE);
$vbox->pack_start($handlebox2, FALSE, FALSE);
$window->add($vbox);
$window->show_all();
Gtk::main();
 
?>
 

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

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

Хотелось бы узнать, есть ли возможность поместить такой контейнер например в правй нижний угол экрана.
и еще:
Эти виджеты слева помечаются вертикальными точками, если в программе не указано иного
как можно убрать эти точки или вообще изменить вид?

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

У меня сейчас нет компьютера под рукой и в ближайшее время не будет, поэтому конкретный код дать не смогу, только опишу алгоритм.
1 вопрос) Можно при упаковке в 'родительский' контейнер использовать pack_end(), вместо pack_start(). Этот метод поместит 'дочерний' виджет в самый конец 'родителя' (нижняя или правая сторона, в зависимости от типа 'родителя').
2 вопрос) По моему, убрать точки нельзя, можно только изменить их местоположение - метод set_snap_edge().