|
Packit |
1470ea |
|
|
Packit |
1470ea |
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" xmlns:xi="http://www.w3.org/2001/XInclude" type="topic" style="task" id="02_welcome_to_the_grid.js" xml:lang="cs">
|
|
Packit |
1470ea |
<info>
|
|
Packit |
1470ea |
<link type="guide" xref="beginner.js#tutorials"/>
|
|
Packit |
1470ea |
<link type="seealso" xref="grid.js"/>
|
|
Packit |
1470ea |
<link type="seealso" xref="image.js"/>
|
|
Packit |
1470ea |
<link type="seealso" xref="label.js"/>
|
|
Packit |
1470ea |
<revision version="0.1" date="2012-07-28" status="draft"/>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<credit type="author copyright">
|
|
Packit |
1470ea |
<name>Taryn Fox</name>
|
|
Packit |
1470ea |
<email its:translate="no">jewelfox@fursona.net</email>
|
|
Packit |
1470ea |
<years>2012</years>
|
|
Packit |
1470ea |
</credit>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<desc>Naučte se, jak rozvrhnout komponenty uživatelského rozhraní, jako jsou obrázky a popisky.</desc>
|
|
Packit |
1470ea |
</info>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<title>2. Vítejte v mřížce</title>
|
|
Packit |
1470ea |
<synopsis>
|
|
Packit |
1470ea |
V této lekci si ukážeme, jak vytvořit základní widgety nebo části uživatelského rozhraní GNOME, jako jsou obrázky (Image) a popisky (Label). Po té se naučíte, jak je uspořádat do mřížky (Grid), která vám umožní umístit widgety právě tam, kde je chcete.
|
|
Packit |
1470ea |
<note style="warning">Prošli jste již <link xref="hellognome.js">první lekcí v této sérii</link>? Než budete pokračovat, bylo by to dobré udělat. </note>
|
|
Packit |
1470ea |
</synopsis>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<links type="section"/>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="native">
|
|
Packit |
1470ea |
<title>Buďme přirození</title>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
V předchozí lekci jsme vytvořili něco, co bylo v podstatě okno GNOME s rámem pro webovou aplikaci. Vše, co jsme se potřebovali naučit z kódu specifického pro GNOME, se točilo okolo vložení WebView – widgetu obsahujícího naši aplikaci – do ApplicationWindow a jak mu říct, aby se zobrazil. K napsání vlastní aplikace byly použity HTML a JavaScript, podobně jako u webových stránek.
|
|
Packit |
1470ea |
Tentokrát budeme používat jen nativní widgety GNOME. Widget je prostě věc, jako zaškrtávací políčko nebo obrázek, a GNOME jich má širokou nabídku, ze které můžete vybírat. Nazýváme je „nativní“ widgety kvůli odlišení od věcí, jako jsou tlačítka nebo nadpisy ve webové aplikaci, kterou jsme napsali. Protože místo webového kódu použijeme GTK+, půjde o 100% aplikaci GNOME.
|
|
Packit |
1470ea |
<note style="tip">GTK+ je zkratka pro „GIMP Toolkit“. Je to nástrojová sada widgetů, po kterých můžeme sáhnout, když stavíme naši aplikaci. Původně byly napsány pro <link href="http://www.gimp.org/">GIMP</link>, což je svobodný grafický editor. </note>
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="setup">
|
|
Packit |
1470ea |
<title>Nastavení vaší aplikace</title>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Než začneme tahat widgety z nástrojové sady GTK+, musíme nejdříve napsat základní kód, který aplikace vyžaduje a tak se s ním setkáte často.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#!/usr/bin/gjs
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
imports.gi.versions.Gtk = '3.0';
|
|
Packit |
1470ea |
const Gtk = imports.gi.Gtk;
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Tato část je vždy na začátku kódu. V závislosti na tom, co přesně hodláte dělat, zde můžete deklarovat i další importy. To, co píšeme teď, je docela jednoduché, takže nám to bude stačit takto. Gtk pro widgety používající stabilní API 3.0.
|
|
Packit |
1470ea |
Když už o tom mluvíme:
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
class WelcomeToTheGrid {
|
|
Packit |
1470ea |
// Vytvoří vlastní aplikaci
|
|
Packit |
1470ea |
constructor() {
|
|
Packit |
1470ea |
this.application = new Gtk.Application();
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Napojí signály "activate" a "startup" k funkcím zpětného volání
|
|
Packit |
1470ea |
this.application.connect('activate', this._onActivate.bind(this));
|
|
Packit |
1470ea |
this.application.connect('startup', this._onStartup.bind(this));
|
|
Packit |
1470ea |
},
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Funkce zpětného volání pro signál "activate" zobrazující okno při aktivaci
|
|
Packit |
1470ea |
_onActivate: function () {
|
|
Packit |
1470ea |
this._window.present ();
|
|
Packit |
1470ea |
},
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Funkce zpětného volání pro signál "startup" sestavující uživatelské rozhraní
|
|
Packit |
1470ea |
_onStartup: function () {
|
|
Packit |
1470ea |
this._buildUI ();
|
|
Packit |
1470ea |
},
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Toto je začátek vlastní aplikace a funkce _init ji vytvoří. Aplikace pak řekne funkci _buildUI , aby vytvořila ApplicationWindow, který budeme nazývat _window a našemu oknu se říká, aby se zobrazilo, kdykoliv je potřeba.
|
|
Packit |
1470ea |
Tato část je opět do značné míry vytvořena stylem kopírovat-a-vložit, akorát je potřeba dát aplikaci vždy jedinečný název.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Sestaví uživatelské rozhraní aplikace
|
|
Packit |
1470ea |
_buildUI {
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Vytvoří okno aplikace
|
|
Packit |
1470ea |
this._window = new Gtk.ApplicationWindow({
|
|
Packit |
1470ea |
application: this.application,
|
|
Packit |
1470ea |
window_position: Gtk.WindowPosition.CENTER,
|
|
Packit |
1470ea |
border_width: 10,
|
|
Packit |
1470ea |
title: "Welcome to the Grid"});
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Nakonec spustíme funkci _buildUI vytvořením nového ApplicationWindow. Určíme naší aplikaci, že se má objevit uprostřed obrazovky a že by mělo být nejméně 10 pixelů mezi vnější hranou a widgety uvnitř. Rovněž ji přidělíme název, který se objeví v záhlaví okna.
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="toolbox">
|
|
Packit |
1470ea |
<title>Po čem sáhnout do nástrojové sady GTK+</title>
|
|
Packit |
1470ea |
Které widgety bychom měli použít? Řekněme, že chceme napsat aplikaci, která vypadá nějak takto:
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<media type="image" mime="image/png" src="media/02_jsgrid_01.png"/>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
K tomu budeme potřebovat aspoň obrázek a textový popisek. Začněme obrázkem:
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Vytvoří obrázek
|
|
Packit |
1470ea |
this._image = new Gtk.Image ({ file: "gnome-image.png" });
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Obrázek použitý v tomto příkladu si můžete stáhnout <link href="https://live.gnome.org/TarynFox?action=AttachFile&do=get&target=gnome-image.png">zde</link>. Zajistěte, aby byl uložený ve stejné složce, jako kód, který píšete.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Vytvoří popisek
|
|
Packit |
1470ea |
this._label = new Gtk.Label ({ label: "Welcome to GNOME, too!" });
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Tento kód pod něj přidá popisek. Zde můžete vidět, jak se vytváří widgety. Všechny jsou součástí Gtk a mi jim udáváme vlastnosti, kterými si přizpůsobíme, jak se mají chovat. V tomto případě widgetu Image nastavíme vlastnost file na název souboru s obrázkem a popisku vlastnost label na větu, kterou chceme mít pod obrázkem.
|
|
Packit |
1470ea |
<note style="tip">Ano, to že má Label vlastnost label vypadá jako zdvojování, ale není tomu tak. Ostatní widgety, které obsahují text, mají vlastnost label , takže kvůli jednotnosti je tomu tak i u widgetu Label. </note>
|
|
Packit |
1470ea |
Tyto widgety nemůžeme do našeho okna jen tak přidat ve správném pořadí, podobně jako se to dělá s prvky HTML na webové stránce. Kvůli tomu, že ApplicationWindow může obsahovat jen jeden widget.
|
|
Packit |
1470ea |
Co s tím? Vytvoříme kontejnerový widget, který může obsahovat více než jeden widget a umí je uspořádat. Pohleďte: mřížka.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Vytvoří mřížku
|
|
Packit |
1470ea |
this._grid = new Gtk.Grid ();
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Neudali jsme jí žádné vlastnosti. To uděláme až později, až se naučíme s mřížkou pořádně zacházet. Nejprve pojďme do námi vytvořené mřížky připojit obrázek a popisek.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Připojení obrázku a popisku do mřížky
|
|
Packit |
1470ea |
this._grid.attach (this._image, 0, 0, 1, 1);
|
|
Packit |
1470ea |
this._grid.attach (this._label, 0, 1, 1, 1);
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Tento kód vypadá strašně složitě, ale není tomu tak. Zde je popsáno, co jednotlivá čísla znamenají:
|
|
Packit |
1470ea |
<list type="numbered">
|
|
Packit |
1470ea |
<item>První číslo je pozice ve směru zleva doprava, na kterou se má widget umístit, počínaje od 0. Widget, který použije 0, patří úplně doleva. </item>
|
|
Packit |
1470ea |
<item>Druhé číslo je pozice ve směru shora dolů, na kterou se má daný widget umístit, počínaje od 0. Popisek má být pod obrázkem, takže widget Image dostane pozici 0 a Label pozici 1. </item>
|
|
Packit |
1470ea |
<item>Třetí a čtvrté číslo udává kolik sloupců a řádků má widget okupovat. Za minutku uvidíme, jak to funguje. </item>
|
|
Packit |
1470ea |
</list>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Přidá mřížku do okna
|
|
Packit |
1470ea |
this._window.add (this._grid);
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Zobrazí okno a všechny jeho synovské widgety
|
|
Packit |
1470ea |
this._window.show_all();
|
|
Packit |
1470ea |
}
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
};
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Spustí aplikaci
|
|
Packit |
1470ea |
let app = new WelcomeToTheGrid ();
|
|
Packit |
1470ea |
app.application.run (ARGV);
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Nyní máme vytvořenou mřížku a do ní připojené všechny naše widgety, přidali jsme ji do okna a oknu, jako poslední část funkce _buildUI, řekli, ať se zobrazí. Jako vždy končíme vytvořením nové instance třídy aplikace a jejím spuštěním.
|
|
Packit |
1470ea |
Uložte svoji aplikaci jako <file>welcome_to_the_grid.js</file>. Následně ji spusťte tak, že otevřete terminál, přepnete se do složky, ve které je vaše aplikace, a napíšete:
|
|
Packit |
1470ea |
<screen> <output style="prompt">$ </output>gjs welcome_to_the_grid.js </screen>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<media type="image" mime="image/png" src="media/02_jsgrid_02.png"/>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Ono to funguje! Ale… Nevypadá to úplně hezky. Proč je popisek nalepený těsně na obrázek? To jednak není estetické a jedna se to špatně čte. Co s tím můžeme udělat?
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="tweaking">
|
|
Packit |
1470ea |
<title>Vyladění mřížky</title>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Jedna z věcí, kterou můžeme udělat, je udat popisku při vytváření vlastnost margin_top . Funguje to podobně, jako nastavení vlastnosti „margin“ u prvků HTML pomocí stylování CSS.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Vytvoří popisek
|
|
Packit |
1470ea |
this._label = new Gtk.Label ({
|
|
Packit |
1470ea |
label: "Welcome to GNOME, too!",
|
|
Packit |
1470ea |
margin_top: 20 });
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Samozřejmě, že když popisek nahradíme něčím jiným, nebo přidáme další widget, musíme nastavení margin_top zopakovat i u něj. Jinak s končíme s něčím takovýmto:
|
|
Packit |
1470ea |
<media type="image" mime="image/png" src="media/02_jsgrid_03.png"/>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Mohli bychom udat vlastnost margin_bottom u obrázku, ale to by nefungovalo správně, když by nový popisek byl v jiném sloupci. Takže pojďme to místo toho zkusit takto:
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Vytvoří mřížku
|
|
Packit |
1470ea |
this._grid = new Gtk.Grid ({
|
|
Packit |
1470ea |
row_spacing: 20 });
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
To zajistí, že vodorovně mezi všemi řádky bude vždy prostor 20 pixelů.
|
|
Packit |
1470ea |
<note style="tip">Ano, obdobně můžeme nastavit vlastnost mřížky column_spacing nebo vlastnosti margin_left a margin_right u libovolného widgetu. Jestli chcete, vyzkoušejte si to! </note>
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="adding">
|
|
Packit |
1470ea |
<title>Přidání dalších widgetů</title>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Pokud bychom chtěli přidat druhý popisek, jak bychom to vlastně měli udělat, aby to na pohled vypadalo, že tam patří? Jedním ze způsobů je obrázek nahoře umístit na střed, tak aby byl nad oběma popisky a ne jen nad jedním vlevo. To je ta situace, kdy ostatní čísla u metody pro připojení do mřížky, přijdou vhod:
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Vytvoří druhý popisek
|
|
Packit |
1470ea |
this._labelTwo = new Gtk.Label ({
|
|
Packit |
1470ea |
label: "The cake is a pie." });
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Připojí obrázek a popisky do mřížky
|
|
Packit |
1470ea |
this._grid.attach (this._image, 0, 0, 2, 1);
|
|
Packit |
1470ea |
this._grid.attach (this._label, 0, 1, 1, 1);
|
|
Packit |
1470ea |
this._grid.attach (this._labelTwo, 1, 1, 1, 1);
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Po té, co vytvoříme druhý popisek, připojíme jej do mřížky napravo od prvního popisku. Pamatujete, že první dvě čísla udávají číslo sloupce a řádku zleva doprava a shora dolů, počítáno od 0? Takže, když je první popisek v sloupci 0 a řádku 1, můžeme vložit druhý do sloupce 1 a řádku 1, aby byl napravo od prvního.
|
|
Packit |
1470ea |
Podívejme se na číslo 2 ve výrazu pro připojení obrázku. V něm je ten trik. Toto číslo znamená, přes kolik sloupců se obrázek roztáhne, pamatujete? Takže, když to dáme vše dohromady, dostaneme něco takového:
|
|
Packit |
1470ea |
<media type="image" mime="image/png" src="media/02_jsgrid_04.png"/>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Jsou zde dvě věci, které byste měli vzít na vědomí.
|
|
Packit |
1470ea |
<list>
|
|
Packit |
1470ea |
<item>Natavení obrázku, aby zabíral dva sloupce, přímo obrázek nijak neroztáhne. Místo toho roztáhne neviditelný box obsazený widgetem Image tak, aby zaplnil oba sloupce a obrázek pak umístí do středu tohoto boxu. </item>
|
|
Packit |
1470ea |
<item>I když jsme nastavili vlastnosti row_spacing u mřížky a border_width u okna aplikace, nemáme zatím nic, co by vložilo okraj mezi dva popisky. Dříve byly odděleny díky tomu, že obrázek zabíral jen jeden sloupec, ale nyní, když je roztažen přes oba sloupce, nevidí GNOME důvod k tomu, držet popisky oddělené. </item>
|
|
Packit |
1470ea |
</list>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Existují aspoň tři způsoby, jak vyřešit druhou záležitost. Jako první můžeme nastavit u jednoho z popisků margin_left nebo margin_right :
|
|
Packit |
1470ea |
<media type="image" mime="image/png" src="media/02_jsgrid_05.png"/>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Zadruhé můžeme nastavit vlastnost mřížky column_homogenous na true .
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Vytvoří mřížku
|
|
Packit |
1470ea |
this._grid = new Gtk.Grid ({
|
|
Packit |
1470ea |
column_homogeneous: true,
|
|
Packit |
1470ea |
row_spacing: 20 });
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Ve výsledku to bude vypadat nějak takto:
|
|
Packit |
1470ea |
<media type="image" mime="image/png" src="media/02_jsgrid_06.png"/>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
A zatřetí můžeme nastavit vlastnost mřížky column_spacing , stejným způsobem jako její vlastnost row_spacing .
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Vytvoří mřížku
|
|
Packit |
1470ea |
this._grid = new Gtk.Grid ({
|
|
Packit |
1470ea |
column_spacing: 20,
|
|
Packit |
1470ea |
row_spacing: 20 });
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Ve výsledku to bude vypadat takto:
|
|
Packit |
1470ea |
<media type="image" mime="image/png" src="media/02_jsgrid_07.png"/>
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="stock">
|
|
Packit |
1470ea |
<title>Používání standardních obrázků</title>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
GNOME má připravenou spoustu standardních obrázků, které můžete použít, kdy se necítíte na vytvoření vlastních nebo chcete použít obecně známou ikonu. Zde je, jak vytvořit standardní obrázek, pro srovnání s tím, jak vytvořit ten normální:
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Vytvoří obrázek
|
|
Packit |
1470ea |
this._image = new Gtk.Image ({ file: "gnome-image.png" });
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Vytvoří druhý obrázek pomocí standardní ikony
|
|
Packit |
1470ea |
this._icon = new Gtk.Image ({ stock: 'gtk-about' });
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Po té jej připojíme do mřížky nalevo od prvního popisku. (V tomto příkladu nevyužijeme druhý popisek.)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Připojí obrázky a popisek do mřížky
|
|
Packit |
1470ea |
this._grid.attach (this._image, 0, 0, 2, 1);
|
|
Packit |
1470ea |
this._grid.attach (this._icon, 0, 1, 1, 1);
|
|
Packit |
1470ea |
this._grid.attach (this._label, 1, 1, 1, 1);
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Po spuštění dostaneme něco takového:
|
|
Packit |
1470ea |
<media type="image" mime="image/png" src="media/02_jsgrid_08.png"/>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Je to to, co vypadá jako standardní ikona „O aplikaci“ (About). Na seznam všech standardních položek, počínaje gtk-about, se můžete podívat v <link href="https://developer.gnome.org/gtk3/3.4/gtk3-Stock-Items.html#GTK-STOCK-ABOUT:CAPS">dokumentaci pro vývojáře GNOME</link>. Byla napsána pro programátory v jazyce C, ale ten nepotřebujete znát k tomu, abyste ji mohli používat. Stačí se jen podívat na část v uvozovkách, jako je "gtk-about" a tuto část zkopírovat, když chcete použít ikonu vedle ní.
|
|
Packit |
1470ea |
<note style="tip">Okolo 'gtk-about' jsem v kódu použili jednoduché uvozovky, protože na rozdíl od jiných textových řetězců, které máme v dvojitých uvozovkách, tento nebude nikdy potřeba překládat do jiného národního jazyka. Ve skutečnosti, kdyby byl přeložen, tak by došlo k porušení ikony, protože její název musí být pořád "gtk-about", bez ohledu na jazyk, ve kterém je uživatelské rozhraní. </note>
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="next">
|
|
Packit |
1470ea |
<title>A co dál?</title>
|
|
Packit |
1470ea |
Než přikročíme k další lekci, zkusme něco udělat trochu jinak:
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Vytvoří tlačítko
|
|
Packit |
1470ea |
this._button = new Gtk.Button ({
|
|
Packit |
1470ea |
label: "Welcome to GNOME, too!"});
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Připojí obrázky a tlačítka do mřížky
|
|
Packit |
1470ea |
this._grid.attach (this._image, 0, 0, 2, 1);
|
|
Packit |
1470ea |
this._grid.attach (this._icon, 0, 1, 1, 1);
|
|
Packit |
1470ea |
this._grid.attach (this._button, 1, 1, 1, 1);
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Je to pravda, změnili jsme popisek na tlačítko jen pouhou změnou názvu widgetu! Zjistíte však, že když aplikaci spustíte a kliknete na něj, nic nedělá. Jak jej přimět, aby něco dělalo? To je to, co se dozvíte v <link xref="03_getting_the_signal.js">naší následující lekci</link>.
|
|
Packit |
1470ea |
Jestli se vám to líbí, zkuste věnovat nějaký čas experimentování s mřížkami, popisky a obrázky, včetně standardních obrázků.
|
|
Packit |
1470ea |
<note style="tip">Jedním z triků, jak vytvořit složitější rozvržení, je vnoření mřížek do sebe. To umožňuje seskupit dohromady související widgety a snadno měnit jejich uspořádání. Pokud vás zajímá, jak se to dělá, podívejte na na ukázkový kód k widgetu <link xref="radiobutton.js">RadioButton</link>. </note>
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="complete">
|
|
Packit |
1470ea |
<title>Úplný kód ukázky</title>
|
|
Packit |
1470ea |
#!/usr/bin/gjs
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
imports.gi.versions.Gtk = '3.0';
|
|
Packit |
1470ea |
const Gtk = imports.gi.Gtk;
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
class WelcomeToTheGrid {
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Vytvoří vlastní aplikaci
|
|
Packit |
1470ea |
constructor() {
|
|
Packit |
1470ea |
this.application = new Gtk.Application();
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Napojí signály "activate" a "startup" k funkcím zpětného volání
|
|
Packit |
1470ea |
this.application.connect('activate', this._onActivate.bind(this));
|
|
Packit |
1470ea |
this.application.connect('startup', this._onStartup.bind(this));
|
|
Packit |
1470ea |
},
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Funkce zpětného volání pro signál "activate" zobrazujicí okno při aktivaci
|
|
Packit |
1470ea |
_onActivate() {
|
|
Packit |
1470ea |
this._window.present();
|
|
Packit |
1470ea |
},
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Funkce zpětného volání pro signál "startup" sestavující uživatelské rozhraní
|
|
Packit |
1470ea |
_onStartup() {
|
|
Packit |
1470ea |
this._buildUI ();
|
|
Packit |
1470ea |
},
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Sestaví uživatelské rozhraní aplikace
|
|
Packit |
1470ea |
_buildUI() {
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Vytvoří okno aplikace
|
|
Packit |
1470ea |
this._window = new Gtk.ApplicationWindow({
|
|
Packit |
1470ea |
application: this.application,
|
|
Packit |
1470ea |
window_position: Gtk.WindowPosition.CENTER,
|
|
Packit |
1470ea |
border_width: 10,
|
|
Packit |
1470ea |
title: "Welcome to the Grid"});
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Vytvoří mřížku
|
|
Packit |
1470ea |
this._grid = new Gtk.Grid ({
|
|
Packit |
1470ea |
// column_homogeneous: true,
|
|
Packit |
1470ea |
// column_spacing: 20,
|
|
Packit |
1470ea |
row_spacing: 20 });
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Vytvoří obrázek
|
|
Packit |
1470ea |
this._image = new Gtk.Image ({ file: "gnome-image.png" });
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Vytvoří druhý obrázek pomocí standardní ikony
|
|
Packit |
1470ea |
this._icon = new Gtk.Image ({ stock: 'gtk-about' });
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Vytvoří popisek
|
|
Packit |
1470ea |
this._label = new Gtk.Label ({
|
|
Packit |
1470ea |
label: "Welcome to GNOME, too!",
|
|
Packit |
1470ea |
/* margin_top: 20 */ });
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
/* Vytvoří druhý popisek
|
|
Packit |
1470ea |
this._labelTwo = new Gtk.Label ({
|
|
Packit |
1470ea |
label: "The cake is a pie." }); */
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
/* Vytvoří tlačítko
|
|
Packit |
1470ea |
this._button = new Gtk.Button ({
|
|
Packit |
1470ea |
label: "Welcome to GNOME, too!"}); */
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Připojí obrázek a tlačítka do mřížky
|
|
Packit |
1470ea |
this._grid.attach (this._image, 0, 0, 2, 1);
|
|
Packit |
1470ea |
this._grid.attach (this._icon, 0, 1, 1, 1);
|
|
Packit |
1470ea |
this._grid.attach (this._label, 1, 1, 1, 1);
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// this._grid.attach (this._label, 0, 1, 1, 1);
|
|
Packit |
1470ea |
// this._grid.attach (this._labelTwo, 1, 1, 1, 1);
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// this._grid.attach (this._button, 1, 1, 1, 1);
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Přidá mřížku do okna
|
|
Packit |
1470ea |
this._window.add (this._grid);
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Zobrazí okno a všechny jeho synovské widgety
|
|
Packit |
1470ea |
this._window.show_all();
|
|
Packit |
1470ea |
}
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
};
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Spustí aplikaci
|
|
Packit |
1470ea |
let app = new WelcomeToTheGrid ();
|
|
Packit |
1470ea |
app.application.run (ARGV);
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
</page>
|