Blame platform-demos/cs/treeview_simple_liststore.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="treeview_simple_liststore.js" xml:lang="cs">
Packit 1470ea
  <info>
Packit 1470ea
  <title type="text">TreeView s ListStore (JavaScript)</title>
Packit 1470ea
    <link type="guide" xref="beginner.js#treeview"/>
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-07-04" 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>Widget, který zobrazuje samostatný seznam položek</desc>
Packit 1470ea
  </info>
Packit 1470ea
Packit 1470ea
  <title>TreeView s ListStore</title>
Packit 1470ea
  <media type="image" mime="image/png" src="media/treeview_simple_liststore_penguins.png"/>
Packit 1470ea
  

TreeView (stromové zobrazení) je něco jako okno do obsahu úložiště ListStore nebo TreeStore. ListStore je podobný tabulce: „plochý“ dvourozměrný seznam věcí rozdělených do řádků a sloupců. TreeStore se oproti němu může větvit do různých směrů podobně jako strom. V tomto příkladu vytvoříme TreeView zobrazující obsah ListStore se (smyšlenými) jmény a telefonními čísly a k tomu widget <link xref="label.js">Label</link> ve spodní části okna, který bude zobrazovat více informací ke jménu, na které v seznamu kliknete.

Packit 1470ea
  

TreeView ve skutečnosti není jeden widget, ale obsahuje řadu dalších menších:

Packit 1470ea
  <list>
Packit 1470ea
    <item>

Widgety TreeViewColumn (sloupec stromového zobrazení) zobrazují jednotlivé (svislé) sloupce s údaji z ListStore. Každý má záhlaví, které může být zobrazené nad sloupcem, podobně jako na snímku obrazovky.

</item>
Packit 1470ea
    <item>

Widgety CellRenderer (vykreslovač buňky) jsou „zabaleny“ do jednotlivých TreeViewColumn a obsahují instrukce, jak zobrazovat jednotlivé „buňky“ nebo položky z ListStore. Existuje jich více různých typů, včetně CellRendererText použitého zde a CellRendererPixbuf, který zobrazuje obrázky (pixbuf).

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

A navíc budeme použít objekt nazvaný TreeIter, což není ani tak widget, jako neviditelný kurzor, který ukazuje na (vodorovný) řádek v ListStore. Kdykoliv například kliknete na jméno v adresáři, vytvoříme TreeIter ukazující na řádek, který je vybrán a použijeme jej, abychom řekli úložišti, který záznam chceme pro popisek zobrazující o záznamech více informací.

Packit 1470ea
  <note>

TreeView je pravděpodobně nejsložitější widget v Gtk tím, jakou má spoustu částí a jak ty spolupracují. Věnujte chvilku času studiu, jak funguje a experimentujte s ním, nebo, když s ním budete mít problémy, zkuste nejdřív něco jednoduššího.

</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 GObject = imports.gi.GObject;
Packit 1470ea
const Gtk = imports.gi.Gtk;
Packit 1470ea
const Lang = imports.lang;
Packit 1470ea
const Pango = imports.gi.Pango;
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 TreeViewExample = new Lang.Class({
Packit 1470ea
    Name: 'TreeView Example with Simple ListStore',
Packit 1470ea
Packit 1470ea
    // Vytvoří vlastní aplikaci
Packit 1470ea
    _init: function() {
Packit 1470ea
        this.application = new Gtk.Application({
Packit 1470ea
            application_id: 'org.example.jstreeviewsimpleliststore'
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ě TreeViewExample. 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
            default_height: 250,
Packit 1470ea
            default_width: 100,
Packit 1470ea
            border_width: 20,
Packit 1470ea
            title: "My Phone Book"});
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="liststore">
Packit 1470ea
    <title>Vytvoření ListStore</title>
Packit 1470ea
    
Packit 1470ea
        // Vytvoří podkladový ListStore pro telefonní seznam
Packit 1470ea
        this._listStore = new Gtk.ListStore ();
Packit 1470ea
        this._listStore.set_column_types ([
Packit 1470ea
            GObject.TYPE_STRING,
Packit 1470ea
            GObject.TYPE_STRING,
Packit 1470ea
            GObject.TYPE_STRING,
Packit 1470ea
            GObject.TYPE_STRING]);
Packit 1470ea
Packit 1470ea
    

Nejprve vytvořím seznamové úložiště obdobně, jako kterýkoliv jiný widget. Pak zavoláme jeho metodu set_column_types a předáme ji pole datových typů GObject. (Mohli bychom je mít všechny na jednom řádku, ale zde je kvůli snadnějšímu čtení rozdělíme.)

Packit 1470ea
    

Mezi datové typy GObject, které můžete použít, patří:

Packit 1470ea
    <list>
Packit 1470ea
      <item>

<file>GObject.TYPE_BOOLEAN</file> – Pravda nebo nepravda

</item>
Packit 1470ea
      <item>

<file>GObject.TYPE_FLOAT</file> – Desetinné číslo (tj. s plovoucí desetinou čárkou, resp. tečkou)

</item>
Packit 1470ea
      <item>

<file>GObject.TYPE_STRING</file> – Řetězec písmen a číslic

</item>
Packit 1470ea
      <item>

<file>gtk.gdk.Pixbuf</file> – Obrázek

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

V tomto případě vytváříme seznamové úložiště se čtyřmi sloupci, přičemž všechny obsahují řetězcové hodnoty.

Packit 1470ea
    <note>

Abyste mohli používat typy GObject, potřebujete vložit řádek <file>const GObject = imports.gi.GObject;</file> na začátek kódu aplikace tak, jako jsem učinili v tomto příkladu.

</note>
Packit 1470ea
Packit 1470ea
    
Packit 1470ea
        // Data do telefonního seznamu
Packit 1470ea
        this.phonebook =
Packit 1470ea
        let phonebook =
Packit 1470ea
            [{ name: "Jurg", surname: "Billeter", phone: "555-0123",
Packit 1470ea
                description: "A friendly person."},
Packit 1470ea
             { name: "Johannes", surname: "Schmid", phone: "555-1234",
Packit 1470ea
                description: "Easy phone number to remember."},
Packit 1470ea
             { name: "Julita", surname: "Inca", phone: "555-2345",
Packit 1470ea
                description: "Another friendly person."},
Packit 1470ea
             { name: "Javier", surname: "Jardon", phone: "555-3456",
Packit 1470ea
                description: "Bring fish for his penguins."},
Packit 1470ea
             { name: "Jason", surname: "Clinton", phone: "555-4567",
Packit 1470ea
                description: "His cake's not a lie."},
Packit 1470ea
             { name: "Random J.", surname: "Hacker", phone: "555-5678",
Packit 1470ea
                description: "Very random!"}];
Packit 1470ea
Packit 1470ea
    

Zde máme údaje, které přijdou do seznamového úložiště. Jedná se o pole objektů, kdy každý odpovídá jednomu záznamu v adresáři.

Packit 1470ea
    

Všimněte si, že stromové zobrazení na snímku obrazovky ve skutečnosti nezobrazuje data z vlastnosti „description“. Místo toho je tato vlastnost zobrazena v popisku pod ním a to pro řádek, na který jste klikli. To je proto, že TreeView a ListStore jsou dvě oddělené věci, a stromové zobrazení může zobrazovat všechny nebo jen některé sloupce ze seznamového úložiště a může je zobrazovat různými způsoby. Na druhou stranu můžete mít více widgetů, které budou zobrazovat věci z téhož ListStore, podobně jako Label v našem příkladu, nebo třeba klidně druhý TreeView.

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
        for (i = 0; i < phonebook.length; i++ ) {
Packit 1470ea
            let contact = phonebook [i];
Packit 1470ea
            this._listStore.set (this._listStore.append(), [0, 1, 2, 3],
Packit 1470ea
                [contact.name, contact.surname, contact.phone, contact.description]);
Packit 1470ea
        }
Packit 1470ea
Packit 1470ea
    

Tato smyčka for vkládá řetězce z našeho adresáře do seznamového úložiště ve správném pořadí. Metodě set úložiště předáváme iterátor ukazující na správný řádek, pole říkající, které sloupce chceme nastavit, a pole obsahující data, která chceme do těchto sloupců vložit.

Packit 1470ea
    

Metoda append objektu ListStore přidává vodorovný řádek (na začátku je bez řádků) a vrací TreeIter ukazující na tento nový řádek. Takže předáním this._listStore.append() do seznamového úložiště jako vlastnosti vytvoříme nový řádek a zároveň řekneme metodě set, která data má do řádku vložit.

Packit 1470ea
Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="treeview">
Packit 1470ea
    <title>Vytvoření TreeView</title>
Packit 1470ea
    
Packit 1470ea
        // Vytvoří stromové zobrazení
Packit 1470ea
        this._treeView = new Gtk.TreeView ({
Packit 1470ea
            expand: true,
Packit 1470ea
            model: this._listStore });
Packit 1470ea
Packit 1470ea
    

Zde vytvoříme základní widget TreeView, který se roztáhne ve vodorovném i svislém směru, aby zabral co nejvíce místa může. Nastavíme, aby používal ListStore, který jsme vytvořili jako jeho „model“ neboli věc, ze které se budou věci zobrazovat.

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
        // Vytvoří sloupce pro telefonní seznam
Packit 1470ea
        let firstName = new Gtk.TreeViewColumn ({ title: "First Name" });
Packit 1470ea
        let lastName = new Gtk.TreeViewColumn ({ title: "Last Name" });
Packit 1470ea
        let phone = new Gtk.TreeViewColumn ({ title: "Phone Number" });
Packit 1470ea
Packit 1470ea
    

Nyní vytvoříme jednotlivé svislé sloupce TreeViewColumn, které ve stromovém zobrazení vidíme. Názvy jednotlivých sloupců se objeví v záhlaví, jak můžete vidět na snímku obrazovky.

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
        // Vytvoří vykreslovač buňky pro potřeby tučného textu
Packit 1470ea
        let bold = new Gtk.CellRendererText ({
Packit 1470ea
            weight: Pango.Weight.BOLD });
Packit 1470ea
Packit 1470ea
        // Vytvoří vykreslovač buňky pro normální text
Packit 1470ea
        let normal = new Gtk.CellRendererText ();
Packit 1470ea
Packit 1470ea
        // Zabalí vykreslovače buněk ke sloupcům
Packit 1470ea
        firstName.pack_start (bold, true);
Packit 1470ea
        lastName.pack_start (normal, true);
Packit 1470ea
        phone.pack_start (normal, true);
Packit 1470ea
Packit 1470ea
    

Zde vytváříme vykreslovače CellRenderer, které použijeme k zobrazení textu z ListStore, a balíme je do příslušných TreeViewColumn. Každý CellRendererText je použit pro všechny záznamy ve sloupci. Náš normální CellRendererText jen vytvoří prostý text, zatímco ten pro tučný text použije text se změněnou vlastností weight. Ten vložíme do prvního sloupce a ostatním dvoum řekneme, aby používali kopie toho normálního. V metodě pack_start je jako druhý parametr použita hodnota true, která říká, že má roztáhnout buňku co nejvíce to jde, místo, aby ji udržovala kompaktní.

Packit 1470ea
    <note>

<link href="http://www.pygtk.org/docs/pygtk/pango-constants.html">Zde je seznam</link> dalších vlastností textu, které můžete použít. Abyste mohli tyto konstanty používat, musíte vložit řádek const Pango = imports.gi.Pango; na začátek svého kódu.

</note>
Packit 1470ea
Packit 1470ea
    
Packit 1470ea
        firstName.add_attribute (bold, "text", 0);
Packit 1470ea
        lastName.add_attribute (normal, "text", 1);
Packit 1470ea
        phone.add_attribute (normal, "text", 2);
Packit 1470ea
Packit 1470ea
        // Vloží sloupce do treeview
Packit 1470ea
        this._treeView.insert_column (firstName, 0);
Packit 1470ea
        this._treeView.insert_column (lastName, 1);
Packit 1470ea
        this._treeView.insert_column (phone, 2);
Packit 1470ea
Packit 1470ea
    

Nyní vložíme jednotlivé CellRenderer do příslušných TreeViewColumn. Použijeme metodu add_attribute, která jednotlivým sloupcům říká, aby si vytáhli text z modelu našeho stromového zobrazení, které se používá (v tomto případě ListStore s adresářem).

Packit 1470ea
    <list>
Packit 1470ea
      <item>

První parametr je vykreslovač buňky, který hodláme použít k vykreslení toho, co jsme vytáhli.

</item>
Packit 1470ea
      <item>

Druhým parametrem je druh informací, které vytahujeme. V tomto případě vězte, že vykreslujeme text.

</item>
Packit 1470ea
      <item>

Třetím parametrem je číslo sloupce seznamového úložiště, ze kterého se data mají vytahovat.

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

Po té, co jsme toto nastavili, použijeme metodu insert_column stromového zobrazení k vložení našich sloupců TreeViewColumn do něj ve správném pořadí. Nyní je náš stromový pohled kompletní.

Packit 1470ea
    <note>

Normálně byste asi chtěli použít k inicializaci svého stromového pohledu smyčku, ale v tomto příkladu to provedeme krok za krokem v zájmu snazšího pochopení.

</note>
Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="ui">
Packit 1470ea
    <title>Sestavení zbytku uživatelského rozhraní</title>
Packit 1470ea
    
Packit 1470ea
        // Vytvoří popisek, který zobrazuje podrobnosti ke jménu, které jste vybrali
Packit 1470ea
        this._label = new Gtk.Label ({ label: "" });
Packit 1470ea
Packit 1470ea
        // Vrátí, která položka je vybrána
Packit 1470ea
        this.selection = this._treeView.get_selection();
Packit 1470ea
Packit 1470ea
        // Když je vybráno něco nového, zavolá _on_changed
Packit 1470ea
        this.selection.connect ('changed', Lang.bind (this, this._onSelectionChanged));
Packit 1470ea
Packit 1470ea
    

Metoda get_selection widgetu TreeView vrací objekt nazvaný TreeSelection. Ten je, podobně jako TreeIter, v podstatě kurzor ukazující na konkrétní řádek, vyjma toho, že tento ukazuje na řádek vizuálně zvýrazněný jako vybraný.

Packit 1470ea
    

Po té, co získáme objekt TreeSelection, které patří našemu stromovému zobrazení, řekneme mu, aby nám sděloval změny v řádku, na který ukazuje. Uděláme to napojením jeho signálu "changed" na funkci _onSelectionChanged, kterou jsme napsali. Tato funkce mění text zobrazený v popisku, který jsme právě vytvořili.

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
        // Vytvoří mřížku, do které vše uspořádáme
Packit 1470ea
        this._grid = new Gtk.Grid;
Packit 1470ea
Packit 1470ea
        // Připojí stromové zobrazení a popisek do mřížky
Packit 1470ea
        this._grid.attach (this._treeView, 0, 0, 1, 1);
Packit 1470ea
        this._grid.attach (this._label, 0, 1, 1, 1);
Packit 1470ea
Packit 1470ea
        // Přidá mřížku do okna
Packit 1470ea
        this._window.add (this._grid);
Packit 1470ea
Packit 1470ea
        // Zobrazí okno a všechny jeho synovské widgety
Packit 1470ea
        this._window.show_all();
Packit 1470ea
    },
Packit 1470ea
Packit 1470ea
    

Po té, co jsem tohle vyřešili, vytvoříme <link xref="grid.js">Grid</link>, do které vše vložíme, a pak ji přidáme do našeho okna a oknu řekneme, aby zobrazilo sebe i svůj obsah.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="function">
Packit 1470ea
    <title>Funkce, která obsluhuje změnu výběru</title>
Packit 1470ea
Packit 1470ea
    
Packit 1470ea
    _onSelectionChanged: function () {
Packit 1470ea
Packit 1470ea
        // Získá iteraci stromového zobrazení ukazující na aktuální výběr
Packit 1470ea
        let [ isSelected, model, iter ] = this.selection.get_selected();
Packit 1470ea
Packit 1470ea
        // Nastaví popisek, aby vytáhl údaje uchované v aktuálním výběru
Packit 1470ea
        this._label.set_label ("\n" +
Packit 1470ea
            this._listStore.get_value (iter, 0) + " " +
Packit 1470ea
            this._listStore.get_value (iter, 1) + " " +
Packit 1470ea
            this._listStore.get_value (iter, 2) + "\n" +
Packit 1470ea
            this._listStore.get_value (iter, 3));
Packit 1470ea
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
});
Packit 1470ea
Packit 1470ea
    

Řádek s výrazem let je poněkud spletitý, nicméně je to nejlepší způsob, jak získat TreeIter ukazující na stejný řádek jako náš TreeSelection. Vytvoří n-tici dalších odkazů na objekty, ale iter je jediný, který nás zajímá.

Packit 1470ea
    

Když máme toto hotovo, zavoláme funkci set_label z widgetu Label a použijeme funkci get_value z ListStore patřičně krát k vyplnění dat, která chceme do popisku vložit. Jejím parametrem jsou stromový iterátor, který ukazuje na řádek, ze kterého data chceme, a sloupec.

Packit 1470ea
    

Zde chceme získat data ze čtyř sloupců, včetně jednoho „skrytého“, který není součástí stromového zobrazení. Tímto způsobem můžeme použít náš popisek, aby zobrazil řetězce, které jsou příliš dlouhé na to, aby byly vidět ve stromovém zobrazení, a ty, které nepotřebujeme v přehledu vidět.

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

Nakonec vytvoříme novou instanci konečné třídy TreeViewExample 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 GObject = imports.gi.GObject;
Packit 1470ea
const Gtk = imports.gi.Gtk;
Packit 1470ea
const Pango = imports.gi.Pango;
Packit 1470ea
Packit 1470ea
class TreeViewExample {
Packit 1470ea
    // Vytvoří vlastní aplikaci
Packit 1470ea
    constructor() {
Packit 1470ea
        this.application = new Gtk.Application({
Packit 1470ea
            application_id: 'org.example.jstreeviewsimpleliststore'
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
        // Vytvoří okno aplikace
Packit 1470ea
        this._window = new Gtk.ApplicationWindow({
Packit 1470ea
            application: this.application,
Packit 1470ea
            window_position: Gtk.WindowPosition.CENTER,
Packit 1470ea
            default_height: 250,
Packit 1470ea
            default_width: 100,
Packit 1470ea
            border_width: 20,
Packit 1470ea
            title: "My Phone Book"});
Packit 1470ea
Packit 1470ea
        // Vytvoří podkladový ListStore pro telefonní seznam
Packit 1470ea
        this._listStore = new Gtk.ListStore ();
Packit 1470ea
        this._listStore.set_column_types ([
Packit 1470ea
            GObject.TYPE_STRING,
Packit 1470ea
            GObject.TYPE_STRING,
Packit 1470ea
            GObject.TYPE_STRING,
Packit 1470ea
            GObject.TYPE_STRING]);
Packit 1470ea
Packit 1470ea
        // Data do telefonního seznamu
Packit 1470ea
        let phonebook =
Packit 1470ea
            [{ name: "Jurg", surname: "Billeter", phone: "555-0123",
Packit 1470ea
                description: "A friendly person."},
Packit 1470ea
             { name: "Johannes", surname: "Schmid", phone: "555-1234",
Packit 1470ea
                description: "Easy phone number to remember."},
Packit 1470ea
             { name: "Julita", surname: "Inca", phone: "555-2345",
Packit 1470ea
                description: "Another friendly person."},
Packit 1470ea
             { name: "Javier", surname: "Jardon", phone: "555-3456",
Packit 1470ea
                description: "Bring fish for his penguins."},
Packit 1470ea
             { name: "Jason", surname: "Clinton", phone: "555-4567",
Packit 1470ea
                description: "His cake's not a lie."},
Packit 1470ea
             { name: "Random J.", surname: "Hacker", phone: "555-5678",
Packit 1470ea
                description: "Very random!"}];
Packit 1470ea
Packit 1470ea
        // Vloží data do telefonního seznamu
Packit 1470ea
        for (let i = 0; i < phonebook.length; i++ ) {
Packit 1470ea
            let contact = phonebook [i];
Packit 1470ea
            this._listStore.set (this._listStore.append(), [0, 1, 2, 3],
Packit 1470ea
                [contact.name, contact.surname, contact.phone, contact.description]);
Packit 1470ea
        }
Packit 1470ea
Packit 1470ea
        // Vytvoří stromové zobrazení
Packit 1470ea
        this._treeView = new Gtk.TreeView ({
Packit 1470ea
            expand: true,
Packit 1470ea
            model: this._listStore });
Packit 1470ea
Packit 1470ea
        // Vytvoří sloupce pro telefonní seznam
Packit 1470ea
        let firstName = new Gtk.TreeViewColumn ({ title: "First Name" });
Packit 1470ea
        let lastName = new Gtk.TreeViewColumn ({ title: "Last Name" });
Packit 1470ea
        let phone = new Gtk.TreeViewColumn ({ title: "Phone Number" });
Packit 1470ea
Packit 1470ea
        // Vytvoří vykreslovač buňky pro potřeby tučného textu
Packit 1470ea
        let bold = new Gtk.CellRendererText ({
Packit 1470ea
            weight: Pango.Weight.BOLD });
Packit 1470ea
Packit 1470ea
        // Vytvoří vykreslovač buňky pro normální text
Packit 1470ea
        let normal = new Gtk.CellRendererText ();
Packit 1470ea
Packit 1470ea
        // Zabalí vykreslovače buněk ke sloupcům
Packit 1470ea
        firstName.pack_start (bold, true);
Packit 1470ea
        lastName.pack_start (normal, true);
Packit 1470ea
        phone.pack_start (normal, true);
Packit 1470ea
Packit 1470ea
        // Nastaví u každého sloupce, aby tahal text z modelu TreeView
Packit 1470ea
        firstName.add_attribute (bold, "text", 0);
Packit 1470ea
        lastName.add_attribute (normal, "text", 1);
Packit 1470ea
        phone.add_attribute (normal, "text", 2);
Packit 1470ea
Packit 1470ea
        // Vloží sloupce do treeview
Packit 1470ea
        this._treeView.insert_column (firstName, 0);
Packit 1470ea
        this._treeView.insert_column (lastName, 1);
Packit 1470ea
        this._treeView.insert_column (phone, 2);
Packit 1470ea
Packit 1470ea
        // Vytvoří popisek, který zobrazuje podrobnosti ke jménu, které jste vybrali
Packit 1470ea
        this._label = new Gtk.Label ({ label: "" });
Packit 1470ea
Packit 1470ea
        // Vrátí, která položka je vybrána
Packit 1470ea
        this.selection = this._treeView.get_selection();
Packit 1470ea
Packit 1470ea
        // Když je vybráno něco nového, zavolá _on_changed
Packit 1470ea
        this.selection.connect ('changed', this._onSelectionChanged.bind(this));
Packit 1470ea
Packit 1470ea
        // Vytvoří mřížku, do které vše uspořádáme
Packit 1470ea
        this._grid = new Gtk.Grid;
Packit 1470ea
Packit 1470ea
        // Připojí stromové zobrazení a popisek do mřížky
Packit 1470ea
        this._grid.attach (this._treeView, 0, 0, 1, 1);
Packit 1470ea
        this._grid.attach (this._label, 0, 1, 1, 1);
Packit 1470ea
Packit 1470ea
        // Přidá mřížku do okna
Packit 1470ea
        this._window.add (this._grid);
Packit 1470ea
Packit 1470ea
        // Zobrazí okno a všechny jeho synovské widgety
Packit 1470ea
        this._window.show_all();
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
    _onSelectionChanged() {
Packit 1470ea
        // Získá iteraci stromového zobrazení ukazující na aktuální výběr
Packit 1470ea
        let [ isSelected, model, iter ] = this.selection.get_selected();
Packit 1470ea
Packit 1470ea
        // Nastaví popisek, aby vytáhl údaje uchované v aktuálním výběru
Packit 1470ea
        this._label.set_label ("\n" +
Packit 1470ea
            this._listStore.get_value (iter, 0) + " " +
Packit 1470ea
            this._listStore.get_value (iter, 1) + " " +
Packit 1470ea
            this._listStore.get_value (iter, 2) + "\n" +
Packit 1470ea
            this._listStore.get_value (iter, 3)
Packit 1470ea
        );
Packit 1470ea
    }
Packit 1470ea
};
Packit 1470ea
Packit 1470ea
// Spustí aplikaci
Packit 1470ea
let app = new TreeViewExample ();
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.CellRendererText.html">Gtk.CellRendererText</link>

</item>
Packit 1470ea
  <item>

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

</item>
Packit 1470ea
  <item>

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

</item>
Packit 1470ea
  <item>

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

</item>
Packit 1470ea
  <item>

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

</item>
Packit 1470ea
  <item>

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

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