# Γραμμή μενού (C)

Monica Kochofar
monicakochofar@gmail.com 2012
Ένα γραφικό συστατικό που κρατά γραφικά συστατικά GtkMenuItem
Δημήτρης Σπίγγος
dmtrs32@gmail.com 2012, 2013

# MenuBar

Μια γραμμή εργαλείων δημιουργήθηκε χρησιμοποιώντας XML και GtkBuilder.

Για μια πιο βαθιά ματιά σε αυτό το δείγμα, παρακαλώ μην διστάσετε να κοιτάξετε το γραμμή μενού Vala και/ή τα μαθήματα γραμμή μενού Python.

#include <gtk/gtk.h>

/* Η συνάρτηση επανάκλησης για την ενέργεια "copy" */ static void copy_callback (GSimpleAction *simple, GVariant *parameter, gpointer user_data) { g_print ("\"Copy\" activated\n")· }

/* Η συνάρτηση επανάκλησης για την ενέργεια "paste" */ static void paste_callback (GSimpleAction *simple, GVariant *parameter, gpointer user_data) { g_print ("\"Paste\" activated\n")· }

/* Η συνάρτηση επανάκλησης για την ενέργεια "shape" */ static void shape_callback (GSimpleAction *simple, GVariant *parameter, gpointer user_data) { /* Συλλέγουμε πρώτα την τιμή του στιγμιότυπου GVariant με έναν τύπο συμβολοσειράς.. * Ο συνολικός σκοπός εδώ είναι να δει αν το σχήμα ορίζεται σε γραμμή, τρίγωνο, κλπ, * και να βάλει αυτήν την τιμή μέσα στην μεταβλητή "answer". */ const gchar *answer = g_variant_get_string (parameter, NULL)· g_printf ("Shape is set to %s.\n", answer)· /* Σημειώστε ότι ορίζουμε την κατάσταση της ενέργειας */ g_simple_action_set_state (simple, parameter)· }

/* Η συνάρτηση επανάκλησης στην οποία κλείνει ο about_dialog που δημιουργήθηκε παρακάτω */ static void on_close (GtkDialog *dialog, gint response_id, gpointer user_data) { gtk_widget_destroy (GTK_WIDGET (dialog))· }

/* Η συνάρτηση επανάκλησης για την ενέργεια about (δείτε το aboutdialog.c example) */ 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}·

/* Συμπληρώστε τον about_dialog με την επιθυμητή πληροφορία */ 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")·

/* Το σήμα "response" εκπέμπεται όταν ο διάλογος δέχεται ένα συμβάν διαγραφής, * συνεπώς συνδέουμε αυτό το σήμα με την συνάρτηση επανάκλησης on_close * που δημιουργήθηκε παραπάνω. */ g_signal_connect (GTK_DIALOG (about_dialog), "response", G_CALLBACK (on_close), NULL)·

/* Εμφάνιση του διαλόγου περί */ 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·

/* Δημιουργία παραθύρου με τίτλο και προεπιλεγμένο μέγεθος */ 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)·

/* Έναρξη δημιουργίας της ενέργειας "copy". * Σημειώστε ότι είναι μια ενέργεια χωρίς κατάσταση. */ copy_action = g_simple_action_new ("copy", NULL)· /* Συνδέθηκε με μια συνάρτηση επανάκλησης */ g_signal_connect (copy_action, "activate", G_CALLBACK (copy_callback), GTK_WINDOW (window))· /* Προστέθηκε στο παράθυρο */ g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (copy_action))·

/* Έναρξη δημιουργίας της κατάστασης "paste". * Σημειώστε ότι είναι μια ενέργεια χωρίς κατάσταση. */ paste_action = g_simple_action_new ("paste", NULL)· /* Σύνδεση της ενέργειας με μια συνάρτηση επανάκλησης */ g_signal_connect (paste_action, "activate", G_CALLBACK (paste_callback), GTK_WINDOW (window))· /* Προσθήκη της στο παράθυρο */ g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (paste_action))·

/* Έναρξη δημιουργίας της ενέργειας "shape". * Σημειώστε ότι είναι μια ενέργεια χωρίς κατάσταση. * Πρώτα δηλώνουμε ότι ο τύπος της παραμέτρου της απλής ενέργειας είναι μια συμβολοσειρά. * Όταν χρησιμοποιούμε g_variant_type_new, είναι κατάλληλη η απελευθέρωση της μνήμης επιστροφής * μόλις έχετε τελειώσει μαζί της. */ GVariantType *type_string = g_variant_type_new ("s")· /* παράμετροι για το g_simple_action_new_stateful είναι: (όνομα, τύπος παραμέτρου, * αρχική κατάσταση). */ shape_action = g_simple_action_new_stateful ("shape", type_string, g_variant_new_string ("line"))· /* Σύνδεση της ενέργειας με μια συνάρτηση επανάκλησης */ g_signal_connect (shape_action, "activate", G_CALLBACK (shape_callback), GTK_WINDOW (window))· /* Προσθήκη της στο παράθυρο */ g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (shape_action))· g_variant_type_free (type_string)·

