Completed sorting in wxDataViewCtrl
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@47552 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -162,7 +162,26 @@ int wxDataViewModel::Compare( const wxDataViewItem &item1, const wxDataViewItem
|
|||||||
{
|
{
|
||||||
wxString str1 = value1.GetString();
|
wxString str1 = value1.GetString();
|
||||||
wxString str2 = value2.GetString();
|
wxString str2 = value2.GetString();
|
||||||
return str1.Cmp( str2 );
|
int res = str1.Cmp( str2 );
|
||||||
|
if (res == 0)
|
||||||
|
{
|
||||||
|
// no difference, try 0th column
|
||||||
|
if (m_sortingColumn != 0)
|
||||||
|
{
|
||||||
|
unsigned int temp = m_sortingColumn;
|
||||||
|
m_sortingColumn = 0;
|
||||||
|
res = Compare( item1, item2 );
|
||||||
|
m_sortingColumn = temp;
|
||||||
|
}
|
||||||
|
if (res == 0)
|
||||||
|
{
|
||||||
|
// still no difference, resort to desparate non-sense
|
||||||
|
long l1 = (long) item1.GetID();
|
||||||
|
long l2 = (long) item2.GetID();
|
||||||
|
return l1-l2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
if (value1.GetType() == wxT("long"))
|
if (value1.GetType() == wxT("long"))
|
||||||
{
|
{
|
||||||
@@ -187,6 +206,8 @@ int wxDataViewModel::Compare( const wxDataViewItem &item1, const wxDataViewItem
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -48,6 +48,10 @@
|
|||||||
|
|
||||||
class wxGtkTreeModelNode;
|
class wxGtkTreeModelNode;
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
typedef struct _GtkWxTreeModel GtkWxTreeModel;
|
||||||
|
}
|
||||||
|
|
||||||
int LINKAGEMODE wxGtkTreeModelNodeCmp( wxGtkTreeModelNode* node1, wxGtkTreeModelNode* node2 );
|
int LINKAGEMODE wxGtkTreeModelNodeCmp( wxGtkTreeModelNode* node1, wxGtkTreeModelNode* node2 );
|
||||||
|
|
||||||
WX_DEFINE_SORTED_ARRAY( wxGtkTreeModelNode*, wxGtkTreeModelNodes );
|
WX_DEFINE_SORTED_ARRAY( wxGtkTreeModelNode*, wxGtkTreeModelNodes );
|
||||||
@@ -56,11 +60,11 @@ class wxGtkTreeModelNode
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
wxGtkTreeModelNode( wxGtkTreeModelNode* parent, const wxDataViewItem &item,
|
wxGtkTreeModelNode( wxGtkTreeModelNode* parent, const wxDataViewItem &item,
|
||||||
wxDataViewModel *model )
|
wxDataViewCtrlInternal *internal )
|
||||||
{
|
{
|
||||||
m_parent = parent;
|
m_parent = parent;
|
||||||
m_item = item;
|
m_item = item;
|
||||||
m_model = model;
|
m_internal = internal;
|
||||||
m_children = new wxGtkTreeModelNodes( wxGtkTreeModelNodeCmp );
|
m_children = new wxGtkTreeModelNodes( wxGtkTreeModelNodeCmp );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -88,7 +92,7 @@ public:
|
|||||||
unsigned int GetChildCount() { return m_children->GetCount(); }
|
unsigned int GetChildCount() { return m_children->GetCount(); }
|
||||||
|
|
||||||
wxDataViewItem &GetItem() { return m_item; }
|
wxDataViewItem &GetItem() { return m_item; }
|
||||||
wxDataViewModel *GetModel() { return m_model; }
|
wxDataViewCtrlInternal *GetInternal() { return m_internal; }
|
||||||
|
|
||||||
bool HasChildren() { return m_hasChildren; }
|
bool HasChildren() { return m_hasChildren; }
|
||||||
void SetHasChildren( bool has ) { m_hasChildren = has; }
|
void SetHasChildren( bool has ) { m_hasChildren = has; }
|
||||||
@@ -100,19 +104,11 @@ private:
|
|||||||
wxGtkTreeModelNodes *m_children;
|
wxGtkTreeModelNodes *m_children;
|
||||||
wxDataViewItem m_item;
|
wxDataViewItem m_item;
|
||||||
bool m_hasChildren;
|
bool m_hasChildren;
|
||||||
wxDataViewModel *m_model;
|
wxDataViewCtrlInternal *m_internal;
|
||||||
};
|
};
|
||||||
|
|
||||||
int LINKAGEMODE wxGtkTreeModelNodeCmp( wxGtkTreeModelNode* node1, wxGtkTreeModelNode* node2 )
|
|
||||||
{
|
|
||||||
return node1->GetModel()->Compare( node1->GetItem(), node2->GetItem() );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
typedef struct _GtkWxTreeModel GtkWxTreeModel;
|
|
||||||
}
|
|
||||||
|
|
||||||
class wxDataViewCtrlInternal
|
class wxDataViewCtrlInternal
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -130,7 +126,8 @@ public:
|
|||||||
gboolean iter_parent( GtkTreeIter *iter, GtkTreeIter *child );
|
gboolean iter_parent( GtkTreeIter *iter, GtkTreeIter *child );
|
||||||
|
|
||||||
wxDataViewModel* GetDataViewModel() { return m_wx_model; }
|
wxDataViewModel* GetDataViewModel() { return m_wx_model; }
|
||||||
GtkWxTreeModel* GetOwner() { return m_gtk_model; }
|
wxDataViewCtrl* GetOwner() { return m_owner; }
|
||||||
|
GtkWxTreeModel* GetGtkModel() { return m_gtk_model; }
|
||||||
|
|
||||||
bool ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item );
|
bool ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item );
|
||||||
bool ItemDeleted( const wxDataViewItem &item );
|
bool ItemDeleted( const wxDataViewItem &item );
|
||||||
@@ -150,6 +147,12 @@ private:
|
|||||||
wxDataViewCtrl *m_owner;
|
wxDataViewCtrl *m_owner;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
int LINKAGEMODE wxGtkTreeModelNodeCmp( wxGtkTreeModelNode* node1, wxGtkTreeModelNode* node2 )
|
||||||
|
{
|
||||||
|
return node1->GetInternal()->GetDataViewModel()->Compare( node1->GetItem(), node2->GetItem() );
|
||||||
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// data
|
// data
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -556,17 +559,20 @@ void wxgtk_tree_model_set_sort_column_id (GtkTreeSortable *sortabl
|
|||||||
GtkWxTreeModel *tree_model = (GtkWxTreeModel *) sortable;
|
GtkWxTreeModel *tree_model = (GtkWxTreeModel *) sortable;
|
||||||
g_return_if_fail (GTK_IS_WX_TREE_MODEL (sortable) );
|
g_return_if_fail (GTK_IS_WX_TREE_MODEL (sortable) );
|
||||||
|
|
||||||
// TODO check for equality
|
|
||||||
|
|
||||||
gtk_tree_sortable_sort_column_changed (sortable);
|
|
||||||
|
|
||||||
tree_model->internal->GetDataViewModel()->SetSortingColumn( sort_column_id );
|
|
||||||
|
|
||||||
bool ascending = TRUE;
|
bool ascending = TRUE;
|
||||||
if (order != GTK_SORT_ASCENDING)
|
if (order != GTK_SORT_ASCENDING)
|
||||||
ascending = FALSE;
|
ascending = FALSE;
|
||||||
|
|
||||||
|
if ((sort_column_id == tree_model->internal->GetDataViewModel()->GetSortingColumn()) &&
|
||||||
|
(ascending == tree_model->internal->GetDataViewModel()->GetSortOrderAscending()))
|
||||||
|
return;
|
||||||
|
|
||||||
|
tree_model->internal->GetDataViewModel()->SetSortingColumn( sort_column_id );
|
||||||
|
|
||||||
tree_model->internal->GetDataViewModel()->SetSortOrderAscending( ascending );
|
tree_model->internal->GetDataViewModel()->SetSortOrderAscending( ascending );
|
||||||
|
|
||||||
|
gtk_tree_sortable_sort_column_changed (sortable);
|
||||||
|
|
||||||
tree_model->internal->GetDataViewModel()->Resort();
|
tree_model->internal->GetDataViewModel()->Resort();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2084,20 +2090,60 @@ void wxDataViewColumn::SetWidth( int width )
|
|||||||
|
|
||||||
void wxGtkTreeModelNode::Resort()
|
void wxGtkTreeModelNode::Resort()
|
||||||
{
|
{
|
||||||
|
size_t count = m_children->GetCount();
|
||||||
|
if (count == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (count == 1)
|
||||||
|
{
|
||||||
|
wxGtkTreeModelNode *node = m_children->Item( 0 );
|
||||||
|
node->Resort();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
wxGtkTreeModelNodes *new_array = new wxGtkTreeModelNodes( wxGtkTreeModelNodeCmp );
|
wxGtkTreeModelNodes *new_array = new wxGtkTreeModelNodes( wxGtkTreeModelNodeCmp );
|
||||||
|
|
||||||
size_t pos;
|
size_t pos;
|
||||||
size_t count = m_children->GetCount();
|
|
||||||
|
for (pos = 0; pos < count; pos++)
|
||||||
|
new_array->Add( m_children->Item( pos ) );
|
||||||
|
|
||||||
|
|
||||||
|
gint *new_order = new gint[count];
|
||||||
|
|
||||||
for (pos = 0; pos < count; pos++)
|
for (pos = 0; pos < count; pos++)
|
||||||
{
|
{
|
||||||
new_array->Add( m_children->Item( 0 ) );
|
wxGtkTreeModelNode *node = new_array->Item( pos );
|
||||||
m_children->RemoveAt( 0 );
|
size_t old_pos;
|
||||||
|
for (old_pos = 0; old_pos < count; old_pos++)
|
||||||
|
{
|
||||||
|
if (node == m_children->Item(old_pos))
|
||||||
|
{
|
||||||
|
new_order[pos] = old_pos;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// for (pos = 0; pos < count; pos++)
|
||||||
|
// m_children->Clear();
|
||||||
delete m_children;
|
delete m_children;
|
||||||
|
|
||||||
m_children = new_array;
|
m_children = new_array;
|
||||||
|
|
||||||
|
GtkTreeModel *gtk_tree_model = GTK_TREE_MODEL( m_internal->GetGtkModel() );
|
||||||
|
|
||||||
|
GtkTreeIter iter;
|
||||||
|
iter.user_data = (gpointer) GetItem().GetID();
|
||||||
|
iter.stamp = m_internal->GetGtkModel()->stamp;
|
||||||
|
GtkTreePath *path = wxgtk_tree_model_get_path( gtk_tree_model, &iter );
|
||||||
|
|
||||||
|
gtk_tree_model_rows_reordered( gtk_tree_model, path, &iter, new_order );
|
||||||
|
|
||||||
|
gtk_tree_path_free (path);
|
||||||
|
|
||||||
|
delete [] new_order;
|
||||||
|
|
||||||
for (pos = 0; pos < count; pos++)
|
for (pos = 0; pos < count; pos++)
|
||||||
{
|
{
|
||||||
wxGtkTreeModelNode *node = m_children->Item( pos );
|
wxGtkTreeModelNode *node = m_children->Item( pos );
|
||||||
@@ -2127,7 +2173,7 @@ wxDataViewCtrlInternal::~wxDataViewCtrlInternal()
|
|||||||
void wxDataViewCtrlInternal::InitTree()
|
void wxDataViewCtrlInternal::InitTree()
|
||||||
{
|
{
|
||||||
wxDataViewItem item;
|
wxDataViewItem item;
|
||||||
m_root = new wxGtkTreeModelNode( NULL, item, m_wx_model );
|
m_root = new wxGtkTreeModelNode( NULL, item, this );
|
||||||
|
|
||||||
BuildBranch( m_root );
|
BuildBranch( m_root );
|
||||||
}
|
}
|
||||||
@@ -2139,7 +2185,7 @@ void wxDataViewCtrlInternal::BuildBranch( wxGtkTreeModelNode *node )
|
|||||||
wxDataViewItem child = m_wx_model->GetFirstChild( node->GetItem() );
|
wxDataViewItem child = m_wx_model->GetFirstChild( node->GetItem() );
|
||||||
while (child.IsOk())
|
while (child.IsOk())
|
||||||
{
|
{
|
||||||
node->Add( new wxGtkTreeModelNode( node, child, node->GetModel() ) );
|
node->Add( new wxGtkTreeModelNode( node, child, this ) );
|
||||||
child = m_wx_model->GetNextSibling( child );
|
child = m_wx_model->GetNextSibling( child );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2153,7 +2199,7 @@ void wxDataViewCtrlInternal::Resort()
|
|||||||
bool wxDataViewCtrlInternal::ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item )
|
bool wxDataViewCtrlInternal::ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item )
|
||||||
{
|
{
|
||||||
wxGtkTreeModelNode *parent_node = FindNode( parent );
|
wxGtkTreeModelNode *parent_node = FindNode( parent );
|
||||||
parent_node->Add( new wxGtkTreeModelNode( parent_node, item, parent_node->GetModel() ) );
|
parent_node->Add( new wxGtkTreeModelNode( parent_node, item, this ) );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2369,6 +2415,8 @@ wxGtkTreeModelNode *wxDataViewCtrlInternal::FindNode( GtkTreeIter *iter )
|
|||||||
return m_root;
|
return m_root;
|
||||||
|
|
||||||
wxDataViewItem item( (void*) iter->user_data );
|
wxDataViewItem item( (void*) iter->user_data );
|
||||||
|
if (!item.IsOk())
|
||||||
|
return m_root;
|
||||||
|
|
||||||
wxGtkTreeModelNode *result = wxDataViewCtrlInternal_FindNode( m_root, item );
|
wxGtkTreeModelNode *result = wxDataViewCtrlInternal_FindNode( m_root, item );
|
||||||
|
|
||||||
@@ -2384,6 +2432,9 @@ wxGtkTreeModelNode *wxDataViewCtrlInternal::FindNode( GtkTreeIter *iter )
|
|||||||
|
|
||||||
wxGtkTreeModelNode *wxDataViewCtrlInternal::FindNode( const wxDataViewItem &item )
|
wxGtkTreeModelNode *wxDataViewCtrlInternal::FindNode( const wxDataViewItem &item )
|
||||||
{
|
{
|
||||||
|
if (!item.IsOk())
|
||||||
|
return m_root;
|
||||||
|
|
||||||
wxGtkTreeModelNode *result = wxDataViewCtrlInternal_FindNode( m_root, item );
|
wxGtkTreeModelNode *result = wxDataViewCtrlInternal_FindNode( m_root, item );
|
||||||
|
|
||||||
if (!result)
|
if (!result)
|
||||||
|
Reference in New Issue
Block a user