]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/dataview.cpp
Correct cell alignment computation for too small column sizes.
[wxWidgets.git] / src / gtk / dataview.cpp
index 85fcee31858bc2d3543d769391de98e13e35eaac..064708d6d3a9c4086e22f55561bc09e83ec566c6 100644 (file)
@@ -853,7 +853,7 @@ typedef struct _GtkWxCellRendererTextClass GtkWxCellRendererTextClass;
 struct _GtkWxCellRendererText
 {
   GtkCellRendererText parent;
-  
+
   wxDataViewRenderer *wx_renderer;
 };
 
@@ -969,7 +969,7 @@ static GtkCellEditable *gtk_wx_cell_renderer_text_start_editing(
     event.SetColumn( wx_renderer->GetOwner()->GetModelColumn() );
     event.SetItem( item );
     dv->HandleWindowEvent( event );
-    
+
     if (event.IsAllowed())
         return GTK_CELL_RENDERER_CLASS(text_cell_parent_class)->
            start_editing( gtk_renderer, gdk_event, widget, path, background_area, cell_area, flags );
@@ -1489,7 +1489,7 @@ bool wxGtkDataViewModelNotifier::ValueChanged( const wxDataViewItem &item, unsig
 bool wxGtkDataViewModelNotifier::Cleared()
 {
     m_owner->GtkGetInternal()->Cleared();
-    
+
     return true;
 }
 
@@ -1553,6 +1553,9 @@ wxDataViewRenderer::wxDataViewRenderer( const wxString &varianttype, wxDataViewC
 {
     m_renderer = NULL;
 
+    // we haven't changed them yet
+    m_usingDefaultAttrs = true;
+
     // NOTE: SetMode() and SetAlignment() needs to be called in the renderer's ctor,
     //       after the m_renderer pointer has been initialized
 }
@@ -1562,8 +1565,8 @@ void wxDataViewRenderer::GtkInitHandlers()
     if (!gtk_check_version(2,6,0))
     {
         g_signal_connect (GTK_CELL_RENDERER(m_renderer), "editing_started",
-                   G_CALLBACK (wxgtk_renderer_editing_started),
-                   this);
+            G_CALLBACK (wxgtk_renderer_editing_started),
+            this);
     }
 }
 
@@ -1790,18 +1793,6 @@ void wxDataViewTextRenderer::SetAlignment( int align )
     g_value_unset( &gvalue );
 }
 
-// ---------------------------------------------------------
-// wxDataViewTextRendererAttr
-// ---------------------------------------------------------
-
-IMPLEMENT_CLASS(wxDataViewTextRendererAttr,wxDataViewTextRenderer)
-
-wxDataViewTextRendererAttr::wxDataViewTextRendererAttr( const wxString &varianttype,
-                            wxDataViewCellMode mode, int align ) :
-   wxDataViewTextRenderer( varianttype, mode, align )
-{
-}
-
 // ---------------------------------------------------------
 // wxDataViewBitmapRenderer
 // ---------------------------------------------------------
@@ -2509,14 +2500,8 @@ gtk_dataview_header_button_press_callback( GtkWidget *WXUNUSED(widget),
     return FALSE;
 }
 
