okteta
abstractcolumnframerenderer.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "abstractcolumnframerenderer.h"
00024
00025
00026 #include "abstractcolumnrenderer.h"
00027
00028 #include <QtCore/QListIterator>
00029 #include <QtGui/QPainter>
00030
00031
00032 static const int DefaultSingleStep = 20;
00033
00034 class AbstractColumnFrameRendererPrivate
00035 {
00036 public:
00037 AbstractColumnFrameRendererPrivate();
00038 ~AbstractColumnFrameRendererPrivate();
00039 public:
00040 void updateWidths();
00041 public:
00043 QList<KHEPrint::AbstractColumnRenderer*> mColumns;
00045 int mNoOfLines;
00047 KPixelY mLineHeight;
00049 KPixelX mColumnsWidth;
00050 };
00051
00052
00053 AbstractColumnFrameRendererPrivate::AbstractColumnFrameRendererPrivate()
00054 : mNoOfLines( 0 ),
00055 mLineHeight( 1 ),
00056 mColumnsWidth( 0 )
00057 {}
00058
00059 void AbstractColumnFrameRendererPrivate::updateWidths()
00060 {
00061 mColumnsWidth = 0;
00062 QListIterator<KHEPrint::AbstractColumnRenderer*> it( mColumns );
00063 while( it.hasNext() )
00064 {
00065 KHEPrint::AbstractColumnRenderer *columnRenderer = it.next();
00066 columnRenderer->setX( mColumnsWidth );
00067 mColumnsWidth += columnRenderer->visibleWidth();
00068 }
00069 }
00070
00071 AbstractColumnFrameRendererPrivate::~AbstractColumnFrameRendererPrivate()
00072 {
00073 qDeleteAll( mColumns );
00074 }
00075
00076 AbstractColumnFrameRenderer::AbstractColumnFrameRenderer()
00077 : d( new AbstractColumnFrameRendererPrivate() )
00078 {
00079 }
00080
00081
00082 int AbstractColumnFrameRenderer::noOfLines() const { return d->mNoOfLines; }
00083 KPixelY AbstractColumnFrameRenderer::lineHeight() const { return d->mLineHeight; }
00084
00085 KPixelY AbstractColumnFrameRenderer::columnsHeight() const { return d->mNoOfLines*d->mLineHeight; }
00086 KPixelX AbstractColumnFrameRenderer::columnsWidth() const { return d->mColumnsWidth; }
00087
00088 void AbstractColumnFrameRenderer::setNoOfLines( int noOfLines )
00089 {
00090 if( d->mNoOfLines == noOfLines )
00091 return;
00092
00093 d->mNoOfLines = noOfLines;
00094 }
00095
00096
00097 void AbstractColumnFrameRenderer::setLineHeight( KPixelY newLineHeight )
00098 {
00099 if( newLineHeight == d->mLineHeight )
00100 return;
00101
00102 if( newLineHeight < 1 )
00103 newLineHeight = 1;
00104 d->mLineHeight = newLineHeight;
00105
00106 QListIterator<KHEPrint::AbstractColumnRenderer*> it( d->mColumns );
00107 while( it.hasNext() )
00108 it.next()->setLineHeight( d->mLineHeight );
00109 }
00110
00111
00112 void AbstractColumnFrameRenderer::updateWidths()
00113 {
00114 d->updateWidths();
00115 }
00116
00117
00118 int AbstractColumnFrameRenderer::noOfLinesPerFrame() const
00119 {
00120
00121 if( d->mLineHeight < 1 )
00122 return 1;
00123
00124 int noOfLinesPerFrame = height() / d->mLineHeight;
00125
00126 if( noOfLinesPerFrame < 1 )
00127
00128 noOfLinesPerFrame = 1;
00129 return noOfLinesPerFrame;
00130 }
00131
00132
00133 void AbstractColumnFrameRenderer::addColumn( KHEPrint::AbstractColumnRenderer *columnRenderer )
00134 {
00135 d->mColumns.append( columnRenderer );
00136
00137 updateWidths();
00138 }
00139
00140
00141 void AbstractColumnFrameRenderer::removeColumn( KHEPrint::AbstractColumnRenderer *columnRenderer )
00142 {
00143 const int columnPos = d->mColumns.indexOf( columnRenderer );
00144 if( columnPos != -1 )
00145 d->mColumns.removeAt( columnPos );
00146
00147 delete columnRenderer;
00148
00149 updateWidths();
00150 }
00151
00152
00153 void AbstractColumnFrameRenderer::renderFrame( QPainter *painter, int frameIndex )
00154 {
00155 KPixelXs renderedXs = KPixelXs::fromWidth( 0, width() );
00156
00157
00158 if( renderedXs.startsBefore(d->mColumnsWidth) )
00159 {
00160
00161 QList<KHEPrint::AbstractColumnRenderer*> columnRenderers;
00162 QListIterator<KHEPrint::AbstractColumnRenderer*> it( d->mColumns );
00163 while( it.hasNext() )
00164 {
00165 KHEPrint::AbstractColumnRenderer *columnRenderer = it.next();
00166 if( columnRenderer->isVisible() && columnRenderer->overlaps(renderedXs) )
00167 columnRenderers.append( columnRenderer );
00168 }
00169
00170
00171 const int baseLine = frameIndex * noOfLinesPerFrame();
00172 KHE::KSection renderedLines = KHE::KSection::fromWidth( baseLine, noOfLinesPerFrame() );
00173 renderedLines.restrictEndTo( noOfLines()-1 );
00174
00175 KPixelYs renderedYs = KPixelYs::fromWidth( 0, renderedLines.width()*d->mLineHeight );
00176
00177
00178 if( renderedLines.isValid() )
00179 {
00180
00181 QListIterator<KHEPrint::AbstractColumnRenderer*> fit( columnRenderers );
00182 while( fit.hasNext() )
00183 fit.next()->renderColumn( painter, renderedXs, renderedYs );
00184
00185 KPixelY cy = 0;
00186
00187 int line = renderedLines.start();
00188 QListIterator<KHEPrint::AbstractColumnRenderer*> it( columnRenderers );
00189 KHEPrint::AbstractColumnRenderer *columnRenderer = it.next();
00190 painter->translate( columnRenderer->x(), cy );
00191
00192 while( true )
00193 {
00194 columnRenderer->renderFirstLine( painter, renderedXs, line );
00195 if( !it.hasNext() )
00196 break;
00197 painter->translate( columnRenderer->width(), 0 );
00198 columnRenderer = it.next();
00199 }
00200 painter->translate( -columnRenderer->x(), 0 );
00201
00202
00203 while( true )
00204 {
00205 ++line;
00206
00207 if( line > renderedLines.end() )
00208 break;
00209
00210 QListIterator<KHEPrint::AbstractColumnRenderer*> it( columnRenderers );
00211 columnRenderer = it.next();
00212 painter->translate( columnRenderer->x(), d->mLineHeight );
00213
00214 while( true )
00215 {
00216 columnRenderer->renderNextLine( painter );
00217 if( !it.hasNext() )
00218 break;
00219 painter->translate( columnRenderer->width(), 0 );
00220 columnRenderer = it.next();
00221 }
00222 painter->translate( -columnRenderer->x(), 0 );
00223 }
00224 cy = (renderedLines.width()-1)*d->mLineHeight;
00225
00226 painter->translate( 0, -cy );
00227 }
00228
00229
00230 renderedYs.set( renderedYs.nextBehindEnd(), height()-1 );
00231 if( renderedYs.isValid() )
00232 {
00233 QListIterator<KHEPrint::AbstractColumnRenderer*> it( columnRenderers );
00234 while( it.hasNext() )
00235 it.next()->renderEmptyColumn( painter, renderedXs, renderedYs );
00236 }
00237 }
00238
00239
00240 renderedXs.setStart( d->mColumnsWidth );
00241 if( renderedXs.isValid() )
00242 drawEmptyArea( painter, renderedXs.start(), 0, renderedXs.width(), height() );
00243 }
00244
00245
00246 void AbstractColumnFrameRenderer::drawEmptyArea( QPainter *painter, int cx ,int cy, int cw, int ch )
00247 {
00248 painter->fillRect( cx,cy, cw,ch, Qt::white );
00249 }
00250
00251
00252 AbstractColumnFrameRenderer::~AbstractColumnFrameRenderer()
00253 {
00254 delete d;
00255 }