summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQt Continuous Integration System <qt-info@nokia.com>2011-01-06 00:12:59 (GMT)
committerQt Continuous Integration System <qt-info@nokia.com>2011-01-06 00:12:59 (GMT)
commit298c919a459a7927797905222a4df3d915f19d70 (patch)
treec9776d9bd34b7e54b3e0d14acdcc6b4f31635fea
parent4cba1e3f3e3995c0b0215a92c26654998bc0270a (diff)
parent16cc5a4de47c13e90a341356090dbccbc8c3fe07 (diff)
downloadQt-298c919a459a7927797905222a4df3d915f19d70.zip
Qt-298c919a459a7927797905222a4df3d915f19d70.tar.gz
Qt-298c919a459a7927797905222a4df3d915f19d70.tar.bz2
Merge branch 'master' of git://scm.dev.nokia.troll.no/qt/qt-releng-team
* 'master' of git://scm.dev.nokia.troll.no/qt/qt-releng-team: (118 commits) Updated DEF files for QtOpenGL for WINSCW and ARMV5 Fix link error on MacOS Allow QWidget with size larger than 16383 on Mac OS X (Cocoa) Set no brush when the brush is a solid patern transparent color. Fixed networkselftest failing to resolve hostname tst_qmessagebox: fix `about' test on mac tst_qmessagebox: make the failure message better for detailsButtonText tst_qmessagebox: simulate key events more robustly Clear WSERV content when a native child receives an "expose" Fixed a bug in elf2e32_qtwrapper regarding spaces in def files. Fixed several compile and deployment issues in the mmf phonon plugin. Fix fullscreen/Maximized dialog misplacement in Symbian Whitespace change Fix for coding conventions. Fix resource leak in QCLuceneStandardAnalyzer::QCLuceneStandardAnalyzer. Fix resource leak in QCLuceneStopAnalyzer::QCLuceneStopAnalyzer. Add Postgresql 8.x and 9 supports WorkerScript could starve image loading of CPU. More docs for FolderListModel Improve docs on attached properties on view delegates. ...
-rwxr-xr-xbin/elf2e32_qtwrapper.pl6
-rw-r--r--doc/src/declarative/basictypes.qdoc95
-rw-r--r--doc/src/declarative/codingconventions.qdoc18
-rw-r--r--doc/src/declarative/declarativeui.qdoc2
-rw-r--r--doc/src/declarative/extending.qdoc24
-rw-r--r--doc/src/declarative/focus.qdoc339
-rw-r--r--doc/src/declarative/modules.qdoc64
-rw-r--r--doc/src/declarative/qdeclarativereference.qdoc81
-rw-r--r--doc/src/development/qtestlib.qdoc29
-rw-r--r--doc/src/examples/diagramscene.qdoc2
-rw-r--r--doc/src/external-resources.qdoc5
-rw-r--r--doc/src/frameworks-technologies/threads.qdoc20
-rw-r--r--doc/src/getting-started/gettingstartedqml.qdoc2
-rw-r--r--doc/src/getting-started/installation.qdoc2
-rw-r--r--doc/src/images/declarative-qmlfocus1.pngbin0 -> 1890 bytes
-rw-r--r--doc/src/images/declarative-qmlfocus2.pngbin0 -> 2756 bytes
-rw-r--r--doc/src/images/declarative-qmlfocus3.pngbin0 -> 2743 bytes
-rw-r--r--doc/src/images/declarative-qmlfocus4.pngbin0 -> 4137 bytes
-rw-r--r--doc/src/images/declarative-qmlfocus5.pngbin0 -> 1376 bytes
-rw-r--r--doc/src/legal/3rdparty.qdoc81
-rw-r--r--doc/src/network-programming/bearermanagement.qdoc8
-rw-r--r--doc/src/platforms/platform-notes.qdoc3
-rw-r--r--doc/src/qt-webpages.qdoc15
-rw-r--r--doc/src/qt4-intro.qdoc62
-rw-r--r--doc/src/snippets/declarative/codingconventions/private.qml49
-rw-r--r--doc/src/snippets/declarative/comments.qml1
-rw-r--r--doc/src/snippets/declarative/focus/advancedFocus.qml67
-rw-r--r--doc/src/snippets/declarative/focus/basicwidget.qml59
-rw-r--r--doc/src/snippets/declarative/focus/clickablewidget.qml61
-rw-r--r--doc/src/snippets/declarative/focus/focusColumn.qml64
-rw-r--r--doc/src/snippets/declarative/focus/focusscopewidget.qml61
-rw-r--r--doc/src/snippets/declarative/focus/myclickablewidget.qml69
-rw-r--r--doc/src/snippets/declarative/focus/myfocusscopewidget.qml66
-rw-r--r--doc/src/snippets/declarative/focus/mywidget.qml58
-rw-r--r--doc/src/snippets/declarative/focus/qmldir4
-rw-r--r--doc/src/snippets/declarative/focus/rectangle.qml62
-rw-r--r--doc/src/snippets/declarative/focus/widget.qml61
-rw-r--r--doc/src/snippets/declarative/gridview/gridview.qml26
-rw-r--r--doc/src/snippets/declarative/listview/listview.qml14
-rw-r--r--doc/src/snippets/declarative/pathview/pathattributes.qml4
-rw-r--r--doc/src/snippets/declarative/pathview/pathview.qml14
-rw-r--r--doc/src/widgets-and-layouts/gallery-cde.qdoc427
-rw-r--r--doc/src/widgets-and-layouts/gallery-cleanlooks.qdoc432
-rw-r--r--doc/src/widgets-and-layouts/gallery-gtk.qdoc436
-rw-r--r--doc/src/widgets-and-layouts/gallery-macintosh.qdoc432
-rw-r--r--doc/src/widgets-and-layouts/gallery-motif.qdoc432
-rw-r--r--doc/src/widgets-and-layouts/gallery-plastique.qdoc432
-rw-r--r--doc/src/widgets-and-layouts/gallery-windows.qdoc432
-rw-r--r--doc/src/widgets-and-layouts/gallery-windowsvista.qdoc432
-rw-r--r--doc/src/widgets-and-layouts/gallery-windowsxp.qdoc432
-rw-r--r--doc/src/widgets-and-layouts/gallery.qdoc112
-rw-r--r--examples/tools/echoplugin/echowindow/echowindow.pro4
-rw-r--r--examples/tools/styleplugin/plugin/plugin.pro4
-rw-r--r--qmake/generators/symbian/symbiancommon.cpp2
-rw-r--r--src/corelib/io/qdatastream.cpp59
-rw-r--r--src/corelib/io/qdatastream.h3
-rw-r--r--src/corelib/io/qdiriterator.cpp6
-rw-r--r--src/corelib/io/qfile.cpp187
-rw-r--r--src/corelib/io/qfile.h14
-rw-r--r--src/corelib/io/qfile_p.h7
-rw-r--r--src/corelib/io/qfsfileengine.cpp14
-rw-r--r--src/corelib/io/qfsfileengine.h8
-rw-r--r--src/corelib/io/qfsfileengine_unix.cpp59
-rw-r--r--src/corelib/io/qprocess_unix.cpp30
-rw-r--r--src/corelib/io/qresource.cpp2
-rw-r--r--src/corelib/io/qtextstream.cpp48
-rw-r--r--src/corelib/io/qtextstream.h3
-rw-r--r--src/corelib/kernel/qcoreapplication.cpp18
-rw-r--r--src/corelib/kernel/qcoreapplication.h1
-rw-r--r--src/corelib/kernel/qcoreapplication_p.h2
-rw-r--r--src/corelib/thread/qmutex.cpp107
-rw-r--r--src/corelib/thread/qmutex_p.h14
-rw-r--r--src/corelib/thread/qmutex_unix.cpp91
-rw-r--r--src/corelib/thread/qmutex_win.cpp10
-rw-r--r--src/corelib/tools/qelapsedtimer.h1
-rw-r--r--src/corelib/tools/qelapsedtimer_generic.cpp16
-rw-r--r--src/corelib/tools/qelapsedtimer_mac.cpp6
-rw-r--r--src/corelib/tools/qelapsedtimer_symbian.cpp22
-rw-r--r--src/corelib/tools/qelapsedtimer_unix.cpp11
-rw-r--r--src/corelib/tools/qelapsedtimer_win.cpp20
-rw-r--r--src/corelib/tools/qlocale.cpp2
-rw-r--r--src/corelib/tools/qpoint.cpp63
-rw-r--r--src/corelib/tools/qpoint.h38
-rw-r--r--src/corelib/xml/qxmlstream.cpp76
-rw-r--r--src/corelib/xml/qxmlstream.h2
-rw-r--r--src/declarative/graphicsitems/qdeclarativeflickable.cpp6
-rw-r--r--src/declarative/graphicsitems/qdeclarativegridview.cpp9
-rw-r--r--src/declarative/graphicsitems/qdeclarativeitem.cpp24
-rw-r--r--src/declarative/graphicsitems/qdeclarativelistview.cpp21
-rw-r--r--src/declarative/graphicsitems/qdeclarativepathview.cpp13
-rw-r--r--src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp6
-rw-r--r--src/declarative/qml/qdeclarativecomponent.cpp11
-rw-r--r--src/declarative/qml/qdeclarativecomponent_p.h1
-rw-r--r--src/declarative/qml/qdeclarativeworkerscript.cpp2
-rw-r--r--src/declarative/util/qdeclarativeanimation.cpp8
-rw-r--r--src/declarative/util/qdeclarativeview.cpp7
-rw-r--r--src/declarative/util/qdeclarativexmllistmodel.cpp1
-rw-r--r--src/gui/dialogs/qdialog.cpp24
-rw-r--r--src/gui/dialogs/qfiledialog_symbian.cpp73
-rw-r--r--src/gui/dialogs/qmessagebox.cpp2
-rw-r--r--src/gui/image/qmovie.cpp6
-rw-r--r--src/gui/image/qpixmap.cpp4
-rw-r--r--src/gui/kernel/qapplication_s60.cpp8
-rw-r--r--src/gui/kernel/qwidget_mac.mm2
-rw-r--r--src/gui/painting/qdrawhelper.cpp168
-rw-r--r--src/gui/painting/qpaintengine_raster.cpp37
-rw-r--r--src/gui/painting/qpdf.cpp2
-rw-r--r--src/gui/styles/qcommonstyle.cpp5
-rw-r--r--src/gui/styles/qwindowsstyle.cpp5
-rw-r--r--src/gui/widgets/qdockwidget.cpp17
-rw-r--r--src/imports/folderlistmodel/qdeclarativefolderlistmodel.cpp33
-rw-r--r--src/opengl/gl2paintengineex/qglengineshadermanager.cpp294
-rw-r--r--src/opengl/gl2paintengineex/qglshadercache_meego_p.h457
-rw-r--r--src/opengl/gl2paintengineex/qglshadercache_p.h98
-rw-r--r--src/opengl/opengl.pro4
-rw-r--r--src/opengl/util/meego/main.cpp89
-rw-r--r--src/opengl/util/meego/shader-cache-introspector.pro7
-rw-r--r--src/plugins/phonon/mmf/mmf.pro2
-rw-r--r--src/s60installs/bwins/QtCoreu.def8
-rw-r--r--src/s60installs/bwins/QtGuiu.def95
-rw-r--r--src/s60installs/bwins/QtNetworku.def23
-rw-r--r--src/s60installs/bwins/QtOpenGLu.def2
-rw-r--r--src/s60installs/eabi/QtCoreu.def6
-rw-r--r--src/s60installs/eabi/QtGuiu.def104
-rw-r--r--src/s60installs/eabi/QtNetworku.def20
-rw-r--r--src/s60installs/eabi/QtOpenGLu.def2
-rw-r--r--src/sql/drivers/psql/qsql_psql.cpp116
-rw-r--r--src/sql/drivers/psql/qsql_psql.h6
-rw-r--r--tests/auto/declarative/qdeclarativecomponent/tst_qdeclarativecomponent.cpp15
-rw-r--r--tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp37
-rw-r--r--tests/auto/declarative/qdeclarativeitem/data/keynavigationtest.qml40
-rw-r--r--tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp5
-rw-r--r--tests/auto/declarative/qdeclarativelistview/incrementalmodel.cpp89
-rw-r--r--tests/auto/declarative/qdeclarativelistview/incrementalmodel.h68
-rw-r--r--tests/auto/declarative/qdeclarativelistview/qdeclarativelistview.pro3
-rw-r--r--tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp64
-rw-r--r--tests/auto/declarative/qdeclarativeproperty/tst_qdeclarativeproperty.cpp62
-rw-r--r--tests/auto/declarative/qdeclarativexmllistmodel/qdeclarativexmllistmodel.pro2
-rw-r--r--tests/auto/declarative/qdeclarativexmllistmodel/tst_qdeclarativexmllistmodel.cpp69
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.0.pngbin0 -> 1710 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.1.pngbin0 -> 1710 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.2.pngbin0 -> 1727 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.3.pngbin0 -> 1727 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.4.pngbin0 -> 1727 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.5.pngbin0 -> 1731 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.qml2159
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativeflickable/flickable-nested.qml50
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.0.pngbin1114 -> 1114 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.1.pngbin1105 -> 1119 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.2.pngbin1088 -> 1102 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.3.pngbin1096 -> 1092 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.4.pngbin1143 -> 1143 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.5.pngbin1143 -> 1143 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.qml366
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.0.pngbin1169 -> 1169 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.1.pngbin1182 -> 1172 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.2.pngbin1211 -> 1201 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.3.pngbin1184 -> 1164 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.4.pngbin1152 -> 1226 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.5.pngbin1141 -> 1192 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.6.pngbin1189 -> 1188 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.qml672
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/test-pathview.qml2
-rw-r--r--tests/auto/networkselftest/tst_networkselftest.cpp2
-rw-r--r--tests/auto/qcompleter/tst_qcompleter.cpp27
-rw-r--r--tests/auto/qdatastream/tst_qdatastream.cpp51
-rw-r--r--tests/auto/qelapsedtimer/tst_qelapsedtimer.cpp7
-rw-r--r--tests/auto/qfile/test/test.pro4
-rw-r--r--tests/auto/qfile/tst_qfile.cpp186
-rw-r--r--tests/auto/qmessagebox/tst_qmessagebox.cpp138
-rw-r--r--tests/auto/qmovie/animations/corrupt.gifbin0 -> 847 bytes
-rw-r--r--tests/auto/qmovie/qmovie.pro1
-rw-r--r--tests/auto/qmovie/resources.qrc5
-rw-r--r--tests/auto/qmovie/tst_qmovie.cpp13
-rw-r--r--tests/auto/qprogressbar/tst_qprogressbar.cpp7
-rw-r--r--tests/auto/qsqldatabase/tst_databases.h2
-rw-r--r--tests/auto/qstyle/tst_qstyle.cpp7
-rw-r--r--tests/auto/qtextstream/tst_qtextstream.cpp37
-rw-r--r--tests/auto/qxmlstream/tst_qxmlstream.cpp82
-rw-r--r--tests/benchmarks/corelib/thread/qmutex/qmutex.pro2
-rw-r--r--tests/benchmarks/corelib/thread/qmutex/tst_qmutex.cpp326
-rw-r--r--tests/shared/filesystem.h3
-rw-r--r--tools/assistant/lib/fulltextsearch/qanalyzer.cpp10
-rw-r--r--tools/assistant/tools/assistant/main.cpp3
-rw-r--r--tools/runonphone/serenum_unix.cpp29
185 files changed, 8360 insertions, 4660 deletions
diff --git a/bin/elf2e32_qtwrapper.pl b/bin/elf2e32_qtwrapper.pl
index d91be14..a90877e 100755
--- a/bin/elf2e32_qtwrapper.pl
+++ b/bin/elf2e32_qtwrapper.pl
@@ -146,7 +146,7 @@ while (1) {
$origDefLine = <$origDefFile>;
if (defined($origDefLine)) {
$origDefLine =~ s/[\n\r]//;
- if ($origDefLine =~ /([a-z0-9_]+) +\@ ([0-9]+) (.*)/i) {
+ if ($origDefLine =~ /([a-z0-9_]+) +\@ *([0-9]+) (.*)/i) {
$origSym = $1;
$origOrdinal = $2;
$origExtraData = $3;
@@ -161,7 +161,7 @@ while (1) {
if ($savedNewDefFileLine) {
# This happens if the new def file was missing an entry.
$newDefLine = $savedNewDefFileLine;
- $newDefLine =~ /([a-z0-9_]+) +\@ ([0-9]+) (.*)/i or die("$0: Shouldn't happen");
+ $newDefLine =~ /([a-z0-9_]+) +\@ *([0-9]+) (.*)/i or die("$0: Shouldn't happen");
$newSym = $1;
$newOrdinal = $2;
$newExtraData = $3;
@@ -171,7 +171,7 @@ while (1) {
$newDefLine = <$newDefFile>;
if (defined($newDefLine)) {
$newDefLine =~ s/[\n\r]//;
- if ($newDefLine =~ /([a-z0-9_]+) +\@ ([0-9]+) (.*)/i) {
+ if ($newDefLine =~ /([a-z0-9_]+) +\@ *([0-9]+) (.*)/i) {
$newSym = $1;
$newOrdinal = $2;
$newExtraData = $3;
diff --git a/doc/src/declarative/basictypes.qdoc b/doc/src/declarative/basictypes.qdoc
index 034b7d1..e9d3a44 100644
--- a/doc/src/declarative/basictypes.qdoc
+++ b/doc/src/declarative/basictypes.qdoc
@@ -95,6 +95,26 @@
*/
/*!
+ \qmlbasictype double
+ \ingroup qmlbasictypes
+
+ \brief A double number has a decimal point and is stored in double precision.
+
+ A double number has a decimal point and is stored in double precision, \l
+ {http://en.wikipedia.org/wiki/IEEE_754} {IEEE floating point}
+ format.
+
+ Example:
+ \qml
+ Item {
+ property double number: 32155.2355
+ }
+ \endqml
+
+ \sa {QML Basic Types}
+*/
+
+/*!
\qmlbasictype string
\ingroup qmlbasictypes
@@ -412,7 +432,8 @@
list only modify a \e copy of the list and not the actual list. (These current limitations
are due to restrictions on \l {Property Binding} where lists are involved.)
- To create a modifiable list, create an array object from within a \c .js JavaScript file,
+ You can, however, modify a copy of the list and then reassign the property to the modified
+ value. Other options are to create an array object from within a \c .js JavaScript file,
or implement a custom list element in C++. Here is a QML element that modifies the list in a
JavaScript file:
@@ -452,6 +473,78 @@
\sa {QML Basic Types}
*/
+
+/*!
+ \qmlbasictype variant
+ \ingroup qmlbasictypes
+
+ \brief A variant type is a generic property type.
+
+ A variant is a generic property type. A variant type property can hold any of the
+ \l {QML Basic Types}{basic type} values:
+
+ \qml
+ Item {
+ property variant aNumber : 100
+ property variant aString : "Hello world!"
+ property variant aList : [ 1, 2, "buckle my shoe" ]
+ }
+ \endqml
+
+ The \c variant type can also hold a \e copy of a JavaScript object. For example, the
+ \c animal property below defines a JavaScript object defined with JSON notation. The
+ object's properties and values can be examined using the standard JavaScript syntax,
+ as shown in the \c Component.onCompleted handler.
+
+ \qml
+ Item {
+ property variant animal : { 'type': 'bird', 'species': 'galah', 'age': 7 }
+
+ Component.onCompleted: {
+ for (var attribute in animal)
+ console.log(attribute, "=", animal[attribute])
+ }
+ }
+ \endqml
+
+ It must be noted that the \c animal property holds a \e copy of the defined object, and
+ not the object itself. (This is true even if the property refers to an object defined in
+ some JavaScript file; the property will hold a copy of the object, and not the actual
+ object.) The property essentially holds a copy of the contents within the object. This
+ has several implications:
+
+ \list
+ \o Changes to any of the property's values (for example, the \c animal.type value
+ above) only modify the \e copy of the object, not the object itself. You can, however,
+ modify a copy of the object and then reassign the property to the modified value.
+ \o Because the property only holds a copy of the object, \l{Property Binding}{bindings} to
+ any of the property's individual values are not updated until the whole property is
+ reassigned to a new value. For example:
+
+ \qml
+ Item {
+ property variant animal : { 'type': 'bird', 'species': 'galah', 'age': 7 }
+
+ Text { text: "Animal species: " + animal.species }
+
+ Component.onCompleted: {
+ animal.species = 'kookaburra' // this has no effect on the displayed text
+
+ var newObj = animal
+ newObj.species = 'kookaburra'
+ animal = newObj // this will update the displayed text
+ }
+ }
+ \endqml
+ \o Since the object values are copied, it does not hold any reference to the original
+ object, and extra data such as the object's JavaScript prototype chain is lost in the
+ process.
+ \endlist
+
+ \sa {QML Basic Types}
+*/
+
+
/*!
\qmlbasictype vector3d
\ingroup qmlbasictypes
diff --git a/doc/src/declarative/codingconventions.qdoc b/doc/src/declarative/codingconventions.qdoc
index ba789e0..3f92d46 100644
--- a/doc/src/declarative/codingconventions.qdoc
+++ b/doc/src/declarative/codingconventions.qdoc
@@ -35,7 +35,7 @@ This page assumes that you are already familiar with the QML language.
If you need an introduction to the language, please read \l {Introduction to the QML language}{the QML introduction} first.
-\section1 QML objects
+\section1 QML Objects
Through our documentation and examples, QML objects are always structured in the following order:
@@ -58,7 +58,7 @@ For example, a hypothetical \e photo QML object would look like this:
\snippet doc/src/snippets/declarative/codingconventions/photo.qml 0
-\section1 Grouped properties
+\section1 Grouped Properties
If using multiple properties from a group of properties,
we use the \e {group notation} rather than the \e {dot notation} to improve readability.
@@ -72,6 +72,18 @@ can be written like this:
\snippet doc/src/snippets/declarative/codingconventions/dotproperties.qml 1
+\section1 Private Properties
+
+QML and JavaScript do not enforce private properties like C++. There is a need
+to hide these private properties, for example, when the properties are part of
+the implementation. As a convention, private properties begin with two
+\e underscore characters. For example, \c __area, is a property that is
+accessible but is not meant for public use. Note that QML and JavaScript will
+grant the user access to these properties.
+
+\snippet doc/src/snippets/declarative/codingconventions/private.qml 0
+
+
\section1 Lists
If a list contains only one element, we generally omit the square brackets.
@@ -87,7 +99,7 @@ we will write this:
\snippet doc/src/snippets/declarative/codingconventions/lists.qml 1
-\section1 JavaScript code
+\section1 JavaScript Code
If the script is a single expression, we recommend writing it inline:
diff --git a/doc/src/declarative/declarativeui.qdoc b/doc/src/declarative/declarativeui.qdoc
index 5d9eaaf..41b9952 100644
--- a/doc/src/declarative/declarativeui.qdoc
+++ b/doc/src/declarative/declarativeui.qdoc
@@ -108,6 +108,7 @@ Module.
\section1 Handling Data
\list
+\o \l{QML Basic Types}{QML Basic Data Types}
\o \l{Using QML Positioner and Repeater Items}
\o \l{QML Data Models}
\o \l{Presenting Data with QML}
@@ -136,6 +137,7 @@ Module.
\list
\o \l{QML Elements}
+\o \l{QML Basic Types}
\o \l{QML Global Object}
\o \l{QML Internationalization}
\o \l{QML Security}
diff --git a/doc/src/declarative/extending.qdoc b/doc/src/declarative/extending.qdoc
index ecd7da1..3311c82 100644
--- a/doc/src/declarative/extending.qdoc
+++ b/doc/src/declarative/extending.qdoc
@@ -753,15 +753,15 @@ with their default values and the corresponding C++ type:
\table
\header \o QML Type Name \o Default value \o C++ Type Name
-\row \o int \o 0 \o int
-\row \o bool \o \c false \o bool
-\row \o double \o 0.0 \o double
-\row \o real \o 0.0 \o double
-\row \o string \o "" (empty string) \o QString
-\row \o url \o "" (empty url) \o QUrl
-\row \o color \o #000000 (black) \o QColor
-\row \o date \o \c undefined \o QDateTime
-\row \o variant \o \c undefined \o QVariant
+\row \o \l int \o 0 \o int
+\row \o \l bool \o \c false \o bool
+\row \o \l double \o 0.0 \o double
+\row \o \l real \o 0.0 \o double
+\row \o \l string \o "" (empty string) \o QString
+\row \o \l url \o "" (empty url) \o QUrl
+\row \o \l color \o #000000 (black) \o QColor
+\row \o \l date \o \c undefined \o QDateTime
+\row \o \l variant \o \c undefined \o QVariant
\endtable
QML object types can also be used as property types. This includes
@@ -776,6 +776,10 @@ property MyCustomType customProperty
Such object-type properties default to an \c undefined value.
+It is also possible to store a copy of a JavaScript object using the \c variant
+property type. This creates some restrictions on how the property should be used;
+see the \l {variant}{variant type documentation} for details.
+
\l{list}{List properties} are created with the \c list<Type> syntax, and default to an empty
list:
@@ -786,8 +790,6 @@ property list<Item> listOfItems
Note that list properties cannot be modified like ordinary JavaScript
arrays. See the \l {list}{list type documentation} for details.
-For details about accessing and manipulating QML properties from C++, see \l {Using QML with C++}.
-
\section2 Property change signals
diff --git a/doc/src/declarative/focus.qdoc b/doc/src/declarative/focus.qdoc
index 2e74fe0..ae72c3c 100644
--- a/doc/src/declarative/focus.qdoc
+++ b/doc/src/declarative/focus.qdoc
@@ -31,7 +31,7 @@
\title Keyboard Focus in QML
When a key is pressed or released, a key event is generated and delivered to the
-focused QML \l Item. To facilitate the construction of reusable components
+focused QML \l Item. To facilitate the construction of reusable components
and to address some of the cases unique to fluid user interfaces, the QML items add a
\e scope based extension to Qt's traditional keyboard focus model.
@@ -42,27 +42,21 @@ and to address some of the cases unique to fluid user interfaces, the QML items
When the user presses or releases a key, the following occurs:
\list 1
\o Qt receives the key action and generates a key event.
-\o If the Qt widget containing the \l QDeclarativeView has focus, the key event is delivered to it. Otherwise, regular Qt key handling continues.
-\o The key event is delivered by the scene to the QML \l Item with \e {active focus}. If no \l Item has \e {active focus}, the key event is \l {QEvent::ignore()}{ignored} and regular Qt key handling continues.
-\o If the QML \l Item with \e {active focus} accepts the key event, propagation stops. Otherwise the event is "bubbled up", by recursively passing it to each \l Item's parent until either the event is accepted, or the root \l Item is reached.
-
-If the \c {Rectangle} element in the following example has active focus and the \e A key is pressed,
-it will bubble up to its parent. However, pressing the \e B key will bubble up to the root
-item and thus subsequently be \l {QEvent::ignore()}{ignored}.
-
-\code
-Item {
- Item {
- Keys.onPressed: {
- if (event.key == Qt.Key_A) {
- console.log('Key A was pressed');
- event.accepted = true;
- }
- }
- Rectangle {}
- }
-}
-\endcode
+\o If the Qt widget containing the \l QDeclarativeView has focus, the key event
+is delivered to it. Otherwise, regular Qt key handling continues.
+\o The key event is delivered by the scene to the QML \l Item with
+\e {active focus}. If no Item has active focus, the key event is
+\l {QEvent::ignore()}{ignored} and regular Qt key handling continues.
+\o If the QML Item with active focus accepts the key event, propagation
+stops. Otherwise the event is "bubbled up", by recursively passing it to each
+Item's parent until either the event is accepted, or the root Item is reached.
+
+If the \c {Rectangle} element in the following example has active focus and the \c A key is pressed,
+it will bubble up to its parent. However, pressing the \c B key will bubble up to the root
+item and thus subsequently be ignored.
+
+\snippet doc/src/snippets/declarative/focus/rectangle.qml simple key event
+\snippet doc/src/snippets/declarative/focus/rectangle.qml simple key event end
\o If the root \l Item is reached, the key event is \l {QEvent::ignore()}{ignored} and regular Qt key handling continues.
@@ -72,232 +66,139 @@ See also the \l {Keys}{Keys attached property} and \l {KeyNavigation}{KeyNavigat
\section1 Querying the Active Focus Item
-Whether or not an \l Item has \e {active focus} can be queried through the
-property \c {Item::activeFocus}. For example, here we have a \l Text
-element whose text is determined by whether or not it has \e {active focus}.
+Whether or not an \l Item has active focus can be queried through the
+property \c {Item::activeFocus} property. For example, here we have a \l Text
+element whose text is determined by whether or not it has active focus.
-\code
-Text {
- text: activeFocus ? "I have active focus!" : "I do not have active focus"
-}
-\endcode
+\snippet doc/src/snippets/declarative/focus/rectangle.qml active focus
\section1 Acquiring Focus and Focus Scopes
-An \l Item requests focus by setting the \c {Item::focus} property to true.
-
-For very simple cases simply setting the \c {Item::focus} property is sometimes
-sufficient. If we run the following example with the \l {QML Viewer}, we see that
-the \c {keyHandler} element has \e {active focus} and pressing the 'A', 'B'
-or 'C' keys modifies the text appropriately.
-
-\table
-\row
-\o \code
- Rectangle {
- color: "lightsteelblue"; width: 240; height: 25
- Text { id: myText }
- Item {
- id: keyHandler
- focus: true
- Keys.onPressed: {
- if (event.key == Qt.Key_A)
- myText.text = 'Key A was pressed'
- else if (event.key == Qt.Key_B)
- myText.text = 'Key B was pressed'
- else if (event.key == Qt.Key_C)
- myText.text = 'Key C was pressed'
- }
- }
- }
-\endcode
-\o \image declarative-qmlfocus1.png
-\endtable
-
-However, were the above example to be used as a self-contained component, this
-simple use of the \c {Item::focus} property is no longer sufficient. The left
-hand side of the following table shows what we would like to be able to write.
-Here we create two instances of our previously defined component, and set the
-second one to have focus. The intention is that when the \e A, \e B, or \e C
-keys are pressed, the second of the two components receives the event and
+An \l Item requests focus by setting the \c focus property to \c true.
+
+For very simple cases simply setting the \c focus property is sometimes
+sufficient. If we run the following example with the \l {QML Viewer}, we see that
+the \c {keyHandler} element has active focus and pressing the \c A, \c B,
+or \c C keys modifies the text appropriately.
+
+\snippet doc/src/snippets/declarative/focus/basicwidget.qml focus true
+
+\image declarative-qmlfocus1.png
+
+However, were the above example to be used as a reusable or imported component,
+this simple use of the \c focus property is no longer sufficient.
+
+To demonstrate, we create two instances of our previously defined component and
+set the first one to have focus. The intention is that when the \c A, \c B, or
+\c C keys are pressed, the first of the two components receives the event and
responds accordingly.
-\table
-\row
-\o \code
-Rectangle {
- color: "red"; width: 240; height: 55
- MyWidget {}
- MyWidget { y: 30; focus: true }
-}
-\endcode
-\o \code
-Rectangle {
- color: "red"; width: 240; height: 55
- Rectangle {
- color: "lightsteelblue"; width: 240; height: 25
- Text { id: myText }
- Item {
- id: keyHandler
- focus: true
- Keys.onPressed: {
- if (event.key == Qt.Key_A)
- myText.text = 'Key A was pressed'
- else if (event.key == Qt.Key_B)
- myText.text = 'Key B was pressed'
- else if (event.key == Qt.Key_C)
- myText.text = 'Key C was pressed'
- }
- }
- }
- Rectangle {
- y: 30; focus: true
- color: "lightsteelblue"; width: 240; height: 25
- Text { id: myText }
- Item {
- id: keyHandler
- focus: true
- Keys.onPressed: {
- if (event.key == Qt.Key_A)
- myText.text = 'Key A was pressed'
- else if (event.key == Qt.Key_B)
- myText.text = 'Key B was pressed'
- else if (event.key == Qt.Key_C)
- myText.text = 'Key C was pressed'
- }
- }
- }
-}
-\endcode
-\endtable
-
-The right hand side of the example shows the expanded code - the equivalent QML
-without the use of the component \c {MyWidget}. From this, the problem is
-evident - there are no less than three elements that have the \c {Item::focus}
-property set to true. Ultimately only one element can have keyboard focus, and the
-system has to decide which on. In this case the first appearance of the
-\c {Item::focus} property being set to true on line 4 is selected, and the value
-of \c {Item::focus} in the other two instances is reverted back to false. This
-is exactly the opposite of what was wanted!
-
-This problem is fundamentally one of visibility. The \c {MyWidget}
-components each set their \c {keyHandler} Items as focused as that is all they can
-do - they don't know how they are going to be used, but they do know that when
-they're in use their \c {keyHandler} element is what needs focus. Likewise
-the code that uses the two \c {MyWidgets} sets the second \c {MyWidget} as
-focused. While it doesn't know exactly how the \c {MyWidget} is
-implemented, it knows that it wants the second one to be focused. This allows us
-to achieve encapsulation, allowing each widget to focus on it's appropriate behaviour
-itself.
-
-To solve this problem - allowing components to care about what they know about
-and ignore everything else - the QML items introduce a concept known as a
-\e {focus scope}. For existing Qt users, a \e {focus scope} is like an
-automatic focus proxy. A \e {focus scope} is created using the \l FocusScope
-element.
-
-In the next example, a \l FocusScope is added to the component, and the visual
-result shown.
-
-\table
-\row
-\o \code
-FocusScope {
- width: 240; height: 25
- Rectangle {
- color: "lightsteelblue"; width: 240; height: 25
- Text { id: myText }
- Item {
- id: keyHandler
- focus: true
- Keys.onPressed: {
- if (event.key == Qt.Key_A)
- myText.text = 'Key A was pressed'
- else if (event.key == Qt.Key_B)
- myText.text = 'Key B was pressed'
- else if (event.key == Qt.Key_C)
- myText.text = 'Key C was pressed'
- }
- }
- }
-}
-\endcode
-\o \image declarative-qmlfocus2.png
-\endtable
+The code that imports and creates two MyWidget instances:
+\snippet doc/src/snippets/declarative/focus/widget.qml window
+
+The MyWidget code:
+\snippet doc/src/snippets/declarative/focus/mywidget.qml mywidget
+
+We would like to have the first MyWidget object to have the focus by setting its
+\c focus property to \c true. However, by running the code, we can confirm that
+the second widget receives the focus.
+
+\image declarative-qmlfocus2.png
+
+Looking at both \c MyWidget and \c window code, the problem is evident - there
+are three elements that set the \c focus property set to \c true. The two
+MyWidget sets the \c focus to \c true and the \c window component also sets the
+focus. Ultimately, only one element can have keyboard focus, and the system has
+to decide which element receives the focus. When the second MyWidget is created,
+it receives the focus because it is the last element to set its \c focus
+property to \c true.
+
+This problem is due to visibility. The \c MyWidget component would like to have
+the focus, but it cannot control the focus when it is imported or reused.
+Likewise, the \c window component does not have the ability to know if its
+imported components are requesting the focus.
+
+To solve this problem, the QML introduces a concept known as a \e {focus scope}.
+For existing Qt users, a focus scope is like an automatic focus proxy.
+A focus scope is created by declaring the \l FocusScope element.
+
+In the next example, a \l FocusScope element is added to the component, and the
+visual result shown.
+
+\snippet doc/src/snippets/declarative/focus/myfocusscopewidget.qml widget in focusscope
+
+\image declarative-qmlfocus3.png
+
Conceptually \e {focus scopes} are quite simple.
\list
-\o Within each \e {focus scope} one element may have \c {Item::focus} set to true.
-If more than one \l Item has the \c {Item::focus} property set, the first is selected
-and the others are unset, just like when there are no \e {focus scopes}.
-\o When a \e {focus scope} receives \e {active focus}, the contained element with
-\c {Item::focus} set (if any) also gets \e {active focus}. If this element is
-also a \l FocusScope, the proxying behaviour continues. Both the
-\e {focus scope} and the sub-focused item will have \c {Item::activeFocus} set.
+\o Within each focus scope one element may have \c {Item::focus} set to
+\c true. If more than one \l Item has the \c focus property set, the
+last element to set the \c focus will have the focus and the others are unset,
+similar to when there are no focus scopes.
+\o When a focus scope receives active focus, the contained element with
+\c focus set (if any) also gets the active focus. If this element is
+also a \l FocusScope, the proxying behavior continues. Both the
+focus scope and the sub-focused item will have \c activeFocus property set.
\endlist
-So far the example has the second component statically selected. It is trivial
+Note that, since the FocusScope element is not a visual element, the properties
+of its children need to be exposed to the parent item of the FocusScope. Layouts
+and positioning elements will use these visual and styling properties to create
+the layout. In our example, the \c Column element cannot display the two widgets
+properly because the FocusScope lacks visual properties of its own. The MyWidget
+component directly binds to the \c rectangle properties to allow the \c Column
+element to create the layout containing the children of the FocusScope.
+
+So far, the example has the second component statically selected. It is trivial
now to extend this component to make it clickable, and add it to the original
-application. We still set a one of the widgets as focused by default, but from
-then on clicking the either one gives it focus.
-
-\table
-\row
-\o \code
-Rectangle {
- color: "red"; width: 240; height: 55
- MyClickableWidget {}
- MyClickableWidget { y: 30; focus: true }
-}
-\endcode
-\o \code
-FocusScope {
- id: page; width: 240; height: 25
- MyWidget { focus: true }
- MouseArea { anchors.fill: parent; onClicked: { page.focus = true } }
-}
-\endcode
-\endtable
+application. We still set one of the widgets as focused by default.
+Now, clicking either MyClickableWidget gives it focus and the other widget
+loses the focus.
-\image declarative-qmlfocus3.png
+The code that imports and creates two MyClickableWidget instances:
+\snippet doc/src/snippets/declarative/focus/clickablewidget.qml clickable window
+
+The MyClickableWidget code:
+\snippet doc/src/snippets/declarative/focus/myclickablewidget.qml clickable in focusscope
-When a QML item explicitly relinquishes focus (by setting its
-\c {Item::focus} property to false while it has \e {active focus}), the system
-does not automatically select another element to receive focus. That is, it
-is possible for there to be no currently \e {active focus}.
+\image declarative-qmlfocus4.png
-See the \l{declarative/keyinteraction/focus}{Keyboard Focus example} for a
+When a QML \l Item explicitly relinquishes focus (by setting its
+\c focus property to \c false while it has active focus), the
+system does not automatically select another element to receive focus. That is,
+it is possible for there to be no currently active focus.
+
+See the \l{declarative/keyinteraction/focus}{Keyboard Focus example} for a
demonstration of moving keyboard focus between multiple areas using FocusScope
elements.
\section1 Advanced uses of Focus Scopes
-Focus scopes allow focus to allocation to be easily partitioned. Several
+Focus scopes allow focus to allocation to be easily partitioned. Several
QML items use it to this effect.
-\l ListView, for example, is itself a focus scope. Generally this isn't
+\l ListView, for example, is itself a focus scope. Generally this isn't
noticeable as \l ListView doesn't usually have manually added visual children.
By being a focus scope, \l ListView can focus the current list item without
-worrying about how that will effect the rest of the application. This allows
-the current item delegate to react to key presses.
+worrying about how that will effect the rest of the application. This allows the
+current item delegate to react to key presses.
-This contrived example shows how this works. Pressing the \c Return key will
+This contrived example shows how this works. Pressing the \c Return key will
print the name of the current list item.
-\table
-\row
-\o \snippet doc/src/snippets/declarative/focusscopes.qml 0
-\o \image declarative-qmlfocus4.png
-\endtable
+\snippet doc/src/snippets/declarative/focus/advancedFocus.qml FocusScope delegate
+
+\image declarative-qmlfocus5.png
-While the example is simple, there's a lot going on behind the scenes. Whenever
+While the example is simple, there are a lot going on behind the scenes. Whenever
the current item changes, the \l ListView sets the delegate's \c {Item::focus}
-property. As the \l ListView is a \e {focus scope}, this doesn't effect the
-rest of the application. However, if the \l ListView itself has
-\e {active focus} this causes the delegate itself to receive \e {active focus}.
-In this example, the root element of the delegate is also a \e {focus scope},
-which in turn gives \e {active focus} to the \c {Text} element that
-actually performs the work of handling the \e {Return} key.
+property. As the \l ListView is a focus scope, this doesn't affect the
+rest of the application. However, if the \l ListView itself has
+active focus this causes the delegate itself to receive active focus.
+In this example, the root element of the delegate is also a focus scope,
+which in turn gives active focus to the \c {Text} element that actually performs
+the work of handling the \c {Return} key.
All of the QML view classes, such as \l PathView and \l GridView, behave
in a similar manner to allow key handling in their respective delegates.
diff --git a/doc/src/declarative/modules.qdoc b/doc/src/declarative/modules.qdoc
index bf9f5fd..8d23170 100644
--- a/doc/src/declarative/modules.qdoc
+++ b/doc/src/declarative/modules.qdoc
@@ -31,14 +31,14 @@
\section1 QML Modules
-A module is a set of QML content files that can be imported as a unit into a QML
+A module is a set of QML content files that can be imported as a unit into a QML
application. Modules can be used to organize QML content into independent units,
-and they can use a versioning mechanism that allows for independent
+and they can use a versioning mechanism that allows for independent
upgradability of the modules.
While QML component files within the same directory are automatically accessible
-within the global namespace, components defined elsewhere must be imported
-explicitly using the \c import statement to import them as modules. For
+within the global namespace, components defined elsewhere must be imported
+explicitly using the \c import statement to import them as modules. For
example, an \c import statement is required to use:
\list
@@ -54,13 +54,13 @@ This can be seen in the snippet commonly found at the top of QML files:
\qml
import QtQuick 1.0
\endqml
-
-This imports version 4.7 of the "Qt" module into the global namespace. (The QML
+
+This imports version 1.0 of the "QtQuick" module into the global namespace. (The QML
library itself must be imported to use any of the \l {QML Elements}, as they
are not included in the global namespace by default.)
-The \c Qt module is an \e installed module; it is found in the
-\l{The QML import path}{import path}. There are two types of QML modules:
+The \c Qt module is an \e installed module; it is found in the
+\l{The QML import path}{import path}. There are two types of QML modules:
location modules (defined by a URL) and installed modules (defined by a URI).
@@ -87,8 +87,8 @@ directory using a relative or absolute path, like this:
MyQMLProject
|- MyComponents
|- Slider.qml
- |- CheckBox.qml
- |- Main
+ |- CheckBox.qml
+ |- Main
|- application.qml
\endcode
@@ -112,7 +112,7 @@ be imported like this:
Remote location modules must have a \l{Writing a qmldir file}{qmldir file} in the
same directory to specify which QML files should be made available. See the
-\l {#qmldirexample}{example} below. The qmldir file is optional for modules on
+\l {#qmldirexample}{example} below. The qmldir file is optional for modules on
the local filesystem.
@@ -121,8 +121,8 @@ the local filesystem.
Installed modules are modules that are installed on the
-local filesystem within the QML import path, or modules defined in C++
-application code. When importing an installed module, an un-quoted URI is
+local filesystem within the QML import path, or modules defined in C++
+application code. When importing an installed module, an un-quoted URI is
used, with a mandatory version number:
\code
@@ -131,7 +131,7 @@ used, with a mandatory version number:
\endcode
Installed modules that are installed into the import path or created
-as a \l{QDeclarativeExtensionPlugin}{QML C++ plugin} must define a
+as a \l{QDeclarativeExtensionPlugin}{QML C++ plugin} must define a
\l{Writing a qmldir file}{qmldir file}.
@@ -142,7 +142,7 @@ The default import path includes:
\list
\o The directory of the current file
-\o The location specified by QLibraryInfo::ImportsPath
+\o The location specified by QLibraryInfo::ImportsPath
\o Paths specified by the \c QML_IMPORT_PATH environment variable
\endlist
@@ -153,10 +153,10 @@ When running the \l {QML Viewer}, use the \c -I option to add paths to the impor
\section2 Creating installed modules in C++
-C++ applications can dynamically define installed modules using
-qmlRegisterType().
+C++ applications can dynamically define installed modules using
+qmlRegisterType().
-For \l{QDeclarativeExtensionPlugin}{QML C++ plugins}, the
+For \l{QDeclarativeExtensionPlugin}{QML C++ plugins}, the
module URI is automatically passed to QDeclarativeExtensionPlugin::registerTypes().
The QDeclarativeExtensionPlugin documentation shows how to use this URI
to call qmlRegisterType() to enable the plugin library to be built as
@@ -167,7 +167,7 @@ in QML, like this:
import com.nokia.TimeExample 1.0
\endcode
-A \l{QDeclarativeExtensionPlugin}{QML C++ plugin} also requires a
+A \l{QDeclarativeExtensionPlugin}{QML C++ plugin} also requires a
\l{Writing a qmldir file}{qmldir file} to make it available to the
QML engine.
@@ -190,9 +190,9 @@ Types from these modules can then only be used when qualified by the namespace:
\qml
QtLibrary.Rectangle { ... }
-
+
MyComponents.Slider { ... }
-
+
MyModule.SomeComponent { ... }
\endqml
@@ -209,7 +209,7 @@ JavaScript files must always be imported with a named import:
\qml
import "somescript.js" as MyScript
-
+
Item {
//...
Component.onCompleted: MyScript.doSomething()
@@ -222,8 +222,8 @@ Unlike ordinary modules, multiple scripts cannot be imported into the same names
\section1 Writing a qmldir file
-A \c qmldir file is a metadata file for a module that maps all type names in
-the module to versioned QML files. It is required for installed modules, and
+A \c qmldir file is a metadata file for a module that maps all type names in
+the module to versioned QML files. It is required for installed modules, and
location modules that are loaded from a network source.
It is defined by a plain text file named "qmldir" that contains one or more lines of the form:
@@ -239,7 +239,7 @@ plugin <Name> [<Path>]
\bold {<TypeName> [<InitialVersion>] <File>} lines are used to add QML files as types.
<TypeName> is the type being made available, the optional <InitialVersion> is a version
-number, and <File> is the (relative) file name of the QML file defining the type.
+number, and <File> is the (relative) file name of the QML file defining the type.
Installed files do not need to import the module of which they are a part, as they can refer
to the other QML files in the module as relative (local) files, but
@@ -266,10 +266,10 @@ provide those identifiers.
\bold {plugin <Name> [<Path>]} lines are used to add \l{QDeclarativeExtensionPlugin}{QML C++ plugins} to the module. <Name> is the name of the library. It is usually not the same as the file name
of the plugin binary, which is platform dependent; e.g. the library \c MyAppTypes would produce
-\c libMyAppTypes.so on Linux and \c MyAppTypes.dll on Windows.
+\c libMyAppTypes.so on Linux and \c MyAppTypes.dll on Windows.
<Path> is an optional argument specifying either an absolute path to the directory containing the
-plugin file, or a relative path from the directory containing the \c qmldir file to the directory
+plugin file, or a relative path from the directory containing the \c qmldir file to the directory
containing the plugin file. By default the engine searches for the plugin library in the directory that contains the \c qmldir
file. The plugin search path can be queried with QDeclarativeEngine::pluginPathList() and modified using QDeclarativeEngine::addPluginPath(). When running the \l {QML Viewer}, use the \c -P option to add paths to the plugin search path.
@@ -277,7 +277,7 @@ file. The plugin search path can be queried with QDeclarativeEngine::pluginPathL
\target qmldirexample
\section2 Example
-If the components in the \c MyComponents directory from the
+If the components in the \c MyComponents directory from the
\l{Location Modules}{earlier example} were to be made available as a network resource,
the directory would need to contain a \c qmldir file similar to this:
@@ -286,7 +286,7 @@ ComponentA 1.0 ComponentA.qml
ComponentB 1.0 ComponentB.qml
\endcode
-The \c MyComponents directory could then be imported as a module using:
+The \c MyComponents directory could then be imported as a module using:
\code
import "http://the-server-name.com/MyComponents"
@@ -300,15 +300,15 @@ a later version is used, as the \c qmldir file specifies that these elements
are only available in the 1.0 version.
-For examples of \c qmldir files for plugins, see the
-\l {declarative/cppextensions/plugins}{Plugins} example and
+For examples of \c qmldir files for plugins, see the
+\l {declarative/cppextensions/plugins}{Plugins} example and
\l {Tutorial: Writing QML extensions with C++}.
\section1 Debugging
The \c QML_IMPORT_TRACE environment variable can be useful for debugging
-when there are problems with finding and loading modules. See
+when there are problems with finding and loading modules. See
\l{Debugging module imports} for more information.
diff --git a/doc/src/declarative/qdeclarativereference.qdoc b/doc/src/declarative/qdeclarativereference.qdoc
deleted file mode 100644
index c2c5e91..0000000
--- a/doc/src/declarative/qdeclarativereference.qdoc
+++ /dev/null
@@ -1,81 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Free Documentation License
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of this
-** file.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page qdeclarativereference.html
- \title QML Reference
-
- \target qtdeclarativemainpage
-
- QML is a language for building the animation rich,
- highly fluid user interfaces that are becoming common in portable consumer
- electronics devices such as mobile phones, media players, set-top boxes and
- netbooks. It is also appropriate for highly custom desktop
- user interfaces, or special elements in more traditional desktop user interfaces.
-
- Building fluid applications is done declaratively, rather than procedurally.
- That is, you specify \e what the UI should look like and how it should behave
- rather than specifying step-by-step \e how to build it. Specifying a UI declaratively
- does not just include the layout of the interface items, but also the way each
- individual item looks and behaves and the overall flow of the application.
-
- The QML elements provide a sophisticated set of graphical and behavioral building
- blocks. These different elements are combined together in \l {QML Documents}{QML documents} to build components
- ranging in complexity from simple buttons and sliders, to complete
- internet-enabled applications like a \l {http://www.flickr.com}{Flickr} photo browser.
-
- Getting Started:
- \list
- \o \l {Introduction to the QML language}
- \o \l {QML Tutorial}{Tutorial: 'Hello World'}
- \o \l {QML Advanced Tutorial}{Advanced Tutorial: 'Same Game'}
- \o \l {QML Examples and Demos}
- \endlist
-
- \section1 Core QML Features:
- \list
- \o \l {QML Documents}
- \o \l {Property Binding}
- \o \l {Integrating JavaScript}
- \o \l {QML Scope}
- \o \l {Network Transparency}
- \o \l {qmlmodels}{Data Models}
- \o \l {anchor-layout}{Anchor-based Layout}
- \o \l {qmlstates}{States}
- \o \l {qdeclarativeanimation.html}{Animation}
- \o \l {qdeclarativemodules.html}{Modules}
- \o \l {qmlfocus}{Keyboard Focus}
- \o \l {Extending types from QML}
- \endlist
-
- QML Reference:
- \list
- \o \l {elements}{QML Elements}
- \o \l {QML Global Object}
- \o \l {QML Internationalization}
- \endlist
-*/
diff --git a/doc/src/development/qtestlib.qdoc b/doc/src/development/qtestlib.qdoc
index e53957f..08fdfc6 100644
--- a/doc/src/development/qtestlib.qdoc
+++ b/doc/src/development/qtestlib.qdoc
@@ -245,10 +245,10 @@
\endtable
In short, walltime is always available but requires many repetitions to
- get a useful result.
- Tick counters are usually available and can provide
- results with fewer repetitions, but can be susceptible to CPU frequency
- scaling issues.
+ get a useful result.
+ Tick counters are usually available and can provide
+ results with fewer repetitions, but can be susceptible to CPU frequency
+ scaling issues.
Valgrind provides exact results, but does not take
I/O waits into account, and is only available on a limited number of
platforms.
@@ -264,7 +264,7 @@
See the chapter 5 in the \l{QTestLib Tutorial} for more benchmarking examples.
\section1 Using QTestLib remotely on Windows CE
- \c cetest is a convenience application which helps the user to launch an
+ \c cetest is a convenience application which helps the user to launch an
application remotely on a Windows CE device or emulator.
It needs to be executed after the unit test has been successfully compiled.
@@ -717,15 +717,15 @@
\section1 Writing a Benchmark
To create a benchmark we extend a test function with a QBENCHMARK macro.
- A benchmark test function will then typically consist of setup code and
+ A benchmark test function will then typically consist of setup code and
a QBENCHMARK macro that contains the code to be measured. This test
function benchmarks QString::localeAwareCompare().
\snippet examples/qtestlib/tutorial5/benchmarking.cpp 0
- Setup can be done at the beginning of the function, the clock is not
+ Setup can be done at the beginning of the function, the clock is not
running at this point. The code inside the QBENCHMARK macro will be
- measured, and possibly repeated several times in order to get an
+ measured, and possibly repeated several times in order to get an
accurate measurement.
Several \l {testlib-benchmarking-measurement}{back-ends} are available
@@ -733,7 +733,7 @@
\section1 Data Functions
- Data functions are useful for creating benchmarks that compare
+ Data functions are useful for creating benchmarks that compare
multiple data inputs, for example locale aware compare against standard
compare.
@@ -743,20 +743,19 @@
\snippet examples/qtestlib/tutorial5/benchmarking.cpp 2
- The "if(useLocaleCompare)" switch is placed outside the QBENCHMARK
+ The "if(useLocaleCompare)" switch is placed outside the QBENCHMARK
macro to avoid measuring its overhead. Each benchmark test function
- can have one active QBENCHMARK macro.
+ can have one active QBENCHMARK macro.
\section1 External Tools
Tools for handling and visualizing test data are available as part of
- the qtestlib-tools project on the
- \l{http://labs.qt.nokia.com/}{http://labs.qt.nokia.com/}Qt Labs Web site.
+ the \l {qtestlib-tools} project in the \l{Qt Labs} web site.
These include a tool for comparing performance data obtained from test
runs and a utility to generate Web-based graphs of performance data.
- See the \l{qtestlib-tools Announcement} for more information on these
- tools and a simple graphing example.
+ See the \l{qtestlib-tools Announcement}{qtestlib-tools announcement}
+ for more information on these tools and a simple graphing example.
*/
diff --git a/doc/src/examples/diagramscene.qdoc b/doc/src/examples/diagramscene.qdoc
index 98bc983..d5cc4e3 100644
--- a/doc/src/examples/diagramscene.qdoc
+++ b/doc/src/examples/diagramscene.qdoc
@@ -195,7 +195,7 @@
This function returns a QWidget containing a QToolButton with
an image of one of the \c DiagramItems, i.e., flowchart shapes.
The image is created by the \c DiagramItem through the \c image()
- function. The QButtonGroup class lets us attach a QVariant with
+ function. The QButtonGroup class lets us attach an id (int) with
each button; we store the diagram's type, i.e., the
DiagramItem::DiagramType enum. We use the stored diagram type when
we create new diagram items for the scene. The widgets created
diff --git a/doc/src/external-resources.qdoc b/doc/src/external-resources.qdoc
index 8eeaeb1..9bc3b1c 100644
--- a/doc/src/external-resources.qdoc
+++ b/doc/src/external-resources.qdoc
@@ -448,3 +448,8 @@
\externalpage https://developer.mozilla.org/en/JavaScript/About_JavaScript
\title About JavaScript
*/
+
+/*!
+ \externalpage http://www.libusb.org/
+ \title libusb
+*/
diff --git a/doc/src/frameworks-technologies/threads.qdoc b/doc/src/frameworks-technologies/threads.qdoc
index 001b29d..2a0cc1a 100644
--- a/doc/src/frameworks-technologies/threads.qdoc
+++ b/doc/src/frameworks-technologies/threads.qdoc
@@ -213,10 +213,10 @@
/*!
\page threads-reentrancy.html
\title Reentrancy and Thread-Safety
-
+
\keyword reentrant
\keyword thread-safe
-
+
\previouspage Synchronizing Threads
\contentspage Thread Support in Qt
\nextpage Threads and QObjects
@@ -243,6 +243,15 @@
from multiple threads, even if all the threads use the \e{same}
instance of the class.
+ \note Qt classes are only documented as \e{thread-safe} if they
+ are intended to be used by multiple threads. If a function is not
+ marked as thread-safe or reentrant, it should not be used from
+ different threads. If a class is not marked as thread-safe or
+ reentrant then a specific instance of that class should not be
+ accessed from different threads.
+
+ \section1 Reentrancy
+
C++ classes are often reentrant, simply because they only access
their own member data. Any thread can call a member function on an
instance of a reentrant class, as long as no other thread can call
@@ -268,6 +277,8 @@
end up overwriting each other, and the variable is incremented
only once!
+ \section1 Thread-Safety
+
Clearly, the access must be serialized: Thread A must perform
steps 1, 2, 3 without interruption (atomically) before thread B
can perform the same steps; or vice versa. An easy way to make
@@ -284,6 +295,8 @@
declared with the \c mutable qualifier because we need to lock
and unlock the mutex in \c value(), which is a const function.
+ \section1 Notes on Qt Classes
+
Many Qt classes are \e{reentrant}, but they are not made
\e{thread-safe}, because making them thread-safe would incur the
extra overhead of repeatedly locking and unlocking a QMutex. For
@@ -297,9 +310,6 @@
the thread-related classes (e.g. QMutex) and fundamental functions
(e.g. QCoreApplication::postEvent()).
- \note Qt Classes are only documented as \e{thread-safe} if they
- are intended to be used by multiple threads.
-
\note Terminology in the multithreading domain isn't entirely
standardized. POSIX uses definitions of reentrant and thread-safe
that are somewhat different for its C APIs. When using other
diff --git a/doc/src/getting-started/gettingstartedqml.qdoc b/doc/src/getting-started/gettingstartedqml.qdoc
index b767587..e3977bb 100644
--- a/doc/src/getting-started/gettingstartedqml.qdoc
+++ b/doc/src/getting-started/gettingstartedqml.qdoc
@@ -148,7 +148,7 @@
\code
Rectangle {
- id:Button
+ id: button
...
property color buttonColor: "lightblue"
diff --git a/doc/src/getting-started/installation.qdoc b/doc/src/getting-started/installation.qdoc
index a68310c..aa10aaf 100644
--- a/doc/src/getting-started/installation.qdoc
+++ b/doc/src/getting-started/installation.qdoc
@@ -684,7 +684,7 @@ Binary Package} document.
We hope you will enjoy using Qt.
*/
-/*! \page install-Symbian-linux.html
+/*! \page install-symbian-linux.html
\title Installing Qt for the Symbian platform using Linux (experimental)
\ingroup installation
\ingroup qtsymbian
diff --git a/doc/src/images/declarative-qmlfocus1.png b/doc/src/images/declarative-qmlfocus1.png
new file mode 100644
index 0000000..317b34b
--- /dev/null
+++ b/doc/src/images/declarative-qmlfocus1.png
Binary files differ
diff --git a/doc/src/images/declarative-qmlfocus2.png b/doc/src/images/declarative-qmlfocus2.png
new file mode 100644
index 0000000..e3f9643
--- /dev/null
+++ b/doc/src/images/declarative-qmlfocus2.png
Binary files differ
diff --git a/doc/src/images/declarative-qmlfocus3.png b/doc/src/images/declarative-qmlfocus3.png
new file mode 100644
index 0000000..a5897ce
--- /dev/null
+++ b/doc/src/images/declarative-qmlfocus3.png
Binary files differ
diff --git a/doc/src/images/declarative-qmlfocus4.png b/doc/src/images/declarative-qmlfocus4.png
new file mode 100644
index 0000000..f2e64cd
--- /dev/null
+++ b/doc/src/images/declarative-qmlfocus4.png
Binary files differ
diff --git a/doc/src/images/declarative-qmlfocus5.png b/doc/src/images/declarative-qmlfocus5.png
new file mode 100644
index 0000000..ec7307b
--- /dev/null
+++ b/doc/src/images/declarative-qmlfocus5.png
Binary files differ
diff --git a/doc/src/legal/3rdparty.qdoc b/doc/src/legal/3rdparty.qdoc
index 8b3d5f2..9cc83a6 100644
--- a/doc/src/legal/3rdparty.qdoc
+++ b/doc/src/legal/3rdparty.qdoc
@@ -683,36 +683,57 @@
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
+
\hr
- jquery 1.4.2.js Copyright 2010 John Resig
- This software is dual licensed under the MIT or GPL version 2 licenses.
- Nokia has used the software herein under the MIT license.
-
- jquery includes Sizzle.js Copyright 2010 The Dojo Foundaton and is
- licensed under the MIT, BSD and GPL licenses. Nokia has used this
- software herein under the MIT license.
-
- The MIT License
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
-
-
+ jquery 1.4.2.js Copyright 2010 John Resig
+ This software is dual licensed under the MIT or GPL version 2 licenses.
+ Nokia has used the software herein under the MIT license.
+
+ jquery includes Sizzle.js Copyright 2010 The Dojo Foundaton and is
+ licensed under the MIT, BSD and GPL licenses. Nokia has used this
+ software herein under the MIT license.
+
+ The MIT License
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+
+
+ \section1 The Public Suffix List
+
+ \e{The Public Suffix List is an initiative of the Mozilla Project, but is
+ maintained as a community resource. It is available for use in any
+ software, but was originally created to meet the needs of browser
+ manufacturers. It allows browsers to, for example:}
+ \list
+ \o \e{Avoid privacy-damaging "supercookies" being set for high-level
+ domain name suffixes}
+ \o \e{Highlight the most important part of a domain name in the user
+ interface}
+ \o \e{Accurately sort history entries by site}
+ \endlist
+ -- quoted from \l{publicsuffix.org}.
+
+ The public suffix list is used inside Qt to avoid such "supercookies"
+ mentioned above being set in the cookie jar supported by Qt (by the
+ QNetworkCookieJar class).
+
+ See \c src/network/access/qnetworkcookiejartlds_p.h.INFO for more
+ information about how the list is used.
*/
diff --git a/doc/src/network-programming/bearermanagement.qdoc b/doc/src/network-programming/bearermanagement.qdoc
index 98de5bf..12da55b 100644
--- a/doc/src/network-programming/bearermanagement.qdoc
+++ b/doc/src/network-programming/bearermanagement.qdoc
@@ -26,11 +26,11 @@
****************************************************************************/
/*!
- \page bearer-management.html
+\page bearer-management.html
- \title Bearer Management
- \ingroup qt-network
- \brief An API to control the system's connectivity state.
+\title Bearer Management
+\ingroup qt-network
+\brief An API to control the system's connectivity state.
Bearer Management controls the connectivity state of the system so that
the user can start or stop interfaces or roam transparently between
diff --git a/doc/src/platforms/platform-notes.qdoc b/doc/src/platforms/platform-notes.qdoc
index 177d3f6..b745867 100644
--- a/doc/src/platforms/platform-notes.qdoc
+++ b/doc/src/platforms/platform-notes.qdoc
@@ -81,14 +81,11 @@
\header \o \o Concurrent \o XmlPatterns \o WebKit(*) \o CLucene \o Phonon
\row \o g++ 3.3 \o \o \bold{X} \o \o \bold{X} \o \bold{X}
\row \o g++ 3.4 and up \o \bold{X} \o \bold{X} \o \bold{X} \o \bold{X} \o \bold{X}
- \row
\row \o SunCC 5.5 \o \o \o \o \bold{X} \o \bold{X}
- \row
\row \o aCC series 3 \o \o \o \o \bold{X} \o \bold{X}
\row \o aCC series 6 \o \bold{X} \o \bold{X} \o \bold{X} \o \bold{X} \o \bold{X}
\row \o xlC 6 \o \o \o \o \bold{X} \o \bold{X}
\row \o Intel CC 10 \o \bold{X} \o \bold{X} \o \bold{X} \o \bold{X} \o \bold{X}
- \row
\row \o MSVC 2003 \o \bold{X} \o \bold{X} \o \o \bold{X} \o \bold{X}
\row \o MSVC 2005 and up \o \bold{X} \o \bold{X} \o \bold{X} \o \bold{X} \o \bold{X}
\endtable
diff --git a/doc/src/qt-webpages.qdoc b/doc/src/qt-webpages.qdoc
index 05817df..0a03157 100644
--- a/doc/src/qt-webpages.qdoc
+++ b/doc/src/qt-webpages.qdoc
@@ -201,11 +201,6 @@
*/
/*!
- \externalpage http://labs.qt.nokia.com/gitweb?p=qtestlib-tools;a=summary
- \title qtestlib-tools
-*/
-
-/*!
\externalpage http://qt.nokia.com/products/library/modular-class-library#info_scripting
\title Qt Script for Applications (QSA)
*/
@@ -239,3 +234,13 @@
\externalpage http://get.qt.nokia.com/nokiasmartinstaller/
\title Smart Installer
*/
+
+/*!
+ \externalpage http://qt.gitorious.org/qt-labs/qtestlib-tools
+ \title qtestlib-tools
+*/
+
+/*!
+ \externalpage http://labs.qt.nokia.com
+ \title Qt Labs
+*/
diff --git a/doc/src/qt4-intro.qdoc b/doc/src/qt4-intro.qdoc
index 62decbb..7325e27 100644
--- a/doc/src/qt4-intro.qdoc
+++ b/doc/src/qt4-intro.qdoc
@@ -60,7 +60,53 @@
\section1 Recent Additions to Qt 4
- The following features have been added to Qt since the first release of Qt 4:
+ The following features have been added to Qt since the first release of Qt 4.
+
+ In Qt 4.7:
+ \list
+ \o Declarative UI Development with \l{Qt Quick}, technologies for creating
+ fluid, dynamic user interfaces.
+ \o Support for \l{Bearer Management}{network bearer management}, enabling
+ features such as control over network interfaces and support for roaming
+ between networks.
+ \o Feature and performance improvements in QtWebKit, including a new tiled
+ backing store, control over scroll bars used in frames and framesets,
+ accelerated compositing and \l{The QtWebKit Bridge}{support for hybrid
+ development}.
+ \o General performance improvements, including the use of "alien widgets"
+ on Mac OS X, the QStaticText class for optimized text rendering, a new
+ \l{QPainter::drawPixmapFragments()}{API for rendering pixmap fragments}
+ and an updated version of the JavaScriptCore engine for the QtScript
+ module with improved performance.
+ \endlist
+
+ In Qt 4.6:
+ \list
+ \o Support for \l{The Symbian platform - Introduction to Qt}{the Symbian Platform}
+ as a mainstream Qt platform, with integration into the S60 framework.
+ \o The \l{The Animation Framework}{animation framework} allows animations to be
+ created using both widgets and graphics items.
+ \o The \l{The State Machine Framework}{state machine framework} provides a robust
+ state chart implementation based on Harel statecharts and SCXML.
+ \o Support for \l{QTouchEvent}{touch input} and \l{Gestures Programming}{gestures}
+ enable developers to create intuitive user interfaces for touch-based devices.
+ \o A \l{QWebElement}{DOM access API} for QtWebKit provides a cleaner and safer way
+ to access elements and structures of Web pages without the use of JavaScript.
+ \o A collection of performance improvements, covering QGraphicsView, QPixmapCache,
+ QNetworkAccessManager, QContiguousCache class, hardware-accelerated rendering
+ support through \l{OpenVG Rendering in Qt}{OpenVG}, and the removal of Win9x
+ support.
+ \o A collection of \l{QGraphicsEffect}{graphics effects} make it easy to apply
+ and simple effects to graphics items and combine them to produce more complex
+ effects.
+ \o Support for XML schema validation in the QtXmlPatterns module covering
+ large parts of version 1.0 of the specification.
+ \o Qt3D enablers, including math primitives for \l{QMatrix4x4}{matrix multiplication},
+ \l{QVector3D}{vectors}, \l{QQuaternion}{quaternions} (client-side), and an API
+ for \l{QGLShader}{vertex and fragment shaders}, GLSL/ES.
+ \o \l{QtMultimedia Module}{Multimedia services} providing low-level access to the
+ system's audio system.
+ \endlist
In Qt 4.5:
\list
@@ -209,7 +255,7 @@
\row \o \l{Qt3Support} \o Qt 3 support classes
\row \o \l{QAxContainer} \o ActiveQt client extension
\row \o \l{QAxServer} \o ActiveQt server extension
- \row \o \l{QtHelp} \o Classes for integrating online documentation
+ \row \o \l{QtHelp} \o Classes for integrating online documentation
\row \o \l{QtDesigner} \o Classes for extending and embedding Qt Designer
\row \o \l{QtUiTools} \o Classes for dynamic GUI generation
\row \o \l{QtTest} \o Tool classes for unit testing
@@ -451,7 +497,7 @@
A list of other Qt 4 features can be found on the \bold{\l{What's
New in Qt 4}} page.
- \section1 Declarative UI development with Qt Quick
+ \section1 Declarative UI Development with Qt Quick
\image quick_screens.png
@@ -508,7 +554,7 @@
For hybrid QtWebKit and C++ projects, Qt 4.7 has added support for
transporting \l{QPixmap}s between Qt C++ and WebKit. We have also
- improved the documentation hybrid development. Read more here:
+ improved the documentation for hybrid development. Read more here:
\l{The QtWebKit Bridge}.
\section1 QtWebKit Performance Benchmarks
@@ -680,7 +726,7 @@
See the QTouchEvent class documentation for more information on touch
input and QGestureEvent for gestures.
- \section1 DOM access API
+ \section1 DOM Access API
Web pages and XML both have very complex document object models.
The W3C selector API provides a very simple way to access and
@@ -699,7 +745,7 @@
\list
\o Rewritten the QGraphicsView rendering algorithm.
- \o Made QPixmapCache support efficient Key datastructure.
+ \o Made QPixmapCache support efficient Key data structure.
\o Reduced overhead in QNetworkAccessManager.
\o Added the QContiguousCache class, which provides efficient caching of
contiguous data.
@@ -740,7 +786,7 @@
See the \l{XML Processing} and QXmlSchema class documentation for more
information.
- \section1 Qt3D enablers
+ \section1 Qt3D Enablers
As more of Qt, and more of the applications built on Qt go 3D,
API's should be provided to simplify this. Mainly, the new API
@@ -750,7 +796,7 @@
The main features of the Qt3D enablers are currently: Math
primitives for matrix multiplication, vectors, quaternions
- (client-side), and API for vertex and fragment shaders, GLSL/ES.
+ (client-side), and an API for vertex and fragment shaders, GLSL/ES.
Future research will, among other things include stencils,
scissors, vertex buffers and arrays, texture manipulation, and
geometry shaders.
diff --git a/doc/src/snippets/declarative/codingconventions/private.qml b/doc/src/snippets/declarative/codingconventions/private.qml
new file mode 100644
index 0000000..1d3dda8
--- /dev/null
+++ b/doc/src/snippets/declarative/codingconventions/private.qml
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+//! [0]
+Item {
+ id: component
+ width: 40; height: 50
+ property real __area: width * height * 0.5 //not meant for outside use
+}
+//! [0]
diff --git a/doc/src/snippets/declarative/comments.qml b/doc/src/snippets/declarative/comments.qml
index a8e47ad..97659a5 100644
--- a/doc/src/snippets/declarative/comments.qml
+++ b/doc/src/snippets/declarative/comments.qml
@@ -38,7 +38,6 @@
**
****************************************************************************/
-//![0]
import QtQuick 1.0
//![0]
diff --git a/doc/src/snippets/declarative/focus/advancedFocus.qml b/doc/src/snippets/declarative/focus/advancedFocus.qml
new file mode 100644
index 0000000..274f54f
--- /dev/null
+++ b/doc/src/snippets/declarative/focus/advancedFocus.qml
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the FOO module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 1.0
+
+//! [FocusScope delegate]
+Rectangle {
+ color: "lightsteelblue"; width: 100; height: 50
+
+ ListView {
+ anchors.fill: parent
+ focus: true
+
+ model: ListModel {
+ ListElement { name: "Bob" }
+ ListElement { name: "John" }
+ ListElement { name: "Michael" }
+ }
+
+ delegate: FocusScope {
+ width: childrenRect.width; height: childrenRect.height
+ x:childrenRect.x; y: childrenRect.y
+ TextInput {
+ focus: true
+ text: name
+ Keys.onReturnPressed: console.log(name)
+ }
+ }
+ }
+}
+//! [FocusScope delegate]
diff --git a/doc/src/snippets/declarative/focus/basicwidget.qml b/doc/src/snippets/declarative/focus/basicwidget.qml
new file mode 100644
index 0000000..71e75ff
--- /dev/null
+++ b/doc/src/snippets/declarative/focus/basicwidget.qml
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the FOO module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 1.0
+
+//! [focus true]
+Rectangle {
+ color: "lightsteelblue"; width: 240; height: 25
+ Text { id: myText }
+ Item {
+ id: keyHandler
+ focus: true
+ Keys.onPressed: {
+ if (event.key == Qt.Key_A)
+ myText.text = 'Key A was pressed'
+ else if (event.key == Qt.Key_B)
+ myText.text = 'Key B was pressed'
+ else if (event.key == Qt.Key_C)
+ myText.text = 'Key C was pressed'
+ }
+ }
+}
+//! [focus true]
diff --git a/doc/src/snippets/declarative/focus/clickablewidget.qml b/doc/src/snippets/declarative/focus/clickablewidget.qml
new file mode 100644
index 0000000..34b0d87
--- /dev/null
+++ b/doc/src/snippets/declarative/focus/clickablewidget.qml
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the FOO module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 1.0
+
+//! [clickable window]
+Rectangle {
+ id: window
+
+ color: "white"; width: 240; height: 150
+
+ Column {
+ anchors.centerIn: parent; spacing: 15
+
+ MyClickableWidget {
+ focus: true //set this MyWidget to receive the focus
+ color: "lightblue"
+ }
+ MyClickableWidget {
+ color: "palegreen"
+ }
+ }
+
+}
+//! [clickable window]
diff --git a/doc/src/snippets/declarative/focus/focusColumn.qml b/doc/src/snippets/declarative/focus/focusColumn.qml
new file mode 100644
index 0000000..42ee3da
--- /dev/null
+++ b/doc/src/snippets/declarative/focus/focusColumn.qml
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 1.0
+
+Rectangle {
+ width: 200; height: 200
+
+ // Column {
+ FocusScope {
+ x: rect1.x; y:rect1.y; width: rect1.width; height: rect1.height
+ Rectangle {id: rect1; width: 50; height: 50; focus:true
+ color: focus ? "red":"blue"
+ }
+ Rectangle {id: rect2; width: 50; height: 50; focus:true
+ color: focus ? "red":"blue"
+ y: 75
+ }
+// }
+/*
+ FocusScope {
+ x: rect2.x; y:rect2.y; width: rect2.width; height: rect2.height
+ Rectangle {id: rect2; width: 50; height: 50; color: "red"}
+ }
+*/
+ }
+
+}
diff --git a/doc/src/snippets/declarative/focus/focusscopewidget.qml b/doc/src/snippets/declarative/focus/focusscopewidget.qml
new file mode 100644
index 0000000..48e5750
--- /dev/null
+++ b/doc/src/snippets/declarative/focus/focusscopewidget.qml
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the FOO module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 1.0
+
+//! [focusscope window]
+Rectangle {
+ id: window
+
+ color: "white"; width: 240; height: 150
+
+ Column {
+ anchors.centerIn: parent; spacing: 15
+
+ MyFocusScopeWidget {
+ focus: true //set this MyWidget to receive the focus
+ color: "lightblue"
+ }
+ MyFocusScopeWidget {
+ color: "palegreen"
+ }
+ }
+
+}
+//! [focusscope window]
diff --git a/doc/src/snippets/declarative/focus/myclickablewidget.qml b/doc/src/snippets/declarative/focus/myclickablewidget.qml
new file mode 100644
index 0000000..3294662
--- /dev/null
+++ b/doc/src/snippets/declarative/focus/myclickablewidget.qml
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the FOO module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 1.0
+
+//! [clickable in focusscope]
+FocusScope {
+
+ id: scope
+
+ //FocusScope needs to bind to visual properties of the children
+ property alias color: rectangle.color
+ x: rectangle.x; y: rectangle.y
+ width: rectangle.width; height: rectangle.height
+
+ Rectangle {
+ id: rectangle
+ anchors.centerIn: parent
+ color: "lightsteelblue"; width: 175; height: 25; radius: 10; smooth: true
+ Text { id: label; anchors.centerIn: parent }
+ focus: true
+ Keys.onPressed: {
+ if (event.key == Qt.Key_A)
+ label.text = 'Key A was pressed'
+ else if (event.key == Qt.Key_B)
+ label.text = 'Key B was pressed'
+ else if (event.key == Qt.Key_C)
+ label.text = 'Key C was pressed'
+ }
+ }
+ MouseArea { anchors.fill: parent; onClicked: { scope.focus = true } }
+}
+//! [clickable in focusscope]
diff --git a/doc/src/snippets/declarative/focus/myfocusscopewidget.qml b/doc/src/snippets/declarative/focus/myfocusscopewidget.qml
new file mode 100644
index 0000000..231ae3a
--- /dev/null
+++ b/doc/src/snippets/declarative/focus/myfocusscopewidget.qml
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the FOO module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 1.0
+
+//! [widget in focusscope]
+FocusScope {
+
+ //FocusScope needs to bind to visual properties of the children
+ property alias color: rectangle.color
+ x: rectangle.x; y: rectangle.y
+ width: rectangle.width; height: rectangle.height
+
+ Rectangle {
+ id: rectangle
+ anchors.centerIn: parent
+ color: "lightsteelblue"; width: 175; height: 25; radius: 10; smooth: true
+ Text { id: label; anchors.centerIn: parent }
+ focus: true
+ Keys.onPressed: {
+ if (event.key == Qt.Key_A)
+ label.text = 'Key A was pressed'
+ else if (event.key == Qt.Key_B)
+ label.text = 'Key B was pressed'
+ else if (event.key == Qt.Key_C)
+ label.text = 'Key C was pressed'
+ }
+ }
+}
+//! [widget in focusscope]
diff --git a/doc/src/snippets/declarative/focus/mywidget.qml b/doc/src/snippets/declarative/focus/mywidget.qml
new file mode 100644
index 0000000..bea723d
--- /dev/null
+++ b/doc/src/snippets/declarative/focus/mywidget.qml
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the FOO module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 1.0
+
+//! [mywidget]
+//MyWidget code
+Rectangle {
+ id: widget
+ color: "lightsteelblue"; width: 175; height: 25; radius: 10; smooth: true
+ Text { id: label; anchors.centerIn: parent}
+ focus: true
+ Keys.onPressed: {
+ if (event.key == Qt.Key_A)
+ label.text = 'Key A was pressed'
+ else if (event.key == Qt.Key_B)
+ label.text = 'Key B was pressed'
+ else if (event.key == Qt.Key_C)
+ label.text = 'Key C was pressed'
+ }
+}
+//! [mywidget]
diff --git a/doc/src/snippets/declarative/focus/qmldir b/doc/src/snippets/declarative/focus/qmldir
new file mode 100644
index 0000000..d0683b2
--- /dev/null
+++ b/doc/src/snippets/declarative/focus/qmldir
@@ -0,0 +1,4 @@
+MyWidget 1.0 mywidget.qml
+MyFocusScopeWidget 1.0 myfocusscopewidget.qml
+MyClickableWidget 1.0 myclickablewidget.qml
+
diff --git a/doc/src/snippets/declarative/focus/rectangle.qml b/doc/src/snippets/declarative/focus/rectangle.qml
new file mode 100644
index 0000000..01d1f0c
--- /dev/null
+++ b/doc/src/snippets/declarative/focus/rectangle.qml
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the FOO module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 1.0
+
+//! [simple key event]
+Rectangle {
+ width: 100; height: 100
+ focus: true
+ Keys.onPressed: {
+ if (event.key == Qt.Key_A) {
+ console.log('Key A was pressed');
+ event.accepted = true;
+ }
+ }
+//! [simple key event]
+
+//! [active focus]
+ Text {
+ text: activeFocus ? "I have active focus!" : "I do not have active focus"
+ }
+//! [active focus]
+
+//! [simple key event end]
+}
+//! [simple key event end]
diff --git a/doc/src/snippets/declarative/focus/widget.qml b/doc/src/snippets/declarative/focus/widget.qml
new file mode 100644
index 0000000..cef34c5
--- /dev/null
+++ b/doc/src/snippets/declarative/focus/widget.qml
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the FOO module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 1.0
+
+//! [window]
+
+//Window code that imports MyWidget
+Rectangle {
+ id: window
+ color: "white"; width: 240; height: 150
+
+ Column {
+ anchors.centerIn: parent; spacing: 15
+
+ MyWidget {
+ focus: true //set this MyWidget to receive the focus
+ color: "lightblue"
+ }
+ MyWidget {
+ color: "palegreen"
+ }
+ }
+}
+//! [window]
diff --git a/doc/src/snippets/declarative/gridview/gridview.qml b/doc/src/snippets/declarative/gridview/gridview.qml
index 73e58ec..87d70de 100644
--- a/doc/src/snippets/declarative/gridview/gridview.qml
+++ b/doc/src/snippets/declarative/gridview/gridview.qml
@@ -132,6 +132,32 @@ GridView {
}
//![highlightFollowsCurrentItem]
+//![isCurrentItem]
+GridView {
+ width: 300; height: 200
+ cellWidth: 80; cellHeight: 80
+
+ Component {
+ id: contactsDelegate
+ Rectangle {
+ id: wrapper
+ width: 80
+ height: 80
+ color: GridView.isCurrentItem ? "black" : "red"
+ Text {
+ id: contactInfo
+ text: name + ": " + number
+ color: wrapper.GridView.isCurrentItem ? "red" : "black"
+ }
+ }
+ }
+
+ model: ContactModel {}
+ delegate: contactsDelegate
+ focus: true
+}
+//![isCurrentItem]
+
}
}
diff --git a/doc/src/snippets/declarative/listview/listview.qml b/doc/src/snippets/declarative/listview/listview.qml
index 8ba47a8..370429e 100644
--- a/doc/src/snippets/declarative/listview/listview.qml
+++ b/doc/src/snippets/declarative/listview/listview.qml
@@ -127,10 +127,16 @@ ListView {
Component {
id: contactsDelegate
- Text {
- id: contactInfo
- text: name + ": " + number
- color: contactInfo.ListView.isCurrentItem ? "red" : "black"
+ Rectangle {
+ id: wrapper
+ width: 180
+ height: contactInfo.height
+ color: ListView.isCurrentItem ? "black" : "red"
+ Text {
+ id: contactInfo
+ text: name + ": " + number
+ color: wrapper.ListView.isCurrentItem ? "red" : "black"
+ }
}
}
diff --git a/doc/src/snippets/declarative/pathview/pathattributes.qml b/doc/src/snippets/declarative/pathview/pathattributes.qml
index d6dacdb..be933e0 100644
--- a/doc/src/snippets/declarative/pathview/pathattributes.qml
+++ b/doc/src/snippets/declarative/pathview/pathattributes.qml
@@ -52,8 +52,8 @@ Rectangle {
scale: PathView.iconScale
opacity: PathView.iconOpacity
Column {
- Image { anchors.horizontalCenter: name.horizontalCenter; width: 64; height: 64; source: icon }
- Text { text: name; font.pointSize: 16}
+ Image { anchors.horizontalCenter: nameText.horizontalCenter; width: 64; height: 64; source: icon }
+ Text { id: nameText; text: name; font.pointSize: 16 }
}
}
}
diff --git a/doc/src/snippets/declarative/pathview/pathview.qml b/doc/src/snippets/declarative/pathview/pathview.qml
index 93298c4..e5e90a4 100644
--- a/doc/src/snippets/declarative/pathview/pathview.qml
+++ b/doc/src/snippets/declarative/pathview/pathview.qml
@@ -48,8 +48,18 @@ Rectangle {
Component {
id: delegate
Column {
- Image { anchors.horizontalCenter: name.horizontalCenter; width: 64; height: 64; source: icon }
- Text { text: name; font.pointSize: 16 }
+ id: wrapper
+ Image {
+ anchors.horizontalCenter: nameText.horizontalCenter
+ width: 64; height: 64
+ source: icon
+ }
+ Text {
+ id: nameText
+ text: name
+ font.pointSize: 16
+ color: wrapper.PathView.isCurrentItem ? "red" : "black"
+ }
}
}
//! [1]
diff --git a/doc/src/widgets-and-layouts/gallery-cde.qdoc b/doc/src/widgets-and-layouts/gallery-cde.qdoc
index c783399..69287b9 100644
--- a/doc/src/widgets-and-layouts/gallery-cde.qdoc
+++ b/doc/src/widgets-and-layouts/gallery-cde.qdoc
@@ -34,345 +34,100 @@
This page shows some of the widgets available in Qt
when configured to use the "cde" style.
-\raw HTML
-<h2 align="center">Buttons</h2>
+\section2 Buttons
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-pushbutton.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cde-toolbutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QPushButton widget provides a command button.
-\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-checkbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cde-radiobutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QCheckBox widget provides a checkbox with a text label.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QRadioButton widget provides a radio button with a text or pixmap label.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Containers</h2>
+\table 100%
+\row
+\o \image cde-checkbox.png
+ \caption The QCheckBox widget provides a checkbox with a text label.
+\o \image cde-radiobutton.png
+ \caption The QRadioButton widget provides a radio button with a text or pixmap label.
+\o \image cde-pushbutton.png
+ \image cde-toolbutton.png
+ \caption The QPushButton widget provides a command button.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-groupbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cde-tabwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QGroupBox widget provides a group box frame with a title.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTabWidget class provides a stack of tabbed widgets.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-frame.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cde-toolbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFrame widget provides a simple decorated container for other widgets.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolBox class provides a column of tabbed widget items.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Item Views</h2>
+\section2 Containers
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-listview.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cde-treeview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-tableview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Display Widgets</h2>
+\table 100%
+\row
+\o \image cde-groupbox.png
+ The The QGroupBox widget provides a group box frame with a title.
+\o \image cde-tabwidget.png
+ The QTabWidget class provides a stack of tabbed widgets.
+\o \image cde-frame.png
+ The QFrame widget provides a simple decorated container for other widgets.
+\o \image cde-toolbox.png
+ The QToolBox class provides a column of tabbed widget items.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-progressbar.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cde-lcdnumber.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QProgressBar widget provides a horizontal progress bar.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLCDNumber widget displays a number with LCD-like digits.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-label.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QLabel widget provides a text or image display.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Input Widgets</h2>
+\section2 Item Views
+
+\table 100%
+\row
+\o \image cde-listview.png
+ The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.
+\o \image cde-treeview.png
+ The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.
+\o \image cde-tableview.png
+ The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\o
+\o
+\endtable
+
+\section2 Display Widgets
+
+\table 100%
+\row
+\o \image cde-progressbar.png
+ The QProgressBar widget provides a horizontal progress bar.
+\o \image cde-label.png
+ The QLabel widget provides a text or image display.
+\o \image cde-lcdnumber.png
+ The QLCDNumber widget displays a number with LCD-like digits.
+\endtable
+
+\section2 Input Widgets
+
+\table 100%
+\row
+\o \image cde-lineedit.png
+ The QLineEdit widget is a one-line text editor.
+\o \image cde-dateedit.png
+ The QDateEdit class provides a widget for editing dates.
+\o \image cde-timeedit.png
+ The QTimeEdit class provides a widget for editing times.
+\o \image cde-datetimeedit.png
+ The QDateTimeEdit class provides a widget for editing dates and times.
+\endtable
+
+\table 100%
+\row
+\o \image cde-slider.png
+ The QSlider widget provides a vertical or horizontal slider.
+\o \image cde-combobox.png
+ The QComboBox widget is a combined button and pop-up list.
+\o \image cde-spinbox.png
+ The QSpinBox class provides a spin box widget.
+\endtable
+
+\table 100%
+\row
+\o \image cde-fontcombobox.png
+ The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.
+\o \image cde-doublespinbox.png
+ The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.
+\o \image cde-horizontalscrollbar.png
+ The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.
+\endtable
+
+\table 100%
+\row
+\o \image cde-dial.png
+ The QDial class provides a rounded range control (like a speedometer or potentiometer).
+\o \image cde-textedit.png
+ The QTextEdit class provides a widget that is used to edit and display both plain and rich text.
+\o \image cde-calendarwidget.png
+ The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-slider.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cde-lineedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSlider widget provides a vertical or horizontal slider.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLineEdit widget is a one-line text editor.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-combobox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cde-doublespinbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QComboBox widget is a combined button and pop-up list.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-spinbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cde-timeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSpinBox class provides a spin box widget.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTimeEdit class provides a widget for editing times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-dateedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cde-datetimeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDateEdit class provides a widget for editing dates.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDateTimeEdit class provides a widget for editing dates and times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-textedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cde-horizontalscrollbar.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTextEdit class provides a widget that is used to edit and
- display both plain and rich text.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-dial.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cde-calendarwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDial class provides a rounded range control (like a
- speedometer or potentiometer).\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-fontcombobox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
*/
diff --git a/doc/src/widgets-and-layouts/gallery-cleanlooks.qdoc b/doc/src/widgets-and-layouts/gallery-cleanlooks.qdoc
index d03adc8..59e2934 100644
--- a/doc/src/widgets-and-layouts/gallery-cleanlooks.qdoc
+++ b/doc/src/widgets-and-layouts/gallery-cleanlooks.qdoc
@@ -34,345 +34,105 @@
This page shows some of the widgets available in Qt
when configured to use the "cleanlooks" style.
-\raw HTML
-<h2 align="center">Buttons</h2>
+\section2 Buttons
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-pushbutton.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-toolbutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QPushButton widget provides a command button.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolButton class provides a quick-access button to commands
- or options, usually used inside a QToolBar.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-checkbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-radiobutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QCheckBox widget provides a checkbox with a text label.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QRadioButton widget provides a radio button with a text or pixmap label.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Containers</h2>
+\table 100%
+\row
+\o \image cleanlooks-pushbutton.png
+ \caption The QPushButton widget provides a command button.
+\o \image cleanlooks-toolbutton.png
+ \caption The QToolButton class provides a quick-access button to commands
+ or options, usually used inside a QToolBar.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-groupbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-tabwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QGroupBox widget provides a group box frame with a title.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTabWidget class provides a stack of tabbed widgets.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-frame.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-toolbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFrame widget provides a simple decorated container for other widgets.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolBox class provides a column of tabbed widget items.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Item Views</h2>
+\table 100%
+\row
+\o \image cleanlooks-checkbox.png
+ \caption The QCheckBox widget provides a checkbox with a text label.
+\o \image cleanlooks-radiobutton.png
+ \caption The QRadioButton widget provides a radio button with a text or pixmap label.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-listview.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-treeview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-tableview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Display Widgets</h2>
+\section2 Containers
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-progressbar.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-lcdnumber.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QProgressBar widget provides a horizontal progress bar.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLCDNumber widget displays a number with LCD-like digits.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-label.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QLabel widget provides a text or image display.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Input Widgets</h2>
+\table 100%
+\row
+\o \image cleanlooks-groupbox.png
+ The The QGroupBox widget provides a group box frame with a title.
+\o \image cleanlooks-tabwidget.png
+ The QTabWidget class provides a stack of tabbed widgets.
+\o \image cleanlooks-frame.png
+ The QFrame widget provides a simple decorated container for other widgets.
+\o \image cleanlooks-toolbox.png
+ The QToolBox class provides a column of tabbed widget items.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-slider.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-lineedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSlider widget provides a vertical or horizontal slider.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLineEdit widget is a one-line text editor.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-combobox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-doublespinbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QComboBox widget is a combined button and pop-up list.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-spinbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-timeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSpinBox class provides a spin box widget.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTimeEdit class provides a widget for editing times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-dateedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-datetimeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDateEdit class provides a widget for editing dates.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDateTimeEdit class provides a widget for editing dates and times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-textedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-horizontalscrollbar.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTextEdit class provides a widget that is used to edit and
- display both plain and rich text.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-dial.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-calendarwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDial class provides a rounded range control (like a
- speedometer or potentiometer).\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-fontcombobox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
+\section2 Item Views
+
+\table 100%
+\row
+\o \image cleanlooks-listview.png
+ The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.
+\o \image cleanlooks-treeview.png
+ The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.
+\o \image cleanlooks-tableview.png
+ The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\o
+\o
+\endtable
+
+\section2 Display Widgets
+
+\table 100%
+\row
+\o \image cleanlooks-progressbar.png
+ The QProgressBar widget provides a horizontal progress bar.
+\o \image cleanlooks-label.png
+ The QLabel widget provides a text or image display.
+\o \image cleanlooks-lcdnumber.png
+ The QLCDNumber widget displays a number with LCD-like digits.
+\endtable
+
+\section2 Input Widgets
+
+\table 100%
+\row
+\o \image cleanlooks-lineedit.png
+ The QLineEdit widget is a one-line text editor.
+\o \image cleanlooks-dateedit.png
+ The QDateEdit class provides a widget for editing dates.
+\o \image cleanlooks-timeedit.png
+ The QTimeEdit class provides a widget for editing times.
+\o \image cleanlooks-datetimeedit.png
+ The QDateTimeEdit class provides a widget for editing dates and times.
+\endtable
+
+\table 100%
+\row
+\o \image cleanlooks-slider.png
+ The QSlider widget provides a vertical or horizontal slider.
+\o \image cleanlooks-combobox.png
+ The QComboBox widget is a combined button and pop-up list.
+\o \image cleanlooks-spinbox.png
+ The QSpinBox class provides a spin box widget.
+\endtable
+
+\table 100%
+\row
+\o \image cleanlooks-fontcombobox.png
+ The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.
+\o \image cleanlooks-doublespinbox.png
+ The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.
+\o \image cleanlooks-horizontalscrollbar.png
+ The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.
+\endtable
+
+\table 100%
+\row
+\o \image cleanlooks-dial.png
+ The QDial class provides a rounded range control (like a speedometer or potentiometer).
+\o \image cleanlooks-textedit.png
+ The QTextEdit class provides a widget that is used to edit and display both plain and rich text.
+\o \image cleanlooks-calendarwidget.png
+ The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.
+\endtable
*/
diff --git a/doc/src/widgets-and-layouts/gallery-gtk.qdoc b/doc/src/widgets-and-layouts/gallery-gtk.qdoc
index b3a6372..b2f8458 100644
--- a/doc/src/widgets-and-layouts/gallery-gtk.qdoc
+++ b/doc/src/widgets-and-layouts/gallery-gtk.qdoc
@@ -37,349 +37,105 @@
Take a look at the \l{Qt Widget Gallery} to see how Qt
applications appear in other styles.
-\raw HTML
-<h2 align="center">Buttons</h2>
+\section2 Buttons
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-pushbutton.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage gtk-toolbutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td align="justify" valign="top">
-\endraw
-The QPushButton widget provides a command button.\raw HTML
-</td>
-<td align="justify" valign="top">
-\endraw
-The QToolButton class provides a quick-access button to commands
- or options, usually used inside a QToolBar.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-checkbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage gtk-radiobutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td align="justify" valign="top">
-\endraw
-The QCheckBox widget provides a checkbox with a text label.\raw HTML
-</td>
-<td align="justify" valign="top">
-\endraw
-The QRadioButton widget provides a radio button with a text or pixmap label.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Containers</h2>
+\table 100%
+\row
+\o \image gtk-pushbutton.png
+ \caption The QPushButton widget provides a command button.
+\o \image gtk-toolbutton.png
+ \caption The QToolButton class provides a quick-access button to commands
+ or options, usually used inside a QToolBar.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-groupbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage gtk-tabwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td align="justify" valign="top">
-\endraw
-The QGroupBox widget provides a group box frame with a title.\raw HTML
-</td>
-<td align="justify" valign="top">
-\endraw
-The QTabWidget class provides a stack of tabbed widgets.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-toolbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage gtk-frame.png
-\raw HTML
-</td>
-</tr><tr>
-<td align="justify" valign="top">
-\endraw
-The QToolBox class provides a column of tabbed widget items.\raw HTML
-</td>
-<td align="justify" valign="top">
-\endraw
-The QFrame widget provides a simple decorated container for other widgets.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Item Views</h2>
+\table 100%
+\row
+\o \image gtk-checkbox.png
+ \caption The QCheckBox widget provides a checkbox with a text label.
+\o \image gtk-radiobutton.png
+ \caption The QRadioButton widget provides a radio button with a text or pixmap label.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-listview.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage gtk-treeview.png
-\raw HTML
-</td>
-</tr><tr>
-<td align="justify" valign="top">
-\endraw
-The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.\raw HTML
-</td>
-<td align="justify" valign="top">
-\endraw
-The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-tableview.png
-\raw HTML
-</td>
-</tr><tr>
-<td align="justify" valign="top">
-\endraw
-The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\raw HTML
-</td>
-<td align="justify" valign="top">
-\endraw
-\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Display Widgets</h2>
+\section2 Containers
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-progressbar.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage gtk-lcdnumber.png
-\raw HTML
-</td>
-</tr><tr>
-<td align="justify" valign="top">
-\endraw
-The QProgressBar widget provides a horizontal progress bar.\raw HTML
-</td>
-<td align="justify" valign="top">
-\endraw
-The QLCDNumber widget displays a number with LCD-like digits.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-label.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QLabel widget provides a text or image display.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Input Widgets</h2>
+\table 100%
+\row
+\o \image gtk-groupbox.png
+ The The QGroupBox widget provides a group box frame with a title.
+\o \image gtk-tabwidget.png
+ The QTabWidget class provides a stack of tabbed widgets.
+\o \image gtk-frame.png
+ The QFrame widget provides a simple decorated container for other widgets.
+\o \image gtk-toolbox.png
+ The QToolBox class provides a column of tabbed widget items.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-slider.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage gtk-lineedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td align="justify" valign="top">
-\endraw
-The QSlider widget provides a vertical or horizontal slider.\raw HTML
-</td>
-<td align="justify" valign="top">
-\endraw
-The QLineEdit widget is a one-line text editor.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-combobox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage gtk-doublespinbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td align="justify" valign="top">
-\endraw
-The QComboBox widget is a combined button and pop-up list.\raw HTML
-</td>
-<td align="justify" valign="top">
-\endraw
-The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-spinbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage gtk-timeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td align="justify" valign="top">
-\endraw
-The QSpinBox class provides a spin box widget.\raw HTML
-</td>
-<td align="justify" valign="top">
-\endraw
-The QTimeEdit class provides a widget for editing times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-dateedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage gtk-datetimeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td align="justify" valign="top">
-\endraw
-The QDateEdit class provides a widget for editing dates.\raw HTML
-</td>
-<td align="justify" valign="top">
-\endraw
-The QDateTimeEdit class provides a widget for editing dates and times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-textedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage gtk-horizontalscrollbar.png
-\raw HTML
-</td>
-</tr><tr>
-<td align="justify" valign="top">
-\endraw
-The QTextEdit class provides a widget that is used to edit and
- display both plain and rich text.\raw HTML
-</td>
-<td align="justify" valign="top">
-\endraw
-The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-dial.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage gtk-calendarwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td align="justify" valign="top">
-\endraw
-The QDial class provides a rounded range control (like a
- speedometer or potentiometer).\raw HTML
-</td>
-<td align="justify" valign="top">
-\endraw
-The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-fontcombobox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
+\section2 Item Views
+
+\table 100%
+\row
+\o \image gtk-listview.png
+ The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.
+\o \image gtk-treeview.png
+ The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.
+\o \image gtk-tableview.png
+ The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\o
+\o
+\endtable
+
+\section2 Display Widgets
+
+\table 100%
+\row
+\o \image gtk-progressbar.png
+ The QProgressBar widget provides a horizontal progress bar.
+\o \image gtk-label.png
+ The QLabel widget provides a text or image display.
+\o \image gtk-lcdnumber.png
+ The QLCDNumber widget displays a number with LCD-like digits.
+\endtable
+
+\section2 Input Widgets
+
+\table 100%
+\row
+\o \image gtk-lineedit.png
+ The QLineEdit widget is a one-line text editor.
+\o \image gtk-dateedit.png
+ The QDateEdit class provides a widget for editing dates.
+\o \image gtk-timeedit.png
+ The QTimeEdit class provides a widget for editing times.
+\o \image gtk-datetimeedit.png
+ The QDateTimeEdit class provides a widget for editing dates and times.
+\endtable
+
+\table 100%
+\row
+\o \image gtk-slider.png
+ The QSlider widget provides a vertical or horizontal slider.
+\o \image gtk-combobox.png
+ The QComboBox widget is a combined button and pop-up list.
+\o \image gtk-spinbox.png
+ The QSpinBox class provides a spin box widget.
+\endtable
+
+\table 100%
+\row
+\o \image gtk-fontcombobox.png
+ The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.
+\o \image gtk-doublespinbox.png
+ The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.
+\o \image gtk-horizontalscrollbar.png
+ The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.
+\endtable
+
+\table 100%
+\row
+\o \image gtk-dial.png
+ The QDial class provides a rounded range control (like a speedometer or potentiometer).
+\o \image gtk-textedit.png
+ The QTextEdit class provides a widget that is used to edit and display both plain and rich text.
+\o \image gtk-calendarwidget.png
+ The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.
+\endtable
*/
diff --git a/doc/src/widgets-and-layouts/gallery-macintosh.qdoc b/doc/src/widgets-and-layouts/gallery-macintosh.qdoc
index 30a78ca..44d7eb9 100644
--- a/doc/src/widgets-and-layouts/gallery-macintosh.qdoc
+++ b/doc/src/widgets-and-layouts/gallery-macintosh.qdoc
@@ -34,345 +34,105 @@
This page shows some of the widgets available in Qt
when configured to use the "macintosh" style.
-\raw HTML
-<h2 align="center">Buttons</h2>
+\section2 Buttons
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-pushbutton.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage macintosh-toolbutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QPushButton widget provides a command button.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolButton class provides a quick-access button to commands
- or options, usually used inside a QToolBar.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-checkbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage macintosh-radiobutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QCheckBox widget provides a checkbox with a text label.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QRadioButton widget provides a radio button with a text or pixmap label.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Containers</h2>
+\table 100%
+\row
+\o \image macintosh-pushbutton.png
+ \caption The QPushButton widget provides a command button.
+\o \image macintosh-toolbutton.png
+ \caption The QToolButton class provides a quick-access button to commands
+ or options, usually used inside a QToolBar.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-groupbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage macintosh-tabwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QGroupBox widget provides a group box frame with a title.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTabWidget class provides a stack of tabbed widgets.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-frame.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage macintosh-toolbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFrame widget provides a simple decorated container for other widgets.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolBox class provides a column of tabbed widget items.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Item Views</h2>
+\table 100%
+\row
+\o \image macintosh-checkbox.png
+ \caption The QCheckBox widget provides a checkbox with a text label.
+\o \image macintosh-radiobutton.png
+ \caption The QRadioButton widget provides a radio button with a text or pixmap label.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-listview.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage macintosh-treeview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-tableview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Display Widgets</h2>
+\section2 Containers
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-progressbar.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage macintosh-lcdnumber.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QProgressBar widget provides a horizontal progress bar.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLCDNumber widget displays a number with LCD-like digits.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-label.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QLabel widget provides a text or image display.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Input Widgets</h2>
+\table 100%
+\row
+\o \image macintosh-groupbox.png
+ The The QGroupBox widget provides a group box frame with a title.
+\o \image macintosh-tabwidget.png
+ The QTabWidget class provides a stack of tabbed widgets.
+\o \image macintosh-frame.png
+ The QFrame widget provides a simple decorated container for other widgets.
+\o \image macintosh-toolbox.png
+ The QToolBox class provides a column of tabbed widget items.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-slider.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage macintosh-lineedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSlider widget provides a vertical or horizontal slider.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLineEdit widget is a one-line text editor.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-combobox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage macintosh-doublespinbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QComboBox widget is a combined button and pop-up list.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-spinbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage macintosh-timeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSpinBox class provides a spin box widget.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTimeEdit class provides a widget for editing times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-dateedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage macintosh-datetimeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDateEdit class provides a widget for editing dates.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDateTimeEdit class provides a widget for editing dates and times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-textedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage macintosh-horizontalscrollbar.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTextEdit class provides a widget that is used to edit and
- display both plain and rich text.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-dial.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage macintosh-calendarwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDial class provides a rounded range control (like a
- speedometer or potentiometer).\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-fontcombobox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
+\section2 Item Views
+
+\table 100%
+\row
+\o \image macintosh-listview.png
+ The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.
+\o \image macintosh-treeview.png
+ The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.
+\o \image macintosh-tableview.png
+ The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\o
+\o
+\endtable
+
+\section2 Display Widgets
+
+\table 100%
+\row
+\o \image macintosh-progressbar.png
+ The QProgressBar widget provides a horizontal progress bar.
+\o \image macintosh-label.png
+ The QLabel widget provides a text or image display.
+\o \image macintosh-lcdnumber.png
+ The QLCDNumber widget displays a number with LCD-like digits.
+\endtable
+
+\section2 Input Widgets
+
+\table 100%
+\row
+\o \image macintosh-lineedit.png
+ The QLineEdit widget is a one-line text editor.
+\o \image macintosh-dateedit.png
+ The QDateEdit class provides a widget for editing dates.
+\o \image macintosh-timeedit.png
+ The QTimeEdit class provides a widget for editing times.
+\o \image macintosh-datetimeedit.png
+ The QDateTimeEdit class provides a widget for editing dates and times.
+\endtable
+
+\table 100%
+\row
+\o \image macintosh-slider.png
+ The QSlider widget provides a vertical or horizontal slider.
+\o \image macintosh-combobox.png
+ The QComboBox widget is a combined button and pop-up list.
+\o \image macintosh-spinbox.png
+ The QSpinBox class provides a spin box widget.
+\endtable
+
+\table 100%
+\row
+\o \image macintosh-fontcombobox.png
+ The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.
+\o \image macintosh-doublespinbox.png
+ The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.
+\o \image macintosh-horizontalscrollbar.png
+ The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.
+\endtable
+
+\table 100%
+\row
+\o \image macintosh-dial.png
+ The QDial class provides a rounded range control (like a speedometer or potentiometer).
+\o \image macintosh-textedit.png
+ The QTextEdit class provides a widget that is used to edit and display both plain and rich text.
+\o \image macintosh-calendarwidget.png
+ The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.
+\endtable
*/
diff --git a/doc/src/widgets-and-layouts/gallery-motif.qdoc b/doc/src/widgets-and-layouts/gallery-motif.qdoc
index 861c22a..b9c95c8 100644
--- a/doc/src/widgets-and-layouts/gallery-motif.qdoc
+++ b/doc/src/widgets-and-layouts/gallery-motif.qdoc
@@ -34,345 +34,105 @@
This page shows some of the widgets available in Qt
when configured to use the "motif" style.
-\raw HTML
-<h2 align="center">Buttons</h2>
+\section2 Buttons
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-pushbutton.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage motif-toolbutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QPushButton widget provides a command button.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolButton class provides a quick-access button to commands
- or options, usually used inside a QToolBar.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-checkbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage motif-radiobutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QCheckBox widget provides a checkbox with a text label.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QRadioButton widget provides a radio button with a text or pixmap label.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Containers</h2>
+\table 100%
+\row
+\o \image motif-pushbutton.png
+ \caption The QPushButton widget provides a command button.
+\o \image motif-toolbutton.png
+ \caption The QToolButton class provides a quick-access button to commands
+ or options, usually used inside a QToolBar.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-groupbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage motif-tabwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QGroupBox widget provides a group box frame with a title.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTabWidget class provides a stack of tabbed widgets.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-frame.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage motif-toolbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFrame widget provides a simple decorated container for other widgets.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolBox class provides a column of tabbed widget items.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Item Views</h2>
+\table 100%
+\row
+\o \image motif-checkbox.png
+ \caption The QCheckBox widget provides a checkbox with a text label.
+\o \image motif-radiobutton.png
+ \caption The QRadioButton widget provides a radio button with a text or pixmap label.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-listview.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage motif-treeview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-tableview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Display Widgets</h2>
+\section2 Containers
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-progressbar.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage motif-lcdnumber.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QProgressBar widget provides a horizontal progress bar.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLCDNumber widget displays a number with LCD-like digits.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-label.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QLabel widget provides a text or image display.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Input Widgets</h2>
+\table 100%
+\row
+\o \image motif-groupbox.png
+ The The QGroupBox widget provides a group box frame with a title.
+\o \image motif-tabwidget.png
+ The QTabWidget class provides a stack of tabbed widgets.
+\o \image motif-frame.png
+ The QFrame widget provides a simple decorated container for other widgets.
+\o \image motif-toolbox.png
+ The QToolBox class provides a column of tabbed widget items.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-slider.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage motif-lineedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSlider widget provides a vertical or horizontal slider.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLineEdit widget is a one-line text editor.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-combobox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage motif-doublespinbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QComboBox widget is a combined button and pop-up list.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-spinbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage motif-timeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSpinBox class provides a spin box widget.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTimeEdit class provides a widget for editing times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-dateedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage motif-datetimeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDateEdit class provides a widget for editing dates.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDateTimeEdit class provides a widget for editing dates and times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-textedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage motif-horizontalscrollbar.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTextEdit class provides a widget that is used to edit and
- display both plain and rich text.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-dial.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage motif-calendarwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDial class provides a rounded range control (like a
- speedometer or potentiometer).\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-fontcombobox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
+\section2 Item Views
+
+\table 100%
+\row
+\o \image motif-listview.png
+ The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.
+\o \image motif-treeview.png
+ The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.
+\o \image motif-tableview.png
+ The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\o
+\o
+\endtable
+
+\section2 Display Widgets
+
+\table 100%
+\row
+\o \image motif-progressbar.png
+ The QProgressBar widget provides a horizontal progress bar.
+\o \image motif-label.png
+ The QLabel widget provides a text or image display.
+\o \image motif-lcdnumber.png
+ The QLCDNumber widget displays a number with LCD-like digits.
+\endtable
+
+\section2 Input Widgets
+
+\table 100%
+\row
+\o \image motif-lineedit.png
+ The QLineEdit widget is a one-line text editor.
+\o \image motif-dateedit.png
+ The QDateEdit class provides a widget for editing dates.
+\o \image motif-timeedit.png
+ The QTimeEdit class provides a widget for editing times.
+\o \image motif-datetimeedit.png
+ The QDateTimeEdit class provides a widget for editing dates and times.
+\endtable
+
+\table 100%
+\row
+\o \image motif-slider.png
+ The QSlider widget provides a vertical or horizontal slider.
+\o \image motif-combobox.png
+ The QComboBox widget is a combined button and pop-up list.
+\o \image motif-spinbox.png
+ The QSpinBox class provides a spin box widget.
+\endtable
+
+\table 100%
+\row
+\o \image motif-fontcombobox.png
+ The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.
+\o \image motif-doublespinbox.png
+ The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.
+\o \image motif-horizontalscrollbar.png
+ The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.
+\endtable
+
+\table 100%
+\row
+\o \image motif-dial.png
+ The QDial class provides a rounded range control (like a speedometer or potentiometer).
+\o \image motif-textedit.png
+ The QTextEdit class provides a widget that is used to edit and display both plain and rich text.
+\o \image motif-calendarwidget.png
+ The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.
+\endtable
*/
diff --git a/doc/src/widgets-and-layouts/gallery-plastique.qdoc b/doc/src/widgets-and-layouts/gallery-plastique.qdoc
index 0ea62ee..5f2a1ec 100644
--- a/doc/src/widgets-and-layouts/gallery-plastique.qdoc
+++ b/doc/src/widgets-and-layouts/gallery-plastique.qdoc
@@ -34,345 +34,105 @@
This page shows some of the widgets available in Qt
when configured to use the "plastique" style.
-\raw HTML
-<h2 align="center">Buttons</h2>
+\section2 Buttons
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-pushbutton.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage plastique-toolbutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QPushButton widget provides a command button.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolButton class provides a quick-access button to commands
- or options, usually used inside a QToolBar.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-checkbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage plastique-radiobutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QCheckBox widget provides a checkbox with a text label.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QRadioButton widget provides a radio button with a text or pixmap label.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Containers</h2>
+\table 100%
+\row
+\o \image plastique-pushbutton.png
+ \caption The QPushButton widget provides a command button.
+\o \image plastique-toolbutton.png
+ \caption The QToolButton class provides a quick-access button to commands
+ or options, usually used inside a QToolBar.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-groupbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage plastique-tabwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QGroupBox widget provides a group box frame with a title.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTabWidget class provides a stack of tabbed widgets.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-frame.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage plastique-toolbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFrame widget provides a simple decorated container for other widgets.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolBox class provides a column of tabbed widget items.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Item Views</h2>
+\table 100%
+\row
+\o \image plastique-checkbox.png
+ \caption The QCheckBox widget provides a checkbox with a text label.
+\o \image plastique-radiobutton.png
+ \caption The QRadioButton widget provides a radio button with a text or pixmap label.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-listview.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage plastique-treeview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-tableview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Display Widgets</h2>
+\section2 Containers
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-progressbar.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage plastique-lcdnumber.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QProgressBar widget provides a horizontal progress bar.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLCDNumber widget displays a number with LCD-like digits.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-label.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QLabel widget provides a text or image display.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Input Widgets</h2>
+\table 100%
+\row
+\o \image plastique-groupbox.png
+ The The QGroupBox widget provides a group box frame with a title.
+\o \image plastique-tabwidget.png
+ The QTabWidget class provides a stack of tabbed widgets.
+\o \image plastique-frame.png
+ The QFrame widget provides a simple decorated container for other widgets.
+\o \image plastique-toolbox.png
+ The QToolBox class provides a column of tabbed widget items.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-slider.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage plastique-lineedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSlider widget provides a vertical or horizontal slider.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLineEdit widget is a one-line text editor.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-combobox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage plastique-doublespinbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QComboBox widget is a combined button and pop-up list.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-spinbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage plastique-timeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSpinBox class provides a spin box widget.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTimeEdit class provides a widget for editing times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-dateedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage plastique-datetimeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDateEdit class provides a widget for editing dates.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDateTimeEdit class provides a widget for editing dates and times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-textedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage plastique-horizontalscrollbar.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTextEdit class provides a widget that is used to edit and
- display both plain and rich text.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-dial.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage plastique-calendarwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDial class provides a rounded range control (like a
- speedometer or potentiometer).\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-fontcombobox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
+\section2 Item Views
+
+\table 100%
+\row
+\o \image plastique-listview.png
+ The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.
+\o \image plastique-treeview.png
+ The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.
+\o \image plastique-tableview.png
+ The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\o
+\o
+\endtable
+
+\section2 Display Widgets
+
+\table 100%
+\row
+\o \image plastique-progressbar.png
+ The QProgressBar widget provides a horizontal progress bar.
+\o \image plastique-label.png
+ The QLabel widget provides a text or image display.
+\o \image plastique-lcdnumber.png
+ The QLCDNumber widget displays a number with LCD-like digits.
+\endtable
+
+\section2 Input Widgets
+
+\table 100%
+\row
+\o \image plastique-lineedit.png
+ The QLineEdit widget is a one-line text editor.
+\o \image plastique-dateedit.png
+ The QDateEdit class provides a widget for editing dates.
+\o \image plastique-timeedit.png
+ The QTimeEdit class provides a widget for editing times.
+\o \image plastique-datetimeedit.png
+ The QDateTimeEdit class provides a widget for editing dates and times.
+\endtable
+
+\table 100%
+\row
+\o \image plastique-slider.png
+ The QSlider widget provides a vertical or horizontal slider.
+\o \image plastique-combobox.png
+ The QComboBox widget is a combined button and pop-up list.
+\o \image plastique-spinbox.png
+ The QSpinBox class provides a spin box widget.
+\endtable
+
+\table 100%
+\row
+\o \image plastique-fontcombobox.png
+ The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.
+\o \image plastique-doublespinbox.png
+ The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.
+\o \image plastique-horizontalscrollbar.png
+ The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.
+\endtable
+
+\table 100%
+\row
+\o \image plastique-dial.png
+ The QDial class provides a rounded range control (like a speedometer or potentiometer).
+\o \image plastique-textedit.png
+ The QTextEdit class provides a widget that is used to edit and display both plain and rich text.
+\o \image plastique-calendarwidget.png
+ The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.
+\endtable
*/
diff --git a/doc/src/widgets-and-layouts/gallery-windows.qdoc b/doc/src/widgets-and-layouts/gallery-windows.qdoc
index d3464a0..fe38745 100644
--- a/doc/src/widgets-and-layouts/gallery-windows.qdoc
+++ b/doc/src/widgets-and-layouts/gallery-windows.qdoc
@@ -34,345 +34,105 @@
This page shows some of the widgets available in Qt
when configured to use the "windows" style.
-\raw HTML
-<h2 align="center">Buttons</h2>
+\section2 Buttons
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-pushbutton.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windows-toolbutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QPushButton widget provides a command button.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolButton class provides a quick-access button to commands
- or options, usually used inside a QToolBar.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-checkbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windows-radiobutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QCheckBox widget provides a checkbox with a text label.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QRadioButton widget provides a radio button with a text or pixmap label.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Containers</h2>
+\table 100%
+\row
+\o \image windows-pushbutton.png
+ \caption The QPushButton widget provides a command button.
+\o \image windows-toolbutton.png
+ \caption The QToolButton class provides a quick-access button to commands
+ or options, usually used inside a QToolBar.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-groupbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windows-tabwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QGroupBox widget provides a group box frame with a title.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTabWidget class provides a stack of tabbed widgets.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-frame.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windows-toolbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFrame widget provides a simple decorated container for other widgets.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolBox class provides a column of tabbed widget items.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Item Views</h2>
+\table 100%
+\row
+\o \image windows-checkbox.png
+ \caption The QCheckBox widget provides a checkbox with a text label.
+\o \image windows-radiobutton.png
+ \caption The QRadioButton widget provides a radio button with a text or pixmap label.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-listview.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windows-treeview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-tableview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Display Widgets</h2>
+\section2 Containers
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-progressbar.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windows-lcdnumber.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QProgressBar widget provides a horizontal progress bar.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLCDNumber widget displays a number with LCD-like digits.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-label.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QLabel widget provides a text or image display.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Input Widgets</h2>
+\table 100%
+\row
+\o \image windows-groupbox.png
+ The The QGroupBox widget provides a group box frame with a title.
+\o \image windows-tabwidget.png
+ The QTabWidget class provides a stack of tabbed widgets.
+\o \image windows-frame.png
+ The QFrame widget provides a simple decorated container for other widgets.
+\o \image windows-toolbox.png
+ The QToolBox class provides a column of tabbed widget items.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-slider.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windows-lineedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSlider widget provides a vertical or horizontal slider.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLineEdit widget is a one-line text editor.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-combobox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windows-doublespinbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QComboBox widget is a combined button and pop-up list.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-spinbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windows-timeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSpinBox class provides a spin box widget.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTimeEdit class provides a widget for editing times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-dateedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windows-datetimeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDateEdit class provides a widget for editing dates.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDateTimeEdit class provides a widget for editing dates and times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-textedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windows-horizontalscrollbar.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTextEdit class provides a widget that is used to edit and
- display both plain and rich text.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-dial.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windows-calendarwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDial class provides a rounded range control (like a
- speedometer or potentiometer).\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-fontcombobox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
+\section2 Item Views
+
+\table 100%
+\row
+\o \image windows-listview.png
+ The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.
+\o \image windows-treeview.png
+ The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.
+\o \image windows-tableview.png
+ The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\o
+\o
+\endtable
+
+\section2 Display Widgets
+
+\table 100%
+\row
+\o \image windows-progressbar.png
+ The QProgressBar widget provides a horizontal progress bar.
+\o \image windows-label.png
+ The QLabel widget provides a text or image display.
+\o \image windows-lcdnumber.png
+ The QLCDNumber widget displays a number with LCD-like digits.
+\endtable
+
+\section2 Input Widgets
+
+\table 100%
+\row
+\o \image windows-lineedit.png
+ The QLineEdit widget is a one-line text editor.
+\o \image windows-dateedit.png
+ The QDateEdit class provides a widget for editing dates.
+\o \image windows-timeedit.png
+ The QTimeEdit class provides a widget for editing times.
+\o \image windows-datetimeedit.png
+ The QDateTimeEdit class provides a widget for editing dates and times.
+\endtable
+
+\table 100%
+\row
+\o \image windows-slider.png
+ The QSlider widget provides a vertical or horizontal slider.
+\o \image windows-combobox.png
+ The QComboBox widget is a combined button and pop-up list.
+\o \image windows-spinbox.png
+ The QSpinBox class provides a spin box widget.
+\endtable
+
+\table 100%
+\row
+\o \image windows-fontcombobox.png
+ The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.
+\o \image windows-doublespinbox.png
+ The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.
+\o \image windows-horizontalscrollbar.png
+ The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.
+\endtable
+
+\table 100%
+\row
+\o \image windows-dial.png
+ The QDial class provides a rounded range control (like a speedometer or potentiometer).
+\o \image windows-textedit.png
+ The QTextEdit class provides a widget that is used to edit and display both plain and rich text.
+\o \image windows-calendarwidget.png
+ The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.
+\endtable
*/
diff --git a/doc/src/widgets-and-layouts/gallery-windowsvista.qdoc b/doc/src/widgets-and-layouts/gallery-windowsvista.qdoc
index 00afd52..e017a2c 100644
--- a/doc/src/widgets-and-layouts/gallery-windowsvista.qdoc
+++ b/doc/src/widgets-and-layouts/gallery-windowsvista.qdoc
@@ -34,345 +34,105 @@
This page shows some of the widgets available in Qt
when configured to use the "windowsvista" style.
-\raw HTML
-<h2 align="center">Buttons</h2>
+\section2 Buttons
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-pushbutton.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsvista-toolbutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QPushButton widget provides a command button.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolButton class provides a quick-access button to commands
- or options, usually used inside a QToolBar.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-checkbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsvista-radiobutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QCheckBox widget provides a checkbox with a text label.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QRadioButton widget provides a radio button with a text or pixmap label.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Containers</h2>
+\table 100%
+\row
+\o \image windowsvista-pushbutton.png
+ \caption The QPushButton widget provides a command button.
+\o \image windowsvista-toolbutton.png
+ \caption The QToolButton class provides a quick-access button to commands
+ or options, usually used inside a QToolBar.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-groupbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsvista-tabwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QGroupBox widget provides a group box frame with a title.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTabWidget class provides a stack of tabbed widgets.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-frame.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsvista-toolbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFrame widget provides a simple decorated container for other widgets.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolBox class provides a column of tabbed widget items.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Item Views</h2>
+\table 100%
+\row
+\o \image windowsvista-checkbox.png
+ \caption The QCheckBox widget provides a checkbox with a text label.
+\o \image windowsvista-radiobutton.png
+ \caption The QRadioButton widget provides a radio button with a text or pixmap label.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-listview.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsvista-treeview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-tableview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Display Widgets</h2>
+\section2 Containers
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-progressbar.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsvista-lcdnumber.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QProgressBar widget provides a horizontal progress bar.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLCDNumber widget displays a number with LCD-like digits.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-label.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QLabel widget provides a text or image display.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Input Widgets</h2>
+\table 100%
+\row
+\o \image windowsvista-groupbox.png
+ The The QGroupBox widget provides a group box frame with a title.
+\o \image windowsvista-tabwidget.png
+ The QTabWidget class provides a stack of tabbed widgets.
+\o \image windowsvista-frame.png
+ The QFrame widget provides a simple decorated container for other widgets.
+\o \image windowsvista-toolbox.png
+ The QToolBox class provides a column of tabbed widget items.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-slider.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsvista-lineedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSlider widget provides a vertical or horizontal slider.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLineEdit widget is a one-line text editor.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-combobox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsvista-doublespinbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QComboBox widget is a combined button and pop-up list.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-spinbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsvista-timeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSpinBox class provides a spin box widget.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTimeEdit class provides a widget for editing times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-dateedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsvista-datetimeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDateEdit class provides a widget for editing dates.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDateTimeEdit class provides a widget for editing dates and times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-textedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsvista-horizontalscrollbar.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTextEdit class provides a widget that is used to edit and
- display both plain and rich text.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-dial.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsvista-calendarwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDial class provides a rounded range control (like a
- speedometer or potentiometer).\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-fontcombobox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
+\section2 Item Views
+
+\table 100%
+\row
+\o \image windowsvista-listview.png
+ The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.
+\o \image windowsvista-treeview.png
+ The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.
+\o \image windowsvista-tableview.png
+ The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\o
+\o
+\endtable
+
+\section2 Display Widgets
+
+\table 100%
+\row
+\o \image windowsvista-progressbar.png
+ The QProgressBar widget provides a horizontal progress bar.
+\o \image windowsvista-label.png
+ The QLabel widget provides a text or image display.
+\o \image windowsvista-lcdnumber.png
+ The QLCDNumber widget displays a number with LCD-like digits.
+\endtable
+
+\section2 Input Widgets
+
+\table 100%
+\row
+\o \image windowsvista-lineedit.png
+ The QLineEdit widget is a one-line text editor.
+\o \image windowsvista-dateedit.png
+ The QDateEdit class provides a widget for editing dates.
+\o \image windowsvista-timeedit.png
+ The QTimeEdit class provides a widget for editing times.
+\o \image windowsvista-datetimeedit.png
+ The QDateTimeEdit class provides a widget for editing dates and times.
+\endtable
+
+\table 100%
+\row
+\o \image windowsvista-slider.png
+ The QSlider widget provides a vertical or horizontal slider.
+\o \image windowsvista-combobox.png
+ The QComboBox widget is a combined button and pop-up list.
+\o \image windowsvista-spinbox.png
+ The QSpinBox class provides a spin box widget.
+\endtable
+
+\table 100%
+\row
+\o \image windowsvista-fontcombobox.png
+ The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.
+\o \image windowsvista-doublespinbox.png
+ The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.
+\o \image windowsvista-horizontalscrollbar.png
+ The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.
+\endtable
+
+\table 100%
+\row
+\o \image windowsvista-dial.png
+ The QDial class provides a rounded range control (like a speedometer or potentiometer).
+\o \image windowsvista-textedit.png
+ The QTextEdit class provides a widget that is used to edit and display both plain and rich text.
+\o \image windowsvista-calendarwidget.png
+ The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.
+\endtable
*/
diff --git a/doc/src/widgets-and-layouts/gallery-windowsxp.qdoc b/doc/src/widgets-and-layouts/gallery-windowsxp.qdoc
index 60c8ff0..f3c53ee 100644
--- a/doc/src/widgets-and-layouts/gallery-windowsxp.qdoc
+++ b/doc/src/widgets-and-layouts/gallery-windowsxp.qdoc
@@ -34,345 +34,105 @@
This page shows some of the widgets available in Qt
when configured to use the "windowsxp" style.
-\raw HTML
-<h2 align="center">Buttons</h2>
+\section2 Buttons
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-pushbutton.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsxp-toolbutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QPushButton widget provides a command button.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolButton class provides a quick-access button to commands
- or options, usually used inside a QToolBar.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-checkbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsxp-radiobutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QCheckBox widget provides a checkbox with a text label.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QRadioButton widget provides a radio button with a text or pixmap label.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Containers</h2>
+\table 100%
+\row
+\o \image windowsxp-pushbutton.png
+ \caption The QPushButton widget provides a command button.
+\o \image windowsxp-toolbutton.png
+ \caption The QToolButton class provides a quick-access button to commands
+ or options, usually used inside a QToolBar.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-groupbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsxp-tabwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QGroupBox widget provides a group box frame with a title.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTabWidget class provides a stack of tabbed widgets.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-frame.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsxp-toolbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFrame widget provides a simple decorated container for other widgets.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolBox class provides a column of tabbed widget items.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Item Views</h2>
+\table 100%
+\row
+\o \image windowsxp-checkbox.png
+ \caption The QCheckBox widget provides a checkbox with a text label.
+\o \image windowsxp-radiobutton.png
+ \caption The QRadioButton widget provides a radio button with a text or pixmap label.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-listview.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsxp-treeview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-tableview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Display Widgets</h2>
+\section2 Containers
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-progressbar.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsxp-lcdnumber.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QProgressBar widget provides a horizontal progress bar.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLCDNumber widget displays a number with LCD-like digits.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-label.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QLabel widget provides a text or image display.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Input Widgets</h2>
+\table 100%
+\row
+\o \image windowsxp-groupbox.png
+ The The QGroupBox widget provides a group box frame with a title.
+\o \image windowsxp-tabwidget.png
+ The QTabWidget class provides a stack of tabbed widgets.
+\o \image windowsxp-frame.png
+ The QFrame widget provides a simple decorated container for other widgets.
+\o \image windowsxp-toolbox.png
+ The QToolBox class provides a column of tabbed widget items.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-slider.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsxp-lineedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSlider widget provides a vertical or horizontal slider.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLineEdit widget is a one-line text editor.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-combobox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsxp-doublespinbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QComboBox widget is a combined button and pop-up list.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-spinbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsxp-timeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSpinBox class provides a spin box widget.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTimeEdit class provides a widget for editing times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-dateedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsxp-datetimeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDateEdit class provides a widget for editing dates.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDateTimeEdit class provides a widget for editing dates and times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-textedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsxp-horizontalscrollbar.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTextEdit class provides a widget that is used to edit and
- display both plain and rich text.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-dial.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsxp-calendarwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDial class provides a rounded range control (like a
- speedometer or potentiometer).\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-fontcombobox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
+\section2 Item Views
+
+\table 100%
+\row
+\o \image windowsxp-listview.png
+ The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.
+\o \image windowsxp-treeview.png
+ The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.
+\o \image windowsxp-tableview.png
+ The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\o
+\o
+\endtable
+
+\section2 Display Widgets
+
+\table 100%
+\row
+\o \image windowsxp-progressbar.png
+ The QProgressBar widget provides a horizontal progress bar.
+\o \image windowsxp-label.png
+ The QLabel widget provides a text or image display.
+\o \image windowsxp-lcdnumber.png
+ The QLCDNumber widget displays a number with LCD-like digits.
+\endtable
+
+\section2 Input Widgets
+
+\table 100%
+\row
+\o \image windowsxp-lineedit.png
+ The QLineEdit widget is a one-line text editor.
+\o \image windowsxp-dateedit.png
+ The QDateEdit class provides a widget for editing dates.
+\o \image windowsxp-timeedit.png
+ The QTimeEdit class provides a widget for editing times.
+\o \image windowsxp-datetimeedit.png
+ The QDateTimeEdit class provides a widget for editing dates and times.
+\endtable
+
+\table 100%
+\row
+\o \image windowsxp-slider.png
+ The QSlider widget provides a vertical or horizontal slider.
+\o \image windowsxp-combobox.png
+ The QComboBox widget is a combined button and pop-up list.
+\o \image windowsxp-spinbox.png
+ The QSpinBox class provides a spin box widget.
+\endtable
+
+\table 100%
+\row
+\o \image windowsxp-fontcombobox.png
+ The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.
+\o \image windowsxp-doublespinbox.png
+ The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.
+\o \image windowsxp-horizontalscrollbar.png
+ The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.
+\endtable
+
+\table 100%
+\row
+\o \image windowsxp-dial.png
+ The QDial class provides a rounded range control (like a speedometer or potentiometer).
+\o \image windowsxp-textedit.png
+ The QTextEdit class provides a widget that is used to edit and display both plain and rich text.
+\o \image windowsxp-calendarwidget.png
+ The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.
+\endtable
*/
diff --git a/doc/src/widgets-and-layouts/gallery.qdoc b/doc/src/widgets-and-layouts/gallery.qdoc
index 201817b..d11d9c8 100644
--- a/doc/src/widgets-and-layouts/gallery.qdoc
+++ b/doc/src/widgets-and-layouts/gallery.qdoc
@@ -34,103 +34,51 @@
with the native desktop enviroment. Below, you can find links to the various
widget styles that are supplied with Qt 4.
- \raw HTML
- <table align="center" cellspacing="20%" width="100%">
- <colgroup span="2">
- <col width="40%" />
- <col width="40%" />
- </colgroup>
- <tr>
- <td align="center">
- \endraw
- \image plastique-tabwidget.png Plastique Style Widget Gallery
-
- \bold{\l{Plastique Style Widget Gallery}}
+ \table
+ \row
+ \o \image plastique-tabwidget.png Plastique Style Widget Gallery
+ \caption \l{Plastique Style Widget Gallery}
The Plastique style is provided by QPlastiqueStyle.
- \raw HTML
- </td>
- <td align="center">
- \endraw
- \image windowsxp-tabwidget.png Windows XP Style Widget Gallery
-
- \bold{\l{Windows XP Style Widget Gallery}}
+ \o \image windowsxp-tabwidget.png Windows XP Style Widget Gallery
+ \caption \l{Windows XP Style Widget Gallery}
The Windows XP style is provided by QWindowsXPStyle.
- \raw HTML
- </td>
- </tr>
- <tr>
- <td align="center">
- \endraw
- \image gtk-tabwidget.png GTK Style Widget Gallery
+ \o \image windows-tabwidget.png Windows Style Widget Gallery
+ \caption \l{Windows Style Widget Gallery}
- \bold{\l{GTK Style Widget Gallery}}
-
- The GTK style is provided by QGtkStyle.
- \raw HTML
- </td>
- <td align="center">
- \endraw
- \image macintosh-tabwidget.png Macintosh Style Widget Gallery
+ The Windows style is provided by QWindowsStyle.
+ \endtable
- \bold{\l{Macintosh Style Widget Gallery}}
+ \table
+ \row
+ \o \image macintosh-tabwidget.png Macintosh Style Widget Gallery
+ \caption \l{Macintosh Style Widget Gallery}
The Macintosh style is provided by QMacStyle.
- \raw HTML
- </td>
- </tr>
- <tr>
- <td align="center">
- \endraw
- \image cleanlooks-tabwidget.png Cleanlooks Style Widget Gallery
-
- \bold{\l{Cleanlooks Style Widget Gallery}}
+ \o \image cleanlooks-tabwidget.png Cleanlooks Style Widget Gallery
+ \caption \l{Cleanlooks Style Widget Gallery}
The Cleanlooks style is provided by QCleanlooksStyle.
- \raw HTML
- </td>
- <td align="center">
- \endraw
- \image windowsvista-tabwidget.png Windows Vista Style Widget Gallery
-
- \bold{\l{Windows Vista Style Widget Gallery}}
+ \o \image windowsvista-tabwidget.png Windows Vista Style Widget Gallery
+ \caption \l{Windows Vista Style Widget Gallery}
The Windows Vista style is provided by QWindowsVistaStyle.
- \raw HTML
- </td>
- </tr>
- <tr>
- <td align="center">
- \endraw
- \image motif-tabwidget.png Motif Style Widget Gallery
+ \endtable
- \bold{\l{Motif Style Widget Gallery}}
+ \table
+ \row
+ \o \image gtk-tabwidget.png GTK Style Widget Gallery
+ \caption \l{GTK Style Widget Gallery}
- The Motif style is provided by QMotifStyle.
- \raw HTML
- </td>
- <td align="center">
- \endraw
- \image windows-tabwidget.png Windows Style Widget Gallery
-
- \bold{\l{Windows Style Widget Gallery}}
-
- The Windows style is provided by QWindowsStyle.
- \raw HTML
- </td>
- </tr>
- <tr>
- <td align="center">
- \endraw
- \image cde-tabwidget.png CDE Style Widget Gallery
+ The GTK style is provided by QGtkStyle.
+ \o \image motif-tabwidget.png Motif Style Widget Gallery
+ \caption \l{Motif Style Widget Gallery}
- \bold{\l{CDE Style Widget Gallery}}
+ The Motif style is provided by QMotifStyle.
+ \o \image cde-tabwidget.png CDE Style Widget Gallery
+ \caption \l{CDE Style Widget Gallery}
The Common Desktop Environment style is provided by QCDEStyle.
- \raw HTML
- </td>
- </tr>
- </table>
- \endraw
+ \endtable
*/
diff --git a/examples/tools/echoplugin/echowindow/echowindow.pro b/examples/tools/echoplugin/echowindow/echowindow.pro
index c2abc6a..67c5237 100644
--- a/examples/tools/echoplugin/echowindow/echowindow.pro
+++ b/examples/tools/echoplugin/echowindow/echowindow.pro
@@ -6,8 +6,8 @@ SOURCES = echowindow.cpp \
TARGET = echoplugin
QMAKE_PROJECT_NAME = echopluginwindow
win32 {
- debug:DESTDIR = ../debug/
- release:DESTDIR = ../release/
+ CONFIG(debug, release|debug):DESTDIR = ../debug/
+ CONFIG(release, release|debug):DESTDIR = ../release/
} else {
DESTDIR = ../
}
diff --git a/examples/tools/styleplugin/plugin/plugin.pro b/examples/tools/styleplugin/plugin/plugin.pro
index 7cb0c97..54e266c 100644
--- a/examples/tools/styleplugin/plugin/plugin.pro
+++ b/examples/tools/styleplugin/plugin/plugin.pro
@@ -8,8 +8,8 @@ SOURCES = simplestyle.cpp \
TARGET = simplestyleplugin
#! [0]
win32 {
- debug:DESTDIR = ../debug/styles/
- release:DESTDIR = ../release/styles/
+ CONFIG(debug, release|debug):DESTDIR = ../debug/styles/
+ CONFIG(release, release|debug):DESTDIR = ../release/styles/
} else {
DESTDIR = ../styles/
}
diff --git a/qmake/generators/symbian/symbiancommon.cpp b/qmake/generators/symbian/symbiancommon.cpp
index 01a59b0..8747f5a 100644
--- a/qmake/generators/symbian/symbiancommon.cpp
+++ b/qmake/generators/symbian/symbiancommon.cpp
@@ -977,7 +977,7 @@ bool SymbianCommonGenerator::parseTsContent(const QString &tsFilename, SymbianLo
QXmlStreamReader xml(&tsFile);
- while (xml.name() != tsElement)
+ while (!xml.atEnd() && xml.name() != tsElement)
xml.readNextStartElement();
while (xml.readNextStartElement()) {
diff --git a/src/corelib/io/qdatastream.cpp b/src/corelib/io/qdatastream.cpp
index 58f0190..73ce490 100644
--- a/src/corelib/io/qdatastream.cpp
+++ b/src/corelib/io/qdatastream.cpp
@@ -223,6 +223,7 @@ QT_BEGIN_NAMESPACE
\value ReadPastEnd The data stream has read past the end of the
data in the underlying device.
\value ReadCorruptData The data stream has read corrupt data.
+ \value WriteFailed The data stream cannot write to the underlying device.
*/
/*****************************************************************************
@@ -243,6 +244,11 @@ QT_BEGIN_NAMESPACE
}
#endif
+#define CHECK_STREAM_WRITE_PRECOND(retVal) \
+ CHECK_STREAM_PRECOND(retVal) \
+ if (q_status != Ok) \
+ return retVal;
+
enum {
DefaultStreamVersion = QDataStream::Qt_4_6
};
@@ -495,6 +501,9 @@ void QDataStream::resetStatus()
/*!
Sets the status of the data stream to the \a status given.
+ Subsequent calls to setStatus() are ignored until resetStatus()
+ is called.
+
\sa Status status() resetStatus()
*/
void QDataStream::setStatus(Status status)
@@ -992,8 +1001,9 @@ int QDataStream::readRawData(char *s, int len)
QDataStream &QDataStream::operator<<(qint8 i)
{
- CHECK_STREAM_PRECOND(*this)
- dev->putChar(i);
+ CHECK_STREAM_WRITE_PRECOND(*this)
+ if (!dev->putChar(i))
+ q_status = WriteFailed;
return *this;
}
@@ -1015,11 +1025,12 @@ QDataStream &QDataStream::operator<<(qint8 i)
QDataStream &QDataStream::operator<<(qint16 i)
{
- CHECK_STREAM_PRECOND(*this)
+ CHECK_STREAM_WRITE_PRECOND(*this)
if (!noswap) {
i = qbswap(i);
}
- dev->write((char *)&i, sizeof(qint16));
+ if (dev->write((char *)&i, sizeof(qint16)) != sizeof(qint16))
+ q_status = WriteFailed;
return *this;
}
@@ -1032,11 +1043,12 @@ QDataStream &QDataStream::operator<<(qint16 i)
QDataStream &QDataStream::operator<<(qint32 i)
{
- CHECK_STREAM_PRECOND(*this)
+ CHECK_STREAM_WRITE_PRECOND(*this)
if (!noswap) {
i = qbswap(i);
}
- dev->write((char *)&i, sizeof(qint32));
+ if (dev->write((char *)&i, sizeof(qint32)) != sizeof(qint32))
+ q_status = WriteFailed;
return *this;
}
@@ -1057,7 +1069,7 @@ QDataStream &QDataStream::operator<<(qint32 i)
QDataStream &QDataStream::operator<<(qint64 i)
{
- CHECK_STREAM_PRECOND(*this)
+ CHECK_STREAM_WRITE_PRECOND(*this)
if (version() < 6) {
quint32 i1 = i & 0xffffffff;
quint32 i2 = i >> 32;
@@ -1066,7 +1078,8 @@ QDataStream &QDataStream::operator<<(qint64 i)
if (!noswap) {
i = qbswap(i);
}
- dev->write((char *)&i, sizeof(qint64));
+ if (dev->write((char *)&i, sizeof(qint64)) != sizeof(qint64))
+ q_status = WriteFailed;
}
return *this;
}
@@ -1086,8 +1099,9 @@ QDataStream &QDataStream::operator<<(qint64 i)
QDataStream &QDataStream::operator<<(bool i)
{
- CHECK_STREAM_PRECOND(*this)
- dev->putChar(qint8(i));
+ CHECK_STREAM_WRITE_PRECOND(*this)
+ if (!dev->putChar(qint8(i)))
+ q_status = WriteFailed;
return *this;
}
@@ -1108,7 +1122,7 @@ QDataStream &QDataStream::operator<<(float f)
return *this;
}
- CHECK_STREAM_PRECOND(*this)
+ CHECK_STREAM_WRITE_PRECOND(*this)
float g = f; // fixes float-on-stack problem
if (!noswap) {
union {
@@ -1119,7 +1133,8 @@ QDataStream &QDataStream::operator<<(float f)
x.val2 = qbswap(x.val2);
g = x.val1;
}
- dev->write((char *)&g, sizeof(float));
+ if (dev->write((char *)&g, sizeof(float)) != sizeof(float))
+ q_status = WriteFailed;
return *this;
}
@@ -1141,10 +1156,11 @@ QDataStream &QDataStream::operator<<(double f)
return *this;
}
- CHECK_STREAM_PRECOND(*this)
+ CHECK_STREAM_WRITE_PRECOND(*this)
#ifndef Q_DOUBLE_FORMAT
if (noswap) {
- dev->write((char *)&f, sizeof(double));
+ if (dev->write((char *)&f, sizeof(double)) != sizeof(double))
+ q_status = WriteFailed;
} else {
union {
double val1;
@@ -1152,7 +1168,8 @@ QDataStream &QDataStream::operator<<(double f)
} x;
x.val1 = f;
x.val2 = qbswap(x.val2);
- dev->write((char *)&x.val2, sizeof(double));
+ if (dev->write((char *)&x.val2, sizeof(double)) != sizeof(double))
+ q_status = WriteFailed;
}
#else
union {
@@ -1181,7 +1198,8 @@ QDataStream &QDataStream::operator<<(double f)
b[Q_DF(1)] = *p++;
b[Q_DF(0)] = *p;
}
- dev->write(b, 8);
+ if (dev->write(b, 8) != 8)
+ q_status = WriteFailed;
#endif
return *this;
}
@@ -1221,7 +1239,7 @@ QDataStream &QDataStream::operator<<(const char *s)
QDataStream &QDataStream::writeBytes(const char *s, uint len)
{
- CHECK_STREAM_PRECOND(*this)
+ CHECK_STREAM_WRITE_PRECOND(*this)
*this << (quint32)len; // write length specifier
if (len)
writeRawData(s, len);
@@ -1239,8 +1257,11 @@ QDataStream &QDataStream::writeBytes(const char *s, uint len)
int QDataStream::writeRawData(const char *s, int len)
{
- CHECK_STREAM_PRECOND(-1)
- return dev->write(s, len);
+ CHECK_STREAM_WRITE_PRECOND(-1)
+ int ret = dev->write(s, len);
+ if (ret != len)
+ q_status = WriteFailed;
+ return ret;
}
/*!
diff --git a/src/corelib/io/qdatastream.h b/src/corelib/io/qdatastream.h
index 774c4bc..05248ac 100644
--- a/src/corelib/io/qdatastream.h
+++ b/src/corelib/io/qdatastream.h
@@ -101,7 +101,8 @@ public:
enum Status {
Ok,
ReadPastEnd,
- ReadCorruptData
+ ReadCorruptData,
+ WriteFailed
};
enum FloatingPointPrecision {
diff --git a/src/corelib/io/qdiriterator.cpp b/src/corelib/io/qdiriterator.cpp
index a8192ea..be392c4 100644
--- a/src/corelib/io/qdiriterator.cpp
+++ b/src/corelib/io/qdiriterator.cpp
@@ -423,9 +423,6 @@ QDirIterator::QDirIterator(const QDir &dir, IteratorFlags flags)
\note To list symlinks that point to non existing files, QDir::System must be
passed to the flags.
- \warning This constructor expects \a flags to be left at its default value. Use
- the constructors that do not take the \a filters argument instead.
-
\sa hasNext(), next(), IteratorFlags
*/
QDirIterator::QDirIterator(const QString &path, QDir::Filters filters, IteratorFlags flags)
@@ -461,9 +458,6 @@ QDirIterator::QDirIterator(const QString &path, IteratorFlags flags)
\note To list symlinks that point to non existing files, QDir::System must be
passed to the flags.
- \warning This constructor expects \c flags to be left at its default value. Use the
- constructors that do not take the \a filters argument instead.
-
\sa hasNext(), next(), IteratorFlags
*/
QDirIterator::QDirIterator(const QString &path, const QStringList &nameFilters,
diff --git a/src/corelib/io/qfile.cpp b/src/corelib/io/qfile.cpp
index 85e78a6..e3bc8da 100644
--- a/src/corelib/io/qfile.cpp
+++ b/src/corelib/io/qfile.cpp
@@ -103,7 +103,7 @@ QFilePrivate::~QFilePrivate()
}
bool
-QFilePrivate::openExternalFile(int flags, int fd)
+QFilePrivate::openExternalFile(int flags, int fd, QFile::FileHandleFlags handleFlags)
{
#ifdef QT_NO_FSFILEENGINE
Q_UNUSED(flags);
@@ -113,14 +113,13 @@ QFilePrivate::openExternalFile(int flags, int fd)
delete fileEngine;
fileEngine = 0;
QFSFileEngine *fe = new QFSFileEngine;
- fe->setFileName(fileName);
fileEngine = fe;
- return fe->open(QIODevice::OpenMode(flags), fd);
+ return fe->open(QIODevice::OpenMode(flags), fd, handleFlags);
#endif
}
bool
-QFilePrivate::openExternalFile(int flags, FILE *fh)
+QFilePrivate::openExternalFile(int flags, FILE *fh, QFile::FileHandleFlags handleFlags)
{
#ifdef QT_NO_FSFILEENGINE
Q_UNUSED(flags);
@@ -130,12 +129,28 @@ QFilePrivate::openExternalFile(int flags, FILE *fh)
delete fileEngine;
fileEngine = 0;
QFSFileEngine *fe = new QFSFileEngine;
- fe->setFileName(fileName);
fileEngine = fe;
- return fe->open(QIODevice::OpenMode(flags), fh);
+ return fe->open(QIODevice::OpenMode(flags), fh, handleFlags);
#endif
}
+#ifdef Q_OS_SYMBIAN
+bool QFilePrivate::openExternalFile(int flags, const RFile &f, QFile::FileHandleFlags handleFlags)
+{
+#ifdef QT_NO_FSFILEENGINE
+ Q_UNUSED(flags);
+ Q_UNUSED(fh);
+ return false;
+#else
+ delete fileEngine;
+ fileEngine = 0;
+ QFSFileEngine *fe = new QFSFileEngine;
+ fileEngine = fe;
+ return fe->open(QIODevice::OpenMode(flags), f, handleFlags);
+#endif
+}
+#endif
+
inline bool QFilePrivate::ensureFlushed() const
{
// This function ensures that the write buffer has been flushed (const
@@ -341,6 +356,20 @@ QFilePrivate::setError(QFile::FileError err, int errNum)
\snippet doc/src/snippets/ntfsp.cpp 1
*/
+/*!
+ \enum QFile::FileHandleFlag
+
+ This enum is used when opening a file to specify additional
+ options which only apply to files and not to a generic
+ QIODevice.
+
+ \value AutoCloseHandle The file handle passed into open() should be
+ closed by close(), the default behaviour is that close just flushes
+ the file and the app is responsible for closing the file handle. When
+ opening a file by name, this flag is ignored as Qt always "owns" the
+ file handle and must close it.
+ */
+
#ifdef QT3_SUPPORT
/*!
\typedef QFile::PermissionSpec
@@ -1058,8 +1087,57 @@ bool QFile::open(OpenMode mode)
\snippet doc/src/snippets/code/src_corelib_io_qfile.cpp 4
*/
+// ### Qt5: merge this into new overload with a default parameter
bool QFile::open(FILE *fh, OpenMode mode)
{
+ return open(fh, mode, DontCloseHandle);
+}
+
+/*!
+ \overload
+
+ Opens the existing file handle \a fh in the given \a mode.
+ Returns true if successful; otherwise returns false.
+
+ Example:
+ \snippet doc/src/snippets/code/src_corelib_io_qfile.cpp 3
+
+ When a QFile is opened using this function, behaviour of close() is
+ controlled by the AutoCloseHandle flag.
+ If AutoCloseHandle is specified, and this function succeeds,
+ then calling close() closes the adopted handle.
+ Otherwise, close() does not actually close the file, but only flushes it.
+
+ \bold{Warning:}
+ \list 1
+ \o If \a fh does not refer to a regular file, e.g., it is \c stdin,
+ \c stdout, or \c stderr, you may not be able to seek(). size()
+ returns \c 0 in those cases. See QIODevice::isSequential() for
+ more information.
+ \o Since this function opens the file without specifying the file name,
+ you cannot use this QFile with a QFileInfo.
+ \endlist
+
+ \note For Windows CE you may not be able to call resize().
+
+ \sa close(), {qmake Variable Reference#CONFIG}{qmake Variable Reference}
+
+ \bold{Note for the Windows Platform}
+
+ \a fh must be opened in binary mode (i.e., the mode string must contain
+ 'b', as in "rb" or "wb") when accessing files and other random-access
+ devices. Qt will translate the end-of-line characters if you pass
+ QIODevice::Text to \a mode. Sequential devices, such as stdin and stdout,
+ are unaffected by this limitation.
+
+ You need to enable support for console applications in order to use the
+ stdin, stdout and stderr streams at the console. To do this, add the
+ following declaration to your application's project file:
+
+ \snippet doc/src/snippets/code/src_corelib_io_qfile.cpp 4
+*/
+bool QFile::open(FILE *fh, OpenMode mode, FileHandleFlags handleFlags)
+{
Q_D(QFile);
if (isOpen()) {
qWarning("QFile::open: File (%s) already open", qPrintable(fileName()));
@@ -1072,7 +1150,7 @@ bool QFile::open(FILE *fh, OpenMode mode)
qWarning("QFile::open: File access not specified");
return false;
}
- if(d->openExternalFile(mode, fh)) {
+ if (d->openExternalFile(mode, fh, handleFlags)) {
QIODevice::open(mode);
if (mode & Append) {
seek(size());
@@ -1118,8 +1196,44 @@ bool QFile::open(FILE *fh, OpenMode mode)
\sa close()
*/
+// ### Qt5: merge this into new overload with a default parameter
bool QFile::open(int fd, OpenMode mode)
{
+ return open(fd, mode, DontCloseHandle);
+}
+
+/*!
+ \overload
+
+ Opens the existing file descriptor \a fd in the given \a mode.
+ Returns true if successful; otherwise returns false.
+
+ When a QFile is opened using this function, behaviour of close() is
+ controlled by the AutoCloseHandle flag.
+ If AutoCloseHandle is specified, and this function succeeds,
+ then calling close() closes the adopted handle.
+ Otherwise, close() does not actually close the file, but only flushes it.
+
+ The QFile that is opened using this function is automatically set
+ to be in raw mode; this means that the file input/output functions
+ are slow. If you run into performance issues, you should try to
+ use one of the other open functions.
+
+ \warning If \a fd is not a regular file, e.g, it is 0 (\c stdin),
+ 1 (\c stdout), or 2 (\c stderr), you may not be able to seek(). In
+ those cases, size() returns \c 0. See QIODevice::isSequential()
+ for more information.
+
+ \warning For Windows CE you may not be able to call seek(), setSize(),
+ fileTime(). size() returns \c 0.
+
+ \warning Since this function opens the file without specifying the file name,
+ you cannot use this QFile with a QFileInfo.
+
+ \sa close()
+*/
+bool QFile::open(int fd, OpenMode mode, FileHandleFlags handleFlags)
+{
Q_D(QFile);
if (isOpen()) {
qWarning("QFile::open: File (%s) already open", qPrintable(fileName()));
@@ -1132,7 +1246,7 @@ bool QFile::open(int fd, OpenMode mode)
qWarning("QFile::open: File access not specified");
return false;
}
- if(d->openExternalFile(mode, fd)) {
+ if (d->openExternalFile(mode, fd, handleFlags)) {
QIODevice::open(mode);
if (mode & Append) {
seek(size());
@@ -1146,6 +1260,63 @@ bool QFile::open(int fd, OpenMode mode)
return false;
}
+#ifdef Q_OS_SYMBIAN
+/*!
+ \overload
+
+ Opens the existing file object \a f in the given \a mode.
+ Returns true if successful; otherwise returns false.
+
+ When a QFile is opened using this function, behaviour of close() is
+ controlled by the AutoCloseHandle flag.
+ If AutoCloseHandle is specified, and this function succeeds,
+ then calling close() closes the adopted handle.
+ Otherwise, close() does not actually close the file, but only flushes it.
+
+ \warning If the file handle is adopted from another process,
+ you may not be able to use this QFile with a QFileInfo.
+
+ \sa close()
+*/
+bool QFile::open(const RFile &f, OpenMode mode, FileHandleFlags handleFlags)
+{
+ Q_D(QFile);
+ if (isOpen()) {
+ qWarning("QFile::open: File (%s) already open", qPrintable(fileName()));
+ return false;
+ }
+ if (mode & Append)
+ mode |= WriteOnly;
+ unsetError();
+ if ((mode & (ReadOnly | WriteOnly)) == 0) {
+ qWarning("QFile::open: File access not specified");
+ return false;
+ }
+ if (d->openExternalFile(mode, f, handleFlags)) {
+ bool ok = QIODevice::open(mode);
+ if (ok) {
+ if (mode & Append) {
+ ok = seek(size());
+ } else {
+ qint64 pos = 0;
+ TInt err;
+#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
+ err = static_cast<const RFile64&>(f).Seek(ESeekCurrent, pos);
+#else
+ TInt pos32 = 0;
+ err = f.Seek(ESeekCurrent, pos32);
+ pos = pos32;
+#endif
+ ok = ok && (err == KErrNone);
+ ok = ok && seek(pos);
+ }
+ }
+ return ok;
+ }
+ return false;
+}
+#endif
+
/*!
Returns the file handle of the file.
diff --git a/src/corelib/io/qfile.h b/src/corelib/io/qfile.h
index 212576c..fa9e5aa 100644
--- a/src/corelib/io/qfile.h
+++ b/src/corelib/io/qfile.h
@@ -45,6 +45,9 @@
#include <QtCore/qiodevice.h>
#include <QtCore/qstring.h>
#include <stdio.h>
+#ifdef Q_OS_SYMBIAN
+#include <f32file.h>
+#endif
#ifdef open
#error qfile.h must be included before any header file that defines open
@@ -97,6 +100,12 @@ public:
};
Q_DECLARE_FLAGS(Permissions, Permission)
+ enum FileHandleFlag {
+ AutoCloseHandle = 0x0001,
+ DontCloseHandle = 0
+ };
+ Q_DECLARE_FLAGS(FileHandleFlags, FileHandleFlag)
+
QFile();
QFile(const QString &name);
#ifndef QT_NO_QOBJECT
@@ -145,6 +154,11 @@ public:
bool open(OpenMode flags);
bool open(FILE *f, OpenMode flags);
bool open(int fd, OpenMode flags);
+#ifdef Q_OS_SYMBIAN
+ bool open(const RFile &f, OpenMode flags, FileHandleFlags handleFlags = DontCloseHandle);
+#endif
+ bool open(FILE *f, OpenMode ioFlags, FileHandleFlags handleFlags);
+ bool open(int fd, OpenMode ioFlags, FileHandleFlags handleFlags);
virtual void close();
qint64 size() const;
diff --git a/src/corelib/io/qfile_p.h b/src/corelib/io/qfile_p.h
index cf76c09..085bbf0 100644
--- a/src/corelib/io/qfile_p.h
+++ b/src/corelib/io/qfile_p.h
@@ -67,8 +67,11 @@ protected:
QFilePrivate();
~QFilePrivate();
- bool openExternalFile(int flags, int fd);
- bool openExternalFile(int flags, FILE *fh);
+ bool openExternalFile(int flags, int fd, QFile::FileHandleFlags handleFlags);
+ bool openExternalFile(int flags, FILE *fh, QFile::FileHandleFlags handleFlags);
+#ifdef Q_OS_SYMBIAN
+ bool openExternalFile(int flags, const RFile& f, QFile::FileHandleFlags handleFlags);
+#endif
QString fileName;
mutable QAbstractFileEngine *fileEngine;
diff --git a/src/corelib/io/qfsfileengine.cpp b/src/corelib/io/qfsfileengine.cpp
index ae301f7..f1d3db5 100644
--- a/src/corelib/io/qfsfileengine.cpp
+++ b/src/corelib/io/qfsfileengine.cpp
@@ -230,6 +230,11 @@ bool QFSFileEngine::open(QIODevice::OpenMode openMode)
*/
bool QFSFileEngine::open(QIODevice::OpenMode openMode, FILE *fh)
{
+ return open(openMode, fh, QFile::DontCloseHandle);
+}
+
+bool QFSFileEngine::open(QIODevice::OpenMode openMode, FILE *fh, QFile::FileHandleFlags handleFlags)
+{
Q_D(QFSFileEngine);
// Append implies WriteOnly.
@@ -242,7 +247,7 @@ bool QFSFileEngine::open(QIODevice::OpenMode openMode, FILE *fh)
d->openMode = openMode;
d->lastFlushFailed = false;
- d->closeFileHandle = false;
+ d->closeFileHandle = (handleFlags & QFile::AutoCloseHandle);
d->fileEntry.clear();
d->tried_stat = 0;
d->fd = -1;
@@ -286,6 +291,11 @@ bool QFSFileEnginePrivate::openFh(QIODevice::OpenMode openMode, FILE *fh)
*/
bool QFSFileEngine::open(QIODevice::OpenMode openMode, int fd)
{
+ return open(openMode, fd, QFile::DontCloseHandle);
+}
+
+bool QFSFileEngine::open(QIODevice::OpenMode openMode, int fd, QFile::FileHandleFlags handleFlags)
+{
Q_D(QFSFileEngine);
// Append implies WriteOnly.
@@ -298,7 +308,7 @@ bool QFSFileEngine::open(QIODevice::OpenMode openMode, int fd)
d->openMode = openMode;
d->lastFlushFailed = false;
- d->closeFileHandle = false;
+ d->closeFileHandle = (handleFlags & QFile::AutoCloseHandle);
d->fileEntry.clear();
d->fh = 0;
d->fd = -1;
diff --git a/src/corelib/io/qfsfileengine.h b/src/corelib/io/qfsfileengine.h
index 6b077ed..73c8c77 100644
--- a/src/corelib/io/qfsfileengine.h
+++ b/src/corelib/io/qfsfileengine.h
@@ -43,6 +43,9 @@
#define QFSFILEENGINE_H
#include <QtCore/qabstractfileengine.h>
+#ifdef Q_OS_SYMBIAN
+#include <f32file.h>
+#endif
#ifndef QT_NO_FSFILEENGINE
@@ -101,6 +104,11 @@ public:
//FS only!!
bool open(QIODevice::OpenMode flags, int fd);
+ bool open(QIODevice::OpenMode flags, int fd, QFile::FileHandleFlags handleFlags);
+ bool open(QIODevice::OpenMode flags, FILE *fh, QFile::FileHandleFlags handleFlags);
+#ifdef Q_OS_SYMBIAN
+ bool open(QIODevice::OpenMode flags, const RFile &f, QFile::FileHandleFlags handleFlags);
+#endif
static bool setCurrentPath(const QString &path);
static QString currentPath(const QString &path = QString());
static QString homePath();
diff --git a/src/corelib/io/qfsfileengine_unix.cpp b/src/corelib/io/qfsfileengine_unix.cpp
index 1e1b35b..d0350f0 100644
--- a/src/corelib/io/qfsfileengine_unix.cpp
+++ b/src/corelib/io/qfsfileengine_unix.cpp
@@ -251,6 +251,65 @@ bool QFSFileEnginePrivate::nativeOpen(QIODevice::OpenMode openMode)
closeFileHandle = true;
return true;
}
+
+bool QFSFileEngine::open(QIODevice::OpenMode openMode, const RFile &file, QFile::FileHandleFlags handleFlags)
+{
+ Q_D(QFSFileEngine);
+
+ // Append implies WriteOnly.
+ if (openMode & QFile::Append)
+ openMode |= QFile::WriteOnly;
+
+ // WriteOnly implies Truncate if neither ReadOnly nor Append are sent.
+ if ((openMode & QFile::WriteOnly) && !(openMode & (QFile::ReadOnly | QFile::Append)))
+ openMode |= QFile::Truncate;
+
+ d->openMode = openMode;
+ d->lastFlushFailed = false;
+ d->closeFileHandle = (handleFlags & QFile::AutoCloseHandle);
+ d->fileEntry.clear();
+ d->fh = 0;
+ d->fd = -1;
+ d->tried_stat = 0;
+
+#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
+ //RFile64 adds only functions to RFile, no data members
+ d->symbianFile = static_cast<const RFile64&>(file);
+#else
+ d->symbianFile = file;
+#endif
+ TInt ret;
+ d->symbianFilePos = 0;
+ if (openMode & QFile::Append) {
+ // Seek to the end when in Append mode.
+ ret = d->symbianFile.Size(d->symbianFilePos);
+ } else {
+ // Seek to current otherwise
+ ret = d->symbianFile.Seek(ESeekCurrent, d->symbianFilePos);
+ }
+
+ if (ret != KErrNone) {
+ setError(QFile::OpenError, QSystemError(ret, QSystemError::NativeError).toString());
+
+ d->openMode = QIODevice::NotOpen;
+#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
+ d->symbianFile = RFile64();
+#else
+ d->symbianFile = RFile();
+#endif
+ return false;
+ }
+
+ // Extract filename (best effort)
+ TFileName fn;
+ TInt err = d->symbianFile.FullName(fn);
+ if (err == KErrNone)
+ d->fileEntry = QFileSystemEntry(qt_TDesC2QString(fn), QFileSystemEntry::FromNativePath());
+ else
+ d->fileEntry.clear();
+
+ return true;
+}
#else
/*!
\internal
diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp
index 216c382..e52d132 100644
--- a/src/corelib/io/qprocess_unix.cpp
+++ b/src/corelib/io/qprocess_unix.cpp
@@ -169,17 +169,27 @@ private:
Q_GLOBAL_STATIC(QMutex, processManagerGlobalMutex)
-static QProcessManager *processManager() {
+static QProcessManager *processManagerInstance = 0;
+
+static QProcessManager *processManager()
+{
// The constructor of QProcessManager should be called only once
// so we cannot use Q_GLOBAL_STATIC directly for QProcessManager
QMutex *mutex = processManagerGlobalMutex();
QMutexLocker locker(mutex);
- static QProcessManager processManager;
- return &processManager;
+
+ if (!processManagerInstance)
+ QProcessPrivate::initializeProcessManager();
+
+ Q_ASSERT(processManagerInstance);
+ return processManagerInstance;
}
QProcessManager::QProcessManager()
{
+ // can only be called from main thread
+ Q_ASSERT(!qApp || qApp->thread() == QThread::currentThread());
+
#if defined (QPROCESS_DEBUG)
qDebug() << "QProcessManager::QProcessManager()";
#endif
@@ -198,6 +208,8 @@ QProcessManager::QProcessManager()
::sigaction(SIGCHLD, &action, &oldAction);
if (oldAction.sa_handler != qt_sa_sigchld_handler)
qt_sa_old_sigchld_handler = oldAction.sa_handler;
+
+ processManagerInstance = this;
}
QProcessManager::~QProcessManager()
@@ -226,6 +238,8 @@ QProcessManager::~QProcessManager()
if (oldAction.sa_handler != qt_sa_sigchld_handler) {
::sigaction(SIGCHLD, &oldAction, 0);
}
+
+ processManagerInstance = 0;
}
void QProcessManager::run()
@@ -1289,7 +1303,15 @@ bool QProcessPrivate::startDetached(const QString &program, const QStringList &a
void QProcessPrivate::initializeProcessManager()
{
- (void) processManager();
+ if (qApp && qApp->thread() != QThread::currentThread()) {
+ // The process manager must be initialized in the main thread
+ // Note: The call below will re-enter this function, but in the right thread,
+ // so the else statement below will be executed.
+ QMetaObject::invokeMethod(qApp, "_q_initializeProcessManager", Qt::BlockingQueuedConnection);
+ } else {
+ static QProcessManager processManager;
+ Q_UNUSED(processManager);
+ }
}
QT_END_NAMESPACE
diff --git a/src/corelib/io/qresource.cpp b/src/corelib/io/qresource.cpp
index 98b1dcc..72ab845 100644
--- a/src/corelib/io/qresource.cpp
+++ b/src/corelib/io/qresource.cpp
@@ -187,7 +187,7 @@ Q_GLOBAL_STATIC(QStringList, resourceSearchPaths)
A QResource can either be loaded with an absolute path, either treated
as a file system rooted with a \c{/} character, or in resource notation
rooted with a \c{:} character. A relative resource can also be opened
- which will be found through the searchPaths().
+ which will be found in the list of paths returned by QDir::searchPaths().
A QResource that is representing a file will have data backing it, this
data can possibly be compressed, in which case qUncompress() must be
diff --git a/src/corelib/io/qtextstream.cpp b/src/corelib/io/qtextstream.cpp
index 6091ec0..3bdbf32 100644
--- a/src/corelib/io/qtextstream.cpp
+++ b/src/corelib/io/qtextstream.cpp
@@ -224,6 +224,7 @@ static const int QTEXTSTREAM_BUFFERSIZE = 16384;
\value ReadPastEnd The text stream has read past the end of the
data in the underlying device.
\value ReadCorruptData The text stream has read corrupt data.
+ \value WriteFailed The text stream cannot write to the underlying device.
\sa status()
*/
@@ -396,19 +397,19 @@ public:
npsInvalidPrefix
};
- inline bool write(const QString &data);
inline bool getChar(QChar *ch);
inline void ungetChar(const QChar &ch);
NumberParsingStatus getNumber(qulonglong *l);
bool getReal(double *f);
- bool putNumber(qulonglong number, bool negative);
- inline bool putString(const QString &ch, bool number = false);
+ inline void write(const QString &data);
+ inline void putString(const QString &ch, bool number = false);
+ void putNumber(qulonglong number, bool negative);
// buffers
bool fillReadBuffer(qint64 maxBytes = -1);
void resetReadBuffer();
- bool flushWriteBuffer();
+ void flushWriteBuffer();
QString writeBuffer;
QString readBuffer;
int readBufferOffset;
@@ -642,14 +643,20 @@ void QTextStreamPrivate::resetReadBuffer()
/*! \internal
*/
-bool QTextStreamPrivate::flushWriteBuffer()
+void QTextStreamPrivate::flushWriteBuffer()
{
// no buffer next to the QString itself; this function should only
// be called internally, for devices.
if (string || !device)
- return false;
+ return;
+
+ // Stream went bye-bye already. Appending further data may succeed again,
+ // but would create a corrupted stream anyway.
+ if (status != QTextStream::Ok)
+ return;
+
if (writeBuffer.isEmpty())
- return true;
+ return;
#if defined (Q_OS_WIN)
// handle text translation and bypass the Text flag in the device.
@@ -681,8 +688,10 @@ bool QTextStreamPrivate::flushWriteBuffer()
qDebug("QTextStreamPrivate::flushWriteBuffer(), device->write(\"%s\") == %d",
qt_prettyDebug(data.constData(), qMin(data.size(),32), data.size()).constData(), int(bytesWritten));
#endif
- if (bytesWritten <= 0)
- return false;
+ if (bytesWritten <= 0) {
+ status = QTextStream::WriteFailed;
+ return;
+ }
#if defined (Q_OS_WIN)
// replace the text flag
@@ -693,7 +702,7 @@ bool QTextStreamPrivate::flushWriteBuffer()
// flush the file
#ifndef QT_NO_QOBJECT
QFile *file = qobject_cast<QFile *>(device);
- bool flushed = file && file->flush();
+ bool flushed = !file || file->flush();
#else
bool flushed = true;
#endif
@@ -702,7 +711,8 @@ bool QTextStreamPrivate::flushWriteBuffer()
qDebug("QTextStreamPrivate::flushWriteBuffer() wrote %d bytes",
int(bytesWritten));
#endif
- return flushed && bytesWritten == qint64(data.size());
+ if (!flushed || bytesWritten != qint64(data.size()))
+ status = QTextStream::WriteFailed;
}
QString QTextStreamPrivate::read(int maxlen)
@@ -908,7 +918,7 @@ inline void QTextStreamPrivate::restoreToSavedConverterState()
/*! \internal
*/
-inline bool QTextStreamPrivate::write(const QString &data)
+inline void QTextStreamPrivate::write(const QString &data)
{
if (string) {
// ### What about seek()??
@@ -916,9 +926,8 @@ inline bool QTextStreamPrivate::write(const QString &data)
} else {
writeBuffer += data;
if (writeBuffer.size() > QTEXTSTREAM_BUFFERSIZE)
- return flushWriteBuffer();
+ flushWriteBuffer();
}
- return true;
}
/*! \internal
@@ -959,7 +968,7 @@ inline void QTextStreamPrivate::ungetChar(const QChar &ch)
/*! \internal
*/
-inline bool QTextStreamPrivate::putString(const QString &s, bool number)
+inline void QTextStreamPrivate::putString(const QString &s, bool number)
{
QString tmp = s;
@@ -993,7 +1002,7 @@ inline bool QTextStreamPrivate::putString(const QString &s, bool number)
qt_prettyDebug(a.constData(), a.size(), qMax(16, a.size())).constData(),
qt_prettyDebug(b.constData(), b.size(), qMax(16, b.size())).constData());
#endif
- return write(tmp);
+ write(tmp);
}
/*!
@@ -1593,6 +1602,9 @@ void QTextStream::resetStatus()
Sets the status of the text stream to the \a status given.
+ Subsequent calls to setStatus() are ignored until resetStatus()
+ is called.
+
\sa Status status() resetStatus()
*/
void QTextStream::setStatus(Status status)
@@ -2267,7 +2279,7 @@ QTextStream &QTextStream::operator>>(char *c)
/*! \internal
*/
-bool QTextStreamPrivate::putNumber(qulonglong number, bool negative)
+void QTextStreamPrivate::putNumber(qulonglong number, bool negative)
{
QString result;
@@ -2307,7 +2319,7 @@ bool QTextStreamPrivate::putNumber(qulonglong number, bool negative)
result.prepend(QLatin1Char('0'));
}
}
- return putString(result, true);
+ putString(result, true);
}
/*!
diff --git a/src/corelib/io/qtextstream.h b/src/corelib/io/qtextstream.h
index d82da59..c635691 100644
--- a/src/corelib/io/qtextstream.h
+++ b/src/corelib/io/qtextstream.h
@@ -89,7 +89,8 @@ public:
enum Status {
Ok,
ReadPastEnd,
- ReadCorruptData
+ ReadCorruptData,
+ WriteFailed
};
enum NumberFlag {
ShowBase = 0x1,
diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp
index 0f95ee0..799433b 100644
--- a/src/corelib/kernel/qcoreapplication.cpp
+++ b/src/corelib/kernel/qcoreapplication.cpp
@@ -336,6 +336,16 @@ void QCoreApplicationPrivate::createEventDispatcher()
#endif
}
+void QCoreApplicationPrivate::_q_initializeProcessManager()
+{
+#ifndef QT_NO_PROCESS
+# ifdef Q_OS_UNIX
+ QProcessPrivate::initializeProcessManager();
+# endif
+#endif
+}
+
+
QThread *QCoreApplicationPrivate::theMainThread = 0;
QThread *QCoreApplicationPrivate::mainThread()
{
@@ -600,12 +610,6 @@ void QCoreApplication::init()
}
#endif
-#if defined(Q_OS_UNIX) && !(defined(QT_NO_PROCESS))
- // Make sure the process manager thread object is created in the main
- // thread.
- QProcessPrivate::initializeProcessManager();
-#endif
-
#ifdef QT_EVAL
extern void qt_core_eval_init(uint);
qt_core_eval_init(d->application_type);
@@ -2666,3 +2670,5 @@ int QCoreApplication::loopLevel()
*/
QT_END_NAMESPACE
+
+#include "moc_qcoreapplication.cpp"
diff --git a/src/corelib/kernel/qcoreapplication.h b/src/corelib/kernel/qcoreapplication.h
index f1c7c26..17e784e 100644
--- a/src/corelib/kernel/qcoreapplication.h
+++ b/src/corelib/kernel/qcoreapplication.h
@@ -205,6 +205,7 @@ protected:
QCoreApplication(QCoreApplicationPrivate &p);
private:
+ Q_PRIVATE_SLOT(d_func(), void _q_initializeProcessManager())
static bool sendSpontaneousEvent(QObject *receiver, QEvent *event);
bool notifyInternal(QObject *receiver, QEvent *event);
diff --git a/src/corelib/kernel/qcoreapplication_p.h b/src/corelib/kernel/qcoreapplication_p.h
index 2355c37..aafa821 100644
--- a/src/corelib/kernel/qcoreapplication_p.h
+++ b/src/corelib/kernel/qcoreapplication_p.h
@@ -82,6 +82,8 @@ public:
bool sendThroughObjectEventFilters(QObject *, QEvent *);
bool notify_helper(QObject *, QEvent *);
+ void _q_initializeProcessManager();
+
virtual QString appName() const;
virtual void createEventDispatcher();
static void removePostedEvent(QEvent *);
diff --git a/src/corelib/thread/qmutex.cpp b/src/corelib/thread/qmutex.cpp
index b85a22d..1009f7b 100644
--- a/src/corelib/thread/qmutex.cpp
+++ b/src/corelib/thread/qmutex.cpp
@@ -45,6 +45,7 @@
#ifndef QT_NO_THREAD
#include "qatomic.h"
+#include "qelapsedtimer.h"
#include "qthread.h"
#include "qmutex_p.h"
@@ -157,15 +158,12 @@ void QMutex::lock()
return;
}
- bool isLocked = d->contenders.fetchAndAddAcquire(1) == 0;
+ bool isLocked = d->contenders.testAndSetAcquire(0, 1);
if (!isLocked) {
// didn't get the lock, wait for it
isLocked = d->wait();
Q_ASSERT_X(isLocked, "QMutex::lock",
"Internal error, infinite wait has timed out.");
-
- // don't need to wait for the lock anymore
- d->contenders.deref();
}
d->owner = self;
@@ -174,8 +172,7 @@ void QMutex::lock()
return;
}
-
- bool isLocked = d->contenders == 0 && d->contenders.testAndSetAcquire(0, 1);
+ bool isLocked = d->contenders.testAndSetAcquire(0, 1);
if (!isLocked) {
lockInternal();
}
@@ -211,7 +208,7 @@ bool QMutex::tryLock()
return true;
}
- bool isLocked = d->contenders == 0 && d->contenders.testAndSetAcquire(0, 1);
+ bool isLocked = d->contenders.testAndSetAcquire(0, 1);
if (!isLocked) {
// some other thread has the mutex locked, or we tried to
// recursively lock an non-recursive mutex
@@ -224,13 +221,7 @@ bool QMutex::tryLock()
return isLocked;
}
- bool isLocked = d->contenders == 0 && d->contenders.testAndSetAcquire(0, 1);
- if (!isLocked) {
- // some other thread has the mutex locked, or we tried to
- // recursively lock an non-recursive mutex
- return isLocked;
- }
- return isLocked;
+ return d->contenders.testAndSetAcquire(0, 1);
}
/*! \overload
@@ -269,13 +260,10 @@ bool QMutex::tryLock(int timeout)
return true;
}
- bool isLocked = d->contenders.fetchAndAddAcquire(1) == 0;
+ bool isLocked = d->contenders.testAndSetAcquire(0, 1);
if (!isLocked) {
// didn't get the lock, wait for it
isLocked = d->wait(timeout);
-
- // don't need to wait for the lock anymore
- d->contenders.deref();
if (!isLocked)
return false;
}
@@ -286,17 +274,9 @@ bool QMutex::tryLock(int timeout)
return true;
}
- bool isLocked = d->contenders.fetchAndAddAcquire(1) == 0;
- if (!isLocked) {
- // didn't get the lock, wait for it
- isLocked = d->wait(timeout);
-
- // don't need to wait for the lock anymore
- d->contenders.deref();
- if (!isLocked)
- return false;
- }
- return true;
+ return (d->contenders.testAndSetAcquire(0, 1)
+ // didn't get the lock, wait for it
+ || d->wait(timeout));
}
@@ -310,7 +290,6 @@ bool QMutex::tryLock(int timeout)
void QMutex::unlock()
{
QMutexPrivate *d = static_cast<QMutexPrivate *>(this->d);
-
if (d->recursive) {
if (!--d->count) {
d->owner = 0;
@@ -451,37 +430,57 @@ void QMutex::unlock()
void QMutex::lockInternal()
{
QMutexPrivate *d = static_cast<QMutexPrivate *>(this->d);
- int spinCount = 0;
- int lastSpinCount = d->lastSpinCount;
- enum { AdditionalSpins = 20, SpinCountPenalizationDivisor = 4 };
- const int maximumSpinCount = lastSpinCount + AdditionalSpins;
+ if (QThread::idealThreadCount() == 1) {
+ // don't spin on single cpu machines
+ bool isLocked = d->wait();
+ Q_ASSERT_X(isLocked, "QMutex::lock",
+ "Internal error, infinite wait has timed out.");
+ Q_UNUSED(isLocked);
+ return;
+ }
+ QElapsedTimer elapsedTimer;
+ elapsedTimer.start();
do {
- if (spinCount++ > maximumSpinCount) {
- // puts("spinning useless, sleeping");
- bool isLocked = d->contenders.fetchAndAddAcquire(1) == 0;
- if (!isLocked) {
-
- // didn't get the lock, wait for it
- isLocked = d->wait();
- Q_ASSERT_X(isLocked, "QMutex::lock",
- "Internal error, infinite wait has timed out.");
-
- // don't need to wait for the lock anymore
- d->contenders.deref();
+ qint64 spinTime = elapsedTimer.nsecsElapsed();
+ if (spinTime > d->maximumSpinTime) {
+ // didn't get the lock, wait for it, since we're not going to gain anything by spinning more
+ elapsedTimer.start();
+ bool isLocked = d->wait();
+ Q_ASSERT_X(isLocked, "QMutex::lock",
+ "Internal error, infinite wait has timed out.");
+ Q_UNUSED(isLocked);
+
+ qint64 maximumSpinTime = d->maximumSpinTime;
+ qint64 averageWaitTime = d->averageWaitTime;
+ qint64 actualWaitTime = elapsedTimer.nsecsElapsed();
+ if (actualWaitTime < (QMutexPrivate::MaximumSpinTimeThreshold * 3 / 2)) {
+ // measure the wait times
+ averageWaitTime = d->averageWaitTime = qMin((averageWaitTime + actualWaitTime) / 2, qint64(QMutexPrivate::MaximumSpinTimeThreshold));
}
- // decrease the lastSpinCount since we didn't actually get the lock by spinning
- spinCount = -d->lastSpinCount / SpinCountPenalizationDivisor;
- break;
+
+ // adjust the spin count when spinning does not benefit contention performance
+ if ((spinTime + actualWaitTime) - qint64(QMutexPrivate::MaximumSpinTimeThreshold) >= qint64(QMutexPrivate::MaximumSpinTimeThreshold)) {
+ // long waits, stop spinning
+ d->maximumSpinTime = 0;
+ } else {
+ // allow spinning if wait times decrease, but never spin more than the average wait time (otherwise we may perform worse)
+ d->maximumSpinTime = qBound(qint64(averageWaitTime * 3 / 2), maximumSpinTime / 2, qint64(QMutexPrivate::MaximumSpinTimeThreshold));
+ }
+ return;
}
+ // be a good citizen... yielding lets something else run if there is something to run, but may also relieve memory pressure if not
+ QThread::yieldCurrentThread();
} while (d->contenders != 0 || !d->contenders.testAndSetAcquire(0, 1));
- // adjust the last spin lock count
- lastSpinCount = d->lastSpinCount;
- d->lastSpinCount = spinCount >= 0
- ? qMax(lastSpinCount, spinCount)
- : lastSpinCount + spinCount;
+ // spinning is working, do not change the spin time (unless we are using much less time than allowed to spin)
+ qint64 maximumSpinTime = d->maximumSpinTime;
+ qint64 spinTime = elapsedTimer.nsecsElapsed();
+ if (spinTime < maximumSpinTime / 2) {
+ // we are using much less time than we need, adjust the limit
+ d->maximumSpinTime = qBound(qint64(d->averageWaitTime * 3 / 2), maximumSpinTime / 2, qint64(QMutexPrivate::MaximumSpinTimeThreshold));
+ }
}
/*!
diff --git a/src/corelib/thread/qmutex_p.h b/src/corelib/thread/qmutex_p.h
index 6126423..9d40bea 100644
--- a/src/corelib/thread/qmutex_p.h
+++ b/src/corelib/thread/qmutex_p.h
@@ -58,6 +58,10 @@
#include <QtCore/qnamespace.h>
#include <QtCore/qmutex.h>
+#if defined(Q_OS_MAC)
+# include <mach/semaphore.h>
+#endif
+
QT_BEGIN_NAMESPACE
class QMutexPrivate : public QMutexData {
@@ -65,15 +69,19 @@ public:
QMutexPrivate(QMutex::RecursionMode mode);
~QMutexPrivate();
- ulong self();
bool wait(int timeout = -1);
void wakeUp();
- volatile int lastSpinCount;
+ // 1ms = 1000000ns
+ enum { MaximumSpinTimeThreshold = 1000000 };
+ volatile qint64 maximumSpinTime;
+ volatile qint64 averageWaitTime;
Qt::HANDLE owner;
uint count;
-#if defined(Q_OS_UNIX)
+#if defined(Q_OS_MAC)
+ semaphore_t mach_semaphore;
+#elif defined(Q_OS_UNIX) && !defined(Q_OS_LINUX)
volatile bool wakeup;
pthread_mutex_t mutex;
pthread_cond_t cond;
diff --git a/src/corelib/thread/qmutex_unix.cpp b/src/corelib/thread/qmutex_unix.cpp
index 7e7ef22..0e09ea0 100644
--- a/src/corelib/thread/qmutex_unix.cpp
+++ b/src/corelib/thread/qmutex_unix.cpp
@@ -53,30 +53,116 @@
#undef wakeup
#endif
+#if defined(Q_OS_MAC)
+# include <mach/mach.h>
+# include <mach/task.h>
+#elif defined(Q_OS_LINUX)
+# include <linux/futex.h>
+# include <sys/syscall.h>
+# include <unistd.h>
+#endif
+
QT_BEGIN_NAMESPACE
+#if !defined(Q_OS_MAC) && !defined(Q_OS_LINUX)
static void report_error(int code, const char *where, const char *what)
{
if (code != 0)
qWarning("%s: %s failure: %s", where, what, qPrintable(qt_error_string(code)));
}
+#endif
QMutexPrivate::QMutexPrivate(QMutex::RecursionMode mode)
- : QMutexData(mode), lastSpinCount(0), owner(0), count(0), wakeup(false)
+ : QMutexData(mode), maximumSpinTime(MaximumSpinTimeThreshold), averageWaitTime(0), owner(0), count(0)
{
+#if defined(Q_OS_MAC)
+ kern_return_t r = semaphore_create(mach_task_self(), &mach_semaphore, SYNC_POLICY_FIFO, 0);
+ if (r != KERN_SUCCESS)
+ qWarning("QMutex: failed to create semaphore, error %d", r);
+#elif !defined(Q_OS_LINUX)
+ wakeup = false;
report_error(pthread_mutex_init(&mutex, NULL), "QMutex", "mutex init");
report_error(pthread_cond_init(&cond, NULL), "QMutex", "cv init");
+#endif
}
QMutexPrivate::~QMutexPrivate()
{
+#if defined(Q_OS_MAC)
+ kern_return_t r = semaphore_destroy(mach_task_self(), mach_semaphore);
+ if (r != KERN_SUCCESS)
+ qWarning("QMutex: failed to destroy semaphore, error %d", r);
+#elif !defined(Q_OS_LINUX)
report_error(pthread_cond_destroy(&cond), "QMutex", "cv destroy");
report_error(pthread_mutex_destroy(&mutex), "QMutex", "mutex destroy");
+#endif
+}
+
+#if defined(Q_OS_MAC)
+
+bool QMutexPrivate::wait(int timeout)
+{
+ if (contenders.fetchAndAddAcquire(1) == 0) {
+ // lock acquired without waiting
+ return true;
+ }
+ bool returnValue;
+ if (timeout < 0) {
+ returnValue = semaphore_wait(mach_semaphore) == KERN_SUCCESS;
+ } else {
+ mach_timespec_t ts;
+ ts.tv_nsec = ((timeout % 1000) * 1000) * 1000;
+ ts.tv_sec = (timeout / 1000);
+ kern_return_t r = semaphore_timedwait(mach_semaphore, ts);
+ returnValue = r == KERN_SUCCESS;
+ }
+ contenders.deref();
+ return returnValue;
+}
+
+void QMutexPrivate::wakeUp()
+{
+ semaphore_signal(mach_semaphore);
+}
+
+#elif defined(Q_OS_LINUX)
+
+static inline int _q_futex(volatile int *addr, int op, int val, const struct timespec *timeout, int *addr2, int val2)
+{
+ return syscall(SYS_futex, addr, op, val, timeout, addr2, val2);
}
bool QMutexPrivate::wait(int timeout)
{
+ while (contenders.fetchAndStoreAcquire(2) > 0) {
+ struct timespec ts, *pts = 0;
+ if (timeout >= 0) {
+ ts.tv_nsec = ((timeout % 1000) * 1000) * 1000;
+ ts.tv_sec = (timeout / 1000);
+ pts = &ts;
+ }
+ int r = _q_futex(&contenders._q_value, FUTEX_WAIT, 2, pts, 0, 0);
+ if (r != 0 && errno == ETIMEDOUT)
+ return false;
+ }
+ return true;
+}
+
+void QMutexPrivate::wakeUp()
+{
+ (void) contenders.fetchAndStoreRelease(0);
+ (void) _q_futex(&contenders._q_value, FUTEX_WAKE, 1, 0, 0, 0);
+}
+
+#else // !Q_OS_MAC && !Q_OS_LINUX
+
+bool QMutexPrivate::wait(int timeout)
+{
+ if (contenders.fetchAndAddAcquire(1) == 0) {
+ // lock acquired without waiting
+ return true;
+ }
report_error(pthread_mutex_lock(&mutex), "QMutex::lock", "mutex lock");
int errorCode = 0;
while (!wakeup) {
@@ -101,6 +187,7 @@ bool QMutexPrivate::wait(int timeout)
}
wakeup = false;
report_error(pthread_mutex_unlock(&mutex), "QMutex::lock", "mutex unlock");
+ contenders.deref();
return errorCode == 0;
}
@@ -112,6 +199,8 @@ void QMutexPrivate::wakeUp()
report_error(pthread_mutex_unlock(&mutex), "QMutex::unlock", "mutex unlock");
}
+#endif // !Q_OS_MAC && !Q_OS_LINUX
+
QT_END_NAMESPACE
#endif // QT_NO_THREAD
diff --git a/src/corelib/thread/qmutex_win.cpp b/src/corelib/thread/qmutex_win.cpp
index a810000..a759caa 100644
--- a/src/corelib/thread/qmutex_win.cpp
+++ b/src/corelib/thread/qmutex_win.cpp
@@ -48,7 +48,7 @@
QT_BEGIN_NAMESPACE
QMutexPrivate::QMutexPrivate(QMutex::RecursionMode mode)
- : QMutexData(mode), lastSpinCount(0), owner(0), count(0)
+ : QMutexData(mode), maximumSpinTime(MaximumSpinTimeThreshold), averageWaitTime(0), owner(0), count(0)
{
event = CreateEvent(0, FALSE, FALSE, 0);
if (!event)
@@ -60,7 +60,13 @@ QMutexPrivate::~QMutexPrivate()
bool QMutexPrivate::wait(int timeout)
{
- return WaitForSingleObject(event, timeout < 0 ? INFINITE : timeout) == WAIT_OBJECT_0;
+ if (contenders.fetchAndAddAcquire(1) == 0) {
+ // lock acquired without waiting
+ return true;
+ }
+ bool returnValue = (WaitForSingleObject(event, timeout < 0 ? INFINITE : timeout) == WAIT_OBJECT_0);
+ contenders.deref();
+ return returnValue;
}
void QMutexPrivate::wakeUp()
diff --git a/src/corelib/tools/qelapsedtimer.h b/src/corelib/tools/qelapsedtimer.h
index b996f6a..4118389 100644
--- a/src/corelib/tools/qelapsedtimer.h
+++ b/src/corelib/tools/qelapsedtimer.h
@@ -68,6 +68,7 @@ public:
void invalidate();
bool isValid() const;
+ qint64 nsecsElapsed() const;
qint64 elapsed() const;
bool hasExpired(qint64 timeout) const;
diff --git a/src/corelib/tools/qelapsedtimer_generic.cpp b/src/corelib/tools/qelapsedtimer_generic.cpp
index 85986e6..740f496 100644
--- a/src/corelib/tools/qelapsedtimer_generic.cpp
+++ b/src/corelib/tools/qelapsedtimer_generic.cpp
@@ -103,6 +103,22 @@ qint64 QElapsedTimer::restart()
return t1 - old;
}
+/*! \since 4.8
+
+ Returns the number of nanoseconds since this QElapsedTimer was last
+ started. Calling this function in a QElapsedTimer that was invalidated
+ will result in undefined results.
+
+ On platforms that do not provide nanosecond resolution, the value returned
+ will be the best estimate available.
+
+ \sa start(), restart(), hasExpired(), invalidate()
+*/
+qint64 QElapsedTimer::nsecsElapsed() const
+{
+ return elapsed() * 1000000;
+}
+
/*!
Returns the number of milliseconds since this QElapsedTimer was last
started. Calling this function in a QElapsedTimer that was invalidated
diff --git a/src/corelib/tools/qelapsedtimer_mac.cpp b/src/corelib/tools/qelapsedtimer_mac.cpp
index 8fceb49..e51f8b3 100644
--- a/src/corelib/tools/qelapsedtimer_mac.cpp
+++ b/src/corelib/tools/qelapsedtimer_mac.cpp
@@ -97,6 +97,12 @@ qint64 QElapsedTimer::restart()
return absoluteToMSecs(t1 - old);
}
+qint64 QElapsedTimer::nsecsElapsed() const
+{
+ uint64_t cpu_time = mach_absolute_time();
+ return absoluteToNSecs(cpu_time - t1);
+}
+
qint64 QElapsedTimer::elapsed() const
{
uint64_t cpu_time = mach_absolute_time();
diff --git a/src/corelib/tools/qelapsedtimer_symbian.cpp b/src/corelib/tools/qelapsedtimer_symbian.cpp
index 038b102..7cd5f1e 100644
--- a/src/corelib/tools/qelapsedtimer_symbian.cpp
+++ b/src/corelib/tools/qelapsedtimer_symbian.cpp
@@ -64,11 +64,6 @@ static quint64 getMicrosecondFromTick()
return nanokernel_tick_period * (val | (quint64(highdword) << 32));
}
-static quint64 getMillisecondFromTick()
-{
- return getMicrosecondFromTick() / 1000;
-}
-
timeval qt_gettime()
{
timeval tv;
@@ -91,36 +86,41 @@ bool QElapsedTimer::isMonotonic()
void QElapsedTimer::start()
{
- t1 = getMillisecondFromTick();
+ t1 = getMicrosecondFromTick();
t2 = 0;
}
qint64 QElapsedTimer::restart()
{
qint64 oldt1 = t1;
- t1 = getMillisecondFromTick();
+ t1 = getMicrosecondFromTick();
t2 = 0;
return t1 - oldt1;
}
+qint64 QElapsedTimer::nsecsElapsed() const
+{
+ return (getMicrosecondFromTick() - t1) * 1000;
+}
+
qint64 QElapsedTimer::elapsed() const
{
- return getMillisecondFromTick() - t1;
+ return (getMicrosecondFromTick() - t1) / 1000;
}
qint64 QElapsedTimer::msecsSinceReference() const
{
- return t1;
+ return t1 / 1000;
}
qint64 QElapsedTimer::msecsTo(const QElapsedTimer &other) const
{
- return other.t1 - t1;
+ return (other.t1 - t1) / 1000;
}
qint64 QElapsedTimer::secsTo(const QElapsedTimer &other) const
{
- return msecsTo(other) / 1000;
+ return msecsTo(other) / 1000000;
}
bool operator<(const QElapsedTimer &v1, const QElapsedTimer &v2)
diff --git a/src/corelib/tools/qelapsedtimer_unix.cpp b/src/corelib/tools/qelapsedtimer_unix.cpp
index 633fa00..7407e1b 100644
--- a/src/corelib/tools/qelapsedtimer_unix.cpp
+++ b/src/corelib/tools/qelapsedtimer_unix.cpp
@@ -167,6 +167,17 @@ qint64 QElapsedTimer::restart()
return elapsedAndRestart(t1, t2, &t1, &t2);
}
+qint64 QElapsedTimer::nsecsElapsed() const
+{
+ qint64 sec, frac;
+ do_gettime(&sec, &frac);
+ sec = sec - t1;
+ frac = frac - t2;
+ if (!monotonicClockAvailable)
+ frac *= 1000;
+ return sec * Q_INT64_C(1000000000) + frac;
+}
+
qint64 QElapsedTimer::elapsed() const
{
qint64 sec, frac;
diff --git a/src/corelib/tools/qelapsedtimer_win.cpp b/src/corelib/tools/qelapsedtimer_win.cpp
index c77acaa..3f4acc1 100644
--- a/src/corelib/tools/qelapsedtimer_win.cpp
+++ b/src/corelib/tools/qelapsedtimer_win.cpp
@@ -79,14 +79,14 @@ static void resolveLibs()
done = true;
}
-static inline qint64 ticksToMilliseconds(qint64 ticks)
+static inline qint64 ticksToNanoseconds(qint64 ticks)
{
if (counterFrequency > 0) {
// QueryPerformanceCounter uses an arbitrary frequency
- return ticks * 1000 / counterFrequency;
+ return ticks * 1000000000 / counterFrequency;
} else {
// GetTickCount(64) return milliseconds
- return ticks;
+ return ticks * 1000000;
}
}
@@ -144,24 +144,30 @@ qint64 QElapsedTimer::restart()
qint64 oldt1 = t1;
t1 = getTickCount();
t2 = 0;
- return ticksToMilliseconds(t1 - oldt1);
+ return ticksToNanoseconds(t1 - oldt1) / 1000000;
+}
+
+qint64 QElapsedTimer::nsecsElapsed() const
+{
+ qint64 elapsed = getTickCount() - t1;
+ return ticksToNanoseconds(elapsed);
}
qint64 QElapsedTimer::elapsed() const
{
qint64 elapsed = getTickCount() - t1;
- return ticksToMilliseconds(elapsed);
+ return ticksToNanoseconds(elapsed) / 1000000;
}
qint64 QElapsedTimer::msecsSinceReference() const
{
- return ticksToMilliseconds(t1);
+ return ticksToNanoseconds(t1) / 1000000;
}
qint64 QElapsedTimer::msecsTo(const QElapsedTimer &other) const
{
qint64 difference = other.t1 - t1;
- return ticksToMilliseconds(difference);
+ return ticksToNanoseconds(difference) / 1000000;
}
qint64 QElapsedTimer::secsTo(const QElapsedTimer &other) const
diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index 83d6dcd..b817eb2 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -1576,8 +1576,6 @@ QDataStream &operator>>(QDataStream &ds, QLocale &l)
defaults to the default locale (see setDefault()).
\endlist
- The "C" locale is identical in behavior to \l{English}/\l{UnitedStates}.
-
Use language() and country() to determine the actual language and
country values used.
diff --git a/src/corelib/tools/qpoint.cpp b/src/corelib/tools/qpoint.cpp
index c297709..592a83d 100644
--- a/src/corelib/tools/qpoint.cpp
+++ b/src/corelib/tools/qpoint.cpp
@@ -187,7 +187,19 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn QPoint &QPoint::operator*=(qreal factor)
+ \fn QPoint &QPoint::operator*=(float factor)
+
+ Multiplies this point's coordinates by the given \a factor, and
+ returns a reference to this point.
+
+ Note that the result is rounded to the nearest integer as points are held as
+ integers. Use QPointF for floating point accuracy.
+
+ \sa operator/=()
+*/
+
+/*!
+ \fn QPoint &QPoint::operator*=(double factor)
Multiplies this point's coordinates by the given \a factor, and
returns a reference to this point. For example:
@@ -200,6 +212,14 @@ QT_BEGIN_NAMESPACE
\sa operator/=()
*/
+/*!
+ \fn QPoint &QPoint::operator*=(int factor)
+
+ Multiplies this point's coordinates by the given \a factor, and
+ returns a reference to this point.
+
+ \sa operator/=()
+*/
/*!
\fn bool operator==(const QPoint &p1, const QPoint &p2)
@@ -237,7 +257,7 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn const QPoint operator*(const QPoint &point, qreal factor)
+ \fn const QPoint operator*(const QPoint &point, float factor)
\relates QPoint
Returns a copy of the given \a point multiplied by the given \a factor.
@@ -249,7 +269,44 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn const QPoint operator*(qreal factor, const QPoint &point)
+ \fn const QPoint operator*(const QPoint &point, double factor)
+ \relates QPoint
+
+ Returns a copy of the given \a point multiplied by the given \a factor.
+
+ Note that the result is rounded to the nearest integer as points
+ are held as integers. Use QPointF for floating point accuracy.
+
+ \sa QPoint::operator*=()
+*/
+
+/*!
+ \fn const QPoint operator*(const QPoint &point, int factor)
+ \relates QPoint
+
+ Returns a copy of the given \a point multiplied by the given \a factor.
+
+ \sa QPoint::operator*=()
+*/
+
+/*!
+ \fn const QPoint operator*(float factor, const QPoint &point)
+ \overload
+ \relates QPoint
+
+ Returns a copy of the given \a point multiplied by the given \a factor.
+*/
+
+/*!
+ \fn const QPoint operator*(double factor, const QPoint &point)
+ \overload
+ \relates QPoint
+
+ Returns a copy of the given \a point multiplied by the given \a factor.
+*/
+
+/*!
+ \fn const QPoint operator*(int factor, const QPoint &point)
\overload
\relates QPoint
diff --git a/src/corelib/tools/qpoint.h b/src/corelib/tools/qpoint.h
index 79a7dd8..e57b0ed 100644
--- a/src/corelib/tools/qpoint.h
+++ b/src/corelib/tools/qpoint.h
@@ -70,15 +70,23 @@ public:
QPoint &operator+=(const QPoint &p);
QPoint &operator-=(const QPoint &p);
- QPoint &operator*=(qreal c);
+
+ QPoint &operator*=(float c);
+ QPoint &operator*=(double c);
+ QPoint &operator*=(int c);
+
QPoint &operator/=(qreal c);
friend inline bool operator==(const QPoint &, const QPoint &);
friend inline bool operator!=(const QPoint &, const QPoint &);
friend inline const QPoint operator+(const QPoint &, const QPoint &);
friend inline const QPoint operator-(const QPoint &, const QPoint &);
- friend inline const QPoint operator*(const QPoint &, qreal);
- friend inline const QPoint operator*(qreal, const QPoint &);
+ friend inline const QPoint operator*(const QPoint &, float);
+ friend inline const QPoint operator*(float, const QPoint &);
+ friend inline const QPoint operator*(const QPoint &, double);
+ friend inline const QPoint operator*(double, const QPoint &);
+ friend inline const QPoint operator*(const QPoint &, int);
+ friend inline const QPoint operator*(int, const QPoint &);
friend inline const QPoint operator-(const QPoint &);
friend inline const QPoint operator/(const QPoint &, qreal);
@@ -141,9 +149,15 @@ inline QPoint &QPoint::operator+=(const QPoint &p)
inline QPoint &QPoint::operator-=(const QPoint &p)
{ xp-=p.xp; yp-=p.yp; return *this; }
-inline QPoint &QPoint::operator*=(qreal c)
+inline QPoint &QPoint::operator*=(float c)
+{ xp = qRound(xp*c); yp = qRound(yp*c); return *this; }
+
+inline QPoint &QPoint::operator*=(double c)
{ xp = qRound(xp*c); yp = qRound(yp*c); return *this; }
+inline QPoint &QPoint::operator*=(int c)
+{ xp = xp*c; yp = yp*c; return *this; }
+
inline bool operator==(const QPoint &p1, const QPoint &p2)
{ return p1.xp == p2.xp && p1.yp == p2.yp; }
@@ -156,12 +170,24 @@ inline const QPoint operator+(const QPoint &p1, const QPoint &p2)
inline const QPoint operator-(const QPoint &p1, const QPoint &p2)
{ return QPoint(p1.xp-p2.xp, p1.yp-p2.yp); }
-inline const QPoint operator*(const QPoint &p, qreal c)
+inline const QPoint operator*(const QPoint &p, float c)
{ return QPoint(qRound(p.xp*c), qRound(p.yp*c)); }
-inline const QPoint operator*(qreal c, const QPoint &p)
+inline const QPoint operator*(const QPoint &p, double c)
{ return QPoint(qRound(p.xp*c), qRound(p.yp*c)); }
+inline const QPoint operator*(const QPoint &p, int c)
+{ return QPoint(p.xp*c, p.yp*c); }
+
+inline const QPoint operator*(float c, const QPoint &p)
+{ return QPoint(qRound(p.xp*c), qRound(p.yp*c)); }
+
+inline const QPoint operator*(double c, const QPoint &p)
+{ return QPoint(qRound(p.xp*c), qRound(p.yp*c)); }
+
+inline const QPoint operator*(int c, const QPoint &p)
+{ return QPoint(p.xp*c, p.yp*c); }
+
inline const QPoint operator-(const QPoint &p)
{ return QPoint(-p.xp, -p.yp); }
diff --git a/src/corelib/xml/qxmlstream.cpp b/src/corelib/xml/qxmlstream.cpp
index 91c3a19..64a9857 100644
--- a/src/corelib/xml/qxmlstream.cpp
+++ b/src/corelib/xml/qxmlstream.cpp
@@ -2941,6 +2941,9 @@ QStringRef QXmlStreamReader::documentEncoding() const
By default, QXmlStreamWriter encodes XML in UTF-8. Different
encodings can be enforced using setCodec().
+ If an error occurs while writing to the underlying device, hasError()
+ starts returning true and subsequent writes are ignored.
+
The \l{QXmlStream Bookmarks Example} illustrates how to use a
stream writer to write an XML bookmark file (XBEL) that
was previously read in by a QXmlStreamReader.
@@ -2965,7 +2968,8 @@ public:
void write(const QStringRef &);
void write(const QString &);
void writeEscaped(const QString &, bool escapeWhitespace = false);
- void write(const char *s);
+ void write(const char *s, int len);
+ template <int N> void write(const char (&s)[N]) { write(s, N - 1); }
bool finishStartElement(bool contents = true);
void writeStartElement(const QString &namespaceUri, const QString &name);
QIODevice *device;
@@ -2975,6 +2979,7 @@ public:
uint inEmptyElement :1;
uint lastWasStartElement :1;
uint wroteSomething :1;
+ uint hasError :1;
uint autoFormatting :1;
QByteArray autoFormattingIndent;
NamespaceDeclaration emptyNamespace;
@@ -3007,6 +3012,7 @@ QXmlStreamWriterPrivate::QXmlStreamWriterPrivate(QXmlStreamWriter *q)
#endif
inStartElement = inEmptyElement = false;
wroteSomething = false;
+ hasError = false;
lastWasStartElement = false;
lastNamespaceDeclaration = 1;
autoFormatting = false;
@@ -3016,11 +3022,15 @@ QXmlStreamWriterPrivate::QXmlStreamWriterPrivate(QXmlStreamWriter *q)
void QXmlStreamWriterPrivate::write(const QStringRef &s)
{
if (device) {
+ if (hasError)
+ return;
#ifdef QT_NO_TEXTCODEC
- device->write(s.toString().toLatin1(), s.size());
+ QByteArray bytes = s.toLatin1();
#else
- device->write(encoder->fromUnicode(s.constData(), s.size()));
+ QByteArray bytes = encoder->fromUnicode(s.constData(), s.size());
#endif
+ if (device->write(bytes) != bytes.size())
+ hasError = true;
}
else if (stringDevice)
s.appendTo(stringDevice);
@@ -3031,11 +3041,15 @@ void QXmlStreamWriterPrivate::write(const QStringRef &s)
void QXmlStreamWriterPrivate::write(const QString &s)
{
if (device) {
+ if (hasError)
+ return;
#ifdef QT_NO_TEXTCODEC
- device->write(s.toLatin1(), s.size());
+ QByteArray bytes = s.toLatin1();
#else
- device->write(encoder->fromUnicode(s));
+ QByteArray bytes = encoder->fromUnicode(s);
#endif
+ if (device->write(bytes) != bytes.size())
+ hasError = true;
}
else if (stringDevice)
stringDevice->append(s);
@@ -3070,31 +3084,19 @@ void QXmlStreamWriterPrivate::writeEscaped(const QString &s, bool escapeWhitespa
escaped += QChar(c);
}
}
- if (device) {
-#ifdef QT_NO_TEXTCODEC
- device->write(escaped.toLatin1(), escaped.size());
-#else
- device->write(encoder->fromUnicode(escaped));
-#endif
- }
- else if (stringDevice)
- stringDevice->append(escaped);
- else
- qWarning("QXmlStreamWriter: No device");
+ write(escaped);
}
-
-void QXmlStreamWriterPrivate::write(const char *s)
+// ASCII only!
+void QXmlStreamWriterPrivate::write(const char *s, int len)
{
if (device) {
-#ifndef QT_NO_TEXTCODEC
- if (codec->mibEnum() != 106)
- device->write(encoder->fromUnicode(QLatin1String(s)));
- else
-#endif
- device->write(s, strlen(s));
+ if (hasError)
+ return;
+ if (device->write(s, len) != len)
+ hasError = true;
} else if (stringDevice) {
- stringDevice->append(QLatin1String(s));
+ stringDevice->append(QString::fromLatin1(s, len));
} else
qWarning("QXmlStreamWriter: No device");
}
@@ -3172,7 +3174,7 @@ void QXmlStreamWriterPrivate::indent(int level)
{
write("\n");
for (int i = level; i > 0; --i)
- write(autoFormattingIndent.constData());
+ write(autoFormattingIndent.constData(), autoFormattingIndent.length());
}
@@ -3373,6 +3375,17 @@ int QXmlStreamWriter::autoFormattingIndent() const
return d->autoFormattingIndent.count(' ') - d->autoFormattingIndent.count('\t');
}
+/*!
+ Returns \c true if the stream failed to write to the underlying device.
+
+ The error status is never reset. Writes happening after the error
+ occurred are ignored, even if the error condition is cleared.
+ */
+bool QXmlStreamWriter::hasError() const
+{
+ Q_D(const QXmlStreamWriter);
+ return d->hasError;
+}
/*!
\overload
@@ -3759,7 +3772,7 @@ void QXmlStreamWriter::writeStartDocument(const QString &version)
#ifdef QT_NO_TEXTCODEC
d->write("iso-8859-1");
#else
- d->write(d->codec->name().constData());
+ d->write(d->codec->name().constData(), d->codec->name().length());
#endif
}
d->write("\"?>");
@@ -3782,12 +3795,13 @@ void QXmlStreamWriter::writeStartDocument(const QString &version, bool standalon
#ifdef QT_NO_TEXTCODEC
d->write("iso-8859-1");
#else
- d->write(d->codec->name().constData());
+ d->write(d->codec->name().constData(), d->codec->name().length());
#endif
}
- d->write("\" standalone=\"");
- d->write(standalone ? "yes" : "no");
- d->write("\"?>");
+ if (standalone)
+ d->write("\" standalone=\"yes\"?>");
+ else
+ d->write("\" standalone=\"no\"?>");
}
diff --git a/src/corelib/xml/qxmlstream.h b/src/corelib/xml/qxmlstream.h
index d7143bd..244d3d4 100644
--- a/src/corelib/xml/qxmlstream.h
+++ b/src/corelib/xml/qxmlstream.h
@@ -474,6 +474,8 @@ public:
void writeCurrentToken(const QXmlStreamReader &reader);
#endif
+ bool hasError() const;
+
private:
Q_DISABLE_COPY(QXmlStreamWriter)
Q_DECLARE_PRIVATE(QXmlStreamWriter)
diff --git a/src/declarative/graphicsitems/qdeclarativeflickable.cpp b/src/declarative/graphicsitems/qdeclarativeflickable.cpp
index 2511e16..2532b85 100644
--- a/src/declarative/graphicsitems/qdeclarativeflickable.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeflickable.cpp
@@ -671,10 +671,12 @@ void QDeclarativeFlickable::setFlickableDirection(FlickableDirection direction)
void QDeclarativeFlickablePrivate::handleMousePressEvent(QGraphicsSceneMouseEvent *event)
{
+ Q_Q(QDeclarativeFlickable);
if (interactive && timeline.isActive() && (qAbs(hData.velocity) > 10 || qAbs(vData.velocity) > 10))
stealMouse = true; // If we've been flicked then steal the click.
else
stealMouse = false;
+ q->setKeepMouseGrab(stealMouse);
pressed = true;
timeline.clear();
hData.velocity = 0;
@@ -769,6 +771,8 @@ void QDeclarativeFlickablePrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent
}
stealMouse = stealX || stealY;
+ if (stealMouse)
+ q->setKeepMouseGrab(true);
if (!lastPos.isNull()) {
qreal elapsed = qreal(QDeclarativeItemPrivate::restart(lastPosTime)) / 1000.;
@@ -848,8 +852,6 @@ void QDeclarativeFlickable::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
Q_D(QDeclarativeFlickable);
if (d->interactive) {
d->handleMouseMoveEvent(event);
- if (d->stealMouse)
- setKeepMouseGrab(true);
event->accept();
} else {
QDeclarativeItem::mouseMoveEvent(event);
diff --git a/src/declarative/graphicsitems/qdeclarativegridview.cpp b/src/declarative/graphicsitems/qdeclarativegridview.cpp
index 4a6a9dc..7ddf6a2 100644
--- a/src/declarative/graphicsitems/qdeclarativegridview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativegridview.cpp
@@ -1131,6 +1131,13 @@ void QDeclarativeGridViewPrivate::flick(AxisData &data, qreal minExtent, qreal m
Delegates are instantiated as needed and may be destroyed at any time.
State should \e never be stored in a delegate.
+ GridView attaches a number of properties to the root item of the delegate, for example
+ \c {GridView.isCurrentItem}. In the following example, the root delegate item can access
+ this attached property directly as \c GridView.isCurrentItem, while the child
+ \c contactInfo object must refer to this property as \c wrapper.GridView.isCurrentItem.
+
+ \snippet doc/src/snippets/declarative/gridview/gridview.qml isCurrentItem
+
\note Views do not set the \l{Item::}{clip} property automatically.
If the view is not clipped by another item or the screen, it will be necessary
to set this property to true in order to clip the items that are partially or
@@ -1167,6 +1174,8 @@ QDeclarativeGridView::~QDeclarativeGridView()
This attached property holds the view that manages this delegate instance.
It is attached to each instance of the delegate.
+
+ \snippet doc/src/snippets/declarative/gridview/gridview.qml isCurrentItem
*/
/*!
diff --git a/src/declarative/graphicsitems/qdeclarativeitem.cpp b/src/declarative/graphicsitems/qdeclarativeitem.cpp
index 75e4a0b..24d9b03 100644
--- a/src/declarative/graphicsitems/qdeclarativeitem.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeitem.cpp
@@ -454,10 +454,18 @@ void QDeclarativeItemKeyFilter::componentComplete()
\qmlproperty Item KeyNavigation::down
These properties hold the item to assign focus to
- when Key_Left, Key_Right, Key_Up or Key_Down are
+ when the left, right, up or down cursor keys are
pressed.
*/
+/*!
+ \qmlproperty Item KeyNavigation::tab
+ \qmlproperty Item KeyNavigation::backtab
+
+ These properties hold the item to assign focus to
+ when the Tab key or Shift+Tab key combination (Backtab) are pressed.
+*/
+
QDeclarativeKeyNavigationAttached::QDeclarativeKeyNavigationAttached(QObject *parent)
: QObject(*(new QDeclarativeKeyNavigationAttachedPrivate), parent),
QDeclarativeItemKeyFilter(qobject_cast<QDeclarativeItem*>(parent))
@@ -911,6 +919,20 @@ void QDeclarativeKeyNavigationAttached::keyReleased(QKeyEvent *event, bool post)
*/
/*!
+ \qmlsignal Keys::onTabPressed(KeyEvent event)
+
+ This handler is called when the Tab key has been pressed. The \a event
+ parameter provides information about the event.
+*/
+
+/*!
+ \qmlsignal Keys::onBacktabPressed(KeyEvent event)
+
+ This handler is called when the Shift+Tab key combination (Backtab) has
+ been pressed. The \a event parameter provides information about the event.
+*/
+
+/*!
\qmlsignal Keys::onAsteriskPressed(KeyEvent event)
This handler is called when the Asterisk '*' has been pressed. The \a event
diff --git a/src/declarative/graphicsitems/qdeclarativelistview.cpp b/src/declarative/graphicsitems/qdeclarativelistview.cpp
index 2a7f508..702442b 100644
--- a/src/declarative/graphicsitems/qdeclarativelistview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativelistview.cpp
@@ -643,7 +643,8 @@ void QDeclarativeListViewPrivate::refill(qreal from, qreal to, bool doBuffer)
int i = visibleItems.count() - 1;
while (i > 0 && visibleItems.at(i)->index == -1)
--i;
- modelIndex = visibleItems.at(i)->index + 1;
+ if (visibleItems.at(i)->index != -1)
+ modelIndex = visibleItems.at(i)->index + 1;
}
bool changed = false;
@@ -1415,6 +1416,13 @@ void QDeclarativeListViewPrivate::flick(AxisData &data, qreal minExtent, qreal m
Delegates are instantiated as needed and may be destroyed at any time.
State should \e never be stored in a delegate.
+ ListView attaches a number of properties to the root item of the delegate, for example
+ \c {ListView.isCurrentItem}. In the following example, the root delegate item can access
+ this attached property directly as \c ListView.isCurrentItem, while the child
+ \c contactInfo object must refer to this property as \c wrapper.ListView.isCurrentItem.
+
+ \snippet doc/src/snippets/declarative/listview/listview.qml isCurrentItem
+
\note Views do not enable \e clip automatically. If the view
is not clipped by another item or the screen, it will be necessary
to set \e {clip: true} in order to have the out of view items clipped
@@ -2804,7 +2812,10 @@ void QDeclarativeListView::itemsInserted(int modelIndex, int count)
int i = d->visibleItems.count() - 1;
while (i > 0 && d->visibleItems.at(i)->index == -1)
--i;
- if (d->visibleItems.at(i)->index + 1 == modelIndex
+ if (i == 0 && d->visibleItems.first()->index == -1) {
+ // there are no visible items except items marked for removal
+ index = d->visibleItems.count();
+ } else if (d->visibleItems.at(i)->index + 1 == modelIndex
&& d->visibleItems.at(i)->endPosition() < d->buffer+d->position()+d->size()-1) {
// Special case of appending an item to the model.
index = d->visibleItems.count();
@@ -2836,7 +2847,7 @@ void QDeclarativeListView::itemsInserted(int modelIndex, int count)
// index can be the next item past the end of the visible items list (i.e. appended)
int pos = index < d->visibleItems.count() ? d->visibleItems.at(index)->position()
- : d->visibleItems.at(index-1)->endPosition()+d->spacing+1;
+ : d->visibleItems.last()->endPosition()+d->spacing+1;
int initialPos = pos;
int diff = 0;
QList<FxListItem*> added;
@@ -2988,14 +2999,16 @@ void QDeclarativeListView::itemsRemoved(int modelIndex, int count)
}
// update visibleIndex
+ bool haveVisibleIndex = false;
for (it = d->visibleItems.begin(); it != d->visibleItems.end(); ++it) {
if ((*it)->index != -1) {
d->visibleIndex = (*it)->index;
+ haveVisibleIndex = true;
break;
}
}
- if (removedVisible && d->visibleItems.isEmpty()) {
+ if (removedVisible && !haveVisibleIndex) {
d->timeline.clear();
if (d->itemCount == 0) {
d->visibleIndex = 0;
diff --git a/src/declarative/graphicsitems/qdeclarativepathview.cpp b/src/declarative/graphicsitems/qdeclarativepathview.cpp
index 87ea214..e3987d0 100644
--- a/src/declarative/graphicsitems/qdeclarativepathview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativepathview.cpp
@@ -393,6 +393,13 @@ void QDeclarativePathViewPrivate::regenerate()
Delegates are instantiated as needed and may be destroyed at any time.
State should \e never be stored in a delegate.
+ PathView attaches a number of properties to the root item of the delegate, for example
+ \c {PathView.isCurrentItem}. In the following example, the root delegate item can access
+ this attached property directly as \c PathView.isCurrentItem, while the child
+ \c nameText object must refer to this property as \c wrapper.PathView.isCurrentItem.
+
+ \snippet doc/src/snippets/declarative/pathview/pathview.qml 1
+
\bold Note that views do not enable \e clip automatically. If the view
is not clipped by another item or the screen, it will be necessary
to set \e {clip: true} in order to have the out of view items clipped
@@ -452,6 +459,8 @@ QDeclarativePathView::~QDeclarativePathView()
It is attached to each instance of the delegate.
This property may be used to adjust the appearance of the current item.
+
+ \snippet doc/src/snippets/declarative/pathview/pathview.qml 1
*/
/*!
@@ -1133,8 +1142,10 @@ void QDeclarativePathViewPrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent
QPointF pathPoint = pointNear(event->pos(), &newPc);
if (!stealMouse) {
QPointF delta = pathPoint - startPoint;
- if (qAbs(delta.x()) > QApplication::startDragDistance() || qAbs(delta.y()) > QApplication::startDragDistance())
+ if (qAbs(delta.x()) > QApplication::startDragDistance() || qAbs(delta.y()) > QApplication::startDragDistance()) {
stealMouse = true;
+ startPc = newPc;
+ }
}
if (stealMouse) {
diff --git a/src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp b/src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp
index 4f5213a..bf9263b 100644
--- a/src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp
+++ b/src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp
@@ -773,6 +773,8 @@ void QDeclarativeVisualDataModel::setModel(const QVariant &model)
QObject::connect(d->m_abstractItemModel, SIGNAL(modelReset()), this, SLOT(_q_modelReset()));
QObject::connect(d->m_abstractItemModel, SIGNAL(layoutChanged()), this, SLOT(_q_layoutChanged()));
d->m_metaDataCacheable = true;
+ if (d->m_abstractItemModel->canFetchMore(d->m_root))
+ d->m_abstractItemModel->fetchMore(d->m_root);
return;
}
if ((d->m_visualItemModel = qvariant_cast<QDeclarativeVisualDataModel *>(model))) {
@@ -870,6 +872,8 @@ void QDeclarativeVisualDataModel::setRootIndex(const QVariant &root)
if (d->m_root != modelIndex) {
int oldCount = d->modelCount();
d->m_root = modelIndex;
+ if (d->m_abstractItemModel && d->m_abstractItemModel->canFetchMore(modelIndex))
+ d->m_abstractItemModel->fetchMore(modelIndex);
int newCount = d->modelCount();
if (d->m_delegate && oldCount)
emit itemsRemoved(0, oldCount);
@@ -1094,6 +1098,8 @@ QDeclarativeItem *QDeclarativeVisualDataModel::item(int index, const QByteArray
d->m_delegateValidated = true;
}
}
+ if (d->modelCount()-1 == index && d->m_abstractItemModel && d->m_abstractItemModel->canFetchMore(d->m_root))
+ d->m_abstractItemModel->fetchMore(d->m_root);
return item;
}
diff --git a/src/declarative/qml/qdeclarativecomponent.cpp b/src/declarative/qml/qdeclarativecomponent.cpp
index 77fc925..ecb3bc5 100644
--- a/src/declarative/qml/qdeclarativecomponent.cpp
+++ b/src/declarative/qml/qdeclarativecomponent.cpp
@@ -699,17 +699,6 @@ QObject *QDeclarativeComponent::create(QDeclarativeContext *context)
return rv;
}
-QObject *QDeclarativeComponentPrivate::create(QDeclarativeContextData *context,
- const QBitField &bindings)
-{
- if (!context)
- context = QDeclarativeContextData::get(engine->rootContext());
-
- QObject *rv = beginCreate(context, bindings);
- completeCreate();
- return rv;
-}
-
/*!
This method provides more advanced control over component instance creation.
In general, programmers should use QDeclarativeComponent::create() to create a
diff --git a/src/declarative/qml/qdeclarativecomponent_p.h b/src/declarative/qml/qdeclarativecomponent_p.h
index 7b30bad..daf1dcb 100644
--- a/src/declarative/qml/qdeclarativecomponent_p.h
+++ b/src/declarative/qml/qdeclarativecomponent_p.h
@@ -81,7 +81,6 @@ class Q_AUTOTEST_EXPORT QDeclarativeComponentPrivate : public QObjectPrivate, pu
public:
QDeclarativeComponentPrivate() : typeData(0), progress(0.), start(-1), count(-1), cc(0), engine(0), creationContext(0) {}
- QObject *create(QDeclarativeContextData *, const QBitField &);
QObject *beginCreate(QDeclarativeContextData *, const QBitField &);
void completeCreate();
diff --git a/src/declarative/qml/qdeclarativeworkerscript.cpp b/src/declarative/qml/qdeclarativeworkerscript.cpp
index 75cc6f9..2699bd2 100644
--- a/src/declarative/qml/qdeclarativeworkerscript.cpp
+++ b/src/declarative/qml/qdeclarativeworkerscript.cpp
@@ -458,7 +458,7 @@ QDeclarativeWorkerScriptEngine::QDeclarativeWorkerScriptEngine(QDeclarativeEngin
{
d->m_lock.lock();
connect(d, SIGNAL(stopThread()), this, SLOT(quit()), Qt::DirectConnection);
- start(QThread::LowPriority);
+ start(QThread::IdlePriority);
d->m_wait.wait(&d->m_lock);
d->moveToThread(this);
d->m_lock.unlock();
diff --git a/src/declarative/util/qdeclarativeanimation.cpp b/src/declarative/util/qdeclarativeanimation.cpp
index 58444bd..d5df51e 100644
--- a/src/declarative/util/qdeclarativeanimation.cpp
+++ b/src/declarative/util/qdeclarativeanimation.cpp
@@ -1324,7 +1324,7 @@ void QDeclarativeVector3dAnimation::setTo(QVector3D t)
/*!
\qmlclass RotationAnimation QDeclarativeRotationAnimation
- \ingroup qml-animation-transition
+ \ingroup qml-animation-transition
\since 4.7
\inherits PropertyAnimation
\brief The RotationAnimation element animates changes in rotation values.
@@ -1333,8 +1333,8 @@ void QDeclarativeVector3dAnimation::setTo(QVector3D t)
over the direction of rotation during an animation.
By default, it rotates in the direction
- of the numerical change; a rotation from 0 to 240 will rotate 220 degrees
- clockwise, while a rotation from 240 to 0 will rotate 220 degrees
+ of the numerical change; a rotation from 0 to 240 will rotate 240 degrees
+ clockwise, while a rotation from 240 to 0 will rotate 240 degrees
counterclockwise. The \l direction property can be set to specify the
direction in which the rotation should occur.
@@ -1342,7 +1342,7 @@ void QDeclarativeVector3dAnimation::setTo(QVector3D t)
between states via the shortest path:
\snippet doc/src/snippets/declarative/rotationanimation.qml 0
-
+
Notice the RotationAnimation did not need to set a \l target
value. As a convenience, when used in a transition, RotationAnimation will rotate all
properties named "rotation" or "angle". You can override this by providing
diff --git a/src/declarative/util/qdeclarativeview.cpp b/src/declarative/util/qdeclarativeview.cpp
index c4d8dde..49b662f 100644
--- a/src/declarative/util/qdeclarativeview.cpp
+++ b/src/declarative/util/qdeclarativeview.cpp
@@ -192,7 +192,7 @@ void QDeclarativeViewPrivate::itemGeometryChanged(QDeclarativeItem *resizeItem,
/*!
\class QDeclarativeView
- \since 4.7
+ \since 4.7
\brief The QDeclarativeView class provides a widget for displaying a Qt Declarative user interface.
QDeclarativeItem objects can be placed on a standard QGraphicsScene and
@@ -360,13 +360,14 @@ QDeclarativeContext* QDeclarativeView::rootContext() const
}
/*!
- \enum QDeclarativeView::Status
+ \enum QDeclarativeView::Status
Specifies the loading status of the QDeclarativeView.
\value Null This QDeclarativeView has no source set.
\value Ready This QDeclarativeView has loaded and created the QML component.
\value Loading This QDeclarativeView is loading network data.
- \value Error An error has occurred. Call errorDescription() to retrieve a description.
+ \value Error One or more errors has occurred. Call errors() to retrieve a list
+ of errors.
*/
/*! \enum QDeclarativeView::ResizeMode
diff --git a/src/declarative/util/qdeclarativexmllistmodel.cpp b/src/declarative/util/qdeclarativexmllistmodel.cpp
index 715aaef..8f32716 100644
--- a/src/declarative/util/qdeclarativexmllistmodel.cpp
+++ b/src/declarative/util/qdeclarativexmllistmodel.cpp
@@ -924,6 +924,7 @@ void QDeclarativeXmlListModel::reload()
} else {
d->notifyQueryStarted(true);
QNetworkRequest req(d->src);
+ req.setRawHeader("Accept", "application/xml");
d->reply = qmlContext(this)->engine()->networkAccessManager()->get(req);
QObject::connect(d->reply, SIGNAL(finished()), this, SLOT(requestFinished()));
QObject::connect(d->reply, SIGNAL(downloadProgress(qint64,qint64)),
diff --git a/src/gui/dialogs/qdialog.cpp b/src/gui/dialogs/qdialog.cpp
index 0f98b56..e522dc9 100644
--- a/src/gui/dialogs/qdialog.cpp
+++ b/src/gui/dialogs/qdialog.cpp
@@ -899,9 +899,21 @@ bool QDialog::symbianAdjustedPosition()
{
#if defined(Q_WS_S60)
QPoint p;
- const bool doS60Positioning = !(isFullScreen()||isMaximized());
- if (doS60Positioning) {
- QPoint oldPos = pos();
+ QPoint oldPos = pos();
+ if (isFullScreen()) {
+ p.setX(0);
+ p.setY(0);
+ } else if (isMaximized()) {
+ TRect statusPaneRect = TRect();
+ if (S60->screenHeightInPixels > S60->screenWidthInPixels) {
+ AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EStatusPane, statusPaneRect);
+ } else {
+ AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EStaconTop, statusPaneRect);
+ }
+
+ p.setX(0);
+ p.setY(statusPaneRect.Height());
+ } else {
// naive way to deduce screen orientation
if (S60->screenHeightInPixels > S60->screenWidthInPixels) {
int cbaHeight;
@@ -937,10 +949,10 @@ bool QDialog::symbianAdjustedPosition()
p.setX(qMax(0,S60->screenWidthInPixels - width()));
}
}
- if (oldPos != p || p.y() < 0)
- move(p);
}
- return doS60Positioning;
+ if (oldPos != p || p.y() < 0)
+ move(p);
+ return true;
#else
// TODO - check positioning requirement for Symbian, non-s60
return false;
diff --git a/src/gui/dialogs/qfiledialog_symbian.cpp b/src/gui/dialogs/qfiledialog_symbian.cpp
index 1f70305..1fc5f5e 100644
--- a/src/gui/dialogs/qfiledialog_symbian.cpp
+++ b/src/gui/dialogs/qfiledialog_symbian.cpp
@@ -64,7 +64,7 @@ public:
filterList.clear();
if (filter.left(2) == QLatin1String("*.")) {
//Filter has only extensions
- filterList << filter.split(" ");
+ filterList << filter.split(QLatin1String(" "));
return;
} else {
//Extensions are in parenthesis and there may be several filters
@@ -75,7 +75,7 @@ public:
return;
}
}
- QRegExp rx("\\(([^\\)]*)\\)");
+ QRegExp rx(QLatin1String("\\(([^\\)]*)\\)"));
int pos = 0;
while ((pos = rx.indexIn(filter, pos)) != -1) {
filterList << rx.cap(1).split(QLatin1String(" "));
@@ -119,36 +119,49 @@ static QString launchSymbianDialog(const QString dialogCaption, const QString st
{
QString selection;
#if defined(Q_WS_S60) && defined(SYMBIAN_VERSION_SYMBIAN3)
- QT_TRAP_THROWING(
- TFileName startFolder;
- if (!startDirectory.isEmpty()) {
- QString dir = QDir::toNativeSeparators(startDirectory);
+ TFileName startFolder;
+ if (!startDirectory.isEmpty()) {
+ QString dir = QDir::toNativeSeparators(QFileDialogPrivate::workingDirectory(startDirectory));
+ startFolder = qt_QString2TPtrC(dir);
+ }
+ TInt types = AknCommonDialogsDynMem::EMemoryTypeMMCExternal|
+ AknCommonDialogsDynMem::EMemoryTypeInternalMassStorage|
+ AknCommonDialogsDynMem::EMemoryTypePhone;
+
+ TPtrC titlePtr(qt_QString2TPtrC(dialogCaption));
+ TFileName target;
+ bool select = false;
+ int tryCount = 2;
+ while (tryCount--) {
+ TInt err(KErrNone);
+ TRAP(err,
+ if (dialogMode == DialogOpen) {
+ CExtensionFilter* extensionFilter = new (ELeave) CExtensionFilter;
+ CleanupStack::PushL(extensionFilter);
+ extensionFilter->setFilter(filter);
+ select = AknCommonDialogsDynMem::RunSelectDlgLD(types, target,
+ startFolder, NULL, NULL, titlePtr, extensionFilter);
+ CleanupStack::Pop(extensionFilter);
+ } else if (dialogMode == DialogSave) {
+ select = AknCommonDialogsDynMem::RunSaveDlgLD(types, target,
+ startFolder, NULL, NULL, titlePtr);
+ } else if (dialogMode == DialogFolder) {
+ select = AknCommonDialogsDynMem::RunFolderSelectDlgLD(types, target, startFolder,
+ 0, 0, titlePtr, NULL, NULL);
+ }
+ );
+
+ if (err == KErrNone) {
+ tryCount = 0;
+ } else {
+ // Symbian native file dialog doesn't allow accessing files outside C:/Data
+ // It will always leave in that case, so default into QDir::rootPath() in error cases.
+ QString dir = QDir::toNativeSeparators(QDir::rootPath());
startFolder = qt_QString2TPtrC(dir);
}
- TInt types = AknCommonDialogsDynMem::EMemoryTypeMMCExternal|
- AknCommonDialogsDynMem::EMemoryTypeInternalMassStorage|
- AknCommonDialogsDynMem::EMemoryTypePhone;
-
- TPtrC titlePtr(qt_QString2TPtrC(dialogCaption));
- TFileName target;
- bool select = false;
- if (dialogMode == DialogOpen) {
- CExtensionFilter* extensionFilter = new (ELeave) CExtensionFilter;
- CleanupStack::PushL(extensionFilter);
- extensionFilter->setFilter(filter);
- select = AknCommonDialogsDynMem::RunSelectDlgLD(types, target,
- startFolder, NULL, NULL, titlePtr, extensionFilter);
- CleanupStack::Pop(extensionFilter);
- } else if (dialogMode == DialogSave) {
- select = AknCommonDialogsDynMem::RunSaveDlgLD(types, target,
- startFolder, NULL, NULL, titlePtr);
- } else if (dialogMode == DialogFolder) {
- select = AknCommonDialogsDynMem::RunFolderSelectDlgLD(types, target, startFolder,
- 0, 0, titlePtr, NULL, NULL);
- }
- if (select)
- selection.append(qt_TDesC2QString(target));
- );
+ }
+ if (select)
+ selection.append(qt_TDesC2QString(target));
#endif
return selection;
}
diff --git a/src/gui/dialogs/qmessagebox.cpp b/src/gui/dialogs/qmessagebox.cpp
index 224a176..af9616d 100644
--- a/src/gui/dialogs/qmessagebox.cpp
+++ b/src/gui/dialogs/qmessagebox.cpp
@@ -1925,7 +1925,7 @@ void QMessageBoxPrivate::retranslateStrings()
{
#ifndef QT_NO_TEXTEDIT
if (detailsButton)
- detailsButton->setLabel(detailsText->isHidden() ? HideLabel : ShowLabel);
+ detailsButton->setLabel(detailsText->isHidden() ? ShowLabel : HideLabel);
#endif
}
diff --git a/src/gui/image/qmovie.cpp b/src/gui/image/qmovie.cpp
index 911a2b5..eb139fa 100644
--- a/src/gui/image/qmovie.cpp
+++ b/src/gui/image/qmovie.cpp
@@ -381,10 +381,14 @@ QFrameInfo QMoviePrivate::infoForFrame(int frameNumber)
QPixmap aPixmap = QPixmap::fromImage(anImage);
int aDelay = reader->nextImageDelay();
return QFrameInfo(aPixmap, aDelay);
- } else {
+ } else if (frameNumber != 0) {
// We've read all frames now. Return an end marker
haveReadAll = true;
return QFrameInfo::endMarker();
+ } else {
+ // No readable frames
+ haveReadAll = true;
+ return QFrameInfo();
}
}
diff --git a/src/gui/image/qpixmap.cpp b/src/gui/image/qpixmap.cpp
index 9fd10ae..5cd47c7 100644
--- a/src/gui/image/qpixmap.cpp
+++ b/src/gui/image/qpixmap.cpp
@@ -783,8 +783,8 @@ QBitmap QPixmap::createHeuristicMask(bool clipTight) const
/*!
Creates and returns a mask for this pixmap based on the given \a
maskColor. If the \a mode is Qt::MaskInColor, all pixels matching the
- maskColor will be opaque. If \a mode is Qt::MaskOutColor, all pixels
- matching the maskColor will be transparent.
+ maskColor will be transparent. If \a mode is Qt::MaskOutColor, all pixels
+ matching the maskColor will be opaque.
This function is slow because it involves converting to/from a
QImage.
diff --git a/src/gui/kernel/qapplication_s60.cpp b/src/gui/kernel/qapplication_s60.cpp
index 0c4b307..7f157a1 100644
--- a/src/gui/kernel/qapplication_s60.cpp
+++ b/src/gui/kernel/qapplication_s60.cpp
@@ -1071,6 +1071,14 @@ void QSymbianControl::Draw(const TRect& controlRect) const
Q_ASSERT(topExtra);
if (!topExtra->inExpose) {
topExtra->inExpose = true;
+ if (!qwidget->isWindow()) {
+ // If we get here, then it means we have a native child window
+ // Since no content should ever be painted to these windows, we
+ // erase them with a transparent brush when they get an expose.
+ CWindowGc &gc = SystemGc();
+ gc.SetBrushColor(TRgb(0, 0, 0, 0));
+ gc.Clear(controlRect);
+ }
QRect exposeRect = qt_TRect2QRect(controlRect);
qwidget->d_func()->syncBackingStore(exposeRect);
topExtra->inExpose = false;
diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm
index 059140e..3c5c458 100644
--- a/src/gui/kernel/qwidget_mac.mm
+++ b/src/gui/kernel/qwidget_mac.mm
@@ -4224,6 +4224,7 @@ void QWidgetPrivate::setWSGeometry(bool dontShow, const QRect &oldRect)
}
}
+#ifndef QT_MAC_USE_COCOA
const QRect validRange(-XCOORD_MAX,-XCOORD_MAX, 2*XCOORD_MAX, 2*XCOORD_MAX);
if (!validRange.contains(xrect)) {
// we are too big, and must clip
@@ -4242,6 +4243,7 @@ void QWidgetPrivate::setWSGeometry(bool dontShow, const QRect &oldRect)
wrect = xrect;
wrect.translate(-data.crect.topLeft()); // translate wrect in my Qt coordinates
}
+#endif //QT_MAC_USE_COCOA
}
// unmap if we are outside the valid window system coord system
diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp
index 62af212..4fd90ed 100644
--- a/src/gui/painting/qdrawhelper.cpp
+++ b/src/gui/painting/qdrawhelper.cpp
@@ -712,6 +712,38 @@ static inline uint interpolate_4_pixels_16(uint tl, uint tr, uint bl, uint br, i
}
#endif
+#if defined(QT_ALWAYS_HAVE_NEON)
+#define interpolate_4_pixels_16_neon(tl, tr, bl, br, distx, disty, disty_, colorMask, invColorMask, v_256, b) \
+{ \
+ const int16x8_t dxdy = vmulq_s16(distx, disty); \
+ const int16x8_t distx_ = vshlq_n_s16(distx, 4); \
+ const int16x8_t idxidy = vaddq_s16(dxdy, vsubq_s16(v_256, vaddq_s16(distx_, disty_))); \
+ const int16x8_t dxidy = vsubq_s16(distx_, dxdy); \
+ const int16x8_t idxdy = vsubq_s16(disty_, dxdy); \
+ \
+ int16x8_t tlAG = vreinterpretq_s16_u16(vshrq_n_u16(vreinterpretq_u16_s16(tl), 8)); \
+ int16x8_t tlRB = vandq_s16(tl, colorMask); \
+ int16x8_t trAG = vreinterpretq_s16_u16(vshrq_n_u16(vreinterpretq_u16_s16(tr), 8)); \
+ int16x8_t trRB = vandq_s16(tr, colorMask); \
+ int16x8_t blAG = vreinterpretq_s16_u16(vshrq_n_u16(vreinterpretq_u16_s16(bl), 8)); \
+ int16x8_t blRB = vandq_s16(bl, colorMask); \
+ int16x8_t brAG = vreinterpretq_s16_u16(vshrq_n_u16(vreinterpretq_u16_s16(br), 8)); \
+ int16x8_t brRB = vandq_s16(br, colorMask); \
+ \
+ int16x8_t rAG = vmulq_s16(tlAG, idxidy); \
+ int16x8_t rRB = vmulq_s16(tlRB, idxidy); \
+ rAG = vmlaq_s16(rAG, trAG, dxidy); \
+ rRB = vmlaq_s16(rRB, trRB, dxidy); \
+ rAG = vmlaq_s16(rAG, blAG, idxdy); \
+ rRB = vmlaq_s16(rRB, blRB, idxdy); \
+ rAG = vmlaq_s16(rAG, brAG, dxdy); \
+ rRB = vmlaq_s16(rRB, brRB, dxdy); \
+ \
+ rAG = vandq_s16(invColorMask, rAG); \
+ rRB = vreinterpretq_s16_u16(vshrq_n_u16(vreinterpretq_u16_s16(rRB), 8)); \
+ vst1q_s16((int16_t*)(b), vorrq_s16(rAG, rRB)); \
+}
+#endif
template<TextureBlendType blendType>
Q_STATIC_TEMPLATE_FUNCTION inline void fetchTransformedBilinear_pixelBounds(int max, int l1, int l2, int &v1, int &v2)
@@ -819,10 +851,9 @@ const uint * QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *
}
}
-#if defined(QT_ALWAYS_HAVE_SSE2)
if (blendType != BlendTransformedBilinearTiled &&
(format == QImage::Format_ARGB32_Premultiplied || format == QImage::Format_RGB32)) {
-
+#if defined(QT_ALWAYS_HAVE_SSE2)
const __m128i disty_ = _mm_set1_epi16(disty);
const __m128i idisty_ = _mm_set1_epi16(idisty);
const __m128i colorMask = _mm_set1_epi32(0x00ff00ff);
@@ -852,8 +883,38 @@ const uint * QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *
rRB = _mm_srli_epi16(rRB, 8);
_mm_storeu_si128((__m128i*)(&intermediate_buffer[0][f]), rRB);
}
- }
+#elif defined(QT_ALWAYS_HAVE_NEON)
+ const int16x8_t disty_ = vdupq_n_s16(disty);
+ const int16x8_t idisty_ = vdupq_n_s16(idisty);
+ const int16x8_t colorMask = vdupq_n_s16(0x00ff);
+
+ lim -= 3;
+ for (; f < lim; x += 4, f += 4) {
+ // Load 4 pixels from s1, and split the alpha-green and red-blue component
+ int16x8_t top = vld1q_s16((int16_t*)((const uint *)(s1)+x));
+ int16x8_t topAG = vreinterpretq_s16_u16(vshrq_n_u16(vreinterpretq_u16_s16(top), 8));
+ int16x8_t topRB = vandq_s16(top, colorMask);
+ // Multiplies each colour component by idisty
+ topAG = vmulq_s16(topAG, idisty_);
+ topRB = vmulq_s16(topRB, idisty_);
+
+ // Same for the s2 vector
+ int16x8_t bottom = vld1q_s16((int16_t*)((const uint *)(s2)+x));
+ int16x8_t bottomAG = vreinterpretq_s16_u16(vshrq_n_u16(vreinterpretq_u16_s16(bottom), 8));
+ int16x8_t bottomRB = vandq_s16(bottom, colorMask);
+ bottomAG = vmulq_s16(bottomAG, disty_);
+ bottomRB = vmulq_s16(bottomRB, disty_);
+
+ // Add the values, and shift to only keep 8 significant bits per colors
+ int16x8_t rAG = vaddq_s16(topAG, bottomAG);
+ rAG = vreinterpretq_s16_u16(vshrq_n_u16(vreinterpretq_u16_s16(rAG), 8));
+ vst1q_s16((int16_t*)(&intermediate_buffer[1][f]), rAG);
+ int16x8_t rRB = vaddq_s16(topRB, bottomRB);
+ rRB = vreinterpretq_s16_u16(vshrq_n_u16(vreinterpretq_u16_s16(rRB), 8));
+ vst1q_s16((int16_t*)(&intermediate_buffer[0][f]), rRB);
+ }
#endif
+ }
for (; f < count; f++) { // Same as above but without sse2
if (blendType == BlendTransformedBilinearTiled) {
if (x >= image_width) x -= image_width;
@@ -920,35 +981,36 @@ const uint * QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *
const uchar *s2 = data->texture.scanLine(y2);
int disty = (fy & 0x0000ffff) >> 12;
-#if defined(QT_ALWAYS_HAVE_SSE2)
if (blendType != BlendTransformedBilinearTiled &&
(format == QImage::Format_ARGB32_Premultiplied || format == QImage::Format_RGB32)) {
- //prolog to get into the bounds
- while (b < end) {
- int x1 = (fx >> 16);
- int x2;
- fetchTransformedBilinear_pixelBounds<blendType>(image_width, image_x1, image_x2, x1, x2);
- if (x1 != x2) //break if we are insided the bounds.
- break;
- uint tl = fetch(s1, x1, data->texture.colorTable);
- uint tr = fetch(s1, x2, data->texture.colorTable);
- uint bl = fetch(s2, x1, data->texture.colorTable);
- uint br = fetch(s2, x2, data->texture.colorTable);
- int distx = (fx & 0x0000ffff) >> 12;
- *b = interpolate_4_pixels_16(tl, tr, bl, br, distx, disty);
- fx += fdx;
- ++b;
- }
- uint *boundedEnd;
- if (fdx > 0)
- boundedEnd = qMin(end, buffer + uint((image_x2 - (fx >> 16)) / data->m11));
- else
- boundedEnd = qMin(end, buffer + uint((image_x1 - (fx >> 16)) / data->m11));
+#define BILINEAR_DOWNSCALE_BOUNDS_PROLOG \
+ while (b < end) { \
+ int x1 = (fx >> 16); \
+ int x2; \
+ fetchTransformedBilinear_pixelBounds<blendType>(image_width, image_x1, image_x2, x1, x2); \
+ if (x1 != x2) \
+ break; \
+ uint tl = fetch(s1, x1, data->texture.colorTable); \
+ uint tr = fetch(s1, x2, data->texture.colorTable); \
+ uint bl = fetch(s2, x1, data->texture.colorTable); \
+ uint br = fetch(s2, x2, data->texture.colorTable); \
+ int distx = (fx & 0x0000ffff) >> 12; \
+ *b = interpolate_4_pixels_16(tl, tr, bl, br, distx, disty); \
+ fx += fdx; \
+ ++b; \
+ } \
+ uint *boundedEnd; \
+ if (fdx > 0) \
+ boundedEnd = qMin(end, buffer + uint((image_x2 - (fx >> 16)) / data->m11)); \
+ else \
+ boundedEnd = qMin(end, buffer + uint((image_x1 - (fx >> 16)) / data->m11)); \
boundedEnd -= 3;
+#if defined(QT_ALWAYS_HAVE_SSE2)
+ BILINEAR_DOWNSCALE_BOUNDS_PROLOG
+
const __m128i colorMask = _mm_set1_epi32(0x00ff00ff);
- //const __m128i distShuffleMask = _mm_set_epi8(13, 12, 13, 12, 9, 8, 9, 8, 5, 4, 5, 4, 1, 0, 1, 0);
const __m128i v_256 = _mm_set1_epi16(256);
const __m128i v_disty = _mm_set1_epi16(disty);
__m128i v_fdx = _mm_set1_epi32(fdx*4);
@@ -976,8 +1038,7 @@ const uint * QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *
bl.i[i] = *(addr_tl+secondLine);
br.i[i] = *(addr_tr+secondLine);
}
- __m128i v_distx = _mm_srli_epi16(v_fx.vect, 12); //distx = (fx & 0x0000ffff) >> 12;
- //v_distx = _mm_shuffle_epi8(v_disty, distShuffleMask); //distx |= distx << 16;
+ __m128i v_distx = _mm_srli_epi16(v_fx.vect, 12);
v_distx = _mm_shufflehi_epi16(v_distx, _MM_SHUFFLE(2,2,0,0));
v_distx = _mm_shufflelo_epi16(v_distx, _MM_SHUFFLE(2,2,0,0));
@@ -986,8 +1047,57 @@ const uint * QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *
v_fx.vect = _mm_add_epi32(v_fx.vect, v_fdx);
}
fx = v_fx.i[0];
- }
+#elif defined(QT_ALWAYS_HAVE_NEON)
+ BILINEAR_DOWNSCALE_BOUNDS_PROLOG
+
+ const int16x8_t colorMask = vdupq_n_s16(0x00ff);
+ const int16x8_t invColorMask = vmvnq_s16(colorMask);
+ const int16x8_t v_256 = vdupq_n_s16(256);
+ const int16x8_t v_disty = vdupq_n_s16(disty);
+ const int16x8_t v_disty_ = vshlq_n_s16(v_disty, 4);
+ int32x4_t v_fdx = vdupq_n_s32(fdx*4);
+
+ ptrdiff_t secondLine = reinterpret_cast<const uint *>(s2) - reinterpret_cast<const uint *>(s1);
+
+ union Vect_buffer { int32x4_t vect; quint32 i[4]; };
+ Vect_buffer v_fx;
+
+ for (int i = 0; i < 4; i++) {
+ v_fx.i[i] = fx;
+ fx += fdx;
+ }
+
+ const int32x4_t v_ffff_mask = vdupq_n_s32(0x0000ffff);
+
+ while (b < boundedEnd) {
+
+ Vect_buffer tl, tr, bl, br;
+
+ Vect_buffer v_fx_shifted;
+ v_fx_shifted.vect = vshrq_n_s32(v_fx.vect, 16);
+
+ int32x4_t v_distx = vshrq_n_s32(vandq_s32(v_fx.vect, v_ffff_mask), 12);
+
+ for (int i = 0; i < 4; i++) {
+ int x1 = v_fx_shifted.i[i];
+ const uint *addr_tl = reinterpret_cast<const uint *>(s1) + x1;
+ const uint *addr_tr = addr_tl + 1;
+ tl.i[i] = *addr_tl;
+ tr.i[i] = *addr_tr;
+ bl.i[i] = *(addr_tl+secondLine);
+ br.i[i] = *(addr_tr+secondLine);
+ }
+
+ v_distx = vorrq_s32(v_distx, vshlq_n_s32(v_distx, 16));
+
+ interpolate_4_pixels_16_neon(vreinterpretq_s16_s32(tl.vect), vreinterpretq_s16_s32(tr.vect), vreinterpretq_s16_s32(bl.vect), vreinterpretq_s16_s32(br.vect), vreinterpretq_s16_s32(v_distx), v_disty, v_disty_, colorMask, invColorMask, v_256, b);
+ b+=4;
+ v_fx.vect = vaddq_s32(v_fx.vect, v_fdx);
+ }
+ fx = v_fx.i[0];
#endif
+ }
+
while (b < end) {
int x1 = (fx >> 16);
int x2;
diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp
index dd14e66..cdcd092 100644
--- a/src/gui/painting/qpaintengine_raster.cpp
+++ b/src/gui/painting/qpaintengine_raster.cpp
@@ -662,31 +662,23 @@ QRasterPaintEngineState::QRasterPaintEngineState()
QRasterPaintEngineState::QRasterPaintEngineState(QRasterPaintEngineState &s)
: QPainterState(s)
+ , stroker(s.stroker)
+ , lastBrush(s.lastBrush)
+ , brushData(s.brushData)
+ , lastPen(s.lastPen)
+ , penData(s.penData)
+ , fillFlags(s.fillFlags)
+ , strokeFlags(s.strokeFlags)
+ , pixmapFlags(s.pixmapFlags)
+ , intOpacity(s.intOpacity)
+ , txscale(s.txscale)
+ , flag_bits(s.flag_bits)
+ , clip(s.clip)
+ , dirty(s.dirty)
{
- stroker = s.stroker;
-
- lastBrush = s.lastBrush;
- brushData = s.brushData;
brushData.tempImage = 0;
-
- lastPen = s.lastPen;
- penData = s.penData;
penData.tempImage = 0;
-
- fillFlags = s.fillFlags;
- strokeFlags = s.strokeFlags;
- pixmapFlags = s.pixmapFlags;
-
- intOpacity = s.intOpacity;
-
- txscale = s.txscale;
-
- flag_bits = s.flag_bits;
-
- clip = s.clip;
flags.has_clip_ownership = false;
-
- dirty = s.dirty;
}
/*!
@@ -5165,7 +5157,8 @@ void QSpanData::setup(const QBrush &brush, int alpha, QPainter::CompositionMode
case Qt::SolidPattern: {
type = Solid;
QColor c = qbrush_color(brush);
- solid.color = PREMUL(ARGB_COMBINE_ALPHA(c.rgba(), alpha));
+ QRgb rgba = c.rgba();
+ solid.color = PREMUL(ARGB_COMBINE_ALPHA(rgba, alpha));
if ((solid.color & 0xff000000) == 0
&& compositionMode == QPainter::CompositionMode_SourceOver) {
type = None;
diff --git a/src/gui/painting/qpdf.cpp b/src/gui/painting/qpdf.cpp
index f5f7c3c..29e6a88 100644
--- a/src/gui/painting/qpdf.cpp
+++ b/src/gui/painting/qpdf.cpp
@@ -1156,6 +1156,8 @@ void QPdfBaseEngine::updateState(const QPaintEngineState &state)
}
if (flags & DirtyBrush) {
d->brush = state.brush();
+ if (d->brush.color().alpha() == 0 && d->brush.style() == Qt::SolidPattern)
+ d->brush.setStyle(Qt::NoBrush);
d->hasBrush = d->brush.style() != Qt::NoBrush;
}
if (flags & DirtyBrushOrigin) {
diff --git a/src/gui/styles/qcommonstyle.cpp b/src/gui/styles/qcommonstyle.cpp
index 296455b..e443832 100644
--- a/src/gui/styles/qcommonstyle.cpp
+++ b/src/gui/styles/qcommonstyle.cpp
@@ -1403,8 +1403,9 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt,
}
break;
case CE_ProgressBarGroove:
- qDrawShadePanel(p, opt->rect, opt->palette, true, 1,
- &opt->palette.brush(QPalette::Window));
+ if (opt->rect.isValid())
+ qDrawShadePanel(p, opt->rect, opt->palette, true, 1,
+ &opt->palette.brush(QPalette::Window));
break;
case CE_ProgressBarLabel:
if (const QStyleOptionProgressBar *pb = qstyleoption_cast<const QStyleOptionProgressBar *>(opt)) {
diff --git a/src/gui/styles/qwindowsstyle.cpp b/src/gui/styles/qwindowsstyle.cpp
index d994b9b..2604f1f 100644
--- a/src/gui/styles/qwindowsstyle.cpp
+++ b/src/gui/styles/qwindowsstyle.cpp
@@ -130,6 +130,7 @@ QWindowsStylePrivate::QWindowsStylePrivate()
pSHGetStockIconInfo = (PtrSHGetStockIconInfo)shellLib.resolve("SHGetStockIconInfo");
}
#endif
+ startTime.start();
}
// Returns true if the toplevel parent of \a widget has seen the Alt-key
@@ -2396,8 +2397,10 @@ void QWindowsStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPai
#ifndef QT_NO_PROGRESSBAR
case CE_ProgressBarContents:
if (const QStyleOptionProgressBar *pb = qstyleoption_cast<const QStyleOptionProgressBar *>(opt)) {
-
QRect rect = pb->rect;
+ if (!rect.isValid())
+ return;
+
bool vertical = false;
bool inverted = false;
diff --git a/src/gui/widgets/qdockwidget.cpp b/src/gui/widgets/qdockwidget.cpp
index df9b171..0a6269d 100644
--- a/src/gui/widgets/qdockwidget.cpp
+++ b/src/gui/widgets/qdockwidget.cpp
@@ -1531,8 +1531,11 @@ QAction * QDockWidget::toggleViewAction() const
/*!
\since 4.3
+
Sets an arbitrary \a widget as the dock widget's title bar. If \a widget
- is 0, the title bar widget is removed, but not deleted.
+ is 0, any custom title bar widget previously set on the dock widget is
+ removed, but not deleted, and the default title bar will be used
+ instead.
If a title bar widget is set, QDockWidget will not use native window
decorations when it is floated.
@@ -1540,23 +1543,27 @@ QAction * QDockWidget::toggleViewAction() const
Here are some tips for implementing custom title bars:
\list
- \i Mouse events that are not explicitly handled by the title bar widget
+ \o Mouse events that are not explicitly handled by the title bar widget
must be ignored by calling QMouseEvent::ignore(). These events then
propagate to the QDockWidget parent, which handles them in the usual
manner, moving when the title bar is dragged, docking and undocking
when it is double-clicked, etc.
- \i When DockWidgetVerticalTitleBar is set on QDockWidget, the title
+ \o When DockWidgetVerticalTitleBar is set on QDockWidget, the title
bar widget is repositioned accordingly. In resizeEvent(), the title
bar should check what orientation it should assume:
\snippet doc/src/snippets/code/src_gui_widgets_qdockwidget.cpp 0
- \i The title bar widget must have a valid QWidget::sizeHint() and
+ \o The title bar widget must have a valid QWidget::sizeHint() and
QWidget::minimumSizeHint(). These functions should take into account
the current orientation of the title bar.
+
+ \o It is not possible to remove a title bar from a dock widget. However,
+ a similar effect can be achieved by setting a default constructed
+ QWidget as the title bar widget.
\endlist
- Using qobject_cast as shown above, the title bar widget has full access
+ Using qobject_cast() as shown above, the title bar widget has full access
to its parent QDockWidget. Hence it can perform such operations as docking
and hiding in response to user actions.
diff --git a/src/imports/folderlistmodel/qdeclarativefolderlistmodel.cpp b/src/imports/folderlistmodel/qdeclarativefolderlistmodel.cpp
index 9c71004..7b05bc5 100644
--- a/src/imports/folderlistmodel/qdeclarativefolderlistmodel.cpp
+++ b/src/imports/folderlistmodel/qdeclarativefolderlistmodel.cpp
@@ -190,6 +190,12 @@ QVariant QDeclarativeFolderListModel::data(const QModelIndex &index, int role) c
return rv;
}
+/*!
+ \qmlproperty int FolderListModel::count
+
+ Returns the number of items in the current folder that match the
+ filter criteria.
+*/
int QDeclarativeFolderListModel::rowCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
@@ -225,6 +231,11 @@ void QDeclarativeFolderListModel::setFolder(const QUrl &folder)
}
}
+/*!
+ \qmlproperty url FolderListModel::parentFolder
+
+ Returns the URL of the parent of of the current \l folder.
+*/
QUrl QDeclarativeFolderListModel::parentFolder() const
{
QString localFile = d->folder.toLocalFile();
@@ -286,6 +297,21 @@ void QDeclarativeFolderListModel::componentComplete()
QMetaObject::invokeMethod(this, "refresh", Qt::QueuedConnection);
}
+/*!
+ \qmlproperty enumeration FolderListModel::sortField
+
+ The \a sortField property contains field to use for sorting. sortField
+ may be one of:
+ \list
+ \o Unsorted - no sorting is applied. The order is system default.
+ \o Name - sort by filename
+ \o Time - sort by time modified
+ \o Size - sort by file size
+ \o Type - sort by file type (extension)
+ \endlist
+
+ \sa sortReversed
+*/
QDeclarativeFolderListModel::SortField QDeclarativeFolderListModel::sortField() const
{
return d->sortField;
@@ -299,6 +325,13 @@ void QDeclarativeFolderListModel::setSortField(SortField field)
}
}
+/*!
+ \qmlproperty bool FolderListModel::sortReversed
+
+ If set to true, reverses the sort order. The default is false.
+
+ \sa sortField
+*/
bool QDeclarativeFolderListModel::sortReversed() const
{
return d->sortReversed;
diff --git a/src/opengl/gl2paintengineex/qglengineshadermanager.cpp b/src/opengl/gl2paintengineex/qglengineshadermanager.cpp
index 93ff3f4..0723c28 100644
--- a/src/opengl/gl2paintengineex/qglengineshadermanager.cpp
+++ b/src/opengl/gl2paintengineex/qglengineshadermanager.cpp
@@ -42,6 +42,7 @@
#include "qglengineshadermanager_p.h"
#include "qglengineshadersource_p.h"
#include "qpaintengineex_opengl2_p.h"
+#include "qglshadercache_p.h"
#if defined(QT_DEBUG)
#include <QMetaEnum>
@@ -170,64 +171,92 @@ QGLEngineSharedShaders::QGLEngineSharedShaders(const QGLContext* context)
QGLShader* fragShader;
QGLShader* vertexShader;
- QByteArray source;
+ QByteArray vertexSource;
+ QByteArray fragSource;
// Compile up the simple shader:
- source.clear();
- source.append(qShaderSnippets[MainVertexShader]);
- source.append(qShaderSnippets[PositionOnlyVertexShader]);
- vertexShader = new QGLShader(QGLShader::Vertex, context, 0);
- shaders.append(vertexShader);
- if (!vertexShader->compileSourceCode(source))
- qWarning("Vertex shader for simpleShaderProg (MainVertexShader & PositionOnlyVertexShader) failed to compile");
-
- source.clear();
- source.append(qShaderSnippets[MainFragmentShader]);
- source.append(qShaderSnippets[ShockingPinkSrcFragmentShader]);
- fragShader = new QGLShader(QGLShader::Fragment, context, 0);
- shaders.append(fragShader);
- if (!fragShader->compileSourceCode(source))
- qWarning("Fragment shader for simpleShaderProg (MainFragmentShader & ShockingPinkSrcFragmentShader) failed to compile");
+ vertexSource.append(qShaderSnippets[MainVertexShader]);
+ vertexSource.append(qShaderSnippets[PositionOnlyVertexShader]);
+
+ fragSource.append(qShaderSnippets[MainFragmentShader]);
+ fragSource.append(qShaderSnippets[ShockingPinkSrcFragmentShader]);
simpleShaderProg = new QGLShaderProgram(context, 0);
- simpleShaderProg->addShader(vertexShader);
- simpleShaderProg->addShader(fragShader);
- simpleShaderProg->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
- simpleShaderProg->bindAttributeLocation("pmvMatrix1", QT_PMV_MATRIX_1_ATTR);
- simpleShaderProg->bindAttributeLocation("pmvMatrix2", QT_PMV_MATRIX_2_ATTR);
- simpleShaderProg->bindAttributeLocation("pmvMatrix3", QT_PMV_MATRIX_3_ATTR);
+
+ CachedShader simpleShaderCache(fragSource, vertexSource);
+
+ bool inCache = simpleShaderCache.load(simpleShaderProg, context);
+
+ if (!inCache) {
+ vertexShader = new QGLShader(QGLShader::Vertex, context, 0);
+ shaders.append(vertexShader);
+ if (!vertexShader->compileSourceCode(vertexSource))
+ qWarning("Vertex shader for simpleShaderProg (MainVertexShader & PositionOnlyVertexShader) failed to compile");
+
+ fragShader = new QGLShader(QGLShader::Fragment, context, 0);
+ shaders.append(fragShader);
+ if (!fragShader->compileSourceCode(fragSource))
+ qWarning("Fragment shader for simpleShaderProg (MainFragmentShader & ShockingPinkSrcFragmentShader) failed to compile");
+
+ simpleShaderProg->addShader(vertexShader);
+ simpleShaderProg->addShader(fragShader);
+
+ simpleShaderProg->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
+ simpleShaderProg->bindAttributeLocation("pmvMatrix1", QT_PMV_MATRIX_1_ATTR);
+ simpleShaderProg->bindAttributeLocation("pmvMatrix2", QT_PMV_MATRIX_2_ATTR);
+ simpleShaderProg->bindAttributeLocation("pmvMatrix3", QT_PMV_MATRIX_3_ATTR);
+ }
+
simpleShaderProg->link();
- if (!simpleShaderProg->isLinked()) {
+
+ if (simpleShaderProg->isLinked()) {
+ if (!inCache)
+ simpleShaderCache.store(simpleShaderProg, context);
+ } else {
qCritical() << "Errors linking simple shader:"
<< simpleShaderProg->log();
}
// Compile the blit shader:
- source.clear();
- source.append(qShaderSnippets[MainWithTexCoordsVertexShader]);
- source.append(qShaderSnippets[UntransformedPositionVertexShader]);
- vertexShader = new QGLShader(QGLShader::Vertex, context, 0);
- shaders.append(vertexShader);
- if (!vertexShader->compileSourceCode(source))
- qWarning("Vertex shader for blitShaderProg (MainWithTexCoordsVertexShader & UntransformedPositionVertexShader) failed to compile");
-
- source.clear();
- source.append(qShaderSnippets[MainFragmentShader]);
- source.append(qShaderSnippets[ImageSrcFragmentShader]);
- fragShader = new QGLShader(QGLShader::Fragment, context, 0);
- shaders.append(fragShader);
- if (!fragShader->compileSourceCode(source))
- qWarning("Fragment shader for blitShaderProg (MainFragmentShader & ImageSrcFragmentShader) failed to compile");
+ vertexSource.clear();
+ vertexSource.append(qShaderSnippets[MainWithTexCoordsVertexShader]);
+ vertexSource.append(qShaderSnippets[UntransformedPositionVertexShader]);
+
+ fragSource.clear();
+ fragSource.append(qShaderSnippets[MainFragmentShader]);
+ fragSource.append(qShaderSnippets[ImageSrcFragmentShader]);
blitShaderProg = new QGLShaderProgram(context, 0);
- blitShaderProg->addShader(vertexShader);
- blitShaderProg->addShader(fragShader);
- blitShaderProg->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR);
- blitShaderProg->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
+
+ CachedShader blitShaderCache(fragSource, vertexSource);
+
+ inCache = blitShaderCache.load(blitShaderProg, context);
+
+ if (!inCache) {
+ vertexShader = new QGLShader(QGLShader::Vertex, context, 0);
+ shaders.append(vertexShader);
+ if (!vertexShader->compileSourceCode(vertexSource))
+ qWarning("Vertex shader for blitShaderProg (MainWithTexCoordsVertexShader & UntransformedPositionVertexShader) failed to compile");
+
+ fragShader = new QGLShader(QGLShader::Fragment, context, 0);
+ shaders.append(fragShader);
+ if (!fragShader->compileSourceCode(fragSource))
+ qWarning("Fragment shader for blitShaderProg (MainFragmentShader & ImageSrcFragmentShader) failed to compile");
+
+ blitShaderProg->addShader(vertexShader);
+ blitShaderProg->addShader(fragShader);
+
+ blitShaderProg->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR);
+ blitShaderProg->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
+ }
+
blitShaderProg->link();
- if (!blitShaderProg->isLinked()) {
+ if (blitShaderProg->isLinked()) {
+ if (!inCache)
+ blitShaderCache.store(blitShaderProg, context);
+ } else {
qCritical() << "Errors linking blit shader:"
- << simpleShaderProg->log();
+ << blitShaderProg->log();
}
#ifdef QT_GL_SHARED_SHADER_DEBUG
@@ -279,101 +308,110 @@ QGLEngineShaderProg *QGLEngineSharedShaders::findProgramInCache(const QGLEngineS
}
}
- QGLShader *vertexShader = 0;
- QGLShader *fragShader = 0;
- QGLEngineShaderProg *newProg = 0;
- bool success = false;
+ QScopedPointer<QGLEngineShaderProg> newProg;
do {
- QByteArray source;
+ QByteArray fragSource;
// Insert the custom stage before the srcPixel shader to work around an ATI driver bug
// where you cannot forward declare a function that takes a sampler as argument.
if (prog.srcPixelFragShader == CustomImageSrcFragmentShader)
- source.append(prog.customStageSource);
- source.append(qShaderSnippets[prog.mainFragShader]);
- source.append(qShaderSnippets[prog.srcPixelFragShader]);
+ fragSource.append(prog.customStageSource);
+ fragSource.append(qShaderSnippets[prog.mainFragShader]);
+ fragSource.append(qShaderSnippets[prog.srcPixelFragShader]);
if (prog.compositionFragShader)
- source.append(qShaderSnippets[prog.compositionFragShader]);
+ fragSource.append(qShaderSnippets[prog.compositionFragShader]);
if (prog.maskFragShader)
- source.append(qShaderSnippets[prog.maskFragShader]);
- fragShader = new QGLShader(QGLShader::Fragment, ctxGuard.context(), 0);
- shaders.append(fragShader);
- QByteArray description;
+ fragSource.append(qShaderSnippets[prog.maskFragShader]);
+
+ QByteArray vertexSource;
+ vertexSource.append(qShaderSnippets[prog.mainVertexShader]);
+ vertexSource.append(qShaderSnippets[prog.positionVertexShader]);
+
+ QScopedPointer<QGLShaderProgram> shaderProgram(new QGLShaderProgram(ctxGuard.context(), 0));
+
+ CachedShader shaderCache(fragSource, vertexSource);
+ bool inCache = shaderCache.load(shaderProgram.data(), ctxGuard.context());
+
+ if (!inCache) {
+
+ QScopedPointer<QGLShader> fragShader(new QGLShader(QGLShader::Fragment, ctxGuard.context(), 0));
+ QByteArray description;
#if defined(QT_DEBUG)
- // Name the shader for easier debugging
- description.append("Fragment shader: main=");
- description.append(snippetNameStr(prog.mainFragShader));
- description.append(", srcPixel=");
- description.append(snippetNameStr(prog.srcPixelFragShader));
- if (prog.compositionFragShader) {
- description.append(", composition=");
- description.append(snippetNameStr(prog.compositionFragShader));
- }
- if (prog.maskFragShader) {
- description.append(", mask=");
- description.append(snippetNameStr(prog.maskFragShader));
- }
- fragShader->setObjectName(QString::fromLatin1(description));
+ // Name the shader for easier debugging
+ description.append("Fragment shader: main=");
+ description.append(snippetNameStr(prog.mainFragShader));
+ description.append(", srcPixel=");
+ description.append(snippetNameStr(prog.srcPixelFragShader));
+ if (prog.compositionFragShader) {
+ description.append(", composition=");
+ description.append(snippetNameStr(prog.compositionFragShader));
+ }
+ if (prog.maskFragShader) {
+ description.append(", mask=");
+ description.append(snippetNameStr(prog.maskFragShader));
+ }
+ fragShader->setObjectName(QString::fromLatin1(description));
#endif
- if (!fragShader->compileSourceCode(source)) {
- qWarning() << "Warning:" << description << "failed to compile!";
- break;
- }
+ if (!fragShader->compileSourceCode(fragSource)) {
+ qWarning() << "Warning:" << description << "failed to compile!";
+ break;
+ }
- source.clear();
- source.append(qShaderSnippets[prog.mainVertexShader]);
- source.append(qShaderSnippets[prog.positionVertexShader]);
- vertexShader = new QGLShader(QGLShader::Vertex, ctxGuard.context(), 0);
- shaders.append(vertexShader);
+ QScopedPointer<QGLShader> vertexShader(new QGLShader(QGLShader::Vertex, ctxGuard.context(), 0));
#if defined(QT_DEBUG)
- // Name the shader for easier debugging
- description.clear();
- description.append("Vertex shader: main=");
- description.append(snippetNameStr(prog.mainVertexShader));
- description.append(", position=");
- description.append(snippetNameStr(prog.positionVertexShader));
- vertexShader->setObjectName(QString::fromLatin1(description));
+ // Name the shader for easier debugging
+ description.clear();
+ description.append("Vertex shader: main=");
+ description.append(snippetNameStr(prog.mainVertexShader));
+ description.append(", position=");
+ description.append(snippetNameStr(prog.positionVertexShader));
+ vertexShader->setObjectName(QString::fromLatin1(description));
#endif
- if (!vertexShader->compileSourceCode(source)) {
- qWarning() << "Warning:" << description << "failed to compile!";
- break;
- }
+ if (!vertexShader->compileSourceCode(vertexSource)) {
+ qWarning() << "Warning:" << description << "failed to compile!";
+ break;
+ }
- newProg = new QGLEngineShaderProg(prog);
-
- // If the shader program's not found in the cache, create it now.
- newProg->program = new QGLShaderProgram(ctxGuard.context(), 0);
- newProg->program->addShader(vertexShader);
- newProg->program->addShader(fragShader);
-
- // We have to bind the vertex attribute names before the program is linked:
- newProg->program->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
- if (newProg->useTextureCoords)
- newProg->program->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR);
- if (newProg->useOpacityAttribute)
- newProg->program->bindAttributeLocation("opacityArray", QT_OPACITY_ATTR);
- if (newProg->usePmvMatrixAttribute) {
- newProg->program->bindAttributeLocation("pmvMatrix1", QT_PMV_MATRIX_1_ATTR);
- newProg->program->bindAttributeLocation("pmvMatrix2", QT_PMV_MATRIX_2_ATTR);
- newProg->program->bindAttributeLocation("pmvMatrix3", QT_PMV_MATRIX_3_ATTR);
+ shaders.append(vertexShader.data());
+ shaders.append(fragShader.data());
+ shaderProgram->addShader(vertexShader.take());
+ shaderProgram->addShader(fragShader.take());
+
+ // We have to bind the vertex attribute names before the program is linked:
+ shaderProgram->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
+ if (prog.useTextureCoords)
+ shaderProgram->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR);
+ if (prog.useOpacityAttribute)
+ shaderProgram->bindAttributeLocation("opacityArray", QT_OPACITY_ATTR);
+ if (prog.usePmvMatrixAttribute) {
+ shaderProgram->bindAttributeLocation("pmvMatrix1", QT_PMV_MATRIX_1_ATTR);
+ shaderProgram->bindAttributeLocation("pmvMatrix2", QT_PMV_MATRIX_2_ATTR);
+ shaderProgram->bindAttributeLocation("pmvMatrix3", QT_PMV_MATRIX_3_ATTR);
+ }
}
+ newProg.reset(new QGLEngineShaderProg(prog));
+ newProg->program = shaderProgram.take();
+
newProg->program->link();
- if (!newProg->program->isLinked()) {
+ if (newProg->program->isLinked()) {
+ if (!inCache)
+ shaderCache.store(newProg->program, ctxGuard.context());
+ } else {
QLatin1String none("none");
QLatin1String br("\n");
QString error;
- error = QLatin1String("Shader program failed to link,")
+ error = QLatin1String("Shader program failed to link,");
#if defined(QT_DEBUG)
- + br
- + QLatin1String(" Shaders Used:") + br
- + QLatin1String(" ") + vertexShader->objectName() + QLatin1String(": ") + br
- + QLatin1String(vertexShader->sourceCode()) + br
- + QLatin1String(" ") + fragShader->objectName() + QLatin1String(": ") + br
- + QLatin1String(fragShader->sourceCode()) + br
+ error += QLatin1String("\n Shaders Used:\n");
+ for (int i = 0; i < newProg->program->shaders().count(); ++i) {
+ QGLShader *shader = newProg->program->shaders().at(i);
+ error += QLatin1String(" ") + shader->objectName() + QLatin1String(": \n")
+ + QLatin1String(shader->sourceCode()) + br;
+ }
#endif
- + QLatin1String(" Error Log:\n")
- + QLatin1String(" ") + newProg->program->log();
+ error += QLatin1String(" Error Log:\n")
+ + QLatin1String(" ") + newProg->program->log();
qWarning() << error;
break;
}
@@ -395,26 +433,10 @@ QGLEngineShaderProg *QGLEngineSharedShaders::findProgramInCache(const QGLEngineS
}
}
- cachedPrograms.insert(0, newProg);
-
- success = true;
+ cachedPrograms.insert(0, newProg.data());
} while (false);
- // Clean up everything if we weren't successful
- if (!success) {
- if (newProg) {
- delete newProg; // Also deletes the QGLShaderProgram which in turn deletes the QGLShaders
- newProg = 0;
- }
- else {
- if (vertexShader)
- delete vertexShader;
- if (fragShader)
- delete fragShader;
- }
- }
-
- return newProg;
+ return newProg.take();
}
void QGLEngineSharedShaders::cleanupCustomStage(QGLCustomShaderStage* stage)
diff --git a/src/opengl/gl2paintengineex/qglshadercache_meego_p.h b/src/opengl/gl2paintengineex/qglshadercache_meego_p.h
new file mode 100644
index 0000000..5f51fc2
--- /dev/null
+++ b/src/opengl/gl2paintengineex/qglshadercache_meego_p.h
@@ -0,0 +1,457 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#ifndef QGLSHADERCACHE_MEEGO_P_H
+#define QGLSHADERCACHE_MEEGO_P_H
+
+#include <QtCore/qglobal.h>
+
+#if defined(QT_MEEGO_EXPERIMENTAL_SHADERCACHE) && defined(QT_OPENGL_ES_2)
+
+#include <QtCore/qcryptographichash.h>
+#include <QtCore/qsharedmemory.h>
+#include <QtCore/qsystemsemaphore.h>
+
+#ifndef QT_BOOTSTRAPPED
+# include <GLES2/gl2ext.h>
+#endif
+#if defined(QT_DEBUG) || defined(QT_MEEGO_EXPERIMENTAL_SHADERCACHE_TRACE)
+# include <syslog.h>
+#endif
+
+QT_BEGIN_HEADER
+
+/*
+ This cache stores internal Qt shader programs in shared memory.
+
+ This header file is ugly on purpose and can only be included once. It is only to be used
+ for the internal shader cache, not as a generic cache for anyone's shaders.
+
+ The cache stores either ShaderCacheMaxEntries shader programs or ShaderCacheDataSize kilobytes
+ of shader programs, whatever limit is reached first.
+
+ The layout of the cache is as outlined in the CachedShaders struct. After some
+ integers, an array of headers is reserved, then comes the space for the actual binaries.
+
+ Shader Programs are identified by the md5sum of their frag and vertex shader source code.
+
+ Shader Programs are never removed. The cache never shrinks or re-shuffles. This is done
+ on purpose to ensure minimum amount of locking, no alignment problems and very few write
+ operations.
+
+ Note: Locking the shader cache could be expensive, because the entire system might hang.
+ That's why the cache is immutable to minimize the time we need to keep it locked.
+
+ Why is it Meego specific?
+
+ First, the size is chosen so that it fits to generic meego usage. Second, on Meego, there's
+ always at least one Qt application active (the launcher), so the cache will never be destroyed.
+ Only when the last Qt app exits, the cache dies, which should only be when someone kills the
+ X11 server. And last but not least it was only tested with Meego's SGX driver.
+
+ There's a small tool in src/opengl/util/meego that dumps the contents of the cache.
+ */
+
+// anonymous namespace, prevent exporting of the private symbols
+namespace
+{
+
+struct CachedShaderHeader
+{
+ /* the index in the data[] member of CachedShaders */
+ int index;
+ /* the size of the binary shader */
+ GLsizei size;
+ /* the format of the binary shader */
+ GLenum format;
+ /* the md5sum of the frag+vertex shaders */
+ char md5Sum[16];
+};
+
+enum
+{
+ /* The maximum amount of shader programs the cache can hold */
+ ShaderCacheMaxEntries = 20
+};
+
+typedef CachedShaderHeader CachedShaderHeaders[ShaderCacheMaxEntries];
+
+enum
+{
+ // ShaderCacheDataSize is 20k minus the other data members of CachedShaders
+ ShaderCacheDataSize = 1024 * ShaderCacheMaxEntries - sizeof(CachedShaderHeaders) - 2 * sizeof(int)
+};
+
+struct CachedShaders
+{
+ /* How much space is still available in the cache */
+ inline int availableSize() const { return ShaderCacheDataSize - dataSize; }
+
+ /* The current amount of cached shaders */
+ int shaderCount;
+
+ /* The current amount (in bytes) of cached data */
+ int dataSize;
+
+ /* The headers describing the shaders */
+ CachedShaderHeaders headers;
+
+ /* The actual binary data of the shader programs */
+ char data[ShaderCacheDataSize];
+};
+
+//#define QT_DEBUG_SHADER_CACHE
+#ifdef QT_DEBUG_SHADER_CACHE
+static QDebug shaderCacheDebug()
+{
+ return QDebug(QtDebugMsg);
+}
+#else
+static inline QNoDebug shaderCacheDebug() { return QNoDebug(); }
+#endif
+
+class ShaderCacheSharedMemory
+{
+public:
+ ShaderCacheSharedMemory()
+ : shm(QLatin1String("qt_gles2_shadercache_" QT_VERSION_STR))
+ {
+ // we need a system semaphore here, since cache creation and initialization must be atomic
+ QSystemSemaphore attachSemaphore(QLatin1String("qt_gles2_shadercache_mutex_" QT_VERSION_STR), 1);
+
+ if (!attachSemaphore.acquire()) {
+ shaderCacheDebug() << "Unable to require shader cache semaphore:" << attachSemaphore.errorString();
+ return;
+ }
+
+ if (shm.attach()) {
+ // success!
+ shaderCacheDebug() << "Attached to shader cache";
+ } else {
+
+ // no cache exists - create and initialize it
+ if (shm.create(sizeof(CachedShaders))) {
+ shaderCacheDebug() << "Created new shader cache";
+ initializeCache();
+ } else {
+ shaderCacheDebug() << "Unable to create shader cache:" << shm.errorString();
+ }
+ }
+
+ attachSemaphore.release();
+ }
+
+ inline bool isAttached() const { return shm.isAttached(); }
+
+ inline bool lock() { return shm.lock(); }
+ inline bool unlock() { return shm.unlock(); }
+ inline void *data() { return shm.data(); }
+ inline QString errorString() { return shm.errorString(); }
+
+ ~ShaderCacheSharedMemory()
+ {
+ if (!shm.detach())
+ shaderCacheDebug() << "Unable to detach shader cache" << shm.errorString();
+ }
+
+private:
+ void initializeCache()
+ {
+ // no need to lock the shared memory since we're already protected by the
+ // attach system semaphore.
+
+ void *data = shm.data();
+ Q_ASSERT(data);
+
+ memset(data, 0, sizeof(CachedShaders));
+ }
+
+ QSharedMemory shm;
+};
+
+class ShaderCacheLocker
+{
+public:
+ inline ShaderCacheLocker(ShaderCacheSharedMemory *cache)
+ : shm(cache->lock() ? cache : (ShaderCacheSharedMemory *)0)
+ {
+ if (!shm)
+ shaderCacheDebug() << "Unable to lock shader cache" << cache->errorString();
+ }
+
+ inline bool isLocked() const { return shm; }
+
+ inline ~ShaderCacheLocker()
+ {
+ if (!shm)
+ return;
+ if (!shm->unlock())
+ shaderCacheDebug() << "Unable to unlock shader cache" << shm->errorString();
+ }
+
+private:
+ ShaderCacheSharedMemory *shm;
+};
+
+#ifdef QT_BOOTSTRAPPED
+} // end namespace
+#else
+
+static void traceCacheOverflow(const char *message)
+{
+#if defined(QT_DEBUG) || defined (QT_MEEGO_EXPERIMENTAL_SHADERCACHE_TRACE)
+ openlog(qPrintable(QCoreApplication::applicationName()), LOG_PID | LOG_ODELAY, LOG_USER);
+ syslog(LOG_DEBUG, message);
+ closelog();
+#endif
+ shaderCacheDebug() << message;
+}
+
+Q_GLOBAL_STATIC(ShaderCacheSharedMemory, shaderCacheSharedMemory)
+
+/*
+ Finds the index of the shader program identified by md5Sum in the cache.
+ Note: Does NOT lock the cache for reading, the cache must already be locked!
+
+ Returns -1 when no shader was found.
+ */
+static int qt_cache_index_unlocked(const QByteArray &md5Sum, CachedShaders *cache)
+{
+ for (int i = 0; i < cache->shaderCount; ++i) {
+ if (qstrncmp(md5Sum.constData(), cache->headers[i].md5Sum, 16) == 0) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/* Returns the index of the shader identified by md5Sum */
+static int qt_cache_index(const QByteArray &md5Sum)
+{
+ ShaderCacheSharedMemory *shm = shaderCacheSharedMemory();
+ if (!shm || !shm->isAttached())
+ return false;
+
+ Q_ASSERT(md5Sum.length() == 16);
+
+ ShaderCacheLocker locker(shm);
+ if (!locker.isLocked())
+ return false;
+
+ void *data = shm->data();
+ Q_ASSERT(data);
+
+ CachedShaders *cache = reinterpret_cast<CachedShaders *>(data);
+
+ return qt_cache_index_unlocked(md5Sum, cache);
+}
+
+/* Loads the cached shader at index \a shaderIndex into \a program
+ * Note: Since the cache is immutable, this operation doesn't lock the shared memory.
+ */
+static bool qt_cached_shader(QGLShaderProgram *program, const QGLContext *ctx, int shaderIndex)
+{
+ Q_ASSERT(shaderIndex >= 0 && shaderIndex <= ShaderCacheMaxEntries);
+ Q_ASSERT(program);
+
+ ShaderCacheSharedMemory *shm = shaderCacheSharedMemory();
+ if (!shm || !shm->isAttached())
+ return false;
+
+ void *data = shm->data();
+ Q_ASSERT(data);
+
+ CachedShaders *cache = reinterpret_cast<CachedShaders *>(data);
+
+ shaderCacheDebug() << "fetching cached shader at index" << shaderIndex
+ << "dataIndex" << cache->headers[shaderIndex].index
+ << "size" << cache->headers[shaderIndex].size
+ << "format" << cache->headers[shaderIndex].format;
+
+ // call program->programId first, since that resolves the glProgramBinaryOES symbol
+ GLuint programId = program->programId();
+ glProgramBinaryOES(programId, cache->headers[shaderIndex].format,
+ cache->data + cache->headers[shaderIndex].index,
+ cache->headers[shaderIndex].size);
+
+ return true;
+}
+
+/* Stores the shader program in the cache. Returns false if there's an error with the cache, or
+ if the cache is too small to hold the shader. */
+static bool qt_cache_shader(const QGLShaderProgram *shader, const QGLContext *ctx, const QByteArray &md5Sum)
+{
+ ShaderCacheSharedMemory *shm = shaderCacheSharedMemory();
+ if (!shm || !shm->isAttached())
+ return false;
+
+ void *data = shm->data();
+ Q_ASSERT(data);
+
+ CachedShaders *cache = reinterpret_cast<CachedShaders *>(data);
+
+ ShaderCacheLocker locker(shm);
+ if (!locker.isLocked())
+ return false;
+
+ int cacheIdx = cache->shaderCount;
+ if (cacheIdx >= ShaderCacheMaxEntries) {
+ traceCacheOverflow("Qt OpenGL shader cache index overflow!");
+ return false;
+ }
+
+ // now that we have the lock on the shared memory, make sure no one
+ // inserted the shader already while we were unlocked
+ if (qt_cache_index_unlocked(md5Sum, cache) != -1)
+ return true; // already cached
+
+ shaderCacheDebug() << "Caching shader at index" << cacheIdx;
+
+ GLint binaryLength = 0;
+ glGetProgramiv(shader->programId(), GL_PROGRAM_BINARY_LENGTH_OES, &binaryLength);
+
+ if (!binaryLength) {
+ shaderCacheDebug() << "Unable to determine binary shader size!";
+ return false;
+ }
+
+ if (binaryLength > cache->availableSize()) {
+ traceCacheOverflow("Qt OpenGL shader cache data overflow!");
+ return false;
+ }
+
+ GLsizei size = 0;
+ GLenum format = 0;
+ glGetProgramBinaryOES(shader->programId(), binaryLength, &size, &format,
+ cache->data + cache->dataSize);
+
+ if (!size) {
+ shaderCacheDebug() << "Unable to get binary shader!";
+ return false;
+ }
+
+ cache->headers[cacheIdx].index = cache->dataSize;
+ cache->dataSize += binaryLength;
+ ++cache->shaderCount;
+ cache->headers[cacheIdx].size = binaryLength;
+ cache->headers[cacheIdx].format = format;
+
+ memcpy(cache->headers[cacheIdx].md5Sum, md5Sum.constData(), 16);
+
+ shaderCacheDebug() << "cached shader size" << size
+ << "format" << format
+ << "binarySize" << binaryLength
+ << "cache index" << cacheIdx
+ << "data index" << cache->headers[cacheIdx].index;
+
+ return true;
+}
+
+} // namespace
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(OpenGL)
+
+class CachedShader
+{
+public:
+ CachedShader(const QByteArray &fragSource, const QByteArray &vertexSource)
+ : cacheIdx(-1)
+ {
+ QCryptographicHash md5Hash(QCryptographicHash::Md5);
+
+ md5Hash.addData(fragSource);
+ md5Hash.addData(vertexSource);
+
+ md5Sum = md5Hash.result();
+ }
+
+ bool isCached()
+ {
+ return cacheIndex() != -1;
+ }
+
+ int cacheIndex()
+ {
+ if (cacheIdx != -1)
+ return cacheIdx;
+ cacheIdx = qt_cache_index(md5Sum);
+ return cacheIdx;
+ }
+
+ bool load(QGLShaderProgram *program, const QGLContext *ctx)
+ {
+ if (cacheIndex() == -1)
+ return false;
+ return qt_cached_shader(program, ctx, cacheIdx);
+ }
+
+ bool store(QGLShaderProgram *program, const QGLContext *ctx)
+ {
+ return qt_cache_shader(program, ctx, md5Sum);
+ }
+
+private:
+ QByteArray md5Sum;
+ int cacheIdx;
+};
+
+
+QT_END_NAMESPACE
+
+#endif
+
+QT_END_HEADER
+
+#endif
+#endif
diff --git a/src/opengl/gl2paintengineex/qglshadercache_p.h b/src/opengl/gl2paintengineex/qglshadercache_p.h
new file mode 100644
index 0000000..29616ae
--- /dev/null
+++ b/src/opengl/gl2paintengineex/qglshadercache_p.h
@@ -0,0 +1,98 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#ifndef QGLSHADERCACHE_P_H
+#define QGLSHADERCACHE_P_H
+
+#include <QtCore/qglobal.h>
+
+#if defined(QT_MEEGO_EXPERIMENTAL_SHADERCACHE) && defined(QT_OPENGL_ES_2)
+# include "qglshadercache_meego_p.h"
+#else
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(OpenGL)
+
+class QGLShaderProgram;
+class QGLContext;
+
+class CachedShader
+{
+public:
+ inline CachedShader(const QByteArray &, const QByteArray &)
+ {}
+
+ inline bool isCached()
+ {
+ return false;
+ }
+
+ inline bool load(QGLShaderProgram *, const QGLContext *)
+ {
+ return false;
+ }
+
+ inline bool store(QGLShaderProgram *, const QGLContext *)
+ {
+ return false;
+ }
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif
+#endif
diff --git a/src/opengl/opengl.pro b/src/opengl/opengl.pro
index 682e620..a089d55 100644
--- a/src/opengl/opengl.pro
+++ b/src/opengl/opengl.pro
@@ -60,7 +60,9 @@ SOURCES += qgl.cpp \
gl2paintengineex/qglcustomshaderstage_p.h \
gl2paintengineex/qtriangulatingstroker_p.h \
gl2paintengineex/qtriangulator_p.h \
- gl2paintengineex/qtextureglyphcache_gl_p.h
+ gl2paintengineex/qtextureglyphcache_gl_p.h \
+ gl2paintengineex/qglshadercache_p.h \
+ gl2paintengineex/qglshadercache_meego_p.h
SOURCES += qglshaderprogram.cpp \
qglpixmapfilter.cpp \
diff --git a/src/opengl/util/meego/main.cpp b/src/opengl/util/meego/main.cpp
new file mode 100644
index 0000000..5522855
--- /dev/null
+++ b/src/opengl/util/meego/main.cpp
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore/qdebug.h>
+
+#define QT_DEBUG_SHADER_CACHE
+#define QT_MEEGO_EXPERIMENTAL_SHADERCACHE
+#define QT_OPENGL_ES_2
+#define QT_BOOTSTRAPPED
+
+typedef int GLsizei;
+typedef unsigned int GLenum;
+
+#include "../../gl2paintengineex/qglshadercache_meego_p.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+int main()
+{
+ ShaderCacheSharedMemory shm;
+
+ if (!shm.isAttached()) {
+ fprintf(stderr, "Unable to attach to shared memory\n");
+ return EXIT_FAILURE;
+ }
+
+ ShaderCacheLocker locker(&shm);
+ if (!locker.isLocked()) {
+ fprintf(stderr, "Unable to lock shared memory\n");
+ return EXIT_FAILURE;
+ }
+
+ void *data = shm.data();
+ Q_ASSERT(data);
+
+ CachedShaders *cache = reinterpret_cast<CachedShaders *>(data);
+
+ for (int i = 0; i < cache->shaderCount; ++i) {
+ printf("Shader %d: %d bytes\n", i, cache->headers[i].size);
+ }
+
+ printf("\nSummary:\n\n"
+ " Amount of cached shaders: %d\n"
+ " Bytes used: %d\n"
+ " Bytes available: %d\n",
+ cache->shaderCount, cache->dataSize, cache->availableSize());
+
+ return EXIT_SUCCESS;
+}
+
diff --git a/src/opengl/util/meego/shader-cache-introspector.pro b/src/opengl/util/meego/shader-cache-introspector.pro
new file mode 100644
index 0000000..520e9a5
--- /dev/null
+++ b/src/opengl/util/meego/shader-cache-introspector.pro
@@ -0,0 +1,7 @@
+TEMPLATE = app
+
+SOURCES += main.cpp
+
+TARGET = shader-cache-introspector
+
+QT = core
diff --git a/src/plugins/phonon/mmf/mmf.pro b/src/plugins/phonon/mmf/mmf.pro
index e546d83..9dccc4f 100644
--- a/src/plugins/phonon/mmf/mmf.pro
+++ b/src/plugins/phonon/mmf/mmf.pro
@@ -128,7 +128,7 @@ symbian {
is_using_gnupoc {
LIBS += -laudioequalizereffect -lbassboosteffect -ldistanceattenuationeffect -ldopplerbase -leffectbase -lenvironmentalreverbeffect -llistenerdopplereffect -llistenerlocationeffect -llistenerorientationeffect -llocationbase -lloudnesseffect -lorientationbase -lsourcedopplereffect -lsourcelocationeffect -lsourceorientationeffect -lstereowideningeffect
} else {
- LIBS += -lAudioEqualizerEffect -lBassBoostEffect -lDistanceAttenuationEffect -lDopplerBase -lEffectBase -lEnvironmentalReverbEffect -lListenerDopplerEffect -lListenerLocationEffect -lListenerOrientationEffect -lLocationBase -lLoudnessEffect -lOrientationBase -lSourceDopplerEffect -lSourceLocationEffect -lSourceOrientationEffect -lStereoWideningEffect
+ LIBS += -lAudioEqualizerEffect -lBassBoostEffect -lDistanceAttenuationEffect -lDopplerbase -lEffectBase -lEnvironmentalReverbEffect -lListenerDopplerEffect -lListenerLocationEffect -lListenerOrientationEffect -lLocationBase -lLoudnessEffect -lOrientationBase -lSourceDopplerEffect -lSourceLocationEffect -lSourceOrientationEffect -lStereoWideningEffect
}
# This is needed for having the .qtplugin file properly created on Symbian.
diff --git a/src/s60installs/bwins/QtCoreu.def b/src/s60installs/bwins/QtCoreu.def
index 84aa246..f2c43e6 100644
--- a/src/s60installs/bwins/QtCoreu.def
+++ b/src/s60installs/bwins/QtCoreu.def
@@ -4591,3 +4591,11 @@ EXPORTS
?scope@QSystemError@@QAE?AW4ErrorScope@1@XZ @ 4590 NONAME ; enum QSystemError::ErrorScope QSystemError::scope(void)
?toString@QSystemError@@QAE?AVQString@@XZ @ 4591 NONAME ; class QString QSystemError::toString(void)
??0QFileInfo@@QAE@PAVQFileInfoPrivate@@@Z @ 4592 NONAME ; QFileInfo::QFileInfo(class QFileInfoPrivate *)
+ ?currentUnicodeVersion@QChar@@SA?AW4UnicodeVersion@1@XZ @ 4593 NONAME ; enum QChar::UnicodeVersion QChar::currentUnicodeVersion(void)
+ ?open@QFSFileEngine@@QAE_NV?$QFlags@W4OpenModeFlag@QIODevice@@@@ABVRFile@@V?$QFlags@W4FileHandleFlag@QFile@@@@@Z @ 4594 NONAME ; bool QFSFileEngine::open(class QFlags<enum QIODevice::OpenModeFlag>, class RFile const &, class QFlags<enum QFile::FileHandleFlag>)
+ ?open@QFSFileEngine@@QAE_NV?$QFlags@W4OpenModeFlag@QIODevice@@@@HV?$QFlags@W4FileHandleFlag@QFile@@@@@Z @ 4595 NONAME ; bool QFSFileEngine::open(class QFlags<enum QIODevice::OpenModeFlag>, int, class QFlags<enum QFile::FileHandleFlag>)
+ ?open@QFSFileEngine@@QAE_NV?$QFlags@W4OpenModeFlag@QIODevice@@@@PAU__sFILE@@V?$QFlags@W4FileHandleFlag@QFile@@@@@Z @ 4596 NONAME ; bool QFSFileEngine::open(class QFlags<enum QIODevice::OpenModeFlag>, struct __sFILE *, class QFlags<enum QFile::FileHandleFlag>)
+ ?open@QFile@@QAE_NABVRFile@@V?$QFlags@W4OpenModeFlag@QIODevice@@@@V?$QFlags@W4FileHandleFlag@QFile@@@@@Z @ 4597 NONAME ; bool QFile::open(class RFile const &, class QFlags<enum QIODevice::OpenModeFlag>, class QFlags<enum QFile::FileHandleFlag>)
+ ?open@QFile@@QAE_NHV?$QFlags@W4OpenModeFlag@QIODevice@@@@V?$QFlags@W4FileHandleFlag@QFile@@@@@Z @ 4598 NONAME ; bool QFile::open(int, class QFlags<enum QIODevice::OpenModeFlag>, class QFlags<enum QFile::FileHandleFlag>)
+ ?open@QFile@@QAE_NPAU__sFILE@@V?$QFlags@W4OpenModeFlag@QIODevice@@@@V?$QFlags@W4FileHandleFlag@QFile@@@@@Z @ 4599 NONAME ; bool QFile::open(struct __sFILE *, class QFlags<enum QIODevice::OpenModeFlag>, class QFlags<enum QFile::FileHandleFlag>)
+
diff --git a/src/s60installs/bwins/QtGuiu.def b/src/s60installs/bwins/QtGuiu.def
index 8dcc235..322d88b 100644
--- a/src/s60installs/bwins/QtGuiu.def
+++ b/src/s60installs/bwins/QtGuiu.def
@@ -2725,7 +2725,7 @@ EXPORTS
?clearSelection@QTextCursor@@QAEXXZ @ 2724 NONAME ; void QTextCursor::clearSelection(void)
?clearSpans@QTableView@@QAEXXZ @ 2725 NONAME ; void QTableView::clearSpans(void)
?clearString@QLineControl@@ABE?AVQString@@II@Z @ 2726 NONAME ; class QString QLineControl::clearString(unsigned int, unsigned int) const
- ?clearSubFocus@QGraphicsItemPrivate@@QAEXPAVQGraphicsItem@@@Z @ 2727 NONAME ; void QGraphicsItemPrivate::clearSubFocus(class QGraphicsItem *)
+ ?clearSubFocus@QGraphicsItemPrivate@@QAEXPAVQGraphicsItem@@@Z @ 2727 NONAME ABSENT ; void QGraphicsItemPrivate::clearSubFocus(class QGraphicsItem *)
?clearUndo@QLineControl@@QAEXXZ @ 2728 NONAME ; void QLineControl::clearUndo(void)
?click@QAbstractButton@@QAEXXZ @ 2729 NONAME ; void QAbstractButton::click(void)
?clicked@QAbstractButton@@IAEX_N@Z @ 2730 NONAME ; void QAbstractButton::clicked(bool)
@@ -9914,7 +9914,7 @@ EXPORTS
?setStyleSheet@QWidget@@QAEXABVQString@@@Z @ 9913 NONAME ; void QWidget::setStyleSheet(class QString const &)
?setStyleStrategy@QFont@@QAEXW4StyleStrategy@1@@Z @ 9914 NONAME ; void QFont::setStyleStrategy(enum QFont::StyleStrategy)
?setStyle_helper@QWidgetPrivate@@QAEXPAVQStyle@@_N1@Z @ 9915 NONAME ; void QWidgetPrivate::setStyle_helper(class QStyle *, bool, bool)
- ?setSubFocus@QGraphicsItemPrivate@@QAEXPAVQGraphicsItem@@@Z @ 9916 NONAME ; void QGraphicsItemPrivate::setSubFocus(class QGraphicsItem *)
+ ?setSubFocus@QGraphicsItemPrivate@@QAEXPAVQGraphicsItem@@@Z @ 9916 NONAME ABSENT ; void QGraphicsItemPrivate::setSubFocus(class QGraphicsItem *)
?setSubTitle@QWizardPage@@QAEXABVQString@@@Z @ 9917 NONAME ; void QWizardPage::setSubTitle(class QString const &)
?setSubTitleFormat@QWizard@@QAEXW4TextFormat@Qt@@@Z @ 9918 NONAME ; void QWizard::setSubTitleFormat(enum Qt::TextFormat)
?setSubmitPolicy@QDataWidgetMapper@@QAEXW4SubmitPolicy@1@@Z @ 9919 NONAME ; void QDataWidgetMapper::setSubmitPolicy(enum QDataWidgetMapper::SubmitPolicy)
@@ -13051,4 +13051,95 @@ EXPORTS
??_EQBlittable@@UAE@I@Z @ 13050 NONAME ; QBlittable::~QBlittable(unsigned int)
?qt_addBitmapToPath@@YAXMMPBEHHHPAVQPainterPath@@@Z @ 13051 NONAME ; void qt_addBitmapToPath(float, float, unsigned char const *, int, int, int, class QPainterPath *)
?drawGlyphs@QPainter@@QAEXABVQPointF@@ABVQGlyphs@@@Z @ 13052 NONAME ; void QPainter::drawGlyphs(class QPointF const &, class QGlyphs const &)
+ ??0QFlickGesture@@QAE@PAVQObject@@W4MouseButton@Qt@@0@Z @ 13053 NONAME ; QFlickGesture::QFlickGesture(class QObject *, enum Qt::MouseButton, class QObject *)
+ ??0QScrollEvent@@QAE@ABVQPointF@@0W4ScrollState@0@@Z @ 13054 NONAME ; QScrollEvent::QScrollEvent(class QPointF const &, class QPointF const &, enum QScrollEvent::ScrollState)
+ ??0QScrollPrepareEvent@@QAE@ABVQPointF@@@Z @ 13055 NONAME ; QScrollPrepareEvent::QScrollPrepareEvent(class QPointF const &)
+ ??0QScroller@@AAE@PAVQObject@@@Z @ 13056 NONAME ; QScroller::QScroller(class QObject *)
+ ??0QScrollerProperties@@QAE@ABV0@@Z @ 13057 NONAME ; QScrollerProperties::QScrollerProperties(class QScrollerProperties const &)
+ ??0QScrollerProperties@@QAE@XZ @ 13058 NONAME ; QScrollerProperties::QScrollerProperties(void)
+ ??1QFlickGesture@@UAE@XZ @ 13059 NONAME ; QFlickGesture::~QFlickGesture(void)
+ ??1QScrollEvent@@UAE@XZ @ 13060 NONAME ; QScrollEvent::~QScrollEvent(void)
+ ??1QScrollPrepareEvent@@UAE@XZ @ 13061 NONAME ; QScrollPrepareEvent::~QScrollPrepareEvent(void)
+ ??1QScroller@@EAE@XZ @ 13062 NONAME ; QScroller::~QScroller(void)
+ ??1QScrollerProperties@@UAE@XZ @ 13063 NONAME ; QScrollerProperties::~QScrollerProperties(void)
+ ??4QScrollerProperties@@QAEAAV0@ABV0@@Z @ 13064 NONAME ; class QScrollerProperties & QScrollerProperties::operator=(class QScrollerProperties const &)
+ ??8QScrollerProperties@@QBE_NABV0@@Z @ 13065 NONAME ; bool QScrollerProperties::operator==(class QScrollerProperties const &) const
+ ??9QScrollerProperties@@QBE_NABV0@@Z @ 13066 NONAME ; bool QScrollerProperties::operator!=(class QScrollerProperties const &) const
+ ??_EQFlickGesture@@UAE@I@Z @ 13067 NONAME ; QFlickGesture::~QFlickGesture(unsigned int)
+ ??_EQScrollEvent@@UAE@I@Z @ 13068 NONAME ; QScrollEvent::~QScrollEvent(unsigned int)
+ ??_EQScrollPrepareEvent@@UAE@I@Z @ 13069 NONAME ; QScrollPrepareEvent::~QScrollPrepareEvent(unsigned int)
+ ??_EQScroller@@UAE@I@Z @ 13070 NONAME ; QScroller::~QScroller(unsigned int)
+ ??_EQScrollerProperties@@UAE@I@Z @ 13071 NONAME ; QScrollerProperties::~QScrollerProperties(unsigned int)
+ ?activeScrollers@QScroller@@SA?AV?$QList@PAVQScroller@@@@XZ @ 13072 NONAME ; class QList<class QScroller *> QScroller::activeScrollers(void)
+ ?canStartScrollingAt@QAbstractScrollAreaPrivate@@QAE_NABVQPoint@@@Z @ 13073 NONAME ; bool QAbstractScrollAreaPrivate::canStartScrollingAt(class QPoint const &)
+ ?clearSubFocus@QGraphicsItemPrivate@@QAEXPAVQGraphicsItem@@0@Z @ 13074 NONAME ; void QGraphicsItemPrivate::clearSubFocus(class QGraphicsItem *, class QGraphicsItem *)
+ ?contentPos@QScrollEvent@@QBE?AVQPointF@@XZ @ 13075 NONAME ; class QPointF QScrollEvent::contentPos(void) const
+ ?contentPos@QScrollPrepareEvent@@QBE?AVQPointF@@XZ @ 13076 NONAME ; class QPointF QScrollPrepareEvent::contentPos(void) const
+ ?contentPosRange@QScrollPrepareEvent@@QBE?AVQRectF@@XZ @ 13077 NONAME ; class QRectF QScrollPrepareEvent::contentPosRange(void) const
+ ?d_func@QFlickGesture@@AAEPAVQFlickGesturePrivate@@XZ @ 13078 NONAME ; class QFlickGesturePrivate * QFlickGesture::d_func(void)
+ ?d_func@QFlickGesture@@ABEPBVQFlickGesturePrivate@@XZ @ 13079 NONAME ; class QFlickGesturePrivate const * QFlickGesture::d_func(void) const
+ ?d_func@QScrollEvent@@AAEPAVQScrollEventPrivate@@XZ @ 13080 NONAME ; class QScrollEventPrivate * QScrollEvent::d_func(void)
+ ?d_func@QScrollEvent@@ABEPBVQScrollEventPrivate@@XZ @ 13081 NONAME ; class QScrollEventPrivate const * QScrollEvent::d_func(void) const
+ ?d_func@QScrollPrepareEvent@@AAEPAVQScrollPrepareEventPrivate@@XZ @ 13082 NONAME ; class QScrollPrepareEventPrivate * QScrollPrepareEvent::d_func(void)
+ ?d_func@QScrollPrepareEvent@@ABEPBVQScrollPrepareEventPrivate@@XZ @ 13083 NONAME ; class QScrollPrepareEventPrivate const * QScrollPrepareEvent::d_func(void) const
+ ?d_func@QScroller@@AAEPAVQScrollerPrivate@@XZ @ 13084 NONAME ; class QScrollerPrivate * QScroller::d_func(void)
+ ?d_func@QScroller@@ABEPBVQScrollerPrivate@@XZ @ 13085 NONAME ; class QScrollerPrivate const * QScroller::d_func(void) const
+ ?ensureVisible@QScroller@@QAEXABVQRectF@@MM@Z @ 13086 NONAME ; void QScroller::ensureVisible(class QRectF const &, float, float)
+ ?ensureVisible@QScroller@@QAEXABVQRectF@@MMH@Z @ 13087 NONAME ; void QScroller::ensureVisible(class QRectF const &, float, float, int)
+ ?finalPosition@QScroller@@QBE?AVQPointF@@XZ @ 13088 NONAME ; class QPointF QScroller::finalPosition(void) const
+ ?getStaticMetaObject@QFlickGesture@@SAABUQMetaObject@@XZ @ 13089 NONAME ; struct QMetaObject const & QFlickGesture::getStaticMetaObject(void)
+ ?getStaticMetaObject@QScroller@@SAABUQMetaObject@@XZ @ 13090 NONAME ; struct QMetaObject const & QScroller::getStaticMetaObject(void)
+ ?grabGesture@QScroller@@SA?AW4GestureType@Qt@@PAVQObject@@W4ScrollerGestureType@1@@Z @ 13091 NONAME ; enum Qt::GestureType QScroller::grabGesture(class QObject *, enum QScroller::ScrollerGestureType)
+ ?grabbedGesture@QScroller@@SA?AW4GestureType@Qt@@PAVQObject@@@Z @ 13092 NONAME ; enum Qt::GestureType QScroller::grabbedGesture(class QObject *)
+ ?handleInput@QScroller@@QAE_NW4Input@1@ABVQPointF@@_J@Z @ 13093 NONAME ; bool QScroller::handleInput(enum QScroller::Input, class QPointF const &, long long)
+ ?hasScroller@QScroller@@SA_NPAVQObject@@@Z @ 13094 NONAME ; bool QScroller::hasScroller(class QObject *)
+ ?metaObject@QFlickGesture@@UBEPBUQMetaObject@@XZ @ 13095 NONAME ; struct QMetaObject const * QFlickGesture::metaObject(void) const
+ ?metaObject@QScroller@@UBEPBUQMetaObject@@XZ @ 13096 NONAME ; struct QMetaObject const * QScroller::metaObject(void) const
+ ?overshootDistance@QScrollEvent@@QBE?AVQPointF@@XZ @ 13097 NONAME ; class QPointF QScrollEvent::overshootDistance(void) const
+ ?pixelPerMeter@QScroller@@QBE?AVQPointF@@XZ @ 13098 NONAME ; class QPointF QScroller::pixelPerMeter(void) const
+ ?qGamma_correct_back_to_linear_cs@@YAXPAVQImage@@@Z @ 13099 NONAME ; void qGamma_correct_back_to_linear_cs(class QImage *)
+ ?qt_metacall@QFlickGesture@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 13100 NONAME ; int QFlickGesture::qt_metacall(enum QMetaObject::Call, int, void * *)
+ ?qt_metacall@QScroller@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 13101 NONAME ; int QScroller::qt_metacall(enum QMetaObject::Call, int, void * *)
+ ?qt_metacast@QFlickGesture@@UAEPAXPBD@Z @ 13102 NONAME ; void * QFlickGesture::qt_metacast(char const *)
+ ?qt_metacast@QScroller@@UAEPAXPBD@Z @ 13103 NONAME ; void * QScroller::qt_metacast(char const *)
+ ?resendPrepareEvent@QScroller@@QAEXXZ @ 13104 NONAME ; void QScroller::resendPrepareEvent(void)
+ ?resetCursorBlinkTimer@QLineControl@@QAEXXZ @ 13105 NONAME ; void QLineControl::resetCursorBlinkTimer(void)
+ ?scrollMetric@QScrollerProperties@@QBE?AVQVariant@@W4ScrollMetric@1@@Z @ 13106 NONAME ; class QVariant QScrollerProperties::scrollMetric(enum QScrollerProperties::ScrollMetric) const
+ ?scrollState@QScrollEvent@@QBE?AW4ScrollState@1@XZ @ 13107 NONAME ; enum QScrollEvent::ScrollState QScrollEvent::scrollState(void) const
+ ?scrollTo@QScroller@@QAEXABVQPointF@@@Z @ 13108 NONAME ; void QScroller::scrollTo(class QPointF const &)
+ ?scrollTo@QScroller@@QAEXABVQPointF@@H@Z @ 13109 NONAME ; void QScroller::scrollTo(class QPointF const &, int)
+ ?scroller@QScroller@@SAPAV1@PAVQObject@@@Z @ 13110 NONAME ; class QScroller * QScroller::scroller(class QObject *)
+ ?scroller@QScroller@@SAPBV1@PBVQObject@@@Z @ 13111 NONAME ; class QScroller const * QScroller::scroller(class QObject const *)
+ ?scrollerProperties@QScroller@@QBE?AVQScrollerProperties@@XZ @ 13112 NONAME ; class QScrollerProperties QScroller::scrollerProperties(void) const
+ ?scrollerPropertiesChanged@QScroller@@IAEXABVQScrollerProperties@@@Z @ 13113 NONAME ; void QScroller::scrollerPropertiesChanged(class QScrollerProperties const &)
+ ?setContentPos@QScrollPrepareEvent@@QAEXABVQPointF@@@Z @ 13114 NONAME ; void QScrollPrepareEvent::setContentPos(class QPointF const &)
+ ?setContentPosRange@QScrollPrepareEvent@@QAEXABVQRectF@@@Z @ 13115 NONAME ; void QScrollPrepareEvent::setContentPosRange(class QRectF const &)
+ ?setDefaultScrollerProperties@QScrollerProperties@@SAXABV1@@Z @ 13116 NONAME ; void QScrollerProperties::setDefaultScrollerProperties(class QScrollerProperties const &)
+ ?setScrollMetric@QScrollerProperties@@QAEXW4ScrollMetric@1@ABVQVariant@@@Z @ 13117 NONAME ; void QScrollerProperties::setScrollMetric(enum QScrollerProperties::ScrollMetric, class QVariant const &)
+ ?setScrollerProperties@QScroller@@QAEXABVQScrollerProperties@@@Z @ 13118 NONAME ; void QScroller::setScrollerProperties(class QScrollerProperties const &)
+ ?setSnapPositionsX@QScroller@@QAEXABV?$QList@M@@@Z @ 13119 NONAME ; void QScroller::setSnapPositionsX(class QList<float> const &)
+ ?setSnapPositionsX@QScroller@@QAEXMM@Z @ 13120 NONAME ; void QScroller::setSnapPositionsX(float, float)
+ ?setSnapPositionsY@QScroller@@QAEXABV?$QList@M@@@Z @ 13121 NONAME ; void QScroller::setSnapPositionsY(class QList<float> const &)
+ ?setSnapPositionsY@QScroller@@QAEXMM@Z @ 13122 NONAME ; void QScroller::setSnapPositionsY(float, float)
+ ?setSubFocus@QGraphicsItemPrivate@@QAEXPAVQGraphicsItem@@0@Z @ 13123 NONAME ; void QGraphicsItemPrivate::setSubFocus(class QGraphicsItem *, class QGraphicsItem *)
+ ?setViewportSize@QScrollPrepareEvent@@QAEXABVQSizeF@@@Z @ 13124 NONAME ; void QScrollPrepareEvent::setViewportSize(class QSizeF const &)
+ ?startPos@QScrollPrepareEvent@@QBE?AVQPointF@@XZ @ 13125 NONAME ; class QPointF QScrollPrepareEvent::startPos(void) const
+ ?state@QScroller@@QBE?AW4State@1@XZ @ 13126 NONAME ; enum QScroller::State QScroller::state(void) const
+ ?stateChanged@QScroller@@IAEXW4State@1@@Z @ 13127 NONAME ; void QScroller::stateChanged(enum QScroller::State)
+ ?stop@QScroller@@QAEXXZ @ 13128 NONAME ; void QScroller::stop(void)
+ ?target@QScroller@@QBEPAVQObject@@XZ @ 13129 NONAME ; class QObject * QScroller::target(void) const
+ ?tr@QFlickGesture@@SA?AVQString@@PBD0@Z @ 13130 NONAME ; class QString QFlickGesture::tr(char const *, char const *)
+ ?tr@QFlickGesture@@SA?AVQString@@PBD0H@Z @ 13131 NONAME ; class QString QFlickGesture::tr(char const *, char const *, int)
+ ?tr@QScroller@@SA?AVQString@@PBD0@Z @ 13132 NONAME ; class QString QScroller::tr(char const *, char const *)
+ ?tr@QScroller@@SA?AVQString@@PBD0H@Z @ 13133 NONAME ; class QString QScroller::tr(char const *, char const *, int)
+ ?trUtf8@QFlickGesture@@SA?AVQString@@PBD0@Z @ 13134 NONAME ; class QString QFlickGesture::trUtf8(char const *, char const *)
+ ?trUtf8@QFlickGesture@@SA?AVQString@@PBD0H@Z @ 13135 NONAME ; class QString QFlickGesture::trUtf8(char const *, char const *, int)
+ ?trUtf8@QScroller@@SA?AVQString@@PBD0@Z @ 13136 NONAME ; class QString QScroller::trUtf8(char const *, char const *)
+ ?trUtf8@QScroller@@SA?AVQString@@PBD0H@Z @ 13137 NONAME ; class QString QScroller::trUtf8(char const *, char const *, int)
+ ?ungrabGesture@QScroller@@SAXPAVQObject@@@Z @ 13138 NONAME ; void QScroller::ungrabGesture(class QObject *)
+ ?unsetDefaultScrollerProperties@QScrollerProperties@@SAXXZ @ 13139 NONAME ; void QScrollerProperties::unsetDefaultScrollerProperties(void)
+ ?velocity@QScroller@@QBE?AVQPointF@@XZ @ 13140 NONAME ; class QPointF QScroller::velocity(void) const
+ ?viewportSize@QScrollPrepareEvent@@QBE?AVQSizeF@@XZ @ 13141 NONAME ; class QSizeF QScrollPrepareEvent::viewportSize(void) const
+ ?staticMetaObject@QScroller@@2UQMetaObject@@B @ 13142 NONAME ; struct QMetaObject const QScroller::staticMetaObject
+ ?staticMetaObject@QFlickGesture@@2UQMetaObject@@B @ 13143 NONAME ; struct QMetaObject const QFlickGesture::staticMetaObject
diff --git a/src/s60installs/bwins/QtNetworku.def b/src/s60installs/bwins/QtNetworku.def
index 865aa54..b01324c 100644
--- a/src/s60installs/bwins/QtNetworku.def
+++ b/src/s60installs/bwins/QtNetworku.def
@@ -1001,7 +1001,7 @@ EXPORTS
?staticMetaObject@QNetworkSession@@2UQMetaObject@@B @ 1000 NONAME ; struct QMetaObject const QNetworkSession::staticMetaObject
?trUtf8@QBearerEngine@@SA?AVQString@@PBD0@Z @ 1001 NONAME ; class QString QBearerEngine::trUtf8(char const *, char const *)
?privateConfiguration@QNetworkSessionPrivate@@IBE?AV?$QExplicitlySharedDataPointer@VQNetworkConfigurationPrivate@@@@ABVQNetworkConfiguration@@@Z @ 1002 NONAME ; class QExplicitlySharedDataPointer<class QNetworkConfigurationPrivate> QNetworkSessionPrivate::privateConfiguration(class QNetworkConfiguration const &) const
- ?isOnline@QNetworkConfigurationManagerPrivate@@QAE_NXZ @ 1003 NONAME ; bool QNetworkConfigurationManagerPrivate::isOnline(void)
+ ?isOnline@QNetworkConfigurationManagerPrivate@@QAE_NXZ @ 1003 NONAME ABSENT ; bool QNetworkConfigurationManagerPrivate::isOnline(void)
?state@QNetworkConfiguration@@QBE?AV?$QFlags@W4StateFlag@QNetworkConfiguration@@@@XZ @ 1004 NONAME ; class QFlags<enum QNetworkConfiguration::StateFlag> QNetworkConfiguration::state(void) const
?configurationAdded@QNetworkConfigurationManagerPrivate@@IAEXABVQNetworkConfiguration@@@Z @ 1005 NONAME ; void QNetworkConfigurationManagerPrivate::configurationAdded(class QNetworkConfiguration const &)
?defaultConfiguration@QNetworkConfigurationManager@@QBE?AVQNetworkConfiguration@@XZ @ 1006 NONAME ; class QNetworkConfiguration QNetworkConfigurationManager::defaultConfiguration(void) const
@@ -1027,7 +1027,7 @@ EXPORTS
?staticMetaObject@QBearerEngine@@2UQMetaObject@@B @ 1026 NONAME ; struct QMetaObject const QBearerEngine::staticMetaObject
?networkSessionConnected@QNetworkAccessManager@@IAEXXZ @ 1027 NONAME ; void QNetworkAccessManager::networkSessionConnected(void)
??1QBearerEngine@@UAE@XZ @ 1028 NONAME ; QBearerEngine::~QBearerEngine(void)
- ?capabilities@QNetworkConfigurationManagerPrivate@@QAE?AV?$QFlags@W4Capability@QNetworkConfigurationManager@@@@XZ @ 1029 NONAME ; class QFlags<enum QNetworkConfigurationManager::Capability> QNetworkConfigurationManagerPrivate::capabilities(void)
+ ?capabilities@QNetworkConfigurationManagerPrivate@@QAE?AV?$QFlags@W4Capability@QNetworkConfigurationManager@@@@XZ @ 1029 NONAME ABSENT ; class QFlags<enum QNetworkConfigurationManager::Capability> QNetworkConfigurationManagerPrivate::capabilities(void)
??1QNetworkConfiguration@@QAE@XZ @ 1030 NONAME ; QNetworkConfiguration::~QNetworkConfiguration(void)
?bearerTypeName@QNetworkConfiguration@@QBE?AVQString@@XZ @ 1031 NONAME ; class QString QNetworkConfiguration::bearerTypeName(void) const
??0QNetworkConfigurationManagerPrivate@@QAE@XZ @ 1032 NONAME ; QNetworkConfigurationManagerPrivate::QNetworkConfigurationManagerPrivate(void)
@@ -1041,7 +1041,7 @@ EXPORTS
?name@QNetworkConfiguration@@QBE?AVQString@@XZ @ 1040 NONAME ; class QString QNetworkConfiguration::name(void) const
?close@QNetworkSession@@QAEXXZ @ 1041 NONAME ; void QNetworkSession::close(void)
?sessionProperty@QNetworkSession@@QBE?AVQVariant@@ABVQString@@@Z @ 1042 NONAME ; class QVariant QNetworkSession::sessionProperty(class QString const &) const
- ?engines@QNetworkConfigurationManagerPrivate@@QAE?AV?$QList@PAVQBearerEngine@@@@XZ @ 1043 NONAME ; class QList<class QBearerEngine *> QNetworkConfigurationManagerPrivate::engines(void)
+ ?engines@QNetworkConfigurationManagerPrivate@@QAE?AV?$QList@PAVQBearerEngine@@@@XZ @ 1043 NONAME ABSENT ; class QList<class QBearerEngine *> QNetworkConfigurationManagerPrivate::engines(void)
?isOnline@QNetworkConfigurationManager@@QBE_NXZ @ 1044 NONAME ; bool QNetworkConfigurationManager::isOnline(void) const
?capabilities@QNetworkConfigurationManager@@QBE?AV?$QFlags@W4Capability@QNetworkConfigurationManager@@@@XZ @ 1045 NONAME ; class QFlags<enum QNetworkConfigurationManager::Capability> QNetworkConfigurationManager::capabilities(void) const
?configurationRemoved@QNetworkConfigurationManagerPrivate@@AAEXV?$QExplicitlySharedDataPointer@VQNetworkConfigurationPrivate@@@@@Z @ 1046 NONAME ; void QNetworkConfigurationManagerPrivate::configurationRemoved(class QExplicitlySharedDataPointer<class QNetworkConfigurationPrivate>)
@@ -1095,7 +1095,7 @@ EXPORTS
??_EQBearerEnginePlugin@@UAE@I@Z @ 1094 NONAME ; QBearerEnginePlugin::~QBearerEnginePlugin(unsigned int)
?children@QNetworkConfiguration@@QBE?AV?$QList@VQNetworkConfiguration@@@@XZ @ 1095 NONAME ; class QList<class QNetworkConfiguration> QNetworkConfiguration::children(void) const
?activeConfiguration@QNetworkAccessManager@@QBE?AVQNetworkConfiguration@@XZ @ 1096 NONAME ; class QNetworkConfiguration QNetworkAccessManager::activeConfiguration(void) const
- ?defaultConfiguration@QNetworkConfigurationManagerPrivate@@QAE?AVQNetworkConfiguration@@XZ @ 1097 NONAME ; class QNetworkConfiguration QNetworkConfigurationManagerPrivate::defaultConfiguration(void)
+ ?defaultConfiguration@QNetworkConfigurationManagerPrivate@@QAE?AVQNetworkConfiguration@@XZ @ 1097 NONAME ABSENT ; class QNetworkConfiguration QNetworkConfigurationManagerPrivate::defaultConfiguration(void)
?getStaticMetaObject@QNetworkSession@@SAABUQMetaObject@@XZ @ 1098 NONAME ; struct QMetaObject const & QNetworkSession::getStaticMetaObject(void)
?qt_metacast@QNetworkSession@@UAEPAXPBD@Z @ 1099 NONAME ; void * QNetworkSession::qt_metacast(char const *)
?updateCompleted@QBearerEngine@@IAEXXZ @ 1100 NONAME ; void QBearerEngine::updateCompleted(void)
@@ -1109,8 +1109,8 @@ EXPORTS
?qt_metacast@QNetworkConfigurationManagerPrivate@@UAEPAXPBD@Z @ 1108 NONAME ; void * QNetworkConfigurationManagerPrivate::qt_metacast(char const *)
?newConfigurationActivated@QNetworkSessionPrivate@@IAEXXZ @ 1109 NONAME ; void QNetworkSessionPrivate::newConfigurationActivated(void)
?qt_metacast@QNetworkSessionPrivate@@UAEPAXPBD@Z @ 1110 NONAME ; void * QNetworkSessionPrivate::qt_metacast(char const *)
- ?startPolling@QNetworkConfigurationManagerPrivate@@QAEXXZ @ 1111 NONAME ; void QNetworkConfigurationManagerPrivate::startPolling(void)
- ?allConfigurations@QNetworkConfigurationManagerPrivate@@QAE?AV?$QList@VQNetworkConfiguration@@@@V?$QFlags@W4StateFlag@QNetworkConfiguration@@@@@Z @ 1112 NONAME ; class QList<class QNetworkConfiguration> QNetworkConfigurationManagerPrivate::allConfigurations(class QFlags<enum QNetworkConfiguration::StateFlag>)
+ ?startPolling@QNetworkConfigurationManagerPrivate@@QAEXXZ @ 1111 NONAME ABSENT ; void QNetworkConfigurationManagerPrivate::startPolling(void)
+ ?allConfigurations@QNetworkConfigurationManagerPrivate@@QAE?AV?$QList@VQNetworkConfiguration@@@@V?$QFlags@W4StateFlag@QNetworkConfiguration@@@@@Z @ 1112 NONAME ABSENT ; class QList<class QNetworkConfiguration> QNetworkConfigurationManagerPrivate::allConfigurations(class QFlags<enum QNetworkConfiguration::StateFlag>)
?connectNotify@QNetworkSession@@MAEXPBD@Z @ 1113 NONAME ; void QNetworkSession::connectNotify(char const *)
?onlineStateChanged@QNetworkConfigurationManagerPrivate@@IAEX_N@Z @ 1114 NONAME ; void QNetworkConfigurationManagerPrivate::onlineStateChanged(bool)
?bytesWritten@QNetworkSession@@QBE_KXZ @ 1115 NONAME ; unsigned long long QNetworkSession::bytesWritten(void) const
@@ -1132,8 +1132,8 @@ EXPORTS
?reject@QNetworkSession@@QAEXXZ @ 1131 NONAME ; void QNetworkSession::reject(void)
?options@QAuthenticator@@QBE?AV?$QHash@VQString@@VQVariant@@@@XZ @ 1132 NONAME ; class QHash<class QString, class QVariant> QAuthenticator::options(void) const
?purpose@QNetworkConfiguration@@QBE?AW4Purpose@1@XZ @ 1133 NONAME ; enum QNetworkConfiguration::Purpose QNetworkConfiguration::purpose(void) const
- ?configurationFromIdentifier@QNetworkConfigurationManagerPrivate@@QAE?AVQNetworkConfiguration@@ABVQString@@@Z @ 1134 NONAME ; class QNetworkConfiguration QNetworkConfigurationManagerPrivate::configurationFromIdentifier(class QString const &)
- ?abort@QNetworkConfigurationManagerPrivate@@IAEXXZ @ 1135 NONAME ; void QNetworkConfigurationManagerPrivate::abort(void)
+ ?configurationFromIdentifier@QNetworkConfigurationManagerPrivate@@QAE?AVQNetworkConfiguration@@ABVQString@@@Z @ 1134 NONAME ABSENT ; class QNetworkConfiguration QNetworkConfigurationManagerPrivate::configurationFromIdentifier(class QString const &)
+ ?abort@QNetworkConfigurationManagerPrivate@@IAEXXZ @ 1135 NONAME ABSENT ; void QNetworkConfigurationManagerPrivate::abort(void)
?tr@QNetworkConfigurationManager@@SA?AVQString@@PBD0@Z @ 1136 NONAME ; class QString QNetworkConfigurationManager::tr(char const *, char const *)
?trUtf8@QNetworkSession@@SA?AVQString@@PBD0H@Z @ 1137 NONAME ; class QString QNetworkSession::trUtf8(char const *, char const *, int)
?trUtf8@QBearerEnginePlugin@@SA?AVQString@@PBD0@Z @ 1138 NONAME ; class QString QBearerEnginePlugin::trUtf8(char const *, char const *)
@@ -1152,4 +1152,11 @@ EXPORTS
?joinMulticastGroup@QUdpSocket@@QAE_NABVQHostAddress@@@Z @ 1151 NONAME ; bool QUdpSocket::joinMulticastGroup(class QHostAddress const &)
?leaveMulticastGroup@QUdpSocket@@QAE_NABVQHostAddress@@ABVQNetworkInterface@@@Z @ 1152 NONAME ; bool QUdpSocket::leaveMulticastGroup(class QHostAddress const &, class QNetworkInterface const &)
?leaveMulticastGroup@QUdpSocket@@QAE_NABVQHostAddress@@@Z @ 1153 NONAME ; bool QUdpSocket::leaveMulticastGroup(class QHostAddress const &)
+ ?allConfigurations@QNetworkConfigurationManagerPrivate@@QBE?AV?$QList@VQNetworkConfiguration@@@@V?$QFlags@W4StateFlag@QNetworkConfiguration@@@@@Z @ 1154 NONAME ; class QList<class QNetworkConfiguration> QNetworkConfigurationManagerPrivate::allConfigurations(class QFlags<enum QNetworkConfiguration::StateFlag>) const
+ ?capabilities@QNetworkConfigurationManagerPrivate@@QBE?AV?$QFlags@W4Capability@QNetworkConfigurationManager@@@@XZ @ 1155 NONAME ; class QFlags<enum QNetworkConfigurationManager::Capability> QNetworkConfigurationManagerPrivate::capabilities(void) const
+ ?configurationFromIdentifier@QNetworkConfigurationManagerPrivate@@QBE?AVQNetworkConfiguration@@ABVQString@@@Z @ 1156 NONAME ; class QNetworkConfiguration QNetworkConfigurationManagerPrivate::configurationFromIdentifier(class QString const &) const
+ ?defaultConfiguration@QNetworkConfigurationManagerPrivate@@QBE?AVQNetworkConfiguration@@XZ @ 1157 NONAME ; class QNetworkConfiguration QNetworkConfigurationManagerPrivate::defaultConfiguration(void) const
+ ?engines@QNetworkConfigurationManagerPrivate@@QBE?AV?$QList@PAVQBearerEngine@@@@XZ @ 1158 NONAME ; class QList<class QBearerEngine *> QNetworkConfigurationManagerPrivate::engines(void) const
+ ?isOnline@QNetworkConfigurationManagerPrivate@@QBE_NXZ @ 1159 NONAME ; bool QNetworkConfigurationManagerPrivate::isOnline(void) const
+ ?startPolling@QNetworkConfigurationManagerPrivate@@AAEXXZ @ 1160 NONAME ; void QNetworkConfigurationManagerPrivate::startPolling(void)
diff --git a/src/s60installs/bwins/QtOpenGLu.def b/src/s60installs/bwins/QtOpenGLu.def
index 620fcb9..490eaf3 100644
--- a/src/s60installs/bwins/QtOpenGLu.def
+++ b/src/s60installs/bwins/QtOpenGLu.def
@@ -365,7 +365,7 @@ EXPORTS
?samples@QGLFramebufferObjectFormat@@QBEHXZ @ 364 NONAME ; int QGLFramebufferObjectFormat::samples(void) const
?setInactive@QGLCustomShaderStage@@QAEXXZ @ 365 NONAME ; void QGLCustomShaderStage::setInactive(void)
?extensionFuncs@QGLContextPrivate@@SAAAUQGLExtensionFuncs@@PBVQGLContext@@@Z @ 366 NONAME ; struct QGLExtensionFuncs & QGLContextPrivate::extensionFuncs(class QGLContext const *)
- ?value@QGLContextResource@@QAEPAXPBVQGLContext@@@Z @ 367 NONAME ; void * QGLContextResource::value(class QGLContext const *)
+ ?value@QGLContextResource@@QAEPAXPBVQGLContext@@@Z @ 367 NONAME ABSENT ; void * QGLContextResource::value(class QGLContext const *)
?majorVersion@QGLFormat@@QBEHXZ @ 368 NONAME ; int QGLFormat::majorVersion(void) const
?rgba@QGLFormat@@QBE_NXZ @ 369 NONAME ; bool QGLFormat::rgba(void) const
?paintDevice@QGLWindowSurface@@UAEPAVQPaintDevice@@XZ @ 370 NONAME ; class QPaintDevice * QGLWindowSurface::paintDevice(void)
diff --git a/src/s60installs/eabi/QtCoreu.def b/src/s60installs/eabi/QtCoreu.def
index 130d9c0..e97ac61 100644
--- a/src/s60installs/eabi/QtCoreu.def
+++ b/src/s60installs/eabi/QtCoreu.def
@@ -3795,4 +3795,10 @@ EXPORTS
_ZN5QChar21currentUnicodeVersionEv @ 3794 NONAME
_ZN9QFileInfoC1EP16QFileInfoPrivate @ 3795 NONAME
_ZN9QFileInfoC2EP16QFileInfoPrivate @ 3796 NONAME
+ _ZN13QFSFileEngine4openE6QFlagsIN9QIODevice12OpenModeFlagEEP7__sFILES0_IN5QFile14FileHandleFlagEE @ 3797 NONAME
+ _ZN13QFSFileEngine4openE6QFlagsIN9QIODevice12OpenModeFlagEERK5RFileS0_IN5QFile14FileHandleFlagEE @ 3798 NONAME
+ _ZN13QFSFileEngine4openE6QFlagsIN9QIODevice12OpenModeFlagEEiS0_IN5QFile14FileHandleFlagEE @ 3799 NONAME
+ _ZN5QFile4openEP7__sFILE6QFlagsIN9QIODevice12OpenModeFlagEES2_INS_14FileHandleFlagEE @ 3800 NONAME
+ _ZN5QFile4openERK5RFile6QFlagsIN9QIODevice12OpenModeFlagEES3_INS_14FileHandleFlagEE @ 3801 NONAME
+ _ZN5QFile4openEi6QFlagsIN9QIODevice12OpenModeFlagEES0_INS_14FileHandleFlagEE @ 3802 NONAME
diff --git a/src/s60installs/eabi/QtGuiu.def b/src/s60installs/eabi/QtGuiu.def
index 926ed52..8064fa3 100644
--- a/src/s60installs/eabi/QtGuiu.def
+++ b/src/s60installs/eabi/QtGuiu.def
@@ -4658,11 +4658,11 @@ EXPORTS
_ZN20QGraphicsEllipseItemD1Ev @ 4657 NONAME
_ZN20QGraphicsEllipseItemD2Ev @ 4658 NONAME
_ZN20QGraphicsItemPrivate11removeChildEP13QGraphicsItem @ 4659 NONAME
- _ZN20QGraphicsItemPrivate11setSubFocusEP13QGraphicsItem @ 4660 NONAME
+ _ZN20QGraphicsItemPrivate11setSubFocusEP13QGraphicsItem @ 4660 NONAME ABSENT
_ZN20QGraphicsItemPrivate12remapItemPosEP6QEventP13QGraphicsItem @ 4661 NONAME
_ZN20QGraphicsItemPrivate12resolveDepthEv @ 4662 NONAME
_ZN20QGraphicsItemPrivate12setPosHelperERK7QPointF @ 4663 NONAME
- _ZN20QGraphicsItemPrivate13clearSubFocusEP13QGraphicsItem @ 4664 NONAME
+ _ZN20QGraphicsItemPrivate13clearSubFocusEP13QGraphicsItem @ 4664 NONAME ABSENT
_ZN20QGraphicsItemPrivate14setFocusHelperEN2Qt11FocusReasonEb @ 4665 NONAME ABSENT
_ZN20QGraphicsItemPrivate15resetFocusProxyEv @ 4666 NONAME
_ZN20QGraphicsItemPrivate16setEnabledHelperEbbb @ 4667 NONAME
@@ -12233,4 +12233,104 @@ EXPORTS
_ZNK14QFileOpenEvent8openFileER5QFile6QFlagsIN9QIODevice12OpenModeFlagEE @ 12232 NONAME ABSENT
_ZN11QFontEngine16alphaMapForGlyphEj6QFixed @ 12233 NONAME
_ZN11QFontEngine16alphaMapForGlyphEj6QFixedRK10QTransform @ 12234 NONAME
+ _Z32qGamma_correct_back_to_linear_csP6QImage @ 12235 NONAME
+ _ZN12QLineControl21resetCursorBlinkTimerEv @ 12236 NONAME
+ _ZN12QScrollEvent6d_funcEv @ 12237 NONAME
+ _ZN12QScrollEventC1ERK7QPointFS2_NS_11ScrollStateE @ 12238 NONAME
+ _ZN12QScrollEventC2ERK7QPointFS2_NS_11ScrollStateE @ 12239 NONAME
+ _ZN12QScrollEventD0Ev @ 12240 NONAME
+ _ZN12QScrollEventD1Ev @ 12241 NONAME
+ _ZN12QScrollEventD2Ev @ 12242 NONAME
+ _ZN13QFlickGesture11qt_metacallEN11QMetaObject4CallEiPPv @ 12243 NONAME
+ _ZN13QFlickGesture11qt_metacastEPKc @ 12244 NONAME
+ _ZN13QFlickGesture16staticMetaObjectE @ 12245 NONAME DATA 16
+ _ZN13QFlickGesture19getStaticMetaObjectEv @ 12246 NONAME
+ _ZN13QFlickGestureC1EP7QObjectN2Qt11MouseButtonES1_ @ 12247 NONAME
+ _ZN13QFlickGestureC2EP7QObjectN2Qt11MouseButtonES1_ @ 12248 NONAME
+ _ZN13QFlickGestureD0Ev @ 12249 NONAME
+ _ZN13QFlickGestureD1Ev @ 12250 NONAME
+ _ZN13QFlickGestureD2Ev @ 12251 NONAME
+ _ZN19QScrollPrepareEvent13setContentPosERK7QPointF @ 12252 NONAME
+ _ZN19QScrollPrepareEvent15setViewportSizeERK6QSizeF @ 12253 NONAME
+ _ZN19QScrollPrepareEvent18setContentPosRangeERK6QRectF @ 12254 NONAME
+ _ZN19QScrollPrepareEvent6d_funcEv @ 12255 NONAME
+ _ZN19QScrollPrepareEventC1ERK7QPointF @ 12256 NONAME
+ _ZN19QScrollPrepareEventC2ERK7QPointF @ 12257 NONAME
+ _ZN19QScrollPrepareEventD0Ev @ 12258 NONAME
+ _ZN19QScrollPrepareEventD1Ev @ 12259 NONAME
+ _ZN19QScrollPrepareEventD2Ev @ 12260 NONAME
+ _ZN19QScrollerProperties15setScrollMetricENS_12ScrollMetricERK8QVariant @ 12261 NONAME
+ _ZN19QScrollerProperties28setDefaultScrollerPropertiesERKS_ @ 12262 NONAME
+ _ZN19QScrollerProperties30unsetDefaultScrollerPropertiesEv @ 12263 NONAME
+ _ZN19QScrollerPropertiesC1ERKS_ @ 12264 NONAME
+ _ZN19QScrollerPropertiesC1Ev @ 12265 NONAME
+ _ZN19QScrollerPropertiesC2ERKS_ @ 12266 NONAME
+ _ZN19QScrollerPropertiesC2Ev @ 12267 NONAME
+ _ZN19QScrollerPropertiesD0Ev @ 12268 NONAME
+ _ZN19QScrollerPropertiesD1Ev @ 12269 NONAME
+ _ZN19QScrollerPropertiesD2Ev @ 12270 NONAME
+ _ZN19QScrollerPropertiesaSERKS_ @ 12271 NONAME
+ _ZN20QGraphicsItemPrivate11setSubFocusEP13QGraphicsItemS1_ @ 12272 NONAME
+ _ZN20QGraphicsItemPrivate13clearSubFocusEP13QGraphicsItemS1_ @ 12273 NONAME
+ _ZN26QAbstractScrollAreaPrivate19canStartScrollingAtERK6QPoint @ 12274 NONAME
+ _ZN9QScroller11grabGestureEP7QObjectNS_19ScrollerGestureTypeE @ 12275 NONAME
+ _ZN9QScroller11handleInputENS_5InputERK7QPointFx @ 12276 NONAME
+ _ZN9QScroller11hasScrollerEP7QObject @ 12277 NONAME
+ _ZN9QScroller11qt_metacallEN11QMetaObject4CallEiPPv @ 12278 NONAME
+ _ZN9QScroller11qt_metacastEPKc @ 12279 NONAME
+ _ZN9QScroller12stateChangedENS_5StateE @ 12280 NONAME
+ _ZN9QScroller13ensureVisibleERK6QRectFff @ 12281 NONAME
+ _ZN9QScroller13ensureVisibleERK6QRectFffi @ 12282 NONAME
+ _ZN9QScroller13ungrabGestureEP7QObject @ 12283 NONAME
+ _ZN9QScroller14grabbedGestureEP7QObject @ 12284 NONAME
+ _ZN9QScroller15activeScrollersEv @ 12285 NONAME
+ _ZN9QScroller16staticMetaObjectE @ 12286 NONAME DATA 16
+ _ZN9QScroller17setSnapPositionsXERK5QListIfE @ 12287 NONAME
+ _ZN9QScroller17setSnapPositionsXEff @ 12288 NONAME
+ _ZN9QScroller17setSnapPositionsYERK5QListIfE @ 12289 NONAME
+ _ZN9QScroller17setSnapPositionsYEff @ 12290 NONAME
+ _ZN9QScroller18resendPrepareEventEv @ 12291 NONAME
+ _ZN9QScroller19getStaticMetaObjectEv @ 12292 NONAME
+ _ZN9QScroller21setScrollerPropertiesERK19QScrollerProperties @ 12293 NONAME
+ _ZN9QScroller25scrollerPropertiesChangedERK19QScrollerProperties @ 12294 NONAME
+ _ZN9QScroller4stopEv @ 12295 NONAME
+ _ZN9QScroller8scrollToERK7QPointF @ 12296 NONAME
+ _ZN9QScroller8scrollToERK7QPointFi @ 12297 NONAME
+ _ZN9QScroller8scrollerEP7QObject @ 12298 NONAME
+ _ZN9QScroller8scrollerEPK7QObject @ 12299 NONAME
+ _ZN9QScrollerC1EP7QObject @ 12300 NONAME
+ _ZN9QScrollerC2EP7QObject @ 12301 NONAME
+ _ZN9QScrollerD0Ev @ 12302 NONAME
+ _ZN9QScrollerD1Ev @ 12303 NONAME
+ _ZN9QScrollerD2Ev @ 12304 NONAME
+ _ZNK12QScrollEvent10contentPosEv @ 12305 NONAME
+ _ZNK12QScrollEvent11scrollStateEv @ 12306 NONAME
+ _ZNK12QScrollEvent17overshootDistanceEv @ 12307 NONAME
+ _ZNK12QScrollEvent6d_funcEv @ 12308 NONAME
+ _ZNK13QFlickGesture10metaObjectEv @ 12309 NONAME
+ _ZNK19QScrollPrepareEvent10contentPosEv @ 12310 NONAME
+ _ZNK19QScrollPrepareEvent12viewportSizeEv @ 12311 NONAME
+ _ZNK19QScrollPrepareEvent15contentPosRangeEv @ 12312 NONAME
+ _ZNK19QScrollPrepareEvent6d_funcEv @ 12313 NONAME
+ _ZNK19QScrollPrepareEvent8startPosEv @ 12314 NONAME
+ _ZNK19QScrollerProperties12scrollMetricENS_12ScrollMetricE @ 12315 NONAME
+ _ZNK19QScrollerPropertieseqERKS_ @ 12316 NONAME
+ _ZNK19QScrollerPropertiesneERKS_ @ 12317 NONAME
+ _ZNK9QScroller10metaObjectEv @ 12318 NONAME
+ _ZNK9QScroller13finalPositionEv @ 12319 NONAME
+ _ZNK9QScroller13pixelPerMeterEv @ 12320 NONAME
+ _ZNK9QScroller18scrollerPropertiesEv @ 12321 NONAME
+ _ZNK9QScroller5stateEv @ 12322 NONAME
+ _ZNK9QScroller6targetEv @ 12323 NONAME
+ _ZNK9QScroller8velocityEv @ 12324 NONAME
+ _ZTI12QScrollEvent @ 12325 NONAME
+ _ZTI13QFlickGesture @ 12326 NONAME
+ _ZTI19QScrollPrepareEvent @ 12327 NONAME
+ _ZTI19QScrollerProperties @ 12328 NONAME
+ _ZTI9QScroller @ 12329 NONAME
+ _ZTV12QScrollEvent @ 12330 NONAME
+ _ZTV13QFlickGesture @ 12331 NONAME
+ _ZTV19QScrollPrepareEvent @ 12332 NONAME
+ _ZTV19QScrollerProperties @ 12333 NONAME
+ _ZTV9QScroller @ 12334 NONAME
diff --git a/src/s60installs/eabi/QtNetworku.def b/src/s60installs/eabi/QtNetworku.def
index 21f3e73..9b989a7 100644
--- a/src/s60installs/eabi/QtNetworku.def
+++ b/src/s60installs/eabi/QtNetworku.def
@@ -1085,12 +1085,12 @@ EXPORTS
_ZN35QNetworkConfigurationManagerPrivate11pollEnginesEv @ 1084 NONAME
_ZN35QNetworkConfigurationManagerPrivate11qt_metacallEN11QMetaObject4CallEiPPv @ 1085 NONAME
_ZN35QNetworkConfigurationManagerPrivate11qt_metacastEPKc @ 1086 NONAME
- _ZN35QNetworkConfigurationManagerPrivate12capabilitiesEv @ 1087 NONAME
+ _ZN35QNetworkConfigurationManagerPrivate12capabilitiesEv @ 1087 NONAME ABSENT
_ZN35QNetworkConfigurationManagerPrivate12startPollingEv @ 1088 NONAME
_ZN35QNetworkConfigurationManagerPrivate13enablePollingEv @ 1089 NONAME
_ZN35QNetworkConfigurationManagerPrivate14disablePollingEv @ 1090 NONAME
_ZN35QNetworkConfigurationManagerPrivate16staticMetaObjectE @ 1091 NONAME DATA 16
- _ZN35QNetworkConfigurationManagerPrivate17allConfigurationsE6QFlagsIN21QNetworkConfiguration9StateFlagEE @ 1092 NONAME
+ _ZN35QNetworkConfigurationManagerPrivate17allConfigurationsE6QFlagsIN21QNetworkConfiguration9StateFlagEE @ 1092 NONAME ABSENT
_ZN35QNetworkConfigurationManagerPrivate18configurationAddedE28QExplicitlySharedDataPointerI28QNetworkConfigurationPrivateE @ 1093 NONAME
_ZN35QNetworkConfigurationManagerPrivate18configurationAddedERK21QNetworkConfiguration @ 1094 NONAME
_ZN35QNetworkConfigurationManagerPrivate18onlineStateChangedEb @ 1095 NONAME
@@ -1099,14 +1099,14 @@ EXPORTS
_ZN35QNetworkConfigurationManagerPrivate20configurationChangedERK21QNetworkConfiguration @ 1098 NONAME
_ZN35QNetworkConfigurationManagerPrivate20configurationRemovedE28QExplicitlySharedDataPointerI28QNetworkConfigurationPrivateE @ 1099 NONAME
_ZN35QNetworkConfigurationManagerPrivate20configurationRemovedERK21QNetworkConfiguration @ 1100 NONAME
- _ZN35QNetworkConfigurationManagerPrivate20defaultConfigurationEv @ 1101 NONAME
+ _ZN35QNetworkConfigurationManagerPrivate20defaultConfigurationEv @ 1101 NONAME ABSENT
_ZN35QNetworkConfigurationManagerPrivate20updateConfigurationsEv @ 1102 NONAME
- _ZN35QNetworkConfigurationManagerPrivate27configurationFromIdentifierERK7QString @ 1103 NONAME
+ _ZN35QNetworkConfigurationManagerPrivate27configurationFromIdentifierERK7QString @ 1103 NONAME ABSENT
_ZN35QNetworkConfigurationManagerPrivate27configurationUpdateCompleteEv @ 1104 NONAME
_ZN35QNetworkConfigurationManagerPrivate31performAsyncConfigurationUpdateEv @ 1105 NONAME
- _ZN35QNetworkConfigurationManagerPrivate5abortEv @ 1106 NONAME
- _ZN35QNetworkConfigurationManagerPrivate7enginesEv @ 1107 NONAME
- _ZN35QNetworkConfigurationManagerPrivate8isOnlineEv @ 1108 NONAME
+ _ZN35QNetworkConfigurationManagerPrivate5abortEv @ 1106 NONAME ABSENT
+ _ZN35QNetworkConfigurationManagerPrivate7enginesEv @ 1107 NONAME ABSENT
+ _ZN35QNetworkConfigurationManagerPrivate8isOnlineEv @ 1108 NONAME ABSENT
_ZN35QNetworkConfigurationManagerPrivateC1Ev @ 1109 NONAME
_ZN35QNetworkConfigurationManagerPrivateC2Ev @ 1110 NONAME
_ZN35QNetworkConfigurationManagerPrivateD0Ev @ 1111 NONAME
@@ -1175,4 +1175,10 @@ EXPORTS
_ZN10QUdpSocket21setMulticastInterfaceERK17QNetworkInterface @ 1174 NONAME
_ZN13QNetworkReply11setFinishedEb @ 1175 NONAME
_ZNK10QUdpSocket18multicastInterfaceEv @ 1176 NONAME
+ _ZNK35QNetworkConfigurationManagerPrivate12capabilitiesEv @ 1177 NONAME
+ _ZNK35QNetworkConfigurationManagerPrivate17allConfigurationsE6QFlagsIN21QNetworkConfiguration9StateFlagEE @ 1178 NONAME
+ _ZNK35QNetworkConfigurationManagerPrivate20defaultConfigurationEv @ 1179 NONAME
+ _ZNK35QNetworkConfigurationManagerPrivate27configurationFromIdentifierERK7QString @ 1180 NONAME
+ _ZNK35QNetworkConfigurationManagerPrivate7enginesEv @ 1181 NONAME
+ _ZNK35QNetworkConfigurationManagerPrivate8isOnlineEv @ 1182 NONAME
diff --git a/src/s60installs/eabi/QtOpenGLu.def b/src/s60installs/eabi/QtOpenGLu.def
index c92d99e..61e968c 100644
--- a/src/s60installs/eabi/QtOpenGLu.def
+++ b/src/s60installs/eabi/QtOpenGLu.def
@@ -293,7 +293,7 @@ EXPORTS
_ZN17QGLContextPrivate14extensionFuncsEPK10QGLContext @ 292 NONAME
_ZN17QGLGraphicsSystemC1Eb @ 293 NONAME
_ZN17QGLGraphicsSystemC2Eb @ 294 NONAME
- _ZN18QGLContextResource5valueEPK10QGLContext @ 295 NONAME
+ _ZN18QGLContextResource5valueEPK10QGLContext @ 295 NONAME ABSENT
_ZN18QGLContextResource6insertEPK10QGLContextPv @ 296 NONAME
_ZN18QGLContextResource7cleanupEPK10QGLContextPv @ 297 NONAME
_ZN18QGLContextResourceC1EPFvPvE @ 298 NONAME
diff --git a/src/sql/drivers/psql/qsql_psql.cpp b/src/sql/drivers/psql/qsql_psql.cpp
index 179f7ba..7ee8095 100644
--- a/src/sql/drivers/psql/qsql_psql.cpp
+++ b/src/sql/drivers/psql/qsql_psql.cpp
@@ -54,7 +54,6 @@
#include <qstringlist.h>
#include <qmutex.h>
-
#include <libpq-fe.h>
#include <pg_config.h>
@@ -619,6 +618,50 @@ static void setDatestyle(PGconn* connection)
PQclear(result);
}
+static QPSQLDriver::Protocol qMakePSQLVersion(int vMaj, int vMin)
+{
+ switch (vMaj) {
+ case 6:
+ return QPSQLDriver::Version6;
+ case 7:
+ {
+ switch (vMin) {
+ case 1:
+ return QPSQLDriver::Version71;
+ case 3:
+ return QPSQLDriver::Version73;
+ case 4:
+ return QPSQLDriver::Version74;
+ default:
+ return QPSQLDriver::Version7;
+ }
+ break;
+ }
+ case 8:
+ {
+ switch (vMin) {
+ case 1:
+ return QPSQLDriver::Version81;
+ case 2:
+ return QPSQLDriver::Version82;
+ case 3:
+ return QPSQLDriver::Version83;
+ case 4:
+ return QPSQLDriver::Version84;
+ default:
+ return QPSQLDriver::Version8;
+ }
+ break;
+ }
+ case 9:
+ return QPSQLDriver::Version9;
+ break;
+ default:
+ break;
+ }
+ return QPSQLDriver::VersionUnknown;
+}
+
static QPSQLDriver::Protocol getPSQLVersion(PGconn* connection)
{
QPSQLDriver::Protocol serverVersion = QPSQLDriver::Version6;
@@ -626,50 +669,44 @@ static QPSQLDriver::Protocol getPSQLVersion(PGconn* connection)
int status = PQresultStatus(result);
if (status == PGRES_COMMAND_OK || status == PGRES_TUPLES_OK) {
QString val = QString::fromAscii(PQgetvalue(result, 0, 0));
+
QRegExp rx(QLatin1String("(\\d+)\\.(\\d+)"));
rx.setMinimal(true); // enforce non-greedy RegExp
+
if (rx.indexIn(val) != -1) {
int vMaj = rx.cap(1).toInt();
int vMin = rx.cap(2).toInt();
-
- switch (vMaj) {
- case 7:
- switch (vMin) {
- case 0:
- serverVersion = QPSQLDriver::Version7;
- break;
- case 1:
- case 2:
- serverVersion = QPSQLDriver::Version71;
- break;
- default:
- serverVersion = QPSQLDriver::Version73;
- break;
- }
- break;
- case 8:
- switch (vMin) {
- case 0:
- serverVersion = QPSQLDriver::Version8;
- break;
- case 1:
- serverVersion = QPSQLDriver::Version81;
- break;
- case 2:
- default:
- serverVersion = QPSQLDriver::Version82;
- break;
- }
- break;
- default:
- break;
+ serverVersion = qMakePSQLVersion(vMaj, vMin);
+#ifdef PG_MAJORVERSION
+ if (rx.indexIn(QLatin1String(PG_MAJORVERSION)) != -1) {
+ vMaj = rx.cap(1).toInt();
+ vMin = rx.cap(2).toInt();
+ }
+ QPSQLDriver::Protocol clientVersion = qMakePSQLVersion(vMaj, vMin);
+
+ if (serverVersion >= QPSQLDriver::Version9 && clientVersion < QPSQLDriver::Version9) {
+ //Client version before QPSQLDriver::Version9 only supports escape mode for bytea type,
+ //but bytea format is set to hex by default in PSQL 9 and above. So need to force the
+ //server use the old escape mode when connects to the new server with old client library.
+ result = PQexec(connection, "SET bytea_output=escape; ");
+ status = PQresultStatus(result);
+ } else if (serverVersion == QPSQLDriver::VersionUnknown) {
+ serverVersion = clientVersion;
+ if (serverVersion != QPSQLDriver::VersionUnknown)
+ qWarning("The server version of this PostgreSQL is unknown, falling back to the client version.");
}
+#endif
}
}
PQclear(result);
- if (serverVersion < QPSQLDriver::Version71)
+ //keep the old behavior unchanged
+ if (serverVersion == QPSQLDriver::VersionUnknown)
+ serverVersion = QPSQLDriver::Version6;
+
+ if (serverVersion < QPSQLDriver::Version71) {
qWarning("This version of PostgreSQL is not supported and may not work.");
+ }
return serverVersion;
}
@@ -852,7 +889,10 @@ bool QPSQLDriver::commitTransaction()
// This hack can dissapear once there is an API to query this sort of information.
if (d->pro == QPSQLDriver::Version8 ||
d->pro == QPSQLDriver::Version81 ||
- d->pro == QPSQLDriver::Version82) {
+ d->pro == QPSQLDriver::Version82 ||
+ d->pro == QPSQLDriver::Version83 ||
+ d->pro == QPSQLDriver::Version84 ||
+ d->pro == QPSQLDriver::Version9) {
transaction_failed = qstrcmp(PQcmdStatus(res), "ROLLBACK") == 0;
}
@@ -963,6 +1003,9 @@ QSqlIndex QPSQLDriver::primaryIndex(const QString& tablename) const
case QPSQLDriver::Version8:
case QPSQLDriver::Version81:
case QPSQLDriver::Version82:
+ case QPSQLDriver::Version83:
+ case QPSQLDriver::Version84:
+ case QPSQLDriver::Version9:
stmt = QLatin1String("SELECT pg_attribute.attname, pg_attribute.atttypid::int, "
"pg_class.relname "
"FROM pg_attribute, pg_class "
@@ -1046,6 +1089,9 @@ QSqlRecord QPSQLDriver::record(const QString& tablename) const
case QPSQLDriver::Version8:
case QPSQLDriver::Version81:
case QPSQLDriver::Version82:
+ case QPSQLDriver::Version83:
+ case QPSQLDriver::Version84:
+ case QPSQLDriver::Version9:
stmt = QLatin1String("select pg_attribute.attname, pg_attribute.atttypid::int, "
"pg_attribute.attnotnull, pg_attribute.attlen, pg_attribute.atttypmod, "
"pg_attrdef.adsrc "
diff --git a/src/sql/drivers/psql/qsql_psql.h b/src/sql/drivers/psql/qsql_psql.h
index 22871ff..107da87 100644
--- a/src/sql/drivers/psql/qsql_psql.h
+++ b/src/sql/drivers/psql/qsql_psql.h
@@ -97,6 +97,7 @@ class Q_EXPORT_SQLDRIVER_PSQL QPSQLDriver : public QSqlDriver
Q_OBJECT
public:
enum Protocol {
+ VersionUnknown = -1,
Version6 = 6,
Version7 = 7,
Version71 = 8,
@@ -104,7 +105,10 @@ public:
Version74 = 10,
Version8 = 11,
Version81 = 12,
- Version82 = 13
+ Version82 = 13,
+ Version83 = 14,
+ Version84 = 15,
+ Version9 = 16,
};
explicit QPSQLDriver(QObject *parent=0);
diff --git a/tests/auto/declarative/qdeclarativecomponent/tst_qdeclarativecomponent.cpp b/tests/auto/declarative/qdeclarativecomponent/tst_qdeclarativecomponent.cpp
index 8a19b8b..60ce46d 100644
--- a/tests/auto/declarative/qdeclarativecomponent/tst_qdeclarativecomponent.cpp
+++ b/tests/auto/declarative/qdeclarativecomponent/tst_qdeclarativecomponent.cpp
@@ -57,6 +57,7 @@ public:
tst_qdeclarativecomponent() { }
private slots:
+ void null();
void loadEmptyUrl();
void qmlCreateObject();
@@ -64,6 +65,20 @@ private:
QDeclarativeEngine engine;
};
+void tst_qdeclarativecomponent::null()
+{
+ {
+ QDeclarativeComponent c;
+ QVERIFY(c.isNull());
+ }
+
+ {
+ QDeclarativeComponent c(&engine);
+ QVERIFY(c.isNull());
+ }
+}
+
+
void tst_qdeclarativecomponent::loadEmptyUrl()
{
QDeclarativeComponent c(&engine);
diff --git a/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp b/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp
index fd5d140..a2dcf1c 100644
--- a/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp
+++ b/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp
@@ -84,6 +84,7 @@ private slots:
void manualHighlight();
void footer();
void header();
+ void indexAt();
private:
QDeclarativeView *createView();
@@ -1299,6 +1300,42 @@ void tst_QDeclarativeGridView::header()
QTRY_COMPARE(header->y(), 0.0);
}
+void tst_QDeclarativeGridView::indexAt()
+{
+ QDeclarativeView *canvas = createView();
+
+ TestModel model;
+ model.addItem("Fred", "12345");
+ model.addItem("John", "2345");
+ model.addItem("Bob", "54321");
+ model.addItem("Billy", "22345");
+ model.addItem("Sam", "2945");
+ model.addItem("Ben", "04321");
+ model.addItem("Jim", "0780");
+
+ QDeclarativeContext *ctxt = canvas->rootContext();
+ ctxt->setContextProperty("testModel", &model);
+ ctxt->setContextProperty("testTopToBottom", QVariant(false));
+
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml"));
+ qApp->processEvents();
+
+ QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
+ QTRY_VERIFY(gridview != 0);
+
+ QDeclarativeItem *contentItem = gridview->contentItem();
+ QTRY_VERIFY(contentItem != 0);
+
+ QTRY_COMPARE(gridview->count(), model.count());
+
+ QCOMPARE(gridview->indexAt(0, 0), 0);
+ QCOMPARE(gridview->indexAt(79, 59), 0);
+ QCOMPARE(gridview->indexAt(80, 0), 1);
+ QCOMPARE(gridview->indexAt(0, 60), 3);
+ QCOMPARE(gridview->indexAt(240, 0), -1);
+
+ delete canvas;
+}
QDeclarativeView *tst_QDeclarativeGridView::createView()
{
diff --git a/tests/auto/declarative/qdeclarativeitem/data/keynavigationtest.qml b/tests/auto/declarative/qdeclarativeitem/data/keynavigationtest.qml
index 229f969..f614a12 100644
--- a/tests/auto/declarative/qdeclarativeitem/data/keynavigationtest.qml
+++ b/tests/auto/declarative/qdeclarativeitem/data/keynavigationtest.qml
@@ -3,6 +3,46 @@ import QtQuick 1.0
Grid {
columns: 2
width: 100; height: 100
+ function verify() {
+ if (item1.KeyNavigation.right != item2)
+ return false;
+ if (item1.KeyNavigation.down != item3)
+ return false;
+ if (item1.KeyNavigation.tab != item2)
+ return false;
+ if (item1.KeyNavigation.backtab != item4)
+ return false;
+
+ if (item2.KeyNavigation.left != item1)
+ return false;
+ if (item2.KeyNavigation.down != item4)
+ return false;
+ if (item2.KeyNavigation.tab != item3)
+ return false;
+ if (item2.KeyNavigation.backtab != item1)
+ return false;
+
+ if (item3.KeyNavigation.right != item4)
+ return false;
+ if (item3.KeyNavigation.up != item1)
+ return false;
+ if (item3.KeyNavigation.tab != item4)
+ return false;
+ if (item3.KeyNavigation.backtab != item2)
+ return false;
+
+ if (item4.KeyNavigation.left != item3)
+ return false;
+ if (item4.KeyNavigation.up != item2)
+ return false;
+ if (item4.KeyNavigation.tab != item1)
+ return false;
+ if (item4.KeyNavigation.backtab != item3)
+ return false;
+
+ return true;
+ }
+
Rectangle {
id: item1
objectName: "item1"
diff --git a/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp b/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp
index 711bf00..0ebb8b7 100644
--- a/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp
+++ b/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp
@@ -393,6 +393,11 @@ void tst_QDeclarativeItem::keyNavigation()
QVERIFY(item);
QVERIFY(item->hasActiveFocus());
+ QVariant result;
+ QVERIFY(QMetaObject::invokeMethod(canvas->rootObject(), "verify",
+ Q_RETURN_ARG(QVariant, result)));
+ QVERIFY(result.toBool());
+
// right
QKeyEvent key(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
QApplication::sendEvent(canvas, &key);
diff --git a/tests/auto/declarative/qdeclarativelistview/incrementalmodel.cpp b/tests/auto/declarative/qdeclarativelistview/incrementalmodel.cpp
new file mode 100644
index 0000000..b2c9df5
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelistview/incrementalmodel.cpp
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "incrementalmodel.h"
+#include <QApplication>
+#include <QDebug>
+
+IncrementalModel::IncrementalModel(QObject *parent)
+ : QAbstractListModel(parent), count(0)
+{
+ for (int i = 0; i < 100; ++i)
+ list.append("Item " + QString::number(i));
+}
+
+int IncrementalModel::rowCount(const QModelIndex & /* parent */) const
+{
+ return count;
+}
+
+QVariant IncrementalModel::data(const QModelIndex &index, int role) const
+{
+ if (!index.isValid())
+ return QVariant();
+
+ if (index.row() >= list.size() || index.row() < 0)
+ return QVariant();
+
+ if (role == Qt::DisplayRole)
+ return list.at(index.row());
+ return QVariant();
+}
+
+bool IncrementalModel::canFetchMore(const QModelIndex & /* index */) const
+{
+ if (count < list.size())
+ return true;
+ else
+ return false;
+}
+
+void IncrementalModel::fetchMore(const QModelIndex & /* index */)
+{
+ int remainder = list.size() - count;
+ int itemsToFetch = qMin(5, remainder);
+
+ beginInsertRows(QModelIndex(), count, count+itemsToFetch-1);
+
+ count += itemsToFetch;
+
+ endInsertRows();
+}
diff --git a/tests/auto/declarative/qdeclarativelistview/incrementalmodel.h b/tests/auto/declarative/qdeclarativelistview/incrementalmodel.h
new file mode 100644
index 0000000..b1f7407
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelistview/incrementalmodel.h
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef IncrementalModel_H
+#define IncrementalModel_H
+
+#include <QAbstractListModel>
+#include <QList>
+#include <QStringList>
+
+class IncrementalModel : public QAbstractListModel
+{
+ Q_OBJECT
+
+public:
+ IncrementalModel(QObject *parent = 0);
+
+ int rowCount(const QModelIndex &parent = QModelIndex()) const;
+ QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
+
+protected:
+ bool canFetchMore(const QModelIndex &parent) const;
+ void fetchMore(const QModelIndex &parent);
+
+private:
+ QStringList list;
+ int count;
+};
+
+#endif
diff --git a/tests/auto/declarative/qdeclarativelistview/qdeclarativelistview.pro b/tests/auto/declarative/qdeclarativelistview/qdeclarativelistview.pro
index 468474a..1633ffc 100644
--- a/tests/auto/declarative/qdeclarativelistview/qdeclarativelistview.pro
+++ b/tests/auto/declarative/qdeclarativelistview/qdeclarativelistview.pro
@@ -2,7 +2,8 @@ load(qttest_p4)
contains(QT_CONFIG,declarative): QT += declarative
macx:CONFIG -= app_bundle
-SOURCES += tst_qdeclarativelistview.cpp
+HEADERS += incrementalmodel.h
+SOURCES += tst_qdeclarativelistview.cpp incrementalmodel.cpp
symbian: {
importFiles.files = data
diff --git a/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
index b834d46..e76cb15 100644
--- a/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
+++ b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
@@ -51,6 +51,7 @@
#include <QtDeclarative/private/qdeclarativelistmodel_p.h>
#include <QtDeclarative/private/qlistmodelinterface_p.h>
#include "../../../shared/util.h"
+#include "incrementalmodel.h"
#ifdef Q_OS_SYMBIAN
// In Symbian OS test data is located in applications private dir
@@ -105,6 +106,8 @@ private slots:
void QTBUG_14821();
void resizeDelegate();
void QTBUG_16037();
+ void indexAt();
+ void incrementalModel();
private:
template <class T> void items();
@@ -666,7 +669,8 @@ void tst_QDeclarativeListView::removed(bool animated)
listview->setContentY(80);
QTest::qWait(300);
- model.removeItems(1, 17);
+ // remove all visible items
+ model.removeItems(1, 18);
QTest::qWait(300);
// Confirm items positioned correctly
@@ -1964,6 +1968,64 @@ void tst_QDeclarativeListView::QTBUG_16037()
delete canvas;
}
+void tst_QDeclarativeListView::indexAt()
+{
+ QDeclarativeView *canvas = createView();
+
+ TestModel model;
+ for (int i = 0; i < 30; i++)
+ model.addItem("Item" + QString::number(i), "");
+
+ QDeclarativeContext *ctxt = canvas->rootContext();
+ ctxt->setContextProperty("testModel", &model);
+
+ TestObject *testObject = new TestObject;
+ ctxt->setContextProperty("testObject", testObject);
+
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml"));
+ qApp->processEvents();
+
+ QDeclarativeListView *listview = findItem<QDeclarativeListView>(canvas->rootObject(), "list");
+ QTRY_VERIFY(listview != 0);
+
+ QDeclarativeItem *contentItem = listview->contentItem();
+ QTRY_VERIFY(contentItem != 0);
+
+ QCOMPARE(listview->indexAt(0,0), 0);
+ QCOMPARE(listview->indexAt(0,19), 0);
+ QCOMPARE(listview->indexAt(239,19), 0);
+ QCOMPARE(listview->indexAt(0,20), 1);
+ QCOMPARE(listview->indexAt(240,20), -1);
+
+ delete canvas;
+}
+
+void tst_QDeclarativeListView::incrementalModel()
+{
+ QDeclarativeView *canvas = createView();
+
+ IncrementalModel model;
+ QDeclarativeContext *ctxt = canvas->rootContext();
+ ctxt->setContextProperty("testModel", &model);
+
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/displaylist.qml"));
+ qApp->processEvents();
+
+ QDeclarativeListView *listview = findItem<QDeclarativeListView>(canvas->rootObject(), "list");
+ QTRY_VERIFY(listview != 0);
+
+ QDeclarativeItem *contentItem = listview->contentItem();
+ QTRY_VERIFY(contentItem != 0);
+
+ QTRY_COMPARE(listview->count(), 20);
+
+ listview->positionViewAtIndex(10, QDeclarativeListView::Beginning);
+
+ QTRY_COMPARE(listview->count(), 25);
+
+ delete canvas;
+}
+
void tst_QDeclarativeListView::qListModelInterface_items()
{
items<TestModel>();
diff --git a/tests/auto/declarative/qdeclarativeproperty/tst_qdeclarativeproperty.cpp b/tests/auto/declarative/qdeclarativeproperty/tst_qdeclarativeproperty.cpp
index 3cc71bb..41f2b19 100644
--- a/tests/auto/declarative/qdeclarativeproperty/tst_qdeclarativeproperty.cpp
+++ b/tests/auto/declarative/qdeclarativeproperty/tst_qdeclarativeproperty.cpp
@@ -167,6 +167,7 @@ void tst_qdeclarativeproperty::qmlmetaproperty()
QCOMPARE(prop.isWritable(), false);
QCOMPARE(prop.isDesignable(), false);
QCOMPARE(prop.isResettable(), false);
+ QCOMPARE(prop.isSignalProperty(), false);
QCOMPARE(prop.isValid(), false);
QCOMPARE(prop.object(), (QObject *)0);
QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::InvalidCategory);
@@ -263,6 +264,7 @@ void tst_qdeclarativeproperty::qmlmetaproperty_object()
QCOMPARE(prop.isWritable(), false);
QCOMPARE(prop.isDesignable(), false);
QCOMPARE(prop.isResettable(), false);
+ QCOMPARE(prop.isSignalProperty(), false);
QCOMPARE(prop.isValid(), false);
QCOMPARE(prop.object(), (QObject *)0);
QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::InvalidCategory);
@@ -309,6 +311,7 @@ void tst_qdeclarativeproperty::qmlmetaproperty_object()
QCOMPARE(prop.isWritable(), false);
QCOMPARE(prop.isDesignable(), true);
QCOMPARE(prop.isResettable(), false);
+ QCOMPARE(prop.isSignalProperty(), false);
QCOMPARE(prop.isValid(), true);
QCOMPARE(prop.object(), qobject_cast<QObject*>(&dobject));
QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::Normal);
@@ -362,6 +365,7 @@ void tst_qdeclarativeproperty::qmlmetaproperty_object_string()
QCOMPARE(prop.isWritable(), false);
QCOMPARE(prop.isDesignable(), false);
QCOMPARE(prop.isResettable(), false);
+ QCOMPARE(prop.isSignalProperty(), false);
QCOMPARE(prop.isValid(), false);
QCOMPARE(prop.object(), (QObject *)0);
QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::InvalidCategory);
@@ -408,6 +412,7 @@ void tst_qdeclarativeproperty::qmlmetaproperty_object_string()
QCOMPARE(prop.isWritable(), false);
QCOMPARE(prop.isDesignable(), true);
QCOMPARE(prop.isResettable(), false);
+ QCOMPARE(prop.isSignalProperty(), false);
QCOMPARE(prop.isValid(), true);
QCOMPARE(prop.object(), qobject_cast<QObject*>(&dobject));
QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::Normal);
@@ -456,6 +461,7 @@ void tst_qdeclarativeproperty::qmlmetaproperty_object_string()
QCOMPARE(prop.isWritable(), false);
QCOMPARE(prop.isDesignable(), false);
QCOMPARE(prop.isResettable(), false);
+ QCOMPARE(prop.isSignalProperty(), true);
QCOMPARE(prop.isValid(), true);
QCOMPARE(prop.object(), qobject_cast<QObject*>(&dobject));
QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::InvalidCategory);
@@ -503,6 +509,7 @@ void tst_qdeclarativeproperty::qmlmetaproperty_object_string()
QCOMPARE(prop.isWritable(), false);
QCOMPARE(prop.isDesignable(), false);
QCOMPARE(prop.isResettable(), false);
+ QCOMPARE(prop.isSignalProperty(), true);
QCOMPARE(prop.isValid(), true);
QCOMPARE(prop.object(), qobject_cast<QObject*>(&dobject));
QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::InvalidCategory);
@@ -555,6 +562,7 @@ void tst_qdeclarativeproperty::qmlmetaproperty_object_context()
QCOMPARE(prop.isWritable(), false);
QCOMPARE(prop.isDesignable(), false);
QCOMPARE(prop.isResettable(), false);
+ QCOMPARE(prop.isSignalProperty(), false);
QCOMPARE(prop.isValid(), false);
QCOMPARE(prop.object(), (QObject *)0);
QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::InvalidCategory);
@@ -601,6 +609,7 @@ void tst_qdeclarativeproperty::qmlmetaproperty_object_context()
QCOMPARE(prop.isWritable(), false);
QCOMPARE(prop.isDesignable(), true);
QCOMPARE(prop.isResettable(), false);
+ QCOMPARE(prop.isSignalProperty(), false);
QCOMPARE(prop.isValid(), true);
QCOMPARE(prop.object(), qobject_cast<QObject*>(&dobject));
QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::Normal);
@@ -654,6 +663,7 @@ void tst_qdeclarativeproperty::qmlmetaproperty_object_string_context()
QCOMPARE(prop.isWritable(), false);
QCOMPARE(prop.isDesignable(), false);
QCOMPARE(prop.isResettable(), false);
+ QCOMPARE(prop.isSignalProperty(), false);
QCOMPARE(prop.isValid(), false);
QCOMPARE(prop.object(), (QObject *)0);
QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::InvalidCategory);
@@ -700,6 +710,7 @@ void tst_qdeclarativeproperty::qmlmetaproperty_object_string_context()
QCOMPARE(prop.isWritable(), false);
QCOMPARE(prop.isDesignable(), true);
QCOMPARE(prop.isResettable(), false);
+ QCOMPARE(prop.isSignalProperty(), false);
QCOMPARE(prop.isValid(), true);
QCOMPARE(prop.object(), qobject_cast<QObject*>(&dobject));
QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::Normal);
@@ -748,6 +759,7 @@ void tst_qdeclarativeproperty::qmlmetaproperty_object_string_context()
QCOMPARE(prop.isWritable(), false);
QCOMPARE(prop.isDesignable(), false);
QCOMPARE(prop.isResettable(), false);
+ QCOMPARE(prop.isSignalProperty(), true);
QCOMPARE(prop.isValid(), true);
QCOMPARE(prop.object(), qobject_cast<QObject*>(&dobject));
QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::InvalidCategory);
@@ -795,6 +807,7 @@ void tst_qdeclarativeproperty::qmlmetaproperty_object_string_context()
QCOMPARE(prop.isWritable(), false);
QCOMPARE(prop.isDesignable(), false);
QCOMPARE(prop.isResettable(), false);
+ QCOMPARE(prop.isSignalProperty(), true);
QCOMPARE(prop.isValid(), true);
QCOMPARE(prop.object(), qobject_cast<QObject*>(&dobject));
QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::InvalidCategory);
@@ -922,6 +935,17 @@ void tst_qdeclarativeproperty::read()
QCOMPARE(p.read(), QVariant("myName"));
}
+ // Value prop by name (static)
+ {
+ QObject o;
+
+ QCOMPARE(QDeclarativeProperty::read(&o, "objectName"), QVariant(QString()));
+
+ o.setObjectName("myName");
+
+ QCOMPARE(QDeclarativeProperty::read(&o, "objectName"), QVariant("myName"));
+ }
+
// Value-type prop
{
PropertyObject o;
@@ -994,6 +1018,16 @@ void tst_qdeclarativeproperty::read()
QCOMPARE(qvariant_cast<QObject *>(v)->property("a").toInt(), 10);
QCOMPARE(qvariant_cast<QObject *>(v)->property("b").toInt(), 19);
}
+ { // static
+ QDeclarativeComponent component(&engine, TEST_FILE("readSynthesizedObject.qml"));
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+
+ QVariant v = QDeclarativeProperty::read(object, "test", &engine);
+ QVERIFY(v.userType() == QMetaType::QObjectStar);
+ QCOMPARE(qvariant_cast<QObject *>(v)->property("a").toInt(), 10);
+ QCOMPARE(qvariant_cast<QObject *>(v)->property("b").toInt(), 19);
+ }
// Attached property
{
@@ -1026,6 +1060,15 @@ void tst_qdeclarativeproperty::read()
QCOMPARE(p.read(), QVariant(10));
delete object;
}
+ { // static
+ QDeclarativeComponent component(&engine);
+ component.setData("import Test 1.0 as Foo\nFoo.MyContainer { Foo.MyContainer.foo: 10 }", QUrl());
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+
+ QCOMPARE(QDeclarativeProperty::read(object, "Foo.MyContainer.foo", qmlContext(object)), QVariant(10));
+ delete object;
+ }
}
void tst_qdeclarativeproperty::write()
@@ -1066,6 +1109,13 @@ void tst_qdeclarativeproperty::write()
QCOMPARE(o.objectName(), QString("myName"));
}
+ // Writable prop by name (static)
+ {
+ PropertyObject o;
+ QCOMPARE(QDeclarativeProperty::write(&o, QString("objectName"), QVariant(QString("myName"))), true);
+ QCOMPARE(o.objectName(), QString("myName"));
+ }
+
// Deleted object
{
PropertyObject *o = new PropertyObject;
@@ -1138,6 +1188,18 @@ void tst_qdeclarativeproperty::write()
QCOMPARE(p2.write(QUrl("main.qml")), true);
QCOMPARE(o.url(), result);
}
+ { // static
+ PropertyObject o;
+
+ QCOMPARE(QDeclarativeProperty::write(&o, "url", QUrl("main.qml")), true);
+ QCOMPARE(o.url(), QUrl("main.qml"));
+
+ QUrl result = engine.baseUrl().resolved(QUrl("main.qml"));
+ QVERIFY(result != QUrl("main.qml"));
+
+ QCOMPARE(QDeclarativeProperty::write(&o, "url", QUrl("main.qml"), engine.rootContext()), true);
+ QCOMPARE(o.url(), result);
+ }
// Attached property
{
diff --git a/tests/auto/declarative/qdeclarativexmllistmodel/qdeclarativexmllistmodel.pro b/tests/auto/declarative/qdeclarativexmllistmodel/qdeclarativexmllistmodel.pro
index c74b8fb..64b8267 100644
--- a/tests/auto/declarative/qdeclarativexmllistmodel/qdeclarativexmllistmodel.pro
+++ b/tests/auto/declarative/qdeclarativexmllistmodel/qdeclarativexmllistmodel.pro
@@ -1,5 +1,5 @@
load(qttest_p4)
-contains(QT_CONFIG,declarative): QT += declarative script gui
+contains(QT_CONFIG,declarative): QT += declarative script gui network
contains(QT_CONFIG,xmlpatterns) {
QT += xmlpatterns
DEFINES += QTEST_XMLPATTERNS
diff --git a/tests/auto/declarative/qdeclarativexmllistmodel/tst_qdeclarativexmllistmodel.cpp b/tests/auto/declarative/qdeclarativexmllistmodel/tst_qdeclarativexmllistmodel.cpp
index a14f942..b95b053 100644
--- a/tests/auto/declarative/qdeclarativexmllistmodel/tst_qdeclarativexmllistmodel.cpp
+++ b/tests/auto/declarative/qdeclarativexmllistmodel/tst_qdeclarativexmllistmodel.cpp
@@ -38,8 +38,13 @@
** $QT_END_LICENSE$
**
****************************************************************************/
+#include <private/qdeclarativeengine_p.h>
+
#include <qtest.h>
#include <QtTest/qsignalspy.h>
+#include <QtDeclarative/qdeclarativenetworkaccessmanagerfactory.h>
+#include <QtNetwork/qnetworkaccessmanager.h>
+#include <QtNetwork/qnetworkrequest.h>
#include <QtCore/qtimer.h>
#include <QtCore/qfile.h>
#include <QtCore/qtemporaryfile.h>
@@ -81,6 +86,7 @@ private slots:
void roles();
void roleErrors();
void uniqueRoleNames();
+ void headers();
void xml();
void xml_data();
void source();
@@ -139,6 +145,44 @@ private:
QDeclarativeEngine engine;
};
+class CustomNetworkAccessManagerFactory : public QObject, public QDeclarativeNetworkAccessManagerFactory
+{
+ Q_OBJECT
+public:
+ QVariantMap lastSentHeaders;
+
+protected:
+ QNetworkAccessManager *create(QObject *parent);
+};
+
+class CustomNetworkAccessManager : public QNetworkAccessManager
+{
+ Q_OBJECT
+public:
+ CustomNetworkAccessManager(CustomNetworkAccessManagerFactory *factory, QObject *parent)
+ : QNetworkAccessManager(parent), m_factory(factory) {}
+
+protected:
+ QNetworkReply *createRequest(Operation op, const QNetworkRequest &req, QIODevice * outgoingData = 0)
+ {
+ if (m_factory) {
+ QVariantMap map;
+ foreach (const QString &header, req.rawHeaderList())
+ map[header] = req.rawHeader(header.toUtf8());
+ m_factory->lastSentHeaders = map;
+ }
+ return QNetworkAccessManager::createRequest(op, req, outgoingData);
+ }
+
+ QPointer<CustomNetworkAccessManagerFactory> m_factory;
+};
+
+QNetworkAccessManager *CustomNetworkAccessManagerFactory::create(QObject *parent)
+{
+ return new CustomNetworkAccessManager(this, parent);
+}
+
+
void tst_qdeclarativexmllistmodel::buildModel()
{
QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/model.qml"));
@@ -312,6 +356,31 @@ void tst_qdeclarativexmllistmodel::xml_data()
QTest::newRow("one item") << "<Pets><Pet><name>Hobbes</name><type>Tiger</type><age>7</age><size>Large</size></Pet></Pets>" << 1;
}
+void tst_qdeclarativexmllistmodel::headers()
+{
+ // ensure the QNetworkAccessManagers created for this test are immediately deleted
+ QDeclarativeEngine qmlEng;
+
+ CustomNetworkAccessManagerFactory factory;
+ qmlEng.setNetworkAccessManagerFactory(&factory);
+
+ QDeclarativeComponent component(&qmlEng, QUrl::fromLocalFile(SRCDIR "/data/model.qml"));
+ QDeclarativeXmlListModel *model = qobject_cast<QDeclarativeXmlListModel*>(component.create());
+ QVERIFY(model != 0);
+ QTRY_COMPARE(model->status(), QDeclarativeXmlListModel::Ready);
+
+ QVariantMap expectedHeaders;
+ expectedHeaders["Accept"] = "application/xml";
+
+ QCOMPARE(factory.lastSentHeaders.count(), expectedHeaders.count());
+ foreach (const QString &header, expectedHeaders.keys()) {
+ QVERIFY(factory.lastSentHeaders.contains(header));
+ QCOMPARE(factory.lastSentHeaders[header].toString(), expectedHeaders[header].toString());
+ }
+
+ delete model;
+}
+
void tst_qdeclarativexmllistmodel::source()
{
QFETCH(QUrl, source);
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.0.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.0.png
new file mode 100644
index 0000000..464d913
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.1.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.1.png
new file mode 100644
index 0000000..464d913
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.2.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.2.png
new file mode 100644
index 0000000..b16b9f0
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.2.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.3.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.3.png
new file mode 100644
index 0000000..c3d2a6f
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.3.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.4.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.4.png
new file mode 100644
index 0000000..d074e73
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.4.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.5.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.5.png
new file mode 100644
index 0000000..0cac34c
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.5.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.qml b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.qml
new file mode 100644
index 0000000..c418cc8
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.qml
@@ -0,0 +1,2159 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ image: "flickable-nested.0.png"
+ }
+ Frame {
+ msec: 32
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 48
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 64
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 80
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 96
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 112
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 128
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 144
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 160
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 176
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 192
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 208
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 224
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 240
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 256
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 272
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 288
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 304
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 320
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 336
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 352
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 368
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 384
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 400
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 416
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 432
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 448
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 464
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 480
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 496
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 512
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 528
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 544
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 560
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 576
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 592
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 608
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 624
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 640
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 656
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 672
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 688
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 704
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 720
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 736
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 752
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 768
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 784
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 800
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 816
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 832
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 848
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 864
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 880
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 896
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 912
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 928
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 206; y: 205
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 944
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 960
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 206; y: 204
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 976
+ image: "flickable-nested.1.png"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 206; y: 203
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 206; y: 202
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 992
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 205; y: 201
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 205; y: 199
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1008
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 204; y: 197
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 202; y: 196
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1024
+ hash: "bddf8ca2638c9a04f7029d6982152d11"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 198; y: 191
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 197; y: 189
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1040
+ hash: "bc15f1b562879d5058d3b1336fb9074e"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 194; y: 185
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 194; y: 184
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1056
+ hash: "3572c62d7d2b9b23a8d9d3e5037591dd"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 194; y: 182
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 194; y: 182
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1072
+ hash: "ce9658887cca581a88e7db14b92d46f2"
+ }
+ Frame {
+ msec: 1088
+ hash: "e1fe1a2e1669a200e20468b4aa98dd3d"
+ }
+ Frame {
+ msec: 1104
+ hash: "b7582829bf01223e6641ce82f62047df"
+ }
+ Frame {
+ msec: 1120
+ hash: "80bd41fe22fb84efb011acf50ec38574"
+ }
+ Frame {
+ msec: 1136
+ hash: "04c8d6c3922ce9777ee27d8df59d4729"
+ }
+ Frame {
+ msec: 1152
+ hash: "f84dba18e525f1c06548c0232a244b6d"
+ }
+ Frame {
+ msec: 1168
+ hash: "26c74b95835e8e0da5aadc7c42cac81c"
+ }
+ Frame {
+ msec: 1184
+ hash: "1b4fcb1f0bd83a683cfe0ac303be0033"
+ }
+ Frame {
+ msec: 1200
+ hash: "1b4fcb1f0bd83a683cfe0ac303be0033"
+ }
+ Frame {
+ msec: 1216
+ hash: "4df47f90656fff253883e3e2d33506dc"
+ }
+ Frame {
+ msec: 1232
+ hash: "4df47f90656fff253883e3e2d33506dc"
+ }
+ Frame {
+ msec: 1248
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1264
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1280
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1296
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1312
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1328
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1344
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1360
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1376
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1392
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1408
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1424
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1440
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1456
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1472
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1488
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1504
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1520
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1536
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1552
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1568
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1584
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1600
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 226; y: 218
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1616
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 225; y: 218
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1632
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 223; y: 217
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 222; y: 217
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1648
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 220; y: 216
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 218; y: 214
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1664
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 214; y: 212
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 212; y: 211
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1680
+ hash: "54b41609ba43f710b08ba63f0b96df99"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 208; y: 208
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 207; y: 207
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1696
+ hash: "8910b66b9eb1b2be80e36ed2824df1a0"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 205; y: 205
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 205; y: 205
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1712
+ hash: "38df31933f34f961a9b7020ad0d469c2"
+ }
+ Frame {
+ msec: 1728
+ hash: "7702a7f710991225d9f411e8f410b515"
+ }
+ Frame {
+ msec: 1744
+ hash: "c90d402e68208ccfd2c7345a2bf650cd"
+ }
+ Frame {
+ msec: 1760
+ hash: "2630ed37aaf37907d1ee48efb0239615"
+ }
+ Frame {
+ msec: 1776
+ hash: "527725818699ce3425b5cb95a25610d5"
+ }
+ Frame {
+ msec: 1792
+ hash: "7bd6e37853946a835973c3da213beddc"
+ }
+ Frame {
+ msec: 1808
+ hash: "e3c5e113d992e5e50b6780185891edd7"
+ }
+ Frame {
+ msec: 1824
+ hash: "e3c5e113d992e5e50b6780185891edd7"
+ }
+ Frame {
+ msec: 1840
+ hash: "20ced2b9960931c4c0cbe8bcc1f9e52a"
+ }
+ Frame {
+ msec: 1856
+ hash: "09710c8964c8b010a90c67f126acdefa"
+ }
+ Frame {
+ msec: 1872
+ hash: "09710c8964c8b010a90c67f126acdefa"
+ }
+ Frame {
+ msec: 1888
+ hash: "09710c8964c8b010a90c67f126acdefa"
+ }
+ Frame {
+ msec: 1904
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 1920
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 1936
+ image: "flickable-nested.2.png"
+ }
+ Frame {
+ msec: 1952
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 1968
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 1984
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2000
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2016
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2032
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2048
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2064
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2080
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2096
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2112
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2128
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2144
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2160
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2176
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2192
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2208
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2224
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2240
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2256
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2272
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2288
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2304
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 274; y: 218
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2320
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 273; y: 218
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 273; y: 217
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2336
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 272; y: 215
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 272; y: 213
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2352
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 271; y: 210
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 270; y: 208
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2368
+ hash: "79a132ab719ccdf48d367cca443cd835"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 269; y: 204
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 269; y: 202
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2384
+ hash: "1f19e7d2c7494f5b603dee16e211d65d"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 268; y: 196
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 268; y: 193
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2400
+ hash: "64fd22407c77fac28d13035ce78c67b2"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 268; y: 186
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 266; y: 177
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2416
+ hash: "f05a0f956b4964d4ebff056b63252297"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 265; y: 173
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 264; y: 167
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2432
+ hash: "3de1e9a2b33e37b0fe3b799b68ec22d6"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 263; y: 164
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 263; y: 164
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2448
+ hash: "71f115c60d4f20422e4ac3f319644c48"
+ }
+ Frame {
+ msec: 2464
+ hash: "c3995ac89f0a4b3fb07401479538d338"
+ }
+ Frame {
+ msec: 2480
+ hash: "950e83408adf55f4e7fc1c0c127caa89"
+ }
+ Frame {
+ msec: 2496
+ hash: "5b335621a76a527d058708384c2e5635"
+ }
+ Frame {
+ msec: 2512
+ hash: "a201ae31d5bb778bd44a49dd21951c1b"
+ }
+ Frame {
+ msec: 2528
+ hash: "550e6708a8999d56d1f57c121228692f"
+ }
+ Frame {
+ msec: 2544
+ hash: "d8eb4dd2b3cf50273cb7dfbb5bd658b9"
+ }
+ Frame {
+ msec: 2560
+ hash: "aa1fd0a990e42175acc84de96b384e9d"
+ }
+ Frame {
+ msec: 2576
+ hash: "0236fb15db30da5ec794444affee1169"
+ }
+ Frame {
+ msec: 2592
+ hash: "a7445a70874a9767462e79e1dff88dbc"
+ }
+ Frame {
+ msec: 2608
+ hash: "339ea6bd5b486ff85272e19e07669f0b"
+ }
+ Frame {
+ msec: 2624
+ hash: "2b24d9d17c77cd0ac52989328dcf499b"
+ }
+ Frame {
+ msec: 2640
+ hash: "2b24d9d17c77cd0ac52989328dcf499b"
+ }
+ Frame {
+ msec: 2656
+ hash: "e2fcfe4f3e14e46404eb6955502180a1"
+ }
+ Frame {
+ msec: 2672
+ hash: "5d0c9601b871690047f4df91723ccfb1"
+ }
+ Frame {
+ msec: 2688
+ hash: "5d0c9601b871690047f4df91723ccfb1"
+ }
+ Frame {
+ msec: 2704
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2720
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2736
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2752
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2768
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2784
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2800
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2816
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2832
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2848
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2864
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2880
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2896
+ image: "flickable-nested.3.png"
+ }
+ Frame {
+ msec: 2912
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2928
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2944
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2960
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 268; y: 102
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2976
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 268; y: 103
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 268; y: 104
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2992
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 268; y: 105
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 269; y: 108
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3008
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 270; y: 111
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 270; y: 114
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3024
+ hash: "2b24d9d17c77cd0ac52989328dcf499b"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 271; y: 119
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 272; y: 122
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3040
+ hash: "550e6708a8999d56d1f57c121228692f"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 273; y: 130
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 274; y: 138
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3056
+ hash: "57f3c0a49cef2137e3cfa435396c099e"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 274; y: 142
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 274; y: 149
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3072
+ hash: "0fffc659a270cc614d16ddf3fa2ab51d"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 274; y: 153
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 274; y: 161
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3088
+ hash: "a8d937c8379950299a6e3611ff313415"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 273; y: 165
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 272; y: 172
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3104
+ hash: "46cfebbf821a08aa30055bfa8fffd137"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 271; y: 175
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 270; y: 180
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 270; y: 180
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3120
+ hash: "20a32ee8ae2cf88a2cfdb2dd8552255a"
+ }
+ Frame {
+ msec: 3136
+ hash: "20a32ee8ae2cf88a2cfdb2dd8552255a"
+ }
+ Frame {
+ msec: 3152
+ hash: "20a32ee8ae2cf88a2cfdb2dd8552255a"
+ }
+ Frame {
+ msec: 3168
+ hash: "20a32ee8ae2cf88a2cfdb2dd8552255a"
+ }
+ Frame {
+ msec: 3184
+ hash: "20a32ee8ae2cf88a2cfdb2dd8552255a"
+ }
+ Frame {
+ msec: 3200
+ hash: "20a32ee8ae2cf88a2cfdb2dd8552255a"
+ }
+ Frame {
+ msec: 3216
+ hash: "20a32ee8ae2cf88a2cfdb2dd8552255a"
+ }
+ Frame {
+ msec: 3232
+ hash: "20a32ee8ae2cf88a2cfdb2dd8552255a"
+ }
+ Frame {
+ msec: 3248
+ hash: "20a32ee8ae2cf88a2cfdb2dd8552255a"
+ }
+ Frame {
+ msec: 3264
+ hash: "20a32ee8ae2cf88a2cfdb2dd8552255a"
+ }
+ Frame {
+ msec: 3280
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3296
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3312
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3328
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3344
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3360
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3376
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3392
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3408
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3424
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3440
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3456
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3472
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3488
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3504
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3520
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3536
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3552
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3568
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3584
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 352; y: 206
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3600
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 352; y: 205
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 352; y: 204
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3616
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 352; y: 201
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 352; y: 196
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3632
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 352; y: 193
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 352; y: 185
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3648
+ hash: "eb718f97648438dae1440e2089434b0a"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 352; y: 176
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 352; y: 172
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3664
+ hash: "e4a2b82752939f351ac46032f2d3333e"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 353; y: 163
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 354; y: 158
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3680
+ hash: "ab1099a146433a5ec77b336673d0527c"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 356; y: 148
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 356; y: 142
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3696
+ hash: "7e4ca5ba45d5de10d72ef5ab1171ead5"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 357; y: 130
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 357; y: 130
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3712
+ hash: "417bb78fc4f255194a71193e388b752f"
+ }
+ Frame {
+ msec: 3728
+ hash: "be63b1e57006d881a345db3ca66e7097"
+ }
+ Frame {
+ msec: 3744
+ hash: "e1b96137c2cc0ef18e224a32f665de9d"
+ }
+ Frame {
+ msec: 3760
+ hash: "6157ba3962fc7829e8693e2456fd6e8e"
+ }
+ Frame {
+ msec: 3776
+ hash: "951ae231b7b18517f8d6504ce7f01b3d"
+ }
+ Frame {
+ msec: 3792
+ hash: "57f60f9da1a204cc7eb930575de45ae4"
+ }
+ Frame {
+ msec: 3808
+ hash: "008323603b48a55b589af7cbb2f1c8b0"
+ }
+ Frame {
+ msec: 3824
+ hash: "b8447e994280cba5ccddc36e7ad3c927"
+ }
+ Frame {
+ msec: 3840
+ hash: "98dfc2d6573e5cb7a56a893b8fecf422"
+ }
+ Frame {
+ msec: 3856
+ image: "flickable-nested.4.png"
+ }
+ Frame {
+ msec: 3872
+ hash: "09dabc3ef85dc857719e7d20111e6023"
+ }
+ Frame {
+ msec: 3888
+ hash: "5864c4197fe3269c3f1ad05caf25832e"
+ }
+ Frame {
+ msec: 3904
+ hash: "370a471a614d22d281d9987a5b6a42bf"
+ }
+ Frame {
+ msec: 3920
+ hash: "36c74e2e325807c7c06e941581613f48"
+ }
+ Frame {
+ msec: 3936
+ hash: "e1e2b69992294dc611e6eef7e259d4cd"
+ }
+ Frame {
+ msec: 3952
+ hash: "e1e2b69992294dc611e6eef7e259d4cd"
+ }
+ Frame {
+ msec: 3968
+ hash: "e1e2b69992294dc611e6eef7e259d4cd"
+ }
+ Frame {
+ msec: 3984
+ hash: "36c74e2e325807c7c06e941581613f48"
+ }
+ Frame {
+ msec: 4000
+ hash: "36c74e2e325807c7c06e941581613f48"
+ }
+ Frame {
+ msec: 4016
+ hash: "bd8f39423d96fceaf577c7f792b61211"
+ }
+ Frame {
+ msec: 4032
+ hash: "370a471a614d22d281d9987a5b6a42bf"
+ }
+ Frame {
+ msec: 4048
+ hash: "c8fe4424d96460a2503632e3a54d4f6a"
+ }
+ Frame {
+ msec: 4064
+ hash: "09dabc3ef85dc857719e7d20111e6023"
+ }
+ Frame {
+ msec: 4080
+ hash: "22bff1406eba529d58320b8b19be76d9"
+ }
+ Frame {
+ msec: 4096
+ hash: "478bc04322b93b75b5185d047c2898b7"
+ }
+ Frame {
+ msec: 4112
+ hash: "98dfc2d6573e5cb7a56a893b8fecf422"
+ }
+ Frame {
+ msec: 4128
+ hash: "03b96d3e148e86f1150b09696012d07c"
+ }
+ Frame {
+ msec: 4144
+ hash: "735b24d2811beef969477c8b0f400d32"
+ }
+ Frame {
+ msec: 4160
+ hash: "b8399d2a7a6de0b5f81e68e8f8825622"
+ }
+ Frame {
+ msec: 4176
+ hash: "766a97e0881b623a0de93babfa841125"
+ }
+ Frame {
+ msec: 4192
+ hash: "008323603b48a55b589af7cbb2f1c8b0"
+ }
+ Frame {
+ msec: 4208
+ hash: "3da913235e4916b4691e3d089dc7b52f"
+ }
+ Frame {
+ msec: 4224
+ hash: "3da913235e4916b4691e3d089dc7b52f"
+ }
+ Frame {
+ msec: 4240
+ hash: "8c7f6ff7b3db65d7dd9ac4d18545f0d1"
+ }
+ Frame {
+ msec: 4256
+ hash: "8c7f6ff7b3db65d7dd9ac4d18545f0d1"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 346; y: 95
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4272
+ hash: "8c7f6ff7b3db65d7dd9ac4d18545f0d1"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 346; y: 98
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 346; y: 103
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4288
+ hash: "951ae231b7b18517f8d6504ce7f01b3d"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 348; y: 110
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 348; y: 115
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4304
+ hash: "364283bbbcedabc87689ec174ae29818"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 351; y: 124
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 353; y: 129
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4320
+ hash: "6a8a59ba8cf0539704fc035d7d5def41"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 358; y: 141
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 361; y: 145
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4336
+ hash: "d4626b39fbf24cc6a4e23ef33a570add"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 370; y: 163
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4352
+ hash: "255604ac684a18e272dccfa9a81fa1bb"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 376; y: 172
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4368
+ hash: "2696641e48ea2a0ccfc65057b283814f"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 377; y: 175
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 377; y: 175
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4384
+ hash: "4ae011d8d81c57f9e2495d32a90fb5c0"
+ }
+ Frame {
+ msec: 4400
+ hash: "c07f57059244b1164e698430b20aac8e"
+ }
+ Frame {
+ msec: 4416
+ hash: "d39c21bc6fc079c76ea78d1a3fb0c974"
+ }
+ Frame {
+ msec: 4432
+ hash: "f955985ee02fcb810ab8c5f4790f5c12"
+ }
+ Frame {
+ msec: 4448
+ hash: "d06b83769bf0f0331e53c270f5dc294c"
+ }
+ Frame {
+ msec: 4464
+ hash: "a49ef3866e3f71c26c57fcd616a6dc4c"
+ }
+ Frame {
+ msec: 4480
+ hash: "086f4bb966b2076f51b1f615368afda5"
+ }
+ Frame {
+ msec: 4496
+ hash: "898de0b200cb83c9724869dd2b74ed52"
+ }
+ Frame {
+ msec: 4512
+ hash: "47833f93c5c55f57de5733950ba53714"
+ }
+ Frame {
+ msec: 4528
+ hash: "0ced71db7e8c5b8ce8e195a7b821507d"
+ }
+ Frame {
+ msec: 4544
+ hash: "84888b8748e297ed4e0525019865ea2b"
+ }
+ Frame {
+ msec: 4560
+ hash: "0f62d1aaa0fec0dd90351258a3745869"
+ }
+ Frame {
+ msec: 4576
+ hash: "e34a874942161ea830907f94040fc0a5"
+ }
+ Frame {
+ msec: 4592
+ hash: "9031e4ad8ee57a8b826d6a6394f0feb9"
+ }
+ Frame {
+ msec: 4608
+ hash: "9031e4ad8ee57a8b826d6a6394f0feb9"
+ }
+ Frame {
+ msec: 4624
+ hash: "cc8a2477368001015b68c99db95ebaa1"
+ }
+ Frame {
+ msec: 4640
+ hash: "01c0f4d5b155eb16ac364b24d5085bac"
+ }
+ Frame {
+ msec: 4656
+ hash: "4c4f318b03e0da461bcecb61f43ef3cd"
+ }
+ Frame {
+ msec: 4672
+ hash: "dffd22d719f18c943cd0c30afe272434"
+ }
+ Frame {
+ msec: 4688
+ hash: "4f7ab0450512ae1319dad22a6e0400b7"
+ }
+ Frame {
+ msec: 4704
+ hash: "ea29e23bdb49a30694640dfb078c796a"
+ }
+ Frame {
+ msec: 4720
+ hash: "80739ed287906d0b55297be4b74a54cb"
+ }
+ Frame {
+ msec: 4736
+ hash: "8d9117cf841c4b158f30b79ac8f2afb0"
+ }
+ Frame {
+ msec: 4752
+ hash: "1850e9117160b2bd1865274092f9ec84"
+ }
+ Frame {
+ msec: 4768
+ hash: "07945c8954860895f95f8e352c49e0a5"
+ }
+ Frame {
+ msec: 4784
+ hash: "d0fa6087d2859446ff8f317c9d7dafe1"
+ }
+ Frame {
+ msec: 4800
+ hash: "8ebba2084793d90a640ec2fb12dc0547"
+ }
+ Frame {
+ msec: 4816
+ image: "flickable-nested.5.png"
+ }
+ Frame {
+ msec: 4832
+ hash: "77d479675c36ecda0926061449f5a60b"
+ }
+ Frame {
+ msec: 4848
+ hash: "77d479675c36ecda0926061449f5a60b"
+ }
+ Frame {
+ msec: 4864
+ hash: "b968c1528ce7ecf80008fbd56f0ca9a9"
+ }
+ Frame {
+ msec: 4880
+ hash: "b968c1528ce7ecf80008fbd56f0ca9a9"
+ }
+ Frame {
+ msec: 4896
+ hash: "b968c1528ce7ecf80008fbd56f0ca9a9"
+ }
+ Frame {
+ msec: 4912
+ hash: "b968c1528ce7ecf80008fbd56f0ca9a9"
+ }
+ Frame {
+ msec: 4928
+ hash: "b968c1528ce7ecf80008fbd56f0ca9a9"
+ }
+ Frame {
+ msec: 4944
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 4960
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 4976
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 4992
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5008
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5024
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5040
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5056
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5072
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5088
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5104
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5120
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5136
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5152
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5168
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5184
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5200
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5216
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5232
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5248
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5264
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5280
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5296
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5312
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5328
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5344
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5360
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5376
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5392
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5408
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5424
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5440
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5456
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5472
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5488
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5504
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5520
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5536
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5552
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5568
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5584
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5600
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5616
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5632
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5648
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5664
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5680
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5696
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/flickable-nested.qml b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/flickable-nested.qml
new file mode 100644
index 0000000..9335b9e
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/flickable-nested.qml
@@ -0,0 +1,50 @@
+import QtQuick 1.0
+
+Item {
+ width: 640
+ height: 400
+
+ Flickable {
+ objectName: "flick 1"
+ anchors.fill: parent
+ contentWidth: width + 100
+ contentHeight: height + 100
+
+ Rectangle {
+ width: 300
+ height: 300
+ color: "blue"
+
+ Flickable {
+ objectName: "flick 2"
+ width: 300
+ height: 300
+ clip: true
+ contentWidth: 400
+ contentHeight: 400
+
+ Rectangle {
+ width: 100
+ height: 100
+ anchors.centerIn: parent
+ color: "yellow"
+
+ Flickable {
+ objectName: "flick 3"
+ anchors.fill: parent
+ clip: true
+ contentWidth: 150
+ contentHeight: 150
+ Rectangle {
+ x: 80
+ y: 80
+ width: 50
+ height: 50
+ color: "green"
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.0.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.0.png
index 699f83e..347e773 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.1.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.1.png
index a742a6a..370ca80 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.1.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.2.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.2.png
index 71abae2..97e3906 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.2.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.2.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.3.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.3.png
index a6e6b3e..5fa3c67 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.3.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.3.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.4.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.4.png
index 9f125c4..ce11c09 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.4.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.4.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.5.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.5.png
index 41d0cd5..d155742 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.5.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.5.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.qml b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.qml
index b75d140..304d5c7 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.qml
@@ -222,7 +222,7 @@ VisualTest {
}
Frame {
msec: 752
- hash: "e21cac055208e47e267ac906c7c2ca9c"
+ hash: "d2dda5bec262721d653e88ec3eaeca57"
}
Mouse {
type: 5
@@ -234,7 +234,7 @@ VisualTest {
}
Frame {
msec: 768
- hash: "131e094a79edbeea9a1b981592e55abf"
+ hash: "d61d21ab4d83b8578494720d9bfe6fa8"
}
Mouse {
type: 5
@@ -254,7 +254,7 @@ VisualTest {
}
Frame {
msec: 784
- hash: "73faabf52bd2af8d8b9d28ce21e5e77b"
+ hash: "0a178235529d721529e8dc3b439a64c9"
}
Mouse {
type: 5
@@ -266,7 +266,7 @@ VisualTest {
}
Frame {
msec: 800
- hash: "359554a95362db1734f606cf677001fc"
+ hash: "c800609ffea814ba7cc2441790157245"
}
Mouse {
type: 5
@@ -286,43 +286,43 @@ VisualTest {
}
Frame {
msec: 816
- hash: "8ef4ecc5c5ba578f0279dc57a6c17ccd"
+ hash: "afcb452d41c6e895309bb921a1ad1d31"
}
Frame {
msec: 832
- hash: "69c3d9d2700dd395b656b0b09fa63511"
+ hash: "02d8f91c33f62aaf366bcfd03d232269"
}
Frame {
msec: 848
- hash: "2bbcc36d72c3e9a4b672a46f2aae5076"
+ hash: "1ba9bc8c2b941fd0ec82f211eb559682"
}
Frame {
msec: 864
- hash: "125a5f0c8efdf97676edbe379660dcce"
+ hash: "ee8680df3c58a48f3fff4a8fc221e38c"
}
Frame {
msec: 880
- hash: "4347a02227207fbf870b6aed76131619"
+ hash: "36c04a2bd58124877a332bb6a262a7e5"
}
Frame {
msec: 896
- hash: "e08b494c818669bfc48273598574d22e"
+ hash: "e6ea836d68c54a8308e10f33d4eb8b98"
}
Frame {
msec: 912
- hash: "186cb5465f45c0df8082ec8cad6ee8b1"
+ hash: "f2400819feb116ae3b327284bbb292ff"
}
Frame {
msec: 928
- hash: "91d04d4469492c3bb2a1ed415dcd904c"
+ hash: "5d9a3458cb59ede36e7b51bac869785a"
}
Frame {
msec: 944
- hash: "8cc8ef251d68af926a8f300b8666ecfd"
+ hash: "b859b690c633a9fec87941e7c89f5d19"
}
Frame {
msec: 960
- hash: "42f64722245f8519386e75ce7e3c0cd9"
+ hash: "ef0b66e789a8e88389e16bfa36b9f6e2"
}
Frame {
msec: 976
@@ -330,195 +330,195 @@ VisualTest {
}
Frame {
msec: 992
- hash: "058311da9dcf73a4b4928038334b04b5"
+ hash: "493e3c7b0de4a7b4b46678fe4ce9a763"
}
Frame {
msec: 1008
- hash: "ea662934ee0c3c8d4dbde3ad49448922"
+ hash: "b7056d635c69b8e5bf98872f4c07ed43"
}
Frame {
msec: 1024
- hash: "01991a871819e7bdbf817580f720ead6"
+ hash: "68aa8bd6709e1b49cfefc4594c236c46"
}
Frame {
msec: 1040
- hash: "69a7fe47ae589bcc2607cc42fcea7451"
+ hash: "4b28ebf737b8c4228771122d844b8166"
}
Frame {
msec: 1056
- hash: "8240d087b767311e00b7dd4b8726246c"
+ hash: "b04155316770a1265e5dc431e1b9a9a1"
}
Frame {
msec: 1072
- hash: "cc70c8e79d68f09e6db0dd43b99906b7"
+ hash: "d540453541aba394b0958cdc48f91d48"
}
Frame {
msec: 1088
- hash: "2bfabef74bc6e1dbf72111838a0e7557"
+ hash: "b3e7cbc83c65ec61c768757798b17c58"
}
Frame {
msec: 1104
- hash: "66616f01553364c5bd589b781e22163a"
+ hash: "b12b31d4959a697fcc8e54f1c846eef9"
}
Frame {
msec: 1120
- hash: "58b9de84ebdaabee3917608f2af3bbdb"
+ hash: "77c3bbb94471cfbfd23cc3914d796dfc"
}
Frame {
msec: 1136
- hash: "964d96b9b783efb1053501f8a6931248"
+ hash: "41975592e60f08a0296a8babe1da2df3"
}
Frame {
msec: 1152
- hash: "055b77b921a2bac71b6780ab3179f19f"
+ hash: "0a5eea8a11b15ee8583f187f336f56c7"
}
Frame {
msec: 1168
- hash: "074904f31b4f7cf0679f0bf7bba30af2"
+ hash: "bf9c02945fdee4b06353f8f7f4fca2a3"
}
Frame {
msec: 1184
- hash: "f020a490b6800d5b4402ecb9a8bcd436"
+ hash: "157c92d133a39a2b1d20a551303d2f6f"
}
Frame {
msec: 1200
- hash: "1615bdedf92f91f089e494d893840c4b"
+ hash: "213716cad9fa2179a17a512e8c03c8f5"
}
Frame {
msec: 1216
- hash: "b6892f6a5db6d211f0d1bb2bbe5045bf"
+ hash: "0ec517c50e9e36fef4fb14318e298723"
}
Frame {
msec: 1232
- hash: "5f0d903ba682923ac69454026a359ed9"
+ hash: "bab010fe0f5d3b57fd556a9b709c285e"
}
Frame {
msec: 1248
- hash: "da5bae496a9ad28585151f4c75ee0c9f"
+ hash: "b6bdf2f21c4137d4b5f25e0fe728bba5"
}
Frame {
msec: 1264
- hash: "68f553248f7ca116671782d1c357b552"
+ hash: "c091e46064c8096568224ed7e4c8dc4f"
}
Frame {
msec: 1280
- hash: "5503df04dd7f4c88314f9d309a5b36b4"
+ hash: "c0a6ede96566533ab35384afa535530f"
}
Frame {
msec: 1296
- hash: "cc48c1f58b553adcb27d60f176e2b910"
+ hash: "f61f5c7617700b9aad71206cfc9e402e"
}
Frame {
msec: 1312
- hash: "661f546199d8753a7b6f6ccea5928c12"
+ hash: "c70c106d128051c06da3acdf817f5ffb"
}
Frame {
msec: 1328
- hash: "0fd70052c100f77bddbad177d9e5573d"
+ hash: "624d7c7fb2f39225d51d1a548aa186ed"
}
Frame {
msec: 1344
- hash: "488e0652c0ed82a014de63a64145c34c"
+ hash: "f052610f17a7484bf6cb2bd07aa91af6"
}
Frame {
msec: 1360
- hash: "8b6bf2519080a6e4a61fe216f72dfa09"
+ hash: "44cd80041a1965c8c60fdffd9ae19395"
}
Frame {
msec: 1376
- hash: "4dab1827f6ce9561297fce8e067df1bd"
+ hash: "7597f86b537fbd70260908c973f9db21"
}
Frame {
msec: 1392
- hash: "b3f4c5cd728eaf2b791612a7fea64e7b"
+ hash: "30cd60db9aa2df2adc7d01091c905cb4"
}
Frame {
msec: 1408
- hash: "3d01abd0b8a5a62d58a4c09546f212d8"
+ hash: "8da4613759e9bcb926a0c84556213eb5"
}
Frame {
msec: 1424
- hash: "e76796498cf595c60d4b60cc0e320601"
+ hash: "1085fcc81f0aed8508817839ca748359"
}
Frame {
msec: 1440
- hash: "1b31e96f2823e78a0c4029e7bc45b9f2"
+ hash: "b87f002bf6fb0684f0b3cf565507e066"
}
Frame {
msec: 1456
- hash: "f75c182dc24f4fabe1034ee494dba2ad"
+ hash: "b60916a57aec6ebbd8b69be7c8d66e19"
}
Frame {
msec: 1472
- hash: "646c12edadf350405709860381cfced6"
+ hash: "a28e1538d18ccb7485d0306b9f7b18a6"
}
Frame {
msec: 1488
- hash: "b6719406da9f2484fe55e3c69184f86c"
+ hash: "832c857f2e05f2f82308cbf91f7bf401"
}
Frame {
msec: 1504
- hash: "5456857d6d48d064df1cb3f35d8447b5"
+ hash: "ca3e50cd337a07ef07f063be28fa6dc2"
}
Frame {
msec: 1520
- hash: "8d1809b568345e1532fb6d9428fc9729"
+ hash: "3ecf7faa733653ef20e4a26eb47d63d1"
}
Frame {
msec: 1536
- hash: "5cffa76fe09a771a9f62a9f0392f0431"
+ hash: "f17a6be2e183f4c87e31004458e5052c"
}
Frame {
msec: 1552
- hash: "8de59915e874ce829c691a19ac930f28"
+ hash: "bfa62672ee7fcd9c3a75b63198a4c2bf"
}
Frame {
msec: 1568
- hash: "9027bbf8121f70d26530f70423ec05b7"
+ hash: "cdaafe7f622c18c2409ac539649de1cd"
}
Frame {
msec: 1584
- hash: "d3d1d8b9f7b4eb74a8b7ae5cf19a8e20"
+ hash: "c957f5c58e0a9b315b51ac1012709493"
}
Frame {
msec: 1600
- hash: "81ffcc0147e3124a3015deb7c0dbfd90"
+ hash: "925c55a8564f2318f9de4bd406cb5b13"
}
Frame {
msec: 1616
- hash: "ca0c96e908f05c4ee1af1f80d7b432aa"
+ hash: "466208a8f6ecf45393be01a6dd7f2b0f"
}
Frame {
msec: 1632
- hash: "2bdb6fbf942623856a6963c335794dd2"
+ hash: "35cff8c0f4b503ba4948966079484feb"
}
Frame {
msec: 1648
- hash: "18ac264d9ea9b592b0738f1cf732f678"
+ hash: "47472faf5e9bf4b4e514abe55f1e0b72"
}
Frame {
msec: 1664
- hash: "1ee9adbbae7b97dc050c82b8ed7b0aad"
+ hash: "b699165e354bcadfd0d914d9ecb3d2aa"
}
Frame {
msec: 1680
- hash: "b502390c452883ade550d2761bb09d3d"
+ hash: "e255c047ce78f5677ccec8bd9737201a"
}
Frame {
msec: 1696
- hash: "31a6f573fbb3f545ee051e2290938004"
+ hash: "bd4f08095a9c546a42c85e6df6eaf655"
}
Frame {
msec: 1712
- hash: "3be9788228d9e540313e75671319c5b7"
+ hash: "ca65869f48b169260c3756d846a12f36"
}
Frame {
msec: 1728
- hash: "23cbd718154f939d8270674e8f7607f0"
+ hash: "1921889beb8e61c8b959d4affa814465"
}
Frame {
msec: 1744
- hash: "5f7f49b894b80ddd7cdc544a49ec24a2"
+ hash: "a9dda9ebaa97133c671917473721272c"
}
Mouse {
type: 2
@@ -538,11 +538,11 @@ VisualTest {
}
Frame {
msec: 1760
- hash: "2a1ddee3d3a0c2a4fffab3988e35e274"
+ hash: "cab96d2118b31d43e85dc902df2ed8ed"
}
Frame {
msec: 1776
- hash: "2a1ddee3d3a0c2a4fffab3988e35e274"
+ hash: "cab96d2118b31d43e85dc902df2ed8ed"
}
Mouse {
type: 5
@@ -562,7 +562,7 @@ VisualTest {
}
Frame {
msec: 1792
- hash: "5594b9139480ba1c814509a049f9b6c5"
+ hash: "d21c8af68b314800b86922493db6553e"
}
Mouse {
type: 5
@@ -574,7 +574,7 @@ VisualTest {
}
Frame {
msec: 1808
- hash: "d8729deb404f5b821264743943adb288"
+ hash: "a80c0f6f679ba5f1354f8e16677c1125"
}
Mouse {
type: 5
@@ -586,7 +586,7 @@ VisualTest {
}
Frame {
msec: 1824
- hash: "6de642baf7698ec65d48ccf0a1e8e7db"
+ hash: "d8729deb404f5b821264743943adb288"
}
Mouse {
type: 5
@@ -606,7 +606,7 @@ VisualTest {
}
Frame {
msec: 1840
- hash: "f6732999861d1f638484a5aaa9cf0550"
+ hash: "87d41239eb7e170fa7a1ed523a9af942"
}
Mouse {
type: 5
@@ -618,7 +618,7 @@ VisualTest {
}
Frame {
msec: 1856
- hash: "7cd7c1679838f35556bd4ee4565b7a86"
+ hash: "1c185649e08a54a6949409ed7ee5dc60"
}
Mouse {
type: 5
@@ -638,7 +638,7 @@ VisualTest {
}
Frame {
msec: 1872
- hash: "4276a4d9350503603b0c9c98552697b3"
+ hash: "d82969ef0f4baf3c51e112e049cb1334"
}
Mouse {
type: 5
@@ -650,7 +650,7 @@ VisualTest {
}
Frame {
msec: 1888
- hash: "954a47627aee0a1128a78191bf32d984"
+ hash: "e746a3eb8527036b09afb9cdd3d15648"
}
Mouse {
type: 5
@@ -662,7 +662,7 @@ VisualTest {
}
Frame {
msec: 1904
- hash: "360a47795f7f9389f82f2f55fa1fe83f"
+ hash: "e1d6c01f6cd66a5bcdb08ca810a07282"
}
Mouse {
type: 5
@@ -674,7 +674,7 @@ VisualTest {
}
Frame {
msec: 1920
- hash: "19d4284791d0031342ba995bd17a7833"
+ hash: "fd0e9cf835131ee6cc5ecf67c6724d73"
}
Mouse {
type: 5
@@ -706,7 +706,7 @@ VisualTest {
}
Frame {
msec: 1952
- hash: "e9cd8fb810ecf39a90af039ead97aaf1"
+ hash: "69c17a9c18795b1d8ae63d36d76af626"
}
Mouse {
type: 5
@@ -726,7 +726,7 @@ VisualTest {
}
Frame {
msec: 1968
- hash: "42df1a0fbbe7cce5f2359d9e02696299"
+ hash: "c7ca4762498af158a2f2da6f5ae560ce"
}
Mouse {
type: 5
@@ -738,7 +738,7 @@ VisualTest {
}
Frame {
msec: 1984
- hash: "cc71434d6bd162386b80cb3b7e387116"
+ hash: "f500232133ec07a3b833b06425379484"
}
Mouse {
type: 5
@@ -758,7 +758,7 @@ VisualTest {
}
Frame {
msec: 2000
- hash: "a130b471b3903f3f1d77f2306da2b92e"
+ hash: "0a0cd0433e206dfc923ec0d3617e04a1"
}
Mouse {
type: 5
@@ -770,7 +770,7 @@ VisualTest {
}
Frame {
msec: 2016
- hash: "5bdb7472e325651e891c115953afdb39"
+ hash: "1754875ee6a5712ffb8ce1bbae6d4ed1"
}
Mouse {
type: 5
@@ -782,7 +782,7 @@ VisualTest {
}
Frame {
msec: 2032
- hash: "ab3a64b41c67a0b8a6c0830c0e0cb797"
+ hash: "1e743264f0a312bc0d0a023fbc6db832"
}
Mouse {
type: 5
@@ -794,7 +794,7 @@ VisualTest {
}
Frame {
msec: 2048
- hash: "8eb1f2c8c02c2acf4262e05000045649"
+ hash: "ab3a64b41c67a0b8a6c0830c0e0cb797"
}
Mouse {
type: 5
@@ -806,7 +806,7 @@ VisualTest {
}
Frame {
msec: 2064
- hash: "514220d357c4a26e4aaf9ed20d3f4f33"
+ hash: "d05f721f1d7d23d6e0cc67993bf1fa8f"
}
Mouse {
type: 5
@@ -818,7 +818,7 @@ VisualTest {
}
Frame {
msec: 2080
- hash: "e44526ef273048028d5989fc662eb7e6"
+ hash: "419c09739f855c53be3427a71aa3faf9"
}
Mouse {
type: 5
@@ -838,7 +838,7 @@ VisualTest {
}
Frame {
msec: 2096
- hash: "29ac091428a89cfcb4c52c08e0e10327"
+ hash: "f0ae80ed5965d7531d6a653c80eed444"
}
Mouse {
type: 5
@@ -858,7 +858,7 @@ VisualTest {
}
Frame {
msec: 2112
- hash: "82beb845af88fc9432dc104ff805a146"
+ hash: "1419fe55cc28ce9690846d4c03275fe7"
}
Mouse {
type: 5
@@ -870,7 +870,7 @@ VisualTest {
}
Frame {
msec: 2128
- hash: "371392f267b2c1f4e29963506180e246"
+ hash: "2e22df53697a599b0e44fb2a3986dcd0"
}
Mouse {
type: 5
@@ -882,11 +882,11 @@ VisualTest {
}
Frame {
msec: 2144
- hash: "1da06d036cc0a2d2de34eee37b6981c0"
+ hash: "96f763c555b523d9b7ed7a0a159db368"
}
Frame {
msec: 2160
- hash: "1da06d036cc0a2d2de34eee37b6981c0"
+ hash: "96f763c555b523d9b7ed7a0a159db368"
}
Mouse {
type: 5
@@ -898,31 +898,31 @@ VisualTest {
}
Frame {
msec: 2176
- hash: "4980de22342d1085e205401090777d24"
+ hash: "20f9cf7787c8cfd4843289f5ab2012e7"
}
Frame {
msec: 2192
- hash: "4980de22342d1085e205401090777d24"
+ hash: "20f9cf7787c8cfd4843289f5ab2012e7"
}
Frame {
msec: 2208
- hash: "4980de22342d1085e205401090777d24"
+ hash: "20f9cf7787c8cfd4843289f5ab2012e7"
}
Frame {
msec: 2224
- hash: "4980de22342d1085e205401090777d24"
+ hash: "20f9cf7787c8cfd4843289f5ab2012e7"
}
Frame {
msec: 2240
- hash: "4980de22342d1085e205401090777d24"
+ hash: "20f9cf7787c8cfd4843289f5ab2012e7"
}
Frame {
msec: 2256
- hash: "4980de22342d1085e205401090777d24"
+ hash: "20f9cf7787c8cfd4843289f5ab2012e7"
}
Frame {
msec: 2272
- hash: "4980de22342d1085e205401090777d24"
+ hash: "20f9cf7787c8cfd4843289f5ab2012e7"
}
Mouse {
type: 5
@@ -934,7 +934,7 @@ VisualTest {
}
Frame {
msec: 2288
- hash: "e0a52543b976dc998615704c63b1f3e9"
+ hash: "1241895174f4d8e4386c3957e3d2e292"
}
Mouse {
type: 5
@@ -946,7 +946,7 @@ VisualTest {
}
Frame {
msec: 2304
- hash: "82beb845af88fc9432dc104ff805a146"
+ hash: "1419fe55cc28ce9690846d4c03275fe7"
}
Mouse {
type: 5
@@ -958,7 +958,7 @@ VisualTest {
}
Frame {
msec: 2320
- hash: "e44526ef273048028d5989fc662eb7e6"
+ hash: "419c09739f855c53be3427a71aa3faf9"
}
Mouse {
type: 5
@@ -978,7 +978,7 @@ VisualTest {
}
Frame {
msec: 2336
- hash: "8eb1f2c8c02c2acf4262e05000045649"
+ hash: "ab3a64b41c67a0b8a6c0830c0e0cb797"
}
Mouse {
type: 5
@@ -990,7 +990,7 @@ VisualTest {
}
Frame {
msec: 2352
- hash: "442958c3a705745204db96ff9902b7fc"
+ hash: "a130b471b3903f3f1d77f2306da2b92e"
}
Mouse {
type: 5
@@ -1002,31 +1002,31 @@ VisualTest {
}
Frame {
msec: 2368
- hash: "a130b471b3903f3f1d77f2306da2b92e"
+ hash: "0a0cd0433e206dfc923ec0d3617e04a1"
}
Frame {
msec: 2384
- hash: "a130b471b3903f3f1d77f2306da2b92e"
+ hash: "0a0cd0433e206dfc923ec0d3617e04a1"
}
Frame {
msec: 2400
- hash: "a130b471b3903f3f1d77f2306da2b92e"
+ hash: "0a0cd0433e206dfc923ec0d3617e04a1"
}
Frame {
msec: 2416
- hash: "a130b471b3903f3f1d77f2306da2b92e"
+ hash: "0a0cd0433e206dfc923ec0d3617e04a1"
}
Frame {
msec: 2432
- hash: "a130b471b3903f3f1d77f2306da2b92e"
+ hash: "0a0cd0433e206dfc923ec0d3617e04a1"
}
Frame {
msec: 2448
- hash: "a130b471b3903f3f1d77f2306da2b92e"
+ hash: "0a0cd0433e206dfc923ec0d3617e04a1"
}
Frame {
msec: 2464
- hash: "a130b471b3903f3f1d77f2306da2b92e"
+ hash: "0a0cd0433e206dfc923ec0d3617e04a1"
}
Mouse {
type: 5
@@ -1046,7 +1046,7 @@ VisualTest {
}
Frame {
msec: 2480
- hash: "374dc7c3ea0c93ac93a857a4620bc031"
+ hash: "47e86b008567366f37ac043ed8802d53"
}
Mouse {
type: 5
@@ -1058,7 +1058,7 @@ VisualTest {
}
Frame {
msec: 2496
- hash: "0b943f48b39053bfc906a4a47a37d68a"
+ hash: "92e1d5dbc85e777785cc68171a0a3fbf"
}
Mouse {
type: 5
@@ -1070,7 +1070,7 @@ VisualTest {
}
Frame {
msec: 2512
- hash: "099fbdf1560dd79b700914863406c904"
+ hash: "360a47795f7f9389f82f2f55fa1fe83f"
}
Mouse {
type: 5
@@ -1090,7 +1090,7 @@ VisualTest {
}
Frame {
msec: 2528
- hash: "3aa1614cc49504d19e979ebf190f2970"
+ hash: "acefb43050e140d689f1d377f50f5c83"
}
Mouse {
type: 5
@@ -1102,7 +1102,7 @@ VisualTest {
}
Frame {
msec: 2544
- hash: "837420c71a5010f25cccd05e5e9b3eec"
+ hash: "4bc43ae81aac757c872157ac9b41a2d9"
}
Mouse {
type: 5
@@ -1114,7 +1114,7 @@ VisualTest {
}
Frame {
msec: 2560
- hash: "871349fc09f418717231b8f8e20a7fff"
+ hash: "41421089f087c54ebcd9fa44e95bd96e"
}
Mouse {
type: 5
@@ -1134,7 +1134,7 @@ VisualTest {
}
Frame {
msec: 2576
- hash: "9b6022024aae22ec1f522fd00ed29e9b"
+ hash: "db0f09393b5c9284142f9eb3cb5952ce"
}
Mouse {
type: 5
@@ -1154,79 +1154,79 @@ VisualTest {
}
Frame {
msec: 2592
- hash: "8d9410909ae259388fa94b3a60342608"
+ hash: "9491689e51ec46bec07fb8b280daef80"
}
Frame {
msec: 2608
- hash: "0ceb355351ac99458ba75776c11b3039"
+ hash: "44a30531642ada65c052afe30874d7ba"
}
Frame {
msec: 2624
- hash: "61ca917ecc8ad4c35b7f2a3b828542bf"
+ hash: "6bf415b82e7cfa68b8321571ab619c3f"
}
Frame {
msec: 2640
- hash: "fd5db933d1d8684b15eb5239d19d8919"
+ hash: "645e43948279d528020070125b71c33b"
}
Frame {
msec: 2656
- hash: "13f466a82ee22cabf5cbd2463f55b46a"
+ hash: "495d14df729eede7e560f2e841bae142"
}
Frame {
msec: 2672
- hash: "3b7f7880f5b568a0e45cd0e268822f3a"
+ hash: "fa3b12e9869bf4254c8cdf6e5b10bb2d"
}
Frame {
msec: 2688
- hash: "cca22501c3b5a2ed4264ba060eeb1a6e"
+ hash: "482ce41c4b918a71b803c5f521ea494e"
}
Frame {
msec: 2704
- hash: "efe5258ac5962d1d2bfa4286c1621830"
+ hash: "79d70563c7e139d9f9785565219133c7"
}
Frame {
msec: 2720
- hash: "141998cff765a4e90836b871f229a1ca"
+ hash: "0dc70772aa50445c1cb7dbd8ee0092b0"
}
Frame {
msec: 2736
- hash: "9d684675fa883d5488194effcb1d8d0a"
+ hash: "222d638b8fb896563028f029e6fb3c49"
}
Frame {
msec: 2752
- hash: "fa87f781048f264ddf447441a714ee50"
+ hash: "20b8fc718d9329c9c8901fdfe14557a2"
}
Frame {
msec: 2768
- hash: "61b4992b9c52222345c9ada3148d50f9"
+ hash: "e3972b3244e4a98c9ee4df2d4b623c12"
}
Frame {
msec: 2784
- hash: "3e255a634d215746cb95f5d765335ea2"
+ hash: "e3a4b357c00d3d49e4a7d90f6f57054c"
}
Frame {
msec: 2800
- hash: "d64a755e47a502244e7f14f2091f0ca6"
+ hash: "44ad81d2ad0d502b003e148412871a41"
}
Frame {
msec: 2816
- hash: "582562992b0652f995b439897182e0f8"
+ hash: "47d757dab5c72cad08cb8026631d67e6"
}
Frame {
msec: 2832
- hash: "2d69b1a274c262faf5ce9ed3191c7d22"
+ hash: "8522a3b6202b303a9e65a9e136423e27"
}
Frame {
msec: 2848
- hash: "36c04a2bd58124877a332bb6a262a7e5"
+ hash: "70e3cd650472d0e95f4d6ca9e34a2ce1"
}
Frame {
msec: 2864
- hash: "798711925da8f5034039dad86cc1fad1"
+ hash: "19a7825cd8c0eaa6f313ec77fff9ec1b"
}
Frame {
msec: 2880
- hash: "31495157a10c3bb4dd70cfd857fd07e6"
+ hash: "579688ff6ec910570c0c0c60fdf44cf6"
}
Frame {
msec: 2896
@@ -1234,207 +1234,207 @@ VisualTest {
}
Frame {
msec: 2912
- hash: "b81330eb50dbd39f1abcdb8ff1553d08"
+ hash: "7ab8cf0d0b650e8f994a9beed8be29fb"
}
Frame {
msec: 2928
- hash: "ececcb86b76e9cd2f57585bd87e16bef"
+ hash: "92e9be6d36844bb475b861ba9c4bc3ff"
}
Frame {
msec: 2944
- hash: "2c37e2c24cf22a334cfcc6f2691ad9fb"
+ hash: "08b9cce3b2071b328054af6bcb6755c7"
}
Frame {
msec: 2960
- hash: "ad0572020d273dbca046357aa0f8bf3b"
+ hash: "b505d2f41a6db06d4ca03f5340800aa6"
}
Frame {
msec: 2976
- hash: "51a469e059a5e1a3675db731f55209d3"
+ hash: "f0267f59e247e24e4cf9c56f8931112b"
}
Frame {
msec: 2992
- hash: "dca7d50a3faab1f049bece34bd16b8c4"
+ hash: "ddbc73e2df4da11d5122539a00c126de"
}
Frame {
msec: 3008
- hash: "86dc86bafb01fa086caa3b22f9d393d9"
+ hash: "8dd67df95fae14079ed5b83c421a5b6e"
}
Frame {
msec: 3024
- hash: "05754bd86070a6f01bf90ca2b964f695"
+ hash: "7b217f7c51087a07e8922b0286b2c1dc"
}
Frame {
msec: 3040
- hash: "911ec290ba303f0cac258cbb893bbf78"
+ hash: "e464b5121f3204c64cafe2f5e31cf497"
}
Frame {
msec: 3056
- hash: "f27f29249426f46b8fb508372bcbb32d"
+ hash: "7fc2018f8db17b65fd01b2ddfa44f66d"
}
Frame {
msec: 3072
- hash: "2f452e2d519f33ee03db67ebd7f69e3b"
+ hash: "a5d1871511eac7224292b3552da466a8"
}
Frame {
msec: 3088
- hash: "35cf7747a75ea3f727c2fe1dae6136c5"
+ hash: "2f0a55cf3cd30da77fbb73e749b729a3"
}
Frame {
msec: 3104
- hash: "6773187693f52a8f2c0e358e379b4d21"
+ hash: "9aab649b6664c179878d0ead438dd751"
}
Frame {
msec: 3120
- hash: "abca1f00f7ec60c8c80ba5345898e54b"
+ hash: "2ad733363d239d9a3ea1c31427a3b3fe"
}
Frame {
msec: 3136
- hash: "9bee1da64534da97de349e1ee973cc9c"
+ hash: "e73b4fd7cb6285df9a77d666f25ab245"
}
Frame {
msec: 3152
- hash: "087df06ca720918482f2e29653c7fbac"
+ hash: "53b05d8be52a74c3a24b88779d4927bf"
}
Frame {
msec: 3168
- hash: "5b08911bf0975bd6615bf29294e4b1f5"
+ hash: "04fc6aac5f090960cd87eefb4273fb0f"
}
Frame {
msec: 3184
- hash: "dead4bb3768b65418f68bae7dd0bf004"
+ hash: "294c842a71b5e4927146952ce865c8a2"
}
Frame {
msec: 3200
- hash: "6bfe4c866936d8ae509650419ae12455"
+ hash: "ac6f7afb4a5e67e2edd8300e7dfdff13"
}
Frame {
msec: 3216
- hash: "7428bdd9609a2594be08fdeac6ff1e17"
+ hash: "8a7ab6dc549b247f3b897e098d784dd8"
}
Frame {
msec: 3232
- hash: "d02f9f693e0ae8c7034bf727064ec28a"
+ hash: "0a3144254f66a6b005b95a026496cd32"
}
Frame {
msec: 3248
- hash: "b6284efd849547bbfefc22ec77d61062"
+ hash: "ca457a1c503a980687926e31ac16995b"
}
Frame {
msec: 3264
- hash: "4b78b647be8e918e85edab0c23b6f882"
+ hash: "c17922ca04f5ce9916e2907a6c28bf8b"
}
Frame {
msec: 3280
- hash: "c4a02c18ce3574d057e6a54b30efadb3"
+ hash: "b2a071734226b905f6c6f5652f645517"
}
Frame {
msec: 3296
- hash: "d1d190010239d0b02a697d1c63c748ab"
+ hash: "1f41a314699151771d7d1ca672aaba8f"
}
Frame {
msec: 3312
- hash: "b198689d11aa59d937297e6fcf675c93"
+ hash: "de94c2ad2e74036d975e8402dd8b06e9"
}
Frame {
msec: 3328
- hash: "218f3371beea895aefd28aa874012dcc"
+ hash: "9cfe0627852cefe67fc0b44b31085b4a"
}
Frame {
msec: 3344
- hash: "1135de1b9a4ebf1d2829546d3c3f3903"
+ hash: "de7ab5230efb63264f76fa1f1b61dcfa"
}
Frame {
msec: 3360
- hash: "773a64cc7bb8e99a25078f348986e28f"
+ hash: "5ad22cf9e1c9a02cfc570beaac55bee0"
}
Frame {
msec: 3376
- hash: "e8ce58aeb18b3f56ebd3d6f61ac94657"
+ hash: "9e6210d9e6bfda4fe0695b75d03435e2"
}
Frame {
msec: 3392
- hash: "6de92679c32c7f3e9d9b6ba3a47e65eb"
+ hash: "d3989a9fb7e99d16032fa1842364f2ed"
}
Frame {
msec: 3408
- hash: "339b37207af10ad986269e21ab37ff6d"
+ hash: "2f3e7040a4966e56858312f6534e9e77"
}
Frame {
msec: 3424
- hash: "ac01f0708800fdfdacec67ac9e80602f"
+ hash: "16bb17f511519337be2e60d8b9f95149"
}
Frame {
msec: 3440
- hash: "9de89a748b1e18eb6ed94875af6f26de"
+ hash: "819250fd9899a9457a9300f942f4d8bf"
}
Frame {
msec: 3456
- hash: "d091e4a93c2beafb0ce4b6dff6d5b05f"
+ hash: "6639a15d4d23540ccf63c9bea0e1689e"
}
Frame {
msec: 3472
- hash: "9532271085864d2fde3aa6e572599588"
+ hash: "14b553132a86e57577c416e6f6c53433"
}
Frame {
msec: 3488
- hash: "d00804b42ab1c1f082a9f394ff4d666e"
+ hash: "f7a95239db44b66698d29f0daae826f1"
}
Frame {
msec: 3504
- hash: "2c745f007353e6f8a7195470ba9492c2"
+ hash: "b5a6abb5294fb9b069ab8a075003cb61"
}
Frame {
msec: 3520
- hash: "b4e952acb734ab1a608297fcb44fbe46"
+ hash: "391c1c43ce893aeefc42d164e6e8aaac"
}
Frame {
msec: 3536
- hash: "75ceed3c2ddd557866145393fa50a12f"
+ hash: "271addef36d51d904bc1d68f65b66de3"
}
Frame {
msec: 3552
- hash: "8b83b80554dd4a1266184092d380554c"
+ hash: "73a23e56edcd64ac6147aff27b785ebb"
}
Frame {
msec: 3568
- hash: "973bddb1b2f9dbadd40c0de3ca7c3510"
+ hash: "bd43145ae22086348cb5e68765a42ac1"
}
Frame {
msec: 3584
- hash: "5691b5bf54b50d4ff0a717873e001c00"
+ hash: "4b2706d1215f2b5b08ac87e40ba8c21b"
}
Frame {
msec: 3600
- hash: "8b26b0aa8b06da031354c59d7fb41bf0"
+ hash: "6420fd46fd8068010d3caaa68eea457e"
}
Frame {
msec: 3616
- hash: "45786c39a10b8e1cf399df98f3fb7ffb"
+ hash: "188499a79313d984ed1d710329b0237f"
}
Frame {
msec: 3632
- hash: "c6d0be03e167c16566372cc992604dfb"
+ hash: "12da197320858ea4f8a1437b7ceac95a"
}
Frame {
msec: 3648
- hash: "8d6e057550632d143faf996a62bbd1cd"
+ hash: "14bdec5663d1a81fa617d3b81e19f8b4"
}
Frame {
msec: 3664
- hash: "7e3a321b95d5f62f0da2b10324b485b6"
+ hash: "3430047eca214a217aca0bd71814f4db"
}
Frame {
msec: 3680
- hash: "e842f18dfd36947b2fa086a4d0bb2ec5"
+ hash: "974c431fe7030990389c7fc719655cfd"
}
Frame {
msec: 3696
- hash: "a9359e143dae4113437a43cc00493479"
+ hash: "d38f3153b3cf39a278dc6948ff9ef71d"
}
Frame {
msec: 3712
- hash: "2eca61c837cca9beb6d1834eafe8c538"
+ hash: "0c6eec50abcf4afc20311ffa1326d4e8"
}
Frame {
msec: 3728
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.0.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.0.png
index af0e781..da688c7 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.1.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.1.png
index 6f1878f..618d238 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.1.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.2.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.2.png
index 97f09f7..0688ed1 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.2.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.2.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.3.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.3.png
index 878875a..ec6e330 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.3.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.3.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.4.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.4.png
index cdbe606..1692d17 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.4.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.4.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.5.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.5.png
index 7b78f7a..d70704d 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.5.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.5.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.6.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.6.png
index d7b5943..f8f37c6 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.6.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.6.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.qml b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.qml
index bc900c6..3828e76 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.qml
@@ -182,7 +182,7 @@ VisualTest {
}
Frame {
msec: 592
- hash: "731c8547a72c64ac86aec87c0a9a12cb"
+ hash: "683d9f54c75f5b1ed082edb0b4559bc8"
}
Mouse {
type: 5
@@ -202,7 +202,7 @@ VisualTest {
}
Frame {
msec: 608
- hash: "d9d7dd7ea05499f028964fdd11af0fe6"
+ hash: "02e5238c0764f370d0f463cc3f477df7"
}
Mouse {
type: 5
@@ -214,7 +214,7 @@ VisualTest {
}
Frame {
msec: 624
- hash: "361879f350c448a484b71a9e7a42b87f"
+ hash: "02239cd84ce630a89b94dbcf469d9a70"
}
Mouse {
type: 5
@@ -226,7 +226,7 @@ VisualTest {
}
Frame {
msec: 640
- hash: "998da4b3e36ee3e17deb2b5a097661da"
+ hash: "6cdaa8ffc906ade671fe259711e76f24"
}
Mouse {
type: 5
@@ -246,7 +246,7 @@ VisualTest {
}
Frame {
msec: 656
- hash: "1b3f9758bd9842cc9545b494499f87c4"
+ hash: "db00a0d69efd43f69c83dafbf38a06a6"
}
Mouse {
type: 5
@@ -258,7 +258,7 @@ VisualTest {
}
Frame {
msec: 672
- hash: "7e87f7c233dad50549e4bdafe10bb48e"
+ hash: "76fdf4cb75376ec3a9e084d93765c5cb"
}
Mouse {
type: 5
@@ -286,75 +286,75 @@ VisualTest {
}
Frame {
msec: 688
- hash: "01ceb2fea81f2192ab11d7d6e1df879a"
+ hash: "b12e86c13e012c5992930b3e559c337c"
}
Frame {
msec: 704
- hash: "9afa862248bd527e07374a5c2f2036a1"
+ hash: "4056e78a59e8f1e030f3e3a51c436b46"
}
Frame {
msec: 720
- hash: "e06439495148bfbf059cfe2b5df22840"
+ hash: "c84781b7586943ef889b8911c23e91db"
}
Frame {
msec: 736
- hash: "b206a28d6f3be8cba9595849328b27b8"
+ hash: "cd952ffa63dbcb772b666ce755c9a2f1"
}
Frame {
msec: 752
- hash: "646e4529bf554dceee0140ec56a02d1c"
+ hash: "2a31778e3ab7c676ae82278948cef12a"
}
Frame {
msec: 768
- hash: "31bdcf1f178d65e033e23dfbdcb9dc5f"
+ hash: "ef6319b262fc299b14b40d1521f9c9c3"
}
Frame {
msec: 784
- hash: "b4e897356814ca2dddbc3644b1782f36"
+ hash: "05ccb24a2025df31188b413c8d837232"
}
Frame {
msec: 800
- hash: "669e5d682aae8727640e0e0f4e855a60"
+ hash: "df31f9dba1a762397c0364d7e83052ef"
}
Frame {
msec: 816
- hash: "892007b1a379c617412502499df92d01"
+ hash: "6eec07606ef320072ea23ceedb3f6b29"
}
Frame {
msec: 832
- hash: "f4d66daa2d428aa712a73ded2de7a361"
+ hash: "e3502cb53c6e17373de3b718a8212f4d"
}
Frame {
msec: 848
- hash: "0c21e69bed6dc2d6b7c23c20714aca67"
+ hash: "2e01e2e252ca9fb3e7107f04a3ba4031"
}
Frame {
msec: 864
- hash: "189909bdbfeb1f02ad527fbc438d567d"
+ hash: "547a9f25404c2bf7737526faf67a459d"
}
Frame {
msec: 880
- hash: "b2fcbc0657474e1b6d27e1f2f93be35b"
+ hash: "aa9c3122e3c2a7ed450a0afffbcf4e6a"
}
Frame {
msec: 896
- hash: "4407d7ad1b6a40b2355145aee136ff15"
+ hash: "1535dea92038cf87395a616841fd9bf6"
}
Frame {
msec: 912
- hash: "347ada687af0a97f0a862a1f3a1132be"
+ hash: "1535dea92038cf87395a616841fd9bf6"
}
Frame {
msec: 928
- hash: "db6217ff0194c5a3f9ca9ea7e3b3dfd8"
+ hash: "1535dea92038cf87395a616841fd9bf6"
}
Frame {
msec: 944
- hash: "8a94ca0ee93daaa1bdcdbfc8a80713c1"
+ hash: "1535dea92038cf87395a616841fd9bf6"
}
Frame {
msec: 960
- hash: "ab24d0c8545518cbaff876976247be2c"
+ hash: "1535dea92038cf87395a616841fd9bf6"
}
Frame {
msec: 976
@@ -450,7 +450,7 @@ VisualTest {
}
Frame {
msec: 1216
- hash: "c612bb9906f18786ef7cc6f4e56de218"
+ hash: "aa9c3122e3c2a7ed450a0afffbcf4e6a"
}
Mouse {
type: 5
@@ -470,7 +470,7 @@ VisualTest {
}
Frame {
msec: 1232
- hash: "ffec210dd863ed32a780506f61b06056"
+ hash: "b889647c08af7db2e6582d9927cb1cf7"
}
Mouse {
type: 5
@@ -490,7 +490,7 @@ VisualTest {
}
Frame {
msec: 1248
- hash: "9613c658f267d19b84d6e7ef2a676fed"
+ hash: "ac97616fc3c54711bb067cc72c15d4c5"
}
Mouse {
type: 5
@@ -510,7 +510,7 @@ VisualTest {
}
Frame {
msec: 1264
- hash: "8c5dd8d0f9f434530b20e14a84af9f46"
+ hash: "b38c46d537e6e622c8a0ecae76dbe506"
}
Mouse {
type: 5
@@ -530,7 +530,7 @@ VisualTest {
}
Frame {
msec: 1280
- hash: "a956e8e9ca8958c387f8f5ce374cdec9"
+ hash: "6261f2f16bdd89142cfbf1de4ce64a32"
}
Mouse {
type: 5
@@ -550,87 +550,87 @@ VisualTest {
}
Frame {
msec: 1296
- hash: "712e865d894f179cfd9d86b08e60811a"
+ hash: "d4f8d57bae3d5bc888a4bbe2812b3fdf"
}
Frame {
msec: 1312
- hash: "db5c1f2af2e72ff4edce83cb342b5263"
+ hash: "4e0a90dda433c1615ea367ec90917409"
}
Frame {
msec: 1328
- hash: "834f0aa26c66234491468c1b27a2d329"
+ hash: "b20e244f27dae505568fcba25cccb5d8"
}
Frame {
msec: 1344
- hash: "78a2a4b60db730a7367bc77e1dfc1a1b"
+ hash: "f31d264a002718787ea55a6312c7f9f2"
}
Frame {
msec: 1360
- hash: "a8ff2277b5f7d515bc5a9af1f0e77197"
+ hash: "0abbf36b5e3f2db9288bde05825dc111"
}
Frame {
msec: 1376
- hash: "e05d730624025000b831860f5b99e8ac"
+ hash: "64fc0f18174f5e8002cf79a908cc08df"
}
Frame {
msec: 1392
- hash: "54aa124492ea742e4327f1d2b45ab620"
+ hash: "430d7719ebf3b5835af92683cff10e56"
}
Frame {
msec: 1408
- hash: "bc700bee41ac384a2555723b010e9041"
+ hash: "411a8fe1ee3a0510574cbf6a69d23456"
}
Frame {
msec: 1424
- hash: "26f66098c505cea4715a89b6a2232759"
+ hash: "47e431bf01575c44f7c1fa3e20409866"
}
Frame {
msec: 1440
- hash: "00f3255a3ead315410d8c0d338779689"
+ hash: "d17b62a0b52b4a5220b29b55f764abc6"
}
Frame {
msec: 1456
- hash: "154e7d86d7602ebba38a0d63b211894d"
+ hash: "9bd0d8dfbee424bd0ccf72703a7c51c2"
}
Frame {
msec: 1472
- hash: "87cf2bff69ebd75af69d0a7c7f668b07"
+ hash: "8ef880c18ecd8adb66e7e0a2dceb61fc"
}
Frame {
msec: 1488
- hash: "f221b870ecccb1669b6223e5431c31d1"
+ hash: "fcc1bc7f35342f595448ca2870478b50"
}
Frame {
msec: 1504
- hash: "40a9d4c522d9fd831be2ca698ac10670"
+ hash: "cf360de1c6649e45beb974ddbe436ea9"
}
Frame {
msec: 1520
- hash: "7ad47479d99fd4d9fde96fef242bdc20"
+ hash: "b2a6acf1fed92069fd2779b1fa236c95"
}
Frame {
msec: 1536
- hash: "b91912801c790d849399306c693a4d33"
+ hash: "7128a442b6bb06038477d46ac3da5021"
}
Frame {
msec: 1552
- hash: "e5c8d361abcbc15df0b0b82728cb5b84"
+ hash: "6a0ab3ccc3749b9a2b9a5b5851b0cf70"
}
Frame {
msec: 1568
- hash: "3f2f82c925e93d4593581cdba16f361f"
+ hash: "18f6cdad215c55ea8335d06110715aa8"
}
Frame {
msec: 1584
- hash: "7007fd0595c188a9a5b3ff31b0514aa5"
+ hash: "137420f4b1f51440c3aefd18dbdad71d"
}
Frame {
msec: 1600
- hash: "118661091df765ae35c152c7fe818029"
+ hash: "faf898388f87948fbacd74589cb18af0"
}
Frame {
msec: 1616
- hash: "0a8edd2a35f7921ced6e3aa7e571bc4b"
+ hash: "b818181b3fee6f5a35a0da6c0f8e240e"
}
Mouse {
type: 2
@@ -650,7 +650,7 @@ VisualTest {
}
Frame {
msec: 1632
- hash: "ef734ce4d7e1aee19a78b743c9923f90"
+ hash: "2e74cc22a4e5b20cc231bc08e15e662a"
}
Mouse {
type: 5
@@ -670,7 +670,7 @@ VisualTest {
}
Frame {
msec: 1648
- hash: "09a9925d5ec2fd03cfbf469bc22bf201"
+ hash: "27be226c985bb0143d1dca3e4be4b10a"
}
Mouse {
type: 5
@@ -690,71 +690,71 @@ VisualTest {
}
Frame {
msec: 1664
- hash: "6babcbf5582d5ed8f0cf52e233867055"
+ hash: "9384d46806b2a8091b6d16f7636d6ae4"
}
Frame {
msec: 1680
- hash: "94dae9d52f3523e17f3f0e59ca24a069"
+ hash: "684a17820c3693d893f8199cd7c7076f"
}
Frame {
msec: 1696
- hash: "0d417d25893a0454a729f5c23a2a6c28"
+ hash: "dc1facc91b6935983bbcd2eada452d4d"
}
Frame {
msec: 1712
- hash: "afd1bbca1dcfea8d1f0a340d86b07fa8"
+ hash: "6bb08cc431a3ecca1a553ea10669bb0c"
}
Frame {
msec: 1728
- hash: "97e98982742b94dba8b6cb59397bcb66"
+ hash: "1330640d4ca9ac69dd089cea34b7f61d"
}
Frame {
msec: 1744
- hash: "a0ad8cbbd0daa0afd3831e8a071b9a0e"
+ hash: "95370207a55b56c41923937b40d5fe6b"
}
Frame {
msec: 1760
- hash: "f71826bcd6ea91d2f64d627a390c379d"
+ hash: "c36b60f81e7de5c0e5a59655041adff2"
}
Frame {
msec: 1776
- hash: "7699da01cf1ee9a7f404ab053241b530"
+ hash: "297abbc6b38a1909324fcee6d8b1d908"
}
Frame {
msec: 1792
- hash: "6aba727ecc562d7b5555eae427e6978b"
+ hash: "0af89e3bab7c517f375897239ea35153"
}
Frame {
msec: 1808
- hash: "ef9c6daa5b04b0be9159594e04524fba"
+ hash: "05109c3dfac7f65fe00e81d1a145f048"
}
Frame {
msec: 1824
- hash: "6293ede5de83f3b01a3b4d8d87648089"
+ hash: "57e1e871cbbc627f2fb9bf5583c4f097"
}
Frame {
msec: 1840
- hash: "c3b34d8592f88622cad0f9353d08e739"
+ hash: "5220aecdd1516d94f0698e79f17fee57"
}
Frame {
msec: 1856
- hash: "880f3cb9d5dbe06cdf17e3a953d4562d"
+ hash: "f3d8c908e61e5d61bbeeb9c6b5e8a704"
}
Frame {
msec: 1872
- hash: "ed381ce920863a5a6627f383a88ea2fe"
+ hash: "f27867aeb39ef64ebd50b5d79b69337e"
}
Frame {
msec: 1888
- hash: "b5bc40b8c4abb6458aeb67eda73507b6"
+ hash: "b807b4e74a0f008df3f4534901debe38"
}
Frame {
msec: 1904
- hash: "482cb61b7fac4b1654483f846b8b6717"
+ hash: "e19832a0a7fcd57efe46cb0102a8d418"
}
Frame {
msec: 1920
- hash: "e1a4a16d2cf5132a9fbb0869ed6082d9"
+ hash: "f0dcfd9b22f385fedfde964774480f85"
}
Frame {
msec: 1936
@@ -762,171 +762,171 @@ VisualTest {
}
Frame {
msec: 1952
- hash: "f8874aaab1e65cf9b86d6b5174c3d2c8"
+ hash: "746c60e03c50dc2e28c62fe52a8dd9d2"
}
Frame {
msec: 1968
- hash: "d8490adeaa793352b812e832f4cb079a"
+ hash: "27d6da44b605cb38552147fdf451ef45"
}
Frame {
msec: 1984
- hash: "85fdb99926ba34a25fa964df11af9a5a"
+ hash: "c41d5491c417531ee86ac6ec8571c6a8"
}
Frame {
msec: 2000
- hash: "ad137a75981c181838d97cbe313063ac"
+ hash: "ac57c578e7e2cbb57e982d6da5fb7268"
}
Frame {
msec: 2016
- hash: "bfa5cecfc0058b56ca66aa816ea098dc"
+ hash: "db40e242fabf119f0e7187eeb96a34a5"
}
Frame {
msec: 2032
- hash: "53fe3960c2f332eb099fedd8421fcc94"
+ hash: "0850d4b73a664ee0f1ed6d6e0615ea80"
}
Frame {
msec: 2048
- hash: "61b99ff526560c1589d2fc8737af2af2"
+ hash: "ae6cb0bfda1cea70b3641251d0dc60c4"
}
Frame {
msec: 2064
- hash: "f9dd63709bed985f5d691d27c0d32484"
+ hash: "67a28c2188aecfc5dcccedd257789dbc"
}
Frame {
msec: 2080
- hash: "964c20ada9ad9e83edd9b429bf681b83"
+ hash: "4355f220c8a87ad981088fb23bb15f11"
}
Frame {
msec: 2096
- hash: "997bc44a319c8ce8212387f7564c4005"
+ hash: "2081c1ffe35f20dd827b3d9f52be90b3"
}
Frame {
msec: 2112
- hash: "892eda6e7446321483ffb1dbf44a0432"
+ hash: "ba13b0b4790aec7084b5553fe0b0d72b"
}
Frame {
msec: 2128
- hash: "62068dca6da7227882b6c3bc147c6f24"
+ hash: "7f289e50f1bbd570b6bc2ca1998f8493"
}
Frame {
msec: 2144
- hash: "2cd0c351c53234d4bbf4d2c74d313f59"
+ hash: "8bb3a37f416032d40cb5f919abb42e30"
}
Frame {
msec: 2160
- hash: "cf812f971bb4f8ab3116cf2b14c325df"
+ hash: "bcc69f859b3bff759e0c732c7adc23f0"
}
Frame {
msec: 2176
- hash: "be296bd9ab4c38d95e6d7d445d8c7f68"
+ hash: "d3e8aae08a2518c039d6bda80fc520a4"
}
Frame {
msec: 2192
- hash: "536d0214c8c3f69ce8d4e1585128b2b8"
+ hash: "955212dc28a6f8fe59c658401284d3a3"
}
Frame {
msec: 2208
- hash: "f71452a0a6ef80758800d67e601a162b"
+ hash: "8eebcff152288a4ab2a3e64fd7ba6f80"
}
Frame {
msec: 2224
- hash: "e57c099beb70d0a4ca2cbc94a2c3887e"
+ hash: "85fe363271d480163fb7847a3501472f"
}
Frame {
msec: 2240
- hash: "84cea22f64ff8b8838a7db0b19af1a4e"
+ hash: "23190380ddcc4e3afce2164a4743d179"
}
Frame {
msec: 2256
- hash: "04aa0d5d089779977f569d0f849b97dd"
+ hash: "40ca7c3d24883a8d3457de934b247280"
}
Frame {
msec: 2272
- hash: "85b52e125142d52d531132939930dd93"
+ hash: "299ed19fa4d213e0e9dd127e8799d5fc"
}
Frame {
msec: 2288
- hash: "19bc7b318c21a6ce2be8ebde2e624fc3"
+ hash: "e39a067860fa7dcb4efba87aee58cc77"
}
Frame {
msec: 2304
- hash: "9cc744249cb031f0400e87893c1642af"
+ hash: "a709045723c4a9a2e85295fcc360eea9"
}
Frame {
msec: 2320
- hash: "a834706bbf573f37cf9f59c6c6cbbfa5"
+ hash: "029428301287e4c7cd2f8a1fa6a25381"
}
Frame {
msec: 2336
- hash: "8db3eea9d47a162d8b0ee9cd18e194f3"
+ hash: "aef25177af3511dc99004a1e37f7f5d3"
}
Frame {
msec: 2352
- hash: "29da9b8da8f572ace93250abb8626a90"
+ hash: "f9e11fd7023a72366dacaaf19b2eb81c"
}
Frame {
msec: 2368
- hash: "179b74316d885f9ee41066b9c475b57f"
+ hash: "51f7c896d79c900a2b54a8c756228200"
}
Frame {
msec: 2384
- hash: "35464509ef5a9919af46a30d40c3edc7"
+ hash: "28c18081813c801c6793873ec23e6c0c"
}
Frame {
msec: 2400
- hash: "aadec42355d38d149421ef6c93783e69"
+ hash: "39df3050c4100e8a4f6e648b4aa16ba7"
}
Frame {
msec: 2416
- hash: "cb8609791270e8e3c13da4579f85595f"
+ hash: "752cb6969fa8b76abf4bb229edb2c21f"
}
Frame {
msec: 2432
- hash: "93e81e036a1bc30cc63ce703f8f43a34"
+ hash: "54d50f6c980cb04a1634622a29a6f0e9"
}
Frame {
msec: 2448
- hash: "d08d18adf9ca92cd6597c2f51ae90383"
+ hash: "d510db233f025b026f896b760848cc07"
}
Frame {
msec: 2464
- hash: "f54ec103787023647beaa4b992340385"
+ hash: "e5c8d361abcbc15df0b0b82728cb5b84"
}
Frame {
msec: 2480
- hash: "61c9f72d78fce0b966a278abacc97ce6"
+ hash: "e5c8d361abcbc15df0b0b82728cb5b84"
}
Frame {
msec: 2496
- hash: "5b0500ed0562b11280c3424412f74188"
+ hash: "e5c8d361abcbc15df0b0b82728cb5b84"
}
Frame {
msec: 2512
- hash: "b8ee7bc1e94ce35bf946ee71fa03d72c"
+ hash: "e5c8d361abcbc15df0b0b82728cb5b84"
}
Frame {
msec: 2528
- hash: "60ec6aceeaf82fc730c3df55b5c06f90"
+ hash: "e5c8d361abcbc15df0b0b82728cb5b84"
}
Frame {
msec: 2544
- hash: "01cc732bad8b28483e79115c117ee26d"
+ hash: "e5c8d361abcbc15df0b0b82728cb5b84"
}
Frame {
msec: 2560
- hash: "b39c8d373524ba679c8567d16e6c5fe0"
+ hash: "e5c8d361abcbc15df0b0b82728cb5b84"
}
Frame {
msec: 2576
- hash: "2474476dfd021ff485c3a127bd22367e"
+ hash: "e5c8d361abcbc15df0b0b82728cb5b84"
}
Frame {
msec: 2592
- hash: "1342a1a0f6bc02159de1be058cf2411b"
+ hash: "e5c8d361abcbc15df0b0b82728cb5b84"
}
Frame {
msec: 2608
- hash: "a9721b64b9a5526335937245302249ae"
+ hash: "e5c8d361abcbc15df0b0b82728cb5b84"
}
Mouse {
type: 2
@@ -938,15 +938,15 @@ VisualTest {
}
Frame {
msec: 2624
- hash: "109dc503ee86e731f52d25908daf5d36"
+ hash: "e5c8d361abcbc15df0b0b82728cb5b84"
}
Frame {
msec: 2640
- hash: "94998dbab6792c518ca1f37f060f1d4b"
+ hash: "e5c8d361abcbc15df0b0b82728cb5b84"
}
Frame {
msec: 2656
- hash: "3146ba4e63fa74279939b8de935f067c"
+ hash: "e5c8d361abcbc15df0b0b82728cb5b84"
}
Mouse {
type: 5
@@ -966,7 +966,7 @@ VisualTest {
}
Frame {
msec: 2672
- hash: "1aaea4143076bf8ba8190d94fcc89e64"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Mouse {
type: 5
@@ -986,7 +986,7 @@ VisualTest {
}
Frame {
msec: 2688
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Mouse {
type: 5
@@ -1006,7 +1006,7 @@ VisualTest {
}
Frame {
msec: 2704
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Mouse {
type: 5
@@ -1026,7 +1026,7 @@ VisualTest {
}
Frame {
msec: 2720
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Mouse {
type: 5
@@ -1046,7 +1046,7 @@ VisualTest {
}
Frame {
msec: 2736
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Mouse {
type: 5
@@ -1066,39 +1066,39 @@ VisualTest {
}
Frame {
msec: 2752
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2768
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2784
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2800
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2816
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2832
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2848
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2864
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2880
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2896
@@ -1106,51 +1106,51 @@ VisualTest {
}
Frame {
msec: 2912
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2928
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2944
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2960
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2976
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2992
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 3008
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 3024
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 3040
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 3056
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 3072
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 3088
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Mouse {
type: 2
@@ -1162,23 +1162,23 @@ VisualTest {
}
Frame {
msec: 3104
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 3120
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 3136
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 3152
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 3168
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Mouse {
type: 5
@@ -1190,11 +1190,11 @@ VisualTest {
}
Frame {
msec: 3184
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 3200
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Mouse {
type: 5
@@ -1214,7 +1214,7 @@ VisualTest {
}
Frame {
msec: 3216
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Mouse {
type: 5
@@ -1234,7 +1234,7 @@ VisualTest {
}
Frame {
msec: 3232
- hash: "1b604ea70459a768fb37a6333000174b"
+ hash: "7d43010a9951054df82571936a04cc50"
}
Mouse {
type: 5
@@ -1254,7 +1254,7 @@ VisualTest {
}
Frame {
msec: 3248
- hash: "25e0aabe364085a61b4572ef015dac2c"
+ hash: "ab1980970c82238d2c37d61db4fc5153"
}
Mouse {
type: 5
@@ -1274,7 +1274,7 @@ VisualTest {
}
Frame {
msec: 3264
- hash: "ee6fc5c1de08e6f13f23b26829d2cba2"
+ hash: "849ffa1fdd718a48e9570b88987f9203"
}
Mouse {
type: 5
@@ -1294,7 +1294,7 @@ VisualTest {
}
Frame {
msec: 3280
- hash: "b077c59359d047738d9ba739f591393b"
+ hash: "d497eff3c8879d30619630e7ffcbf5c9"
}
Mouse {
type: 5
@@ -1314,7 +1314,7 @@ VisualTest {
}
Frame {
msec: 3296
- hash: "2cc0b8d7bd088f2277f5e939c234114c"
+ hash: "b0679dfe2f631e41f5cc269bd16d742c"
}
Mouse {
type: 5
@@ -1334,7 +1334,7 @@ VisualTest {
}
Frame {
msec: 3312
- hash: "64703db84cd5bda3109546293783804d"
+ hash: "ab2d88a4cd58d0064c32660272ff1dbd"
}
Mouse {
type: 5
@@ -1354,7 +1354,7 @@ VisualTest {
}
Frame {
msec: 3328
- hash: "137cd88932ad1fdbfdbf1a80cccf7b3f"
+ hash: "ea3cff28ff3be273332b19a2b8acb95e"
}
Mouse {
type: 5
@@ -1374,7 +1374,7 @@ VisualTest {
}
Frame {
msec: 3344
- hash: "ff9011d861c64bcad214b52cb4245583"
+ hash: "458decd62af57d333a07459c89e62393"
}
Mouse {
type: 5
@@ -1394,7 +1394,7 @@ VisualTest {
}
Frame {
msec: 3360
- hash: "c3f0132e472d29ddee95c7349243d33e"
+ hash: "1347a26241ed98d4913e1cb6cda58286"
}
Mouse {
type: 5
@@ -1414,87 +1414,87 @@ VisualTest {
}
Frame {
msec: 3376
- hash: "42ae9c21dce6a7cd59de228dac775dd5"
+ hash: "2efe07858c0c4de7fd3e339d7a24d5f5"
}
Frame {
msec: 3392
- hash: "3f8631caf6a98d83356b188d6f94e9a6"
+ hash: "3edbe6755710ce148341faeb6980707a"
}
Frame {
msec: 3408
- hash: "b2788cd1939a6dd42f12d8fd1282a122"
+ hash: "0f53231de64ac5b0503e92ad10155dea"
}
Frame {
msec: 3424
- hash: "0d1ab6e9f2780be0c392d20f4b3b9619"
+ hash: "f2be693c23ea0885d6e8180c3062ba76"
}
Frame {
msec: 3440
- hash: "03fdd91b352798b1ff958c23c0bc5f35"
+ hash: "207003ce6908f9707e9193a6c82a40c0"
}
Frame {
msec: 3456
- hash: "028fee3630fdb3cf862213c0466a56fe"
+ hash: "ba86efade16e8965f59f6257ae90d131"
}
Frame {
msec: 3472
- hash: "3ab76009ca029723e5cf0bf9bc154102"
+ hash: "1fdaaa68c4ed484536c207a0eacf6e72"
}
Frame {
msec: 3488
- hash: "866c59b7dd545364b70ddbf21a8ee874"
+ hash: "d1223c8254f9e7e37c4e09628f38bce2"
}
Frame {
msec: 3504
- hash: "9b4ff972b1055db38900fc0c5007e7b0"
+ hash: "c822447614f47b5e15ffad967964a061"
}
Frame {
msec: 3520
- hash: "cbe0073c84617e23f0679a08c1a78492"
+ hash: "5eb2e64f11847cc9360291e14e866611"
}
Frame {
msec: 3536
- hash: "374a5e6070dd628ed031e80d44be1f3f"
+ hash: "545dcc2645b50d78c84c658880d0500c"
}
Frame {
msec: 3552
- hash: "4d16c81f877585a82549cfc4f68c574d"
+ hash: "9d984e07b99137b3cb57dd4df16b8237"
}
Frame {
msec: 3568
- hash: "64b2b4c374a730b138b3573095f45d2c"
+ hash: "da27085e7a3cccde7cc3db2d9c6cc2cd"
}
Frame {
msec: 3584
- hash: "26c59f4131fdb01ac4771231341c75c3"
+ hash: "8d8c117ca102cb93e752904fe3aee7bc"
}
Frame {
msec: 3600
- hash: "bf6a3fdb7c516ca9cfc09f1059cc8cdf"
+ hash: "bfb5ed7b65f36d80e3156560a0ec58b7"
}
Frame {
msec: 3616
- hash: "1bfb86796087cd293c68205cce6ac294"
+ hash: "bbd5f2b95325fde3b8759f2ef713c6bd"
}
Frame {
msec: 3632
- hash: "e0f76f8fc7bd7756a4e004655f97f782"
+ hash: "1c36be8deb2079ed81f1718c92e44803"
}
Frame {
msec: 3648
- hash: "61d3aa5f827452482d8a4a903fe64acc"
+ hash: "5a424e7e66d87d278483c43070920d56"
}
Frame {
msec: 3664
- hash: "c8e42d3a5df195eaa091e50fc9dcd51e"
+ hash: "ae28bc20e20e022e1ac9bc2ddac0e134"
}
Frame {
msec: 3680
- hash: "bb684dccf4c0a74dc091fb78c1be4f2b"
+ hash: "1551c4aae06a258bdadc9ef356724871"
}
Frame {
msec: 3696
- hash: "54341e5a76fb4657021c41e6e3f3d496"
+ hash: "526aec43f710e524d247f8a4b08c261c"
}
Mouse {
type: 2
@@ -1514,7 +1514,7 @@ VisualTest {
}
Frame {
msec: 3712
- hash: "435ee710e108df42f659250ad7dbdb5e"
+ hash: "b50ef7198c1831623ed2210e651ac618"
}
Mouse {
type: 5
@@ -1526,7 +1526,7 @@ VisualTest {
}
Frame {
msec: 3728
- hash: "0c7078ec0d4a1dea84e0fba06323c533"
+ hash: "913269856c18d4f478eed1aa1d5ae293"
}
Mouse {
type: 5
@@ -1546,7 +1546,7 @@ VisualTest {
}
Frame {
msec: 3744
- hash: "854103790c02ca86fa011ef1b0f2be0a"
+ hash: "2c6a32e167bef4c3de0ca97e5764f31b"
}
Mouse {
type: 5
@@ -1566,7 +1566,7 @@ VisualTest {
}
Frame {
msec: 3760
- hash: "1a5995196e5bb4d1464ca76191af72d5"
+ hash: "88386cf4d982c5ca4e3fbd3519d9bd9c"
}
Mouse {
type: 5
@@ -1586,7 +1586,7 @@ VisualTest {
}
Frame {
msec: 3776
- hash: "397bbd080cae99790621642fab6ded91"
+ hash: "ecf04273061af5f881925f3a33015fbb"
}
Mouse {
type: 5
@@ -1606,7 +1606,7 @@ VisualTest {
}
Frame {
msec: 3792
- hash: "66ecad306911060329dcf7695c358e87"
+ hash: "b09c45ea79cd818bac6fe35e4167d4bd"
}
Mouse {
type: 5
@@ -1626,7 +1626,7 @@ VisualTest {
}
Frame {
msec: 3808
- hash: "c06da5f40f3f59f576a1d540d0b3244f"
+ hash: "4a1dbbac65a3caac16b38c45be61003c"
}
Mouse {
type: 5
@@ -1646,7 +1646,7 @@ VisualTest {
}
Frame {
msec: 3824
- hash: "a88d97691539dce19af4c14baf610275"
+ hash: "f4a805fc5c12cc3b2a22ef01050bf3aa"
}
Mouse {
type: 5
@@ -1666,7 +1666,7 @@ VisualTest {
}
Frame {
msec: 3840
- hash: "a07dca2c0014609ca5241612550992f5"
+ hash: "aa7805e4d806c4c56ded804145c44464"
}
Mouse {
type: 5
@@ -1706,7 +1706,7 @@ VisualTest {
}
Frame {
msec: 3872
- hash: "e5a4e76dd607ba1bae97aaf184ee009a"
+ hash: "fd2eab6b3a65713f057da22a412512c7"
}
Mouse {
type: 5
@@ -1726,7 +1726,7 @@ VisualTest {
}
Frame {
msec: 3888
- hash: "bb1d2614e590562479fc8d301bc7402f"
+ hash: "0dda191a66162db6365c663979b0990d"
}
Mouse {
type: 5
@@ -1746,7 +1746,7 @@ VisualTest {
}
Frame {
msec: 3904
- hash: "5d9fd2238666d3ae04613f1bba0fab05"
+ hash: "72a57fe4fc34a19040890a9e2a11dae5"
}
Mouse {
type: 5
@@ -1766,7 +1766,7 @@ VisualTest {
}
Frame {
msec: 3920
- hash: "b12a944cb5e593afbb21a10453879b52"
+ hash: "fd18bd5f8f09c995f122b8b4ecb80279"
}
Mouse {
type: 5
@@ -1786,7 +1786,7 @@ VisualTest {
}
Frame {
msec: 3936
- hash: "2f04c990978627b86fb2ad04579db0db"
+ hash: "8d33b6fa9d6525902e5611cf8ed2fa1f"
}
Mouse {
type: 5
@@ -1798,7 +1798,7 @@ VisualTest {
}
Frame {
msec: 3952
- hash: "e7ddf142fc36174fcaaa70b9340ef7a8"
+ hash: "d73a8eba0c43f214946052481f3db98f"
}
Mouse {
type: 5
@@ -1818,7 +1818,7 @@ VisualTest {
}
Frame {
msec: 3968
- hash: "4fce53c6f5347fe03ecf17b07fabe3ac"
+ hash: "c2f101636963ff5c61be2ad83c6b7ceb"
}
Mouse {
type: 5
@@ -1846,111 +1846,111 @@ VisualTest {
}
Frame {
msec: 3984
- hash: "75a0ec2c0158c55a90147c3f4afaa19c"
+ hash: "54630f489303c7ec2e94b4c941bd310f"
}
Frame {
msec: 4000
- hash: "e89e98b7c1f36b74c664c77e121dedcb"
+ hash: "357106c752b13bcca047d55a3c7cd486"
}
Frame {
msec: 4016
- hash: "f4c1e52a7b97a25fba640be2a1430d2d"
+ hash: "b00b78122721ddcded2c7131cfe40d53"
}
Frame {
msec: 4032
- hash: "be58ca8f63dac8373825231512f483ca"
+ hash: "7da9e4197cb9be292e561790af1caa27"
}
Frame {
msec: 4048
- hash: "755b16d4be00cb52595d42775d6227ac"
+ hash: "076fefc33455667af954dcc5a06017d3"
}
Frame {
msec: 4064
- hash: "c62f1ebbb1e4ae4ca22c060078d6240b"
+ hash: "76edfedd2b9edcc5770dcce87b022427"
}
Frame {
msec: 4080
- hash: "5f1187e9530584f9eb81ce1ce8267da0"
+ hash: "12e6711077da076b737aef1aaa336d42"
}
Frame {
msec: 4096
- hash: "5dc9921e9ddf15ee0457fcdc834544c5"
+ hash: "1e19329fb839a00faa3b95d13b7a9015"
}
Frame {
msec: 4112
- hash: "efacedc2782435ef4e269e6956fb3547"
+ hash: "7469fb57ce0b7ea9a7cc6da14f6a245a"
}
Frame {
msec: 4128
- hash: "5b356dd3082f6b0920bb41d332595ce1"
+ hash: "17e3aca0838e2ba75cc9b869bb969220"
}
Frame {
msec: 4144
- hash: "5d8afcc1abd890beb2badf85bcf02897"
+ hash: "32ebb24cee3ba65f9242708538203553"
}
Frame {
msec: 4160
- hash: "03c56ab4fea11cce19fcbb62dccb7683"
+ hash: "948429b8ded1f688cd7e27e0f056f40c"
}
Frame {
msec: 4176
- hash: "236254ce32a8e06dc42f2fd3c9ac6c7c"
+ hash: "c6fc2e8519a31bc18eb924ca98cd24be"
}
Frame {
msec: 4192
- hash: "4beb33da77bc2b41eb882a2a5cdeb539"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 4208
- hash: "b345470adead1ffb3af4d1091ffbd95c"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 4224
- hash: "c2677f1653b08952338a5c26a724ebe7"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 4240
- hash: "45b6633acf0ac28c5b5462920cf61282"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 4256
- hash: "26a9a6609ce8eee1f744c2bd43494f22"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 4272
- hash: "9373a8010a05d05cb5b3c2ec75359493"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 4288
- hash: "d0c561761825512a02a9e3640139cadc"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 4304
- hash: "d0c561761825512a02a9e3640139cadc"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 4320
- hash: "d0c561761825512a02a9e3640139cadc"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 4336
- hash: "d0c561761825512a02a9e3640139cadc"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 4352
- hash: "d0c561761825512a02a9e3640139cadc"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 4368
- hash: "d0c561761825512a02a9e3640139cadc"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 4384
- hash: "d0c561761825512a02a9e3640139cadc"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 4400
- hash: "d0c561761825512a02a9e3640139cadc"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Mouse {
type: 2
@@ -1962,7 +1962,7 @@ VisualTest {
}
Frame {
msec: 4416
- hash: "d0c561761825512a02a9e3640139cadc"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Mouse {
type: 5
@@ -1974,7 +1974,7 @@ VisualTest {
}
Frame {
msec: 4432
- hash: "d0c561761825512a02a9e3640139cadc"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Mouse {
type: 5
@@ -1994,7 +1994,7 @@ VisualTest {
}
Frame {
msec: 4448
- hash: "d0c561761825512a02a9e3640139cadc"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Mouse {
type: 5
@@ -2014,7 +2014,7 @@ VisualTest {
}
Frame {
msec: 4464
- hash: "0e7554f077e2d6d8c6cf9496b20ab009"
+ hash: "d8f9d016318e0bd38d4654b4850da952"
}
Mouse {
type: 5
@@ -2034,7 +2034,7 @@ VisualTest {
}
Frame {
msec: 4480
- hash: "d6e78f43c971abcc1d2aadb96e8b80b0"
+ hash: "13a2382e08ab10ecb40f9c24c682a797"
}
Mouse {
type: 5
@@ -2054,7 +2054,7 @@ VisualTest {
}
Frame {
msec: 4496
- hash: "10d8e0ee5bd432c639963c9cedd25b85"
+ hash: "cef145c5d105466f3913bb81bb2b58df"
}
Mouse {
type: 5
@@ -2074,7 +2074,7 @@ VisualTest {
}
Frame {
msec: 4512
- hash: "53e142d6b0112644d75df29f7865fbb4"
+ hash: "9bc0a21266bebbf8fc3509e5f92dd77f"
}
Mouse {
type: 5
@@ -2086,7 +2086,7 @@ VisualTest {
}
Frame {
msec: 4528
- hash: "9609807e6c2a27a8b9f1d5c878c3dadf"
+ hash: "e419dbe857667b014e4dd9b57b01bbe4"
}
Mouse {
type: 5
@@ -2098,7 +2098,7 @@ VisualTest {
}
Frame {
msec: 4544
- hash: "a0a1e5fd37e9d8033f182f4f2b20fd26"
+ hash: "411cb7a7f331161059faba4ae6549229"
}
Mouse {
type: 5
@@ -2110,7 +2110,7 @@ VisualTest {
}
Frame {
msec: 4560
- hash: "b40e553dc373e4018488d5421b9a8914"
+ hash: "b008d6b2b444881c36521595f6b31539"
}
Mouse {
type: 5
@@ -2122,7 +2122,7 @@ VisualTest {
}
Frame {
msec: 4576
- hash: "22e36512a0af86fac12c09f735dcb1f7"
+ hash: "77fcc3c74c3832ae6b80aec420cb06e0"
}
Mouse {
type: 5
@@ -2142,59 +2142,59 @@ VisualTest {
}
Frame {
msec: 4592
- hash: "70e9ad0f56e4c37f8684e38f614b889d"
+ hash: "41d1c54bc76caeae057fb1bdb3b93843"
}
Frame {
msec: 4608
- hash: "0754126f5738e3dcec35fc1ef65fdec3"
+ hash: "03fdd91b352798b1ff958c23c0bc5f35"
}
Frame {
msec: 4624
- hash: "b3d84ceeecc294d21bc09a3197195c20"
+ hash: "2098ea8b55b54ca8dd648fb285c43ebf"
}
Frame {
msec: 4640
- hash: "ce00501e194b1056edf1ebd43b954a70"
+ hash: "9929c509654819fd04da4e4b5c8e22b4"
}
Frame {
msec: 4656
- hash: "793f41ac2568530e6d630446216833dc"
+ hash: "c470d3a57c6b56f9f56b176823b27d53"
}
Frame {
msec: 4672
- hash: "e8573de724b653439bde85c15e9555ab"
+ hash: "37474b3a23f90dafee6b9e0043a702fa"
}
Frame {
msec: 4688
- hash: "bfb3f3645c7b2425b686ac23bcef82b8"
+ hash: "0fbb6a9fded011b010fa6f3a2819630c"
}
Frame {
msec: 4704
- hash: "faa78596e208c2cf4593ea25e31fabde"
+ hash: "6c5a7dad864999548257e4bf0ddc3687"
}
Frame {
msec: 4720
- hash: "f1b0931bffce37abfe5a6d635f1f8454"
+ hash: "339bc42e559c66d07f37af5e06feacef"
}
Frame {
msec: 4736
- hash: "0975630a55bfd56eb3e39426c1c3f1e5"
+ hash: "513dc773dc93275e32fa9ac61e6dcb46"
}
Frame {
msec: 4752
- hash: "98f1d79153a8009123abc94141375779"
+ hash: "b725c84435b1f387dc3f375280e39de6"
}
Frame {
msec: 4768
- hash: "d864817f877a9eeb44c665518ea19687"
+ hash: "f3d04b513df286aacb9ebdb107d7a0b4"
}
Frame {
msec: 4784
- hash: "79745c267d14e7790e1bb3a7e76f20b4"
+ hash: "c22839005ed0cb6b2fa9c958d17fd948"
}
Frame {
msec: 4800
- hash: "ec038d4cec64b847711fa221f808bead"
+ hash: "2fb9a2d5d22a6d0ed567328ffaa512f0"
}
Frame {
msec: 4816
@@ -2202,239 +2202,239 @@ VisualTest {
}
Frame {
msec: 4832
- hash: "ef7b3f93abbf210f8f0d38a58380dc8f"
+ hash: "ba13b0b4790aec7084b5553fe0b0d72b"
}
Frame {
msec: 4848
- hash: "f0eea63127df25f7f818596fc034fef8"
+ hash: "2bc983733d4004cc67a56d77e9f48e5d"
}
Frame {
msec: 4864
- hash: "8000dee3ea54522a8193a7f9f2e86023"
+ hash: "0f729cbe41b155b6eef20a4be207b853"
}
Frame {
msec: 4880
- hash: "111485ebaf93aae4f5e0a83da898bbac"
+ hash: "c2ca47a7d70ef827029b32c11a052b83"
}
Frame {
msec: 4896
- hash: "4b2dee1fd88dcaeabc8235f6a0e5c090"
+ hash: "803aefca7f1cbd494d2d2f7e7eea9a3f"
}
Frame {
msec: 4912
- hash: "5e560c777d0294dfa8f249232bfcf3a2"
+ hash: "2641683e1fa9ed418ac89631be7922f1"
}
Frame {
msec: 4928
- hash: "d8b490092ca5ce3ef9b078f4768c382a"
+ hash: "3d9370305ca147625828f7ee3b34ca33"
}
Frame {
msec: 4944
- hash: "28b2bbc3fd19786dd9c0ab718141c525"
+ hash: "5cdfdd22a0dc1ed78035ae4b5e2e26a7"
}
Frame {
msec: 4960
- hash: "d1a61000ebc5a475c0223dde649c8054"
+ hash: "2af663981b43dbe699849eff4731829a"
}
Frame {
msec: 4976
- hash: "d3e8aae08a2518c039d6bda80fc520a4"
+ hash: "b159d3a09666327bd2d860bf56920734"
}
Frame {
msec: 4992
- hash: "9f3bd8654adb9af0457dd50ff71fcd43"
+ hash: "a1ed6f686f4cda9aa59bfd49deb8a075"
}
Frame {
msec: 5008
- hash: "befe00fef613b7616e2dc668a5ed59c7"
+ hash: "c5f1862e7cbb1dcd6b303e58c525ab5c"
}
Frame {
msec: 5024
- hash: "24e84e6998389aa119d7d9e0ac2206ac"
+ hash: "3cc5e5d87067978961eee6e7b33ada06"
}
Frame {
msec: 5040
- hash: "2d3d2b66bf016c8e499f527dbf8923db"
+ hash: "74f3b0eae443bd9f171020fd973ca960"
}
Frame {
msec: 5056
- hash: "52d24673729dbd53d3227675b7001b24"
+ hash: "432037812ab1a09e0d0b32dfaf0f876e"
}
Frame {
msec: 5072
- hash: "4e5c807682d7b6b7839c047a7fb4ad93"
+ hash: "0eec7146b8df3b4892e89abd13b8bc9d"
}
Frame {
msec: 5088
- hash: "319affea47c4a0b0e2c3db51b85430bc"
+ hash: "a01dc5f4b4307aa66068d21159dd64d5"
}
Frame {
msec: 5104
- hash: "344962f0b88c7e8a33df71b4708fd1c0"
+ hash: "11eefdf5b1be8493a6ed9aaf519c7e17"
}
Frame {
msec: 5120
- hash: "ac099ba8a5639b9c83b6f58f2b5bcf93"
+ hash: "55ed797b82f5bca2ac2b5954c44c041e"
}
Frame {
msec: 5136
- hash: "2f8e57c93289dcdc758281531300e949"
+ hash: "498d4ca9faabf8b59e2359b60dc1aff2"
}
Frame {
msec: 5152
- hash: "e4cc3bdf6068064bcfdd0014cc301e65"
+ hash: "78895368b141ab6d3a16f65f4389b2d5"
}
Frame {
msec: 5168
- hash: "598c8a33e2bbf47b21df8b0636e0f0bc"
+ hash: "c73b27167bad79f3f3c5ebb64fa579c2"
}
Frame {
msec: 5184
- hash: "6aea67c85370eee8447a22e2b9e8c44c"
+ hash: "fb05312d65155f0300f456d727698b80"
}
Frame {
msec: 5200
- hash: "39e27a3376f4aba8510f7b0d90ca0e33"
+ hash: "6e974736a0ecea6a71c1a7052a14fa20"
}
Frame {
msec: 5216
- hash: "0ff93a16a07af43bd5e22a2b00fd2588"
+ hash: "f5daf5bec03d3e56c877e9b2dc5701b6"
}
Frame {
msec: 5232
- hash: "8b6004368b9b0a766f6b519820fe1ff6"
+ hash: "29793d2147563feb9ed0ebff18b303cd"
}
Frame {
msec: 5248
- hash: "5d92c0a12ff138d1b2c75bd042be4ea2"
+ hash: "5b63dfa3cb7ac0847f2e63f9d2a0b2b6"
}
Frame {
msec: 5264
- hash: "4386b0abe49106a0174154c726c301f6"
+ hash: "cf2f42dd9830d80f50df30e93a0b1ad2"
}
Frame {
msec: 5280
- hash: "832da8d2a86caa3ca96f33d2cd49178e"
+ hash: "8abb0aa8951612338c3bb87c7a0d2509"
}
Frame {
msec: 5296
- hash: "efee6ab1ba4a1112f2129aad12825667"
+ hash: "8abb0aa8951612338c3bb87c7a0d2509"
}
Frame {
msec: 5312
- hash: "f20a7e67a4789c559b0b0a7656bd89b1"
+ hash: "8abb0aa8951612338c3bb87c7a0d2509"
}
Frame {
msec: 5328
- hash: "350cc8c0085a8f79c9ea8880737a0b75"
+ hash: "8abb0aa8951612338c3bb87c7a0d2509"
}
Frame {
msec: 5344
- hash: "b19715b4029ea489debf7c5a269aca98"
+ hash: "8abb0aa8951612338c3bb87c7a0d2509"
}
Frame {
msec: 5360
- hash: "f383fcaf603af41650c5622bfaf136b3"
+ hash: "8abb0aa8951612338c3bb87c7a0d2509"
}
Frame {
msec: 5376
- hash: "0c62a442367fc0bac5117da1327ed39a"
+ hash: "8abb0aa8951612338c3bb87c7a0d2509"
}
Frame {
msec: 5392
- hash: "323ba45d158d983f359211f1a87b7ebd"
+ hash: "8abb0aa8951612338c3bb87c7a0d2509"
}
Frame {
msec: 5408
- hash: "aeed1a31b8b77dac2c2858969ff2d86c"
+ hash: "8abb0aa8951612338c3bb87c7a0d2509"
}
Frame {
msec: 5424
- hash: "27a9357730a97846ffeddd18492df04d"
+ hash: "8abb0aa8951612338c3bb87c7a0d2509"
}
Frame {
msec: 5440
- hash: "42f78593e64585b33c8854e8ea92710e"
+ hash: "8abb0aa8951612338c3bb87c7a0d2509"
}
Frame {
msec: 5456
- hash: "064f5cec99b9a351bebe2088019f46d1"
+ hash: "8abb0aa8951612338c3bb87c7a0d2509"
}
Frame {
msec: 5472
- hash: "d3669826f94aa2afc1069ab967f677a3"
+ hash: "8abb0aa8951612338c3bb87c7a0d2509"
}
Frame {
msec: 5488
- hash: "a118cf8892d29e6b70b4e65e42380c15"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5504
- hash: "f254260f01ff4697e9e3146cc106140d"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5520
- hash: "ec062b2bb87444115c2e8744b7f80bde"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5536
- hash: "4d45522a4e4253c810cac9cbf24c9b76"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5552
- hash: "532c3d3ead73836948a1036e8e69cadf"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5568
- hash: "4debea14aeac85ff4e64387938d8b010"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5584
- hash: "d8940cf6e39a1bd5e7216a83ce87a676"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5600
- hash: "fba6485f8a60a38ce2f3110137b1f2df"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5616
- hash: "8a8909b114332dd932b784a2640e9ff4"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5632
- hash: "fd901422400333c137240ef5f91928a3"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5648
- hash: "97b84a957515d5823e381fdd86d31fb8"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5664
- hash: "f3547ea694b88dd7d2fb8b04d6bf76a9"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5680
- hash: "9eb0da29d0c323b45e62d31bee97ce8c"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5696
- hash: "9d814096d27e9fbcffdf7e29866e0059"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5712
- hash: "6087185e1e8bf17545a7372be2990ab2"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5728
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5744
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5760
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5776
@@ -2442,126 +2442,126 @@ VisualTest {
}
Frame {
msec: 5792
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5808
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5824
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5840
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5856
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5872
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5888
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5904
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5920
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5936
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5952
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5968
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5984
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6000
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6016
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6032
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6048
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6064
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6080
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6096
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6112
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6128
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6144
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6160
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6176
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6192
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6208
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6224
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6240
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6256
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6272
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/test-pathview.qml b/tests/auto/declarative/qmlvisual/qdeclarativepathview/test-pathview.qml
index 4374b84..08499e7 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/test-pathview.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/test-pathview.qml
@@ -35,6 +35,8 @@ Rectangle {
id: photoPathView; model: rssModel; delegate: photoDelegate
anchors.fill: parent; z: 1
anchors.topMargin:40
+ highlightMoveDuration: 200
+ flickDeceleration: 200
path: Path {
startX: -50; startY: 40;
diff --git a/tests/auto/networkselftest/tst_networkselftest.cpp b/tests/auto/networkselftest/tst_networkselftest.cpp
index ecbc08c..9486671 100644
--- a/tests/auto/networkselftest/tst_networkselftest.cpp
+++ b/tests/auto/networkselftest/tst_networkselftest.cpp
@@ -345,7 +345,7 @@ QHostAddress tst_NetworkSelfTest::serverIpAddress()
// need resolving
QHostInfo resolved = QHostInfo::fromName(QtNetworkSettings::serverName());
if(resolved.error() != QHostInfo::NoError ||
- !resolved.addresses().isEmpty()) {
+ resolved.addresses().isEmpty()) {
qWarning("QHostInfo::fromName failed (%d).", resolved.error());
return QHostAddress(QHostAddress::Null);
}
diff --git a/tests/auto/qcompleter/tst_qcompleter.cpp b/tests/auto/qcompleter/tst_qcompleter.cpp
index 650c328..62e64be 100644
--- a/tests/auto/qcompleter/tst_qcompleter.cpp
+++ b/tests/auto/qcompleter/tst_qcompleter.cpp
@@ -49,6 +49,7 @@
#include <QPointer>
#include "../../shared/util.h"
+#include "../../shared/filesystem.h"
//TESTED_CLASS=
//TESTED_FILES=
@@ -1455,24 +1456,16 @@ void tst_QCompleter::task247560_keyboardNavigation()
void tst_QCompleter::QTBUG_14292_filesystem()
{
- QDir tmpDir = QDir::temp();
+ FileSystem fs;
+ QDir tmpDir = QDir::currentPath();
+
qsrand(QTime::currentTime().msec());
QString d = "tst_QCompleter_" + QString::number(qrand());
- QVERIFY(tmpDir.mkdir(d));
-
-#if 0
- struct Cleanup {
- QString dir;
- ~Cleanup() {
- qDebug() << dir <<
- QFile::remove(dir); }
- } cleanup;
- cleanup.dir = tmpDir.absolutePath()+"/" +d;
-#endif
+ QVERIFY(fs.createDirectory(tmpDir.filePath(d)));
QVERIFY(tmpDir.cd(d));
- QVERIFY(tmpDir.mkdir("hello"));
- QVERIFY(tmpDir.mkdir("holla"));
+ QVERIFY(fs.createDirectory(tmpDir.filePath("hello")));
+ QVERIFY(fs.createDirectory(tmpDir.filePath("holla")));
QLineEdit edit;
QCompleter comp;
@@ -1500,12 +1493,12 @@ void tst_QCompleter::QTBUG_14292_filesystem()
QCOMPARE(comp.popup()->model()->rowCount(), 1);
QTest::keyClick(&edit, 'r');
QTRY_VERIFY(!comp.popup()->isVisible());
- QVERIFY(tmpDir.mkdir("hero"));
+ QVERIFY(fs.createDirectory(tmpDir.filePath("hero")));
QTRY_VERIFY(comp.popup()->isVisible());
QCOMPARE(comp.popup()->model()->rowCount(), 1);
QTest::keyClick(comp.popup(), Qt::Key_Escape);
QTRY_VERIFY(!comp.popup()->isVisible());
- QVERIFY(tmpDir.mkdir("nothingThere"));
+ QVERIFY(fs.createDirectory(tmpDir.filePath("nothingThere")));
//there is no reason creating a file should open a popup, it did in Qt 4.7.0
QTest::qWait(60);
QVERIFY(!comp.popup()->isVisible());
@@ -1522,7 +1515,7 @@ void tst_QCompleter::QTBUG_14292_filesystem()
QTest::qWaitForWindowShown(&w);
QTRY_VERIFY(!edit.hasFocus() && !comp.popup()->hasFocus());
- QVERIFY(tmpDir.mkdir("hemo"));
+ QVERIFY(fs.createDirectory(tmpDir.filePath("hemo")));
//there is no reason creating a file should open a popup, it did in Qt 4.7.0
QTest::qWait(60);
QVERIFY(!comp.popup()->isVisible());
diff --git a/tests/auto/qdatastream/tst_qdatastream.cpp b/tests/auto/qdatastream/tst_qdatastream.cpp
index c03bc71..898fb84 100644
--- a/tests/auto/qdatastream/tst_qdatastream.cpp
+++ b/tests/auto/qdatastream/tst_qdatastream.cpp
@@ -168,6 +168,8 @@ private slots:
void stream_atEnd_data();
void stream_atEnd();
+ void stream_writeError();
+
void stream_QByteArray2();
void setVersion_data();
@@ -2345,6 +2347,55 @@ void tst_QDataStream::stream_atEnd()
}
}
+class FakeBuffer : public QBuffer
+{
+protected:
+ qint64 writeData(const char *c, qint64 i) { return m_lock ? 0 : QBuffer::writeData(c, i); }
+public:
+ FakeBuffer(bool locked = false) : m_lock(locked) {}
+ void setLocked(bool locked) { m_lock = locked; }
+private:
+ bool m_lock;
+};
+
+#define TEST_WRITE_ERROR(op) \
+ { \
+ FakeBuffer fb(false); \
+ QVERIFY(fb.open(QBuffer::ReadWrite)); \
+ QDataStream fs(&fb); \
+ fs.writeRawData("hello", 5); \
+ /* first write some initial content */ \
+ QCOMPARE(fs.status(), QDataStream::Ok); \
+ QCOMPARE(fb.data(), QByteArray("hello")); \
+ /* then test that writing can cause an error */ \
+ fb.setLocked(true); \
+ fs op; \
+ QCOMPARE(fs.status(), QDataStream::WriteFailed); \
+ QCOMPARE(fb.data(), QByteArray("hello")); \
+ /* finally test that writing after an error doesn't change the stream any more */ \
+ fb.setLocked(false); \
+ fs op; \
+ QCOMPARE(fs.status(), QDataStream::WriteFailed); \
+ QCOMPARE(fb.data(), QByteArray("hello")); \
+ }
+
+void tst_QDataStream::stream_writeError()
+{
+ TEST_WRITE_ERROR(<< true)
+ TEST_WRITE_ERROR(<< (qint8)1)
+ TEST_WRITE_ERROR(<< (quint8)1)
+ TEST_WRITE_ERROR(<< (qint16)1)
+ TEST_WRITE_ERROR(<< (quint16)1)
+ TEST_WRITE_ERROR(<< (qint32)1)
+ TEST_WRITE_ERROR(<< (quint32)1)
+ TEST_WRITE_ERROR(<< (qint64)1)
+ TEST_WRITE_ERROR(<< (quint64)1)
+ TEST_WRITE_ERROR(<< "hello")
+ TEST_WRITE_ERROR(<< (float)1.0)
+ TEST_WRITE_ERROR(<< (double)1.0)
+ TEST_WRITE_ERROR(.writeRawData("test", 4))
+}
+
void tst_QDataStream::stream_QByteArray2()
{
QByteArray ba;
diff --git a/tests/auto/qelapsedtimer/tst_qelapsedtimer.cpp b/tests/auto/qelapsedtimer/tst_qelapsedtimer.cpp
index 87df57d..bc61f52 100644
--- a/tests/auto/qelapsedtimer/tst_qelapsedtimer.cpp
+++ b/tests/auto/qelapsedtimer/tst_qelapsedtimer.cpp
@@ -122,11 +122,13 @@ void tst_QElapsedTimer::basics()
quint64 value1 = t1.msecsSinceReference();
qDebug() << value1 << t1;
+ qint64 nsecs = t1.nsecsElapsed();
qint64 elapsed = t1.restart();
QVERIFY(elapsed < minResolution);
+ QVERIFY(nsecs / 1000000 < minResolution);
quint64 value2 = t1.msecsSinceReference();
- qDebug() << value2 << t1 << elapsed;
+ qDebug() << value2 << t1 << elapsed << nsecs;
// in theory, elapsed == value2 - value1
// However, since QElapsedTimer keeps internally the full resolution,
@@ -150,7 +152,10 @@ void tst_QElapsedTimer::elapsed()
// don't check: t1.secsTo(t2)
// QVERIFY(t1 - t2 < 0);
+ QVERIFY(t1.nsecsElapsed() > 0);
QVERIFY(t1.elapsed() > 0);
+ // the number of elapsed nanoseconds and milliseconds should match
+ QVERIFY(t1.nsecsElapsed() - t1.elapsed() * 1000000 < 1000000);
QVERIFY(t1.hasExpired(minResolution));
QVERIFY(!t1.hasExpired(8*minResolution));
QVERIFY(!t2.hasExpired(minResolution));
diff --git a/tests/auto/qfile/test/test.pro b/tests/auto/qfile/test/test.pro
index 673eacc..c0049b0 100644
--- a/tests/auto/qfile/test/test.pro
+++ b/tests/auto/qfile/test/test.pro
@@ -37,4 +37,6 @@ win32 {
LIBS+=-lole32 -luuid
}
-
+symbian {
+ LIBS+=-lefsrv
+}
diff --git a/tests/auto/qfile/tst_qfile.cpp b/tests/auto/qfile/tst_qfile.cpp
index c19079f..c7d6fab 100644
--- a/tests/auto/qfile/tst_qfile.cpp
+++ b/tests/auto/qfile/tst_qfile.cpp
@@ -70,9 +70,12 @@
#elif defined(Q_OS_WINCE)
# include <qplatformdefs.h>
# include <private/qfsfileengine_p.h>
+#elif defined(Q_OS_SYMBIAN)
+# include <f32file.h>
#endif
#include <stdio.h>
+#include <errno.h>
#include "../network-settings.h"
#if defined(Q_OS_SYMBIAN)
@@ -221,6 +224,8 @@ private slots:
#endif
void caseSensitivity();
+ void autocloseHandle();
+
// --- Task related tests below this line
void task167217();
@@ -233,12 +238,20 @@ public:
void invalidFile();
private:
- enum FileType { OpenQFile, OpenFd, OpenStream };
+ enum FileType {
+ OpenQFile,
+ OpenFd,
+ OpenStream,
+#ifdef Q_OS_SYMBIAN
+ OpenRFile,
+#endif
+ NumberOfFileTypes
+ };
void openStandardStreamsFileDescriptors();
void openStandardStreamsBufferedStreams();
- bool openFd(QFile &file, QIODevice::OpenMode mode)
+ bool openFd(QFile &file, QIODevice::OpenMode mode, QFile::FileHandleFlags handleFlags)
{
int fdMode = QT_OPEN_LARGEFILE | QT_OPEN_BINARY;
@@ -250,10 +263,10 @@ private:
fd_ = QT_OPEN(qPrintable(file.fileName()), fdMode);
- return (-1 != fd_) && file.open(fd_, mode);
+ return (-1 != fd_) && file.open(fd_, mode, handleFlags);
}
- bool openStream(QFile &file, QIODevice::OpenMode mode)
+ bool openStream(QFile &file, QIODevice::OpenMode mode, QFile::FileHandleFlags handleFlags)
{
char const *streamMode = "";
@@ -265,10 +278,37 @@ private:
stream_ = QT_FOPEN(qPrintable(file.fileName()), streamMode);
- return stream_ && file.open(stream_, mode);
+ return stream_ && file.open(stream_, mode, handleFlags);
+ }
+
+#ifdef Q_OS_SYMBIAN
+ bool openRFile(QFile &file, QIODevice::OpenMode mode, QFile::FileHandleFlags handleFlags)
+ {
+ //connect file server first time
+ if (!rfs_.Handle() && rfs_.Connect() != KErrNone)
+ return false;
+ //symbian does not like ./ in filenames, so open by absolute path
+ QString fileName(QDir::toNativeSeparators(QFileInfo(file).absoluteFilePath()));
+ TPtrC fn(fileName.utf16(), fileName.length());
+ TInt smode = 0;
+ if (mode & QIODevice::WriteOnly)
+ smode |= EFileWrite;
+ if (mode & QIODevice::ReadOnly)
+ smode |= EFileRead;
+ TInt r;
+ if ((mode & QIODevice::Truncate) || (!(mode & QIODevice::ReadOnly) && !(mode & QIODevice::Append))) {
+ r = rfile_.Replace(rfs_, fn, smode);
+ } else {
+ r = rfile_.Open(rfs_, fn, smode);
+ if (r == KErrNotFound && (mode & QIODevice::WriteOnly)) {
+ r = rfile_.Create(rfs_, fn, smode);
+ }
+ }
+ return (r == KErrNone) && file.open(rfile_, mode, handleFlags);
}
+#endif
- bool openFile(QFile &file, QIODevice::OpenMode mode, FileType type = OpenQFile)
+ bool openFile(QFile &file, QIODevice::OpenMode mode, FileType type = OpenQFile, QFile::FileHandleFlags handleFlags = QFile::DontCloseHandle)
{
if (mode & QIODevice::WriteOnly && !file.exists())
{
@@ -285,10 +325,14 @@ private:
return file.open(mode);
case OpenFd:
- return openFd(file, mode);
+ return openFd(file, mode, handleFlags);
case OpenStream:
- return openStream(file, mode);
+ return openStream(file, mode, handleFlags);
+#ifdef Q_OS_SYMBIAN
+ case OpenRFile:
+ return openRFile(file, mode, handleFlags);
+#endif
}
return false;
@@ -302,6 +346,10 @@ private:
QT_CLOSE(fd_);
if (stream_)
::fclose(stream_);
+#ifdef Q_OS_SYMBIAN
+ if (rfile_.SubSessionHandle())
+ rfile_.Close();
+#endif
fd_ = -1;
stream_ = 0;
@@ -309,6 +357,10 @@ private:
int fd_;
FILE *stream_;
+#ifdef Q_OS_SYMBIAN
+ RFs rfs_;
+ RFile rfile_;
+#endif
};
tst_QFile::tst_QFile()
@@ -2214,6 +2266,9 @@ void tst_QFile::writeLargeDataBlock_data()
QTest::newRow("localfile-QFile") << "./largeblockfile.txt" << (int)OpenQFile;
QTest::newRow("localfile-Fd") << "./largeblockfile.txt" << (int)OpenFd;
QTest::newRow("localfile-Stream") << "./largeblockfile.txt" << (int)OpenStream;
+#ifdef Q_OS_SYMBIAN
+ QTest::newRow("localfile-RFile") << "./largeblockfile.txt" << (int)OpenRFile;
+#endif
#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
// Some semi-randomness to avoid collisions.
@@ -3100,7 +3155,7 @@ void tst_QFile::openStandardStreams()
void tst_QFile::writeNothing()
{
- for (int i = 0; i < 3; ++i) {
+ for (int i = 0; i < NumberOfFileTypes; ++i) {
QFile file("file.txt");
QVERIFY( openFile(file, QIODevice::WriteOnly | QIODevice::Unbuffered, FileType(i)) );
QVERIFY( 0 == file.write((char *)0, 0) );
@@ -3116,6 +3171,9 @@ void tst_QFile::resize_data()
QTest::newRow("native") << int(OpenQFile);
QTest::newRow("fileno") << int(OpenFd);
QTest::newRow("stream") << int(OpenStream);
+#ifdef Q_OS_SYMBIAN
+ QTest::newRow("rfile") << int(OpenRFile);
+#endif
}
void tst_QFile::resize()
@@ -3227,5 +3285,115 @@ void tst_QFile::caseSensitivity()
}
}
+//MSVCRT asserts when any function is called with a closed file handle.
+//This replaces the default crashing error handler with one that ignores the error (allowing EBADF to be returned)
+class AutoIgnoreInvalidParameter
+{
+public:
+#if defined(Q_OS_WIN) && defined (Q_CC_MSVC)
+ static void ignore_invalid_parameter(const wchar_t*, const wchar_t*, const wchar_t*, unsigned int, uintptr_t) {}
+ AutoIgnoreInvalidParameter()
+ {
+ old = _set_invalid_parameter_handler(ignore_invalid_parameter);
+ }
+ ~AutoIgnoreInvalidParameter()
+ {
+ _set_invalid_parameter_handler(old);
+ }
+ _invalid_parameter_handler old;
+#endif
+};
+
+void tst_QFile::autocloseHandle()
+{
+#ifdef Q_OS_SYMBIAN
+ // these tests are a bit different, because using a closed file handle results in a panic rather than error
+ {
+ QFile file("readonlyfile");
+ QFile file2("readonlyfile");
+ QVERIFY(openFile(file, QIODevice::ReadOnly, OpenRFile, QFile::AutoCloseHandle));
+ // file is opened with mandatory lock, so opening again should fail
+ QVERIFY(!file2.open(QIODevice::ReadOnly));
+
+ file.close();
+ // opening again should now succeed (because handle is closed)
+ QVERIFY(file2.open(QIODevice::ReadOnly));
+ }
+
+ {
+ QFile file("readonlyfile");
+ QFile file2("readonlyfile");
+ QVERIFY(openFile(file, QIODevice::ReadOnly, OpenRFile, QFile::DontCloseHandle));
+ // file is opened with mandatory lock, so opening again should fail
+ QVERIFY(!file2.open(QIODevice::ReadOnly));
+
+ file.close();
+ // opening again should still fail (because handle is not auto closed)
+ QVERIFY(!file2.open(QIODevice::ReadOnly));
+
+ rfile_.Close();
+ // now it should succeed
+ QVERIFY(file2.open(QIODevice::ReadOnly));
+ }
+#endif
+
+ {
+ QFile file("readonlyfile");
+ QVERIFY(openFile(file, QIODevice::ReadOnly, OpenFd, QFile::AutoCloseHandle));
+ int fd = fd_;
+ QCOMPARE(file.handle(), fd);
+ file.close();
+ fd_ = -1;
+ QCOMPARE(file.handle(), -1);
+ AutoIgnoreInvalidParameter a;
+ Q_UNUSED(a);
+ //file is closed, read should fail
+ char buf;
+ QCOMPARE((int)QT_READ(fd, &buf, 1), -1);
+ QVERIFY(errno = EBADF);
+ }
+
+ {
+ QFile file("readonlyfile");
+ QVERIFY(openFile(file, QIODevice::ReadOnly, OpenFd, QFile::DontCloseHandle));
+ QCOMPARE(file.handle(), fd_);
+ file.close();
+ QCOMPARE(file.handle(), -1);
+ //file is not closed, read should succeed
+ char buf;
+ QCOMPARE((int)QT_READ(fd_, &buf, 1), 1);
+ ::close(fd_);
+ fd_ = -1;
+ }
+
+ {
+ QFile file("readonlyfile");
+ QVERIFY(openFile(file, QIODevice::ReadOnly, OpenStream, QFile::AutoCloseHandle));
+ int fd = fileno(stream_);
+ QCOMPARE(file.handle(), fd);
+ file.close();
+ stream_ = 0;
+ QCOMPARE(file.handle(), -1);
+ AutoIgnoreInvalidParameter a;
+ Q_UNUSED(a);
+ //file is closed, read should fail
+ char buf;
+ QCOMPARE((int)QT_READ(fd, &buf, 1), -1); //not using fread because the FILE* was freed by fclose
+ }
+
+ {
+ QFile file("readonlyfile");
+ QVERIFY(openFile(file, QIODevice::ReadOnly, OpenStream, QFile::DontCloseHandle));
+ QCOMPARE(file.handle(), fileno(stream_));
+ file.close();
+ QCOMPARE(file.handle(), -1);
+ //file is not closed, read should succeed
+ char buf;
+ QCOMPARE(int(::fread(&buf, 1, 1, stream_)), 1);
+ ::fclose(stream_);
+ stream_ = 0;
+ }
+}
+
QTEST_MAIN(tst_QFile)
#include "tst_qfile.moc"
diff --git a/tests/auto/qmessagebox/tst_qmessagebox.cpp b/tests/auto/qmessagebox/tst_qmessagebox.cpp
index d4ca064..4bc1a28 100644
--- a/tests/auto/qmessagebox/tst_qmessagebox.cpp
+++ b/tests/auto/qmessagebox/tst_qmessagebox.cpp
@@ -47,6 +47,7 @@
#include <QTimer>
#include <QApplication>
#include <QPushButton>
+#include <QDialogButtonBox>
#if defined(Q_WS_MAC) && !defined(QT_NO_STYLE_MAC)
#include <QMacStyle>
#endif
@@ -54,6 +55,8 @@
#include <QCleanlooksStyle>
#endif
+#include "../../shared/util.h"
+
//TESTED_CLASS=
//TESTED_FILES=
@@ -106,7 +109,7 @@ class tst_QMessageBox : public QObject
public:
tst_QMessageBox();
int exec(QMessageBox *msgBox, int key = -1);
- int sendReturn();
+ void sendKeySoon();
public slots:
void sendKey();
@@ -119,6 +122,7 @@ private slots:
void statics();
void about();
void detailsText();
+ void detailsButtonText();
void shortcut();
@@ -134,8 +138,12 @@ private slots:
void setInformativeText();
void iconPixmap();
+ void init();
+ void initTestCase();
+
private:
int keyToSend;
+ QTimer keySendTimer;
};
tst_QMessageBox::tst_QMessageBox() : keyToSend(-1)
@@ -150,22 +158,16 @@ int tst_QMessageBox::exec(QMessageBox *msgBox, int key)
QTimer::singleShot(1000, msgBox, SLOT(close()));
} else {
keyToSend = key;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
}
return msgBox->exec();
}
-int tst_QMessageBox::sendReturn()
-{
- keyToSend = Qt::Key_Return;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
- return 0;
-}
-
void tst_QMessageBox::sendKey()
{
if (keyToSend == -2) {
QApplication::activeModalWidget()->close();
+ keyToSend = -1;
return;
}
if (keyToSend == -1)
@@ -175,6 +177,24 @@ void tst_QMessageBox::sendKey()
keyToSend = -1;
}
+void tst_QMessageBox::sendKeySoon()
+{
+ keySendTimer.start();
+}
+
+void tst_QMessageBox::init()
+{
+ // if there is any pending key send from the last test, cancel it.
+ keySendTimer.stop();
+}
+
+void tst_QMessageBox::initTestCase()
+{
+ keySendTimer.setInterval(1000);
+ keySendTimer.setSingleShot(true);
+ QVERIFY(QObject::connect(&keySendTimer, SIGNAL(timeout()), this, SLOT(sendKey())));
+}
+
void tst_QMessageBox::sanityTest()
{
QMessageBox msgBox;
@@ -315,32 +335,36 @@ void tst_QMessageBox::statics()
for (int i = 0; i < 4; i++) {
keyToSend = Qt::Key_Escape;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
QMessageBox::StandardButton sb = (*statics[i])(0, "caption",
"text", QMessageBox::Yes | QMessageBox::No | QMessageBox::Help | QMessageBox::Cancel,
QMessageBox::NoButton);
QCOMPARE(sb, QMessageBox::Cancel);
+ QCOMPARE(keyToSend, -1);
keyToSend = -2; // close()
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
sb = (*statics[i])(0, "caption",
"text", QMessageBox::Yes | QMessageBox::No | QMessageBox::Help | QMessageBox::Cancel,
QMessageBox::NoButton);
QCOMPARE(sb, QMessageBox::Cancel);
+ QCOMPARE(keyToSend, -1);
keyToSend = Qt::Key_Enter;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
sb = (*statics[i])(0, "caption",
"text", QMessageBox::Yes | QMessageBox::No | QMessageBox::Help,
QMessageBox::Yes);
QCOMPARE(sb, QMessageBox::Yes);
+ QCOMPARE(keyToSend, -1);
keyToSend = Qt::Key_Enter;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
sb = (*statics[i])(0, "caption",
"text", QMessageBox::Yes | QMessageBox::No | QMessageBox::Help,
QMessageBox::No);
QCOMPARE(sb, QMessageBox::No);
+ QCOMPARE(keyToSend, -1);
}
}
@@ -359,16 +383,28 @@ void tst_QMessageBox::shortcut()
void tst_QMessageBox::about()
{
keyToSend = Qt::Key_Escape;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
QMessageBox::about(0, "Caption", "This is an auto test");
+ // On Mac, about and aboutQt are not modal, so we need to
+ // explicitly run the event loop
+#ifdef Q_WS_MAC
+ QTRY_COMPARE(keyToSend, -1);
+#else
+ QCOMPARE(keyToSend, -1);
+#endif
#if !defined(Q_OS_WINCE)
keyToSend = Qt::Key_Enter;
#else
keyToSend = Qt::Key_Escape;
#endif
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
QMessageBox::aboutQt(0, "Caption");
+#ifdef Q_WS_MAC
+ QTRY_COMPARE(keyToSend, -1);
+#else
+ QCOMPARE(keyToSend, -1);
+#endif
}
// Old message box enums
@@ -390,7 +426,7 @@ void tst_QMessageBox::staticSourceCompat()
// source compat tests for < 4.2
keyToSend = Qt::Key_Enter;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", QMessageBox::Yes, QMessageBox::No);
int expectedButton = int(QMessageBox::Yes);
#if defined(Q_WS_MAC) && !defined(QT_NO_STYLE_MAC)
@@ -401,43 +437,51 @@ void tst_QMessageBox::staticSourceCompat()
expectedButton = int(QMessageBox::No);
#endif
QCOMPARE(ret, expectedButton);
+ QCOMPARE(keyToSend, -1);
keyToSend = Qt::Key_Enter;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", QMessageBox::Yes | QMessageBox::Default, QMessageBox::No);
QCOMPARE(ret, int(QMessageBox::Yes));
+ QCOMPARE(keyToSend, -1);
keyToSend = Qt::Key_Enter;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", QMessageBox::Yes, QMessageBox::No | QMessageBox::Default);
QCOMPARE(ret, int(QMessageBox::No));
+ QCOMPARE(keyToSend, -1);
keyToSend = Qt::Key_Enter;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", QMessageBox::Yes | QMessageBox::Default, QMessageBox::No | QMessageBox::Escape);
QCOMPARE(ret, int(QMessageBox::Yes));
+ QCOMPARE(keyToSend, -1);
keyToSend = Qt::Key_Enter;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", QMessageBox::Yes | QMessageBox::Escape, QMessageBox::No | QMessageBox::Default);
QCOMPARE(ret, int(QMessageBox::No));
+ QCOMPARE(keyToSend, -1);
// the button text versions
keyToSend = Qt::Key_Enter;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", "Yes", "No", QString(), 1);
QCOMPARE(ret, 1);
+ QCOMPARE(keyToSend, -1);
if (0) { // dont run these tests since the dialog wont close!
keyToSend = Qt::Key_Escape;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", "Yes", "No", QString(), 1);
QCOMPARE(ret, -1);
+ QCOMPARE(keyToSend, -1);
keyToSend = Qt::Key_Escape;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", "Yes", "No", QString(), 0, 1);
QCOMPARE(ret, 1);
+ QCOMPARE(keyToSend, -1);
}
}
@@ -470,7 +514,7 @@ void tst_QMessageBox::staticBinaryCompat()
// binary compat tests for < 4.2
keyToSend = Qt::Key_Enter;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", Old_Yes, Old_No, 0);
int expectedButton = int(Old_Yes);
#if defined(Q_WS_MAC) && !defined(QT_NO_STYLE_MAC)
@@ -481,33 +525,39 @@ void tst_QMessageBox::staticBinaryCompat()
expectedButton = int(Old_No);
#endif
QCOMPARE(ret, expectedButton);
+ QCOMPARE(keyToSend, -1);
keyToSend = Qt::Key_Escape;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", Old_Yes | Old_Escape, Old_No, 0);
QCOMPARE(ret, int(Old_Yes));
+ QCOMPARE(keyToSend, -1);
keyToSend = Qt::Key_Enter;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", Old_Yes | Old_Default, Old_No, 0);
QCOMPARE(ret, int(Old_Yes));
+ QCOMPARE(keyToSend, -1);
#if 0
keyToSend = Qt::Key_Escape;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", Old_Yes, Old_No | Old_Default, 0);
QCOMPARE(ret, -1);
+ QCOMPARE(keyToSend, -1);
#endif
keyToSend = Qt::Key_Escape;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", Old_Yes | Old_Escape, Old_No | Old_Default, 0);
QCOMPARE(ret, Old_Yes);
+ QCOMPARE(keyToSend, -1);
keyToSend = Qt::Key_Escape;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", Old_Yes | Old_Default, Old_No | Old_Escape, 0);
QCOMPARE(ret, Old_No);
+ QCOMPARE(keyToSend, -1);
}
@@ -661,25 +711,49 @@ void tst_QMessageBox::detailsText()
QCOMPARE(box.detailedText(), text);
}
+void tst_QMessageBox::detailsButtonText()
+{
+ QMessageBox box;
+ box.setDetailedText("bla");
+ box.open();
+ QApplication::postEvent(&box, new QEvent(QEvent::LanguageChange));
+ QApplication::processEvents();
+ QDialogButtonBox* bb = box.findChild<QDialogButtonBox*>("qt_msgbox_buttonbox");
+ QVERIFY(bb); //get the detail button
+
+ QList<QAbstractButton *> list = bb->buttons();
+ QAbstractButton* btn = NULL;
+ foreach(btn, list) {
+ if (btn && (btn->inherits("QPushButton"))) {
+ if (btn->text() != QMessageBox::tr("OK") && btn->text() != QMessageBox::tr("Show Details...")) {
+ QFAIL(qPrintable(QString("Unexpected messagebox button text: %1").arg(btn->text())));
+ }
+ }
+ }
+}
+
void tst_QMessageBox::incorrectDefaultButton()
{
keyToSend = Qt::Key_Escape;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
//Do not crash here
QTest::ignoreMessage(QtWarningMsg, "QDialogButtonBox::createButton: Invalid ButtonRole, button not added");
QMessageBox::question( 0, "", "I've been hit!",QMessageBox::Ok | QMessageBox::Cancel,QMessageBox::Save );
+ QCOMPARE(keyToSend, -1);
keyToSend = Qt::Key_Escape;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
QTest::ignoreMessage(QtWarningMsg, "QDialogButtonBox::createButton: Invalid ButtonRole, button not added");
QMessageBox::question( 0, "", "I've been hit!",QFlag(QMessageBox::Ok | QMessageBox::Cancel),QMessageBox::Save );
+ QCOMPARE(keyToSend, -1);
keyToSend = Qt::Key_Escape;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
QTest::ignoreMessage(QtWarningMsg, "QDialogButtonBox::createButton: Invalid ButtonRole, button not added");
QTest::ignoreMessage(QtWarningMsg, "QDialogButtonBox::createButton: Invalid ButtonRole, button not added");
//do not crash here -> call old function of QMessageBox in this case
QMessageBox::question( 0, "", "I've been hit!",QMessageBox::Ok | QMessageBox::Cancel,QMessageBox::Save | QMessageBox::Cancel,QMessageBox::Ok);
+ QCOMPARE(keyToSend, -1);
}
void tst_QMessageBox::updateSize()
diff --git a/tests/auto/qmovie/animations/corrupt.gif b/tests/auto/qmovie/animations/corrupt.gif
new file mode 100644
index 0000000..c1545eb
--- /dev/null
+++ b/tests/auto/qmovie/animations/corrupt.gif
Binary files differ
diff --git a/tests/auto/qmovie/qmovie.pro b/tests/auto/qmovie/qmovie.pro
index 6973955..855eb9e 100644
--- a/tests/auto/qmovie/qmovie.pro
+++ b/tests/auto/qmovie/qmovie.pro
@@ -12,6 +12,7 @@ wince*: {
DEPLOYMENT += addFiles
}
+RESOURCES += resources.qrc
symbian: {
addFiles.files = animations\\*
diff --git a/tests/auto/qmovie/resources.qrc b/tests/auto/qmovie/resources.qrc
new file mode 100644
index 0000000..ce459a0
--- /dev/null
+++ b/tests/auto/qmovie/resources.qrc
@@ -0,0 +1,5 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file>animations/corrupt.gif</file>
+</qresource>
+</RCC>
diff --git a/tests/auto/qmovie/tst_qmovie.cpp b/tests/auto/qmovie/tst_qmovie.cpp
index 80a551b..d43d4cb 100644
--- a/tests/auto/qmovie/tst_qmovie.cpp
+++ b/tests/auto/qmovie/tst_qmovie.cpp
@@ -72,6 +72,7 @@ private slots:
void jumpToFrame_data();
void jumpToFrame();
void changeMovieFile();
+ void infiniteLoop();
};
// Testing get/set functions
@@ -208,5 +209,17 @@ void tst_QMovie::changeMovieFile()
QVERIFY(movie.currentFrameNumber() == -1);
}
+void tst_QMovie::infiniteLoop()
+{
+ QLabel label;
+ label.show();
+ QMovie *movie = new QMovie(QLatin1String(":animations/corrupt.gif"), QByteArray(), &label);
+ label.setMovie(movie);
+ movie->start();
+
+ QTestEventLoop::instance().enterLoop(1);
+ QTestEventLoop::instance().timeout();
+}
+
QTEST_MAIN(tst_QMovie)
#include "tst_qmovie.moc"
diff --git a/tests/auto/qprogressbar/tst_qprogressbar.cpp b/tests/auto/qprogressbar/tst_qprogressbar.cpp
index 7d94e3c..e042fb8 100644
--- a/tests/auto/qprogressbar/tst_qprogressbar.cpp
+++ b/tests/auto/qprogressbar/tst_qprogressbar.cpp
@@ -179,10 +179,15 @@ void tst_QProgressBar::format()
bar.repainted = false;
bar.setFormat("%v of %m (%p%)");
qApp->processEvents();
+
#ifndef Q_WS_MAC
- // The Mac scroll bar is animated, which means we get paint events all the time.
+ // Animated scroll bars get paint events all the time
+#ifdef Q_OS_WIN
+ if (QSysInfo::WindowsVersion < QSysInfo::WV_VISTA)
+#endif
QVERIFY(!bar.repainted);
#endif
+
QCOMPARE(bar.text(), QString("1 of 10 (10%)"));
bar.setRange(5, 5);
bar.setValue(5);
diff --git a/tests/auto/qsqldatabase/tst_databases.h b/tests/auto/qsqldatabase/tst_databases.h
index 80535df..82ee41a 100644
--- a/tests/auto/qsqldatabase/tst_databases.h
+++ b/tests/auto/qsqldatabase/tst_databases.h
@@ -235,6 +235,8 @@ public:
// addDb( "QPSQL7", "testdb", "testuser", "Ee4Gabf6_", "postgres74-nokia.trolltech.com.au" ); // Version 7.4.19-1.el4_6.1
// addDb( "QPSQL7", "testdb", "testuser", "Ee4Gabf6_", "bq-pgsql81.apac.nokia.com" ); // Version 8.1.11-1.el5_1.1
// addDb( "QPSQL7", "testdb", "testuser", "Ee4Gabf6_", "bq-pgsql84.apac.nokia.com" ); // Version 8.4.1-2.1.i586
+// addDb( "QPSQL7", "testdb", "testuser", "Ee4Gabf6_", "bq-pgsql90.apac.nokia.com" ); // Version 9.0.0
+
// addDb( "QDB2", "testdb", "troll", "trond", "silence.nokia.troll.no" ); // DB2 v9.1 on silence
diff --git a/tests/auto/qstyle/tst_qstyle.cpp b/tests/auto/qstyle/tst_qstyle.cpp
index ba24225..9c754d2 100644
--- a/tests/auto/qstyle/tst_qstyle.cpp
+++ b/tests/auto/qstyle/tst_qstyle.cpp
@@ -413,6 +413,13 @@ void tst_QStyle::testWindowsStyle()
QWindowsStyle wstyle;
testAllFunctions(&wstyle);
lineUpLayoutTest(&wstyle);
+
+ // Tests drawing indeterminate progress with 0 size: QTBUG-15973
+ QStyleOptionProgressBar pb;
+ pb.rect = QRect(0,0,-9,0);
+ QPixmap surface(QSize(200, 200));
+ QPainter painter(&surface);
+ wstyle.drawControl(QStyle::CE_ProgressBar, &pb, &painter, 0);
}
void tst_QStyle::testWindowsXPStyle()
diff --git a/tests/auto/qtextstream/tst_qtextstream.cpp b/tests/auto/qtextstream/tst_qtextstream.cpp
index 4c78ef0..005f686 100644
--- a/tests/auto/qtextstream/tst_qtextstream.cpp
+++ b/tests/auto/qtextstream/tst_qtextstream.cpp
@@ -228,6 +228,7 @@ private slots:
void status_real_read();
void status_integer_read();
void status_word_read();
+ void status_write_error();
// use case tests
void useCase1();
@@ -4176,6 +4177,42 @@ void tst_QTextStream::status_word_read()
QCOMPARE(s.status(), QTextStream::ReadPastEnd);
}
+class FakeBuffer : public QBuffer
+{
+protected:
+ qint64 writeData(const char *c, qint64 i) { return m_lock ? 0 : QBuffer::writeData(c, i); }
+public:
+ FakeBuffer(bool locked = false) : m_lock(locked) {}
+ void setLocked(bool locked) { m_lock = locked; }
+private:
+ bool m_lock;
+};
+
+void tst_QTextStream::status_write_error()
+{
+ FakeBuffer fb(false);
+ QVERIFY(fb.open(QBuffer::ReadWrite));
+ QTextStream fs(&fb);
+ fs.setCodec(QTextCodec::codecForName("latin1"));
+ /* first write some initial content */
+ fs << "hello";
+ fs.flush();
+ QCOMPARE(fs.status(), QTextStream::Ok);
+ QCOMPARE(fb.data(), QByteArray("hello"));
+ /* then test that writing can cause an error */
+ fb.setLocked(true);
+ fs << "error";
+ fs.flush();
+ QCOMPARE(fs.status(), QTextStream::WriteFailed);
+ QCOMPARE(fb.data(), QByteArray("hello"));
+ /* finally test that writing after an error doesn't change the stream any more */
+ fb.setLocked(false);
+ fs << "can't do that";
+ fs.flush();
+ QCOMPARE(fs.status(), QTextStream::WriteFailed);
+ QCOMPARE(fb.data(), QByteArray("hello"));
+}
+
void tst_QTextStream::task180679_alignAccountingStyle()
{
{
diff --git a/tests/auto/qxmlstream/tst_qxmlstream.cpp b/tests/auto/qxmlstream/tst_qxmlstream.cpp
index 19e4b90..9e4f3ec 100644
--- a/tests/auto/qxmlstream/tst_qxmlstream.cpp
+++ b/tests/auto/qxmlstream/tst_qxmlstream.cpp
@@ -574,6 +574,7 @@ private slots:
void checkCommentIndentation() const;
void checkCommentIndentation_data() const;
void qtbug9196_crash() const;
+ void hasError() const;
private:
static QByteArray readFile(const QString &filename);
@@ -1560,5 +1561,86 @@ void tst_QXmlStream::qtbug9196_crash() const
}
}
+class FakeBuffer : public QBuffer
+{
+protected:
+ qint64 writeData(const char *c, qint64 i)
+ {
+ qint64 ai = qMin(m_capacity, i);
+ m_capacity -= ai;
+ return ai ? QBuffer::writeData(c, ai) : 0;
+ }
+public:
+ void setCapacity(int capacity) { m_capacity = capacity; }
+private:
+ qint64 m_capacity;
+};
+
+void tst_QXmlStream::hasError() const
+{
+ {
+ FakeBuffer fb;
+ QVERIFY(fb.open(QBuffer::ReadWrite));
+ fb.setCapacity(1000);
+ QXmlStreamWriter writer(&fb);
+ writer.writeStartDocument();
+ writer.writeEndDocument();
+ QVERIFY(!writer.hasError());
+ QCOMPARE(fb.data(), QByteArray("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"));
+ }
+
+ {
+ // Failure caused by write(QString)
+ FakeBuffer fb;
+ QVERIFY(fb.open(QBuffer::ReadWrite));
+ fb.setCapacity(strlen("<?xml version=\""));
+ QXmlStreamWriter writer(&fb);
+ writer.writeStartDocument();
+ QVERIFY(writer.hasError());
+ QCOMPARE(fb.data(), QByteArray("<?xml version=\""));
+ }
+
+ {
+ // Failure caused by write(char *)
+ FakeBuffer fb;
+ QVERIFY(fb.open(QBuffer::ReadWrite));
+ fb.setCapacity(strlen("<?xml version=\"1.0"));
+ QXmlStreamWriter writer(&fb);
+ writer.writeStartDocument();
+ QVERIFY(writer.hasError());
+ QCOMPARE(fb.data(), QByteArray("<?xml version=\"1.0"));
+ }
+
+ {
+ // Failure caused by write(QStringRef)
+ FakeBuffer fb;
+ QVERIFY(fb.open(QBuffer::ReadWrite));
+ fb.setCapacity(strlen("<?xml version=\"1.0\" encoding=\"UTF-8\"?><test xmlns:"));
+ QXmlStreamWriter writer(&fb);
+ writer.writeStartDocument();
+ writer.writeStartElement("test");
+ writer.writeNamespace("http://foo.bar", "foo");
+ QVERIFY(writer.hasError());
+ QCOMPARE(fb.data(), QByteArray("<?xml version=\"1.0\" encoding=\"UTF-8\"?><test xmlns:"));
+ }
+
+ {
+ // Refusal to write after 1st failure
+ FakeBuffer fb;
+ QVERIFY(fb.open(QBuffer::ReadWrite));
+ fb.setCapacity(10);
+ QXmlStreamWriter writer(&fb);
+ writer.writeStartDocument();
+ QVERIFY(writer.hasError());
+ QCOMPARE(fb.data(), QByteArray("<?xml vers"));
+ fb.setCapacity(1000);
+ writer.writeStartElement("test"); // literal & qstring
+ writer.writeNamespace("http://foo.bar", "foo"); // literal & qstringref
+ QVERIFY(writer.hasError());
+ QCOMPARE(fb.data(), QByteArray("<?xml vers"));
+ }
+
+}
+
#include "tst_qxmlstream.moc"
// vim: et:ts=4:sw=4:sts=4
diff --git a/tests/benchmarks/corelib/thread/qmutex/qmutex.pro b/tests/benchmarks/corelib/thread/qmutex/qmutex.pro
index eda2f11..8fda5fa 100644
--- a/tests/benchmarks/corelib/thread/qmutex/qmutex.pro
+++ b/tests/benchmarks/corelib/thread/qmutex/qmutex.pro
@@ -1,6 +1,6 @@
load(qttest_p4)
TEMPLATE = app
TARGET = tst_bench_qmutex
-
+QT -= gui
SOURCES += tst_qmutex.cpp
diff --git a/tests/benchmarks/corelib/thread/qmutex/tst_qmutex.cpp b/tests/benchmarks/corelib/thread/qmutex/tst_qmutex.cpp
index fded508..b0c5702 100644
--- a/tests/benchmarks/corelib/thread/qmutex/tst_qmutex.cpp
+++ b/tests/benchmarks/corelib/thread/qmutex/tst_qmutex.cpp
@@ -39,34 +39,93 @@
**
****************************************************************************/
-#include <qtest.h>
-#include <QtCore>
+#include <QtCore/QtCore>
+#include <QtTest/QtTest>
#include <math.h>
-//TESTED_FILES=
+#ifdef Q_OS_UNIX
+# include <pthread.h>
+# include <errno.h>
+typedef pthread_mutex_t NativeMutexType;
+void NativeMutexInitialize(NativeMutexType *mutex)
+{
+ pthread_mutex_init(mutex, NULL);
+}
+void NativeMutexDestroy(NativeMutexType *mutex)
+{
+ pthread_mutex_destroy(mutex);
+}
+void NativeMutexLock(NativeMutexType *mutex)
+{
+ pthread_mutex_lock(mutex);
+}
+void NativeMutexUnlock(NativeMutexType *mutex)
+{
+ pthread_mutex_unlock(mutex);
+}
+#elif defined(Q_OS_WIN)
+# define _WIN32_WINNT 0x0400
+# include <windows.h>
+typedef CRITICAL_SECTION NativeMutexType;
+void NativeMutexInitialize(NativeMutexType *mutex)
+{
+ InitializeCriticalSection(mutex);
+}
+void NativeMutexDestroy(NativeMutexType *mutex)
+{
+ DeleteCriticalSection(mutex);
+}
+void NativeMutexLock(NativeMutexType *mutex)
+{
+ EnterCriticalSection(mutex);
+}
+void NativeMutexUnlock(NativeMutexType *mutex)
+{
+ LeaveCriticalSection(mutex);
+}
+#endif
+//TESTED_FILES=
class tst_QMutex : public QObject
{
Q_OBJECT
+ int threadCount;
+
public:
- tst_QMutex();
- virtual ~tst_QMutex();
+ // barriers for the contended tests
+ static QSemaphore semaphore1, semaphore2, semaphore3, semaphore4;
+
+ tst_QMutex()
+ {
+ // at least 2 threads, even on single cpu/core machines
+ threadCount = qMax(2, QThread::idealThreadCount());
+ qDebug("thread count: %d", threadCount);
+ }
private slots:
void noThread_data();
void noThread();
-};
-tst_QMutex::tst_QMutex()
-{
-}
+ void uncontendedNative();
+ void uncontendedQMutex();
+ void uncontendedQMutexLocker();
-tst_QMutex::~tst_QMutex()
-{
-}
+ void contendedNative_data();
+ void contendedQMutex_data() { contendedNative_data(); }
+ void contendedQMutexLocker_data() { contendedNative_data(); }
+
+ void contendedNative();
+ void contendedQMutex();
+ void contendedQMutexLocker();
+};
+
+QSemaphore tst_QMutex::semaphore1;
+QSemaphore tst_QMutex::semaphore2;
+QSemaphore tst_QMutex::semaphore3;
+QSemaphore tst_QMutex::semaphore4;
void tst_QMutex::noThread_data()
{
@@ -127,5 +186,248 @@ void tst_QMutex::noThread()
QCOMPARE(int(count), N);
}
+void tst_QMutex::uncontendedNative()
+{
+ NativeMutexType mutex;
+ NativeMutexInitialize(&mutex);
+ QBENCHMARK {
+ NativeMutexLock(&mutex);
+ NativeMutexUnlock(&mutex);
+ }
+ NativeMutexDestroy(&mutex);
+}
+
+void tst_QMutex::uncontendedQMutex()
+{
+ QMutex mutex;
+ QBENCHMARK {
+ mutex.lock();
+ mutex.unlock();
+ }
+}
+
+void tst_QMutex::uncontendedQMutexLocker()
+{
+ QMutex mutex;
+ QBENCHMARK {
+ QMutexLocker locker(&mutex);
+ }
+}
+
+void tst_QMutex::contendedNative_data()
+{
+ QTest::addColumn<int>("iterations");
+ QTest::addColumn<int>("msleepDuration");
+ QTest::addColumn<bool>("use2mutexes");
+
+ QTest::newRow("baseline") << 0 << -1 << false;
+
+ QTest::newRow("no msleep, 1 mutex") << 1000 << -1 << false;
+ QTest::newRow("no msleep, 2 mutexes") << 1000 << -1 << true;
+ QTest::newRow("msleep(0), 1 mutex") << 1000 << 0 << false;
+ QTest::newRow("msleep(0), 2 mutexes") << 1000 << 0 << true;
+ QTest::newRow("msleep(1), 1 mutex") << 10 << 1 << false;
+ QTest::newRow("msleep(1), 2 mutexes") << 10 << 1 << true;
+ QTest::newRow("msleep(2), 1 mutex") << 10 << 2 << false;
+ QTest::newRow("msleep(2), 2 mutexes") << 10 << 2 << true;
+ QTest::newRow("msleep(10), 1 mutex") << 10 << 10 << false;
+ QTest::newRow("msleep(10), 2 mutexes") << 10 << 10 << true;
+}
+
+class NativeMutexThread : public QThread
+{
+ NativeMutexType *mutex1, *mutex2;
+ int iterations, msleepDuration;
+ bool use2mutexes;
+public:
+ bool done;
+ NativeMutexThread(NativeMutexType *mutex1, NativeMutexType *mutex2, int iterations, int msleepDuration, bool use2mutexes)
+ : mutex1(mutex1), mutex2(mutex2), iterations(iterations), msleepDuration(msleepDuration), use2mutexes(use2mutexes), done(false)
+ { }
+ void run() {
+ forever {
+ tst_QMutex::semaphore1.release();
+ tst_QMutex::semaphore2.acquire();
+ if (done)
+ break;
+ for (int i = 0; i < iterations; ++i) {
+ NativeMutexLock(mutex1);
+ if (use2mutexes)
+ NativeMutexLock(mutex2);
+ if (msleepDuration >= 0)
+ msleep(msleepDuration);
+ if (use2mutexes)
+ NativeMutexUnlock(mutex2);
+ NativeMutexUnlock(mutex1);
+
+ QThread::yieldCurrentThread();
+ }
+ tst_QMutex::semaphore3.release();
+ tst_QMutex::semaphore4.acquire();
+ }
+ }
+};
+
+void tst_QMutex::contendedNative()
+{
+ QFETCH(int, iterations);
+ QFETCH(int, msleepDuration);
+ QFETCH(bool, use2mutexes);
+
+ NativeMutexType mutex1, mutex2;
+ NativeMutexInitialize(&mutex1);
+ NativeMutexInitialize(&mutex2);
+
+ QVector<NativeMutexThread *> threads(threadCount);
+ for (int i = 0; i < threads.count(); ++i) {
+ threads[i] = new NativeMutexThread(&mutex1, &mutex2, iterations, msleepDuration, use2mutexes);
+ threads[i]->start();
+ }
+
+ QBENCHMARK {
+ semaphore1.acquire(threadCount);
+ semaphore2.release(threadCount);
+ semaphore3.acquire(threadCount);
+ semaphore4.release(threadCount);
+ }
+
+ for (int i = 0; i < threads.count(); ++i)
+ threads[i]->done = true;
+ semaphore1.acquire(threadCount);
+ semaphore2.release(threadCount);
+ for (int i = 0; i < threads.count(); ++i)
+ threads[i]->wait();
+ qDeleteAll(threads);
+
+ NativeMutexDestroy(&mutex1);
+ NativeMutexDestroy(&mutex2);
+}
+
+class QMutexThread : public QThread
+{
+ QMutex *mutex1, *mutex2;
+ int iterations, msleepDuration;
+ bool use2mutexes;
+public:
+ bool done;
+ QMutexThread(QMutex *mutex1, QMutex *mutex2, int iterations, int msleepDuration, bool use2mutexes)
+ : mutex1(mutex1), mutex2(mutex2), iterations(iterations), msleepDuration(msleepDuration), use2mutexes(use2mutexes), done(false)
+ { }
+ void run() {
+ forever {
+ tst_QMutex::semaphore1.release();
+ tst_QMutex::semaphore2.acquire();
+ if (done)
+ break;
+ for (int i = 0; i < iterations; ++i) {
+ mutex1->lock();
+ if (use2mutexes)
+ mutex2->lock();
+ if (msleepDuration >= 0)
+ msleep(msleepDuration);
+ if (use2mutexes)
+ mutex2->unlock();
+ mutex1->unlock();
+
+ QThread::yieldCurrentThread();
+ }
+ tst_QMutex::semaphore3.release();
+ tst_QMutex::semaphore4.acquire();
+ }
+ }
+};
+
+void tst_QMutex::contendedQMutex()
+{
+ QFETCH(int, iterations);
+ QFETCH(int, msleepDuration);
+ QFETCH(bool, use2mutexes);
+
+ QMutex mutex1, mutex2;
+
+ QVector<QMutexThread *> threads(threadCount);
+ for (int i = 0; i < threads.count(); ++i) {
+ threads[i] = new QMutexThread(&mutex1, &mutex2, iterations, msleepDuration, use2mutexes);
+ threads[i]->start();
+ }
+
+ QBENCHMARK {
+ semaphore1.acquire(threadCount);
+ semaphore2.release(threadCount);
+ semaphore3.acquire(threadCount);
+ semaphore4.release(threadCount);
+ }
+
+ for (int i = 0; i < threads.count(); ++i)
+ threads[i]->done = true;
+ semaphore1.acquire(threadCount);
+ semaphore2.release(threadCount);
+ for (int i = 0; i < threads.count(); ++i)
+ threads[i]->wait();
+ qDeleteAll(threads);
+}
+
+class QMutexLockerThread : public QThread
+{
+ QMutex *mutex1, *mutex2;
+ int iterations, msleepDuration;
+ bool use2mutexes;
+public:
+ bool done;
+ QMutexLockerThread(QMutex *mutex1, QMutex *mutex2, int iterations, int msleepDuration, bool use2mutexes)
+ : mutex1(mutex1), mutex2(mutex2), iterations(iterations), msleepDuration(msleepDuration), use2mutexes(use2mutexes), done(false)
+ { }
+ void run() {
+ forever {
+ tst_QMutex::semaphore1.release();
+ tst_QMutex::semaphore2.acquire();
+ if (done)
+ break;
+ for (int i = 0; i < iterations; ++i) {
+ {
+ QMutexLocker locker1(mutex1);
+ QMutexLocker locker2(use2mutexes ? mutex2 : 0);
+ if (msleepDuration >= 0)
+ msleep(msleepDuration);
+ }
+
+ QThread::yieldCurrentThread();
+ }
+ tst_QMutex::semaphore3.release();
+ tst_QMutex::semaphore4.acquire();
+ }
+ }
+};
+
+void tst_QMutex::contendedQMutexLocker()
+{
+ QFETCH(int, iterations);
+ QFETCH(int, msleepDuration);
+ QFETCH(bool, use2mutexes);
+
+ QMutex mutex1, mutex2;
+
+ QVector<QMutexLockerThread *> threads(threadCount);
+ for (int i = 0; i < threads.count(); ++i) {
+ threads[i] = new QMutexLockerThread(&mutex1, &mutex2, iterations, msleepDuration, use2mutexes);
+ threads[i]->start();
+ }
+
+ QBENCHMARK {
+ semaphore1.acquire(threadCount);
+ semaphore2.release(threadCount);
+ semaphore3.acquire(threadCount);
+ semaphore4.release(threadCount);
+ }
+
+ for (int i = 0; i < threads.count(); ++i)
+ threads[i]->done = true;
+ semaphore1.acquire(threadCount);
+ semaphore2.release(threadCount);
+ for (int i = 0; i < threads.count(); ++i)
+ threads[i]->wait();
+ qDeleteAll(threads);
+}
+
QTEST_MAIN(tst_QMutex)
#include "tst_qmutex.moc"
diff --git a/tests/shared/filesystem.h b/tests/shared/filesystem.h
index 8274346..4775671 100644
--- a/tests/shared/filesystem.h
+++ b/tests/shared/filesystem.h
@@ -55,6 +55,9 @@
#define IO_REPARSE_TAG_MOUNT_POINT (0xA0000003L)
#endif
#define REPARSE_MOUNTPOINT_HEADER_SIZE 8
+#ifndef FSCTL_SET_REPARSE_POINT
+#define FSCTL_SET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 41, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
+#endif
#endif
struct FileSystem
diff --git a/tools/assistant/lib/fulltextsearch/qanalyzer.cpp b/tools/assistant/lib/fulltextsearch/qanalyzer.cpp
index 835b72e..56eae69 100644
--- a/tools/assistant/lib/fulltextsearch/qanalyzer.cpp
+++ b/tools/assistant/lib/fulltextsearch/qanalyzer.cpp
@@ -96,6 +96,11 @@ QCLuceneStandardAnalyzer::QCLuceneStandardAnalyzer(const QStringList &stopWords)
tArray[stopWords.count()] = 0;
d->analyzer = new lucene::analysis::standard::StandardAnalyzer(tArray);
+
+ for (int i = 0; i < stopWords.count(); ++i)
+ delete [] tArray[i];
+
+ delete [] tArray;
}
@@ -147,6 +152,11 @@ QCLuceneStopAnalyzer::QCLuceneStopAnalyzer(const QStringList &stopWords)
tArray[stopWords.count()] = 0;
d->analyzer = new lucene::analysis::StopAnalyzer(tArray);
+
+ for (int i = 0; i < stopWords.count(); ++i)
+ delete [] tArray[i];
+
+ delete [] tArray;
}
QStringList QCLuceneStopAnalyzer::englishStopWords() const
diff --git a/tools/assistant/tools/assistant/main.cpp b/tools/assistant/tools/assistant/main.cpp
index e3eef34..5883f7b 100644
--- a/tools/assistant/tools/assistant/main.cpp
+++ b/tools/assistant/tools/assistant/main.cpp
@@ -292,7 +292,8 @@ void setupTranslation(const QString &fileName, const QString &dir)
QTranslator *translator = new QTranslator(QCoreApplication::instance());
if (translator->load(fileName, dir)) {
QCoreApplication::installTranslator(translator);
- } else if (!fileName.endsWith(QLatin1String("en_US"))) {
+ } else if (!fileName.endsWith(QLatin1String("en_US"))
+ && !fileName.endsWith(QLatin1String("_C"))) {
qWarning("Could not load translation file %s in directory %s.",
qPrintable(fileName), qPrintable(dir));
}
diff --git a/tools/runonphone/serenum_unix.cpp b/tools/runonphone/serenum_unix.cpp
index f5b2521..f5b616b 100644
--- a/tools/runonphone/serenum_unix.cpp
+++ b/tools/runonphone/serenum_unix.cpp
@@ -82,7 +82,7 @@ QList<SerialPortId> enumerateSerialPorts(int loglevel)
for (struct usb_bus *bus = usb_get_busses(); bus; bus = bus->next) {
for (struct usb_device *device = bus->devices; device; device = device->next) {
- for (int n = 0; n < device->descriptor.bNumConfigurations; ++n) {
+ for (int n = 0; n < device->descriptor.bNumConfigurations && device->config; ++n) {
struct usb_config_descriptor &usbConfig =device->config[n];
QList<int> usableInterfaces;
for (int m = 0; m < usbConfig.bNumInterfaces; ++m) {
@@ -146,6 +146,10 @@ QList<SerialPortId> enumerateSerialPorts(int loglevel)
// second loop to find the actual data interface.
foreach (int i, usableInterfaces) {
+#ifdef Q_OS_MAC
+ eligibleInterfaces << QString("^cu\\.usbmodem.*%1$")
+ .arg(QString("%1").arg(descriptor.bInterfaceNumber, 1, 16).toUpper());
+#else
// ### manufacturer and product strings are only readable as root :(
if (!manufacturerString.isEmpty() && !productString.isEmpty()) {
eligibleInterfaces << QString("usb-%1_%2-if%3")
@@ -155,6 +159,7 @@ QList<SerialPortId> enumerateSerialPorts(int loglevel)
} else {
eligibleInterfaces << QString("if%1").arg(i, 2, 16, QChar('0')); // fix!
}
+#endif
}
eligibleInterfacesInfo << InterfaceInfo(manufacturerString, productString, device->descriptor.idVendor, device->descriptor.idProduct);
}
@@ -164,14 +169,24 @@ QList<SerialPortId> enumerateSerialPorts(int loglevel)
if (loglevel > 1)
qDebug() << " searching for interfaces:" << eligibleInterfaces;
+#ifdef Q_OS_MAC
+ QDir dir("/dev/");
+ bool allowAny = false;
+#else
QDir dir("/dev/serial/by-id/");
- foreach (const QFileInfo &info, dir.entryInfoList()) {
+ bool allowAny = eligibleInterfaces.isEmpty();
+#endif
+ foreach (const QFileInfo &info, dir.entryInfoList(QDir::System)) {
if (!info.isDir()) {
- bool usable = eligibleInterfaces.isEmpty();
+ bool usable = allowAny;
+ QString friendlyName = info.fileName();
foreach (const QString &iface, eligibleInterfaces) {
- if (info.fileName().contains(iface)) {
+ if (info.fileName().contains(QRegExp(iface))) {
if (loglevel > 1)
qDebug() << " found device file:" << info.fileName() << endl;
+#ifdef Q_OS_MAC
+ friendlyName = eligibleInterfacesInfo[eligibleInterfaces.indexOf(iface)].product;
+#endif
usable = true;
break;
}
@@ -180,7 +195,7 @@ QList<SerialPortId> enumerateSerialPorts(int loglevel)
continue;
SerialPortId id;
- id.friendlyName = info.fileName();
+ id.friendlyName = friendlyName;
id.portName = info.canonicalFilePath();
list << id;
}
@@ -193,11 +208,15 @@ QList<SerialPortId> enumerateSerialPorts(int loglevel)
<< iface.manufacturer
<< "Product:"
<< iface.product
+#ifdef Q_OS_LINUX
<< endl
<< " Load generic driver using:"
<< QString("sudo modprobe usbserial vendor=0x%1 product=0x%2")
.arg(iface.manufacturerid, 4, 16, QChar('0'))
.arg(iface.productid, 4, 16, QChar('0'));
+#else
+ ;
+#endif
}
}
return list;