Allow using wxRendererNative::DrawGauge() for vertical gauges too
It was unexpected that this method could only be used for horizontal gauges, so make it work for the vertical ones if wxCONTROL_SPECIAL flag is specified. Update MSW and generic implementations and the render sample to show a vertical gauge as well.
This commit is contained in:
@@ -180,6 +180,7 @@ All (GUI):
|
|||||||
- Add "hint" property to wxSearchCtrl XRC handler.
|
- Add "hint" property to wxSearchCtrl XRC handler.
|
||||||
- Add wxEVT_SEARCH[_CANCEL] synonyms for wxSearchCtrl events.
|
- Add wxEVT_SEARCH[_CANCEL] synonyms for wxSearchCtrl events.
|
||||||
- Generate wxEVT_SEARCH on Enter under all platforms.
|
- Generate wxEVT_SEARCH on Enter under all platforms.
|
||||||
|
- Extend wxRendererNative::DrawGauge() to work for vertical gauges too.
|
||||||
|
|
||||||
wxGTK:
|
wxGTK:
|
||||||
|
|
||||||
|
@@ -333,7 +333,9 @@ public:
|
|||||||
int flags = 0) = 0;
|
int flags = 0) = 0;
|
||||||
#endif // wxHAS_DRAW_TITLE_BAR_BITMAP
|
#endif // wxHAS_DRAW_TITLE_BAR_BITMAP
|
||||||
|
|
||||||
// Draw a gauge with native style like a wxGauge would display
|
// Draw a gauge with native style like a wxGauge would display.
|
||||||
|
//
|
||||||
|
// wxCONTROL_SPECIAL flag must be used for drawing vertical gauges.
|
||||||
virtual void DrawGauge(wxWindow* win,
|
virtual void DrawGauge(wxWindow* win,
|
||||||
wxDC& dc,
|
wxDC& dc,
|
||||||
const wxRect& rect,
|
const wxRect& rect,
|
||||||
|
@@ -359,6 +359,8 @@ public:
|
|||||||
bar that is drawn as being filled in, @a max must be strictly positive
|
bar that is drawn as being filled in, @a max must be strictly positive
|
||||||
and @a value must be between 0 and @a max.
|
and @a value must be between 0 and @a max.
|
||||||
|
|
||||||
|
@c wxCONTROL_SPECIAL must be set in @a flags for the vertical gauges.
|
||||||
|
|
||||||
@since 3.1.0
|
@since 3.1.0
|
||||||
*/
|
*/
|
||||||
virtual void DrawGauge(wxWindow* win,
|
virtual void DrawGauge(wxWindow* win,
|
||||||
|
@@ -284,12 +284,17 @@ private:
|
|||||||
y += lineHeight + rBtn.height;
|
y += lineHeight + rBtn.height;
|
||||||
#endif // wxHAS_DRAW_TITLE_BAR_BITMAP
|
#endif // wxHAS_DRAW_TITLE_BAR_BITMAP
|
||||||
|
|
||||||
|
// The meanings of those are reversed for the vertical gauge below.
|
||||||
const wxCoord heightGauge = 24;
|
const wxCoord heightGauge = 24;
|
||||||
const wxCoord widthGauge = 180;
|
const wxCoord widthGauge = 180;
|
||||||
|
|
||||||
dc.DrawText("DrawGauge()", x1, y);
|
dc.DrawText("DrawGauge()", x1, y);
|
||||||
renderer.DrawGauge(this, dc,
|
renderer.DrawGauge(this, dc,
|
||||||
wxRect(x2, y, widthGauge, heightGauge), 25, 100, m_flags);
|
wxRect(x2, y, widthGauge, heightGauge), 25, 100, m_flags);
|
||||||
|
renderer.DrawGauge(this, dc,
|
||||||
|
wxRect(x2 + widthGauge + 30, y + heightGauge - widthGauge,
|
||||||
|
heightGauge, widthGauge),
|
||||||
|
25, 100, m_flags | wxCONTROL_SPECIAL);
|
||||||
|
|
||||||
y += lineHeight + heightGauge;
|
y += lineHeight + heightGauge;
|
||||||
|
|
||||||
|
@@ -910,7 +910,7 @@ void wxRendererGeneric::DrawGauge(wxWindow* win,
|
|||||||
const wxRect& rect,
|
const wxRect& rect,
|
||||||
int value,
|
int value,
|
||||||
int max,
|
int max,
|
||||||
int WXUNUSED(flags))
|
int flags)
|
||||||
{
|
{
|
||||||
// Use same background as text controls.
|
// Use same background as text controls.
|
||||||
DrawTextCtrl(win, dc, rect);
|
DrawTextCtrl(win, dc, rect);
|
||||||
@@ -918,7 +918,16 @@ void wxRendererGeneric::DrawGauge(wxWindow* win,
|
|||||||
// Calculate the progress bar size.
|
// Calculate the progress bar size.
|
||||||
wxRect progRect(rect);
|
wxRect progRect(rect);
|
||||||
progRect.Deflate(2);
|
progRect.Deflate(2);
|
||||||
progRect.width = wxMulDivInt32(progRect.width, value, max);
|
if ( flags & wxCONTROL_SPECIAL )
|
||||||
|
{
|
||||||
|
const int h = wxMulDivInt32(progRect.height, value, max);
|
||||||
|
progRect.y += progRect.height - h;
|
||||||
|
progRect.height = h;
|
||||||
|
}
|
||||||
|
else // Horizontal.
|
||||||
|
{
|
||||||
|
progRect.width = wxMulDivInt32(progRect.width, value, max);
|
||||||
|
}
|
||||||
|
|
||||||
dc.SetBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT));
|
dc.SetBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT));
|
||||||
dc.SetPen(*wxTRANSPARENT_PEN);
|
dc.SetPen(*wxTRANSPARENT_PEN);
|
||||||
|
@@ -1098,7 +1098,7 @@ void wxRendererXP::DrawGauge(wxWindow* win,
|
|||||||
::DrawThemeBackground(
|
::DrawThemeBackground(
|
||||||
hTheme,
|
hTheme,
|
||||||
GetHdcOf(dc.GetTempHDC()),
|
GetHdcOf(dc.GetTempHDC()),
|
||||||
PP_BAR,
|
flags & wxCONTROL_SPECIAL ? PP_BARVERT : PP_BAR,
|
||||||
0,
|
0,
|
||||||
&r,
|
&r,
|
||||||
NULL);
|
NULL);
|
||||||
@@ -1107,20 +1107,31 @@ void wxRendererXP::DrawGauge(wxWindow* win,
|
|||||||
::GetThemeBackgroundContentRect(
|
::GetThemeBackgroundContentRect(
|
||||||
hTheme,
|
hTheme,
|
||||||
GetHdcOf(dc.GetTempHDC()),
|
GetHdcOf(dc.GetTempHDC()),
|
||||||
PP_BAR,
|
flags & wxCONTROL_SPECIAL ? PP_BARVERT : PP_BAR,
|
||||||
0,
|
0,
|
||||||
&r,
|
&r,
|
||||||
&contentRect);
|
&contentRect);
|
||||||
|
|
||||||
contentRect.right = contentRect.left +
|
if ( flags & wxCONTROL_SPECIAL )
|
||||||
|
{
|
||||||
|
// For a vertical gauge, the value grows from the bottom to the top.
|
||||||
|
contentRect.top = contentRect.bottom -
|
||||||
|
wxMulDivInt32(contentRect.bottom - contentRect.top,
|
||||||
|
value,
|
||||||
|
max);
|
||||||
|
}
|
||||||
|
else // Horizontal.
|
||||||
|
{
|
||||||
|
contentRect.right = contentRect.left +
|
||||||
wxMulDivInt32(contentRect.right - contentRect.left,
|
wxMulDivInt32(contentRect.right - contentRect.left,
|
||||||
value,
|
value,
|
||||||
max);
|
max);
|
||||||
|
}
|
||||||
|
|
||||||
::DrawThemeBackground(
|
::DrawThemeBackground(
|
||||||
hTheme,
|
hTheme,
|
||||||
GetHdcOf(dc.GetTempHDC()),
|
GetHdcOf(dc.GetTempHDC()),
|
||||||
PP_CHUNK,
|
flags & wxCONTROL_SPECIAL ? PP_CHUNKVERT : PP_CHUNK,
|
||||||
0,
|
0,
|
||||||
&contentRect,
|
&contentRect,
|
||||||
NULL);
|
NULL);
|
||||||
|
Reference in New Issue
Block a user