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,7 +257,12 @@ 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;
|
||||||
|
|
||||||
|
|||||||
@@ -985,6 +985,9 @@ void wxGenericTreeCtrl::Init()
|
|||||||
m_findTimer = NULL;
|
m_findTimer = NULL;
|
||||||
|
|
||||||
m_dropEffectAboveItem = false;
|
m_dropEffectAboveItem = false;
|
||||||
|
|
||||||
|
m_dndEffect = NoEffect;
|
||||||
|
m_dndEffectItem = NULL;
|
||||||
|
|
||||||
m_lastOnSame = false;
|
m_lastOnSame = false;
|
||||||
|
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
int w = i->GetWidth() + 2;
|
else
|
||||||
int h = GetLineHeight(i) + 2;
|
{
|
||||||
|
m_dndEffect = NoEffect;
|
||||||
dc.DrawRectangle( i->GetX() - 1, i->GetY() - 1, w, h);
|
m_dndEffectItem = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
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 );
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
||||||
dc.DrawLine( x, y, x + i->GetWidth(), y);
|
{
|
||||||
|
m_dndEffect = NoEffect;
|
||||||
|
m_dndEffectItem = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
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