Η προβολή

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

Reference

9.2.1. Χρήση ενός προτύπου

Μπορείτε να ορίσετε μία Gtk::TreeModel, όταν κατασκευάζετε την Gtk::TreeView, ή μπορείτε να χρησιμοποιήσετε τη μέθοδο set_model(), ως εξής:

m_TreeView.set_model(m_refListStore);

9.2.2. Προσθήκη στηλών προβολής

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

m_TreeView.append_column("Messages", m_Columns.m_col_text);

Όταν χρησιμοποιείτε αυτήν απλή αντικατάσταση append_column(), η TreeView θα εμφανίσει τα δεδομένα του προτύπου με μια κατάλληλη CellRenderer. Για παράδειγμα, οι συμβολοσειρές και οι αριθμοί εμφανίζονται σε ένα απλό γραφικό συστατικό Gtk::Entry και οι τιμές Μπουλ εμφανίζονται σε μια Gtk::CheckButton. Αυτό είναι συνήθως αυτό που χρειάζεστε. Για άλλους τύπους στηλών, πρέπει ή να συνδεθείτε με μια επανάκληση που μετατρέπει τον τύπο σας σε μια συμβολοσειρά παρουσίασης, με TreeViewColumn::set_cell_data_func(), ή να παράξει μια προσαρμοσμένη CellRenderer. Σημειώστε ότι (χωρίς πρόσημο) μικρός αριθμός δεν υποστηρίζεται από προεπιλογή - Μπορείτε να χρησιμοποιήσετε (χωρίς πρόσημο) ακέραιο ή (χωρίς πρόσημο) μεγάλο αριθμό ως τύπο στήλης στη θέση του.

9.2.3. Περισσότερες από μια στήλη προτύπου ανά στήλη προβολής

Για την απόδοση περισσότερων από μια στήλης προτύπου σε μια στήλη προβολής, χρειάζεται να δημιουργήσετε το γραφικό συστατικό TreeView::Column χειροκίνητα και να χρησιμοποιήσετε την pack_start() για να προσθέσετε τις στήλες του προτύπου σε αυτή.

Έπειτα χρησιμοποιήστε την append_column() για να προσθέσετε τη στήλη προβολής στην προβολή. Σημειώστε ότι η Gtk::TreeView::append_column() επικαλύπτεται για να δεχτεί είτε ένα προκατασκευασμένο γραφικό συστατικό Gtk::TreeView::Column, ή απλά την TreeModelColumn από την οποία παράγει ένα κατάλληλο γραφικό συστατικό Gtk::TreeView::Column.

Να κάποιο παράδειγμα κώδικα από το gtkmm/demos/gtk-demo/example_icontheme.cc, που έχει ένα εικονίδιο pixbuf και ένα όνομα κειμένου στην ίδια στήλη:

Gtk::TreeView::Column* pColumn =
  Gtk::manage(new Gtk::TreeView::Column("Icon Name"));

// m_columns.icon and m_columns.iconname είναι στήλες στο μοντέλο.
// pColumn είναι η στήλη στην προβολή δένδρου:
pColumn->pack_start(m_columns.icon, /* expand= */ false);
pColumn->pack_start(m_columns.iconname);

m_TreeView.append_column(*pColumn);

9.2.4. Ορίζοντας τις λεπτομέρειες CellRenderer

Η προεπιλεγμένη CellRenderers και η προεπιλεγμένη τους συμπεριφορά κανονικά αρκούν, αλλά μπορεί ενίοτε να χρειαστείτε πιο λεπτό έλεγχο. Για παράδειγμα, αυτός ο κώδικας παραδείγματος από το gtkmm/demos/gtk-demo/example_treeview_treestore.cc, προσαρτά ένα γραφικό συστατικό Gtk::CellRenderer και το πληροφορεί για να αποδώσει τα δεδομένα από ποικίλες στήλες προτύπου μέσα από ποικίλες πτυχές της εμφάνισης του.

int cols_count = m_TreeView.append_column_editable("Alex", m_columns.alex);
Gtk::TreeViewColumn* pColumn = m_TreeView.get_column(cols_count-1);
if(pColumn)
{
  Gtk::CellRendererToggle* pRenderer =
    static_cast<Gtk::CellRendererToggle*>(pColumn->get_first_cell());
  pColumn->add_attribute(pRenderer->property_visible(), m_columns.visible);
  pColumn->add_attribute(pRenderer->property_activatable(), m_columns.world);

Μπορείτε επίσης να συνδέσετε τα σήματα CellRenderer στην αναγνώριση ενεργειών χρήστη. Για παράδειγμα:

Gtk::CellRendererToggle* pRenderer =
    Gtk::manage( new Gtk::CellRendererToggle() );
pRenderer->signal_toggled().connect(
    sigc::bind( sigc::mem_fun(*this,
        &Example_TreeView_TreeStore::on_cell_toggled), m_columns.dave)
);

9.2.5. Επεξεργάσιμα κελιά

9.2.5.1. Αυτόματα αποθηκευμένα επεξεργάσιμα κελιά.

Cells in a TreeView can be edited in-place by the user. To allow this, use the Gtk::TreeView insert_column_editable() and append_column_editable() methods instead of insert_column() and append_column(). When these cells are edited the new values will be stored immediately in the Model. Note that these methods are templates which can only be instantiated for simple column types such as Glib::ustring, int, and long.

9.2.5.2. Υλοποίηση προσαρμοσμένης λογικής για επεξεργάσιμα κελιά.

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

To achieve this, you should use the normal Gtk::TreeView insert_column() and append_column() methods, then use get_column_cell_renderer() to get the Gtk::CellRenderer used by that column.

Θα πρέπει έπειτα να αλλάξετε τύπο σε Gtk::CellRenderer* στο συγκεκριμένο CellRenderer που περιμένετε, έτσι μπορείτε να χρησιμοποιήσετε ειδικές API.

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

cell.property_editable() = true;

Για ένα CellRendererToggle, μπορείτε να ορίσετε την ενεργοποιήσιμη ιδιότητα στη θέση του.

Μπορείτε έπειτα να συνδεθείτε με το κατάλληλο "επεξεργασμένο" σήμα. Για παράδειγμα, συνδεθείτε στις Gtk::CellRendererText::signal_edited(), ή Gtk::CellRendererToggle::signal_toggled(). Αν η στήλη περιέχει περισσότερες από μία CellRenderer, τότε θα απαιτηθεί η χρήση της Gtk::TreeView::get_column() και μετά η κλήση της get_cell_renderers() σε αυτήν την στήλη προβολής.

Στον χειριστή σήματός σας, θα πρέπει να εξετάσετε τη νέα τιμή και έπειτα να την αποθηκεύσει στο πρότυπο, αν αυτό είναι κατάλληλο για την εφαρμογή σας.