From 4508fcd20aa15964291b7c9def941b2a6dc55445 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Wed, 18 Jul 2007 14:09:26 +0000 Subject: [PATCH] First work at resort with header click git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@47547 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/dataview.h | 2 +- src/common/datavcmn.cpp | 8 +++++ src/gtk/dataview.cpp | 65 +++++++++++++++++++++++++++++++++-------- 3 files changed, 62 insertions(+), 13 deletions(-) diff --git a/include/wx/dataview.h b/include/wx/dataview.h index 106829907a..bb0077fefc 100644 --- a/include/wx/dataview.h +++ b/include/wx/dataview.h @@ -126,7 +126,7 @@ public: void SetSortingColumn( unsigned int col ) { m_sortingColumn = col; } unsigned int GetSortingColumn() { return m_sortingColumn; } - void SetSortOrderAscending( bool ascending ) { m_ascending = true; } + void SetSortOrderAscending( bool ascending ) { m_ascending = ascending; } bool GetSortOrderAscending() { return m_ascending; } diff --git a/src/common/datavcmn.cpp b/src/common/datavcmn.cpp index 876984c80a..56aa0a229b 100644 --- a/src/common/datavcmn.cpp +++ b/src/common/datavcmn.cpp @@ -150,6 +150,14 @@ int wxDataViewModel::Compare( const wxDataViewItem &item1, const wxDataViewItem wxVariant value1,value2; GetValue( value1, item1, m_sortingColumn ); GetValue( value2, item2, m_sortingColumn ); + + if (!m_ascending) + { + wxVariant temp = value1; + value1 = value2; + value2 = temp; + } + if (value1.GetType() == wxT("string")) { wxString str1 = value1.GetString(); diff --git a/src/gtk/dataview.cpp b/src/gtk/dataview.cpp index f4f6ab4b5e..db04032719 100644 --- a/src/gtk/dataview.cpp +++ b/src/gtk/dataview.cpp @@ -56,35 +56,36 @@ class wxGtkTreeModelNode { public: wxGtkTreeModelNode( wxGtkTreeModelNode* parent, const wxDataViewItem &item, - wxDataViewModel *model ) : - m_children( wxGtkTreeModelNodeCmp ) + wxDataViewModel *model ) { m_parent = parent; m_item = item; m_model = model; + m_children = new wxGtkTreeModelNodes( wxGtkTreeModelNodeCmp ); } ~wxGtkTreeModelNode() { - size_t count = m_children.GetCount(); + size_t count = m_children->GetCount(); size_t i; for (i = 0; i < count; i++) { - wxGtkTreeModelNode *child = m_children[i]; + wxGtkTreeModelNode *child = m_children->Item( i ); delete child; } + delete m_children; } wxGtkTreeModelNode* GetParent() { return m_parent; } wxGtkTreeModelNodes &GetChildren() - { return m_children; } + { return *m_children; } wxGtkTreeModelNode* GetNthChild( unsigned int n ) - { return m_children.Item( n ); } + { return m_children->Item( n ); } unsigned int Add( wxGtkTreeModelNode* child ) - { return m_children.Add( child ); } - - unsigned int GetChildCount() { return m_children.GetCount(); } + { return m_children->Add( child ); } + + unsigned int GetChildCount() { return m_children->GetCount(); } wxDataViewItem &GetItem() { return m_item; } wxDataViewModel *GetModel() { return m_model; } @@ -92,9 +93,11 @@ public: bool HasChildren() { return m_hasChildren; } void SetHasChildren( bool has ) { m_hasChildren = has; } + void Resort(); + private: wxGtkTreeModelNode *m_parent; - wxGtkTreeModelNodes m_children; + wxGtkTreeModelNodes *m_children; wxDataViewItem m_item; bool m_hasChildren; wxDataViewModel *m_model; @@ -132,6 +135,8 @@ public: bool ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item ); bool ItemDeleted( const wxDataViewItem &item ); + void Resort(); + protected: void InitTree(); wxGtkTreeModelNode *FindNode( const wxDataViewItem &item ); @@ -553,8 +558,6 @@ void wxgtk_tree_model_set_sort_column_id (GtkTreeSortable *sortabl // TODO check for equality - return; - gtk_tree_sortable_sort_column_changed (sortable); tree_model->internal->GetDataViewModel()->SetSortingColumn( sort_column_id ); @@ -965,6 +968,7 @@ public: virtual bool ItemChanged( const wxDataViewItem &item ); virtual bool ValueChanged( const wxDataViewItem &item, unsigned int col ); virtual bool Cleared(); + virtual void Resort(); GtkWxTreeModel *m_wxgtk_model; wxDataViewModel *m_wx_model; @@ -1024,6 +1028,11 @@ bool wxGtkDataViewModelNotifier::ItemDeleted( const wxDataViewItem &item ) return true; } +void wxGtkDataViewModelNotifier::Resort() +{ + m_owner->GtkGetInternal()->Resort(); +} + bool wxGtkDataViewModelNotifier::ItemChanged( const wxDataViewItem &item ) { GtkTreeIter iter; @@ -2069,6 +2078,33 @@ void wxDataViewColumn::SetWidth( int width ) } +//----------------------------------------------------------------------------- +// wxGtkTreeModelNode +//----------------------------------------------------------------------------- + +void wxGtkTreeModelNode::Resort() +{ + wxGtkTreeModelNodes *new_array = new wxGtkTreeModelNodes( wxGtkTreeModelNodeCmp ); + + size_t pos; + size_t count = m_children->GetCount(); + + for (pos = 0; pos < count; pos++) + { + new_array->Add( m_children->Item( 0 ) ); + m_children->RemoveAt( 0 ); + } + + delete m_children; + m_children = new_array; + + for (pos = 0; pos < count; pos++) + { + wxGtkTreeModelNode *node = m_children->Item( pos ); + node->Resort(); + } +} + //----------------------------------------------------------------------------- // wxDataViewCtrlInternal //----------------------------------------------------------------------------- @@ -2109,6 +2145,11 @@ void wxDataViewCtrlInternal::BuildBranch( wxGtkTreeModelNode *node ) } } +void wxDataViewCtrlInternal::Resort() +{ + m_root->Resort(); +} + bool wxDataViewCtrlInternal::ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item ) { wxGtkTreeModelNode *parent_node = FindNode( parent ); -- 2.45.2