Added better visual feedback for tree control

triangles. They now have a sort of prelight
    status like they have under GTK2.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@25836 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2004-02-16 23:12:33 +00:00
parent 67e489c5cf
commit f8b043e78f
4 changed files with 173 additions and 12 deletions

View File

@@ -423,6 +423,7 @@ protected:
wxGenericTreeItem *m_dropTarget; wxGenericTreeItem *m_dropTarget;
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
wxTreeTextCtrl *m_textCtrl; wxTreeTextCtrl *m_textCtrl;
wxTimer *m_renameTimer; wxTimer *m_renameTimer;

View File

@@ -183,7 +183,7 @@ public:
// return the item at given position (or NULL if no item), onButton is // return the item at given position (or NULL if no item), onButton is
// TRUE if the point belongs to the item's button, otherwise it lies // TRUE if the point belongs to the item's button, otherwise it lies
// on the button's label // on the item's label
wxGenericTreeItem *HitTest( const wxPoint& point, wxGenericTreeItem *HitTest( const wxPoint& point,
const wxGenericTreeCtrl *, const wxGenericTreeCtrl *,
int &flags, int &flags,
@@ -578,8 +578,8 @@ wxGenericTreeItem *wxGenericTreeItem::HitTest(const wxPoint& point,
HasPlus() && theCtrl->HasButtons() ) HasPlus() && theCtrl->HasButtons() )
#else #else
// 5 is the size of the plus sign // 5 is the size of the plus sign
if ((point.x > xCross-5) && (point.x < xCross+5) && if ((point.x > xCross-6) && (point.x < xCross+6) &&
(point.y > y_mid-5) && (point.y < y_mid+5) && (point.y > y_mid-6) && (point.y < y_mid+6) &&
HasPlus() && theCtrl->HasButtons() ) HasPlus() && theCtrl->HasButtons() )
#endif #endif
{ {
@@ -724,7 +724,8 @@ void wxGenericTreeCtrl::Init()
m_dragCount = 0; m_dragCount = 0;
m_isDragging = FALSE; m_isDragging = FALSE;
m_dropTarget = m_oldSelection = (wxGenericTreeItem *)NULL; m_dropTarget = m_oldSelection = NULL;
m_underMouse = NULL;
m_textCtrl = NULL; m_textCtrl = NULL;
m_renameTimer = NULL; m_renameTimer = NULL;
@@ -2334,7 +2335,13 @@ void wxGenericTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level
{ {
static const int wImage = 9; static const int wImage = 9;
static const int hImage = 9; static const int hImage = 9;
int flag = 0;
if (item->IsExpanded())
flag |= wxCONTROL_EXPANDED;
if (item == m_underMouse)
flag |= wxCONTROL_CURRENT;
wxRendererNative::Get().DrawTreeItemButton wxRendererNative::Get().DrawTreeItemButton
( (
this, this,
@@ -2342,9 +2349,7 @@ void wxGenericTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level
wxRect(x - wImage/2, wxRect(x - wImage/2,
y_mid - hImage/2, y_mid - hImage/2,
wImage, hImage), wImage, hImage),
item->IsExpanded() flag
? wxCONTROL_EXPANDED
: 0
); );
} }
} }
@@ -2873,6 +2878,38 @@ void wxGenericTreeCtrl::OnMouse( wxMouseEvent &event )
{ {
if ( !m_anchor ) return; if ( !m_anchor ) return;
wxPoint pt = CalcUnscrolledPosition(event.GetPosition());
// Is the mouse over a tree item button?
int flags = 0;
wxGenericTreeItem *underMouse = m_anchor->HitTest(pt, this, flags, 0);
if ((underMouse) &&
(flags & wxTREE_HITTEST_ONITEMBUTTON) &&
(!event.LeftIsDown()) &&
(!m_isDragging) &&
(!m_renameTimer || !m_renameTimer->IsRunning()))
{
}
else
{
underMouse = NULL;
}
if (underMouse != m_underMouse)
{
if (m_underMouse)
{
// unhighlight old item
wxGenericTreeItem *tmp = m_underMouse;
m_underMouse = NULL;
RefreshLine( tmp );
}
m_underMouse = underMouse;
if (m_underMouse)
RefreshLine( m_underMouse );
}
#if wxUSE_TOOLTIPS #if wxUSE_TOOLTIPS
// Determines what item we are hovering over and need a tooltip for // Determines what item we are hovering over and need a tooltip for
wxTreeItemId hoverItem = HitTest(ScreenToClient(wxGetMousePosition())); wxTreeItemId hoverItem = HitTest(ScreenToClient(wxGetMousePosition()));
@@ -2907,9 +2944,8 @@ void wxGenericTreeCtrl::OnMouse( wxMouseEvent &event )
return; return;
} }
wxPoint pt = CalcUnscrolledPosition(event.GetPosition());
int flags = 0; flags = 0;
wxGenericTreeItem *item = m_anchor->HitTest(pt, this, flags, 0); wxGenericTreeItem *item = m_anchor->HitTest(pt, this, flags, 0);
if ( event.Dragging() && !m_isDragging ) if ( event.Dragging() && !m_isDragging )

View File

@@ -132,9 +132,70 @@ wxRendererGTK::DrawHeaderButton(wxWindow *win,
// //
// TODO: isn't there a GTK function to draw it? // TODO: isn't there a GTK function to draw it?
void void
wxRendererGTK::DrawTreeItemButton(wxWindow* WXUNUSED(win), wxRendererGTK::DrawTreeItemButton(wxWindow* win,
wxDC& dc, const wxRect& rect, int flags) wxDC& dc, const wxRect& rect, int flags)
{ {
#if 1
#define PM_SIZE 8
GtkPizza *pizza = GTK_PIZZA( win->m_wxwindow );
GtkStyle *style = win->m_widget->style;
int x = rect.x;
int y = rect.y;
#if 1
// This draws the GTK+ 2.2.4 triangle
x--;
GdkPoint points[3];
if ( flags & wxCONTROL_EXPANDED )
{
points[0].x = x;
points[0].y = y + (PM_SIZE + 2) / 6;
points[1].x = points[0].x + (PM_SIZE + 2);
points[1].y = points[0].y;
points[2].x = (points[0].x + (PM_SIZE + 2) / 2);
points[2].y = y + 2 * (PM_SIZE + 2) / 3;
}
else
{
points[0].x = x + ((PM_SIZE + 2) / 6 + 2);
points[0].y = y - 1;
points[1].x = points[0].x;
points[1].y = points[0].y + (PM_SIZE + 2);
points[2].x = (points[0].x +
(2 * (PM_SIZE + 2) / 3 - 1));
points[2].y = points[0].y + (PM_SIZE + 2) / 2;
}
if ( flags & wxCONTROL_CURRENT )
gdk_draw_polygon( pizza->bin_window, style->fg_gc[GTK_STATE_PRELIGHT], TRUE, points, 3);
else
gdk_draw_polygon( pizza->bin_window, style->base_gc[GTK_STATE_NORMAL], TRUE, points, 3);
gdk_draw_polygon( pizza->bin_window, style->fg_gc[GTK_STATE_NORMAL], FALSE, points, 3 );
#else
// this draws the GTK+ 2.2.3 tree item square
gdk_draw_rectangle( pizza->bin_window,
style->base_gc[GTK_STATE_NORMAL], TRUE,
x, y, PM_SIZE, PM_SIZE);
gdk_draw_rectangle( pizza->bin_window,
style->fg_gc[GTK_STATE_NORMAL], FALSE,
x, y, PM_SIZE, PM_SIZE);
gdk_draw_line( pizza->bin_window, style->fg_gc[GTK_STATE_NORMAL],
x + 2, y + PM_SIZE / 2, x + PM_SIZE - 2, y + PM_SIZE / 2);
if ( flags & wxCONTROL_EXPANDED )
{
gdk_draw_line( pizza->bin_window, style->fg_gc[GTK_STATE_NORMAL],
x + PM_SIZE / 2, y + 2,
x + PM_SIZE / 2, y + PM_SIZE - 2);
}
#endif
#else
dc.SetBrush(wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT), dc.SetBrush(wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT),
wxSOLID)); wxSOLID));
dc.SetPen(*wxBLACK_PEN); dc.SetPen(*wxBLACK_PEN);
@@ -163,6 +224,7 @@ wxRendererGTK::DrawTreeItemButton(wxWindow* WXUNUSED(win),
} }
dc.DrawPolygon(3, button); dc.DrawPolygon(3, button);
#endif
} }
#endif // GTK 2.0 #endif // GTK 2.0

