dataview.h

Clase wxDataViewModel

wxDataViewModel es la clase base para todos los modelos de datos a mostrar por un wxDataViewCtrl.

Jerarquía:

Jerarquía de la clase wxDataViewModel

Todos los demás modelos derivan de ella y deben implementar sus funciones virtuales puras para definir un modelo de datos completo. En detalle, es necesario reemplazar wxDataViewModel::IsContainer, wxDataViewModel::GetParent, wxDataViewModel::GetChildren, y wxDataViewModel::GetValue para definir el modelo de datos que actúa como una interfaz entre los datos reales y el wxDataViewCtrl.

hay que tener en cuenta que wxDataViewModel no define la posición o el índice de cualquier elemento en el control porque los diferentes controles pueden mostrar los mismos datos de manera diferente. wxDataViewModel proporciona un método wxDataViewModel::Compare que el wxDataViewCtrl puede utilizar para ordenar los datos, ya sea junto con una cabecera de columna o sin ella (ver wxDataViewModel::HasDefaultCompare).

wxDataViewModel (como de hecho todo el código de wxDataViewCtrl) utiliza wxVariant para almacenar datos y su tipo de forma genérica. wxVariant puede ampliarse para contener casi cualquier dato sin cambios en la clase original. Hasta cierto punto, se puede utilizar (el algo más elegante) wxAny en lugar de wxVariant ya que hay código para convertir entre los dos, pero no está claro qué impacto tendrá esto en el rendimiento.

Como normalmente permitiremos que wxDataViewCtrl cambie nuestros datos a través de su interfaz gráfica, también tendremos que sobrescribir wxDataViewModel::SetValue que wxDataViewCtrl llamará cuando se haya confirmado un cambio en algún dato.

Si los datos representados por el modelo son cambiados por algo distinto a su wxDataViewCtrl asociado, el control tiene que ser notificado sobre el cambio. Dependiendo de lo que ha sucedido es necesario llamar a uno de los siguientes métodos:

Nótese que Cleared() puede ser llamada para todos los cambios que impliquen muchos, o todos, los ítems del modelo y no sólo para borrarlos todos (es decir, borrar el modelo).

Esta clase mantiene una lista de wxDataViewModelNotifier que enlazan esta clase con las implementaciones específicas en las plataformas soportadas de forma que, por ejemplo, llamar a wxDataViewModel::ValueChanged en este modelo sólo llamará a wxDataViewModelNotifier::ValueChanged para cada notificador que haya sido añadido. También se puede añadir un notificador propio para estar informado de cualquier cambio en los datos del modelo de lista.

Actualmente wxWidgets proporciona los siguientes modelos aparte del modelo base: wxDataViewIndexListModel, wxDataViewVirtualListModel, wxDataViewTreeStore, wxDataViewListStore.

Hay que tener en cuenta que wxDataViewModel se cuenta por referencias, deriva de wxRefCounter y no se puede borrar directamente ya que puede ser compartido por varios wxDataViewCtrls. Esto implica que es necesario disminuir el recuento de referencias después de asociar el modelo con un control como este:

wxDataViewCtrl *musicCtrl = new wxDataViewCtrl(this, wxID_ANY);
wxDataViewModel *musicModel = new MyMusicModel;
 
musicCtrl->AssociateModel(musicModel);
musicModel->DecRef();  // avoid memory leak !!
 
// add columns now

Una forma potencialmente mejor de evitar las fugas de memoria es utilizar wxObjectDataPtr.

wxDataViewCtrl *musicCtrl = new wxDataViewCtrl(this, wxID_ANY);
wxObjectDataPtr<wxDataViewModel> musicModel(new MyMusicModel);
 
musicCtrl->AssociateModel(musicModel.get());
 
// add columns now

Funciones miembro

wxDataViewModel()

wxDataViewModel::wxDataViewModel()

Constructor.

~wxDataViewModel()

virtual wxDataViewModel::~wxDataViewModel()

Destructor.

No debe llamarse directamente. Utilizar DecRef en su lugar.

AddNotifier()

void wxDataViewModel::AddNotifier(wxDataViewModelNotifier * notifier)

Añade un wxDataViewModelNotifier al modelo.

ChangeValue()

bool wxDataViewModel::ChangeValue( const wxVariant & variant, const wxDataViewItem & item, unsigned int col )

Cambia el valor del elemento dado y actualiza el control para reflejarlo.

Esta función simplemente llama a SetValue() y, si tiene éxito, a ValueChanged().

Parámetros
variant
El nuevo valor.
item
El ítem (fila) a actualizar.
col
La columna a actualizar.
Valor de retorno

true si tanto SetValue() como ValueChanged() devuelven true.

Cleared()

bool wxDataViewModel::Cleared()

Llamado para informar al modelo que todos sus datos han sido cambiados.

Este método debería ser llamado si han cambiado tantos de los ítems del modelo, que el control debería simplemente releerlos todos, repoblándose por completo.

hay que tener en cuenta que, contrariamente al nombre del método, no indica necesariamente que el modelo se ha vaciado - aunque este es el método correcto a llamar, en lugar de ItemsDeleted(), si efectivamente se vació, lo que explica el origen de su nombre.

Compare()

virtual int wxDataViewModel::Compare( const wxDataViewItem & item1, const wxDataViewItem & item2, unsigned int column, bool ascending ) const

La función de comparación a utilizar por el control.

La función de comparación por defecto ordena la mayoría de los tipos de datos implementados por wxVariant (es decir, bool, int, long, double, string), así como datetime y wxDataViewIconText. Anular este método para implementar un comportamiento de ordenación diferente o anular sólo DoCompareValues() para extenderlo a otros tipos de wxVariant.

La función debe devolver negativo, nulo o positivo para una comparación ascendente, dependiendo de si el primer elemento es menor, igual o mayor que el segundo. Lo contrario ocurre para las comparaciones descendentes. Los elementos deben compararse utilizando el tipo apropiado para la columna pasada.

Parámetros
item1
Primer elemento a comparar.
item2
Segundo elemento a comparar.
column
La columna que contiene los elementos que se van a comparar. Si la clase modelo anula HasDefaultCompare() para que devuelva true, este parámetro será (unsigned)-1 al ordenar los elementos si no se selecciona ninguna columna para ordenarlos.
ascending
Indica si la ordenación se realiza en orden ascendente o descendente.
Valor de retorno

Para una comparación ascendente: un valor negativo si el ítem1 es menor que (es decir, debería aparecer por encima de) el ítem2, cero si los dos ítems son iguales o un valor positivo si el ítem1 es mayor que (es decir, debería aparecer por debajo de) el segundo. Lo contrario para una comparación descendente.

Nota: Si puede haber varias filas con el mismo valor, considerar la posibilidad de diferenciarlas entre sí por sus ID en lugar de devolver cero. Esto evita que filas con el mismo valor salten de posición cuando se añaden elementos, etc. Por ejemplo:

// Note that we need to distinguish between items with the same
// value.
wxUIntPtr id1 = wxPtrToUInt(item1.GetID()),
          id2 = wxPtrToUInt(item2.GetID());
 
return (ascending == (id1 > id2)) ? : 1 : -1;
DoCompareValues()

virtual int wxDataViewModel::DoCompareValues( const wxVariant & value1, const wxVariant & value2 ) const

Método virtual que puede sobrescribirse para definir la comparación de valores de tipos no estándar.

Esta función es llamada desde la implementación por defecto de Compare() para comparar valores de tipos que no conoce (es decir, que no son ninguno de los estándar). Como la propia función Compare(), este método debe devolver un valor negativo si valor1 es menor que (es decir, debe aparecer por encima de) valor2 y un valor positivo si valor2 es menor que valor1.

A diferencia de Compare(), si los valores son iguales, este método debería simplemente devolver 0 para indicarlo y dejar que Compare() los ordene por los valores de sus elementos. Tampoco hay que preocuparse por la dirección del orden, por lo que es más sencillo de anular que la propia función Compare().

La implementación por defecto sólo devuelve 0, por lo que la versión de la clase derivada puede simplemente reenviarla si no sabe cómo comparar los valores dados.

GetAttr()

virtual bool wxDataViewModel::GetAttr( const wxDataViewItem & item, unsigned int col, wxDataViewItemAttr & attr ) const

Sobrescribir esta opción para indicar que el elemento tiene atributos de fuente especiales.

Esto sólo afecta al renderizador wxDataViewTextRendererText.

La versión de la clase base siempre devuelve false.

Parámetros
item
El ítem para el que se solicita el atributo.
col
La columna del ítem para el que se solicita el atributo.
attr
El atributo a rellenar si la función devuelve true.
Valor de retorno

true si este elemento tiene un atributo o false en caso contrario.

GetChildren()

virtual unsigned int wxDataViewModel::GetChildren( const wxDataViewItem & item, wxDataViewItemArray & children ) const

sobrescribir esta opción para que el control pueda consultar los elementos hijos de un elemento.

Devuelve el número de elementos.

GetParent()

virtual wxDataViewItem wxDataViewModel::GetParent(const wxDataViewItem & item) const

Sobrescribir para indicar qué wxDataViewItem representa al padre del ítem o un wxDataViewItem inválido si el ítem raíz es el ítem padre.

GetValue()

virtual void wxDataViewModel::GetValue( wxVariant & variant, const wxDataViewItem & item, unsigned int col ) const

Sobrescribir esta función para indicar el valor del elemento.

Esta función debe rellenar la variant proporcionada con el valor a mostrar para el elemento especificado en la columna dada. El valor devuelto en esta wxVariant debe tener el tipo apropiado, por ejemplo string para las columnas de texto, boolean para las columnas que utilizan wxDataViewToggleRenderer etc, y si hay un desajuste de tipo, no se mostrará nada y se registrará un mensaje de error de depuración.

También es posible no devolver ningún valor, en cuyo caso no se mostrará nada en la celda correspondiente, del mismo modo que si HasValue() devolviera false.

HasContainerColumns()

virtual bool wxDataViewModel::HasContainerColumns(const wxDataViewItem & item) const

Sobrescribir este método para indicar si un elemento contenedor actúa meramente como encabezado (o para categorización) o si también actúa como un elemento normal con entradas para otras columnas.

Por defecto devuelve false.

HasDefaultCompare()

virtual bool wxDataViewModel::HasDefaultCompare() const

Sobrescribir para indicar que el modelo proporciona una función de comparación por defecto que el control debe utilizar si no se ha elegido wxDataViewColumn para la ordenación.

Normalmente, si el usuario hace clic en la cabecera de una columna para ordenarla, los datos se ordenarán alfanuméricamente.

Si se requiere cualquier otro orden (por ejemplo, por índice o por orden de aparición), entonces debe utilizarse este método.

Hay que tener en cuenta que si este método se sobrescribe para que devuelva true, la implementación de Compare() debería estar preparada para aceptar (unsigned)-1 como valor para el parámetro de índice de columna.

Ver a href="/winapi/wxwidgets/wxDataViewIndexListModel">wxDataViewIndexListModel para un modelo que hace uso de esto.

HasValue()

virtual bool wxDataViewModel::HasValue( const wxDataViewItem & item, unsigned col ) const

Devuelve true si hay un valor en la columna dada de este elemento.

Todos los ítems normales tienen valores en todas las columnas pero los ítems contenedores sólo muestran su etiqueta en la primera columna (col == 0) por defecto (pero ver HasContainerColumns()). Así que esta función por defecto devuelve true para la primera columna mientras que para las otras sólo devuelve true si el ítem no es un contenedor o HasContainerColumns() fue sobrescrito para devolver true para él.

Desde wxWidgets 3.1.4, este método es virtual y puede ser sobrescrito para especificar explícitamente para qué columnas un elemento dado tiene, y no tiene, valores.

