Blame platform-demos/cs/comboboxtext.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="comboboxtext.js" xml:lang="cs">
Packit 1470ea
  <info>
Packit 1470ea
  <title type="text">ComboBoxText (JavaScript)</title>
Packit 1470ea
    <link type="guide" xref="beginner.js#menu-combo-toolbar"/>
Packit 1470ea
    <link type="seealso" xref="GtkApplicationWindow.js"/>
Packit 1470ea
    <link type="seealso" xref="messagedialog.js"/>
Packit 1470ea
    <revision version="0.1" date="2012-07-06" 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>Čistě textová rozbalovací nabídka</desc>
Packit 1470ea
  </info>
Packit 1470ea
Packit 1470ea
  <title>ComboBoxText</title>
Packit 1470ea
  <media type="image" mime="image/png" src="media/combobox.png"/>
Packit 1470ea
  

ComboBox je rozbalovací nabídka. Rozdíl mezi <link xref="combobox.js">ComboBox</link> a ComboBoxText (textová rozbalovací nabídka) je v tom, že má jen základní textové volby, zatímco plnohodnotný ComboBox používá ListStore nebo TreeStore (což jsou v podstatě tabulky) k zobrazení věcí, jako jsou rozvětvené volby nebo obrázky vedle jednotlivých voleb.

Packit 1470ea
  <note>

Pokud nepotřebujete přidané funkce plného ComboBox nebo komfort práce s ListStore a TreeStore, můžete shledat jednodušším, kdykoliv to použití dovolí, ComboBoxText.

</note>
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 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 ComboBoxTextExample = new Lang.Class ({
Packit 1470ea
    Name: 'ComboBoxText 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.jscomboboxtext'});
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ě MessageDialogExample. 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
            title: "Welcome to GNOME",
Packit 1470ea
            default_width: 200,
Packit 1470ea
            border_width: 10 });
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="comboboxtext">
Packit 1470ea
    <title>Vytvoření ComboBoxText</title>
Packit 1470ea
    
Packit 1470ea
        // Vytvoří rozbalovací seznam
Packit 1470ea
        this._comboBoxText = new Gtk.ComboBoxText();
Packit 1470ea
Packit 1470ea
        // Naplní rozbalovací seznam
Packit 1470ea
        let distros = ["Select distribution", "Fedora", "Mint", "Suse"];
Packit 1470ea
        for (let i = 0; i < distros.length; i++)
Packit 1470ea
            this._comboBoxText.append_text (distros[i]);
Packit 1470ea
        this._comboBoxText.set_active (0);
Packit 1470ea
Packit 1470ea
        // Napojí signál "changed" od rozbalovacího seznamu k naší funkci zpětnoho volání
Packit 1470ea
        this._comboBoxText.connect ('changed', Lang.bind (this, this._onComboChanged));
Packit 1470ea
Packit 1470ea
    

Po té, co jsme vytvořili textový rozbalovací seznam, použijeme jeho metodu append_text pro přidání textových řetězců. Podobně jako u položek v poli má každá číslo ID, počínaje od 0. Pro zjednodušení můžete skutečně vytvořit pole a použít smyčku pro přidání jednotlivých položek tak, jako jsme to udělali zde.

Packit 1470ea
    

Až máme textový rozbalovací seznam naplněný, nastavíme jeho první položku jako aktivní, takže před prvním kliknutím uvidíme řádek „Select distribution“ („Vyberte distribuci“). Následně napojíme signál "changed" na funkci _onComboChanged, takže bude zavolána pokaždé, když je v rozbalovacím seznamu proveden nový výběr.

Packit 1470ea
    <note>

Když byste chtěli do ComboBoxText dodatečně přidat položku, můžete použít metodu insert_text. A pokud byste raději než čísla použili textové řetězce jako ID pro jednotlivé položky, můžete použít metody append a insert. Ohledně podrobností, jak je použít, se podívejte na odkazy ve spodní části této lekce.

</note>
Packit 1470ea
Packit 1470ea
    
Packit 1470ea
        // Přidá rozbalovací seznam do okna
Packit 1470ea
        this._window.add (this._comboBoxText);
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 ComboBoxText do okna a oknu řekneme, aby zobrazilo sebe i widgety v něm.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="function">
Packit 1470ea
    <title>Funkce, která zpracovává váš výběr</title>
Packit 1470ea
    
Packit 1470ea
    _onComboChanged: function () {
Packit 1470ea
Packit 1470ea
        // Reakce, které použijeme v našem dialogovém okně se zprávou
Packit 1470ea
        let responses = ["",
Packit 1470ea
            "Fedora is a community distro sponsored by Red Hat.",
Packit 1470ea
            "Mint is a popular distro based on Ubuntu.",
Packit 1470ea
            "SUSE is a name shared by two separate distros."];
Packit 1470ea
Packit 1470ea
    

Budeme vytvářet vyskakovací <link xref="messagedialog.js">MessageDialog</link>, který vám zobrazí zprávu podle vybrané distribuce. Nejdříve vytvoříme pole odpovědí, které se budou používat. Protože první položkou v našem rozbalovacím seznamu je jen informace „Select distribution“, ponecháme první řetězec v našem poli prázdný.

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
        // Která položka rozbalovacího seznamu je aktivní?
Packit 1470ea
        let activeItem = this._comboBoxText.get_active();
Packit 1470ea
Packit 1470ea
        // Žádné dialogové okno se zprávou, když je vybráno „Select distribution“
Packit 1470ea
        if (activeItem != 0) {
Packit 1470ea
            this._popUp = new Gtk.MessageDialog ({
Packit 1470ea
                transient_for: this._window,
Packit 1470ea
                modal: true,
Packit 1470ea
                buttons: Gtk.ButtonsType.OK,
Packit 1470ea
                message_type: Gtk.MessageType.INFO,
Packit 1470ea
                text: responses[activeItem]});
Packit 1470ea
Packit 1470ea
            // Napojí tlačítko OK na obslušnou funkci
Packit 1470ea
            this._popUp.connect ('response', Lang.bind (this, this._onDialogResponse));
Packit 1470ea
Packit 1470ea
            // Zobrazí dialogové okno se zprávou
Packit 1470ea
            this._popUp.show();
Packit 1470ea
        }
Packit 1470ea
Packit 1470ea
    },
