diff options
Diffstat (limited to 'tqtinterface/qt4/src/widgets/tqlcdnumber.cpp')
-rw-r--r-- | tqtinterface/qt4/src/widgets/tqlcdnumber.cpp | 1170 |
1 files changed, 0 insertions, 1170 deletions
diff --git a/tqtinterface/qt4/src/widgets/tqlcdnumber.cpp b/tqtinterface/qt4/src/widgets/tqlcdnumber.cpp deleted file mode 100644 index 56d69b0..0000000 --- a/tqtinterface/qt4/src/widgets/tqlcdnumber.cpp +++ /dev/null @@ -1,1170 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQLCDNumber class -** -** Created : 940518 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the widgets module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqlcdnumber.h" -#ifndef TQT_NO_LCDNUMBER -#include "tqbitarray.h" -#include "tqpainter.h" - - -/*! - \class TQLCDNumber tqlcdnumber.h - - \brief The TQLCDNumber widget displays a number with LCD-like digits. - - \ingroup basic - \mainclass - - It can display a number in just about any size. It can display - decimal, hexadecimal, octal or binary numbers. It is easy to - connect to data sources using the display() slot, which is - overloaded to take any of five argument types. - - There are also Q_SLOTS to change the base with setMode() and the - decimal point with setSmallDecimalPoint(). - - TQLCDNumber emits the overflow() signal when it is asked to display - something beyond its range. The range is set by setNumDigits(), - but setSmallDecimalPoint() also influences it. If the display is - set to hexadecimal, octal or binary, the integer equivalent of the - value is displayed. - - These digits and other symbols can be shown: 0/O, 1, 2, 3, 4, 5/S, - 6, 7, 8, 9/g, minus, decimal point, A, B, C, D, E, F, h, H, L, o, - P, r, u, U, Y, colon, degree sign (which is specified as single - quote in the string) and space. TQLCDNumber substitutes spaces for - illegal characters. - - It is not possible to retrieve the contents of a TQLCDNumber - object, although you can retrieve the numeric value with value(). - If you really need the text, we recommend that you connect the - Q_SIGNALS that feed the display() slot to another slot as well and - store the value there. - - Incidentally, TQLCDNumber is the very oldest part of TQt, tracing - back to a BASIC program on the \link - http://www.nvg.ntnu.no/sinclair/computers/zxspectrum/zxspectrum.htm - Sinclair Spectrum\endlink. - - <img src=qlcdnum-m.png> <img src=qlcdnum-w.png> - - \sa TQLabel, TQFrame -*/ - -/*! - \enum TQLCDNumber::Mode - - This type determines how numbers are shown. - - \value Hex Hexadecimal - \value Dec Decimal - \value Oct Octal - \value Bin Binary - - If the display is set to hexadecimal, octal or binary, the integer - equivalent of the value is displayed. -*/ - -/*! - \enum TQLCDNumber::SegmentStyle - - This type determines the visual appearance of the TQLCDNumber - widget. - - \value Outline gives raised segments filled with the background brush. - \value Filled gives raised segments filled with the foreground brush. - \value Flat gives flat segments filled with the foreground brush. -*/ - - - -/*! - \fn void TQLCDNumber::overflow() - - This signal is emitted whenever the TQLCDNumber is asked to display - a too-large number or a too-long string. - - It is never emitted by setNumDigits(). -*/ - - -static TQString int2string( int num, int base, int ndigits, bool *oflow ) -{ - TQString s; - bool negative; - if ( num < 0 ) { - negative = TRUE; - num = -num; - } else { - negative = FALSE; - } - switch( base ) { - case TQLCDNumber::HEX: - s.sprintf( "%*x", ndigits, num ); - break; - case TQLCDNumber::DEC: - s.sprintf( "%*i", ndigits, num ); - break; - case TQLCDNumber::OCT: - s.sprintf( "%*o", ndigits, num ); - break; - case TQLCDNumber::BIN: - { - char buf[42]; - char *p = &buf[41]; - uint n = num; - int len = 0; - *p = '\0'; - do { - *--p = (char)((n&1)+'0'); - n >>= 1; - len++; - } while ( n != 0 ); - len = ndigits - len; - if ( len > 0 ) - s.fill( ' ', len ); - s += TQString::tqfromLatin1(p); - } - break; - } - if ( negative ) { - for ( int i=0; i<(int)s.length(); i++ ) { - if ( s[i] != ' ' ) { - if ( i != 0 ) { - s[i-1] = '-'; - } else { - s.insert( 0, '-' ); - } - break; - } - } - } - if ( oflow ) - *oflow = (int)s.length() > ndigits; - return s; -} - - -static TQString double2string( double num, int base, int ndigits, bool *oflow ) -{ - TQString s; - if ( base != TQLCDNumber::DEC ) { - bool of = num >= 2147483648.0 || num < -2147483648.0; - if ( of ) { // oops, integer overflow - if ( oflow ) - *oflow = TRUE; - return s; - } - s = int2string( (int)num, base, ndigits, 0 ); - } else { // decimal base - int nd = ndigits; - do { - s.sprintf( "%*.*g", ndigits, nd, num ); - int i = s.find('e'); - if ( i > 0 && s[i+1]=='+' ) { - s[i] = ' '; - s[i+1] = 'e'; - } - } while (nd-- && (int)s.length() > ndigits); - } - if ( oflow ) - *oflow = (int)s.length() > ndigits; - return s; -} - - -static const char *getSegments( char ch ) // gets list of segments for ch -{ - static const char segments[30][8] = - { { 0, 1, 2, 4, 5, 6,99, 0}, // 0 0 / O - { 2, 5,99, 0, 0, 0, 0, 0}, // 1 1 - { 0, 2, 3, 4, 6,99, 0, 0}, // 2 2 - { 0, 2, 3, 5, 6,99, 0, 0}, // 3 3 - { 1, 2, 3, 5,99, 0, 0, 0}, // 4 4 - { 0, 1, 3, 5, 6,99, 0, 0}, // 5 5 / S - { 0, 1, 3, 4, 5, 6,99, 0}, // 6 6 - { 0, 2, 5,99, 0, 0, 0, 0}, // 7 7 - { 0, 1, 2, 3, 4, 5, 6,99}, // 8 8 - { 0, 1, 2, 3, 5, 6,99, 0}, // 9 9 / g - { 3,99, 0, 0, 0, 0, 0, 0}, // 10 - - { 7,99, 0, 0, 0, 0, 0, 0}, // 11 . - { 0, 1, 2, 3, 4, 5,99, 0}, // 12 A - { 1, 3, 4, 5, 6,99, 0, 0}, // 13 B - { 0, 1, 4, 6,99, 0, 0, 0}, // 14 C - { 2, 3, 4, 5, 6,99, 0, 0}, // 15 D - { 0, 1, 3, 4, 6,99, 0, 0}, // 16 E - { 0, 1, 3, 4,99, 0, 0, 0}, // 17 F - { 1, 3, 4, 5,99, 0, 0, 0}, // 18 h - { 1, 2, 3, 4, 5,99, 0, 0}, // 19 H - { 1, 4, 6,99, 0, 0, 0, 0}, // 20 L - { 3, 4, 5, 6,99, 0, 0, 0}, // 21 o - { 0, 1, 2, 3, 4,99, 0, 0}, // 22 P - { 3, 4,99, 0, 0, 0, 0, 0}, // 23 r - { 4, 5, 6,99, 0, 0, 0, 0}, // 24 u - { 1, 2, 4, 5, 6,99, 0, 0}, // 25 U - { 1, 2, 3, 5, 6,99, 0, 0}, // 26 Y - { 8, 9,99, 0, 0, 0, 0, 0}, // 27 : - { 0, 1, 2, 3,99, 0, 0, 0}, // 28 ' - {99, 0, 0, 0, 0, 0, 0, 0} }; // 29 empty - - if (ch >= '0' && ch <= '9') - return segments[ch - '0']; - if (ch >= 'A' && ch <= 'F') - return segments[ch - 'A' + 12]; - if (ch >= 'a' && ch <= 'f') - return segments[ch - 'a' + 12]; - - int n; - switch ( ch ) { - case '-': - n = 10; break; - case 'O': - n = 0; break; - case 'g': - n = 9; break; - case '.': - n = 11; break; - case 'h': - n = 18; break; - case 'H': - n = 19; break; - case 'l': - case 'L': - n = 20; break; - case 'o': - n = 21; break; - case 'p': - case 'P': - n = 22; break; - case 'r': - case 'R': - n = 23; break; - case 's': - case 'S': - n = 5; break; - case 'u': - n = 24; break; - case 'U': - n = 25; break; - case 'y': - case 'Y': - n = 26; break; - case ':': - n = 27; break; - case '\'': - n = 28; break; - default: - n = 29; break; - } - return segments[n]; -} - - -/*! - Constructs an LCD number, sets the number of digits to 5, the base - to decimal, the decimal point mode to 'small' and the frame style - to a raised box. The segmentStyle() is set to \c Outline. - - The \a parent and \a name arguments are passed to the TQFrame - constructor. - - \sa setNumDigits(), setSmallDecimalPoint() -*/ - -TQLCDNumber::TQLCDNumber( TQWidget *parent, const char *name ) - : TQFrame( parent, name ) -{ - ndigits = 5; - init(); -} - - -/*! - Constructs an LCD number, sets the number of digits to \a - numDigits, the base to decimal, the decimal point mode to 'small' - and the frame style to a raised box. The segmentStyle() is set to - \c Outline. - - The \a parent and \a name arguments are passed to the TQFrame - constructor. - - \sa setNumDigits(), setSmallDecimalPoint() -*/ - -TQLCDNumber::TQLCDNumber( uint numDigits, TQWidget *parent, const char *name ) - : TQFrame( parent, name ) -{ - ndigits = numDigits; - init(); -} - -/*! - \internal -*/ - -void TQLCDNumber::init() -{ - setFrameStyle( TQFrame::Box | TQFrame::Raised ); - val = 0; - base = DEC; - smallPoint = FALSE; - setNumDigits( ndigits ); - setSegmentStyle( Outline ); - d = 0; - tqsetSizePolicy( TQSizePolicy( TQSizePolicy::Minimum, TQSizePolicy::Minimum ) ); -} - -/*! - Destroys the LCD number. -*/ - -TQLCDNumber::~TQLCDNumber() -{ -} - - -/*! - \property TQLCDNumber::numDigits - \brief the current number of digits displayed - - Corresponds to the current number of digits. If \l - TQLCDNumber::smallDecimalPoint is FALSE, the decimal point occupies - one digit position. - - \sa numDigits, smallDecimalPoint -*/ - -void TQLCDNumber::setNumDigits( int numDigits ) -{ - if ( numDigits > 99 ) { -#if defined(TQT_CHECK_RANGE) - qWarning( "TQLCDNumber::setNumDigits: (%s) Max 99 digits allowed", - name( "unnamed" ) ); -#endif - numDigits = 99; - } - if (numDigits < 0 ) { -#if defined(TQT_CHECK_RANGE) - qWarning( "TQLCDNumber::setNumDigits: (%s) Min 0 digits allowed", - name( "unnamed" ) ); -#endif - numDigits = 0; - } - if ( digitStr.isNull() ) { // from constructor - ndigits = numDigits; - digitStr.fill( ' ', ndigits ); - points.fill( 0, ndigits ); - digitStr[ndigits - 1] = '0'; // "0" is the default number - } else { - bool doDisplay = ndigits == 0; - if ( numDigits == ndigits ) // no change - return; - register int i; - int dif; - if ( numDigits > ndigits ) { // expand - dif = numDigits - ndigits; - TQString buf; - buf.fill( ' ', dif ); - digitStr.insert( 0, buf ); - points.resize( numDigits ); - for ( i=numDigits-1; i>=dif; i-- ) - points.setBit( i, points.testBit(i-dif) ); - for ( i=0; i<dif; i++ ) - points.clearBit( i ); - } else { // shrink - dif = ndigits - numDigits; - digitStr = digitStr.right( numDigits ); - TQBitArray tmpPoints = points.copy(); - points.resize( numDigits ); - for ( i=0; i<(int)numDigits; i++ ) - points.setBit( i, tmpPoints.testBit(i+dif) ); - } - ndigits = numDigits; - if ( doDisplay ) - display( value() ); - update(); - } -} - - -/*! - \overload - - Returns TRUE if \a num is too big to be displayed in its entirety; - otherwise returns FALSE. - - \sa display(), numDigits(), smallDecimalPoint() -*/ - -bool TQLCDNumber::checkOverflow( int num ) const -{ - bool of; - int2string( num, base, ndigits, &of ); - return of; -} - - -/*! - Returns TRUE if \a num is too big to be displayed in its entirety; - otherwise returns FALSE. - - \sa display(), numDigits(), smallDecimalPoint() -*/ - -bool TQLCDNumber::checkOverflow( double num ) const -{ - bool of; - double2string( num, base, ndigits, &of ); - return of; -} - - -/*! - \property TQLCDNumber::mode - \brief the current display mode (number base) - - Corresponds to the current display mode, which is one of \c BIN, - \c OCT, \c DEC (the default) and \c HEX. \c DEC mode can display - floating point values, the other modes display the integer - equivalent. - - \sa smallDecimalPoint(), setHexMode(), setDecMode(), setOctMode(), setBinMode() -*/ - -TQLCDNumber::Mode TQLCDNumber::mode() const -{ - return (TQLCDNumber::Mode) base; -} - -void TQLCDNumber::setMode( Mode m ) -{ - base = m; - - display( val ); -} - - -/*! - \property TQLCDNumber::value - \brief the displayed value - - This property corresponds to the current value displayed by the - LCDNumber. - - If the displayed value is not a number, the property has a value - of 0. -*/ - -double TQLCDNumber::value() const -{ - return val; -} - -/*! - \overload - - Displays the number \a num. -*/ -void TQLCDNumber::display( double num ) -{ - val = num; - bool of; - TQString s = double2string( num, base, ndigits, &of ); - if ( of ) - emit overflow(); - else - internalSetString( s ); -} - -/*! - \property TQLCDNumber::intValue - \brief the displayed value rounded to the nearest integer - - This property corresponds to the nearest integer to the current - value displayed by the LCDNumber. This is the value used for - hexadecimal, octal and binary modes. - - If the displayed value is not a number, the property has a value - of 0. -*/ -int TQLCDNumber::intValue() const -{ - return (int)(val < 0 ? val - 0.5 : val + 0.5); -} - - -/*! - \overload - - Displays the number \a num. -*/ -void TQLCDNumber::display( int num ) -{ - val = (double)num; - bool of; - TQString s = int2string( num, base, ndigits, &of ); - if ( of ) - emit overflow(); - else - internalSetString( s ); -} - - -/*! - Displays the number represented by the string \a s. - - This version of the function disregards mode() and - smallDecimalPoint(). - - These digits and other symbols can be shown: 0/O, 1, 2, 3, 4, 5/S, - 6, 7, 8, 9/g, minus, decimal point, A, B, C, D, E, F, h, H, L, o, - P, r, u, U, Y, colon, degree sign (which is specified as single - quote in the string) and space. TQLCDNumber substitutes spaces for - illegal characters. -*/ - -void TQLCDNumber::display( const TQString &s ) -{ - val = 0; - bool ok = FALSE; - double v = s.toDouble( &ok ); - if ( ok ) - val = v; - internalSetString( s ); -} - -/*! - Calls setMode( HEX ). Provided for convenience (e.g. for - connecting buttons to it). - - \sa setMode(), setDecMode(), setOctMode(), setBinMode(), mode() -*/ - -void TQLCDNumber::setHexMode() -{ - setMode( HEX ); -} - - -/*! - Calls setMode( DEC ). Provided for convenience (e.g. for - connecting buttons to it). - - \sa setMode(), setHexMode(), setOctMode(), setBinMode(), mode() -*/ - -void TQLCDNumber::setDecMode() -{ - setMode( DEC ); -} - - -/*! - Calls setMode( OCT ). Provided for convenience (e.g. for - connecting buttons to it). - - \sa setMode(), setHexMode(), setDecMode(), setBinMode(), mode() -*/ - -void TQLCDNumber::setOctMode() -{ - setMode( OCT ); -} - - -/*! - Calls setMode( BIN ). Provided for convenience (e.g. for - connecting buttons to it). - - \sa setMode(), setHexMode(), setDecMode(), setOctMode(), mode() -*/ - -void TQLCDNumber::setBinMode() -{ - setMode( BIN ); -} - - -/*! - \property TQLCDNumber::smallDecimalPoint - \brief the style of the decimal point - - If TRUE the decimal point is drawn between two digit positions. - Otherwise it occupies a digit position of its own, i.e. is drawn - in a digit position. The default is FALSE. - - The inter-digit space is made slightly wider when the decimal - point is drawn between the digits. - - \sa mode -*/ - -void TQLCDNumber::setSmallDecimalPoint( bool b ) -{ - smallPoint = b; -} - - -/*! - Draws the LCD number using painter \a p. This function is called - from TQFrame::paintEvent(). -*/ - - -void TQLCDNumber::drawContents( TQPainter *p ) -{ - if ( smallPoint ) - drawString( digitStr, *p, &points, FALSE ); - else - drawString( digitStr, *p, 0, FALSE ); -} - - -/*! - \internal -*/ - -void TQLCDNumber::internalDisplay( const TQString & ) -{ - // Not used anymore -} - -void TQLCDNumber::internalSetString( const TQString& s ) -{ - TQString buffer; - int i; - int len = s.length(); - TQBitArray newPoints(ndigits); - - if ( !smallPoint ) { - if ( len == ndigits ) - buffer = s; - else - buffer = TQT_TQSTRING(s.right( ndigits )).rightJustify( ndigits, ' ' ); - } else { - int index = -1; - bool lastWasPoint = TRUE; - newPoints.clearBit(0); - for ( i=0; i<len; i++ ) { - if ( s[i] == '.' ) { - if ( lastWasPoint ) { // point already set for digit? - if ( index == ndigits - 1 ) // no more digits - break; - index++; - buffer[index] = ' '; // 2 points in a row, add space - } - newPoints.setBit(index); // set decimal point - lastWasPoint = TRUE; - } else { - if ( index == ndigits - 1 ) - break; - index++; - buffer[index] = s[i]; - newPoints.clearBit(index); // decimal point default off - lastWasPoint = FALSE; - } - } - if ( index < ((int) ndigits) - 1 ) { - for( i=index; i>=0; i-- ) { - buffer[ndigits - 1 - index + i] = buffer[i]; - newPoints.setBit( ndigits - 1 - index + i, - newPoints.testBit(i) ); - } - for( i=0; i<ndigits-index-1; i++ ) { - buffer[i] = ' '; - newPoints.clearBit(i); - } - } - } - - if ( buffer == digitStr ) - return; - - if ( backgroundMode() == TQt::FixedPixmap - || TQT_TQBRUSH_OBJECT(tqcolorGroup().brush( TQColorGroup::Background )).pixmap() ) { - digitStr = buffer; - if ( smallPoint ) - points = newPoints; - tqrepaint( contentsRect() ); - } else { - TQPainter p( this ); - if ( !smallPoint ) - drawString( buffer, p ); - else - drawString( buffer, p, &newPoints ); - } -} - -/*! - \internal -*/ - -void TQLCDNumber::drawString( const TQString &s, TQPainter &p, - TQBitArray *newPoints, bool newString ) -{ - TQPoint pos; - - int digitSpace = smallPoint ? 2 : 1; - int xSegLen = width()*5/(ndigits*(5 + digitSpace) + digitSpace); - int ySegLen = height()*5/12; - int segLen = ySegLen > xSegLen ? xSegLen : ySegLen; - int xAdvance = segLen*( 5 + digitSpace )/5; - int xOffset = ( width() - ndigits*xAdvance + segLen/5 )/2; - int yOffset = ( height() - segLen*2 )/2; - - for ( int i=0; i<ndigits; i++ ) { - pos = TQPoint( xOffset + xAdvance*i, yOffset ); - if ( newString ) - drawDigit( pos, p, segLen, s[i], digitStr[i].latin1() ); - else - drawDigit( pos, p, segLen, s[i]); - if ( newPoints ) { - char newPoint = newPoints->testBit(i) ? '.' : ' '; - if ( newString ) { - char oldPoint = points.testBit(i) ? '.' : ' '; - drawDigit( pos, p, segLen, newPoint, oldPoint ); - } else { - drawDigit( pos, p, segLen, newPoint ); - } - } - } - if ( newString ) { - digitStr = s; - if ( (int)digitStr.length() > ndigits ) - digitStr.truncate( ndigits ); - if ( newPoints ) - points = *newPoints; - } -} - - -/*! - \internal -*/ - -void TQLCDNumber::drawDigit( const TQPoint &pos, TQPainter &p, int segLen, - char newCh, char oldCh ) -{ -// Draws and/or erases segments to change display of a single digit -// from oldCh to newCh - - char updates[18][2]; // can hold 2 times number of segments, only - // first 9 used if segment table is correct - int nErases; - int nUpdates; - const char *segs; - int i,j; - - const char erase = 0; - const char draw = 1; - const char leaveAlone = 2; - - segs = getSegments(oldCh); - for ( nErases=0; segs[nErases] != 99; nErases++ ) { - updates[nErases][0] = erase; // get segments to erase to - updates[nErases][1] = segs[nErases]; // remove old char - } - nUpdates = nErases; - segs = getSegments(newCh); - for(i = 0 ; segs[i] != 99 ; i++) { - for ( j=0; j<nErases; j++ ) - if ( segs[i] == updates[j][1] ) { // same segment ? - updates[j][0] = leaveAlone; // yes, already on screen - break; - } - if ( j == nErases ) { // if not already on screen - updates[nUpdates][0] = draw; - updates[nUpdates][1] = segs[i]; - nUpdates++; - } - } - for ( i=0; i<nUpdates; i++ ) { - if ( updates[i][0] == draw ) - drawSegment( pos, updates[i][1], p, segLen ); - if (updates[i][0] == erase) - drawSegment( pos, updates[i][1], p, segLen, TRUE ); - } -} - - -static void addPoint( TQPointArray &a, const TQPoint &p ) -{ - uint n = a.size(); - a.resize( n + 1 ); - a.setPoint( n, p ); -} - -/*! - \internal -*/ - -void TQLCDNumber::drawSegment( const TQPoint &pos, char segmentNo, TQPainter &p, - int segLen, bool erase ) -{ - TQPoint pt = pos; - int width = segLen/5; - - const TQColorGroup & g = tqcolorGroup(); - TQColor lightColor,darkColor,fgColor; - if ( erase ){ - lightColor = backgroundColor(); - darkColor = lightColor; - fgColor = lightColor; - } else { - lightColor = g.light(); - darkColor = g.dark(); - fgColor = g.foreground(); - } - -#define LINETO(X,Y) addPoint( a, TQPoint(pt.x() + (X),pt.y() + (Y))) -#define LIGHT -#define DARK - - if ( fill ) { - TQPointArray a(0); - - //The following is an exact copy of the switch below. - //don't make any changes here - switch ( segmentNo ) { - case 0 : - p.moveTo(pt); - LIGHT; - LINETO(segLen - 1,0); - DARK; - LINETO(segLen - width - 1,width); - LINETO(width,width); - LINETO(0,0); - break; - case 1 : - pt += TQPoint(0 , 1); - p.moveTo(pt); - LIGHT; - LINETO(width,width); - DARK; - LINETO(width,segLen - width/2 - 2); - LINETO(0,segLen - 2); - LIGHT; - LINETO(0,0); - break; - case 2 : - pt += TQPoint(segLen - 1 , 1); - p.moveTo(pt); - DARK; - LINETO(0,segLen - 2); - LINETO(-width,segLen - width/2 - 2); - LIGHT; - LINETO(-width,width); - LINETO(0,0); - break; - case 3 : - pt += TQPoint(0 , segLen); - p.moveTo(pt); - LIGHT; - LINETO(width,-width/2); - LINETO(segLen - width - 1,-width/2); - LINETO(segLen - 1,0); - DARK; - if (width & 1) { // adjust for integer division error - LINETO(segLen - width - 3,width/2 + 1); - LINETO(width + 2,width/2 + 1); - } else { - LINETO(segLen - width - 1,width/2); - LINETO(width,width/2); - } - LINETO(0,0); - break; - case 4 : - pt += TQPoint(0 , segLen + 1); - p.moveTo(pt); - LIGHT; - LINETO(width,width/2); - DARK; - LINETO(width,segLen - width - 2); - LINETO(0,segLen - 2); - LIGHT; - LINETO(0,0); - break; - case 5 : - pt += TQPoint(segLen - 1 , segLen + 1); - p.moveTo(pt); - DARK; - LINETO(0,segLen - 2); - LINETO(-width,segLen - width - 2); - LIGHT; - LINETO(-width,width/2); - LINETO(0,0); - break; - case 6 : - pt += TQPoint(0 , segLen*2); - p.moveTo(pt); - LIGHT; - LINETO(width,-width); - LINETO(segLen - width - 1,-width); - LINETO(segLen - 1,0); - DARK; - LINETO(0,0); - break; - case 7 : - if ( smallPoint ) // if smallpoint place'.' between other digits - pt += TQPoint(segLen + width/2 , segLen*2); - else - pt += TQPoint(segLen/2 , segLen*2); - p.moveTo(pt); - DARK; - LINETO(width,0); - LINETO(width,-width); - LIGHT; - LINETO(0,-width); - LINETO(0,0); - break; - case 8 : - pt += TQPoint(segLen/2 - width/2 + 1 , segLen/2 + width); - p.moveTo(pt); - DARK; - LINETO(width,0); - LINETO(width,-width); - LIGHT; - LINETO(0,-width); - LINETO(0,0); - break; - case 9 : - pt += TQPoint(segLen/2 - width/2 + 1 , 3*segLen/2 + width); - p.moveTo(pt); - DARK; - LINETO(width,0); - LINETO(width,-width); - LIGHT; - LINETO(0,-width); - LINETO(0,0); - break; -#if defined(TQT_CHECK_RANGE) - default : - qWarning( "TQLCDNumber::drawSegment: (%s) Internal error." - " Illegal segment id: %d\n", - name( "unnamed" ), segmentNo ); -#endif - } - // End exact copy - p.setPen( fgColor ); - p.setBrush( fgColor ); - p.drawPolygon( a ); - p.setBrush( Qt::NoBrush ); - - pt = pos; - } -#undef LINETO -#undef LIGHT -#undef DARK - -#define LINETO(X,Y) p.lineTo(TQPoint(pt.x() + (X),pt.y() + (Y))) -#define LIGHT p.setPen(lightColor) -#define DARK p.setPen(darkColor) - if ( shadow ) - switch ( segmentNo ) { - case 0 : - p.moveTo(pt); - LIGHT; - LINETO(segLen - 1,0); - DARK; - LINETO(segLen - width - 1,width); - LINETO(width,width); - LINETO(0,0); - break; - case 1 : - pt += TQPoint(0,1); - p.moveTo(pt); - LIGHT; - LINETO(width,width); - DARK; - LINETO(width,segLen - width/2 - 2); - LINETO(0,segLen - 2); - LIGHT; - LINETO(0,0); - break; - case 2 : - pt += TQPoint(segLen - 1 , 1); - p.moveTo(pt); - DARK; - LINETO(0,segLen - 2); - LINETO(-width,segLen - width/2 - 2); - LIGHT; - LINETO(-width,width); - LINETO(0,0); - break; - case 3 : - pt += TQPoint(0 , segLen); - p.moveTo(pt); - LIGHT; - LINETO(width,-width/2); - LINETO(segLen - width - 1,-width/2); - LINETO(segLen - 1,0); - DARK; - if (width & 1) { // adjust for integer division error - LINETO(segLen - width - 3,width/2 + 1); - LINETO(width + 2,width/2 + 1); - } else { - LINETO(segLen - width - 1,width/2); - LINETO(width,width/2); - } - LINETO(0,0); - break; - case 4 : - pt += TQPoint(0 , segLen + 1); - p.moveTo(pt); - LIGHT; - LINETO(width,width/2); - DARK; - LINETO(width,segLen - width - 2); - LINETO(0,segLen - 2); - LIGHT; - LINETO(0,0); - break; - case 5 : - pt += TQPoint(segLen - 1 , segLen + 1); - p.moveTo(pt); - DARK; - LINETO(0,segLen - 2); - LINETO(-width,segLen - width - 2); - LIGHT; - LINETO(-width,width/2); - LINETO(0,0); - break; - case 6 : - pt += TQPoint(0 , segLen*2); - p.moveTo(pt); - LIGHT; - LINETO(width,-width); - LINETO(segLen - width - 1,-width); - LINETO(segLen - 1,0); - DARK; - LINETO(0,0); - break; - case 7 : - if ( smallPoint ) // if smallpoint place'.' between other digits - pt += TQPoint(segLen + width/2 , segLen*2); - else - pt += TQPoint(segLen/2 , segLen*2); - p.moveTo(pt); - DARK; - LINETO(width,0); - LINETO(width,-width); - LIGHT; - LINETO(0,-width); - LINETO(0,0); - break; - case 8 : - pt += TQPoint(segLen/2 - width/2 + 1 , segLen/2 + width); - p.moveTo(pt); - DARK; - LINETO(width,0); - LINETO(width,-width); - LIGHT; - LINETO(0,-width); - LINETO(0,0); - break; - case 9 : - pt += TQPoint(segLen/2 - width/2 + 1 , 3*segLen/2 + width); - p.moveTo(pt); - DARK; - LINETO(width,0); - LINETO(width,-width); - LIGHT; - LINETO(0,-width); - LINETO(0,0); - break; -#if defined(TQT_CHECK_RANGE) - default : - qWarning( "TQLCDNumber::drawSegment: (%s) Internal error." - " Illegal segment id: %d\n", - name( "unnamed" ), segmentNo ); -#endif - } - -#undef LINETO -#undef LIGHT -#undef DARK -} - - - -/*! - \property TQLCDNumber::segmentStyle - \brief the style of the LCDNumber - - \table - \header \i Style \i Result - \row \i \c Outline - \i Produces raised segments filled with the background color - (this is the default). - \row \i \c Filled - \i Produces raised segments filled with the foreground color. - \row \i \c Flat - \i Produces flat segments filled with the foreground color. - \endtable - - \c Outline and \c Filled will additionally use - TQColorGroup::light() and TQColorGroup::dark() for shadow effects. -*/ -void TQLCDNumber::setSegmentStyle( SegmentStyle s ) -{ - fill = ( s == Flat || s == Filled ); - shadow = ( s == Outline || s == Filled ); - update(); -} - -TQLCDNumber::SegmentStyle TQLCDNumber::segmentStyle() const -{ - TQ_ASSERT( fill || shadow ); - if ( !fill && shadow ) - return Outline; - if ( fill && shadow ) - return Filled; - return Flat; -} - - -/*!\reimp -*/ -TQSize TQLCDNumber::tqsizeHint() const -{ - return TQSize( 10 + 9 * (numDigits() + (smallDecimalPoint() ? 0 : 1)), 23 ); -} - -#endif // TQT_NO_LCDNUMBER |