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