Packit 1470ea
Packit 1470ea
    

Než zobrazíme dialogové okno se zprávou, nejprve otestujeme, že není vybrána volba „Select distribution“. Po té nastavíme text podle položky v poli, která odpovídá aktivní položce v rozbalovacím seznamu. To uděláme pomocí metody get_active method, která vrací číselné ID vašeho výběru.

Packit 1470ea
    <note>

Jinými metodami, které bychom mohli použít jsou get_active_id, která vrací textové ID přiřazené metodou append, a get_active_text, která vrací celý text ve vybrané položce.

</note>
Packit 1470ea
    

Po té, co vytvoříme MessageDialog, napojíme jeho signál "response" na funkci _onDialogResponse a následně řekneme oknu, ať se zobrazí.

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
    _onDialogResponse: function () {
Packit 1470ea
Packit 1470ea
        this._popUp.destroy ();
Packit 1470ea
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
});
Packit 1470ea
Packit 1470ea
    

Protože jediným tlačítkem, které dialogové okno se zprávou má, je tlačítko <gui>OK</gui>, nepotřebujeme testovat hodnotu response_id, abychom zjistili, na které tlačítko bylo kliknuto. Vše, co uděláme, je, že dialogové okno zlikvidujeme.

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

Nakonec vytvoříme novou instanci konečné třídy ComboBoxTextExample 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
const Gtk = imports.gi.Gtk;
Packit 1470ea
Packit 1470ea
class ComboBoxTextExample {
Packit 1470ea
Packit 1470ea
    // Vytvoří vlastní aplikaci
Packit 1470ea
    constructor() {
Packit 1470ea
        this.application = new Gtk.Application ({
Packit 1470ea
            application_id: 'org.example.jscomboboxtext'});
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
            title: "Welcome to GNOME",
Packit 1470ea
            default_width: 200,
Packit 1470ea
            border_width: 10 });
Packit 1470ea
Packit 1470ea
        // Vytvoří rozbalovací seznam
Packit 1470ea
        this._comboBoxText = new Gtk.ComboBoxText();
Packit 1470ea
Packit 1470ea
        // Naplní rozbalovací seznam
Packit 1470ea
        let distros = ["Select distribution", "Fedora", "Mint", "Suse"];
Packit 1470ea
        for (let i = 0; i < distros.length; i++)
Packit 1470ea
            this._comboBoxText.append_text (distros[i]);
Packit 1470ea
        this._comboBoxText.set_active (0);
Packit 1470ea
Packit 1470ea
        // Napojí signál "changed" od rozbalovacího seznamu k naší funkci zpětnoho volání
Packit 1470ea
        this._comboBoxText.connect ('changed', this._onComboChanged.bind(this));
Packit 1470ea
Packit 1470ea
        // Přidá rozbalovací seznam do okna
Packit 1470ea
        this._window.add (this._comboBoxText);
Packit 1470ea
Packit 1470ea
        // Zobrazí okno a všechny jeho synovské widgety
Packit 1470ea
        this._window.show_all();
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
    _onComboChanged() {
Packit 1470ea
Packit 1470ea
        // Reakce, které použijeme v našem dialogovém okně se zprávou
Packit 1470ea
        let responses = ["",
Packit 1470ea
            "Fedora is a community distro sponsored by Red Hat.",
Packit 1470ea
            "Mint is a popular distro based on Ubuntu.",
Packit 1470ea
            "SUSE is a name shared by two separate distros."];
Packit 1470ea
Packit 1470ea
        // Která položka rozbalovacího seznamu je aktivní?
Packit 1470ea
        let activeItem = this._comboBoxText.get_active();
Packit 1470ea
Packit 1470ea
        // Žádné dialogové okno se zprávou, když je vybráno „Select distribution“
Packit 1470ea
        if (activeItem != 0) {
Packit 1470ea
            this._popUp = new Gtk.MessageDialog ({
Packit 1470ea
                transient_for: this._window,
Packit 1470ea
                modal: true,
Packit 1470ea
                buttons: Gtk.ButtonsType.OK,
Packit 1470ea
                message_type: Gtk.MessageType.INFO,
Packit 1470ea
                text: responses[activeItem]});
Packit 1470ea
Packit 1470ea
            // Napojí tlačítko OK na obslušnou funkci
Packit 1470ea
            this._popUp.connect ('response', this._onDialogResponse.bind(this));
Packit 1470ea
Packit 1470ea
            // Zobrazí dialogové okno se zprávou
Packit 1470ea
            this._popUp.show();
Packit 1470ea
        }
Packit 1470ea
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
    _onDialogResponse() {
Packit 1470ea
Packit 1470ea
        this._popUp.destroy ();
Packit 1470ea
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
};
Packit 1470ea
Packit 1470ea
// Spustí aplikaci
Packit 1470ea
let app = new ComboBoxTextExample ();
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

V této ukázce se používá následující:

Packit 1470ea
<list>
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.ComboBoxText.html">Gtk.ComboBoxText</link>

</item>
Packit 1470ea
  <item>

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

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