Portál AbcLinuxu, 5. května 2025 18:54

Dotaz: Gtk3 Perl menu a klávesové zkratky

Brilantní modř avatar 18.4.2013 13:36 Brilantní modř | skóre: 14
Gtk3 Perl menu a klávesové zkratky
Přečteno: 300×
Odpovědět | Admin

Dobrý den.

Budu rád, když mi někdo, kdo se vyzná, pomůže.

Nejdřív se prosím podívejte na tento obrázek. Je na něm otevřené menu Soubor editoru Bluefish, nalevo v tomto menu jsou jednotlivé položky a u některých z nich je napravo uvedena klávesová zkratka.

Mám dotaz, který se týká zobrazení klávesových zkratek v menu (tak, jak je to na obrázku): Jak se to dá udělat v Gtk2 nebo Gtk3 Perlu?

Mějme tento kód:

#!/usr/bin/perl
use strict;
use warnings;
use locale;
use utf8;
use Glib qw(TRUE FALSE);
use Gtk3;

sub quitf {
    Gtk3->main_quit();
}

Gtk3->init;

my $label = Gtk3::Label->new("Hokusy pokusy...");

my $statusbar = Gtk3::Statusbar->new();
my $context_id_label = $statusbar->get_context_id("working_label");
my $message_id_label = $statusbar->push($context_id_label, "Experiment se stavovým řádkem");

my $menu_bar = Gtk3::MenuBar->new();

my $menu_bar_item_hokus = Gtk3::MenuItem->new();
$menu_bar_item_hokus->set_label("Hokus");

my $menu_bar_item_pokus = Gtk3::MenuItem->new();
$menu_bar_item_pokus->set_label("Pokus");

$menu_bar->append($menu_bar_item_hokus);
$menu_bar->append($menu_bar_item_pokus);

my $menu_hokus = Gtk3::Menu->new();

my $menu_hokus_item_soubor = Gtk3::MenuItem->new();
$menu_hokus_item_soubor->set_label("Soubor");

my $menu_hokus_item_novy = Gtk3::MenuItem->new();
$menu_hokus_item_novy->set_label("Nový");

my $menu_hokus_item_ulozit = Gtk3::MenuItem->new();
$menu_hokus_item_ulozit->set_label("Uložit");

my $menu_hokus_item_zavrit = Gtk3::MenuItem->new();
$menu_hokus_item_zavrit->set_label("Zavřít");

$menu_hokus->append($menu_hokus_item_soubor);
$menu_hokus->append($menu_hokus_item_novy);
$menu_hokus->append($menu_hokus_item_ulozit);
$menu_hokus->append($menu_hokus_item_zavrit);

$menu_bar_item_hokus->set_submenu($menu_hokus);

my $menu_pokus = Gtk3::Menu->new();

my $menu_pokus_item_napoveda = Gtk3::MenuItem->new();
$menu_pokus_item_napoveda->set_label("Nápověda");

my $menu_pokus_item_oaplikaci = Gtk3::MenuItem->new();
$menu_pokus_item_oaplikaci->set_label("O aplikaci");

$menu_pokus->append($menu_pokus_item_napoveda);
$menu_pokus->append($menu_pokus_item_oaplikaci);

$menu_bar_item_pokus->set_submenu($menu_pokus);

my $vbox = Gtk3::VBox->new(0, 5);
$vbox->pack_start($menu_bar, FALSE, FALSE, 0);
$vbox->pack_start($label, FALSE, FALSE, 5);
$vbox->pack_end($statusbar, FALSE, FALSE, 0);

my $window = Gtk3::Window->new("toplevel");
$window->signal_connect("destroy" => sub {
    &quitf();
});
$window->add($vbox);
$window->show_all();

Gtk3->main;

__END__

Co do něj přidat, aby se dosáhlo kýženého výsledku?

Mám totiž (jinou) aplikaci, která podporuje různé klávesové zkratky, a já bych je chtěl uvést v hlavním menu u jeho jednotlivých položek, tak, jak je to zvykem.

Předem děkuji za všechny podnětné odpovědi.


Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Řešení 1× (Brilantní modř (tazatel))
18.4.2013 19:14 potato
Rozbalit Rozbalit vše Re: Gtk3 Perl menu a klávesové zkratky
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nebudu se pokoušet psát něco v Perlu, nicméně jsou různé možnosti. Udělat to totálně ručně včetně vytváření GtkAccelLabel a jejich cpaní do těch položek menu. To vynechávám. Udělat to celé high-level přes UIManager, builder, etc. a nematlat se s konstrukcí widgetů v kódu. To asi nechceš. Takže ta středně ruční cesta:

1. Nastavíš položkám menu accel_path (cestu).

2. Vytvoříš (nebo zrecykluješ) AccelGroup, kterou nastavíš jak těm menu, tak tomu oknu.

3. Definuješ akcelerátory pomocí accel_map_add_entry(), která bere právě ty cesty nastavené v bodě 1.

Příklad v Pythonu bude snad alespoň trochu podobný:
from gi.repository import Gtk, Gdk

w = Gtk.Window()
w.set_default_size(300, -1)
w.connect('destroy', Gtk.main_quit)

m = Gtk.MenuBar()
w.add(m)

i = Gtk.MenuItem()
i.set_label('Menu')
i.set_accel_path('<main>/Menu')
m.add(i)

mm = Gtk.Menu()
i.set_submenu(mm)
mm.set_accel_group(Gtk.AccelGroup())
w.add_accel_group(mm.get_accel_group())

ii = Gtk.MenuItem(label='Text')
ii.set_accel_path('<main>/Menu/Test')
mm.add(ii)

a = Gtk.AccelMap.get()
a.add_entry('<main>/Menu/Test', Gdk.KEY_t, Gdk.ModifierType.CONTROL_MASK)

w.show_all()
Gtk.main()

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.