Pergunta

Estou fazendo um editor de texto trivial (como exercício) no GTK usando Glade, GTKBuilder e C. Eu tenho um menu de edição com corte, copiar e colar, além de um GTKTextView para o texto. O GTKTextView liga automaticamente as seqüências de corte/copiar/colar por si mesma (e até fornece itens de menu se você clicar com o botão direito do mouse). Quero conectar os itens de menu de corte, copiar e colar na minha barra de menus na minha exibição de texto para que eles atuem como esperado.

Observe que esta é uma conexão de mão dupla. (1) Quando um dos cut, copiar ou colar gtkmenuitem é ativado, ele diz ao GTKTextView para fazer alguma coisa. (2) Quando uma seleção é feita ou limpa no GTKTextView, o corte e a cópia são ativados ou desativados, respectivamente (consulte o GEDIT como exemplo). Além disso, (3) se a pasta está ativada ou não depende do estado da área de transferência.

Como faço para conectar meus itens de menu de corte, copiar e colar na visualização de texto? Existe uma maneira de fazê -lo em Glade, ou meu programa C precisará de algum código extra para isso? Existe uma maneira simplificada de fazer isso ou preciso implementar todos os três comportamentos declarados no parágrafo acima manualmente?

Foi útil?

Solução

Você precisará de algum código C extra, mas não muito. Para este exemplo, estou assumindo que você está usando GtkActions para os itens do seu menu, mas se você não é a solução deve ser semelhante.

Primeiro, faça os retornos de chamada para as ações de corte, copiar e colar em Glade. Quando você conecta os sinais, passa alguma estrutura de dados que contém pelo menos ponteiros para as ações de corte, copiar e colar e a visualização de texto como dados do usuário.

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

Em seguida, conecte -se ao notify::has-selection sinal do seu 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 o estado inicial da ação da pasta (caso haja texto na área de transferência ao iniciar o aplicativo), execute o código a seguir enquanto você está construindo sua interface:

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

Isso pressupõe que não há como o usuário limpar a área de transferência manualmente (a maioria dos programas não deixa você fazer isso.)

LECTOR DE ARVAGEM: O código digitado aqui não é testado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top