Pregunta

Estoy haciendo un editor de texto triviales (como ejercicio) en GTK usando Glade, GtkBuilder, y C. tengo un menú de edición de cortar, copiar y pegar, así como un GtkTextView para el texto. GtkTextView enlaza automáticamente los cortar / copiar / pegar secuencias por sí mismo (e incluso proporciona elementos de menú Si hace clic derecho). Quiero conectar el cortar, copiar y pegar elementos de menú en mi barra de menú para mi punto de vista de texto para que actuarán como se esperaba.

Tenga en cuenta que se trata de una conexión bidireccional. (1) Cuando uno de los Cortar, copiar o pegar GtkMenuItem de se activa, le dice al GtkTextView que hacer algo. (2) Cuando se realiza una selección o se despeja en el GtkTextView, Cortar y Copiar se activan o desactivan respectivamente (véase gedit como ejemplo). Por otra parte, (3) si Pegar o no está habilitado depende del estado del portapapeles.

¿Cómo conecto mi cortar, copiar y pegar elementos de menú a la vista de texto? ¿Hay una manera de hacerlo en Glade, o será mi programa C necesitar algo de código adicional para esto? ¿Hay una manera optimizada para hacer esto, o tengo que poner en práctica los tres comportamientos indicados en el párrafo anterior manualmente?

¿Fue útil?

Solución

Se necesita algo de código C extra, pero no mucho. Para este ejemplo estoy asumiendo que usted está utilizando GtkActions para sus elementos de menú, pero si usted no es la solución debería ser similar.

En primer lugar hacer las devoluciones de llamada para el cortar, copiar y pegar acciones en Glade. Cuando se conecta las señales, pasar un poco de estructura de datos que contiene, al menos, punteros al cortar, copiar y pegar acciones, y la vista de texto, como datos de usuario.

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

A continuación, conectarse a la señal notify::has-selection de su 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);
}

Para determinar el estado inicial de la acción de pasta (en caso de que haya texto en el portapapeles cuando se inicia la aplicación) ejecutar el siguiente código, mientras que usted está construyendo su interfaz:

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

Esto supone que no hay manera para el usuario que desea borrar el portapapeles de forma manual (la mayoría de los programas no le permiten hacer eso.)

Advertencia lector: el código que ha escrito aquí es todo no probado

.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top