IsContainer()

virtual bool wxDataViewModel::IsContainer(const wxDataViewItem & item) const

Anula esta opción para indicar si el elemento es un contenedor, es decir, si puede tener elementos secundarios.

IsEnabled()

virtual bool wxDataViewModel::IsEnabled( const wxDataViewItem & item, unsigned int col ) const

Sobrescribir esta opción para indicar que el elemento debe estar desactivado.

Los elementos desactivados se muestran de forma diferente (por ejemplo, en gris) y no se puede interactuar con ellos.

La versión de la clase base siempre devuelve true, por lo que todos los elementos están habilitados por defecto.

Parámetros
item
El elemento cuyo estado de habilitación se solicita.
col
Columna del elemento cuyo estado de habilitación se solicita.
Valor de retorno

true si este elemento debe estar habilitado, false en caso contrario.

IsListModel()

virtual bool wxDataViewModel::IsListModel() const

IsVirtualListModel()

virtual bool wxDataViewModel::IsVirtualListModel() const

ItemAdded()

bool wxDataViewModel::ItemAdded( const wxDataViewItem & parent, const wxDataViewItem & item )

Llama a esta opción para informar al modelo de que se ha añadido un elemento a los datos.

ItemChanged()

bool wxDataViewModel::ItemChanged(const wxDataViewItem & item)

Llamarla para informar al modelo de que un elemento ha cambiado.

Esto eventualmente emitirá un evento wxEVT_DATAVIEW_ITEM_VALUE_CHANGED (en el que los campos de columna no se establecerán) al usuario.

ItemDeleted()

bool wxDataViewModel::ItemDeleted( const wxDataViewItem & parent, const wxDataViewItem & item )

Llamar a esta opción para informar al modelo de que se ha eliminado un elemento de los datos.

ItemsAdded()

bool wxDataViewModel::ItemsAdded( const wxDataViewItem & parent, const wxDataViewItemArray & items )

Llamarla para informar al modelo de que varios elementos se han añadido a los datos.

ItemsChanged()

bool wxDataViewModel::ItemsChanged(const wxDataViewItemArray & items)

Llamarla para informar al modelo de que varios elementos han cambiado.

Esto eventualmente emitirá eventos wxEVT_DATAVIEW_ITEM_VALUE_CHANGED (en los que los campos de columna no se establecerán) al usuario.

ItemsDeleted()

bool wxDataViewModel::ItemsDeleted( const wxDataViewItem & parent, const wxDataViewItemArray & items )

Llamar a esta opción para informar al modelo de que se han eliminado varios elementos.

RemoveNotifier()

void wxDataViewModel::RemoveNotifier(wxDataViewModelNotifier * notifier)

Elimina el notificador de la lista de notificadores.

Resort()

virtual void wxDataViewModel::Resort()

Llamarla para iniciar un recurso después de que la función de clasificación se ha cambiado.

SetValue()

virtual bool wxDataViewModel::SetValue( const wxVariant & variant, const wxDataViewItem & item, unsigned int col )

Este método es llamado para establecer un valor en el modelo de datos.

El escenario más común es que el wxDataViewCtrl llame a este método después de que el usuario haya cambiado algún dato en la vista.

Esta es la función que se debe anular en la clase derivada, pero si se desea llamarla, ChangeValue() suele ser más conveniente, ya que de lo contrario se tendrá que llamar manualmente a ValueChanged() para actualizar el propio control.

ValueChanged()

bool wxDataViewModel::ValueChanged( const wxDataViewItem & item, unsigned int col )

Llamala para informar a este modelo que un valor en el modelo ha sido cambiado.

También es llamada desde el código de edición interno de wxDataViewCtrl, por ejemplo cuando se edita un campo de texto en el control.

Eventualmente emitirá un evento wxEVT_DATAVIEW_ITEM_VALUE_CHANGED para el usuario.

Métodos y datos heredados

Esta clase hereda los métodos y datos miembro públicos y protegidos de wxRefCounter.