X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/07a84e7bbb3ed346fff59aa3570a1f687a3c4d7b..b64e7047020ed19c55fb0179e849554d138d8b06:/src/gtk/dataview.cpp diff --git a/src/gtk/dataview.cpp b/src/gtk/dataview.cpp index fd1e62bdcb..49f3dedb26 100644 --- a/src/gtk/dataview.cpp +++ b/src/gtk/dataview.cpp @@ -299,6 +299,7 @@ wxgtk_list_store_get_value (GtkTreeModel *tree_model, GtkWxListStore *list_store = (GtkWxListStore *) tree_model; g_return_if_fail (GTK_IS_WX_LIST_STORE (tree_model) ); +#if 0 wxDataViewListModel *model = list_store->model; wxString mtype = model->GetColType( (unsigned int) column ); if (mtype == wxT("string")) @@ -311,6 +312,7 @@ wxgtk_list_store_get_value (GtkTreeModel *tree_model, else { } +#endif #if 0 GtkTreeDataList *list; @@ -946,7 +948,11 @@ bool wxDataViewTextRenderer::SetValue( const wxVariant &value ) GValue gvalue = { 0, }; g_value_init( &gvalue, G_TYPE_STRING ); +#if wxUSE_UNICODE g_value_set_string( &gvalue, wxGTK_CONV( tmp ) ); +#else + g_value_set_string( &gvalue, wxGTK_CONV_FONT( tmp, GetOwner()->GetOwner()->GetFont() ) ); +#endif g_object_set_property( G_OBJECT(m_renderer), "text", &gvalue ); g_value_unset( &gvalue ); @@ -1221,7 +1227,11 @@ wxDataViewProgressRenderer::wxDataViewProgressRenderer( const wxString &label, GValue gvalue = { 0, }; g_value_init( &gvalue, G_TYPE_STRING ); - g_value_set_boolean( &gvalue, wxGTK_CONV(m_label) ); +#if wxUSE_UNICODE + g_value_set_string( &gvalue, wxGTK_CONV(m_label) ); +#else + g_value_set_string( &gvalue, wxGTK_CONV_SYS(m_label) ); +#endif g_object_set_property( G_OBJECT(m_renderer), "text", &gvalue ); g_value_unset( &gvalue ); } @@ -1242,10 +1252,10 @@ bool wxDataViewProgressRenderer::SetValue( const wxVariant &value ) #ifdef __WXGTK26__ if (!gtk_check_version(2,6,0)) { - gint tmp = (int) value; + gint tmp = (long) value; GValue gvalue = { 0, }; g_value_init( &gvalue, G_TYPE_INT ); - g_value_set_boolean( &gvalue, tmp ); + g_value_set_int( &gvalue, tmp ); g_object_set_property( G_OBJECT(m_renderer), "value", &gvalue ); g_value_unset( &gvalue ); } @@ -1384,6 +1394,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 +1454,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 ); @@ -1437,23 +1473,25 @@ wxDataViewColumn::wxDataViewColumn( const wxString &title, wxDataViewRenderer *c 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 ); - } + else + gtk_tree_view_column_set_fixed_width( column, 70 ); // FIXME + + 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 ); - m_column = (void*) column; } 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(); @@ -1469,10 +1507,11 @@ wxDataViewColumn::wxDataViewColumn( const wxBitmap &bitmap, wxDataViewRenderer * 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 ); - } + else + gtk_tree_view_column_set_fixed_width( column, 70 ); // FIXME + + gtk_tree_view_column_set_sizing( column, GTK_TREE_VIEW_COLUMN_FIXED ); gtk_tree_view_column_pack_end( column, renderer, FALSE ); @@ -1484,13 +1523,60 @@ 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::SetOwner( wxDataViewCtrl *owner ) +{ + wxDataViewColumnBase::SetOwner( owner ); + + GtkTreeViewColumn *column = (GtkTreeViewColumn *)m_column; + +#if wxUSE_UNICODE +#else + gtk_tree_view_column_set_title( column, wxGTK_CONV_FONT(GetTitle(), GetOwner()->GetFont() ) ); +#endif +} + void wxDataViewColumn::SetTitle( const wxString &title ) { wxDataViewColumnBase::SetTitle( title ); GtkTreeViewColumn *column = (GtkTreeViewColumn *)m_column; - gtk_tree_view_column_set_title( column, wxGTK_CONV(title) ); + 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; + } + +#if wxUSE_UNICODE + gtk_tree_view_column_set_title( column, wxGTK_CONV(title) ); +#else + if (GetOwner()) + gtk_tree_view_column_set_title( column, wxGTK_CONV_FONT(title, GetOwner()->GetFont() ) ); + else + gtk_tree_view_column_set_title( column, "" ); +#endif + gtk_tree_view_column_set_widget( column, NULL ); } @@ -1527,6 +1613,48 @@ void wxDataViewColumn::SetBitmap( const wxBitmap &bitmap ) } } +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() { return gtk_tree_view_column_get_width( (GtkTreeViewColumn *)m_column ); @@ -1549,6 +1677,9 @@ int wxDataViewColumn::GetFixedWidth() static void wxdataview_selection_changed_callback( GtkTreeSelection* selection, wxDataViewCtrl *dv ) { + if (!GTK_WIDGET_REALIZED(dv->m_widget)) + return; + wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ROW_SELECTED, dv->GetId() ); event.SetRow( dv->GetSelection() ); event.SetModel( dv->GetModel() ); @@ -1606,6 +1737,11 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, m_treeview = gtk_tree_view_new(); gtk_container_add (GTK_CONTAINER (m_widget), m_treeview); +#ifdef __WXGTK26__ + if (!gtk_check_version(2,6,0)) + gtk_tree_view_set_fixed_height_mode( GTK_TREE_VIEW(m_treeview), TRUE ); +#endif + if (style & wxDV_MULTIPLE) { GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) ); @@ -1618,17 +1754,30 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, m_parent->DoAddChild( this ); + PostCreation(size); + 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 )) @@ -1797,6 +1946,13 @@ int wxDataViewCtrl::GetSelections(wxArrayInt& aSelections) const return 0; } +// static +wxVisualAttributes +wxDataViewCtrl::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant)) +{ + return GetDefaultAttributesFromGTKWidget(gtk_tree_view_new); +} + #endif // !wxUSE_GENERICDATAVIEWCTRL