Use paint handler instead of wxClientDC to draw DnD visual effects within wxTreeCtrl
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@58123 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
		@@ -257,8 +257,13 @@ protected:
 | 
				
			|||||||
    wxCursor             m_oldCursor;  // cursor is changed while dragging
 | 
					    wxCursor             m_oldCursor;  // cursor is changed while dragging
 | 
				
			||||||
    wxGenericTreeItem   *m_oldSelection;
 | 
					    wxGenericTreeItem   *m_oldSelection;
 | 
				
			||||||
    wxGenericTreeItem   *m_underMouse; // for visual effects
 | 
					    wxGenericTreeItem   *m_underMouse; // for visual effects
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    enum { NoEffect, BorderEffect, AboveEffect, BelowEffect } m_dndEffect;
 | 
				
			||||||
 | 
					    wxGenericTreeItem   *m_dndEffectItem; 
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    wxTreeTextCtrl      *m_textCtrl;
 | 
					    wxTreeTextCtrl      *m_textCtrl;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    wxTimer             *m_renameTimer;
 | 
					    wxTimer             *m_renameTimer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // incremental search data
 | 
					    // incremental search data
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -986,6 +986,9 @@ void wxGenericTreeCtrl::Init()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    m_dropEffectAboveItem = false;
 | 
					    m_dropEffectAboveItem = false;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    m_dndEffect = NoEffect;
 | 
				
			||||||
 | 
					    m_dndEffectItem = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    m_lastOnSame = false;
 | 
					    m_lastOnSame = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined( __WXMAC__ )
 | 
					#if defined( __WXMAC__ )
 | 
				
			||||||
@@ -2639,6 +2642,40 @@ void wxGenericTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // restore normal font
 | 
					    // restore normal font
 | 
				
			||||||
    dc.SetFont( m_normalFont );
 | 
					    dc.SetFont( m_normalFont );
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    if (item == m_dndEffectItem)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        dc.SetPen( *wxBLACK_PEN );
 | 
				
			||||||
 | 
					        // DnD visual effects
 | 
				
			||||||
 | 
					        switch (m_dndEffect)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            case BorderEffect:
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                dc.SetBrush(*wxTRANSPARENT_BRUSH);
 | 
				
			||||||
 | 
					                int w = item->GetWidth() + 2;
 | 
				
			||||||
 | 
					                int h = total_h + 2;
 | 
				
			||||||
 | 
					                dc.DrawRectangle( item->GetX() - 1, item->GetY() - 1, w, h);
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            case AboveEffect:
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                int x = item->GetX(),
 | 
				
			||||||
 | 
					                    y = item->GetY();
 | 
				
			||||||
 | 
					                dc.DrawLine( x, y, x + item->GetWidth(), y);
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            case BelowEffect:
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                int x = item->GetX(),
 | 
				
			||||||
 | 
					                    y = item->GetY();
 | 
				
			||||||
 | 
					                y += total_h - 1;
 | 
				
			||||||
 | 
					                dc.DrawLine( x, y, x + item->GetWidth(), y);
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            case NoEffect:
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
@@ -2860,7 +2897,7 @@ void wxGenericTreeCtrl::DrawDropEffect(wxGenericTreeItem *item)
 | 
				
			|||||||
            DrawLine(item, !m_dropEffectAboveItem );
 | 
					            DrawLine(item, !m_dropEffectAboveItem );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        SetCursor(wxCURSOR_BULLSEYE);
 | 
					        SetCursor(*wxSTANDARD_CURSOR);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -2875,15 +2912,20 @@ void wxGenericTreeCtrl::DrawBorder(const wxTreeItemId &item)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    wxGenericTreeItem *i = (wxGenericTreeItem*) item.m_pItem;
 | 
					    wxGenericTreeItem *i = (wxGenericTreeItem*) item.m_pItem;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    wxClientDC dc(this);
 | 
					    if (m_dndEffect == NoEffect)
 | 
				
			||||||
    PrepareDC( dc );
 | 
					    {
 | 
				
			||||||
    dc.SetLogicalFunction(wxINVERT);
 | 
					        m_dndEffect = BorderEffect;
 | 
				
			||||||
    dc.SetBrush(*wxTRANSPARENT_BRUSH);
 | 
					        m_dndEffectItem = i;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        m_dndEffect = NoEffect;
 | 
				
			||||||
 | 
					        m_dndEffectItem = NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
    int w = i->GetWidth() + 2;
 | 
					    wxRect rect( i->GetX()-1, i->GetY()-1, i->GetWidth()+2, GetLineHeight(i)+2 );
 | 
				
			||||||
    int h = GetLineHeight(i) + 2;
 | 
					    CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y );
 | 
				
			||||||
 | 
					    RefreshRect( rect );
 | 
				
			||||||
    dc.DrawRectangle( i->GetX() - 1, i->GetY() - 1, w, h);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void wxGenericTreeCtrl::DrawLine(const wxTreeItemId &item, bool below)
 | 
					void wxGenericTreeCtrl::DrawLine(const wxTreeItemId &item, bool below)
 | 
				
			||||||
@@ -2892,18 +2934,23 @@ void wxGenericTreeCtrl::DrawLine(const wxTreeItemId &item, bool below)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    wxGenericTreeItem *i = (wxGenericTreeItem*) item.m_pItem;
 | 
					    wxGenericTreeItem *i = (wxGenericTreeItem*) item.m_pItem;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    wxClientDC dc(this);
 | 
					    if (m_dndEffect == NoEffect)
 | 
				
			||||||
    PrepareDC( dc );
 | 
					 | 
				
			||||||
    dc.SetLogicalFunction(wxINVERT);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    int x = i->GetX(),
 | 
					 | 
				
			||||||
        y = i->GetY();
 | 
					 | 
				
			||||||
    if ( below )
 | 
					 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        y += GetLineHeight(i) - 1;
 | 
					        if (below)
 | 
				
			||||||
 | 
					            m_dndEffect = BelowEffect;
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            m_dndEffect = AboveEffect;
 | 
				
			||||||
 | 
					        m_dndEffectItem = i;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        m_dndEffect = NoEffect;
 | 
				
			||||||
 | 
					        m_dndEffectItem = NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
    dc.DrawLine( x, y, x + i->GetWidth(), y);
 | 
					    wxRect rect( i->GetX()-1, i->GetY()-1, i->GetWidth()+2, GetLineHeight(i)+2 );
 | 
				
			||||||
 | 
					    CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y );
 | 
				
			||||||
 | 
					    RefreshRect( rect );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// -----------------------------------------------------------------------------
 | 
					// -----------------------------------------------------------------------------
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user