-extern "C" {
-static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *column,
-                            GtkCellRenderer *cell,
-                            GtkTreeModel *model,
-                            GtkTreeIter *iter,
-                            gpointer data );
-}
-
+extern "C"
+{
 
 static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *WXUNUSED(column),
                             GtkCellRenderer *renderer,
@@ -2535,37 +2520,25 @@ static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *WXUNUSED(column),
 
     if (!wx_model->IsVirtualListModel())
     {
-
-    if (wx_model->IsContainer( item ))
-    {
-        if (wx_model->HasContainerColumns( item ) || (cell->GetOwner()->GetModelColumn() == 0))
+        gboolean visible;
+        if (wx_model->IsContainer( item ))
         {
-            GValue gvalue = { 0, };
-            g_value_init( &gvalue, G_TYPE_BOOLEAN );
-            g_value_set_boolean( &gvalue, TRUE );
-            g_object_set_property( G_OBJECT(renderer), "visible", &gvalue );
-            g_value_unset( &gvalue );
+            visible = wx_model->HasContainerColumns( item ) ||
+                        (cell->GetOwner()->GetModelColumn() == 0);
         }
         else
         {
-            GValue gvalue = { 0, };
-            g_value_init( &gvalue, G_TYPE_BOOLEAN );
-            g_value_set_boolean( &gvalue, FALSE );
-            g_object_set_property( G_OBJECT(renderer), "visible", &gvalue );
-            g_value_unset( &gvalue );
-
-            return;
+            visible = true;
         }
-    }
-    else
-    {
+
         GValue gvalue = { 0, };
         g_value_init( &gvalue, G_TYPE_BOOLEAN );
-        g_value_set_boolean( &gvalue, TRUE );
+        g_value_set_boolean( &gvalue, visible );
         g_object_set_property( G_OBJECT(renderer), "visible", &gvalue );
         g_value_unset( &gvalue );
-    }
 
+        if ( !visible )
+            return;
     }
 
     wxVariant value;
@@ -2580,79 +2553,76 @@ static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *WXUNUSED(column),
 
     cell->SetValue( value );
 
-    if (cell->GtkHasAttributes())
-    {
-        wxDataViewItemAttr attr;
-        bool colour_set = false;
-        bool style_set = false;
-        bool weight_set = false;
 
-        if (wx_model->GetAttr( item, cell->GetOwner()->GetModelColumn(), attr ))
-        {
-            // this must be a GtkCellRendererText
-            wxColour colour = attr.GetColour();
-            if (colour.IsOk())
-            {
-                const GdkColor * const gcol = colour.GetColor();
-
-                GValue gvalue = { 0, };
-                g_value_init( &gvalue, GDK_TYPE_COLOR );
-                g_value_set_boxed( &gvalue, gcol );
-                g_object_set_property( G_OBJECT(renderer), "foreground_gdk", &gvalue );
-                g_value_unset( &gvalue );
+    // deal with attributes
+    wxDataViewItemAttr attr;
+    if ( !wx_model->GetAttr( item, cell->GetOwner()->GetModelColumn(), attr )
+            && cell->GtkIsUsingDefaultAttrs() )
+    {
+        // no custom attributes specified and we're already using the default
+        // ones -- nothing to do
+        return;
+    }
 
-                colour_set = true;
-            }
+    bool usingDefaultAttrs = true;
+    if (attr.HasColour())
+    {
+        const GdkColor * const gcol = attr.GetColour().GetColor();
 
-            if (attr.GetItalic())
-            {
-                GValue gvalue = { 0, };
-                g_value_init( &gvalue, PANGO_TYPE_STYLE );
-                g_value_set_enum( &gvalue, PANGO_STYLE_ITALIC );
-                g_object_set_property( G_OBJECT(renderer), "style", &gvalue );
-                g_value_unset( &gvalue );
+        GValue gvalue = { 0, };
+        g_value_init( &gvalue, GDK_TYPE_COLOR );
+        g_value_set_boxed( &gvalue, gcol );
+        g_object_set_property( G_OBJECT(renderer), "foreground_gdk", &gvalue );
+        g_value_unset( &gvalue );
 
-                style_set = true;
-            }
+        usingDefaultAttrs = false;
+    }
+    else
+    {
+        GValue gvalue = { 0, };
+        g_value_init( &gvalue, G_TYPE_BOOLEAN );
+        g_value_set_boolean( &gvalue, FALSE );
+        g_object_set_property( G_OBJECT(renderer), "foreground-set", &gvalue );
+        g_value_unset( &gvalue );
+    }
 
-            if (attr.GetBold())
-            {
-                GValue gvalue = { 0, };
-                g_value_init( &gvalue, PANGO_TYPE_WEIGHT );
-                g_value_set_enum( &gvalue, PANGO_WEIGHT_BOLD );
-                g_object_set_property( G_OBJECT(renderer), "weight", &gvalue );
-                g_value_unset( &gvalue );
+    if (attr.GetItalic())
+    {
+        GValue gvalue = { 0, };
+        g_value_init( &gvalue, PANGO_TYPE_STYLE );
+        g_value_set_enum( &gvalue, PANGO_STYLE_ITALIC );
+        g_object_set_property( G_OBJECT(renderer), "style", &gvalue );
+        g_value_unset( &gvalue );
 
-                weight_set = true;
-            }
-        }
+        usingDefaultAttrs = false;
+    }
+    else
+    {
+        GValue gvalue = { 0, };
+        g_value_init( &gvalue, G_TYPE_BOOLEAN );
+        g_value_set_boolean( &gvalue, FALSE );
+        g_object_set_property( G_OBJECT(renderer), "style-set", &gvalue );
+        g_value_unset( &gvalue );
+    }
 
-        if (!style_set)
-        {
-            GValue gvalue = { 0, };
-            g_value_init( &gvalue, G_TYPE_BOOLEAN );
-            g_value_set_boolean( &gvalue, FALSE );
-            g_object_set_property( G_OBJECT(renderer), "style-set", &gvalue );
-            g_value_unset( &gvalue );
-        }
 
-        if (!weight_set)
-        {
-            GValue gvalue = { 0, };
-            g_value_init( &gvalue, G_TYPE_BOOLEAN );
-            g_value_set_boolean( &gvalue, FALSE );
-            g_object_set_property( G_OBJECT(renderer), "weight-set", &gvalue );
-            g_value_unset( &gvalue );
-        }
+    if (attr.GetBold())
+    {
+        GValue gvalue = { 0, };
+        g_value_init( &gvalue, PANGO_TYPE_WEIGHT );
+        g_value_set_enum( &gvalue, PANGO_WEIGHT_BOLD );
+        g_object_set_property( G_OBJECT(renderer), "weight", &gvalue );
+        g_value_unset( &gvalue );
 
-        if (!colour_set)
-        {
-            GValue gvalue = { 0, };
-            g_value_init( &gvalue, G_TYPE_BOOLEAN );
-            g_value_set_boolean( &gvalue, FALSE );
-            g_object_set_property( G_OBJECT(renderer), "foreground-set", &gvalue );
-            g_value_unset( &gvalue );
-        }
+        usingDefaultAttrs = false;
+    }
+    else
+    {
+        GValue gvalue = { 0, };
+        g_value_init( &gvalue, G_TYPE_BOOLEAN );
+        g_value_set_boolean( &gvalue, FALSE );
+        g_object_set_property( G_OBJECT(renderer), "weight-set", &gvalue );
+        g_value_unset( &gvalue );
     }
 
 #if 0
@@ -2677,8 +2647,11 @@ static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *WXUNUSED(column),
     }
 #endif
 
+    cell->GtkSetUsingDefaultAttrs(usingDefaultAttrs);
 }
 
