Frage

Ich mache einen trivialen Texteditor (als Übung) in GTK mit Glade, GtkBuilder und C. Ich habe ein Bearbeitungsmenü mit Ausschneiden, Kopieren und Einfügen sowie eine GtkTextView für den Text. GtkTextView bindet automatisch die Cut / Copy / Paste-Sequenzen für sich selbst (und bietet auch Menüpunkte, wenn Sie mit der rechten Maustaste). Ich möchte das Ausschneiden, Kopieren, verbinden und Menüpunkte in meiner Menüleiste, um meine Textansicht einfügen, so dass sie wie erwartet verhalten.

Beachten Sie, dass dies eine Zwei-Wege-Verbindung. (1) Wenn eine der Ausschneiden, Kopieren oder Einfügen GtkMenuItem ist aktiviert, es erzählt die GtkTextView etwas zu tun. (2) Wenn eine Auswahl getroffen wird oder in der GtkTextView gelöscht, Ausschneiden und Kopieren aktiviert oder deaktiviert ist jeweils (gedit als Beispiel sehen). Außerdem (3), ob oder nicht einfügen aktiviert ist, hängt von dem Zustand der Zwischenablage.

Wie verbinde ich mein Ausschneiden, Kopieren und Menüelemente in die Textansicht einfügen? Gibt es eine Möglichkeit, es in Glade zu tun, oder wird mein C-Programm benötigen einige zusätzliche Code für diese? Gibt es eine optimierte Art und Weise, dies zu tun, oder muß ich alle drei Verhaltensweisen implementieren im obigen Absatz genannten manuell?

War es hilfreich?

Lösung

Sie müssen einige zusätzliche C-Code, aber nicht viel. In diesem Beispiel gehe ich davon aus Sie GtkActions für Ihre Menüpunkte verwenden, aber wenn Sie nicht die Lösung sind, sollten ähnlich sein.

Sie zuerst die Rückrufe für den Schnitt machen, kopieren und einfügen Aktionen in Glade. Wenn Sie die Signale verbinden, eine Datenstruktur passieren zumindest Hinweise auf die mit schneiden, kopieren und Aktionen einfügen, und die Textansicht als Benutzerdaten.

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);
}

Als nächstes wird eine Verbindung zum notify::has-selection Signal Ihres 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);
}

Um den Anfangszustand der Paste Aktion zu bestimmen (falls es Text in der Zwischenablage, wenn Sie die Anwendung starten) den folgenden Code ausführen, während Sie Ihre Schnittstelle sind die Konstruktion:

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

Dies setzt voraus, es gibt keine Möglichkeit für den Benutzer manuell die Zwischenablage löschen (die meisten Programme lassen Sie sich nicht, dass Sie das tun.)

Caveat lector: der Code wie hier eingegeben ist alles ungetestet

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top