• Skip to content
  • Skip to link menu
KDE 4.2 API Reference
  • KDE API Reference
  • kdeutils
  • Sitemap
  • Contact Us
 

okteta

abstractcolumnframerenderer.cpp

Go to the documentation of this file.
00001 /*
00002     This file is part of the Okteta Kakao module, part of the KDE project.
00003 
00004     Copyright 2003,2008 Friedrich W. H. Kossebau <kossebau@kde.org>
00005 
00006     This library is free software; you can redistribute it and/or
00007     modify it under the terms of the GNU Lesser General Public
00008     License as published by the Free Software Foundation; either
00009     version 2.1 of the License, or (at your option) version 3, or any
00010     later version accepted by the membership of KDE e.V. (or its
00011     successor approved by the membership of KDE e.V.), which shall
00012     act as a proxy defined in Section 6 of version 3 of the license.
00013 
00014     This library is distributed in the hope that it will be useful,
00015     but WITHOUT ANY WARRANTY; without even the implied warranty of
00016     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00017     Lesser General Public License for more details.
00018 
00019     You should have received a copy of the GNU Lesser General Public
00020     License along with this library. If not, see <http://www.gnu.org/licenses/>.
00021 */
00022 
00023 #include "abstractcolumnframerenderer.h"
00024 
00025 // lib
00026 #include "abstractcolumnrenderer.h"
00027 // Qt
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: // calculated
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     // TODO: the right reaction?
00121     if( d->mLineHeight < 1 )
00122         return 1;
00123 
00124     int noOfLinesPerFrame = height() / d->mLineHeight;
00125 
00126     if( noOfLinesPerFrame < 1 )
00127         // ensure at least one line, so there aren't endless frames TODO: think about
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     // content to be shown?
00158     if( renderedXs.startsBefore(d->mColumnsWidth) )
00159     {
00160         // collect affected columns
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         // calculate affected lines
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         // any lines of any columns to be drawn?
00178         if( renderedLines.isValid() )
00179         {
00180             // paint full columns
00181             QListIterator<KHEPrint::AbstractColumnRenderer*> fit( columnRenderers ); // TODO: reuse later, see some lines below
00182             while( fit.hasNext() )
00183                 fit.next()->renderColumn( painter, renderedXs, renderedYs );
00184 
00185             KPixelY cy = 0;
00186             // starting painting with the first line
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             // Go through the other lines
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         // draw empty columns?
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     // painter empty rects
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 }

okteta

Skip menu "okteta"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

kdeutils

Skip menu "kdeutils"
  • ark
  • kcalc
  • kcharselect
  • kdessh
  • kdf
  • kfloppy
  • kgpg
  • ktimer
  • kwallet
  • okteta
  • printer-applet
  • superkaramba
  • sweeper
Generated for kdeutils by doxygen 1.5.4
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal