Blame platform-demos/cs/spinbutton.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="spinbutton.js" xml:lang="cs">
Packit 1470ea
  <info>
Packit 1470ea
  <title type="text">SpinButton (JavaScript)</title>
Packit 1470ea
    <link type="guide" xref="beginner.js#entry"/>
Packit 1470ea
    <link type="seealso" xref="GtkApplicationWindow.js"/>
Packit 1470ea
    <link type="seealso" xref="grid.js"/>
Packit 1470ea
    <link type="seealso" xref="label.js"/>
Packit 1470ea
    <revision version="0.1" date="2012-06-24" 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>Číselné vstupní pole, které má tlačítka + a -</desc>
Packit 1470ea
  </info>
Packit 1470ea
Packit 1470ea
  <title>SpinButton</title>
Packit 1470ea
  <media type="image" mime="image/png" src="media/spinbuttonkittens.png"/>
Packit 1470ea
  

SpinButton (číselník) nemá žádnou souvislost s widgetem <link xref="spinner.js">Spinner</link> (káča). Jedná se o textové vstupní pole, které přijímá jen čísla a má tlačítka plus a mínus, která umožňují měnit hodnout, aniž byste museli psát.

Packit 1470ea
  

Je nejlepší pro použití v situacích, kdy je potřeba zadávat čistě číselné hodnoty. V tomto příkladu jsou dva číselníky použity pro počet koček a počet tuňákových konzerv pro ně.

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 SpinButtonExample = new Lang.Class({
Packit 1470ea
    Name: 'SpinButton 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.jsspinbutton'
Packit 1470ea
        });
Packit 1470ea
Packit 1470ea
    // Připojí 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ě SpinButtonExample. 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: "Kitten Feeder"});
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="spinbutton">
Packit 1470ea
    <title>Vytvoření widgetů SpinButton</title>
Packit 1470ea
    
Packit 1470ea
        // Pomocí funkce vytvoří první číselník
Packit 1470ea
        this._kittens = Gtk.SpinButton.new_with_range (1, 9001, 1);
Packit 1470ea
        this._kittens.connect ("value-changed", Lang.bind (this, this._newValue));
Packit 1470ea
Packit 1470ea
Packit 1470ea
    

K rychlému vytvoření číselníku můžeme použít funkci new_with_range. Prvním parametrem je počáteční hodnota číselníku, druhým maximální hodnota a třetím velikost kroku použitého při mačkání tlačítek plus nebo mínus.

Packit 1470ea
    

Po vytvoření prvního číselníku napojíme jeho signál "value-changed" k funkci, která zpracovává, co se má stát, když se číslo uvnitř číselníku změní.

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
        // Vytvoří přizpůsobení, které se použije pro druhý číselník
Packit 1470ea
        this._adjustment = new Gtk.Adjustment ({
Packit 1470ea
            value: 1,
Packit 1470ea
            lower: 0,
Packit 1470ea
            upper: 9001,
Packit 1470ea
            step_increment: 1,
Packit 1470ea
            page_increment: 10 });
Packit 1470ea
Packit 1470ea
        // Vytvoří druhý číselník
Packit 1470ea
        this._tuna = new Gtk.SpinButton ({ adjustment: this._adjustment });
Packit 1470ea
        this._tuna.connect ("value-changed", Lang.bind (this, this._newValue));
Packit 1470ea
Packit 1470ea
        // this._tuna.set_digits (1);
Packit 1470ea
        // this._tuna.set_wrap (true);
Packit 1470ea
Packit 1470ea
Packit 1470ea
    

Jestli chcete jemnější kontrolu nad widgetem SpinButton nebo chcete vytvořit spoustu číselníků, které budou mít stejné parametry, můžete vytvořit objekt <link href="http://www.roojs.org/seed/gir-1.2-gtk-3.0/gjs/Gtk.Adjustment.html">Adjustmen</link> (přizpůsobení). Pak můžete použít tento objekt jako vlastnost adjustment pro nový číselník a tím ji nastavit všechny vlastnosti naráz. Později můžete změnit všechny číselníky, které používají toto přizpůsobení naráz pouhou změnou některé vlastnosti objektu Adjustment.

Packit 1470ea
    

Řádky zde zakomentované ukazují věci, které si můžete u číselníků přizpůsobit. Můžete například nastavit počet číslic za desetinnou čárkou nebo říci, aby se při dosažení nastavené horní nebo dolní meze cyklicky přešlo na opačný konec.

Packit 1470ea
    <note>

V zájmu zdraví koček nepoužívejte prosím metodu set_digits, která by umožnila necelé počty koček.

</note>
Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="UI">
Packit 1470ea
    <title>Vytvoření zbytku uživatelského rozhraní</title>
Packit 1470ea
Packit 1470ea
    
Packit 1470ea
        // Vytvoří textové popisky, které budou u číselníků
