Blame platform-demos/fr/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="fr">
Packit 1470ea
  <info>
Packit 1470ea
  <title type="text">TreeView with 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>Un élément graphique qui affiche une liste séparée d'éléments</desc>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Luc Rebert,</mal:name>
Packit 1470ea
      <mal:email>traduc@rebert.name</mal:email>
Packit 1470ea
      <mal:years>2011</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Alain Lojewski,</mal:name>
Packit 1470ea
      <mal:email>allomervan@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2011-2012</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Luc Pionchon</mal:name>
Packit 1470ea
      <mal:email>pionchon.luc@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2011</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Bruno Brouard</mal:name>
Packit 1470ea
      <mal:email>annoa.b@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2011-12</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Luis Menina</mal:name>
Packit 1470ea
      <mal:email>liberforce@freeside.fr</mal:email>
Packit 1470ea
      <mal:years>2014</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  </info>
Packit 1470ea
Packit 1470ea
  <title>TreeView avec ListStore</title>
Packit 1470ea
  <media type="image" mime="image/png" src="media/treeview_simple_liststore_penguins.png"/>
Packit 1470ea
  

Un TreeView est une fenêtre affichant le contenu soit d'un ListStore, soit d'un TreeStore. Un ListStore peut être comparé à une feuille de calcul : une liste « plate », en deux dimensions, contenant des données réparties sur des lignes et dans des colonnes. Alors qu'un TreeStore peut déployer ses branches dans différentes directions, à la manière d'un arbre. Dans cet exemple, nous créons un TreeView qui affiche le contenu d'un ListStore contenant des noms et des numéros de téléphone (fictifs) et nous le paramétrons pour que l'<link xref="label.js">étiquette</link> en bas de la fenêtre affiche plus d'informations sur le nom qui a été cliqué.

Packit 1470ea
  

Un TreeView n'est pas qu'un simple élément graphique, il contient aussi un certain nombre d'autres plus petits :

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

Les éléments graphiques TreeViewColumn affichent chaque colonne d'informations contenue dans le ListStore. Chacune d'elle a un nom qui peut être affiché dans l'en-tête de la colonne, comme montré dans la capture d'écran.

</item>
Packit 1470ea
    <item>

Les éléments graphiques CellRenderer sont « empilés » dans chaque TreeViewColumn et contiennent les instructions sur la manière d'afficher chaque « cellule » individuelle ou chaque élément du ListStore. Il en existe beaucoup de types différents, y compris le CellRendererText utilisé ici et le CellRendererPixbuf qui affiche une image « pixel buffer ».

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

Pour finir, nous allons utiliser un objet nommé TreeIter, qui n'est pas à proprement parler un élément graphique, mais plutôt un curseur invisible qui pointe vers une ligne horizontale du ListStore. Si vous cliquez par exemple sur un nom de la liste téléphonique, cela génère un TreeIter qui pointe vers la ligne sélectionnée et qui sert à indiquer au ListStore quelles informations supplémentaires l'étiquette doit afficher.

Packit 1470ea
  <note>

Le TreeView est probablement l'élément graphique Gtk le plus compliqué, de par le nombre d'éléments qu'il contient et à cause de la façon dont ils sont imbriqués pour travailler ensemble. Prenez le temps d'apprendre et son fonctionnement en faisant des essais, ou alors essayez de commencer par quelque chose de plus facile si vous n'y arrivez pas.

</note>
Packit 1470ea
    <links type="section"/>
Packit 1470ea
Packit 1470ea
  <section id="imports">
Packit 1470ea
    <title>Bibliothèques à importer</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
    

Ce sont les bibliothèques que nous devons importer pour faire fonctionner cette application. N'oubliez pas que la ligne qui informe GNOME que nous allons utiliser Gjs doit toujours se trouver au début.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="applicationwindow">
Packit 1470ea
    <title>Création de la fenêtre de l'application</title>
Packit 1470ea
    