+} // extern "C"
+
 #include <wx/listimpl.cpp>
 WX_DEFINE_LIST(wxDataViewColumnList)
 
@@ -3025,10 +2998,10 @@ void wxGtkTreeModelNode::Resort()
     // Sort the ptrs
     gs_internal = m_internal;
     ptrs.Sort( &wxGtkTreeModelChildPtrCmp );
+
     wxGtkTreeModelChildren temp;
     void** base_ptr = &(m_children[0]);
-    // Transfer positions to new_order array and 
+    // Transfer positions to new_order array and
     // IDs to temp
     for (i = 0; i < child_count; i++)
     {
@@ -3068,13 +3041,13 @@ void wxGtkTreeModelNode::Resort()
 
 #if 0
     // Too slow
-    
+
     wxGtkTreeModelChildren temp;
     WX_APPEND_ARRAY( temp, m_children );
 
     gs_internal = m_internal;
     m_children.Sort( &wxGtkTreeModelChildCmp );
-    
+
     unsigned int pos;
     for (pos = 0; pos < child_count; pos++)
     {
@@ -3097,7 +3070,7 @@ void wxGtkTreeModelNode::Resort()
     gtk_tree_path_free (path);
 
     delete [] new_order;
-    
+
     unsigned int pos;
     for (pos = 0; pos < node_count; pos++)
     {
@@ -3317,13 +3290,13 @@ bool wxDataViewCtrlInternal::Cleared()
     GtkWidget* tree_widget = GetOwner()->GtkGetTreeView();
     gtk_tree_view_set_model( GTK_TREE_VIEW(tree_widget), NULL );
     gtk_tree_view_set_model( GTK_TREE_VIEW(tree_widget), GTK_TREE_MODEL(m_gtk_model) );
-    
+
     if (m_root)
     {
         delete m_root;
         InitTree();
     }
-    
+
     return true;
 }
 
@@ -3404,9 +3377,9 @@ gboolean wxDataViewCtrlInternal::get_iter( GtkTreeIter *iter, GtkTreePath *path
     if (m_wx_model->IsVirtualListModel())
     {
         wxDataViewVirtualListModel *wx_model = (wxDataViewVirtualListModel*) m_wx_model;
-    
+
         unsigned int i = (unsigned int)gtk_tree_path_get_indices (path)[0];
-        
+
         if (i >= wx_model->GetCount())
             return FALSE;
 
@@ -3506,7 +3479,7 @@ gboolean wxDataViewCtrlInternal::iter_next( GtkTreeIter *iter )
             iter->user_data = NULL;
             return FALSE;
         }
-        
+
         // user_data is just the index +1 (+2 because we need the next)
         iter->user_data = (gpointer) (n+2);
     }
@@ -3555,7 +3528,7 @@ gboolean wxDataViewCtrlInternal::iter_children( GtkTreeIter *iter, GtkTreeIter *
             iter->user_data = (gpointer) m_root->GetChildren().Item( 0 );
             return TRUE;
         }
-        
+
         wxDataViewItem item( (void*) parent->user_data );
 
         if (!m_wx_model->IsContainer( item ))
@@ -3585,7 +3558,7 @@ gboolean wxDataViewCtrlInternal::iter_has_child( GtkTreeIter *iter )
 
         if (iter == NULL)
             return (wx_model->GetCount() > 0);
-        
+
         // this is a list, nodes have no children
         return FALSE;
     }
@@ -3593,7 +3566,7 @@ gboolean wxDataViewCtrlInternal::iter_has_child( GtkTreeIter *iter )
     {
         if (iter == NULL)
             return (m_root->GetChildCount() > 0);
-    
+
         wxDataViewItem item( (void*) iter->user_data );
 
         bool is_container = m_wx_model->IsContainer( item );
@@ -4643,6 +4616,10 @@ void wxDataViewCtrl::GtkEnableSelectionEvents()
                             G_CALLBACK (wxdataview_selection_changed_callback), this);
 }
 
+// ----------------------------------------------------------------------------
+// visual attributes stuff
+// ----------------------------------------------------------------------------
+
 // static
 wxVisualAttributes
 wxDataViewCtrl::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))
@@ -4650,9 +4627,12 @@ wxDataViewCtrl::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))
     return GetDefaultAttributesFromGTKWidget(gtk_tree_view_new);
 }
 
+void wxDataViewCtrl::DoApplyWidgetStyle(GtkRcStyle *style)
+{
+    wxDataViewCtrlBase::DoApplyWidgetStyle(style);
+    gtk_widget_modify_style(m_treeview, style);
+}
 
-#endif
-    // !wxUSE_GENERICDATAVIEWCTRL
+#endif // !wxUSE_GENERICDATAVIEWCTRL
 
-#endif
-    // wxUSE_DATAVIEWCTRL
+#endif // wxUSE_DATAVIEWCTRL