MessageDialog (C) Monica Kochofar monicakochofar@gmail.com 2012 Okno se zprávou MessageDialog

Modální dialogové okno se zprávou, které způsobí, že svět vybuchne.

Když chcete aplikaci otestovat, stačí po jejím spuštění kliknout na nabídku Message Dialog, která se objeví v horní liště obrazovky.

#include <gtk/gtk.h> /* Funkce zpětného volání reagující na signál "response" od uživatele * v dialogovém okně se zprávou * Tato funkce se používá ke komunikaci s uživatelem v terminálu */ static void on_response (GtkDialog *dialog, gint response_id, gpointer user_data) { /* Když kliknutí tlačítko odpoví OK (response_id je -5) */ if (response_id == GTK_RESPONSE_OK) g_print ("*boom*\n"); /* Když kliknuté tlačítko odpoví CANCEL (response_id je -6) */ else if (response_id == GTK_RESPONSE_CANCEL) g_print ("good choice\n"); /* Když je dialogové okno zrušeno (například zmáčknutím Esc) */ else if (response_id == GTK_RESPONSE_DELETE_EVENT) g_print ("dialog closed or cancelled\n"); /* Zlikviduje dialogové okno po té, co se uskutečnila jedna z akcí výše */ gtk_widget_destroy (GTK_WIDGET (dialog)); } /* Funkce zpětného volání pro signál "activate" náležející widgetu * SimpleAction message_action * Tato funkce se použije ke zobrazení dialogového okna se zprávou */ static void message_cb (GSimpleAction *simple, GVariant *parameter, gpointer user_data) { /* Proměnná parent v tomto případě představuje okno */ GtkWidget *message_dialog; GtkWindow *parent = user_data; /* Vytvoří nové dialogové okno se zprávou a nastaví jeho parametry následovně: * příznaky - zajistí modální režim * (modální okno brání v interakci s ostatními okny aplikace) * typ zprávy - nekritická varovná zpráva * typ tlačítek - použije tlačítka OK a Cancel * zpráva - text, který uživatel v dialogovém okně uvidí */ message_dialog = gtk_message_dialog_new (parent, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK_CANCEL, "This action will cause the universe to stop existing."); gtk_widget_show_all (message_dialog); g_signal_connect (GTK_DIALOG (message_dialog), "response", G_CALLBACK (on_response), NULL); } static void activate (GtkApplication *app, gpointer user_data) { GtkWidget *window; GtkWidget *label; GSimpleAction *message_action; /* Vytvoří okno s názvem a výchozí velikostí */ window = gtk_application_window_new (app); gtk_window_set_title (GTK_WINDOW (window), "GMenu Example"); gtk_window_set_default_size (GTK_WINDOW (window), 400, 200); /* Vytvoří popisek a přidá jej do okna */ label = gtk_label_new ("This application goes boom!"); gtk_container_add (GTK_CONTAINER (window), label); /* Vytvoří novou jednoduchou akci, jako parametr type ji předá NULL. Ten * bude vždy NULL pro akce vyvolané z nabídky (například kliknutí na tlačítko * "ok" nebo "cancel") */ message_action = g_simple_action_new ("message", NULL); /* Napojí signál "activate" na příslušnou funkci zpětného volání */ g_signal_connect (message_action, "activate", G_CALLBACK (message_cb), GTK_WINDOW (window)); /* Přidá message_action do celkové mapy akcí. Mapa akcí je rozhraní, které * obsahuje řadu pojmenovaných instancí GAction (jako je message_action) */ g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (message_action)); gtk_widget_show_all (window); } /* Funkce zpětného volání pro signál "activate" od akce "quit" * ve funkci hned za touto */ static void quit_cb (GSimpleAction *simple, GVariant *parameter, gpointer user_data) { GApplication *application = user_data; g_application_quit (application); } /* Spouštěcí funkce pro nabídku, kterou vytváříme v této ukázce */ static void startup (GApplication *app, gpointer user_data) { GMenu *menu; GSimpleAction *quit_action; /* Inicializuje GMenu a přidá do něj položku s textem "Message" a akcí * "win.message". Přidá také další položku s textem "Quit" a akcí * "app.quit" */ menu = g_menu_new (); g_menu_append (menu, "Message", "win.message"); g_menu_append (menu, "Quit", "app.quit"); /* Vytvoří novou jednoduchou akci pro aplikaci (v tomto případě do je * akce "quit" */ quit_action = g_simple_action_new ("quit", NULL); /* Zajistí, že právě vytvořená nabídka bude bude pro celou aplikaci */ gtk_application_set_app_menu (GTK_APPLICATION (app), G_MENU_MODEL (menu)); g_signal_connect (quit_action, "activate", G_CALLBACK (quit_cb), app); g_action_map_add_action (G_ACTION_MAP (app), G_ACTION (quit_action)); } /* Spouštecí funkce aplikace */ int main (int argc, char **argv) { GtkApplication *app; int status; app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE); g_signal_connect (app, "activate", G_CALLBACK (activate), NULL); g_signal_connect (app, "startup", G_CALLBACK (startup), NULL); status = g_application_run (G_APPLICATION (app), argc, argv); g_object_unref (app); return status; }

V této ukázce se používá následující:

GtkApplication

GApplication

GtkWindow

GtkMessageDialog

GSimpleAction

GActionMap

GMenu