summaryrefslogtreecommitdiffstats
path: root/src/qgraphicstableview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qgraphicstableview.cpp')
-rw-r--r--src/qgraphicstableview.cpp361
1 files changed, 180 insertions, 181 deletions
diff --git a/src/qgraphicstableview.cpp b/src/qgraphicstableview.cpp
index a52faeb..3e1b15a 100644
--- a/src/qgraphicstableview.cpp
+++ b/src/qgraphicstableview.cpp
@@ -86,7 +86,7 @@ QSizeF QtGraphicsTableViewItem::sizeHint(Qt::SizeHint which, const QSizeF &const
{
Q_D(const QtGraphicsTableViewItem);
d->view->initStyleOption(&d->option);
- d->view->initStyleOption(&d->option, d->row, d->column);
+ initStyleOption(&d->option);
return sizeHint(d->row, d->column, &d->option, which, constraint);
}
@@ -138,8 +138,8 @@ 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);
+ copyStyleOptionState(option, &d->option);
+ initStyleOption(&d->option);
const QRect rect = QRectF(QPointF(), size()).toRect();
d->option.rect = rect;
// ### FIXME: allow text to be drawn outside the item
@@ -155,6 +155,147 @@ void QtGraphicsTableViewItem::paint(QPainter *painter, const QStyleOptionGraphic
// bottom
painter->fillRect(rect.right(), rect.top(), 1, rect.height(), gridColor);
}
+
+/*!
+ */
+void QtGraphicsTableViewItem::initStyleOption(QStyleOptionViewItemV4 *option) const
+{
+ Q_D(const QtGraphicsTableViewItem);
+ Q_ASSERT(option);
+
+ option->rect = QRect();
+ option->features = 0;
+
+// FIXME:
+ if (d->view->d_func()->isCurrent(d->row, d->column))
+ option->state |= QStyle::State_HasFocus;
+ else
+ option->state &= ~QStyle::State_HasFocus;
+
+ if (d->view->d_func()->isSelected(d->row, d->column))
+ option->state |= QStyle::State_Selected;
+ else
+ option->state &= ~QStyle::State_Selected;
+/*
+ if (d->view->d_func()->mouseOver(d->row, d->column))
+ opt.state |= QStyle::State_MouseOver;
+ else
+ opt.state &= ~QStyle::State_MouseOver;
+*/
+
+ option->rect = QRect();
+ option->features = 0;
+
+ QVariant value;
+
+ // FontRole
+ value = d->view->d_func()->cachedData(d->row, d->column, Qt::FontRole);
+ if (value.isValid()) {
+ option->font = qvariant_cast<QFont>(value).resolve(option->font);
+ option->fontMetrics = QFontMetrics(option->font);
+ } else {
+ option->font = QFont();
+ }
+
+ // TextAlignmentRole
+ value = d->view->d_func()->cachedData(d->row, d->column, Qt::TextAlignmentRole);
+ if (value.isValid())
+ option->displayAlignment = static_cast<Qt::Alignment>(value.toInt());
+ else
+ option->displayAlignment = Qt::AlignLeft|Qt::AlignVCenter;
+
+ // ForegroundRole
+ value = d->view->d_func()->cachedData(d->row, d->column, Qt::ForegroundRole);
+ if (qVariantCanConvert<QBrush>(value))
+ option->palette.setBrush(QPalette::Text, qvariant_cast<QBrush>(value));
+ else
+ option->palette = QPalette();
+
+ // CheckStateRole
+ value = d->view->d_func()->cachedData(d->row, d->column, Qt::CheckStateRole);
+ if (value.isValid()) {
+ option->features |= QStyleOptionViewItemV2::HasCheckIndicator;
+ option->checkState = static_cast<Qt::CheckState>(value.toInt());
+ } else {
+ option->checkState = Qt::Unchecked;
+ }
+
+ // DecorationRole
+ value = d->view->d_func()->cachedData(d->row, d->column, Qt::DecorationRole);
+ if (value.isValid()) {
+ option->features |= QStyleOptionViewItemV2::HasDecoration;
+ switch (value.type()) {
+ case QVariant::Icon:
+ option->icon = qvariant_cast<QIcon>(value);
+ break;
+ case QVariant::Color: {
+ QPixmap pixmap(option->decorationSize);
+ pixmap.fill(qvariant_cast<QColor>(value));
+ option->icon = QIcon(pixmap); }
+ default:
+ break;
+ }
+ } else {
+ option->icon = QIcon();
+ }
+
+ // DisplayRole
+ value = d->view->d_func()->cachedData(d->row, d->column, Qt::DisplayRole);
+ if (value.isValid()) {
+ option->features |= QStyleOptionViewItemV2::HasDisplay;
+ switch (value.type()) {
+ case QVariant::Double:
+ option->text = option->locale.toString(value.toDouble());
+ break;
+ case QVariant::Int:
+ case QVariant::LongLong:
+ option->text = option->locale.toString(value.toLongLong());
+ break;
+ case QVariant::UInt:
+ case QVariant::ULongLong:
+ option->text = option->locale.toString(value.toULongLong());
+ break;
+ case QVariant::Date:
+ option->text = option->locale.toString(value.toDate(), QLocale::ShortFormat);
+ break;
+ case QVariant::Time:
+ option->text = option->locale.toString(value.toTime(), QLocale::ShortFormat);
+ break;
+ case QVariant::DateTime:
+ option->text = option->locale.toString(value.toDateTime().date(), QLocale::ShortFormat);
+ option->text += QLatin1Char(' ');
+ option->text += option->locale.toString(value.toDateTime().time(), QLocale::ShortFormat);
+ break;
+ default: {
+ QString text = value.toString();
+ for (int i = 0; i < text.count(); ++i)
+ if (text.at(i).unicode() == '\n')
+ text[i] = QChar::LineSeparator;
+ option->text = text;
+ break; }
+ }
+ } else {
+ option->text = QString();
+ }
+
+ if (d->view->d_func()->showGrid) {
+ // ### FIXME: create and set a flag for each of the sides of the cell to paint the grid lines.
+ }
+}
+
+/*!
+ */
+void QtGraphicsTableViewItem::copyStyleOptionState(const QStyleOptionGraphicsItem *source, QStyleOptionViewItemV4 *destination)
+{
+ if (source && destination) {
+ destination->state = source->state;
+ destination->direction = source->direction;
+ destination->rect = source->rect;
+ destination->fontMetrics = source->fontMetrics;
+ destination->palette = source->palette;
+ }
+}
+
/*!
\class QtGraphicsTableViewItemCreatorBase
*/
@@ -165,14 +306,16 @@ QtGraphicsTableViewItemCreatorBase::~QtGraphicsTableViewItemCreatorBase()
{
}
-QtGraphicsTableViewItem *QtGraphicsTableViewItemCreatorBase::reassign(int row, int column, QtGraphicsTableViewItem *item)
+void QtGraphicsTableViewItemCreatorBase::update(int row, int column, QGraphicsObject *item, const QList<int> &roles)
{
+ Q_UNUSED(row);
+ Q_UNUSED(column);
+ Q_UNUSED(roles);
Q_ASSERT(item);
- item->setCell(row, column);
- return item;
+ item->update();
}
-void QtGraphicsTableViewItemCreatorBase::recycle(QtGraphicsTableViewItem *item)
+void QtGraphicsTableViewItemCreatorBase::recycle(QGraphicsObject *item)
{
delete item;
}
@@ -253,7 +396,7 @@ void QtGraphicsTableViewPrivate::_q_selectionsChanged(const QList<QtTableSelecti
if (range.intersects(visibleSections)) {
for (int row = range.topRow(); row <= range.bottomRow(); ++row) {
for (int column = range.leftColumn(); column <= range.rightColumn(); ++column) {
- if (QtGraphicsTableViewItem *item = items.value((row * columnCount) + column))
+ if (QGraphicsObject *item = items.value((row * columnCount) + column))
item->update();
}
}
@@ -266,9 +409,9 @@ void QtGraphicsTableViewPrivate::_q_currentChanged(int currentRow, int currentCo
if (!model)
return;
const int columnCount = model->columnCount();
- if (QtGraphicsTableViewItem *current = items.value((currentRow * columnCount) + currentColumn))
+ if (QGraphicsObject *current = items.value((currentRow * columnCount) + currentColumn))
current->update();
- if (QtGraphicsTableViewItem *previous = items.value((previousRow * columnCount) + previousColumn))
+ if (QGraphicsObject *previous = items.value((previousRow * columnCount) + previousColumn))
previous->update();
}
@@ -341,7 +484,7 @@ void QtGraphicsTableViewPrivate::checkItems(int firstRow, int firstColumn, int r
Q_UNUSED(firstColumn);
Q_UNUSED(rowCount);
Q_UNUSED(columnCount);
- QHash<qint64, QtGraphicsTableViewItem*>::iterator it = items.begin();
+ QHash<qint64, QGraphicsObject*>::iterator it = items.begin();
while (it != items.end()) {
creator->recycle(it.value());
++it;
@@ -375,7 +518,7 @@ QVariant QtGraphicsTableViewPrivate::cachedData(int row, int column, int role) c
return QVariant();
if (row != cachedDataRow || column != cachedDataColumn) {
cachedDataHash = model->data(row, column, roles);
- cachedDataRow = row;
+ cachedDataRow = row;
cachedDataColumn = column;
}
return cachedDataHash.value(role);
@@ -428,15 +571,15 @@ void QtGraphicsTableView::setController(QtTableController *controller)
Q_D(QtGraphicsTableView);
if (d->controller == controller)
return;
- if (d->controller) {
- QObject::disconnect(d->controller, SIGNAL(destroyed()),
- this, SLOT(_q_controllerDestroyed()));
- }
- d->controller = controller;
- if (d->controller) {
- QObject::connect(d->controller, SIGNAL(destroyed()),
- this, SLOT(_q_controllerDestroyed()));
- }
+ if (d->controller) {
+ QObject::disconnect(d->controller, SIGNAL(destroyed()),
+ this, SLOT(_q_controllerDestroyed()));
+ }
+ d->controller = controller;
+ if (d->controller) {
+ QObject::connect(d->controller, SIGNAL(destroyed()),
+ this, SLOT(_q_controllerDestroyed()));
+ }
updateLayout();
}
@@ -516,7 +659,7 @@ void QtGraphicsTableView::setSelectionManager(QtTableSelectionManager *selection
disconnect(d->selectionManager, SIGNAL(selectionsChanged(const QList<QtTableSelectionRange>&)),
this, SLOT(_q_selectionsChanged(const QList<QtTableSelectionRange>&)));
disconnect(d->selectionManager, SIGNAL(currentChanged(int,int,int,int)),
- this, SLOT(_q_currentChanged(int,int,int,int)));
+ this, SLOT(_q_currentChanged(int,int,int,int)));
}
d->selectionManager = selectionManager;
if (d->selectionManager) {
@@ -960,7 +1103,7 @@ void QtGraphicsTableView::setItemCreator(QtGraphicsTableViewItemCreatorBase *cre
Returns the visible item for the given \a row and \a column, or null if the item
is not visible.
*/
-QtGraphicsTableViewItem *QtGraphicsTableView::itemForCell(int row, int column) const
+QGraphicsObject *QtGraphicsTableView::itemForCell(int row, int column) const
{
Q_D(const QtGraphicsTableView);
const int columnCount = d->model ? d->model->columnCount() : 0;
@@ -1027,7 +1170,7 @@ void QtGraphicsTableView::doLayout()
const int oldLastHorizontalSection = d->visibleSections.rightColumn();
// find unused items for reassignment
- QStack<QtGraphicsTableViewItem*> unused;
+ QStack<QGraphicsObject*> unused;
/*
--------------
@@ -1047,7 +1190,7 @@ void QtGraphicsTableView::doLayout()
for (int horizontalSection = oldFirstHorizontalSection; horizontalSection <= oldLastHorizontalSection; ++horizontalSection) {
const int column = horizontalMapping.value(horizontalSection, horizontalSection);
const qint64 index = (row * columnCount) + column;
- if (QtGraphicsTableViewItem *item = d->items.take(index))
+ if (QGraphicsObject *item = d->items.take(index))
unused.push(item);
}
}
@@ -1057,7 +1200,7 @@ void QtGraphicsTableView::doLayout()
for (int verticalSection = firstVerticalSection; verticalSection <= lastVerticalSection; ++verticalSection) {
const int row = verticalMapping.value(verticalSection, verticalSection);
const qint64 index = (row * columnCount) + column;
- if (QtGraphicsTableViewItem *item = d->items.take(index))
+ if (QGraphicsObject *item = d->items.take(index))
unused.push(item);
}
}
@@ -1067,7 +1210,7 @@ void QtGraphicsTableView::doLayout()
for (int horizontalSection = oldFirstHorizontalSection; horizontalSection <= oldLastHorizontalSection; ++horizontalSection) {
const int column = horizontalMapping.value(horizontalSection, horizontalSection);
const qint64 index = (row * columnCount) + column;
- if (QtGraphicsTableViewItem *item = d->items.take(index))
+ if (QGraphicsObject *item = d->items.take(index))
unused.push(item);
}
}
@@ -1077,7 +1220,7 @@ void QtGraphicsTableView::doLayout()
for (int verticalSection = firstVerticalSection; verticalSection <= lastVerticalSection; ++verticalSection) {
const int row = verticalMapping.value(verticalSection, verticalSection);
const qint64 index = (row * columnCount) + column;
- if (QtGraphicsTableViewItem *item = d->items.take(index))
+ if (QGraphicsObject *item = d->items.take(index))
unused.push(item);
}
}
@@ -1092,15 +1235,18 @@ void QtGraphicsTableView::doLayout()
const int column = horizontalMapping.value(horizontalSection, horizontalSection);
const qreal width = columnWidth(column);
const qint64 index = (row * columnCount) + column;
- QtGraphicsTableViewItem *item = d->items.value(index);
+ QGraphicsObject *item = d->items.value(index);
if (!item) {
if (unused.isEmpty())
item = d->creator->create(row, column, this);
else
- item = d->creator->reassign(row, column, unused.pop());
+ item = d->creator->reassign(row, column, unused.pop(), this);
d->items.insert(index, item);
}
- item->setGeometry(x, y, width, height);
+ if (item->isWidget())
+ static_cast<QGraphicsWidget*>(item)->setGeometry(x, y, width, height);
+ else
+ item->setPos(x, y);
x += width;
}
y += height;
@@ -1187,6 +1333,7 @@ void QtGraphicsTableView::initStyleOption(QStyleOptionViewItemV4 *option) const
Q_ASSERT(option);
option->widget = 0;
option->font = QApplication::font();
+ option->fontMetrics = QFontMetrics(option->font);
option->decorationPosition = QStyleOptionViewItem::Left;
option->decorationAlignment = Qt::AlignCenter;
//option->displayAlignment = Qt::AlignLeft|Qt::AlignVCenter;
@@ -1204,154 +1351,6 @@ void QtGraphicsTableView::initStyleOption(QStyleOptionViewItemV4 *option) const
option->state |= QStyle::State_Active;
}
-/*!
- */
-void QtGraphicsTableView::initStyleOption(QStyleOptionViewItemV4 *option, int row, int column) const
-{
- Q_D(const QtGraphicsTableView);
- Q_ASSERT(option);
-
- option->rect = QRect();
- option->features = 0;
-
- initStyleOptionState(option, row, column);
-
- option->rect = QRect();
- option->features = 0;
-
- QVariant value;
-
- // FontRole
- value = d->cachedData(row, column, Qt::FontRole);
- if (value.isValid()) {
- option->font = qvariant_cast<QFont>(value).resolve(option->font);
- option->fontMetrics = QFontMetrics(option->font);
- } else {
- option->font = QFont();
- }
-
- // TextAlignmentRole
- value = d->cachedData(row, column, Qt::TextAlignmentRole);
- if (value.isValid())
- option->displayAlignment = static_cast<Qt::Alignment>(value.toInt());
- else
- option->displayAlignment = Qt::AlignLeft|Qt::AlignVCenter;
-
- // ForegroundRole
- value = d->cachedData(row, column, Qt::ForegroundRole);
- if (qVariantCanConvert<QBrush>(value))
- option->palette.setBrush(QPalette::Text, qvariant_cast<QBrush>(value));
- else
- option->palette = QPalette();
-
- // CheckStateRole
- value = d->cachedData(row, column, Qt::CheckStateRole);
- if (value.isValid()) {
- option->features |= QStyleOptionViewItemV2::HasCheckIndicator;
- option->checkState = static_cast<Qt::CheckState>(value.toInt());
- } else {
- option->checkState = Qt::Unchecked;
- }
-
- // DecorationRole
- value = d->cachedData(row, column, Qt::DecorationRole);
- if (value.isValid()) {
- option->features |= QStyleOptionViewItemV2::HasDecoration;
- switch (value.type()) {
- case QVariant::Icon:
- option->icon = qvariant_cast<QIcon>(value);
- break;
- case QVariant::Color: {
- QPixmap pixmap(option->decorationSize);
- pixmap.fill(qvariant_cast<QColor>(value));
- option->icon = QIcon(pixmap); }
- default:
- break;
- }
- } else {
- option->icon = QIcon();
- }
-
- // DisplayRole
- value = d->cachedData(row, column, Qt::DisplayRole);
- if (value.isValid()) {
- option->features |= QStyleOptionViewItemV2::HasDisplay;
- switch (value.type()) {
- case QVariant::Double:
- option->text = option->locale.toString(value.toDouble());
- break;
- case QVariant::Int:
- case QVariant::LongLong:
- option->text = option->locale.toString(value.toLongLong());
- break;
- case QVariant::UInt:
- case QVariant::ULongLong:
- option->text = option->locale.toString(value.toULongLong());
- break;
- case QVariant::Date:
- option->text = option->locale.toString(value.toDate(), QLocale::ShortFormat);
- break;
- case QVariant::Time:
- option->text = option->locale.toString(value.toTime(), QLocale::ShortFormat);
- break;
- case QVariant::DateTime:
- option->text = option->locale.toString(value.toDateTime().date(), QLocale::ShortFormat);
- option->text += QLatin1Char(' ');
- option->text += option->locale.toString(value.toDateTime().time(), QLocale::ShortFormat);
- break;
- default: {
- QString text = value.toString();
- for (int i = 0; i < text.count(); ++i)
- if (text.at(i).unicode() == '\n')
- text[i] = QChar::LineSeparator;
- option->text = text;
- break; }
- }
- } else {
- option->text = QString();
- }
-
- if (d->showGrid) {
- // TODO create and set a flag for each of the sides of the cell to paint the grid lines.
- }
-}
-
-/*!
- */
-void QtGraphicsTableView::initStyleOptionState(QStyleOptionViewItemV4 *option, int row, int column) const
-{
- Q_D(const QtGraphicsTableView);
- Q_ASSERT(option);
-
- if (d->isCurrent(row, column))
- option->state |= QStyle::State_HasFocus;
- else
- option->state &= ~QStyle::State_HasFocus;
-
- if (d->isSelected(row, column))
- option->state |= QStyle::State_Selected;
- else
- option->state &= ~QStyle::State_Selected;
-/*
- if (d->mouseOver(row, column))
- opt.state |= QStyle::State_MouseOver;
- else
- opt.state &= ~QStyle::State_MouseOver;
-*/
-}
-
-/*!
- */
-void QtGraphicsTableView::copyStyleOptionState(const QStyleOptionGraphicsItem *source, QStyleOptionViewItemV4 *destination)
-{
- if (source && destination) {
- destination->state = source->state;
- destination->direction = source->direction;
- destination->rect = source->rect;
- destination->fontMetrics = source->fontMetrics;
- destination->palette = source->palette;
- }
-}
/*!
\reimp
@@ -1372,9 +1371,9 @@ bool QtGraphicsTableView::event(QEvent *event)
QVariant QtGraphicsTableView::itemChange(GraphicsItemChange change, const QVariant &value)
{
Q_D(QtGraphicsTableView);
- if (change == QGraphicsItem::ItemChildRemovedChange) {
+ if (change == QGraphicsItem::ItemChildRemovedChange) { // ### FIXME
QGraphicsItem *item = qvariant_cast<QGraphicsItem*>(value);
- qint64 key = d->items.key(static_cast<QtGraphicsTableViewItem*>(item), -1);
+ qint64 key = d->items.key(static_cast<QGraphicsObject*>(item), -1);
if (key != -1)
d->items.remove(key);
}