29 мая 2009 г.

Диалоговые окна

Диалоговое окно - специальное окно, извещающее пользователя о каком-либо событии и ожидающее его ответа. В PHP-GTK диалоговые окна состоят из двух частей: верхняя - vbox, в ней располагается сообщение; и нижняя - action_area, в ней располагаются кнопки. По умолчанию, между частями имеется разделитель, но на мой взгляд, он выглядит крайне не красиво, поэтому я его убираю.



За создание диалогового окна отвечает класс GtkDialog():
$dialog = new GtkDialog(
'Диалоговое окно',
NULL,
Gtk::DIALOG_MODAL,
array(
Gtk::STOCK_NO, Gtk::RESPONSE_NO,
Gtk::STOCK_YES, Gtk::RESPONSE_YES
)
);


Первый параметр - это заголовок окна. Если он имеет значение NULL, то будет применён заголовок по умолчанию. Второй параметр - так называемый переходящий родитель, но в нашем случае достаточно указать NULL. Третьим параметром мы указали, что окно будет модальным, т.е. блокирующим работу родительского окно. Последними указываются кнопки, располагаемые в окне. Перечисление кнопок идёт слева направо. Сначала указывается сама кнопка, а через запятую сигнал, который она будет испускать при нажатии на неё.

Как я уже говорил, я не люблю, когда между частями окна имеется разделитель, поэтому уберём его:
$dialog->set_has_separator(FALSE);


Добавим текст сообщения:
$vbox = $dialog->vbox;
$vbox->add(new GtkLabel('Действительно произвести действие?'));
$dialog->show_all();


Для определения нажатой кнопки применяется метод run(), который возвращает сигнал, издаваемый нажатой кнопкой.
$result = $dialog->run();
 
if ($result == Gtk::RESPONSE_NO)
echo "Вы нажали 'Нет'\n";
elseif ($result == Gtk::RESPONSE_YES)
echo "Вы нажали 'Да'\n";


Для разрушения окна после нажатия на одну из кнопок используется destroy().

Полный код программы:
<?php
 
$dialog = new GtkDialog(
'Диалоговое окно',
NULL,
Gtk::DIALOG_MODAL,
array(
Gtk::STOCK_NO, Gtk::RESPONSE_NO,
Gtk::STOCK_YES, Gtk::RESPONSE_YES
)
);
$dialog->set_has_separator(FALSE);
$dialog->set_size_request(300, 100);
 
$vbox = $dialog->vbox;
$vbox->add(new GtkLabel('Действительно произвести действие?'));
$dialog->show_all();
 
$result = $dialog->run();
 
if ($result == Gtk::RESPONSE_NO)
echo "Вы нажали 'Нет'\n";
elseif ($result == Gtk::RESPONSE_YES)
echo "Вы нажали 'Да'\n";
 
$dialog->destroy();
 
?>

5 комментариев:

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

Непонятно, как по дефолту скрыть такое окно. ставлю родителем $window ($window = new GtkWindow(); - главное окно), потом пытаюсь скрыть диалог $dialog->hide(); но ничего не получается. плохо что на http://gtk.php.net примеров нет. :(

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

пришлось поместить весь код, относящийся к диалоговому окну в тело функции, которая вызывается при определенном действии.

basist комментирует...
Этот комментарий был удален автором.
basist комментирует...

И всё же вопрос по методам вызова диалоговых окон остаётся открытым. если также в функции делаю диалоговое окно GtkAboutDialog, то оно открывается, но кнопка Close не работает. Поэтому вопрос: как лучше вызывать диалоговые окна?

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

Вы, наверное, забыли про $dialog->destroy().