1<?xml version="1.0" encoding="utf-8"?>
2<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="guide" style="task" id="radiobutton.js" xml:lang="cs">
3  <info>
4  <title type="text">RadioButton (JavaScript)</title>
5    <link type="guide" xref="beginner.js#buttons"/>
6    <revision version="0.1" date="2012-06-15" status="draft"/>
7
8    <credit type="author copyright">
9      <name>Taryn Fox</name>
10      <email its:translate="no">jewelfox@fursona.net</email>
11      <years>2012</years>
12    </credit>
13
14    <desc>V každý okamžik může být vybrán jej jeden</desc>
15  </info>
16
17  <title>RadioButton</title>
18  <media type="image" mime="image/png" src="media/radiobuttontravel.png"/>
19  <p>Skupinový přepínač se anglicky se nazývá „rádiové tlačítko“ podle starých autorádií, která měla tlačítka pro přepínání kanálu. Rádio může mít v kterýkoliv okamžik naladěnu jen jednu stanici, takže když jste zmáčkli libovolné tlačítko, všechny ostatní vyskočily. Tyto skupinové přepínače fungují úplně stejně.</p>
20  <p>Každý widget <code>RadioButton</code> potřebuje popisek a skupinu. V kterýkoliv okamžik lze vybrat jen jeden skupinový přepínač ve skupině. Není třeba každou skupinu pojmenovat, stačí nastavit nový <code>RadioButton</code> jako součást skupiny, která již existuje. Když vytvoříte nový mimo jakoukoliv skupinu, automaticky se pro něj nový skupina vytvoří a stane se její součástí.</p>
21    <links type="section"/>
22
23  <section id="imports">
24    <title>Importované knihovny</title>
25    <code mime="application/javascript">
26#!/usr/bin/gjs
27
28const Gio = imports.gi.Gio;
29const Gtk = imports.gi.Gtk;
30const Lang = imports.lang;
31</code>
32    <p>Toto jsou knihovny, které potřebujeme naimportovat, aby aplikace běžela. Pamatujte si, že řádek, který GNOME říká, že používáme Gjs, musí být vždy na začátku.</p>
33    </section>
34
35  <section id="applicationwindow">
36    <title>Vytvoření okna aplikace</title>
37    <code mime="application/javascript">
38const RadioButtonExample = new Lang.Class({
39    Name: 'RadioButton Example',
40
41    // Vytvoří vlastní aplikaci
42    _init: function() {
43        this.application = new Gtk.Application({
44            application_id: 'org.example.jsradiobutton',
45            flags: Gio.ApplicationFlags.FLAGS_NONE
46        });
47
48    // Napojí signály "activate" a "startup" k funkcím zpětného volání
49    this.application.connect('activate', Lang.bind(this, this._onActivate));
50    this.application.connect('startup', Lang.bind(this, this._onStartup));
51    },
52
53    // Funkce zpětného volání pro signál "activate" zobrazujicí okno při aktivaci
54    _onActivate: function() {
55        this._window.present();
56    },
57
58    // Funkce zpětného volání pro signál "startup" sestavující uživatelské rozhraní
59    _onStartup: function() {
60        this._buildUI ();
61    },
62</code>
63    <p>Všechen kód této ukázky je ve třídě <code>RadioButtonExample</code>. Výše uvedený kód vytvoří <link href="http://www.roojs.com/seed/gir-1.2-gtk-3.0/gjs/Gtk.Application.html">Gtk.Application</link> pro naše widgety a okno, ve kterém budou.</p>
64    <code mime="application/javascript">
65    // Sestaví uživatelské rozhraní aplikace
66    _buildUI: function() {
67
68        // Vytvoří okno aplikace
69        this._window = new Gtk.ApplicationWindow({
70            application: this.application,
71            window_position: Gtk.WindowPosition.CENTER,
72            border_width: 20,
73            title: "Travel Planning"});
74</code>
75    <p>Funkce <code>_buildUI</code> je místo, ze kterého voláme všechen kód, který vytváří uživatelské rozhraní aplikace. Prvním krokem je vytvoření nového <link xref="GtkApplicationWindow.js">Gtk.ApplicationWindow</link>, do kterého vložíme všechny naše widgety.</p>
76  </section>
77
78  <section id="button">
79    <title>Vytvoření skupinových přepínačů</title>
80    <code mime="application/javascript">
81        // Vytvoří popisek pro první skupinu přepínačů
82        this._placeLabel = new Gtk.Label ({label: "Where would you like to travel to?"});
83</code>
84
85    <p>Používáme <link xref="label.js">Gtk.Label</link> k oddělení jednotlivých skupin se skupinovými přepínači. Nic vám nebrání ve vložení všech možných skupin, kam vás napadne, takže jestli chcete, aby se v nich uživatelé vyznali, musíte je rozumně uspořádat.</p>
86
87    <code mime="application/javascript">
88        // Vytvoří tři skupinové přepínače třemi různými způsoby
89        this._place1 = new Gtk.RadioButton ({label: "The Beach"});
90
91        this._place2 = Gtk.RadioButton.new_from_widget (this._place1);
92        this._place2.set_label ("The Moon");
93
94        this._place3 = Gtk.RadioButton.new_with_label_from_widget (this._place1, "Antarctica");
95        // this._place3.set_active (true);
96</code>
97
98    <p>Zde jsou tři různé způsoby, jak vytvořit skupinový přepínač. V prvním, obvyklém způsobu, vytvoříme nový <code>Gtk.RadioButton</code> a zároveň mu přiřadíme jeho vlastnosti. Druhý a třetí používá funkce, které automaticky obslouží některé vlastnosti. <code>new_from_widget</code> přebírá jeden argument, kterým je <code>RadioButton</code>, do jehož skupiny chcete zařadit i ten nový. Oproti tomu <code>new_with_label_from_widget</code> přebírá zároveň i popisek pro skupinový přepínač.</p>
99    <p>První <code>RadioButton</code> ve skupině je ten, který bude vybraný ve výchozím stavu. Zkuste zrušit zakomentování posledního řádku v tomto ukázkovém kódu, abyste viděli, jak můžete nastavit jiný jako vybraný ve výchozím stavu.</p>
100
101    <code mime="application/javascript">
102        // Vytvoří popisek pro druhou skupinu tlačítek
103        this._thingLabel = new Gtk.Label ({label: "And what would you like to bring?" });
104
105        // Vytvoří další tři skupinové přepínače
106        this._thing1 = new Gtk.RadioButton ({label: "Penguins" });
107        this._thing2 = new Gtk.RadioButton ({label: "Sunscreen", group: this._thing1 });
108        this._thing3 = new Gtk.RadioButton ({label: "A spacesuit", group: this._thing1 });
109</code>
110    <p>Zde vytvoříme popisek pro druhou skupinu přepínačů a všechny skupinové přepínače stejným způsobem vytvoříme.</p>
111    </section>
112
113    <section id="ui">
114    <title>Vytvoření zbytku uživatelského rozhraní</title>
115
116    <code mime="application/javascript">
117        // Vytvoří standardní tlačítko OK
118        this._okButton = new Gtk.Button ({
119            label: 'gtk-ok',
120            use_stock: 'true',
121            halign: Gtk.Align.END });
122
123        // Napojí tlačítko na funkci, která zpracovává kliknutí na něj
124        this._okButton.connect ('clicked', Lang.bind (this, this._okClicked));
125</code>
126    <p>Tento kód vytvoří <link xref="button.js">Gtk.Button</link> a napojí jej na funkci, která uživateli, když klikne na <gui>OK</gui>, zobrazí bláznivou zprávu podle vybraného skupinového přepínače.</p>
127    <p>Abyste zajistili, že tlačítko s popiskem <gui>OK</gui> bude správně zobrazeno ve všech národních jazycích, do kterých je GNOME přeloženo, nezapomeňte použít <link href="https://developer.gnome.org/gtk3/3.4/gtk3-Stock-Items.html">tlačítko Gtk standardního typu</link>.</p>
128
129    <code mime="application/javascript">
130        // Vytvoří mřížku pro položky v seznamu „místa“
131        this._places = new Gtk.Grid ();
132
133        // Připojí položky seznamu „místa“ do mřížky
134        this._places.attach (this._placeLabel, 0, 0, 1, 1);
135        this._places.attach (this._place1, 0, 1, 1, 1);
136        this._places.attach (this._place2, 0, 2, 1, 1);
137        this._places.attach (this._place3, 0, 3, 1, 1);
138
139        // Vytvoří mřížku pro položky v seznamu „věci“
140        this._things = new Gtk.Grid ({ margin_top: 50 });
141
142        // Připojí položky seznamu „věci“ do mřížky
143        this._things.attach (this._thingLabel, 0, 0, 1, 1);
144        this._things.attach (this._thing1, 0, 1, 1, 1);
145        this._things.attach (this._thing2, 0, 2, 1, 1);
146        this._things.attach (this._thing3, 0, 3, 1, 1);
147
148        // Vytvoří mřížku, do které se vše vloží
149        this._grid = new Gtk.Grid ({
150            halign: Gtk.Align.CENTER,
151            valign: Gtk.Align.CENTER,
152            margin_left: 40,
153            margin_right: 50 });
154
155        // Připojí vše do mřížky
156        this._grid.attach (this._places, 0, 0, 1, 1);
157        this._grid.attach (this._things, 0, 1, 1, 1);
158        this._grid.attach (this._okButton, 0, 2, 1, 1);
159
160        // Přidá mřížku do okna
161        this._window.add (this._grid);
162</code>
163    <p>Používáme samostatné mřížky <link xref="grid.js">Gtk.Grid</link> k uspořádání skupin skupinových přepínačů. Díky tomu můžeme později měnit rozvržení bez větší námahy. Druhá mřížka má nahoře okraj, aby opticky oddělila dvě sady voleb.</p>
164    <p>Když máme skupinové přepínače uspořádané, vložíme je do třetí, hlavní, mřížky spolu s tlačítkem <gui>OK</gui>. Tu pak připojíme do okna.</p>
165
166    <code mime="application/javascript">
167        // Zobrazí okno a všechny jeho synovské widgety
168        this._window.show_all();
169    },
170</code>
171
172    <p>Nakonec řekneme oknu a všemu v něm, aby se stali viditelnými, kdy se aplikace spustí.</p>
173
174  </section>
175
176  <section id="function">
177    <title>Funkce, která zpracovává váš výběr</title>
178    <code mime="application/javascript">
179    _okClicked: function () {
180
181        // Vytvoří vyskakovací dialogové okno, které zobrazí bláznivou zprávu
182        this._travel = new Gtk.MessageDialog ({
183            transient_for: this._window,
184            modal: true,
185            message_type: Gtk.MessageType.OTHER,
186            buttons: Gtk.ButtonsType.OK,
187            text: this._messageText() });
188
189        // Zobrazí dialogové okno
190        this._travel.show();
191
192        // Napojí tlačítko OK na funkci, která zavře vyskakovací dialogové okno
193        this._travel.connect ("response", Lang.bind (this, this._clearTravelPopUp));
194
195    },
196</code>
197    <p>Když kliknete na <gui>OK</gui>, objeví se <link xref="messagedialog.js">Gtk.MessageDialog</link>. Tato funkce vytvoří a zobrazí vyskakovací okno a napojí jeho tlačítko <gui>OK</gui> na funkci, která okno zavře. Jaký text se v okně objeví, závisí na funkci <code>_messageText()</code>, která vrací různé hodnoty podle toho, kterou sadu voleb vyberete.</p>
198
199    <code mime="application/javascript">
200    _messageText: function() {
201
202        // Vytvoří bláznivou zprávu pro dialogové okno podle toho, co jste vybrali
203        var stringMessage = "";
204
205        if (this._place1.get_active()) {
206
207            if (this._thing1.get_active())
208                stringMessage = "Penguins love the beach, too!";
209
210            else if (this._thing2.get_active())
211                stringMessage = "Make sure to put on that sunscreen!";
212
213            else stringMessage = "Are you going to the beach in space?";
214
215        }
216
217        else if (this._place2.get_active()) {
218
219            if (this._thing1.get_active())
220                stringMessage = "The penguins will take over the moon!";
221
222            else if (this._thing2.get_active())
223                stringMessage = "A lack of sunscreen will be the least of your problems!";
224
225            else stringMessage = "You'll probably want a spaceship, too!";
226        }
227
228        else if (this._place3.get_active()) {
229
230            if (this._thing1.get_active())
231                stringMessage = "The penguins will be happy to be back home!";
232
233            else if (this._thing2.get_active())
234                stringMessage = "Antarctic sunbathing may be hazardous to your health!";
235
236            else stringMessage = "Try bringing a parka instead!";
237        }
238
239        return stringMessage;
240
241    },
242</code>
243    <p>Metoda <code>get_active()</code> je způsob, jak zjistit, který skupinový přepínač je „zmáčknutý“. Tato funkce vrací různé bláznivé zprávy v závislosti na tom, které skupinové přepínače jsou vybrané. Vrácená hodnota se použije jako vlastnost <code>"text"</code> v dialogovém okně se zprávou.</p>
244
245    <code mime="application/javascript">
246    _clearTravelPopUp: function () {
247
248        this._travel.destroy();
249
250    }
251
252});
253</code>
254    <p>Tato funkce je volána, když je zmáčknuto tlačítko <gui>OK</gui> v dialogovém okně se zprávou. Jednoduše dialogové okno odklidí.</p>
255
256    <code mime="application/javascript">
257// Spustí aplikaci
258let app = new RadioButtonExample ();
259app.application.run (ARGV);
260</code>
261    <p>Nakonec vytvoříme novou instanci konečné třídy RadioButtonExample a aplikaci spustíme.</p>
262  </section>
263
264  <section id="complete">
265    <title>Úplný kód ukázky</title>
266<code mime="application/javascript" style="numbered">#!/usr/bin/gjs
267
268imports.gi.versions.Gtk = '3.0';
269
270const Gio = imports.gi.Gio;
271const Gtk = imports.gi.Gtk;
272
273class RadioButtonExample {
274
275    // Vytvoří vlastní aplikaci
276    constructor() {
277        this.application = new Gtk.Application({
278            application_id: 'org.example.jsradiobutton',
279            flags: Gio.ApplicationFlags.FLAGS_NONE
280        });
281
282        // Napojí signály "activate" a "startup" k funkcím zpětného volání
283        this.application.connect('activate', this._onActivate.bind(this));
284        this.application.connect('startup', this._onStartup.bind(this));
285    }
286
287    // Funkce zpětného volání pro signál "activate" zobrazujicí okno při aktivaci
288    _onActivate() {
289        this._window.present();
290    }
291
292    // Funkce zpětného volání pro signál "startup" sestavující uživatelské rozhraní
293    _onStartup() {
294        this._buildUI();
295    }
296
297    // Sestaví uživatelské rozhraní aplikace
298    _buildUI() {
299
300        // Vytvoří okno aplikace
301        this._window = new Gtk.ApplicationWindow({
302            application: this.application,
303            window_position: Gtk.WindowPosition.CENTER,
304            border_width: 20,
305            title: "Travel Planning"});
306
307        // Vytvoří popisek pro první skupinu přepínačů
308        this._placeLabel = new Gtk.Label ({label: "Where would you like to travel to?"});
309
310        // Vytvoří tři skupinové přepínače třemi různými způsoby
311        this._place1 = new Gtk.RadioButton ({label: "The Beach"});
312
313        this._place2 = Gtk.RadioButton.new_from_widget (this._place1);
314        this._place2.set_label ("The Moon");
315
316        this._place3 = Gtk.RadioButton.new_with_label_from_widget (this._place1, "Antarctica");
317        // this._place3.set_active (true);
318
319        // Vytvoří popisek pro druhou skupinu tlačítek
320        this._thingLabel = new Gtk.Label ({label: "And what would you like to bring?" });
321
322        // Vytvoří další tři skupinové přepínače
323        this._thing1 = new Gtk.RadioButton ({label: "Penguins" });
324        this._thing2 = new Gtk.RadioButton ({label: "Sunscreen", group: this._thing1 });
325        this._thing3 = new Gtk.RadioButton ({label: "A spacesuit", group: this._thing1 });
326
327        // Vytvoří standardní tlačítko OK
328        this._okButton = new Gtk.Button ({
329            label: 'gtk-ok',
330            use_stock: 'true',
331            halign: Gtk.Align.END });
332
333        // Napojí tlačítko na funkci, která zpracovává kliknutí na něj
334        this._okButton.connect ('clicked', this._okClicked.bind(this));
335
336        // Vytvoří mřížku pro položky v seznamu „místa“
337        this._places = new Gtk.Grid ();
338
339        // Připojí položky seznamu „místa“ do mřížky
340        this._places.attach (this._placeLabel, 0, 0, 1, 1);
341        this._places.attach (this._place1, 0, 1, 1, 1);
342        this._places.attach (this._place2, 0, 2, 1, 1);
343        this._places.attach (this._place3, 0, 3, 1, 1);
344
345        // Připojí položky seznamu „věci“ do mřížky
346        this._things = new Gtk.Grid ({ margin_top: 50 });
347
348        // Připojí položky seznamu „věci“ do mřížky
349        this._things.attach (this._thingLabel, 0, 0, 1, 1);
350        this._things.attach (this._thing1, 0, 1, 1, 1);
351        this._things.attach (this._thing2, 0, 2, 1, 1);
352        this._things.attach (this._thing3, 0, 3, 1, 1);
353
354        // Vytvoří mřížku, do které se vše vloží
355        this._grid = new Gtk.Grid ({
356            halign: Gtk.Align.CENTER,
357            valign: Gtk.Align.CENTER,
358            margin_left: 40,
359            margin_right: 50 });
360
361        // Připojí vše do mřížky
362        this._grid.attach (this._places, 0, 0, 1, 1);
363        this._grid.attach (this._things, 0, 1, 1, 1);
364        this._grid.attach (this._okButton, 0, 2, 1, 1);
365
366        // Přidá mřížku do okna
367        this._window.add (this._grid);
368
369        // Zobrazí okno a všechny jeho synovské widgety
370        this._window.show_all();
371    }
372
373    _okClicked() {
374
375        // Vytvoří vyskakovací dialogové okno, které zobrazí bláznivou zprávu
376        this._travel = new Gtk.MessageDialog ({
377            transient_for: this._window,
378            modal: true,
379            message_type: Gtk.MessageType.OTHER,
380            buttons: Gtk.ButtonsType.OK,
381            text: this._messageText() });
382
383        // Zobrazí dialogové okno
384        this._travel.show();
385
386        // Napojí tlačítko OK na funkci, která zavře vyskakovací dialogové okno
387        this._travel.connect ("response", this._clearTravelPopUp.bind(this));
388
389    }
390
391    _messageText() {
392
393        // Vytvoří bláznivou zprávu pro dialogové okno podle toho, co jste vybrali
394        var stringMessage = "";
395
396        if (this._place1.get_active()) {
397
398            if (this._thing1.get_active())
399                stringMessage = "Penguins love the beach, too!";
400
401            else if (this._thing2.get_active())
402                stringMessage = "Make sure to put on that sunscreen!";
403
404            else stringMessage = "Are you going to the beach in space?";
405
406        }
407
408        else if (this._place2.get_active()) {
409
410            if (this._thing1.get_active())
411                stringMessage = "The penguins will take over the moon!";
412
413            else if (this._thing2.get_active())
414                stringMessage = "A lack of sunscreen will be the least of your problems!";
415
416            else stringMessage = "You'll probably want a spaceship, too!";
417        }
418
419        else if (this._place3.get_active()) {
420
421            if (this._thing1.get_active())
422                stringMessage = "The penguins will be happy to be back home!";
423
424            else if (this._thing2.get_active())
425                stringMessage = "Antarctic sunbathing may be hazardous to your health!";
426
427            else stringMessage = "Try bringing a parka instead!";
428        }
429
430        return stringMessage;
431
432    }
433
434    _clearTravelPopUp() {
435        this._travel.destroy();
436    }
437};
438
439// Spustí aplikaci
440let app = new RadioButtonExample ();
441app.application.run (ARGV);
442</code>
443  </section>
444
445  <section id="in-depth">
446    <title>Dokumentace jdoucí do hloubky</title>
447<list>
448  <item><p><link href="http://www.roojs.com/seed/gir-1.2-gtk-3.0/gjs/Gtk.Application.html">Gtk.Application</link></p></item>
449  <item><p><link href="http://developer.gnome.org/gtk3/stable/GtkApplicationWindow.html">Gtk.ApplicationWindow</link></p></item>
450  <item><p><link href="http://www.roojs.org/seed/gir-1.2-gtk-3.0/gjs/Gtk.Button.html">Gtk.Button</link></p></item>
451  <item><p><link href="http://www.roojs.org/seed/gir-1.2-gtk-3.0/gjs/Gtk.Grid.html">Gtk.Grid</link></p></item>
452  <item><p><link href="http://www.roojs.org/seed/gir-1.2-gtk-3.0/gjs/Gtk.Label.html">Gtk.Label</link></p></item>
453  <item><p><link href="http://www.roojs.org/seed/gir-1.2-gtk-3.0/gjs/Gtk.RadioButton.html">Gtk.RadioButton</link></p></item>
454</list>
455  </section>
456</page>
457