draw the selected items in another colour when the control doesn't have focus, a bit like MSW does

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11421 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2001-08-20 14:13:34 +00:00
parent 643ccf6203
commit b771aa29dd
2 changed files with 63 additions and 19 deletions

View File

@@ -357,7 +357,8 @@ protected:
unsigned short m_spacing; unsigned short m_spacing;
int m_lineHeight; int m_lineHeight;
wxPen m_dottedPen; wxPen m_dottedPen;
wxBrush *m_hilightBrush; wxBrush *m_hilightBrush,
*m_hilightUnfocusedBrush;
bool m_hasFocus; bool m_hasFocus;
bool m_dirty; bool m_dirty;
bool m_ownsImageListNormal, bool m_ownsImageListNormal,
@@ -405,6 +406,12 @@ protected:
void RefreshSubtree( wxGenericTreeItem *item ); void RefreshSubtree( wxGenericTreeItem *item );
void RefreshLine( wxGenericTreeItem *item ); void RefreshLine( wxGenericTreeItem *item );
// redraw all selected items
void RefreshSelected();
// RefreshSelected() recursive helper
void RefreshSelectedUnder(wxGenericTreeItem *item);
void OnRenameTimer(); void OnRenameTimer();
void OnRenameAccept(); void OnRenameAccept();

View File

@@ -614,9 +614,23 @@ void wxGenericTreeCtrl::Init()
m_indent = 15; m_indent = 15;
m_spacing = 18; m_spacing = 18;
m_hilightBrush = new wxBrush( m_hilightBrush = new wxBrush
wxSystemSettings::GetSystemColour(wxSYS_COLOUR_HIGHLIGHT), (
wxSOLID); wxSystemSettings::GetSystemColour
(
wxSYS_COLOUR_HIGHLIGHT
),
wxSOLID
);
m_hilightUnfocusedBrush = new wxBrush
(
wxSystemSettings::GetSystemColour
(
wxSYS_COLOUR_BTNSHADOW
),
wxSOLID
);
m_imageListNormal = m_imageListButtons = m_imageListNormal = m_imageListButtons =
m_imageListState = (wxImageList *) NULL; m_imageListState = (wxImageList *) NULL;
@@ -672,7 +686,8 @@ bool wxGenericTreeCtrl::Create(wxWindow *parent,
wxGenericTreeCtrl::~wxGenericTreeCtrl() wxGenericTreeCtrl::~wxGenericTreeCtrl()
{ {
wxDELETE( m_hilightBrush ); delete m_hilightBrush;
delete m_hilightUnfocusedBrush;
DeleteAllItems(); DeleteAllItems();
@@ -1838,10 +1853,9 @@ void wxGenericTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc)
int total_h = GetLineHeight(item); int total_h = GetLineHeight(item);
bool paintBg = item->IsSelected() && m_hasFocus; if ( item->IsSelected() )
if ( paintBg )
{ {
dc.SetBrush(*m_hilightBrush); dc.SetBrush(*(m_hasFocus ? m_hilightBrush : m_hilightUnfocusedBrush));
} }
else else
{ {
@@ -1999,7 +2013,7 @@ void wxGenericTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level
#ifndef __WXMAC__ #ifndef __WXMAC__
// don't draw rect outline if we already have the // don't draw rect outline if we already have the
// background color under Mac // background color under Mac
(item->IsSelected()) ? wxBLACK_PEN : (item->IsSelected() && m_hasFocus) ? wxBLACK_PEN :
#endif // !__WXMAC__ #endif // !__WXMAC__
wxTRANSPARENT_PEN; wxTRANSPARENT_PEN;
@@ -2146,20 +2160,22 @@ void wxGenericTreeCtrl::OnPaint( wxPaintEvent &WXUNUSED(event) )
PaintLevel( m_anchor, dc, 0, y ); PaintLevel( m_anchor, dc, 0, y );
} }
void wxGenericTreeCtrl::OnSetFocus( wxFocusEvent &WXUNUSED(event) ) void wxGenericTreeCtrl::OnSetFocus( wxFocusEvent &event )
{ {
m_hasFocus = TRUE; m_hasFocus = TRUE;
if (m_current) RefreshSelected();
RefreshLine( m_current );
event.Skip();
} }
void wxGenericTreeCtrl::OnKillFocus( wxFocusEvent &WXUNUSED(event) ) void wxGenericTreeCtrl::OnKillFocus( wxFocusEvent &event )
{ {
m_hasFocus = FALSE; m_hasFocus = FALSE;
if (m_current) RefreshSelected();
RefreshLine( m_current );
event.Skip();
} }
void wxGenericTreeCtrl::OnChar( wxKeyEvent &event ) void wxGenericTreeCtrl::OnChar( wxKeyEvent &event )
@@ -2885,4 +2901,25 @@ void wxGenericTreeCtrl::RefreshLine( wxGenericTreeItem *item )
Refresh( TRUE, &rect ); Refresh( TRUE, &rect );
} }
void wxGenericTreeCtrl::RefreshSelected()
{
// TODO: this is awfully inefficient, we should keep the list of all
// selected items internally, should be much faster
if ( m_anchor )
RefreshSelectedUnder(m_anchor);
}
void wxGenericTreeCtrl::RefreshSelectedUnder(wxGenericTreeItem *item)
{
if ( item->IsSelected() )
RefreshLine(item);
const wxArrayGenericTreeItems& children = item->GetChildren();
size_t count = children.GetCount();
for ( size_t n = 0; n < count; n++ )
{
RefreshSelectedUnder(children[n]);
}
}
#endif // wxUSE_TREECTRL #endif // wxUSE_TREECTRL