PHP-GTK

Tutorial (třetí díl)

Další widgety, tvorba menu

Doposud jsme se, nepočítajíc okno a box, seznámili jen se dvěma widgety - popiskem (GtkLabel) a tlačítkem (GtkButton). Nyní si ukážeme některé další.

Okna často vyžadují textový vstup uživatele. K tomu účelu je k dispozici třída GtkEntry. Textový vstup vypadá takto:

PHP-GTK screenshot

A takto jej vložíme do zdrojového kódu:

$tlacitko = new GtkEntry("zadej vstup");

Vzájemně související widgety se někdy umísťují do viditelných rámců. Ty jsou zastoupeny třídou GtkFrame. Nejdříve vytvoříme rám a pak pomocí metody add() do něj přidáme celý zpakovaný box s widgety. Je-li rám na nejvyšší úrovni jako v našem ukázkovém příkladě, připojíme jej do okna metodou add().

Ke stanovení popisku rámu se používá metoda set_label(). Stejně jako vpřípadě boxu i zde můžeme k určení šířky okraje použít metodu set_border_width(), čímž si v našem případě zajistíme lepší vzhled výsledku.

Celý kód:

<?php
function UkonciProgram()
 {
 Gtk::main_quit();
 }

$okno = new GtkWindow();
$okno->set_title("moje aplikace");
$okno->set_size_request(200,150);
$okno->connect_simple("destroy","UkonciProgram");

// vytvoreni tlacitka a textoveho vstupu
$vstup =  new GtkEntry("zadej vstup");
$tlacitko = new GtkButton("tlacitko 2");

// vytvoreni boxu
$vert_box = new GtkVBox();
$vert_box->set_border_width(20);
$vert_box->set_spacing(20);
$vert_box->pack_start($vstup,false);
$vert_box->pack_start($tlacitko,false);

// vytvoreni ramu
$ram = new GtkFrame();
$ram->set_border_width(20);   // nastaveni sirky okraje
$ram->set_label("vstup");     // nastaveni popisku
$ram->add($vert_box);         // pridani boxu do ramu


// cely ram pridame do okna
$okno->add($ram);

$okno->show_all();

Gtk::main();

?>
   
PHP-GTK screenshot

ukázka vložení dvou widgetů (textového vstupu a tlačítka) do rámu

Menu

Každé solidní okno aplikace by mělo mít hlavní menu. Nyní si tedy popíšeme jak jej vytvořit. Základem pro menu je objekt třídy GtkMenuBar, který pak v sobě obsahuje jednotlivé položky menu. Ty se vytvářejí za pomoci třídy GtkMenuItem. Celé menu s položkami se pak zpakuje do vertikálního boxu.

Zde je příklad kódu:

<?php

function UkonciProgram()
 {
 Gtk::main_quit();
 }

$okno = new GtkWindow();
$okno->set_title("moje aplikace");
$okno->set_size_request(300,200);
$okno->connect_simple("destroy","UkonciProgram");

// vytvoreni menu
$nabidka = new GtkMenuBar();

// vytvoreni tri polozek menu
$polozka_soubor = new GtkMenuItem("_Soubor");
$polozka_upravy = new GtkMenuItem("_Úpravy");
$polozka_napoveda = new GtkMenuItem("Náp_ověda");

// pripojeni polozek menu k nabidce
$nabidka->append($polozka_soubor);
$nabidka->append($polozka_upravy);
$nabidka->append($polozka_napoveda);

// vytvoreni boxu
$vert_box = new GtkVBox();
$vert_box->pack_start($nabidka,false);

// cely box pridame do okna
$okno->add($vert_box);

$okno->show_all();

Gtk::main();

?>
   
PHP-GTK screenshot

Při vytváření položky menu si všimněme, že pomocí podtržítka před námi zvoleným písmenem určujeme které písmeno má být podtrženo i ve výsledné nabídce. Využijeme-li tuto možnost můžeme pak za běhu aplikace volit položky nabídky stiskem kláves Alt + podtržené písmeno.

Jednotlivé položky jsou ale prázdné, po kliknutí na ně nevyjede žádná další nabídka. Proto je nutno vytvořit další nabídku (submenu) pomocí třídy GtkMenu. Jednotlivé položky, které v něm budou obsaženy se opět vytvářejí třídou GtkMenuItem, načež je připojíme k submenu metodou add(). Nesmíme nakonec zapomenout připojit celé submenu k vybrané položce. V našem ukázkovém příkladě to bude menu soubor.

Kód:

<?php

function UkonciProgram()
 {
 Gtk::main_quit();
 }

$okno = new GtkWindow();
$okno->set_title("moje aplikace");
$okno->set_size_request(300,200);
$okno->connect_simple("destroy","UkonciProgram");

// vytvoreni menu
$nabidka = new GtkMenuBar();

// vytvoreni tri polozek menu
$polozka_soubor = new GtkMenuItem("_Soubor");
$polozka_upravy = new GtkMenuItem("_Úpravy");
$polozka_napoveda = new GtkMenuItem("Náp_ověda");

// pripojeni polozek menu k nabidce
$nabidka->append($polozka_soubor);
$nabidka->append($polozka_upravy);
$nabidka->append($polozka_napoveda);

// vytvoreni submenu a jeho polozek
$menu_soubor = new GtkMenu();
$novy =     new GtkMenuItem("Nový");
$otevrit =  new GtkMenuItem("Otevřít");
$zavrit =   new GtkMenuItem("Zavřít");

// pripojeni polozek do submenu
$menu_soubor->add($novy);
$menu_soubor->add($otevrit);
$menu_soubor->add($zavrit);

// pripojeni celeho submenu k polozce soubor
$polozka_soubor->set_submenu($menu_soubor);

// vytvoreni boxu
$vert_box = new GtkVBox();
$vert_box->pack_start($nabidka,false);

// cely box pridame do okna
$okno->add($vert_box);

$okno->show_all();

Gtk::main();

?>
   
PHP-GTK screenshot

okno s vytvořeným menu a submenu

Jak je vidět, submenu vypadá velice jednoduše, jelikož neobsahuje ikonky. Pokud se nám zasteskne po položkách s obrázky, jen nutno položku menu vytvořit pomocí třídy GtkImageMenuItem namísto GtkMenuItem. Jako parametr se zde volá statická vlastnost určující jaký typ ikonky bude zobrazen. Pro ikonku nového souboru to bude Gtk::STOCK_NEW, pro ikonku k položce otevřít to bude Gtk::STOCK_OPEN a pro položku zavření Gtk::STOCK_CLOSE. Samotné ikonky není třeba zvlášť vytvářet nebo instalovat, jsou totiž součástí PHP-GTK. Nevýhoda toho řešení ale je, že popisek se doplní sám a to podle použité ikonky. Pokud zvolíme Gtk::STOCK_NEW automaticky se objeví položka new v angličtině. Konstruktor obrázkové položky totiž parametr pro popisek nepřijímá. V českém prostředí je to tedy docela nevýhoda.

Problém je však řešitelný. Stačí vytvořit samostatný widget Image, kterému metodou set_from_stock() přiřadíme požadovanou ikonku statickou vlastností Gtk::STOCK_... , jako druhý parametr je velikost ikonky (v přednastavených hodnotách). Takto vytvořený obrázek je nutno připojit metodou set_image k obrázkové položce, tedy k objektu třídy GtkImageMenuItem.

Vše opět osvětlí ukázka kódu:

<?php

function UkonciProgram()
 {
 Gtk::main_quit();
 }

$okno = new GtkWindow();
$okno->set_title("moje aplikace");
$okno->set_size_request(300,200);
$okno->connect_simple("destroy","UkonciProgram");


// vytvoreni menu
$nabidka = new GtkMenuBar();

// vytvoreni tri polozek menu
$polozka_soubor =   new GtkMenuItem("_Soubor");
$polozka_upravy =   new GtkMenuItem("_Úpravy");
$polozka_napoveda = new GtkMenuItem("Náp_ověda");

$nabidka->append($polozka_soubor);
$nabidka->append($polozka_upravy);
$nabidka->append($polozka_napoveda);


// vytvoreni obrazku pro polozky submenu
$obrazek = new GtkImage();
$obrazek->set_from_stock(Gtk::STOCK_NEW,1);     // nastaveni obrazku

$obrazek2 = new GtkImage();
$obrazek2->set_from_stock(Gtk::STOCK_OPEN,1);   // nastaveni obrazku

$obrazek3 = new GtkImage();
$obrazek3->set_from_stock(Gtk::STOCK_CLOSE,1);  // nastaveni obrazku


// vytvoreni submenu a jeho obrazkovych polozek
$menu_soubor = new GtkMenu();
$novy =     new GtkImageMenuItem("Nový");
 $novy->set_image($obrazek);                    // prirazeni obrazku
$otevrit =  new GtkImageMenuItem("Otevřít");
 $otevrit->set_image($obrazek2);                // prirazeni obrazku
$zavrit =   new GtkImageMenuItem("Zavřít");
 $zavrit->set_image($obrazek3);                 // prirazeni obrazku

// pripojeni polozek do submenu
$menu_soubor->add($novy);
$menu_soubor->add($otevrit);
$menu_soubor->add($zavrit);

// pripojeni celeho submenu k polozce soubor
$polozka_soubor->set_submenu($menu_soubor);

// vytvoreni boxu
$vert_box = new GtkVBox();
$vert_box->pack_start($nabidka,false);

// cely box pridame do okna
$okno->add($vert_box);

$okno->show_all();

Gtk::main();

?>
   

A takto se vše projeví vizuálně:

PHP-GTK screenshot

Na závěr práce s okny připojíme stavový řádek. K tomu slouží třída GtkStatusbar. Nezbytné je použití dvou metod a to get_context_id(), jenž vrací identifikátor pro práci se stavovým řádkem, a push(), díky níž je možné do stavového řádku vložit text. Tato metoda očekává dva parametry. Prvním je identifikátor, který jsme získali metodou get_context_id(), druhým parametrem je text, který se má ve stavovém řádku objevit.

Stavový řádek se nepřichytává ke spodnímu okraji okna automaticky, je třeba ho zpakovat do některého boxu a pak zvolením metody pack_end, umístit zcela dolů.
Zdrojový kód:

<?php

function UkonciProgram()
 {
 Gtk::main_quit();
 }

$okno = new GtkWindow();
$okno->set_title("moje aplikace");
$okno->set_size_request(300,200);
$okno->connect_simple("destroy","UkonciProgram");


// vytvoreni menu
$nabidka = new GtkMenuBar();

// vytvoreni tri polozek menu
$polozka_soubor =   new GtkMenuItem("_Soubor");
$polozka_upravy =   new GtkMenuItem("_Úpravy");
$polozka_napoveda = new GtkMenuItem("Náp_ověda");

$nabidka->append($polozka_soubor);
$nabidka->append($polozka_upravy);
$nabidka->append($polozka_napoveda);


// vytvoreni obrazku pro polozky submenu
$obrazek = new GtkImage();
$obrazek->set_from_stock(Gtk::STOCK_NEW,1);     // nastaveni obrazku

$obrazek2 = new GtkImage();
$obrazek2->set_from_stock(Gtk::STOCK_OPEN,1);   // nastaveni obrazku

$obrazek3 = new GtkImage();
$obrazek3->set_from_stock(Gtk::STOCK_CLOSE,1);  // nastaveni obrazku


// vytvoreni submenu a jeho obrazkovych polozek
$menu_soubor = new GtkMenu();
$novy =     new GtkImageMenuItem("Nový");
 $novy->set_image($obrazek);                    // prirazeni obrazku
$otevrit =  new GtkImageMenuItem("Otevřít");
 $otevrit->set_image($obrazek2);                // prirazeni obrazku
$zavrit =   new GtkImageMenuItem("Zavřít");
 $zavrit->set_image($obrazek3);                 // prirazeni obrazku

// pripojeni polozek do submenu
$menu_soubor->add($novy);
$menu_soubor->add($otevrit);
$menu_soubor->add($zavrit);

// pripojeni celeho submenu k polozce soubor
$polozka_soubor->set_submenu($menu_soubor);

// vytvoreni stavoveho radku
$stavovy = new GtkStatusbar();
$id = $stavovy->get_context_id('priklad');
$stavovy->push($id,"Program běží");

// vytvoreni boxu
$vert_box = new GtkVBox();
$vert_box->pack_start($nabidka,false);
$vert_box->pack_end($stavovy,false);  // zpakovani stavoveho radku

// cely box pridame do okna
$okno->add($vert_box);

$okno->show_all();

Gtk::main();

?>
   
PHP-GTK screenshot

okno aplikace se stavovým řádkem

Přejít na další díl