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

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
skozlov
Knows some wx things
Knows some wx things
Posts: 26
Joined: Tue Dec 16, 2008 12:54 pm

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

Post by skozlov »

Версия wxWidgets-trunk.

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

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

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

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

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

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

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

Спасибо
WinXp, wxWidgets 2.8.9, wxWidgets-svn, MSVC 9
skozlov
Knows some wx things
Knows some wx things
Posts: 26
Joined: Tue Dec 16, 2008 12:54 pm

Post 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().
WinXp, wxWidgets 2.8.9, wxWidgets-svn, MSVC 9
Post Reply