• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdesdk API Reference
  • KDE Home
  • Contact Us
 

okteta

  • sources
  • kde-4.12
  • kdesdk
  • okteta
  • kasten
  • controllers
  • view
  • print
abstractcolumnframerenderer.cpp
Go to the documentation of this file.
1 /*
2  This file is part of the Okteta Kasten module, made within the KDE community.
3 
4  Copyright 2003,2008 Friedrich W. H. Kossebau <kossebau@kde.org>
5 
6  This library is free software; you can redistribute it and/or
7  modify it under the terms of the GNU Lesser General Public
8  License as published by the Free Software Foundation; either
9  version 2.1 of the License, or (at your option) version 3, or any
10  later version accepted by the membership of KDE e.V. (or its
11  successor approved by the membership of KDE e.V.), which shall
12  act as a proxy defined in Section 6 of version 3 of the license.
13 
14  This library is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  Lesser General Public License for more details.
18 
19  You should have received a copy of the GNU Lesser General Public
20  License along with this library. If not, see <http://www.gnu.org/licenses/>.
21 */
22 
23 #include "abstractcolumnframerenderer.h"
24 
25 // lib
26 #include <abstractcolumnrenderer.h>
27 // Okteta gui
28 #include <linerange.h>
29 // Qt
30 #include <QtGui/QPainter>
31 #include <QtCore/QListIterator>
32 
33 
34 static const int DefaultSingleStep = 20;
35 
36 
37 class AbstractColumnFrameRendererPrivate
38 {
39  public:
40  AbstractColumnFrameRendererPrivate();
41  ~AbstractColumnFrameRendererPrivate();
42  public:
43  void updateWidths();
44  public: // calculated
46  QList<Okteta::AbstractColumnRenderer*> mColumns;
48  Okteta::LineSize mNoOfLines;
50  Okteta::PixelY mLineHeight;
52  Okteta::PixelX mColumnsWidth;
53 };
54 
55 
56 AbstractColumnFrameRendererPrivate::AbstractColumnFrameRendererPrivate()
57  : mNoOfLines( 0 ),
58  mLineHeight( 1 ),
59  mColumnsWidth( 0 )
60 {}
61 
62 void AbstractColumnFrameRendererPrivate::updateWidths()
63 {
64  mColumnsWidth = 0;
65  QListIterator<Okteta::AbstractColumnRenderer*> it( mColumns );
66  while( it.hasNext() )
67  {
68  Okteta::AbstractColumnRenderer *columnRenderer = it.next();
69  columnRenderer->setX( mColumnsWidth );
70  mColumnsWidth += columnRenderer->visibleWidth();
71  }
72 }
73 
74 AbstractColumnFrameRendererPrivate::~AbstractColumnFrameRendererPrivate()
75 {
76  qDeleteAll( mColumns );
77 }
78 
79 AbstractColumnFrameRenderer::AbstractColumnFrameRenderer()
80  : d( new AbstractColumnFrameRendererPrivate() )
81 {
82 }
83 
84 
85 Okteta::LineSize AbstractColumnFrameRenderer::noOfLines() const { return d->mNoOfLines; }
86 Okteta::PixelY AbstractColumnFrameRenderer::lineHeight() const { return d->mLineHeight; }
87 
88 Okteta::PixelY AbstractColumnFrameRenderer::columnsHeight() const { return d->mNoOfLines*d->mLineHeight; }
89 Okteta::PixelX AbstractColumnFrameRenderer::columnsWidth() const { return d->mColumnsWidth; }
90 
91 void AbstractColumnFrameRenderer::setNoOfLines( Okteta::LineSize noOfLines )
92 {
93  if( d->mNoOfLines == noOfLines )
94  return;
95 
96  d->mNoOfLines = noOfLines;
97 }
98 
99 
100 void AbstractColumnFrameRenderer::setLineHeight( Okteta::PixelY newLineHeight )
101 {
102  if( newLineHeight == d->mLineHeight )
103  return;
104 
105  if( newLineHeight < 1 )
106  newLineHeight = 1;
107  d->mLineHeight = newLineHeight;
108 
109  QListIterator<Okteta::AbstractColumnRenderer*> it( d->mColumns );
110  while( it.hasNext() )
111  it.next()->setLineHeight( d->mLineHeight );
112 }
113 
114 
115 void AbstractColumnFrameRenderer::updateWidths()
116 {
117  d->updateWidths();
118 }
119 
120 
121 Okteta::LineSize AbstractColumnFrameRenderer::noOfLinesPerFrame() const
122 {
123  // TODO: the right reaction?
124  if( d->mLineHeight < 1 )
125  return 1;
126 
127  Okteta::LineSize noOfLinesPerFrame = height() / d->mLineHeight;
128 
129  if( noOfLinesPerFrame < 1 )
130  // ensure at least one line, so there aren't endless frames TODO: think about
131  noOfLinesPerFrame = 1;
132 
133  return noOfLinesPerFrame;
134 }
135 
136 
137 void AbstractColumnFrameRenderer::addColumn( Okteta::AbstractColumnRenderer *columnRenderer )
138 {
139  d->mColumns.append( columnRenderer );
140 
141  updateWidths();
142 }
143 
144 
145 void AbstractColumnFrameRenderer::removeColumn( Okteta::AbstractColumnRenderer *columnRenderer )
146 {
147  const int columnPos = d->mColumns.indexOf( columnRenderer );
148  if( columnPos != -1 )
149  d->mColumns.removeAt( columnPos );
150 
151  delete columnRenderer;
152 
153  updateWidths();
154 }
155 
156 
157 void AbstractColumnFrameRenderer::renderFrame( QPainter *painter, int frameIndex )
158 {
159  Okteta::PixelXRange renderedXs = Okteta::PixelXRange::fromWidth( 0, width() );
160 
161  // content to be shown?
162  if( renderedXs.startsBefore(d->mColumnsWidth) )
163  {
164  // collect affected columns
165  QList<Okteta::AbstractColumnRenderer*> columnRenderers;
166  QListIterator<Okteta::AbstractColumnRenderer*> it( d->mColumns );
167  while( it.hasNext() )
168  {
169  Okteta::AbstractColumnRenderer *columnRenderer = it.next();
170  if( columnRenderer->isVisible() && columnRenderer->overlaps(renderedXs) )
171  columnRenderers.append( columnRenderer );
172  }
173 
174  // calculate affected lines
175  const Okteta::Line baseLine = frameIndex * noOfLinesPerFrame();
176  Okteta::LineRange renderedLines = Okteta::LineRange::fromWidth( baseLine, noOfLinesPerFrame() );
177  renderedLines.restrictEndTo( noOfLines()-1 );
178 
179  Okteta::PixelYRange renderedYs = Okteta::PixelYRange::fromWidth( 0, renderedLines.width()*d->mLineHeight );
180 
181  // any lines of any columns to be drawn?
182  if( renderedLines.isValid() )
183  {
184  // paint full columns
185  QListIterator<Okteta::AbstractColumnRenderer*> fit( columnRenderers ); // TODO: reuse later, see some lines below
186  while( fit.hasNext() )
187  fit.next()->renderColumn( painter, renderedXs, renderedYs );
188 
189  Okteta::PixelY cy = 0;
190  // starting painting with the first line
191  Okteta::Line line = renderedLines.start();
192  QListIterator<Okteta::AbstractColumnRenderer*> it( columnRenderers );
193  Okteta::AbstractColumnRenderer *columnRenderer = it.next();
194  painter->translate( columnRenderer->x(), cy );
195 
196  while( true )
197  {
198  columnRenderer->renderFirstLine( painter, renderedXs, line );
199  if( !it.hasNext() )
200  break;
201  painter->translate( columnRenderer->width(), 0 );
202  columnRenderer = it.next();
203  }
204  painter->translate( -columnRenderer->x(), 0 );
205 
206  // Go through the other lines
207  while( true )
208  {
209  ++line;
210 
211  if( line > renderedLines.end() )
212  break;
213 
214  QListIterator<Okteta::AbstractColumnRenderer*> it( columnRenderers );
215  columnRenderer = it.next();
216  painter->translate( columnRenderer->x(), d->mLineHeight );
217 
218  while( true )
219  {
220  columnRenderer->renderNextLine( painter );
221  if( !it.hasNext() )
222  break;
223  painter->translate( columnRenderer->width(), 0 );
224  columnRenderer = it.next();
225  }
226  painter->translate( -columnRenderer->x(), 0 );
227  }
228  cy = (renderedLines.width()-1)*d->mLineHeight;
229 
230  painter->translate( 0, -cy );
231  }
232 
233  // draw empty columns?
234  renderedYs.set( renderedYs.nextBehindEnd(), height()-1 );
235  if( renderedYs.isValid() )
236  {
237  QListIterator<Okteta::AbstractColumnRenderer*> it( columnRenderers );
238  while( it.hasNext() )
239  it.next()->renderEmptyColumn( painter, renderedXs, renderedYs );
240  }
241  }
242 
243  // painter empty rects
244  renderedXs.setStart( d->mColumnsWidth );
245  if( renderedXs.isValid() )
246  drawEmptyArea( painter, renderedXs.start(), 0, renderedXs.width(), height() );
247 }
248 
249 
250 void AbstractColumnFrameRenderer::drawEmptyArea( QPainter *painter, int cx ,int cy, int cw, int ch )
251 {
252  painter->fillRect( cx,cy, cw,ch, Qt::white );
253 }
254 
255 
256 AbstractColumnFrameRenderer::~AbstractColumnFrameRenderer()
257 {
258  delete d;
259 }
AbstractColumnFrameRenderer::updateWidths
void updateWidths()
recalculates the positions of the columns and the total width
Definition: abstractcolumnframerenderer.cpp:115
AbstractFrameRenderer::width
virtual int width() const =0
AbstractColumnFrameRenderer::noOfLines
Okteta::LineSize noOfLines() const
returns the number of all lines
Definition: abstractcolumnframerenderer.cpp:85
AbstractColumnFrameRenderer::AbstractColumnFrameRenderer
AbstractColumnFrameRenderer()
Definition: abstractcolumnframerenderer.cpp:79
KDE::NumberRange::nextBehindEnd
N nextBehindEnd() const
Definition: numberrange.h:145
KDE::NumberRange< PixelX >
KDE::Range::start
T start() const
Definition: range.h:86
AbstractColumnFrameRenderer::~AbstractColumnFrameRenderer
virtual ~AbstractColumnFrameRenderer()
Definition: abstractcolumnframerenderer.cpp:256
AbstractColumnFrameRenderer::noOfLinesPerFrame
Okteta::LineSize noOfLinesPerFrame() const
returns number of fully visible lines, at least 1 (as needed by page down/up) doesn't care about the ...
Definition: abstractcolumnframerenderer.cpp:121
Okteta::AbstractColumnRenderer::setX
void setX(PixelX x)
sets starting point of the column
Definition: abstractcolumnrenderer.cpp:49
AbstractColumnFrameRenderer::setLineHeight
virtual void setLineHeight(Okteta::PixelY NewLineHeight)
sets height of all lines and propagates this information to all columns doesn't update the content si...
Definition: abstractcolumnframerenderer.cpp:100
AbstractColumnFrameRenderer::columnsHeight
Okteta::PixelY columnsHeight() const
returns the height of all lines together
Definition: abstractcolumnframerenderer.cpp:88
AbstractColumnFrameRenderer::drawEmptyArea
virtual void drawEmptyArea(QPainter *painter, int cx, int cy, int cw, int ch)
draws area without columns in columns coordinates
Definition: abstractcolumnframerenderer.cpp:250
Okteta::Line
qint32 Line
Definition: line.h:33
KDE::NumberRange::width
S width() const
Definition: numberrange.h:141
Okteta::PixelX
int PixelX
Definition: kadds.h:34
Okteta::AbstractColumnRenderer::visibleWidth
PixelX visibleWidth() const
convenience: returns width if visible else 0
Definition: abstractcolumnrenderer.cpp:46
KDE::Range::restrictEndTo
void restrictEndTo(T Limit)
restricts the end to Limit.
Definition: range.h:69
abstractcolumnrenderer.h
AbstractColumnFrameRenderer::removeColumn
void removeColumn(Okteta::AbstractColumnRenderer *column)
Definition: abstractcolumnframerenderer.cpp:145
AbstractColumnFrameRenderer::setNoOfLines
virtual void setNoOfLines(Okteta::LineSize NewNoOfLines)
sets the number of lines doesn't update the content size
Definition: abstractcolumnframerenderer.cpp:91
AbstractColumnFrameRenderer::renderFrame
virtual void renderFrame(QPainter *painter, int frameIndex)
Definition: abstractcolumnframerenderer.cpp:157
KDE::Range::end
T end() const
Definition: range.h:88
KDE::NumberRange< PixelX >::fromWidth
static NumberRange fromWidth(PixelXstartIndex, S width)
constructs a range by width
linerange.h
AbstractColumnFrameRenderer::lineHeight
Okteta::PixelY lineHeight() const
returns the height of each line
Definition: abstractcolumnframerenderer.cpp:86
Okteta::AbstractColumnRenderer::renderNextLine
virtual void renderNextLine(QPainter *painter)
the actual painting call for a column's line.
Definition: abstractcolumnrenderer.cpp:67
AbstractColumnFrameRenderer::columnsWidth
Okteta::PixelX columnsWidth() const
returns the width of all visible columns together
Definition: abstractcolumnframerenderer.cpp:89
AbstractFrameRenderer::height
virtual int height() const =0
AbstractColumnFrameRenderer::addColumn
void addColumn(Okteta::AbstractColumnRenderer *column)
takes ownership of column renderer
Definition: abstractcolumnframerenderer.cpp:137
abstractcolumnframerenderer.h
Okteta::AbstractColumnRenderer::width
PixelX width() const
total width in pixel
Definition: abstractcolumnrenderer.cpp:44
Okteta::AbstractColumnRenderer::renderFirstLine
virtual void renderFirstLine(QPainter *painter, const PixelXRange &xSpan, int firstLineIndex)
Before an update of the columns view each column that intersects with the area to be painted will be ...
Definition: abstractcolumnrenderer.cpp:59
KDE::Range::startsBefore
bool startsBefore(T Value) const
returns true is the range starts before index.
Definition: range.h:99
Okteta::AbstractColumnRenderer::x
PixelX x() const
left offset x in pixel
Definition: abstractcolumnrenderer.cpp:42
Okteta::AbstractColumnRenderer
base class for columns of the ColumnsView
Definition: abstractcolumnrenderer.h:46
DefaultSingleStep
static const int DefaultSingleStep
Definition: abstractcolumnframerenderer.cpp:34
Okteta::AbstractColumnRenderer::overlaps
bool overlaps(const PixelXRange &xSpan) const
true if column overlaps with pixels between x-positions x1, x2
Definition: abstractcolumnrenderer.cpp:56
Okteta::AbstractColumnRenderer::isVisible
bool isVisible() const
should Column be displayed?
Definition: abstractcolumnrenderer.cpp:45
KDE::Range::setStart
void setStart(T S)
sets the first index of the range
Definition: range.h:58
KDE::Range::isValid
bool isValid() const
returns true if the range covers at least one index
Definition: range.h:122
Okteta::LineSize
qint32 LineSize
Definition: line.h:34
Okteta::PixelY
int PixelY
Definition: kadds.h:35
KDE::Range::set
void set(T S, T E)
sets the first and the last index of the range
Definition: range.h:54
QList< Okteta::AbstractColumnRenderer * >
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 23:04:06 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

okteta

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

kdesdk API Reference

Skip menu "kdesdk API Reference"
  • kapptemplate
  • kcachegrind
  • kompare
  • lokalize
  • okteta
  • umbrello
  •   umbrello

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal