# 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