La vista

La vista es el widget en sí (Gtk::TreeView) que muestra los datos del modelo (Gtk::TreeModel) y le permite al usuario interactuar con él. La vista puede mostrar todas las columnas del modelo, o sólo algunas, y puede mostrarlas de varias maneras.

Reference

9.2.1. Usar un modelo

Puede especificar un Gtk::TreeModel cuando construye la Gtk::TreeView, o puede usar el método set_model(), así:

m_TreeView.set_model(m_refListStore);

9.2.2. Añadir columnas a la vista

Puede usar el método append_column() para decirle a la vista que debe mostrar ciertas columnas del modelo, en cierto orden, con un cierto título de columna.

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

Cuando use esta simple sobrecarga append_column(), el TreeView mostrará los datos del modelo con un CellRenderer apropiado. Por ejemplo, las cadenas y los números se muestran en un simple widget Gtk::Entry, y los booleanos en un Gtk::CheckButton. Esto es normalmente lo que necesita. Para otros tipos de columnas, debe conectar un retorno de llamada que convierta su tipo en una cadena representativa, con TreeViewColumn::set_cell_data_func(); o derivar un CellRenderer personalizado. Tenga en cuenta que no se soporta el tipo «(unsigned) short» de manera predeterminada: puede usar como tipo de columna «(unsigned) int» o «(unsigned) long» en su lugar.

9.2.3. Más de una columna del modelo por columna de la vista

Para reproducir más de una columna del modelo en una columna de vista, necesita crear el widget TreeView::Column manualmente, y usar pack_start() para añadirle las columnas del modelo.

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

Aquí hay algo de código de ejemplo de gtkmm/demos/gtk-demo/example_icontheme.cc, que tiene un icono pixbuf y un nombre de texto en la misma columna:

Gtk::TreeView::Column* pColumn =
  Gtk::manage(new 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);

9.2.4. Especificar los detalles del CellRenderer

The default CellRenderers and their default behaviour will normally suffice, but you might occasionally need finer control. For instance, this example code from gtkmm/demos/gtk-demo/example_treeview_treestore.cc, appends a Gtk::CellRenderer widget and instructs it to render the data from various model columns through various aspects of its appearance.

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);

También puede conectarle señales a un CellRenderer para detectar las acciones del usuario. Por ejemplo:

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. Celdas editables

9.2.5.1. Celdas editables guardadas automáticamente.

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. Implementación de la lógica personalizada para celdas editables.

Sin embargo, tal vez no quiera que se almacenen los valores nuevos inmediatamente. Por ejemplo, tal vez quiera restringir la entrada a ciertos caracteres o rangos de valores.

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.

Entonces, convierta ese Gtk::CellRenderer* al CellRenderer específico que espera, para que pueda usar la API específica.

Por ejemplo, para un CellRendererText, establecería la propiedad editable de la celda a «true», así:

cell.property_editable() = true;

Para un CellRendererToggle, establecería la propiedad activable en su lugar.

Entonces, puede conectar la señal «edited» apropiada. Por ejemplo, conectarlo a Gtk::CellRendererText::signal_edited(), o a Gtk::CellRendererToggle::signal_toggled(). Si la columna contiene más de un CellRenderer, entonces tendrá que usar Gtk::TreeView::get_column() y luego llamar a get_cell_renderers() en esa columna de la vista.

En su manejador de señales, debe examinar el valor nuevo y luego almacenarlo en el modelo, si eso es lo apropiado para su aplicación.