# MenuBar (C)

Monica Kochofar
monicakochofar@gmail.com 2012
Widget, který sdružuje widgety GtkMenuItem.

# MenuBar

MenuBar vytvořený pomocí XML a GtkBuilder.

Kvůli hlubšímu prozkoumání této ukázky se neváhejte podívat i na lekce MenuBar (Vala) a MenuBar (Python).

#include <gtk/gtk.h>

/* Funkce zpětného volání pro akci "copy" */ static void copy_callback (GSimpleAction *simple, GVariant *parameter, gpointer user_data) { g_print ("\"Copy\" activated\n"); }

/* Funkce zpětného volání pro akci "paste" */ static void paste_callback (GSimpleAction *simple, GVariant *parameter, gpointer user_data) { g_print ("\"Paste\" activated\n"); }

/* Funkce zpětného volání pro akci "shape" */ static void shape_callback (GSimpleAction *simple, GVariant *parameter, gpointer user_data) { /* We first gather the value of the GVariant instance with a string type. * The overall goal here is to see if shape is set to line, triangle, etc, * and put that value within the variable "answer". */ const gchar *answer = g_variant_get_string (parameter, NULL); g_printf ("Shape is set to %s.\n", answer); /* Všimněte si, že zde nastavíme stav akce */ g_simple_action_set_state (simple, parameter); }

/* Funkce zpětného vulání, ve které zavíráme about_dialog vytvořený dále */ static void on_close (GtkDialog *dialog, gint response_id, gpointer user_data) { gtk_widget_destroy (GTK_WIDGET (dialog)); }

/* Funkce zpětného volání pro akci "about" (viz příklad aboutdialog.c) */ static void about_callback (GSimpleAction *simple, GVariant *parameter, gpointer user_data) { GtkWidget *about_dialog;

about_dialog = gtk_about_dialog_new ();

const gchar *authors[] = {"GNOME Documentation Team", NULL}; const gchar *documenters[] = {"GNOME Documentation Team", NULL};

/* Vyplní about_dialog požadovanými informacemi */ gtk_about_dialog_set_program_name (GTK_ABOUT_DIALOG (about_dialog), "AboutDialog Example"); gtk_about_dialog_set_copyright (GTK_ABOUT_DIALOG (about_dialog), "Copyright \xc2\xa9 2012 GNOME Documentation Team"); gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG (about_dialog), authors); gtk_about_dialog_set_documenters (GTK_ABOUT_DIALOG (about_dialog), documenters); gtk_about_dialog_set_website_label (GTK_ABOUT_DIALOG (about_dialog), "GNOME Developer Website"); gtk_about_dialog_set_website (GTK_ABOUT_DIALOG (about_dialog), "http://developer.gnome.org");

/* Signál "response" je vyslán, když dialogové okno přijme událost "delete", * proto jsme tento signál napojili na funkci zpětného volání on_close vytvořenou * výše. */ g_signal_connect (GTK_DIALOG (about_dialog), "response", G_CALLBACK (on_close), NULL);

/* Zobrazí about_dialog */ gtk_widget_show (about_dialog); }

static void activate (GtkApplication *app, gpointer user_data) { GtkWidget *window;

GSimpleAction *copy_action; GSimpleAction *paste_action; GSimpleAction *shape_action; GSimpleAction *about_action;

/* Vytvoří okno s názvem a výchozí velikostí */ window = gtk_application_window_new (app); gtk_window_set_title (GTK_WINDOW (window), "MenuBar Example"); gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);

/* Začne vytvářet akci "copy" * Všimněte si, že je bezstavová */ copy_action = g_simple_action_new ("copy", NULL); /* Napojí akci na funkci zpětného volání */ g_signal_connect (copy_action, "activate", G_CALLBACK (copy_callback), GTK_WINDOW (window)); /* Přidá ji do okna */ g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (copy_action));

/* Začně vytvářet akci "paste" * Všimněte si, že je bezstavová */ paste_action = g_simple_action_new ("paste", NULL); /* Napojí akci na funkci zpětného volání */ g_signal_connect (paste_action, "activate", G_CALLBACK (paste_callback), GTK_WINDOW (window)); /* Přidá ji do okna */ g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (paste_action));

/* Začne vytvářet akci "shape" * Všimněte si, že tato akce je stavová * Nejprve uveďme, že typ parametru je pro jednoduchou akci řetězec. * Když používáme g_variant_type_new, je potřeba vrácenou hodnotu * příslušně uvolnit, když jsem s ní hotovi. */ GVariantType *type_string = g_variant_type_new ("s"); /* Parametry pro g_simple_action_new_stateful jsou: název, typ parametru, * počáteční stav */ shape_action = g_simple_action_new_stateful ("shape", type_string, g_variant_new_string ("line")); /* Napojí akci na funkci zpětného volání */ g_signal_connect (shape_action, "activate", G_CALLBACK (shape_callback), GTK_WINDOW (window)); /* Přidá ji do okna */ g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (shape_action)); g_variant_type_free (type_string);

/* Začne vytvářet akci "about" * Všimně te si, že tato akce je stavová */ about_action = g_simple_action_new ("about", NULL); /* Napojí akci na funkci zpětného volání */ g_signal_connect (about_action, "activate", G_CALLBACK (about_callback), GTK_WINDOW (window)); /* Přidá ji do okna */ g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (about_action));

gtk_widget_show_all (window); }

/* Funkce zpětného volání pro akci "new" */ static void new_callback (GSimpleAction *simple, GVariant *parameter, gpointer user_data) { g_print ("You clicked \"New\"\n"); }

/* Funkce zpětného volání pro akci "quit" */ static void quit_callback (GSimpleAction *simple, GVariant *parameter, gpointer user_data) { GApplication *application = user_data;

g_print ("You clicked \"Quit\"\n"); g_application_quit (application); }

/* Funkce zpětného volání pro akci "state" */ static void state_callback (GSimpleAction *simple, GVariant *parameter, gpointer user_data) { /* Dvě možnosti v tomto případě pro proměnnou "answer" jsou * "on" nebo "off" */ const gchar *answer = g_variant_get_string (parameter, NULL); /* Vypíšeme informace uživateli */ g_printf ("State is set to %s.\n", answer); /* Všimněte si, že zde nastavíme stav akce */ g_simple_action_set_state (simple, parameter); }

/* Funkce zpětného volání pro akci "awesome" */ static void awesome_callback (GSimpleAction *simple, GVariant *parameter, gpointer user_data) { GVariant *action_state = g_action_get_state (G_ACTION (simple)); gboolean active = g_variant_get_boolean (action_state); GVariant *new_state = g_variant_new_boolean (!active); /* Nastaví nový stav pro akci * (uchovává znalost, jestli naposledy bylo zaškrtnuto nebo nezaškrtnuto) */ g_simple_action_set_state (simple, new_state);

if (active) g_print ("You unchecked \"Awesome\"\n"); else g_print ("You checked \"Awesome\"\n"); }

/* Spouštěcí funkce pro nabídku, kterou jsme vytvořili v tomto příkladu */ static void startup (GApplication *app, gpointer user_data) { /* Inicializace proměnných */ GSimpleAction *new_action; GSimpleAction *quit_action; GSimpleAction *state_action; GSimpleAction *awesome_action;

GtkBuilder *builder;

GError *error = NULL;

/* Začne vytvářet akci "new" * Všimněte si, že je bezstavová */ new_action = g_simple_action_new ("new", NULL); g_signal_connect (new_action, "activate", G_CALLBACK (new_callback), app); /* Přidá se pro celou aplikaci */ g_action_map_add_action (G_ACTION_MAP (app), G_ACTION (new_action));

/* Začne vytvářet akci "quit" * Všimněte si, že je bezstavová */ quit_action = g_simple_action_new ("quit", NULL); g_signal_connect (quit_action, "activate", G_CALLBACK (quit_callback), app); /* Přidá ji pro celou aplikaci */ g_action_map_add_action (G_ACTION_MAP (app), G_ACTION (quit_action));

/* Začne vytvářet akci "state" * Všimněte si, že tato akce je stavová */ GVariantType *type_string2 = g_variant_type_new ("s"); state_action = g_simple_action_new_stateful ("state", type_string2, g_variant_new_string ("off")); g_signal_connect (state_action, "activate", G_CALLBACK (state_callback), app); /* Přidá ji pro celou aplikaci */ g_action_map_add_action (G_ACTION_MAP (app), G_ACTION (state_action)); g_variant_type_free (type_string2);

/* Začne vytvářet akci "awesome" * Všimněte si, že tato akce je stavová */ awesome_action = g_simple_action_new_stateful ("awesome", NULL, g_variant_new_boolean (FALSE)); g_signal_connect (awesome_action, "activate", G_CALLBACK (awesome_callback), app); /* Přidá ji pro celou aplikaci */ g_action_map_add_action (G_ACTION_MAP (app), G_ACTION (awesome_action));

/* Použije builder pro přidání návrhu uživatelského rozhraní z GLADE do mřížky */ builder = gtk_builder_new (); /* Získá soubor (pokud existuje) * Poznámka: musíte se ujistit, že soubor je v aktuální složce s touto * prací. Pokud je objevena chyba, funkce použitá zde vrací neprázdnou * hodnotu do naší proměnné "error" */ gtk_builder_add_from_file (builder, "menubar.ui", &error); if (error != NULL) { g_print ("%s\n", error->message); g_error_free (error); }

/* Získá nabídkovou lištu */ GObject *menubar = gtk_builder_get_object (builder, "menubar"); gtk_application_set_menubar (GTK_APPLICATION (app), G_MENU_MODEL (menubar));

/* Získá aplikační nabídku */ GObject *appmenu = gtk_builder_get_object (builder, "appmenu"); gtk_application_set_app_menu (GTK_APPLICATION (app), G_MENU_MODEL (appmenu)); }

/* Spouštěcí funkce pro aplikaci */ 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

GtkWindow

GSimpleAction

GtkAboutDialog

GtkVariantType