17#include "kdganttgraphicsscene_p.h"
21#include <QApplication>
22#include <QGraphicsSceneHelpEvent>
26#include <QTextDocument>
54 , rowController(nullptr)
58 , drawColumnLabels(true)
61 , selectionModel(nullptr)
66void GraphicsScene::Private::resetConstraintItems()
68 q->clearConstraintItems();
69 if (constraintModel.isNull())
73 createConstraintItem(c);
78void GraphicsScene::Private::createConstraintItem(
const Constraint &c)
97 if (citem ==
nullptr) {
105 item = items.value(summaryHandlingModel->mapFromSource(c.
endIndex()), 0);
112void GraphicsScene::Private::deleteConstraintItem(
const Constraint &c)
114 deleteConstraintItem(findConstraintItem(c));
123 for (; it != clst.
end(); ++it) {
127 if (it != clst.
end()) {
131 item = items.value(summaryHandlingModel->mapFromSource(c.
endIndex()), 0);
135 for (; it != clst.
end(); ++it) {
139 if (it != clst.
end()) {
148 , _d(new Private(this))
162void GraphicsScene::init()
175 if (!
d->itemDelegate.isNull() &&
d->itemDelegate->parent() ==
this)
176 delete d->itemDelegate;
183 return d->itemDelegate;
188 assert(!
d->summaryHandlingModel.isNull());
189 return d->summaryHandlingModel->sourceModel();
194 assert(!
d->summaryHandlingModel.isNull());
195 d->summaryHandlingModel->setSourceModel(
model);
196 d->grid->setModel(
d->summaryHandlingModel);
202 return d->summaryHandlingModel;
208 d->summaryHandlingModel = proxyModel;
213 d->grid->setRootIndex(
idx);
218 return d->grid->rootIndex();
223 return d->constraintModel;
228 if (!
d->constraintModel.isNull()) {
231 d->constraintModel =
cm;
234 this, &GraphicsScene::slotConstraintAdded);
236 this, &GraphicsScene::slotConstraintRemoved);
237 d->resetConstraintItems();
248 return d->selectionModel;
253 d->rowController =
rc;
258 return d->rowController;
265 grid = &
d->default_grid;
299 if (
idx.isValid() ) {
316 if (
idx.isValid() ) {
346void GraphicsScene::Private::recursiveUpdateMultiItem(
const Span &span,
const QModelIndex &idx)
352 item = q->createItem(
static_cast<ItemType>(itemtype));
354 q->insertItem(idx, item);
359 while ((child = idx.
model()->
index(cr, 0, idx)).isValid()) {
360 recursiveUpdateMultiItem(span, child);
397 d->recursiveUpdateMultiItem(
rg,
idx);
418 if (!
d->constraintModel.isNull()) {
447 d->items.insert(
idx, item);
455 if (
it !=
d->items.end()) {
466#if QT_VERSION > QT_VERSION_CHECK(5, 14, 0)
473 d->deleteConstraintItem(
citem);
487 return (
it !=
d->items.end()) ? *
it : 0;
496 return (
it !=
d->items.end()) ? *
it : 0;
502 for (;
it !=
d->items.constEnd(); ++
it) {
515 it !=
d->items.end(); ++
it) {
545 return d->findConstraintItem(c);
556 d->createConstraintItem(c);
561 d->deleteConstraintItem(c);
564void GraphicsScene::slotGridChanged()
589 if (
d->isPrinting &&
d->drawColumnLabels) {
591 QSizeF(
scn.width() -
d->labelsWidth,
d->rowController->headerHeight()));
593 d->grid->paintHeader(painter,
headerRect, rect, 0,
nullptr);
612 d->grid->paintGrid(painter,
scn, rect,
d->rowController);
614 d->grid->drawBackground(painter, rect);
619 d->grid->drawForeground(painter, rect);
644 d->dragSource = item;
649 return d->dragSource;
725 const QRectF &_targetRect,
bool drawRowLabels,
bool drawColumnLabels)
737void GraphicsScene::doPrint(
QPainter *painter,
const QRectF &targetRect,
738 qreal start, qreal end,
739 QPrinter *printer,
bool drawRowLabels,
bool drawColumnLabels)
742 d->isPrinting =
true;
744 d->labelsWidth = 0.0;
749 if (
font().pointSizeF() >= 0.0)
751 else if (
font().pointSize() >= 0)
770 if (
d->drawColumnLabels) {
772 headerRect.setHeight(-
d->rowController->headerHeight());
779 qreal textWidth = 0.;
789 textWidth =
qMax(item->textWidth(), textWidth);
790 item->setPos(0,
rg.start());
795 item->setPos(
scnRect.left() - textWidth, item->y());
799 d->labelsWidth = textWidth;
817 while (offset <
scnRect.right()) {
822 if (printer && offset <
scnRect.right()) {
831 d->isPrinting =
false;
832 d->drawColumnLabels =
true;
833 d->labelsWidth = 0.0;
840#include "moc_kdganttgraphicsscene.cpp"
842#ifndef KDAB_NO_UNIT_TESTS
843#include "unittest/test.h"
845#include <QGraphicsLineItem>
847#include <QStandardItemModel>
854 static const int ROW_HEIGHT;
858 SceneTestRowController()
867 int headerHeight()
const override
872 bool isRowVisible(
const QModelIndex &)
const override
876 bool isRowExpanded(
const QModelIndex &)
const override
884 int maximumItemHeight()
const override
886 return ROW_HEIGHT / 2;
888 int totalHeight()
const override
890 return m_model->rowCount() * ROW_HEIGHT;
895 return m_model->index(height / ROW_HEIGHT, 0);
915 TestLineItem(
bool *destroyedFlag)
918 m_destroyedFlag(destroyedFlag)
922 ~TestLineItem()
override
924 *m_destroyedFlag =
true;
928 bool *m_destroyedFlag;
931const int SceneTestRowController::ROW_HEIGHT = 30;
952 SceneTestRowController rowController;
953 rowController.setModel(&model);
961 bool foreignItemDestroyed =
false;
962 auto *foreignItem =
new TestLineItem(&foreignItemDestroyed);
965 assertFalse(foreignItemDestroyed);
967 assertFalse(foreignItemDestroyed);
Abstract baseclass for grids.
Abstract baseclass for row controllers.
virtual bool isRowExpanded(const QModelIndex &idx) const =0
virtual Span rowGeometry(const QModelIndex &idx) const =0
const Constraint & constraint() const
The ConstraintModel keeps track of the interdependencies between gantt items in a View.
void constraintRemoved(const KDGantt::Constraint &)
void constraintAdded(const KDGantt::Constraint &)
A class used to represent a dependency.
QModelIndex endIndex() const
bool compareIndexes(const Constraint &other) const
QModelIndex startIndex() const
QList< ConstraintGraphicsItem * > startConstraints() const
void removeStartConstraint(ConstraintGraphicsItem *)
void addEndConstraint(ConstraintGraphicsItem *)
void updateItem(const Span &rowgeometry, const QPersistentModelIndex &idx)
QList< ConstraintGraphicsItem * > endConstraints() const
void removeEndConstraint(ConstraintGraphicsItem *)
void setIndex(const QPersistentModelIndex &idx)
void addStartConstraint(ConstraintGraphicsItem *)
void entered(const QModelIndex &index)
void itemDoubleClicked(const QModelIndex &)
void setConstraintModel(ConstraintModel *)
AbstractRowController * rowController() const
ItemDelegate * itemDelegate() const
void itemClicked(const QModelIndex &)
void removeItem(const QModelIndex &)
ConstraintModel * constraintModel() const
void itemEntered(const QModelIndex &)
void clicked(const QModelIndex &index)
void setSummaryHandlingModel(QAbstractProxyModel *)
void qrealClicked(const QModelIndex &index)
void updateRow(const QModelIndex &idx)
void drawBackground(QPainter *painter, const QRectF &rect) override
static QModelIndex dataIndex(const QModelIndex &idx)
Returns the index pointing to the last column in the same row as idx.
GraphicsScene(QObject *parent=nullptr)
void setRowController(AbstractRowController *rc)
void pressed(const QModelIndex &index)
void drawForeground(QPainter *painter, const QRectF &rect) override
void setModel(QAbstractItemModel *)
void setGrid(AbstractGrid *grid)
GraphicsItem * findItem(const QModelIndex &) const
void setItemDelegate(ItemDelegate *)
static QModelIndex mainIndex(const QModelIndex &idx)
void deleteSubtree(const QModelIndex &)
GraphicsItem * createItem(ItemType type) const
Creates a new item of type type.
GraphicsItem * dragSource() const
void helpEvent(QGraphicsSceneHelpEvent *helpEvent) override
void itemPressed(const QModelIndex &)
void print(QPrinter *printer, bool drawRowLabels=true, bool drawColumnLabels=true)
Print the Gantt chart using printer.
void setSelectionModel(QItemSelectionModel *selectionmodel)
ConstraintGraphicsItem * findConstraintItem(const Constraint &) const
QModelIndex rootIndex() const
void clearConstraintItems()
AbstractGrid * grid() const
~GraphicsScene() override
void setRootIndex(const QModelIndex &idx)
QItemSelectionModel * selectionModel() const
void insertItem(const QPersistentModelIndex &, GraphicsItem *)
void setDragSource(GraphicsItem *item)
QAbstractItemModel * model() const
QAbstractProxyModel * summaryHandlingModel() const
The GraphicsView class provides a model/view implementation of a gantt chart.
void setModel(QAbstractItemModel *)
Sets the model to be displayed in this view to model.
void setRowController(AbstractRowController *)
Sets the AbstractRowController used by this view.
Class used to render gantt items in a KDGantt::GraphicsView.
A class representing a start point and a length.
Proxy model that supports summary gantt items.
KDAB_SCOPED_UNITTEST_SIMPLE(KDGantt, Constraint, "test")
virtual int columnCount(const QModelIndex &parent) const const=0
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const const=0
virtual int rowCount(const QModelIndex &parent) const const=0
virtual QVariant data(const QModelIndex &proxyIndex, int role) const const override
virtual QModelIndex mapFromSource(const QModelIndex &sourceIndex) const const=0
virtual QModelIndex mapToSource(const QModelIndex &proxyIndex) const const=0
virtual void setSourceModel(QAbstractItemModel *sourceModel)
QDateTime currentDateTime()
qreal horizontalAdvance(const QString &text, int length) const const
QVariant data(int key) const const
QPointF pos() const const
QGraphicsItem * itemAt(const QPointF &position) const const
void addItem(QGraphicsItem *item)
virtual void helpEvent(QGraphicsSceneHelpEvent *helpEvent)
void invalidate(qreal x, qreal y, qreal w, qreal h, QGraphicsScene::SceneLayers layers)
void setItemIndexMethod(QGraphicsScene::ItemIndexMethod method)
QList< QGraphicsItem * > items(Qt::SortOrder order) const const
void render(QPainter *painter, const QRectF &target, const QRectF &source, Qt::AspectRatioMode aspectRatioMode)
QStyle * style() const const
void update(qreal x, qreal y, qreal w, qreal h)
QGraphicsScene * scene() const const
bool isValid() const const
const QAbstractItemModel * model() const const
QModelIndex parent() const const
bool blockSignals(bool block)
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
QObject * parent() const const
T qobject_cast(QObject *object)
QRect paintRectPixels(int resolution) const const
void setClipRect(const QRectF &rectangle, Qt::ClipOperation operation)
void setFont(const QFont &font)
virtual bool newPage() override
QPageLayout pageLayout() const const
int resolution() const const
qreal height() const const
QRectF intersected(const QRectF &rectangle) const const
QSet< T > fromList(const QList< T > &list)
void appendRow(const QList< QStandardItem * > &items)
QString fromLatin1(const char *str, int size)
virtual void drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const const=0
void showText(const QPoint &pos, const QString &text, QWidget *w)
int toInt(bool *ok) const const