summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarius Bugge Monsen <mmonsen@trolltech.com>2009-10-08 18:35:48 +0200
committerMarius Bugge Monsen <mmonsen@trolltech.com>2009-10-08 18:35:48 +0200
commit704273609f990a36afb716cf64363b53bf98e5bb (patch)
tree62a1187d52a4baaad793c4ed0aa1f5c52b2790bb
parentf50738e6de28b84853af278672466eaa439f5569 (diff)
Get the chat example working again, including changing the size of the item when the data changes.
-rw-r--r--examples/chat/chatmodel.cpp6
-rw-r--r--examples/chat/chatview.cpp30
-rw-r--r--examples/chat/chatview.h1
-rw-r--r--examples/chat/main.cpp6
-rw-r--r--examples/photoAlbum/main.cpp2
-rw-r--r--src/experimental/qkineticlistcontroller.cpp1
-rw-r--r--src/qgraphicslistview.cpp18
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;