From f8247a7685faef95cc9840dcd1cc41c7d3669f8d Mon Sep 17 00:00:00 2001 From: Pritpal Bedi Date: Fri, 3 Sep 2010 02:12:49 +0000 Subject: [PATCH] 2010-09-02 19:11 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com) * contrib/hbide/hbqreportsmanager.prg ! c++ => .prg. --- harbour/ChangeLog | 4 + harbour/contrib/hbide/hbqreportsmanager.prg | 139 +++++++++++++++++++- 2 files changed, 141 insertions(+), 2 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 23d1dc767b..a5f06577cf 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,6 +16,10 @@ The license applies to all entries newer than 2009-04-28. */ +2010-09-02 19:11 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com) + * contrib/hbide/hbqreportsmanager.prg + ! c++ => .prg. + 2010-09-01 18:45 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com) + contrib/hbqt/qtgui/doc/en/class_qdoublevalidator.txt + contrib/hbqt/qtgui/doc/en/class_qintvalidator.txt diff --git a/harbour/contrib/hbide/hbqreportsmanager.prg b/harbour/contrib/hbide/hbqreportsmanager.prg index 84fb897c6f..96b45e01bb 100644 --- a/harbour/contrib/hbide/hbqreportsmanager.prg +++ b/harbour/contrib/hbide/hbqreportsmanager.prg @@ -1368,6 +1368,11 @@ STATIC FUNCTION rmgr_a2arrayStr( aArray ) /*----------------------------------------------------------------------*/ +STATIC FUNCTION rmgr_generateNextColor() + RETURN QColor():new( hb_random( 0,255 ), hb_random( 0,255 ), hb_random( 0,255 ), 255 ) + +/*----------------------------------------------------------------------*/ + STATIC FUNCTION rmgr_keyValuePair( s, cKey, cVal, cDlm ) LOCAL n @@ -1660,16 +1665,16 @@ CLASS HqrGraphicsItem DATA aPos INIT {} DATA aGeometry INIT {} - DATA data INIT NIL + DATA xData INIT NIL METHOD new( oRM, cParent, cType, cName, aPos, aGeometry ) - * METHOD create( oRM, cParent, cType, cName ) METHOD text( ... ) SETGET METHOD pen( ... ) SETGET METHOD brush( ... ) SETGET METHOD bgBrush( ... ) SETGET METHOD draw( ... ) + METHOD drawBarChart( qPainter, qRect ) ENDCLASS @@ -1735,4 +1740,134 @@ METHOD HqrGraphicsItem:draw( ... ) RETURN Self /*----------------------------------------------------------------------*/ +METHOD HqrGraphicsItem:drawBarChart( qPainter, qRect ) + LOCAL qFMetrix, maxpv, minnv, absMaxVal, powVal, chartStep, powStep, maxHeight, valstep, maxLabelWidth, minpv + LOCAL pw, rc, maxval, y, i, x, cv, barWidth, lg, py, f, cMaxVal, nDec + LOCAL m_drawBorder := .t. + LOCAL m_showLabels := .t. + LOCAL m_barsIdentation := 1 + LOCAL m_showGrid := .t. + LOCAL m_toColorFactor := 1.7 + + HB_SYMBOL_UNUSED( qPainter ) + HB_SYMBOL_UNUSED( qRect ) + + qFMetrix := QFontMetrics():from( qPainter:fontMetrics() ) + + IF empty( ::xData ) + ::xData := {} + + aadd( ::xData, { "Bananas", 040.0, rmgr_generateNextColor() } ) + aadd( ::xData, { "Oranges", 150.0, rmgr_generateNextColor() } ) + aadd( ::xData, { "Mangoes", 120.0, rmgr_generateNextColor() } ) + ENDIF + + maxpv := 0 + minnv := 0 + aeval( ::xData, {|e_| iif( e_[ 2 ] < 0, minpv := min( minpv, e_[ 2 ] ), NIL ), iif( e_[ 2 ] < 0, maxpv := max( maxpv, e_[ 2 ] ), NIL ) } ) + + absMaxVal := maxpv - minnv + cMaxVal := hb_ntos( absMaxVal ) + nDec := at( ".", cMaxVal ) + + powVal := iif( absMaxVal < 1, 10.0^( len( substr( cMaxVal, nDec + 1 ) ) + 1 ), 1 ) + maxpv *= powVal + minnv *= powVal + + maxpv := maxpv + minnv := -minnv + minnv := -minnv + + qPainter:fillRect( qRect, ::brush() ) + + IF m_drawBorder + qPainter:drawqRect( qRect ) + ENDIF + + pw := iif( abs( ::pen():widthF() ) > 0, abs( ::pen():widthF() ), 1 ) + rc := QRectF():from( qRect:adjusted( pw / 2, pw / 2, -pw, -pw ) ) + + f := 2 + chartStep := ( 10.0 ^ ( len( substr( cMaxval, 1, nDec - 1 ) ) - 1 ) ) / f + powStep := iif( chartStep < 1, 10, 1 ) + chartStep *= powStep + maxpv *= powStep + minnv *= powStep + powVal *= powStep + + maxpv := maxpv + ( iif( ( maxpv % chartStep ) != 0, ( chartStep - ( maxpv % chartStep ) ), 0 ) ) / powVal + minnv := minnv - ( iif( ( - minnv % chartStep ) != 0, ( chartStep - ( - minnv % chartStep ) ), 0 ) ) / powVal + maxVal := maxpv - minnv + + maxHeight := rc:height() - qFMetrix:height() + valstep := maxHeight / ( maxVal / chartStep ) + + IF ( valstep < qFMetrix:height() ) + chartStep *= ( ( ( qFMetrix:height() / valstep ) ) + 1 ) + valstep := ( ( ( qFMetrix:height() / valstep ) ) + 1 ) * valstep + ENDIF + + IF m_showLabels + maxLabelWidth := 0 + FOR i := 0 TO maxVal / chartStep + 1 + iif( ( maxVal % chartStep ) != 0, 1, 0 ) + IF ( maxLabelWidth < qFMetrix:width( hb_ntos( ( maxVal * i - chartStep * i ) / powVal ) ) ) + maxLabelWidth := qFMetrix:width( hb_ntos( ( maxVal * i - chartStep * i ) / powVal ) ) + ENDIF + NEXT + y := 0 + FOR i := 0 TO maxVal / chartStep + 1 + iif( ( maxVal % chartStep ) != 0, 1, 0 ) + qPainter:drawText( QRectF( rc:x(), rc:y() + y, maxLabelWidth, qFMetrix:height() ), ; + Qt_AlignRight + Qt_AlignVCenter, hb_ntos( ( maxpv - chartStep * i ) / powVal ) ) + y += valstep + NEXT + + qPainter:drawLine( rc:x() + maxLabelWidth + 1 / UNIT / 4, rc:y(), rc:x() + maxLabelWidth + 1 / UNIT / 4, rc:y() + qRect:height() ) + rc := QRectF():from( rc:adjusted( maxLabelWidth + 1 / UNIT / 4, 0, 0, 0 ) ) + ENDIF + + IF ( m_showGrid ) + y := qFMetrix:height() / 2 + FOR i := 0 TO maxVal / chartStep + 1 + ( iif( maxVal % chartStep !=0, 1, 0 ) ) + qPainter:drawLine( rc:x(), rc:y() + y, rc:x() + rc:width(), rc:y() + y ) + y += valstep + NEXT + ENDIF + + rc := rc:adjusted( 0, qFMetrix:height() / 2, 0, 0 ) + x := m_barsIdentation + barWidth := ( rc:width() - m_barsIdentation * ( len( ::aData ) + 1 ) ) / len( ::aData ) + py := maxHeight / maxVal + + FOR EACH cv IN ::xData + lg := QLinearGradient():new( QPointF():new( x + barWidth / 2, 0 ), QPointF():new( x + barWidth , 0 ) ) + lg:setSpread( QGradient_ReflectSpread ) + lg:setColorAt( 0, cv[ 3 ] ) + lg:setColorAt( 1, QColor( cv[ 3 ]:red() * m_toColorFactor, cv[ 3 ]:green() * m_toColorFactor, cv[ 3 ]:blue() * m_toColorFactor, cv[ 3 ]:alpha() ) ) + qPainter:fillqRect( QRectF( rc:x() + x, rc:y() + py * maxpv - py * cv[ 2 ] * powVal, barWidth, py * cv[ 2 ] * powVal ), QBrush():new( "QGradient", lg ) ) + IF ( m_showLabels ) + qPainter:drawText( QRectF( rc:x() + x - m_barsIdentation / 2, rc:y() + py * maxpv - iif( cv[ 2 ] >= 0, qFMetrix:height(), 0 ), ; + barWidth + m_barsIdentation, qFMetrix:height() ), Qt_AlignCenter, hb_ntos( cv[ 2 ] ) ) + ENDIF + x += barWidth + m_barsIdentation + NEXT + + #if 0 /* Legend */ + qPainter:fillqRect( qRect, ::brush() ) + qPainter:drawqRect( qRect ) + qPainter:translate( qRect:topLeft() ) + qreal y := 1 / UNIT + qreal vstep := ( qRect:height() - y - 1 / UNIT * val:size() ) / len( ::aData ) + FOR EACH cv IN ::aData + { + qPainter:fillqRect( QRectF( 1 / UNIT / 2, y, m_legendColorqRectWidth, vstep ), QBrush():new( cv[ 3 ] ) ) + qPainter:drawText( QRectF( 1 / UNIT + m_legendColorqRectWidth, y, qRect:width() - ( 1 / UNIT + m_legendColorqRectWidth ), vstep ), + Qt_AlignVCenter + Qt_AlignLeft, cv[ 1 ] ) + y += vstep + 1 / UNIT + } + #endif + + RETURN Self + +/*----------------------------------------------------------------------*/ +