Pixel fiddling for correct placement of text with and without icons
authorRobert Roebling <robert@roebling.de>
Thu, 18 Oct 2007 16:35:16 +0000 (16:35 +0000)
committerRobert Roebling <robert@roebling.de>
Thu, 18 Oct 2007 16:35:16 +0000 (16:35 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49230 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/generic/datavgen.cpp

index 8a13bf7d470b2aba968334ddb9b51ee74d0ef385..163a6fa0eb1c35f118f17f5ba886d1919ae9251d 100644 (file)
@@ -231,7 +231,6 @@ protected:
         m_penCurrent = wxPen(col, 1, wxSOLID);
     }
 
-    void DrawCurrent();
     void AdjustDC(wxDC& dc);
 
 private:
@@ -688,7 +687,8 @@ bool wxDataViewTextRenderer::Render( wxRect cell, wxDC *dc, int state )
                         view->GetForegroundColour();
 
     dc->SetTextForeground(col);
-    dc->DrawText( m_text, cell.x, cell.y );
+    dc->DrawText( m_text, cell.x,  cell.y + ((cell.height - dc->GetCharHeight()) / 2));
+    // dc->DrawText( m_text, cell.x, cell.y );
 
     return true;
 }
@@ -1032,18 +1032,28 @@ bool wxDataViewIconTextRenderer::Render( wxRect cell, wxDC *dc, int state )
     const wxIcon &icon = m_value.GetIcon();
     if (icon.IsOk())
     {
-        dc->DrawIcon( icon, cell.x, cell.y ); // TODO centre
+        dc->DrawIcon( icon, cell.x, cell.y + ((cell.height - icon.GetHeight()) / 2)); 
         cell.x += icon.GetWidth()+4;
     }
 
-    dc->DrawText( m_value.GetText(), cell.x, cell.y );
+    dc->DrawText( m_value.GetText(), cell.x,  cell.y + ((cell.height - dc->GetCharHeight()) / 2));
 
     return true;
 }
 
 wxSize wxDataViewIconTextRenderer::GetSize() const
 {
-    return wxSize(80,16);  // TODO
+    const wxDataViewCtrl *view = GetView();
+    if (!m_value.GetText().empty())
+    {
+        int x,y;
+        view->GetTextExtent( m_value.GetText(), &x, &y );
+        
+        if (m_value.GetIcon().IsOk())
+            x += m_value.GetIcon().GetWidth() + 4;
+        return wxSize( x, y );
+    }
+    return wxSize(80,20);
 }
 
 wxControl* wxDataViewIconTextRenderer::CreateEditorCtrl( wxWindow *parent, wxRect labelRect, const wxVariant &value )
@@ -1800,33 +1810,6 @@ void wxGenericDataViewHeaderWindow::OnMouse( wxMouseEvent &event )
     }
 }
 
-//I must say that this function is deprecated, but I think it is useful to keep it for a time
-void wxGenericDataViewHeaderWindow::DrawCurrent()
-{
-#if 1
-    GetColumn(m_column)->SetWidth(m_currentX - m_minX);
-#else
-    int x1 = m_currentX;
-    int y1 = 0;
-    ClientToScreen (&x1, &y1);
-
-    int x2 = m_currentX-1;
-#ifdef __WXMSW__
-    ++x2; // but why ????
-#endif
-    int y2 = 0;
-    m_owner->GetClientSize( NULL, &y2 );
-    m_owner->ClientToScreen( &x2, &y2 );
-
-    wxScreenDC dc;
-    dc.SetLogicalFunction(wxINVERT);
-    dc.SetPen(m_penCurrent);
-    dc.SetBrush(*wxTRANSPARENT_BRUSH);
-    AdjustDC(dc);
-    dc.DrawLine(x1, y1, x2, y2 );
-#endif
-}
-
 void wxGenericDataViewHeaderWindow::AdjustDC(wxDC& dc)
 {
     int xpix, x;
@@ -1895,13 +1878,7 @@ wxDataViewMainWindow::wxDataViewMainWindow( wxDataViewCtrl *parent, wxWindowID i
     m_currentCol = NULL;
     m_currentRow = 0;
 
-    // TODO: we need to calculate this smartly
-    m_lineHeight =
-#ifdef __WXMSW__
-        17;
-#else
-        20;
-#endif
+    m_lineHeight = wxMax( 17, GetCharHeight() + 2 ); // 17 = mini icon height + 1
 
     m_dragCount = 0;
     m_dragStart = wxPoint(0,0);
@@ -2455,7 +2432,8 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
             wxSize size = cell->GetSize();
             // Because of the tree structure indent, here we should minus the width of the cell for drawing
             size.x = wxMin( size.x + 2*PADDING_RIGHTLEFT, cell_rect.width - indent );
-            size.y = wxMin( size.y, cell_rect.height );
+            // size.y = wxMin( size.y, cell_rect.height );
+            size.y = cell_rect.height;
 
             wxRect item_rect(cell_rect.GetTopLeft(), size);
             int align = cell->GetAlignment();