Domanda

Sto facendo un editor di testo banale (come esercizio) in GTK usando Glade, GtkBuilder, e C. Ho un menu di modifica con il copia e incolla e un GtkTextView per il testo. GtkTextView lega automaticamente le sequenze di taglia / copia / incolla per se stessa (e fornisce anche le voci di menu, se si fa clic destro). Voglio collegare il Taglia, Copia e Incolla le voci di menu nella mia barra dei menu per mio punto di vista testo in modo agiranno come previsto.

Si noti che si tratta di una connessione bidirezionale. (1) Quando una delle Taglia, Copia o Incolla GtkMenuItem di si attiva, racconta la GtkTextView di fare qualcosa. (2) Quando si effettua una selezione o eliminato nel GtkTextView, Cut e Copy sono attivate o disattivate rispettivamente (vedi gedit come esempio). Inoltre, (3) o meno pasta viene attivato dipende dallo stato del clipboard.

Come si collega il Taglia, Copia e Incolla le voci di menu per la visualizzazione del testo? C'è un modo per farlo in Glade, o sarà il mio programma C bisogno di qualche codice aggiuntivo per questo? C'è un modo semplificato per fare questo, o ho bisogno di implementare tutti e tre i comportamenti indicati nel paragrafo precedente manualmente?

È stato utile?

Soluzione

Avrete bisogno di un po 'di codice extra C, ma non molto. Per questo esempio io parto dal presupposto che si sta utilizzando GtkActions per le voci di menu, ma se non sei la soluzione deve essere simile.

Per prima cosa i callback per la copia e incolla azioni in Glade. Quando ci si connette i segnali, passare un po 'struttura di dati contenente almeno puntatori alla copia e incolla le azioni, e la vista del testo, come i dati utente.

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

Quindi, collegare al segnale notify::has-selection del vostro 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);
}

Per determinare lo stato iniziale dell'azione pasta (nel caso in cui ci sia il testo negli appunti quando si avvia l'applicazione) eseguire il codice seguente, mentre si sta costruendo la propria interfaccia:

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

Ciò presuppone non c'è modo per l'utente di cancellare gli Appunti manualmente (la maggior parte dei programmi non ti permettono di fare questo.)

Caveat lector:. Il codice come digitato qui è tutto testato

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top