Книга: Основы программирования в Linux

Модальное диалоговое окно

Модальное диалоговое окно

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

Диалоговое окно можно сделать модальным, установив флаг GTK_DIALOG_MODAL и вызвав функцию gtk_widget_show, но есть лучший путь. Функция gtk_dialog_run выполнит за вас всю тяжелую работу, остановив дальнейшее выполнение программы до тех пор, пока не будет нажата кнопка в диалоговом окне.

Когда пользователь нажимает кнопку (или диалоговое окно уничтожается), функция gtk_dialog_run возвращает результат типа int, указывающий на кнопку, нажатую пользователем. В GTK+ очень кстати определен тип enum для описания возможных значений.

typedef enum {
 GTK_RESPONSE_NONE = -1,
 GTK_RESPONSE_REJECT = -2,
 GTK_RESPONSE_ACCEPT = -3,
 GTK_RESPONSE_DELETE_EVENT = -4
 GTK_RESPONSE_OK = -5,
 GTK_RESPONSE_CANCEL = -6,
 GTK_RESPONSE_CLOSE = -7,
 GTK_RESPONSE_YES = -8,
 GTK_RESPONSE_NO = -9,
 GTK_RESPONSE_APPLY = -10,
 GTK_RESPONSE_HELP = -11
} GtkResponseType;

Теперь мы можем объяснить код отклика, передаваемый в функцию gtk_dialog_new_with_buttons, — это код возврата типа GtkResponseType, который функция gtk_dialog_run возвращает, когда нажата кнопка. Если диалоговое окно уничтожается (это происходит, например, когда пользователь щелкает кнопкой мыши пиктограмму закрытия), вы получаете результат GTK_RESPONSE_NONE.

Для вызова соответствующих операторов идеально подходит конструкция switch:

GtkWidget* dialog = create_dialog();
int result = gtk_dialog_run(GTK_DIALOG(dialog));
switch(result) {
case GTK_RESPONSE_ACCEPT:
 delete_file();
 break;
сазе GTK_RESPONSE_REJECT:
 do_nothing();
 break;
default:
 dialog_was_cancelled();
 break;
}
gtk_widget_destroy(dialog);

Это все, что есть для простых модальных окон в комплекте инструментов GTK+. Как видите, включен очень небольшой программный код и потрачено немного усилий. В конце нужно только провести чистку с помощью функции gtk_widget_destroy.

Если вам понадобится немодальное диалоговое окно, все будет не так просто. Вы не сможете использовать функцию gtk_dialog_run, вместо нее придется связать функции обратного вызова с кнопками диалогового окна.

Оглавление книги


Генерация: 1.346. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз