PHP-GTK

Tutorial (druhý díl)

Boxy

Box se dá popsat jako kontejner do kterého můžete umístit více prvků jako jsou právě popisky, tlačítka a další grafická individua, která jsou v oficiální dokumentaci PHP-GTK nazývána jako Widgety. Tohoto pojmenování se budeme držet v dalším textu stránky.

Samotný box není v okně vidět, nevidíme tedy přesně jeho hranice a odkud kam sahá. Je to tedy kontejner spíše pomyslný. Do boxu je možno vložit několik widgetů různého typu. Box může být buďto vertikální nebo horizontální. Ve vertikálním boxu jsou widgety uloženy pod sebou, v horizontálním boxu vedle sebe. Nyní můžeme sestavit kód na kterém je možno demonstrovat, že do boxu je možné umístit více widgetů než jeden. Vložíme do vertikálního boxu popisek a dva tlačítka:

<?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");

// vytvorime popisek a dva tlacitka
$popisek = new GtkLabel("obsah popisku");
$tlacitko = new GtkButton("tlacitko 1");
$tlacitko2 = new GtkButton("tlacitko 2");

// vytvorime vertikalni box
$vert_box = new GtkVBox();

// do vertikalniho boxu pridame popisek a dva tlacitka
$vert_box->add($popisek);
$vert_box->add($tlacitko);
$vert_box->add($tlacitko2);

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

$okno->show_all();

Gtk::main();

?>
   

Celý výsledek vypadá takto:

PHP-GTK screenshot

Velice snadno teď je možno upravit program tak, aby jsme si ukázali jak se widgety řadí i v horizontálním boxu. Stačí v řádku kde vytváříme box změnit slovo GtkVBox na GtkHBox:

$vert_box = new GtkHBox();

Jak je ale vidět, po vizuální stránce to stále není ono. Použili jsme totiž pro přidání widgetů do boxu metodu add(), která je poměrně primitivní. Proto se doporučuje používat tzv. pakování widgetů.

Pakování widgetů

Pakování widgetů je druhá možnost jak umístit do boxu widgety (vedle metody add). Pakování je o něco složitější, dává ale více možností. Pro účel pakování je k dispozici metoda pack_start().

Pro začátek zkusme zapakovat dva tlačítka. Z posledně použitého kódu odstraňme řádky, kterými jsme widgety přidávali do boxu metodou add(). Místo nich připojme k boxu metodu pack_start(). Jejím prvním parametrem bude odkaz na widget, druhým parametrem bude booleovská hodnota, která určuje zda má objekt expandovat či nikoli. Právě tato vlastnost určuje vzhled tlačítek, které se nám při předešlých pokusech vykreslovaly příliš velké. Parametr určující zda bude widget expandovat je implicitně nastaven na true (bude expandovat), tudíž chceme-li dosáhnout obvyklého vzhledu tlačítek, musíme explicitně zadat hodnotu false.

Níže vidíte zdrojový kód a pod ním vizuální výsledek:

<?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");

// vytvorime dva tlacitka
$tlacitko = new GtkButton("tlacitko 1");
$tlacitko2 = new GtkButton("tlacitko 2");

// vytvorime vertikalni box
$vert_box = new GtkVBox();

// zpakujeme dva tlacitka do boxu
$vert_box->pack_start($tlacitko,false);
$vert_box->pack_start($tlacitko2,false);

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

$okno->show_all();

Gtk::main();

?>
PHP-GTK screenshot

Metoda pack_start může přijímat ještě další argumenty. Jako třetí může být přítomna booleovská hodnota určující zda se má objekt vyplnit či nikoli, tuto vlastnost ale při našich současných pokusech nevyužijeme. Jako mnohem užitečnější se může jevit čtvrtý argument, kterým zadáváme šířku okraje widgetu. Můžeme tak ovlivnit vzájemný odstup mezi widgety. Použití metody pack_start() pak vypadá např. takto:

$vert_box->pack_start($tlacitko,false,false,20);

Aby vše fungovalo musí být zadány všechny čtyři argumenty. Jestliže pozměníme doplníme metodu pack_start o uvedené další argumenty a navíc pro oba tlačítka, výsledek bude takovýto:

PHP-GTK screenshot

K metodě pack_start() existuje ještě její opačná varianta a to doslova. Spojuje totiž widgety v opačném pořadí a skládá je od dolního okraje okna. Jde o metodu pack_end(). Použití jejich argumentů je shodné s metodou pack_start().

PHP-GTK screenshot

výsledek použití metody pack_end()

Metody pack_start() a pack_end() je možno použít současně i v rámci jednoho boxu. Některé widgety tak můžeme umístit k hornímu okraji, jiné k dolnímu.

Příklad:

$vert_box->pack_start($tlacitko,false,false,10);
$vert_box->pack_end($tlacitko2,false,false,10);
   
PHP-GTK screenshot

výsledek současného použití metod pack_start() a pack_end() v jednom boxu

Boxů může být v jednom okně pochopitelně více a je také možné je do sebe vnořovat. Jestliže má být v jednom okně více boxů, musíme všechny vnořit do jednoho rodičovského. Je to tím, že metodu okna add() můžeme použít jen jednou, jak jsme si již ukázali dříve.Vnořené boxy tak musíme zpakovat do rodičovského (nadřazeného) boxu, který posléze konečně připojíme do okna metodou add().

Následující příklad ukazuje zdrojový kód, který vytváří dva boxy, každý se dvěma tlačítky. Oba boxy jsou poté zpakovány do třetího rodičovského boxu a přidány do okna metodou add().

<?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");

// vytvorime ctyri tlacitka
$tlacitko =  new GtkButton("tlacitko 1");
$tlacitko2 = new GtkButton("tlacitko 2");
$tlacitko3 = new GtkButton("tlacitko 3");
$tlacitko4 = new GtkButton("tlacitko 4");


// vytvorime vertikalni box a zpakujeme do nej prvni dva tlacitka
$vert_box = new GtkVBox();
$vert_box->pack_start($tlacitko,false);
$vert_box->pack_start($tlacitko2,false);


// vytvorime druhy vertikalni box a zpakujeme do nej zbyvajici dva tlacitka
$vert_box2 = new GtkVBox();
$vert_box2->pack_start($tlacitko3,false);
$vert_box2->pack_start($tlacitko4,false);

// vytvorime rodicovsky box do ktereho zpakujeme dva predchozi
$rodicovsky_box = new GtkVBox();
$rodicovsky_box->pack_start($vert_box,false);
$rodicovsky_box->pack_end($vert_box2,false);


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

$okno->show_all();

Gtk::main();

?>

   

Výsledek:

PHP-GTK screenshot

 

Takto to bude vypadat jestliže do rodičovského boxu budeme pakovat tlačítka vložené v horizontálních boxech:

PHP-GTK screenshot

Nakonec si ještě ukážeme, které další metody můžeme u boxů použít, abychom ovlivnili vizuální stránku výsledku.

Užitečné může být nastavit boxu šířku jeho (neviditelného) okraje. K tomu slouží metoda set_border_width(). Přijímá jeden argument, kterým je šírka okraje v pixelech. Příklad zápisu:

$rodicovsky_box->set_border_width(20);    //sirka okraje 20 pixelu

Pokud budeme chtít ovlivnit vzájemné rozestupy mezi widgety použijme metodu set_spacing(). Hodnotu rozestupu opět zadáváme v pixelech. Příklad zápisu:

$vert_box->set_spacing(20);
PHP-GTK screenshot

výsledek použití metody set_border_width() na rodičovský box a metody set spacing() na oba vnořené boxy s tlačítky

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