X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/501d97d4fe75b1919113cebc831c9a06fe356412..9c112555198f51fcec71106530cddba95a17f3dc:/contrib/src/gizmos/ledctrl.cpp diff --git a/contrib/src/gizmos/ledctrl.cpp b/contrib/src/gizmos/ledctrl.cpp index c33d38e7ab..6d946378b7 100644 --- a/contrib/src/gizmos/ledctrl.cpp +++ b/contrib/src/gizmos/ledctrl.cpp @@ -41,6 +41,7 @@ const int LINE4 = 8; const int LINE5 = 16; const int LINE6 = 32; const int LINE7 = 64; +const int DECIMALSIGN = 128; const int DIGIT0 = LINE1 | LINE2 | LINE3 | LINE4 | LINE5 | LINE6; const int DIGIT1 = LINE2 | LINE3; @@ -66,7 +67,7 @@ wxLEDNumberCtrl::wxLEDNumberCtrl() m_DigitMargin(-1), m_LineLength(-1), m_LineWidth(-1), - m_DrawFaded(FALSE), + m_DrawFaded(false), m_LeftStartPos(-1) { } @@ -80,7 +81,7 @@ wxLEDNumberCtrl::wxLEDNumberCtrl(wxWindow *parent, wxWindowID id, m_DigitMargin(-1), m_LineLength(-1), m_LineWidth(-1), - m_DrawFaded(FALSE), + m_DrawFaded(false), m_LeftStartPos(-1) { Create(parent, id, pos, size, style); @@ -94,7 +95,7 @@ bool wxLEDNumberCtrl::Create(wxWindow *parent, wxWindowID id, bool RetVal = wxControl::Create(parent, id, pos, size, style); if ((style & wxLED_DRAW_FADED) != 0) - SetDrawFaded(TRUE); + SetDrawFaded(true); if ((style & wxLED_ALIGN_MASK) != 0) SetAlignment((wxLEDValueAlign)(style & wxLED_ALIGN_MASK)); @@ -113,7 +114,7 @@ void wxLEDNumberCtrl::SetAlignment(wxLEDValueAlign Alignment, bool Redraw) RecalcInternals(GetClientSize()); if (Redraw) - Refresh(FALSE); + Refresh(false); } } @@ -125,7 +126,7 @@ void wxLEDNumberCtrl::SetDrawFaded(bool DrawFaded, bool Redraw) m_DrawFaded = DrawFaded; if (Redraw) - Refresh(FALSE); + Refresh(false); } } @@ -134,20 +135,22 @@ void wxLEDNumberCtrl::SetValue(wxString const &Value, bool Redraw) { if (Value != m_Value) { - if (!Value.IsEmpty()) +#ifdef __WXDEBUG__ + if (!Value.empty()) { for(size_t i=0; i='0' && ch<='9') || ch=='-' || ch==' ', + wxASSERT_MSG((ch>='0' && ch<='9') || ch=='-' || ch==' ' || ch=='.', wxT("wxLEDNumberCtrl can only display numeric string values.")); } } +#endif m_Value = Value; RecalcInternals(GetClientSize()); if (Redraw) - Refresh(FALSE); + Refresh(false); } } @@ -159,12 +162,12 @@ BEGIN_EVENT_TABLE(wxLEDNumberCtrl, wxControl) END_EVENT_TABLE() -void wxLEDNumberCtrl::OnEraseBackground(wxEraseEvent &Event) +void wxLEDNumberCtrl::OnEraseBackground(wxEraseEvent &WXUNUSED(event)) { } -void wxLEDNumberCtrl::OnPaint(wxPaintEvent &Event) +void wxLEDNumberCtrl::OnPaint(wxPaintEvent &WXUNUSED(event)) { wxPaintDC Dc(this); @@ -184,49 +187,56 @@ void wxLEDNumberCtrl::OnPaint(wxPaintEvent &Event) // Iterate each digit in the value, and draw. const int DigitCount = m_Value.Len(); - for (int i = 0; i < DigitCount; ++i) + for (int offset=0, i = 0; offset < DigitCount; ++offset, ++i) { + wxChar c = m_Value.GetChar(offset); + // Draw faded lines if wanted. - if (m_DrawFaded) + if (m_DrawFaded && (c != _T('.'))) DrawDigit(MemDc, DIGITALL, i); // Draw the digits. - switch (m_Value[i]) + switch (c) { - case '0' : + case _T('0') : DrawDigit(MemDc, DIGIT0, i); break; - case '1' : + case _T('1') : DrawDigit(MemDc, DIGIT1, i); break; - case '2' : + case _T('2') : DrawDigit(MemDc, DIGIT2, i); break; - case '3' : + case _T('3') : DrawDigit(MemDc, DIGIT3, i); break; - case '4' : + case _T('4') : DrawDigit(MemDc, DIGIT4, i); break; - case '5' : + case _T('5') : DrawDigit(MemDc, DIGIT5, i); break; - case '6' : + case _T('6') : DrawDigit(MemDc, DIGIT6, i); break; - case '7' : + case _T('7') : DrawDigit(MemDc, DIGIT7, i); break; - case '8' : + case _T('8') : DrawDigit(MemDc, DIGIT8, i); break; - case '9' : + case _T('9') : DrawDigit(MemDc, DIGIT9, i); break; - case '-' : + case _T('-') : DrawDigit(MemDc, DASH, i); break; - case ' ' : + case _T('.') : + // Display the decimal in the previous segment + i--; + DrawDigit(MemDc, DECIMALSIGN, i); + break; + case _T(' ') : // just skip it break; default : @@ -249,17 +259,14 @@ void wxLEDNumberCtrl::DrawDigit(wxDC &Dc, int Digit, int Column) if (Digit == DIGITALL) { - const int R = LineColor.Red() / 3; - const int G = LineColor.Green() / 3; - const int B = LineColor.Blue() / 3; + const unsigned char R = (unsigned char)(LineColor.Red() / 16); + const unsigned char G = (unsigned char)(LineColor.Green() / 16); + const unsigned char B = (unsigned char)(LineColor.Blue() / 16); LineColor.Set(R, G, B); } - int XPos = m_LeftStartPos; - - if (Column > 0) - XPos += (Column * m_LineLength) + (m_DigitMargin) * Column; + int XPos = m_LeftStartPos + Column * (m_LineLength + m_DigitMargin); // Create a pen and draw the lines. wxPen Pen(LineColor, m_LineWidth, wxSOLID); @@ -268,31 +275,31 @@ void wxLEDNumberCtrl::DrawDigit(wxDC &Dc, int Digit, int Column) if ((Digit & LINE1)) { Dc.DrawLine(XPos + m_LineMargin*2, m_LineMargin, - XPos + m_LineLength, m_LineMargin); - } + XPos + m_LineLength + m_LineMargin*2, m_LineMargin); + } if (Digit & LINE2) { - Dc.DrawLine(XPos + m_LineLength + m_LineMargin, m_LineMargin*2, - XPos + m_LineLength + m_LineMargin, m_LineLength + (m_LineMargin*2)); + Dc.DrawLine(XPos + m_LineLength + m_LineMargin*3, m_LineMargin*2, + XPos + m_LineLength + m_LineMargin*3, m_LineLength + (m_LineMargin*2)); } if (Digit & LINE3) { - Dc.DrawLine(XPos + m_LineLength + m_LineMargin, m_LineLength + (m_LineMargin*4), - XPos + m_LineLength + m_LineMargin, m_LineLength*2 + (m_LineMargin*3)); + Dc.DrawLine(XPos + m_LineLength + m_LineMargin*3, m_LineLength + (m_LineMargin*4), + XPos + m_LineLength + m_LineMargin*3, m_LineLength*2 + (m_LineMargin*4)); } if (Digit & LINE4) { - Dc.DrawLine(XPos + m_LineMargin*2, m_LineLength*2 + (m_LineMargin*4), - XPos + m_LineLength, m_LineLength*2 + (m_LineMargin*4)); + Dc.DrawLine(XPos + m_LineMargin*2, m_LineLength*2 + (m_LineMargin*5), + XPos + m_LineLength + m_LineMargin*2, m_LineLength*2 + (m_LineMargin*5)); } if (Digit & LINE5) { Dc.DrawLine(XPos + m_LineMargin, m_LineLength + (m_LineMargin*4), - XPos + m_LineMargin, m_LineLength*2 + (m_LineMargin*3)); + XPos + m_LineMargin, m_LineLength*2 + (m_LineMargin*4)); } if (Digit & LINE6) @@ -304,7 +311,13 @@ void wxLEDNumberCtrl::DrawDigit(wxDC &Dc, int Digit, int Column) if (Digit & LINE7) { Dc.DrawLine(XPos + m_LineMargin*2, m_LineLength + (m_LineMargin*3), - XPos + m_LineMargin + m_LineLength - m_LineMargin, m_LineLength + (m_LineMargin*3)); + XPos + m_LineMargin*2 + m_LineLength, m_LineLength + (m_LineMargin*3)); + } + + if (Digit & DECIMALSIGN) + { + Dc.DrawLine(XPos + m_LineLength + m_LineMargin*4, m_LineLength*2 + (m_LineMargin*5), + XPos + m_LineLength + m_LineMargin*4, m_LineLength*2 + (m_LineMargin*5)); } Dc.SetPen(wxNullPen); @@ -313,32 +326,60 @@ void wxLEDNumberCtrl::DrawDigit(wxDC &Dc, int Digit, int Column) void wxLEDNumberCtrl::RecalcInternals(const wxSize &CurrentSize) { + // Dimensions of LED segments + // + // Size of character is based on the HEIGH of the widget, NOT the width. + // Segment height is calculated as follows: + // Each segment is m_LineLength pixels long. + // There is m_LineMargin pixels at the top and bottom of each line segment + // There is m_LineMargin pixels at the top and bottom of each digit + // + // Therefore, the heigth of each character is: + // m_LineMargin : Top digit boarder + // m_LineMargin+m_LineLength+m_LineMargin : Top half of segment + // m_LineMargin+m_LineLength+m_LineMargin : Bottom half of segment + // m_LineMargin : Bottom digit boarder + // ---------------------- + // m_LineMargin*6 + m_LineLength*2 == Total height of digit. + // Therefore, (m_LineMargin*6 + m_LineLength*2) must equal Height + // + // Spacing between characters can then be calculated as follows: + // m_LineMargin : before the digit, + // m_LineMargin+m_LineLength+m_LineMargin : for the digit width + // m_LineMargin : after the digit + // = m_LineMargin*4 + m_LineLength const int Height = CurrentSize.GetHeight(); - if ((Height * 0.07) < 1) + if ((Height * 0.075) < 1) m_LineMargin = 1; else - m_LineMargin = Height * 0.07; + m_LineMargin = (int)(Height * 0.075); - if ((Height * 0.35) < 1) + if ((Height * 0.275) < 1) m_LineLength = 1; else - m_LineLength = Height * 0.35; + m_LineLength = (int)(Height * 0.275); m_LineWidth = m_LineMargin; m_DigitMargin = m_LineMargin * 4; - const int ValueWidth = (m_LineLength + m_DigitMargin) * m_Value.Len(); + // Count the number of characters in the string; '.' characters are not + // included because they do not take up space in the display + int count = 0; + for (unsigned int i = 0; i < m_Value.Len(); i++) + if (m_Value.GetChar(i) != '.') + count++; + const int ValueWidth = (m_LineLength + m_DigitMargin) * count; const int ClientWidth = CurrentSize.GetWidth(); switch (m_Alignment) { case wxLED_ALIGN_LEFT : - m_LeftStartPos = 0; + m_LeftStartPos = m_LineMargin; break; case wxLED_ALIGN_RIGHT : - m_LeftStartPos = ClientWidth - ValueWidth; + m_LeftStartPos = ClientWidth - ValueWidth - m_LineMargin; break; case wxLED_ALIGN_CENTER : m_LeftStartPos = (ClientWidth - ValueWidth) / 2;