Blame platform-demos/el/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="el">
Packit 1470ea
  <info>
Packit 1470ea
  <title type="text">Προβολή δένδρου (Treeview) με αποθήκη καταλόγου (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>Ένα γραφικό στοιχείο που εμφανίζει μια ξεχωριστή λίστα στοιχείων</desc>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Ελληνική μεταφραστική ομάδα GNOME</mal:name>
Packit 1470ea
      <mal:email>team@gnome.gr</mal:email>
Packit 1470ea
      <mal:years>2012-2015</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>Δημήτρης Σπίγγος</mal:name>
Packit 1470ea
      <mal:email>dmtrs32@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2012, 2013</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>Μαρία Θουκιδίδου</mal:name>
Packit 1470ea
      <mal:email>marablack3@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2014</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>Θάνος Τρυφωνίδης</mal:name>
Packit 1470ea
      <mal:email>tomtryf@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2014, 2015</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  </info>
Packit 1470ea
Packit 1470ea
  <title>Προβολή δένδρου (Treeview) με αποθήκη καταλόγου (ListStore)</title>
Packit 1470ea
  <media type="image" mime="image/png" src="media/treeview_simple_liststore_penguins.png"/>
Packit 1470ea
  

Μια προβολή δένδρου (TreeView) μοιάζει με ένα παράθυρο στα περιεχόμενα είτε μιας αποθήκης καταλόγου (ListStore) είτε μιας προβολής δένδρου. Μια αποθήκη καταλόγου μοιάζει με ένα υπολογιστικό φύλλο: μια "επίπεδη", διδιάστατη λίστα πραγμάτων διαιρεμένη σε γραμμές και στήλες. Μια προβολή δένδρου, στο μεταξύ, μπορεί να διακλαδωθεί σε διαφορετικές κατευθύνσεις όπως κάνει ένα δένδρο. Σε αυτό το παράδειγμα, δημιουργήσαμε μια προβολή δένδρου που εμφανίζει τα περιεχόμενα μιας αποθήκης καταλόγου με (εικονικά) ονόματα και αριθμούς τηλεφώνου σε αυτό, και ρυθμίστηκε έτσι ώστε η <link xref="label.js">ετικέτα</link> στο τέλος του παραθύρου να εμφανίζει περισσότερες πληροφορίες σχετικά με οποιοδήποτε όνομα πατάτε.

Packit 1470ea
  

Η προβολή δένδρου (TreeView) δεν είναι απλά ένα μονό γραφικό στοιχείο, αλλά περιέχει έναν αριθμό μικρότερων γραφικών στοιχείων:

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

Τα γραφικά στοιχεία στήλης προβολής δένδρου (TreeViewColumn) εμφανίζουν κάθε (κάθετη) στήλη πληροφορίας από τη αποθήκη καταλόγων (ListStore). Καθένα έχει έναν τίτλο που μπορεί να προβληθεί στην κορυφή της στήλης, όπως στο στιγμιότυπο.

</item>
Packit 1470ea
    <item>

Τα γραφικά στοιχεία απεικονιστές κελιού (CellRenderer) "συσκευάζονται" σε κάθε στήλη προβολής δένδρου (TreeViewColumn) και περιέχουν τις οδηγίες πώς να εμφανίσουν κάθε ξεχωριστό "κελί" ή στοιχείο από τη ListStore. Υπάρχουν πολλοί διαφορετικοί τύποι, συμπεριλαμβανόμενου του κειμένου απεικονιστή κελιών (CellRendererText) που χρησιμοποιείται εδώ και του CellRendererPixbuf, που εμφανίζει μια εικόνα "ενδιάμεση μνήμη εικονοστοιχείου").

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

