Το πρότυπο

Κάθε Gtk::TreeView έχει μια συνδεμένη Gtk::TreeModel, που περιέχει τα εμφανιζόμενα δεδομένα από την TreeView. Κάθε Gtk::TreeModel μπορεί να χρησιμοποιηθεί από περισσότερες από μία Gtk::TreeView. Για παράδειγμα, αυτό επιτρέπει τα ίδια υποκείμενα δεδομένα να εμφανίζονται και να επεξεργάζονται με 2 διαφορετικούς τρόπους ταυτόχρονα. Ή οι 2 προβολές μπορεί να εμφανίζουν διαφορετικές στήλες από τα ίδια δεδομένα του προτύπου, κατά τον ίδιο τρόπο που 2 ερωτήματα SQL (ή "προβολές") μπορείνα εμφανίζουν διαφορετικά πεδία από τον ίδιο πίνακα βάσης δεδομένων.

Αν και μπορείτε θεωρητικά να υλοποιήσετε το δικό σας πρότυπο, θα χρησιμοποιείτε κανονικά τις κλάσεις προτύπου ή την ListStore ή την TreeStore.

Reference

9.1.1. Αποθήκευση λίστας (ListStore), για γραμμές

Η ListStore περιέχει απλές γραμμές δεδομένων και κάθε γραμμή δεν έχει θυγατρικά.

Φιγούρα 9-1Προβολή δένδρου - Αποθήκευση λίστας (TreeView - ListStore)

Reference

9.1.2. Αποθήκευση δένδρου, για μια ιεραρχία

Η TreeStore περιέχει γραμμές δεδομένων και κάθε γραμμή μπορεί να έχει θυγατρικές γραμμές.

Φιγούρα 9-2Προβολή δένδρου - Αποθήκευση λίστας (TreeView - ListStore)

Reference

9.1.3. Στήλες προτύπου

Η κλάση TreeModelColumnRecord χρησιμοποιείται για διατήρηση ανίχνευσης των στηλών και των τύπων δεδομένων τους. Προσθέτετε στιγμιότυπα TreeModelColumn στη ColumnRecord και έπειτα τα χρησιμοποιείτε στη TreeModelColumns, όταν παίρνετε και ορίζετε τα δεδομένα στις γραμμές του προτύπου. Θα το βρείτε προφανώς βολικό να παράξετε μια νέα TreeModelColumnRecord που έχει τα στιγμιότυπά σας στη TreeModelColumn ως δεδομένα μέλους.

class ModelColumns : public Gtk::TreeModelColumnRecord
{
public:

  ModelColumns()
    { add(m_col_text); add(m_col_number); }

  Gtk::TreeModelColumn<Glib::ustring> m_col_text;
  Gtk::TreeModelColumn<int> m_col_number;
};

ModelColumns m_Columns;

Ορίζετε την ColumnRecord όταν δημιουργείτε το πρότυπο, ως εξής:

Glib::RefPtr<Gtk::ListStore> refListStore =
    Gtk::ListStore::create(m_Columns);

Σημειώστε ότι το στιγμιότυπο (όπως m_Columns εδώ) πρέπει συνήθως να μην είναι στατικό, επειδή χρειάζεται συχνά να δημιουργηθεί αφού η glibmm έχει δημιουργηθεί.

9.1.4. Προσθήκη γραμμών

Προσθέστε γραμμές στο πρότυπο με τις μεθόδους append(), prepend(), ή insert().

Gtk::TreeModel::iterator iter = m_refListStore->append();

Μπορείτε να αφαιρέσετε την αναφορά από τον επαναλήπτη για να πάρετε τη γραμμή:

Gtk::TreeModel::Row row = *iter;

9.1.4.1. Προσθήκη θυγατρικών γραμμών

Τα πρότυπα Gtk::TreeStore μπορούν να έχουν θυγατρικά στοιχεία. Προσθέστε τα με τις μεθόδους append(), prepend(), ή insert() ως εξής:

Gtk::TreeModel::iterator iter_child =
    m_refTreeStore->append(row.children());

9.1.5. Ορισμός τιμών

Μπορείτε να χρησιμοποιήσετε τη operator[] για να αντικαταστήσει τον ορισμό των δεδομένων για μια συγκεκριμένη στήλη στη γραμμή, ορίζοντας την TreeModelColumn που χρησιμοποιήθηκε στη δημιουργία του προτύπου.

row[m_Columns.m_col_text] = "sometext";

9.1.6. Λήψη τιμών

Μπορείτε να χρησιμοποιήσετε τη operator[] για να αντικαταστήσει τη λήψη των δεδομένων για μια συγκεκριμένη στήλη σε μια γραμμή, ορίζοντας την TreeModelColumn που χρησιμοποιήθηκε στη δημιουργία του προτύπου.

Glib::ustring strText = row[m_Columns.m_col_text];
int number = row[m_Columns.m_col_number];

Ο μεταγλωττιστής θα παραπονεθεί αν χρησιμοποιήσετε έναν ακατάλληλο τύπο. Για παράδειγμα, αυτό θα μπορούσε να δημιουργήσει ένα σφάλμα μεταγλωττιστή:

//compiler error - no conversion from ustring to int.
int number = row[m_Columns.m_col_text];

9.1.7. "Κρυφές" στήλες

Μπορεί να θέλετε να συνδέσετε πρόσθετα δεδομένα με κάθε γραμμή. Αν συμβαίνει αυτό, απλά προσθέστε το ως μια στήλη προτύπου, αλλά μην το προσθέσετε στην προβολή.