Add wxDataViewCtrl::GTKPathToItem() function and use it.

No real changes, just refactor the code to use a function mapping GtkTreeIter
to our wxDataViewItem and use it instead of duplicating its code everywhere.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65211 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2010-08-08 11:37:37 +00:00
parent 91012d561d
commit 17d98558b3
2 changed files with 41 additions and 51 deletions

View File

@@ -14,6 +14,8 @@
class WXDLLIMPEXP_FWD_ADV wxDataViewCtrlInternal; class WXDLLIMPEXP_FWD_ADV wxDataViewCtrlInternal;
struct _GtkTreePath;
// --------------------------------------------------------- // ---------------------------------------------------------
// wxDataViewColumn // wxDataViewColumn
// --------------------------------------------------------- // ---------------------------------------------------------
@@ -171,6 +173,10 @@ public:
GtkWidget *GtkGetTreeView() { return m_treeview; } GtkWidget *GtkGetTreeView() { return m_treeview; }
wxDataViewCtrlInternal* GtkGetInternal() { return m_internal; } wxDataViewCtrlInternal* GtkGetInternal() { return m_internal; }
// Convert GTK path to our item. Returned item may be invalid if get_iter()
// failed.
wxDataViewItem GTKPathToItem(struct _GtkTreePath *path) const;
virtual void OnInternalIdle(); virtual void OnInternalIdle();
protected: protected:

View File

@@ -965,9 +965,8 @@ static GtkCellEditable *gtk_wx_cell_renderer_text_start_editing(
wxDataViewRenderer *wx_renderer = wxgtk_renderer->wx_renderer; wxDataViewRenderer *wx_renderer = wxgtk_renderer->wx_renderer;
GtkTreePath *treepath = gtk_tree_path_new_from_string( path ); GtkTreePath *treepath = gtk_tree_path_new_from_string( path );
GtkTreeIter iter; wxDataViewItem
wx_renderer->GetOwner()->GetOwner()->GtkGetInternal()->get_iter( &iter, treepath ); item(wx_renderer->GetOwner()->GetOwner()->GTKPathToItem(treepath));
wxDataViewItem item( (void*) iter.user_data );;
gtk_tree_path_free( treepath ); gtk_tree_path_free( treepath );
wxDataViewColumn *column = wx_renderer->GetOwner(); wxDataViewColumn *column = wx_renderer->GetOwner();
@@ -1163,9 +1162,7 @@ static GtkCellEditable *gtk_wx_cell_renderer_start_editing(
wxRect renderrect(wxRectFromGDKRect(cell_area)); wxRect renderrect(wxRectFromGDKRect(cell_area));
GtkTreePath *treepath = gtk_tree_path_new_from_string( path ); GtkTreePath *treepath = gtk_tree_path_new_from_string( path );
GtkTreeIter iter; wxDataViewItem item(cell->GetOwner()->GetOwner()->GTKPathToItem(treepath));
cell->GetOwner()->GetOwner()->GtkGetInternal()->get_iter( &iter, treepath );
wxDataViewItem item( (void*) iter.user_data );
gtk_tree_path_free( treepath ); gtk_tree_path_free( treepath );
cell->StartEditing( item, renderrect ); cell->StartEditing( item, renderrect );
@@ -1293,10 +1290,7 @@ gtk_wx_cell_renderer_activate(
wxDataViewModel *model = cell->GetOwner()->GetOwner()->GetModel(); wxDataViewModel *model = cell->GetOwner()->GetOwner()->GetModel();
GtkTreePath *treepath = gtk_tree_path_new_from_string( path ); GtkTreePath *treepath = gtk_tree_path_new_from_string( path );
wxDataViewItem item(cell->GetOwner()->GetOwner()->GTKPathToItem(treepath));
GtkTreeIter iter;
cell->GetOwner()->GetOwner()->GtkGetInternal()->get_iter( &iter, treepath );
wxDataViewItem item( iter.user_data );
gtk_tree_path_free( treepath ); gtk_tree_path_free( treepath );
unsigned int model_col = cell->GetOwner()->GetModelColumn(); unsigned int model_col = cell->GetOwner()->GetModelColumn();
@@ -1531,16 +1525,14 @@ wxgtk_renderer_editing_started( GtkCellRenderer *WXUNUSED(cell), GtkCellEditable
event.SetDataViewColumn( column ); event.SetDataViewColumn( column );
event.SetModel( dv->GetModel() ); event.SetModel( dv->GetModel() );
GtkTreePath *tree_path = gtk_tree_path_new_from_string( path ); GtkTreePath *tree_path = gtk_tree_path_new_from_string( path );
GtkTreeIter iter; wxDataViewItem item(dv->GTKPathToItem(tree_path));
dv->GtkGetInternal()->get_iter( &iter, tree_path );
gtk_tree_path_free( tree_path ); gtk_tree_path_free( tree_path );
wxDataViewItem item( iter.user_data );
event.SetItem( item ); event.SetItem( item );
dv->HandleWindowEvent( event ); dv->HandleWindowEvent( event );
if (GTK_IS_CELL_EDITABLE(editable)) if (GTK_IS_CELL_EDITABLE(editable))
{ {
s_user_data = iter.user_data; s_user_data = item.GetID();
g_signal_connect (GTK_CELL_EDITABLE (editable), "editing_done", g_signal_connect (GTK_CELL_EDITABLE (editable), "editing_done",
G_CALLBACK (wxgtk_cell_editable_editing_done), G_CALLBACK (wxgtk_cell_editable_editing_done),
@@ -1749,9 +1741,7 @@ wxDataViewRenderer::GtkOnTextEdited(const gchar *itempath, const wxString& str)
return; return;
GtkTreePath *path = gtk_tree_path_new_from_string( itempath ); GtkTreePath *path = gtk_tree_path_new_from_string( itempath );
GtkTreeIter iter; wxDataViewItem item(GetOwner()->GetOwner()->GTKPathToItem(path));
GetOwner()->GetOwner()->GtkGetInternal()->get_iter( &iter, path );
wxDataViewItem item( (void*) iter.user_data );;
gtk_tree_path_free( path ); gtk_tree_path_free( path );
GtkOnCellChanged(value, item, GetOwner()->GetModelColumn()); GtkOnCellChanged(value, item, GetOwner()->GetModelColumn());
@@ -2052,9 +2042,7 @@ static void wxGtkToggleRendererToggledCallback( GtkCellRendererToggle *renderer,
wxDataViewModel *model = cell->GetOwner()->GetOwner()->GetModel(); wxDataViewModel *model = cell->GetOwner()->GetOwner()->GetModel();
GtkTreePath *gtk_path = gtk_tree_path_new_from_string( path ); GtkTreePath *gtk_path = gtk_tree_path_new_from_string( path );
GtkTreeIter iter; wxDataViewItem item(cell->GetOwner()->GetOwner()->GTKPathToItem(gtk_path));
cell->GetOwner()->GetOwner()->GtkGetInternal()->get_iter( &iter, gtk_path );
wxDataViewItem item( (void*) iter.user_data );;
gtk_tree_path_free( gtk_path ); gtk_tree_path_free( gtk_path );
unsigned int model_col = cell->GetOwner()->GetModelColumn(); unsigned int model_col = cell->GetOwner()->GetModelColumn();
@@ -2482,9 +2470,7 @@ void wxDataViewChoiceByIndexRenderer::GtkOnTextEdited(const gchar *itempath, con
return; return;
GtkTreePath *path = gtk_tree_path_new_from_string( itempath ); GtkTreePath *path = gtk_tree_path_new_from_string( itempath );
GtkTreeIter iter; wxDataViewItem item(GetOwner()->GetOwner()->GTKPathToItem(path));
GetOwner()->GetOwner()->GtkGetInternal()->get_iter( &iter, path );
wxDataViewItem item( (void*) iter.user_data );;
gtk_tree_path_free( path ); gtk_tree_path_free( path );
GtkOnCellChanged(value, item, GetOwner()->GetModelColumn()); GtkOnCellChanged(value, item, GetOwner()->GetModelColumn());
@@ -3312,9 +3298,9 @@ gboolean wxDataViewCtrlInternal::row_draggable( GtkTreeDragSource *WXUNUSED(drag
{ {
delete m_dragDataObject; delete m_dragDataObject;
GtkTreeIter iter; wxDataViewItem item(GetOwner()->GTKPathToItem(path));
if (!get_iter( &iter, path )) return FALSE; if ( !item )
wxDataViewItem item( (void*) iter.user_data ); return FALSE;
wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_BEGIN_DRAG, m_owner->GetId() ); wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_BEGIN_DRAG, m_owner->GetId() );
event.SetEventObject( m_owner ); event.SetEventObject( m_owner );
@@ -3345,9 +3331,9 @@ wxDataViewCtrlInternal::drag_data_delete(GtkTreeDragSource *WXUNUSED(drag_source
gboolean wxDataViewCtrlInternal::drag_data_get( GtkTreeDragSource *WXUNUSED(drag_source), gboolean wxDataViewCtrlInternal::drag_data_get( GtkTreeDragSource *WXUNUSED(drag_source),
GtkTreePath *path, GtkSelectionData *selection_data ) GtkTreePath *path, GtkSelectionData *selection_data )
{ {
GtkTreeIter iter; wxDataViewItem item(GetOwner()->GTKPathToItem(path));
if (!get_iter( &iter, path )) return FALSE; if ( !item )
wxDataViewItem item( (void*) iter.user_data ); return FALSE;
if (!m_dragDataObject->IsSupported( selection_data->target )) if (!m_dragDataObject->IsSupported( selection_data->target ))
return FALSE; return FALSE;
@@ -3377,9 +3363,9 @@ wxDataViewCtrlInternal::drag_data_received(GtkTreeDragDest *WXUNUSED(drag_dest),
GtkTreePath *path, GtkTreePath *path,
GtkSelectionData *selection_data) GtkSelectionData *selection_data)
{ {
GtkTreeIter iter; wxDataViewItem item(GetOwner()->GTKPathToItem(path));
if (!get_iter( &iter, path )) return FALSE; if ( !item )
wxDataViewItem item( (void*) iter.user_data ); return FALSE;
wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_DROP, m_owner->GetId() ); wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_DROP, m_owner->GetId() );
event.SetEventObject( m_owner ); event.SetEventObject( m_owner );
@@ -3402,9 +3388,9 @@ wxDataViewCtrlInternal::row_drop_possible(GtkTreeDragDest *WXUNUSED(drag_dest),
GtkTreePath *path, GtkTreePath *path,
GtkSelectionData *selection_data) GtkSelectionData *selection_data)
{ {
GtkTreeIter iter; wxDataViewItem item(GetOwner()->GTKPathToItem(path));
if (!get_iter( &iter, path )) return FALSE; if ( !item )
wxDataViewItem item( (void*) iter.user_data ); return FALSE;
wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_DROP_POSSIBLE, m_owner->GetId() ); wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_DROP_POSSIBLE, m_owner->GetId() );
event.SetEventObject( m_owner ); event.SetEventObject( m_owner );
@@ -4037,9 +4023,7 @@ wxdataview_row_activated_callback( GtkTreeView* WXUNUSED(treeview), GtkTreePath
{ {
wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED, dv->GetId() ); wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED, dv->GetId() );
GtkTreeIter iter; wxDataViewItem item(dv->GTKPathToItem(path));
dv->GtkGetInternal()->get_iter( &iter, path );
wxDataViewItem item( (void*) iter.user_data );;
event.SetItem( item ); event.SetItem( item );
event.SetModel( dv->GetModel() ); event.SetModel( dv->GetModel() );
dv->HandleWindowEvent( event ); dv->HandleWindowEvent( event );
@@ -4206,12 +4190,8 @@ gtk_dataview_button_press_callback( GtkWidget *WXUNUSED(widget),
{ {
if (path) if (path)
{ {
GtkTreeIter iter;
dv->GtkGetInternal()->get_iter( &iter, path );
wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU, dv->GetId() ); wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU, dv->GetId() );
wxDataViewItem item( (void*) iter.user_data );; event.SetItem(dv->GTKPathToItem(path));
event.SetItem( item );
event.SetModel( dv->GetModel() ); event.SetModel( dv->GetModel() );
bool ret = dv->HandleWindowEvent( event ); bool ret = dv->HandleWindowEvent( event );
gtk_tree_path_free( path ); gtk_tree_path_free( path );
@@ -4339,6 +4319,14 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id,
return true; return true;
} }
wxDataViewItem wxDataViewCtrl::GTKPathToItem(GtkTreePath *path) const
{
GtkTreeIter iter;
return wxDataViewItem(path && m_internal->get_iter(&iter, path)
? iter.user_data
: NULL);
}
void wxDataViewCtrl::OnInternalIdle() void wxDataViewCtrl::OnInternalIdle()
{ {
wxWindow::OnInternalIdle(); wxWindow::OnInternalIdle();
@@ -4568,14 +4556,13 @@ wxDataViewItem wxDataViewCtrl::GetSelection() const
if (list) if (list)
{ {
GtkTreePath *path = (GtkTreePath*) list->data; GtkTreePath *path = (GtkTreePath*) list->data;
GtkTreeIter iter; wxDataViewItem item(GTKPathToItem(path));
m_internal->get_iter( &iter, path );
// delete list // delete list
g_list_foreach( list, (GFunc) gtk_tree_path_free, NULL ); g_list_foreach( list, (GFunc) gtk_tree_path_free, NULL );
g_list_free( list ); g_list_free( list );
return wxDataViewItem( (void*) iter.user_data ); return item;
} }
} }
else else
@@ -4583,7 +4570,7 @@ wxDataViewItem wxDataViewCtrl::GetSelection() const
GtkTreeIter iter; GtkTreeIter iter;
if (gtk_tree_selection_get_selected( selection, NULL, &iter )) if (gtk_tree_selection_get_selected( selection, NULL, &iter ))
{ {
wxDataViewItem item( (void*) iter.user_data ); wxDataViewItem item( iter.user_data );
return item; return item;
} }
} }
@@ -4606,10 +4593,7 @@ int wxDataViewCtrl::GetSelections( wxDataViewItemArray & sel ) const
{ {
GtkTreePath *path = (GtkTreePath*) list->data; GtkTreePath *path = (GtkTreePath*) list->data;
GtkTreeIter iter; sel.Add(GTKPathToItem(path));
m_internal->get_iter( &iter, path );
sel.Add( wxDataViewItem( (void*) iter.user_data ) );
list = g_list_next( list ); list = g_list_next( list );
count++; count++;