Τελικά, πρόκειται να χρησιμοποιήσουμε ένα αντικείμενο που λέγεται TreeIter, που δεν είναι γραφικό στοιχείο τόσο πολύ όσο ένας αόρατος δρομέας που δείχνει σε μια (οριζόντια) γραμμή στη ListStore. Οποτεδήποτε πατάτε σε ένα όνομα στον τηλεφωνικό κατάλογο, για παράδειγμα, δημιουργούμε ένα TreeIter που δείχνει τη γραμμή που επιλέχτηκε και έπειτα χρησιμοποιήστε το για να πείτε στη ListStore ποιας εγγραφής θέλουμε η ετικέτα να εμφανίσει περισσότερες πληροφορίες σχετικά.

Packit 1470ea
  <note>

Η TreeView είναι προφανώς το πιο περίπλοκο γραφικό στοιχείο Gtk, λόγω των πολλών μερών που έχει και του τρόπου συνεργασίας τους. Δώστε στον εαυτό σας τον χρόνο να μάθετε πώς δουλεύει και πειραματιστείτε μαζί του, ή δοκιμάστε πρώτα κάτι ευκολότερο εάν έχετε πρόβλημα.

</note>
Packit 1470ea
    <links type="section"/>
Packit 1470ea
Packit 1470ea
  <section id="imports">
Packit 1470ea
    <title>Βιβλιοθήκες για εισαγωγή</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
    

Αυτές είναι οι βιβλιοθήκες που χρειαζόμαστε να εισάγουμε αυτήν την εφαρμογή για να εκτελεστεί. Να θυμόσαστε ότι η γραμμή που λέει στο GNOME ότι χρησιμοποιούμε Gjs χρειάζεται πάντοτε να πάει στην αρχή.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="applicationwindow">
Packit 1470ea
    <title>Δημιουργία του παραθύρου εφαρμογής</title>
Packit 1470ea
    
