15#include "kdganttgraphicsview_p.h"
17#include <QAbstractProxyModel>
18#include <QActionGroup>
23#include <QResizeEvent>
29#include "../evaldialog/evaldialog.h"
45HeaderWidget::~HeaderWidget()
49void HeaderWidget::scrollTo(
int v)
60 view()->grid()->paintHeader(&p, rect(), ev->
rect(), m_offset,
this);
63bool HeaderWidget::event(
QEvent *event)
66 auto *
const grid = qobject_cast<DateTimeGrid *>(view()->grid());
69 QDateTime dt = grid->mapFromChart(view()->mapToScene(e->x(), 0).x()).toDateTime();
80 auto *
const grid = qobject_cast<DateTimeGrid *>(view()->grid());
81 QAction *actionScaleAuto =
nullptr;
82 QAction *actionScaleMonth =
nullptr;
83 QAction *actionScaleWeek =
nullptr;
84 QAction *actionScaleDay =
nullptr;
85 QAction *actionScaleHour =
nullptr;
86 QAction *actionZoomIn =
nullptr;
87 QAction *actionZoomOut =
nullptr;
88 if (grid !=
nullptr) {
89 auto *menuScale =
new QMenu(tr(
"Scale"), &contextMenu);
91 scaleGroup->setExclusive(
true);
93 actionScaleAuto =
new QAction(tr(
"Auto"), menuScale);
96 actionScaleMonth =
new QAction(tr(
"Month"), menuScale);
99 actionScaleWeek =
new QAction(tr(
"Week"), menuScale);
102 actionScaleDay =
new QAction(tr(
"Day"), menuScale);
105 actionScaleHour =
new QAction(tr(
"Hour"), menuScale);
109 scaleGroup->addAction(actionScaleAuto);
110 menuScale->addAction(actionScaleAuto);
112 scaleGroup->addAction(actionScaleMonth);
113 menuScale->addAction(actionScaleMonth);
115 scaleGroup->addAction(actionScaleWeek);
116 menuScale->addAction(actionScaleWeek);
118 scaleGroup->addAction(actionScaleDay);
119 menuScale->addAction(actionScaleDay);
121 scaleGroup->addAction(actionScaleHour);
122 menuScale->addAction(actionScaleHour);
124 contextMenu.
addMenu(menuScale);
128 actionZoomIn =
new QAction(tr(
"Zoom In"), &contextMenu);
130 actionZoomOut =
new QAction(tr(
"Zoom Out"), &contextMenu);
140 if (action ==
nullptr) {
141 }
else if (action == actionScaleAuto) {
142 assert(grid !=
nullptr);
144 }
else if (action == actionScaleMonth) {
145 assert(grid !=
nullptr);
147 }
else if (action == actionScaleWeek) {
148 assert(grid !=
nullptr);
150 }
else if (action == actionScaleDay) {
151 assert(grid !=
nullptr);
153 }
else if (action == actionScaleHour) {
154 assert(grid !=
nullptr);
156 }
else if (action == actionZoomIn) {
157 assert(grid !=
nullptr);
158 grid->setDayWidth(qMax(0.1, grid->dayWidth() + grid->dayWidth() * 0.2));
159 }
else if (action == actionZoomOut) {
160 assert(grid !=
nullptr);
161 grid->setDayWidth(qMax(0.1, grid->dayWidth() - grid->dayWidth() * 0.2));
169 , rowcontroller(nullptr)
174void GraphicsView::Private::updateHeaderGeometry()
176 q->setViewportMargins(0, rowcontroller->headerHeight(), 0, 0);
177 headerwidget.setGeometry(q->viewport()->x(),
178 q->viewport()->y() - rowcontroller->headerHeight(),
179 q->viewport()->width(),
180 rowcontroller->headerHeight());
183void GraphicsView::Private::slotGridChanged()
185 updateHeaderGeometry();
186 headerwidget.update();
187 q->updateSceneRect();
191void GraphicsView::Private::slotHorizontalScrollValueChanged(
int val)
193 const QRectF viewRect = q->transform().mapRect(q->sceneRect());
194 headerwidget.scrollTo(val - q->horizontalScrollBar()->minimum() +
static_cast<int>(viewRect.
left()));
197void GraphicsView::Private::slotColumnsInserted(
const QModelIndex &parent,
int start,
int end)
203 scene.updateRow(scene.summaryHandlingModel()->mapFromSource(idx));
204 }
while ((idx = rowcontroller->indexBelow(idx)) !=
QModelIndex() && rowcontroller->isRowVisible(idx));
206 q->updateSceneRect();
209void GraphicsView::Private::slotColumnsRemoved(
const QModelIndex &parent,
int start,
int end)
222 for (
int row = topLeft.
row(); row <= bottomRight.
row(); ++row) {
223 scene.updateRow(scene.summaryHandlingModel()->index(row, 0, parent));
227void GraphicsView::Private::slotLayoutChanged()
233void GraphicsView::Private::slotModelReset()
239void GraphicsView::Private::slotRowsInserted(
const QModelIndex &parent,
int start,
int end)
247void GraphicsView::Private::slotRowsAboutToBeRemoved(
const QModelIndex &parent,
int start,
int end)
250 for (
int row = start; row <= end; ++row) {
251 for (
int col = 0; col < scene.summaryHandlingModel()->columnCount(parent); ++col) {
253 scene.removeItem(scene.summaryHandlingModel()->index(row, col, parent));
258void GraphicsView::Private::slotRowsRemoved(
const QModelIndex &parent,
int start,
int end)
269void GraphicsView::Private::slotItemClicked(
const QModelIndex &idx)
272 Q_EMIT q->clicked(sidx);
274 Q_EMIT q->activated(sidx);
277void GraphicsView::Private::slotItemDoubleClicked(
const QModelIndex &idx)
280 Q_EMIT q->qrealClicked(sidx);
282 Q_EMIT q->activated(sidx);
285void GraphicsView::Private::slotHeaderContextMenuRequested(
const QPoint &pt)
287 Q_EMIT q->headerContextMenuRequested(headerwidget.mapToGlobal(pt));
313 , _d(new Private(this))
316 EvalDialog::checkEvalLicense(
"KD Gantt");
319 this, [
this](
int value) {
320 _d->slotHorizontalScrollValueChanged(value);
324 _d->slotGridChanged();
332 _d->slotItemClicked(index);
336 _d->slotItemDoubleClicked(index);
340 connect(&_d->headerwidget, &HeaderWidget::customContextMenuRequested,
341 this, [
this](
const QPoint &point) {
342 _d->slotHeaderContextMenuRequested(point);
379 if (
d->scene.model()) {
392 return d->scene.model();
398 d->scene.setSummaryHandlingModel(proxyModel);
405 d->slotColumnsInserted(
parent, first, last);
409 d->slotColumnsRemoved(
parent, first, last);
413 d->slotDataChanged(topLeft, bottomRight);
417 d->slotLayoutChanged();
425 d->slotRowsInserted(
parent, first, last);
429 d->slotRowsAboutToBeRemoved(
parent, first, last);
433 d->slotRowsRemoved(
parent, first, last);
444 d->scene.setConstraintModel(
cmodel);
451 return d->scene.constraintModel();
458 return d->scene.summaryHandlingModel();
466 d->scene.setRootIndex(
idx);
473 return d->scene.rootIndex();
481 d->scene.setSelectionModel(
model);
488 return d->scene.selectionModel();
503 return d->scene.itemDelegate();
523 return d->rowcontroller;
533 d->scene.setGrid(
grid);
534 d->slotGridChanged();
541 return d->scene.grid();
549 d->scene.setReadOnly(
ro);
556 return d->scene.isReadOnly();
570 d->headerwidget.setContextMenuPolicy(p);
577 return d->headerwidget.contextMenuPolicy();
597 if (
cmodel->hasConstraint(c))
598 cmodel->removeConstraint(c);
605 d->updateHeaderGeometry();
639 return d->scene.summaryHandlingModel()->mapToSource(
gitem->index());
648 d->scene.clearItems();
654 d->scene.updateRow(
d->scene.summaryHandlingModel()->mapFromSource(
idx));
667 QRectF r =
d->scene.itemsBoundingRect();
675 d->scene.setSceneRect(r);
774 const QRectF &targetRect,
bool drawRowLabels,
bool drawColumnLabels)
779#include "moc_kdganttgraphicsview.cpp"
Abstract baseclass for grids.
Abstract baseclass for row controllers.
virtual int totalHeight() const =0
The ConstraintModel keeps track of the interdependencies between gantt items in a View.
A class used to represent a dependency.
GraphicsScene * scene() const
void entered(const QModelIndex &index)
void clicked(const QModelIndex &index)
void qrealClicked(const QModelIndex &index)
void pressed(const QModelIndex &index)
void deleteSubtree(const QModelIndex &)
GraphicsItem * createItem(ItemType type) const
Creates a new item of type type.
The GraphicsView class provides a model/view implementation of a gantt chart.
void setItemDelegate(ItemDelegate *delegate)
Sets the KDGantt::ItemDelegate used for rendering items on this view.
void setModel(QAbstractItemModel *)
Sets the model to be displayed in this view to model.
QAbstractItemModel * model() const
void entered(const QModelIndex &index)
void pressed(const QModelIndex &index)
void setRootIndex(const QModelIndex &)
Sets the root index of the model displayed by this view.
void setRowController(AbstractRowController *)
Sets the AbstractRowController used by this view.
~GraphicsView() override
Destroys this view.
void print(QPrinter *printer, bool drawRowLabels=true, bool drawColumnLabels=true)
Print the Gantt chart using printer.
void setSelectionModel(QItemSelectionModel *)
Sets the QItemSelectionModel used by this view to manage selections.
void setGrid(AbstractGrid *)
Sets the AbstractGrid for this view.
void resizeEvent(QResizeEvent *) override
void setHeaderContextMenuPolicy(Qt::ContextMenuPolicy)
Sets the context menu policy for the header.
QModelIndex rootIndex() const
ConstraintModel * constraintModel() const
void setConstraintModel(ConstraintModel *)
Sets the constraintmodel displayed by this view.
GraphicsView(QWidget *parent=nullptr)
Constructor.
virtual void addConstraint(const QModelIndex &from, const QModelIndex &to, Qt::KeyboardModifiers modifiers)
Adds a constraint from from to to.
QItemSelectionModel * selectionModel() const
AbstractGrid * grid() const
AbstractRowController * rowController() const
void setSummaryHandlingModel(QAbstractProxyModel *model)
Qt::ContextMenuPolicy headerContextMenuPolicy() const
void setReadOnly(bool)
Sets the view to read-only mode if to is true.
void updateRow(const QModelIndex &)
ItemDelegate * itemDelegate() const
QModelIndex indexAt(const QPoint &pos) const
QAbstractProxyModel * summaryHandlingModel() const
void deleteSubtree(const QModelIndex &)
Class used to render gantt items in a KDGantt::GraphicsView.
void columnsInserted(const QModelIndex &parent, int first, int last)
void columnsRemoved(const QModelIndex &parent, int first, int last)
void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector< int > &roles)
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const const=0
void layoutChanged(const QList< QPersistentModelIndex > &parents, QAbstractItemModel::LayoutChangeHint hint)
void rowsAboutToBeRemoved(const QModelIndex &parent, int first, int last)
void rowsInserted(const QModelIndex &parent, int first, int last)
void rowsRemoved(const QModelIndex &parent, int first, int last)
void valueChanged(int value)
QString toString(Qt::DateFormat format) const const
QEvent::Type type() const const
void invalidate(qreal x, qreal y, qreal w, qreal h, QGraphicsScene::SceneLayers layers)
QRectF itemsBoundingRect() const const
void setSceneRect(const QRectF &rect)
void sceneRectChanged(const QRectF &rect)
QGraphicsItem * itemAt(const QPoint &pos) const const
virtual void resizeEvent(QResizeEvent *event) override
QGraphicsScene * scene() const const
void setScene(QGraphicsScene *scene)
void setViewportUpdateMode(QGraphicsView::ViewportUpdateMode mode)
const QAbstractItemModel * model() const const
QModelIndex parent() const const
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)
const QRect & rect() const const
qreal height() const const
void setHeight(qreal height)
void setSize(const QSizeF &size)
void setWidth(qreal width)
QSizeF size() const const
qreal width() const const
QSizeF expandedTo(const QSizeF &otherSize) const const
SH_ItemView_ActivateItemOnSingleClick
typedef KeyboardModifiers