diff --git a/src/KGantt/kganttgraphicsitem.cpp b/src/KGantt/kganttgraphicsitem.cpp --- a/src/KGantt/kganttgraphicsitem.cpp +++ b/src/KGantt/kganttgraphicsitem.cpp @@ -133,7 +133,7 @@ case StyleOptionGanttItem::Center: opt.displayAlignment = Qt::AlignCenter; break; } } - opt.grid = scene()->grid(); + opt.grid = const_cast(scene()->getGrid()); opt.text = m_index.model()->data( m_index, Qt::DisplayRole ).toString(); if ( isEnabled() ) opt.state |= QStyle::State_Enabled; if ( isSelected() ) opt.state |= QStyle::State_Selected; @@ -288,7 +288,7 @@ return; } - const Span s = scene()->grid()->mapToChart( static_cast(idx) ); + const Span s = scene()->getGrid()->mapToChart( static_cast(idx) ); setPos( QPointF( s.start(), rowGeometry.start() ) ); setRect( QRectF( 0., 0., s.length(), rowGeometry.length() ) ); setIndex( idx ); @@ -369,7 +369,7 @@ it2 != m_endConstraints.end() ; ++it2 ) constraints.push_back((*it2)->proxyConstraint()); - if ( scene()->grid()->mapFromChart( Span( scenePos().x(), rect().width() ), + if ( scene()->getGrid()->mapFromChart( Span( scenePos().x(), rect().width() ), index(), constraints ) ) { scene()->updateRow( index().parent() ); diff --git a/src/KGantt/kganttgraphicsscene.h b/src/KGantt/kganttgraphicsscene.h --- a/src/KGantt/kganttgraphicsscene.h +++ b/src/KGantt/kganttgraphicsscene.h @@ -82,6 +82,7 @@ void setGrid( AbstractGrid* grid ); AbstractGrid* grid() const; + const AbstractGrid *getGrid() const; bool isReadOnly() const; diff --git a/src/KGantt/kganttgraphicsscene.cpp b/src/KGantt/kganttgraphicsscene.cpp --- a/src/KGantt/kganttgraphicsscene.cpp +++ b/src/KGantt/kganttgraphicsscene.cpp @@ -24,6 +24,7 @@ #include "kganttconstraintgraphicsitem.h" #include "kganttitemdelegate.h" #include "kganttabstractrowcontroller.h" +#include "kganttabstractgrid.h" #include "kganttdatetimegrid.h" #include "kganttsummaryhandlingproxymodel.h" @@ -179,6 +180,16 @@ clearConstraintItems(); } +AbstractGrid *GraphicsScene::Private::getGrid() +{ + return grid.isNull() ? &default_grid : grid; +} + +const AbstractGrid *GraphicsScene::Private::getGrid() const +{ + return grid.isNull() ? &default_grid : grid; +} + GraphicsScene::GraphicsScene( QObject* parent ) : QGraphicsScene( parent ), _d( new Private( this ) ) { @@ -197,7 +208,7 @@ { setItemIndexMethod( QGraphicsScene::NoIndex ); setConstraintModel( new ConstraintModel( this ) ); - connect( d->grid, SIGNAL(gridChanged()), this, SLOT(slotGridChanged()) ); + connect( d->getGrid(), SIGNAL(gridChanged()), this, SLOT(slotGridChanged()) ); } /* NOTE: The delegate should really be a property @@ -226,7 +237,7 @@ { assert(!d->summaryHandlingModel.isNull()); d->summaryHandlingModel->setSourceModel(model); - d->grid->setModel( d->summaryHandlingModel ); + d->getGrid()->setModel( d->summaryHandlingModel ); setSelectionModel( new QItemSelectionModel( model, this ) ); } @@ -243,12 +254,12 @@ void GraphicsScene::setRootIndex( const QModelIndex& idx ) { - d->grid->setRootIndex( idx ); + d->getGrid()->setRootIndex( idx ); } QModelIndex GraphicsScene::rootIndex() const { - return d->grid->rootIndex(); + return d->getGrid()->rootIndex(); } ConstraintModel* GraphicsScene::constraintModel() const @@ -295,22 +306,28 @@ void GraphicsScene::setGrid( AbstractGrid* grid ) { QAbstractItemModel* model = nullptr; - if ( grid == nullptr ) grid = &d->default_grid; - if ( d->grid ) { - d->grid->disconnect( this ); - model = d->grid->model(); + if ( d->getGrid() ) { + d->getGrid()->disconnect( this ); + model = d->getGrid()->model(); } d->grid = grid; - connect( d->grid, SIGNAL(gridChanged()), this, SLOT(slotGridChanged()) ); - d->grid->setModel( model ); + connect( d->getGrid(), SIGNAL(gridChanged()), this, SLOT(slotGridChanged()) ); + d->getGrid()->setModel( model ); slotGridChanged(); } +// Returns the explicitly set grid AbstractGrid* GraphicsScene::grid() const { return d->grid; } +// May also return the default_grid if a grid has not been set +const AbstractGrid *GraphicsScene::getGrid() const +{ + return d->getGrid(); +} + void GraphicsScene::setReadOnly( bool ro ) { d->readOnly = ro; @@ -595,7 +612,7 @@ QRectF headerRect( scn.topLeft()+QPointF( d->labelsWidth, 0 ), QSizeF( scn.width()-d->labelsWidth, d->rowController->headerHeight() )); - d->grid->paintHeader( painter, headerRect, rect, 0, nullptr ); + d->getGrid()->paintHeader( painter, headerRect, rect, 0, nullptr ); #if 0 /* We have to blank out the part of the header that is invisible during @@ -614,14 +631,14 @@ scn.setLeft( headerRect.left() ); rect = rect.intersected( scn ); } - d->grid->paintGrid( painter, scn, rect, d->rowController ); + d->getGrid()->paintGrid( painter, scn, rect, d->rowController ); - d->grid->drawBackground(painter, rect); + d->getGrid()->drawBackground(painter, rect); } void GraphicsScene::drawForeground( QPainter* painter, const QRectF& rect ) { - d->grid->drawForeground(painter, rect); + d->getGrid()->drawForeground(painter, rect); } void GraphicsScene::itemEntered( const QModelIndex& idx ) diff --git a/src/KGantt/kganttgraphicsscene_p.h b/src/KGantt/kganttgraphicsscene_p.h --- a/src/KGantt/kganttgraphicsscene_p.h +++ b/src/KGantt/kganttgraphicsscene_p.h @@ -31,6 +31,8 @@ #include "kganttdatetimegrid.h" namespace KGantt { + class AbstractGrid; + class Q_DECL_HIDDEN GraphicsScene::Private { public: explicit Private(GraphicsScene*); @@ -45,6 +47,8 @@ void recursiveUpdateMultiItem( const Span& span, const QModelIndex& idx ); void clearItems(); + AbstractGrid *getGrid(); + const AbstractGrid *getGrid() const; GraphicsScene* q; diff --git a/src/KGantt/kganttgraphicsview.h b/src/KGantt/kganttgraphicsview.h --- a/src/KGantt/kganttgraphicsview.h +++ b/src/KGantt/kganttgraphicsview.h @@ -72,6 +72,7 @@ QItemSelectionModel* selectionModel() const; AbstractRowController* rowController() const; AbstractGrid* grid() const; + AbstractGrid* takeGrid(); ItemDelegate* itemDelegate() const; bool isReadOnly() const; diff --git a/src/KGantt/kganttgraphicsview.cpp b/src/KGantt/kganttgraphicsview.cpp --- a/src/KGantt/kganttgraphicsview.cpp +++ b/src/KGantt/kganttgraphicsview.cpp @@ -564,6 +564,17 @@ return d->scene.grid(); } +/*! \returns the AbstractGrid used by this view. + */ +AbstractGrid* GraphicsView::takeGrid() +{ + AbstractGrid *grid = d->scene.grid(); + if ( grid ) { + d->scene.setGrid( nullptr) ; + } + return grid; +} + /*! Sets the view to read-only mode if \a to is true. The default is * read/write if the model permits it. */ diff --git a/src/KGantt/kganttview.cpp b/src/KGantt/kganttview.cpp --- a/src/KGantt/kganttview.cpp +++ b/src/KGantt/kganttview.cpp @@ -358,7 +358,7 @@ d->gfxview = gv; d->gfxview->setModel(old->model()); // use the old ForwardingProxyModel d->setupGraphicsView(); - d->gfxview->setGrid( old->grid() ); + d->gfxview->setGrid( old->takeGrid() ); delete old; } }