Packit 1470ea
const TreeViewExample = new Lang.Class({
Packit 1470ea
    Name: 'TreeView Example with Simple ListStore',
Packit 1470ea
Packit 1470ea
    // Δημιουργία της εφαρμογής αυτής καθεαυτής
Packit 1470ea
    _init: function() {
Packit 1470ea
        this.application = new Gtk.Application({
Packit 1470ea
            application_id: 'org.example.jstreeviewsimpleliststore'
Packit 1470ea
        });
Packit 1470ea
Packit 1470ea
    // Σύνδεση των σημάτων 'activate' και 'startup' με τις συναρτήσεις επανάκλησης
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
    // Η συνάρτηση επανάκλησης για το σήμα 'activate' παρουσιάζει παράθυρο όταν είναι ενεργή
Packit 1470ea
    _onActivate: function() {
Packit 1470ea
        this._window.present();
Packit 1470ea
    },
Packit 1470ea
Packit 1470ea
    // Η συνάρτηση επανάκλησης για το σήμα 'startup' δομεί τη διεπαφή χρήστη
Packit 1470ea
    _onStartup: function() {
Packit 1470ea
        this._buildUI ();
Packit 1470ea
    },
Packit 1470ea
Packit 1470ea
    

Όλος ο κώδικας για αυτό το παράδειγμα πηγαίνει στην κλάση TreeViewExample. Ο παραπάνω κώδικας δημιουργεί μια <link href="http://www.roojs.com/seed/gir-1.2-gtk-3.0/gjs/Gtk.Application.html">Gtk.Application</link> για να μπουν μέσα τα γραφικά στοιχεία μας και τα παράθυρα.

Packit 1470ea
    
Packit 1470ea
    // Δόμηση της διεπαφής χρήστη της εφαρμογής
Packit 1470ea
    _buildUI: function() {
Packit 1470ea
Packit 1470ea
        // Δημιουργία του παραθύρου της εφαρμογής
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
    

Η συνάρτηση _buildUI είναι εκεί που βάζουμε όλον τον κώδικα για να δημιουργήσουμε τη διεπαφή χρήστη της εφαρμογής. Το πρώτο βήμα δημιουργεί ένα νέο <link xref="GtkApplicationWindow.js">Gtk.ApplicationWindow</link> για να βάλουμε μέσα τα γραφικά στοιχεία μας.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="liststore">
Packit 1470ea
    <title>Δημιουργία της αποθήκης λιστών (ListStore)</title>
Packit 1470ea
    
Packit 1470ea
        // Δημιουργία της υποκείμενης αποθήκης καταλόγου για τον τηλεφωνικό κατάλογο
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
    

Δημιουργούμε πρώτα την αποθήκη καταλόγου (ListStore) όπως θα κάναμε με κάθε γραφικό στοιχείο. Έπειτα καλούμε τη μέθοδο της set_column_types και την περνάμε σε έναν πίνακα τύπου δεδομένων GObject. (Θα μπορούσαμε να βάλουμε όλους τους τύπους σε μια γραμμή, αλλά εδώ τα διαιρούμε για διευκόλυνση της ανάγνωσης.)

Packit 1470ea
    

Οι τύποι δεδομένων GObject που μπορείτε να χρησιμοποιήσετε περιλαμβάνουν:

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

<file>GObject.TYPE_BOOLEAN</file> -- αληθές ή ψευδές

</item>
Packit 1470ea
      <item>

<file>GObject.TYPE_FLOAT</file> -- Ένας αριθμός κινητής υποδιαστολής (ένας με δεκαδική υποδιαστολή)

</item>
Packit 1470ea
      <item>

<file>GObject.TYPE_STRING</file> -- Μια συμβολοσειρά γραμμάτων και αριθμών

</item>
Packit 1470ea
      <item>

<file>gtk.gdk.Pixbuf</file> -- Μια εικόνα

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

Σε αυτήν την περίπτωση, κάνουμε μια ListStore των τεσσάρων στηλών, καθεμιά περιέχει τιμές συμβολοσειράς.

Packit 1470ea
    <note>

Χρειάζεται να βάλετε τη γραμμή <file>const GObject = imports.gi.GObject;</file> στην αρχή του κώδικα της εφαρμογή σας, όπως κάναμε σε αυτό το παράδειγμα, εάν θέλετε να μπορείτε να χρησιμοποιήσετε τύπους GObject.

</note>
Packit 1470ea
Packit 1470ea
    
Packit 1470ea
        // Δεδομένα για εισαγωγή στον τηλεφωνικό κατάλογο
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
    

Εδώ έχουμε την πληροφορία μετάβασης στην αποθήκη καταλόγων (ListStore). Είναι ένας πίνακας αντικειμένων, που καθένα αντιστοιχεί σε μια μοναδική εγγραφή στον τηλεφωνικό κατάλογο.

Packit 1470ea
    

Σημειώστε ότι η προβολή δένδρου (TreeView) στο στιγμιότυπο δεν εμφανίζει πράγματι τα δεδομένα από τις ιδιότητες "description". Στη θέση της, αυτή η πληροφορία εμφανίζεται στην ετικέτα από κάτω της, για κάθε γραμμή που πατάτε. Αυτό συμβαίνει επειδή η προβολή δένδρου και η αποθήκη καταλόγου (ListStore) είναι δύο ξεχωριστά πράγματα και μια προβολή δένδρου μπορεί να εμφανίσει όλο ή μέρος της αποθήκης καταλόγου και προβάλλει τι είναι σε αυτή με διαφορετικούς τρόπους. Μπορείτε ακόμα να έχετε πολλαπλά γραφικά στοιχεία που εμφανίζουν πράγματα από την ίδια την αποθήκη καταλόγου, όπως την ετικέτα στο παράδειγμά μας ή ακόμα μια δεύτερη προβολή δένδρου.

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
    

Αυτός ο βρόχος <file>for</file> βάζει τις συμβολοσειρές από τον τηλεφωνικό κατάλογό μας στη ListStore μας σε σειρά. Για να περάσουμε την μέθοδο ορισμού της ListStore στην επανάληψη που δείχνει στη σωστή γραμμή, χρειάζεται ένας πίνακας που λέει ποιες στήλες θέλουμε να ορίσουμε και ένας πίνακας που περιέχει τα δεδομένα που θέλουμε να βάλουμε σε αυτές τις στήλες.

Packit 1470ea
    

Μια μέθοδος <file>append</file> της ListStore προσθέτει μια οριζόντια γραμμή σε αυτή (ξεκινά χωρίς καμία) και επιστρέφει μια TreeIter που δείχνει σε αυτήν τη γραμμή όπως ένας δρομέας. Έτσι περνώντας το <file>this._listStore.append()</file> στη ListStore ως μια ιδιότητα, δημιουργούμε μια νέα γραμμή και λέμε στη μέθοδο <file>set</file> ποια γραμμή να ορίσει τα δεδομένα ταυτόχρονα.

Packit 1470ea
Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="treeview">
Packit 1470ea
    <title>Δημιουργία της προβολής δένδρου (TreeView)</title>
Packit 1470ea
    
Packit 1470ea
        // Δημιουργία της προβολής δένδρου
Packit 1470ea
        this._treeView = new Gtk.TreeView ({
Packit 1470ea
            expand: true,
Packit 1470ea
            model: this._listStore });
Packit 1470ea
Packit 1470ea
    

Εδώ δημιουργούμε ένα βασικό γραφικό στοιχείο TreeView, που επεκτείνεται οριζόντια και κάθετα για να χρησιμοποιήσει όσο χώρο χρειάζεται. Το ορίζουμε να χρησιμοποιήσει τη ListStore που δημιουργήσαμε ως το "model" του, ή το πράγμα που θα μας δείξει το υλικό.

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
        // Δημιουργία των στηλών για το βιβλίο διευθύνσεων
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
    

Τώρα δημιουργούμε καθεμιά από τις κάθετες TreeViewColumns που βλέπουμε στην TreeView. Ο τίτλος για καθεμιά πηγαίνει στην κορυφή, όπως μπορείτε να δείτε στο στιγμιότυπο.

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
        // Δημιουργία μιας απεικόνισης κελιού για όταν χρειάζεται έντονο κείμενο
Packit 1470ea
        let bold = new Gtk.CellRendererText ({
Packit 1470ea
            weight: Pango.Weight.BOLD });
Packit 1470ea
Packit 1470ea
        // Δημιουργία μιας απεικόνισης κελιού για κανονικό κείμενο
Packit 1470ea
        let normal = new Gtk.CellRendererText ();
Packit 1470ea
Packit 1470ea
        // Συσκευασία των απεικονίσεων κελιού στις στήλες
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
    

Εδώ δημιουργούμε τους απεικονιστές κελιών (CellRenderers) που θα χρησιμοποιήσουμε για την εμφάνιση του κειμένου από τη ListStore μας και τους πακετάρουμε στις TreeViewColumns. Κάθε CellRendererText χρησιμοποιείται για όλες τις καταχωρίσεις σε αυτήν τη στήλη. Το κανονικό μας CellRendererText απλά δημιουργεί απλό κείμενο, ενώ το έντονο κείμενο χρησιμοποιεί κείμενο βαρύτερου πάχους. Το βάζουμε στη στήλη πρώτου ονόματος και λέμε στα άλλα δύο να χρησιμοποιήσουμε αντίγραφα του κανονικού. Το "αληθές" χρησιμοποιείται ως η δεύτερη παράμετρος για τη μέθοδο <file>pack_start</file> που του λέει να επεκτείνει τα κελιά όταν είναι δυνατό, αντί να τα κρατήσει συμπαγή.

Packit 1470ea
    <note>

<link href="http://www.pygtk.org/docs/pygtk/pango-constants.html">Εδώ είναι μια λίστα</link> των άλλων ιδιοτήτων του κειμένου που μπορείτε να δείτε. Για να χρησιμοποιήσετε αυτές τις σταθερές Pango, βεβαιωθείτε ότι βάλατε τη γραμμή <file>const Pango = imports.gi.Pango;</file> στην αρχή του κώδικα σας όπως κάναμε.

</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
        // Εισαγωγή των στηλών στην προβολή δένδρου
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
    

Τώρα που έχουμε βάλει τους απεικονιστές κελιών (CellRenderers) στις στήλες προβολής δένδρου (TreeViewColumns), χρησιμοποιούμε τη μέθοδο <file>add_attribute</file> για να πει σε κάθε στήλη να σύρει το κείμενο από το πρότυπό μας προβολής δένδρου (TreeView) που ορίστηκε για χρήση· σε αυτήν την περίπτωση, την αποθήκη καταλόγου (ListStore) με τον τηλεφωνικό κατάλογο.

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

Η πρώτη παράμετρος είναι όποια απεικόνιση κελιών (CellRenderer) πρόκειται να χρησιμοποιήσουμε για απόδοση του τι σύρουμε.

</item>
Packit 1470ea
      <item>

Η δεύτερη παράμετρος είναι τι είδος πληροφορίας πρόκειται να σύρουμε. Σε αυτήν την περίπτωση, την αφήνουμε να μάθει ότι αποδίδουμε κείμενο.

</item>
Packit 1470ea
      <item>

Η τρίτη παράμετρος είναι σε ποια στήλη της ListStore σύρουμε αυτήν την πληροφορία.

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

Αφού το ρυθμίσουμε, χρησιμοποιούμε τη μέθοδο <file>insert_column</file> του TreeView για να βάλουμε τις TreeViewColumns μας μέσα του σε σειρά. Η TreeView μας είναι τώρα πλήρης.

Packit 1470ea
    <note>

Κανονικά, θα μπορούσατε να θελήσετε να χρησιμοποιήσετε έναν βρόχο για αρχικοποίηση την TreeView σας, αλλά σε αυτό το παράδειγμα εξηγούμε λεπτομερώς τα πράγματα βήμα-βήμα για διευκόλυνση της κατανόησης.

</note>
Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="ui">
Packit 1470ea
    <title>Δημιουργία της υπόλοιπης διεπαφής χρήστη</title>
Packit 1470ea
    
Packit 1470ea
        // Δημιουργία της ετικέτας που εμφανίζει λεπτομέρειες για το όνομα που διαλέξατε
Packit 1470ea
        this._label = new Gtk.Label ({ label: "" });
Packit 1470ea
Packit 1470ea
        // Λήψη όποιου στοιχείου επιλέγεται
Packit 1470ea
        this.selection = this._treeView.get_selection();
Packit 1470ea
Packit 1470ea
        // Όταν επιλέγεται κάτι νέο, call _on_changed
Packit 1470ea
        this.selection.connect ('changed', Lang.bind (this, this._onSelectionChanged));
Packit 1470ea
Packit 1470ea
    

Η μέθοδος <file>get_selection</file> της TreeView επιστρέφει ένα αντικείμενο που λέγεται TreeSelection. Μια TreeSelection είναι όπως μια TreeIter στο ότι είναι βασικά ένας δρομέας που δείχνει σε μια συγκεκριμένη γραμμή, εκτός από το ότι αυτό που δείχνει είναι αυτό που είναι ορατά επισημασμένο καθώς επιλέχτηκε.

Packit 1470ea
    

Αφού πάρουμε την TreeSelection που πηγαίνει με την TreeView μας, της ζητάμε να μας πει όταν αλλάζει σε ποια γραμμή δείχνει. Το κάνουμε συνδέοντας τι σήμα της <file>changed</file> στη συνάρτηση _onSelectionChanged που γράψαμε. Αυτή η συνάρτηση αλλάζει το εμφανιζόμενο κείμενο με την ετικέτα που μόλις κάναμε.

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
        // Δημιουργία πλέγματος για οργάνωση όλων μέσα του
Packit 1470ea
        this._grid = new Gtk.Grid;
Packit 1470ea
Packit 1470ea
        // Προσάρτηση της προβολής δένδρου και της ετικέτας στο πλέγμα
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
        // Προσθήκη του πλέγματος στο παράθυρο
Packit 1470ea
        this._window.add (this._grid);
Packit 1470ea
Packit 1470ea
        // Εμφάνιση του παραθύρου και όλων των θυγατρικών γραφικών στοιχείων
Packit 1470ea
        this._window.show_all();
Packit 1470ea
    },
Packit 1470ea
Packit 1470ea
    

Αφού το έχουμε βγάλει εκτός, δημιουργούμε ένα <link xref="grid.js">πλέγμα</link> για να τα βάλουμε όλα μέσα, έπειτα το προσθέτουμε στο παράθυρό μας και λέμε στο παράθυρο να εμφανίσει τον εαυτόν του και τα περιεχόμενα του.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="function">
Packit 1470ea
    <title>Η συνάρτηση που χειρίζεται μια αλλαγμένη επιλογή</title>
Packit 1470ea
Packit 1470ea
    
Packit 1470ea
    _onSelectionChanged: function () {
Packit 1470ea
Packit 1470ea
        // Σύλληψη ενός treeiter που δείχνει στην τρέχουσα επιλογή
Packit 1470ea
        let [ isSelected, model, iter ] = this.selection.get_selected();
Packit 1470ea
Packit 1470ea
        // Ορισμός της ετικέτας  για ανάγνωση των αποθηκευμένων τιμών στην τρέχουσα επιλογή
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
    

Η γραμμή του κώδικα με την δήλωση let είναι λίγο μπερδεμένη, αλλά παρόλα αυτά είναι ο άριστος τρόπος να κάνετε την TreeIter να δείχνει στην ίδια γραμμή όπως η TreeSelection μας. Πρέπει να δημιουργήσουμε λίγες άλλες αναφορές αντικειμένου, αλλά η <file>iter</file> είναι το μόνο που χρειαζόμαστε.

Packit 1470ea
    

Αφού το τελειώσουμε, καλούμε τη συνάρτηση της ετικέτας <file>set_label</file> και χρησιμοποιούμε τη συνάρτηση της ListStore <file>get_value</file> λίγες φορές για να συμπληρώσουμε τα δεδομένα που θέλουμε να τα εισάγουμε. Οι παράμετροι της είναι μια TreeIter που δείχνει στη γραμμή από όπου θέλουμε να πάρουμε δεδομένα και τη στήλη.

Packit 1470ea
    

Εδώ, θέλουμε να πάρουμε δεδομένα και από τις τέσσερις στήλες, συμπεριλαμβάνοντας την "κρυφή" που δεν είναι μέρος της TreeView. Έτσι, μπορούμε να χρησιμοποιήσουμε την ετικέτα μας για να εμφανίσουμε συμβολοσειρές που είναι υπερβολικά μεγάλες για προσαρμογή στη TreeView και που δεν χρειαζόμαστε να δούμε με μια ματιά.

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
// Εκτέλεση της εφαρμογής
Packit 1470ea
let app = new TreeViewExample ();
Packit 1470ea
app.application.run (ARGV);
Packit 1470ea
Packit 1470ea
    

Τελικά, δημιουργούμε ένα νέο παράδειγμα της τελειωμένης κλάσης TreeViewExample και εκτελούμε την εφαρμογή.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="complete">
Packit 1470ea
    <title>Δείγμα πλήρους κώδικα</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>Τεκμηρίωση σε βάθος</title>
Packit 1470ea

Σε αυτό το παράδειγμα χρησιμοποιήσαμε τα παρακάτω:

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>