Blame platform-demos/cs/scale.js.page

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="guide" style="task" id="scale.js" xml:lang="cs">
Packit 1470ea
  <info>
Packit 1470ea
  <title type="text">Scale (JavaScript)</title>
Packit 1470ea
    <link type="guide" xref="beginner.js#entry"/>
Packit 1470ea
    <revision version="0.1" date="2012-06-20" 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>Stupnice, která odpovídá číselné hodnotě</desc>
Packit 1470ea
  </info>
Packit 1470ea
Packit 1470ea
  <title>Scale</title>
Packit 1470ea
  <media type="image" mime="image/png" src="media/scalepenguins.png"/>
Packit 1470ea
  

Widget Scale (stupnice), je vodorovná nebo svislá lišta s táhlem, která představuje hodnotu z nějakého číselného rozsahu. Když vytvoříte novou stupnici, nastavíte ji výchozí polohu, která čísla odpovídají dolní a horní mezi rozsahu, a věci, jako o kolik se má posunout nahoru/dolů při kliknutí na konce lišty. Abyste nemuseli všechny tyto věci psát znovu a znovu, když stupnici vytváříte, můžete vytvořit objekt Adjustment (přizpůsobení), který si to vše pamatuje, a stupnici pak akorát řeknete, že ho má použít.

Packit 1470ea
  

Tato stupnice je jednoduchý widget, pomocí kterého můžeme upravovat velikost ledové kry, na které žijí tučňáci. Počet tučňáků na kře je násobkem hodnot ze dvou stupnic. Hrajte si s nimi a uvidíte, co se bude dít.

Packit 1470ea
    <links type="section"/>
Packit 1470ea
Packit 1470ea
  <section id="imports">
Packit 1470ea
    <title>Importované knihovny</title>
Packit 1470ea
    
Packit 1470ea
#!/usr/bin/gjs
Packit 1470ea
Packit 1470ea
const Gio = imports.gi.Gio;
Packit 1470ea
const Gtk = imports.gi.Gtk;
Packit 1470ea
const Lang = imports.lang;
Packit 1470ea
Packit 1470ea
    

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.

Packit 1470ea
    </section>
Packit 1470ea
Packit 1470ea
  <section id="applicationwindow">
Packit 1470ea
    <title>Vytvoření okna aplikace</title>
Packit 1470ea
    
Packit 1470ea
const ScaleExample = new Lang.Class({
Packit 1470ea
    Name: 'Scale Example',
Packit 1470ea
Packit 1470ea
    // Vytvoří vlastní aplikaci
Packit 1470ea
    _init: function() {
Packit 1470ea
        this.application = new Gtk.Application({
Packit 1470ea
            application_id: 'org.example.jsscale'
Packit 1470ea
        });
Packit 1470ea
Packit 1470ea
    // Napojí signály "activate" a "startup" k funkcím zpětného volání
Packit 1470ea
    this.application.connect('activate', Lang.bind(this, this._onActivate));
Packit 1470ea
    this.application.connect('startup', Lang.bind(this, this._onStartup));
Packit 1470ea
    },
Packit 1470ea
Packit 1470ea
    // Funkce zpětného volání pro signál "activate" zobrazujicí 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
    

Všechen kód této ukázky je ve třídě ScaleExample. 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.

Packit 1470ea
    
Packit 1470ea
    // Sestaví uživatelské rozhraní aplikace
Packit 1470ea
    _buildUI: function() {
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: 20,
Packit 1470ea
            title: "Birds on a Floe"});
Packit 1470ea
Packit 1470ea
    

Funkce _buildUI 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.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="button">
Packit 1470ea
    <title>Vytvoření stupnic</title>
Packit 1470ea
    
Packit 1470ea
        // Vytvoří vodorovnou stupnici
Packit 1470ea
        this._hScale = Gtk.Scale.new_with_range (Gtk.Orientation.HORIZONTAL, 0.0, 100.0, 5.0);
Packit 1470ea
        this._hScale.set_valign (Gtk.Align.START);
Packit 1470ea
        this._hScale.set_value (50);
Packit 1470ea
        this._hScale.set_digits (0);
Packit 1470ea
        // this._hScale.set_draw_value (false);
Packit 1470ea
Packit 1470ea
Packit 1470ea
    

Metoda new_with_range je jedním ze způsobů, jak vytvořit nový widget Scale. Přebírané parametry jsou <link href="http://www.roojs.org/seed/gir-1.2-gtk-3.0/gjs/Gtk.Orientation.html">Gtk.Orientation</link>, nejnižší hodnota, nejvyšší hodnota a přírůstek pro jeden krok. Potom použijeme metody widgetu k nastavení jeho počáteční hodnoty a kolik desetinných míst má používat. V tomto případě také nastavíme svislé zarovnání, které určuje, kde v okně se objeví.

Packit 1470ea
    

Můžeme použít metodu set_draw_value, abychom řekli, jestli se má nebo nemá vedle stupnice zobrazovat číselná hodnota. V tomto příkladu je zakomentováno.

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
        // Vytvoří hlavní přizpůsobení, které se použije pro svislou (nebo jinou) stupnici
Packit 1470ea
        this._adjustment = new Gtk.Adjustment ({
Packit 1470ea
            value: 95,
Packit 1470ea
            lower: 0,
Packit 1470ea
            upper: 100,
Packit 1470ea
            step_increment: 5,
Packit 1470ea
            page_increment: 10 });
Packit 1470ea
Packit 1470ea
Packit 1470ea
    

Objekt Adjustment (přizpůsobení) můžete použít pro zjednodušení věcí okolo vytváření nové stupnice. Vlastnost "value" u přizpůsobení je to stejné, co výchozí hodnota u stupnice, zatímco "upper" a "lower" určují meze číselného rozsahu. Mezi tím jsou přírůstky hodnot říkající, jak moc se má posunout táhlo, když uděláte takové věci, jako že na stupnici kliknete.

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
        // Vytvoří svislou stupnici používající přizpůsobení, 
Packit 1470ea
        // které jsme právě vytvořili
Packit 1470ea
        this._vScale = new Gtk.Scale ({
Packit 1470ea
            orientation: Gtk.Orientation.VERTICAL,
Packit 1470ea
            adjustment: this._adjustment,
Packit 1470ea
            digits: 0,
Packit 1470ea
            // draw_value: false,
Packit 1470ea
            margin_left: 10 });
Packit 1470ea
Packit 1470ea
Packit 1470ea
    

Zde vytvoříme novou stupnici pomocí přiřazení _adjustment do její vlastnosti "adjustment". Jedná se o velkou zkratku, i když i tak pořád musíme stupnici říct, na kolik desetinných míst má fungovat. Poznamenejme, že vlastnost "draw_value" je zakomentovaná. Jedná se o způsob, jak říct, že se nemá vedle stupnice zobrazovat číselná hodnota, když stupnici vytváříte tímto způsobem.

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
        // Vytvoří popisek, který zobrazuje součin dvou hodnot
Packit 1470ea
        this._product = (this._hScale.get_value() * this._vScale.get_value());
Packit 1470ea
        this._label = new Gtk.Label ({
Packit 1470ea
            label: (String(this._product) + " penguins on the iceberg."),
Packit 1470ea
            height_request: 200,
Packit 1470ea
            width_request: 200,
Packit 1470ea
            wrap: true});
Packit 1470ea
Packit 1470ea
        // Napojí dvě stupnice na funkci, která přepočítává údaj pro popisek
Packit 1470ea
        this._hScale.connect ("value-changed", Lang.bind (this, this._recalc));
Packit 1470ea
        this._vScale.connect ("value-changed", Lang.bind (this, this._recalc));
Packit 1470ea
Packit 1470ea
Packit 1470ea
    

Můžeme použít metodu get_value_method k nalezení číselné hodnoty, na kterou je stupnice nastavena. S ní pak můžeme dělat cokoliv je potřeba, včetně vzájemného vynásobení hodnot ze dvou stupnic. Součin pak zobrazíme ve widgetu <link xref="label.js">Label</link>. Nastavíme, aby se text popisku zalamovat, protože bude rovněž zobrazovat bláznivou zprávu.

Packit 1470ea
    

Když máme vytvořený popisek, napojíme signály "value-changed" od obou stupnic na funkci _recals, která bude přepočítávat počet tučňáků na ledové kře a podávat o nich novou zprávu.

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
        // Vytvoří mřížku pro uspořádání věcí
Packit 1470ea
        this._UIGrid = new Gtk.Grid ({
Packit 1470ea
            halign: Gtk.Align.CENTER,
Packit 1470ea
            valign: Gtk.Align.CENTER,
Packit 1470ea
            margin_top: 20,
Packit 1470ea
            margin_left: 20});
Packit 1470ea
Packit 1470ea
        // Připojí vše do mřížky
Packit 1470ea
        this._UIGrid.attach (this._label, 0, 0, 1, 1);
Packit 1470ea
        this._UIGrid.attach (this._hScale, 0, 1, 1, 1);
Packit 1470ea
        this._UIGrid.attach (this._vScale, 1, 0, 1, 1);
Packit 1470ea
Packit 1470ea
    

Zde pro všechno vytvoříme widget <link xref="grid.js">Grid</link> a všechny naše widgety do něj připojíme. Všimněte si, že zde (a i u některých widgetů) použijeme okraje, abychom zachovali potřebné rozestupy.

Packit 1470ea
    
Packit 1470ea
        // Přidá mřížku do okna
Packit 1470ea
        this._window.add (this._UIGrid);
Packit 1470ea
Packit 1470ea
        // Zobrazí okno a všechny jeho synovské widgety
Packit 1470ea
        this._window.show_all();
Packit 1470ea
    },
