]> git.saurik.com Git - wxWidgets.git/commitdiff
change wxDataViewModel::Compare() to including column and sortorder
authorRobert Roebling <robert@roebling.de>
Sun, 19 Aug 2007 14:12:52 +0000 (14:12 +0000)
committerRobert Roebling <robert@roebling.de>
Sun, 19 Aug 2007 14:12:52 +0000 (14:12 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@48176 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/dataview.h
samples/dataview/dataview.cpp
src/common/datavcmn.cpp
src/gtk/dataview.cpp

index e8717047b5838ac59a6d1d8f95dadb63bdc7b569..0630e01a9ef425d085906f49fd524c3bde4c26a9 100644 (file)
@@ -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
 
index 1a7069c38ecb0fb10bbf3f29083c5b694d7ab526..b305bc441063e9ad35fbf752e3ef52a6ca163569 100644 (file)
@@ -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
index f069a307564fcb462415ae1e01bc4660ad691886..ac5f5c693266c0f582f7b48857e817784cc86c42 100644 (file)
@@ -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,
index ead35c4ae6f5cbad7466cb9a75b8a0cf4985652a..173f65e9bc43405625e53812f6ca901dfccc1086 100644 (file)
@@ -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();
 }