Packit 1470ea
        this._startLabel = new Gtk.Label ({ label: "There are " });
Packit 1470ea
        this._kittenLabel = new Gtk.Label ({ label: " kitten(s), and "});
Packit 1470ea
        this._tunaLabel = new Gtk.Label ({ label: " can(s) of tuna."});
Packit 1470ea
        this.perKitten = Math.floor((this._tuna.get_value() / this._kittens.get_value()));
Packit 1470ea
        this._lastLabel = new Gtk.Label ({
Packit 1470ea
            label: "That's " + this.perKitten + " can(s) of tuna per kitten." });
Packit 1470ea
Packit 1470ea
    

Každý widget <link xref="label.js">Label</link> vytvoříme samostatně a pak je spojíme dohromady s jednotlivými číselníky. Poslední popisek potřebujeme na zobrazování počtu konzerv tuňáka na kočku, takže má uprostřed proměnnou odpovídající výpočtu, který používá funkce get_value u číselníků k zjištění, co je v nich nastaveno. Funkce floor z objektu Math jazyka JavaScript se použije k zaokrouhlení počtu konzerv tuňáka na kočku na nejbližší nižší celé číslo.

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
        // Vytvoří mřížku pro vložení číselníků a jejich popisků
Packit 1470ea
        this._spinGrid = new Gtk.Grid ({
Packit 1470ea
            halign: Gtk.Align.CENTER,
Packit 1470ea
            valign: Gtk.Align.CENTER,
Packit 1470ea
            margin_bottom: 20 });
Packit 1470ea
Packit 1470ea
        // Připojí vše do mřížky
Packit 1470ea
        this._spinGrid.attach (this._startLabel, 0, 0, 1, 1);
Packit 1470ea
        this._spinGrid.attach (this._kittens, 1, 0, 1, 1);
Packit 1470ea
        this._spinGrid.attach (this._kittenLabel, 2, 0, 1, 1);
Packit 1470ea
        this._spinGrid.attach (this._tuna, 3, 0, 1, 1);
Packit 1470ea
        this._spinGrid.attach (this._tunaLabel, 4, 0, 1, 1);
Packit 1470ea
Packit 1470ea
        // Vytvoří hlavní mřížku, která bude obsahovat tu předchozí a poslední popisek
Packit 1470ea
        this._mainGrid = new Gtk.Grid ({
Packit 1470ea
            halign: Gtk.Align.CENTER,
Packit 1470ea
            valign: Gtk.Align.CENTER });
Packit 1470ea
Packit 1470ea
        // Připojí menší mřížku a posledního popisek do hlavní mřížky
Packit 1470ea
        this._mainGrid.attach (this._spinGrid, 0, 0, 1, 1);
Packit 1470ea
        this._mainGrid.attach (this._lastLabel, 0, 1, 1, 1);
Packit 1470ea
Packit 1470ea
Packit 1470ea
    

Zde používáme widgety <link xref="grid.js">Grid</link>, které vše udržují správně rozložené. Jedna mřížka obsahuje ve správném pořadí popisky a číselníky, zatímco následující obsahuje na hoře ji a dole konečný popisek.

Packit 1470ea
    

Rozhodně není špatný způsob, hrát si s uspořádáním věcí do mřížek tak dlouho, až získáte to, co si přejete. V tomto případě má horní mřížka dole okraj, aby se uchoval odstup od spodního popisku a spodní popisek je uvnitř další mřížky, aby byl vystředěn relativně vůči popiskům a číselníkům nahoře.

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
        // Přidá mřížku do okna
Packit 1470ea
        this._window.add (this._mainGrid);
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 větší mřížku do okna a oknu řekneme, že má zobrazit sebe a všechny widgety uvnitř sebe.

Packit 1470ea
    </section>
Packit 1470ea
Packit 1470ea
    <section id="spinbutton-handler">
Packit 1470ea
    <title>Funkce, která obsluhuje změny číselných hodnot widgetů SpinButton</title>
Packit 1470ea
Packit 1470ea
    
Packit 1470ea
    _newValue: function () {
Packit 1470ea
Packit 1470ea
        // Aktualizuje popisek, který zobrazuje, kolik konzerv připadá na jednu kočku
Packit 1470ea
        this.perKitten = Math.floor((this._tuna.get_value() / this._kittens.get_value()))
Packit 1470ea
        this._lastLabel.set_label ("That's " + this.perKitten + " can(s) of tuna per kitten.");
Packit 1470ea
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
});
Packit 1470ea
Packit 1470ea
    

Zde aktualizujeme proměnnou perKitten vycházející z nových hodnot v číselnících a použijeme vlastnost set_label k občerstvení údaje, který zobrazuje _lastLabel. Protože mají oba číselníky své signály "value-changed" napojené na tuto funkci, aktualizuje tato funkce popisek pokaždé, když se změní některá z hodnot.

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

