Como usar aceleradores no Gtk?

7

Eu preciso fazer uma aplicação no Vala, usando o Gtk, que suporta aceleradores de teclado que podem ser alterados pelo usuário.

Primeiro, adiciono uma entrada ao Gtk.AccelMap global e defino o accel_path para o Gtk.MenuItems. Mas isso não funciona. Os números não aparecem nos itens da barra de menu. Para limpar o que estou tentando fazer, aqui está um código de exemplo:

// main.vala
public class MyWindow: Gtk.Window {
    public MyWindow() {
    this.set_default_size(500, 500);

    var main_box = new Gtk.VBox(false, 0);
    this.add(main_box);

    // Menubar
    var menubar = new Gtk.MenuBar();
    main_box.pack_start(menubar, false, false, 0);

    var file = new Gtk.MenuItem.with_label("File");
    menubar.add(file);

    var file_menu = new Gtk.Menu();
    file.set_submenu(file_menu);

    var quit_mi = new Gtk.MenuItem.with_label("Quit");
    file_menu.append(quit_mi);

    // Register a new accelerator with the global accelerator map
    Gtk.AccelMap.add_entry("<MyWindow>/File/Quit", 'Q', Gdk.ModifierType.CONTROL_MASK);
    quit_mi.set_accel_path("<MyWindow>/File/Quit");

    // Connect signals
    quit_mi.activate.connect(Gtk.main_quit);

    // Label
    var label = new Gtk.Label("My Window");
    main_box.pack_start(label, true, true, 0);

    this.destroy.connect(Gtk.main_quit);
    }
}

int main(string[] args) {
    Gtk.init(ref args);

    var win = new MyWindow();
    win.show_all();

    Gtk.main();
    return 0;
}

Eu uso:

valac main.vala -o main --pkg gtk+-3.0

para compilar o código-fonte.

Então, a pergunta é: o que está faltando no código? Eu acho que preciso fazer outra coisa, mas não sei o quê.

    
por LuisABOL 06.03.2012 / 15:23

1 resposta

3

Poderia, por favor, esclarecer se você quer mnemônicos (atalhos de teclado para widgets GUI, ou seja, ctrl-q) ou aceleradores (atalhos de teclado para ativar itens de menu, por exemplo, alt-f q). Tanto quanto eu entendo estas são duas coisas diferentes, então definir um mnemônico para um item de menu não irá também formar um acelerador para ele.

Em qualquer caso, para os aceleradores você pode formá-los simplesmente criando seus itens de menu com uma função diferente: Gtk.MenuItem.with_mnemonic("_File"); em vez de Gtk.MenuItem.with_label("File") . É então definível com, e. a função file.set_label ('Fil_e')

Para os mnemônicos, não sei exatamente por que não funciona, já que sou totalmente novo no vala. Mas eu pude fazer um “porquinho” de este c-exemplo e fazê-lo funcionar usando grupos de aceleradores em vez do mapa do acelerador. Então eu substituí

// Register a new accelerator with the global accelerator map
Gtk.AccelMap.add_entry("<MyWindow>/File/Quit", 'Q', Gdk.ModifierType.CONTROL_MASK);
quit_mi.set_accel_path("<MyWindow>/File/Quit");enter code here

com

var accel_group = new Gtk.AccelGroup();
this.add_accel_group(accel_group);
quit_mi.add_accelerator("activate", accel_group, 'R', Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE);

e isso parece fazer o truque.

Espero que ajude. Atenciosamente TLE

    
por TLE 17.05.2012 / 19:19