summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMarius Bugge Monsen <mmonsen@trolltech.com>2009-05-22 17:08:59 +0200
committerMarius Bugge Monsen <mmonsen@trolltech.com>2009-05-22 17:08:59 +0200
commit414eb8832de12411c5273a90f24d78b10a9ee90e (patch)
tree2afa4ceec57252b42850dd53484a846f7293308f /src
parentfe7d51a8afc54c851db77b51b2e80aa3a271c768 (diff)
Add an item creator to QtGraphicsTableView. Remove an unnecessary function in QtTableController.
Diffstat (limited to 'src')
-rw-r--r--src/qgraphicstableview.cpp77
-rw-r--r--src/qgraphicstableview.h19
-rw-r--r--src/qgraphicstableview_p.h1
-rw-r--r--src/qtablecontroller.cpp32
-rw-r--r--src/qtablecontroller_p.h1
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;