diff options
Diffstat (limited to 'src/qgraphicstableview.cpp')
-rw-r--r-- | src/qgraphicstableview.cpp | 361 |
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); } |