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:
@@ -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;
|
||||||
|
@@ -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 )
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user