Nakonec vytvoříme novou instanci konečné třídy SpinButtonExample 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 SpinButtonExample {
Packit 1470ea
Packit 1470ea
    // Vytvoří vlastní aplikaci
Packit 1470ea
    constructor() {
Packit 1470ea
        this.application = new Gtk.Application({
Packit 1470ea
            application_id: 'org.example.jsspinbutton'
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
        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 "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: "Kitten Feeder"});
Packit 1470ea
Packit 1470ea
        // Vytvoří pomocí funkce první číselník
Packit 1470ea
        this._kittens = Gtk.SpinButton.new_with_range (1, 9001, 1);
Packit 1470ea
        this._kittens.connect ("value-changed", this._newValue.bind(this));
Packit 1470ea
Packit 1470ea
        // Vytvoří přizpůsobení, které se použije pro druhý číselník
Packit 1470ea
        this._adjustment = new Gtk.Adjustment ({
Packit 1470ea
            value: 1,
Packit 1470ea
            lower: 0,
Packit 1470ea
            upper: 9001,
Packit 1470ea
            step_increment: 1,
Packit 1470ea
            page_increment: 10 });
Packit 1470ea
Packit 1470ea
        // Vytvoří druhý číselník
Packit 1470ea
        this._tuna = new Gtk.SpinButton ({ adjustment: this._adjustment });
Packit 1470ea
        this._tuna.connect ("value-changed", this._newValue.bind(this));
Packit 1470ea
Packit 1470ea
        // this._tuna.set_digits (1);
Packit 1470ea
        // this._tuna.set_wrap (true);
Packit 1470ea
Packit 1470ea
        // Vytvoří textový popisek, který bude u číselníku
Packit 1470ea
        this._startLabel = new Gtk.Label ({ label: "There are " });
Packit 1470ea
        this._kittenLabel = new Gtk.Label ({ label: " kitten(s), and "});
Packit 1470ea
        this._tunaLabel = new Gtk.Label ({ label: " can(s) of tuna."});
Packit 1470ea
        this.perKitten = Math.floor((this._tuna.get_value() / this._kittens.get_value()));
Packit 1470ea
        this._lastLabel = new Gtk.Label ({
Packit 1470ea
            label: "That's " + this.perKitten + " can(s) of tuna per kitten." });
Packit 1470ea
Packit 1470ea
        // Vytvoří mřížku, do které se vloží číselníky a jejich popisky
Packit 1470ea
        this._spinGrid = new Gtk.Grid ({
Packit 1470ea
            halign: Gtk.Align.CENTER,
Packit 1470ea
            valign: Gtk.Align.CENTER,
Packit 1470ea
            margin_bottom: 20 });
Packit 1470ea
Packit 1470ea
        // Připojí vše do mřížky
Packit 1470ea
        this._spinGrid.attach (this._startLabel, 0, 0, 1, 1);
Packit 1470ea
        this._spinGrid.attach (this._kittens, 1, 0, 1, 1);
Packit 1470ea
        this._spinGrid.attach (this._kittenLabel, 2, 0, 1, 1);
Packit 1470ea
        this._spinGrid.attach (this._tuna, 3, 0, 1, 1);
Packit 1470ea
        this._spinGrid.attach (this._tunaLabel, 4, 0, 1, 1);
Packit 1470ea
Packit 1470ea
        // Vytvoří hlavní mřížku, která bude obsahovat poddružnou mřížku a poslední popisek
Packit 1470ea
        this._mainGrid = new Gtk.Grid ({
Packit 1470ea
            halign: Gtk.Align.CENTER,
Packit 1470ea
            valign: Gtk.Align.CENTER });
Packit 1470ea
Packit 1470ea
        // Připojí poddružnou mříku a poslední popisek do hlavní mřížky
Packit 1470ea
        this._mainGrid.attach (this._spinGrid, 0, 0, 1, 1);
Packit 1470ea
        this._mainGrid.attach (this._lastLabel, 0, 1, 1, 1);
Packit 1470ea
Packit 1470ea
        // Přidá hlavní mřížku do okna
Packit 1470ea
        this._window.add (this._mainGrid);
Packit 1470ea
Packit 1470ea
        // Zobrazí okno a všechny jeho synovské widgety
Packit 1470ea
        this._window.show_all();
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
    _newValue() {
Packit 1470ea
        // Aktualizuje popisek, který zobrazuje kolik konzerv připadá na jednu kočku
Packit 1470ea
        this.perKitten = Math.floor((this._tuna.get_value() / this._kittens.get_value()))
Packit 1470ea
        this._lastLabel.set_label ("That's " + this.perKitten + " can(s) of tuna per kitten.");
Packit 1470ea
    }
Packit 1470ea
};
Packit 1470ea
Packit 1470ea
// Spustí aplikaci
Packit 1470ea
let app = new SpinButtonExample ();
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.SpinButton.html">Gtk.SpinButton</link>

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