Packit 1470ea
const TreeViewExample = new Lang.Class({
Packit 1470ea
    Name: 'TreeView Example with Simple ListStore',
Packit 1470ea
Packit 1470ea
    // Create the application itself
Packit 1470ea
    _init: function() {
Packit 1470ea
        this.application = new Gtk.Application({
Packit 1470ea
            application_id: 'org.example.jstreeviewsimpleliststore'
Packit 1470ea
        });
Packit 1470ea
Packit 1470ea
    // Connect 'activate' and 'startup' signals to the callback functions
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
    // Callback function for 'activate' signal presents window when active
Packit 1470ea
    _onActivate: function() {
Packit 1470ea
        this._window.present();
Packit 1470ea
    },
Packit 1470ea
Packit 1470ea
    // Callback function for 'startup' signal builds the UI
Packit 1470ea
    _onStartup: function() {
Packit 1470ea
        this._buildUI ();
Packit 1470ea
    },
Packit 1470ea
]]>
Packit 1470ea
    

Tout le code utilisé pour cet exemple va dans la classe TreeViewExample. Le code ci-dessus crée une <link href="http://www.roojs.com/seed/gir-1.2-gtk-3.0/gjs/Gtk.Application.html">Gtk.Application</link> pour nos éléments graphiques et la fenêtre qui les contient.

Packit 1470ea
    
Packit 1470ea
    // Build the application's UI
Packit 1470ea
    _buildUI: function() {
Packit 1470ea
Packit 1470ea
        // Create the application window
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
    

La fonction _buildUI est l'endroit où nous mettons tout le code nécessaire à la création de l'interface utilisateur de l'application. La première étape consiste à créer une <link xref="GtkApplicationWindow.js">Gtk.ApplicationWindow</link> pour y mettre tous nos éléments graphiques.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="liststore">
Packit 1470ea
    <title>Création du ListStore</title>
Packit 1470ea
    
Packit 1470ea
        // Create the underlying liststore for the phonebook
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
    

Créons en premier le ListStore comme nous l'aurions fait pour n'importe quel élément graphique. Appelons ensuite sa méthode set_column_types et passons lui un tableau de types de données GObject (nous aurions pu placer tous les types sur une seule et même ligne, mais pour faciliter la lecture, nous les séparons).

Packit 1470ea
    

Les types de données GObject que vous pouvez utiliser incluent :

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

<file>GObject.TYPE_BOOLEAN</file> -- true ou false

</item>
Packit 1470ea
      <item>

<file>GObject.TYPE_FLOAT</file> -- un nombre à virgule flottante

</item>
Packit 1470ea
      <item>

<file>GObject.TYPE_STRING</file> -- une chaîne de caractères (lettres ou chiffres)

</item>
Packit 1470ea
      <item>

<file>gtk.gdk.Pixbuf</file> -- une image

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

Dans ce cas, nous créons un ListStore de quatre colonnes contenant chacune des valeurs de type chaînes de caractères.

Packit 1470ea
    <note>

Pour pouvoir utiliser les types GObject, vous devez placer la ligne <file>const GObject = imports.gi.GObject;</file> au début du code de votre application, comme nous l'avons fait dans cet exemple.

</note>
Packit 1470ea
Packit 1470ea
    
Packit 1470ea
        // Data to go in the phonebook
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
    

Voici les informations contenues dans le ListStore. C'est un assortiment d'objets, chacun correspondant à une entrée de notre répertoire téléphonique.

Packit 1470ea
    

Notez que le TreeView de la capture d'écran n'affiche pas pour l'instant les données des propriétés « description ». Elles s'afficheront dans l'étiquette du dessous à chaque clic sur une ligne. C'est parce qu'un TreeView et un ListStore sont deux choses bien distinctes et qu'un TreeView peut afficher tout ou une partie du contenu d'un ListStore de différentes façons. Vous pouvez même posséder plusieurs éléments graphiques affichant des éléments d'un même ListStore, comme l'étiquette de notre exemple ou bien encore un second 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
    

Cette boucle <file>for</file> place les chaînes de caractères de notre répertoire téléphonique dans notre ListStore dans l'ordre. Pour ce faire, nous passons à la méthode set du ListStore le curseur qui pointe vers la bonne ligne, un tableau qui indique quelles colonnes nous voulons définir et un tableau qui contient les données que nous voulons y mettre.

Packit 1470ea
    

La méthode <file>append</file> du ListStore ajoute une ligne horizontale à celui-ci (au début, il n'y en a pas) et renvoie un TreeIter pointant vers cette ligne comme un curseur. Donc, en transmettant <file>this._listStore.append()</file> au ListStore comme propriété, nous créons une nouvelle ligne en indiquant en même temps à la méthode <file>set</file> à quelle ligne elle doit attribuer les données.

Packit 1470ea
Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="treeview">
Packit 1470ea
    <title>Création du TreeView</title>
Packit 1470ea
    
Packit 1470ea
        // Create the treeview
Packit 1470ea
        this._treeView = new Gtk.TreeView ({
Packit 1470ea
            expand: true,
Packit 1470ea
            model: this._listStore });
Packit 1470ea
]]>
Packit 1470ea
    

Ici, nous créons un élément graphique TreeView de base, qui s'étend à la fois horizontalement et verticalement pour utiliser autant d'espace que nécessaire. Nous le paramétrons pour utiliser le ListStore que nous avons créé comme étant son « modèle » et d'où proviendront les éléments qu'il affichera.

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
        // Create the columns for the address book
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
    

Nous créons maintenant chacun des TreeViewColumns vertical qui s'afficheront dans notre TreeView. Comme le montre la capture d'écran, chaque titre se situe respectivement en haut de sa colonne.

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
        // Create a cell renderer for when bold text is needed
Packit 1470ea
        let bold = new Gtk.CellRendererText ({
Packit 1470ea
            weight: Pango.Weight.BOLD });
Packit 1470ea
Packit 1470ea
        // Create a cell renderer for normal text
Packit 1470ea
        let normal = new Gtk.CellRendererText ();
Packit 1470ea
Packit 1470ea
        // Pack the cell renderers into the columns
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
    

Ici, nous créons les CellRenderers que nous allons utiliser pour afficher le texte contenu dans notre ListStore et nous les positionnons dans les TreeViewColumns. Chaque CellRendererText est utilisé pour toutes les entrées de cette colonne. Notre CellRendererText normal (normal) ne génère que du texte brut, alors que celui en gras (bold) utilise du texte plus gras. Nous le mettons dans la première en-tête de colonne et nous indiquons aux deux autres d'utiliser des copies du normal. L'argument « true » utilisé comme second paramètre de la méthode <file>pack_start</file> lui indique d'agrandir les cellules quand cela est possible, au lieu de les laisser compactes.

Packit 1470ea
    <note>

<link href="http://www.pygtk.org/docs/pygtk/pango-constants.html">Voici iciune liste</link> d'autres propriétés de texte que vous pouvez utiliser. Pour pouvoir utiliser les constantes Pango, assurez-vous d'ajouter la ligne <file>const Pango = imports.gi.Pango;</file> au début de votre code comme nous l'avons fait.

</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
        // Insert the columns into the 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
    

Après avoir placé les CellRenderers dans les TreeViewColumns, nous utilisons la méthode <file>add_attribute</file> pour indiquer à chaque colonne d'extraire du modèle le texte pour lequel notre TreeView est programmée ; dans ce cas, le ListStore contenant le répertoire téléphonique.

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

Le premier paramètre indique quel CellRenderer nous allons utiliser pour restituer ce que nous extrayons.

</item>
Packit 1470ea
      <item>

Le second paramètre indique le type d'information que nous voulons extraire. Dans ce cas, nous lui indiquons que nous voulons du texte.

</item>
Packit 1470ea
      <item>

Le troisième paramètre indique de quelle colonne du ListStore nous voulons extraire cette information.

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

Après avoir paramétré ceci, nous utilisons la méthode <file>insert_column</file> pour trier le contenu de nos TreeViewColumns. Notre TreeView est à présent terminée.

Packit 1470ea
    <note>

Normalement, vous devriez utiliser une boucle pour initialiser votre TreeView, mais dans cet exemple, nous avons détaillé étape par étape ce qui ce passe afin de mieux comprendre.

</note>
Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="ui">
Packit 1470ea
    <title>Construction du reste de l'interface utilisateur</title>
Packit 1470ea
    
Packit 1470ea
        // Create the label that shows details for the name you select
Packit 1470ea
        this._label = new Gtk.Label ({ label: "" });
Packit 1470ea
Packit 1470ea
        // Get which item is selected
Packit 1470ea
        this.selection = this._treeView.get_selection();
Packit 1470ea
Packit 1470ea
        // When something new is selected, call _on_changed
Packit 1470ea
        this.selection.connect ('changed', Lang.bind (this, this._onSelectionChanged));
Packit 1470ea
]]>
Packit 1470ea
    

