17 августа 2009 г.

Создаём меню окна. Горячие клавиши

Очень важной частью любой программы являются горячие клавиши. Именно о них сегодня и поговорим.


Сначала необходимо установить специальную группу для горячих клавиш - GtkAccelGroup. Хочу заметить, что комбинации клавиш из этой группы будут действовать по всей площади окна, независимо от активного в данный момент виджета.
$accel_group = new GtkAccelGroup();
$window->add_accel_group($accel_group);

Теперь необходимо к каждому пункту меню применить метод add_accelerator(). Первым параметром передаётся сигнал, издаваемый при нажатии соответствующей комбинации, вторым - GtkAccelGroup, третьим - модификатор горячей клавиши (полный список модификаторов находится здесь), четвёртым - вторая клавиша из комбинации. Ниже представлен список некоторых наиболее полезных модификаторов для четвёртого параметра (полный список находится здесь):

  • Gdk::CONTROL_MASK - клавиша Ctrl
  • Gdk::SHIFT_MASK - клавиша Shift
  • Gdk::MOD1_MASK - клавиша Alt
  • Gdk::SUPER_MASK - клавиша Super (в терминологии Linux) или Win (в терминологии Windows)

Пятым параметром указывается некий флаг. Я всегда использую значение 1.
$open->add_accelerator('activate', $accel_group, Gdk::KEY_O, Gdk::CONTROL_MASK, 1);


Полный код программы:

<?php
 
$window = new GtkWindow();
$window->set_position(Gtk::WIN_POS_CENTER);
$window->set_size_request(200, -1);
$window->connect_simple('destroy', array('Gtk', 'main_quit'));
 
$accel_group = new GtkAccelGroup();
$window->add_accel_group($accel_group);
 
$vbox = new GtkVBox();
 
$menubar = new GtkMenuBar();
$vbox->pack_start($menubar, FALSE, FALSE, 0);
 
$file = new GtkMenuItem('_Файл');
 
$menubar->append($file);
 
$sub_file = new GtkMenu();
$file->set_submenu($sub_file);
 
$open = new GtkMenuItem('_Открыть');
$open->add_accelerator('activate', $accel_group, Gdk::KEY_O, Gdk::CONTROL_MASK, 1);
$open->connect('activate', 'on_activate');
$sub_file->append($open);
 
$save = new GtkMenuItem('_Сохранить');
$save->add_accelerator('activate', $accel_group, Gdk::KEY_S, Gdk::CONTROL_MASK, 1);
$save->connect('activate', 'on_activate');
$sub_file->append($save);
 
$quit = new GtkMenuItem('_Выход');
$quit->add_accelerator('activate', $accel_group, Gdk::KEY_Q, Gdk::CONTROL_MASK, 1);
$quit->connect_simple('activate', array('Gtk', 'main_quit'));
$sub_file->append($quit);
 
function on_activate($menu)
{
echo $menu->child->get_label()."\n";
}
 
$window->add($vbox);
$window->show_all();
Gtk::main();
 
?>

Комментариев нет: