X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/baa9ebc473dba4e4ca0c4f288e6ed7c8c277295e..8adefcac72cb54d203752ccb16010378589159f2:/src/gtk/dataview.cpp diff --git a/src/gtk/dataview.cpp b/src/gtk/dataview.cpp index a94171c65b..7d4d4eafb0 100644 --- a/src/gtk/dataview.cpp +++ b/src/gtk/dataview.cpp @@ -1384,6 +1384,27 @@ bool wxDataViewDateRenderer::Activate( wxRect cell, wxDataViewListModel *model, // wxDataViewColumn // --------------------------------------------------------- + +static gboolean +gtk_dataview_header_button_press_callback( GtkWidget *widget, + GdkEventButton *gdk_event, + wxDataViewColumn *column ) +{ + if (gdk_event->type != GDK_BUTTON_PRESS) + return TRUE; + + if (gdk_event->button == 1) + { + wxDataViewCtrl *dv = column->GetOwner(); + wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK, dv->GetId() ); + event.SetDataViewColumn( column ); + event.SetModel( dv->GetModel() ); + dv->GetEventHandler()->ProcessEvent( event ); + } + + return TRUE; +} + extern "C" { static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *column, GtkCellRenderer *cell, @@ -1423,11 +1444,16 @@ wxDataViewColumn::wxDataViewColumn( const wxString &title, wxDataViewRenderer *c int width, int flags ) : wxDataViewColumnBase( title, cell, model_column, width, flags ) { + m_isConnected = false; + GtkCellRenderer *renderer = (GtkCellRenderer *) cell->GetGtkHandle(); GtkTreeViewColumn *column = gtk_tree_view_column_new(); - - gtk_tree_view_column_set_title( column, wxGTK_CONV(title) ); + m_column = (void*) column; + + gtk_tree_view_column_set_clickable( column, true ); + + SetTitle( title ); if (flags & wxDATAVIEW_COL_RESIZABLE) gtk_tree_view_column_set_resizable( column, true ); @@ -1447,19 +1473,155 @@ wxDataViewColumn::wxDataViewColumn( const wxString &title, wxDataViewRenderer *c gtk_tree_view_column_set_cell_data_func( column, renderer, wxGtkTreeCellDataFunc, (gpointer) cell, NULL ); +} + +wxDataViewColumn::wxDataViewColumn( const wxBitmap &bitmap, wxDataViewRenderer *cell, unsigned int model_column, + int width, int flags ) : + wxDataViewColumnBase( bitmap, cell, model_column, width, flags ) +{ + m_isConnected = false; + + GtkCellRenderer *renderer = (GtkCellRenderer *) cell->GetGtkHandle(); + + GtkTreeViewColumn *column = gtk_tree_view_column_new(); m_column = (void*) column; + + SetBitmap( bitmap ); + + if (flags & wxDATAVIEW_COL_RESIZABLE) + gtk_tree_view_column_set_resizable( column, true ); + if (flags & wxDATAVIEW_COL_HIDDEN) + gtk_tree_view_column_set_visible( column, false ); + if (flags & wxDATAVIEW_COL_SORTABLE) + gtk_tree_view_column_set_sort_indicator( column, true ); + + if (width > 0) + { + gtk_tree_view_column_set_fixed_width( column, width ); + gtk_tree_view_column_set_sizing( column, GTK_TREE_VIEW_COLUMN_FIXED ); + } + + gtk_tree_view_column_pack_end( column, renderer, FALSE ); + + gtk_tree_view_column_set_cell_data_func( column, renderer, + wxGtkTreeCellDataFunc, (gpointer) cell, NULL ); } wxDataViewColumn::~wxDataViewColumn() { } +void wxDataViewColumn::OnInternalIdle() +{ + if (m_isConnected) + return; + + if (GTK_WIDGET_REALIZED(GetOwner()->m_treeview)) + { + GtkTreeViewColumn *column = (GtkTreeViewColumn *)m_column; + if (column->button) + { + g_signal_connect(column->button, "button_press_event", + G_CALLBACK (gtk_dataview_header_button_press_callback), this); + + m_isConnected = true; + } + } +} + void wxDataViewColumn::SetTitle( const wxString &title ) { wxDataViewColumnBase::SetTitle( title ); GtkTreeViewColumn *column = (GtkTreeViewColumn *)m_column; + + if (m_isConnected) + { + // disconnect before column->button gets recreated + g_signal_handlers_disconnect_by_func( column->button, + (void*) gtk_dataview_header_button_press_callback, this); + + m_isConnected = false; + } + gtk_tree_view_column_set_title( column, wxGTK_CONV(title) ); + + gtk_tree_view_column_set_widget( column, NULL ); +} + +void wxDataViewColumn::SetBitmap( const wxBitmap &bitmap ) +{ + wxDataViewColumnBase::SetBitmap( bitmap ); + + GtkTreeViewColumn *column = (GtkTreeViewColumn *)m_column; + if (bitmap.Ok()) + { + GtkImage *gtk_image = GTK_IMAGE( gtk_image_new() ); + + GdkBitmap *mask = (GdkBitmap *) NULL; + if (bitmap.GetMask()) + mask = bitmap.GetMask()->GetBitmap(); + + if (bitmap.HasPixbuf()) + { + gtk_image_set_from_pixbuf(GTK_IMAGE(gtk_image), + bitmap.GetPixbuf()); + } + else + { + gtk_image_set_from_pixmap(GTK_IMAGE(gtk_image), + bitmap.GetPixmap(), mask); + } + gtk_widget_show( GTK_WIDGET(gtk_image) ); + + gtk_tree_view_column_set_widget( column, GTK_WIDGET(gtk_image) ); + } + else + { + gtk_tree_view_column_set_widget( column, NULL ); + } +} + +void wxDataViewColumn::SetAlignment( wxAlignment align ) +{ + GtkTreeViewColumn *column = (GtkTreeViewColumn *)m_column; + + gfloat xalign = 0.0; + if (align == wxALIGN_RIGHT) + xalign = 1.0; + if (align == wxALIGN_CENTER) + xalign = 0.5; + + gtk_tree_view_column_set_alignment( column, xalign ); +} + +void wxDataViewColumn::SetSortable( bool sortable ) +{ + GtkTreeViewColumn *column = (GtkTreeViewColumn *)m_column; + gtk_tree_view_column_set_sort_indicator( column, sortable ); +} + +bool wxDataViewColumn::GetSortable() +{ + GtkTreeViewColumn *column = (GtkTreeViewColumn *)m_column; + return gtk_tree_view_column_get_sort_indicator( column ); +} + +void wxDataViewColumn::SetSortOrder( bool ascending ) +{ + GtkTreeViewColumn *column = (GtkTreeViewColumn *)m_column; + + if (ascending) + gtk_tree_view_column_set_sort_order( column, GTK_SORT_ASCENDING ); + else + gtk_tree_view_column_set_sort_order( column, GTK_SORT_DESCENDING ); +} + +bool wxDataViewColumn::IsSortOrderAscending() +{ + GtkTreeViewColumn *column = (GtkTreeViewColumn *)m_column; + + return (gtk_tree_view_column_get_sort_order( column ) != GTK_SORT_DESCENDING); } int wxDataViewColumn::GetWidth() @@ -1490,6 +1652,17 @@ wxdataview_selection_changed_callback( GtkTreeSelection* selection, wxDataViewCt dv->GetEventHandler()->ProcessEvent( event ); } +static void +wxdataview_row_activated_callback( GtkTreeView* treeview, GtkTreePath *path, + GtkTreeViewColumn *column, wxDataViewCtrl *dv ) +{ + wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ROW_ACTIVATED, dv->GetId() ); + unsigned int row = (unsigned int)gtk_tree_path_get_indices (path)[0]; + event.SetRow( row ); + event.SetModel( dv->GetModel() ); + dv->GetEventHandler()->ProcessEvent( event ); +} + //----------------------------------------------------------------------------- // wxDataViewCtrl //----------------------------------------------------------------------------- @@ -1545,12 +1718,27 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) ); g_signal_connect_after (selection, "changed", G_CALLBACK (wxdataview_selection_changed_callback), this); + g_signal_connect_after (m_treeview, "row_activated", + G_CALLBACK (wxdataview_row_activated_callback), this); PostCreation(size); return true; } +void wxDataViewCtrl::OnInternalIdle() +{ + wxWindow::OnInternalIdle(); + + unsigned int cols = GetNumberOfColumns(); + unsigned int i; + for (i = 0; i < cols; i++) + { + wxDataViewColumn *col = GetColumn( i ); + col->OnInternalIdle(); + } +} + bool wxDataViewCtrl::AssociateModel( wxDataViewListModel *model ) { if (!wxDataViewCtrlBase::AssociateModel( model )) @@ -1583,6 +1771,33 @@ bool wxDataViewCtrl::AppendColumn( wxDataViewColumn *col ) void wxDataViewCtrl::SetSelection( int row ) { + GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) ); + + if (row < 0) + { + gtk_tree_selection_unselect_all( selection ); + } + else + { + GtkTreePath *path = gtk_tree_path_new (); + gtk_tree_path_append_index( path, row ); + + gtk_tree_selection_select_path( selection, path ); + + gtk_tree_path_free( path ); + } +} + +void wxDataViewCtrl::Unselect( unsigned int row ) +{ + GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) ); + + GtkTreePath *path = gtk_tree_path_new (); + gtk_tree_path_append_index( path, row ); + + gtk_tree_selection_unselect_path( selection, path ); + + gtk_tree_path_free( path ); } void wxDataViewCtrl::SetSelectionRange( unsigned int from, unsigned int to ) @@ -1595,7 +1810,16 @@ void wxDataViewCtrl::SetSelections( const wxArrayInt& aSelections) bool wxDataViewCtrl::IsSelected( unsigned int row ) const { - return false; + GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) ); + + GtkTreePath *path = gtk_tree_path_new (); + gtk_tree_path_append_index( path, row ); + + gboolean ret = gtk_tree_selection_path_is_selected( selection, path ); + + gtk_tree_path_free( path ); + + return ret; } int wxDataViewCtrl::GetSelection() const