La méthode <file>get_selection</file> du TreeView retourne un objet appelé un TreeSelection. Un TreeSelection est comme un TreeIter, tout simplement un curseur qui pointe vers une ligne particulière, à la différence que celui-ci pointe vers la ligne qui est marqué visuellement comme sélectionnée.

Packit 1470ea
    

Une fois obtenu le TreeSelection qui va avec notre TreeView, nous lui demandons de nous indiquer vers quelle ligne il pointe quand il est modifié. Nous obtenons cela en connectant le signal <file>changed</file> à la fonction _onSelectionChanged que nous avons programmée. Cette fonction modifie le texte affiché par l'étiquette que nous venons de créer.

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
        // Create a grid to organize everything in
Packit 1470ea
        this._grid = new Gtk.Grid;
Packit 1470ea
Packit 1470ea
        // Attach the treeview and label to the grid
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
        // Add the grid to the window
Packit 1470ea
        this._window.add (this._grid);
Packit 1470ea
Packit 1470ea
        // Show the window and all child widgets
Packit 1470ea
        this._window.show_all();
Packit 1470ea
    },
Packit 1470ea
]]>
Packit 1470ea
    

Ceci fait, nous créons une <link xref="grid.js">grille (grid)</link> pour y placer le tout, puis nous l'ajoutons à notre fenêtre et demandons à cette fenêtre de s'afficher avec son contenu.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="function">
Packit 1470ea
    <title>Fonction prenant en charge la modification de la sélection</title>
