Question

Je fais un éditeur de texte trivial (comme un exercice) en utilisant GTK Glade, GtkBuilder et C. J'ai un menu d'édition avec Couper, Copier et Coller ainsi qu'un GtkTextView pour le texte. GtkTextView lie automatiquement les couper / copier / coller des séquences pour lui-même (et même fournit des éléments de menu si vous cliquez à droite). Je veux me connecter Couper, Copier et Coller des éléments de menu dans ma barre de menu à mon point de vue de texte afin qu'ils agissent comme prévu.

Notez que ceci est une connexion bidirectionnelle. (1) Lorsque l'un des Couper, copier ou coller de GtkMenuItem est activé, il dit au GtkTextView de faire quelque chose. (2) Lorsqu'une sélection est faite ou effacé dans le GtkTextView, Couper et Copier sont activés ou désactivés respectivement (voir gedit par exemple). En outre, (3) si oui ou non pâte est activée dépend de l'état de la marchandise.

Comment puis-je connecter mon Couper, Copier et Coller du menu à la vue du texte? Est-il possible de le faire en Glade, ou sera mon programme C besoin de code supplémentaire pour cela? Est-il un moyen simplifié pour ce faire, ou dois-je mettre en œuvre les trois comportements énoncés dans le paragraphe ci-dessus manuellement?

Était-ce utile?

La solution

Vous aurez besoin d'un code supplémentaire C, mais pas beaucoup. Pour cet exemple, je suppose que vous utilisez GtkActions pour vos éléments de menu, mais si vous n'êtes pas la solution devrait être similaire.

Faites d'abord les callbacks pour la couper, copier, coller des actions dans la Clairière. Lorsque vous vous connectez les signaux, passer une certaine structure de données contenant au moins des pointeurs de la couper, copier, coller des actions, et la vue de texte, sous forme de données utilisateur.

void
on_cut(GtkAction *action, SomeStruct *data)
{
    g_signal_emit_by_name(data->view, "cut-clipboard", NULL);
    gtk_action_set_sensitive(data->paste_action, TRUE);
}

void
on_copy(GtkAction *action, SomeStruct *data)
{
    g_signal_emit_by_name(data->view, "copy-clipboard", NULL);
    gtk_action_set_sensitive(data->paste_action, TRUE);
}

void
on_paste(GtkAction *action, SomeStruct *data)
{
    g_signal_emit_by_name(data->view, "paste-clipboard", NULL);
}

Ensuite, se connecter au signal notify::has-selection de votre GtkTextBuffer:

void
on_has_selection_notify(GtkTextBuffer *buffer, GParamSpec *pspec, SomeStruct *data)
{
    gboolean has_selection = gtk_text_buffer_get_has_selection(buffer);
    gtk_action_set_sensitive(data->cut_action, has_selection);
    gtk_action_set_sensitive(data->copy_action, has_selection);
}

Pour déterminer l'état initial de l'action de la pâte (dans le cas où il y a du texte sur le presse-papiers lorsque vous démarrez l'application) exécutez le code suivant pendant que vous construisez votre interface:

gtk_action_set_sensitive(data->paste_action, 
    gtk_clipboard_wait_is_text_available(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)));

Cela suppose qu'il n'y a aucun moyen pour l'utilisateur d'effacer manuellement le presse-papiers (la plupart des programmes ne vous laissez pas faire.)

caveat lector:. Le code comme tapé ici est tout non testé

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top