X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/950e7faf4a09c484409657cf17bae9b90d321475..d8a4b666cf4a596ad76e9ce2a3808624f9f95480:/contrib/src/gizmos/ledctrl.cpp diff --git a/contrib/src/gizmos/ledctrl.cpp b/contrib/src/gizmos/ledctrl.cpp index 5c93feb7fb..458af3f4cc 100644 --- a/contrib/src/gizmos/ledctrl.cpp +++ b/contrib/src/gizmos/ledctrl.cpp @@ -2,10 +2,6 @@ // headers // ============================================================================ -#ifdef __GNUG__ - #pragma implementation "wxLEDNumberCtrl.h" -#endif - #include "wx/wxprec.h" #ifdef __BORLANDC__ @@ -41,6 +37,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 +63,7 @@ wxLEDNumberCtrl::wxLEDNumberCtrl() m_DigitMargin(-1), m_LineLength(-1), m_LineWidth(-1), - m_DrawFaded(FALSE), + m_DrawFaded(false), m_LeftStartPos(-1) { } @@ -80,7 +77,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 +91,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 +110,7 @@ void wxLEDNumberCtrl::SetAlignment(wxLEDValueAlign Alignment, bool Redraw) RecalcInternals(GetClientSize()); if (Redraw) - Refresh(FALSE); + Refresh(false); } } @@ -125,7 +122,7 @@ void wxLEDNumberCtrl::SetDrawFaded(bool DrawFaded, bool Redraw) m_DrawFaded = DrawFaded; if (Redraw) - Refresh(FALSE); + Refresh(false); } } @@ -134,20 +131,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 +158,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); @@ -175,7 +174,6 @@ void wxLEDNumberCtrl::OnPaint(wxPaintEvent &Event) wxMemoryDC MemDc; MemDc.SelectObject(*pMemoryBitmap); - MemDc.BeginDrawing(); // Draw background. MemDc.SetBrush(wxBrush(GetBackgroundColour(), wxSOLID)); @@ -184,59 +182,64 @@ 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 : - wxFAIL_MSG(_("Unknown digit value")); + wxFAIL_MSG(wxT("Unknown digit value")); break; } } - MemDc.EndDrawing(); - // Blit the memory dc to screen. Dc.Blit(0, 0, Width, Height, &MemDc, 0, 0, wxCOPY); delete pMemoryBitmap; @@ -249,17 +252,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 +268,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 +304,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,38 +319,66 @@ 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; break; default : - wxFAIL_MSG(_("Unknown alignent value for wxLEDNumberCtrl.")); + wxFAIL_MSG(wxT("Unknown alignent value for wxLEDNumberCtrl.")); break; } }