Η προβολή

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

Reference

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

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

m_TreeView.set_model(m_refListStore);

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

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

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

When using this simple append_column() overload, the TreeView will display the model data with an appropriate CellRenderer. For instance, strings and numbers are shown in a simple Gtk::Entry widget, and booleans are shown in a Gtk::CheckButton. This is usually what you need. For other column types you must either connect a callback that converts your type into a string representation, with TreeViewColumn::set_cell_data_func(), or derive a custom CellRenderer. Note that (unsigned) short is not supported by default - You could use (unsigned) int or (unsigned) long as the column type instead.

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

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

Then use append_column() to add the view Column to the View. Notice that Gtk::TreeView::append_column() is overloaded to accept either a prebuilt Gtk::TreeView::Column widget, or just the TreeModelColumn from which it generates an appropriate Gtk::TreeView::Column widget.

Here is some example code, which has a pixbuf icon and a text name in the same column:

auto pColumn = Gtk::make_managed<Gtk::TreeView::Column>("Icon Name");

// m_columns.icon and m_columns.iconname are columns in the model.
// pColumn is the column in the TreeView:
pColumn->pack_start(m_columns.icon, /* expand= */ false);
pColumn->pack_start(m_columns.iconname);

m_TreeView.append_column(*pColumn);

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

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

auto cols_count = m_TreeView.append_column_editable("Alex", m_columns.alex);
auto pColumn = m_TreeView.get_column(cols_count-1);
if(pColumn)
{
  auto 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 στην αναγνώριση ενεργειών χρήστη. Για παράδειγμα:

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

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

10.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.

10.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, μπορείτε να ορίσετε την ενεργοποιήσιμη ιδιότητα στη θέση του.

You can then connect to the appropriate "edited" signal. For instance, connect to Gtk::CellRendererText::signal_edited(), or Gtk::CellRendererToggle::signal_toggled(). If the column contains more than one CellRenderer then you will need to use Gtk::TreeView::get_column() and then call get_cells() on that view Column.

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