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.
- 9.2.1. Usar un modelo
- 9.2.2. Añadir columnas a la vista
- 9.2.3. Más de una columna del modelo por columna de la vista
- 9.2.4. Especificar los detalles del CellRenderer
- 9.2.5. Celdas editables
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.
Entonces, use append_column() para añadirle la columna de vista a la vista. Tenga en cuenta que Gtk::View::append_column() se sobrecarga para aceptar un widget Gtk::View::Column, o sólo el TreeModelColumn del cual genera un widget Gtk::View::Column apropiado.
Aquí hay algo de código de ejemplo de demos/gtk-demo/example_stockbrowser.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("Symbol") ); // m_columns.icon and m_columns.symbol are columns in the model. // pColumn is the column in the TreeView: pColumn->pack_start(m_columns.icon, false); //false = don't expand. pColumn->pack_start(m_columns.symbol); m_TreeView.append_column(*pColumn);
9.2.4. Especificar los detalles del CellRenderer
Los CellRenderer predeterminados y su comportamiento predeterminado normalmente serán suficientes, pero quizás necesite ocasionalmente un control más preciso. Por ejemplo, este código de ejemplo de demos/gtk-demo/example_treestore.cc construye manualmente un widget Gtk::CellRenderer y le indica que procese los datos de varias columnas de modelo a través de varios aspectos de su apariencia.
Gtk::CellRendererToggle* pRenderer = Gtk::manage( new Gtk::CellRendererToggle() ); int cols_count = m_TreeView.append_column("Alex", *pRenderer); Gtk::TreeViewColumn* pColumn = m_TreeView.get_column(cols_count-1); if(pColumn) { pColumn->add_attribute(pRenderer->property_active(), m_columns.alex); 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.
El usuario puede editar las celdas en una TreeView directamente. Para permitir esto, use los métodos Gtk::TreeView insert_column_editable() y append_column_editable() en lugar de insert_column() y append_column(). Cuando estas celdas se editen, los nuevos valores se guardarán inmediatamente en el modelo. Tenga en cuenta que estos métodos son plantillas que sólo se pueden instanciar para tipos de columnas simples como Glib::ustring, int, y 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.
Para lograr esto, debe usar los métodos Gtk::TreeView insert_column() y append_column() normales, y luego usar get_column_cell_renderer() para obtener el Gtk::CellRenderer que usa esa columna.
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.