summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMarius Bugge Monsen <mmonsen@trolltech.com>2009-08-10 16:33:07 +0200
committerMarius Bugge Monsen <mmonsen@trolltech.com>2009-08-10 16:33:07 +0200
commit1bca6a469a21d635781c700a9606ffb1f963d98b (patch)
treef2de7f81188f045df5c5e9453a3fae9a885cac8b /src
parent38ff2e6f21b1196948eca97979f4a9840fe071f1 (diff)
Updates to enable itemviews-ng use qml and to be used by qml.
QGraphicsObject is now the base class for view items.
Diffstat (limited to 'src')
-rw-r--r--src/qgraphicslistview.cpp81
-rw-r--r--src/qgraphicslistview.h22
-rw-r--r--src/qgraphicslistview_p.h2
-rw-r--r--src/qgraphicstableview.cpp361
-rw-r--r--src/qgraphicstableview.h29
-rw-r--r--src/qgraphicstableview_p.h2
-rw-r--r--src/qgraphicstreeview.cpp366
-rw-r--r--src/qgraphicstreeview.h29
-rw-r--r--src/qgraphicstreeview_p.h2
-rw-r--r--src/qlistmodelinterface.h1
10 files changed, 479 insertions, 416 deletions
diff --git a/src/qgraphicslistview.cpp b/src/qgraphicslistview.cpp
index 70d3ec6..b77e56b 100644
--- a/src/qgraphicslistview.cpp
+++ b/src/qgraphicslistview.cpp
@@ -219,31 +219,31 @@ void QtGraphicsListViewItem::initStyleOption(QStyleOptionViewItemV4 *option) con
QVariant value;
// FontRole
- value = d->view->cachedData(d->index, Qt::FontRole);
+ value = d->view->d_func()->cachedData(d->index, Qt::FontRole);
if (value.isValid()) {
option->font = qvariant_cast<QFont>(value).resolve(option->font);
option->fontMetrics = QFontMetrics(option->font);
}
// TextAlignmentRole
- value = d->view->cachedData(d->index, Qt::TextAlignmentRole);
+ value = d->view->d_func()->cachedData(d->index, Qt::TextAlignmentRole);
if (value.isValid())
option->displayAlignment = (Qt::Alignment)value.toInt();
// ForegroundRole
- value = d->view->cachedData(d->index, Qt::ForegroundRole);
+ value = d->view->d_func()->cachedData(d->index, Qt::ForegroundRole);
if (qVariantCanConvert<QBrush>(value))
option->palette.setBrush(QPalette::Text, qvariant_cast<QBrush>(value));
// CheckStateRole
- value = d->view->cachedData(d->index, Qt::CheckStateRole);
+ value = d->view->d_func()->cachedData(d->index, Qt::CheckStateRole);
if (value.isValid()) {
option->features |= QStyleOptionViewItemV2::HasCheckIndicator;
option->checkState = static_cast<Qt::CheckState>(value.toInt());
}
// DecorationRole
- value = d->view->cachedData(d->index, Qt::DecorationRole);
+ value = d->view->d_func()->cachedData(d->index, Qt::DecorationRole);
if (value.isValid()) {
option->features |= QStyleOptionViewItemV2::HasDecoration;
switch (value.type()) {
@@ -260,7 +260,7 @@ void QtGraphicsListViewItem::initStyleOption(QStyleOptionViewItemV4 *option) con
}
// DisplayRole
- value = d->view->cachedData(d->index, Qt::DisplayRole);
+ value = d->view->d_func()->cachedData(d->index, Qt::DisplayRole);
if (value.isValid()) {
option->features |= QStyleOptionViewItemV2::HasDisplay;
switch (value.type()) {
@@ -343,18 +343,23 @@ QtGraphicsListViewItemCreatorBase::~QtGraphicsListViewItemCreatorBase()
*/
/*!
- This method basically does a recycle and a create in one go.
+ \fn QGraphicsObject *QtGraphicsListViewItemCreatorBase::reassign(int index, QGraphicsObject *item, QtGraphicsListView *view)
+ Assigns a new \a index to the given \a item in the given \a view, and returns it to the view.
*/
-QGraphicsObject *QtGraphicsListViewItemCreatorBase::reassign(int index, QGraphicsObject *item, QtGraphicsListView *view)
+
+/*!
+ Updates the given \a item, with the given \a index, using the given \a roles.
+*/
+void QtGraphicsListViewItemCreatorBase::update(int index, QGraphicsObject *item, const QList<int> &roles)
{
- Q_UNUSED(view);
+ Q_UNUSED(index);
+ Q_UNUSED(roles);
Q_ASSERT(item);
- static_cast<QtGraphicsListViewItem*>(item)->setIndex(index);
- return item;
+ item->update();
}
/*!
- Give back the \a item to the creator pool of unused objects.
+ Discart the given \a item. The creator may choose to reuse the item later.
*/
void QtGraphicsListViewItemCreatorBase::recycle(QGraphicsObject *item)
{
@@ -376,7 +381,7 @@ void QtGraphicsListViewItemCreatorBase::recycle(QGraphicsObject *item)
QtGraphicsListViewPrivate::QtGraphicsListViewPrivate()
: q_ptr(0), controller(0), model(0), selectionManager(0),
orientation(Qt::Horizontal), textElideMode(Qt::ElideMiddle),
- firstIndex(0), offset(0),
+ highlight(0), firstIndex(0), offset(0),
#if CACHING_ENABLED
cachedIndexOffset(0), cachedCoordinateOffset(0),
#endif
@@ -427,14 +432,11 @@ void QtGraphicsListViewPrivate::_q_itemsChanged(int index, int count, const QLis
checkCache(index, count);
//qDebug() << "QtGraphicsListViewPrivate::_q_itemsChanged" << index << count;
for (int i = 0; i < items.count(); ++i) {
- QGraphicsObject *item = items.at(i).second;
int itemIndex = items.at(i).first;
+ if (itemIndex <= index) // item was changed
+ creator->update(itemIndex, items.at(i).second, roles);
if (itemIndex >= index + count) // change happened above
break;
- //if (itemIndex >= index && item->isWidget())
- // item->itemChanged(roles);
- Q_UNUSED(roles);
- item->update(); // ###
}
q->updateLayout(); // ### FIXME: be more discriminate
}
@@ -500,12 +502,16 @@ void QtGraphicsListViewPrivate::_q_currentChanged(int current, int previous)
if (items.isEmpty())
return;
//qDebug() << "QtGraphicsListViewPrivate::_q_currentChanged" << current << previous;
- const int from = items.first().first;
- const int to = items.last().first;
- if (from <= current && current <= to)
- items.at(current - from).second->update();
- if (from <= previous && previous <= to)
- items.at(current - from).second->update();
+ if (highlight) {
+ // FIXME: update highlight geometry
+ } else {
+ const int from = items.first().first;
+ const int to = items.last().first;
+ if (from <= current && current <= to)
+ items.at(current - from).second->update();
+ if (from <= previous && previous <= to)
+ items.at(current - from).second->update();
+ }
}
/*!
@@ -800,6 +806,23 @@ void QtGraphicsListView::setTextElideMode(Qt::TextElideMode mode)
/*!
*/
+QGraphicsObject *QtGraphicsListView::highlight() const
+{
+ Q_D(const QtGraphicsListView);
+ return d->highlight;
+}
+
+/*!
+ */
+void QtGraphicsListView::setHighlight(QGraphicsObject *highlight)
+{
+ Q_D(QtGraphicsListView);
+ d->highlight = highlight;
+ // update the highlight geometry
+}
+
+/*!
+ */
QtGraphicsListView::~QtGraphicsListView()
{
delete d_ptr;
@@ -1192,7 +1215,6 @@ void QtGraphicsListView::initStyleOption(QStyleOptionViewItemV4 *option) const
option->widget = 0;
option->font = QApplication::font();
option->fontMetrics = QFontMetrics(option->font);
- option->displayAlignment = Qt::AlignLeft|Qt::AlignVCenter;
option->textElideMode = textElideMode();
option->showDecorationSelected = style()->styleHint(QStyle::SH_ItemView_ShowDecorationSelected);
int pm = style()->pixelMetric(QStyle::PM_ListViewIconSize);
@@ -1282,6 +1304,7 @@ void QtGraphicsListView::setItemCreator(QtGraphicsListViewItemCreatorBase *creat
if (d->creator)
delete d->creator;
d->creator = creator;
+ d->items.clear();
}
/*!
@@ -1314,14 +1337,6 @@ void QtGraphicsListView::itemGeometryChanged(QtGraphicsListViewItem *item)
}
}
-/*!
- */
-QVariant QtGraphicsListView::cachedData(int index, int role) const
-{
- Q_D(const QtGraphicsListView);
- return d->cachedData(index, role);
-}
-
QT_END_NAMESPACE
#include "moc_qgraphicslistview.cpp"
diff --git a/src/qgraphicslistview.h b/src/qgraphicslistview.h
index 5e2d3a1..67f1ff1 100644
--- a/src/qgraphicslistview.h
+++ b/src/qgraphicslistview.h
@@ -46,6 +46,7 @@ class QtGraphicsListView;
class Q_ITEMVIEWSNG_EXPORT QtGraphicsListViewItem : public QGraphicsWidget
{
+ Q_OBJECT
public:
QtGraphicsListViewItem(int index, QtGraphicsListView *view);
virtual ~QtGraphicsListViewItem();
@@ -78,7 +79,8 @@ class Q_ITEMVIEWSNG_EXPORT QtGraphicsListViewItemCreatorBase
public:
virtual ~QtGraphicsListViewItemCreatorBase();
virtual QGraphicsObject *create(int index, QtGraphicsListView *view) = 0;
- virtual QGraphicsObject *reassign(int index, QGraphicsObject *item, QtGraphicsListView *view);
+ virtual QGraphicsObject *reassign(int index, QGraphicsObject *item, QtGraphicsListView *view) = 0;
+ virtual void update(int index, QGraphicsObject *item, const QList<int> &roles);
virtual void recycle(QGraphicsObject *item);
};
@@ -87,6 +89,17 @@ class Q_ITEMVIEWSNG_EXPORT QtGraphicsListViewItemCreator : public QtGraphicsList
{
public:
inline QGraphicsObject *create(int index, QtGraphicsListView *view) { return new T(index, view); }
+ inline QGraphicsObject *reassign(int index, QGraphicsObject *item, QtGraphicsListView *view)
+ {
+ Q_UNUSED(view);
+ static_cast<T*>(item)->setIndex(index);
+ return item;
+ }
+ inline void update(int index, QGraphicsObject *item, const QList<int> &roles)
+ {
+ Q_UNUSED(index);
+ static_cast<T*>(item)->itemChanged(roles);
+ }
};
class Q_ITEMVIEWSNG_EXPORT QtGraphicsListView : public QGraphicsWidget
@@ -96,6 +109,7 @@ class Q_ITEMVIEWSNG_EXPORT QtGraphicsListView : public QGraphicsWidget
Q_PROPERTY(Qt::TextElideMode textElideMode READ textElideMode WRITE setTextElideMode)
Q_PROPERTY(int firstIndex READ firstIndex WRITE setFirstIndex)
Q_PROPERTY(qreal offset READ offset WRITE setOffset)
+ Q_PROPERTY(QGraphicsObject* highlight READ highlight WRITE setHighlight)
public:
QtGraphicsListView(Qt::Orientation orientation = Qt::Vertical, QGraphicsWidget *parent = 0, Qt::WindowFlags wFlags = 0);
@@ -118,6 +132,9 @@ public:
int firstIndex() const;
qreal offset() const;
+ QGraphicsObject *highlight() const;
+ void setHighlight(QGraphicsObject *highlight);
+
virtual int maximumFirstIndex() const;
virtual qreal maximumOffset() const;
@@ -154,8 +171,6 @@ protected:
virtual bool event(QEvent *event);
virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value);
- QVariant cachedData(int index, int role) const;
-
QtGraphicsListViewPrivate *d_ptr;
private:
@@ -171,6 +186,7 @@ private:
Q_PRIVATE_SLOT(d_func(), void _q_itemsInserted(int index, int count))
Q_PRIVATE_SLOT(d_func(), void _q_itemsRemoved(int index, int count))
Q_PRIVATE_SLOT(d_func(), void _q_selectionsChanged(const QtListSelectionChange &change))
+ Q_PRIVATE_SLOT(d_func(), void _q_currentChanged(int current, int previous))
};
QT_END_NAMESPACE
diff --git a/src/qgraphicslistview_p.h b/src/qgraphicslistview_p.h
index 3da1b02..0a2d3e2 100644
--- a/src/qgraphicslistview_p.h
+++ b/src/qgraphicslistview_p.h
@@ -93,6 +93,8 @@ public:
Qt::Orientation orientation;
Qt::TextElideMode textElideMode;
+ QGraphicsObject *highlight;
+
int firstIndex;
qreal offset;
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);
}
diff --git a/src/qgraphicstableview.h b/src/qgraphicstableview.h
index 9b5ca48..566c2e0 100644
--- a/src/qgraphicstableview.h
+++ b/src/qgraphicstableview.h
@@ -64,10 +64,13 @@ public:
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
virtual void itemChanged(const QList<int> &roles = QList<int>());
+ virtual void initStyleOption(QStyleOptionViewItemV4 *option) const;
QHash<int, QVariant> data(const QList<int> &roles = QList<int>()) const;
QtGraphicsTableView *view() const;
+ void copyStyleOptionState(const QStyleOptionGraphicsItem *source, QStyleOptionViewItemV4 *dest);
+
protected:
QtGraphicsTableViewItemPrivate *d_ptr;
@@ -80,16 +83,29 @@ class QtGraphicsTableViewItemCreatorBase
{
public:
virtual ~QtGraphicsTableViewItemCreatorBase();
- virtual QtGraphicsTableViewItem *create(int row, int column, QtGraphicsTableView *view) = 0;
- virtual QtGraphicsTableViewItem *reassign(int row, int column, QtGraphicsTableViewItem *item);
- virtual void recycle(QtGraphicsTableViewItem *item);
+ virtual QGraphicsObject *create(int row, int column, QtGraphicsTableView *view) = 0;
+ virtual QGraphicsObject *reassign(int row, int column, QGraphicsObject *item, QtGraphicsTableView *view) = 0;
+ virtual void update(int row, int column, QGraphicsObject *item, const QList<int> &roles);
+ virtual void recycle(QGraphicsObject *item);
};
template <class T>
class Q_ITEMVIEWSNG_EXPORT QtGraphicsTableViewItemCreator : public QtGraphicsTableViewItemCreatorBase
{
public:
- inline QtGraphicsTableViewItem *create(int row, int column, QtGraphicsTableView *view) { return new T(row, column, view); }
+ inline QGraphicsObject *create(int row, int column, QtGraphicsTableView *view) { return new T(row, column, view); }
+ inline QGraphicsObject *reassign(int row, int column, QGraphicsObject *item, QtGraphicsTableView *view)
+ {
+ Q_UNUSED(view);
+ static_cast<T*>(item)->setCell(row, column);
+ return item;
+ }
+ inline void update(int row, int column, QGraphicsObject *item, const QList<int> &roles)
+ {
+ Q_UNUSED(row);
+ Q_UNUSED(column);
+ static_cast<T*>(item)->itemChanged(roles);
+ }
};
class Q_ITEMVIEWSNG_EXPORT QtGraphicsTableView : public QGraphicsWidget
@@ -171,7 +187,7 @@ public:
QtGraphicsTableViewItemCreatorBase *itemCreator() const;
void setItemCreator(QtGraphicsTableViewItemCreatorBase *creator);
- QtGraphicsTableViewItem *itemForCell(int row, int column) const;
+ QGraphicsObject *itemForCell(int row, int column) const;
virtual void doLayout();
virtual QRectF cellGeometry(int row, int column) const;
@@ -180,9 +196,6 @@ public:
virtual QPointF mapToCell(int row, int column, const QPointF &position, const QTransform &transform) const;
virtual void initStyleOption(QStyleOptionViewItemV4 *option) const;
- virtual void initStyleOption(QStyleOptionViewItemV4 *option, int row, int column) const;
- virtual void initStyleOptionState(QStyleOptionViewItemV4 *option, int row, int column) const;
- void copyStyleOptionState(const QStyleOptionGraphicsItem *source, QStyleOptionViewItemV4 *dest);
public Q_SLOTS:
void setGridShown(bool show);
diff --git a/src/qgraphicstableview_p.h b/src/qgraphicstableview_p.h
index 48fd02a..3a7bc6d 100644
--- a/src/qgraphicstableview_p.h
+++ b/src/qgraphicstableview_p.h
@@ -118,7 +118,7 @@ public:
// view items
QtTableSelectionRange visibleSections;
- QHash<qint64, QtGraphicsTableViewItem*> items;
+ QHash<qint64, QGraphicsObject*> items;
QtGraphicsTableViewItemCreatorBase *creator;
QtGraphicsTableView *q_ptr;
diff --git a/src/qgraphicstreeview.cpp b/src/qgraphicstreeview.cpp
index 10b992d..e5e421a 100644
--- a/src/qgraphicstreeview.cpp
+++ b/src/qgraphicstreeview.cpp
@@ -104,7 +104,7 @@ QSizeF QtGraphicsTreeViewItem::sizeHint(const QtTreeModelIterator &it, const QSt
qreal width = 0;
qreal height = 0;
for (int column = 0; column < it.columnCount(); ++column) {
- d->view->initStyleOption(&d->option, d->it, column);
+ initStyleOption(&d->option, column);
const QSizeF size = sizeHint(it, column, option, which, constraint);
width += size.width();
height = qMax(height, size.height());
@@ -161,8 +161,8 @@ void QtGraphicsTreeViewItem::paint(QPainter *painter, const QStyleOptionGraphics
// for each column
for (int section = 0; section < count; ++section) {
const int column = mapping.value(section, section);
- d->view->copyStyleOptionState(option, &d->option);
- d->view->initStyleOption(&d->option, d->it, column);
+ copyStyleOptionState(option, &d->option);
+ initStyleOption(&d->option, column);
QSizeF size = sizeHint(d->it, column, &d->option, Qt::PreferredSize);
size.setWidth(d->header ? d->header->sectionSize(section) : d->view->geometry().width());
if (column == 0) {
@@ -186,15 +186,169 @@ void QtGraphicsTreeViewItem::paintBranches(QPainter *painter, QStyleOptionViewIt
// paint braches - this can be cached - this is incredibly slow when painting the dotted lines
for (int i = 0; i < depth; ++i) {
const QtTreeModelIterator &it = stack.at(i);
- d->view->initStyleOptionState(&d->option, it, i == depth - 1 ? 0 : -1);
+ initStyleOptionState(&d->option, it, i == depth - 1 ? 0 : -1);
const qreal w = QtGraphicsTreeViewPrivate::indentation();
option->rect = QRectF(i * w, 0, w, size().height()).toRect();
style()->drawPrimitive(QStyle::PE_IndicatorBranch, option, painter, 0);
}
}
+/*!
+ */
+void QtGraphicsTreeViewItem::initStyleOption(QStyleOptionViewItemV4 *option, int column) const
+{
+ Q_D(const QtGraphicsTreeViewItem);
+ Q_ASSERT(option);
+
+ option->rect = QRect();
+ option->features = 0;
+
+ initStyleOptionState(option, d->it, column);
+
+ QVariant value;
+
+ // FontRole
+ value = d->view->d_func()->cachedData(d->it, column, Qt::FontRole);
+ if (value.isValid()){
+ option->font = qvariant_cast<QFont>(value).resolve(option->font);
+ option->fontMetrics = QFontMetrics(option->font);
+ }
+
+ // TextAlignmentRole
+ value = d->view->d_func()->cachedData(d->it, column, Qt::TextAlignmentRole);
+ if (value.isValid())
+ option->displayAlignment = (Qt::Alignment)value.toInt();
+ else
+ option->displayAlignment = 0; // ### default value
+
+ // ForegroundRole
+ value = d->view->d_func()->cachedData(d->it, column, Qt::ForegroundRole);
+ if (qVariantCanConvert<QBrush>(value))
+ option->palette.setBrush(QPalette::Text, qvariant_cast<QBrush>(value));
+ // ### default value
+
+ // CheckStateRole
+ value = d->view->d_func()->cachedData(d->it, column, Qt::CheckStateRole);
+ if (value.isValid()) {
+ option->features |= QStyleOptionViewItemV2::HasCheckIndicator;
+ option->checkState = static_cast<Qt::CheckState>(value.toInt());
+ }
+
+ // DecorationRole
+ value = d->view->d_func()->cachedData(d->it, 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;
+ }
+ }
+
+ // DisplayRole
+ value = d->view->d_func()->cachedData(d->it, 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();
+ const QChar nl = QLatin1Char('\n');
+ for (int i = 0; i < text.count(); ++i)
+ if (text.at(i) == nl)
+ text[i] = QChar::LineSeparator;
+ option->text = text;
+ break;}
+ }
+ }
+}
/*!
*/
+void QtGraphicsTreeViewItem::initStyleOptionState(QStyleOptionViewItemV4 *option, const QtTreeModelIterator &it, int column) const
+{
+ Q_D(const QtGraphicsTreeViewItem);
+ Q_ASSERT(option);
+
+ if (d->view->d_func()->isCurrent(it, column)) // ### currentColumn
+ option->state |= QStyle::State_HasFocus;
+ else
+ option->state &= ~QStyle::State_HasFocus;
+
+ if (d->view->d_func()->isSelected(it, column))
+ option->state |= QStyle::State_Selected;
+ else
+ option->state &= ~QStyle::State_Selected;
+
+ if (d->it.hasNextSibling())
+ option->state |= QStyle::State_Sibling;
+ else
+ option->state &= ~QStyle::State_Sibling;
+
+ // ### the column != -1 trick is a bit hacky...
+
+ if (it.hasChildren() && column != -1)
+ option->state |= QStyle::State_Children;
+ else
+ option->state &= ~QStyle::State_Children;
+
+ if (d->view->d_func()->isExpanded(it) && column != -1)
+ option->state |= QStyle::State_Open;
+ else
+ option->state &= ~QStyle::State_Open;
+
+ if (column != -1)
+ option->state |= QStyle::State_Item;
+ else
+ option->state &= ~QStyle::State_Item;
+/*
+ if (d->view->d_func()->mouseOver(it))
+ opt.state |= QStyle::State_MouseOver;
+ else
+ opt.state &= ~QStyle::State_MouseOver;
+*/
+}
+
+/*!
+ */
+void QtGraphicsTreeViewItem::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;
+ }
+}
+/*!
+ */
void QtGraphicsTreeViewItem::itemChanged(const QList<int> &roles)
{
Q_UNUSED(roles);
@@ -222,14 +376,15 @@ QtGraphicsTreeViewItemCreatorBase::~QtGraphicsTreeViewItemCreatorBase()
{
}
-QtGraphicsTreeViewItem *QtGraphicsTreeViewItemCreatorBase::reassign(const QtTreeModelIterator &it, QtGraphicsTreeViewItem *item)
+void QtGraphicsTreeViewItemCreatorBase::update(const QtTreeModelIterator &it, QGraphicsObject *item, const QList<int> &roles)
{
+ Q_UNUSED(it);
+ Q_UNUSED(roles);
Q_ASSERT(item);
- item->setIterator(it);
- return item;
+ item->update();
}
-void QtGraphicsTreeViewItemCreatorBase::recycle(QtGraphicsTreeViewItem *item)
+void QtGraphicsTreeViewItemCreatorBase::recycle(QGraphicsObject *item)
{
delete item;
}
@@ -390,7 +545,7 @@ QVariant QtGraphicsTreeViewPrivate::cachedData(const QtTreeModelBase::iterator_b
<< Qt::DisplayRole);
if (it != cachedDataItem || column != cachedDataColumn) {
cachedDataHash = it.data(column, roles);
- cachedDataItem = it;
+ cachedDataItem = it;
cachedDataColumn = column;
}
return cachedDataHash.value(role);
@@ -609,7 +764,7 @@ qreal QtGraphicsTreeViewPrivate::itemHeight(QStyleOptionViewItemV4 &option, cons
qreal height = 0;
const int count = it.columnCount();
for (int column = 0; column < count; ++column) {
- q->initStyleOption(&option, it, column);
+ //#### FIXME: q->initStyleOption(&option, it, column);
const QVariant value = cachedData(it, column, Qt::SizeHintRole);
const QSizeF size = (value.isValid() ? qvariant_cast<QSize>(value)
: q->style()->sizeFromContents(QStyle::CT_ItemViewItem, &option, QSize(), option.widget));
@@ -697,7 +852,8 @@ void QtGraphicsTreeViewPrivate::_q_mapIndexesToItems()
*/
void QtGraphicsTreeViewPrivate::updateItem(const QtTreeModelBase::iterator_base &it) const
{
- if (QtGraphicsTreeViewItem *item = items.value(it))
+ // ### FIXME: remove this function
+ if (QGraphicsObject *item = items.value(it))
item->update();
}
@@ -1060,7 +1216,7 @@ QVariant QtGraphicsTreeView::itemChange(GraphicsItemChange change, const QVarian
Q_D(QtGraphicsTreeView);
if (change == QGraphicsItem::ItemChildRemovedChange) {
QGraphicsItem *item = qvariant_cast<QGraphicsItem*>(value);
- QtTreeModelBase::iterator_base key = d->items.key(static_cast<QtGraphicsTreeViewItem*>(item));
+ QtTreeModelBase::iterator_base key = d->items.key(static_cast<QGraphicsObject*>(item));
if (key.isValid())
d->items.remove(key);
}
@@ -1088,7 +1244,7 @@ void QtGraphicsTreeView::setItemCreator(QtGraphicsTreeViewItemCreatorBase *creat
Returns the visible item representing the given \a it, if that item exists and is visible.
Otherwise returns null.
*/
-QtGraphicsTreeViewItem *QtGraphicsTreeView::itemForIterator(const QtTreeModelIterator &it) const
+QGraphicsObject *QtGraphicsTreeView::itemForIterator(const QtTreeModelIterator &it) const
{
Q_D(const QtGraphicsTreeView);
return d->items.value(it);
@@ -1109,11 +1265,8 @@ void QtGraphicsTreeView::doLayout()
Q_D(QtGraphicsTreeView);
d->layoutTimer.stop();
- QStyleOptionViewItemV4 option;
- initStyleOption(&option);
-
const QRectF area = QRectF(QPointF(0, 0), size());
- const QSizeF constraint = size();
+ const QSizeF constraint = QSizeF(size().width(), -1);
qreal y = -d->verticalOffset;
qreal w = d->header ? qMax(d->header->contentSize(), area.width()) : area.width();
@@ -1155,33 +1308,40 @@ void QtGraphicsTreeView::doLayout()
return;
// collect unused items for reassignment
- QHash<QtTreeModelBase::iterator_base, QtGraphicsTreeViewItem*> unused = d->items;
+ QHash<QtTreeModelBase::iterator_base, QGraphicsObject*> unused = d->items;
d->items.clear(); // ### FIXME: find a solution that updates in-place
// position the visible items
const qreal x = -horizontalOffset;
while (y < area.height() && it.isValid()) {
// update item geometry
- QtGraphicsTreeViewItem *item = unused.take(it);
+ QGraphicsObject *item = unused.take(it);
if (!item) { // if the item did not exist
if (unused.isEmpty()) {
item = d->creator->create(it, this);
} else { // take another random item (idealy we should take from the bottom, since this kicks in early when scolling up)
- QHash<QtTreeModelBase::iterator_base, QtGraphicsTreeViewItem*>::iterator random = unused.begin();
- item = d->creator->reassign(it, random.value());
+ QHash<QtTreeModelBase::iterator_base, QGraphicsObject*>::iterator random = unused.begin();
+ item = d->creator->reassign(it, random.value(), this);
unused.erase(random);
}
}
d->items.insert(it, item);
- QSizeF size = item->sizeHint(it, &option, Qt::PreferredSize, constraint);
- item->setGeometry(x, y, w, size.height());
+ qreal height;
+ if (item->isWidget()) {
+ QSizeF size = static_cast<QGraphicsWidget*>(item)->effectiveSizeHint(Qt::PreferredSize, constraint);
+ static_cast<QGraphicsWidget*>(item)->setGeometry(x, y, w, size.height());
+ height = size.height();
+ } else {
+ item->setPos(x, y);
+ height = item->boundingRect().height();
+ }
// next item
- y += size.height();
+ y += height;
d->next(it, stack);
} // while
// recycle any unused items left
- QHash<QtTreeModelBase::iterator_base, QtGraphicsTreeViewItem*>::iterator it2 = unused.begin();
+ QHash<QtTreeModelBase::iterator_base, QGraphicsObject*>::iterator it2 = unused.begin();
for (; it2 != unused.end(); ++it2)
d->creator->recycle(it2.value());
}
@@ -1271,162 +1431,6 @@ void QtGraphicsTreeView::initStyleOption(QStyleOptionViewItemV4 *option) const
/*!
*/
-void QtGraphicsTreeView::initStyleOption(QStyleOptionViewItemV4 *option, const QtTreeModelIterator &it, int column) const
-{
- Q_D(const QtGraphicsTreeView);
- Q_ASSERT(option);
-
- option->rect = QRect();
- option->features = 0;
-
- initStyleOptionState(option, it, column);
-
- QVariant value;
-
- // FontRole
- value = d->cachedData(it, column, Qt::FontRole);
- if (value.isValid()){
- option->font = qvariant_cast<QFont>(value).resolve(option->font);
- option->fontMetrics = QFontMetrics(option->font);
- }
-
- // TextAlignmentRole
- value = d->cachedData(it, column, Qt::TextAlignmentRole);
- if (value.isValid())
- option->displayAlignment = (Qt::Alignment)value.toInt();
- else
- option->displayAlignment = 0; // ### default value
-
- // ForegroundRole
- value = d->cachedData(it, column, Qt::ForegroundRole);
- if (qVariantCanConvert<QBrush>(value))
- option->palette.setBrush(QPalette::Text, qvariant_cast<QBrush>(value));
- // ### default value
-
- // CheckStateRole
- value = d->cachedData(it, column, Qt::CheckStateRole);
- if (value.isValid()) {
- option->features |= QStyleOptionViewItemV2::HasCheckIndicator;
- option->checkState = static_cast<Qt::CheckState>(value.toInt());
- }
-
- // DecorationRole
- value = d->cachedData(it, 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;
- }
- }
-
- // DisplayRole
- value = d->cachedData(it, 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();
- const QChar nl = QLatin1Char('\n');
- for (int i = 0; i < text.count(); ++i)
- if (text.at(i) == nl)
- text[i] = QChar::LineSeparator;
- option->text = text;
- break;}
- }
- }
-}
-
-/*!
- */
-void QtGraphicsTreeView::initStyleOptionState(QStyleOptionViewItemV4 *option, const QtTreeModelIterator &it, int column) const
-{
- Q_D(const QtGraphicsTreeView);
- Q_ASSERT(option);
-
- if (d->isCurrent(it, column)) // ### currentColumn
- option->state |= QStyle::State_HasFocus;
- else
- option->state &= ~QStyle::State_HasFocus;
-
- if (d->isSelected(it, column))
- option->state |= QStyle::State_Selected;
- else
- option->state &= ~QStyle::State_Selected;
-
- if (it.hasNextSibling())
- option->state |= QStyle::State_Sibling;
- else
- option->state &= ~QStyle::State_Sibling;
-
- // ### the column != -1 trick is a bit hacky...
-
- if (it.hasChildren() && column != -1)
- option->state |= QStyle::State_Children;
- else
- option->state &= ~QStyle::State_Children;
-
- if (d->isExpanded(it) && column != -1)
- option->state |= QStyle::State_Open;
- else
- option->state &= ~QStyle::State_Open;
-
- if (column != -1)
- option->state |= QStyle::State_Item;
- else
- option->state &= ~QStyle::State_Item;
-/*
- if (d->mouseOver(it))
- opt.state |= QStyle::State_MouseOver;
- else
- opt.state &= ~QStyle::State_MouseOver;
-*/
-}
-
-/*!
- */
-void QtGraphicsTreeView::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;
- }
-}
-
-/*!
- */
QRectF QtGraphicsTreeView::disclosureRect(const QRectF &rect) const
{
Q_D(const QtGraphicsTreeView);
diff --git a/src/qgraphicstreeview.h b/src/qgraphicstreeview.h
index ea12062..dd52e01 100644
--- a/src/qgraphicstreeview.h
+++ b/src/qgraphicstreeview.h
@@ -68,6 +68,10 @@ public:
virtual void paintBranches(QPainter *painter, QStyleOptionViewItemV4 *option, const QStack<QtTreeModelIterator> &stack);
virtual void itemChanged(const QList<int> &roles = QList<int>());
+ virtual void initStyleOption(QStyleOptionViewItemV4 *option, int column) const;
+ virtual void initStyleOptionState(QStyleOptionViewItemV4 *option, const QtTreeModelIterator &it, int column) const;
+ void copyStyleOptionState(const QStyleOptionGraphicsItem *source, QStyleOptionViewItemV4 *dest);
+
QHash<int, QVariant> data(int column = 0, const QList<int> &roles = QList<int>()) const;
QtGraphicsTreeView *view() const;
@@ -83,16 +87,28 @@ class QtGraphicsTreeViewItemCreatorBase
{
public:
virtual ~QtGraphicsTreeViewItemCreatorBase();
- virtual QtGraphicsTreeViewItem *create(const QtTreeModelIterator &it, QtGraphicsTreeView *view) = 0;
- virtual QtGraphicsTreeViewItem *reassign(const QtTreeModelIterator &it, QtGraphicsTreeViewItem *item);
- virtual void recycle(QtGraphicsTreeViewItem *item);
+ virtual QGraphicsObject *create(const QtTreeModelIterator &it, QtGraphicsTreeView *view) = 0;
+ virtual QGraphicsObject *reassign(const QtTreeModelIterator &it, QGraphicsObject *item, QtGraphicsTreeView *view) = 0;
+ virtual void update(const QtTreeModelIterator &it, QGraphicsObject *item, const QList<int> &roles);
+ virtual void recycle(QGraphicsObject *item);
};
template <class T>
class QtGraphicsTreeViewItemCreator : public QtGraphicsTreeViewItemCreatorBase
{
public:
- inline QtGraphicsTreeViewItem *create(const QtTreeModelIterator &it, QtGraphicsTreeView *view) { return new T(it, view); }
+ inline QGraphicsObject *create(const QtTreeModelIterator &it, QtGraphicsTreeView *view) { return new T(it, view); }
+ inline QGraphicsObject *reassign(const QtTreeModelIterator &it, QGraphicsObject *item, QtGraphicsTreeView *view)
+ {
+ Q_UNUSED(view);
+ static_cast<QtGraphicsTreeViewItem*>(item)->setIterator(it);
+ return item;
+ }
+ inline void update(const QtTreeModelIterator &it, QGraphicsObject *item, const QList<int> &roles)
+ {
+ Q_UNUSED(it);
+ static_cast<QtGraphicsTreeViewItem*>(item)->itemChanged(roles);
+ }
};
@@ -144,16 +160,13 @@ public:
QtGraphicsTreeViewItemCreatorBase *itemCreator() const;
void setItemCreator(QtGraphicsTreeViewItemCreatorBase *creator);
- QtGraphicsTreeViewItem *itemForIterator(const QtTreeModelIterator &it) const; // ### FIXME: make virtual ?
+ QGraphicsObject *itemForIterator(const QtTreeModelIterator &it) const; // ### FIXME: make virtual ?
virtual void doLayout();
virtual QtTreeModelIterator itemAt(const QPointF &position, int *index = 0, QRectF *rect = 0) const;
virtual int indexOf(const QtTreeModelIterator &it) const;
virtual void initStyleOption(QStyleOptionViewItemV4 *option) const;
- virtual void initStyleOption(QStyleOptionViewItemV4 *option, const QtTreeModelIterator &it, int column) const;
- virtual void initStyleOptionState(QStyleOptionViewItemV4 *option, const QtTreeModelIterator &it, int column) const;
- void copyStyleOptionState(const QStyleOptionGraphicsItem *source, QStyleOptionViewItemV4 *dest);
public Q_SLOTS:
void setFirstIndex(int index);
diff --git a/src/qgraphicstreeview_p.h b/src/qgraphicstreeview_p.h
index dfdc3f6..964866e 100644
--- a/src/qgraphicstreeview_p.h
+++ b/src/qgraphicstreeview_p.h
@@ -177,7 +177,7 @@ public:
static inline qreal indentation() { return 20; } // ### hardcoded value; make styleHint
- QHash<QtTreeModelBase::iterator_base, QtGraphicsTreeViewItem*> items;
+ QHash<QtTreeModelBase::iterator_base, QGraphicsObject*> items;
QtGraphicsTreeViewItemCreatorBase *creator;
QBasicTimer layoutTimer;
diff --git a/src/qlistmodelinterface.h b/src/qlistmodelinterface.h
index 5d3592d..f3e3897 100644
--- a/src/qlistmodelinterface.h
+++ b/src/qlistmodelinterface.h
@@ -26,6 +26,7 @@
#include <QtCore/qhash.h>
#include <QtCore/qvariant.h>
+#include <QtCore/qobject.h>
QT_BEGIN_HEADER