Packit 1470ea
Packit 1470ea
    

Nakonec přidáme mřížku do okna a následně oknu řekneme, aby zobrazilo sebe a všechny widgety uvnitř sebe.

Packit 1470ea
    </section>
Packit 1470ea
Packit 1470ea
    <section id="scales-handler">
Packit 1470ea
    <title>Funkce, která obsluhuje změnu hodnoty na stupnici</title>
Packit 1470ea
Packit 1470ea
    
Packit 1470ea
    _recalc: function() {
Packit 1470ea
Packit 1470ea
        // Zjistí, jaký je součin hodnot ze dvou stupnic
Packit 1470ea
        var product = (this._hScale.get_value() * this._vScale.get_value());
Packit 1470ea
Packit 1470ea
        // Vytvoří prázdný komentář pro případ, kdy není jaký bláznivý komentář vytvořit
Packit 1470ea
        var comment = "";
Packit 1470ea
Packit 1470ea
        // Vytvoří bláznivý komentář vycházející z počtu tučňáků
Packit 1470ea
        if (product > 9000) {
Packit 1470ea
            comment = "It's over 9000!";
Packit 1470ea
        }
Packit 1470ea
        else if (product < 1000 && product > 0) {
Packit 1470ea
            comment = "They're getting lonely.";
Packit 1470ea
        }
Packit 1470ea
        else if (product == 0) {
Packit 1470ea
            comment = "They're all gone…";
Packit 1470ea
        }
Packit 1470ea
        else comment = "";
Packit 1470ea
Packit 1470ea
        // Nastaví nový text pro ._label
Packit 1470ea
        this._label.set_label (String (product) + " penguins on the iceberg. " + comment);
Packit 1470ea
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
});
Packit 1470ea
Packit 1470ea
    

Pamatujete, jak jsme od stupnice získali hodnotu pomocí její metody get_value? Zde jednoduše přepočítáme součin dvou hodnot po té, co je stupnice posunuta, přidáme bláznivou zprávu v závislosti na tom, kolik tučňáků zůstalo, a změníme formulaci v _label ukazujícím nový počet a zprávu.

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
// Spustí aplikaci
Packit 1470ea
let app = new ScaleExample ();
Packit 1470ea
app.application.run (ARGV);
Packit 1470ea
Packit 1470ea
    

Nakonec vytvoříme novou instanci konečné třídy ScaleExample a aplikaci spustíme.

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
Packit 1470ea
const Gio = imports.gi.Gio;
Packit 1470ea
const Gtk = imports.gi.Gtk;
Packit 1470ea
Packit 1470ea
class ScaleExample {
Packit 1470ea
Packit 1470ea
    // Vytvoří vlastní aplikaci
Packit 1470ea
    constructor() {
Packit 1470ea
        this.application = new Gtk.Application({
Packit 1470ea
            application_id: 'org.example.jsscale'
Packit 1470ea
        });
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
    // 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: 20,
Packit 1470ea
            title: "Birds on a Floe"});
Packit 1470ea
Packit 1470ea
        // Vytvoří vodorovnou stupnici
Packit 1470ea
        this._hScale = Gtk.Scale.new_with_range (Gtk.Orientation.HORIZONTAL, 0.0, 100.0, 5.0);
Packit 1470ea
        this._hScale.set_valign (Gtk.Align.START);
Packit 1470ea
        this._hScale.set_value (50);
Packit 1470ea
        this._hScale.set_digits (0);
Packit 1470ea
        // this._hScale.set_draw_value (false);
Packit 1470ea
Packit 1470ea
        // Vytvoří hlavní přizpůsobení, které se použije pro svislou (nebo jinou) stupnici
Packit 1470ea
        this._adjustment = new Gtk.Adjustment ({
Packit 1470ea
            value: 95,
Packit 1470ea
            lower: 0,
Packit 1470ea
            upper: 100,
Packit 1470ea
            step_increment: 5,
Packit 1470ea
            page_increment: 10 });
Packit 1470ea
Packit 1470ea
        // Vytvoří svislou stupnici používající přizpůsobení, 
Packit 1470ea
        // které jsme právě vytvořili
Packit 1470ea
        this._vScale = new Gtk.Scale ({
Packit 1470ea
            orientation: Gtk.Orientation.VERTICAL,
Packit 1470ea
            adjustment: this._adjustment,
Packit 1470ea
            digits: 0,
Packit 1470ea
            // draw_value: false,
Packit 1470ea
            margin_left: 10 });
