Page 1 of 1

Сортировка для wxDataViewVirtualListModel

Posted: Wed Jul 15, 2009 5:44 am
by skozlov
Версия wxWidgets-trunk.

Разбираюсь с сортировкой.

Как я понял, для сортировки используется wxDataViewModel::Compare(). Этот метод вызывается после клика по заголовку столбца, если тот имеет флаг wxDATAVIEW_COL_SORTABLE.

Но для виртуальной модели этого не происходит, те Compare() не вызывается.

Порылся в исходниках. Вызывается только wxDataViewModel::Resort().

Вообще сложилось такое ощущение, что сортировка виртуальных моделей никак не организована.. Или это пока не реализовано? Или просто недосмотр разработчиков?

Кто-нибудь реализовывал сортировку виртуальной модели?
Есть стандартные средства или самому писать workaround какой-нить?

Тк не в виртуальной модели тебе хотя бы передается номер столбца и направление сортировки..

Спасибо

Posted: Wed Jul 15, 2009 7:24 am
by skozlov
Пока сделал так:

Главная проблема, узнать столбец и направление сортировки, поэтому модель должна знать свой view.

Для этого добавляем в модель:

Code: Select all


class VirtualModel: public wxDataViewVirtualListModel
{
...

wxDataViewCtrl *m_parentView;
...
};

...

void VirtualModel::setParentView(wxDataViewCtrl *view)
{
  m_parentView = view;
}
Теперь переопределяем метод Resort():

Code: Select all

void VirtualModel::Resort()
{

  wxDataViewColumn *col = m_parentView->GetSortingColumn();

  if(!col){

    wxASSERT_MSG(false, "No sorting column!");

  } else {

    int model_column = col->GetModelColumn();
    bool ascending = col->IsSortOrderAscending();

    doSort(model_column, ascending);

  }

  wxDataViewVirtualListModel::Resort();

}

Ну а VirtualModel::doSort() уже реализует саму сортировку.

Тк модель должна знать свой view, то имеем ограничение - такая модель может использоваться только с одним представлением. + не забывать вызывать setParentView().