/* Έναρξη δημιουργίας της ενέργειας "about". * Σημειώστε ότι είναι μια ενέργεια χωρίς κατάσταση. */ about_action = g_simple_action_new ("about", NULL)· /* Σύνδεση της ενέργειας με τη συνάρτηση επανάκλησης */ g_signal_connect (about_action, "activate", G_CALLBACK (about_callback), GTK_WINDOW (window))· /* Προσθήκη της στο παράθυρο */ g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (about_action))·

gtk_widget_show_all (window)· }

/* Συνάρτηση επανάκλησης για την ενέργεια "new" */ static void new_callback (GSimpleAction *simple, GVariant *parameter, gpointer user_data) { g_print ("You clicked \"New\"\n")· }

/* Συνάρτηση επανάκλησης για την ενέργεια "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)· }

/* Συνάρτηση επανάκλησης για την ενέργεια "state" */ static void state_callback (GSimpleAction *simple, GVariant *parameter, gpointer user_data) { /* Οι δύο πιθανότητες σε αυτήν την περίπτωση για την μεταβλητή "answer" είναι είτε * "on" είτε "off". */ const gchar *answer = g_variant_get_string (parameter, NULL)· /* Εμφανίζουμε την πληροφορία στον χρήστη */ g_printf ("State is set to %s.\n", answer)· /* Σημειώστε ότι ορίζουμε την κατάσταση της ενέργειας */ g_simple_action_set_state (simple, parameter)· }

/* Συνάρτηση επανάκλησης για την ενέργεια "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)· /* Ορισμός της νέας κατάστασης για την ενέργεια. * (Παρακολούθηση αν ήταν τελευταία σημειωμένη ή όχι). */ g_simple_action_set_state (simple, new_state)·

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

/* Έναρξη συνάρτησης για το μενού που δημιουργούμε σε αυτό το δείγμα */ static void startup (GApplication *app, gpointer user_data) { /* Initialize variables */ GSimpleAction *new_action· GSimpleAction *quit_action· GSimpleAction *state_action· GSimpleAction *awesome_action·

GtkBuilder *builder·

GError **error·

/* Έναρξη δημιουργίας της ενέργειας "new". * Σημειώστε ότι είναι μια ενέργεια χωρίς κατάσταση. */ new_action = g_simple_action_new ("new", NULL)· g_signal_connect (new_action, "activate", G_CALLBACK (new_callback), app)· /* Προστίθεται στην συνολική εφαρμογή */ g_action_map_add_action (G_ACTION_MAP (app), G_ACTION (new_action))·

/* Έναρξη δημιουργίας της ενέργειας "quit". * Σημειώστε ότι είναι μια ενέργεια χωρίς κατάσταση. */ quit_action = g_simple_action_new ("quit", NULL)· g_signal_connect (quit_action, "activate", G_CALLBACK (quit_callback), app)· /* Προστίθεται στην συνολική εφαρμογή */ g_action_map_add_action (G_ACTION_MAP (app), G_ACTION (quit_action))·

/*Έναρξη δημιουργίας της ενέργειας "state". * Σημειώστε ότι είναι μια ενέργεια χωρίς κατάσταση. */ 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)· /* Προστίθεται στην συνολική εφαρμογή */ g_action_map_add_action (G_ACTION_MAP (app), G_ACTION (state_action))· g_variant_type_free (type_string2)·

/* Έναρξη δημιουργίας της ενέργειας "awesome". * Σημειώστε ότι είναι μια ενέργεια χωρίς κατάσταση. */ 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)· /* Προστίθεται στην συνολική εφαρμογή */ g_action_map_add_action (G_ACTION_MAP (app), G_ACTION (awesome_action))·

/* Ένας δομητής για να προσθέσει τη διεπαφή χρήστη που σχεδιάστηκε με GLADE στο πλέγμα: */ builder = gtk_builder_new ()· /* Λήψη του αρχείου (αν είναι εκεί): * Σημείωση: πρέπει να βεβαιωθείτε ότι το αρχείο είναι στον τρέχοντα κατάλογο για * αυτήν την εργασία. Η χρησιμοποιούμενη συνάρτηση εδώ επιστρέφει μια τιμή μέσα στη μεταβλητή μας * "error" και είναι ίση με μηδέν αν βρεθεί όντως ένα σφάλμα. */ gtk_builder_add_from_file (builder, "menubar.ui", error)· if (error == 0) { g_print ("File not found.\n")· }

/* Εξαγωγή της γραμμής μενού */ GObject *menubar = gtk_builder_get_object (builder, "menubar")· gtk_application_set_menubar (GTK_APPLICATION (app), G_MENU_MODEL (menubar))·

/* Εξαγωγή του μενού εφαρμογών */ GObject *appmenu = gtk_builder_get_object (builder, "appmenu")· gtk_application_set_app_menu (GTK_APPLICATION (app), G_MENU_MODEL (appmenu))· }

/* Έναρξη συνάρτησης για την εφαρμογή */ 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· }

Σε αυτό το παράδειγμα χρησιμοποιήσαμε τα παρακάτω:

GtkApplication

GtkWindow

GSimpleAction

GtkAboutDialog

GVariantType