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

kdgantt2

  • sources
  • kde-4.12
  • kdepim
  • kdgantt2
kdganttgraphicsscene.cpp
Go to the documentation of this file.
1 /****************************************************************************
2  ** Copyright (C) 2001-2006 Klarälvdalens Datakonsult AB. All rights reserved.
3  **
4  ** This file is part of the KD Gantt library.
5  **
6  ** This file may be distributed and/or modified under the terms of the
7  ** GNU General Public License version 2 as published by the Free Software
8  ** Foundation and appearing in the file LICENSE.GPL included in the
9  ** packaging of this file.
10  **
11  ** Licensees holding valid commercial KD Gantt licenses may use this file in
12  ** accordance with the KD Gantt Commercial License Agreement provided with
13  ** the Software.
14  **
15  ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16  ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
17  **
18  ** See http://www.kdab.net/kdgantt for
19  ** information about KD Gantt Commercial License Agreements.
20  **
21  ** Contact info@kdab.net if any conditions of this
22  ** licensing are not clear to you.
23  **
24  **********************************************************************/
25 #include "kdganttgraphicsscene.h"
26 #include "kdganttgraphicsscene_p.h"
27 #include "kdganttgraphicsitem.h"
28 #include "kdganttconstraint.h"
29 #include "kdganttconstraintgraphicsitem.h"
30 #include "kdganttitemdelegate.h"
31 #include "kdganttabstractrowcontroller.h"
32 #include "kdganttdatetimegrid.h"
33 #include "kdganttsummaryhandlingproxymodel.h"
34 
35 #include <QApplication>
36 #include <QGraphicsSceneHelpEvent>
37 #include <QPainter>
38 #include <QPrinter>
39 #include <QTextDocument>
40 #include <QToolTip>
41 #include <QSet>
42 
43 #include <QDebug>
44 
45 #include <functional>
46 #include <algorithm>
47 #include <cassert>
48 
49 /* Older Qt dont have this macro, so define it... */
50 #ifndef QT_VERSION_CHECK
51 # define QT_VERSION_CHECK(major, minor, patch) ((major<<16)|(minor<<8)|(patch))
52 #endif
53 
58 using namespace KDGantt;
59 
60 GraphicsScene::Private::Private( GraphicsScene* _q )
61  : q( _q ),
62  dragSource( 0 ),
63  itemDelegate( new ItemDelegate( _q ) ),
64  rowController( 0 ),
65  grid( &default_grid ),
66  readOnly( false ),
67  isPrinting( false ),
68  summaryHandlingModel( new SummaryHandlingProxyModel( _q ) ),
69  selectionModel( 0 )
70 {
71  default_grid.setStartDateTime( QDateTime::currentDateTime().addDays( -1 ) );
72 }
73 
74 void GraphicsScene::Private::resetConstraintItems()
75 {
76  q->clearConstraintItems();
77  if ( constraintModel.isNull() ) return;
78  QList<Constraint> clst = constraintModel->constraints();
79  Q_FOREACH( Constraint c, clst ) {
80  createConstraintItem( c );
81  }
82  q->updateItems();
83 }
84 
85 void GraphicsScene::Private::createConstraintItem( const Constraint& c )
86 {
87  GraphicsItem* sitem = q->findItem( summaryHandlingModel->mapFromSource( c.startIndex() ) );
88  GraphicsItem* eitem = q->findItem( summaryHandlingModel->mapFromSource( c.endIndex() ) );
89 
90  if ( sitem && eitem ) {
91  ConstraintGraphicsItem* citem = new ConstraintGraphicsItem( c );
92  sitem->addStartConstraint( citem );
93  eitem->addEndConstraint( citem );
94  q->addItem( citem );
95  }
96 
97 
98 
99  //q->insertConstraintItem( c, citem );
100 }
101 
102 // Delete the constraint item, and clean up pointers in the start- and end item
103 void GraphicsScene::Private::deleteConstraintItem( ConstraintGraphicsItem *citem )
104 {
105  //qDebug()<<"GraphicsScene::Private::deleteConstraintItem citem="<<(void*)citem;
106  if ( citem == 0 ) {
107  return;
108  }
109  Constraint c = citem->constraint();
110  GraphicsItem* item = items.value( summaryHandlingModel->mapFromSource( c.startIndex() ), 0 );
111  if ( item ) {
112  //qDebug()<<"GraphicsScene::Private::deleteConstraintItem startConstraints"<<item<<(void*)citem;
113  item->removeStartConstraint( citem );
114  } //else qDebug()<<"GraphicsScene::Private::deleteConstraintItem"<<c.startIndex()<<"start item not found";
115  item = items.value( summaryHandlingModel->mapFromSource( c.endIndex() ), 0 );
116  if ( item ) {
117  //qDebug()<<"GraphicsScene::Private::deleteConstraintItem endConstraints"<<item<<(void*)citem;
118  item->removeEndConstraint( citem );
119  } //else qDebug()<<"GraphicsScene::Private::deleteConstraintItem"<<c.endIndex()<<"end item not found";
120  //qDebug()<<"GraphicsScene::Private::deleteConstraintItem"<<citem<<"deleted";
121  delete citem;
122 }
123 
124 void GraphicsScene::Private::deleteConstraintItem( const Constraint& c )
125 {
126  //qDebug()<<"GraphicsScene::Private::deleteConstraintItem c="<<c;
127  deleteConstraintItem( findConstraintItem( c ) );
128 }
129 
130 ConstraintGraphicsItem* GraphicsScene::Private::findConstraintItem( const Constraint& c ) const
131 {
132  GraphicsItem* item = items.value( summaryHandlingModel->mapFromSource( c.startIndex() ), 0 );
133  if ( item ) {
134  QList<ConstraintGraphicsItem*> clst = item->startConstraints();
135  QList<ConstraintGraphicsItem*>::iterator it = clst.begin();
136  //qDebug()<<"GraphicsScene::Private::findConstraintItem start:"<<c<<item<<clst;
137  for( ; it != clst.end() ; ++it )
138  if ((*it)->constraint() == c )
139  break;
140  if ( it != clst.end() ) {
141  return *it;
142  }
143  }
144  item = items.value( summaryHandlingModel->mapFromSource( c.endIndex() ), 0 );
145  if ( item ) {
146  QList<ConstraintGraphicsItem*> clst = item->endConstraints();
147  QList<ConstraintGraphicsItem*>::iterator it = clst.begin();
148  //qDebug()<<"GraphicsScene::Private::findConstraintItem end:"<<c<<item<<clst;
149  for( ; it != clst.end() ; ++it )
150  if ((*it)->constraint() == c )
151  break;
152  if ( it != clst.end() ) {
153  return *it;
154  }
155  }
156  //qDebug()<<"GraphicsScene::Private::findConstraintItem No item or constraintitem"<<c;
157  return 0;
158 }
159 
160 GraphicsScene::GraphicsScene( QObject* parent )
161  : QGraphicsScene( parent ), _d( new Private( this ) )
162 {
163  init();
164 }
165 
166 GraphicsScene::~GraphicsScene()
167 {
168  clearConstraintItems();
169  clearItems();
170 }
171 
172 #define d d_func()
173 
174 void GraphicsScene::init()
175 {
176  setItemIndexMethod( QGraphicsScene::NoIndex );
177  setConstraintModel( new ConstraintModel( this ) );
178  connect( d->grid, SIGNAL(gridChanged()), this, SLOT(slotGridChanged()) );
179 }
180 
181 /* NOTE: The delegate should really be a property
182  * of the view, but that doesn't really fit at
183  * this time
184  */
185 void GraphicsScene::setItemDelegate( ItemDelegate* delegate )
186 {
187  if ( !d->itemDelegate.isNull() && d->itemDelegate->parent()==this ) delete d->itemDelegate;
188  d->itemDelegate = delegate;
189  update();
190 }
191 
192 ItemDelegate* GraphicsScene::itemDelegate() const
193 {
194  return d->itemDelegate;
195 }
196 
197 QAbstractItemModel* GraphicsScene::model() const
198 {
199  assert(!d->summaryHandlingModel.isNull());
200  return d->summaryHandlingModel->sourceModel();
201 }
202 
203 void GraphicsScene::setModel( QAbstractItemModel* model )
204 {
205  assert(!d->summaryHandlingModel.isNull());
206  d->summaryHandlingModel->setSourceModel(model);
207  d->grid->setModel( d->summaryHandlingModel );
208  setSelectionModel( new QItemSelectionModel( model, this ) );
209 }
210 
211 QAbstractProxyModel* GraphicsScene::summaryHandlingModel() const
212 {
213  return d->summaryHandlingModel;
214 }
215 
216 void GraphicsScene::setSummaryHandlingModel( QAbstractProxyModel* proxyModel )
217 {
218  proxyModel->setSourceModel( model() );
219  d->summaryHandlingModel = proxyModel;
220 }
221 
222 void GraphicsScene::setRootIndex( const QModelIndex& idx )
223 {
224  d->grid->setRootIndex( idx );
225 }
226 
227 QModelIndex GraphicsScene::rootIndex() const
228 {
229  return d->grid->rootIndex();
230 }
231 
232 ConstraintModel* GraphicsScene::constraintModel() const
233 {
234  return d->constraintModel;
235 }
236 
237 void GraphicsScene::setConstraintModel( ConstraintModel* cm )
238 {
239  if ( !d->constraintModel.isNull() ) {
240  disconnect( d->constraintModel );
241  }
242  d->constraintModel = cm;
243 
244  connect( cm, SIGNAL(constraintAdded(Constraint)), this, SLOT(slotConstraintAdded(Constraint)) );
245  connect( cm, SIGNAL(constraintRemoved(Constraint)), this, SLOT(slotConstraintRemoved(Constraint)) );
246  d->resetConstraintItems();
247 }
248 
249 void GraphicsScene::setSelectionModel( QItemSelectionModel* smodel )
250 {
251  d->selectionModel = smodel;
252  // TODO: update selection from model and connect signals
253 }
254 
255 QItemSelectionModel* GraphicsScene::selectionModel() const
256 {
257  return d->selectionModel;
258 }
259 
260 void GraphicsScene::setRowController( AbstractRowController* rc )
261 {
262  d->rowController = rc;
263 }
264 
265 AbstractRowController* GraphicsScene::rowController() const
266 {
267  return d->rowController;
268 }
269 
270 void GraphicsScene::setGrid( AbstractGrid* grid )
271 {
272  QAbstractItemModel* model = d->grid->model();
273  if ( grid == 0 ) grid = &d->default_grid;
274  if ( d->grid ) disconnect( d->grid );
275  d->grid = grid;
276  connect( d->grid, SIGNAL(gridChanged()), this, SLOT(slotGridChanged()) );
277  d->grid->setModel( model );
278  slotGridChanged();
279 }
280 
281 AbstractGrid* GraphicsScene::grid() const
282 {
283  return d->grid;
284 }
285 
286 void GraphicsScene::setReadOnly( bool ro )
287 {
288  d->readOnly = ro;
289 }
290 
291 bool GraphicsScene::isReadOnly() const
292 {
293  return d->readOnly;
294 }
295 
296 /* Returns the index with column=0 fromt the
297  * same row as idx and with the same parent.
298  * This is used to traverse the tree-structure
299  * of the model
300  */
301 QModelIndex GraphicsScene::mainIndex( const QModelIndex& idx )
302 {
303 #if 0
304  if ( idx.isValid() ) {
305  return idx.model()->index( idx.row(), 0,idx.parent() );
306  } else {
307  return QModelIndex();
308  }
309 #else
310  return idx;
311 #endif
312 }
313 
318 QModelIndex GraphicsScene::dataIndex( const QModelIndex& idx )
319 {
320 #if 0
321  if ( idx.isValid() ) {
322  const QAbstractItemModel* model = idx.model();
323  return model->index( idx.row(), model->columnCount( idx.parent() )-1,idx.parent() );
324  } else {
325  return QModelIndex();
326  }
327 #else
328  return idx;
329 #endif
330 }
331 
336 GraphicsItem* GraphicsScene::createItem( ItemType type ) const
337 {
338 #if 0
339  switch( type ) {
340  case TypeEvent: return 0;
341  case TypeTask: return new TaskItem;
342  case TypeSummary: return new SummaryItem;
343  default: return 0;
344  }
345 #endif
346  //qDebug() << "GraphicsScene::createItem("<<type<<")";
347  Q_UNUSED( type );
348  return new GraphicsItem;
349 }
350 
351 void GraphicsScene::Private::recursiveUpdateMultiItem( const Span& span, const QModelIndex& idx )
352 {
353  //qDebug() << "recursiveUpdateMultiItem("<<span<<idx<<")";
354  GraphicsItem* item = q->findItem( idx );
355  const int itemtype = summaryHandlingModel->data( idx, ItemTypeRole ).toInt();
356  if (!item) {
357  item = q->createItem( static_cast<ItemType>( itemtype ) );
358  item->setIndex( idx );
359  q->insertItem( idx, item);
360  }
361  item->updateItem( span, idx );
362  QModelIndex child;
363  int cr = 0;
364  while ( ( child = idx.child( cr, 0 ) ).isValid() ) {
365  recursiveUpdateMultiItem( span, child );
366  ++cr;
367  }
368 }
369 
370 void GraphicsScene::updateRow( const QModelIndex& rowidx )
371 {
372  //qDebug() << "GraphicsScene::updateRow("<<rowidx<<")" << rowidx.data( Qt::DisplayRole );
373  if ( !rowidx.isValid() ) return;
374  const QAbstractItemModel* model = rowidx.model(); // why const?
375  assert( model );
376  assert( rowController() );
377  assert( model == summaryHandlingModel() );
378 
379  const QModelIndex sidx = summaryHandlingModel()->mapToSource( rowidx );
380  Span rg = rowController()->rowGeometry( sidx );
381  for ( QModelIndex treewalkidx = sidx; treewalkidx.isValid(); treewalkidx = treewalkidx.parent() ) {
382  if ( treewalkidx.data( ItemTypeRole ).toInt() == TypeMulti
383  && !rowController()->isRowExpanded( treewalkidx )) {
384  rg = rowController()->rowGeometry( treewalkidx );
385  }
386  }
387 
388  bool blocked = blockSignals( true );
389  for ( int col = 0; col < summaryHandlingModel()->columnCount( rowidx.parent() ); ++col ) {
390  const QModelIndex idx = summaryHandlingModel()->index( rowidx.row(), col, rowidx.parent() );
391  const QModelIndex sidx = summaryHandlingModel()->mapToSource( idx );
392  const int itemtype = summaryHandlingModel()->data( idx, ItemTypeRole ).toInt();
393  const bool isExpanded = rowController()->isRowExpanded( sidx );
394  if ( itemtype == TypeNone ) {
395  removeItem( idx );
396  continue;
397  }
398  if ( itemtype == TypeMulti && !isExpanded ) {
399  d->recursiveUpdateMultiItem( rg, idx );
400  } else {
401  if ( summaryHandlingModel()->data( rowidx.parent(), ItemTypeRole ).toInt() == TypeMulti && !isExpanded ) {
402  //continue;
403  }
404 
405  GraphicsItem* item = findItem( idx );
406  if (!item) {
407  item = createItem( static_cast<ItemType>( itemtype ) );
408  item->setIndex( idx );
409  insertItem(idx, item);
410  }
411  const Span span = rowController()->rowGeometry( sidx );
412  item->updateItem( span, idx );
413  }
414  }
415  blockSignals( blocked );
416 }
417 
418 void GraphicsScene::insertItem( const QPersistentModelIndex& idx, GraphicsItem* item )
419 {
420  if ( !d->constraintModel.isNull() ) {
421  // Create items for constraints
422  const QModelIndex sidx = summaryHandlingModel()->mapToSource( idx );
423  const QList<Constraint> clst = d->constraintModel->constraintsForIndex( sidx );
424  Q_FOREACH( Constraint c, clst ) {
425  QModelIndex other_idx;
426  if ( c.startIndex() == sidx ) {
427  other_idx = c.endIndex();
428  GraphicsItem* other_item = d->items.value(summaryHandlingModel()->mapFromSource( other_idx ),0);
429  if ( !other_item ) continue;
430  ConstraintGraphicsItem* citem = new ConstraintGraphicsItem( c );
431  item->addStartConstraint( citem );
432  other_item->addEndConstraint( citem );
433  addItem( citem );
434  } else if ( c.endIndex() == sidx ) {
435  other_idx = c.startIndex();
436  GraphicsItem* other_item = d->items.value(summaryHandlingModel()->mapFromSource( other_idx ),0);
437  if ( !other_item ) continue;
438  ConstraintGraphicsItem* citem = new ConstraintGraphicsItem( c );
439  other_item->addStartConstraint( citem );
440  item->addEndConstraint( citem );
441  addItem( citem );
442  } else {
443  assert( 0 ); // Impossible
444  }
445  }
446  }
447  d->items.insert( idx, item );
448  addItem( item );
449 }
450 
451 void GraphicsScene::removeItem( const QModelIndex& idx )
452 {
453  //qDebug() << "GraphicsScene::removeItem("<<idx<<")";
454  QHash<QPersistentModelIndex,GraphicsItem*>::iterator it = d->items.find( idx );
455  if ( it != d->items.end() ) {
456  GraphicsItem* item = *it;
457  assert( item );
458  // We have to remove the item from the list first because
459  // there is a good chance there will be reentrant calls
460  d->items.erase( it );
461  {
462  // Remove any constraintitems attached
463  const QSet<ConstraintGraphicsItem*> clst = QSet<ConstraintGraphicsItem*>::fromList( item->startConstraints() ) +
464  QSet<ConstraintGraphicsItem*>::fromList( item->endConstraints() );
465  Q_FOREACH( ConstraintGraphicsItem* citem, clst ) {
466  d->deleteConstraintItem( citem );
467  }
468  }
469  // Get rid of the item
470  delete item;
471  }
472 }
473 
474 GraphicsItem* GraphicsScene::findItem( const QModelIndex& idx ) const
475 {
476  if ( !idx.isValid() ) return 0;
477  assert( idx.model() == summaryHandlingModel() );
478  QHash<QPersistentModelIndex,GraphicsItem*>::const_iterator it = d->items.find( idx );
479  return ( it != d->items.end() )?*it:0;
480 }
481 
482 GraphicsItem* GraphicsScene::findItem( const QPersistentModelIndex& idx ) const
483 {
484  if ( !idx.isValid() ) return 0;
485  assert( idx.model() == summaryHandlingModel() );
486  QHash<QPersistentModelIndex,GraphicsItem*>::const_iterator it = d->items.find( idx );
487  return ( it != d->items.end() )?*it:0;
488 }
489 
490 void GraphicsScene::clearItems()
491 {
492  // TODO constraints
493  qDeleteAll( items() );
494  d->items.clear();
495 }
496 
497 void GraphicsScene::updateItems()
498 {
499  for ( QHash<QPersistentModelIndex,GraphicsItem*>::iterator it = d->items.begin();
500  it != d->items.end(); ++it ) {
501  GraphicsItem* const item = it.value();
502  const QPersistentModelIndex& idx = it.key();
503  item->updateItem( Span( item->pos().y(), item->rect().height() ), idx );
504  }
505  invalidate( QRectF(), QGraphicsScene::BackgroundLayer );
506 }
507 
508 void GraphicsScene::deleteSubtree( const QModelIndex& _idx )
509 {
510  QModelIndex idx = dataIndex( _idx );
511  if ( !idx.model() ) return;
512  const QModelIndex parent( idx.parent() );
513  const int colcount = idx.model()->columnCount( parent );
514  {for ( int i = 0; i < colcount; ++i ) {
515  removeItem( parent.child( idx.row(), i ) );
516  }}
517  const int rowcount = summaryHandlingModel()->rowCount( _idx );
518  {for ( int i = 0; i < rowcount; ++i ) {
519  deleteSubtree( summaryHandlingModel()->index( i, summaryHandlingModel()->columnCount(_idx)-1, _idx ) );
520  }}
521 }
522 
523 
524 ConstraintGraphicsItem* GraphicsScene::findConstraintItem( const Constraint& c ) const
525 {
526  return d->findConstraintItem( c );
527 }
528 
529 void GraphicsScene::clearConstraintItems()
530 {
531  // TODO
532  // d->constraintItems.clearConstraintItems();
533 }
534 
535 void GraphicsScene::slotConstraintAdded( const Constraint& c )
536 {
537  d->createConstraintItem( c );
538 }
539 
540 void GraphicsScene::slotConstraintRemoved( const Constraint& c )
541 {
542  d->deleteConstraintItem( c );
543 }
544 
545 void GraphicsScene::slotGridChanged()
546 {
547  updateItems();
548  update();
549  emit gridChanged();
550 }
551 
552 void GraphicsScene::helpEvent( QGraphicsSceneHelpEvent *helpEvent )
553 {
554 #ifndef QT_NO_TOOLTIP
555  QGraphicsItem *item = itemAt( helpEvent->scenePos() );
556  if ( GraphicsItem* gitem = qgraphicsitem_cast<GraphicsItem*>( item ) ) {
557  QToolTip::showText(helpEvent->screenPos(), gitem->ganttToolTip());
558  } else if ( ConstraintGraphicsItem* citem = qgraphicsitem_cast<ConstraintGraphicsItem*>( item ) ) {
559  QToolTip::showText(helpEvent->screenPos(), citem->ganttToolTip());
560  } else {
561  QGraphicsScene::helpEvent( helpEvent );
562  }
563 #endif /* QT_NO_TOOLTIP */
564 }
565 
566 void GraphicsScene::drawBackground( QPainter* painter, const QRectF& _rect )
567 {
568  QRectF scn( sceneRect() );
569  QRectF rect( _rect );
570  if ( d->isPrinting ) {
571  QRectF headerRect( scn.topLeft()+QPointF( d->labelsWidth, 0 ),
572  QSizeF( scn.width()-d->labelsWidth, d->rowController->headerHeight() ));
573  d->grid->paintHeader( painter, headerRect, rect, 0, 0 );
574 
575  /* We have to blank out the part of the header that is invisible during
576  * normal rendering when we are printing.
577  */
578  QRectF labelsTabRect( scn.topLeft(), QSizeF( d->labelsWidth, headerRect.height() ) );
579 
580  QStyleOptionHeader opt;
581  opt.rect = labelsTabRect.toRect();
582  opt.text = "";
583  opt.textAlignment = Qt::AlignCenter;
584 #if QT_VERSION >= QT_VERSION_CHECK(4, 4, 0)
585  style()->drawControl(QStyle::CE_Header, &opt, painter, 0);
586 #else
587  QApplication::style()->drawControl(QStyle::CE_Header, &opt, painter, 0);
588 #endif
589  scn.setTop( headerRect.bottom() );
590  scn.setLeft( headerRect.left() );
591  rect = rect.intersected( scn );
592  }
593  d->grid->paintGrid( painter, scn, rect, d->rowController );
594 }
595 
596 void GraphicsScene::itemEntered( const QModelIndex& idx )
597 {
598  emit entered( idx );
599 }
600 
601 void GraphicsScene::itemPressed( const QModelIndex& idx )
602 {
603  emit pressed( idx );
604 }
605 
606 void GraphicsScene::itemClicked( const QModelIndex& idx )
607 {
608  emit clicked( idx );
609 }
610 
611 void GraphicsScene::itemDoubleClicked( const QModelIndex& idx )
612 {
613  emit doubleClicked( idx );
614 }
615 
616 void GraphicsScene::setDragSource( GraphicsItem* item )
617 {
618  d->dragSource = item;
619 }
620 
621 GraphicsItem* GraphicsScene::dragSource() const
622 {
623  return d->dragSource;
624 }
625 
632 void GraphicsScene::print( QPrinter* printer, bool drawRowLabels )
633 {
634 //There is no printer support under wince
635 #ifndef _WIN32_WCE
636  QPainter painter( printer );
637  doPrint( &painter, printer->pageRect(), sceneRect().left(), sceneRect().right(), printer, drawRowLabels );
638 #endif
639 }
640 
651 void GraphicsScene::print( QPrinter* printer, qreal start, qreal end, bool drawRowLabels )
652 {
653 //There is no printer support under wince
654 #ifndef _WIN32_WCE
655  QPainter painter( printer );
656  doPrint( &painter, printer->pageRect(), start, end, printer, drawRowLabels );
657 #endif
658 }
659 
664 void GraphicsScene::print( QPainter* painter, const QRectF& _targetRect, bool drawRowLabels )
665 {
666 //There is no printer support under wince
667 #ifndef _WIN32_WCE
668  QRectF targetRect( _targetRect );
669  if ( targetRect.isNull() ) {
670  targetRect = sceneRect();
671  }
672 
673  doPrint( painter, targetRect, sceneRect().left(), sceneRect().right(), 0, drawRowLabels );
674 #endif
675 }
676 
685 void GraphicsScene::print( QPainter* painter, qreal start, qreal end,
686  const QRectF& _targetRect, bool drawRowLabels )
687 {
688 //There is no printer support under wince
689 #ifndef _WIN32_WCE
690  QRectF targetRect( _targetRect );
691  if ( targetRect.isNull() ) {
692  targetRect = sceneRect();
693  }
694 
695  doPrint( painter, targetRect, start, end, 0, drawRowLabels );
696 #endif
697 }
698 
701 void GraphicsScene::doPrint( QPainter* painter, const QRectF& targetRect,
702  qreal start, qreal end,
703  QPrinter* printer, bool drawRowLabels )
704 {
705 //There is no printer support under wince
706 #ifndef _WIN32_WCE
707  assert( painter );
708  d->isPrinting = true;
709 #if QT_VERSION >= QT_VERSION_CHECK(4, 4, 0)
710  QFont sceneFont( font() );
711  if ( printer ) {
712  sceneFont = QFont( font(), printer );
713  sceneFont.setPixelSize( font().pointSize() );
714  }
715 #else
716  QFont sceneFont( painter->font() );
717  if ( printer ) {
718  sceneFont = QFont( painter->font(), printer );
719  sceneFont.setPixelSize( painter->font().pointSize() );
720  }
721 #endif
722 
723  const QRectF oldScnRect( sceneRect() );
724  QRectF scnRect( oldScnRect );
725  scnRect.setLeft( start );
726  scnRect.setRight( end );
727  scnRect.setTop( -d->rowController->headerHeight() );
728  bool b = blockSignals( true );
729 
730  /* row labels */
731  QVector<QGraphicsTextItem*> textLabels;
732  if ( drawRowLabels ) {
733  qreal textWidth = 0.;
734  QModelIndex sidx = summaryHandlingModel()->mapToSource( summaryHandlingModel()->index( 0, 0, rootIndex()) );
735  do {
736  QModelIndex idx = summaryHandlingModel()->mapFromSource( sidx );
737  const Span rg=rowController()->rowGeometry( sidx );
738  const QString txt = idx.data( Qt::DisplayRole ).toString();
739  QGraphicsTextItem* item = new QGraphicsTextItem( txt );
740  addItem( item );
741  textLabels << item;
742  item->adjustSize();
743  textWidth = qMax( item->textWidth(), textWidth );
744  item->setPos( 0, rg.start() );
745  } while ( ( sidx = rowController()->indexBelow( sidx ) ).isValid() );
746  // Add a little margin to textWidth
747  textWidth += QFontMetricsF(sceneFont).width( QString::fromLatin1( "X" ) );
748  Q_FOREACH( QGraphicsTextItem* item, textLabels ) {
749  item->setPos( scnRect.left()-textWidth, item->y() );
750  item->show();
751  }
752  scnRect.setLeft( scnRect.left()-textWidth );
753  d->labelsWidth = textWidth;
754  }
755 
756  setSceneRect( scnRect );
757 
758  painter->save();
759  painter->setClipRect( targetRect );
760 
761  qreal yratio = targetRect.height()/scnRect.height();
762  /* If we're not printing multiple pages,
763  * check if the span fits and adjust:
764  */
765  if ( !printer && targetRect.width()/scnRect.width() < yratio ) {
766  yratio = targetRect.width()/scnRect.width();
767  }
768 
769  qreal offset = scnRect.left();
770  int pagecount = 0;
771  while ( offset < scnRect.width() ) {
772  painter->setFont( sceneFont );
773  render( painter, targetRect, QRectF( QPointF( offset, scnRect.top()),
774  QSizeF( targetRect.width()/yratio, scnRect.height() ) ) );
775  offset += targetRect.width()/yratio;
776  ++pagecount;
777  if ( printer && offset < scnRect.width() ) {
778  printer->newPage();
779  } else {
780  break;
781  }
782  }
783 
784  d->isPrinting = false;
785  qDeleteAll( textLabels );
786  blockSignals( b );
787  setSceneRect( oldScnRect );
788  painter->restore();
789 #endif
790 }
791 
792 #include "moc_kdganttgraphicsscene.cpp"
793 
KDGantt::GraphicsScene::setReadOnly
void setReadOnly(bool)
Definition: kdganttgraphicsscene.cpp:286
QGraphicsScene
KDGantt::ItemDelegate
Class used to render gantt items in a KDGantt::GraphicsView.
Definition: kdganttitemdelegate.h:39
KDGantt::GraphicsScene::selectionModel
QItemSelectionModel * selectionModel() const
Definition: kdganttgraphicsscene.cpp:255
KDGantt::GraphicsScene::mainIndex
static QModelIndex mainIndex(const QModelIndex &idx)
Definition: kdganttgraphicsscene.cpp:301
KDGantt::ConstraintGraphicsItem::constraint
const Constraint & constraint() const
Definition: kdganttconstraintgraphicsitem.h:52
KDGantt::Constraint::endIndex
QModelIndex endIndex() const
Definition: kdganttconstraint.cpp:113
KDGantt::GraphicsScene::clearItems
void clearItems()
Definition: kdganttgraphicsscene.cpp:490
KDGantt::GraphicsItem::updateItem
void updateItem(const Span &rowgeometry, const QPersistentModelIndex &idx)
Definition: kdganttgraphicsitem.cpp:276
KDGantt::GraphicsScene::doubleClicked
void doubleClicked(const QModelIndex &index)
KDGantt::Span::start
qreal start() const
Definition: kdganttglobal.h:232
KDGantt::TypeSummary
Definition: kdganttglobal.h:215
kdganttsummaryhandlingproxymodel.h
KDGantt::GraphicsScene::itemDoubleClicked
void itemDoubleClicked(const QModelIndex &)
Definition: kdganttgraphicsscene.cpp:611
KDGantt::GraphicsItem::removeStartConstraint
void removeStartConstraint(ConstraintGraphicsItem *)
Definition: kdganttgraphicsitem.cpp:248
KDGantt::GraphicsScene::setSelectionModel
void setSelectionModel(QItemSelectionModel *selectionmodel)
Definition: kdganttgraphicsscene.cpp:249
KDGantt::GraphicsScene::Private::deleteConstraintItem
void deleteConstraintItem(ConstraintGraphicsItem *citem)
Definition: kdganttgraphicsscene.cpp:103
KDGantt::GraphicsScene::setSummaryHandlingModel
void setSummaryHandlingModel(QAbstractProxyModel *)
Definition: kdganttgraphicsscene.cpp:216
KDGantt::AbstractRowController::isRowExpanded
virtual bool isRowExpanded(const QModelIndex &idx) const =0
KDGantt::GraphicsScene::grid
AbstractGrid * grid() const
Definition: kdganttgraphicsscene.cpp:281
KDGantt::GraphicsScene::setConstraintModel
void setConstraintModel(ConstraintModel *)
Definition: kdganttgraphicsscene.cpp:237
QGraphicsItem
KDGantt::TypeEvent
Definition: kdganttglobal.h:213
KDGantt::ItemType
ItemType
Definition: kdganttglobal.h:211
d
#define d
Definition: kdganttgraphicsscene.cpp:172
KDGantt::GraphicsScene::drawBackground
void drawBackground(QPainter *painter, const QRectF &rect)
Definition: kdganttgraphicsscene.cpp:566
kdganttconstraint.h
KDGantt::GraphicsScene::Private::resetConstraintItems
void resetConstraintItems()
Definition: kdganttgraphicsscene.cpp:74
KDGantt::Constraint::startIndex
QModelIndex startIndex() const
Definition: kdganttconstraint.cpp:107
KDGantt::GraphicsScene::dataIndex
static QModelIndex dataIndex(const QModelIndex &idx)
Definition: kdganttgraphicsscene.cpp:318
KDGantt::GraphicsScene::itemClicked
void itemClicked(const QModelIndex &)
Definition: kdganttgraphicsscene.cpp:606
KDGantt::GraphicsScene::updateItems
void updateItems()
Definition: kdganttgraphicsscene.cpp:497
QObject
KDGantt::GraphicsScene::setModel
void setModel(QAbstractItemModel *)
Definition: kdganttgraphicsscene.cpp:203
KDGantt::GraphicsScene::Private
Definition: kdganttgraphicsscene_p.h:39
KDGantt::GraphicsScene::itemEntered
void itemEntered(const QModelIndex &)
Definition: kdganttgraphicsscene.cpp:596
KDGantt::GraphicsScene
Definition: kdganttgraphicsscene.h:48
KDGantt::GraphicsScene::setGrid
void setGrid(AbstractGrid *grid)
Definition: kdganttgraphicsscene.cpp:270
KDGantt::GraphicsScene::dragSource
GraphicsItem * dragSource() const
Definition: kdganttgraphicsscene.cpp:621
KDGantt::TypeTask
Definition: kdganttglobal.h:214
KDGantt::GraphicsScene::constraintModel
ConstraintModel * constraintModel() const
Definition: kdganttgraphicsscene.cpp:232
KDGantt::GraphicsScene::updateRow
void updateRow(const QModelIndex &idx)
Definition: kdganttgraphicsscene.cpp:370
KDGantt::GraphicsScene::summaryHandlingModel
QAbstractProxyModel * summaryHandlingModel() const
Definition: kdganttgraphicsscene.cpp:211
KDGantt::Span
A class representing a start point and a length.
Definition: kdganttglobal.h:220
KDGantt::GraphicsScene::setRowController
void setRowController(AbstractRowController *rc)
Definition: kdganttgraphicsscene.cpp:260
KDGantt::GraphicsItem::removeEndConstraint
void removeEndConstraint(ConstraintGraphicsItem *)
Definition: kdganttgraphicsitem.cpp:255
KDGantt::ItemTypeRole
Definition: kdganttglobal.h:207
KDGantt::AbstractGrid
Abstract baseclass for grids. A grid is used to convert between QModelIndex'es and gantt chart values...
Definition: kdganttabstractgrid.h:40
kdganttdatetimegrid.h
KDGantt::GraphicsItem::startConstraints
QList< ConstraintGraphicsItem * > startConstraints() const
Definition: kdganttgraphicsitem.h:76
KDGantt::GraphicsScene::Private::summaryHandlingModel
QPointer< QAbstractProxyModel > summaryHandlingModel
Definition: kdganttgraphicsscene_p.h:67
KDGantt::GraphicsScene::print
void print(QPrinter *printer, bool drawRowLabels=true)
Definition: kdganttgraphicsscene.cpp:632
KDGantt::GraphicsScene::clicked
void clicked(const QModelIndex &index)
KDGantt::GraphicsScene::entered
void entered(const QModelIndex &index)
KDGantt::GraphicsScene::helpEvent
void helpEvent(QGraphicsSceneHelpEvent *helpEvent)
Definition: kdganttgraphicsscene.cpp:552
KDGantt::GraphicsItem::addEndConstraint
void addEndConstraint(ConstraintGraphicsItem *)
Definition: kdganttgraphicsitem.cpp:240
KDGantt::GraphicsScene::pressed
void pressed(const QModelIndex &index)
KDGantt::GraphicsScene::Private::Private
Private(GraphicsScene *)
Definition: kdganttgraphicsscene.cpp:60
KDGantt::GraphicsScene::removeItem
void removeItem(const QModelIndex &)
Definition: kdganttgraphicsscene.cpp:451
kdganttitemdelegate.h
KDGantt::GraphicsScene::itemPressed
void itemPressed(const QModelIndex &)
Definition: kdganttgraphicsscene.cpp:601
KDGantt::GraphicsScene::Private::recursiveUpdateMultiItem
void recursiveUpdateMultiItem(const Span &span, const QModelIndex &idx)
Definition: kdganttgraphicsscene.cpp:351
kdganttgraphicsscene_p.h
KDGantt::GraphicsScene::GraphicsScene
GraphicsScene(QObject *parent=0)
Definition: kdganttgraphicsscene.cpp:160
KDGantt::GraphicsScene::findItem
GraphicsItem * findItem(const QModelIndex &) const
Definition: kdganttgraphicsscene.cpp:474
QAbstractProxyModel
KDGantt::GraphicsScene::isReadOnly
bool isReadOnly() const
Definition: kdganttgraphicsscene.cpp:291
KDGantt::ConstraintModel::constraints
QList< Constraint > constraints() const
Definition: kdganttconstraintmodel.cpp:163
kdganttgraphicsitem.h
kdganttabstractrowcontroller.h
KDGantt::GraphicsScene::findConstraintItem
ConstraintGraphicsItem * findConstraintItem(const Constraint &) const
Definition: kdganttgraphicsscene.cpp:524
KDGantt::SummaryHandlingProxyModel
Proxy model that supports summary gantt items.
Definition: kdganttsummaryhandlingproxymodel.h:31
KDGantt::GraphicsScene::setDragSource
void setDragSource(GraphicsItem *item)
Definition: kdganttgraphicsscene.cpp:616
KDGantt::GraphicsScene::itemDelegate
ItemDelegate * itemDelegate() const
Definition: kdganttgraphicsscene.cpp:192
KDGantt::GraphicsScene::deleteSubtree
void deleteSubtree(const QModelIndex &)
Definition: kdganttgraphicsscene.cpp:508
KDGantt::Constraint
A class used to represent a dependency.
Definition: kdganttconstraint.h:38
KDGantt::GraphicsItem::addStartConstraint
void addStartConstraint(ConstraintGraphicsItem *)
Definition: kdganttgraphicsitem.cpp:232
KDGantt::ConstraintGraphicsItem
Definition: kdganttconstraintgraphicsitem.h:35
KDGantt::TypeMulti
Definition: kdganttglobal.h:216
KDGantt::TypeNone
Definition: kdganttglobal.h:212
KDGantt::GraphicsScene::rootIndex
QModelIndex rootIndex() const
Definition: kdganttgraphicsscene.cpp:227
KDGantt::GraphicsItem::setIndex
void setIndex(const QPersistentModelIndex &idx)
Definition: kdganttgraphicsitem.cpp:184
KDGantt::GraphicsScene::rowController
AbstractRowController * rowController() const
Definition: kdganttgraphicsscene.cpp:265
KDGantt::AbstractRowController::rowGeometry
virtual Span rowGeometry(const QModelIndex &idx) const =0
KDGantt::GraphicsScene::~GraphicsScene
virtual ~GraphicsScene()
Definition: kdganttgraphicsscene.cpp:166
KDGantt::GraphicsScene::createItem
GraphicsItem * createItem(ItemType type) const
Definition: kdganttgraphicsscene.cpp:336
kdganttconstraintgraphicsitem.h
KDGantt::GraphicsScene::Private::findConstraintItem
ConstraintGraphicsItem * findConstraintItem(const Constraint &c) const
Definition: kdganttgraphicsscene.cpp:130
KDGantt::GraphicsScene::setItemDelegate
void setItemDelegate(ItemDelegate *)
Definition: kdganttgraphicsscene.cpp:185
KDGantt::GraphicsScene::Private::default_grid
DateTimeGrid default_grid
Definition: kdganttgraphicsscene_p.h:59
KDGantt::GraphicsScene::Private::q
GraphicsScene * q
Definition: kdganttgraphicsscene_p.h:52
KDGantt::GraphicsScene::insertItem
void insertItem(const QPersistentModelIndex &, GraphicsItem *)
Definition: kdganttgraphicsscene.cpp:418
KDGantt::GraphicsScene::Private::createConstraintItem
void createConstraintItem(const Constraint &c)
Definition: kdganttgraphicsscene.cpp:85
KDGantt::GraphicsItem
Definition: kdganttgraphicsitem.h:42
KDGantt::AbstractRowController
Abstract baseclass for row controllers. A row controller is used by the GraphicsView to nagivate the ...
Definition: kdganttabstractrowcontroller.h:34
kdganttgraphicsscene.h
KDGantt::GraphicsItem::rect
QRectF rect() const
Definition: kdganttgraphicsitem.h:60
KDGantt::GraphicsScene::model
QAbstractItemModel * model() const
Definition: kdganttgraphicsscene.cpp:197
KDGantt::GraphicsScene::gridChanged
void gridChanged()
KDGantt::DateTimeGrid::setStartDateTime
void setStartDateTime(const QDateTime &dt)
Definition: kdganttdatetimegrid.cpp:309
KDGantt::GraphicsScene::setRootIndex
void setRootIndex(const QModelIndex &idx)
Definition: kdganttgraphicsscene.cpp:222
KDGantt::GraphicsScene::clearConstraintItems
void clearConstraintItems()
Definition: kdganttgraphicsscene.cpp:529
KDGantt::GraphicsItem::endConstraints
QList< ConstraintGraphicsItem * > endConstraints() const
Definition: kdganttgraphicsitem.h:77
KDGantt::ConstraintModel
Definition: kdganttconstraintmodel.h:35
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:55:05 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kdgantt2

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

kdepim API Reference

Skip menu "kdepim API Reference"
  • akonadi_next
  • akregator
  • blogilo
  • calendarsupport
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt2
  • kjots
  • kleopatra
  • kmail
  • knode
  • knotes
  • kontact
  • korgac
  • korganizer
  • ktimetracker
  • libkdepim
  • libkleo
  • libkpgp
  • mailcommon
  • messagelist
  • messageviewer

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