diff options
author | Marius Bugge Monsen <mmonsen@trolltech.com> | 2009-05-22 17:08:59 +0200 |
---|---|---|
committer | Marius Bugge Monsen <mmonsen@trolltech.com> | 2009-05-22 17:08:59 +0200 |
commit | 414eb8832de12411c5273a90f24d78b10a9ee90e (patch) | |
tree | 2afa4ceec57252b42850dd53484a846f7293308f /src | |
parent | fe7d51a8afc54c851db77b51b2e80aa3a271c768 (diff) |
Add an item creator to QtGraphicsTableView. Remove an unnecessary function in QtTableController.
Diffstat (limited to 'src')
-rw-r--r-- | src/qgraphicstableview.cpp | 77 | ||||
-rw-r--r-- | src/qgraphicstableview.h | 19 | ||||
-rw-r--r-- | src/qgraphicstableview_p.h | 1 | ||||
-rw-r--r-- | src/qtablecontroller.cpp | 32 | ||||
-rw-r--r-- | src/qtablecontroller_p.h | 1 |
5 files changed, 85 insertions, 45 deletions
diff --git a/src/qgraphicstableview.cpp b/src/qgraphicstableview.cpp index e2c09a3..b15efe6 100644 --- a/src/qgraphicstableview.cpp +++ b/src/qgraphicstableview.cpp @@ -136,15 +136,38 @@ void QtGraphicsTableViewItem::paint(QPainter *painter, const QStyleOptionGraphic Q_D(QtGraphicsTableViewItem); // draw content d->view->initStyleOption(&d->option); + d->view->copyStyleOptionState(option, &d->option); d->view->initStyleOption(&d->option, d->row, d->column); d->option.rect = QRectF(QPointF(), size()).toRect(); - d->view->copyStyleOptionState(option, &d->option); style()->drawControl(QStyle::CE_ItemViewItem, &d->option, painter, widget); // draw grid const QColor gridColor = static_cast<QRgb>(style()->styleHint(QStyle::SH_Table_GridLineColor, &d->option, widget)); painter->fillRect(option->rect.left(), option->rect.bottom(), option->rect.width(), 1, gridColor); painter->fillRect(option->rect.right(), option->rect.top(), 1, option->rect.height(), gridColor); } +/*! + \class QtGraphicsTableViewItemCreatorBase + */ + +QtGraphicsTableViewItemCreatorBase::~QtGraphicsTableViewItemCreatorBase() +{ +} + +QtGraphicsTableViewItem *QtGraphicsTableViewItemCreatorBase::recycle(int row, int column, QtGraphicsTableViewItem *item) const +{ + Q_ASSERT(item); + item->setCell(row, column); + return item; +} + +void QtGraphicsTableViewItemCreatorBase::destroy(QtGraphicsTableViewItem *item) const +{ + delete item; +} + +/*! + \class QtGraphicsListViewItemCreator + */ // QtGraphicsTableViewPrivate @@ -164,14 +187,13 @@ QtGraphicsTableViewPrivate::QtGraphicsTableViewPrivate() showGrid(true), cachedDataRow(-1), cachedDataColumn(-1), + creator(new QtGraphicsTableViewItemCreator<QtGraphicsTableViewItem>()), q_ptr(0) { } QtGraphicsTableViewPrivate::~QtGraphicsTableViewPrivate() { - delete verticalHeader; - delete horizontalHeader; } void QtGraphicsTableViewPrivate::_q_controllerDestroyed() @@ -209,17 +231,28 @@ void QtGraphicsTableViewPrivate::_q_cellsChanged(int firstRow, int firstColumn, void QtGraphicsTableViewPrivate::_q_selectionsChanged(const QList<QtTableSelectionRange> &changed) { - Q_UNUSED(changed) - // ### + // ### FIXME: naive lookup + for (int i = 0; i < items.count(); ++i) { + for (int j = 0; j < changed.count(); ++j) { + QtGraphicsTableViewItem *item = items.at(i); + if (changed.at(j).containsCell(item->row(), item->column())) { + item->update(); + break; + } + } + } } void QtGraphicsTableViewPrivate::_q_currentChanged(int currentRow, int currentColumn, int previousRow, int previousColumn) { - Q_UNUSED(currentColumn); - Q_UNUSED(currentRow); Q_UNUSED(previousColumn); Q_UNUSED(previousRow); - // ### + // ### FIXME: naive lookup + for (int i = 0; i < items.count(); ++i) { + QtGraphicsTableViewItem *item = items.at(i); + if (item->row() == currentRow && item->column() == currentColumn) + item->update(); + } } void QtGraphicsTableViewPrivate::_q_rowsInserted(int row, int count) @@ -869,6 +902,23 @@ qreal QtGraphicsTableView::maximumVerticalOffset() const return (d->model->rowCount() * d->defaultRowHeight) - geometry().height(); return 0; } +/*! + */ +QtGraphicsTableViewItemCreatorBase *QtGraphicsTableView::itemCreator() const +{ + Q_D(const QtGraphicsTableView); + return d->creator; +} + +/*! + */ +void QtGraphicsTableView::setItemCreator(QtGraphicsTableViewItemCreatorBase *creator) +{ + Q_D(QtGraphicsTableView); + if (d->creator) + delete d->creator; + d->creator = creator; +} /*! */ @@ -928,16 +978,15 @@ void QtGraphicsTableView::doLayout() const int column = horizontalMapping.value(horizontalSection, horizontalSection); const qreal width = columnWidth(column); const int index = ((verticalSection * horizontalCount) + horizontalSection) - firstIndex; - // ### FIXME: recycle properly + // ### FIXME: scroll the items properly rather than just setting row and column QtGraphicsTableViewItem *item = d->items.value(index, 0); if (item) { - item->setGeometry(x, y, width, height); - item->setCell(row, column); + item = d->creator->recycle(row, column, item); } else if (index >= d->items.count()) { - item = new QtGraphicsTableViewItem(row, column, this); + item = d->creator->create(row, column, this); d->items.append(item); - item->setGeometry(x, y, width, height); } + item->setGeometry(x, y, width, height); x += width; } y += height; @@ -946,7 +995,7 @@ void QtGraphicsTableView::doLayout() const int lastIndex = (lastRow * horizontalCount) + lastColumn; const int removeCount = d->items.count() - (lastIndex - firstIndex) - 1; for (int i = 0; i < removeCount; ++i) - delete d->items.takeLast(); + d->creator->destroy(d->items.takeLast()); } /*! diff --git a/src/qgraphicstableview.h b/src/qgraphicstableview.h index 875ee70..eb03e86 100644 --- a/src/qgraphicstableview.h +++ b/src/qgraphicstableview.h @@ -76,6 +76,22 @@ private: Q_DECLARE_PRIVATE(QtGraphicsTableViewItem) }; +class QtGraphicsTableViewItemCreatorBase +{ +public: + virtual ~QtGraphicsTableViewItemCreatorBase(); + virtual QtGraphicsTableViewItem *create(int row, int column, QtGraphicsTableView *view) const = 0; + virtual QtGraphicsTableViewItem *recycle(int row, int column, QtGraphicsTableViewItem *item) const; + virtual void destroy(QtGraphicsTableViewItem *item) const; +}; + +template <class T> +class Q_ITEMVIEWSNG_EXPORT QtGraphicsTableViewItemCreator : public QtGraphicsTableViewItemCreatorBase +{ +public: + inline QtGraphicsTableViewItem *create(int row, int column, QtGraphicsTableView *view) const { return new T(row, column, view); } +}; + class Q_ITEMVIEWSNG_EXPORT QtGraphicsTableView : public QGraphicsWidget { Q_OBJECT @@ -153,6 +169,9 @@ public: qreal maximumHorizontalOffset() const; qreal maximumVerticalOffset() const; + QtGraphicsTableViewItemCreatorBase *itemCreator() const; + void setItemCreator(QtGraphicsTableViewItemCreatorBase *creator); + virtual void doLayout(); virtual int rowAt(const QPointF &position, const QTransform &transform = QTransform()) const; virtual int columnAt(const QPointF &position, const QTransform &transform = QTransform()) const; diff --git a/src/qgraphicstableview_p.h b/src/qgraphicstableview_p.h index 5a85a09..c8e5c61 100644 --- a/src/qgraphicstableview_p.h +++ b/src/qgraphicstableview_p.h @@ -115,6 +115,7 @@ public: // view items QList<QtGraphicsTableViewItem*> items; + QtGraphicsTableViewItemCreatorBase *creator; QtGraphicsTableView *q_ptr; }; diff --git a/src/qtablecontroller.cpp b/src/qtablecontroller.cpp index cc21af8..79807c3 100644 --- a/src/qtablecontroller.cpp +++ b/src/qtablecontroller.cpp @@ -282,27 +282,6 @@ void QtTableControllerPrivate::setCellEditorData(QWidget *editor, int row, int c } } -bool QtTableControllerPrivate::sendMouseEditorEvent(QGraphicsSceneMouseEvent *event, const QTransform &transform) -{ - if (editorHash.isEmpty()) - return false; - int row = view ? view->rowAt(event->pos(), transform) : -1; - int column = view ? view->columnAt(event->pos(), transform) : -1; - QWidget *widget = cellEditor(row, column); - if (!widget) - return false; - widget->setFocus(); // ### find more generic rule for setting focus - QPointF pos = view ? view->mapToCell(row, column, event->pos(), transform) : event->pos(); - qDebug() << "sendMouseEditorEvent" << widget << pos; - QMouseEvent *mouseEvent = QMouseEvent::createExtendedMouseEvent(event->type(), - pos, - widget->mapToGlobal(pos.toPoint()), - event->button(), - event->buttons(), - event->modifiers()); - return QApplication::sendEvent(widget, mouseEvent); -} - // QtTableController /*! @@ -737,8 +716,6 @@ bool QtTableController::inputMethodEvent(QInputMethodEvent *event) bool QtTableController::mousePressEvent(QGraphicsSceneMouseEvent *event, const QTransform &transform) { Q_D(QtTableController); - if (d->sendMouseEditorEvent(event, transform)) - return true; if (d->view && d->selectionManager && event->buttons() & Qt::LeftButton) { int row = d->view->rowAt(event->pos(), transform); int column = d->view->columnAt(event->pos(), transform); @@ -764,8 +741,6 @@ bool QtTableController::mousePressEvent(QGraphicsSceneMouseEvent *event, const Q bool QtTableController::mouseMoveEvent(QGraphicsSceneMouseEvent *event, const QTransform &transform) { Q_D(QtTableController); - if (d->sendMouseEditorEvent(event, transform)) - return true; if (d->view && d->selectionManager && event->buttons() & Qt::LeftButton) { const int row = d->view->rowAt(event->pos(), transform); const int column = d->view->columnAt(event->pos(), transform); @@ -783,8 +758,6 @@ bool QtTableController::mouseMoveEvent(QGraphicsSceneMouseEvent *event, const QT bool QtTableController::mouseReleaseEvent(QGraphicsSceneMouseEvent *event, const QTransform &transform) { Q_D(QtTableController); - if (d->sendMouseEditorEvent(event, transform)) - return true; if (d->selectionManager && d->view && event->button() == Qt::LeftButton) { const int row = d->view->rowAt(event->pos(), transform); const int column = d->view->columnAt(event->pos(), transform); @@ -801,9 +774,8 @@ bool QtTableController::mouseReleaseEvent(QGraphicsSceneMouseEvent *event, const */ bool QtTableController::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event, const QTransform &transform) { - Q_D(QtTableController); - if (d->sendMouseEditorEvent(event, transform)) - return true; + Q_UNUSED(event); + Q_UNUSED(transform); return false; } diff --git a/src/qtablecontroller_p.h b/src/qtablecontroller_p.h index da8adc3..7f628f4 100644 --- a/src/qtablecontroller_p.h +++ b/src/qtablecontroller_p.h @@ -83,7 +83,6 @@ public: QWidget *cellEditor(int row, int column) const; void setCellEditor(QWidget *editor, int row, int column); void setCellEditorData(QWidget *editor, int row, int column); - bool sendMouseEditorEvent(QGraphicsSceneMouseEvent *event, const QTransform &transform); QtTableController *q_ptr; QtGraphicsTableView *view; |