Packit 1470ea
Packit 1470ea
        // Vytvoří popisek, který zobrazuje součin dvou hodnot
Packit 1470ea
        this._product = (this._hScale.get_value() * this._vScale.get_value());
Packit 1470ea
        this._label = new Gtk.Label ({
Packit 1470ea
            label: (String(this._product) + " penguins on the iceberg."),
Packit 1470ea
            height_request: 200,
Packit 1470ea
            width_request: 200,
Packit 1470ea
            wrap: true});
Packit 1470ea
Packit 1470ea
        // Napojí dvě stupnice na funkci, která přepočítává údaj pro popisek
Packit 1470ea
        this._hScale.connect ("value-changed", this._recalc.bind(this));
Packit 1470ea
        this._vScale.connect ("value-changed", this._recalc.bind(this));
Packit 1470ea
Packit 1470ea
        // Vytvoří mřížku pro uspořádání věcí
Packit 1470ea
        this._UIGrid = new Gtk.Grid ({
Packit 1470ea
            halign: Gtk.Align.CENTER,
Packit 1470ea
            valign: Gtk.Align.CENTER,
Packit 1470ea
            margin_top: 20,
Packit 1470ea
            margin_left: 20});
Packit 1470ea
Packit 1470ea
        // Připojí vše do mřížky
Packit 1470ea
        this._UIGrid.attach (this._label, 0, 0, 1, 1);
Packit 1470ea
        this._UIGrid.attach (this._hScale, 0, 1, 1, 1);
Packit 1470ea
        this._UIGrid.attach (this._vScale, 1, 0, 1, 1);
Packit 1470ea
Packit 1470ea
        // Přidá mřížku do okna
Packit 1470ea
        this._window.add (this._UIGrid);
Packit 1470ea
Packit 1470ea
        // Zobrazí okno a všechny jeho synovské widgety
Packit 1470ea
        this._window.show_all();
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
    _recalc() {
Packit 1470ea
Packit 1470ea
        // Zjistí, jaký je součin hodnot ze dvou stupnic
Packit 1470ea
        var product = (this._hScale.get_value() * this._vScale.get_value());
Packit 1470ea
Packit 1470ea
        // Vytvoří prázdný komentář pro případ, kdy není jaký bláznivý komentář vytvořit
Packit 1470ea
        var comment = "";
Packit 1470ea
Packit 1470ea
        // Vytvoří bláznivý komentář vycházející z počtu tučňáků
Packit 1470ea
        if (product > 9000) {
Packit 1470ea
            comment = "It's over 9000!";
Packit 1470ea
        }
Packit 1470ea
        else if (product < 1000 && product > 0) {
Packit 1470ea
            comment = "They're getting lonely.";
Packit 1470ea
        }
Packit 1470ea
        else if (product == 0) {
Packit 1470ea
            comment = "They're all gone ...";
Packit 1470ea
        }
Packit 1470ea
        else comment = "";
Packit 1470ea
Packit 1470ea
        // Nastaví nový text pro ._label
Packit 1470ea
        this._label.set_label (String (product) + " penguins on the iceberg. " + comment);
Packit 1470ea
    }
Packit 1470ea
};
Packit 1470ea
Packit 1470ea
// Spustí aplikaci
Packit 1470ea
let app = new ScaleExample ();
Packit 1470ea
app.application.run (ARGV);
Packit 1470ea
Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="in-depth">
Packit 1470ea
    <title>Dokumentace jdoucí do hloubky</title>
Packit 1470ea
<list>
Packit 1470ea
  <item>

<link href="http://www.roojs.org/seed/gir-1.2-gtk-3.0/gjs/Gtk.Adjustment.html">Gtk.Adjustment</link>

</item>
Packit 1470ea
  <item>

<link href="http://www.roojs.com/seed/gir-1.2-gtk-3.0/gjs/Gtk.Application.html">Gtk.Application</link>

</item>
Packit 1470ea
  <item>

<link href="http://developer.gnome.org/gtk3/stable/GtkApplicationWindow.html">Gtk.ApplicationWindow</link>

</item>
Packit 1470ea
  <item>

<link href="http://www.roojs.org/seed/gir-1.2-gtk-3.0/gjs/Gtk.Grid.html">Gtk.Grid</link>

</item>
Packit 1470ea
  <item>

<link href="http://www.roojs.org/seed/gir-1.2-gtk-3.0/gjs/Gtk.Label.html">Gtk.Label</link>

</item>
Packit 1470ea
  <item>

<link href="http://www.roojs.org/seed/gir-1.2-gtk-3.0/gjs/Gtk.Scale.html">Gtk.Scale</link>

</item>
Packit 1470ea
</list>
Packit 1470ea
  </section>
Packit 1470ea
</page>