From 7ee7191cee3842b45a27908fb7219e29c7f8f24d Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Sun, 19 Aug 2007 14:12:52 +0000 Subject: [PATCH] change wxDataViewModel::Compare() to including column and sortorder git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@48176 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/dataview.h | 10 ++++------ samples/dataview/dataview.cpp | 5 +++-- src/common/datavcmn.cpp | 26 ++++++++++++++++++++------ src/gtk/dataview.cpp | 17 +++++++++++------ 4 files changed, 38 insertions(+), 20 deletions(-) diff --git a/include/wx/dataview.h b/include/wx/dataview.h index e8717047b5..0630e01a9e 100644 --- a/include/wx/dataview.h +++ b/include/wx/dataview.h @@ -151,17 +151,14 @@ public: void RemoveNotifier( wxDataViewModelNotifier *notifier ); // default compare function - virtual int Compare( const wxDataViewItem &item1, const wxDataViewItem &item2 ); - - void SetSortingColumn( unsigned int col ) { m_sortingColumn = col; } - unsigned int GetSortingColumn() { return m_sortingColumn; } + virtual int Compare( const wxDataViewItem &item1, const wxDataViewItem &item2, + unsigned int column, bool ascending ); protected: // the user should not delete this class directly: he should use DecRef() instead! virtual ~wxDataViewModel() { } wxDataViewModelNotifiers m_notifiers; - unsigned int m_sortingColumn; }; // --------------------------------------------------------- @@ -199,7 +196,8 @@ public: // compare based on index - virtual int Compare( const wxDataViewItem &item1, const wxDataViewItem &item2 ); + virtual int Compare( const wxDataViewItem &item1, const wxDataViewItem &item2, + unsigned int column, bool ascending ); // implement base methods diff --git a/samples/dataview/dataview.cpp b/samples/dataview/dataview.cpp index 1a7069c38e..b305bc4410 100644 --- a/samples/dataview/dataview.cpp +++ b/samples/dataview/dataview.cpp @@ -170,7 +170,8 @@ public: // override sorting to always sort branches ascendingly - int Compare( const wxDataViewItem &item1, const wxDataViewItem &item2 ) + int Compare( const wxDataViewItem &item1, const wxDataViewItem &item2, + unsigned int column, bool ascending ) { if (IsContainer(item1) && IsContainer(item2)) { @@ -190,7 +191,7 @@ public: return litem1-litem2; } - return wxDataViewModel::Compare( item1, item2 ); + return wxDataViewModel::Compare( item1, item2, column, ascending ); } // implementation of base class virtuals to define model diff --git a/src/common/datavcmn.cpp b/src/common/datavcmn.cpp index f069a30756..ac5f5c6932 100644 --- a/src/common/datavcmn.cpp +++ b/src/common/datavcmn.cpp @@ -42,7 +42,6 @@ WX_DEFINE_LIST(wxDataViewModelNotifiers); wxDataViewModel::wxDataViewModel() { m_notifiers.DeleteContents( true ); - m_sortingColumn = 0; } bool wxDataViewModel::ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item ) @@ -141,7 +140,8 @@ void wxDataViewModel::RemoveNotifier( wxDataViewModelNotifier *notifier ) m_notifiers.DeleteObject( notifier ); } -int wxDataViewModel::Compare( const wxDataViewItem &item1, const wxDataViewItem &item2 ) +int wxDataViewModel::Compare( const wxDataViewItem &item1, const wxDataViewItem &item2, + unsigned int column, bool ascending ) { // sort branches before leaves bool item1_is_container = IsContainer(item1); @@ -153,8 +153,15 @@ int wxDataViewModel::Compare( const wxDataViewItem &item1, const wxDataViewItem return -1; wxVariant value1,value2; - GetValue( value1, item1, m_sortingColumn ); - GetValue( value2, item2, m_sortingColumn ); + GetValue( value1, item1, column ); + GetValue( value2, item2, column ); + + if (!ascending) + { + wxVariant temp = value1; + value1 = value2; + value2 = temp; + } if (value1.GetType() == wxT("string")) { @@ -188,6 +195,9 @@ int wxDataViewModel::Compare( const wxDataViewItem &item1, const wxDataViewItem // items must be different unsigned long litem1 = (unsigned long) item1.GetID(); unsigned long litem2 = (unsigned long) item2.GetID(); + + if (!ascending) + return litem2-litem2; return litem1-litem2; } @@ -261,9 +271,13 @@ wxDataViewItem wxDataViewIndexListModel::GetItem( unsigned int row ) const return wxDataViewItem( m_hash[row] ); } -int wxDataViewIndexListModel::Compare( const wxDataViewItem &item1, const wxDataViewItem &item2 ) +int wxDataViewIndexListModel::Compare( const wxDataViewItem &item1, const wxDataViewItem &item2, + unsigned int column, bool ascending ) { - return GetRow(item1) - GetRow(item2); + if (ascending) + return GetRow(item1) - GetRow(item2); + + return GetRow(item2) - GetRow(item1); } void wxDataViewIndexListModel::GetValue( wxVariant &variant, diff --git a/src/gtk/dataview.cpp b/src/gtk/dataview.cpp index ead35c4ae6..173f65e9bc 100644 --- a/src/gtk/dataview.cpp +++ b/src/gtk/dataview.cpp @@ -89,6 +89,9 @@ public: void SetSortOrder( GtkSortType sort_order ) { m_sort_order = sort_order; } GtkSortType GetSortOrder() { return m_sort_order; } + + void SetSortColumn( unsigned int column ) { m_sort_column = column; } + unsigned int GetSortColumn() { return m_sort_column; } protected: void InitTree(); @@ -104,6 +107,7 @@ private: GtkWxTreeModel *m_gtk_model; wxDataViewCtrl *m_owner; GtkSortType m_sort_order; + unsigned int m_sort_column; }; @@ -208,9 +212,9 @@ private: int LINKAGEMODE wxGtkTreeModelNodeCmp( void* id1, void* id2 ) { - int ret = g_internal->GetDataViewModel()->Compare( id1, id2 ); - if (g_internal->GetSortOrder() == GTK_SORT_DESCENDING) - return -ret; + int ret = g_internal->GetDataViewModel()->Compare( id1, id2, + g_internal->GetSortColumn(), (g_internal->GetSortOrder() == GTK_SORT_ASCENDING) ); + return ret; } @@ -599,7 +603,7 @@ gboolean wxgtk_tree_model_get_sort_column_id (GtkTreeSortable *sortabl g_return_val_if_fail (GTK_IS_WX_TREE_MODEL (sortable), FALSE); if (sort_column_id) - *sort_column_id = tree_model->internal->GetDataViewModel()->GetSortingColumn(); + *sort_column_id = tree_model->internal->GetSortColumn(); if (order) *order = tree_model->internal->GetSortOrder(); @@ -614,11 +618,11 @@ void wxgtk_tree_model_set_sort_column_id (GtkTreeSortable *sortable, GtkWxTreeModel *tree_model = (GtkWxTreeModel *) sortable; g_return_if_fail (GTK_IS_WX_TREE_MODEL (sortable) ); - if ((sort_column_id == (gint) tree_model->internal->GetDataViewModel()->GetSortingColumn()) && + if ((sort_column_id == (gint) tree_model->internal->GetSortColumn()) && (order == tree_model->internal->GetSortOrder())) return; - tree_model->internal->GetDataViewModel()->SetSortingColumn( sort_column_id ); + tree_model->internal->SetSortColumn( sort_column_id ); tree_model->internal->SetSortOrder( order ); @@ -2239,6 +2243,7 @@ wxDataViewCtrlInternal::wxDataViewCtrlInternal( wxDataViewCtrl *owner, m_gtk_model = gtk_model; m_root = NULL; m_sort_order = GTK_SORT_ASCENDING; + m_sort_column = 0; InitTree(); } -- 2.45.2