Packit 1470ea
Packit 1470ea
    
Packit 1470ea
    _onSelectionChanged: function () {
Packit 1470ea
Packit 1470ea
        // Grab a treeiter pointing to the current selection
Packit 1470ea
        let [ isSelected, model, iter ] = this.selection.get_selected();
Packit 1470ea
Packit 1470ea
        // Set the label to read off the values stored in the current selection
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
    

La ligne de code utilisant l'instruction « let » est quelque peu compliquée, mais c'est néanmoins la meilleure façon d'obtenir un TreeIter qui pointe vers la même ligne que notre TreeSelection. Elle doit créer quelques autres références d'objets, mais le seul qui nous intéresse est l'<file>iter</file>.

Packit 1470ea
    

Ceci fait, nous appelons la fonction <file>set_label</file> de l'étiquette et nous utilisons la fonction <file>get_value</file> du ListStore autant de fois que nécessaire pour la remplir de toutes les données que nous souhaitons y mettre. Ses paramètres sont un TreeIter pointant vers la ligne dont nous voulons extraire les données et la colonne.

Packit 1470ea
    

Ici, nous voulons obtenir les données des quatre colonnes, y compris celles qui sont « masquées » et qui ne font pas partie du TreeView. De cette façon, nous pouvons utiliser notre étiquette pour afficher les chaînes de caractères qui sont trop longues pour tenir dans le TreeView et que nous n'avons pas besoin de voir au premier coup d'œil.

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
// Run the application
Packit 1470ea
let app = new TreeViewExample ();
Packit 1470ea
app.application.run (ARGV);
Packit 1470ea
]]>
Packit 1470ea
    

Enfin, nous créons une nouvelle instance de la classe TreeViewExample qui est terminée et nous démarrons l'application.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="complete">
Packit 1470ea
    <title>Exemple complet de code</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
    // Create the application itself
Packit 1470ea
    constructor() {
Packit 1470ea
        this.application = new Gtk.Application({
Packit 1470ea
            application_id: 'org.example.jstreeviewsimpleliststore'
Packit 1470ea
        });
Packit 1470ea
Packit 1470ea
        // Connect 'activate' and 'startup' signals to the callback functions
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
    // Callback function for 'activate' signal presents window when active
Packit 1470ea
    _onActivate() {
Packit 1470ea
        this._window.present();
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
    // Callback function for 'startup' signal builds the UI
Packit 1470ea
    _onStartup() {
Packit 1470ea
        this._buildUI();
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
    // Build the application's UI
Packit 1470ea
    _buildUI() {
Packit 1470ea
        // Create the application window
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
        // Create the underlying liststore for the phonebook
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 to go in the 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
        // Put the data in the phonebook
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
        // Create the treeview
Packit 1470ea
        this._treeView = new Gtk.TreeView ({
Packit 1470ea
            expand: true,
Packit 1470ea
            model: this._listStore });
Packit 1470ea
Packit 1470ea
        // Create the columns for the address book
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
        // Create a cell renderer for when bold text is needed
Packit 1470ea
        let bold = new Gtk.CellRendererText ({
Packit 1470ea
            weight: Pango.Weight.BOLD });
Packit 1470ea
Packit 1470ea
        // Create a cell renderer for normal text
Packit 1470ea
        let normal = new Gtk.CellRendererText ();
Packit 1470ea
Packit 1470ea
        // Pack the cell renderers into the columns
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
        // Set each column to pull text from the TreeView's model
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
        // Insert the columns into the 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
        // Create the label that shows details for the name you select
Packit 1470ea
        this._label = new Gtk.Label ({ label: "" });
Packit 1470ea
Packit 1470ea
        // Get which item is selected
Packit 1470ea
        this.selection = this._treeView.get_selection();
Packit 1470ea
Packit 1470ea
        // When something new is selected, call _on_changed
Packit 1470ea
        this.selection.connect ('changed', this._onSelectionChanged.bind(this));
Packit 1470ea
Packit 1470ea
        // Create a grid to organize everything in
Packit 1470ea
        this._grid = new Gtk.Grid;
Packit 1470ea
Packit 1470ea
        // Attach the treeview and label to the grid
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
        // Add the grid to the window
Packit 1470ea
        this._window.add (this._grid);
Packit 1470ea
Packit 1470ea
        // Show the window and all child widgets
Packit 1470ea
        this._window.show_all();
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
    _onSelectionChanged() {
Packit 1470ea
        // Grab a treeiter pointing to the current selection
Packit 1470ea
        let [ isSelected, model, iter ] = this.selection.get_selected();
Packit 1470ea
Packit 1470ea
        // Set the label to read off the values stored in the current selection
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
// Run the application
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>Documentation approfondie</title>
Packit 1470ea

Dans cet exemple, les éléments suivants sont utilisés :

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>