diff options
author | Michael Brasser <michael.brasser@nokia.com> | 2012-01-25 14:43:07 +1000 |
---|---|---|
committer | Michael Brasser <michael.brasser@nokia.com> | 2012-01-25 14:43:07 +1000 |
commit | c3601a8db91bc777ea859d6a796dfab6a218675e (patch) | |
tree | d2a4f6c83bec3cddcce020966cccac72be3aa04a /src/quick/items | |
parent | 35794301d188b731a7b596d92fc632fff58586c0 (diff) | |
parent | 149f6afe321ce59aebe4ce2f9dddd1881d0ac22b (diff) |
Merge branch 'master' into animation-refactorwip/animation-refactor
Conflicts:
tests/auto/declarative/declarative.pro
Change-Id: Ie339be2989fac553d351f3077869f1847367b504
Diffstat (limited to 'src/quick/items')
145 files changed, 1472 insertions, 704 deletions
diff --git a/src/quick/items/checksync.pl b/src/quick/items/checksync.pl index 94855fcadf..42065b5400 100755 --- a/src/quick/items/checksync.pl +++ b/src/quick/items/checksync.pl @@ -3,7 +3,7 @@ ## ## Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ## All rights reserved. -## Contact: Nokia Corporation (qt-info@nokia.com) +## Contact: http://www.qt-project.org/ ## ## This file is part of the Declarative module of the Qt Toolkit. ## diff --git a/src/quick/items/context2d/qquickcanvasitem.cpp b/src/quick/items/context2d/qquickcanvasitem.cpp index e8decdc4ed..c8f9553129 100644 --- a/src/quick/items/context2d/qquickcanvasitem.cpp +++ b/src/quick/items/context2d/qquickcanvasitem.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/context2d/qquickcanvasitem_p.h b/src/quick/items/context2d/qquickcanvasitem_p.h index 70ca475c96..de303d4e7e 100644 --- a/src/quick/items/context2d/qquickcanvasitem_p.h +++ b/src/quick/items/context2d/qquickcanvasitem_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/context2d/qquickcontext2d.cpp b/src/quick/items/context2d/qquickcontext2d.cpp index d5d57132bf..5493ba9331 100644 --- a/src/quick/items/context2d/qquickcontext2d.cpp +++ b/src/quick/items/context2d/qquickcontext2d.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/context2d/qquickcontext2d_p.h b/src/quick/items/context2d/qquickcontext2d_p.h index 0f320d9a7f..2f3b3309d3 100644 --- a/src/quick/items/context2d/qquickcontext2d_p.h +++ b/src/quick/items/context2d/qquickcontext2d_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/context2d/qquickcontext2dcommandbuffer.cpp b/src/quick/items/context2d/qquickcontext2dcommandbuffer.cpp index 476e7e2cf8..c77ff236be 100644 --- a/src/quick/items/context2d/qquickcontext2dcommandbuffer.cpp +++ b/src/quick/items/context2d/qquickcontext2dcommandbuffer.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/context2d/qquickcontext2dcommandbuffer_p.h b/src/quick/items/context2d/qquickcontext2dcommandbuffer_p.h index 2029198648..b9cf03081d 100644 --- a/src/quick/items/context2d/qquickcontext2dcommandbuffer_p.h +++ b/src/quick/items/context2d/qquickcontext2dcommandbuffer_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/context2d/qquickcontext2dnode.cpp b/src/quick/items/context2d/qquickcontext2dnode.cpp index 445cde8964..d2508bd996 100644 --- a/src/quick/items/context2d/qquickcontext2dnode.cpp +++ b/src/quick/items/context2d/qquickcontext2dnode.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/context2d/qquickcontext2dnode_p.h b/src/quick/items/context2d/qquickcontext2dnode_p.h index a00c939896..c98077cff2 100644 --- a/src/quick/items/context2d/qquickcontext2dnode_p.h +++ b/src/quick/items/context2d/qquickcontext2dnode_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/context2d/qquickcontext2dtexture.cpp b/src/quick/items/context2d/qquickcontext2dtexture.cpp index bcbb9b7c29..1b3b13dd48 100644 --- a/src/quick/items/context2d/qquickcontext2dtexture.cpp +++ b/src/quick/items/context2d/qquickcontext2dtexture.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/context2d/qquickcontext2dtexture_p.h b/src/quick/items/context2d/qquickcontext2dtexture_p.h index d055db7c06..fdcac0f2d9 100644 --- a/src/quick/items/context2d/qquickcontext2dtexture_p.h +++ b/src/quick/items/context2d/qquickcontext2dtexture_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/context2d/qquickcontext2dtile.cpp b/src/quick/items/context2d/qquickcontext2dtile.cpp index 6217c66094..a04f00591b 100644 --- a/src/quick/items/context2d/qquickcontext2dtile.cpp +++ b/src/quick/items/context2d/qquickcontext2dtile.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/context2d/qquickcontext2dtile_p.h b/src/quick/items/context2d/qquickcontext2dtile_p.h index a38384d3c7..75c2558db0 100644 --- a/src/quick/items/context2d/qquickcontext2dtile_p.h +++ b/src/quick/items/context2d/qquickcontext2dtile_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickaccessibleattached.cpp b/src/quick/items/qquickaccessibleattached.cpp index 6b83dbc5b2..b328583676 100644 --- a/src/quick/items/qquickaccessibleattached.cpp +++ b/src/quick/items/qquickaccessibleattached.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickaccessibleattached_p.h b/src/quick/items/qquickaccessibleattached_p.h index cb9892b34c..d87cdfc238 100644 --- a/src/quick/items/qquickaccessibleattached_p.h +++ b/src/quick/items/qquickaccessibleattached_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -56,7 +56,6 @@ QT_BEGIN_HEADER QT_BEGIN_NAMESPACE -QT_MODULE(Declarative) class Q_QUICK_PRIVATE_EXPORT QQuickAccessibleAttached : public QObject { diff --git a/src/quick/items/qquickanchors.cpp b/src/quick/items/qquickanchors.cpp index 36369ba262..f139821d92 100644 --- a/src/quick/items/qquickanchors.cpp +++ b/src/quick/items/qquickanchors.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickanchors_p.h b/src/quick/items/qquickanchors_p.h index fb9dccd4cc..0a1d899fd9 100644 --- a/src/quick/items/qquickanchors_p.h +++ b/src/quick/items/qquickanchors_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickanchors_p_p.h b/src/quick/items/qquickanchors_p_p.h index 1373aecd60..dbd6bac931 100644 --- a/src/quick/items/qquickanchors_p_p.h +++ b/src/quick/items/qquickanchors_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickanimatedimage.cpp b/src/quick/items/qquickanimatedimage.cpp index b07106d4f1..753dd01acf 100644 --- a/src/quick/items/qquickanimatedimage.cpp +++ b/src/quick/items/qquickanimatedimage.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickanimatedimage_p.h b/src/quick/items/qquickanimatedimage_p.h index d4160605aa..485c3026f2 100644 --- a/src/quick/items/qquickanimatedimage_p.h +++ b/src/quick/items/qquickanimatedimage_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickanimatedimage_p_p.h b/src/quick/items/qquickanimatedimage_p_p.h index 2f9ba6a7f1..335ff9ad89 100644 --- a/src/quick/items/qquickanimatedimage_p_p.h +++ b/src/quick/items/qquickanimatedimage_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickanimation.cpp b/src/quick/items/qquickanimation.cpp index 0aa0acdc0a..517b504640 100644 --- a/src/quick/items/qquickanimation.cpp +++ b/src/quick/items/qquickanimation.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickanimation_p.h b/src/quick/items/qquickanimation_p.h index cf2e41f7bb..f6de6da9fb 100644 --- a/src/quick/items/qquickanimation_p.h +++ b/src/quick/items/qquickanimation_p.h @@ -1,9 +1,9 @@ // Commit: e39a2e39451bf106a9845f8a60fc571faaa4dde5 /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickanimation_p_p.h b/src/quick/items/qquickanimation_p_p.h index c15dce91fe..6bab7780db 100644 --- a/src/quick/items/qquickanimation_p_p.h +++ b/src/quick/items/qquickanimation_p_p.h @@ -1,9 +1,9 @@ // Commit: 0ade09152067324f74678f2de4d447b6e0280600 /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickborderimage.cpp b/src/quick/items/qquickborderimage.cpp index c867f90763..72457a3fc4 100644 --- a/src/quick/items/qquickborderimage.cpp +++ b/src/quick/items/qquickborderimage.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickborderimage_p.h b/src/quick/items/qquickborderimage_p.h index 88fb28081d..d7a48333a2 100644 --- a/src/quick/items/qquickborderimage_p.h +++ b/src/quick/items/qquickborderimage_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickborderimage_p_p.h b/src/quick/items/qquickborderimage_p_p.h index d2fa799a24..e551cd2d9d 100644 --- a/src/quick/items/qquickborderimage_p_p.h +++ b/src/quick/items/qquickborderimage_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickcanvas.cpp b/src/quick/items/qquickcanvas.cpp index 9967e853ea..8866ec5436 100644 --- a/src/quick/items/qquickcanvas.cpp +++ b/src/quick/items/qquickcanvas.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -718,9 +718,8 @@ bool QQuickCanvas::event(QEvent *e) QTouchEvent *touch = static_cast<QTouchEvent *>(e); d->translateTouchEvent(touch); d->deliverTouchEvent(touch); - if (!touch->isAccepted()) - return false; - break; + + return touch->isAccepted(); } case QEvent::Leave: d->clearHover(); diff --git a/src/quick/items/qquickcanvas.h b/src/quick/items/qquickcanvas.h index de82e8386e..46d2702dc4 100644 --- a/src/quick/items/qquickcanvas.h +++ b/src/quick/items/qquickcanvas.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickcanvas_p.h b/src/quick/items/qquickcanvas_p.h index 6632324380..b75e5c92c8 100644 --- a/src/quick/items/qquickcanvas_p.h +++ b/src/quick/items/qquickcanvas_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickclipnode.cpp b/src/quick/items/qquickclipnode.cpp index 4aeb2dcf69..29d05ef05c 100644 --- a/src/quick/items/qquickclipnode.cpp +++ b/src/quick/items/qquickclipnode.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickclipnode_p.h b/src/quick/items/qquickclipnode_p.h index ee85409c9d..fa5e47b253 100644 --- a/src/quick/items/qquickclipnode_p.h +++ b/src/quick/items/qquickclipnode_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickdrag.cpp b/src/quick/items/qquickdrag.cpp index b80a8fb6fa..507ae4b489 100644 --- a/src/quick/items/qquickdrag.cpp +++ b/src/quick/items/qquickdrag.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickdrag_p.h b/src/quick/items/qquickdrag_p.h index 1971de827f..cfcba51064 100644 --- a/src/quick/items/qquickdrag_p.h +++ b/src/quick/items/qquickdrag_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickdroparea.cpp b/src/quick/items/qquickdroparea.cpp index d45d85a889..a811d01865 100644 --- a/src/quick/items/qquickdroparea.cpp +++ b/src/quick/items/qquickdroparea.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickdroparea_p.h b/src/quick/items/qquickdroparea_p.h index 066329958d..3572f13c5d 100644 --- a/src/quick/items/qquickdroparea_p.h +++ b/src/quick/items/qquickdroparea_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickevents.cpp b/src/quick/items/qquickevents.cpp index 4b39855a53..469409eeed 100644 --- a/src/quick/items/qquickevents.cpp +++ b/src/quick/items/qquickevents.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickevents_p_p.h b/src/quick/items/qquickevents_p_p.h index 3d1e4826d5..c54d5c7eff 100644 --- a/src/quick/items/qquickevents_p_p.h +++ b/src/quick/items/qquickevents_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickflickable.cpp b/src/quick/items/qquickflickable.cpp index 6df84f3d97..5ac189889c 100644 --- a/src/quick/items/qquickflickable.cpp +++ b/src/quick/items/qquickflickable.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickflickable_p.h b/src/quick/items/qquickflickable_p.h index 2c8e24365a..e215e4d118 100644 --- a/src/quick/items/qquickflickable_p.h +++ b/src/quick/items/qquickflickable_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickflickable_p_p.h b/src/quick/items/qquickflickable_p_p.h index b1375ddc69..d5f410786d 100644 --- a/src/quick/items/qquickflickable_p_p.h +++ b/src/quick/items/qquickflickable_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickflipable.cpp b/src/quick/items/qquickflipable.cpp index b2e5da1218..c48f358392 100644 --- a/src/quick/items/qquickflipable.cpp +++ b/src/quick/items/qquickflipable.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickflipable_p.h b/src/quick/items/qquickflipable_p.h index 7fa616ca9f..0c392e0466 100644 --- a/src/quick/items/qquickflipable_p.h +++ b/src/quick/items/qquickflipable_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickfocusscope.cpp b/src/quick/items/qquickfocusscope.cpp index 0c2678d6c2..8cf1750c24 100644 --- a/src/quick/items/qquickfocusscope.cpp +++ b/src/quick/items/qquickfocusscope.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickfocusscope_p.h b/src/quick/items/qquickfocusscope_p.h index 7910c2be35..c69bd420c2 100644 --- a/src/quick/items/qquickfocusscope_p.h +++ b/src/quick/items/qquickfocusscope_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickgridview.cpp b/src/quick/items/qquickgridview.cpp index 0484c60a9d..f25f2f8196 100644 --- a/src/quick/items/qquickgridview.cpp +++ b/src/quick/items/qquickgridview.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -59,6 +59,8 @@ QT_BEGIN_NAMESPACE #define QML_FLICK_SNAPONETHRESHOLD 30 #endif +//#define DEBUG_DELEGATE_LIFECYCLE + //---------------------------------------------------------------------------- class FxGridItemSG : public FxViewItem @@ -171,17 +173,16 @@ public: virtual FxViewItem *newViewItem(int index, QQuickItem *item); virtual void repositionPackageItemAt(QQuickItem *item, int index); - virtual void resetItemPosition(FxViewItem *item, FxViewItem *toItem); - virtual void resetFirstItemPosition(); - virtual void adjustFirstItem(qreal forwards, qreal backwards); + virtual void resetFirstItemPosition(qreal pos = 0.0); + virtual void adjustFirstItem(qreal forwards, qreal backwards, int changeBeforeVisible); virtual void createHighlight(); virtual void updateHighlight(); virtual void resetHighlightPosition(); virtual void setPosition(qreal pos); - virtual void layoutVisibleItems(); - virtual bool applyInsertionChange(const QDeclarativeChangeSet::Insert &insert, ChangeResult *changeResult, bool *newVisibleItemsFirst, QList<FxViewItem *> *addedItems); + virtual void layoutVisibleItems(int fromModelIndex = 0); + virtual bool applyInsertionChange(const QDeclarativeChangeSet::Insert &insert, ChangeResult *changeResult, QList<FxViewItem *> *addedItems); virtual bool needsRefillForAddedOrRemovedIndex(int index) const; virtual qreal headerSize() const; @@ -195,7 +196,6 @@ public: virtual void initializeCurrentItem(); virtual void updateViewport(); - virtual void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry); virtual void fixupPosition(); virtual void fixup(AxisData &data, qreal minExtent, qreal maxExtent); virtual void flick(QQuickItemViewPrivate::AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize, @@ -449,7 +449,9 @@ bool QQuickGridViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, bool d bool changed = false; while (modelIndex < model->count() && rowPos <= fillTo + rowSize()*(columns - colNum)/(columns+1)) { -// qDebug() << "refill: append item" << modelIndex << colPos << rowPos; +#ifdef DEBUG_DELEGATE_LIFECYCLE + qDebug() << "refill: append item" << modelIndex << colPos << rowPos; +#endif if (!(item = static_cast<FxGridItemSG*>(createItem(modelIndex, doBuffer)))) break; item->setPosition(colPos, rowPos); @@ -464,6 +466,9 @@ bool QQuickGridViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, bool d changed = true; } + if (doBuffer && requestedIndex != -1) // already waiting for an item + return changed; + // Find first column if (visibleItems.count()) { FxGridItemSG *firstItem = static_cast<FxGridItemSG*>(visibleItems.first()); @@ -480,7 +485,9 @@ bool QQuickGridViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, bool d // Prepend colPos = colNum * colSize(); while (visibleIndex > 0 && rowPos + rowSize() - 1 >= fillFrom - rowSize()*(colNum+1)/(columns+1)){ -// qDebug() << "refill: prepend item" << visibleIndex-1 << "top pos" << rowPos << colPos; +#ifdef DEBUG_DELEGATE_LIFECYCLE + qDebug() << "refill: prepend item" << visibleIndex-1 << "top pos" << rowPos << colPos; +#endif if (!(item = static_cast<FxGridItemSG*>(createItem(visibleIndex-1, doBuffer)))) break; --visibleIndex; @@ -508,7 +515,9 @@ bool QQuickGridViewPrivate::removeNonVisibleItems(qreal bufferFrom, qreal buffer && item->rowPos()+rowSize()-1 < bufferFrom - rowSize()*(item->colPos()/colSize()+1)/(columns+1)) { if (item->attached->delayRemove()) break; -// qDebug() << "refill: remove first" << visibleIndex << "top end pos" << item->endRowPos(); +#ifdef DEBUG_DELEGATE_LIFECYCLE + qDebug() << "refill: remove first" << visibleIndex << "top end pos" << item->endRowPos(); +#endif if (item->index != -1) visibleIndex++; visibleItems.removeFirst(); @@ -520,7 +529,9 @@ bool QQuickGridViewPrivate::removeNonVisibleItems(qreal bufferFrom, qreal buffer && item->rowPos() > bufferTo + rowSize()*(columns - item->colPos()/colSize())/(columns+1)) { if (item->attached->delayRemove()) break; -// qDebug() << "refill: remove last" << visibleIndex+visibleItems.count()-1; +#ifdef DEBUG_DELEGATE_LIFECYCLE + qDebug() << "refill: remove last" << visibleIndex+visibleItems.count()-1; +#endif visibleItems.removeLast(); releaseItem(item); changed = true; @@ -544,7 +555,7 @@ void QQuickGridViewPrivate::updateViewport() QQuickItemViewPrivate::updateViewport(); } -void QQuickGridViewPrivate::layoutVisibleItems() +void QQuickGridViewPrivate::layoutVisibleItems(int fromModelIndex) { if (visibleItems.count()) { const qreal from = isContentFlowReversed() ? -position() - size() : position(); @@ -566,8 +577,10 @@ void QQuickGridViewPrivate::layoutVisibleItems() rowPos += rowSize(); } colPos = col * colSize(); - item->setPosition(colPos, rowPos); - item->item->setVisible(rowPos + rowSize() >= from && rowPos <= to); + if (item->index >= fromModelIndex) { + item->setPosition(colPos, rowPos); + item->item->setVisible(rowPos + rowSize() >= from && rowPos <= to); + } } } } @@ -589,26 +602,21 @@ void QQuickGridViewPrivate::repositionPackageItemAt(QQuickItem *item, int index) } } -void QQuickGridViewPrivate::resetItemPosition(FxViewItem *item, FxViewItem *toItem) -{ - if (item == toItem) - return; - FxGridItemSG *toGridItem = static_cast<FxGridItemSG*>(toItem); - static_cast<FxGridItemSG*>(item)->setPosition(toGridItem->colPos(), toGridItem->rowPos()); -} - -void QQuickGridViewPrivate::resetFirstItemPosition() +void QQuickGridViewPrivate::resetFirstItemPosition(qreal pos) { FxGridItemSG *item = static_cast<FxGridItemSG*>(visibleItems.first()); - item->setPosition(0, 0); + item->setPosition(0, pos); } -void QQuickGridViewPrivate::adjustFirstItem(qreal forwards, qreal backwards) +void QQuickGridViewPrivate::adjustFirstItem(qreal forwards, qreal backwards, int changeBeforeVisible) { if (!visibleItems.count()) return; - int moveCount = (forwards / rowSize()) - (backwards / rowSize()); + int moveCount = (forwards - backwards) / rowSize(); + + if (changeBeforeVisible) + moveCount += (changeBeforeVisible%columns) - (columns - 1); FxGridItemSG *gridItem = static_cast<FxGridItemSG*>(visibleItems.first()); gridItem->setPosition(gridItem->colPos(), gridItem->rowPos() + ((moveCount / columns) * rowSize())); @@ -795,21 +803,6 @@ void QQuickGridViewPrivate::initializeCurrentItem() } } -void QQuickGridViewPrivate::itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) -{ - Q_Q(QQuickGridView); - QQuickItemViewPrivate::itemGeometryChanged(item, newGeometry, oldGeometry); - if (!q->isComponentComplete()) - return; - if (item == q) { - if (newGeometry.height() != oldGeometry.height() || newGeometry.width() != oldGeometry.width()) { - updateViewport(); - forceLayout = true; - q->polish(); - } - } -} - void QQuickGridViewPrivate::fixupPosition() { moveReason = Other; @@ -1447,7 +1440,7 @@ void QQuickGridView::setCellWidth(qreal cellWidth) d->updateViewport(); emit cellWidthChanged(); d->forceLayout = true; - d->layout(); + polish(); } } @@ -1465,7 +1458,7 @@ void QQuickGridView::setCellHeight(qreal cellHeight) d->updateViewport(); emit cellHeightChanged(); d->forceLayout = true; - d->layout(); + polish(); } } /*! @@ -1549,14 +1542,6 @@ void QQuickGridView::viewportMoved() return; d->inViewportMoved = true; - // Set visibility of items to eliminate cost of items outside the visible area. - qreal from = d->isContentFlowReversed() ? -d->position()-d->size() : d->position(); - qreal to = d->isContentFlowReversed() ? -d->position() : d->position()+d->size(); - for (int i = 0; i < d->visibleItems.count(); ++i) { - FxGridItemSG *item = static_cast<FxGridItemSG*>(d->visibleItems.at(i)); - item->item->setVisible(item->rowPos() + d->rowSize() >= from && item->rowPos() <= to); - } - if (yflick()) d->bufferMode = d->vData.smoothVelocity < 0 ? QQuickItemViewPrivate::BufferBefore : QQuickItemViewPrivate::BufferAfter; else if (d->isRightToLeftTopToBottom()) @@ -1565,6 +1550,15 @@ void QQuickGridView::viewportMoved() d->bufferMode = d->hData.smoothVelocity < 0 ? QQuickItemViewPrivate::BufferBefore : QQuickItemViewPrivate::BufferAfter; d->refill(); + + // Set visibility of items to eliminate cost of items outside the visible area. + qreal from = d->isContentFlowReversed() ? -d->position()-d->size() : d->position(); + qreal to = d->isContentFlowReversed() ? -d->position() : d->position()+d->size(); + for (int i = 0; i < d->visibleItems.count(); ++i) { + FxGridItemSG *item = static_cast<FxGridItemSG*>(d->visibleItems.at(i)); + item->item->setVisible(item->rowPos() + d->rowSize() >= from && item->rowPos() <= to); + } + if (d->hData.flicking || d->vData.flicking || d->hData.moving || d->vData.moving) d->moveReason = QQuickGridViewPrivate::Mouse; if (d->moveReason != QQuickGridViewPrivate::SetIndex) { @@ -1775,7 +1769,7 @@ void QQuickGridView::moveCurrentIndexRight() } } -bool QQuickGridViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::Insert &change, ChangeResult *insertResult, bool *newVisibleItemsFirst, QList<FxViewItem *> *addedItems) +bool QQuickGridViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::Insert &change, ChangeResult *insertResult, QList<FxViewItem *> *addedItems) { Q_Q(QQuickGridView); @@ -1845,7 +1839,7 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::In while (i >= 0) { if (rowPos > from && insertionIdx < visibleIndex) { // item won't be visible, just note the size for repositioning - insertResult->sizeChangesBeforeVisiblePos += rowSize(); + insertResult->changeBeforeVisible++; } else { // item is before first visible e.g. in cache buffer FxViewItem *item = 0; @@ -1874,7 +1868,7 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::In } else { int i = 0; int to = buffer+tempPos+size()-1; - while (i < count && rowPos <= to + rowSize()*(columns - (colPos/colSize()))/qreal(columns)) { + while (i < count && rowPos <= to + rowSize()*(columns - colNum)/qreal(columns+1)) { FxViewItem *item = 0; if (change.isMove() && (item = currentChanges.removedItems.take(change.moveKey(modelIndex + i)))) item->index = modelIndex + i; @@ -1886,7 +1880,7 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::In item->item->setVisible(true); visibleItems.insert(index, item); if (index == 0) - *newVisibleItemsFirst = true; + insertResult->changedFirstItem = true; if (!change.isMove()) addedItems->append(item); insertResult->sizeChangesAfterVisiblePos += rowSize(); diff --git a/src/quick/items/qquickgridview_p.h b/src/quick/items/qquickgridview_p.h index c9b2f66829..0f86acf3ea 100644 --- a/src/quick/items/qquickgridview_p.h +++ b/src/quick/items/qquickgridview_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickimage.cpp b/src/quick/items/qquickimage.cpp index 37a99a93b6..71712ec616 100644 --- a/src/quick/items/qquickimage.cpp +++ b/src/quick/items/qquickimage.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickimage_p.h b/src/quick/items/qquickimage_p.h index e6d6a72020..98bafadf3f 100644 --- a/src/quick/items/qquickimage_p.h +++ b/src/quick/items/qquickimage_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickimage_p_p.h b/src/quick/items/qquickimage_p_p.h index 98c68b939f..5fae36a53b 100644 --- a/src/quick/items/qquickimage_p_p.h +++ b/src/quick/items/qquickimage_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickimagebase.cpp b/src/quick/items/qquickimagebase.cpp index 1d303b870b..1f12dc5a7e 100644 --- a/src/quick/items/qquickimagebase.cpp +++ b/src/quick/items/qquickimagebase.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickimagebase_p.h b/src/quick/items/qquickimagebase_p.h index 5ccb3f904d..e8f00844a6 100644 --- a/src/quick/items/qquickimagebase_p.h +++ b/src/quick/items/qquickimagebase_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickimagebase_p_p.h b/src/quick/items/qquickimagebase_p_p.h index 972fefae0b..e629ee5322 100644 --- a/src/quick/items/qquickimagebase_p_p.h +++ b/src/quick/items/qquickimagebase_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickimplicitsizeitem.cpp b/src/quick/items/qquickimplicitsizeitem.cpp index 15604decf3..d70ddfc752 100644 --- a/src/quick/items/qquickimplicitsizeitem.cpp +++ b/src/quick/items/qquickimplicitsizeitem.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickimplicitsizeitem_p.h b/src/quick/items/qquickimplicitsizeitem_p.h index 2e254a18ba..1cad5823a1 100644 --- a/src/quick/items/qquickimplicitsizeitem_p.h +++ b/src/quick/items/qquickimplicitsizeitem_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickimplicitsizeitem_p_p.h b/src/quick/items/qquickimplicitsizeitem_p_p.h index 214fb28bf4..1dc0114ac3 100644 --- a/src/quick/items/qquickimplicitsizeitem_p_p.h +++ b/src/quick/items/qquickimplicitsizeitem_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp index ebdb980f30..49084639d5 100644 --- a/src/quick/items/qquickitem.cpp +++ b/src/quick/items/qquickitem.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -2919,7 +2919,6 @@ void QQuickItem::updatePolish() void QQuickItem::sendAccessibilityUpdate() { - Q_D(QQuickItem); } void QQuickItemPrivate::removeItemChangeListener(QQuickItemChangeListener *listener, ChangeTypes types) @@ -5654,6 +5653,7 @@ void QQuickItemLayer::setWrapMode(QQuickShaderEffectSource::WrapMode mode) void QQuickItemLayer::itemOpacityChanged(QQuickItem *item) { + Q_UNUSED(item) updateOpacity(); } @@ -5664,6 +5664,7 @@ void QQuickItemLayer::itemGeometryChanged(QQuickItem *, const QRectF &, const QR void QQuickItemLayer::itemParentChanged(QQuickItem *item, QQuickItem *parent) { + Q_UNUSED(item) if (parent == m_effectSource || parent == m_effect) return; diff --git a/src/quick/items/qquickitem.h b/src/quick/items/qquickitem.h index 0f68910c18..0dd896af3d 100644 --- a/src/quick/items/qquickitem.h +++ b/src/quick/items/qquickitem.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickitem_p.h b/src/quick/items/qquickitem_p.h index 50a9bb97d2..f0b1a9f4d9 100644 --- a/src/quick/items/qquickitem_p.h +++ b/src/quick/items/qquickitem_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickitemchangelistener_p.h b/src/quick/items/qquickitemchangelistener_p.h index d83f446092..0ca9a2681a 100644 --- a/src/quick/items/qquickitemchangelistener_p.h +++ b/src/quick/items/qquickitemchangelistener_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickitemsmodule.cpp b/src/quick/items/qquickitemsmodule.cpp index 0d7f1e1b1f..b82a90d6f5 100644 --- a/src/quick/items/qquickitemsmodule.cpp +++ b/src/quick/items/qquickitemsmodule.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickitemsmodule_p.h b/src/quick/items/qquickitemsmodule_p.h index 08c05806e8..b3b64cfd59 100644 --- a/src/quick/items/qquickitemsmodule_p.h +++ b/src/quick/items/qquickitemsmodule_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index 8f46661078..ce4cb9ffaf 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -775,7 +775,7 @@ void QQuickItemView::destroyRemoved() // Correct the positioning of the items d->updateSections(); d->forceLayout = true; - d->layout(); + polish(); } void QQuickItemView::modelUpdated(const QDeclarativeChangeSet &changeSet, bool reset) @@ -878,6 +878,10 @@ void QQuickItemView::geometryChanged(const QRectF &newGeometry, const QRectF &ol { Q_D(QQuickItemView); d->markExtentsDirty(); + if (isComponentComplete() && d->isValid()) { + d->forceLayout = true; + polish(); + } QQuickFlickable::geometryChanged(newGeometry, oldGeometry); } @@ -1110,7 +1114,7 @@ QQuickItemViewPrivate::QQuickItemViewPrivate() , highlightMoveDuration(150) , headerComponent(0), header(0), footerComponent(0), footer(0) , minExtent(0), maxExtent(0) - , ownModel(false), wrap(false), deferredRelease(false) + , ownModel(false), wrap(false) , inApplyModelChanges(false), inViewportMoved(false), forceLayout(false), currentIndexCleared(false) , haveHighlightRange(false), autoHighlight(true), highlightRangeStartValid(false), highlightRangeEndValid(false) , fillCacheBuffer(false), inRequest(false), requestedAsync(false) @@ -1212,7 +1216,6 @@ void QQuickItemViewPrivate::init() Q_Q(QQuickItemView); QQuickItemPrivate::get(contentItem)->childrenDoNotOverlap = true; q->setFlag(QQuickItem::ItemIsFocusScope); - addItemChangeListener(this, Geometry); QObject::connect(q, SIGNAL(movementEnded()), q, SLOT(animStopped())); q->setFlickableDirection(QQuickFlickable::VerticalFlick); } @@ -1291,13 +1294,14 @@ void QQuickItemViewPrivate::mirrorChange() void QQuickItemViewPrivate::refill() { + qreal s = qMax(size(), qreal(0.)); if (isContentFlowReversed()) - refill(-position()-size(), -position()); + refill(-position()-s, -position()); else - refill(position(), position()+size()); + refill(position(), position()+s); } -void QQuickItemViewPrivate::refill(qreal from, qreal to, bool doBuffer) +void QQuickItemViewPrivate::refill(qreal from, qreal to) { Q_Q(QQuickItemView); if (!isValid() || !q->isComponentComplete()) @@ -1311,35 +1315,22 @@ void QQuickItemViewPrivate::refill(qreal from, qreal to, bool doBuffer) qreal bufferTo = to + buffer; qreal fillFrom = from; qreal fillTo = to; - if (doBuffer && (bufferMode & BufferAfter)) - fillTo = bufferTo; - if (doBuffer && (bufferMode & BufferBefore)) - fillFrom = bufferFrom; - // Item creation and release is staggered in order to avoid - // creating/releasing multiple items in one frame - // while flicking (as much as possible). + bool added = addVisibleItems(fillFrom, fillTo, false); + bool removed = removeNonVisibleItems(bufferFrom, bufferTo); - bool changed = addVisibleItems(fillFrom, fillTo, doBuffer); - - if (!changed || deferredRelease) { // avoid destroying items in the same frame that we create - if (removeNonVisibleItems(bufferFrom, bufferTo)) - changed = true; - deferredRelease = false; - } else { - deferredRelease = true; + if (buffer && bufferMode != NoBuffer) { + if (bufferMode & BufferAfter) + fillTo = bufferTo; + if (bufferMode & BufferBefore) + fillFrom = bufferFrom; + added |= addVisibleItems(fillFrom, fillTo, true); } - if (changed) { + if (added || removed) { markExtentsDirty(); + updateBeginningEnd(); visibleItemsChanged(); - } else if (!doBuffer && buffer && bufferMode != NoBuffer) { - refill(from, to, true); - } - - if (!q->isMoving() && changed) { - fillCacheBuffer = true; - q->polish(); } if (prevCount != itemCount) @@ -1389,8 +1380,10 @@ void QQuickItemViewPrivate::layout() } if (!applyModelChanges() && !forceLayout) { - if (fillCacheBuffer) + if (fillCacheBuffer) { + fillCacheBuffer = false; refill(); + } return; } forceLayout = false; @@ -1432,12 +1425,16 @@ bool QQuickItemViewPrivate::applyModelChanges() || !currentChanges.pendingChanges.inserts().isEmpty(); FxViewItem *prevFirstVisible = firstVisibleItem(); - QDeclarativeNullableValue<qreal> prevFirstVisiblePos; + QDeclarativeNullableValue<qreal> prevViewPos; if (prevFirstVisible) - prevFirstVisiblePos = prevFirstVisible->position(); + prevViewPos = prevFirstVisible->position(); + qreal prevVisibleItemsFirstPos = visibleItems.count() ? visibleItems.first()->position() : 0.0; const QVector<QDeclarativeChangeSet::Remove> &removals = currentChanges.pendingChanges.removes(); - ChangeResult removalResult(prevFirstVisiblePos); + const QVector<QDeclarativeChangeSet::Insert> &insertions = currentChanges.pendingChanges.inserts(); + ChangeResult removalResult(prevViewPos); + ChangeResult insertionResult(prevViewPos); + int removedCount = 0; for (int i=0; i<removals.count(); i++) { itemCount -= removals[i].count; @@ -1446,53 +1443,40 @@ bool QQuickItemViewPrivate::applyModelChanges() if (!visibleAffected && needsRefillForAddedOrRemovedIndex(removals[i].index)) visibleAffected = true; } - if (!removals.isEmpty()) + if (!removals.isEmpty()) { updateVisibleIndex(); - const QVector<QDeclarativeChangeSet::Insert> &insertions = currentChanges.pendingChanges.inserts(); - ChangeResult insertionResult(prevFirstVisiblePos); - bool newVisibleItemsFirst = false; + // set positions correctly for the next insertion + if (!insertions.isEmpty()) { + repositionFirstItem(prevVisibleItemsFirst, prevVisibleItemsFirstPos, prevFirstVisible, &insertionResult, &removalResult); + layoutVisibleItems(removals.first().index); + } + } + QList<FxViewItem *> newItems; for (int i=0; i<insertions.count(); i++) { bool wasEmpty = visibleItems.isEmpty(); - if (applyInsertionChange(insertions[i], &insertionResult, &newVisibleItemsFirst, &newItems)) + if (applyInsertionChange(insertions[i], &insertionResult, &newItems)) visibleAffected = true; if (!visibleAffected && needsRefillForAddedOrRemovedIndex(insertions[i].index)) visibleAffected = true; if (wasEmpty && !visibleItems.isEmpty()) resetFirstItemPosition(); + + // set positions correctly for the next insertion + if (i < insertions.count() - 1) { + repositionFirstItem(prevVisibleItemsFirst, prevVisibleItemsFirstPos, prevFirstVisible, &insertionResult, &removalResult); + layoutVisibleItems(insertions[i].index); + } + itemCount += insertions[i].count; } for (int i=0; i<newItems.count(); i++) newItems.at(i)->attached->emitAdd(); // reposition visibleItems.first() correctly so that the content y doesn't jump - if (visibleItems.count() && removedCount != prevVisibleItemsCount) { - if (newVisibleItemsFirst && prevVisibleItemsFirst) - resetItemPosition(visibleItems.first(), prevVisibleItemsFirst); - - if (prevFirstVisible && prevVisibleItemsFirst == prevFirstVisible - && prevFirstVisible != visibleItems.first()) { - // the previous visibleItems.first() was also the first visible item, and it has been - // moved/removed, so move the new visibleItems.first() to the pos of the previous one - if (!newVisibleItemsFirst) - resetItemPosition(visibleItems.first(), prevFirstVisible); - - } else if (prevFirstVisiblePos.isValid()) { - qreal moveForwardsBy = 0; - qreal moveBackwardsBy = 0; - - // shift visibleItems.first() relative to the number of added/removed items - if (visibleItems.first()->position() > prevFirstVisiblePos) { - moveForwardsBy = insertionResult.sizeChangesAfterVisiblePos; - moveBackwardsBy = removalResult.sizeChangesAfterVisiblePos; - } else if (visibleItems.first()->position() < prevFirstVisiblePos) { - moveForwardsBy = removalResult.sizeChangesBeforeVisiblePos; - moveBackwardsBy = insertionResult.sizeChangesBeforeVisiblePos; - } - adjustFirstItem(moveForwardsBy, moveBackwardsBy); - } - } + if (removedCount != prevVisibleItemsCount) + repositionFirstItem(prevVisibleItemsFirst, prevVisibleItemsFirstPos, prevFirstVisible, &insertionResult, &removalResult); // Whatever removed/moved items remain are no longer visible items. for (QHash<QDeclarativeChangeSet::MoveKey, FxViewItem *>::Iterator it = currentChanges.removedItems.begin(); @@ -1525,7 +1509,7 @@ bool QQuickItemViewPrivate::applyModelChanges() return visibleAffected; } -bool QQuickItemViewPrivate::applyRemovalChange(const QDeclarativeChangeSet::Remove &removal, ChangeResult *insertResult, int *removedCount) +bool QQuickItemViewPrivate::applyRemovalChange(const QDeclarativeChangeSet::Remove &removal, ChangeResult *removeResult, int *removedCount) { Q_Q(QQuickItemView); bool visibleAffected = false; @@ -1553,15 +1537,11 @@ bool QQuickItemViewPrivate::applyRemovalChange(const QDeclarativeChangeSet::Remo QObject::connect(item->attached, SIGNAL(delayRemoveChanged()), q, SLOT(destroyRemoved()), Qt::QueuedConnection); ++it; } else { - if (insertResult->visiblePos.isValid()) { - if (item->position() < insertResult->visiblePos) { - // sizeRemovedBeforeFirstVisible measures the size between the visibleItems.first() - // and the firstVisible, so don't count it if removing visibleItems.first() - if (item != visibleItems.first()) - insertResult->sizeChangesBeforeVisiblePos += item->size(); - } else { - insertResult->sizeChangesAfterVisiblePos += item->size(); - } + if (removeResult->visiblePos.isValid()) { + if (item->position() < removeResult->visiblePos) + removeResult->sizeChangesBeforeVisiblePos += item->size(); + else + removeResult->sizeChangesAfterVisiblePos += item->size(); } if (removal.isMove()) { currentChanges.removedItems.insert(removal.moveKey(item->index), item); @@ -1570,13 +1550,58 @@ bool QQuickItemViewPrivate::applyRemovalChange(const QDeclarativeChangeSet::Remo currentChanges.removedItems.insertMulti(QDeclarativeChangeSet::MoveKey(), item); (*removedCount)++; } + if (!removeResult->changedFirstItem && item == visibleItems.first()) + removeResult->changedFirstItem = true; it = visibleItems.erase(it); } } } + + if (removal.index + removal.count < visibleIndex) + removeResult->changeBeforeVisible -= removal.count; + return visibleAffected; } +void QQuickItemViewPrivate::repositionFirstItem(FxViewItem *prevVisibleItemsFirst, + qreal prevVisibleItemsFirstPos, + FxViewItem *prevFirstVisible, + ChangeResult *insertionResult, + ChangeResult *removalResult) +{ + const QDeclarativeNullableValue<qreal> prevViewPos = insertionResult->visiblePos; + + // reposition visibleItems.first() correctly so that the content y doesn't jump + if (visibleItems.count()) { + if (prevVisibleItemsFirst && insertionResult->changedFirstItem) + resetFirstItemPosition(prevVisibleItemsFirstPos); + + if (prevFirstVisible && prevVisibleItemsFirst == prevFirstVisible + && prevFirstVisible != *visibleItems.constBegin()) { + // the previous visibleItems.first() was also the first visible item, and it has been + // moved/removed, so move the new visibleItems.first() to the pos of the previous one + if (!insertionResult->changedFirstItem) + resetFirstItemPosition(prevVisibleItemsFirstPos); + + } else if (prevViewPos.isValid()) { + qreal moveForwardsBy = 0; + qreal moveBackwardsBy = 0; + + // shift visibleItems.first() relative to the number of added/removed items + if (visibleItems.first()->position() > prevViewPos) { + moveForwardsBy = insertionResult->sizeChangesAfterVisiblePos; + moveBackwardsBy = removalResult->sizeChangesAfterVisiblePos; + } else if (visibleItems.first()->position() < prevViewPos) { + moveForwardsBy = removalResult->sizeChangesBeforeVisiblePos; + moveBackwardsBy = insertionResult->sizeChangesBeforeVisiblePos; + } + adjustFirstItem(moveForwardsBy, moveBackwardsBy, insertionResult->changeBeforeVisible + removalResult->changeBeforeVisible); + } + insertionResult->reset(); + removalResult->reset(); + } +} + /* This may return 0 if the item is being created asynchronously. When the item becomes available, refill() will be called and the item @@ -1589,6 +1614,8 @@ FxViewItem *QQuickItemViewPrivate::createItem(int modelIndex, bool asynchronous) return 0; if (requestedIndex != -1 && requestedIndex != modelIndex) { + if (requestedItem && requestedItem->item) + requestedItem->item->setParentItem(0); delete requestedItem; requestedItem = 0; } @@ -1601,7 +1628,6 @@ FxViewItem *QQuickItemViewPrivate::createItem(int modelIndex, bool asynchronous) item->setParentItem(q->contentItem()); QDeclarative_setParent_noEvent(item, q->contentItem()); requestedIndex = -1; - fillCacheBuffer = false; FxViewItem *viewItem = requestedItem; if (!viewItem) viewItem = newViewItem(modelIndex, item); // already in cache, so viewItem not initialized in initItem() @@ -1635,9 +1661,6 @@ void QQuickItemView::createdItem(int index, QQuickItem *item) if (index == d->currentIndex) d->updateCurrent(index); d->refill(); - } else { - d->fillCacheBuffer = true; - polish(); } } } diff --git a/src/quick/items/qquickitemview_p.h b/src/quick/items/qquickitemview_p.h index c659893091..f426f0dcdf 100644 --- a/src/quick/items/qquickitemview_p.h +++ b/src/quick/items/qquickitemview_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickitemview_p_p.h b/src/quick/items/qquickitemview_p_p.h index a81aa6f54d..4883ee0fc3 100644 --- a/src/quick/items/qquickitemview_p_p.h +++ b/src/quick/items/qquickitemview_p_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -103,9 +103,19 @@ public: QDeclarativeNullableValue<qreal> visiblePos; qreal sizeChangesBeforeVisiblePos; qreal sizeChangesAfterVisiblePos; + bool changedFirstItem; + int changeBeforeVisible; ChangeResult(const QDeclarativeNullableValue<qreal> &p) - : visiblePos(p), sizeChangesBeforeVisiblePos(0), sizeChangesAfterVisiblePos(0) {} + : visiblePos(p), sizeChangesBeforeVisiblePos(0), sizeChangesAfterVisiblePos(0), + changedFirstItem(false), changeBeforeVisible(0) {} + + void reset() { + sizeChangesBeforeVisiblePos = 0.0; + sizeChangesAfterVisiblePos = 0.0; + changedFirstItem = false; + changeBeforeVisible = 0; + } }; enum BufferMode { NoBuffer = 0x00, BufferBefore = 0x01, BufferAfter = 0x02 }; @@ -129,7 +139,7 @@ public: void regenerate(); void layout(); void refill(); - void refill(qreal from, qreal to, bool doBuffer = false); + void refill(qreal from, qreal to); void mirrorChange(); FxViewItem *createItem(int modelIndex, bool asynchronous = false); @@ -147,6 +157,8 @@ public: void applyPendingChanges(); bool applyModelChanges(); bool applyRemovalChange(const QDeclarativeChangeSet::Remove &removal, ChangeResult *changeResult, int *removedCount); + void repositionFirstItem(FxViewItem *prevVisibleItemsFirst, qreal prevVisibleItemsFirstPos, + FxViewItem *prevFirstVisible, ChangeResult *insertionResult, ChangeResult *removalResult); void checkVisible() const; @@ -194,7 +206,6 @@ public: bool ownModel : 1; bool wrap : 1; - bool deferredRelease : 1; bool inApplyModelChanges : 1; bool inViewportMoved : 1; bool forceLayout : 1; @@ -236,13 +247,12 @@ protected: virtual FxViewItem *newViewItem(int index, QQuickItem *item) = 0; virtual void repositionPackageItemAt(QQuickItem *item, int index) = 0; - virtual void resetItemPosition(FxViewItem *item, FxViewItem *toItem) = 0; - virtual void resetFirstItemPosition() = 0; - virtual void adjustFirstItem(qreal forwards, qreal backwards) = 0; + virtual void resetFirstItemPosition(qreal pos = 0.0) = 0; + virtual void adjustFirstItem(qreal forwards, qreal backwards, int changeBeforeVisible) = 0; - virtual void layoutVisibleItems() = 0; + virtual void layoutVisibleItems(int fromModelIndex = 0) = 0; virtual void changedVisibleIndex(int newIndex) = 0; - virtual bool applyInsertionChange(const QDeclarativeChangeSet::Insert &insert, ChangeResult *changeResult, bool *newVisibleItemsFirst, QList<FxViewItem *> *newItems) = 0; + virtual bool applyInsertionChange(const QDeclarativeChangeSet::Insert &insert, ChangeResult *changeResult, QList<FxViewItem *> *newItems) = 0; virtual bool needsRefillForAddedOrRemovedIndex(int) const { return false; } diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp index 8852b4195f..38b157b07b 100644 --- a/src/quick/items/qquicklistview.cpp +++ b/src/quick/items/qquicklistview.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -60,6 +60,8 @@ QT_BEGIN_NAMESPACE #define QML_FLICK_SNAPONETHRESHOLD 30 #endif +//#define DEBUG_DELEGATE_LIFECYCLE + class FxListItemSG; class QQuickListViewPrivate : public QQuickItemViewPrivate @@ -93,17 +95,16 @@ public: virtual void initializeViewItem(FxViewItem *item); virtual void releaseItem(FxViewItem *item); virtual void repositionPackageItemAt(QQuickItem *item, int index); - virtual void resetItemPosition(FxViewItem *item, FxViewItem *toItem); - virtual void resetFirstItemPosition(); - virtual void adjustFirstItem(qreal forwards, qreal backwards); + virtual void resetFirstItemPosition(qreal pos = 0.0); + virtual void adjustFirstItem(qreal forwards, qreal backwards, int); virtual void createHighlight(); virtual void updateHighlight(); virtual void resetHighlightPosition(); virtual void setPosition(qreal pos); - virtual void layoutVisibleItems(); - virtual bool applyInsertionChange(const QDeclarativeChangeSet::Insert &insert, ChangeResult *changeResult, bool *newVisibleItemsFirst, QList<FxViewItem *> *addedItems); + virtual void layoutVisibleItems(int fromModelIndex = 0); + virtual bool applyInsertionChange(const QDeclarativeChangeSet::Insert &insert, ChangeResult *changeResult, QList<FxViewItem *> *addedItems); virtual void updateSections(); QQuickItem *getSectionItem(const QString §ion); @@ -606,7 +607,9 @@ bool QQuickListViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, bool d FxListItemSG *item = 0; qreal pos = itemEnd; while (modelIndex < model->count() && pos <= fillTo) { -// qDebug() << "refill: append item" << modelIndex << "pos" << pos; +#ifdef DEBUG_DELEGATE_LIFECYCLE + qDebug() << "refill: append item" << modelIndex << "pos" << pos; +#endif if (!(item = static_cast<FxListItemSG*>(createItem(modelIndex, doBuffer)))) break; item->setPosition(pos); @@ -616,8 +619,14 @@ bool QQuickListViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, bool d ++modelIndex; changed = true; } + + if (doBuffer && requestedIndex != -1) // already waiting for an item + return changed; + while (visibleIndex > 0 && visibleIndex <= model->count() && visiblePos > fillFrom) { -// qDebug() << "refill: prepend item" << visibleIndex-1 << "current top pos" << visiblePos; +#ifdef DEBUG_DELEGATE_LIFECYCLE + qDebug() << "refill: prepend item" << visibleIndex-1 << "current top pos" << visiblePos; +#endif if (!(item = static_cast<FxListItemSG*>(createItem(visibleIndex-1, doBuffer)))) break; --visibleIndex; @@ -646,8 +655,9 @@ bool QQuickListViewPrivate::removeNonVisibleItems(qreal bufferFrom, qreal buffer if (item->attached->delayRemove()) break; if (item->size() > 0) { -// qDebug() << "refill: remove first" << visibleIndex << "top end pos" << item->endPosition(); - +#ifdef DEBUG_DELEGATE_LIFECYCLE + qDebug() << "refill: remove first" << visibleIndex << "top end pos" << item->endPosition(); +#endif // remove this item and all zero-sized items before it while (item) { if (item->index != -1) @@ -667,7 +677,9 @@ bool QQuickListViewPrivate::removeNonVisibleItems(qreal bufferFrom, qreal buffer while (visibleItems.count() > 1 && (item = visibleItems.last()) && item->position() > bufferTo) { if (item->attached->delayRemove()) break; -// qDebug() << "refill: remove last" << visibleIndex+visibleItems.count()-1 << item->position(); +#ifdef DEBUG_DELEGATE_LIFECYCLE + qDebug() << "refill: remove last" << visibleIndex+visibleItems.count()-1 << item->position(); +#endif visibleItems.removeLast(); releaseItem(item); changed = true; @@ -693,7 +705,7 @@ void QQuickListViewPrivate::visibleItemsChanged() updateUnrequestedPositions(); } -void QQuickListViewPrivate::layoutVisibleItems() +void QQuickListViewPrivate::layoutVisibleItems(int fromModelIndex) { if (!visibleItems.isEmpty()) { const qreal from = isContentFlowReversed() ? -position() - size() : position(); @@ -706,8 +718,10 @@ void QQuickListViewPrivate::layoutVisibleItems() firstItem->item->setVisible(firstItem->endPosition() >= from && firstItem->position() <= to); for (int i=1; i < visibleItems.count(); ++i) { FxListItemSG *item = static_cast<FxListItemSG*>(visibleItems.at(i)); - item->setPosition(pos); - item->item->setVisible(item->endPosition() >= from && item->position() <= to); + if (item->index >= fromModelIndex) { + item->setPosition(pos); + item->item->setVisible(item->endPosition() >= from && item->position() <= to); + } pos += item->size() + spacing; sum += item->size(); fixedCurrent = fixedCurrent || (currentItem && item->item == currentItem->item); @@ -738,20 +752,13 @@ void QQuickListViewPrivate::repositionPackageItemAt(QQuickItem *item, int index) } } -void QQuickListViewPrivate::resetItemPosition(FxViewItem *item, FxViewItem *toItem) -{ - if (item == toItem) - return; - static_cast<FxListItemSG*>(item)->setPosition(toItem->position()); -} - -void QQuickListViewPrivate::resetFirstItemPosition() +void QQuickListViewPrivate::resetFirstItemPosition(qreal pos) { FxListItemSG *item = static_cast<FxListItemSG*>(visibleItems.first()); - item->setPosition(0); + item->setPosition(pos); } -void QQuickListViewPrivate::adjustFirstItem(qreal forwards, qreal backwards) +void QQuickListViewPrivate::adjustFirstItem(qreal forwards, qreal backwards, int) { if (!visibleItems.count()) return; @@ -1832,7 +1839,7 @@ void QQuickListView::setSpacing(qreal spacing) if (spacing != d->spacing) { d->spacing = spacing; d->forceLayout = true; - d->layout(); + polish(); emit spacingChanged(); } } @@ -2198,14 +2205,6 @@ void QQuickListView::viewportMoved() return; d->inViewportMoved = true; - // Set visibility of items to eliminate cost of items outside the visible area. - qreal from = d->isContentFlowReversed() ? -d->position()-d->size() : d->position(); - qreal to = d->isContentFlowReversed() ? -d->position() : d->position()+d->size(); - for (int i = 0; i < d->visibleItems.count(); ++i) { - FxViewItem *item = static_cast<FxListItemSG*>(d->visibleItems.at(i)); - item->item->setVisible(item->endPosition() >= from && item->position() <= to); - } - if (yflick()) d->bufferMode = d->vData.smoothVelocity < 0 ? QQuickListViewPrivate::BufferBefore : QQuickListViewPrivate::BufferAfter; else if (d->isRightToLeft()) @@ -2214,6 +2213,15 @@ void QQuickListView::viewportMoved() d->bufferMode = d->hData.smoothVelocity < 0 ? QQuickListViewPrivate::BufferBefore : QQuickListViewPrivate::BufferAfter; d->refill(); + + // Set visibility of items to eliminate cost of items outside the visible area. + qreal from = d->isContentFlowReversed() ? -d->position()-d->size() : d->position(); + qreal to = d->isContentFlowReversed() ? -d->position() : d->position()+d->size(); + for (int i = 0; i < d->visibleItems.count(); ++i) { + FxViewItem *item = static_cast<FxListItemSG*>(d->visibleItems.at(i)); + item->item->setVisible(item->endPosition() >= from && item->position() <= to); + } + if (d->hData.flicking || d->vData.flicking || d->hData.moving || d->vData.moving) d->moveReason = QQuickListViewPrivate::Mouse; if (d->moveReason != QQuickListViewPrivate::SetIndex) { @@ -2375,12 +2383,12 @@ void QQuickListView::updateSections() d->updateSections(); if (d->itemCount) { d->forceLayout = true; - d->layout(); + polish(); } } } -bool QQuickListViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::Insert &change, ChangeResult *insertResult, bool *newVisibleItemsFirst, QList<FxViewItem *> *addedItems) +bool QQuickListViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::Insert &change, ChangeResult *insertResult, QList<FxViewItem *> *addedItems) { int modelIndex = change.index; int count = change.count; @@ -2444,7 +2452,7 @@ bool QQuickListViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::In visibleItems.insert(insertionIdx, item); if (insertionIdx == 0) - *newVisibleItemsFirst = true; + insertResult->changedFirstItem = true; if (!change.isMove()) addedItems->append(item); insertResult->sizeChangesBeforeVisiblePos += item->size() + spacing; @@ -2466,7 +2474,7 @@ bool QQuickListViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::In visibleItems.insert(index, item); if (index == 0) - *newVisibleItemsFirst = true; + insertResult->changedFirstItem = true; if (!change.isMove()) addedItems->append(item); insertResult->sizeChangesAfterVisiblePos += item->size() + spacing; diff --git a/src/quick/items/qquicklistview_p.h b/src/quick/items/qquicklistview_p.h index 984506eeaa..6802b49e88 100644 --- a/src/quick/items/qquicklistview_p.h +++ b/src/quick/items/qquicklistview_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickloader.cpp b/src/quick/items/qquickloader.cpp index 197420c301..f203f57473 100644 --- a/src/quick/items/qquickloader.cpp +++ b/src/quick/items/qquickloader.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickloader_p.h b/src/quick/items/qquickloader_p.h index 0c6036e48a..508197dabd 100644 --- a/src/quick/items/qquickloader_p.h +++ b/src/quick/items/qquickloader_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickloader_p_p.h b/src/quick/items/qquickloader_p_p.h index c67d9a17a5..4cc5dc8889 100644 --- a/src/quick/items/qquickloader_p_p.h +++ b/src/quick/items/qquickloader_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickmousearea.cpp b/src/quick/items/qquickmousearea.cpp index 6bedadc052..ac0eae4384 100644 --- a/src/quick/items/qquickmousearea.cpp +++ b/src/quick/items/qquickmousearea.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickmousearea_p.h b/src/quick/items/qquickmousearea_p.h index d45f8aa722..710ec7d382 100644 --- a/src/quick/items/qquickmousearea_p.h +++ b/src/quick/items/qquickmousearea_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickmousearea_p_p.h b/src/quick/items/qquickmousearea_p_p.h index aca9ad5ad2..15098c4aee 100644 --- a/src/quick/items/qquickmousearea_p_p.h +++ b/src/quick/items/qquickmousearea_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickmultipointtoucharea.cpp b/src/quick/items/qquickmultipointtoucharea.cpp index d712a89f31..c702c95a94 100644 --- a/src/quick/items/qquickmultipointtoucharea.cpp +++ b/src/quick/items/qquickmultipointtoucharea.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickmultipointtoucharea_p.h b/src/quick/items/qquickmultipointtoucharea_p.h index 3a2e9c75ac..306f01f68b 100644 --- a/src/quick/items/qquickmultipointtoucharea_p.h +++ b/src/quick/items/qquickmultipointtoucharea_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickninepatchnode.cpp b/src/quick/items/qquickninepatchnode.cpp index 9724d8330e..577fcb8bb5 100644 --- a/src/quick/items/qquickninepatchnode.cpp +++ b/src/quick/items/qquickninepatchnode.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickninepatchnode_p.h b/src/quick/items/qquickninepatchnode_p.h index 0cb1c87d54..41fc06f062 100644 --- a/src/quick/items/qquickninepatchnode_p.h +++ b/src/quick/items/qquickninepatchnode_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickpainteditem.cpp b/src/quick/items/qquickpainteditem.cpp index cddc04f045..740417a0af 100644 --- a/src/quick/items/qquickpainteditem.cpp +++ b/src/quick/items/qquickpainteditem.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickpainteditem.h b/src/quick/items/qquickpainteditem.h index 6d7bb4a3ac..86c40a99d3 100644 --- a/src/quick/items/qquickpainteditem.h +++ b/src/quick/items/qquickpainteditem.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickpainteditem_p.h b/src/quick/items/qquickpainteditem_p.h index 8a99dec07c..8152e740af 100644 --- a/src/quick/items/qquickpainteditem_p.h +++ b/src/quick/items/qquickpainteditem_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickpathview.cpp b/src/quick/items/qquickpathview.cpp index ebb96a2556..ec31731bfc 100644 --- a/src/quick/items/qquickpathview.cpp +++ b/src/quick/items/qquickpathview.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickpathview_p.h b/src/quick/items/qquickpathview_p.h index 293a14f751..47ce66873c 100644 --- a/src/quick/items/qquickpathview_p.h +++ b/src/quick/items/qquickpathview_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickpathview_p_p.h b/src/quick/items/qquickpathview_p_p.h index 46114cf5b5..9caea98499 100644 --- a/src/quick/items/qquickpathview_p_p.h +++ b/src/quick/items/qquickpathview_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickpincharea.cpp b/src/quick/items/qquickpincharea.cpp index b815101961..1ea909e13a 100644 --- a/src/quick/items/qquickpincharea.cpp +++ b/src/quick/items/qquickpincharea.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtSG module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickpincharea_p.h b/src/quick/items/qquickpincharea_p.h index 0aca353b43..bb9cb163ea 100644 --- a/src/quick/items/qquickpincharea_p.h +++ b/src/quick/items/qquickpincharea_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtSG module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickpincharea_p_p.h b/src/quick/items/qquickpincharea_p_p.h index 0b1ba877cb..3c7be77e44 100644 --- a/src/quick/items/qquickpincharea_p_p.h +++ b/src/quick/items/qquickpincharea_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtSG module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickpositioners.cpp b/src/quick/items/qquickpositioners.cpp index 321ff7fd3c..48ec90d402 100644 --- a/src/quick/items/qquickpositioners.cpp +++ b/src/quick/items/qquickpositioners.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -172,7 +172,6 @@ void QQuickBasePositioner::componentComplete() QQuickItem::componentComplete(); positionedItems.reserve(childItems().count()); prePositioning(); - reportConflictingAnchors(); } void QQuickBasePositioner::itemChange(ItemChange change, const ItemChangeData &value) @@ -239,8 +238,11 @@ void QQuickBasePositioner::prePositioning() } } QSizeF contentSize(0,0); - doPositioning(&contentSize); - updateAttachedProperties(); + reportConflictingAnchors(); + if (!d->anchorConflict) { + doPositioning(&contentSize); + updateAttachedProperties(); + } if (!d->addActions.isEmpty() || !d->moveActions.isEmpty()) finishApplyTransitions(); d->doingPositioning = false; @@ -574,7 +576,8 @@ void QQuickColumn::reportConflictingAnchors() } } if (d->anchorConflict) { - qmlInfo(this) << "Cannot specify top, bottom, verticalCenter, fill or centerIn anchors for items inside Column"; + qmlInfo(this) << "Cannot specify top, bottom, verticalCenter, fill or centerIn anchors for items inside Column." + << " Column will not function."; } } /*! @@ -800,7 +803,8 @@ void QQuickRow::reportConflictingAnchors() } } if (d->anchorConflict) - qmlInfo(this) << "Cannot specify left, right, horizontalCenter, fill or centerIn anchors for items inside Row"; + qmlInfo(this) << "Cannot specify left, right, horizontalCenter, fill or centerIn anchors for items inside Row." + << " Row will not function."; } /*! @@ -1234,7 +1238,7 @@ void QQuickGrid::reportConflictingAnchors() } } if (d->anchorConflict) - qmlInfo(this) << "Cannot specify anchors for items inside Grid"; + qmlInfo(this) << "Cannot specify anchors for items inside Grid." << " Grid will not function."; } /*! @@ -1526,7 +1530,7 @@ void QQuickFlow::reportConflictingAnchors() } } if (d->anchorConflict) - qmlInfo(this) << "Cannot specify anchors for items inside Flow"; + qmlInfo(this) << "Cannot specify anchors for items inside Flow." << " Flow will not function."; } QT_END_NAMESPACE diff --git a/src/quick/items/qquickpositioners_p.h b/src/quick/items/qquickpositioners_p.h index ef2930e6f3..8b23857b70 100644 --- a/src/quick/items/qquickpositioners_p.h +++ b/src/quick/items/qquickpositioners_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickpositioners_p_p.h b/src/quick/items/qquickpositioners_p_p.h index e7b88ad7e9..a99ac3c632 100644 --- a/src/quick/items/qquickpositioners_p_p.h +++ b/src/quick/items/qquickpositioners_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickrectangle.cpp b/src/quick/items/qquickrectangle.cpp index 74349238fe..ab4bd979f8 100644 --- a/src/quick/items/qquickrectangle.cpp +++ b/src/quick/items/qquickrectangle.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickrectangle_p.h b/src/quick/items/qquickrectangle_p.h index 67f895a9ef..90d2f304b4 100644 --- a/src/quick/items/qquickrectangle_p.h +++ b/src/quick/items/qquickrectangle_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickrectangle_p_p.h b/src/quick/items/qquickrectangle_p_p.h index 9bfcec8958..8abc0121be 100644 --- a/src/quick/items/qquickrectangle_p_p.h +++ b/src/quick/items/qquickrectangle_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickrepeater.cpp b/src/quick/items/qquickrepeater.cpp index b03ac6eb16..e808aa77be 100644 --- a/src/quick/items/qquickrepeater.cpp +++ b/src/quick/items/qquickrepeater.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickrepeater_p.h b/src/quick/items/qquickrepeater_p.h index 21c399d299..58deebced4 100644 --- a/src/quick/items/qquickrepeater_p.h +++ b/src/quick/items/qquickrepeater_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickrepeater_p_p.h b/src/quick/items/qquickrepeater_p_p.h index c01d4bdc89..954a64c272 100644 --- a/src/quick/items/qquickrepeater_p_p.h +++ b/src/quick/items/qquickrepeater_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickscalegrid.cpp b/src/quick/items/qquickscalegrid.cpp index c5e386bff4..3366d878f8 100644 --- a/src/quick/items/qquickscalegrid.cpp +++ b/src/quick/items/qquickscalegrid.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickscalegrid_p_p.h b/src/quick/items/qquickscalegrid_p_p.h index cbc23601db..298105aeb7 100644 --- a/src/quick/items/qquickscalegrid_p_p.h +++ b/src/quick/items/qquickscalegrid_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickscreen.cpp b/src/quick/items/qquickscreen.cpp index 2145aef486..3769f4e809 100644 --- a/src/quick/items/qquickscreen.cpp +++ b/src/quick/items/qquickscreen.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -74,10 +74,10 @@ QT_BEGIN_NAMESPACE \qmlattachedproperty Qt::ScreenOrientation QtQuickWindow2::Screen::primaryOrientation \readonly - This contains the primary orientation of the screen. This can only change if the screen changes. + This contains the primary orientation of the screen. */ /*! - \qmlattachedproperty Qt::ScreenOrientation QtQuickWindow2::Screen::currentOrientation + \qmlattachedproperty Qt::ScreenOrientation QtQuickWindow2::Screen::orientation \readonly This contains the current orientation of the screen. @@ -119,20 +119,20 @@ int QQuickScreenAttached::height() const Qt::ScreenOrientation QQuickScreenAttached::primaryOrientation() const { if (!m_screen) - return Qt::UnknownOrientation; + return Qt::PrimaryOrientation; return m_screen->primaryOrientation(); } -Qt::ScreenOrientation QQuickScreenAttached::currentOrientation() const +Qt::ScreenOrientation QQuickScreenAttached::orientation() const { if (!m_screen) - return Qt::UnknownOrientation; - return m_screen->currentOrientation(); + return Qt::PrimaryOrientation; + return m_screen->orientation(); } int QQuickScreenAttached::angleBetween(Qt::ScreenOrientation a, Qt::ScreenOrientation b) { - return QScreen::angleBetween(a,b); + return m_screen->angleBetween(a,b); } void QQuickScreenAttached::canvasChanged(QQuickCanvas* c)//Called by QQuickItemPrivate::initCanvas @@ -147,8 +147,10 @@ void QQuickScreenAttached::canvasChanged(QQuickCanvas* c)//Called by QQuickItemP this, SIGNAL(widthChanged())); disconnect(oldScreen, SIGNAL(sizeChanged(QSize)), this, SIGNAL(heightChanged())); - disconnect(oldScreen, SIGNAL(currentOrientationChanged(Qt::ScreenOrientation)), - this, SIGNAL(currentOrientationChanged())); + disconnect(oldScreen, SIGNAL(orientationChanged(Qt::ScreenOrientation)), + this, SIGNAL(orientationChanged())); + disconnect(oldScreen, SIGNAL(primaryOrientationChanged(Qt::ScreenOrientation)), + this, SIGNAL(primaryOrientationChanged())); } if (!screen) @@ -158,8 +160,9 @@ void QQuickScreenAttached::canvasChanged(QQuickCanvas* c)//Called by QQuickItemP emit widthChanged(); emit heightChanged(); } - if (!oldScreen || screen->currentOrientation() != oldScreen->currentOrientation()) - emit currentOrientationChanged(); + + if (!oldScreen || screen->orientation() != oldScreen->orientation()) + emit orientationChanged(); if (!oldScreen || screen->primaryOrientation() != oldScreen->primaryOrientation()) emit primaryOrientationChanged(); @@ -168,8 +171,10 @@ void QQuickScreenAttached::canvasChanged(QQuickCanvas* c)//Called by QQuickItemP this, SIGNAL(widthChanged())); connect(screen, SIGNAL(sizeChanged(QSize)), this, SIGNAL(heightChanged())); - connect(screen, SIGNAL(currentOrientationChanged(Qt::ScreenOrientation)), - this, SIGNAL(currentOrientationChanged())); + connect(screen, SIGNAL(orientationChanged(Qt::ScreenOrientation)), + this, SIGNAL(orientationChanged())); + connect(screen, SIGNAL(primaryOrientationChanged(Qt::ScreenOrientation)), + this, SIGNAL(primaryOrientationChanged())); } } diff --git a/src/quick/items/qquickscreen_p.h b/src/quick/items/qquickscreen_p.h index b90508a092..672607f7f5 100644 --- a/src/quick/items/qquickscreen_p.h +++ b/src/quick/items/qquickscreen_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -51,7 +51,6 @@ QT_BEGIN_HEADER QT_BEGIN_NAMESPACE -QT_MODULE(Declarative) class QQuickItem; class QQuickCanvas; @@ -64,7 +63,7 @@ class Q_AUTOTEST_EXPORT QQuickScreenAttached : public QObject Q_PROPERTY(int width READ width NOTIFY widthChanged) Q_PROPERTY(int height READ height NOTIFY heightChanged) Q_PROPERTY(Qt::ScreenOrientation primaryOrientation READ primaryOrientation NOTIFY primaryOrientationChanged) - Q_PROPERTY(Qt::ScreenOrientation currentOrientation READ currentOrientation NOTIFY currentOrientationChanged) + Q_PROPERTY(Qt::ScreenOrientation orientation READ orientation NOTIFY orientationChanged) public: QQuickScreenAttached(QObject* attachee); @@ -72,7 +71,7 @@ public: int width() const; int height() const; Qt::ScreenOrientation primaryOrientation() const; - Qt::ScreenOrientation currentOrientation() const; + Qt::ScreenOrientation orientation() const; Q_INVOKABLE int angleBetween(Qt::ScreenOrientation a, Qt::ScreenOrientation b); @@ -82,7 +81,7 @@ Q_SIGNALS: void widthChanged(); void heightChanged(); void primaryOrientationChanged(); - void currentOrientationChanged(); + void orientationChanged(); private: QScreen* m_screen; diff --git a/src/quick/items/qquickshadereffect.cpp b/src/quick/items/qquickshadereffect.cpp index be01338c1b..1c82b64163 100644 --- a/src/quick/items/qquickshadereffect.cpp +++ b/src/quick/items/qquickshadereffect.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -185,6 +185,7 @@ QQuickShaderEffect::QQuickShaderEffect(QQuickItem *parent) , m_meshResolution(1, 1) , m_mesh(0) , m_cullMode(NoCulling) + , m_status(Uncompiled) , m_blending(true) , m_dirtyData(true) , m_programDirty(true) @@ -215,6 +216,10 @@ void QQuickShaderEffect::setFragmentShader(const QByteArray &code) m_source.fragmentCode = code; update(); m_complete = false; + if (m_status != Uncompiled) { + m_status = Uncompiled; + emit statusChanged(); + } emit fragmentShaderChanged(); } @@ -234,6 +239,10 @@ void QQuickShaderEffect::setVertexShader(const QByteArray &code) m_source.vertexCode = code; update(); m_complete = false; + if (m_status != Uncompiled) { + m_status = Uncompiled; + emit statusChanged(); + } emit vertexShaderChanged(); } @@ -334,6 +343,34 @@ void QQuickShaderEffect::setCullMode(CullMode face) emit cullModeChanged(); } +/*! + \qmlproperty enumeration QtQuick2::ShaderEffect::status + + This property tells the current status of the OpenGL shader program. + + \list + \o ShaderEffect.Compiled - the shader program was successfully compiled and linked. + \o ShaderEffect.Uncompiled - the shader program has not yet been compiled. + \o ShaderEffect.Error - the shader program failed to compile or link. + \endlist + + When setting the fragment or vertex shader source code, the status will become Uncompiled. + The first time the ShaderEffect is rendered with new shader source code, the shaders are + compiled and linked, and the status is updated to Compiled or Error. + + \sa log +*/ + +/*! + \qmlproperty string QtQuick2::ShaderEffect::log + + This property holds a log of warnings and errors from the latest attempt at compiling and + linking the OpenGL shader program. It is updated at the same time \l status is set to Compiled + or Error. + + \sa status +*/ + void QQuickShaderEffect::changeSource(int index) { Q_ASSERT(index >= 0 && index < m_sources.size()); @@ -353,6 +390,14 @@ void QQuickShaderEffect::updateGeometry() update(); } +void QQuickShaderEffect::updateLogAndStatus(const QString &log, int status) +{ + m_log = m_parseLog + log; + m_status = Status(status); + emit logChanged(); + emit statusChanged(); +} + void QQuickShaderEffect::setSource(const QVariant &var, int index) { Q_ASSERT(index >= 0 && index < m_sources.size()); @@ -467,7 +512,8 @@ void QQuickShaderEffect::reset() delete source.mapper; } m_sources.clear(); - + m_log.clear(); + m_parseLog.clear(); m_programDirty = true; m_dirtyMesh = true; } @@ -494,14 +540,22 @@ void QQuickShaderEffect::updateProperties() lookThroughShaderCode(m_source.fragmentCode); } - if (!m_mesh && !m_source.attributeNames.contains(qt_position_attribute_name)) - qWarning("QQuickShaderEffect: Missing reference to \'%s\'.", qt_position_attribute_name); - if (!m_mesh && !m_source.attributeNames.contains(qt_texcoord_attribute_name)) - qWarning("QQuickShaderEffect: Missing reference to \'%s\'.", qt_texcoord_attribute_name); - if (!m_source.respectsMatrix) - qWarning("QQuickShaderEffect: Missing reference to \'qt_Matrix\'."); - if (!m_source.respectsOpacity) - qWarning("QQuickShaderEffect: Missing reference to \'qt_Opacity\'."); + if (!m_mesh && !m_source.attributeNames.contains(qt_position_attribute_name)) { + m_parseLog += QLatin1String("Warning: Missing reference to \'"); + m_parseLog += QLatin1String(qt_position_attribute_name); + m_parseLog += QLatin1String("\'.\n"); + } + if (!m_mesh && !m_source.attributeNames.contains(qt_texcoord_attribute_name)) { + m_parseLog += QLatin1String("Warning: Missing reference to \'"); + m_parseLog += QLatin1String(qt_texcoord_attribute_name); + m_parseLog += QLatin1String("\'.\n"); + } + if (!m_source.respectsMatrix) { + m_parseLog += QLatin1String("Warning: Missing reference to \'qt_Matrix\'.\n"); + } + if (!m_source.respectsOpacity) { + m_parseLog += QLatin1String("Warning: Missing reference to \'qt_Opacity\'.\n"); + } for (int i = 0; i < m_sources.size(); ++i) { QVariant v = property(m_sources.at(i).name); @@ -688,6 +742,7 @@ QSGNode *QQuickShaderEffect::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeDa m_programDirty = true; m_dirtyData = true; m_dirtyGeometry = true; + connect(node, SIGNAL(logAndStatusChanged(QString,int)), this, SLOT(updateLogAndStatus(QString,int))); } QQuickShaderEffectMaterial *material = node->shaderMaterial(); @@ -706,6 +761,15 @@ QSGNode *QQuickShaderEffect::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeDa geometry = mesh->updateGeometry(geometry, m_source.attributeNames, rect); if (!geometry) { + QString log = mesh->log(); + if (!log.isNull()) { + m_log = m_parseLog; + m_log += QLatin1String("*** Mesh ***\n"); + m_log += log; + m_status = Error; + emit logChanged(); + emit statusChanged(); + } delete node; return 0; } diff --git a/src/quick/items/qquickshadereffect_p.h b/src/quick/items/qquickshadereffect_p.h index 7536b42a73..46882217e6 100644 --- a/src/quick/items/qquickshadereffect_p.h +++ b/src/quick/items/qquickshadereffect_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -70,7 +70,10 @@ class Q_AUTOTEST_EXPORT QQuickShaderEffect : public QQuickItem Q_PROPERTY(bool blending READ blending WRITE setBlending NOTIFY blendingChanged) Q_PROPERTY(QVariant mesh READ mesh WRITE setMesh NOTIFY meshChanged) Q_PROPERTY(CullMode culling READ cullMode WRITE setCullMode NOTIFY cullModeChanged) + Q_PROPERTY(QString log READ log NOTIFY logChanged) + Q_PROPERTY(Status status READ status NOTIFY statusChanged) Q_ENUMS(CullMode) + Q_ENUMS(Status) public: enum CullMode @@ -80,6 +83,13 @@ public: FrontFaceCulling = QQuickShaderEffectMaterial::FrontFaceCulling }; + enum Status + { + Compiled, + Uncompiled, + Error + }; + QQuickShaderEffect(QQuickItem *parent = 0); ~QQuickShaderEffect(); @@ -98,7 +108,11 @@ public: CullMode cullMode() const { return m_cullMode; } void setCullMode(CullMode face); + QString log() const { return m_log; } + Status status() const { return m_status; } + void ensureCompleted(); + QString parseLog() { return m_parseLog; } Q_SIGNALS: void fragmentShaderChanged(); @@ -106,6 +120,8 @@ Q_SIGNALS: void blendingChanged(); void meshChanged(); void cullModeChanged(); + void logChanged(); + void statusChanged(); protected: virtual void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry); @@ -116,6 +132,7 @@ private Q_SLOTS: void changeSource(int index); void updateData(); void updateGeometry(); + void updateLogAndStatus(const QString &log, int status); private: friend class QQuickCustomMaterialShader; @@ -133,6 +150,8 @@ private: QQuickShaderEffectMesh *m_mesh; QQuickGridMesh m_defaultMesh; CullMode m_cullMode; + QString m_log; + Status m_status; struct SourceData { @@ -141,6 +160,7 @@ private: QByteArray name; }; QVector<SourceData> m_sources; + QString m_parseLog; uint m_blending : 1; uint m_dirtyData : 1; diff --git a/src/quick/items/qquickshadereffectmesh.cpp b/src/quick/items/qquickshadereffectmesh.cpp index 3154ac7cfd..e170a61d99 100644 --- a/src/quick/items/qquickshadereffectmesh.cpp +++ b/src/quick/items/qquickshadereffectmesh.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -68,40 +68,47 @@ QQuickGridMesh::QQuickGridMesh(QObject *parent) connect(this, SIGNAL(resolutionChanged()), this, SIGNAL(geometryChanged())); } -QSGGeometry *QQuickGridMesh::updateGeometry(QSGGeometry *geometry, const QVector<QByteArray> &attributes, const QRectF &dstRect) const +QSGGeometry *QQuickGridMesh::updateGeometry(QSGGeometry *geometry, const QVector<QByteArray> &attributes, const QRectF &dstRect) { int vmesh = m_resolution.height(); int hmesh = m_resolution.width(); int attrCount = attributes.count(); + int positionIndex = attributes.indexOf(qtPositionAttributeName()); + int texCoordIndex = attributes.indexOf(qtTexCoordAttributeName()); + if (!geometry) { - bool error = true; - Q_UNUSED(error) switch (attrCount) { case 0: - qWarning("QQuickGridMesh:: No attributes specified."); - break; + m_log = QLatin1String("Error: No attributes specified."); + return 0; case 1: - if (attributes.at(0) == qtPositionAttributeName()) { - error = false; - break; + if (positionIndex != 0) { + m_log = QLatin1String("Error: Missing \'"); + m_log += QLatin1String(qtPositionAttributeName()); + m_log += QLatin1String("\' attribute.\n"); + return 0; } - qWarning("QQuickGridMesh:: Missing \'%s\' attribute.", - qtPositionAttributeName()); break; case 2: - if (attributes.contains(qtPositionAttributeName()) - && attributes.contains(qtTexCoordAttributeName())) - { - error = false; - break; + if (positionIndex == -1 || texCoordIndex == -1) { + m_log.clear(); + if (positionIndex == -1) { + m_log = QLatin1String("Error: Missing \'"); + m_log += QLatin1String(qtPositionAttributeName()); + m_log += QLatin1String("\' attribute.\n"); + } + if (texCoordIndex == -1) { + m_log += QLatin1String("Error: Missing \'"); + m_log += QLatin1String(qtTexCoordAttributeName()); + m_log += QLatin1String("\' attribute.\n"); + } + return 0; } - qWarning("QQuickGridMesh:: Missing \'%s\' or \'%s\' attribute.", - qtPositionAttributeName(), qtTexCoordAttributeName()); break; default: - qWarning("QQuickGridMesh:: Too many attributes specified."); - break; + m_log = QLatin1String("Error: Too many attributes specified."); + return 0; } geometry = new QSGGeometry(attrCount == 1 @@ -116,8 +123,6 @@ QSGGeometry *QQuickGridMesh::updateGeometry(QSGGeometry *geometry, const QVector QSGGeometry::Point2D *vdata = static_cast<QSGGeometry::Point2D *>(geometry->vertexData()); - bool positionFirst = attributes.at(0) == qtPositionAttributeName(); - QRectF srcRect(0, 0, 1, 1); for (int iy = 0; iy <= vmesh; ++iy) { float fy = iy / float(vmesh); @@ -126,7 +131,7 @@ QSGGeometry *QQuickGridMesh::updateGeometry(QSGGeometry *geometry, const QVector for (int ix = 0; ix <= hmesh; ++ix) { float fx = ix / float(hmesh); for (int ia = 0; ia < attrCount; ++ia) { - if (positionFirst == (ia == 0)) { + if (ia == positionIndex) { vdata->x = float(dstRect.left()) + fx * float(dstRect.width()); vdata->y = y; ++vdata; diff --git a/src/quick/items/qquickshadereffectmesh_p.h b/src/quick/items/qquickshadereffectmesh_p.h index 1671fd53f9..5f5eccccd6 100644 --- a/src/quick/items/qquickshadereffectmesh_p.h +++ b/src/quick/items/qquickshadereffectmesh_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -64,7 +64,9 @@ class Q_QUICK_EXPORT QQuickShaderEffectMesh : public QObject public: QQuickShaderEffectMesh(QObject *parent = 0); // If 'geometry' != 0, 'attributes' is the same as last time the function was called. - virtual QSGGeometry *updateGeometry(QSGGeometry *geometry, const QVector<QByteArray> &attributes, const QRectF &rect) const = 0; + virtual QSGGeometry *updateGeometry(QSGGeometry *geometry, const QVector<QByteArray> &attributes, const QRectF &rect) = 0; + // If updateGeometry() fails, the reason should appear in the log. + virtual QString log() const { return QString(); } Q_SIGNALS: // Emitted when the geometry needs to be updated. @@ -77,7 +79,8 @@ class QQuickGridMesh : public QQuickShaderEffectMesh Q_PROPERTY(QSize resolution READ resolution WRITE setResolution NOTIFY resolutionChanged) public: QQuickGridMesh(QObject *parent = 0); - virtual QSGGeometry *updateGeometry(QSGGeometry *geometry, const QVector<QByteArray> &attributes, const QRectF &rect) const; + virtual QSGGeometry *updateGeometry(QSGGeometry *geometry, const QVector<QByteArray> &attributes, const QRectF &rect); + virtual QString log() const { return m_log; } void setResolution(const QSize &res); QSize resolution() const; @@ -87,6 +90,7 @@ Q_SIGNALS: private: QSize m_resolution; + QString m_log; }; inline QColor qt_premultiply_color(const QColor &c) diff --git a/src/quick/items/qquickshadereffectnode.cpp b/src/quick/items/qquickshadereffectnode.cpp index 968982bb88..2fdd69c9e6 100644 --- a/src/quick/items/qquickshadereffectnode.cpp +++ b/src/quick/items/qquickshadereffectnode.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -42,6 +42,7 @@ #include <private/qquickshadereffectnode_p.h> #include "qquickshadereffectmesh_p.h" +#include "qquickshadereffect_p.h" #include <QtQuick/qsgtextureprovider.h> #include <QtQuick/private/qsgrenderer_p.h> @@ -58,6 +59,7 @@ public: protected: friend class QQuickShaderEffectNode; + virtual void compile(); virtual void initialize(); virtual const char *vertexShader() const; virtual const char *fragmentShader() const; @@ -65,6 +67,8 @@ protected: const QQuickShaderEffectMaterialKey m_key; QVector<const char *> m_attributeNames; const QVector<QByteArray> m_attributes; + QString m_log; + bool m_compiled; QVector<int> m_uniformLocs; int m_opacityLoc; @@ -75,6 +79,7 @@ protected: QQuickCustomMaterialShader::QQuickCustomMaterialShader(const QQuickShaderEffectMaterialKey &key, const QVector<QByteArray> &attributes) : m_key(key) , m_attributes(attributes) + , m_compiled(false) , m_textureIndicesSet(false) { for (int i = 0; i < attributes.count(); ++i) @@ -92,7 +97,12 @@ void QQuickCustomMaterialShader::updateState(const RenderState &state, QSGMateri { Q_ASSERT(newEffect != 0); - const QQuickShaderEffectMaterial *material = static_cast<const QQuickShaderEffectMaterial *>(newEffect); + QQuickShaderEffectMaterial *material = static_cast<QQuickShaderEffectMaterial *>(newEffect); + if (!material->m_emittedLogChanged && material->m_node) { + material->m_emittedLogChanged = true; + emit material->m_node->logAndStatusChanged(m_log, m_compiled ? QQuickShaderEffect::Compiled + : QQuickShaderEffect::Error); + } if (!m_textureIndicesSet) { for (int i = 0; i < material->m_textures.size(); ++i) @@ -192,6 +202,78 @@ char const *const *QQuickCustomMaterialShader::attributeNames() const return m_attributeNames.constData(); } +void QQuickCustomMaterialShader::compile() +{ + Q_ASSERT_X(!program()->isLinked(), "QQuickCustomMaterialShader::compile()", "Compile called multiple times!"); + + m_log.clear(); + m_compiled = true; + if (!program()->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShader())) { + m_log += QLatin1String("*** Vertex shader ***\n"); + m_log += program()->log(); + m_compiled = false; + } + if (!program()->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShader())) { + m_log += QLatin1String("*** Fragment shader ***\n"); + m_log += program()->log(); + m_compiled = false; + } + + char const *const *attr = attributeNames(); +#ifndef QT_NO_DEBUG + int maxVertexAttribs = 0; + glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs); + int attrCount = 0; + while (attrCount < maxVertexAttribs && attr[attrCount]) + ++attrCount; + if (attr[attrCount]) { + qWarning("List of attribute names is too long.\n" + "Maximum number of attributes on this hardware is %i.\n" + "Vertex shader:\n%s\n" + "Fragment shader:\n%s\n", + maxVertexAttribs, vertexShader(), fragmentShader()); + } +#endif + + if (m_compiled) { +#ifndef QT_NO_DEBUG + for (int i = 0; i < attrCount; ++i) { +#else + for (int i = 0; attr[i]; ++i) { +#endif + if (*attr[i]) + program()->bindAttributeLocation(attr[i], i); + } + m_compiled = program()->link(); + m_log += program()->log(); + } + + static const char *fallbackVertexShader = + "uniform highp mat4 qt_Matrix;" + "attribute highp vec4 v;" + "void main() { gl_Position = qt_Matrix * v; }"; + static const char *fallbackFragmentShader = + "void main() { gl_FragColor = vec4(1., 0., 1., 1.); }"; + + if (!m_compiled) { + qWarning("QQuickCustomMaterialShader: Shader compilation failed:"); + qWarning() << program()->log(); + + program()->removeAllShaders(); + program()->addShaderFromSourceCode(QOpenGLShader::Vertex, fallbackVertexShader); + program()->addShaderFromSourceCode(QOpenGLShader::Fragment, fallbackFragmentShader); +#ifndef QT_NO_DEBUG + for (int i = 0; i < attrCount; ++i) { +#else + for (int i = 0; attr[i]; ++i) { +#endif + if (qstrcmp(attr[i], qtPositionAttributeName()) == 0) + program()->bindAttributeLocation("v", i); + } + program()->link(); + } +} + void QQuickCustomMaterialShader::initialize() { m_opacityLoc = program()->uniformLocation("qt_Opacity"); @@ -222,10 +304,12 @@ uint qHash(const QQuickShaderEffectMaterialKey &key) QHash<QQuickShaderEffectMaterialKey, QSharedPointer<QSGMaterialType> > QQuickShaderEffectMaterial::materialMap; -QQuickShaderEffectMaterial::QQuickShaderEffectMaterial() +QQuickShaderEffectMaterial::QQuickShaderEffectMaterial(QQuickShaderEffectNode *node) : m_cullMode(NoCulling) + , m_node(node) + , m_emittedLogChanged(false) { - setFlag(Blending, true); + setFlag(Blending | RequiresFullMatrix, true); } QSGMaterialType *QQuickShaderEffectMaterial::type() const @@ -256,6 +340,7 @@ QQuickShaderEffectMaterial::CullMode QQuickShaderEffectMaterial::cullMode() cons void QQuickShaderEffectMaterial::setProgramSource(const QQuickShaderEffectProgram &source) { m_source = source; + m_emittedLogChanged = false; m_type = materialMap.value(m_source); if (m_type.isNull()) { m_type = QSharedPointer<QSGMaterialType>(new QSGMaterialType); @@ -290,6 +375,7 @@ void QQuickShaderEffectMaterial::updateTextures() const QQuickShaderEffectNode::QQuickShaderEffectNode() + : m_material(this) { QSGNode::setFlag(UsePreprocess, true); setMaterial(&m_material); diff --git a/src/quick/items/qquickshadereffectnode_p.h b/src/quick/items/qquickshadereffectnode_p.h index 5f90e71cab..5a680f129c 100644 --- a/src/quick/items/qquickshadereffectnode_p.h +++ b/src/quick/items/qquickshadereffectnode_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -78,6 +78,7 @@ struct QQuickShaderEffectProgram : public QQuickShaderEffectMaterialKey class QQuickCustomMaterialShader; +class QQuickShaderEffectNode; class QQuickShaderEffectMaterial : public QSGMaterial { public: @@ -88,7 +89,7 @@ public: FrontFaceCulling }; - QQuickShaderEffectMaterial(); + explicit QQuickShaderEffectMaterial(QQuickShaderEffectNode *node = 0); virtual QSGMaterialType *type() const; virtual QSGMaterialShader *createShader() const; virtual int compare(const QSGMaterial *other) const; @@ -117,6 +118,8 @@ protected: QVector<QPair<QByteArray, QVariant> > m_uniformValues; QVector<QPair<QByteArray, QSGTextureProvider *> > m_textures; CullMode m_cullMode; + QQuickShaderEffectNode *m_node; + bool m_emittedLogChanged; static QHash<QQuickShaderEffectMaterialKey, QSharedPointer<QSGMaterialType> > materialMap; }; @@ -135,6 +138,9 @@ public: QQuickShaderEffectMaterial *shaderMaterial() { return &m_material; } +Q_SIGNALS: + void logAndStatusChanged(const QString &, int status); + private Q_SLOTS: void markDirtyTexture(); diff --git a/src/quick/items/qquickshadereffectsource.cpp b/src/quick/items/qquickshadereffectsource.cpp index c57d749153..af9456f1d0 100644 --- a/src/quick/items/qquickshadereffectsource.cpp +++ b/src/quick/items/qquickshadereffectsource.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickshadereffectsource_p.h b/src/quick/items/qquickshadereffectsource_p.h index d66d80bd56..e3327698c5 100644 --- a/src/quick/items/qquickshadereffectsource_p.h +++ b/src/quick/items/qquickshadereffectsource_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquicksprite.cpp b/src/quick/items/qquicksprite.cpp index 8d7930a232..4c7dafafbb 100644 --- a/src/quick/items/qquicksprite.cpp +++ b/src/quick/items/qquicksprite.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** @@ -53,12 +53,13 @@ QT_BEGIN_NAMESPACE /*! \qmlproperty int QtQuick2::Sprite::duration - Time between frames. + Time between frames. Use -1 to indicate one sprite frame per rendered frame. */ /*! \qmlproperty int QtQuick2::Sprite::durationVariation - The time between frames can vary by up to this amount. + The time between frames can vary by up to this amount. Variation will never decrease the time + between frames to less than 0. Default is 0. */ @@ -105,17 +106,6 @@ QT_BEGIN_NAMESPACE If frameHeight and frameWidth are not specified, it is assumed to be a single long row of square frames. Otherwise, it can be multiple contiguous rows or rectangluar frames, when one row runs out the next will be used. */ - Q_PROPERTY(int duration READ duration WRITE setDuration NOTIFY durationChanged) - Q_PROPERTY(int durationVariation READ durationVariance WRITE setDurationVariance NOTIFY durationVarianceChanged) - Q_PROPERTY(QVariantMap to READ to WRITE setTo NOTIFY toChanged) - Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) - Q_PROPERTY(qreal speedModifiesDuration READ speedModifer WRITE setSpeedModifier NOTIFY speedModifierChanged) - Q_PROPERTY(int frames READ frames WRITE setFrames NOTIFY framesChanged) - Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged) - //If frame height or width is not specified, it is assumed to be a single long row of square frames. - //Otherwise, it can be multiple contiguous rows, when one row runs out the next will be used. - Q_PROPERTY(int frameHeight READ frameHeight WRITE setFrameHeight NOTIFY frameHeightChanged) - Q_PROPERTY(int frameWidth READ frameWidth WRITE setFrameWidth NOTIFY frameWidthChanged) QQuickSprite::QQuickSprite(QObject *parent) : QQuickStochasticState(parent) diff --git a/src/quick/items/qquicksprite_p.h b/src/quick/items/qquicksprite_p.h index 8d0934f910..e8a033caa8 100644 --- a/src/quick/items/qquicksprite_p.h +++ b/src/quick/items/qquicksprite_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickspriteengine.cpp b/src/quick/items/qquickspriteengine.cpp index 43223f8fe6..38be93f1ce 100644 --- a/src/quick/items/qquickspriteengine.cpp +++ b/src/quick/items/qquickspriteengine.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** @@ -48,25 +48,50 @@ QT_BEGIN_NAMESPACE +/* + \internal Stochastic/Sprite engine implementation docs + + Nomenclature: 'thing' refers to an instance of a running sprite or state. It could be renamed. + States and Transitions are referred to in the state machine sense here, NOT in the QML sense. + + The Stochastic State engine takes states with stochastic state transitions defined and transitions them. + When a state is started, it's added to a list of pending updates sorted by their time they want to update. + An external driver calls the update function with an elapsed time, which becomes the new time offset. + The pending update stack is popped until all entries are past the current time, which simulates all intervening time. + + The Sprite Engine subclass has two major differences. Firstly all states are sprites (and there's a new vector with them + cast to sprite). Secondly, it chops up images and states to fit a texture friendly format. + Before the Sprite Engine starts running, its user requests a texture assembled from all the sprite images. This + texture is made by pasting the sprites into one image, with one sprite animation per row (in the future it is planned to have + arbitrary X/Y start ends, but they will still be assembled and recorded here and still have to be contiguous lines). + This cut-up allows the users to calcuate frame positions with a texture percentage width and elapsed time. + It also means that large sprites cover multiple lines to fit inside the texture memory limit (which is a square). + + Large sprites covering multiple lines breaks this simple interface for the users, so each line is treated as a pseudostate + and it's mostly hidden from the spriteengine users (except that they'll get advanced signals where the state is the same + but the visual parameters changed). These are not real states because that would get very complex with bindings. Instead, + when sprite attributes are requested from a sprite that has multiple pseudostates, it returns the values for the psuedostate + it is in. State advancement is intercepted and hollow for pseudostates, except the last one. The last one transitions as the + state normally does. +*/ + /* TODO: make sharable? solve the state data initialization/transfer issue so as to not need to make friends */ QQuickStochasticEngine::QQuickStochasticEngine(QObject *parent) : - QObject(parent), m_timeOffset(0) + QObject(parent), m_timeOffset(0), m_addAdvance(false) { //Default size 1 setCount(1); - m_advanceTime.start(); } QQuickStochasticEngine::QQuickStochasticEngine(QList<QQuickStochasticState*> states, QObject *parent) : - QObject(parent), m_states(states), m_timeOffset(0) + QObject(parent), m_states(states), m_timeOffset(0), m_addAdvance(false) { //Default size 1 setCount(1); - m_advanceTime.start(); } QQuickStochasticEngine::~QQuickStochasticEngine() @@ -102,24 +127,39 @@ int QQuickSpriteEngine::maxFrames() TODO: All these calculations should be pre-calculated and cached during initialization for a significant performance boost TODO: Above idea needs to have the varying duration offset added to it */ +//TODO: Should these be adding advanceTime as well? +/* + To get these working with duration=-1, m_startTimes will be messed with should duration=-1 + m_startTimes will be set in advance/restart to 0->(m_framesPerRow-1) and can be used directly as extra. + This makes it 'frame' instead, but is more memory efficient than two arrays and less hideous than a vector of unions. +*/ int QQuickSpriteEngine::spriteState(int sprite) { int state = m_things[sprite]; if (!m_sprites[state]->m_generatedCount) return state; - int rowDuration = m_duration[sprite] * m_sprites[state]->m_framesPerRow; - int extra = (m_timeOffset - m_startTimes[sprite])/rowDuration; + int extra; + if (m_sprites[state]->duration() < 0) { + extra = m_startTimes[sprite]; + } else { + if (!m_duration[sprite]) + return state; + int rowDuration = m_duration[sprite] * m_sprites[state]->m_framesPerRow; + extra = (m_timeOffset - m_startTimes[sprite])/rowDuration; + } return state + extra; } int QQuickSpriteEngine::spriteStart(int sprite) { + if (!m_duration[sprite]) + return m_timeOffset; int state = m_things[sprite]; if (!m_sprites[state]->m_generatedCount) return m_startTimes[sprite]; int rowDuration = m_duration[sprite] * m_sprites[state]->m_framesPerRow; int extra = (m_timeOffset - m_startTimes[sprite])/rowDuration; - return state + extra*rowDuration; + return m_startTimes[sprite] + extra*rowDuration; } int QQuickSpriteEngine::spriteFrames(int sprite) @@ -127,19 +167,28 @@ int QQuickSpriteEngine::spriteFrames(int sprite) int state = m_things[sprite]; if (!m_sprites[state]->m_generatedCount) return m_sprites[state]->frames(); - int rowDuration = m_duration[sprite] * m_sprites[state]->m_framesPerRow; - int extra = (m_timeOffset - m_startTimes[sprite])/rowDuration; + int extra; + if (m_sprites[state]->duration() < 0) { + extra = m_startTimes[sprite]; + } else { + if (!m_duration[sprite]) + return state; + int rowDuration = m_duration[sprite] * m_sprites[state]->m_framesPerRow; + extra = (m_timeOffset - m_startTimes[sprite])/rowDuration; + } if (extra == m_sprites[state]->m_generatedCount - 1)//last state return m_sprites[state]->frames() % m_sprites[state]->m_framesPerRow; else return m_sprites[state]->m_framesPerRow; } -int QQuickSpriteEngine::spriteDuration(int sprite) +int QQuickSpriteEngine::spriteDuration(int sprite)//Full duration, not per frame { + if (!m_duration[sprite]) + return m_duration[sprite]; int state = m_things[sprite]; if (!m_sprites[state]->m_generatedCount) - return m_duration[sprite]; + return m_duration[sprite] * m_sprites[state]->frames(); int rowDuration = m_duration[sprite] * m_sprites[state]->m_framesPerRow; int extra = (m_timeOffset - m_startTimes[sprite])/rowDuration; if (extra == m_sprites[state]->m_generatedCount - 1)//last state @@ -153,8 +202,15 @@ int QQuickSpriteEngine::spriteY(int sprite) int state = m_things[sprite]; if (!m_sprites[state]->m_generatedCount) return m_sprites[state]->m_rowY; - int rowDuration = m_duration[sprite] * m_sprites[state]->m_framesPerRow; - int extra = (m_timeOffset - m_startTimes[sprite])/rowDuration; + int extra; + if (m_sprites[state]->duration() < 0) { + extra = m_startTimes[sprite]; + } else { + if (!m_duration[sprite]) + return state; + int rowDuration = m_duration[sprite] * m_sprites[state]->m_framesPerRow; + extra = (m_timeOffset - m_startTimes[sprite])/rowDuration; + } return m_sprites[state]->m_rowY + m_sprites[state]->m_frameHeight * extra; } @@ -205,6 +261,7 @@ QImage QQuickSpriteEngine::assembledImage() int maxSize = 0; glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxSize); + //qDebug() << "MAX TEXTURE SIZE" << maxSize; foreach (QQuickStochasticState* s, m_states){ QQuickSprite* sprite = qobject_cast<QQuickSprite*>(s); if (sprite) @@ -235,8 +292,11 @@ QImage QQuickSpriteEngine::assembledImage() static int divRoundUp(int a, int b){return (a+b-1)/b;} }; int rowsNeeded = helper::divRoundUp(state->frames(), (maxSize / state->frameWidth())); - if (rowsNeeded * state->frameHeight() > maxSize){ - qWarning() << "SpriteEngine: Animation too large to fit in one texture..." << state->source().toLocalFile(); + if (h + rowsNeeded * state->frameHeight() > maxSize){ + if (rowsNeeded * state->frameHeight() > maxSize) + qWarning() << "SpriteEngine: Animation too large to fit in one texture:" << state->source().toLocalFile(); + else + qWarning() << "SpriteEngine: Animations too large to fit in one texture, pushed over the edge by:" << state->source().toLocalFile(); qWarning() << "SpriteEngine: Your texture max size today is " << maxSize; } state->m_generatedCount = rowsNeeded; @@ -273,7 +333,6 @@ QImage QQuickSpriteEngine::assembledImage() while (framesLeft > 0){ if (image.width() - x + curX <= img.width()){//finish a row in image (dest) int copied = image.width() - x; - Q_ASSERT(!(copied % frameWidth));//XXX: Just checking framesLeft -= copied/frameWidth; p.drawImage(x,y,img.copy(curX,curY,copied,frameHeight)); y += frameHeight; @@ -285,7 +344,6 @@ QImage QQuickSpriteEngine::assembledImage() } }else{//finish a row in img (src) int copied = img.width() - curX; - Q_ASSERT(!(copied % frameWidth));//XXX: Just checking framesLeft -= copied/frameWidth; p.drawImage(x,y,img.copy(curX,curY,copied,frameHeight)); curY += frameHeight; @@ -306,6 +364,7 @@ QImage QQuickSpriteEngine::assembledImage() return image; } +//TODO: Add a reset() function, for completeness in the case of a SpriteEngine being restarted from 0 void QQuickStochasticEngine::setCount(int c) { m_things.resize(c); @@ -335,71 +394,121 @@ void QQuickStochasticEngine::stop(int index) void QQuickStochasticEngine::restart(int index) { - m_startTimes[index] = m_timeOffset + m_advanceTime.elapsed(); + m_startTimes[index] = m_timeOffset; + if (m_addAdvance) + m_startTimes[index] += m_advanceTime.elapsed(); int time = m_duration[index] * m_states[m_things[index]]->frames() + m_startTimes[index]; for (int i=0; i<m_stateUpdates.count(); i++) m_stateUpdates[i].second.removeAll(index); - addToUpdateList(time, index); + if (m_duration[index] >= 0) + addToUpdateList(time, index); } -uint QQuickStochasticEngine::updateSprites(uint time)//### would returning a list of changed idxs be faster than signals? +void QQuickSpriteEngine::restart(int index) //Reimplemented to recognize and handle pseudostates { - //Sprite State Update; - QSet<int> changedIndexes; - while (!m_stateUpdates.isEmpty() && time >= m_stateUpdates.first().first){ - foreach (int idx, m_stateUpdates.first().second){ - if (idx >= m_things.count()) - continue;//TODO: Proper fix(because this does happen and I'm just ignoring it) - int stateIdx = m_things[idx]; - int nextIdx = -1; - int goalPath = goalSeek(stateIdx, idx); - if (goalPath == -1){//Random - qreal r =(qreal) qrand() / (qreal) RAND_MAX; - qreal total = 0.0; - for (QVariantMap::const_iterator iter=m_states[stateIdx]->m_to.constBegin(); - iter!=m_states[stateIdx]->m_to.constEnd(); iter++) - total += (*iter).toReal(); - r*=total; - for (QVariantMap::const_iterator iter= m_states[stateIdx]->m_to.constBegin(); - iter!=m_states[stateIdx]->m_to.constEnd(); iter++){ - if (r < (*iter).toReal()){ - bool superBreak = false; - for (int i=0; i<m_states.count(); i++){ - if (m_states[i]->name() == iter.key()){ - nextIdx = i; - superBreak = true; - break; - } - } - if (superBreak) - break; + if (m_sprites[m_things[index]]->duration() < 0) {//Manually advanced + m_startTimes[index] = 0; + } else { + m_startTimes[index] = m_timeOffset; + if (m_addAdvance) + m_startTimes[index] += m_advanceTime.elapsed(); + int time = spriteDuration(index) + m_startTimes[index]; + for (int i=0; i<m_stateUpdates.count(); i++) + m_stateUpdates[i].second.removeAll(index); + addToUpdateList(time, index); + } +} + +void QQuickStochasticEngine::advance(int idx) +{ + if (idx >= m_things.count()) + return;//TODO: Proper fix(because this has happened and I just ignored it) + int nextIdx = nextState(m_things[idx],idx); + m_things[idx] = nextIdx; + m_duration[idx] = m_states[nextIdx]->variedDuration(); + restart(idx); + emit m_states[nextIdx]->entered(); + emit stateChanged(idx); +} + +void QQuickSpriteEngine::advance(int idx) //Reimplemented to recognize and handle pseudostates +{ + if (idx >= m_things.count()) + return;//TODO: Proper fix(because this has happened and I just ignored it) + if (m_duration[idx] == 0) { + if (m_sprites[m_things[idx]]->duration() < 0) { + //Manually called, advance inner substate count + m_startTimes[idx]++; + if (m_startTimes[idx] < m_sprites[m_things[idx]]->m_generatedCount) { + //only a pseudostate ended + emit stateChanged(idx); + return; + } + } + //just go past the pseudostate logic + } else if (m_startTimes[idx] + m_duration[idx] * m_states[m_things[idx]]->frames() + > m_timeOffset + (m_addAdvance ? m_advanceTime.elapsed() : 0)) { + //only a pseduostate ended + emit stateChanged(idx); + addToUpdateList(m_timeOffset + spriteDuration(idx), idx); + return; + } + int nextIdx = nextState(m_things[idx],idx); + m_things[idx] = nextIdx; + m_duration[idx] = m_states[nextIdx]->variedDuration(); + restart(idx); + emit m_states[nextIdx]->entered(); + emit stateChanged(idx); +} + +int QQuickStochasticEngine::nextState(int curState, int curThing) +{ + int nextIdx = -1; + int goalPath = goalSeek(curState, curThing); + if (goalPath == -1){//Random + qreal r =(qreal) qrand() / (qreal) RAND_MAX; + qreal total = 0.0; + for (QVariantMap::const_iterator iter=m_states[curState]->m_to.constBegin(); + iter!=m_states[curState]->m_to.constEnd(); iter++) + total += (*iter).toReal(); + r*=total; + for (QVariantMap::const_iterator iter= m_states[curState]->m_to.constBegin(); + iter!=m_states[curState]->m_to.constEnd(); iter++){ + if (r < (*iter).toReal()){ + bool superBreak = false; + for (int i=0; i<m_states.count(); i++){ + if (m_states[i]->name() == iter.key()){ + nextIdx = i; + superBreak = true; + break; } - r -= (*iter).toReal(); } - }else{//Random out of shortest paths to goal - nextIdx = goalPath; + if (superBreak) + break; } - if (nextIdx == -1)//No to states means stay here - nextIdx = stateIdx; - - m_things[idx] = nextIdx; - m_duration[idx] = m_states[nextIdx]->variedDuration(); - m_startTimes[idx] = time; - if (nextIdx != stateIdx){ - changedIndexes << idx; - emit m_states[nextIdx]->entered(); - } - addToUpdateList((m_duration[idx] * m_states[nextIdx]->frames()) + time, idx); + r -= (*iter).toReal(); } - m_stateUpdates.pop_front(); + }else{//Random out of shortest paths to goal + nextIdx = goalPath; } + if (nextIdx == -1)//No 'to' states means stay here + nextIdx = curState; + return nextIdx; +} +uint QQuickStochasticEngine::updateSprites(uint time)//### would returning a list of changed idxs be faster than signals? +{ + //Sprite State Update; m_timeOffset = time; - m_advanceTime.start(); - //TODO: emit this when a psuedostate changes too - foreach (int idx, changedIndexes){//Batched so that update list doesn't change midway - emit stateChanged(idx); + m_addAdvance = false; + while (!m_stateUpdates.isEmpty() && time >= m_stateUpdates.first().first){ + foreach (int idx, m_stateUpdates.first().second) + advance(idx); + m_stateUpdates.pop_front(); } + + m_advanceTime.start(); + m_addAdvance = true; if (m_stateUpdates.isEmpty()) return -1; return m_stateUpdates.first().first; diff --git a/src/quick/items/qquickspriteengine_p.h b/src/quick/items/qquickspriteengine_p.h index 86f8aadc8c..48ef6c305e 100644 --- a/src/quick/items/qquickspriteengine_p.h +++ b/src/quick/items/qquickspriteengine_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** @@ -102,9 +102,9 @@ public: int variedDuration() const { - return m_duration + return qMax(qreal(0.0) , m_duration + (m_durationVariance * ((qreal)qrand()/RAND_MAX) * 2) - - m_durationVariance; + - m_durationVariance); } int frames() const @@ -212,6 +212,8 @@ public: void setGoal(int state, int sprite=0, bool jump=false); void start(int index=0, int state=0); + virtual void restart(int index=0); + virtual void advance(int index=0);//Sends state to the next chosen state, unlike goal. void stop(int index=0); int curState(int index=0) {return m_things[index];} @@ -244,8 +246,8 @@ public slots: protected: friend class QQuickParticleSystem; - void restart(int index); void addToUpdateList(uint t, int idx); + int nextState(int curState, int idx=0); int goalSeek(int curState, int idx, int dist=-1); QList<QQuickStochasticState*> m_states; //### Consider struct or class for the four data variables? @@ -260,6 +262,7 @@ protected: QString m_globalGoal; int m_maxFrames; int m_imageStateCount; + bool m_addAdvance; }; class QQuickSpriteEngine : public QQuickStochasticEngine @@ -279,14 +282,18 @@ public: int spriteState(int sprite=0); int spriteStart(int sprite=0); int spriteFrames(int sprite=0); - int spriteDuration(int sprite=0); + int spriteDuration(int sprite=0);//Full duration, not per frame int spriteX(int /* sprite */ = 0) { return 0; }//Currently all rows are 0 aligned, if we get more space efficient we might change this int spriteY(int sprite=0); int spriteWidth(int sprite=0); int spriteHeight(int sprite=0); - int spriteCount();//Like state count, but for the image states + int spriteCount();//Like state count int maxFrames(); + QString realName(int sprite=0);//Gives the parent sprite name for pseudosprites QImage assembledImage(); + + virtual void restart(int index=0); + virtual void advance(int index=0); private: QList<QQuickSprite*> m_sprites; }; diff --git a/src/quick/items/qquickspriteimage.cpp b/src/quick/items/qquickspriteimage.cpp index 6b39f73ae2..1819decf10 100644 --- a/src/quick/items/qquickspriteimage.cpp +++ b/src/quick/items/qquickspriteimage.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** @@ -58,32 +58,24 @@ QT_BEGIN_NAMESPACE static const char vertexShaderCode[] = "attribute highp vec2 vTex;\n" - "uniform highp vec4 animData;// interpolate(bool), duration, frameCount (this anim), timestamp (this anim)\n" - "uniform highp vec4 animPos;//sheet x,y, width/height of this anim\n" - "uniform highp vec4 animSheetSize; //width/height of whole sheet, width/height of element\n" + "uniform highp vec3 animData;// w,h(premultiplied of anim), interpolation progress\n" + "uniform highp vec4 animPos;//x,y, x,y (two frames for interpolation)\n" + "uniform highp vec2 size;//w,h of element\n" "\n" "uniform highp mat4 qt_Matrix;\n" - "uniform highp float timestamp;\n" "\n" "varying highp vec4 fTexS;\n" "varying lowp float progress;\n" "\n" "\n" "void main() {\n" + " progress = animData.z;\n" " //Calculate frame location in texture\n" - " highp float frameIndex = mod((((timestamp - animData.w)*1000.)/animData.y),animData.z);\n" - " progress = mod((timestamp - animData.w)*1000., animData.y) / animData.y;\n" - "\n" - " frameIndex = floor(frameIndex);\n" - " fTexS.xy = vec2(((frameIndex + vTex.x) * animPos.z / animSheetSize.x), ((animPos.y + vTex.y * animPos.w) / animSheetSize.y));\n" - "\n" + " fTexS.xy = animPos.xy + vTex.xy * animData.xy;\n" " //Next frame is also passed, for interpolation\n" - " //### Should the next anim be precalculated to allow for interpolation there?\n" - " if (animData.x == 1.0 && frameIndex != animData.z - 1.)//Can't do it for the last frame though, this anim may not loop\n" - " frameIndex = mod(frameIndex+1., animData.z);\n" - " fTexS.zw = vec2(((frameIndex + vTex.x) * animPos.z / animSheetSize.x), ((animPos.y + vTex.y * animPos.w) / animSheetSize.y));\n" + " fTexS.zw = animPos.zw + vTex.xy * animData.xy;\n" "\n" - " gl_Position = qt_Matrix * vec4(animSheetSize.z * vTex.x, animSheetSize.w * vTex.y, 0, 1);\n" + " gl_Position = qt_Matrix * vec4(size.x * vTex.x, size.y * vTex.y, 0, 1);\n" "}\n"; static const char fragmentShaderCode[] = @@ -111,33 +103,25 @@ public: QSGTexture *texture; - qreal timestamp; - float interpolate; - float frameDuration; - float frameCount; float animT; - float animX; - float animY; - float animWidth; - float animHeight; - float sheetWidth; - float sheetHeight; + float animX1; + float animY1; + float animX2; + float animY2; + float animW; + float animH; float elementWidth; float elementHeight; }; QQuickSpriteMaterial::QQuickSpriteMaterial() - : timestamp(0) - , interpolate(1.0f) - , frameDuration(1.0f) - , frameCount(1.0f) - , animT(0.0f) - , animX(0.0f) - , animY(0.0f) - , animWidth(1.0f) - , animHeight(1.0f) - , sheetWidth(1.0f) - , sheetHeight(1.0f) + : animT(0.0f) + , animX1(0.0f) + , animY1(0.0f) + , animX2(0.0f) + , animY2(0.0f) + , animW(1.0f) + , animH(1.0f) , elementWidth(1.0f) , elementHeight(1.0f) { @@ -170,10 +154,9 @@ public: m->texture->bind(); program()->setUniformValue(m_opacity_id, state.opacity()); - program()->setUniformValue(m_timestamp_id, (float) m->timestamp); - program()->setUniformValue(m_animData_id, m->interpolate, m->frameDuration, m->frameCount, m->animT); - program()->setUniformValue(m_animPos_id, m->animX, m->animY, m->animWidth, m->animHeight); - program()->setUniformValue(m_animSheetSize_id, m->sheetWidth, m->sheetHeight, m->elementWidth, m->elementHeight); + program()->setUniformValue(m_animData_id, m->animW, m->animH, m->animT); + program()->setUniformValue(m_animPos_id, m->animX1, m->animY1, m->animX2, m->animY2); + program()->setUniformValue(m_size_id, m->elementWidth, m->elementHeight); if (state.isMatrixDirty()) program()->setUniformValue(m_matrix_id, state.combinedMatrix()); @@ -182,10 +165,9 @@ public: virtual void initialize() { m_matrix_id = program()->uniformLocation("qt_Matrix"); m_opacity_id = program()->uniformLocation("qt_Opacity"); - m_timestamp_id = program()->uniformLocation("timestamp"); m_animData_id = program()->uniformLocation("animData"); m_animPos_id = program()->uniformLocation("animPos"); - m_animSheetSize_id = program()->uniformLocation("animSheetSize"); + m_size_id = program()->uniformLocation("size"); } virtual const char *vertexShader() const { return vertexShaderCode; } @@ -201,10 +183,9 @@ public: int m_matrix_id; int m_opacity_id; - int m_timestamp_id; int m_animData_id; int m_animPos_id; - int m_animSheetSize_id; + int m_size_id; static float chunkOfBytes[1024]; }; @@ -285,9 +266,11 @@ QQuickSpriteImage::QQuickSpriteImage(QQuickItem *parent) : , m_node(0) , m_material(0) , m_spriteEngine(0) + , m_curFrame(0) , m_pleaseReset(false) , m_running(true) , m_interpolate(true) + , m_curStateIdx(0) { setFlag(ItemHasContents); connect(this, SIGNAL(runningChanged(bool)), @@ -350,19 +333,17 @@ QSGGeometryNode* QQuickSpriteImage::buildNode() QImage image = m_spriteEngine->assembledImage(); if (image.isNull()) return 0; + m_sheetSize = QSizeF(image.size()); m_material->texture = canvas()->createTextureFromImage(image); m_material->texture->setFiltering(QSGTexture::Linear); m_spriteEngine->start(0); - m_material->interpolate = m_interpolate ? 1.0 : 0.0; - m_material->frameCount = m_spriteEngine->spriteFrames(); - m_material->frameDuration = m_spriteEngine->spriteDuration(); m_material->animT = 0; - m_material->animX = m_spriteEngine->spriteX(); - m_material->animY = m_spriteEngine->spriteY(); - m_material->animWidth = m_spriteEngine->spriteWidth(); - m_material->animHeight = m_spriteEngine->spriteHeight(); - m_material->sheetWidth = image.width(); - m_material->sheetHeight = image.height(); + m_material->animX1 = m_spriteEngine->spriteX() / m_sheetSize.width(); + m_material->animY1 = m_spriteEngine->spriteY() / m_sheetSize.height(); + m_material->animX2 = m_material->animX1; + m_material->animY2 = m_material->animY1; + m_material->animW = m_spriteEngine->spriteWidth() / m_sheetSize.width(); + m_material->animH = m_spriteEngine->spriteHeight() / m_sheetSize.height(); m_material->elementWidth = width(); m_material->elementHeight = height(); m_curState = m_spriteEngine->state(m_spriteEngine->curState())->name(); @@ -440,25 +421,53 @@ void QQuickSpriteImage::prepareNextFrame() uint timeInt = m_timestamp.elapsed(); qreal time = timeInt / 1000.; - m_material->timestamp = time; m_material->elementHeight = height(); m_material->elementWidth = width(); - m_material->interpolate = m_interpolate; //Advance State m_spriteEngine->updateSprites(timeInt); - int curY = m_spriteEngine->spriteY(); - if (curY != m_material->animY){ - m_material->animT = m_spriteEngine->spriteStart()/1000.0; - m_material->frameCount = m_spriteEngine->spriteFrames(); - m_material->frameDuration = m_spriteEngine->spriteDuration(); - m_material->animX = m_spriteEngine->spriteX(); - m_material->animY = m_spriteEngine->spriteY(); - m_material->animWidth = m_spriteEngine->spriteWidth(); - m_material->animHeight = m_spriteEngine->spriteHeight(); + if (m_curStateIdx != m_spriteEngine->curState()) { + m_curStateIdx = m_spriteEngine->curState(); m_curState = m_spriteEngine->state(m_spriteEngine->curState())->name(); emit currentSpriteChanged(m_curState); + m_curFrame= -1; + } + + //Advance Sprite + qreal animT = m_spriteEngine->spriteStart()/1000.0; + qreal frameCount = m_spriteEngine->spriteFrames(); + qreal frameDuration = m_spriteEngine->spriteDuration()/frameCount; + double frameAt; + qreal progress; + if (frameDuration > 0) { + qreal frame = (time - animT)/(frameDuration / 1000.0); + frame = qBound(qreal(0.0), frame, frameCount - qreal(1.0));//Stop at count-1 frames until we have between anim interpolation + progress = modf(frame,&frameAt); + } else { + m_curFrame++; + if (m_curFrame >= frameCount){ + m_curFrame = 0; + m_spriteEngine->advance(); + } + frameAt = m_curFrame; + progress = 0; } + qreal y = m_spriteEngine->spriteY() / m_sheetSize.height(); + qreal w = m_spriteEngine->spriteWidth() / m_sheetSize.width(); + qreal h = m_spriteEngine->spriteHeight() / m_sheetSize.height(); + qreal x1 = m_spriteEngine->spriteX() / m_sheetSize.width(); + x1 += frameAt * w; + qreal x2 = x1; + if (frameAt < (frameCount-1)) + x2 += w; + + m_material->animX1 = x1; + m_material->animY1 = y; + m_material->animX2 = x2; + m_material->animY2 = y; + m_material->animW = w; + m_material->animH = h; + m_material->animT = m_interpolate ? progress : 0.0; } QT_END_NAMESPACE diff --git a/src/quick/items/qquickspriteimage_p.h b/src/quick/items/qquickspriteimage_p.h index c5513031f5..cd0796be1a 100644 --- a/src/quick/items/qquickspriteimage_p.h +++ b/src/quick/items/qquickspriteimage_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** @@ -131,12 +131,14 @@ private: QList<QQuickSprite*> m_sprites; QQuickSpriteEngine* m_spriteEngine; QTime m_timestamp; - int m_maxFrames; + int m_curFrame; bool m_pleaseReset; bool m_running; bool m_interpolate; QString m_goalState; QString m_curState; + int m_curStateIdx; + QSizeF m_sheetSize; }; QT_END_NAMESPACE diff --git a/src/quick/items/qquickstateoperations.cpp b/src/quick/items/qquickstateoperations.cpp index a8ebc88e7e..7548ec9bde 100644 --- a/src/quick/items/qquickstateoperations.cpp +++ b/src/quick/items/qquickstateoperations.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickstateoperations_p.h b/src/quick/items/qquickstateoperations_p.h index 3454ac1e11..1e8704d672 100644 --- a/src/quick/items/qquickstateoperations_p.h +++ b/src/quick/items/qquickstateoperations_p.h @@ -1,9 +1,9 @@ // Commit: 84c47bbb133304d7ef35642fa1fbb17619d4a43d /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquicktext.cpp b/src/quick/items/qquicktext.cpp index e8eb555dde..82232ab0ea 100644 --- a/src/quick/items/qquicktext.cpp +++ b/src/quick/items/qquicktext.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -85,7 +85,7 @@ QQuickTextPrivate::QQuickTextPrivate() disableDistanceField(false), internalWidthUpdate(false), requireImplicitWidth(false), truncated(false), hAlignImplicit(true), rightToLeftText(false), layoutTextElided(false), richTextAsImage(false), textureImageCacheDirty(false), textHasChanged(true), - naturalWidth(0), doc(0), elipsisLayout(0), textLine(0), nodeType(NodeIsNull) + naturalWidth(0), doc(0), elipsisLayout(0), textLine(0), nodeType(NodeIsNull), updateType(UpdatePaintNode) #if defined(Q_OS_MAC) , layoutThread(0), paintingThread(0) @@ -107,6 +107,7 @@ QQuickTextDocumentWithImageResources::QQuickTextDocumentWithImageResources(QQuic : QTextDocument(parent), outstanding(0) { setUndoRedoEnabled(false); + documentLayout()->registerHandler(QTextFormat::ImageObject, this); } QQuickTextDocumentWithImageResources::~QQuickTextDocumentWithImageResources() @@ -118,30 +119,11 @@ QQuickTextDocumentWithImageResources::~QQuickTextDocumentWithImageResources() QVariant QQuickTextDocumentWithImageResources::loadResource(int type, const QUrl &name) { QDeclarativeContext *context = qmlContext(parent()); - QUrl url = context->resolvedUrl(name); + QUrl url = m_baseUrl.resolved(name); if (type == QTextDocument::ImageResource) { - QHash<QUrl, QDeclarativePixmap *>::Iterator iter = m_resources.find(url); - - if (iter == m_resources.end()) { - QDeclarativePixmap *p = new QDeclarativePixmap(context->engine(), url); - iter = m_resources.insert(url, p); - - if (p->isLoading()) { - p->connectFinished(this, SLOT(requestFinished())); - outstanding++; - } - } - - QDeclarativePixmap *p = *iter; - if (p->isReady()) { - return p->image(); - } else if (p->isError()) { - if (!errors.contains(url)) { - errors.insert(url); - qmlInfo(parent()) << p->error(); - } - } + QDeclarativePixmap *p = loadPixmap(context, url); + return p->image(); } return QTextDocument::loadResource(type,url); // The *resolved* URL @@ -152,9 +134,7 @@ void QQuickTextDocumentWithImageResources::requestFinished() outstanding--; if (outstanding == 0) { markContentsDirty(0, characterCount()); - - if (QQuickText *item = qobject_cast<QQuickText *>(parent())) - QQuickTextPrivate::get(item)->updateLayout(); + emit imagesLoaded(); } } @@ -165,6 +145,100 @@ void QQuickTextDocumentWithImageResources::clear() QTextDocument::clear(); } + +QSizeF QQuickTextDocumentWithImageResources::intrinsicSize( + QTextDocument *, int, const QTextFormat &format) +{ + if (format.isImageFormat()) { + QTextImageFormat imageFormat = format.toImageFormat(); + + const bool hasWidth = imageFormat.hasProperty(QTextFormat::ImageWidth); + const int width = qRound(imageFormat.width()); + const bool hasHeight = imageFormat.hasProperty(QTextFormat::ImageHeight); + const int height = qRound(imageFormat.height()); + + QSizeF size(width, height); + if (!hasWidth || !hasHeight) { + QDeclarativeContext *context = qmlContext(parent()); + QUrl url = m_baseUrl.resolved(QUrl(imageFormat.name())); + + QDeclarativePixmap *p = loadPixmap(context, url); + if (!p->isReady()) { + if (!hasWidth) + size.setWidth(16); + if (!hasHeight) + size.setHeight(16); + return size; + } + QSize implicitSize = p->implicitSize(); + + if (!hasWidth) { + if (!hasHeight) + size.setWidth(implicitSize.width()); + else + size.setWidth(qRound(height * (implicitSize.width() / (qreal) implicitSize.height()))); + } + if (!hasHeight) { + if (!hasWidth) + size.setHeight(implicitSize.height()); + else + size.setHeight(qRound(width * (implicitSize.height() / (qreal) implicitSize.width()))); + } + } + return size; + } + return QSizeF(); +} + +void QQuickTextDocumentWithImageResources::drawObject( + QPainter *, const QRectF &, QTextDocument *, int, const QTextFormat &) +{ +} + +QImage QQuickTextDocumentWithImageResources::image(const QTextImageFormat &format) +{ + QDeclarativeContext *context = qmlContext(parent()); + QUrl url = m_baseUrl.resolved(QUrl(format.name())); + + QDeclarativePixmap *p = loadPixmap(context, url); + return p->image(); +} + +void QQuickTextDocumentWithImageResources::setBaseUrl(const QUrl &url, bool clear) +{ + m_baseUrl = url; + if (clear) { + clearResources(); + markContentsDirty(0, characterCount()); + } +} + +QDeclarativePixmap *QQuickTextDocumentWithImageResources::loadPixmap( + QDeclarativeContext *context, const QUrl &url) +{ + + QHash<QUrl, QDeclarativePixmap *>::Iterator iter = m_resources.find(url); + + if (iter == m_resources.end()) { + QDeclarativePixmap *p = new QDeclarativePixmap(context->engine(), url); + iter = m_resources.insert(url, p); + + if (p->isLoading()) { + p->connectFinished(this, SLOT(requestFinished())); + outstanding++; + } + } + + QDeclarativePixmap *p = *iter; + if (p->isError()) { + if (!errors.contains(url)) { + errors.insert(url); + qmlInfo(parent()) << p->error(); + } + } + return p; +} + void QQuickTextDocumentWithImageResources::clearResources() { foreach (QDeclarativePixmap *pixmap, m_resources) @@ -206,6 +280,12 @@ qreal QQuickTextPrivate::getImplicitWidth() const return implicitWidth; } +void QQuickText::q_imagesLoaded() +{ + Q_D(QQuickText); + d->updateLayout(); +} + void QQuickTextPrivate::updateLayout() { Q_Q(QQuickText); @@ -291,6 +371,7 @@ void QQuickTextPrivate::updateSize() q->setImplicitSize(0, fontHeight); paintedSize = QSize(0, fontHeight); emit q->paintedSizeChanged(); + updateType = UpdatePaintNode; q->update(); return; } @@ -365,6 +446,7 @@ void QQuickTextPrivate::updateSize() paintedSize = size; emit q->paintedSizeChanged(); } + updateType = UpdatePaintNode; q->update(); } @@ -818,6 +900,7 @@ void QQuickTextPrivate::checkImageCache() imageCacheDirty = false; textureImageCacheDirty = true; + updateType = UpdatePaintNode; q->update(); } @@ -830,6 +913,8 @@ void QQuickTextPrivate::ensureDoc() Q_Q(QQuickText); doc = new QQuickTextDocumentWithImageResources(q); doc->setDocumentMargin(0); + doc->setBaseUrl(q->baseUrl()); + FAST_CONNECT(doc, SIGNAL(imagesLoaded()), q, SLOT(q_imagesLoaded())); } } @@ -1243,8 +1328,10 @@ void QQuickText::setStyle(QQuickText::TextStyle style) return; // changing to/from Normal requires the boundingRect() to change - if (isComponentComplete() && (d->style == Normal || style == Normal)) + if (isComponentComplete() && (d->style == Normal || style == Normal)) { + d->updateType = QQuickTextPrivate::UpdatePaintNode; update(); + } d->style = style; d->markDirty(); emit styleChanged(d->style); @@ -1645,6 +1732,45 @@ void QQuickText::setElideMode(QQuickText::TextElideMode mode) emit elideModeChanged(d->elideMode); } +/*! + \qmlproperty url QtQuick2::Text::baseUrl + + This property specifies a base URL which is used to resolve relative URLs + within the text. + + By default is the url of the Text element. +*/ + +QUrl QQuickText::baseUrl() const +{ + Q_D(const QQuickText); + if (d->baseUrl.isEmpty()) { + if (QDeclarativeContext *context = qmlContext(this)) + const_cast<QQuickTextPrivate *>(d)->baseUrl = context->baseUrl(); + } + return d->baseUrl; +} + +void QQuickText::setBaseUrl(const QUrl &url) +{ + Q_D(QQuickText); + if (baseUrl() != url) { + d->baseUrl = url; + + if (d->doc) + d->doc->setBaseUrl(url); + emit baseUrlChanged(); + } +} + +void QQuickText::resetBaseUrl() +{ + if (QDeclarativeContext *context = qmlContext(this)) + setBaseUrl(context->baseUrl()); + else + setBaseUrl(QUrl()); +} + /*! \internal */ QRectF QQuickText::boundingRect() const { @@ -1721,6 +1847,14 @@ geomChangeDone: QQuickItem::geometryChanged(newGeometry, oldGeometry); } +void QQuickText::triggerPreprocess() +{ + Q_D(QQuickText); + if (d->updateType == QQuickTextPrivate::UpdateNone) + d->updateType = QQuickTextPrivate::UpdatePreprocess; + update(); +} + QSGNode *QQuickText::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data) { Q_UNUSED(data); @@ -1731,6 +1865,14 @@ QSGNode *QQuickText::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data return 0; } + if (!d->updateType != QQuickTextPrivate::UpdatePaintNode && oldNode != 0) { + // Update done in preprocess() in the nodes + d->updateType = QQuickTextPrivate::UpdateNone; + return oldNode; + } + + d->updateType = QQuickTextPrivate::UpdateNone; + QRectF bounds = boundingRect(); // We need to make sure the layout is done in the current thread @@ -1781,7 +1923,7 @@ QSGNode *QQuickText::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data QQuickTextNode *node = 0; if (!oldNode || d->nodeType != QQuickTextPrivate::NodeIsText) { delete oldNode; - node = new QQuickTextNode(QQuickItemPrivate::get(this)->sceneGraphContext()); + node = new QQuickTextNode(QQuickItemPrivate::get(this)->sceneGraphContext(), this); d->nodeType = QQuickTextPrivate::NodeIsText; } else { node = static_cast<QQuickTextNode *>(oldNode); diff --git a/src/quick/items/qquicktext_p.h b/src/quick/items/qquicktext_p.h index 2292ea5f4d..46197258c8 100644 --- a/src/quick/items/qquicktext_p.h +++ b/src/quick/items/qquicktext_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -85,6 +85,7 @@ class Q_QUICK_PRIVATE_EXPORT QQuickText : public QQuickImplicitSizeItem Q_PROPERTY(qreal paintedHeight READ paintedHeight NOTIFY paintedSizeChanged) Q_PROPERTY(qreal lineHeight READ lineHeight WRITE setLineHeight NOTIFY lineHeightChanged) Q_PROPERTY(LineHeightMode lineHeightMode READ lineHeightMode WRITE setLineHeightMode NOTIFY lineHeightModeChanged) + Q_PROPERTY(QUrl baseUrl READ baseUrl WRITE setBaseUrl RESET resetBaseUrl NOTIFY baseUrlChanged) public: QQuickText(QQuickItem *parent=0); @@ -164,6 +165,10 @@ public: LineHeightMode lineHeightMode() const; void setLineHeightMode(LineHeightMode); + QUrl baseUrl() const; + void setBaseUrl(const QUrl &url); + void resetBaseUrl(); + virtual void componentComplete(); int resourcesLoading() const; // mainly for testing @@ -194,6 +199,7 @@ Q_SIGNALS: void lineHeightModeChanged(LineHeightMode mode); void effectiveHorizontalAlignmentChanged(); void lineLaidOut(QQuickTextLine *line); + void baseUrlChanged(); protected: void mousePressEvent(QMouseEvent *event); @@ -203,6 +209,10 @@ protected: virtual QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *); virtual bool event(QEvent *); +private Q_SLOTS: + void q_imagesLoaded(); + void triggerPreprocess(); + private: Q_DISABLE_COPY(QQuickText) Q_DECLARE_PRIVATE(QQuickText) diff --git a/src/quick/items/qquicktext_p_p.h b/src/quick/items/qquicktext_p_p.h index fe25a02759..dda24a0a68 100644 --- a/src/quick/items/qquicktext_p_p.h +++ b/src/quick/items/qquicktext_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -58,6 +58,7 @@ #include "qquickimplicitsizeitem_p_p.h" #include <QtDeclarative/qdeclarative.h> +#include <QtGui/qabstracttextdocumentlayout.h> #include <QtGui/qtextlayout.h> QT_BEGIN_NAMESPACE @@ -83,6 +84,7 @@ public: bool isLineLaidOutConnected(); QString text; + QUrl baseUrl; QFont font; QFont sourceFont; QColor color; @@ -159,6 +161,13 @@ public: }; NodeType nodeType; + enum UpdateType { + UpdateNone, + UpdatePreprocess, + UpdatePaintNode + }; + UpdateType updateType; + #if defined(Q_OS_MAC) QList<QRectF> linesRects; QThread *layoutThread; @@ -167,9 +176,10 @@ public: }; class QDeclarativePixmap; -class QQuickTextDocumentWithImageResources : public QTextDocument { +class QQuickTextDocumentWithImageResources : public QTextDocument, public QTextObjectInterface +{ Q_OBJECT - + Q_INTERFACES(QTextObjectInterface) public: QQuickTextDocumentWithImageResources(QQuickItem *parent); virtual ~QQuickTextDocumentWithImageResources(); @@ -181,14 +191,27 @@ public: void clear(); + QSizeF intrinsicSize(QTextDocument *doc, int posInDocument, const QTextFormat &format); + void drawObject(QPainter *p, const QRectF &rect, QTextDocument *doc, int posInDocument, const QTextFormat &format); + + QImage image(const QTextImageFormat &format); + + void setBaseUrl(const QUrl &url, bool clear = true); + +Q_SIGNALS: + void imagesLoaded(); + protected: QVariant loadResource(int type, const QUrl &name); + QDeclarativePixmap *loadPixmap(QDeclarativeContext *context, const QUrl &name); + private slots: void requestFinished(); private: QHash<QUrl, QDeclarativePixmap *> m_resources; + QUrl m_baseUrl; int outstanding; static QSet<QUrl> errors; diff --git a/src/quick/items/qquicktextcontrol.cpp b/src/quick/items/qquicktextcontrol.cpp index 4f9475f583..b1accb3781 100644 --- a/src/quick/items/qquicktextcontrol.cpp +++ b/src/quick/items/qquicktextcontrol.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtGui module of the Qt Toolkit. ** @@ -624,7 +624,7 @@ QQuickTextControl::QQuickTextControl(QTextDocument *doc, QObject *parent) : QObject(*new QQuickTextControlPrivate, parent) { Q_D(QQuickTextControl); - d->init(Qt::RichText, QString(), doc); + d->init(Qt::PlainText, QString(), doc); } QQuickTextControl::~QQuickTextControl() diff --git a/src/quick/items/qquicktextcontrol_p.h b/src/quick/items/qquicktextcontrol_p.h index 0ea21169c9..6159826f34 100644 --- a/src/quick/items/qquicktextcontrol_p.h +++ b/src/quick/items/qquicktextcontrol_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtGui module of the Qt Toolkit. ** @@ -67,7 +67,6 @@ QT_BEGIN_HEADER QT_BEGIN_NAMESPACE -QT_MODULE(Declarative) class QStyleSheet; class QTextDocument; diff --git a/src/quick/items/qquicktextcontrol_p_p.h b/src/quick/items/qquicktextcontrol_p_p.h index 9ba600aae4..59da1a8f52 100644 --- a/src/quick/items/qquicktextcontrol_p_p.h +++ b/src/quick/items/qquicktextcontrol_p_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtGui module of the Qt Toolkit. ** diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp index e971ef7b5e..37c76c09a3 100644 --- a/src/quick/items/qquicktextedit.cpp +++ b/src/quick/items/qquicktextedit.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -127,13 +127,17 @@ QQuickTextEdit::QQuickTextEdit(QQuickItem *parent) QString QQuickTextEdit::text() const { Q_D(const QQuickTextEdit); - + if (!d->textCached) { + QQuickTextEditPrivate *d = const_cast<QQuickTextEditPrivate *>(d_func()); #ifndef QT_NO_TEXTHTMLPARSER - if (d->richText) - return d->control->toHtml(); - else + if (d->richText) + d->text = d->control->toHtml(); + else #endif - return d->control->toPlainText(); + d->text = d->control->toPlainText(); + d->textCached = true; + } + return d->text; } /*! @@ -320,21 +324,21 @@ void QQuickTextEdit::setTextFormat(TextFormat format) Q_D(QQuickTextEdit); if (format == d->format) return; + bool wasRich = d->richText; - d->richText = format == RichText || (format == AutoText && Qt::mightBeRichText(d->text)); + d->richText = format == RichText || (format == AutoText && (wasRich || Qt::mightBeRichText(text()))); +#ifndef QT_NO_TEXTHTMLPARSER if (wasRich && !d->richText) { - d->control->setPlainText(d->text); + d->control->setPlainText(!d->textCached ? d->control->toHtml() : d->text); updateSize(); } else if (!wasRich && d->richText) { -#ifndef QT_NO_TEXTHTMLPARSER - d->control->setHtml(d->text); -#else - d->control->setPlainText(d->text); -#endif + d->control->setHtml(!d->textCached ? d->control->toPlainText() : d->text); updateSize(); d->useImageFallback = qmlEnableImageCache(); } +#endif + d->format = format; d->control->setAcceptRichText(d->format != PlainText); emit textFormatChanged(d->format); @@ -553,7 +557,7 @@ bool QQuickTextEditPrivate::determineHorizontalAlignment() Q_Q(QQuickTextEdit); if (hAlignImplicit && q->isComponentComplete()) { bool alignToRight; - if (text.isEmpty()) { + if (document->isEmpty()) { const QString preeditText = control->textCursor().block().layout()->preeditAreaText(); alignToRight = preeditText.isEmpty() ? qApp->inputPanel()->inputDirection() == Qt::RightToLeft @@ -682,6 +686,44 @@ qreal QQuickTextEdit::paintedHeight() const } /*! + \qmlproperty url QtQuick2::TextEdit::baseUrl + + This property specifies a base URL which is used to resolve relative URLs + within the text. + + By default is the url of the TextEdit element. +*/ + +QUrl QQuickTextEdit::baseUrl() const +{ + Q_D(const QQuickTextEdit); + if (d->baseUrl.isEmpty()) { + if (QDeclarativeContext *context = qmlContext(this)) + const_cast<QQuickTextEditPrivate *>(d)->baseUrl = context->baseUrl(); + } + return d->baseUrl; +} + +void QQuickTextEdit::setBaseUrl(const QUrl &url) +{ + Q_D(QQuickTextEdit); + if (baseUrl() != url) { + d->baseUrl = url; + + d->document->setBaseUrl(url, d->richText); + emit baseUrlChanged(); + } +} + +void QQuickTextEdit::resetBaseUrl() +{ + if (QDeclarativeContext *context = qmlContext(this)) + setBaseUrl(context->baseUrl()); + else + setBaseUrl(QUrl()); +} + +/*! \qmlmethod rectangle QtQuick2::TextEdit::positionToRectangle(position) Returns the rectangle at the given \a position in the text. The x, y, @@ -864,7 +906,7 @@ int QQuickTextEdit::cursorPosition() const void QQuickTextEdit::setCursorPosition(int pos) { Q_D(QQuickTextEdit); - if (pos < 0 || pos > d->text.length()) + if (pos < 0 || pos >= d->document->characterCount()) // characterCount includes the terminating null. return; QTextCursor cursor = d->control->textCursor(); if (cursor.position() == pos && cursor.anchor() == pos) @@ -1112,6 +1154,7 @@ void QQuickTextEdit::componentComplete() Q_D(QQuickTextEdit); QQuickImplicitSizeItem::componentComplete(); + d->document->setBaseUrl(baseUrl(), d->richText); if (d->richText) d->useImageFallback = qmlEnableImageCache(); @@ -1338,7 +1381,7 @@ void QQuickTextEdit::selectWord() void QQuickTextEdit::select(int start, int end) { Q_D(QQuickTextEdit); - if (start < 0 || end < 0 || start > d->text.length() || end > d->text.length()) + if (start < 0 || end < 0 || start >= d->document->characterCount() || end >= d->document->characterCount()) return; QTextCursor cursor = d->control->textCursor(); cursor.beginEditBlock(); @@ -1359,12 +1402,11 @@ void QQuickTextEdit::select(int start, int end) */ bool QQuickTextEdit::isRightToLeft(int start, int end) { - Q_D(QQuickTextEdit); if (start > end) { qmlInfo(this) << "isRightToLeft(start, end) called with the end property being smaller than the start."; return false; } else { - return d->text.mid(start, end - start).isRightToLeft(); + return getText(start, end).isRightToLeft(); } } @@ -1499,6 +1541,15 @@ void QQuickTextEdit::itemChange(ItemChange change, const ItemChangeData &value) { if (change == ItemActiveFocusHasChanged) { setCursorVisible(value.boolValue); // ### refactor: focus handling && d->canvas && d->canvas->hasFocus()); + + if (value.boolValue) { + q_updateAlignment(); + connect(qApp->inputPanel(), SIGNAL(inputDirectionChanged(Qt::LayoutDirection)), + this, SLOT(q_updateAlignment())); + } else { + disconnect(qApp->inputPanel(), SIGNAL(inputDirectionChanged(Qt::LayoutDirection)), + this, SLOT(q_updateAlignment())); + } } QQuickItem::itemChange(change, value); } @@ -1558,11 +1609,27 @@ void QQuickTextEdit::updateImageCache(const QRectF &) } +void QQuickTextEdit::triggerPreprocess() +{ + Q_D(QQuickTextEdit); + if (d->updateType == QQuickTextEditPrivate::UpdateNone) + d->updateType = QQuickTextEditPrivate::UpdateOnlyPreprocess; + update(); +} + QSGNode *QQuickTextEdit::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *updatePaintNodeData) { Q_UNUSED(updatePaintNodeData); Q_D(QQuickTextEdit); + if (d->updateType != QQuickTextEditPrivate::UpdatePaintNode && oldNode != 0) { + // Update done in preprocess() in the nodes + d->updateType = QQuickTextEditPrivate::UpdateNone; + return oldNode; + } + + d->updateType = QQuickTextEditPrivate::UpdateNone; + QSGNode *currentNode = oldNode; if (d->richText && d->useImageFallback) { QSGImageNode *node = 0; @@ -1600,7 +1667,7 @@ QSGNode *QQuickTextEdit::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData * QQuickTextNode *node = 0; if (oldNode == 0 || d->nodeType != QQuickTextEditPrivate::NodeIsText) { delete oldNode; - node = new QQuickTextNode(QQuickItemPrivate::get(this)->sceneGraphContext()); + node = new QQuickTextNode(QQuickItemPrivate::get(this)->sceneGraphContext(), this); d->nodeType = QQuickTextEditPrivate::NodeIsText; currentNode = node; } else { @@ -1761,6 +1828,7 @@ void QQuickTextEditPrivate::init() #endif FAST_CONNECT(document, SIGNAL(undoAvailable(bool)), q, SIGNAL(canUndoChanged())); FAST_CONNECT(document, SIGNAL(redoAvailable(bool)), q, SIGNAL(canRedoChanged())); + FAST_CONNECT(document, SIGNAL(imagesLoaded()), q, SLOT(updateSize())); document->setDefaultFont(font); document->setDocumentMargin(textMargin); @@ -1772,13 +1840,13 @@ void QQuickTextEditPrivate::init() void QQuickTextEdit::q_textChanged() { Q_D(QQuickTextEdit); - d->text = text(); + d->textCached = false; d->rightToLeftText = d->document->begin().layout()->engine()->isRightToLeft(); d->determineHorizontalAlignment(); d->updateDefaultTextOption(); updateSize(); updateTotalLines(); - emit textChanged(d->text); + emit textChanged(); } void QQuickTextEdit::moveCursorDelegate() @@ -1910,6 +1978,7 @@ void QQuickTextEdit::updateDocument() if (isComponentComplete()) { updateImageCache(); + d->updateType = QQuickTextEditPrivate::UpdatePaintNode; update(); } } @@ -1919,10 +1988,20 @@ void QQuickTextEdit::updateCursor() Q_D(QQuickTextEdit); if (isComponentComplete()) { updateImageCache(d->control->cursorRect()); + d->updateType = QQuickTextEditPrivate::UpdatePaintNode; update(); } } +void QQuickTextEdit::q_updateAlignment() +{ + Q_D(QQuickTextEdit); + if (d->determineHorizontalAlignment()) { + d->updateDefaultTextOption(); + moveCursorDelegate(); + } +} + void QQuickTextEdit::updateTotalLines() { Q_D(QQuickTextEdit); diff --git a/src/quick/items/qquicktextedit_p.h b/src/quick/items/qquicktextedit_p.h index f37b7cd8ff..8d268ea6f8 100644 --- a/src/quick/items/qquicktextedit_p.h +++ b/src/quick/items/qquicktextedit_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -93,6 +93,7 @@ class Q_AUTOTEST_EXPORT QQuickTextEdit : public QQuickImplicitSizeItem Q_PROPERTY(bool canUndo READ canUndo NOTIFY canUndoChanged) Q_PROPERTY(bool canRedo READ canRedo NOTIFY canRedoChanged) Q_PROPERTY(bool inputMethodComposing READ isInputMethodComposing NOTIFY inputMethodComposingChanged) + Q_PROPERTY(QUrl baseUrl READ baseUrl WRITE setBaseUrl RESET resetBaseUrl NOTIFY baseUrlChanged) public: QQuickTextEdit(QQuickItem *parent=0); @@ -214,6 +215,10 @@ public: qreal paintedWidth() const; qreal paintedHeight() const; + QUrl baseUrl() const; + void setBaseUrl(const QUrl &url); + void resetBaseUrl(); + Q_INVOKABLE QRectF positionToRectangle(int) const; Q_INVOKABLE int positionAt(int x, int y) const; Q_INVOKABLE void moveCursorSelection(int pos); @@ -227,7 +232,7 @@ public: Q_INVOKABLE QString getFormattedText(int start, int end) const; Q_SIGNALS: - void textChanged(const QString &); + void textChanged(); void paintedSizeChanged(); void cursorPositionChanged(); void cursorRectangleChanged(); @@ -257,6 +262,7 @@ Q_SIGNALS: void canRedoChanged(); void inputMethodComposingChanged(); void effectiveHorizontalAlignmentChanged(); + void baseUrlChanged(); public Q_SLOTS: void selectAll(); @@ -282,9 +288,11 @@ private Q_SLOTS: void q_canPasteChanged(); void updateDocument(); void updateCursor(); + void q_updateAlignment(); + void updateSize(); + void triggerPreprocess(); private: - void updateSize(); void updateTotalLines(); void updateImageCache(const QRectF &rect = QRectF()); diff --git a/src/quick/items/qquicktextedit_p_p.h b/src/quick/items/qquicktextedit_p_p.h index fe2172def6..f8996c95ee 100644 --- a/src/quick/items/qquicktextedit_p_p.h +++ b/src/quick/items/qquicktextedit_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -74,13 +74,17 @@ public: documentDirty(true), dirty(false), richText(false), cursorVisible(false), focusOnPress(true), persistentSelection(true), requireImplicitWidth(false), selectByMouse(false), canPaste(false), canPasteValid(false), hAlignImplicit(true), rightToLeftText(false), useImageFallback(false), + textCached(false), textMargin(0.0), lastSelectionStart(0), lastSelectionEnd(0), cursorComponent(0), cursor(0), format(QQuickTextEdit::PlainText), document(0), wrapMode(QQuickTextEdit::NoWrap), mouseSelectionMode(QQuickTextEdit::SelectCharacters), - lineCount(0), yoff(0), nodeType(NodeIsNull), texture(0) + lineCount(0), yoff(0), nodeType(NodeIsNull), texture(0), updateType(UpdatePaintNode) { } + static QQuickTextEditPrivate *get(QQuickTextEdit *item) { + return static_cast<QQuickTextEditPrivate *>(QObjectPrivate::get(item)); } + void init(); void updateDefaultTextOption(); @@ -91,6 +95,7 @@ public: qreal getImplicitWidth() const; QString text; + QUrl baseUrl; QFont font; QFont sourceFont; QColor color; @@ -114,6 +119,7 @@ public: bool hAlignImplicit:1; bool rightToLeftText:1; bool useImageFallback:1; + bool textCached:1; qreal textMargin; int lastSelectionStart; @@ -137,6 +143,13 @@ public: NodeType nodeType; QSGTexture *texture; QPixmap pixmapCache; + + enum UpdateType { + UpdateNone, + UpdateOnlyPreprocess, + UpdatePaintNode + }; + UpdateType updateType; }; QT_END_NAMESPACE diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp index e569581163..237db3537d 100644 --- a/src/quick/items/qquicktextinput.cpp +++ b/src/quick/items/qquicktextinput.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -102,6 +102,7 @@ void QQuickTextInput::componentComplete() QQuickImplicitSizeItem::componentComplete(); + d->checkIsValid(); d->updateLayout(); updateCursorRectangle(); if (d->cursorComponent && d->cursorComponent->isReady()) @@ -327,6 +328,7 @@ void QQuickTextInput::setColor(const QColor &c) if (c != d->color) { d->color = c; d->textLayoutDirty = true; + d->updateType = QQuickTextInputPrivate::UpdatePaintNode; update(); emit colorChanged(c); } @@ -354,6 +356,7 @@ void QQuickTextInput::setSelectionColor(const QColor &color) d->m_palette.setColor(QPalette::Highlight, d->selectionColor); if (d->hasSelectedText()) { d->textLayoutDirty = true; + d->updateType = QQuickTextInputPrivate::UpdatePaintNode; update(); } emit selectionColorChanged(color); @@ -379,6 +382,7 @@ void QQuickTextInput::setSelectedTextColor(const QColor &color) d->m_palette.setColor(QPalette::HighlightedText, d->selectedTextColor); if (d->hasSelectedText()) { d->textLayoutDirty = true; + d->updateType = QQuickTextInputPrivate::UpdatePaintNode; update(); } emit selectedTextColorChanged(color); @@ -403,8 +407,8 @@ void QQuickTextInput::setSelectedTextColor(const QColor &color) The valid values for \c horizontalAlignment are \c TextInput.AlignLeft, \c TextInput.AlignRight and \c TextInput.AlignHCenter. - Valid values for \c verticalAlignment are \c TextEdit.AlignTop (default), - \c TextEdit.AlignBottom \c TextEdit.AlignVCenter. + Valid values for \c verticalAlignment are \c TextInput.AlignTop (default), + \c TextInput.AlignBottom \c TextInput.AlignVCenter. When using the attached property LayoutMirroring::enabled to mirror application layouts, the horizontal alignment of text will also be mirrored. However, the property @@ -506,7 +510,7 @@ void QQuickTextInput::setVAlign(QQuickTextInput::VAlignment alignment) /*! \qmlproperty enumeration QtQuick2::TextInput::wrapMode - Set this property to wrap the text to the TextEdit item's width. + Set this property to wrap the text to the TextInput item's width. The text will only wrap if an explicit width has been set. \list @@ -641,6 +645,7 @@ void QQuickTextInput::setCursorVisible(bool on) return; d->cursorVisible = on; d->setCursorBlinkPeriod(on ? qApp->styleHints()->cursorFlashTime() : 0); + d->updateType = QQuickTextInputPrivate::UpdatePaintNode; update(); emit cursorVisibleChanged(d->cursorVisible); } @@ -842,6 +847,23 @@ void QQuickTextInput::setAutoScroll(bool b) \ingroup qml-basic-visual-elements This element provides a validator for non-integer numbers. + + Input is accepted if it contains a double that is within the valid range + and is in the correct format. + + Input is accepected but invalid if it contains a double that is outside + the range or is in the wrong format; e.g. with too many digits after the + decimal point or is empty. + + Input is rejected if it is not a double. + + Note: If the valid range consists of just positive doubles (e.g. 0.0 to + 100.0) and input is a negative double then it is rejected. If \l notation + is set to DoubleValidator.StandardNotation, and the input contains more + digits before the decimal point than a double in the valid range may have, + it is also rejected. If \l notation is DoubleValidator.ScientificNotation, + and the input is not in the valid range, it is accecpted but invalid. The + value may yet become valid by changing the exponent. */ /*! @@ -931,20 +953,32 @@ void QQuickTextInput::setValidator(QValidator* v) return; d->m_validator = v; - if (!d->hasAcceptableInput(d->m_text)) { - if (d->m_validInput) { - d->m_validInput = false; - emit acceptableInputChanged(); - } - } else if (!d->m_validInput) { - d->m_validInput = true; - emit acceptableInputChanged(); - } + + if (isComponentComplete()) + d->checkIsValid(); emit validatorChanged(); } + #endif // QT_NO_VALIDATOR +void QQuickTextInputPrivate::checkIsValid() +{ + Q_Q(QQuickTextInput); + + ValidatorState state = hasAcceptableInput(m_text); + m_validInput = state != InvalidInput; + if (state != AcceptableInput) { + if (m_acceptableInput) { + m_acceptableInput = false; + emit q->acceptableInputChanged(); + } + } else if (!m_acceptableInput) { + m_acceptableInput = true; + emit q->acceptableInputChanged(); + } +} + /*! \qmlproperty string QtQuick2::TextInput::inputMask @@ -981,7 +1015,7 @@ void QQuickTextInput::setInputMask(const QString &im) bool QQuickTextInput::hasAcceptableInput() const { Q_D(const QQuickTextInput); - return d->hasAcceptableInput(d->m_text); + return d->hasAcceptableInput(d->m_text) == QQuickTextInputPrivate::AcceptableInput; } /*! @@ -1591,14 +1625,30 @@ void QQuickTextInputPrivate::updateVerticalScroll() textLayoutDirty = true; } +void QQuickTextInput::triggerPreprocess() +{ + Q_D(QQuickTextInput); + if (d->updateType == QQuickTextInputPrivate::UpdateNone) + d->updateType = QQuickTextInputPrivate::UpdateOnlyPreprocess; + update(); +} + QSGNode *QQuickTextInput::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data) { Q_UNUSED(data); Q_D(QQuickTextInput); + if (d->updateType != QQuickTextInputPrivate::UpdatePaintNode && oldNode != 0) { + // Update done in preprocess() in the nodes + d->updateType = QQuickTextInputPrivate::UpdateNone; + return oldNode; + } + + d->updateType = QQuickTextInputPrivate::UpdateNone; + QQuickTextNode *node = static_cast<QQuickTextNode *>(oldNode); if (node == 0) - node = new QQuickTextNode(QQuickItemPrivate::get(this)->sceneGraphContext()); + node = new QQuickTextNode(QQuickItemPrivate::get(this)->sceneGraphContext(), this); d->textNode = node; if (!d->textLayoutDirty) { @@ -2065,7 +2115,7 @@ void QQuickTextInput::setMouseSelectionMode(SelectionMode mode) \qmlproperty bool QtQuick2::TextInput::canPaste Returns true if the TextInput is writable and the content of the clipboard is - suitable for pasting into the TextEdit. + suitable for pasting into the TextInput. */ bool QQuickTextInput::canPaste() const { @@ -2125,9 +2175,9 @@ void QQuickTextInput::moveCursorSelection(int position) basis. If not specified the selection mode will default to TextInput.SelectCharacters. \list - \o TextEdit.SelectCharacters - Sets either the selectionStart or selectionEnd (whichever was at + \o TextInput.SelectCharacters - Sets either the selectionStart or selectionEnd (whichever was at the previous cursor position) to the specified position. - \o TextEdit.SelectWords - Sets the selectionStart and selectionEnd to include all + \o TextInput.SelectWords - Sets the selectionStart and selectionEnd to include all words between the specified position and the previous cursor position. Words partially in the range are included. \endlist @@ -2316,6 +2366,12 @@ void QQuickTextInput::itemChange(ItemChange change, const ItemChangeData &value) if (!hasFocus) { d->commitPreedit(); d->deselect(); + disconnect(qApp->inputPanel(), SIGNAL(inputDirectionChanged(Qt::LayoutDirection)), + this, SLOT(q_updateAlignment())); + } else { + q_updateAlignment(); + connect(qApp->inputPanel(), SIGNAL(inputDirectionChanged(Qt::LayoutDirection)), + this, SLOT(q_updateAlignment())); } } QQuickItem::itemChange(change, value); @@ -2372,6 +2428,7 @@ void QQuickTextInput::updateCursorRectangle() d->updateHorizontalScroll(); d->updateVerticalScroll(); + d->updateType = QQuickTextInputPrivate::UpdatePaintNode; update(); emit cursorRectangleChanged(); if (d->cursorItem) { @@ -2385,6 +2442,7 @@ void QQuickTextInput::selectionChanged() { Q_D(QQuickTextInput); d->textLayoutDirty = true; //TODO: Only update rect in selection + d->updateType = QQuickTextInputPrivate::UpdatePaintNode; update(); emit selectedTextChanged(); @@ -2444,6 +2502,15 @@ void QQuickTextInput::q_canPasteChanged() } +void QQuickTextInput::q_updateAlignment() +{ + Q_D(QQuickTextInput); + if (d->determineHorizontalAlignment()) { + d->updateLayout(); + updateCursorRectangle(); + } +} + // ### these should come from QStyleHints const int textCursorWidth = 1; const bool fullWidthSelection = true; @@ -2510,7 +2577,7 @@ void QQuickTextInputPrivate::updateLayout() return; QTextOption option = m_textLayout.textOption(); - option.setTextDirection(m_layoutDirection); + option.setTextDirection(layoutDirection()); option.setFlags(QTextOption::IncludeTrailingSpaces); option.setWrapMode(QTextOption::WrapMode(wrapMode)); option.setAlignment(Qt::Alignment(q->effectiveHAlign())); @@ -2539,6 +2606,7 @@ void QQuickTextInputPrivate::updateLayout() m_ascent = qRound(firstLine.ascent()); textLayoutDirty = true; + updateType = UpdatePaintNode; q->update(); q->setImplicitSize(qCeil(boundingRect.width()), qCeil(boundingRect.height())); @@ -2984,16 +3052,21 @@ bool QQuickTextInputPrivate::finishChange(int validateFromState, bool update, bo Q_UNUSED(update) bool notifyInputPanel = m_textDirty || m_selDirty; + bool alignmentChanged = false; if (m_textDirty) { // do validation bool wasValidInput = m_validInput; + bool wasAcceptable = m_acceptableInput; m_validInput = true; + m_acceptableInput = true; #ifndef QT_NO_VALIDATOR if (m_validator) { QString textCopy = m_text; int cursorCopy = m_cursor; - m_validInput = (m_validator->validate(textCopy, cursorCopy) != QValidator::Invalid); + QValidator::State state = m_validator->validate(textCopy, cursorCopy); + m_validInput = state != QValidator::Invalid; + m_acceptableInput = state == QValidator::Acceptable; if (m_validInput) { if (m_text != textCopy) { internalSetText(textCopy, cursorCopy); @@ -3020,24 +3093,28 @@ bool QQuickTextInputPrivate::finishChange(int validateFromState, bool update, bo if (m_modifiedState > m_undoState) m_modifiedState = -1; m_validInput = true; + m_acceptableInput = wasAcceptable; m_textDirty = false; } if (m_textDirty) { m_textDirty = false; m_preeditDirty = false; - determineHorizontalAlignment(); + alignmentChanged = determineHorizontalAlignment(); emit q->textChanged(); } - updateDisplayText(); + updateDisplayText(alignmentChanged); - if (m_validInput != wasValidInput) + if (m_acceptableInput != wasAcceptable) emit q->acceptableInputChanged(); } if (m_preeditDirty) { m_preeditDirty = false; - determineHorizontalAlignment(); + if (determineHorizontalAlignment()) { + alignmentChanged = true; + updateLayout(); + } } if (m_selDirty) { @@ -3049,7 +3126,9 @@ bool QQuickTextInputPrivate::finishChange(int validateFromState, bool update, bo if (notifyInputPanel) q->updateMicroFocus(); emitUndoRedoChanged(); - emitCursorPositionChanged(); + + if (!emitCursorPositionChanged() && alignmentChanged) + q->updateCursorRectangle(); return true; } @@ -3399,32 +3478,34 @@ bool QQuickTextInputPrivate::isValidInput(QChar key, QChar mask) const Otherwise returns false */ -bool QQuickTextInputPrivate::hasAcceptableInput(const QString &str) const +QQuickTextInputPrivate::ValidatorState QQuickTextInputPrivate::hasAcceptableInput(const QString &str) const { #ifndef QT_NO_VALIDATOR QString textCopy = str; int cursorCopy = m_cursor; - if (m_validator && m_validator->validate(textCopy, cursorCopy) - != QValidator::Acceptable) - return false; + if (m_validator) { + QValidator::State state = m_validator->validate(textCopy, cursorCopy); + if (state != QValidator::Acceptable) + return ValidatorState(state); + } #endif if (!m_maskData) - return true; + return AcceptableInput; if (str.length() != m_maxLength) - return false; + return InvalidInput; for (int i=0; i < m_maxLength; ++i) { if (m_maskData[i].separator) { if (str.at(i) != m_maskData[i].maskChar) - return false; + return InvalidInput; } else { if (!isValidInput(str.at(i), m_maskData[i].maskChar)) - return false; + return InvalidInput; } } - return true; + return AcceptableInput; } /*! @@ -3683,7 +3764,7 @@ void QQuickTextInputPrivate::emitUndoRedoChanged() If the current cursor position differs from the last emitted cursor position, emits cursorPositionChanged(). */ -void QQuickTextInputPrivate::emitCursorPositionChanged() +bool QQuickTextInputPrivate::emitCursorPositionChanged() { Q_Q(QQuickTextInput); if (m_cursor != m_lastCursorPos) { @@ -3710,7 +3791,10 @@ void QQuickTextInputPrivate::emitCursorPositionChanged() #ifndef QT_NO_ACCESSIBILITY QAccessible::updateAccessibility(q, 0, QAccessible::TextCaretMoved); #endif + + return true; } + return false; } @@ -3727,8 +3811,10 @@ void QQuickTextInputPrivate::setCursorBlinkPeriod(int msec) m_blinkStatus = 1; } else { m_blinkTimer = 0; - if (m_blinkStatus == 1) + if (m_blinkStatus == 1) { + updateType = UpdatePaintNode; q->update(); + } } m_blinkPeriod = msec; } @@ -3748,6 +3834,7 @@ void QQuickTextInput::timerEvent(QTimerEvent *event) Q_D(QQuickTextInput); if (event->timerId() == d->m_blinkTimer) { d->m_blinkStatus = !d->m_blinkStatus; + d->updateType = QQuickTextInputPrivate::UpdatePaintNode; update(); } else if (event->timerId() == d->m_deleteAllTimer) { killTimer(d->m_deleteAllTimer); diff --git a/src/quick/items/qquicktextinput_p.h b/src/quick/items/qquicktextinput_p.h index 535b1af266..92d09c3efd 100644 --- a/src/quick/items/qquicktextinput_p.h +++ b/src/quick/items/qquicktextinput_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -323,6 +323,8 @@ private Q_SLOTS: void createCursor(); void updateCursorRectangle(); void q_canPasteChanged(); + void q_updateAlignment(); + void triggerPreprocess(); private: Q_DECLARE_PRIVATE(QQuickTextInput) diff --git a/src/quick/items/qquicktextinput_p_p.h b/src/quick/items/qquicktextinput_p_p.h index 3f28c4aefd..1fc55658e6 100644 --- a/src/quick/items/qquicktextinput_p_p.h +++ b/src/quick/items/qquicktextinput_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -125,8 +125,10 @@ public: , m_preeditDirty(0) , m_selDirty(0) , m_validInput(1) + , m_acceptableInput(1) , m_blinkStatus(0) , m_passwordEchoEditing(false) + , updateType(UpdatePaintNode) { } @@ -251,9 +253,17 @@ public: uint m_preeditDirty : 1; uint m_selDirty : 1; uint m_validInput : 1; + uint m_acceptableInput : 1; uint m_blinkStatus : 1; uint m_passwordEchoEditing; + enum UpdateType { + UpdateNone, + UpdateOnlyPreprocess, + UpdatePaintNode + }; + UpdateType updateType; + static inline QQuickTextInputPrivate *get(QQuickTextInput *t) { return t->d_func(); } @@ -424,7 +434,7 @@ private: void internalRedo(); void emitUndoRedoChanged(); - void emitCursorPositionChanged(); + bool emitCursorPositionChanged(); bool finishChange(int validateFromState = -1, bool update = false, bool edited = true); @@ -432,10 +442,23 @@ private: inline void separate() { m_separator = true; } + enum ValidatorState { +#ifndef QT_NO_VALIDATOR + InvalidInput = QValidator::Invalid, + IntermediateInput = QValidator::Intermediate, + AcceptableInput = QValidator::Acceptable +#else + Invalid, + Intermediate, + Acceptable +#endif + }; + // masking void parseInputMask(const QString &maskFields); bool isValidInput(QChar key, QChar mask) const; - bool hasAcceptableInput(const QString &text) const; + ValidatorState hasAcceptableInput(const QString &text) const; + void checkIsValid(); QString maskString(uint pos, const QString &str, bool clear = false) const; QString clearString(uint pos, uint len) const; QString stripString(const QString &str) const; diff --git a/src/quick/items/qquicktextnode.cpp b/src/quick/items/qquicktextnode.cpp index fcb1c855ec..2f72b0c8fe 100644 --- a/src/quick/items/qquicktextnode.cpp +++ b/src/quick/items/qquicktextnode.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -56,6 +56,7 @@ #include <qtexttable.h> #include <qtextlist.h> #include <private/qdeclarativestyledtext_p.h> +#include <private/qquicktext_p_p.h> #include <private/qfont_p.h> #include <private/qfontengine_p.h> #include <private/qrawfont_p.h> @@ -68,8 +69,8 @@ QT_BEGIN_NAMESPACE /*! Creates an empty QQuickTextNode */ -QQuickTextNode::QQuickTextNode(QSGContext *context) - : m_context(context), m_cursorNode(0) +QQuickTextNode::QQuickTextNode(QSGContext *context, QQuickItem *ownerElement) + : m_context(context), m_cursorNode(0), m_ownerElement(ownerElement) { #if defined(QML_RUNTIME_TESTING) description = QLatin1String("text"); @@ -130,6 +131,7 @@ QSGGlyphNode *QQuickTextNode::addGlyphs(const QPointF &position, const QGlyphRun QSGNode *parentNode) { QSGGlyphNode *node = m_context->createGlyphNode(); + node->setOwnerElement(m_ownerElement); node->setGlyphs(position + QPointF(0, glyphs.rawFont().ascent()), glyphs); node->setStyle(style); node->setStyleColor(styleColor); @@ -329,6 +331,12 @@ namespace { void addImage(const QRectF &rect, const QImage &image, qreal ascent, BinaryTreeNode::SelectionState selectionState, QTextFrameFormat::Position layoutPosition); + int addText(const QTextBlock &block, + const QTextCharFormat &charFormat, + const QColor &textColor, + const QVarLengthArray<QTextLayout::FormatRange> &colorChanges, + int textPos, int fragmentEnd, + int selectionStart, int selectionEnd); void addTextObject(const QPointF &position, const QTextCharFormat &format, BinaryTreeNode::SelectionState selectionState, QTextDocument *textDocument, int pos, @@ -407,6 +415,45 @@ namespace { QList<QPair<QRectF, QImage> > m_images; }; + int SelectionEngine::addText(const QTextBlock &block, + const QTextCharFormat &charFormat, + const QColor &textColor, + const QVarLengthArray<QTextLayout::FormatRange> &colorChanges, + int textPos, int fragmentEnd, + int selectionStart, int selectionEnd) + { + if (charFormat.foreground().style() != Qt::NoBrush) + setTextColor(charFormat.foreground().color()); + else + setTextColor(textColor); + + while (textPos < fragmentEnd) { + int blockRelativePosition = textPos - block.position(); + QTextLine line = block.layout()->lineForTextPosition(blockRelativePosition); + if (!currentLine().isValid() + || line.lineNumber() != currentLine().lineNumber()) { + setCurrentLine(line); + } + + Q_ASSERT(line.textLength() > 0); + int lineEnd = line.textStart() + block.position() + line.textLength(); + + int len = qMin(lineEnd - textPos, fragmentEnd - textPos); + Q_ASSERT(len > 0); + + int currentStepEnd = textPos + len; + + addGlyphsForRanges(colorChanges, + textPos - block.position(), + currentStepEnd - block.position(), + selectionStart - block.position(), + selectionEnd - block.position()); + + textPos = currentStepEnd; + } + return textPos; + } + void SelectionEngine::addTextDecorations(const QVarLengthArray<TextDecoration> &textDecorations, qreal offset, qreal thickness) { @@ -657,8 +704,15 @@ namespace { if (format.objectType() == QTextFormat::ImageObject) { QTextImageFormat imageFormat = format.toImageFormat(); - QTextImageHandler *imageHandler = static_cast<QTextImageHandler *>(handler); - image = imageHandler->image(textDocument, imageFormat); + if (QQuickTextDocumentWithImageResources *imageDoc = qobject_cast<QQuickTextDocumentWithImageResources *>(textDocument)) { + image = imageDoc->image(imageFormat); + + if (image.isNull()) + return; + } else { + QTextImageHandler *imageHandler = static_cast<QTextImageHandler *>(handler); + image = imageHandler->image(textDocument, imageFormat); + } } if (image.isNull()) { @@ -1155,6 +1209,13 @@ void QQuickTextNode::addTextDocument(const QPointF &, QTextDocument *textDocumen int textPos = block.position(); QTextBlock::iterator blockIterator = block.begin(); + if (blockIterator.atEnd() && preeditLength) { + engine.setPosition(blockPosition); + textPos = engine.addText(block, block.charFormat(), textColor, colorChanges, + textPos, textPos + preeditLength, + selectionStart, selectionEnd); + } + while (!blockIterator.atEnd()) { QTextFragment fragment = blockIterator.fragment(); QString text = fragment.text(); @@ -1183,42 +1244,15 @@ void QQuickTextNode::addTextDocument(const QPointF &, QTextDocument *textDocumen } textPos += text.length(); } else { - if (charFormat.foreground().style() != Qt::NoBrush) - engine.setTextColor(charFormat.foreground().color()); - else - engine.setTextColor(textColor); - int fragmentEnd = textPos + fragment.length(); if (preeditPosition >= 0 && preeditPosition >= textPos - && preeditPosition < fragmentEnd) { + && preeditPosition <= fragmentEnd) { fragmentEnd += preeditLength; } - while (textPos < fragmentEnd) { - int blockRelativePosition = textPos - block.position(); - QTextLine line = block.layout()->lineForTextPosition(blockRelativePosition); - if (!engine.currentLine().isValid() - || line.lineNumber() != engine.currentLine().lineNumber()) { - engine.setCurrentLine(line); - } - - Q_ASSERT(line.textLength() > 0); - int lineEnd = line.textStart() + block.position() + line.textLength(); - - int len = qMin(lineEnd - textPos, fragmentEnd - textPos); - Q_ASSERT(len > 0); - - int currentStepEnd = textPos + len; - - engine.addGlyphsForRanges(colorChanges, - textPos - block.position(), - currentStepEnd - block.position(), - selectionStart - block.position(), - selectionEnd - block.position()); - - textPos = currentStepEnd; - } + engine.addText(block, charFormat, textColor, colorChanges, textPos, fragmentEnd, + selectionStart, selectionEnd); } ++blockIterator; diff --git a/src/quick/items/qquicktextnode_p.h b/src/quick/items/qquicktextnode_p.h index a519322160..f64933b09f 100644 --- a/src/quick/items/qquicktextnode_p.h +++ b/src/quick/items/qquicktextnode_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -74,7 +74,7 @@ public: }; Q_DECLARE_FLAGS(Decorations, Decoration) - QQuickTextNode(QSGContext *); + QQuickTextNode(QSGContext *, QQuickItem *ownerElement); ~QQuickTextNode(); static bool isComplexRichText(QTextDocument *); @@ -103,6 +103,7 @@ private: QSGContext *m_context; QSGSimpleRectNode *m_cursorNode; QList<QSGTexture *> m_textures; + QQuickItem *m_ownerElement; }; QT_END_NAMESPACE diff --git a/src/quick/items/qquicktranslate.cpp b/src/quick/items/qquicktranslate.cpp index c1b00d4653..887159f9bc 100644 --- a/src/quick/items/qquicktranslate.cpp +++ b/src/quick/items/qquicktranslate.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquicktranslate_p.h b/src/quick/items/qquicktranslate_p.h index 1a7a56e49b..7f29870c36 100644 --- a/src/quick/items/qquicktranslate_p.h +++ b/src/quick/items/qquicktranslate_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickview.cpp b/src/quick/items/qquickview.cpp index 8c7db60195..638cbb7ff3 100644 --- a/src/quick/items/qquickview.cpp +++ b/src/quick/items/qquickview.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickview.h b/src/quick/items/qquickview.h index 3c637689d3..871105c143 100644 --- a/src/quick/items/qquickview.h +++ b/src/quick/items/qquickview.h @@ -1,9 +1,9 @@ // Commit: 0b83a2161261be525f01359397ab1c8c34827749 /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickview_p.h b/src/quick/items/qquickview_p.h index 585269ad2e..d4f2449069 100644 --- a/src/quick/items/qquickview_p.h +++ b/src/quick/items/qquickview_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickvisualadaptormodel.cpp b/src/quick/items/qquickvisualadaptormodel.cpp index 66c26ddf44..01590ca86b 100644 --- a/src/quick/items/qquickvisualadaptormodel.cpp +++ b/src/quick/items/qquickvisualadaptormodel.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickvisualadaptormodel_p.h b/src/quick/items/qquickvisualadaptormodel_p.h index cfc5a6903d..49dfae8fc3 100644 --- a/src/quick/items/qquickvisualadaptormodel_p.h +++ b/src/quick/items/qquickvisualadaptormodel_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickvisualdatamodel.cpp b/src/quick/items/qquickvisualdatamodel.cpp index 3de1e91f7f..698c4f29da 100644 --- a/src/quick/items/qquickvisualdatamodel.cpp +++ b/src/quick/items/qquickvisualdatamodel.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -425,6 +425,10 @@ QQuickVisualDataModel::ReleaseFlags QQuickVisualDataModelPrivate::release(QObjec if (QQuickItem *item = qobject_cast<QQuickItem *>(object)) emitDestroyingItem(item); cacheItem->object = 0; + if (cacheItem->incubationTask) { + releaseIncubator(cacheItem->incubationTask); + cacheItem->incubationTask = 0; + } stat |= QQuickVisualModel::Destroyed; } else { stat |= QQuickVisualDataModel::Referenced; diff --git a/src/quick/items/qquickvisualdatamodel_p.h b/src/quick/items/qquickvisualdatamodel_p.h index 2a87e5ed15..df45a94211 100644 --- a/src/quick/items/qquickvisualdatamodel_p.h +++ b/src/quick/items/qquickvisualdatamodel_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickvisualdatamodel_p_p.h b/src/quick/items/qquickvisualdatamodel_p_p.h index 6a943806b2..b840ca8ff6 100644 --- a/src/quick/items/qquickvisualdatamodel_p_p.h +++ b/src/quick/items/qquickvisualdatamodel_p_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickvisualitemmodel.cpp b/src/quick/items/qquickvisualitemmodel.cpp index 947c1755b3..59726c96db 100644 --- a/src/quick/items/qquickvisualitemmodel.cpp +++ b/src/quick/items/qquickvisualitemmodel.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickvisualitemmodel_p.h b/src/quick/items/qquickvisualitemmodel_p.h index 3471e1a0cc..cf0fcce082 100644 --- a/src/quick/items/qquickvisualitemmodel_p.h +++ b/src/quick/items/qquickvisualitemmodel_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickwindowmanager.cpp b/src/quick/items/qquickwindowmanager.cpp index 87867c8ddf..a07efeaeb3 100644 --- a/src/quick/items/qquickwindowmanager.cpp +++ b/src/quick/items/qquickwindowmanager.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickwindowmanager_p.h b/src/quick/items/qquickwindowmanager_p.h index 8a5073effd..5078048fc3 100644 --- a/src/quick/items/qquickwindowmanager_p.h +++ b/src/quick/items/qquickwindowmanager_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickwindowmodule.cpp b/src/quick/items/qquickwindowmodule.cpp index 172ab91477..1ff1df3145 100644 --- a/src/quick/items/qquickwindowmodule.cpp +++ b/src/quick/items/qquickwindowmodule.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickwindowmodule_p.h b/src/quick/items/qquickwindowmodule_p.h index c111a74955..d556b63131 100644 --- a/src/quick/items/qquickwindowmodule_p.h +++ b/src/quick/items/qquickwindowmodule_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** @@ -48,7 +48,6 @@ QT_BEGIN_HEADER QT_BEGIN_NAMESPACE -QT_MODULE(Declarative) class QQuickWindowModule { |