diff options
-rw-r--r-- | examples/chat/chatmodel.cpp | 6 | ||||
-rw-r--r-- | examples/chat/chatview.cpp | 30 | ||||
-rw-r--r-- | examples/chat/chatview.h | 1 | ||||
-rw-r--r-- | examples/chat/main.cpp | 6 | ||||
-rw-r--r-- | examples/photoAlbum/main.cpp | 2 | ||||
-rw-r--r-- | src/experimental/qkineticlistcontroller.cpp | 1 | ||||
-rw-r--r-- | src/qgraphicslistview.cpp | 18 |
7 files changed, 41 insertions, 23 deletions
diff --git a/examples/chat/chatmodel.cpp b/examples/chat/chatmodel.cpp index 1f587dd..6ee2927 100644 --- a/examples/chat/chatmodel.cpp +++ b/examples/chat/chatmodel.cpp @@ -199,9 +199,9 @@ qMakePair<int, QString>(0, "nah, I dont really care that much. you already have ChatModel::ChatModel(QObject *parent) : QtListModelInterface(parent), timerId(0) { - //timerId = startTimer(2000); - for (int i = 0; i < 153; ++i) - appendMessage(conversation[i].second, conversation[i].first); + timerId = startTimer(2000); + //for (int i = 0; i < 153; ++i) + // appendMessage(conversation[i].second, conversation[i].first); } ChatModel::~ChatModel() diff --git a/examples/chat/chatview.cpp b/examples/chat/chatview.cpp index 1963382..a42556b 100644 --- a/examples/chat/chatview.cpp +++ b/examples/chat/chatview.cpp @@ -39,6 +39,7 @@ ChatViewItem::ChatViewItem(int index, QtGraphicsListView *view) m_animation = new QPropertyAnimation(this, "pos"); m_animation->setDuration(750); m_animation->setEasingCurve(QEasingCurve::OutBounce); + //setCacheMode(QGraphicsObject::ItemCoordinateCache); } void ChatViewItem::startAnimation(const QVariant &start, const QVariant &end) @@ -77,7 +78,6 @@ QSizeF ChatViewItem::sizeHint(Qt::SizeHint which, const QSizeF &constraint) cons switch (which) { case Qt::MinimumSize: case Qt::PreferredSize: { - return QSizeF(geometry().width(), 30); // #### const ChatView *chatView = qobject_cast<ChatView*>(view()); static const QSizeF padding(chatView->borders().sourceLeftBorder + chatView->borders().sourceRightBorder, chatView->borders().sourceTopBorder + chatView->borders().sourceBottomBorder); @@ -121,19 +121,41 @@ void ChatView::initStyleOption(QStyleOptionViewItemV4 *option) const void ChatView::itemsInserted(int index, int count) { + doLayout(); // FIXME: to ensure the item is created for (int i = 0; i < count; ++i) { - if (ChatViewItem *item = static_cast<ChatViewItem*>(itemForIndex(index + i))) + if (ChatViewItem *item = static_cast<ChatViewItem*>(itemForIndex(index + i))) { item->startAnimation(QPointF(0, geometry().height() + item->geometry().height()), item->pos()); + } } } +void ChatView::itemsChanged(int index, int count, const QList<QByteArray> &roles) +{ + const QSizeF constraint = (orientation() == Qt::Horizontal + ? QSizeF(-1, size().height()) + : QSizeF(size().width(), -1)); + for (int i = 0; i < count; ++i) { + if (ChatViewItem *item = static_cast<ChatViewItem*>(itemForIndex(index + i))) { + // FIXME: should be animated + item->resize(item->effectiveSizeHint(Qt::PreferredSize, constraint)); + } + } + doLayout(); +} + void ChatView::setModel(QtListModelInterface *model_) { - if (model()) + if (model()) { disconnect(model(), SIGNAL(itemsInserted(int,int)), this, SLOT(itemsInserted(int,int))); + disconnect(model(), SIGNAL(itemsChanged(int,int,const QList<QByteArray>&)), + this, SLOT(itemsChanged(int,int,const QList<QByteArray>&))); + } QtGraphicsListView::setModel(model_); - if (model()) + if (model()) { connect(model(), SIGNAL(itemsInserted(int,int)), this, SLOT(itemsInserted(int,int))); + connect(model(), SIGNAL(itemsChanged(int,int,const QList<QByteArray>&)), + this, SLOT(itemsChanged(int,int,const QList<QByteArray>&))); + } } diff --git a/examples/chat/chatview.h b/examples/chat/chatview.h index 4875d7d..d82fc9f 100644 --- a/examples/chat/chatview.h +++ b/examples/chat/chatview.h @@ -53,6 +53,7 @@ public: inline QPixmap bubble(int i) const { return m_bubbles[i % 6]; } public Q_SLOTS: void itemsInserted(int index, int count); + void itemsChanged(int index, int count, const QList<QByteArray> &roles); protected: void setModel(QtListModelInterface *model); private: diff --git a/examples/chat/main.cpp b/examples/chat/main.cpp index 6083b3e..8b59736 100644 --- a/examples/chat/main.cpp +++ b/examples/chat/main.cpp @@ -38,12 +38,10 @@ int main(int argc, char *argv[]) widget.resize(QSize(320, 480)); widget.scene()->setSceneRect(0, 0, 320, 480); - //QtListController *controller = new QtListController(&widget); QtKineticListController *controller = new QtKineticListController(&widget); - //controller->setView(new ChatView); - controller->setView(new QtGraphicsListView); + controller->setView(new ChatView); controller->setModel(new ChatModel(controller)); - //controller->setOvershootEnabled(true); + controller->setOvershootEnabled(true); controller->view()->setGeometry(0, 0, 320, 480); controller->view()->setFlag(QGraphicsItem::ItemClipsChildrenToShape, true); widget.scene()->addItem(controller->view()); diff --git a/examples/photoAlbum/main.cpp b/examples/photoAlbum/main.cpp index 89171cb..794a63a 100644 --- a/examples/photoAlbum/main.cpp +++ b/examples/photoAlbum/main.cpp @@ -131,7 +131,7 @@ ViewTransition::ViewTransition(QtKineticListController *sender, { setTargetState(targetState); m_animation->setEasingCurve(QEasingCurve::OutElastic); - m_animation->setDuration(750); + m_animation->setDuration(1000); addAnimation(m_animation); } diff --git a/src/experimental/qkineticlistcontroller.cpp b/src/experimental/qkineticlistcontroller.cpp index 312c991..ec82dad 100644 --- a/src/experimental/qkineticlistcontroller.cpp +++ b/src/experimental/qkineticlistcontroller.cpp @@ -51,7 +51,6 @@ bool QtKineticListControllerPrivate::updateOffset() bool cont = kineticUpdateOffset(&offset, max); qreal value = overshoot ? offset : qBound<qreal>(0, offset, max); view->setOffset(value); - qDebug() << "value" << value; return cont; } diff --git a/src/qgraphicslistview.cpp b/src/qgraphicslistview.cpp index 480f47f..1e3b8fd 100644 --- a/src/qgraphicslistview.cpp +++ b/src/qgraphicslistview.cpp @@ -566,18 +566,18 @@ QSizeF QtGraphicsListViewPrivate::itemSize(int index) const const QSizeF constraint = (orientation == Qt::Horizontal ? QSizeF(-1, q->size().height()) : QSizeF(q->size().width(), -1)); - if (items.isEmpty()) { // construct an item - if (QGraphicsObject *item = creator->create(index, 0)) { - QSizeF size = (item->isWidget() - ? static_cast<QGraphicsWidget*>(item)->size() - : item->boundingRect().size()); + if (true || items.isEmpty()) { // ### FIXME: always construct an item + if (QGraphicsObject *item = creator->create(index, const_cast<QtGraphicsListView*>(q))) { + const QSizeF size = (item->isWidget() + ? qobject_cast<QGraphicsWidget*>(item)->preferredSize() + : item->boundingRect().size()); creator->recycle(item); // ### FIXME: save it for re-use later return size; } qWarning() << "QtGraphicsListView: could not create a new item"; return QSizeF(); } - // average size of visible items + // ### FIXME: average size of visible items - doesn't work QSizeF size; for (int i = 0; i < items.count(); ++i) // ### FIXME: don't iterate every time size += items.at(i).second->boundingRect().size(); @@ -917,8 +917,7 @@ void QtGraphicsListView::doLayout() // the visible area starts at coordinate == 0 if (coordinate < 0) { // the cached offset was above or to the left of the visible area while (index < count) { - /*const*/ QSizeF hint = d->itemSize(index); - hint.setHeight(30); // ### + const QSizeF hint = d->itemSize(index); const qreal size = vertical ? hint.height() : hint.width(); if (coordinate + size > areaStart) break; @@ -927,8 +926,7 @@ void QtGraphicsListView::doLayout() } } else if (coordinate > 0) { // the cached offset was below or to the right while (index >= 0 && coordinate > 0) { - /*const*/ QSizeF hint = d->itemSize(index); - hint.setHeight(30); // ### + const QSizeF hint = d->itemSize(index); const qreal size = vertical ? hint.height() : hint.width(); coordinate -= size; --index; |