View File

@@ -132,9 +132,70 @@ wxRendererGTK::DrawHeaderButton(wxWindow *win,
// //
// TODO: isn't there a GTK function to draw it? // TODO: isn't there a GTK function to draw it?
void void
wxRendererGTK::DrawTreeItemButton(wxWindow* WXUNUSED(win), wxRendererGTK::DrawTreeItemButton(wxWindow* win,
wxDC& dc, const wxRect& rect, int flags) wxDC& dc, const wxRect& rect, int flags)
{ {
#if 1
#define PM_SIZE 8
GtkPizza *pizza = GTK_PIZZA( win->m_wxwindow );
GtkStyle *style = win->m_widget->style;
int x = rect.x;
int y = rect.y;
#if 1
// This draws the GTK+ 2.2.4 triangle
x--;
GdkPoint points[3];
if ( flags & wxCONTROL_EXPANDED )
{
points[0].x = x;
points[0].y = y + (PM_SIZE + 2) / 6;
points[1].x = points[0].x + (PM_SIZE + 2);
points[1].y = points[0].y;
points[2].x = (points[0].x + (PM_SIZE + 2) / 2);
points[2].y = y + 2 * (PM_SIZE + 2) / 3;
}
else
{
points[0].x = x + ((PM_SIZE + 2) / 6 + 2);
points[0].y = y - 1;
points[1].x = points[0].x;
points[1].y = points[0].y + (PM_SIZE + 2);
points[2].x = (points[0].x +
(2 * (PM_SIZE + 2) / 3 - 1));
points[2].y = points[0].y + (PM_SIZE + 2) / 2;
}
if ( flags & wxCONTROL_CURRENT )
gdk_draw_polygon( pizza->bin_window, style->fg_gc[GTK_STATE_PRELIGHT], TRUE, points, 3);
else
gdk_draw_polygon( pizza->bin_window, style->base_gc[GTK_STATE_NORMAL], TRUE, points, 3);
gdk_draw_polygon( pizza->bin_window, style->fg_gc[GTK_STATE_NORMAL], FALSE, points, 3 );
#else
// this draws the GTK+ 2.2.3 tree item square
gdk_draw_rectangle( pizza->bin_window,
style->base_gc[GTK_STATE_NORMAL], TRUE,
x, y, PM_SIZE, PM_SIZE);
gdk_draw_rectangle( pizza->bin_window,
style->fg_gc[GTK_STATE_NORMAL], FALSE,
x, y, PM_SIZE, PM_SIZE);
gdk_draw_line( pizza->bin_window, style->fg_gc[GTK_STATE_NORMAL],
x + 2, y + PM_SIZE / 2, x + PM_SIZE - 2, y + PM_SIZE / 2);
if ( flags & wxCONTROL_EXPANDED )
{
gdk_draw_line( pizza->bin_window, style->fg_gc[GTK_STATE_NORMAL],
x + PM_SIZE / 2, y + 2,
x + PM_SIZE / 2, y + PM_SIZE - 2);
}
#endif
#else
dc.SetBrush(wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT), dc.SetBrush(wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT),
wxSOLID)); wxSOLID));
dc.SetPen(*wxBLACK_PEN); dc.SetPen(*wxBLACK_PEN);
@@ -163,6 +224,7 @@ wxRendererGTK::DrawTreeItemButton(wxWindow* WXUNUSED(win),
} }
dc.DrawPolygon(3, button); dc.DrawPolygon(3, button);
#endif
} }
#endif // GTK 2.0 #endif // GTK 2.0