summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2014-02-26 13:55:25 +0200
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2014-02-26 13:57:49 +0200
commitd6e8b26e2e5441750f342da4f78c6aa1be1ea452 (patch)
treeffe94467846662cd161a966008b5e2046dcb6638
parentb368e57e59351736f9ad06834a743a7c1b49d368 (diff)
parentcd334eb5eb93314a958dd58a0df57adcd2a198c5 (diff)
Merge branch 'develop'
-rw-r--r--.qmake.conf4
-rw-r--r--README16
-rw-r--r--examples/bars/doc/images/bars-example.pngbin135242 -> 0 bytes
-rw-r--r--examples/datavisualization/audiolevels/audiolevels.cpp (renamed from examples/audiolevels/audiolevels.cpp)4
-rw-r--r--examples/datavisualization/audiolevels/audiolevels.h (renamed from examples/audiolevels/audiolevels.h)0
-rw-r--r--examples/datavisualization/audiolevels/audiolevels.pro (renamed from examples/audiolevels/audiolevels.pro)3
-rw-r--r--examples/datavisualization/audiolevels/audiolevelsiodevice.cpp (renamed from examples/audiolevels/audiolevelsiodevice.cpp)2
-rw-r--r--examples/datavisualization/audiolevels/audiolevelsiodevice.h (renamed from examples/audiolevels/audiolevelsiodevice.h)2
-rw-r--r--examples/datavisualization/audiolevels/doc/images/audiolevels-example.png (renamed from examples/audiolevels/doc/images/audiolevels-example.png)bin120978 -> 120978 bytes
-rw-r--r--examples/datavisualization/audiolevels/doc/src/audiolevels.qdoc (renamed from examples/audiolevels/doc/src/audiolevels.qdoc)14
-rw-r--r--examples/datavisualization/audiolevels/main.cpp (renamed from examples/audiolevels/main.cpp)4
-rw-r--r--examples/datavisualization/bars/bars.pro (renamed from examples/bars/bars.pro)2
-rw-r--r--examples/datavisualization/bars/doc/images/bars-example.pngbin0 -> 151337 bytes
-rw-r--r--examples/datavisualization/bars/doc/src/bars.qdoc (renamed from examples/bars/doc/src/bars.qdoc)37
-rw-r--r--examples/datavisualization/bars/graphmodifier.cpp (renamed from examples/bars/graphmodifier.cpp)26
-rw-r--r--examples/datavisualization/bars/graphmodifier.h (renamed from examples/bars/graphmodifier.h)9
-rw-r--r--examples/datavisualization/bars/main.cpp (renamed from examples/bars/main.cpp)41
-rw-r--r--examples/datavisualization/custominput/custominput.pro (renamed from examples/custominput/custominput.pro)2
-rw-r--r--examples/datavisualization/custominput/custominput.qrc (renamed from examples/custominput/custominput.qrc)0
-rw-r--r--examples/datavisualization/custominput/custominputhandler.cpp (renamed from examples/custominput/custominputhandler.cpp)0
-rw-r--r--examples/datavisualization/custominput/custominputhandler.h (renamed from examples/custominput/custominputhandler.h)0
-rw-r--r--examples/datavisualization/custominput/data/data.txt (renamed from examples/custominput/data/data.txt)0
-rw-r--r--examples/datavisualization/custominput/doc/images/custominput-example.png (renamed from examples/custominput/doc/images/custominput-example.png)bin62422 -> 62422 bytes
-rw-r--r--examples/datavisualization/custominput/doc/src/custominput.qdoc (renamed from examples/custominput/doc/src/custominput.qdoc)12
-rw-r--r--examples/datavisualization/custominput/main.cpp (renamed from examples/custominput/main.cpp)22
-rw-r--r--examples/datavisualization/custominput/scatterdatamodifier.cpp (renamed from examples/custominput/scatterdatamodifier.cpp)4
-rw-r--r--examples/datavisualization/custominput/scatterdatamodifier.h (renamed from examples/custominput/scatterdatamodifier.h)6
-rw-r--r--examples/datavisualization/customproxy/customproxy.pro (renamed from examples/customproxy/customproxy.pro)8
-rw-r--r--examples/datavisualization/customproxy/customproxy.qrc (renamed from examples/customproxy/customproxy.qrc)0
-rw-r--r--examples/datavisualization/customproxy/data/raindata.txt (renamed from examples/customproxy/data/raindata.txt)0
-rw-r--r--examples/datavisualization/customproxy/doc/images/customproxy-example.png (renamed from examples/customproxy/doc/images/customproxy-example.png)bin125698 -> 125698 bytes
-rw-r--r--examples/datavisualization/customproxy/doc/src/customproxy.qdoc (renamed from examples/customproxy/doc/src/customproxy.qdoc)26
-rw-r--r--examples/datavisualization/customproxy/main.cpp (renamed from examples/customproxy/main.cpp)2
-rw-r--r--examples/datavisualization/customproxy/rainfallgraph.cpp (renamed from examples/customproxy/rainfallgraph.cpp)10
-rw-r--r--examples/datavisualization/customproxy/rainfallgraph.h (renamed from examples/customproxy/rainfallgraph.h)0
-rw-r--r--examples/datavisualization/customproxy/variantbardatamapping.cpp (renamed from examples/customproxy/variantbardatamapping.cpp)0
-rw-r--r--examples/datavisualization/customproxy/variantbardatamapping.h (renamed from examples/customproxy/variantbardatamapping.h)2
-rw-r--r--examples/datavisualization/customproxy/variantbardataproxy.cpp (renamed from examples/customproxy/variantbardataproxy.cpp)0
-rw-r--r--examples/datavisualization/customproxy/variantbardataproxy.h (renamed from examples/customproxy/variantbardataproxy.h)6
-rw-r--r--examples/datavisualization/customproxy/variantdataset.cpp (renamed from examples/customproxy/variantdataset.cpp)0
-rw-r--r--examples/datavisualization/customproxy/variantdataset.h (renamed from examples/customproxy/variantdataset.h)4
-rw-r--r--examples/datavisualization/datavisualization.pro21
-rw-r--r--examples/datavisualization/examples.pri14
-rw-r--r--examples/datavisualization/itemmodel/doc/images/itemmodel-example-2.png (renamed from examples/itemmodel/doc/images/itemmodel-example-2.png)bin78536 -> 78536 bytes
-rw-r--r--examples/datavisualization/itemmodel/doc/images/itemmodel-example.png (renamed from examples/itemmodel/doc/images/itemmodel-example.png)bin45381 -> 45381 bytes
-rw-r--r--examples/datavisualization/itemmodel/doc/src/itemmodel.qdoc (renamed from examples/itemmodel/doc/src/itemmodel.qdoc)34
-rw-r--r--examples/datavisualization/itemmodel/itemmodel.pro (renamed from examples/itemmodel/itemmodel.pro)2
-rw-r--r--examples/datavisualization/itemmodel/main.cpp (renamed from examples/itemmodel/main.cpp)21
-rw-r--r--examples/datavisualization/qmlbars/doc/images/qmlbars-example.png (renamed from examples/qmlbars/doc/images/qmlbars-example.png)bin149167 -> 149167 bytes
-rw-r--r--examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc (renamed from examples/qmlbars/doc/src/qmlbars.qdoc)18
-rw-r--r--examples/datavisualization/qmlbars/main.cpp (renamed from examples/qmlbars/main.cpp)30
-rw-r--r--examples/datavisualization/qmlbars/qml/qmlbars/Axes.qml (renamed from examples/qmlbars/qml/qmlbars/axes.qml)0
-rw-r--r--examples/datavisualization/qmlbars/qml/qmlbars/Data.qml (renamed from examples/qmlbars/qml/qmlbars/data.qml)0
-rw-r--r--examples/datavisualization/qmlbars/qml/qmlbars/main.qml (renamed from examples/qmlbars/qml/qmlbars/main.qml)2
-rw-r--r--examples/datavisualization/qmlbars/qmlbars.pro12
-rw-r--r--examples/datavisualization/qmlbars/qmlbars.qrc7
-rw-r--r--examples/datavisualization/qmlcustominput/doc/images/qmlcustominput-example.pngbin0 -> 73150 bytes
-rw-r--r--examples/datavisualization/qmlcustominput/doc/src/qmlcustominput.qdoc (renamed from examples/qmlcustominput/doc/src/qmlcustominput.qdoc)22
-rw-r--r--examples/datavisualization/qmlcustominput/main.cpp (renamed from examples/qmlcustominput/main.cpp)31
-rw-r--r--examples/datavisualization/qmlcustominput/qml/qmlcustominput/Data.qml (renamed from examples/qmlcustominput/qml/qmlcustominput/data.qml)12
-rw-r--r--examples/datavisualization/qmlcustominput/qml/qmlcustominput/NewButton.qml (renamed from examples/qmlcustominput/qml/qmlcustominput/newbutton.qml)0
-rw-r--r--examples/datavisualization/qmlcustominput/qml/qmlcustominput/main.qml (renamed from examples/qmlcustominput/qml/qmlcustominput/main.qml)36
-rw-r--r--examples/datavisualization/qmlcustominput/qmlcustominput.pro12
-rw-r--r--examples/datavisualization/qmlcustominput/qmlcustominput.qrc7
-rw-r--r--examples/datavisualization/qmllegend/doc/images/qmllegend-example.png (renamed from examples/qmllegend/doc/images/qmllegend-example.png)bin98023 -> 98023 bytes
-rw-r--r--examples/datavisualization/qmllegend/doc/src/qmllegend.qdoc (renamed from examples/qmllegend/doc/src/qmllegend.qdoc)12
-rw-r--r--examples/datavisualization/qmllegend/main.cpp (renamed from examples/qmllegend/main.cpp)31
-rw-r--r--examples/datavisualization/qmllegend/qml/qmllegend/Data.qml (renamed from examples/qmllegend/qml/qmllegend/data.qml)0
-rw-r--r--examples/datavisualization/qmllegend/qml/qmllegend/LegendItem.qml (renamed from examples/qmllegend/qml/qmllegend/legenditem.qml)0
-rw-r--r--examples/datavisualization/qmllegend/qml/qmllegend/NewButton.qml (renamed from examples/qmllegend/qml/qmllegend/newbutton.qml)0
-rw-r--r--examples/datavisualization/qmllegend/qml/qmllegend/main.qml (renamed from examples/qmllegend/qml/qmllegend/main.qml)2
-rw-r--r--examples/datavisualization/qmllegend/qmllegend.pro13
-rw-r--r--examples/datavisualization/qmllegend/qmllegend.qrc8
-rw-r--r--examples/datavisualization/qmlmultigraph/doc/images/qmlmultigraph-example.pngbin0 -> 82347 bytes
-rw-r--r--examples/datavisualization/qmlmultigraph/doc/src/qmlmultigraph.qdoc (renamed from examples/qmlmultigraph/doc/src/qmlmultigraph.qdoc)11
-rw-r--r--examples/datavisualization/qmlmultigraph/main.cpp (renamed from examples/qmlmultigraph/main.cpp)33
-rw-r--r--examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/Data.qml48
-rw-r--r--examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/NewButton.qml (renamed from examples/qmlmultigraph/qml/qmlmultigraph/newbutton.qml)0
-rw-r--r--examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/main.qml210
-rw-r--r--examples/datavisualization/qmlmultigraph/qmlmultigraph.pro12
-rw-r--r--examples/datavisualization/qmlmultigraph/qmlmultigraph.qrc7
-rw-r--r--examples/datavisualization/qmloscilloscope/datasource.cpp172
-rw-r--r--examples/datavisualization/qmloscilloscope/datasource.h54
-rw-r--r--examples/datavisualization/qmloscilloscope/doc/images/qmloscilloscope-example.pngbin0 -> 134021 bytes
-rw-r--r--examples/datavisualization/qmloscilloscope/doc/src/qmloscilloscope.qdoc126
-rw-r--r--examples/datavisualization/qmloscilloscope/main.cpp65
-rw-r--r--examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/NewButton.qml (renamed from examples/qmlscatter/qml/qmlscatter/newbutton.qml)0
-rw-r--r--examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml306
-rw-r--r--examples/datavisualization/qmloscilloscope/qmloscilloscope.pro16
-rw-r--r--examples/datavisualization/qmloscilloscope/qmloscilloscope.qrc6
-rw-r--r--examples/datavisualization/qmlscatter/doc/images/qmlscatter-example.png (renamed from examples/qmlscatter/doc/images/qmlscatter-example.png)bin98086 -> 98086 bytes
-rw-r--r--examples/datavisualization/qmlscatter/doc/src/qmlscatter.qdoc (renamed from examples/qmlscatter/doc/src/qmlscatter.qdoc)110
-rw-r--r--examples/datavisualization/qmlscatter/main.cpp (renamed from examples/qmlscatter/main.cpp)46
-rw-r--r--examples/datavisualization/qmlscatter/qml/qmlscatter/Data.qml (renamed from examples/qmlscatter/qml/qmlscatter/data.qml)0
-rw-r--r--examples/datavisualization/qmlscatter/qml/qmlscatter/NewButton.qml (renamed from examples/qmlsurface/qml/qmlsurface/newbutton.qml)0
-rw-r--r--examples/datavisualization/qmlscatter/qml/qmlscatter/main.qml (renamed from examples/qmlscatter/qml/qmlscatter/main.qml)2
-rw-r--r--examples/datavisualization/qmlscatter/qmlscatter.pro12
-rw-r--r--examples/datavisualization/qmlscatter/qmlscatter.qrc7
-rw-r--r--examples/datavisualization/qmlsurface/doc/images/qmlsurface-example.pngbin0 -> 334593 bytes
-rw-r--r--examples/datavisualization/qmlsurface/doc/src/qmlsurface.qdoc (renamed from examples/qmlsurface/doc/src/qmlsurface.qdoc)20
-rw-r--r--examples/datavisualization/qmlsurface/heightmap.png (renamed from examples/qmlsurface/heightmap.png)bin38634 -> 38634 bytes
-rw-r--r--examples/datavisualization/qmlsurface/main.cpp (renamed from examples/qmlsurface/main.cpp)29
-rw-r--r--examples/datavisualization/qmlsurface/qml/qmlsurface/Data.qml (renamed from examples/qmlsurface/qml/qmlsurface/data.qml)0
-rw-r--r--examples/datavisualization/qmlsurface/qml/qmlsurface/NewButton.qml52
-rw-r--r--examples/datavisualization/qmlsurface/qml/qmlsurface/main.qml (renamed from examples/qmlsurface/qml/qmlsurface/main.qml)104
-rw-r--r--examples/datavisualization/qmlsurface/qmlsurface.pro12
-rw-r--r--examples/datavisualization/qmlsurface/qmlsurface.qrc10
-rw-r--r--examples/datavisualization/qmlsurfacelayers/doc/images/qmlsurfacelayers-example.pngbin0 -> 91579 bytes
-rw-r--r--examples/datavisualization/qmlsurfacelayers/doc/src/qmlsurfacelayers.qdoc80
-rw-r--r--examples/datavisualization/qmlsurfacelayers/layer_1.png (renamed from examples/surface/mountain.png)bin34540 -> 34540 bytes
-rw-r--r--examples/datavisualization/qmlsurfacelayers/layer_2.pngbin0 -> 10553 bytes
-rw-r--r--examples/datavisualization/qmlsurfacelayers/layer_3.pngbin0 -> 13022 bytes
-rw-r--r--examples/datavisualization/qmlsurfacelayers/main.cpp52
-rw-r--r--examples/datavisualization/qmlsurfacelayers/qml/qmlsurfacelayers/NewButton.qml52
-rw-r--r--examples/datavisualization/qmlsurfacelayers/qml/qmlsurfacelayers/main.qml278
-rw-r--r--examples/datavisualization/qmlsurfacelayers/qmlsurfacelayers.pro12
-rw-r--r--examples/datavisualization/qmlsurfacelayers/qmlsurfacelayers.qrc11
-rw-r--r--examples/datavisualization/rotations/doc/images/rotations-example.pngbin0 -> 69487 bytes
-rw-r--r--examples/datavisualization/rotations/doc/src/rotations.qdoc68
-rw-r--r--examples/datavisualization/rotations/main.cpp87
-rw-r--r--examples/datavisualization/rotations/mesh/largesphere.obj1938
-rw-r--r--examples/datavisualization/rotations/mesh/narrowarrow.obj413
-rw-r--r--examples/datavisualization/rotations/rotations.pro13
-rw-r--r--examples/datavisualization/rotations/rotations.qrc6
-rw-r--r--examples/datavisualization/rotations/scatterdatamodifier.cpp183
-rw-r--r--examples/datavisualization/rotations/scatterdatamodifier.h56
-rw-r--r--examples/datavisualization/scatter/doc/images/scatter-example.pngbin0 -> 142496 bytes
-rw-r--r--examples/datavisualization/scatter/doc/src/scatter.qdoc (renamed from examples/scatter/doc/src/scatter.qdoc)39
-rw-r--r--examples/datavisualization/scatter/main.cpp (renamed from examples/scatter/main.cpp)28
-rw-r--r--examples/datavisualization/scatter/scatter.pro (renamed from examples/scatter/scatter.pro)2
-rw-r--r--examples/datavisualization/scatter/scatterdatamodifier.cpp (renamed from examples/scatter/scatterdatamodifier.cpp)43
-rw-r--r--examples/datavisualization/scatter/scatterdatamodifier.h (renamed from examples/scatter/scatterdatamodifier.h)3
-rw-r--r--examples/datavisualization/surface/doc/images/surface-example.png (renamed from examples/surface/doc/images/surface-example.png)bin149046 -> 149046 bytes
-rw-r--r--examples/datavisualization/surface/doc/src/surface.qdoc (renamed from examples/surface/doc/src/surface.qdoc)36
-rw-r--r--examples/datavisualization/surface/main.cpp (renamed from examples/surface/main.cpp)1
-rw-r--r--examples/datavisualization/surface/mountain.pngbin0 -> 34540 bytes
-rw-r--r--examples/datavisualization/surface/surface.pro (renamed from examples/surface/surface.pro)2
-rw-r--r--examples/datavisualization/surface/surface.qrc (renamed from examples/surface/surface.qrc)0
-rw-r--r--examples/datavisualization/surface/surfacegraph.cpp (renamed from examples/surface/surfacegraph.cpp)4
-rw-r--r--examples/datavisualization/surface/surfacegraph.h (renamed from examples/surface/surfacegraph.h)0
-rw-r--r--examples/examples.pri111
-rw-r--r--examples/examples.pro18
-rw-r--r--examples/qmlbars/qmlbars.desktop11
-rw-r--r--examples/qmlbars/qmlbars.pro25
-rw-r--r--examples/qmlbars/qmlbars.qrc7
-rw-r--r--examples/qmlbars/qmlbars64.pngbin3400 -> 0 bytes
-rw-r--r--examples/qmlbars/qtquick2applicationviewer/qtquick2applicationviewer.cpp81
-rw-r--r--examples/qmlbars/qtquick2applicationviewer/qtquick2applicationviewer.h33
-rw-r--r--examples/qmlbars/qtquick2applicationviewer/qtquick2applicationviewer.pri180
-rw-r--r--examples/qmlcustominput/doc/images/qmlcustominput-example.pngbin57821 -> 0 bytes
-rw-r--r--examples/qmlcustominput/qmlcustominput.desktop11
-rw-r--r--examples/qmlcustominput/qmlcustominput.pro26
-rw-r--r--examples/qmlcustominput/qmlcustominput.qrc7
-rw-r--r--examples/qmlcustominput/qmlcustominput64.pngbin3400 -> 0 bytes
-rw-r--r--examples/qmlcustominput/qmlcustominput80.pngbin4945 -> 0 bytes
-rw-r--r--examples/qmlcustominput/qtquick2applicationviewer/qtquick2applicationviewer.cpp81
-rw-r--r--examples/qmlcustominput/qtquick2applicationviewer/qtquick2applicationviewer.h33
-rw-r--r--examples/qmlcustominput/qtquick2applicationviewer/qtquick2applicationviewer.pri180
-rw-r--r--examples/qmllegend/qmllegend.desktop11
-rw-r--r--examples/qmllegend/qmllegend.pro25
-rw-r--r--examples/qmllegend/qmllegend.qrc8
-rw-r--r--examples/qmllegend/qmllegend64.pngbin3400 -> 0 bytes
-rw-r--r--examples/qmllegend/qtquick2applicationviewer/qtquick2applicationviewer.cpp81
-rw-r--r--examples/qmllegend/qtquick2applicationviewer/qtquick2applicationviewer.h33
-rw-r--r--examples/qmllegend/qtquick2applicationviewer/qtquick2applicationviewer.pri180
-rw-r--r--examples/qmlmultigraph/doc/images/qmlmultigraph-example.pngbin39416 -> 0 bytes
-rw-r--r--examples/qmlmultigraph/qml/qmlmultigraph/data.qml76
-rw-r--r--examples/qmlmultigraph/qml/qmlmultigraph/main.qml169
-rw-r--r--examples/qmlmultigraph/qmlmultigraph.desktop11
-rw-r--r--examples/qmlmultigraph/qmlmultigraph.pro25
-rw-r--r--examples/qmlmultigraph/qmlmultigraph.qrc7
-rw-r--r--examples/qmlmultigraph/qmlmultigraph64.pngbin3400 -> 0 bytes
-rw-r--r--examples/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.cpp81
-rw-r--r--examples/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.h33
-rw-r--r--examples/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.pri180
-rw-r--r--examples/qmlscatter/doc/images/qmlscatter-newproject.pngbin37045 -> 0 bytes
-rw-r--r--examples/qmlscatter/qmlscatter.desktop11
-rw-r--r--examples/qmlscatter/qmlscatter.pro25
-rw-r--r--examples/qmlscatter/qmlscatter.qrc7
-rw-r--r--examples/qmlscatter/qmlscatter64.pngbin3400 -> 0 bytes
-rw-r--r--examples/qmlscatter/qtquick2applicationviewer/qtquick2applicationviewer.cpp81
-rw-r--r--examples/qmlscatter/qtquick2applicationviewer/qtquick2applicationviewer.h33
-rw-r--r--examples/qmlscatter/qtquick2applicationviewer/qtquick2applicationviewer.pri180
-rw-r--r--examples/qmlsurface/doc/images/qmlsurface-example.pngbin195500 -> 0 bytes
-rw-r--r--examples/qmlsurface/qmlsurface.desktop11
-rw-r--r--examples/qmlsurface/qmlsurface.pro25
-rw-r--r--examples/qmlsurface/qmlsurface.qrc10
-rw-r--r--examples/qmlsurface/qmlsurface64.pngbin3400 -> 0 bytes
-rw-r--r--examples/qmlsurface/qtquick2applicationviewer/qtquick2applicationviewer.cpp81
-rw-r--r--examples/qmlsurface/qtquick2applicationviewer/qtquick2applicationviewer.h33
-rw-r--r--examples/qmlsurface/qtquick2applicationviewer/qtquick2applicationviewer.pri180
-rw-r--r--examples/scatter/doc/images/scatter-example.pngbin131518 -> 0 bytes
-rw-r--r--qtdatavisualization.pro2
-rw-r--r--src/datavisualization/axis/qabstract3daxis.cpp2
-rw-r--r--src/datavisualization/axis/qabstract3daxis.h12
-rw-r--r--src/datavisualization/axis/qvalue3daxis.h2
-rw-r--r--src/datavisualization/data/abstractitemmodelhandler.cpp1
-rw-r--r--src/datavisualization/data/abstractitemmodelhandler_p.h6
-rw-r--r--src/datavisualization/data/abstractrenderitem.cpp24
-rw-r--r--src/datavisualization/data/abstractrenderitem_p.h23
-rw-r--r--src/datavisualization/data/baritemmodelhandler.cpp18
-rw-r--r--src/datavisualization/data/barrenderitem.cpp39
-rw-r--r--src/datavisualization/data/barrenderitem_p.h45
-rw-r--r--src/datavisualization/data/labelitem_p.h4
-rw-r--r--src/datavisualization/data/qabstract3dseries.cpp18
-rw-r--r--src/datavisualization/data/qabstract3dseries.h31
-rw-r--r--src/datavisualization/data/qabstract3dseries_p.h1
-rw-r--r--src/datavisualization/data/qabstractdataproxy.h5
-rw-r--r--src/datavisualization/data/qabstractdataproxy_p.h1
-rw-r--r--src/datavisualization/data/qbar3dseries.cpp67
-rw-r--r--src/datavisualization/data/qbar3dseries.h10
-rw-r--r--src/datavisualization/data/qbar3dseries_p.h4
-rw-r--r--src/datavisualization/data/qbardataitem.h2
-rw-r--r--src/datavisualization/data/qbardataproxy.cpp21
-rw-r--r--src/datavisualization/data/qbardataproxy.h8
-rw-r--r--src/datavisualization/data/qheightmapsurfacedataproxy.cpp12
-rw-r--r--src/datavisualization/data/qheightmapsurfacedataproxy.h9
-rw-r--r--src/datavisualization/data/qheightmapsurfacedataproxy_p.h2
-rw-r--r--src/datavisualization/data/qitemmodelbardataproxy.cpp91
-rw-r--r--src/datavisualization/data/qitemmodelbardataproxy.h27
-rw-r--r--src/datavisualization/data/qitemmodelbardataproxy_p.h1
-rw-r--r--src/datavisualization/data/qitemmodelscatterdataproxy.cpp61
-rw-r--r--src/datavisualization/data/qitemmodelscatterdataproxy.h21
-rw-r--r--src/datavisualization/data/qitemmodelscatterdataproxy_p.h1
-rw-r--r--src/datavisualization/data/qitemmodelsurfacedataproxy.cpp185
-rw-r--r--src/datavisualization/data/qitemmodelsurfacedataproxy.h46
-rw-r--r--src/datavisualization/data/qitemmodelsurfacedataproxy_p.h4
-rw-r--r--src/datavisualization/data/qscatterdataitem.cpp10
-rw-r--r--src/datavisualization/data/qscatterdataitem.h7
-rw-r--r--src/datavisualization/data/qscatterdataproxy.cpp2
-rw-r--r--src/datavisualization/data/qscatterdataproxy.h2
-rw-r--r--src/datavisualization/data/qsurface3dseries.cpp2
-rw-r--r--src/datavisualization/data/qsurface3dseries.h2
-rw-r--r--src/datavisualization/data/qsurfacedataitem.h5
-rw-r--r--src/datavisualization/data/qsurfacedataproxy.cpp43
-rw-r--r--src/datavisualization/data/qsurfacedataproxy.h6
-rw-r--r--src/datavisualization/data/qsurfacedataproxy_p.h2
-rw-r--r--src/datavisualization/data/scatteritemmodelhandler.cpp39
-rw-r--r--src/datavisualization/data/scatteritemmodelhandler_p.h1
-rw-r--r--src/datavisualization/data/scatterrenderitem.cpp1
-rw-r--r--src/datavisualization/data/scatterrenderitem_p.h14
-rw-r--r--src/datavisualization/data/surfaceitemmodelhandler.cpp52
-rw-r--r--src/datavisualization/doc/qtdatavisualization.qdocconf33
-rw-r--r--src/datavisualization/doc/snippets/doc_src_qtdatavisualization.cpp2
-rw-r--r--src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc80
-rw-r--r--src/datavisualization/doc/src/qtdatavisualization-qml-bars3d.qdoc11
-rw-r--r--src/datavisualization/doc/src/qtdatavisualization-qml-scatter3d.qdoc16
-rw-r--r--src/datavisualization/doc/src/qtdatavisualization-qml-surface3d.qdoc18
-rw-r--r--src/datavisualization/doc/src/qtdatavisualization.qdoc24
-rw-r--r--src/datavisualization/engine/abstract3dcontroller.cpp3
-rw-r--r--src/datavisualization/engine/abstract3dcontroller_p.h5
-rw-r--r--src/datavisualization/engine/abstract3drenderer.cpp38
-rw-r--r--src/datavisualization/engine/abstract3drenderer_p.h11
-rw-r--r--src/datavisualization/engine/axisrendercache.cpp5
-rw-r--r--src/datavisualization/engine/bars3dcontroller.cpp34
-rw-r--r--src/datavisualization/engine/bars3dcontroller_p.h8
-rw-r--r--src/datavisualization/engine/bars3drenderer.cpp142
-rw-r--r--src/datavisualization/engine/bars3drenderer_p.h3
-rw-r--r--src/datavisualization/engine/drawer.cpp12
-rw-r--r--src/datavisualization/engine/drawer_p.h4
-rw-r--r--src/datavisualization/engine/engine.pri10
-rw-r--r--src/datavisualization/engine/q3dbars.cpp13
-rw-r--r--src/datavisualization/engine/q3dbars.h15
-rw-r--r--src/datavisualization/engine/q3dbox.cpp485
-rw-r--r--src/datavisualization/engine/q3dbox.h158
-rw-r--r--src/datavisualization/engine/q3dcamera.cpp514
-rw-r--r--src/datavisualization/engine/q3dcamera.h43
-rw-r--r--src/datavisualization/engine/q3dcamera_p.h31
-rw-r--r--src/datavisualization/engine/q3dlight.h1
-rw-r--r--src/datavisualization/engine/q3dobject.h10
-rw-r--r--src/datavisualization/engine/q3dscatter.cpp12
-rw-r--r--src/datavisualization/engine/q3dscatter.h12
-rw-r--r--src/datavisualization/engine/q3dscene.cpp38
-rw-r--r--src/datavisualization/engine/q3dscene.h27
-rw-r--r--src/datavisualization/engine/q3dscene_p.h6
-rw-r--r--src/datavisualization/engine/q3dsurface.cpp23
-rw-r--r--src/datavisualization/engine/q3dsurface.h10
-rw-r--r--src/datavisualization/engine/q3dsurface_p.h2
-rw-r--r--src/datavisualization/engine/qabstract3dgraph.cpp19
-rw-r--r--src/datavisualization/engine/qabstract3dgraph.h16
-rw-r--r--src/datavisualization/engine/qabstract3dgraph_p.h2
-rw-r--r--src/datavisualization/engine/scatter3dcontroller.cpp8
-rw-r--r--src/datavisualization/engine/scatter3dcontroller_p.h5
-rw-r--r--src/datavisualization/engine/scatter3drenderer.cpp38
-rw-r--r--src/datavisualization/engine/scatter3drenderer_p.h4
-rw-r--r--src/datavisualization/engine/selectionpointer.cpp12
-rw-r--r--src/datavisualization/engine/selectionpointer_p.h2
-rw-r--r--src/datavisualization/engine/seriesrendercache.cpp18
-rw-r--r--src/datavisualization/engine/seriesrendercache_p.h4
-rw-r--r--src/datavisualization/engine/surface3dcontroller.cpp140
-rw-r--r--src/datavisualization/engine/surface3dcontroller_p.h22
-rw-r--r--src/datavisualization/engine/surface3drenderer.cpp1316
-rw-r--r--src/datavisualization/engine/surface3drenderer_p.h57
-rw-r--r--src/datavisualization/engine/surfaceseriesrendercache.cpp91
-rw-r--r--src/datavisualization/engine/surfaceseriesrendercache_p.h130
-rw-r--r--src/datavisualization/global/datavisualizationglobal_p.h10
-rw-r--r--src/datavisualization/global/qdatavisualizationglobal.h2
-rw-r--r--src/datavisualization/input/q3dinputhandler.h4
-rw-r--r--src/datavisualization/input/qabstract3dinputhandler.cpp1
-rw-r--r--src/datavisualization/input/qabstract3dinputhandler.h15
-rw-r--r--src/datavisualization/input/qabstract3dinputhandler_p.h2
-rw-r--r--src/datavisualization/input/qtouch3dinputhandler.cpp4
-rw-r--r--src/datavisualization/input/qtouch3dinputhandler_p.h2
-rw-r--r--src/datavisualization/theme/q3dtheme.h41
-rw-r--r--src/datavisualization/utils/abstractobjecthelper.cpp2
-rw-r--r--src/datavisualization/utils/abstractobjecthelper_p.h2
-rw-r--r--src/datavisualization/utils/camerahelper.cpp5
-rw-r--r--src/datavisualization/utils/camerahelper_p.h14
-rw-r--r--src/datavisualization/utils/meshloader.cpp9
-rw-r--r--src/datavisualization/utils/meshloader_p.h4
-rw-r--r--src/datavisualization/utils/objecthelper_p.h2
-rw-r--r--src/datavisualization/utils/shaderhelper.cpp2
-rw-r--r--src/datavisualization/utils/shaderhelper_p.h2
-rw-r--r--src/datavisualization/utils/surfaceobject.cpp17
-rw-r--r--src/datavisualization/utils/surfaceobject_p.h16
-rw-r--r--src/datavisualization/utils/texturehelper.cpp20
-rw-r--r--src/datavisualization/utils/texturehelper_p.h7
-rw-r--r--src/datavisualization/utils/utils.cpp13
-rw-r--r--src/datavisualization/utils/vertexindexer.cpp2
-rw-r--r--src/datavisualization/utils/vertexindexer_p.h5
-rw-r--r--src/datavisualizationqml2/abstractdeclarative.cpp346
-rw-r--r--src/datavisualizationqml2/abstractdeclarative_p.h52
-rw-r--r--src/datavisualizationqml2/colorgradient_p.h4
-rw-r--r--src/datavisualizationqml2/datavisualizationqml2.pro41
-rw-r--r--src/datavisualizationqml2/datavisualizationqml2_plugin.cpp2
-rw-r--r--src/datavisualizationqml2/datavisualizationqml2_plugin.h2
-rw-r--r--src/datavisualizationqml2/declarativebars.cpp7
-rw-r--r--src/datavisualizationqml2/declarativebars_p.h9
-rw-r--r--src/datavisualizationqml2/declarativecolor_p.h2
-rw-r--r--src/datavisualizationqml2/declarativerendernode.cpp150
-rw-r--r--src/datavisualizationqml2/declarativerendernode_p.h84
-rw-r--r--src/datavisualizationqml2/declarativescatter.cpp8
-rw-r--r--src/datavisualizationqml2/declarativescatter_p.h8
-rw-r--r--src/datavisualizationqml2/declarativeseries.cpp2
-rw-r--r--src/datavisualizationqml2/declarativeseries_p.h2
-rw-r--r--src/datavisualizationqml2/declarativesurface.cpp19
-rw-r--r--src/datavisualizationqml2/declarativesurface_p.h9
-rw-r--r--src/datavisualizationqml2/declarativetheme_p.h2
-rw-r--r--src/datavisualizationqml2/designer/Bars3DSpecifics.qml169
-rw-r--r--src/datavisualizationqml2/designer/Scatter3DSpecifics.qml86
-rw-r--r--src/datavisualizationqml2/designer/Surface3DSpecifics.qml97
-rw-r--r--src/datavisualizationqml2/designer/designer.pri16
-rw-r--r--src/datavisualizationqml2/designer/images/bars3d-icon.pngbin0 -> 784 bytes
-rw-r--r--src/datavisualizationqml2/designer/images/bars3d-icon16.pngbin0 -> 440 bytes
-rw-r--r--src/datavisualizationqml2/designer/images/scatter3d-icon.pngbin0 -> 880 bytes
-rw-r--r--src/datavisualizationqml2/designer/images/scatter3d-icon16.pngbin0 -> 474 bytes
-rw-r--r--src/datavisualizationqml2/designer/images/surface3d-icon.pngbin0 -> 941 bytes
-rw-r--r--src/datavisualizationqml2/designer/images/surface3d-icon16.pngbin0 -> 545 bytes
-rw-r--r--src/datavisualizationqml2/designer/qtdatavisualization.metainfo38
-rw-r--r--tests/barstest/barstest.pro2
-rw-r--r--tests/barstest/chart.cpp6
-rw-r--r--tests/directional/directional.pro2
-rw-r--r--tests/directional/main.cpp16
-rw-r--r--tests/directional/scatterdatamodifier.cpp2
-rw-r--r--tests/kinectsurface/main.cpp35
-rw-r--r--tests/kinectsurface/surfacedata.cpp108
-rw-r--r--tests/kinectsurface/surfacedata.h4
-rw-r--r--tests/multigraphs/data.cpp1
-rw-r--r--tests/multigraphs/multigraphs.pro2
-rw-r--r--tests/qmlcamera/main.cpp28
-rw-r--r--tests/qmlcamera/qml/qmlcamera/Data.qml147
-rw-r--r--tests/qmlcamera/qml/qmlcamera/main.qml26
-rw-r--r--tests/qmlcamera/qmlcamera.desktop11
-rw-r--r--tests/qmlcamera/qmlcamera.pro29
-rw-r--r--tests/qmlcamera/qmlcamera.qrc9
-rw-r--r--tests/qmlcamera/qmlcamera64.pngbin3400 -> 0 bytes
-rw-r--r--tests/qmlcamera/qmlcamera80.pngbin4945 -> 0 bytes
-rw-r--r--tests/qmlcamera/qmlcamera_harmattan.desktop11
-rw-r--r--tests/qmlcamera/qtquick2applicationviewer/qtquick2applicationviewer.cpp81
-rw-r--r--tests/qmlcamera/qtquick2applicationviewer/qtquick2applicationviewer.h33
-rw-r--r--tests/qmlcamera/qtquick2applicationviewer/qtquick2applicationviewer.pri180
-rw-r--r--tests/qmldynamicdata/main.cpp31
-rw-r--r--tests/qmldynamicdata/qml/qmldynamicdata/NewButton.qml (renamed from tests/qmldynamicdata/qml/qmldynamicdata/newbutton.qml)0
-rw-r--r--tests/qmldynamicdata/qml/qmldynamicdata/main.qml42
-rw-r--r--tests/qmldynamicdata/qmldynamicdata.pro21
-rw-r--r--tests/qmldynamicdata/qmldynamicdata.qrc6
-rw-r--r--tests/qmldynamicdata/qtquick2applicationviewer/qtquick2applicationviewer.cpp81
-rw-r--r--tests/qmldynamicdata/qtquick2applicationviewer/qtquick2applicationviewer.h33
-rw-r--r--tests/qmldynamicdata/qtquick2applicationviewer/qtquick2applicationviewer.pri180
-rw-r--r--tests/scattertest/scatterchart.cpp28
-rw-r--r--tests/scattertest/scattertest.pro2
-rw-r--r--tests/spectrum/spectrumapp/spectrumapp.pro8
-rw-r--r--tests/surfacetest/graphmodifier.cpp410
-rw-r--r--tests/surfacetest/graphmodifier.h43
-rw-r--r--tests/surfacetest/main.cpp242
-rw-r--r--tests/surfacetest/surfacetest.pro2
-rw-r--r--tests/tests.pri106
-rw-r--r--tools/blender/backgroud.blendbin0 -> 463436 bytes
-rw-r--r--tools/blender/backgroudNegatives.blendbin0 -> 462544 bytes
-rw-r--r--tools/blender/backgroudNegativesWall.blendbin0 -> 465188 bytes
-rw-r--r--tools/blender/cone.blendbin0 -> 450400 bytes
-rw-r--r--tools/blender/cone_filled.blendbin0 -> 450476 bytes
-rw-r--r--tools/blender/cube.blendbin0 -> 448248 bytes
-rw-r--r--tools/blender/cube_filled.blendbin0 -> 448340 bytes
-rw-r--r--tools/blender/cylinder.blendbin0 -> 453976 bytes
-rw-r--r--tools/blender/cylinder_filled.blendbin0 -> 454612 bytes
-rw-r--r--tools/blender/plane.blendbin0 -> 447624 bytes
-rw-r--r--tools/blender/pyramid.blendbin0 -> 447952 bytes
-rw-r--r--tools/blender/pyramid_filled.blendbin0 -> 448100 bytes
-rw-r--r--tools/blender/scatterdot.blendbin0 -> 456132 bytes
-rw-r--r--tools/blender/smoothcube.blendbin0 -> 452616 bytes
-rw-r--r--tools/blender/smoothcube_filled.blendbin0 -> 452884 bytes
-rw-r--r--tools/blender/sphere.blendbin0 -> 493380 bytes
403 files changed, 9655 insertions, 6301 deletions
diff --git a/.qmake.conf b/.qmake.conf
index d8bef836..c44318c8 100644
--- a/.qmake.conf
+++ b/.qmake.conf
@@ -1,2 +1,4 @@
-MODULE_VERSION=1.0.0
load(qt_build_config)
+CONFIG += qt_example_installs
+
+MODULE_VERSION=1.0.0
diff --git a/README b/README
index 6a414903..d17987d0 100644
--- a/README
+++ b/README
@@ -1,6 +1,6 @@
------------------------------------
-Qt Data Visualization 1.0.0 (beta)
------------------------------------
+---------------------------
+Qt Data Visualization 1.0.0
+---------------------------
Qt Data Visualization module provides multiple graph types to visualize data in 3D space
both with C++ and Qt Quick 2.
@@ -11,9 +11,6 @@ System Requirements
- Qt 5.2 or newer
- OpenGL 2.1 or newer (recommended) or OpenGL ES2 (reduced feature set)
-Platform specific recommendations:
-- Mac: OSX 10.8 or later recommended
-
Building
========
Configure the project with qmake:
@@ -73,12 +70,6 @@ Please refer to the generated documentation for more information:
Known Issues
============
-- All other QML elements are drawn on top of the Qt DataVisualization graphs,
- including the parent elements of the graphs. To ensure the graphs are not
- hidden, make sure you don't draw anything opaque on top of the graphs.
- For example, Qt Creator application wizard for Qt Quick 2 applications
- creates by default an opaque white Rectangle element as the main element,
- which covers any graph added to it.
- Android doesn't support both widgets and OpenGL simultaneously, so only
the Qt Quick 2 API is usable in practice in Android.
- Shadows are not supported with OpenGL ES2 (including Angle builds in Windows).
@@ -89,3 +80,4 @@ Known Issues
- The color style Q3DTheme::ColorStyleObjectGradient doesn't work for surface graphs.
- Scatter "point" meshes do not support gradients, they always use the base color.
- Widget based examples layout incorrectly in iOS.
+- QML implementation doesn't use a shared context on OSX.
diff --git a/examples/bars/doc/images/bars-example.png b/examples/bars/doc/images/bars-example.png
deleted file mode 100644
index 6cc94455..00000000
--- a/examples/bars/doc/images/bars-example.png
+++ /dev/null
Binary files differ
diff --git a/examples/audiolevels/audiolevels.cpp b/examples/datavisualization/audiolevels/audiolevels.cpp
index 18c1342a..81059460 100644
--- a/examples/audiolevels/audiolevels.cpp
+++ b/examples/datavisualization/audiolevels/audiolevels.cpp
@@ -26,8 +26,8 @@
#include <QtDataVisualization/qbar3dseries.h>
#include <QtDataVisualization/q3dtheme.h>
-#include <QAudioDeviceInfo>
-#include <QAudioInput>
+#include <QtMultimedia/QAudioDeviceInfo>
+#include <QtMultimedia/QAudioInput>
using namespace QtDataVisualization;
diff --git a/examples/audiolevels/audiolevels.h b/examples/datavisualization/audiolevels/audiolevels.h
index 84d9b4c4..84d9b4c4 100644
--- a/examples/audiolevels/audiolevels.h
+++ b/examples/datavisualization/audiolevels/audiolevels.h
diff --git a/examples/audiolevels/audiolevels.pro b/examples/datavisualization/audiolevels/audiolevels.pro
index 7df4379b..73a68471 100644
--- a/examples/audiolevels/audiolevels.pro
+++ b/examples/datavisualization/audiolevels/audiolevels.pro
@@ -13,8 +13,5 @@ SOURCES += main.cpp \
HEADERS += audiolevels.h \
audiolevelsiodevice.h
-INSTALLS += target
-
OTHER_FILES += doc/src/* \
doc/images/*
-
diff --git a/examples/audiolevels/audiolevelsiodevice.cpp b/examples/datavisualization/audiolevels/audiolevelsiodevice.cpp
index c0cd70e3..27ddce4f 100644
--- a/examples/audiolevels/audiolevelsiodevice.cpp
+++ b/examples/datavisualization/audiolevels/audiolevelsiodevice.cpp
@@ -17,7 +17,7 @@
****************************************************************************/
#include "audiolevelsiodevice.h"
-#include <QDebug>
+#include <QtCore/QDebug>
using namespace QtDataVisualization;
diff --git a/examples/audiolevels/audiolevelsiodevice.h b/examples/datavisualization/audiolevels/audiolevelsiodevice.h
index 45f17626..7510db35 100644
--- a/examples/audiolevels/audiolevelsiodevice.h
+++ b/examples/datavisualization/audiolevels/audiolevelsiodevice.h
@@ -20,7 +20,7 @@
#define AUDIOLEVELSIODEVICE_H
#include <QtDataVisualization/qbardataproxy.h>
-#include <QIODevice>
+#include <QtCore/QIODevice>
using namespace QtDataVisualization;
diff --git a/examples/audiolevels/doc/images/audiolevels-example.png b/examples/datavisualization/audiolevels/doc/images/audiolevels-example.png
index ec79eb5a..ec79eb5a 100644
--- a/examples/audiolevels/doc/images/audiolevels-example.png
+++ b/examples/datavisualization/audiolevels/doc/images/audiolevels-example.png
Binary files differ
diff --git a/examples/audiolevels/doc/src/audiolevels.qdoc b/examples/datavisualization/audiolevels/doc/src/audiolevels.qdoc
index 189db184..11bea3c3 100644
--- a/examples/audiolevels/doc/src/audiolevels.qdoc
+++ b/examples/datavisualization/audiolevels/doc/src/audiolevels.qdoc
@@ -39,23 +39,23 @@
In the header file for \c AudioLevels class we declare necessary members:
- \snippet ../examples/audiolevels/audiolevels.h 0
+ \snippet audiolevels/audiolevels.h 0
And initialize the microphone listening in the source:
- \snippet ../examples/audiolevels/audiolevels.cpp 0
+ \snippet audiolevels/audiolevels.cpp 0
In the header file for \c AudioLevelsIODevice class we store pointers to the data proxy and
also the data array we give to the proxy, because we reuse the same array to keep memory
reallocations to the minimum:
- \snippet ../examples/audiolevels/audiolevelsiodevice.h 0
+ \snippet audiolevels/audiolevelsiodevice.h 0
In the source file we define some static constants to define size of the data array and
the middle row index, as well as the resolution of the visualization. You may need to adjust
these values to get decent performance in low-end devices:
- \snippet ../examples/audiolevels/audiolevelsiodevice.cpp 1
+ \snippet audiolevels/audiolevelsiodevice.cpp 1
The \c resolution constant indicates the sample rate, for example, value 8 means every eighth
byte from audio input is visualized. This is necessary to make the data readable, as it would
@@ -63,13 +63,13 @@
In the \c AudioLevelsIODevice class constructor we initialize the data array:
- \snippet ../examples/audiolevels/audiolevelsiodevice.cpp 0
+ \snippet audiolevels/audiolevelsiodevice.cpp 0
The \c AudioLevelsIODevice::writeData function is called whenever there is new audio data
available to be visualized. There we move the old data along the rows and insert new
data in the beginning of the rows:
- \snippet ../examples/audiolevels/audiolevelsiodevice.cpp 2
+ \snippet audiolevels/audiolevelsiodevice.cpp 2
We use a couple of techniques here to improve performance. First, we reuse
the existing data array, as this allows us to avoid any extra memory allocations in our
@@ -80,6 +80,6 @@
\note In the future versions of Qt Data Visualization, QBarDataItem might get extended so that
it does allocate some memory to store other optional bar properties besides the value.
- In use cases where those optional properties are used, using \c memmove and \c memcpy would lead to
+ In use cases where those optional properties are used, using \c memmove and \c memcpy could lead to
memory leaks, so use them with care.
*/
diff --git a/examples/audiolevels/main.cpp b/examples/datavisualization/audiolevels/main.cpp
index 9dd07b1b..4f9c01cb 100644
--- a/examples/audiolevels/main.cpp
+++ b/examples/datavisualization/audiolevels/main.cpp
@@ -18,8 +18,8 @@
#include "audiolevels.h"
-#include <QGuiApplication>
-#include <QAudio>
+#include <QtGui/QGuiApplication>
+#include <QtMultimedia/QAudio>
using namespace QtDataVisualization;
diff --git a/examples/bars/bars.pro b/examples/datavisualization/bars/bars.pro
index e4e2c5fa..f2a1a2be 100644
--- a/examples/bars/bars.pro
+++ b/examples/datavisualization/bars/bars.pro
@@ -7,7 +7,5 @@ HEADERS += graphmodifier.h
QT += widgets
-INSTALLS += target
-
OTHER_FILES += doc/src/* \
doc/images/*
diff --git a/examples/datavisualization/bars/doc/images/bars-example.png b/examples/datavisualization/bars/doc/images/bars-example.png
new file mode 100644
index 00000000..5bd2c7d9
--- /dev/null
+++ b/examples/datavisualization/bars/doc/images/bars-example.png
Binary files differ
diff --git a/examples/bars/doc/src/bars.qdoc b/examples/datavisualization/bars/doc/src/bars.qdoc
index 9c80b804..58f6bdc4 100644
--- a/examples/bars/doc/src/bars.qdoc
+++ b/examples/datavisualization/bars/doc/src/bars.qdoc
@@ -42,7 +42,7 @@
First, in main.cpp, we create a QApplication, instantiate Q3DBars and a window container
for it:
- \snippet ../examples/bars/main.cpp 0
+ \snippet bars/main.cpp 0
The call to QWidget::createWindowContainer is required, as all data visualization types
(Q3DBars, Q3DScatter, Q3DSurface) inherit QWindow. Any class inheriting QWindow cannot be used
@@ -51,7 +51,7 @@
Then we'll create horizontal and vertical layouts. We'll add the graph and the vertical
layout into the horizontal one:
- \snippet ../examples/bars/main.cpp 1
+ \snippet bars/main.cpp 1
We're not using the vertical layout for anything yet, but we'll get back to it in
\l {Using widgets to control the graph}
@@ -60,51 +60,51 @@
graph. Let's call it \c GraphModifier (See \l {Setting up the graph} and
\l {Adding data to the graph} for details):
- \snippet ../examples/bars/main.cpp 2
+ \snippet bars/main.cpp 2
The application main is done and we can show the graph and start the event loop:
- \snippet ../examples/bars/main.cpp 3
+ \snippet bars/main.cpp 3
\section1 Setting up the graph
Let's set up the graph in the constructor of the \c GraphModifier class we instantiated in the
application main:
- \snippet ../examples/bars/graphmodifier.cpp 0
+ \snippet bars/graphmodifier.cpp 0
Let's take a closer look at parts of the code.
First we're creating the axes and the series into member variables to support changing them
easily later on, if we want to:
- \snippet ../examples/bars/graphmodifier.cpp 1
+ \snippet bars/graphmodifier.cpp 1
Then we're setting some of the visual qualities for the graph:
- \snippet ../examples/bars/graphmodifier.cpp 2
+ \snippet bars/graphmodifier.cpp 2
We're also setting up the axes and setting them to the graph as active axes:
- \snippet ../examples/bars/graphmodifier.cpp 3
+ \snippet bars/graphmodifier.cpp 3
Next we initialize the visual properties of the series.
Note that the second series is initially not visible:
- \snippet ../examples/bars/graphmodifier.cpp 8
+ \snippet bars/graphmodifier.cpp 8
The series need to be added to the graph to show them:
- \snippet ../examples/bars/graphmodifier.cpp 4
+ \snippet bars/graphmodifier.cpp 4
Finally, we set the camera angle by calling the same method the camera angle change button
in the UI uses to cycle through various camera angles:
- \snippet ../examples/bars/graphmodifier.cpp 6
+ \snippet bars/graphmodifier.cpp 6
There you can see that the camera is controlled via the scene object of the graph:
- \snippet ../examples/bars/graphmodifier.cpp 10
+ \snippet bars/graphmodifier.cpp 10
For more information about using scene and cameras, see Q3DScene and Q3DCamera.
@@ -114,11 +114,11 @@
At the end of the constructor there's a call:
- \snippet ../examples/bars/graphmodifier.cpp 9
+ \snippet bars/graphmodifier.cpp 9
This method is used to add data to the proxies of the two series:
- \snippet ../examples/bars/graphmodifier.cpp 5
+ \snippet bars/graphmodifier.cpp 5
Now the series have data to show.
@@ -127,24 +127,24 @@
There isn't much interaction yet, so let's continue by adding some widgets back in the
application main. Let's just focus on two as an example:
- \snippet ../examples/bars/main.cpp 4
+ \snippet bars/main.cpp 4
We can use these slider widgets to rotate the graph instead of just using the mouse or
touch.
Let's add them to the vertical layout we created earlier:
- \snippet ../examples/bars/main.cpp 5
+ \snippet bars/main.cpp 5
Then we'll connect them to methods in \c GraphModifier:
- \snippet ../examples/bars/main.cpp 6
+ \snippet bars/main.cpp 6
Here are the methods in \c GraphModifier the signals were connected to. The camera
is controlled via the scene object. This time we specify the actual camera position
along the orbit around the center point, instead of specifying a preset camera angle:
- \snippet ../examples/bars/graphmodifier.cpp 7
+ \snippet bars/graphmodifier.cpp 7
Now these two sliders can be used to rotate the graph.
@@ -158,6 +158,7 @@
\li Grid visibility
\li Bar shading smoothness
\li Visibility of the second bar series
+ \li Data range to be shown
\li Bar style
\li Selection mode
\li Theme
diff --git a/examples/bars/graphmodifier.cpp b/examples/datavisualization/bars/graphmodifier.cpp
index 06b36b7f..5df4066c 100644
--- a/examples/bars/graphmodifier.cpp
+++ b/examples/datavisualization/bars/graphmodifier.cpp
@@ -24,8 +24,8 @@
#include <QtDataVisualization/q3dcamera.h>
#include <QtDataVisualization/qbar3dseries.h>
#include <QtDataVisualization/q3dtheme.h>
-#include <QTime>
-#include <QComboBox>
+#include <QtCore/QTime>
+#include <QtWidgets/QComboBox>
using namespace QtDataVisualization;
@@ -60,14 +60,14 @@ GraphModifier::GraphModifier(Q3DBars *bargraph)
//! [2]
m_months << "January" << "February" << "March" << "April" << "May" << "June" << "July" << "August" << "September" << "October" << "November" << "December";
- m_years << "2006" << "2007" << "2008" << "2009" << "2010" << "2011" << "2012";
+ m_years << "2006" << "2007" << "2008" << "2009" << "2010" << "2011" << "2012" << "2013";
//! [3]
m_temperatureAxis->setTitle("Average temperature");
m_temperatureAxis->setSegmentCount(m_segments);
m_temperatureAxis->setSubSegmentCount(m_subSegments);
m_temperatureAxis->setRange(m_minval, m_maxval);
- m_temperatureAxis->setLabelFormat(QString(QStringLiteral("%d ") + celsiusString));
+ m_temperatureAxis->setLabelFormat(QString(QStringLiteral("%.1f ") + celsiusString));
m_yearAxis->setTitle("Year");
m_monthAxis->setTitle("Month");
@@ -112,24 +112,26 @@ void GraphModifier::resetTemperatureData()
{
//! [5]
// Set up data
- static const float tempOulu[7][12] = {
+ static const float tempOulu[8][12] = {
{-6.7f, -11.7f, -9.7f, 3.3f, 9.2f, 14.0f, 16.3f, 17.8f, 10.2f, 2.1f, -2.6f, -0.3f}, // 2006
{-6.8f, -13.3f, 0.2f, 1.5f, 7.9f, 13.4f, 16.1f, 15.5f, 8.2f, 5.4f, -2.6f, -0.8f}, // 2007
{-4.2f, -4.0f, -4.6f, 1.9f, 7.3f, 12.5f, 15.0f, 12.8f, 7.6f, 5.1f, -0.9f, -1.3f}, // 2008
{-7.8f, -8.8f, -4.2f, 0.7f, 9.3f, 13.2f, 15.8f, 15.5f, 11.2f, 0.6f, 0.7f, -8.4f}, // 2009
{-14.4f, -12.1f, -7.0f, 2.3f, 11.0f, 12.6f, 18.8f, 13.8f, 9.4f, 3.9f, -5.6f, -13.0f}, // 2010
{-9.0f, -15.2f, -3.8f, 2.6f, 8.3f, 15.9f, 18.6f, 14.9f, 11.1f, 5.3f, 1.8f, -0.2f}, // 2011
- {-8.7f, -11.3f, -2.3f, 0.4f, 7.5f, 12.2f, 16.4f, 14.1f, 9.2f, 3.1f, 0.3f, -12.1f} // 2012
+ {-8.7f, -11.3f, -2.3f, 0.4f, 7.5f, 12.2f, 16.4f, 14.1f, 9.2f, 3.1f, 0.3f, -12.1f}, // 2012
+ {-7.9f, -5.3f, -9.1f, 0.8f, 11.6f, 16.6f, 15.9f, 15.5f, 11.2f, 4.0f, 0.1f, -1.9f} // 2013
};
- static const float tempHelsinki[7][12] = {
+ static const float tempHelsinki[8][12] = {
{-3.7f, -7.8f, -5.4f, 3.4f, 10.7f, 15.4f, 18.6f, 18.7f, 14.3f, 8.5f, 2.9f, 4.1f}, // 2006
{-1.2f, -7.5f, 3.1f, 5.5f, 10.3f, 15.9f, 17.4f, 17.9f, 11.2f, 7.3f, 1.1f, 0.5f}, // 2007
{-0.6f, 1.2f, 0.2f, 6.3f, 10.2f, 13.8f, 18.1f, 15.1f, 10.1f, 9.4f, 2.5f, 0.4f}, // 2008
{-2.9f, -3.5f, -0.9f, 4.7f, 10.9f, 14.0f, 17.4f, 16.8f, 13.2f, 4.1f, 2.6f, -2.3f}, // 2009
{-10.2f, -8.0f, -1.9f, 6.6f, 11.3f, 14.5f, 21.0f, 18.8f, 12.6f, 6.1f, -0.5f, -7.3f}, // 2010
{-4.4f, -9.1f, -2.0f, 5.5f, 9.9f, 15.6f, 20.8f, 17.8f, 13.4f, 8.9f, 3.6f, 1.5f}, // 2011
- {-3.5f, -3.2f, -0.7f, 4.0f, 11.1f, 13.4f, 17.3f, 15.8f, 13.1f, 6.4f, 4.1f, -5.1f} // 2012
+ {-3.5f, -3.2f, -0.7f, 4.0f, 11.1f, 13.4f, 17.3f, 15.8f, 13.1f, 6.4f, 4.1f, -5.1f}, // 2012
+ {-4.8f, -1.8f, -5.0f, 2.9f, 12.8f, 17.2f, 18.0f, 17.1f, 12.5f, 7.5f, 4.5f, 2.3f} // 2013
};
// Create data arrays
@@ -159,6 +161,14 @@ void GraphModifier::resetTemperatureData()
//! [5]
}
+void GraphModifier::changeRange(int range)
+{
+ if (range >= m_years.count())
+ m_yearAxis->setRange(0, m_years.count() - 1);
+ else
+ m_yearAxis->setRange(range, range);
+}
+
void GraphModifier::changeStyle(int style)
{
QComboBox *comboBox = qobject_cast<QComboBox *>(sender());
diff --git a/examples/bars/graphmodifier.h b/examples/datavisualization/bars/graphmodifier.h
index cfb1ceec..cac002a1 100644
--- a/examples/bars/graphmodifier.h
+++ b/examples/datavisualization/bars/graphmodifier.h
@@ -23,10 +23,10 @@
#include <QtDataVisualization/qbardataproxy.h>
#include <QtDataVisualization/qabstract3dseries.h>
-#include <QFont>
-#include <QDebug>
-#include <QStringList>
-#include <QPointer>
+#include <QtGui/QFont>
+#include <QtCore/QDebug>
+#include <QtCore/QStringList>
+#include <QtCore/QPointer>
using namespace QtDataVisualization;
@@ -50,6 +50,7 @@ public:
void setSeriesVisibility(int enabled);
public slots:
+ void changeRange(int range);
void changeStyle(int style);
void changeSelectionMode(int selectionMode);
void changeTheme(int theme);
diff --git a/examples/bars/main.cpp b/examples/datavisualization/bars/main.cpp
index 0b934aac..e6461202 100644
--- a/examples/bars/main.cpp
+++ b/examples/datavisualization/bars/main.cpp
@@ -18,17 +18,17 @@
#include "graphmodifier.h"
-#include <QApplication>
-#include <QWidget>
-#include <QHBoxLayout>
-#include <QVBoxLayout>
-#include <QPushButton>
-#include <QCheckBox>
-#include <QSlider>
-#include <QFontComboBox>
-#include <QLabel>
-#include <QScreen>
-#include <QFontDatabase>
+#include <QtWidgets/QApplication>
+#include <QtWidgets/QWidget>
+#include <QtWidgets/QHBoxLayout>
+#include <QtWidgets/QVBoxLayout>
+#include <QtWidgets/QPushButton>
+#include <QtWidgets/QCheckBox>
+#include <QtWidgets/QSlider>
+#include <QtWidgets/QFontComboBox>
+#include <QtWidgets/QLabel>
+#include <QtGui/QScreen>
+#include <QtGui/QFontDatabase>
int main(int argc, char **argv)
{
@@ -52,7 +52,7 @@ int main(int argc, char **argv)
hLayout->addLayout(vLayout);
//! [1]
- widget->setWindowTitle(QStringLiteral("Average temperatures in Oulu and Helsinki, Finland (2006-2012)"));
+ widget->setWindowTitle(QStringLiteral("Average temperatures in Oulu and Helsinki, Finland (2006-2013)"));
QComboBox *themeList = new QComboBox(widget);
themeList->addItem(QStringLiteral("Qt"));
@@ -167,6 +167,18 @@ int main(int argc, char **argv)
shadowQuality->addItem(QStringLiteral("High Soft"));
shadowQuality->setCurrentIndex(5);
+ QComboBox *rangeList = new QComboBox(widget);
+ rangeList->addItem(QStringLiteral("2006"));
+ rangeList->addItem(QStringLiteral("2007"));
+ rangeList->addItem(QStringLiteral("2008"));
+ rangeList->addItem(QStringLiteral("2009"));
+ rangeList->addItem(QStringLiteral("2010"));
+ rangeList->addItem(QStringLiteral("2011"));
+ rangeList->addItem(QStringLiteral("2012"));
+ rangeList->addItem(QStringLiteral("2013"));
+ rangeList->addItem(QStringLiteral("All"));
+ rangeList->setCurrentIndex(8);
+
//! [5]
vLayout->addWidget(new QLabel(QStringLiteral("Rotate horizontally")));
vLayout->addWidget(rotationSliderX, 0, Qt::AlignTop);
@@ -179,6 +191,8 @@ int main(int argc, char **argv)
vLayout->addWidget(gridCheckBox);
vLayout->addWidget(smoothCheckBox);
vLayout->addWidget(seriesCheckBox);
+ vLayout->addWidget(new QLabel(QStringLiteral("Show year")));
+ vLayout->addWidget(rangeList);
vLayout->addWidget(new QLabel(QStringLiteral("Change bar style")));
vLayout->addWidget(barStyleList);
vLayout->addWidget(new QLabel(QStringLiteral("Change selection mode")));
@@ -220,6 +234,9 @@ int main(int argc, char **argv)
QObject::connect(modifier, &GraphModifier::gridEnabledChanged,
gridCheckBox, &QCheckBox::setChecked);
+ QObject::connect(rangeList, SIGNAL(currentIndexChanged(int)), modifier,
+ SLOT(changeRange(int)));
+
QObject::connect(barStyleList, SIGNAL(currentIndexChanged(int)), modifier,
SLOT(changeStyle(int)));
diff --git a/examples/custominput/custominput.pro b/examples/datavisualization/custominput/custominput.pro
index 9a94cfcd..532a3f41 100644
--- a/examples/custominput/custominput.pro
+++ b/examples/datavisualization/custominput/custominput.pro
@@ -9,8 +9,6 @@ HEADERS += scatterdatamodifier.h \
QT += widgets
-INSTALLS += target
-
RESOURCES += custominput.qrc
OTHER_FILES += doc/src/* \
diff --git a/examples/custominput/custominput.qrc b/examples/datavisualization/custominput/custominput.qrc
index 8ced2b91..8ced2b91 100644
--- a/examples/custominput/custominput.qrc
+++ b/examples/datavisualization/custominput/custominput.qrc
diff --git a/examples/custominput/custominputhandler.cpp b/examples/datavisualization/custominput/custominputhandler.cpp
index a5734e16..a5734e16 100644
--- a/examples/custominput/custominputhandler.cpp
+++ b/examples/datavisualization/custominput/custominputhandler.cpp
diff --git a/examples/custominput/custominputhandler.h b/examples/datavisualization/custominput/custominputhandler.h
index 60c88ef7..60c88ef7 100644
--- a/examples/custominput/custominputhandler.h
+++ b/examples/datavisualization/custominput/custominputhandler.h
diff --git a/examples/custominput/data/data.txt b/examples/datavisualization/custominput/data/data.txt
index d0689b1f..d0689b1f 100644
--- a/examples/custominput/data/data.txt
+++ b/examples/datavisualization/custominput/data/data.txt
diff --git a/examples/custominput/doc/images/custominput-example.png b/examples/datavisualization/custominput/doc/images/custominput-example.png
index b2656b69..b2656b69 100644
--- a/examples/custominput/doc/images/custominput-example.png
+++ b/examples/datavisualization/custominput/doc/images/custominput-example.png
Binary files differ
diff --git a/examples/custominput/doc/src/custominput.qdoc b/examples/datavisualization/custominput/doc/src/custominput.qdoc
index 88c53b4d..59d3c090 100644
--- a/examples/custominput/doc/src/custominput.qdoc
+++ b/examples/datavisualization/custominput/doc/src/custominput.qdoc
@@ -34,19 +34,19 @@
The default input handling mechanism is replaced by setting the active input handler of \l Q3DScatter
to \c CustomInputHandler that implements the custom behavior.
- \snippet ../examples/custominput/scatterdatamodifier.cpp 0
+ \snippet custominput/scatterdatamodifier.cpp 0
\section1 Implementing custom selection handling
The on mouseover selection handling is implemented in the \c CustomInputHandler that captures the mouse events.
It then stores the last known coordinates to the \l QAbstract3DInputHandler::inputPosition property.
- \snippet ../examples/custominput/custominputhandler.cpp 0
+ \snippet custominput/custominputhandler.cpp 0
As the selection is one shot, and is cleared each time a 3D frame is rendered, a timer is setup to retrigger selection so that the selection moves to the item
currently under the mouse cursor as the camera animates around the graph even when the mouse cursor is not moving.
- \snippet ../examples/custominput/scatterdatamodifier.cpp 1
+ \snippet custominput/scatterdatamodifier.cpp 1
\section1 Implementing custom zoom handling
@@ -54,17 +54,17 @@
between 10% and 500%. This range is then divided to four subranges where \c angleDelta is scaled to different amount of zoom change
based on the current subrange.
- \snippet ../examples/custominput/custominputhandler.cpp 1
+ \snippet custominput/custominputhandler.cpp 1
\section1 Implementing custom camera handling
The camera is animated to constantly rotate around the graph with two animations. The rotation around the graph is done with
a simple QPropertyAnimation that just increments during 20 seconds from 0 degrees to 360 degrees and sets the \l Q3DCamera::xRotation property.
- \snippet ../examples/custominput/scatterdatamodifier.cpp 2
+ \snippet custominput/scatterdatamodifier.cpp 2
The camera movement up and down is implemented with a QSequentialAnimationGroup that varies the \l Q3DCamera::yRotation property of the camera
from 5 degrees to 45 degrees and back with in and out easing.
- \snippet ../examples/custominput/scatterdatamodifier.cpp 3
+ \snippet custominput/scatterdatamodifier.cpp 3
*/
diff --git a/examples/custominput/main.cpp b/examples/datavisualization/custominput/main.cpp
index 069a5b0a..5dd31499 100644
--- a/examples/custominput/main.cpp
+++ b/examples/datavisualization/custominput/main.cpp
@@ -18,17 +18,17 @@
#include "scatterdatamodifier.h"
-#include <QApplication>
-#include <QWidget>
-#include <QHBoxLayout>
-#include <QVBoxLayout>
-#include <QPushButton>
-#include <QCheckBox>
-#include <QComboBox>
-#include <QFontComboBox>
-#include <QLabel>
-#include <QScreen>
-#include <QFontDatabase>
+#include <QtWidgets/QApplication>
+#include <QtWidgets/QWidget>
+#include <QtWidgets/QHBoxLayout>
+#include <QtWidgets/QVBoxLayout>
+#include <QtWidgets/QPushButton>
+#include <QtWidgets/QCheckBox>
+#include <QtWidgets/QComboBox>
+#include <QtWidgets/QFontComboBox>
+#include <QtWidgets/QLabel>
+#include <QtGui/QScreen>
+#include <QtGui/QFontDatabase>
int main(int argc, char **argv)
{
diff --git a/examples/custominput/scatterdatamodifier.cpp b/examples/datavisualization/custominput/scatterdatamodifier.cpp
index a2a5bea9..2b812ba1 100644
--- a/examples/custominput/scatterdatamodifier.cpp
+++ b/examples/datavisualization/custominput/scatterdatamodifier.cpp
@@ -24,7 +24,9 @@
#include <QtDataVisualization/Q3DCamera>
#include <QtDataVisualization/QScatter3DSeries>
#include <QtDataVisualization/Q3DTheme>
-#include <qmath.h>
+#include <QtCore/qmath.h>
+#include <QtCore/QTextStream>
+#include <QtCore/QDebug>
using namespace QtDataVisualization;
diff --git a/examples/custominput/scatterdatamodifier.h b/examples/datavisualization/custominput/scatterdatamodifier.h
index 9ea6a5c8..8b185711 100644
--- a/examples/custominput/scatterdatamodifier.h
+++ b/examples/datavisualization/custominput/scatterdatamodifier.h
@@ -24,9 +24,9 @@
#include <QtDataVisualization/q3dscatter.h>
#include <QtGui/QFont>
#include <QtCore/QTimer>
-#include <QPropertyAnimation>
-#include <QSequentialAnimationGroup>
-#include <QVector3D>
+#include <QtCore/QPropertyAnimation>
+#include <QtCore/QSequentialAnimationGroup>
+#include <QtGui/QVector3D>
using namespace QtDataVisualization;
diff --git a/examples/customproxy/customproxy.pro b/examples/datavisualization/customproxy/customproxy.pro
index 2b764a41..cb9daccf 100644
--- a/examples/customproxy/customproxy.pro
+++ b/examples/datavisualization/customproxy/customproxy.pro
@@ -14,11 +14,9 @@ HEADERS += \
variantbardataproxy.h \
variantbardatamapping.h
-INSTALLS += target
-
RESOURCES += customproxy.qrc
-OTHER_FILES += data/raindata.txt \
- doc/src/* \
- doc/images/*
+OTHER_FILES += doc/src/* \
+ doc/images/* \
+ data/raindata.txt
diff --git a/examples/customproxy/customproxy.qrc b/examples/datavisualization/customproxy/customproxy.qrc
index 53cd4915..53cd4915 100644
--- a/examples/customproxy/customproxy.qrc
+++ b/examples/datavisualization/customproxy/customproxy.qrc
diff --git a/examples/customproxy/data/raindata.txt b/examples/datavisualization/customproxy/data/raindata.txt
index 531d66be..531d66be 100644
--- a/examples/customproxy/data/raindata.txt
+++ b/examples/datavisualization/customproxy/data/raindata.txt
diff --git a/examples/customproxy/doc/images/customproxy-example.png b/examples/datavisualization/customproxy/doc/images/customproxy-example.png
index 753b8951..753b8951 100644
--- a/examples/customproxy/doc/images/customproxy-example.png
+++ b/examples/datavisualization/customproxy/doc/images/customproxy-example.png
Binary files differ
diff --git a/examples/customproxy/doc/src/customproxy.qdoc b/examples/datavisualization/customproxy/doc/src/customproxy.qdoc
index 8b506583..fe6a0d96 100644
--- a/examples/customproxy/doc/src/customproxy.qdoc
+++ b/examples/datavisualization/customproxy/doc/src/customproxy.qdoc
@@ -33,8 +33,8 @@
This example defines a simple flexible data set \c VariantDataSet where each data item is a
a variant list. Each item can have multiple different values, identified by their index in
the list. In this example, the data set is storing monthly rainfall data, where the value in
- index one is the year, index two contains the month, and the third value has the amount
- of rainfall in that month.
+ index zero is the year, the value in index one is the month, and the value in index two is
+ the amount of rainfall in that month.
The custom proxy we provide here is similar to item model based proxies provided by Qt
Data Visualization in that it requires a mapping to interpret the data.
@@ -45,10 +45,10 @@
\c VariantDataSet class provides a simple API:
- \snippet ../examples/customproxy/variantdataset.h 1
+ \snippet customproxy/variantdataset.h 1
\dots 0
\codeline
- \snippet ../examples/customproxy/variantdataset.h 0
+ \snippet customproxy/variantdataset.h 0
As you can see, the data items are simply QVariantList objects, and the data can be added either
singly or in lists. The only additional functionality provided is clearing the data set and querying
@@ -60,17 +60,17 @@
\c VariantBarDataProxy is a subclass of QBarDataProxy and provides a simple API of just getters
and setters for the data set and the mapping:
- \snippet ../examples/customproxy/variantbardataproxy.h 0
+ \snippet customproxy/variantbardataproxy.h 0
\dots 0
\codeline
- \snippet ../examples/customproxy/variantbardataproxy.h 1
+ \snippet customproxy/variantbardataproxy.h 1
On the implementation side, the proxy listens for the changes in the data set and the mapping,
and resolves the data set if any changes are detected. It is not particularly efficient
implementation in that any change will cause re-resolving of the entire data set, but that is not
an issue for this example. The interesting part is the \c resolveDataSet() method:
- \snippet ../examples/customproxy/variantbardataproxy.cpp 0
+ \snippet customproxy/variantbardataproxy.cpp 0
In \c resolveDataSet() method we sort the variant data values into rows and columns based on the
mapping. This is very similar to how QItemModelBarDataProxy handles mapping, except we use
@@ -83,16 +83,16 @@
and rows, columns, and values of \c QBarDataArray. It also contains the lists of rows and columns to
be included in the resolved data:
- \snippet ../examples/customproxy/variantbardatamapping.h 0
+ \snippet customproxy/variantbardatamapping.h 0
\dots 0
\codeline
- \snippet ../examples/customproxy/variantbardatamapping.h 1
+ \snippet customproxy/variantbardatamapping.h 1
\dots 0
\codeline
- \snippet ../examples/customproxy/variantbardatamapping.h 2
+ \snippet customproxy/variantbardatamapping.h 2
\dots 0
\codeline
- \snippet ../examples/customproxy/variantbardatamapping.h 3
+ \snippet customproxy/variantbardatamapping.h 3
The primary way to use a \c VariantBarDataMapping object is to give the mappings already at the
constructor, though they can be set later individually or all together with the \c remap() method.
@@ -104,10 +104,10 @@
\c RainfallGraph class handles the setup of the graph. The interesting part is the \c addDataSet()
method:
- \snippet ../examples/customproxy/rainfallgraph.cpp 0
+ \snippet customproxy/rainfallgraph.cpp 0
The bulk of that method is used for populating the variant data set. Once the set is populated,
visualizing the data is trivial with the help of our custom proxy:
- \snippet ../examples/customproxy/rainfallgraph.cpp 1
+ \snippet customproxy/rainfallgraph.cpp 1
*/
diff --git a/examples/customproxy/main.cpp b/examples/datavisualization/customproxy/main.cpp
index dd74721e..4ec67f4b 100644
--- a/examples/customproxy/main.cpp
+++ b/examples/datavisualization/customproxy/main.cpp
@@ -17,7 +17,7 @@
****************************************************************************/
#include "rainfallgraph.h"
-#include <QGuiApplication>
+#include <QtGui/QGuiApplication>
using namespace QtDataVisualization;
diff --git a/examples/customproxy/rainfallgraph.cpp b/examples/datavisualization/customproxy/rainfallgraph.cpp
index e2f04923..024fc2a1 100644
--- a/examples/customproxy/rainfallgraph.cpp
+++ b/examples/datavisualization/customproxy/rainfallgraph.cpp
@@ -23,11 +23,11 @@
#include <QtDataVisualization/q3dcamera.h>
#include <QtDataVisualization/qbar3dseries.h>
#include <QtDataVisualization/q3dtheme.h>
-#include <QGuiApplication>
-#include <QFont>
-#include <QDebug>
-#include <QTextStream>
-#include <QFile>
+#include <QtGui/QGuiApplication>
+#include <QtGui/QFont>
+#include <QtCore/QDebug>
+#include <QtCore/QTextStream>
+#include <QtCore/QFile>
using namespace QtDataVisualization;
diff --git a/examples/customproxy/rainfallgraph.h b/examples/datavisualization/customproxy/rainfallgraph.h
index 6116eb9b..6116eb9b 100644
--- a/examples/customproxy/rainfallgraph.h
+++ b/examples/datavisualization/customproxy/rainfallgraph.h
diff --git a/examples/customproxy/variantbardatamapping.cpp b/examples/datavisualization/customproxy/variantbardatamapping.cpp
index c8369b6e..c8369b6e 100644
--- a/examples/customproxy/variantbardatamapping.cpp
+++ b/examples/datavisualization/customproxy/variantbardatamapping.cpp
diff --git a/examples/customproxy/variantbardatamapping.h b/examples/datavisualization/customproxy/variantbardatamapping.h
index 3a145d9a..2f6a0ca1 100644
--- a/examples/customproxy/variantbardatamapping.h
+++ b/examples/datavisualization/customproxy/variantbardatamapping.h
@@ -19,7 +19,7 @@
#ifndef VARIANTBARDATAMAPPING_H
#define VARIANTBARDATAMAPPING_H
-#include <QStringList>
+#include <QtCore/QStringList>
class VariantBarDataMapping : public QObject
{
diff --git a/examples/customproxy/variantbardataproxy.cpp b/examples/datavisualization/customproxy/variantbardataproxy.cpp
index cf1e1f90..cf1e1f90 100644
--- a/examples/customproxy/variantbardataproxy.cpp
+++ b/examples/datavisualization/customproxy/variantbardataproxy.cpp
diff --git a/examples/customproxy/variantbardataproxy.h b/examples/datavisualization/customproxy/variantbardataproxy.h
index b83f8a71..41aeaa3f 100644
--- a/examples/customproxy/variantbardataproxy.h
+++ b/examples/datavisualization/customproxy/variantbardataproxy.h
@@ -22,9 +22,9 @@
#include "qbardataproxy.h"
#include "variantdataset.h"
#include "variantbardatamapping.h"
-#include <QStringList>
-#include <QMap>
-#include <QPointer>
+#include <QtCore/QStringList>
+#include <QtCore/QMap>
+#include <QtCore/QPointer>
using namespace QtDataVisualization;
diff --git a/examples/customproxy/variantdataset.cpp b/examples/datavisualization/customproxy/variantdataset.cpp
index 3576aaab..3576aaab 100644
--- a/examples/customproxy/variantdataset.cpp
+++ b/examples/datavisualization/customproxy/variantdataset.cpp
diff --git a/examples/customproxy/variantdataset.h b/examples/datavisualization/customproxy/variantdataset.h
index f5eb5863..6a131d1a 100644
--- a/examples/customproxy/variantdataset.h
+++ b/examples/datavisualization/customproxy/variantdataset.h
@@ -19,8 +19,8 @@
#ifndef VARIANTDATASET_H
#define VARIANTDATASET_H
-#include <QScopedPointer>
-#include <QVariantList>
+#include <QtCore/QScopedPointer>
+#include <QtCore/QVariantList>
//! [1]
typedef QVariantList VariantDataItem;
diff --git a/examples/datavisualization/datavisualization.pro b/examples/datavisualization/datavisualization.pro
new file mode 100644
index 00000000..4330ef4c
--- /dev/null
+++ b/examples/datavisualization/datavisualization.pro
@@ -0,0 +1,21 @@
+TEMPLATE = subdirs
+SUBDIRS += qmlbars \
+ qmlscatter \
+ qmlsurface \
+ qmlcustominput \
+ qmllegend \
+ qmlmultigraph \
+ qmloscilloscope \
+ qmlsurfacelayers
+
+!android:!ios {
+ SUBDIRS += bars \
+ custominput \
+ customproxy \
+ itemmodel \
+ scatter \
+ surface \
+ rotations
+}
+
+qtHaveModule(multimedia):!android:!ios: SUBDIRS += audiolevels
diff --git a/examples/datavisualization/examples.pri b/examples/datavisualization/examples.pri
new file mode 100644
index 00000000..2acf1234
--- /dev/null
+++ b/examples/datavisualization/examples.pri
@@ -0,0 +1,14 @@
+INCLUDEPATH += ../../../include
+
+LIBS += -L$$OUT_PWD/../../../lib
+
+TEMPLATE = app
+
+QT += datavisualization
+
+contains(TARGET, qml.*) {
+ QT += qml quick
+}
+
+target.path = $$[QT_INSTALL_EXAMPLES]/datavisualization/$$TARGET
+INSTALLS += target
diff --git a/examples/itemmodel/doc/images/itemmodel-example-2.png b/examples/datavisualization/itemmodel/doc/images/itemmodel-example-2.png
index 677b7eec..677b7eec 100644
--- a/examples/itemmodel/doc/images/itemmodel-example-2.png
+++ b/examples/datavisualization/itemmodel/doc/images/itemmodel-example-2.png
Binary files differ
diff --git a/examples/itemmodel/doc/images/itemmodel-example.png b/examples/datavisualization/itemmodel/doc/images/itemmodel-example.png
index c042f84d..c042f84d 100644
--- a/examples/itemmodel/doc/images/itemmodel-example.png
+++ b/examples/datavisualization/itemmodel/doc/images/itemmodel-example.png
Binary files differ
diff --git a/examples/itemmodel/doc/src/itemmodel.qdoc b/examples/datavisualization/itemmodel/doc/src/itemmodel.qdoc
index 16cd1974..a3e7a5c5 100644
--- a/examples/itemmodel/doc/src/itemmodel.qdoc
+++ b/examples/datavisualization/itemmodel/doc/src/itemmodel.qdoc
@@ -39,7 +39,7 @@
First, in main.cpp, we create a QApplication, instantiate Q3DBars and a window container for it:
- \snippet ../examples/itemmodel/main.cpp 0
+ \snippet itemmodel/main.cpp 0
The call to QWidget::createWindowContainer is required, as all data visualization types
(Q3DBars, Q3DScatter, and Q3DSurface) inherit QWindow. Any class inheriting QWindow cannot be used
@@ -47,7 +47,7 @@
Then we'll create a layout and add the graph and the table widget into it:
- \snippet ../examples/itemmodel/main.cpp 1
+ \snippet itemmodel/main.cpp 1
The table widget is going to be used to display the numerical data being inserted into the
graph, and to modify it (See \l {Adding data to the graph} and \l {Interacting with the data}).
@@ -55,7 +55,7 @@
We need to instantiate QItemModelBarDataProxy and a QBar3DSeries for it, and give the series
to the graph:
- \snippet ../examples/itemmodel/main.cpp 2
+ \snippet itemmodel/main.cpp 2
Here we tell the proxy to directly map the model's rows and columns into the proxy's rows and
columns instead of defining row and column roles to map for them. Then we give the model from
@@ -68,19 +68,19 @@
\l {Adding data to the graph} for details) and connect some signals between QBar3DSeries,
\c GraphDataGenerator, and QTableWidget (See \l {Interacting with the data} for a closer look):
- \snippet ../examples/itemmodel/main.cpp 3
+ \snippet itemmodel/main.cpp 3
The application main is done and we can show the graph and start the event loop:
- \snippet ../examples/itemmodel/main.cpp 4
+ \snippet itemmodel/main.cpp 4
\section1 Setting up the graph
Let's set up the visual attributes for the graph in the constructor of \c GraphDataGenerator:
- \snippet ../examples/itemmodel/main.cpp 5
- \snippet ../examples/itemmodel/main.cpp 6
- \snippet ../examples/itemmodel/main.cpp 7
+ \snippet itemmodel/main.cpp 5
+ \snippet itemmodel/main.cpp 6
+ \snippet itemmodel/main.cpp 7
First we set bar thickness ratio to 1.0, which means bars will be as wide as they are deep. 1.0
is also the default value, so the line is basically unnecessary. It's left there so you could
@@ -116,7 +116,7 @@
Let's have a look at the contents of the \c start() method:
- \snippet ../examples/itemmodel/main.cpp 8
+ \snippet itemmodel/main.cpp 8
The main thing \c start() does is set up the data model. It also activates a timer for getting
the accurate dimensions of the table widget after it's been filled with data. The reason we
@@ -126,26 +126,26 @@
In \c setupModel() we first introduce the row and column labels, and the actual data:
- \snippet ../examples/itemmodel/main.cpp 9
+ \snippet itemmodel/main.cpp 9
Then we set up the axes:
- \snippet ../examples/itemmodel/main.cpp 10
+ \snippet itemmodel/main.cpp 10
Next we will set up the table widget:
- \snippet ../examples/itemmodel/main.cpp 11
+ \snippet itemmodel/main.cpp 11
After that all that's left is adding the data to the table widget:
- \snippet ../examples/itemmodel/main.cpp 12
+ \snippet itemmodel/main.cpp 12
Now we have a bar graph and a table widget, both displaying the same data.
You're probably wondering how the data can be displayed in the graph, as the only thing we did
was add it to the table widget? That's because of what we did earlier, in the application main:
- \snippet ../examples/itemmodel/main.cpp 2
+ \snippet itemmodel/main.cpp 2
We created QItemModelBarDataProxy instance, and gave the proxy the model of the table widget
we just created. The proxy maps the rows and the columns in the model of the table widget into
@@ -156,7 +156,7 @@
We made a couple of signal connections in the application main earlier:
- \snippet ../examples/itemmodel/main.cpp 3
+ \snippet itemmodel/main.cpp 3
Now we'll find out what these were for.
@@ -164,12 +164,12 @@
QBar3DSeries::selectedBarChanged() is emitted when a bar is selected from the series. We connect
that to a method in the data generator that selects the same data item in the table widget:
- \snippet ../examples/itemmodel/main.cpp 13
+ \snippet itemmodel/main.cpp 13
The second connection does the opposite; it connects a signal from the table widget to a
method in the data generator. The method then selects the corresponding bar in the series:
- \snippet ../examples/itemmodel/main.cpp 14
+ \snippet itemmodel/main.cpp 14
You can even select an item in the widget and change the value of it, and the new value is
updated to the graph. This is handled again by the proxy with mapping between the data
diff --git a/examples/itemmodel/itemmodel.pro b/examples/datavisualization/itemmodel/itemmodel.pro
index f319f690..c4caa3f2 100644
--- a/examples/itemmodel/itemmodel.pro
+++ b/examples/datavisualization/itemmodel/itemmodel.pro
@@ -4,8 +4,6 @@
SOURCES += main.cpp
-INSTALLS += target
-
QT += widgets
OTHER_FILES += doc/src/* \
diff --git a/examples/itemmodel/main.cpp b/examples/datavisualization/itemmodel/main.cpp
index b6b67f85..ad9f0112 100644
--- a/examples/itemmodel/main.cpp
+++ b/examples/datavisualization/itemmodel/main.cpp
@@ -25,14 +25,14 @@
#include <QtDataVisualization/qbar3dseries.h>
#include <QtDataVisualization/q3dtheme.h>
-#include <QApplication>
-#include <QVBoxLayout>
-#include <QTableWidget>
-#include <QScreen>
-#include <QTimer>
-#include <QFont>
-#include <QDebug>
-#include <QHeaderView>
+#include <QtWidgets/QApplication>
+#include <QtWidgets/QVBoxLayout>
+#include <QtWidgets/QTableWidget>
+#include <QtGui/QScreen>
+#include <QtCore/QTimer>
+#include <QtGui/QFont>
+#include <QtCore/QDebug>
+#include <QtWidgets/QHeaderView>
#define USE_STATIC_DATA
@@ -80,8 +80,8 @@ GraphDataGenerator::GraphDataGenerator(Q3DBars *bargraph, QTableWidget *tableWid
// and add a small space between them
m_graph->setBarThickness(1.0f);
m_graph->setBarSpacing(QSizeF(0.2, 0.2));
- //! [5]
+ //! [5]
#ifndef USE_STATIC_DATA
// Set up sample space; make it as deep as it's wide
m_graph->rowAxis()->setRange(0, m_rowCount);
@@ -98,7 +98,6 @@ GraphDataGenerator::GraphDataGenerator(Q3DBars *bargraph, QTableWidget *tableWid
m_graph->seriesList().at(0)->setItemLabelFormat(QStringLiteral("@valueLabel"));
#else
//! [6]
-
// Set selection mode to slice row
m_graph->setSelectionMode(QAbstract3DGraph::SelectionItemAndRow | QAbstract3DGraph::SelectionSlice);
@@ -106,7 +105,6 @@ GraphDataGenerator::GraphDataGenerator(Q3DBars *bargraph, QTableWidget *tableWid
#endif
//! [7]
-
// Set theme
m_graph->activeTheme()->setType(Q3DTheme::ThemeDigia);
@@ -138,6 +136,7 @@ void GraphDataGenerator::start()
#else
//! [8]
setupModel();
+
// Table needs to be shown before the size of its headers can be accurately obtained,
// so we postpone it a bit
m_dataTimer = new QTimer();
diff --git a/examples/qmlbars/doc/images/qmlbars-example.png b/examples/datavisualization/qmlbars/doc/images/qmlbars-example.png
index 64ad6b0e..64ad6b0e 100644
--- a/examples/qmlbars/doc/images/qmlbars-example.png
+++ b/examples/datavisualization/qmlbars/doc/images/qmlbars-example.png
Binary files differ
diff --git a/examples/qmlbars/doc/src/qmlbars.qdoc b/examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc
index ecd8055a..d3da5e6a 100644
--- a/examples/qmlbars/doc/src/qmlbars.qdoc
+++ b/examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc
@@ -34,9 +34,9 @@
\section1 Data
The example data is monthly income and expenses of a fictional company over several years.
- The data is defined in a list model in \c data.qml like this:
+ The data is defined in a list model in \c Data.qml like this:
- \snippet ../examples/qmlbars/qml/qmlbars/data.qml 0
+ \snippet qmlbars/qml/qmlbars/Data.qml 0
\dots
Each data item has four roles: year, month, income, and expenses. Years and months are natural to
@@ -46,7 +46,7 @@
Now we need to add the data to the Bars3D graph. We will create two Bar3DSeries inside it,
starting with a series for the income:
- \snippet ../examples/qmlbars/qml/qmlbars/main.qml 3
+ \snippet qmlbars/qml/qmlbars/main.qml 3
\dots
The data is attached to the \c itemModel property of the ItemModelBarDataProxy inside the
@@ -54,7 +54,7 @@
Then we add another series for the expenses:
- \snippet ../examples/qmlbars/qml/qmlbars/main.qml 4
+ \snippet qmlbars/qml/qmlbars/main.qml 4
\dots
We use the \c visible property of the series to hide the second series for now.
@@ -62,10 +62,10 @@
\section1 Custom axis labels
One interesting tidbit about axes is that we redefine the category labels for column axis in
- \c axes.qml. This is done because the data contains abbreviated month names, which we don't want
+ \c Axes.qml. This is done because the data contains abbreviated month names, which we don't want
to use for our column labels:
- \snippet ../examples/qmlbars/qml/qmlbars/axes.qml 0
+ \snippet qmlbars/qml/qmlbars/Axes.qml 0
\section1 Switching series
@@ -74,14 +74,14 @@
visualized data between income, expenses, and both, by simply changing visibility of the two
series:
- \snippet ../examples/qmlbars/qml/qmlbars/main.qml 0
+ \snippet qmlbars/qml/qmlbars/main.qml 0
The axis change is done because income and expenses have a different label format. The same could have
been achieved using a single axis and just changing the label format.
The second interesting block is where we filter some of the rows away from the visualized data:
- \snippet ../examples/qmlbars/qml/qmlbars/main.qml 1
+ \snippet qmlbars/qml/qmlbars/main.qml 1
The filtering is done by setting \c autoRowCategories to false on the ItemModelBarDataProxy item and defining
the row categories explicitly. This way, only the items in specified rows are visualized.
@@ -89,5 +89,5 @@
The third interesting block shows how to get the row and column index of an item if you know the
row and column values by using ItemModelBarDataProxy methods \c rowCategoryIndex() and \c columnCategoryIndex():
- \snippet ../examples/qmlbars/qml/qmlbars/main.qml 2
+ \snippet qmlbars/qml/qmlbars/main.qml 2
*/
diff --git a/examples/qmlbars/main.cpp b/examples/datavisualization/qmlbars/main.cpp
index 001c5625..966d068a 100644
--- a/examples/qmlbars/main.cpp
+++ b/examples/datavisualization/qmlbars/main.cpp
@@ -16,32 +16,30 @@
**
****************************************************************************/
-#include <QtDataVisualization/qutils.h>
#include <QtGui/QGuiApplication>
-#include "qtquick2applicationviewer.h"
-#ifdef Q_OS_ANDROID
-#include <QDir>
-#include <QQmlEngine>
-#endif
-#include <QDebug>
+#include <QtCore/QDir>
+#include <QtQuick/QQuickView>
+#include <QtQml/QQmlEngine>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
- QtQuick2ApplicationViewer viewer;
-
- // Enable antialiasing
- viewer.setFormat(QtDataVisualization::qDefaultSurfaceFormat());
+ QQuickView viewer;
-#ifdef Q_OS_ANDROID
- viewer.addImportPath(QString::fromLatin1("assets:/qml"));
- viewer.engine()->addPluginPath(QString::fromLatin1("%1/../%2").arg(QDir::homePath(),
- QString::fromLatin1("lib")));
+ // The following are needed to make examples run without having to install the module
+ // in desktop environments.
+#ifdef Q_OS_WIN
+ QString extraImportPath(QStringLiteral("%1/../../../../%2"));
+#else
+ QString extraImportPath(QStringLiteral("%1/../../../%2"));
#endif
+ viewer.engine()->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
+ QString::fromLatin1("qml")));
+
viewer.setTitle(QStringLiteral("Monthly income/expenses"));
- viewer.setSource(QUrl("qrc:/qml/main.qml"));
+ viewer.setSource(QUrl("qrc:/qml/qmlbars/main.qml"));
viewer.setResizeMode(QQuickView::SizeRootObjectToView);
viewer.show();
diff --git a/examples/qmlbars/qml/qmlbars/axes.qml b/examples/datavisualization/qmlbars/qml/qmlbars/Axes.qml
index 29979e1b..29979e1b 100644
--- a/examples/qmlbars/qml/qmlbars/axes.qml
+++ b/examples/datavisualization/qmlbars/qml/qmlbars/Axes.qml
diff --git a/examples/qmlbars/qml/qmlbars/data.qml b/examples/datavisualization/qmlbars/qml/qmlbars/Data.qml
index 7e0978c6..7e0978c6 100644
--- a/examples/qmlbars/qml/qmlbars/data.qml
+++ b/examples/datavisualization/qmlbars/qml/qmlbars/Data.qml
diff --git a/examples/qmlbars/qml/qmlbars/main.qml b/examples/datavisualization/qmlbars/qml/qmlbars/main.qml
index 0ff060ca..3711a504 100644
--- a/examples/qmlbars/qml/qmlbars/main.qml
+++ b/examples/datavisualization/qmlbars/qml/qmlbars/main.qml
@@ -23,7 +23,7 @@ import QtDataVisualization 1.0
import QtQuick.Window 2.0
import "."
-Item {
+Rectangle {
id: mainview
width: 1280
height: 1024
diff --git a/examples/datavisualization/qmlbars/qmlbars.pro b/examples/datavisualization/qmlbars/qmlbars.pro
new file mode 100644
index 00000000..cfd449ed
--- /dev/null
+++ b/examples/datavisualization/qmlbars/qmlbars.pro
@@ -0,0 +1,12 @@
+!include( ../examples.pri ) {
+ error( "Couldn't find the examples.pri file!" )
+}
+
+# The .cpp file which was generated for your project. Feel free to hack it.
+SOURCES += main.cpp
+
+RESOURCES += qmlbars.qrc
+
+OTHER_FILES += doc/src/* \
+ doc/images/* \
+ qml/qmlbars/*
diff --git a/examples/datavisualization/qmlbars/qmlbars.qrc b/examples/datavisualization/qmlbars/qmlbars.qrc
new file mode 100644
index 00000000..2240fbef
--- /dev/null
+++ b/examples/datavisualization/qmlbars/qmlbars.qrc
@@ -0,0 +1,7 @@
+<RCC>
+ <qresource prefix="/">
+ <file>qml/qmlbars/Axes.qml</file>
+ <file>qml/qmlbars/Data.qml</file>
+ <file>qml/qmlbars/main.qml</file>
+ </qresource>
+</RCC>
diff --git a/examples/datavisualization/qmlcustominput/doc/images/qmlcustominput-example.png b/examples/datavisualization/qmlcustominput/doc/images/qmlcustominput-example.png
new file mode 100644
index 00000000..33d00708
--- /dev/null
+++ b/examples/datavisualization/qmlcustominput/doc/images/qmlcustominput-example.png
Binary files differ
diff --git a/examples/qmlcustominput/doc/src/qmlcustominput.qdoc b/examples/datavisualization/qmlcustominput/doc/src/qmlcustominput.qdoc
index 7702dadf..ac511505 100644
--- a/examples/qmlcustominput/doc/src/qmlcustominput.qdoc
+++ b/examples/datavisualization/qmlcustominput/doc/src/qmlcustominput.qdoc
@@ -18,11 +18,11 @@
/*!
\example qmlcustominput
- \title Qt Quick Custom Input Example
+ \title Qt Quick 2 Custom Input Example
\ingroup qtdatavisualization_examples
- \brief Customizing input in a Qt Quick application.
+ \brief Customizing input in a QML application.
- The Qt Quick Custom Input example shows how to customize the 3D graph controls from Qt Quick using the MouseArea to capture and process mouse events in Qt Quick.
+ The Qt Quick 2 Custom Input example shows how to customize the 3D graph controls from Qt Quick 2 using the MouseArea to capture and process mouse events in QML.
Custom input handling code in this example shows how the camera is now controlled by using NumberAnimation to animate the camera and item selection
is done on mouseover rather than clicking any mouse buttons. Also the code shows how to implement similar zoom with mouse wheel functionality as the default
input handler implements.
@@ -33,9 +33,9 @@
The default input handling mechanism is disabled by setting the inputHandler property to null.
- \snippet ../examples/qmlcustominput/qml/qmlcustominput/main.qml 0
+ \snippet qmlcustominput/qml/qmlcustominput/main.qml 0
\dots 0
- \snippet ../examples/qmlcustominput/qml/qmlcustominput/main.qml 1
+ \snippet qmlcustominput/qml/qmlcustominput/main.qml 1
\dots 0
\section1 Implementing custom selection handling
@@ -44,16 +44,16 @@
The mouse area is configured to capture hover events and has two custom properties for \c mouseX and \c mouseY
to store the last known mouse coordinates.
- \snippet ../examples/qmlcustominput/qml/qmlcustominput/main.qml 2
+ \snippet qmlcustominput/qml/qmlcustominput/main.qml 2
Whenever a pointer movement related signal is received the code updates the \c mouseX and \c mouseY properties.
- \snippet ../examples/qmlcustominput/qml/qmlcustominput/main.qml 3
+ \snippet qmlcustominput/qml/qmlcustominput/main.qml 3
As the selection is one shot, and is cleared each time a 3D frame is rendered, a timer is setup to retrigger selection so that the selection moves to the item
currently under the mouse cursor as the camera animates around the graph even when the mouse cursor is not moving.
- \snippet ../examples/qmlcustominput/qml/qmlcustominput/main.qml 4
+ \snippet qmlcustominput/qml/qmlcustominput/main.qml 4
\section1 Implementing custom zoom handling
@@ -62,7 +62,7 @@
based on the current subrange.
\dots
- \snippet ../examples/qmlcustominput/qml/qmlcustominput/main.qml 5
+ \snippet qmlcustominput/qml/qmlcustominput/main.qml 5
\dots
\section1 Implementing custom camera handling
@@ -70,10 +70,10 @@
The camera is animated to constantly rotate around the graph with two animations. The rotation around the graph is done with
a simple NumberAnimation that just increments during 20 seconds from 0 degrees to 360 degrees and sets the \l Q3DCamera::xRotation property.
- \snippet ../examples/qmlcustominput/qml/qmlcustominput/main.qml 6
+ \snippet qmlcustominput/qml/qmlcustominput/main.qml 6
The camera movement up and down is implemented with a SequentialAnimation that varies the \l Q3DCamera::yRotation property of the camera
from 5 degrees to 45 degrees and back with in and out easing.
- \snippet ../examples/qmlcustominput/qml/qmlcustominput/main.qml 7
+ \snippet qmlcustominput/qml/qmlcustominput/main.qml 7
*/
diff --git a/examples/qmlcustominput/main.cpp b/examples/datavisualization/qmlcustominput/main.cpp
index fcdd0035..d4658d41 100644
--- a/examples/qmlcustominput/main.cpp
+++ b/examples/datavisualization/qmlcustominput/main.cpp
@@ -16,32 +16,31 @@
**
****************************************************************************/
-#include <QtDataVisualization/qutils.h>
#include <QtGui/QGuiApplication>
-#include "qtquick2applicationviewer.h"
-#ifdef Q_OS_ANDROID
-#include <QDir>
-#include <QQmlEngine>
-#endif
-#include <QDebug>
+#include <QtCore/QDir>
+#include <QtQuick/QQuickView>
+#include <QtQml/QQmlEngine>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
- QtQuick2ApplicationViewer viewer;
-
- // Enable antialiasing
- viewer.setFormat(QtDataVisualization::qDefaultSurfaceFormat());
+ QQuickView viewer;
-#ifdef Q_OS_ANDROID
- viewer.addImportPath(QString::fromLatin1("assets:/qml"));
- viewer.engine()->addPluginPath(QString::fromLatin1("%1/../%2").arg(QDir::homePath(),
- QString::fromLatin1("lib")));
+ // The following are needed to make examples run without having to install the module
+ // in desktop environments.
+#ifdef Q_OS_WIN
+ QString extraImportPath(QStringLiteral("%1/../../../../%2"));
+#else
+ QString extraImportPath(QStringLiteral("%1/../../../%2"));
#endif
+ viewer.engine()->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
+ QString::fromLatin1("qml")));
+ QObject::connect(viewer.engine(), &QQmlEngine::quit, &viewer, &QWindow::close);
+
viewer.setTitle(QStringLiteral("QML Custom Input"));
- viewer.setSource(QUrl("qrc:/qml/main.qml"));
+ viewer.setSource(QUrl("qrc:/qml/qmlcustominput/main.qml"));
viewer.setResizeMode(QQuickView::SizeRootObjectToView);
viewer.show();
diff --git a/examples/qmlcustominput/qml/qmlcustominput/data.qml b/examples/datavisualization/qmlcustominput/qml/qmlcustominput/Data.qml
index 201247f1..8aa26481 100644
--- a/examples/qmlcustominput/qml/qmlcustominput/data.qml
+++ b/examples/datavisualization/qmlcustominput/qml/qmlcustominput/Data.qml
@@ -19,10 +19,12 @@
import QtQuick 2.1
Item {
- property alias model: dataModel
+ property alias modelOne: dataModelOne
+ property alias modelTwo: dataModelTwo
+ property alias modelThree: dataModelThree
ListModel {
- id: dataModel
+ id: dataModelOne
ListElement{ xPos: -10.0000; yPos: 5.00000; zPos: -5.00000 }
ListElement{ xPos: -9.06229; yPos: 3.07132; zPos: -4.54268 }
ListElement{ xPos: -8.55132; yPos: 4.19424; zPos: -4.03318 }
@@ -46,7 +48,10 @@ Item {
ListElement{ xPos: -7.91649; yPos: 3.46826; zPos: -2.78126 }
ListElement{ xPos: -7.49495; yPos: 3.12306; zPos: -3.14539 }
ListElement{ xPos: -7.5445; yPos: 2.85744; zPos: -3.68421 }
+ }
+ ListModel {
+ id: dataModelTwo
ListElement{ xPos: 2.25354; yPos: 1.36828; zPos: -1.32025 }
ListElement{ xPos: -2.35524; yPos: -0.081203; zPos: 1.23267 }
ListElement{ xPos: 2.6517; yPos: -1.20549; zPos: 2.73606 }
@@ -1047,7 +1052,10 @@ Item {
ListElement{ xPos: 0.855717; yPos: -2.92161; zPos: 3.4496 }
ListElement{ xPos: -0.717941; yPos: 2.52993; zPos: 1.25007 }
ListElement{ xPos: -3.42927; yPos: 0.673305; zPos: 0.995742 }
+ }
+ ListModel {
+ id: dataModelThree
ListElement{ xPos: 8.00000; yPos: -2.05136; zPos: 4.02113 }
ListElement{ xPos: 7.88929; yPos: -2.2029; zPos: 5.0000 }
ListElement{ xPos: 7.61596; yPos: -2.44569; zPos: 4.54892 }
diff --git a/examples/qmlcustominput/qml/qmlcustominput/newbutton.qml b/examples/datavisualization/qmlcustominput/qml/qmlcustominput/NewButton.qml
index e4fb99d2..e4fb99d2 100644
--- a/examples/qmlcustominput/qml/qmlcustominput/newbutton.qml
+++ b/examples/datavisualization/qmlcustominput/qml/qmlcustominput/NewButton.qml
diff --git a/examples/qmlcustominput/qml/qmlcustominput/main.qml b/examples/datavisualization/qmlcustominput/qml/qmlcustominput/main.qml
index cfac0f15..e81dd749 100644
--- a/examples/qmlcustominput/qml/qmlcustominput/main.qml
+++ b/examples/datavisualization/qmlcustominput/qml/qmlcustominput/main.qml
@@ -21,7 +21,7 @@ import QtQuick.Layouts 1.0
import QtDataVisualization 1.0
import "."
-Item {
+Rectangle {
id: mainView
width: 1280
height: 720
@@ -50,12 +50,38 @@ Item {
//! [1]
Scatter3DSeries {
- id: scatterSeries
- itemLabelFormat: "X:@xLabel Y:@yLabel Z:@zLabel"
+ id: scatterSeriesOne
+ itemLabelFormat: "One - X:@xLabel Y:@yLabel Z:@zLabel"
mesh: Abstract3DSeries.MeshCube
ItemModelScatterDataProxy {
- itemModel: graphData.model
+ itemModel: graphData.modelOne
+ xPosRole: "xPos"
+ yPosRole: "yPos"
+ zPosRole: "zPos"
+ }
+ }
+
+ Scatter3DSeries {
+ id: scatterSeriesTwo
+ itemLabelFormat: "Two - X:@xLabel Y:@yLabel Z:@zLabel"
+ mesh: Abstract3DSeries.MeshCube
+
+ ItemModelScatterDataProxy {
+ itemModel: graphData.modelTwo
+ xPosRole: "xPos"
+ yPosRole: "yPos"
+ zPosRole: "zPos"
+ }
+ }
+
+ Scatter3DSeries {
+ id: scatterSeriesThree
+ itemLabelFormat: "Three - X:@xLabel Y:@yLabel Z:@zLabel"
+ mesh: Abstract3DSeries.MeshCube
+
+ ItemModelScatterDataProxy {
+ itemModel: graphData.modelThree
xPosRole: "xPos"
yPosRole: "yPos"
zPosRole: "zPos"
@@ -168,7 +194,7 @@ Item {
onClicked: {
if (scatterGraph.shadowQuality === AbstractGraph3D.ShadowQualityNone) {
- scatterGraph.shadowQuality = AbstractGraph3D.ShadowQualitySoftMedium;
+ scatterGraph.shadowQuality = AbstractGraph3D.ShadowQualityMedium;
text = "Hide Shadows";
} else {
scatterGraph.shadowQuality = AbstractGraph3D.ShadowQualityNone;
diff --git a/examples/datavisualization/qmlcustominput/qmlcustominput.pro b/examples/datavisualization/qmlcustominput/qmlcustominput.pro
new file mode 100644
index 00000000..356bb26f
--- /dev/null
+++ b/examples/datavisualization/qmlcustominput/qmlcustominput.pro
@@ -0,0 +1,12 @@
+!include( ../examples.pri ) {
+ error( "Couldn't find the examples.pri file!" )
+}
+
+# The .cpp file which was generated for your project. Feel free to hack it.
+SOURCES += main.cpp
+
+RESOURCES += qmlcustominput.qrc
+
+OTHER_FILES += doc/src/* \
+ doc/images/* \
+ qml/qmlcustominput/*
diff --git a/examples/datavisualization/qmlcustominput/qmlcustominput.qrc b/examples/datavisualization/qmlcustominput/qmlcustominput.qrc
new file mode 100644
index 00000000..5800150a
--- /dev/null
+++ b/examples/datavisualization/qmlcustominput/qmlcustominput.qrc
@@ -0,0 +1,7 @@
+<RCC>
+ <qresource prefix="/">
+ <file>qml/qmlcustominput/Data.qml</file>
+ <file>qml/qmlcustominput/main.qml</file>
+ <file>qml/qmlcustominput/NewButton.qml</file>
+ </qresource>
+</RCC>
diff --git a/examples/qmllegend/doc/images/qmllegend-example.png b/examples/datavisualization/qmllegend/doc/images/qmllegend-example.png
index ee546077..ee546077 100644
--- a/examples/qmllegend/doc/images/qmllegend-example.png
+++ b/examples/datavisualization/qmllegend/doc/images/qmllegend-example.png
Binary files differ
diff --git a/examples/qmllegend/doc/src/qmllegend.qdoc b/examples/datavisualization/qmllegend/doc/src/qmllegend.qdoc
index 14bacf06..b7351721 100644
--- a/examples/qmllegend/doc/src/qmllegend.qdoc
+++ b/examples/datavisualization/qmllegend/doc/src/qmllegend.qdoc
@@ -35,15 +35,15 @@
The legend is simply a column of custom \c LegendItem items inside a transparent rectangle.
Each item is supplied with a series and the graph theme:
- \snippet ../examples/qmllegend/qml/qmllegend/main.qml 0
+ \snippet qmllegend/qml/qmllegend/main.qml 0
The legend items consist of a marker rectangle, which indicates the color of the series,
and a text field, which shows the name of the series. The colors we get from the series and
the theme supplied at legend item initialization:
- \snippet ../examples/qmllegend/qml/qmllegend/legenditem.qml 0
+ \snippet qmllegend/qml/qmllegend/LegendItem.qml 0
\dots 4
- \snippet ../examples/qmllegend/qml/qmllegend/legenditem.qml 1
+ \snippet qmllegend/qml/qmllegend/LegendItem.qml 1
We want the legend to be interactive, so we add additional logic to enable selection of a
series by clicking on a legend item, as well as highlighting the legend item corresponding
@@ -52,16 +52,16 @@
The highlight depends on the selection state of the series, so we define two states, which
follow the Bar3DSeries::selectedBar property and adjust the \c legendItem color appropriately:
- \snippet ../examples/qmllegend/qml/qmllegend/legenditem.qml 3
+ \snippet qmllegend/qml/qmllegend/LegendItem.qml 3
To make the legend item interactive, we define a MouseArea to detect clicks on it and adjust
the series selection accordingly:
- \snippet ../examples/qmllegend/qml/qmllegend/legenditem.qml 2
+ \snippet qmllegend/qml/qmllegend/LegendItem.qml 2
The \c previousSelection used above is another custom property of \c LegendItem, which we update
whenever selection changes on the series. This way we remember the last selected bar of
each series:
- \snippet ../examples/qmllegend/qml/qmllegend/legenditem.qml 4
+ \snippet qmllegend/qml/qmllegend/LegendItem.qml 4
*/
diff --git a/examples/qmllegend/main.cpp b/examples/datavisualization/qmllegend/main.cpp
index 954affe4..62016770 100644
--- a/examples/qmllegend/main.cpp
+++ b/examples/datavisualization/qmllegend/main.cpp
@@ -16,32 +16,31 @@
**
****************************************************************************/
-#include <QtDataVisualization/qutils.h>
#include <QtGui/QGuiApplication>
-#include "qtquick2applicationviewer.h"
-#ifdef Q_OS_ANDROID
-#include <QDir>
-#include <QQmlEngine>
-#endif
-#include <QDebug>
+#include <QtCore/QDir>
+#include <QtQuick/QQuickView>
+#include <QtQml/QQmlEngine>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
- QtQuick2ApplicationViewer viewer;
-
- // Enable antialiasing
- viewer.setFormat(QtDataVisualization::qDefaultSurfaceFormat());
+ QQuickView viewer;
-#ifdef Q_OS_ANDROID
- viewer.addImportPath(QString::fromLatin1("assets:/qml"));
- viewer.engine()->addPluginPath(QString::fromLatin1("%1/../%2").arg(QDir::homePath(),
- QString::fromLatin1("lib")));
+ // The following are needed to make examples run without having to install the module
+ // in desktop environments.
+#ifdef Q_OS_WIN
+ QString extraImportPath(QStringLiteral("%1/../../../../%2"));
+#else
+ QString extraImportPath(QStringLiteral("%1/../../../%2"));
#endif
+ viewer.engine()->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
+ QString::fromLatin1("qml")));
+ QObject::connect(viewer.engine(), &QQmlEngine::quit, &viewer, &QWindow::close);
+
viewer.setTitle(QStringLiteral("Legend example"));
- viewer.setSource(QUrl("qrc:/qml/main.qml"));
+ viewer.setSource(QUrl("qrc:/qml/qmllegend/main.qml"));
viewer.setResizeMode(QQuickView::SizeRootObjectToView);
viewer.show();
diff --git a/examples/qmllegend/qml/qmllegend/data.qml b/examples/datavisualization/qmllegend/qml/qmllegend/Data.qml
index 4681c61c..4681c61c 100644
--- a/examples/qmllegend/qml/qmllegend/data.qml
+++ b/examples/datavisualization/qmllegend/qml/qmllegend/Data.qml
diff --git a/examples/qmllegend/qml/qmllegend/legenditem.qml b/examples/datavisualization/qmllegend/qml/qmllegend/LegendItem.qml
index 50be7a8d..50be7a8d 100644
--- a/examples/qmllegend/qml/qmllegend/legenditem.qml
+++ b/examples/datavisualization/qmllegend/qml/qmllegend/LegendItem.qml
diff --git a/examples/qmllegend/qml/qmllegend/newbutton.qml b/examples/datavisualization/qmllegend/qml/qmllegend/NewButton.qml
index e4fb99d2..e4fb99d2 100644
--- a/examples/qmllegend/qml/qmllegend/newbutton.qml
+++ b/examples/datavisualization/qmllegend/qml/qmllegend/NewButton.qml
diff --git a/examples/qmllegend/qml/qmllegend/main.qml b/examples/datavisualization/qmllegend/qml/qmllegend/main.qml
index 6c488d6a..6999a67b 100644
--- a/examples/qmllegend/qml/qmllegend/main.qml
+++ b/examples/datavisualization/qmllegend/qml/qmllegend/main.qml
@@ -22,7 +22,7 @@ import QtQuick.Layouts 1.0
import QtDataVisualization 1.0
import "."
-Item {
+Rectangle {
id: mainView
width: 800
height: 600
diff --git a/examples/datavisualization/qmllegend/qmllegend.pro b/examples/datavisualization/qmllegend/qmllegend.pro
new file mode 100644
index 00000000..af449d8d
--- /dev/null
+++ b/examples/datavisualization/qmllegend/qmllegend.pro
@@ -0,0 +1,13 @@
+!include( ../examples.pri ) {
+ error( "Couldn't find the examples.pri file!" )
+}
+
+# The .cpp file which was generated for your project. Feel free to hack it.
+SOURCES += main.cpp
+
+RESOURCES += qmllegend.qrc
+
+OTHER_FILES += doc/src/* \
+ doc/images/* \
+ qml/qmllegend/*
+
diff --git a/examples/datavisualization/qmllegend/qmllegend.qrc b/examples/datavisualization/qmllegend/qmllegend.qrc
new file mode 100644
index 00000000..b9777b37
--- /dev/null
+++ b/examples/datavisualization/qmllegend/qmllegend.qrc
@@ -0,0 +1,8 @@
+<RCC>
+ <qresource prefix="/">
+ <file>qml/qmllegend/Data.qml</file>
+ <file>qml/qmllegend/LegendItem.qml</file>
+ <file>qml/qmllegend/main.qml</file>
+ <file>qml/qmllegend/NewButton.qml</file>
+ </qresource>
+</RCC>
diff --git a/examples/datavisualization/qmlmultigraph/doc/images/qmlmultigraph-example.png b/examples/datavisualization/qmlmultigraph/doc/images/qmlmultigraph-example.png
new file mode 100644
index 00000000..79073f5f
--- /dev/null
+++ b/examples/datavisualization/qmlmultigraph/doc/images/qmlmultigraph-example.png
Binary files differ
diff --git a/examples/qmlmultigraph/doc/src/qmlmultigraph.qdoc b/examples/datavisualization/qmlmultigraph/doc/src/qmlmultigraph.qdoc
index f3ba172d..38c7b783 100644
--- a/examples/qmlmultigraph/doc/src/qmlmultigraph.qdoc
+++ b/examples/datavisualization/qmlmultigraph/doc/src/qmlmultigraph.qdoc
@@ -33,11 +33,12 @@
\section1 Multiple Graphs
Using multiple graphs in a single application doesn't require anything special, simply define
- and position the graphs as normal. In this example the graphs are shown side by side in a RowLayout:
+ and position the graphs as normal. In this example the graphs are shown in a 2 x 2 grid with
+ \c{GridLayout}:
- \snippet ../examples/qmlmultigraph/qml/qmlmultigraph/main.qml 0
+ \snippet qmlmultigraph/qml/qmlmultigraph/main.qml 0
- Each graph has a parent Rectangle item to provide it with a border. The color of the rectangle is set
- to fully transparent, because otherwise the rectangles would hide the graphs, which are always drawn behind
- all other QML elements.
+ Each graph has a parent \c Rectangle item to provide it with a border.
+
+ Note that one of the grid cells is used for buttons in an another \c{GridLayout}.
*/
diff --git a/examples/qmlmultigraph/main.cpp b/examples/datavisualization/qmlmultigraph/main.cpp
index 25cd5d9c..ef53d5ec 100644
--- a/examples/qmlmultigraph/main.cpp
+++ b/examples/datavisualization/qmlmultigraph/main.cpp
@@ -16,33 +16,32 @@
**
****************************************************************************/
-#include <QtDataVisualization/qutils.h>
#include <QtGui/QGuiApplication>
-#include "qtquick2applicationviewer.h"
-#ifdef Q_OS_ANDROID
-#include <QDir>
-#include <QQmlEngine>
-#endif
-#include <QDebug>
+#include <QtCore/QDir>
+#include <QtQuick/QQuickView>
+#include <QtQml/QQmlEngine>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
- QtQuick2ApplicationViewer viewer;
-
- // Enable antialiasing
- viewer.setFormat(QtDataVisualization::qDefaultSurfaceFormat());
+ QQuickView viewer;
-#ifdef Q_OS_ANDROID
- viewer.addImportPath(QString::fromLatin1("assets:/qml"));
- viewer.engine()->addPluginPath(QString::fromLatin1("%1/../%2").arg(QDir::homePath(),
- QString::fromLatin1("lib")));
+ // The following are needed to make examples run without having to install the module
+ // in desktop environments.
+#ifdef Q_OS_WIN
+ QString extraImportPath(QStringLiteral("%1/../../../../%2"));
+#else
+ QString extraImportPath(QStringLiteral("%1/../../../%2"));
#endif
+ viewer.engine()->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
+ QString::fromLatin1("qml")));
+ QObject::connect(viewer.engine(), &QQmlEngine::quit, &viewer, &QWindow::close);
+
viewer.setTitle(QStringLiteral("QML multigraph example"));
- viewer.setSource(QUrl("qrc:/qml/main.qml"));
+ viewer.setSource(QUrl("qrc:/qml/qmlmultigraph/main.qml"));
viewer.setResizeMode(QQuickView::SizeRootObjectToView);
- viewer.showExpanded();
+ viewer.show();
return app.exec();
}
diff --git a/examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/Data.qml b/examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/Data.qml
new file mode 100644
index 00000000..43152e50
--- /dev/null
+++ b/examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/Data.qml
@@ -0,0 +1,48 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+import QtQuick 2.1
+
+Item {
+ property alias data: dataModel
+
+ ListModel {
+ id: dataModel
+ ListElement{ row: "0"; col: "0"; longitude: "20.0"; latitude: "10.0"; pop_density: "4.75"; }
+ ListElement{ row: "1"; col: "0"; longitude: "21.1"; latitude: "10.3"; pop_density: "3.00"; }
+ ListElement{ row: "2"; col: "0"; longitude: "22.5"; latitude: "10.7"; pop_density: "1.24"; }
+ ListElement{ row: "3"; col: "0"; longitude: "24.0"; latitude: "10.5"; pop_density: "2.53"; }
+ ListElement{ row: "0"; col: "1"; longitude: "20.2"; latitude: "11.2"; pop_density: "3.55"; }
+ ListElement{ row: "1"; col: "1"; longitude: "21.3"; latitude: "11.5"; pop_density: "3.03"; }
+ ListElement{ row: "2"; col: "1"; longitude: "22.6"; latitude: "11.7"; pop_density: "3.46"; }
+ ListElement{ row: "3"; col: "1"; longitude: "23.4"; latitude: "11.5"; pop_density: "4.12"; }
+ ListElement{ row: "0"; col: "2"; longitude: "20.2"; latitude: "12.3"; pop_density: "3.37"; }
+ ListElement{ row: "1"; col: "2"; longitude: "21.1"; latitude: "12.4"; pop_density: "2.98"; }
+ ListElement{ row: "2"; col: "2"; longitude: "22.5"; latitude: "12.1"; pop_density: "3.33"; }
+ ListElement{ row: "3"; col: "2"; longitude: "23.3"; latitude: "12.7"; pop_density: "3.23"; }
+ ListElement{ row: "0"; col: "3"; longitude: "20.7"; latitude: "13.3"; pop_density: "5.34"; }
+ ListElement{ row: "1"; col: "3"; longitude: "21.5"; latitude: "13.2"; pop_density: "4.54"; }
+ ListElement{ row: "2"; col: "3"; longitude: "22.4"; latitude: "13.6"; pop_density: "4.65"; }
+ ListElement{ row: "3"; col: "3"; longitude: "23.2"; latitude: "13.4"; pop_density: "6.67"; }
+ ListElement{ row: "0"; col: "4"; longitude: "20.6"; latitude: "15.0"; pop_density: "6.01"; }
+ ListElement{ row: "1"; col: "4"; longitude: "21.3"; latitude: "14.6"; pop_density: "5.83"; }
+ ListElement{ row: "2"; col: "4"; longitude: "22.5"; latitude: "14.8"; pop_density: "7.32"; }
+ ListElement{ row: "3"; col: "4"; longitude: "23.7"; latitude: "14.3"; pop_density: "6.90"; }
+ }
+}
+
diff --git a/examples/qmlmultigraph/qml/qmlmultigraph/newbutton.qml b/examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/NewButton.qml
index e4fb99d2..e4fb99d2 100644
--- a/examples/qmlmultigraph/qml/qmlmultigraph/newbutton.qml
+++ b/examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/NewButton.qml
diff --git a/examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/main.qml b/examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/main.qml
new file mode 100644
index 00000000..46ff2067
--- /dev/null
+++ b/examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/main.qml
@@ -0,0 +1,210 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import QtQuick.Layouts 1.0
+import QtDataVisualization 1.0
+import "."
+
+Rectangle {
+ id: mainView
+ width: 800
+ height: 600
+
+ Data {
+ id: data
+ }
+
+ //! [0]
+ GridLayout {
+ id: gridLayout
+ columns: 2
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ anchors.top: mainView.top
+ anchors.bottom: mainView.bottom
+ anchors.left: mainView.left
+ anchors.right: mainView.right
+
+ Rectangle {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ border.color: surfaceGraph.theme.gridLineColor
+ border.width: 2
+
+ Surface3D {
+ id: surfaceGraph
+ anchors.fill: parent
+ anchors.margins: parent.border.width
+ theme: Theme3D {
+ type: Theme3D.ThemePrimaryColors
+ font.pointSize: 60
+ }
+ scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricLeftHigh
+
+ Surface3DSeries {
+ itemLabelFormat: "Pop density at (@xLabel N, @zLabel E): @yLabel"
+ ItemModelSurfaceDataProxy {
+ itemModel: data.data
+ // The surface data points are not neatly lined up in rows and columns,
+ // so we define explicit row and column roles.
+ rowRole: "row"
+ columnRole: "col"
+ xPosRole: "latitude"
+ zPosRole: "longitude"
+ yPosRole: "pop_density"
+ }
+ }
+ }
+ }
+
+ // We'll use one grid cell for buttons
+ Rectangle {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+
+ GridLayout {
+ anchors.right: parent.right
+ anchors.left: parent.left
+ anchors.top: parent.top
+ anchors.bottom: parent.bottom
+ columns: 2
+
+ NewButton {
+ Layout.minimumWidth: parent.width / 2
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ text: "Clear Selections"
+ onClicked: clearSelections() // call a helper function to keep button itself simpler
+ }
+
+ NewButton {
+ Layout.minimumWidth: parent.width / 2
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ text: "Quit"
+ onClicked: Qt.quit(0);
+ }
+
+ NewButton {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ text: "Reset Cameras"
+ onClicked: resetCameras() // call a helper function to keep button itself simpler
+ }
+
+ NewButton {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ text: "Toggle Mesh Styles"
+ onClicked: toggleMeshStyle() // call a helper function to keep button itself simpler
+ }
+ }
+ }
+
+ Rectangle {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ border.color: scatterGraph.theme.gridLineColor
+ border.width: 2
+
+ Scatter3D {
+ id: scatterGraph
+ anchors.fill: parent
+ anchors.margins: parent.border.width
+ theme: Theme3D {
+ type: Theme3D.ThemeDigia
+ font.pointSize: 60
+ }
+ scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricLeftHigh
+
+ Scatter3DSeries {
+ itemLabelFormat: "Pop density at (@xLabel N, @zLabel E): @yLabel"
+ ItemModelScatterDataProxy {
+ itemModel: data.data
+ // Mapping model roles to scatter series item coordinates.
+ xPosRole: "latitude"
+ zPosRole: "longitude"
+ yPosRole: "pop_density"
+ }
+ }
+ }
+ }
+
+ Rectangle {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ border.color: barGraph.theme.gridLineColor
+ border.width: 2
+
+ Bars3D {
+ id: barGraph
+ anchors.fill: parent
+ anchors.margins: parent.border.width
+ theme: Theme3D {
+ type: Theme3D.ThemeQt
+ font.pointSize: 60
+ }
+ selectionMode: AbstractGraph3D.SelectionItemAndRow | AbstractGraph3D.SelectionSlice
+ scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricLeftHigh
+
+ Bar3DSeries {
+ itemLabelFormat: "@seriesName: @valueLabel"
+ name: "Population density"
+
+ ItemModelBarDataProxy {
+ itemModel: data.data
+ // Mapping model roles to bar series rows, columns, and values.
+ rowRole: "row"
+ columnRole: "col"
+ valueRole: "pop_density"
+ }
+ }
+ }
+ }
+ }
+ //! [0]
+
+ function clearSelections() {
+ barGraph.clearSelection()
+ scatterGraph.clearSelection()
+ surfaceGraph.clearSelection()
+ }
+
+ function resetCameras() {
+ surfaceGraph.scene.activeCamera.cameraPreset = Camera3D.CameraPresetIsometricLeftHigh
+ scatterGraph.scene.activeCamera.cameraPreset = Camera3D.CameraPresetIsometricLeftHigh
+ barGraph.scene.activeCamera.cameraPreset = Camera3D.CameraPresetIsometricLeftHigh
+ surfaceGraph.scene.activeCamera.zoomLevel = 100
+ scatterGraph.scene.activeCamera.zoomLevel = 100
+ barGraph.scene.activeCamera.zoomLevel = 100
+ }
+
+ function toggleMeshStyle() {
+ if (barGraph.seriesList[0].meshSmooth === true) {
+ barGraph.seriesList[0].meshSmooth = false
+ if (surfaceGraph.seriesList[0].flatShadingSupported)
+ surfaceGraph.seriesList[0].flatShadingEnabled = true
+ scatterGraph.seriesList[0].meshSmooth = false
+ } else {
+ barGraph.seriesList[0].meshSmooth = true
+ surfaceGraph.seriesList[0].flatShadingEnabled = false
+ scatterGraph.seriesList[0].meshSmooth = true
+ }
+ }
+}
diff --git a/examples/datavisualization/qmlmultigraph/qmlmultigraph.pro b/examples/datavisualization/qmlmultigraph/qmlmultigraph.pro
new file mode 100644
index 00000000..8cc4c60c
--- /dev/null
+++ b/examples/datavisualization/qmlmultigraph/qmlmultigraph.pro
@@ -0,0 +1,12 @@
+!include( ../examples.pri ) {
+ error( "Couldn't find the examples.pri file!" )
+}
+
+# The .cpp file which was generated for your project. Feel free to hack it.
+SOURCES += main.cpp
+
+RESOURCES += qmlmultigraph.qrc
+
+OTHER_FILES += doc/src/* \
+ doc/images/* \
+ qml/qmlmultigraph/*
diff --git a/examples/datavisualization/qmlmultigraph/qmlmultigraph.qrc b/examples/datavisualization/qmlmultigraph/qmlmultigraph.qrc
new file mode 100644
index 00000000..c5e63a1c
--- /dev/null
+++ b/examples/datavisualization/qmlmultigraph/qmlmultigraph.qrc
@@ -0,0 +1,7 @@
+<RCC>
+ <qresource prefix="/">
+ <file>qml/qmlmultigraph/Data.qml</file>
+ <file>qml/qmlmultigraph/main.qml</file>
+ <file>qml/qmlmultigraph/NewButton.qml</file>
+ </qresource>
+</RCC>
diff --git a/examples/datavisualization/qmloscilloscope/datasource.cpp b/examples/datavisualization/qmloscilloscope/datasource.cpp
new file mode 100644
index 00000000..01d7e73d
--- /dev/null
+++ b/examples/datavisualization/qmloscilloscope/datasource.cpp
@@ -0,0 +1,172 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+#include "datasource.h"
+#include <QtCore/qmath.h>
+
+using namespace QtDataVisualization;
+
+//! [3]
+Q_DECLARE_METATYPE(QSurface3DSeries *)
+Q_DECLARE_METATYPE(QValue3DAxis *)
+//! [3]
+
+DataSource::DataSource(QObject *parent) :
+ QObject(parent),
+ m_index(-1),
+ m_resetArray(0)
+{
+ //! [4]
+ qRegisterMetaType<QSurface3DSeries *>();
+ qRegisterMetaType<QValue3DAxis *>();
+ //! [4]
+}
+
+DataSource::~DataSource()
+{
+ clearData();
+}
+
+//! [0]
+void DataSource::generateData(int cacheCount, int rowCount, int columnCount,
+ float xMin, float xMax, float yMin, float yMax,
+ float zMin, float zMax)
+{
+ if (!cacheCount)
+ return;
+
+ clearData();
+ // Re-create the cache array
+ m_data.resize(cacheCount);
+ for (int i(0); i < cacheCount; i++) {
+ QSurfaceDataArray &array = m_data[i];
+ array.reserve(rowCount);
+ for (int j(0); j < rowCount; j++)
+ array.append(new QSurfaceDataRow(columnCount));
+ }
+
+ float xRange = xMax - xMin;
+ float yRange = yMax - yMin;
+ float zRange = zMax - zMin;
+ int cacheIndexStep = columnCount / cacheCount;
+ float cacheStep = float(cacheIndexStep) * xRange / float(columnCount);
+
+ // Populate caches
+ for (int i(0); i < cacheCount; i++) {
+ QSurfaceDataArray &cache = m_data[i];
+ float cacheXAdjustment = cacheStep * i;
+ float cacheIndexAdjustment = cacheIndexStep * i;
+ for (int j(0); j < rowCount; j++) {
+ QSurfaceDataRow &row = *(cache[j]);
+ float rowMod = (float(j)) / float(rowCount);
+ float yRangeMod = yRange * rowMod;
+ float zRangeMod = zRange * rowMod;
+ float z = zRangeMod + zMin;
+ qreal rowColWaveAngleMul = M_PI * M_PI * rowMod;
+ float rowColWaveMul = yRangeMod * 0.2f;
+ for (int k(0); k < columnCount; k++) {
+ float colMod = (float(k)) / float(columnCount);
+ float xRangeMod = xRange * colMod;
+ float x = xRangeMod + xMin + cacheXAdjustment;
+ float colWave = float(qSin((2.0 * M_PI * colMod) - (1.0 / 2.0 * M_PI)) + 1.0);
+ float y = (colWave * ((float(qSin(rowColWaveAngleMul * colMod) + 1.0))))
+ * rowColWaveMul
+ + (0.15f * float(rand()) / float(RAND_MAX)) * yRangeMod;
+
+ int index = k + cacheIndexAdjustment;
+ if (index >= columnCount) {
+ // Wrap over
+ index -= columnCount;
+ x -= xRange;
+ }
+ row[index] = QVector3D(x, y, z);
+ }
+ }
+ }
+}
+//! [0]
+
+//! [1]
+void DataSource::update(QSurface3DSeries *series)
+{
+ if (series && m_data.size()) {
+ // Each iteration uses data from a different cached array
+ m_index++;
+ if (m_index > m_data.count() - 1)
+ m_index = 0;
+
+ QSurfaceDataArray array = m_data.at(m_index);
+ int newRowCount = array.size();
+ int newColumnCount = array.at(0)->size();
+
+ // If the first time or the dimensions of the cache array have changed,
+ // reconstruct the reset array
+ if (m_resetArray || series->dataProxy()->rowCount() != newRowCount
+ || series->dataProxy()->columnCount() != newColumnCount) {
+ m_resetArray = new QSurfaceDataArray();
+ m_resetArray->reserve(newRowCount);
+ for (int i(0); i < newRowCount; i++)
+ m_resetArray->append(new QSurfaceDataRow(newColumnCount));
+ }
+
+ // Copy items from our cache to the reset array
+ for (int i(0); i < newRowCount; i++) {
+ const QSurfaceDataRow &sourceRow = *(array.at(i));
+ QSurfaceDataRow &row = *(*m_resetArray)[i];
+ for (int j(0); j < newColumnCount; j++)
+ row[j].setPosition(sourceRow.at(j).position());
+ }
+
+ // Notify the proxy that data has changed
+ series->dataProxy()->resetArray(m_resetArray);
+ }
+}
+//! [1]
+
+//! [2]
+QString DataSource::selectionLabel(QSurface3DSeries *series, QValue3DAxis *axisX,
+ QValue3DAxis *axisY, QValue3DAxis *axisZ)
+{
+ QString label;
+
+ if (series && series->selectedPoint() != QSurface3DSeries::invalidSelectionPosition()) {
+ const QSurfaceDataItem *item = series->dataProxy()->itemAt(series->selectedPoint());
+ QString x;
+ QString y;
+ QString z;
+ x.sprintf(axisX->labelFormat().toUtf8().constData(), int(item->x()));
+ y.sprintf(axisY->labelFormat().toUtf8().constData(), int(item->y()));
+ z.sprintf(axisZ->labelFormat().toUtf8().constData(), int(item->z()));
+ label = QStringLiteral("%1, %3: %2").arg(x).arg(y).arg(z);
+ } else {
+ label = QStringLiteral("No selection");
+ }
+
+ return label;
+}
+//! [2]
+
+void DataSource::clearData()
+{
+ for (int i(0); i < m_data.size(); i++) {
+ QSurfaceDataArray &array = m_data[i];
+ for (int j(0); j < array.size(); j++)
+ delete array[j];
+ array.clear();
+ }
+}
diff --git a/examples/datavisualization/qmloscilloscope/datasource.h b/examples/datavisualization/qmloscilloscope/datasource.h
new file mode 100644
index 00000000..ef2f7acb
--- /dev/null
+++ b/examples/datavisualization/qmloscilloscope/datasource.h
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+#ifndef DATASOURCE_H
+#define DATASOURCE_H
+
+#include <QtDataVisualization/QSurface3DSeries>
+#include <QtDataVisualization/QValue3DAxis>
+
+class QQuickView;
+
+using namespace QtDataVisualization;
+
+class DataSource : public QObject
+{
+ Q_OBJECT
+public:
+ explicit DataSource(QObject *parent = 0);
+ virtual ~DataSource();
+
+ //! [0]
+public slots:
+ void generateData(int cacheCount, int rowCount, int columnCount,
+ float xMin, float xMax, float yMin, float yMax, float zMin, float zMax);
+
+ void update(QSurface3DSeries *series);
+
+ QString selectionLabel(QSurface3DSeries *series, QValue3DAxis *axisX,
+ QValue3DAxis *axisY, QValue3DAxis *axisZ);
+ //! [0]
+private:
+ void clearData();
+
+ QVector<QSurfaceDataArray> m_data;
+ int m_index;
+ QSurfaceDataArray *m_resetArray;
+};
+
+#endif
diff --git a/examples/datavisualization/qmloscilloscope/doc/images/qmloscilloscope-example.png b/examples/datavisualization/qmloscilloscope/doc/images/qmloscilloscope-example.png
new file mode 100644
index 00000000..a3e1baab
--- /dev/null
+++ b/examples/datavisualization/qmloscilloscope/doc/images/qmloscilloscope-example.png
Binary files differ
diff --git a/examples/datavisualization/qmloscilloscope/doc/src/qmloscilloscope.qdoc b/examples/datavisualization/qmloscilloscope/doc/src/qmloscilloscope.qdoc
new file mode 100644
index 00000000..c574950b
--- /dev/null
+++ b/examples/datavisualization/qmloscilloscope/doc/src/qmloscilloscope.qdoc
@@ -0,0 +1,126 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+/*!
+ \example qmloscilloscope
+ \title Qt Quick 2 Oscilloscope Example
+ \ingroup qtdatavisualization_examples
+ \brief Example of a hybrid C++ and QML application.
+
+ The Qt Quick 2 oscilloscope example shows how to combine C++ and QML in an application,
+ as well as showing data that changes realtime.
+
+ \image qmloscilloscope-example.png
+
+ The interesting thing about this example is combining C++ and QML, so we'll concentrate on
+ that and skip explaining the basic functionality - for
+ more detailed QML example documentation, see \l{Qt Quick 2 Scatter Example}.
+
+ \section1 Data source in C++
+
+ The item model based proxies are good for simple and/or static graphs, but to achieve
+ best performance when displaying data changing in realtime, the basic proxies should be used.
+ Those are not supported in QML, as the data items they store are not \l{QObject}s and
+ cannot therefore be directly manipulated from QML code.
+ To overcome this limitation, we implement a simple \c DataSource class in C++ to populate the
+ data proxy of the series.
+
+ The \c DataSource class provides three methods that can be called from QML:
+
+ \snippet qmloscilloscope/datasource.h 0
+
+ The first method, \c generateData(), creates a cache of simulated oscilloscope data for us
+ to display. The data is cached in a format accepted by QSurfaceDataProxy:
+
+ \snippet qmloscilloscope/datasource.cpp 0
+
+ The secod method, \c update(), copies one set of the cached data into another array, which we
+ set to the data proxy of the series by calling QSurfaceDataProxy::resetArray().
+ We reuse the same array if the array dimensions have not changed to minimize overhead:
+
+ \snippet qmloscilloscope/datasource.cpp 1
+
+ \note Even though we are operating on the array pointer we have previously set to the proxy
+ we still need to call QSurfaceDataProxy::resetArray() after changing the data in it to prompt
+ the graph to render the data.
+
+ The final method, \c selectionLabel(), is used to generate a label string we can show on the
+ QML ui. This method utilizes the axis formats to format the label:
+
+ \snippet qmloscilloscope/datasource.cpp 2
+
+ To be able to access the \c DataSource methods from QML, we need to expose it. We do this by
+ defining a context property in application main:
+
+ \snippet qmloscilloscope/main.cpp 0
+
+ To make it possible to use Qt Data Visualization class pointers as parameters on the
+ \c DataSource class methods on all environments and builds, we need to make sure the meta
+ types are registered:
+
+ \snippet qmloscilloscope/datasource.cpp 3
+ \dots 0
+ \snippet qmloscilloscope/datasource.cpp 4
+
+ \section1 QML
+
+ In the QML codes, we define a Surface3D graph normally and give it a Surface3DSeries:
+
+ \snippet qmloscilloscope/qml/qmloscilloscope/main.qml 0
+
+ One interesting detail is that we don't specify a proxy for the Surface3DSeries we attach
+ to the graph. This makes the series to utilize the default QSurfaceDataProxy.
+
+ We also specify an empty string for \l{Abstract3DSeries::itemLabelFormat}{itemLabelFormat}, since we want to display
+ the selected item information in a \c Text element instead of a label above the selection pointer.
+ This is done because the selection pointer moves around a lot as the data changes, which makes
+ the regular selection label difficult to read.
+ When selection point changes, we update the label text using a helper function
+ \c updateSelectionLabel(), which calls one of the methods we defined for our \c DataSource class
+ to obtain the label:
+
+ \snippet qmloscilloscope/qml/qmloscilloscope/main.qml 1
+
+ We initialize the \c DataSource cache when the graph is complete by calling a helper function
+ \c generateData(), which calls the method with the same name on the \c DataSource:
+
+ \snippet qmloscilloscope/qml/qmloscilloscope/main.qml 2
+ \dots 4
+ \snippet qmloscilloscope/qml/qmloscilloscope/main.qml 4
+
+ To trigger the updates in data, we define a \c Timer item which calls the \c update() method on the \c
+ DataSource at requested intervals. The label update is also triggered on each cycle:
+
+ \snippet qmloscilloscope/qml/qmloscilloscope/main.qml 3
+
+ \section1 Enabling direct rendering
+
+ Since this application potentially deals with a lot of rapidly changing data, we use direct
+ rendering mode for performance. To enable antialiasing in this mode the surface format of the application
+ window needs to be changed, as the default format used by QQuickView doesn't support antialiasing.
+ We use the utility function provided by Qt Data Visualization to change the surface format
+ in \c main.cpp:
+
+ \snippet qmloscilloscope/main.cpp 1
+ \dots 0
+ \snippet qmloscilloscope/main.cpp 2
+
+ On the QML side, direct rendering mode is enabled via \l{AbstractGraph3D::renderingMode}{renderingMode} property:
+
+ \snippet qmloscilloscope/qml/qmloscilloscope/main.qml 5
+*/
diff --git a/examples/datavisualization/qmloscilloscope/main.cpp b/examples/datavisualization/qmloscilloscope/main.cpp
new file mode 100644
index 00000000..9ee46e21
--- /dev/null
+++ b/examples/datavisualization/qmloscilloscope/main.cpp
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+#include "datasource.h"
+
+//! [2]
+#include <QtDataVisualization/qutils.h>
+//! [2]
+
+#include <QtGui/QGuiApplication>
+#include <QtCore/QDir>
+#include <QtQml/QQmlContext>
+#include <QtQuick/QQuickView>
+#include <QtQml/QQmlEngine>
+
+int main(int argc, char *argv[])
+{
+ QGuiApplication app(argc, argv);
+
+ QQuickView viewer;
+
+ // Enable antialiasing in direct rendering mode
+ //! [1]
+ viewer.setFormat(QtDataVisualization::qDefaultSurfaceFormat());
+ //! [1]
+
+ // The following are needed to make examples run without having to install the module
+ // in desktop environments.
+#ifdef Q_OS_WIN
+ QString extraImportPath(QStringLiteral("%1/../../../../%2"));
+#else
+ QString extraImportPath(QStringLiteral("%1/../../../%2"));
+#endif
+ viewer.engine()->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
+ QString::fromLatin1("qml")));
+ QObject::connect(viewer.engine(), &QQmlEngine::quit, &viewer, &QWindow::close);
+
+ viewer.setTitle(QStringLiteral("Oscilloscope example"));
+
+ //! [0]
+ DataSource dataSource;
+ viewer.rootContext()->setContextProperty("dataSource", &dataSource);
+ //! [0]
+
+ viewer.setSource(QUrl("qrc:/qml/qmloscilloscope/main.qml"));
+ viewer.setResizeMode(QQuickView::SizeRootObjectToView);
+ viewer.show();
+
+ return app.exec();
+}
diff --git a/examples/qmlscatter/qml/qmlscatter/newbutton.qml b/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/NewButton.qml
index e4fb99d2..e4fb99d2 100644
--- a/examples/qmlscatter/qml/qmlscatter/newbutton.qml
+++ b/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/NewButton.qml
diff --git a/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml b/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml
new file mode 100644
index 00000000..eeaeab40
--- /dev/null
+++ b/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml
@@ -0,0 +1,306 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import QtQuick.Layouts 1.0
+import QtQuick.Controls 1.0
+import QtDataVisualization 1.0
+import "."
+
+Item {
+ id: mainView
+ width: 1280
+ height: 1024
+
+ property int sampleColumns: sampleSlider.value
+ property int sampleRows: sampleColumns / 2
+ property int sampleCache: 24
+
+ onSampleRowsChanged: {
+ surfaceSeries.selectedPoint = surfaceSeries.invalidSelectionPosition
+ generateData()
+ }
+
+ Item {
+ id: dataView
+ anchors.bottom: parent.bottom
+ width: parent.width
+ height: parent.height - buttonLayout.height
+
+ Surface3D {
+ id: surfaceGraph
+
+ width: dataView.width
+ height: dataView.height
+ shadowQuality: AbstractGraph3D.ShadowQualityNone
+ selectionMode: AbstractGraph3D.SelectionSlice | AbstractGraph3D.SelectionItemAndRow
+ //! [5]
+ renderingMode: AbstractGraph3D.RenderDirectToBackground
+ //! [5]
+
+ axisX.labelFormat: "%d ms"
+ axisY.labelFormat: "%d W"
+ axisZ.labelFormat: "%d mV"
+ axisX.min: 0
+ axisY.min: 0
+ axisZ.min: 0
+ axisX.max: 1000
+ axisY.max: 100
+ axisZ.max: 800
+ axisX.segmentCount: 4
+ axisY.segmentCount: 4
+ axisZ.segmentCount: 4
+
+ //! [0]
+ Surface3DSeries {
+ id: surfaceSeries
+ drawMode: Surface3DSeries.DrawSurface;
+ flatShadingEnabled: false;
+ meshSmooth: true
+ itemLabelFormat: ""
+
+ onSelectedPointChanged: mainView.updateSelectionLabel()
+ }
+ //! [0]
+
+ //! [2]
+ Component.onCompleted: mainView.generateData()
+ //! [2]
+ }
+ }
+
+ //! [3]
+ Timer {
+ id: refreshTimer
+ interval: 1000 / frequencySlider.value
+ running: true
+ repeat: true
+ onTriggered: {
+ dataSource.update(surfaceSeries)
+ mainView.updateSelectionLabel()
+ }
+ }
+ //! [3]
+
+ Rectangle {
+ width: parent.width
+ height: flatShadingToggle.height * 2
+ anchors.left: parent.left
+ anchors.top: parent.top
+ color: surfaceGraph.theme.backgroundColor
+
+ ColumnLayout {
+ anchors.fill: parent
+ RowLayout {
+ id: sliderLayout
+ anchors.top: parent.top
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ Layout.minimumHeight: flatShadingToggle.height
+ spacing: 0
+
+ Rectangle {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ Layout.minimumWidth: samplesText.implicitWidth + 120
+ Layout.maximumWidth: samplesText.implicitWidth + 120
+ Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
+
+ border.color: "gray"
+ border.width: 1
+ radius: 4
+
+ RowLayout {
+ anchors.fill: parent
+ anchors.margins: parent.border.width + 1
+
+ Slider {
+ id: sampleSlider
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
+ Layout.minimumWidth: 80
+ minimumValue: mainView.sampleCache * 2
+ maximumValue: minimumValue * 10
+ stepSize: mainView.sampleCache
+ updateValueWhileDragging: false
+ value: minimumValue * 2
+ }
+
+ Rectangle {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ Layout.minimumWidth: samplesText.implicitWidth + 10
+ Layout.maximumWidth: samplesText.implicitWidth + 10
+ Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
+
+ Text {
+ id: samplesText
+ text: "Samples: " + (mainView.sampleRows * mainView.sampleColumns)
+ anchors.fill: parent
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ }
+ }
+ }
+ }
+
+ Rectangle {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ Layout.minimumWidth: frequencyText.implicitWidth + 120
+ Layout.maximumWidth: frequencyText.implicitWidth + 120
+ Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
+
+ border.color: "gray"
+ border.width: 1
+ radius: 4
+
+ RowLayout {
+ anchors.fill: parent
+ anchors.margins: parent.border.width + 1
+
+ Slider {
+ id: frequencySlider
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
+ Layout.minimumWidth: 80
+ minimumValue: 2
+ maximumValue: 60
+ stepSize: 2
+ updateValueWhileDragging: true
+ value: 30
+ }
+
+ Rectangle {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ Layout.minimumWidth: frequencyText.implicitWidth + 10
+ Layout.maximumWidth: frequencyText.implicitWidth + 10
+ Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
+
+ Text {
+ id: frequencyText
+ text: "Freq: " + frequencySlider.value + " Hz"
+ anchors.fill: parent
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ }
+ }
+ }
+ }
+
+ Rectangle {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ Layout.minimumWidth: selectionText.implicitWidth + 10
+ Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
+
+ border.color: "gray"
+ border.width: 1
+ radius: 4
+
+ Text {
+ id: selectionText
+ text: "No selection"
+ anchors.fill: parent
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ }
+ }
+ }
+
+ RowLayout {
+ id: buttonLayout
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ Layout.minimumHeight: flatShadingToggle.height
+ anchors.bottom: parent.bottom
+ spacing: 0
+
+ NewButton {
+ id: flatShadingToggle
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+
+ text: "Show Flat"
+ enabled: surfaceSeries.flatShadingSupported
+
+ onClicked: {
+ if (surfaceSeries.flatShadingEnabled === true) {
+ surfaceSeries.flatShadingEnabled = false;
+ text = "Show Flat"
+ } else {
+ surfaceSeries.flatShadingEnabled = true;
+ text = "Show Smooth"
+ }
+ }
+ }
+
+ NewButton {
+ id: surfaceGridToggle
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+
+ text: "Show Surface Grid"
+
+ onClicked: {
+ if (surfaceSeries.drawMode & Surface3DSeries.DrawWireframe) {
+ surfaceSeries.drawMode &= ~Surface3DSeries.DrawWireframe;
+ text = "Show Surface Grid"
+ } else {
+ surfaceSeries.drawMode |= Surface3DSeries.DrawWireframe;
+ text = "Hide Surface Grid"
+ }
+ }
+ }
+
+ NewButton {
+ id: exitButton
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+
+ text: "Quit"
+
+ onClicked: Qt.quit(0);
+ }
+ }
+ }
+
+ }
+
+ //! [1]
+ function updateSelectionLabel() {
+ selectionText.text = dataSource.selectionLabel(surfaceSeries,
+ surfaceGraph.axisX,
+ surfaceGraph.axisY,
+ surfaceGraph.axisZ)
+ }
+ //! [1]
+
+ //! [4]
+ function generateData() {
+ dataSource.generateData(mainView.sampleCache, mainView.sampleRows,
+ mainView.sampleColumns, surfaceGraph.axisX.min,
+ surfaceGraph.axisX.max, surfaceGraph.axisY.min,
+ surfaceGraph.axisY.max, surfaceGraph.axisZ.min,
+ surfaceGraph.axisZ.max)
+ }
+ //! [4]
+}
diff --git a/examples/datavisualization/qmloscilloscope/qmloscilloscope.pro b/examples/datavisualization/qmloscilloscope/qmloscilloscope.pro
new file mode 100644
index 00000000..89023cc0
--- /dev/null
+++ b/examples/datavisualization/qmloscilloscope/qmloscilloscope.pro
@@ -0,0 +1,16 @@
+!include( ../examples.pri ) {
+ error( "Couldn't find the examples.pri file!" )
+}
+
+QT += datavisualization
+
+# The .cpp file which was generated for your project. Feel free to hack it.
+SOURCES += main.cpp \
+ datasource.cpp
+HEADERS += datasource.h
+
+RESOURCES += qmloscilloscope.qrc
+
+OTHER_FILES += doc/src/* \
+ doc/images/* \
+ qml/qmloscilloscope/*
diff --git a/examples/datavisualization/qmloscilloscope/qmloscilloscope.qrc b/examples/datavisualization/qmloscilloscope/qmloscilloscope.qrc
new file mode 100644
index 00000000..a2358789
--- /dev/null
+++ b/examples/datavisualization/qmloscilloscope/qmloscilloscope.qrc
@@ -0,0 +1,6 @@
+<RCC>
+ <qresource prefix="/">
+ <file>qml/qmloscilloscope/main.qml</file>
+ <file>qml/qmloscilloscope/NewButton.qml</file>
+ </qresource>
+</RCC>
diff --git a/examples/qmlscatter/doc/images/qmlscatter-example.png b/examples/datavisualization/qmlscatter/doc/images/qmlscatter-example.png
index 65ec4816..65ec4816 100644
--- a/examples/qmlscatter/doc/images/qmlscatter-example.png
+++ b/examples/datavisualization/qmlscatter/doc/images/qmlscatter-example.png
Binary files differ
diff --git a/examples/qmlscatter/doc/src/qmlscatter.qdoc b/examples/datavisualization/qmlscatter/doc/src/qmlscatter.qdoc
index 366b02ea..06dfa8cc 100644
--- a/examples/qmlscatter/doc/src/qmlscatter.qdoc
+++ b/examples/datavisualization/qmlscatter/doc/src/qmlscatter.qdoc
@@ -27,102 +27,76 @@
For instructions about how to interact with the graph, see \l{Qt Data Visualization Interacting with Data}{this page}.
- \image qmlscatter-example.png
-
- \section1 Creating the application
-
- The application main is created by creating a new Qt Quick Application project in QtCreator.
- The dialog shown here is from QtCreator 3.0.0, and it may look a bit different in other
- versions:
-
- \image qmlscatter-newproject.png
-
- We'll modify the generated \c main.cpp a bit, as we want to add our \c main.qml file as a
- resource. We do it by replacing
-
- \code viewer.setMainQmlFile(QStringLiteral("qml/qmlscatter/main.qml")); \endcode
-
- with
-
- \snippet ../examples/qmlscatter/main.cpp 0
-
- This will help us when deploying the application to Android.
+ For instructions how to create a new Qt Quick 2 application of your own, see Qt Creator help.
- We'll enable anti-aliasing for our application in environments that support it:
-
- \snippet ../examples/qmlscatter/main.cpp 2
-
- We'll also change the application to be shown maximized by replacing
+ \image qmlscatter-example.png
- \code viewer.showExpanded(); \endcode
+ \section1 Application basics
- with
+ Before diving into the QML code, let's take a look at the application \c main.cpp.
- \snippet ../examples/qmlscatter/main.cpp 1
+ This application implements a 'Quit' button in the UI, so we want to connect the QQmlEngine::quit()
+ signal to our application's QWindow::close() slot:
- We won't look into that any closer, as we'll change nothing in the generated
- \c qtquick2applicationviewer files.
+ \snippet qmlscatter/main.cpp 4
- Next we'll create new qml files for data (\c data.qml) and a QtQuick.Controls button
- we want to modify a bit (\c newbutton.qml), and add them to the resource file, in addition to
- main.qml:
+ To make deployment little simpler, we gather all of the application's \c .qml files to a resource
+ file (\c qmlscatter.qrc):
\code
<RCC>
- <qresource prefix="/qml">
- <file alias="main.qml">qml/qmlscatter/main.qml</file>
- <file alias="Data.qml">qml/qmlscatter/data.qml</file>
- <file alias="NewButton.qml">qml/qmlscatter/newbutton.qml</file>
+ <qresource prefix="/">
+ <file>qml/qmlscatter/Data.qml</file>
+ <file>qml/qmlscatter/main.qml</file>
+ <file>qml/qmlscatter/NewButton.qml</file>
</qresource>
</RCC>
\endcode
- Now the base for our application is done, and we can start setting up the graph.
+ This also requires us to set the \c main.qml to be read from the resource (\c{qrc:}):
- \section1 Setting up the graph
+ \snippet qmlscatter/main.cpp 3
- Let's start modifying the generated \c {main.qml}. We can remove all previous content from it,
- as it has nothing we need.
+ Lastly, we want the application to run in a maximized window:
+
+ \snippet qmlscatter/main.cpp 2
+
+ \section1 Setting up the graph
First we'll import all the QML modules we need:
- \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 0
+ \snippet qmlscatter/qml/qmlscatter/main.qml 0
The last \c import just imports all the qml files in the same directory as our \c {main.qml},
- because that's where \c newbutton.qml and \c data.qml are.
-
- Then we create our main \c Item and call it \c mainView:
+ because that's where \c NewButton.qml and \c Data.qml are.
- \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 1
+ Then we create our main \c Rectangle and call it \c mainView:
- \note The Qt Creator application wizard will set a \c Rectangle item as the main item, which
- is opaque white by default. This doesn't work for us, because the graphs are rendered behind the other
- QML elements. We change the main item type to \c Item, which is invisible. This way the graph is
- not covered by the main item.
+ \snippet qmlscatter/qml/qmlscatter/main.qml 1
- Then we'll add another \c Item inside it, and call it \c dataView. This will be the item to hold
- the Scatter3D graph. We'll anchor it to the parent bottom:
+ Then we'll add another \c Item inside the main \c Rectangle, and call it \c dataView.
+ This will be the item to hold the Scatter3D graph. We'll anchor it to the parent bottom:
- \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 9
+ \snippet qmlscatter/qml/qmlscatter/main.qml 9
Next we're ready to add the Scatter3D graph itself. We'll add it inside the \c dataView and
name it \c {scatterGraph}. Let's make it fill the \c {dataView}:
- \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 2
+ \snippet qmlscatter/qml/qmlscatter/main.qml 2
Now the graph is ready for use, but has no data. It also has the default axes and visual
properties.
Let's modify some visual properties first by adding the following inside \c {scatterGraph}:
- \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 3
+ \snippet qmlscatter/qml/qmlscatter/main.qml 3
We added a customized theme and changed the shadow quality.
We're happy with the other visual properties, so we won't change them.
The custom theme is based on a predefined theme, but we change the font in it:
- \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 13
+ \snippet qmlscatter/qml/qmlscatter/main.qml 13
Then it's time to start feeding the graph some data.
@@ -130,17 +104,17 @@
Let's create a \c Data item inside the \c mainView and name it \c seriesData:
- \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 4
+ \snippet qmlscatter/qml/qmlscatter/main.qml 4
The \c seriesData item contains the data models for all three series we use in this example.
- This is the component that holds our data in \c {data.qml}. It has an \c Item as the main
+ This is the component that holds our data in \c {Data.qml}. It has an \c Item as the main
component.
In the main component we'll add the data itself in a \c ListModel and name it
\c {dataModel}:
- \snippet ../examples/qmlscatter/qml/qmlscatter/data.qml 0
+ \snippet qmlscatter/qml/qmlscatter/Data.qml 0
\dots
We'll add two more of these for the other two series, and name them \c dataModelTwo and
@@ -149,39 +123,39 @@
Then we need to expose the data models to be usable from \c {main.qml}. We do this by defining
them as aliases in the main data component:
- \snippet ../examples/qmlscatter/qml/qmlscatter/data.qml 1
+ \snippet qmlscatter/qml/qmlscatter/Data.qml 1
- Now we can use the data from \c data.qml with \c scatterGraph in \c {main.qml}. First we'll add
+ Now we can use the data from \c Data.qml with \c scatterGraph in \c {main.qml}. First we'll add
a Scatter3DSeries and call it \c {scatterSeries}:
- \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 5
+ \snippet qmlscatter/qml/qmlscatter/main.qml 5
Then we'll set up selection label format for the series:
- \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 10
+ \snippet qmlscatter/qml/qmlscatter/main.qml 10
And finally the data for series one in a ItemModelScatterDataProxy. We set the data itself as
\c itemModel for the proxy:
- \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 11
+ \snippet qmlscatter/qml/qmlscatter/main.qml 11
We'll add the other two series in the same way, but modify some series-specific details a bit:
- \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 12
+ \snippet qmlscatter/qml/qmlscatter/main.qml 12
\dots
Then we'll modify the properties of the default axes in \c scatterGraph a bit:
- \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 6
+ \snippet qmlscatter/qml/qmlscatter/main.qml 6
After that we'll just add a few buttons to the \c mainView to control the graph. We'll only
show one as an example:
- \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 7
+ \snippet qmlscatter/qml/qmlscatter/main.qml 7
Then we'll modify \c dataView to make room for the buttons at the top:
- \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 8
+ \snippet qmlscatter/qml/qmlscatter/main.qml 8
\dots
And we're done!
diff --git a/examples/qmlscatter/main.cpp b/examples/datavisualization/qmlscatter/main.cpp
index 4ecefdc1..11684c84 100644
--- a/examples/qmlscatter/main.cpp
+++ b/examples/datavisualization/qmlscatter/main.cpp
@@ -16,39 +16,41 @@
**
****************************************************************************/
-#include <QtDataVisualization/qutils.h>
#include <QtGui/QGuiApplication>
-#include "qtquick2applicationviewer.h"
-#ifdef Q_OS_ANDROID
-#include <QDir>
-#include <QQmlEngine>
-#endif
-#include <QDebug>
+#include <QtCore/QDir>
+#include <QtQuick/QQuickView>
+#include <QtQml/QQmlEngine>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
- QtQuick2ApplicationViewer viewer;
+ QQuickView viewer;
- // Enable antialiasing
- //! [2]
- viewer.setFormat(QtDataVisualization::qDefaultSurfaceFormat());
- //! [2]
-
-#ifdef Q_OS_ANDROID
- viewer.addImportPath(QString::fromLatin1("assets:/qml"));
- viewer.engine()->addPluginPath(QString::fromLatin1("%1/../%2").arg(QDir::homePath(),
- QString::fromLatin1("lib")));
+ // The following are needed to make examples run without having to install the module
+ // in desktop environments.
+#ifdef Q_OS_WIN
+ QString extraImportPath(QStringLiteral("%1/../../../../%2"));
+#else
+ QString extraImportPath(QStringLiteral("%1/../../../%2"));
#endif
+ viewer.engine()->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
+ QString::fromLatin1("qml")));
+ //! [4]
+ QObject::connect(viewer.engine(), &QQmlEngine::quit, &viewer, &QWindow::close);
+ //! [4]
+
viewer.setTitle(QStringLiteral("QML scatter example"));
- //! [0]
- viewer.setSource(QUrl("qrc:/qml/main.qml"));
- //! [0]
+
+ //! [3]
+ viewer.setSource(QUrl("qrc:/qml/qmlscatter/main.qml"));
+ //! [3]
+
viewer.setResizeMode(QQuickView::SizeRootObjectToView);
- //! [1]
+
+ //! [2]
viewer.showMaximized();
- //! [1]
+ //! [2]
return app.exec();
}
diff --git a/examples/qmlscatter/qml/qmlscatter/data.qml b/examples/datavisualization/qmlscatter/qml/qmlscatter/Data.qml
index 23c4e5d5..23c4e5d5 100644
--- a/examples/qmlscatter/qml/qmlscatter/data.qml
+++ b/examples/datavisualization/qmlscatter/qml/qmlscatter/Data.qml
diff --git a/examples/qmlsurface/qml/qmlsurface/newbutton.qml b/examples/datavisualization/qmlscatter/qml/qmlscatter/NewButton.qml
index e4fb99d2..e4fb99d2 100644
--- a/examples/qmlsurface/qml/qmlsurface/newbutton.qml
+++ b/examples/datavisualization/qmlscatter/qml/qmlscatter/NewButton.qml
diff --git a/examples/qmlscatter/qml/qmlscatter/main.qml b/examples/datavisualization/qmlscatter/qml/qmlscatter/main.qml
index beb4ccaa..69cb2834 100644
--- a/examples/qmlscatter/qml/qmlscatter/main.qml
+++ b/examples/datavisualization/qmlscatter/qml/qmlscatter/main.qml
@@ -24,7 +24,7 @@ import "."
//! [0]
//! [1]
-Item {
+Rectangle {
id: mainView
//! [1]
diff --git a/examples/datavisualization/qmlscatter/qmlscatter.pro b/examples/datavisualization/qmlscatter/qmlscatter.pro
new file mode 100644
index 00000000..b97ca7be
--- /dev/null
+++ b/examples/datavisualization/qmlscatter/qmlscatter.pro
@@ -0,0 +1,12 @@
+!include( ../examples.pri ) {
+ error( "Couldn't find the examples.pri file!" )
+}
+
+# The .cpp file which was generated for your project. Feel free to hack it.
+SOURCES += main.cpp
+
+RESOURCES += qmlscatter.qrc
+
+OTHER_FILES += doc/src/* \
+ doc/images/* \
+ qml/qmlscatter/*
diff --git a/examples/datavisualization/qmlscatter/qmlscatter.qrc b/examples/datavisualization/qmlscatter/qmlscatter.qrc
new file mode 100644
index 00000000..225d78b0
--- /dev/null
+++ b/examples/datavisualization/qmlscatter/qmlscatter.qrc
@@ -0,0 +1,7 @@
+<RCC>
+ <qresource prefix="/">
+ <file>qml/qmlscatter/Data.qml</file>
+ <file>qml/qmlscatter/main.qml</file>
+ <file>qml/qmlscatter/NewButton.qml</file>
+ </qresource>
+</RCC>
diff --git a/examples/datavisualization/qmlsurface/doc/images/qmlsurface-example.png b/examples/datavisualization/qmlsurface/doc/images/qmlsurface-example.png
new file mode 100644
index 00000000..5e37b42c
--- /dev/null
+++ b/examples/datavisualization/qmlsurface/doc/images/qmlsurface-example.png
Binary files differ
diff --git a/examples/qmlsurface/doc/src/qmlsurface.qdoc b/examples/datavisualization/qmlsurface/doc/src/qmlsurface.qdoc
index 78f9c745..008fffa3 100644
--- a/examples/qmlsurface/doc/src/qmlsurface.qdoc
+++ b/examples/datavisualization/qmlsurface/doc/src/qmlsurface.qdoc
@@ -42,17 +42,17 @@
crater at imaginary position from 67 to 97 and from 30 to 60. Note that on the graph the scale
on the Y dimension exaggerates the height.
- \snippet ../examples/qmlsurface/qml/qmlsurface/main.qml 4
+ \snippet qmlsurface/qml/qmlsurface/main.qml 4
The other method to set surface data used in this example is with model mapping. We do that by
first defining a \c ListModel containing the data for the surface:
- \snippet ../examples/qmlsurface/qml/qmlsurface/data.qml 0
+ \snippet qmlsurface/qml/qmlsurface/Data.qml 0
\dots 4
Then we set up a Surface3DSeries with a ItemModelSurfaceDataProxy:
- \snippet ../examples/qmlsurface/qml/qmlsurface/main.qml 5
+ \snippet qmlsurface/qml/qmlsurface/main.qml 5
\dots
We add the actual data to the \c itemModel of the ItemModelSurfaceDataProxy. We also define the
@@ -60,7 +60,7 @@
for latitude and the value is for height.
\dots 0
- \snippet ../examples/qmlsurface/qml/qmlsurface/main.qml 6
+ \snippet qmlsurface/qml/qmlsurface/main.qml 6
\section1 Showing data
@@ -70,25 +70,25 @@
First is the gradient to be used for the surface, which can be defined as seen in the following
snippet. With the ColorGradient we set example colors from position 0.0 to 1.0.
- \snippet ../examples/qmlsurface/qml/qmlsurface/main.qml 0
+ \snippet qmlsurface/qml/qmlsurface/main.qml 0
This element is set into the \c baseGradients property in the \c theme used in Surface3D:
- \snippet ../examples/qmlsurface/qml/qmlsurface/main.qml 7
+ \snippet qmlsurface/qml/qmlsurface/main.qml 7
Other interesting features can be controlled with buttons.
The first button is to toggle on and off the surface grid, for which we use the following code:
- \snippet ../examples/qmlsurface/qml/qmlsurface/main.qml 1
+ \snippet qmlsurface/qml/qmlsurface/main.qml 1
Second button is for surface shading mode, which is controlled with this code:
- \snippet ../examples/qmlsurface/qml/qmlsurface/main.qml 2
+ \snippet qmlsurface/qml/qmlsurface/main.qml 2
Third button is for series visibility, which is controlled with this code:
- \snippet ../examples/qmlsurface/qml/qmlsurface/main.qml 8
+ \snippet qmlsurface/qml/qmlsurface/main.qml 8
Notice that the \c drawMode and \c flatShadingEnable properties are set for both series.
@@ -98,7 +98,7 @@
HeightMapSurfaceDataProxy and the other one ItemModelSurfaceDataProxy. For this we use the
following code:
- \snippet ../examples/qmlsurface/qml/qmlsurface/main.qml 3
+ \snippet qmlsurface/qml/qmlsurface/main.qml 3
We also set the maximum value to 500 in model proxy to make the surface flatter and
250 on height map proxy to show exaggerated height. At the same time the middle color position
diff --git a/examples/qmlsurface/heightmap.png b/examples/datavisualization/qmlsurface/heightmap.png
index 051a0125..051a0125 100644
--- a/examples/qmlsurface/heightmap.png
+++ b/examples/datavisualization/qmlsurface/heightmap.png
Binary files differ
diff --git a/examples/qmlsurface/main.cpp b/examples/datavisualization/qmlsurface/main.cpp
index 03518d00..71d79a2b 100644
--- a/examples/qmlsurface/main.cpp
+++ b/examples/datavisualization/qmlsurface/main.cpp
@@ -16,31 +16,28 @@
**
****************************************************************************/
-#include <QtDataVisualization/qutils.h>
#include <QtGui/QGuiApplication>
-#include "qtquick2applicationviewer.h"
-
-#ifdef Q_OS_ANDROID
-#include <QDir>
-#include <QQmlEngine>
-#endif
+#include <QtCore/QDir>
+#include <QtQuick/QQuickView>
+#include <QtQml/QQmlEngine>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
- QtQuick2ApplicationViewer viewer;
-
- // Enable antialiasing
- viewer.setFormat(QtDataVisualization::qDefaultSurfaceFormat());
+ QQuickView viewer;
-#ifdef Q_OS_ANDROID
- viewer.addImportPath(QString::fromLatin1("assets:/qml"));
- viewer.engine()->addPluginPath(QString::fromLatin1("%1/../%2").arg(QDir::homePath(),
- QString::fromLatin1("lib")));
+ // The following are needed to make examples run without having to install the module
+ // in desktop environments.
+#ifdef Q_OS_WIN
+ QString extraImportPath(QStringLiteral("%1/../../../../%2"));
+#else
+ QString extraImportPath(QStringLiteral("%1/../../../%2"));
#endif
+ viewer.engine()->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
+ QString::fromLatin1("qml")));
- viewer.setSource(QUrl("qrc:/qml/main.qml"));
+ viewer.setSource(QUrl("qrc:/qml/qml/qmlsurface/main.qml"));
viewer.setTitle(QStringLiteral("Tycho crater on the Moon (height exaggerated)"));
viewer.setResizeMode(QQuickView::SizeRootObjectToView);
diff --git a/examples/qmlsurface/qml/qmlsurface/data.qml b/examples/datavisualization/qmlsurface/qml/qmlsurface/Data.qml
index 5fd4ece8..5fd4ece8 100644
--- a/examples/qmlsurface/qml/qmlsurface/data.qml
+++ b/examples/datavisualization/qmlsurface/qml/qmlsurface/Data.qml
diff --git a/examples/datavisualization/qmlsurface/qml/qmlsurface/NewButton.qml b/examples/datavisualization/qmlsurface/qml/qmlsurface/NewButton.qml
new file mode 100644
index 00000000..e4fb99d2
--- /dev/null
+++ b/examples/datavisualization/qmlsurface/qml/qmlsurface/NewButton.qml
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import QtQuick.Controls 1.0
+import QtQuick.Controls.Styles 1.0
+
+Item {
+ id: newbutton
+
+ property alias text: buttonText.text
+
+ signal clicked
+
+ implicitWidth: buttonText.implicitWidth + 5
+ implicitHeight: buttonText.implicitHeight + 10
+
+ Button {
+ id: buttonText
+ width: parent.width
+ height: parent.height
+
+ style: ButtonStyle {
+ label: Component {
+ Text {
+ text: buttonText.text
+ clip: true
+ wrapMode: Text.WordWrap
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ anchors.fill: parent
+ }
+ }
+ }
+ onClicked: newbutton.clicked()
+ }
+}
diff --git a/examples/qmlsurface/qml/qmlsurface/main.qml b/examples/datavisualization/qmlsurface/qml/qmlsurface/main.qml
index da608aa7..c38c3146 100644
--- a/examples/qmlsurface/qml/qmlsurface/main.qml
+++ b/examples/datavisualization/qmlsurface/qml/qmlsurface/main.qml
@@ -21,13 +21,11 @@ import QtQuick.Layouts 1.0
import QtDataVisualization 1.0
import "."
-Item {
+Rectangle {
id: mainview
- width: 1280
- height: 720
-
- property int buttonMaximumWidth: surfaceGridToggle.width
- property int buttonMinimumHeight: seriesToggle.height
+ width: 1024
+ height: 768
+ color: surfacePlot.theme.windowColor
Data {
id: surfaceData
@@ -35,9 +33,10 @@ Item {
Item {
id: surfaceView
- width: mainview.width - buttonLayout.width
+ width: mainview.width
height: mainview.height
- anchors.right: mainview.right;
+ anchors.top: mainview.top
+ anchors.left: mainview.left
//! [0]
ColorGradient {
@@ -49,7 +48,7 @@ Item {
//! [0]
Surface3D {
- id: surfaceplot
+ id: surfacePlot
width: surfaceView.width
height: surfaceView.height
//! [7]
@@ -75,6 +74,9 @@ Item {
axisY.segmentCount: 5
axisY.subSegmentCount: 2
axisY.labelFormat: "%i"
+ axisY.title: "Height"
+ axisX.title: "Latitude"
+ axisZ.title: "Longitude"
//! [5]
Surface3DSeries {
@@ -88,7 +90,7 @@ Item {
itemModel: surfaceData.model
rowRole: "longitude"
columnRole: "latitude"
- valueRole: "height"
+ yPosRole: "height"
}
//! [6]
@@ -96,37 +98,37 @@ Item {
flatShadingToggle.text = "Flat not supported"
}
}
+ //! [4]
+ Surface3DSeries {
+ id: heightSeries
+ flatShadingEnabled: false
+ drawMode: Surface3DSeries.DrawSurface
+ visible: false
+
+ HeightMapSurfaceDataProxy {
+ heightMapFile: ":/heightmaps/image"
+ // We don't want the default data values set by heightmap proxy.
+ minZValue: 30
+ maxZValue: 60
+ minXValue: 67
+ maxXValue: 97
+ }
+ }
+ //! [4]
}
}
- // TODO: Kept outside until surface supports multiple added series (QTRD-2579)
- //! [4]
- Surface3DSeries {
- id: heightSeries
- flatShadingEnabled: false
- drawMode: Surface3DSeries.DrawSurface
-
- HeightMapSurfaceDataProxy {
- heightMapFile: ":/heightmaps/image"
- // We don't want the default data values set by heightmap proxy.
- minZValue: 30
- maxZValue: 60
- minXValue: 67
- maxXValue: 97
- }
- }
- //! [4]
- ColumnLayout {
+ RowLayout {
id: buttonLayout
anchors.top: parent.top
anchors.left: parent.left
- spacing: 0
+ anchors.right: parent.right
+ opacity: 0.5
NewButton {
id: surfaceGridToggle
- Layout.maximumWidth: buttonMaximumWidth
Layout.fillWidth: true
- Layout.minimumHeight: buttonMinimumHeight
+ Layout.fillHeight: true
text: "Show Surface Grid"
//! [1]
onClicked: {
@@ -145,9 +147,8 @@ Item {
NewButton {
id: surfaceToggle
- Layout.maximumWidth: buttonMaximumWidth
Layout.fillWidth: true
- Layout.minimumHeight: buttonMinimumHeight
+ Layout.fillHeight: true
text: "Hide Surface"
//! [8]
onClicked: {
@@ -166,10 +167,8 @@ Item {
NewButton {
id: flatShadingToggle
- Layout.maximumWidth: buttonMaximumWidth
Layout.fillWidth: true
- Layout.minimumHeight: buttonMinimumHeight
-
+ Layout.fillHeight: true
text: "Show Flat"
enabled: surfaceSeries.flatShadingSupported
//! [2]
@@ -189,16 +188,15 @@ Item {
NewButton {
id: backgroundToggle
- Layout.maximumWidth: buttonMaximumWidth
Layout.fillWidth: true
- Layout.minimumHeight: buttonMinimumHeight
+ Layout.fillHeight: true
text: "Hide Background"
onClicked: {
- if (surfaceplot.theme.backgroundEnabled === true) {
- surfaceplot.theme.backgroundEnabled = false;
+ if (surfacePlot.theme.backgroundEnabled === true) {
+ surfacePlot.theme.backgroundEnabled = false;
text = "Show Background"
} else {
- surfaceplot.theme.backgroundEnabled = true;
+ surfacePlot.theme.backgroundEnabled = true;
text = "Hide Background"
}
}
@@ -206,16 +204,15 @@ Item {
NewButton {
id: gridToggle
- Layout.maximumWidth: buttonMaximumWidth
Layout.fillWidth: true
- Layout.minimumHeight: buttonMinimumHeight
+ Layout.fillHeight: true
text: "Hide Grid"
onClicked: {
- if (surfaceplot.theme.gridEnabled === true) {
- surfaceplot.theme.gridEnabled = false;
+ if (surfacePlot.theme.gridEnabled === true) {
+ surfacePlot.theme.gridEnabled = false;
text = "Show Grid"
} else {
- surfaceplot.theme.gridEnabled = true;
+ surfacePlot.theme.gridEnabled = true;
text = "Hide Grid"
}
}
@@ -223,20 +220,21 @@ Item {
NewButton {
id: seriesToggle
- Layout.maximumWidth: buttonMaximumWidth
Layout.fillWidth: true
- Layout.minimumHeight: buttonMinimumHeight
+ Layout.fillHeight: true
text: "Switch to Height Map Series"
//! [3]
onClicked: {
- if (surfaceplot.seriesList[0] === heightSeries) {
- surfaceplot.axisY.max = 500.0
- surfaceplot.seriesList = [surfaceSeries]
+ if (surfaceSeries.visible === false) {
+ surfacePlot.axisY.max = 500.0
+ surfaceSeries.visible = true
+ heightSeries.visible = false
middleGradient.position = 0.25
text = "Switch to Height Map Series"
} else {
- surfaceplot.axisY.max = 250.0
- surfaceplot.seriesList = [heightSeries]
+ surfacePlot.axisY.max = 250.0
+ surfaceSeries.visible = false
+ heightSeries.visible = true
middleGradient.position = 0.50
text = "Switch to Item Model Series"
}
diff --git a/examples/datavisualization/qmlsurface/qmlsurface.pro b/examples/datavisualization/qmlsurface/qmlsurface.pro
new file mode 100644
index 00000000..401d59a7
--- /dev/null
+++ b/examples/datavisualization/qmlsurface/qmlsurface.pro
@@ -0,0 +1,12 @@
+!include( ../examples.pri ) {
+ error( "Couldn't find the examples.pri file!" )
+}
+
+# The .cpp file which was generated for your project. Feel free to hack it.
+SOURCES += main.cpp
+
+RESOURCES += qmlsurface.qrc
+
+OTHER_FILES += doc/src/* \
+ doc/images/* \
+ qml/qmlsurface/*
diff --git a/examples/datavisualization/qmlsurface/qmlsurface.qrc b/examples/datavisualization/qmlsurface/qmlsurface.qrc
new file mode 100644
index 00000000..c27f2d56
--- /dev/null
+++ b/examples/datavisualization/qmlsurface/qmlsurface.qrc
@@ -0,0 +1,10 @@
+<RCC>
+ <qresource prefix="/qml">
+ <file>qml/qmlsurface/main.qml</file>
+ <file>qml/qmlsurface/Data.qml</file>
+ <file>qml/qmlsurface/NewButton.qml</file>
+ </qresource>
+ <qresource prefix="/heightmaps">
+ <file alias="image">heightmap.png</file>
+ </qresource>
+</RCC>
diff --git a/examples/datavisualization/qmlsurfacelayers/doc/images/qmlsurfacelayers-example.png b/examples/datavisualization/qmlsurfacelayers/doc/images/qmlsurfacelayers-example.png
new file mode 100644
index 00000000..c5a48fcb
--- /dev/null
+++ b/examples/datavisualization/qmlsurfacelayers/doc/images/qmlsurfacelayers-example.png
Binary files differ
diff --git a/examples/datavisualization/qmlsurfacelayers/doc/src/qmlsurfacelayers.qdoc b/examples/datavisualization/qmlsurfacelayers/doc/src/qmlsurfacelayers.qdoc
new file mode 100644
index 00000000..d50ecac5
--- /dev/null
+++ b/examples/datavisualization/qmlsurfacelayers/doc/src/qmlsurfacelayers.qdoc
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+/*!
+ \example qmlsurfacelayers
+ \title Qt Quick 2 Surface Multiseries Example
+ \ingroup qtdatavisualization_examples
+ \brief Using multiple series with Surface3D in a QML application.
+
+ The Qt Quick 2 surface example shows how to make a 3D surface plot displaying 3 layers using
+ Surface3D with Qt Quick 2.
+
+ \image qmlsurfacelayers-example.png
+
+ The focus in this example is on generating a multiseries surface plot from 3 different height
+ map images, so in this section we skip explaining the application creation. For a more detailed
+ QML example documentation, see \l{Qt Quick 2 Scatter Example}.
+
+ \section1 Adding data to the graph
+
+ This example shows how to add several surface series to one graph using using
+ HeightMapSurfaceDataProxies and how to control their visibilities individually.
+
+ Let's start by creating a specific gradient for each layer:
+
+ \snippet qmlsurfacelayers/qml/qmlsurfacelayers/main.qml 0
+
+ Then we'll create the series themselves. It happens simply by adding 3 separate Surface3DSeries
+ to the Surface3D graph as children:
+
+ \dots 0
+ \snippet qmlsurfacelayers/qml/qmlsurfacelayers/main.qml 1
+ \dots 0
+
+ You'll notice we added the created gradients to the \c baseGradient properties of the series.
+ We could have added them to the \c baseGradients property of the Theme3D in Surface3D instead,
+ but doing it this way ensures each gradient is applied to a correct series:
+
+ \snippet qmlsurfacelayers/qml/qmlsurfacelayers/main.qml 2
+ \dots
+
+ \section1 Controlling the graph
+
+ Let's add some checkboxes to control the visibility of layers:
+
+ \snippet qmlsurfacelayers/qml/qmlsurfacelayers/main.qml 3
+
+ We don't need to do anything on the \c onCheckedChanged as we bound the \c checked state to
+ the \c visible property of the series directly:
+
+ \dots 0
+ \snippet qmlsurfacelayers/qml/qmlsurfacelayers/main.qml 4
+ \dots 0
+
+ Let's add some more checkboxes to control how the layers are displayed, when visible:
+
+ \snippet qmlsurfacelayers/qml/qmlsurfacelayers/main.qml 5
+
+ In addition to these we have three buttons, one of which is of special interest to us. It is
+ used to control whether we want to slice into only one layer, or all of them:
+
+ \snippet qmlsurfacelayers/qml/qmlsurfacelayers/main.qml 6
+
+ \section1 Example contents
+*/
diff --git a/examples/surface/mountain.png b/examples/datavisualization/qmlsurfacelayers/layer_1.png
index 9138c710..9138c710 100644
--- a/examples/surface/mountain.png
+++ b/examples/datavisualization/qmlsurfacelayers/layer_1.png
Binary files differ
diff --git a/examples/datavisualization/qmlsurfacelayers/layer_2.png b/examples/datavisualization/qmlsurfacelayers/layer_2.png
new file mode 100644
index 00000000..61631ae8
--- /dev/null
+++ b/examples/datavisualization/qmlsurfacelayers/layer_2.png
Binary files differ
diff --git a/examples/datavisualization/qmlsurfacelayers/layer_3.png b/examples/datavisualization/qmlsurfacelayers/layer_3.png
new file mode 100644
index 00000000..796df64d
--- /dev/null
+++ b/examples/datavisualization/qmlsurfacelayers/layer_3.png
Binary files differ
diff --git a/examples/datavisualization/qmlsurfacelayers/main.cpp b/examples/datavisualization/qmlsurfacelayers/main.cpp
new file mode 100644
index 00000000..eb895dd1
--- /dev/null
+++ b/examples/datavisualization/qmlsurfacelayers/main.cpp
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+#include <QtDataVisualization/qutils.h>
+
+#include <QtGui/QGuiApplication>
+#include <QtCore/QDir>
+#include <QtQuick/QQuickView>
+#include <QtQml/QQmlEngine>
+
+int main(int argc, char *argv[])
+{
+ QGuiApplication app(argc, argv);
+
+ QQuickView viewer;
+
+ // Enable antialiasing in direct rendering mode
+ viewer.setFormat(QtDataVisualization::qDefaultSurfaceFormat());
+
+ // The following are needed to make examples run without having to install the module
+ // in desktop environments.
+#ifdef Q_OS_WIN
+ QString extraImportPath(QStringLiteral("%1/../../../../%2"));
+#else
+ QString extraImportPath(QStringLiteral("%1/../../../%2"));
+#endif
+ viewer.engine()->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
+ QString::fromLatin1("qml")));
+
+ viewer.setSource(QUrl("qrc:/qml/qmlsurfacelayers/main.qml"));
+
+ viewer.setTitle(QStringLiteral("3-layered Terrain"));
+ viewer.setResizeMode(QQuickView::SizeRootObjectToView);
+ viewer.show();
+
+ return app.exec();
+}
diff --git a/examples/datavisualization/qmlsurfacelayers/qml/qmlsurfacelayers/NewButton.qml b/examples/datavisualization/qmlsurfacelayers/qml/qmlsurfacelayers/NewButton.qml
new file mode 100644
index 00000000..e4fb99d2
--- /dev/null
+++ b/examples/datavisualization/qmlsurfacelayers/qml/qmlsurfacelayers/NewButton.qml
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import QtQuick.Controls 1.0
+import QtQuick.Controls.Styles 1.0
+
+Item {
+ id: newbutton
+
+ property alias text: buttonText.text
+
+ signal clicked
+
+ implicitWidth: buttonText.implicitWidth + 5
+ implicitHeight: buttonText.implicitHeight + 10
+
+ Button {
+ id: buttonText
+ width: parent.width
+ height: parent.height
+
+ style: ButtonStyle {
+ label: Component {
+ Text {
+ text: buttonText.text
+ clip: true
+ wrapMode: Text.WordWrap
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ anchors.fill: parent
+ }
+ }
+ }
+ onClicked: newbutton.clicked()
+ }
+}
diff --git a/examples/datavisualization/qmlsurfacelayers/qml/qmlsurfacelayers/main.qml b/examples/datavisualization/qmlsurfacelayers/qml/qmlsurfacelayers/main.qml
new file mode 100644
index 00000000..0be991bc
--- /dev/null
+++ b/examples/datavisualization/qmlsurfacelayers/qml/qmlsurfacelayers/main.qml
@@ -0,0 +1,278 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import QtQuick.Layouts 1.0
+import QtQuick.Controls 1.0
+import QtDataVisualization 1.0
+import "."
+
+Item {
+ id: mainview
+ width: 1280
+ height: 720
+
+ Item {
+ id: surfaceView
+ width: mainview.width - buttonLayout.width
+ height: mainview.height
+ anchors.right: mainview.right;
+
+ //! [0]
+ ColorGradient {
+ id: layerOneGradient
+ ColorGradientStop { position: 0.0; color: "black" }
+ ColorGradientStop { position: 0.31; color: "tan" }
+ ColorGradientStop { position: 0.32; color: "green" }
+ ColorGradientStop { position: 0.40; color: "darkslategray" }
+ ColorGradientStop { position: 1.0; color: "white" }
+ }
+
+ ColorGradient {
+ id: layerTwoGradient
+ ColorGradientStop { position: 0.315; color: "blue" }
+ ColorGradientStop { position: 0.33; color: "white" }
+ }
+
+ ColorGradient {
+ id: layerThreeGradient
+ ColorGradientStop { position: 0.0; color: "red" }
+ ColorGradientStop { position: 0.15; color: "black" }
+ }
+ //! [0]
+
+ Surface3D {
+ id: surfaceLayers
+ width: surfaceView.width
+ height: surfaceView.height
+ theme: Theme3D {
+ type: Theme3D.ThemeEbony
+ font.pointSize: 35
+ colorStyle: Theme3D.ColorStyleRangeGradient
+ }
+ shadowQuality: AbstractGraph3D.ShadowQualityNone
+ selectionMode: AbstractGraph3D.SelectionRow | AbstractGraph3D.SelectionSlice
+ scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricLeft
+ axisY.min: 20
+ axisY.max: 200
+ axisX.segmentCount: 5
+ axisX.subSegmentCount: 2
+ axisX.labelFormat: "%i"
+ axisZ.segmentCount: 5
+ axisZ.subSegmentCount: 2
+ axisZ.labelFormat: "%i"
+ axisY.segmentCount: 5
+ axisY.subSegmentCount: 2
+ axisY.labelFormat: "%i"
+
+ //! [1]
+ //! [2]
+ Surface3DSeries {
+ id: layerOneSeries
+ baseGradient: layerOneGradient
+ //! [2]
+ HeightMapSurfaceDataProxy {
+ heightMapFile: ":/heightmaps/layer_1.png"
+ }
+ flatShadingEnabled: false
+ drawMode: Surface3DSeries.DrawSurface
+ //! [4]
+ visible: layerOneToggle.checked // bind to checkbox state
+ //! [4]
+ }
+
+ Surface3DSeries {
+ id: layerTwoSeries
+ baseGradient: layerTwoGradient
+ HeightMapSurfaceDataProxy {
+ heightMapFile: ":/heightmaps/layer_2.png"
+ }
+ flatShadingEnabled: false
+ drawMode: Surface3DSeries.DrawSurface
+ visible: layerTwoToggle.checked // bind to checkbox state
+ }
+
+ Surface3DSeries {
+ id: layerThreeSeries
+ baseGradient: layerThreeGradient
+ HeightMapSurfaceDataProxy {
+ heightMapFile: ":/heightmaps/layer_3.png"
+ }
+ flatShadingEnabled: false
+ drawMode: Surface3DSeries.DrawSurface
+ visible: layerThreeToggle.checked // bind to checkbox state
+ }
+ //! [1]
+ }
+ }
+
+ ColumnLayout {
+ id: buttonLayout
+ anchors.top: parent.top
+ anchors.left: parent.left
+ spacing: 0
+
+ //! [3]
+ GroupBox {
+ title: "Layer Selection"
+ Layout.fillWidth: true
+ Column {
+ CheckBox {
+ id: layerOneToggle
+ text: "Show Ground Layer"
+ checked: true
+ }
+
+ CheckBox {
+ id: layerTwoToggle
+ text: "Show Sea Layer"
+ checked: true
+ }
+
+ CheckBox {
+ id: layerThreeToggle
+ text: "Show Tectonic Layer"
+ checked: true
+ }
+ }
+ }
+ //! [3]
+
+ //! [5]
+ GroupBox {
+ title: "Layer Style"
+ Layout.fillWidth: true
+ Column {
+ CheckBox {
+ id: layerOneGrid
+ text: "Show Ground as Grid"
+ onCheckedChanged: {
+ if (checked)
+ layerOneSeries.drawMode = Surface3DSeries.DrawWireframe
+ else
+ layerOneSeries.drawMode = Surface3DSeries.DrawSurface
+ }
+ }
+
+ CheckBox {
+ id: layerTwoGrid
+ text: "Show Sea as Grid"
+ onCheckedChanged: {
+ if (checked)
+ layerTwoSeries.drawMode = Surface3DSeries.DrawWireframe
+ else
+ layerTwoSeries.drawMode = Surface3DSeries.DrawSurface
+ }
+ }
+
+ CheckBox {
+ id: layerThreeGrid
+ text: "Show Tectonic as Grid"
+ onCheckedChanged: {
+ if (checked)
+ layerThreeSeries.drawMode = Surface3DSeries.DrawWireframe
+ else
+ layerThreeSeries.drawMode = Surface3DSeries.DrawSurface
+ }
+ }
+ }
+ }
+ //! [5]
+
+ //! [6]
+ NewButton {
+ id: sliceButton
+ text: "Slice All Layers"
+ Layout.fillWidth: true
+ Layout.minimumHeight: 40
+ onClicked: {
+ if (surfaceLayers.selectionMode & AbstractGraph3D.SelectionMultiSeries) {
+ surfaceLayers.selectionMode = AbstractGraph3D.SelectionRow
+ | AbstractGraph3D.SelectionSlice
+ text = "Slice All Layers"
+ } else {
+ surfaceLayers.selectionMode = AbstractGraph3D.SelectionRow
+ | AbstractGraph3D.SelectionSlice
+ | AbstractGraph3D.SelectionMultiSeries
+ text = "Slice One Layer"
+ }
+ }
+ }
+ //! [6]
+
+ NewButton {
+ id: shadowButton
+ text: "Show Shadows"
+ Layout.fillWidth: true
+ Layout.minimumHeight: 40
+ onClicked: {
+ if (surfaceLayers.shadowQuality === AbstractGraph3D.ShadowQualityNone) {
+ surfaceLayers.shadowQuality = AbstractGraph3D.ShadowQualityLow
+ text = "Hide Shadows"
+ } else {
+ surfaceLayers.shadowQuality = AbstractGraph3D.ShadowQualityNone
+ text = "Show Shadows"
+ }
+ }
+ }
+
+ NewButton {
+ id: renderModeButton
+ text: "Switch Render Mode"
+ Layout.fillWidth: true
+ Layout.minimumHeight: 40
+ onClicked: {
+ var modeText = "Indirect "
+ var aaText
+ if (surfaceLayers.renderingMode === AbstractGraph3D.RenderIndirect &&
+ surfaceLayers.msaaSamples === 0) {
+ surfaceLayers.renderingMode = AbstractGraph3D.RenderDirectToBackground
+ modeText = "BackGround "
+ } else if (surfaceLayers.renderingMode === AbstractGraph3D.RenderIndirect &&
+ surfaceLayers.msaaSamples === 4) {
+ surfaceLayers.renderingMode = AbstractGraph3D.RenderIndirect
+ surfaceLayers.msaaSamples = 0
+ } else if (surfaceLayers.renderingMode === AbstractGraph3D.RenderIndirect &&
+ surfaceLayers.msaaSamples === 8) {
+ surfaceLayers.renderingMode = AbstractGraph3D.RenderIndirect
+ surfaceLayers.msaaSamples = 4
+ } else {
+ surfaceLayers.renderingMode = AbstractGraph3D.RenderIndirect
+ surfaceLayers.msaaSamples = 8
+ }
+
+ if (surfaceLayers.msaaSamples <= 0) {
+ aaText = "No AA"
+ } else {
+ aaText = surfaceLayers.msaaSamples + "xMSAA"
+ }
+
+ renderLabel.text = modeText + aaText
+ }
+ }
+
+ TextField {
+ id: renderLabel
+ Layout.fillWidth: true
+ Layout.minimumHeight: 40
+ enabled: false
+ horizontalAlignment: TextInput.AlignHCenter
+ text: "Indirect, " + surfaceLayers.msaaSamples + "xMSAA"
+ }
+ }
+}
diff --git a/examples/datavisualization/qmlsurfacelayers/qmlsurfacelayers.pro b/examples/datavisualization/qmlsurfacelayers/qmlsurfacelayers.pro
new file mode 100644
index 00000000..2bfa904d
--- /dev/null
+++ b/examples/datavisualization/qmlsurfacelayers/qmlsurfacelayers.pro
@@ -0,0 +1,12 @@
+!include( ../examples.pri ) {
+ error( "Couldn't find the examples.pri file!" )
+}
+
+# The .cpp file which was generated for your project. Feel free to hack it.
+SOURCES += main.cpp
+
+RESOURCES += qmlsurfacelayers.qrc
+
+OTHER_FILES += doc/src/* \
+ doc/images/* \
+ qml/qmlsurfacelayers/*
diff --git a/examples/datavisualization/qmlsurfacelayers/qmlsurfacelayers.qrc b/examples/datavisualization/qmlsurfacelayers/qmlsurfacelayers.qrc
new file mode 100644
index 00000000..028a91db
--- /dev/null
+++ b/examples/datavisualization/qmlsurfacelayers/qmlsurfacelayers.qrc
@@ -0,0 +1,11 @@
+<RCC>
+ <qresource prefix="/">
+ <file>qml/qmlsurfacelayers/main.qml</file>
+ <file>qml/qmlsurfacelayers/NewButton.qml</file>
+ </qresource>
+ <qresource prefix="/heightmaps">
+ <file>layer_1.png</file>
+ <file>layer_2.png</file>
+ <file>layer_3.png</file>
+ </qresource>
+</RCC>
diff --git a/examples/datavisualization/rotations/doc/images/rotations-example.png b/examples/datavisualization/rotations/doc/images/rotations-example.png
new file mode 100644
index 00000000..74bebbf7
--- /dev/null
+++ b/examples/datavisualization/rotations/doc/images/rotations-example.png
Binary files differ
diff --git a/examples/datavisualization/rotations/doc/src/rotations.qdoc b/examples/datavisualization/rotations/doc/src/rotations.qdoc
new file mode 100644
index 00000000..72facde0
--- /dev/null
+++ b/examples/datavisualization/rotations/doc/src/rotations.qdoc
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+/*!
+ \example rotations
+ \title Rotations Example
+ \ingroup qtdatavisualization_examples
+ \brief Using rotated scatter items
+
+ This example shows how to do the following:
+
+ \list
+ \li Use item rotations
+ \li Use custom item meshes
+ \li Use range gradient to color the series
+ \endlist
+
+ For more basic example about using Qt Data Visualization graphs, see \l{Bars Example}.
+
+ \image rotations-example.png
+
+ \section1 Using rotations
+
+ In this example we want to orient the arrow items tangentially to the origin. This requires
+ rotating them, which can be achieved by specifying rotation quaternion to each item:
+
+ \snippet rotations/scatterdatamodifier.cpp 0
+ \snippet rotations/scatterdatamodifier.cpp 1
+ \snippet rotations/scatterdatamodifier.cpp 2
+
+ Since the items need to be rotated along two axes, we define two rotation quaternions, one
+ for Y-axis and one for Z-axis, and then multiply these together to get the total rotation,
+ which we set to the data item.
+
+ \section1 Using custom item meshes
+
+ The narrow arrow mesh we use for magnetic field arrow items is not a standard mesh. Instead
+ we supply our own \c{narrowarrow.obj} file which contains the object definition for the mesh
+ in \c Wavefront obj format:
+
+ \snippet rotations/scatterdatamodifier.cpp 3
+
+ \section1 Using range gradient
+
+ Setting the color style to range gradient in a series means that the item is colored according
+ to its relative Y-value on the visible Y-coordinate range. We want the arrows on the bottom
+ part of the graph to be darker and gradually get lighter higher they are, so we define a
+ range gradient with black color at the position 0.0 and white color at the position 1.0:
+
+ \snippet rotations/scatterdatamodifier.cpp 4
+
+ \section1 Example contents
+*/
diff --git a/examples/datavisualization/rotations/main.cpp b/examples/datavisualization/rotations/main.cpp
new file mode 100644
index 00000000..7f477c92
--- /dev/null
+++ b/examples/datavisualization/rotations/main.cpp
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+#include "scatterdatamodifier.h"
+
+#include <QtWidgets/QApplication>
+#include <QtWidgets/QWidget>
+#include <QtWidgets/QHBoxLayout>
+#include <QtWidgets/QVBoxLayout>
+#include <QtWidgets/QPushButton>
+#include <QtWidgets/QSlider>
+#include <QtWidgets/QLabel>
+#include <QtGui/QScreen>
+
+int main(int argc, char **argv)
+{
+ QApplication app(argc, argv);
+ Q3DScatter *graph = new Q3DScatter();
+ QWidget *container = QWidget::createWindowContainer(graph);
+
+ QSize screenSize = graph->screen()->size();
+ container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 1.5));
+ container->setMaximumSize(screenSize);
+ container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ container->setFocusPolicy(Qt::StrongFocus);
+
+ QWidget *widget = new QWidget;
+ QHBoxLayout *hLayout = new QHBoxLayout(widget);
+ QVBoxLayout *vLayout = new QVBoxLayout();
+ hLayout->addWidget(container, 1);
+ hLayout->addLayout(vLayout);
+
+ widget->setWindowTitle(QStringLiteral("Item rotations example - Magnetic field of the sun"));
+
+ QPushButton *toggleRotationButton = new QPushButton(widget);
+ toggleRotationButton->setText(QStringLiteral("Toggle animation"));
+ QPushButton *toggleSunButton = new QPushButton(widget);
+ toggleSunButton->setText(QStringLiteral("Toggle Sun"));
+
+ QSlider *fieldLinesSlider = new QSlider(Qt::Horizontal, widget);
+ fieldLinesSlider->setTickInterval(1);
+ fieldLinesSlider->setMinimum(1);
+ fieldLinesSlider->setValue(12);
+ fieldLinesSlider->setMaximum(128);
+
+ QSlider *arrowsSlider = new QSlider(Qt::Horizontal, widget);
+ arrowsSlider->setTickInterval(1);
+ arrowsSlider->setMinimum(8);
+ arrowsSlider->setValue(16);
+ arrowsSlider->setMaximum(32);
+
+ vLayout->addWidget(toggleRotationButton);
+ vLayout->addWidget(toggleSunButton);
+ vLayout->addWidget(new QLabel(QStringLiteral("Field Lines (1 - 128):")));
+ vLayout->addWidget(fieldLinesSlider);
+ vLayout->addWidget(new QLabel(QStringLiteral("Arrows per line (8 - 32):")));
+ vLayout->addWidget(arrowsSlider, 1, Qt::AlignTop);
+
+ ScatterDataModifier *modifier = new ScatterDataModifier(graph);
+
+ QObject::connect(toggleRotationButton, &QPushButton::clicked, modifier,
+ &ScatterDataModifier::toggleRotation);
+ QObject::connect(toggleSunButton, &QPushButton::clicked, modifier,
+ &ScatterDataModifier::toggleSun);
+ QObject::connect(fieldLinesSlider, &QSlider::valueChanged, modifier,
+ &ScatterDataModifier::setFieldLines);
+ QObject::connect(arrowsSlider, &QSlider::valueChanged, modifier,
+ &ScatterDataModifier::setArrowsPerLine);
+
+ widget->show();
+ return app.exec();
+}
diff --git a/examples/datavisualization/rotations/mesh/largesphere.obj b/examples/datavisualization/rotations/mesh/largesphere.obj
new file mode 100644
index 00000000..63101413
--- /dev/null
+++ b/examples/datavisualization/rotations/mesh/largesphere.obj
@@ -0,0 +1,1938 @@
+# Blender v2.66 (sub 0) OBJ File: ''
+# www.blender.org
+o Sphere_Sphere.001
+v -1.251476 7.901507 0.000000
+v -2.472136 7.608452 0.000000
+v -3.631924 7.128052 0.000000
+v -4.702282 6.472136 0.000000
+v -5.656854 5.656854 0.000000
+v -6.472136 4.702282 0.000000
+v -7.128052 3.631924 0.000000
+v -7.608452 2.472136 0.000000
+v -7.901507 1.251475 0.000000
+v -8.000000 -0.000001 0.000000
+v -7.901506 -1.251477 0.000000
+v -7.608451 -2.472138 0.000000
+v -7.128051 -3.631927 0.000000
+v -6.472134 -4.702285 0.000000
+v -5.656851 -5.656857 0.000000
+v -4.702279 -6.472138 0.000000
+v -3.631920 -7.128055 0.000000
+v -2.472131 -7.608454 0.000000
+v -1.251470 -7.901508 0.000000
+v -1.190224 7.901506 -0.386729
+v -2.351141 7.608452 -0.763934
+v -3.454165 7.128052 -1.122328
+v -4.472136 6.472136 -1.453087
+v -5.379988 5.656855 -1.748066
+v -6.155366 4.702282 -2.000002
+v -6.779180 3.631924 -2.202692
+v -7.236068 2.472136 -2.351143
+v -7.514779 1.251475 -2.441702
+v -7.608452 -0.000001 -2.472138
+v -7.514779 -1.251477 -2.441702
+v -7.236067 -2.472138 -2.351143
+v -6.779179 -3.631927 -2.202691
+v -6.155365 -4.702285 -2.000002
+v -5.379985 -5.656857 -1.748065
+v -4.472132 -6.472138 -1.453086
+v -3.454160 -7.128055 -1.122327
+v -2.351136 -7.608454 -0.763933
+v -1.190218 -7.901508 -0.386727
+v 0.000006 -8.000000 0.000000
+v -1.012464 7.901506 -0.735603
+v -1.999999 7.608452 -1.453089
+v -2.938287 7.128052 -2.134795
+v -3.804224 6.472136 -2.763936
+v -4.576490 5.656855 -3.325019
+v -5.236066 4.702282 -3.804230
+v -5.766714 3.631924 -4.189768
+v -6.155365 2.472136 -4.472140
+v -6.392451 1.251475 -4.644393
+v -6.472135 -0.000001 -4.702287
+v -6.392451 -1.251477 -4.644393
+v -6.155365 -2.472138 -4.472139
+v -5.766713 -3.631927 -4.189767
+v -5.236064 -4.702285 -3.804229
+v -4.576487 -5.656857 -3.325018
+v -3.804221 -6.472138 -2.763934
+v -2.938283 -7.128055 -2.134793
+v -1.999994 -7.608454 -1.453086
+v -1.012459 -7.901508 -0.735599
+v -0.735596 7.901506 -1.012470
+v -1.453082 7.608452 -2.000005
+v -2.134788 7.128052 -2.938294
+v -2.763928 6.472136 -3.804231
+v -3.325012 5.656855 -4.576497
+v -3.804222 4.702282 -5.236073
+v -4.189760 3.631924 -5.766721
+v -4.472132 2.472136 -6.155373
+v -4.644385 1.251475 -6.392459
+v -4.702279 -0.000001 -6.472142
+v -4.644385 -1.251477 -6.392458
+v -4.472132 -2.472138 -6.155372
+v -4.189760 -3.631927 -5.766720
+v -3.804221 -4.702285 -5.236072
+v -3.325010 -5.656857 -4.576494
+v -2.763927 -6.472138 -3.804229
+v -2.134786 -7.128055 -2.938290
+v -1.453079 -7.608454 -2.000001
+v -0.735593 -7.901508 -1.012466
+v -0.386723 7.901506 -1.190230
+v -0.763927 7.608452 -2.351147
+v -1.122321 7.128052 -3.454171
+v -1.453079 6.472136 -4.472141
+v -1.748058 5.656855 -5.379994
+v -1.999994 4.702282 -6.155373
+v -2.202683 3.631924 -6.779186
+v -2.351135 2.472136 -7.236074
+v -2.441693 1.251475 -7.514785
+v -2.472130 -0.000001 -7.608459
+v -2.441693 -1.251477 -7.514784
+v -2.351135 -2.472138 -7.236073
+v -2.202683 -3.631927 -6.779185
+v -1.999993 -4.702285 -6.155371
+v -1.748057 -5.656857 -5.379991
+v -1.453079 -6.472138 -4.472138
+v -1.122320 -7.128055 -3.454167
+v -0.763926 -7.608454 -2.351142
+v -0.386721 -7.901508 -1.190225
+v 0.000007 7.901506 -1.251482
+v 0.000007 7.608452 -2.472142
+v 0.000007 7.128052 -3.631930
+v 0.000008 6.472136 -4.702287
+v 0.000008 5.656855 -5.656860
+v 0.000008 4.702282 -6.472141
+v 0.000008 3.631924 -7.128057
+v 0.000008 2.472136 -7.608458
+v 0.000009 1.251475 -7.901512
+v 0.000009 -0.000001 -8.000006
+v 0.000009 -1.251477 -7.901511
+v 0.000008 -2.472138 -7.608456
+v 0.000008 -3.631927 -7.128057
+v 0.000008 -4.702285 -6.472139
+v 0.000008 -5.656857 -5.656857
+v 0.000007 -6.472138 -4.702284
+v 0.000007 -7.128055 -3.631926
+v 0.000007 -7.608454 -2.472137
+v 0.000007 -7.901508 -1.251476
+v 0.386736 7.901506 -1.190230
+v 0.763941 7.608452 -2.351147
+v 1.122336 7.128052 -3.454170
+v 1.453094 6.472136 -4.472140
+v 1.748074 5.656855 -5.379993
+v 2.000010 4.702282 -6.155371
+v 2.202699 3.631924 -6.779185
+v 2.351151 2.472136 -7.236073
+v 2.441710 1.251475 -7.514783
+v 2.472147 -0.000001 -7.608457
+v 2.441710 -1.251477 -7.514783
+v 2.351151 -2.472138 -7.236071
+v 2.202699 -3.631927 -6.779184
+v 2.000009 -4.702285 -6.155369
+v 1.748073 -5.656857 -5.379990
+v 1.453093 -6.472138 -4.472137
+v 1.122334 -7.128055 -3.454166
+v 0.763939 -7.608454 -2.351141
+v 0.386734 -7.901508 -1.190225
+v 0.735610 7.901506 -1.012470
+v 1.453096 7.608452 -2.000005
+v 2.134803 7.128052 -2.938292
+v 2.763942 6.472136 -3.804229
+v 3.325027 5.656855 -4.576495
+v 3.804237 4.702282 -5.236070
+v 4.189775 3.631924 -5.766718
+v 4.472148 2.472136 -6.155370
+v 4.644401 1.251475 -6.392455
+v 4.702294 -0.000001 -6.472139
+v 4.644400 -1.251477 -6.392455
+v 4.472147 -2.472138 -6.155369
+v 4.189774 -3.631927 -5.766717
+v 3.804236 -4.702285 -5.236069
+v 3.325025 -5.656857 -4.576492
+v 2.763941 -6.472138 -3.804227
+v 2.134800 -7.128055 -2.938289
+v 1.453092 -7.608454 -2.000000
+v 0.735606 -7.901508 -1.012465
+v 1.012477 7.901506 -0.735602
+v 2.000012 7.608452 -1.453088
+v 2.938301 7.128052 -2.134794
+v 3.804237 6.472136 -2.763933
+v 4.576503 5.656855 -3.325017
+v 5.236080 4.702282 -3.804226
+v 5.766727 3.631924 -4.189765
+v 6.155380 2.472136 -4.472136
+v 6.392465 1.251475 -4.644389
+v 6.472148 -0.000001 -4.702283
+v 6.392465 -1.251477 -4.644389
+v 6.155378 -2.472138 -4.472136
+v 5.766726 -3.631927 -4.189764
+v 5.236078 -4.702285 -3.804225
+v 4.576500 -5.656857 -3.325016
+v 3.804235 -6.472138 -2.763932
+v 2.938297 -7.128055 -2.134791
+v 2.000007 -7.608454 -1.453085
+v 1.012472 -7.901508 -0.735599
+v 1.190237 7.901506 -0.386729
+v 2.351154 7.608452 -0.763933
+v 3.454178 7.128052 -1.122326
+v 4.472147 6.472136 -1.453085
+v 5.380000 5.656855 -1.748063
+v 6.155379 4.702282 -1.999998
+v 6.779192 3.631924 -2.202688
+v 7.236081 2.472136 -2.351139
+v 7.514791 1.251475 -2.441698
+v 7.608464 -0.000001 -2.472134
+v 7.514791 -1.251477 -2.441698
+v 7.236079 -2.472138 -2.351139
+v 6.779191 -3.631927 -2.202688
+v 6.155377 -4.702285 -1.999998
+v 5.379997 -5.656857 -1.748063
+v 4.472144 -6.472138 -1.453084
+v 3.454173 -7.128055 -1.122325
+v 2.351148 -7.608454 -0.763931
+v 1.190231 -7.901508 -0.386727
+v 1.251488 7.901506 0.000001
+v 2.472148 7.608452 0.000001
+v 3.631936 7.128052 0.000002
+v 4.702293 6.472136 0.000002
+v 5.656866 5.656855 0.000003
+v 6.472147 4.702282 0.000004
+v 7.128063 3.631924 0.000003
+v 7.608464 2.472136 0.000004
+v 7.901517 1.251475 0.000004
+v 8.000011 -0.000001 0.000004
+v 7.901517 -1.251477 0.000004
+v 7.608462 -2.472138 0.000004
+v 7.128062 -3.631927 0.000003
+v 6.472145 -4.702285 0.000004
+v 5.656862 -5.656857 0.000002
+v 4.702290 -6.472138 0.000002
+v 3.631932 -7.128055 0.000002
+v 2.472143 -7.608454 0.000001
+v 1.251483 -7.901508 0.000001
+v 1.190236 7.901506 0.386730
+v 2.351153 7.608452 0.763935
+v 3.454176 7.128052 1.122330
+v 4.472146 6.472136 1.453089
+v 5.379998 5.656855 1.748069
+v 6.155376 4.702282 2.000005
+v 6.779190 3.631924 2.202694
+v 7.236078 2.472136 2.351147
+v 7.514788 1.251475 2.441705
+v 7.608462 -0.000001 2.472141
+v 7.514788 -1.251477 2.441705
+v 7.236076 -2.472138 2.351146
+v 6.779189 -3.631927 2.202693
+v 6.155375 -4.702285 2.000004
+v 5.379995 -5.656857 1.748067
+v 4.472143 -6.472138 1.453088
+v 3.454172 -7.128055 1.122328
+v 2.351147 -7.608454 0.763933
+v 1.190231 -7.901508 0.386728
+v 1.012476 7.901506 0.735603
+v 2.000010 7.608452 1.453090
+v 2.938298 7.128052 2.134796
+v 3.804235 6.472136 2.763937
+v 4.576499 5.656855 3.325021
+v 5.236075 4.702282 3.804232
+v 5.766723 3.631924 4.189770
+v 6.155375 2.472136 4.472143
+v 6.392460 1.251475 4.644395
+v 6.472144 -0.000001 4.702289
+v 6.392460 -1.251477 4.644395
+v 6.155374 -2.472138 4.472141
+v 5.766722 -3.631927 4.189769
+v 5.236074 -4.702285 3.804231
+v 4.576497 -5.656857 3.325018
+v 3.804232 -6.472138 2.763935
+v 2.938295 -7.128055 2.134794
+v 2.000006 -7.608454 1.453086
+v 1.012471 -7.901508 0.735600
+v 0.735608 7.901506 1.012471
+v 1.453094 7.608452 2.000006
+v 2.134799 7.128052 2.938294
+v 2.763939 6.472136 3.804232
+v 3.325022 5.656855 4.576497
+v 3.804231 4.702282 5.236074
+v 4.189770 3.631924 5.766721
+v 4.472141 2.472136 6.155374
+v 4.644393 1.251475 6.392459
+v 4.702287 -0.000001 6.472143
+v 4.644393 -1.251477 6.392459
+v 4.472141 -2.472138 6.155372
+v 4.189768 -3.631927 5.766720
+v 3.804231 -4.702285 5.236073
+v 3.325021 -5.656857 4.576494
+v 2.763937 -6.472138 3.804228
+v 2.134797 -7.128055 2.938291
+v 1.453090 -7.608454 2.000001
+v 0.735605 -7.901508 1.012466
+v 0.386735 7.901506 1.190230
+v 0.763939 7.608452 2.351147
+v 1.122332 7.128052 3.454171
+v 1.453090 6.472136 4.472141
+v 1.748069 5.656855 5.379993
+v 2.000002 4.702282 6.155373
+v 2.202693 3.631924 6.779186
+v 2.351144 2.472136 7.236073
+v 2.441703 1.251475 7.514784
+v 2.472139 -0.000001 7.608459
+v 2.441703 -1.251477 7.514784
+v 2.351144 -2.472138 7.236072
+v 2.202692 -3.631927 6.779184
+v 2.000003 -4.702285 6.155371
+v 1.748068 -5.656857 5.379990
+v 1.453089 -6.472138 4.472137
+v 1.122331 -7.128055 3.454167
+v 0.763937 -7.608454 2.351141
+v 0.386733 -7.901508 1.190225
+v 0.000005 7.901506 1.251482
+v 0.000005 7.608452 2.472142
+v 0.000004 7.128052 3.631929
+v 0.000003 6.472136 4.702286
+v 0.000003 5.656855 5.656859
+v 0.000001 4.702282 6.472140
+v 0.000002 3.631924 7.128057
+v 0.000001 2.472136 7.608456
+v 0.000001 1.251475 7.901510
+v 0.000000 -0.000001 8.000005
+v 0.000001 -1.251477 7.901510
+v 0.000002 -2.472138 7.608455
+v 0.000001 -3.631927 7.128055
+v 0.000002 -4.702285 6.472138
+v 0.000003 -5.656857 5.656855
+v 0.000004 -6.472138 4.702283
+v 0.000004 -7.128055 3.631925
+v 0.000005 -7.608454 2.472136
+v 0.000006 -7.901508 1.251476
+v -0.386724 7.901506 1.190230
+v -0.763929 7.608452 2.351146
+v -1.122324 7.128052 3.454169
+v -1.453083 6.472136 4.472139
+v -1.748063 5.656855 5.379992
+v -2.000000 4.702282 6.155369
+v -2.202688 3.631924 6.779183
+v -2.351142 2.472136 7.236070
+v -2.441700 1.251475 7.514781
+v -2.472137 -0.000001 7.608455
+v -2.441700 -1.251477 7.514781
+v -2.351140 -2.472138 7.236069
+v -2.202689 -3.631927 6.779181
+v -1.999999 -4.702285 6.155367
+v -1.748061 -5.656857 5.379988
+v -1.453082 -6.472138 4.472136
+v -1.122323 -7.128055 3.454165
+v -0.763927 -7.608454 2.351140
+v -0.386722 -7.901508 1.190224
+v -0.735597 7.901506 1.012470
+v -1.453084 7.608452 2.000003
+v -2.134790 7.128052 2.938291
+v -2.763931 6.472136 3.804227
+v -3.325015 5.656855 4.576493
+v -3.804227 4.702282 5.236067
+v -4.189764 3.631924 5.766716
+v -4.472137 2.472136 6.155366
+v -4.644390 1.251475 6.392452
+v -4.702284 -0.000001 6.472136
+v -4.644390 -1.251477 6.392452
+v -4.472136 -2.472138 6.155365
+v -4.189764 -3.631927 5.766714
+v -3.804225 -4.702285 5.236066
+v -3.325012 -5.656857 4.576489
+v -2.763929 -6.472138 3.804224
+v -2.134788 -7.128055 2.938287
+v -1.453080 -7.608454 1.999999
+v -0.735594 -7.901508 1.012465
+v 0.000001 8.000000 0.000004
+v -1.012464 7.901506 0.735602
+v -1.999999 7.608452 1.453087
+v -2.938287 7.128052 2.134792
+v -3.804225 6.472136 2.763931
+v -4.576491 5.656855 3.325015
+v -5.236069 4.702282 3.804223
+v -5.766715 3.631924 4.189762
+v -6.155367 2.472136 4.472132
+v -6.392453 1.251475 4.644385
+v -6.472137 -0.000001 4.702279
+v -6.392453 -1.251477 4.644385
+v -6.155365 -2.472138 4.472132
+v -5.766714 -3.631927 4.189760
+v -5.236066 -4.702285 3.804223
+v -4.576488 -5.656857 3.325012
+v -3.804222 -6.472138 2.763929
+v -2.938284 -7.128055 2.134789
+v -1.999995 -7.608454 1.453083
+v -1.012460 -7.901508 0.735598
+v -1.190224 7.901506 0.386728
+v -2.351140 7.608452 0.763932
+v -3.454164 7.128052 1.122325
+v -4.472135 6.472136 1.453082
+v -5.379988 5.656855 1.748062
+v -6.155366 4.702282 1.999995
+v -6.779179 3.631924 2.202685
+v -7.236067 2.472136 2.351135
+v -7.514778 1.251475 2.441694
+v -7.608452 -0.000001 2.472130
+v -7.514778 -1.251477 2.441694
+v -7.236065 -2.472138 2.351135
+v -6.779178 -3.631927 2.202684
+v -6.155364 -4.702285 1.999995
+v -5.379983 -5.656857 1.748060
+v -4.472131 -6.472138 1.453082
+v -3.454160 -7.128055 1.122324
+v -2.351135 -7.608454 0.763930
+v -1.190218 -7.901508 0.386726
+vt 0.035483 0.289114
+vt 0.042491 0.337738
+vt 0.007397 0.296413
+vt 0.063422 0.533643
+vt 0.068439 0.582662
+vt 0.015908 0.545902
+vt 0.097669 0.776914
+vt 0.111929 0.824070
+vt 0.027296 0.795217
+vt 0.391159 0.929226
+vt 0.461397 0.895775
+vt 0.452242 0.950225
+vt 0.026572 0.240871
+vt 0.004734 0.246573
+vt 0.058567 0.484592
+vt 0.014398 0.495993
+vt 0.087726 0.728878
+vt 0.023823 0.745426
+vt 0.270350 0.936037
+vt 0.231553 0.980467
+vt 0.014254 0.193317
+vt 0.001048 0.196795
+vt 0.053639 0.435556
+vt 0.012882 0.446084
+vt 0.080129 0.680372
+vt 0.021272 0.695580
+vt 0.178869 0.909944
+vt 0.068145 0.942733
+vt 0.048386 0.386583
+vt 0.011281 0.396180
+vt 0.073887 0.631595
+vt 0.019234 0.645702
+vt 0.135028 0.869370
+vt 0.042415 0.894305
+vt 0.009500 0.346287
+vt 0.017489 0.595807
+vt 0.032618 0.844897
+vt 0.484179 0.902186
+vt 0.550590 0.948315
+vt 1.004734 0.246573
+vt 1.007397 0.296413
+vt 0.982704 0.246140
+vt 1.014398 0.495993
+vt 1.015908 0.545902
+vt 0.969883 0.495119
+vt 1.023823 0.745426
+vt 1.027296 0.795217
+vt 0.957447 0.744128
+vt 1.231553 0.980467
+vt 0.750122 0.974207
+vt 1.001048 0.196795
+vt 0.987598 0.196530
+vt 1.012882 0.446084
+vt 0.971892 0.445278
+vt 1.021272 0.695580
+vt 0.960802 0.694395
+vt 1.068145 0.942733
+vt 0.901563 0.939596
+vt 1.011281 0.396180
+vt 0.974014 0.395447
+vt 1.019234 0.645702
+vt 0.963490 0.644610
+vt 1.042415 0.894305
+vt 0.933349 0.892198
+vt 1.009500 0.346287
+vt 0.976377 0.345635
+vt 1.017489 0.595807
+vt 0.965794 0.594793
+vt 1.032618 0.844897
+vt 0.945957 0.843211
+vt 0.979169 0.295858
+vt 0.967884 0.544959
+vt 0.952893 0.793765
+vt 0.960930 0.239587
+vt 0.925822 0.482052
+vt 0.894284 0.725297
+vt 0.716363 0.929856
+vt 0.974473 0.192535
+vt 0.931207 0.433203
+vt 0.902436 0.677050
+vt 0.801451 0.904132
+vt 0.936960 0.384433
+vt 0.909171 0.628493
+vt 0.844888 0.864413
+vt 0.943427 0.335818
+vt 0.915075 0.579756
+vt 0.868695 0.819731
+vt 0.951128 0.287472
+vt 0.920529 0.530922
+vt 0.883697 0.773009
+vt 0.509882 0.901680
+vt 0.603672 0.925341
+vt 0.939868 0.227168
+vt 0.882765 0.457977
+vt 0.837646 0.692981
+vt 0.690972 0.886830
+vt 0.962264 0.185007
+vt 0.891191 0.410771
+vt 0.848554 0.646630
+vt 0.746350 0.860374
+vt 0.900372 0.363822
+vt 0.857974 0.599764
+vt 0.782623 0.823943
+vt 0.910879 0.317332
+vt 0.866529 0.552601
+vt 0.806908 0.782514
+vt 0.923572 0.271605
+vt 0.874667 0.505296
+vt 0.824298 0.738476
+vt 0.531785 0.894399
+vt 0.616896 0.895419
+vt 0.840708 0.424882
+vt 0.787319 0.652419
+vt 0.666434 0.846117
+vt 0.951650 0.174333
+vt 0.851788 0.379552
+vt 0.799275 0.607479
+vt 0.706276 0.816232
+vt 0.864196 0.334814
+vt 0.810089 0.562030
+vt 0.735147 0.779653
+vt 0.878757 0.291055
+vt 0.820304 0.516318
+vt 0.756661 0.739218
+vt 0.896714 0.248885
+vt 0.830369 0.470540
+vt 0.773481 0.696510
+vt 0.545835 0.882162
+vt 0.613251 0.864748
+vt 0.920019 0.209353
+vt 0.601814 0.835743
+vt 0.902011 0.186799
+vt 0.798974 0.385208
+vt 0.741339 0.608286
+vt 0.641659 0.808678
+vt 0.812374 0.341530
+vt 0.753261 0.563866
+vt 0.671741 0.774500
+vt 0.827915 0.298950
+vt 0.764518 0.519117
+vt 0.694750 0.736000
+vt 0.846764 0.258126
+vt 0.775586 0.474273
+vt 0.713019 0.694862
+vt 0.551827 0.867272
+vt 0.551336 0.851697
+vt 0.870653 0.220135
+vt 0.786910 0.429557
+vt 0.728181 0.652086
+vt 0.943465 0.161100
+vt 0.886800 0.160336
+vt 0.756203 0.341667
+vt 0.697515 0.564418
+vt 0.616262 0.775491
+vt 0.771631 0.298973
+vt 0.708699 0.519594
+vt 0.639253 0.736889
+vt 0.790354 0.258010
+vt 0.719689 0.474675
+vt 0.657473 0.695657
+vt 0.814109 0.219846
+vt 0.730930 0.429879
+vt 0.672573 0.652794
+vt 0.546100 0.836912
+vt 0.845356 0.186292
+vt 0.742904 0.385443
+vt 0.685664 0.608914
+vt 0.586129 0.809772
+vt 0.938802 0.146131
+vt 0.876174 0.131001
+vt 0.710309 0.297343
+vt 0.654008 0.524127
+vt 0.590087 0.747535
+vt 0.727302 0.254538
+vt 0.663845 0.478153
+vt 0.607276 0.704820
+vt 0.749262 0.214082
+vt 0.673880 0.432264
+vt 0.621259 0.660654
+vt 0.779077 0.177660
+vt 0.684564 0.386653
+vt 0.643951 0.570007
+vt 0.537514 0.823995
+vt 0.820645 0.148333
+vt 0.696450 0.341564
+vt 0.567816 0.787838
+vt 0.658464 0.256085
+vt 0.609517 0.490486
+vt 0.563122 0.725732
+vt 0.700288 0.169995
+vt 0.617324 0.442954
+vt 0.575103 0.679574
+vt 0.625569 0.395564
+vt 0.633223 0.615598
+vt 0.585045 0.632740
+vt 0.737701 0.133357
+vt 0.634697 0.348462
+vt 0.601779 0.538040
+vt 0.526630 0.813733
+vt 0.796084 0.107238
+vt 0.645335 0.301858
+vt 0.547763 0.770746
+vt 0.939113 0.130553
+vt 0.874144 0.100247
+vt 0.563421 0.466357
+vt 0.535483 0.710885
+vt 0.675759 0.211740
+vt 0.635028 0.130630
+vt 0.568439 0.417338
+vt 0.542491 0.662261
+vt 0.573887 0.368405
+vt 0.593757 0.585502
+vt 0.548386 0.613416
+vt 0.678869 0.090056
+vt 0.580129 0.319628
+vt 0.558567 0.515408
+vt 0.514254 0.806683
+vt 0.770350 0.063964
+vt 0.587726 0.271122
+vt 0.526572 0.759129
+vt 0.946160 0.115905
+vt 0.891158 0.070774
+vt 0.597669 0.223086
+vt 0.611929 0.175930
+vt 0.542415 0.105695
+vt 0.517489 0.404193
+vt 0.509500 0.653713
+vt 0.519234 0.354298
+vt 0.553639 0.564444
+vt 0.511281 0.603820
+vt 0.568145 0.057267
+vt 0.521272 0.304420
+vt 0.514398 0.504007
+vt 0.501048 0.803204
+vt 0.731552 0.019533
+vt 0.523822 0.254574
+vt 0.504734 0.753426
+vt 0.961397 0.104224
+vt 0.952242 0.049775
+vt 0.527296 0.204783
+vt 0.515908 0.454098
+vt 0.507397 0.703586
+vt 0.532618 0.155103
+vt 0.433350 0.107802
+vt 0.465794 0.405207
+vt 0.476377 0.654364
+vt 0.463490 0.355390
+vt 0.512882 0.553916
+vt 0.474014 0.604552
+vt 0.401564 0.060404
+vt 0.460802 0.305605
+vt 0.469884 0.504881
+vt 0.487599 0.803469
+vt 1.250123 0.025793
+vt 0.457447 0.255872
+vt 0.482704 0.753860
+vt 0.984179 0.097813
+vt 1.050589 0.051685
+vt 0.452893 0.206235
+vt 0.467885 0.455040
+vt 0.479169 0.704142
+vt 0.445957 0.156790
+vt 0.344888 0.135587
+vt 0.415075 0.420244
+vt 0.443428 0.664182
+vt 0.409171 0.371507
+vt 0.471892 0.554721
+vt 0.436960 0.615567
+vt 0.250123 0.025793
+vt 0.301452 0.095868
+vt 0.402437 0.322950
+vt 0.425822 0.517948
+vt 0.474473 0.807464
+vt 0.050589 0.051685
+vt 0.216363 0.070144
+vt 0.394284 0.274702
+vt 0.460930 0.760413
+vt 0.009882 0.098319
+vt 0.103671 0.074658
+vt 0.383698 0.226991
+vt 0.420529 0.469078
+vt 0.451128 0.712528
+vt 0.366529 0.447399
+vt 0.410880 0.682668
+vt 0.282623 0.176056
+vt 0.357975 0.400236
+vt 0.431207 0.566797
+vt 0.400372 0.636177
+vt 0.246351 0.139626
+vt 0.348554 0.353370
+vt 0.382765 0.542022
+vt 0.462264 0.814992
+vt 0.190972 0.113170
+vt 0.337646 0.307019
+vt 0.439868 0.772831
+vt 0.031785 0.105600
+vt 0.116896 0.104580
+vt 0.368695 0.180269
+vt 0.324298 0.261524
+vt 0.374667 0.494704
+vt 0.423573 0.728394
+vt 0.306908 0.217486
+vt 0.378757 0.708945
+vt 0.235147 0.220346
+vt 0.310089 0.437969
+vt 0.391191 0.589229
+vt 0.364196 0.665186
+vt 0.206276 0.183767
+vt 0.299275 0.392521
+vt 0.340709 0.575117
+vt 0.451650 0.825666
+vt 0.166434 0.153882
+vt 0.287319 0.347580
+vt 0.420019 0.790647
+vt 0.045835 0.117837
+vt 0.113250 0.135252
+vt 0.273481 0.303490
+vt 0.330370 0.529459
+vt 0.396715 0.751114
+vt 0.256661 0.260781
+vt 0.320304 0.483681
+vt 0.171741 0.225499
+vt 0.253261 0.436134
+vt 0.351788 0.620448
+vt 0.312374 0.658470
+vt 0.141659 0.191322
+vt 0.241339 0.391714
+vt 0.402011 0.813201
+vt 0.101814 0.164257
+vt 0.228181 0.347914
+vt 0.286910 0.570443
+vt 0.370653 0.779864
+vt 0.051826 0.132727
+vt 0.051336 0.148303
+vt 0.213019 0.305137
+vt 0.275586 0.525726
+vt 0.346765 0.741874
+vt 0.194750 0.264000
+vt 0.264518 0.480883
+vt 0.327915 0.701050
+vt 0.139253 0.263111
+vt 0.208699 0.480406
+vt 0.271631 0.701027
+vt 0.116262 0.224508
+vt 0.197515 0.435582
+vt 0.298975 0.614792
+vt 0.443465 0.838899
+vt 0.386800 0.839664
+vt 0.086129 0.190228
+vt 0.185664 0.391086
+vt 0.242904 0.614557
+vt 0.345357 0.813708
+vt 0.046099 0.163088
+vt 0.172573 0.347205
+vt 0.230930 0.570121
+vt 0.314109 0.780154
+vt 0.157473 0.304343
+vt 0.219689 0.525325
+vt 0.290354 0.741990
+vt 0.107276 0.295180
+vt 0.163845 0.521847
+vt 0.227302 0.745462
+vt 0.090087 0.252465
+vt 0.154008 0.475873
+vt 0.256203 0.658333
+vt 0.438803 0.853868
+vt 0.376175 0.868999
+vt 0.067816 0.212161
+vt 0.143951 0.429993
+vt 0.196450 0.658436
+vt 0.320646 0.851667
+vt 0.037514 0.176004
+vt 0.133223 0.384401
+vt 0.184564 0.613347
+vt 0.279077 0.822340
+vt 0.121259 0.339345
+vt 0.173881 0.567736
+vt 0.249262 0.785918
+vt 0.175759 0.788260
+vt 0.063122 0.274267
+vt 0.109517 0.509514
+vt 0.210309 0.702657
+vt 0.439113 0.869447
+vt 0.374144 0.899752
+vt 0.047763 0.229253
+vt 0.101779 0.461959
+vt 0.145335 0.698142
+vt 0.296085 0.892762
+vt 0.026630 0.186267
+vt 0.093757 0.414497
+vt 0.134697 0.651538
+vt 0.237701 0.866643
+vt 0.085045 0.367260
+vt 0.125569 0.604436
+vt 0.200288 0.830006
+vt 0.075103 0.320425
+vt 0.117324 0.557046
+vt 0.995265 0.147143
+vt 1.014254 0.193317
+vt 0.495265 0.852856
+vt 1.009882 0.098319
+vt 1.031785 0.105600
+vt 1.045835 0.117837
+vt 1.051826 0.132727
+vt 1.051336 0.148303
+vt 1.046099 0.163088
+vt 1.037514 0.176004
+vt 0.446160 0.884095
+vt 1.026630 0.186267
+vt 0.158464 0.743915
+vn -0.460158 -0.887814 0.000000
+vn -0.592853 -0.805292 0.000000
+vn -0.437635 -0.887814 -0.142186
+vn -0.951781 -0.306742 0.000000
+vn -0.987854 -0.155217 0.000000
+vn -0.905179 -0.306742 -0.294107
+vn -0.892575 0.450850 0.000000
+vn -0.811670 0.584063 0.000000
+vn -0.848903 0.450850 -0.275826
+vn -0.316050 0.948729 0.000000
+vn -0.164068 0.986419 0.000000
+vn -0.300577 0.948729 -0.097659
+vn -0.316050 -0.948729 0.000000
+vn -0.300577 -0.948729 -0.097659
+vn -0.892575 -0.450850 0.000000
+vn -0.848903 -0.450850 -0.275826
+vn -0.951781 0.306742 0.000000
+vn -0.905179 0.306742 -0.294107
+vn -0.460158 0.887814 0.000000
+vn -0.437635 0.887814 -0.142186
+vn -0.164068 -0.986419 0.000000
+vn -0.156011 -0.986419 -0.050691
+vn -0.811670 -0.584063 0.000000
+vn -0.771935 -0.584063 -0.250801
+vn -0.987854 0.155217 0.000000
+vn -0.939512 0.155217 -0.305246
+vn -0.592853 0.805292 0.000000
+vn -0.563829 0.805292 -0.183203
+vn -0.710959 -0.703207 0.000000
+vn -0.676168 -0.703207 -0.219703
+vn -1.000000 0.000000 0.000000
+vn -0.951048 0.000000 -0.309000
+vn -0.710959 0.703207 0.000000
+vn -0.676168 0.703207 -0.219703
+vn -0.563829 -0.805292 -0.183203
+vn -0.939512 -0.155217 -0.305246
+vn -0.771935 0.584063 -0.250801
+vn -0.156011 0.986419 -0.050691
+vn -0.255684 0.948729 -0.185766
+vn -0.255684 -0.948729 -0.185766
+vn -0.722098 -0.450850 -0.524644
+vn -0.770012 0.306742 -0.559435
+vn -0.372265 0.887814 -0.270455
+vn -0.132725 -0.986419 -0.096408
+vn -0.656667 -0.584063 -0.477096
+vn -0.799188 0.155217 -0.580645
+vn -0.479629 0.805292 -0.348460
+vn -0.575182 -0.703207 -0.417890
+vn -0.809015 0.000000 -0.587756
+vn -0.575182 0.703207 -0.417890
+vn -0.479629 -0.805292 -0.348460
+vn -0.799188 -0.155217 -0.580645
+vn -0.656667 0.584063 -0.477096
+vn -0.372265 -0.887814 -0.270455
+vn -0.770012 -0.306742 -0.559435
+vn -0.722098 0.450850 -0.524644
+vn -0.185766 -0.948729 -0.255684
+vn -0.524644 -0.450850 -0.722098
+vn -0.559435 0.306742 -0.770012
+vn -0.270455 0.887814 -0.372265
+vn -0.096408 -0.986419 -0.132725
+vn -0.477096 -0.584063 -0.656667
+vn -0.580645 0.155217 -0.799188
+vn -0.348460 0.805292 -0.479629
+vn -0.417890 -0.703207 -0.575182
+vn -0.587756 0.000000 -0.809015
+vn -0.417890 0.703207 -0.575182
+vn -0.348460 -0.805292 -0.479629
+vn -0.580645 -0.155217 -0.799188
+vn -0.477096 0.584063 -0.656667
+vn -0.270455 -0.887814 -0.372265
+vn -0.559435 -0.306742 -0.770012
+vn -0.524644 0.450850 -0.722098
+vn -0.132725 0.986419 -0.096408
+vn -0.185766 0.948729 -0.255684
+vn -0.097659 -0.948729 -0.300577
+vn -0.275826 -0.450850 -0.848903
+vn -0.294107 0.306742 -0.905179
+vn -0.142186 0.887814 -0.437635
+vn -0.050691 -0.986419 -0.156011
+vn -0.250801 -0.584063 -0.771935
+vn -0.305246 0.155217 -0.939512
+vn -0.183203 0.805292 -0.563829
+vn -0.219703 -0.703207 -0.676168
+vn -0.309000 0.000000 -0.951048
+vn -0.219703 0.703207 -0.676168
+vn -0.183203 -0.805292 -0.563829
+vn -0.305246 -0.155217 -0.939512
+vn -0.250801 0.584063 -0.771935
+vn -0.142186 -0.887814 -0.437635
+vn -0.294107 -0.306742 -0.905179
+vn -0.275826 0.450850 -0.848903
+vn -0.096408 0.986419 -0.132725
+vn -0.097659 0.948729 -0.300577
+vn 0.000000 -0.450850 -0.892575
+vn 0.000000 0.306742 -0.951781
+vn 0.000000 0.887814 -0.460158
+vn 0.000000 -0.986419 -0.164068
+vn 0.000000 -0.584063 -0.811670
+vn 0.000000 0.155217 -0.987854
+vn 0.000000 0.805292 -0.592853
+vn 0.000000 -0.703207 -0.710959
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.703207 -0.710959
+vn 0.000000 -0.805292 -0.592853
+vn 0.000000 -0.155217 -0.987854
+vn 0.000000 0.584063 -0.811670
+vn 0.000000 -0.887814 -0.460158
+vn 0.000000 -0.306742 -0.951781
+vn 0.000000 0.450850 -0.892575
+vn -0.050691 0.986419 -0.156011
+vn 0.000000 0.948729 -0.316050
+vn 0.000000 -0.948729 -0.316050
+vn 0.097659 0.948729 -0.300577
+vn 0.097659 -0.948729 -0.300577
+vn 0.275826 -0.450850 -0.848903
+vn 0.294107 0.306742 -0.905179
+vn 0.142186 0.887814 -0.437635
+vn 0.250801 -0.584063 -0.771935
+vn 0.305246 0.155217 -0.939512
+vn 0.183203 0.805292 -0.563829
+vn 0.219703 -0.703207 -0.676168
+vn 0.309000 0.000000 -0.951048
+vn 0.219703 0.703207 -0.676168
+vn 0.183203 -0.805292 -0.563829
+vn 0.305246 -0.155217 -0.939512
+vn 0.250801 0.584063 -0.771935
+vn 0.000000 0.986419 -0.164068
+vn 0.050691 0.986419 -0.156011
+vn 0.142186 -0.887814 -0.437635
+vn 0.294107 -0.306742 -0.905179
+vn 0.275826 0.450850 -0.848903
+vn 0.050691 -0.986419 -0.156011
+vn 0.185766 -0.948729 -0.255684
+vn 0.524644 -0.450850 -0.722098
+vn 0.559435 0.306742 -0.770012
+vn 0.270455 0.887814 -0.372265
+vn 0.477096 -0.584063 -0.656667
+vn 0.580645 0.155217 -0.799188
+vn 0.348460 0.805292 -0.479629
+vn 0.417890 -0.703207 -0.575182
+vn 0.587756 0.000000 -0.809015
+vn 0.417890 0.703207 -0.575182
+vn 0.348460 -0.805292 -0.479629
+vn 0.580645 -0.155217 -0.799188
+vn 0.477096 0.584063 -0.656667
+vn 0.096408 0.986419 -0.132725
+vn 0.270455 -0.887814 -0.372265
+vn 0.559435 -0.306742 -0.770012
+vn 0.524644 0.450850 -0.722098
+vn 0.185766 0.948729 -0.255684
+vn 0.096408 -0.986419 -0.132725
+vn 0.255684 -0.948729 -0.185766
+vn 0.722098 -0.450850 -0.524644
+vn 0.770012 0.306742 -0.559435
+vn 0.372265 0.887814 -0.270455
+vn 0.656667 -0.584063 -0.477096
+vn 0.799188 0.155217 -0.580645
+vn 0.479629 0.805292 -0.348460
+vn 0.575182 -0.703207 -0.417890
+vn 0.809015 0.000000 -0.587756
+vn 0.575182 0.703207 -0.417890
+vn 0.479629 -0.805292 -0.348460
+vn 0.799188 -0.155217 -0.580645
+vn 0.722098 0.450850 -0.524644
+vn 0.132725 0.986419 -0.096408
+vn 0.372265 -0.887814 -0.270455
+vn 0.770012 -0.306742 -0.559435
+vn 0.255684 0.948729 -0.185766
+vn 0.848903 -0.450850 -0.275826
+vn 0.905179 0.306742 -0.294107
+vn 0.437635 0.887814 -0.142186
+vn 0.676168 -0.703207 -0.219703
+vn 0.939512 0.155217 -0.305246
+vn 0.563829 0.805292 -0.183203
+vn 0.951048 0.000000 -0.309000
+vn 0.656667 0.584063 -0.477096
+vn 0.676168 0.703207 -0.219703
+vn 0.563829 -0.805292 -0.183203
+vn 0.939512 -0.155217 -0.305246
+vn 0.848903 0.450850 -0.275826
+vn 0.156011 0.986419 -0.050691
+vn 0.437635 -0.887814 -0.142186
+vn 0.905179 -0.306742 -0.294107
+vn 0.300577 0.948729 -0.097659
+vn 0.132725 -0.986419 -0.096408
+vn 0.300577 -0.948729 -0.097659
+vn 0.951781 0.306742 0.000000
+vn 0.460158 0.887814 0.000000
+vn 0.771935 -0.584063 -0.250801
+vn 0.710959 -0.703207 0.000000
+vn 0.987854 0.155217 0.000000
+vn 0.592853 0.805292 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.771935 0.584063 -0.250801
+vn 0.710959 0.703207 0.000000
+vn 0.592853 -0.805292 0.000000
+vn 0.987854 -0.155217 0.000000
+vn 0.892575 0.450850 0.000000
+vn 0.164068 0.986419 0.000000
+vn 0.460158 -0.887814 0.000000
+vn 0.951781 -0.306742 0.000000
+vn 0.316050 0.948729 0.000000
+vn 0.156011 -0.986419 -0.050691
+vn 0.316050 -0.948729 0.000000
+vn 0.892575 -0.450850 0.000000
+vn 0.811670 -0.584063 0.000000
+vn 0.676168 -0.703207 0.219703
+vn 0.939512 0.155217 0.305246
+vn 0.563829 0.805292 0.183203
+vn 0.951048 0.000000 0.309000
+vn 0.811670 0.584063 0.000000
+vn 0.676168 0.703207 0.219703
+vn 0.563829 -0.805292 0.183203
+vn 0.939512 -0.155217 0.305246
+vn 0.848903 0.450850 0.275826
+vn 0.156011 0.986419 0.050691
+vn 0.437635 -0.887814 0.142186
+vn 0.905179 -0.306742 0.294107
+vn 0.300577 0.948729 0.097659
+vn 0.164068 -0.986419 0.000000
+vn 0.300577 -0.948729 0.097659
+vn 0.848903 -0.450850 0.275826
+vn 0.905179 0.306742 0.294107
+vn 0.437635 0.887814 0.142186
+vn 0.771935 -0.584063 0.250801
+vn 0.575182 -0.703207 0.417890
+vn 0.799188 0.155217 0.580645
+vn 0.479629 0.805292 0.348460
+vn 0.809015 0.000000 0.587756
+vn 0.771935 0.584063 0.250801
+vn 0.575182 0.703207 0.417890
+vn 0.479629 -0.805292 0.348460
+vn 0.799188 -0.155217 0.580645
+vn 0.722098 0.450850 0.524644
+vn 0.132725 0.986419 0.096408
+vn 0.372265 -0.887814 0.270455
+vn 0.770012 -0.306742 0.559435
+vn 0.255684 0.948729 0.185766
+vn 0.156011 -0.986419 0.050691
+vn 0.255684 -0.948729 0.185766
+vn 0.722098 -0.450850 0.524644
+vn 0.770012 0.306742 0.559435
+vn 0.372265 0.887814 0.270455
+vn 0.656667 -0.584063 0.477096
+vn 0.417890 -0.703207 0.575182
+vn 0.580645 0.155217 0.799188
+vn 0.348460 0.805292 0.479629
+vn 0.587756 0.000000 0.809015
+vn 0.656667 0.584063 0.477096
+vn 0.417890 0.703207 0.575182
+vn 0.348460 -0.805292 0.479629
+vn 0.580645 -0.155217 0.799188
+vn 0.524644 0.450850 0.722098
+vn 0.096408 0.986419 0.132725
+vn 0.270455 -0.887814 0.372265
+vn 0.559435 -0.306742 0.770012
+vn 0.185766 0.948729 0.255684
+vn 0.132725 -0.986419 0.096408
+vn 0.185766 -0.948729 0.255684
+vn 0.524644 -0.450850 0.722098
+vn 0.559435 0.306742 0.770012
+vn 0.270455 0.887814 0.372265
+vn 0.305246 0.155217 0.939512
+vn 0.183203 0.805292 0.563829
+vn 0.219703 -0.703207 0.676168
+vn 0.309000 0.000000 0.951048
+vn 0.477096 0.584063 0.656667
+vn 0.219703 0.703207 0.676168
+vn 0.183203 -0.805292 0.563829
+vn 0.305246 -0.155217 0.939512
+vn 0.275826 0.450850 0.848903
+vn 0.050691 0.986419 0.156011
+vn 0.142186 -0.887814 0.437635
+vn 0.294107 -0.306742 0.905179
+vn 0.097659 0.948729 0.300577
+vn 0.096408 -0.986419 0.132725
+vn 0.097659 -0.948729 0.300577
+vn 0.477096 -0.584063 0.656667
+vn 0.275826 -0.450850 0.848903
+vn 0.294107 0.306742 0.905179
+vn 0.142186 0.887814 0.437635
+vn 0.250801 -0.584063 0.771935
+vn 0.000000 0.805292 0.592853
+vn 0.000000 -0.703207 0.710959
+vn 0.000000 0.000000 1.000000
+vn 0.250801 0.584063 0.771935
+vn 0.000000 0.703207 0.710959
+vn 0.000000 -0.805292 0.592853
+vn 0.000000 -0.155217 0.987854
+vn 0.000000 0.450850 0.892575
+vn 0.000000 0.986419 0.164068
+vn 0.000000 -0.887814 0.460158
+vn 0.000000 -0.306742 0.951781
+vn 0.000000 0.948729 0.316050
+vn 0.050691 -0.986419 0.156011
+vn 0.000000 -0.948729 0.316050
+vn 0.000000 -0.450850 0.892575
+vn 0.000000 0.306742 0.951781
+vn 0.000000 0.887814 0.460158
+vn 0.000000 -0.584063 0.811670
+vn 0.000000 0.155217 0.987854
+vn -0.183203 -0.805292 0.563829
+vn -0.305246 -0.155217 0.939512
+vn 0.000000 0.584063 0.811670
+vn -0.250801 0.584063 0.771935
+vn -0.142186 -0.887814 0.437635
+vn -0.294107 -0.306742 0.905179
+vn -0.097659 0.948729 0.300577
+vn -0.097659 -0.948729 0.300577
+vn -0.275826 -0.450850 0.848903
+vn -0.294107 0.306742 0.905179
+vn -0.142186 0.887814 0.437635
+vn 0.000000 -0.986419 0.164068
+vn -0.050691 -0.986419 0.156011
+vn -0.250801 -0.584063 0.771935
+vn -0.305246 0.155217 0.939512
+vn -0.183203 0.805292 0.563829
+vn -0.219703 -0.703207 0.676168
+vn -0.309000 0.000000 0.951048
+vn -0.219703 0.703207 0.676168
+vn -0.348460 -0.805292 0.479629
+vn -0.580645 -0.155217 0.799188
+vn -0.477096 0.584063 0.656667
+vn -0.270455 -0.887814 0.372265
+vn -0.559435 -0.306742 0.770012
+vn -0.275826 0.450850 0.848903
+vn -0.050691 0.986419 0.156011
+vn -0.185766 0.948729 0.255684
+vn -0.185766 -0.948729 0.255684
+vn -0.524644 -0.450850 0.722098
+vn -0.559435 0.306742 0.770012
+vn -0.270455 0.887814 0.372265
+vn -0.096408 -0.986419 0.132725
+vn -0.477096 -0.584063 0.656667
+vn -0.580645 0.155217 0.799188
+vn -0.348460 0.805292 0.479629
+vn -0.417890 -0.703207 0.575182
+vn -0.587756 0.000000 0.809015
+vn -0.417890 0.703207 0.575182
+vn -0.479629 -0.805292 0.348460
+vn -0.799188 -0.155217 0.580645
+vn -0.656667 0.584063 0.477096
+vn -0.372265 -0.887814 0.270455
+vn -0.770012 -0.306742 0.559435
+vn -0.524644 0.450850 0.722098
+vn -0.096408 0.986419 0.132725
+vn -0.255684 0.948729 0.185766
+vn -0.255684 -0.948729 0.185766
+vn -0.722098 -0.450850 0.524644
+vn -0.770012 0.306742 0.559435
+vn -0.372265 0.887814 0.270455
+vn -0.132725 -0.986419 0.096408
+vn -0.656667 -0.584063 0.477096
+vn -0.799188 0.155217 0.580645
+vn -0.479629 0.805292 0.348460
+vn -0.575182 -0.703207 0.417890
+vn -0.809015 0.000000 0.587756
+vn -0.575182 0.703207 0.417890
+vn -0.771935 0.584063 0.250801
+vn -0.437635 -0.887814 0.142186
+vn -0.905179 -0.306742 0.294107
+vn -0.722098 0.450850 0.524644
+vn -0.132725 0.986419 0.096408
+vn -0.300577 0.948729 0.097659
+vn -0.300577 -0.948729 0.097659
+vn -0.848903 -0.450850 0.275826
+vn -0.905179 0.306742 0.294107
+vn -0.437635 0.887814 0.142186
+vn -0.156011 -0.986419 0.050691
+vn -0.771935 -0.584063 0.250801
+vn -0.939512 0.155217 0.305246
+vn -0.563829 0.805292 0.183203
+vn -0.676168 -0.703207 0.219703
+vn -0.951048 0.000000 0.309000
+vn -0.676168 0.703207 0.219703
+vn -0.563829 -0.805292 0.183203
+vn -0.939512 -0.155217 0.305246
+vn 0.000000 -0.999969 0.000000
+vn 0.000000 1.000000 0.000000
+vn -0.156011 0.986419 0.050691
+vn -0.848903 0.450850 0.275826
+s 1
+f 17/1/1 16/2/2 36/3/3
+f 12/4/4 11/5/5 31/6/6
+f 7/7/7 6/8/8 26/9/9
+f 2/10/10 1/11/11 21/12/12
+f 18/13/13 17/1/1 37/14/14
+f 13/15/15 12/4/4 32/16/16
+f 8/17/17 7/7/7 27/18/18
+f 3/19/19 2/10/10 22/20/20
+f 19/21/21 18/13/13 38/22/22
+f 14/23/23 13/15/15 33/24/24
+f 9/25/25 8/17/17 28/26/26
+f 4/27/27 3/19/19 23/28/28
+f 15/29/29 14/23/23 34/30/30
+f 10/31/31 9/25/25 29/32/32
+f 5/33/33 4/27/27 24/34/34
+f 16/2/2 15/29/29 35/35/35
+f 11/5/5 10/31/31 30/36/36
+f 6/8/8 5/33/33 25/37/37
+f 21/12/12 20/38/38 41/39/39
+f 37/40/14 36/41/3 57/42/40
+f 32/43/16 31/44/6 52/45/41
+f 27/46/18 26/47/9 47/48/42
+f 22/49/20 21/12/12 42/50/43
+f 38/51/22 37/40/14 58/52/44
+f 33/53/24 32/43/16 53/54/45
+f 28/55/26 27/46/18 48/56/46
+f 23/57/28 22/49/20 43/58/47
+f 34/59/30 33/53/24 54/60/48
+f 29/61/32 28/55/26 49/62/49
+f 24/63/34 23/57/28 44/64/50
+f 35/65/35 34/59/30 55/66/51
+f 30/67/36 29/61/32 50/68/52
+f 25/69/37 24/63/34 45/70/53
+f 36/41/3 35/65/35 56/71/54
+f 31/44/6 30/67/36 51/72/55
+f 26/47/9 25/69/37 46/73/56
+f 57/42/40 56/71/54 76/74/57
+f 52/45/41 51/72/55 71/75/58
+f 47/48/42 46/73/56 66/76/59
+f 42/50/43 41/39/39 61/77/60
+f 58/52/44 57/42/40 77/78/61
+f 53/54/45 52/45/41 72/79/62
+f 48/56/46 47/48/42 67/80/63
+f 43/58/47 42/50/43 62/81/64
+f 54/60/48 53/54/45 73/82/65
+f 49/62/49 48/56/46 68/83/66
+f 44/64/50 43/58/47 63/84/67
+f 55/66/51 54/60/48 74/85/68
+f 50/68/52 49/62/49 69/86/69
+f 45/70/53 44/64/50 64/87/70
+f 56/71/54 55/66/51 75/88/71
+f 51/72/55 50/68/52 70/89/72
+f 46/73/56 45/70/53 65/90/73
+f 41/39/39 40/91/74 60/92/75
+f 76/74/57 75/88/71 95/93/76
+f 71/75/58 70/89/72 90/94/77
+f 66/76/59 65/90/73 85/95/78
+f 61/77/60 60/92/75 80/96/79
+f 77/78/61 76/74/57 96/97/80
+f 72/79/62 71/75/58 91/98/81
+f 67/80/63 66/76/59 86/99/82
+f 62/81/64 61/77/60 81/100/83
+f 73/82/65 72/79/62 92/101/84
+f 68/83/66 67/80/63 87/102/85
+f 63/84/67 62/81/64 82/103/86
+f 74/85/68 73/82/65 93/104/87
+f 69/86/69 68/83/66 88/105/88
+f 64/87/70 63/84/67 83/106/89
+f 75/88/71 74/85/68 94/107/90
+f 70/89/72 69/86/69 89/108/91
+f 65/90/73 64/87/70 84/109/92
+f 60/92/75 59/110/93 79/111/94
+f 90/94/77 89/108/91 109/112/95
+f 85/95/78 84/109/92 104/113/96
+f 80/96/79 79/111/94 99/114/97
+f 96/97/80 95/93/76 115/115/98
+f 91/98/81 90/94/77 110/116/99
+f 86/99/82 85/95/78 105/117/100
+f 81/100/83 80/96/79 100/118/101
+f 92/101/84 91/98/81 111/119/102
+f 87/102/85 86/99/82 106/120/103
+f 82/103/86 81/100/83 101/121/104
+f 93/104/87 92/101/84 112/122/105
+f 88/105/88 87/102/85 107/123/106
+f 83/106/89 82/103/86 102/124/107
+f 94/107/90 93/104/87 113/125/108
+f 89/108/91 88/105/88 108/126/109
+f 84/109/92 83/106/89 103/127/110
+f 79/111/94 78/128/111 98/129/112
+f 95/93/76 94/107/90 114/130/113
+f 99/114/97 98/129/112 117/131/114
+f 115/115/98 114/130/113 133/132/115
+f 110/116/99 109/112/95 128/133/116
+f 105/117/100 104/113/96 123/134/117
+f 100/118/101 99/114/97 118/135/118
+f 111/119/102 110/116/99 129/136/119
+f 106/120/103 105/117/100 124/137/120
+f 101/121/104 100/118/101 119/138/121
+f 112/122/105 111/119/102 130/139/122
+f 107/123/106 106/120/103 125/140/123
+f 102/124/107 101/121/104 120/141/124
+f 113/125/108 112/122/105 131/142/125
+f 108/126/109 107/123/106 126/143/126
+f 103/127/110 102/124/107 121/144/127
+f 98/129/112 97/145/128 116/146/129
+f 114/130/113 113/125/108 132/147/130
+f 109/112/95 108/126/109 127/148/131
+f 104/113/96 103/127/110 122/149/132
+f 134/150/133 133/132/115 152/151/134
+f 129/136/119 128/133/116 147/152/135
+f 124/137/120 123/134/117 142/153/136
+f 119/138/121 118/135/118 137/154/137
+f 130/139/122 129/136/119 148/155/138
+f 125/140/123 124/137/120 143/156/139
+f 120/141/124 119/138/121 138/157/140
+f 131/142/125 130/139/122 149/158/141
+f 126/143/126 125/140/123 144/159/142
+f 121/144/127 120/141/124 139/160/143
+f 132/147/130 131/142/125 150/161/144
+f 127/148/131 126/143/126 145/162/145
+f 122/149/132 121/144/127 140/163/146
+f 117/131/114 116/146/129 135/164/147
+f 133/132/115 132/147/130 151/165/148
+f 128/133/116 127/148/131 146/166/149
+f 123/134/117 122/149/132 141/167/150
+f 118/135/118 117/131/114 136/168/151
+f 153/169/152 152/151/134 171/170/153
+f 148/155/138 147/152/135 166/171/154
+f 143/156/139 142/153/136 161/172/155
+f 138/157/140 137/154/137 156/173/156
+f 149/158/141 148/155/138 167/174/157
+f 144/159/142 143/156/139 162/175/158
+f 139/160/143 138/157/140 157/176/159
+f 150/161/144 149/158/141 168/177/160
+f 145/162/145 144/159/142 163/178/161
+f 140/163/146 139/160/143 158/179/162
+f 151/165/148 150/161/144 169/180/163
+f 146/166/149 145/162/145 164/181/164
+f 141/167/150 140/163/146 160/182/165
+f 136/168/151 135/164/147 154/183/166
+f 152/151/134 151/165/148 170/184/167
+f 147/152/135 146/166/149 165/185/168
+f 142/153/136 141/167/150 160/182/165
+f 137/154/137 136/168/151 155/186/169
+f 167/174/157 166/171/154 185/187/170
+f 162/175/158 161/172/155 180/188/171
+f 157/176/159 156/173/156 175/189/172
+f 168/177/160 167/174/157 187/190/173
+f 163/178/161 162/175/158 181/191/174
+f 158/179/162 157/176/159 176/192/175
+f 169/180/163 168/177/160 187/190/173
+f 164/181/164 163/178/161 182/193/176
+f 159/194/177 158/179/162 177/195/178
+f 170/184/167 169/180/163 188/196/179
+f 165/185/168 164/181/164 183/197/180
+f 160/182/165 159/194/177 179/198/181
+f 155/186/169 154/183/166 173/199/182
+f 171/170/153 170/184/167 189/200/183
+f 166/171/154 165/185/168 184/201/184
+f 161/172/155 160/182/165 179/198/181
+f 156/173/156 155/186/169 174/202/185
+f 172/203/186 171/170/153 190/204/187
+f 181/191/174 180/188/171 199/205/188
+f 176/192/175 175/189/172 194/206/189
+f 187/190/173 186/207/190 206/208/191
+f 182/193/176 181/191/174 200/209/192
+f 177/195/178 176/192/175 195/210/193
+f 188/196/179 187/190/173 206/208/191
+f 183/197/180 182/193/176 201/211/194
+f 178/212/195 177/195/178 196/213/196
+f 189/200/183 188/196/179 207/214/197
+f 184/201/184 183/197/180 202/215/198
+f 179/198/181 178/212/195 198/216/199
+f 174/202/185 173/199/182 192/217/200
+f 190/204/187 189/200/183 208/218/201
+f 185/187/170 184/201/184 203/219/202
+f 180/188/171 179/198/181 198/216/199
+f 175/189/172 174/202/185 193/220/203
+f 191/221/204 190/204/187 209/222/205
+f 186/207/190 185/187/170 204/223/206
+f 206/208/191 205/224/207 225/225/208
+f 201/211/194 200/209/192 219/226/209
+f 196/213/196 195/210/193 214/227/210
+f 207/214/197 206/208/191 225/225/208
+f 202/215/198 201/211/194 220/228/211
+f 197/229/212 196/213/196 215/230/213
+f 208/218/201 207/214/197 226/231/214
+f 203/219/202 202/215/198 221/232/215
+f 198/216/199 197/229/212 217/233/216
+f 193/220/203 192/217/200 211/234/217
+f 209/222/205 208/218/201 227/235/218
+f 204/223/206 203/219/202 222/236/219
+f 199/205/188 198/216/199 217/233/216
+f 194/206/189 193/220/203 212/237/220
+f 210/238/221 209/222/205 228/239/222
+f 205/224/207 204/223/206 223/240/223
+f 200/209/192 199/205/188 218/241/224
+f 195/210/193 194/206/189 213/242/225
+f 225/225/208 224/243/226 244/244/227
+f 220/228/211 219/226/209 238/245/228
+f 215/230/213 214/227/210 233/246/229
+f 226/231/214 225/225/208 244/244/227
+f 221/232/215 220/228/211 239/247/230
+f 216/248/231 215/230/213 234/249/232
+f 227/235/218 226/231/214 245/250/233
+f 222/236/219 221/232/215 240/251/234
+f 217/233/216 216/248/231 236/252/235
+f 212/237/220 211/234/217 230/253/236
+f 228/239/222 227/235/218 246/254/237
+f 223/240/223 222/236/219 241/255/238
+f 218/241/224 217/233/216 236/252/235
+f 213/242/225 212/237/220 231/256/239
+f 229/257/240 228/239/222 247/258/241
+f 224/243/226 223/240/223 242/259/242
+f 219/226/209 218/241/224 237/260/243
+f 214/227/210 213/242/225 232/261/244
+f 244/244/227 243/262/245 263/263/246
+f 239/247/230 238/245/228 257/264/247
+f 234/249/232 233/246/229 252/265/248
+f 245/250/233 244/244/227 263/263/246
+f 240/251/234 239/247/230 258/266/249
+f 235/267/250 234/249/232 253/268/251
+f 246/269/237 245/250/233 264/270/252
+f 241/255/238 240/251/234 259/271/253
+f 236/252/235 235/267/250 255/272/254
+f 231/256/239 230/253/236 249/273/255
+f 247/274/241 246/269/237 265/275/256
+f 242/259/242 241/255/238 260/276/257
+f 237/260/243 236/252/235 255/272/254
+f 232/261/244 231/256/239 250/277/258
+f 248/278/259 247/274/241 266/279/260
+f 243/262/245 242/259/242 261/280/261
+f 238/245/228 237/260/243 256/281/262
+f 233/246/229 232/261/244 251/282/263
+f 258/266/249 257/264/247 276/283/264
+f 253/268/251 252/265/248 271/284/265
+f 264/270/252 263/263/246 282/285/266
+f 259/271/253 258/266/249 277/286/267
+f 254/287/268 253/268/251 272/288/269
+f 265/275/256 264/270/252 283/289/270
+f 260/276/257 259/271/253 278/290/271
+f 255/272/254 254/287/268 274/291/272
+f 250/277/258 249/273/255 268/292/273
+f 266/279/260 265/275/256 284/293/274
+f 261/280/261 260/276/257 279/294/275
+f 256/281/262 255/272/254 274/291/272
+f 251/282/263 250/277/258 269/295/276
+f 267/296/277 266/279/260 285/297/278
+f 262/298/279 261/280/261 280/299/280
+f 257/264/247 256/281/262 275/300/281
+f 252/265/248 251/282/263 270/301/282
+f 263/263/246 262/298/279 281/302/283
+f 272/288/269 271/284/265 290/303/284
+f 283/289/270 282/285/266 301/304/285
+f 278/290/271 277/286/267 296/305/286
+f 273/306/287 272/288/269 291/307/288
+f 284/293/274 283/289/270 302/308/289
+f 279/294/275 278/290/271 297/309/290
+f 274/291/272 273/306/287 293/310/291
+f 269/295/276 268/292/273 287/311/292
+f 285/297/278 284/293/274 303/312/293
+f 280/299/280 279/294/275 298/313/294
+f 275/300/281 274/291/272 293/310/291
+f 270/301/282 269/295/276 288/314/295
+f 286/315/296 285/297/278 304/316/297
+f 281/302/283 280/299/280 299/317/298
+f 276/283/264 275/300/281 294/318/299
+f 271/284/265 270/301/282 289/319/300
+f 282/285/266 281/302/283 300/320/301
+f 277/286/267 276/283/264 295/321/302
+f 302/308/289 301/304/285 321/322/303
+f 297/309/290 296/305/286 316/323/304
+f 292/324/305 291/307/288 311/325/306
+f 303/312/293 302/308/289 322/326/307
+f 298/313/294 297/309/290 317/327/308
+f 293/310/291 292/324/305 311/325/306
+f 288/314/295 287/311/292 307/328/309
+f 304/316/297 303/312/293 323/329/310
+f 299/317/298 298/313/294 318/330/311
+f 294/318/299 293/310/291 313/331/312
+f 289/319/300 288/314/295 308/332/313
+f 305/333/314 304/316/297 324/334/315
+f 300/320/301 299/317/298 319/335/316
+f 295/321/302 294/318/299 314/336/317
+f 290/303/284 289/319/300 309/337/318
+f 301/304/285 300/320/301 320/338/319
+f 296/305/286 295/321/302 315/339/320
+f 291/307/288 290/303/284 310/340/321
+f 321/322/303 320/338/319 340/341/322
+f 316/323/304 315/339/320 335/342/323
+f 311/325/306 310/340/321 330/343/324
+f 322/326/307 321/322/303 341/344/325
+f 317/327/308 316/323/304 336/345/326
+f 312/346/327 311/325/306 330/343/324
+f 307/328/309 306/347/328 326/348/329
+f 323/329/310 322/326/307 342/349/330
+f 318/330/311 317/327/308 337/350/331
+f 313/331/312 312/346/327 332/351/332
+f 308/332/313 307/328/309 327/352/333
+f 324/334/315 323/329/310 343/353/334
+f 319/335/316 318/330/311 338/354/335
+f 314/336/317 313/331/312 333/355/336
+f 309/337/318 308/332/313 328/356/337
+f 320/338/319 319/335/316 339/357/338
+f 315/339/320 314/336/317 334/358/339
+f 310/340/321 309/337/318 329/359/340
+f 340/341/322 339/357/338 360/360/341
+f 335/342/323 334/358/339 355/361/342
+f 330/343/324 329/359/340 350/362/343
+f 341/344/325 340/341/322 361/363/344
+f 336/345/326 335/342/323 356/364/345
+f 331/365/346 330/343/324 350/362/343
+f 326/348/329 325/366/347 346/367/348
+f 342/349/330 341/344/325 362/368/349
+f 337/350/331 336/345/326 357/369/350
+f 332/351/332 331/365/346 352/370/351
+f 327/352/333 326/348/329 347/371/352
+f 343/353/334 342/349/330 363/372/353
+f 338/354/335 337/350/331 358/373/354
+f 333/355/336 332/351/332 353/374/355
+f 328/356/337 327/352/333 348/375/356
+f 339/357/338 338/354/335 359/376/357
+f 334/358/339 333/355/336 354/377/358
+f 329/359/340 328/356/337 349/378/359
+f 350/362/343 349/378/359 369/379/360
+f 361/363/344 360/360/341 380/380/361
+f 356/364/345 355/361/342 375/381/362
+f 351/382/363 350/362/343 369/379/360
+f 346/367/348 345/383/364 365/384/365
+f 362/368/349 361/363/344 381/385/366
+f 357/369/350 356/364/345 376/386/367
+f 352/370/351 351/382/363 371/387/368
+f 347/371/352 346/367/348 366/388/369
+f 363/372/353 362/368/349 382/389/370
+f 358/373/354 357/369/350 377/390/371
+f 353/374/355 352/370/351 372/391/372
+f 348/375/356 347/371/352 367/392/373
+f 359/376/357 358/373/354 378/393/374
+f 354/377/358 353/374/355 373/394/375
+f 349/378/359 348/375/356 368/395/376
+f 360/360/341 359/376/357 379/396/377
+f 355/361/342 354/377/358 374/397/378
+f 39/398/379 19/399/21 38/51/22
+f 1/11/11 344/400/380 20/38/38
+f 39/398/379 38/51/22 58/52/44
+f 20/38/38 344/400/380 40/91/74
+f 39/398/379 58/52/44 77/78/61
+f 40/91/74 344/400/380 59/110/93
+f 39/398/379 77/78/61 96/97/80
+f 59/110/93 344/400/380 78/128/111
+f 39/398/379 96/97/80 115/115/98
+f 78/128/111 344/400/380 97/145/128
+f 39/398/379 115/115/98 134/150/133
+f 97/145/128 344/400/380 116/146/129
+f 39/398/379 134/150/133 153/169/152
+f 116/146/129 344/400/380 135/164/147
+f 39/398/379 153/169/152 172/203/186
+f 135/164/147 344/400/380 154/183/166
+f 39/398/379 172/203/186 191/221/204
+f 154/183/166 344/400/380 173/199/182
+f 39/398/379 191/221/204 210/238/221
+f 173/199/182 344/400/380 192/217/200
+f 39/398/379 210/238/221 229/257/240
+f 192/217/200 344/400/380 211/234/217
+f 39/398/379 229/257/240 248/401/259
+f 211/234/217 344/400/380 230/253/236
+f 39/398/379 248/401/259 267/402/277
+f 230/253/236 344/400/380 249/273/255
+f 249/273/255 344/400/380 268/292/273
+f 39/398/379 267/402/277 286/403/296
+f 268/292/273 344/400/380 287/311/292
+f 39/398/379 286/403/296 305/404/314
+f 287/311/292 344/400/380 306/347/328
+f 39/398/379 305/404/314 324/405/315
+f 306/347/328 344/400/380 325/366/347
+f 39/398/379 324/405/315 343/406/334
+f 325/366/347 344/400/380 345/383/364
+f 39/398/379 343/406/334 363/407/353
+f 345/383/364 344/400/380 364/408/381
+f 39/398/379 363/407/353 382/409/370
+f 364/408/381 344/400/380 1/11/11
+f 380/380/361 379/396/377 16/2/2
+f 375/381/362 374/397/378 12/4/4
+f 370/410/382 369/379/360 7/7/7
+f 365/384/365 364/408/381 2/10/10
+f 381/385/366 380/380/361 17/1/1
+f 376/386/367 375/381/362 13/15/15
+f 371/387/368 370/410/382 8/17/17
+f 366/388/369 365/384/365 3/19/19
+f 382/389/370 381/385/366 18/13/13
+f 377/390/371 376/386/367 13/15/15
+f 372/391/372 371/387/368 9/25/25
+f 367/392/373 366/388/369 4/27/27
+f 39/398/379 382/409/370 19/399/21
+f 378/393/374 377/390/371 14/23/23
+f 373/394/375 372/391/372 10/31/31
+f 368/395/376 367/392/373 5/33/33
+f 379/396/377 378/393/374 15/29/29
+f 374/397/378 373/394/375 11/5/5
+f 369/379/360 368/395/376 6/8/8
+f 16/2/2 35/35/35 36/3/3
+f 11/5/5 30/36/36 31/6/6
+f 6/8/8 25/37/37 26/9/9
+f 1/11/11 20/38/38 21/12/12
+f 17/1/1 36/3/3 37/14/14
+f 12/4/4 31/6/6 32/16/16
+f 7/7/7 26/9/9 27/18/18
+f 2/10/10 21/12/12 22/20/20
+f 18/13/13 37/14/14 38/22/22
+f 13/15/15 32/16/16 33/24/24
+f 8/17/17 27/18/18 28/26/26
+f 3/19/19 22/20/20 23/28/28
+f 14/23/23 33/24/24 34/30/30
+f 9/25/25 28/26/26 29/32/32
+f 4/27/27 23/28/28 24/34/34
+f 15/29/29 34/30/30 35/35/35
+f 10/31/31 29/32/32 30/36/36
+f 5/33/33 24/34/34 25/37/37
+f 20/38/38 40/91/74 41/39/39
+f 36/41/3 56/71/54 57/42/40
+f 31/44/6 51/72/55 52/45/41
+f 26/47/9 46/73/56 47/48/42
+f 21/12/12 41/39/39 42/50/43
+f 37/40/14 57/42/40 58/52/44
+f 32/43/16 52/45/41 53/54/45
+f 27/46/18 47/48/42 48/56/46
+f 22/49/20 42/50/43 43/58/47
+f 33/53/24 53/54/45 54/60/48
+f 28/55/26 48/56/46 49/62/49
+f 23/57/28 43/58/47 44/64/50
+f 34/59/30 54/60/48 55/66/51
+f 29/61/32 49/62/49 50/68/52
+f 24/63/34 44/64/50 45/70/53
+f 35/65/35 55/66/51 56/71/54
+f 30/67/36 50/68/52 51/72/55
+f 25/69/37 45/70/53 46/73/56
+f 56/71/54 75/88/71 76/74/57
+f 51/72/55 70/89/72 71/75/58
+f 46/73/56 65/90/73 66/76/59
+f 41/39/39 60/92/75 61/77/60
+f 57/42/40 76/74/57 77/78/61
+f 52/45/41 71/75/58 72/79/62
+f 47/48/42 66/76/59 67/80/63
+f 42/50/43 61/77/60 62/81/64
+f 53/54/45 72/79/62 73/82/65
+f 48/56/46 67/80/63 68/83/66
+f 43/58/47 62/81/64 63/84/67
+f 54/60/48 73/82/65 74/85/68
+f 49/62/49 68/83/66 69/86/69
+f 44/64/50 63/84/67 64/87/70
+f 55/66/51 74/85/68 75/88/71
+f 50/68/52 69/86/69 70/89/72
+f 45/70/53 64/87/70 65/90/73
+f 40/91/74 59/110/93 60/92/75
+f 75/88/71 94/107/90 95/93/76
+f 70/89/72 89/108/91 90/94/77
+f 65/90/73 84/109/92 85/95/78
+f 60/92/75 79/111/94 80/96/79
+f 76/74/57 95/93/76 96/97/80
+f 71/75/58 90/94/77 91/98/81
+f 66/76/59 85/95/78 86/99/82
+f 61/77/60 80/96/79 81/100/83
+f 72/79/62 91/98/81 92/101/84
+f 67/80/63 86/99/82 87/102/85
+f 62/81/64 81/100/83 82/103/86
+f 73/82/65 92/101/84 93/104/87
+f 68/83/66 87/102/85 88/105/88
+f 63/84/67 82/103/86 83/106/89
+f 74/85/68 93/104/87 94/107/90
+f 69/86/69 88/105/88 89/108/91
+f 64/87/70 83/106/89 84/109/92
+f 59/110/93 78/128/111 79/111/94
+f 89/108/91 108/126/109 109/112/95
+f 84/109/92 103/127/110 104/113/96
+f 79/111/94 98/129/112 99/114/97
+f 95/93/76 114/130/113 115/115/98
+f 90/94/77 109/112/95 110/116/99
+f 85/95/78 104/113/96 105/117/100
+f 80/96/79 99/114/97 100/118/101
+f 91/98/81 110/116/99 111/119/102
+f 86/99/82 105/117/100 106/120/103
+f 81/100/83 100/118/101 101/121/104
+f 92/101/84 111/119/102 112/122/105
+f 87/102/85 106/120/103 107/123/106
+f 82/103/86 101/121/104 102/124/107
+f 93/104/87 112/122/105 113/125/108
+f 88/105/88 107/123/106 108/126/109
+f 83/106/89 102/124/107 103/127/110
+f 78/128/111 97/145/128 98/129/112
+f 94/107/90 113/125/108 114/130/113
+f 118/135/118 99/114/97 117/131/114
+f 134/150/133 115/115/98 133/132/115
+f 129/136/119 110/116/99 128/133/116
+f 124/137/120 105/117/100 123/134/117
+f 119/138/121 100/118/101 118/135/118
+f 130/139/122 111/119/102 129/136/119
+f 125/140/123 106/120/103 124/137/120
+f 120/141/124 101/121/104 119/138/121
+f 131/142/125 112/122/105 130/139/122
+f 126/143/126 107/123/106 125/140/123
+f 121/144/127 102/124/107 120/141/124
+f 132/147/130 113/125/108 131/142/125
+f 127/148/131 108/126/109 126/143/126
+f 122/149/132 103/127/110 121/144/127
+f 117/131/114 98/129/112 116/146/129
+f 133/132/115 114/130/113 132/147/130
+f 128/133/116 109/112/95 127/148/131
+f 123/134/117 104/113/96 122/149/132
+f 153/169/152 134/150/133 152/151/134
+f 148/155/138 129/136/119 147/152/135
+f 143/156/139 124/137/120 142/153/136
+f 138/157/140 119/138/121 137/154/137
+f 149/158/141 130/139/122 148/155/138
+f 144/159/142 125/140/123 143/156/139
+f 139/160/143 120/141/124 138/157/140
+f 150/161/144 131/142/125 149/158/141
+f 145/162/145 126/143/126 144/159/142
+f 140/163/146 121/144/127 139/160/143
+f 151/165/148 132/147/130 150/161/144
+f 146/166/149 127/148/131 145/162/145
+f 141/167/150 122/149/132 140/163/146
+f 136/168/151 117/131/114 135/164/147
+f 152/151/134 133/132/115 151/165/148
+f 147/152/135 128/133/116 146/166/149
+f 142/153/136 123/134/117 141/167/150
+f 137/154/137 118/135/118 136/168/151
+f 172/203/186 153/169/152 171/170/153
+f 167/174/157 148/155/138 166/171/154
+f 162/175/158 143/156/139 161/172/155
+f 157/176/159 138/157/140 156/173/156
+f 168/177/160 149/158/141 167/174/157
+f 163/178/161 144/159/142 162/175/158
+f 158/179/162 139/160/143 157/176/159
+f 169/180/163 150/161/144 168/177/160
+f 164/181/164 145/162/145 163/178/161
+f 159/194/177 140/163/146 158/179/162
+f 170/184/167 151/165/148 169/180/163
+f 165/185/168 146/166/149 164/181/164
+f 140/163/146 159/194/177 160/182/165
+f 155/186/169 136/168/151 154/183/166
+f 171/170/153 152/151/134 170/184/167
+f 166/171/154 147/152/135 165/185/168
+f 161/172/155 142/153/136 160/182/165
+f 156/173/156 137/154/137 155/186/169
+f 186/207/190 167/174/157 185/187/170
+f 181/191/174 162/175/158 180/188/171
+f 176/192/175 157/176/159 175/189/172
+f 167/174/157 186/207/190 187/190/173
+f 182/193/176 163/178/161 181/191/174
+f 177/195/178 158/179/162 176/192/175
+f 188/196/179 169/180/163 187/190/173
+f 183/197/180 164/181/164 182/193/176
+f 178/212/195 159/194/177 177/195/178
+f 189/200/183 170/184/167 188/196/179
+f 184/201/184 165/185/168 183/197/180
+f 159/194/177 178/212/195 179/198/181
+f 174/202/185 155/186/169 173/199/182
+f 190/204/187 171/170/153 189/200/183
+f 185/187/170 166/171/154 184/201/184
+f 180/188/171 161/172/155 179/198/181
+f 175/189/172 156/173/156 174/202/185
+f 191/221/204 172/203/186 190/204/187
+f 200/209/192 181/191/174 199/205/188
+f 195/210/193 176/192/175 194/206/189
+f 186/207/190 205/224/207 206/208/191
+f 201/211/194 182/193/176 200/209/192
+f 196/213/196 177/195/178 195/210/193
+f 207/214/197 188/196/179 206/208/191
+f 202/215/198 183/197/180 201/211/194
+f 197/229/212 178/212/195 196/213/196
+f 208/218/201 189/200/183 207/214/197
+f 203/219/202 184/201/184 202/215/198
+f 178/212/195 197/229/212 198/216/199
+f 193/220/203 174/202/185 192/217/200
+f 209/222/205 190/204/187 208/218/201
+f 204/223/206 185/187/170 203/219/202
+f 199/205/188 180/188/171 198/216/199
+f 194/206/189 175/189/172 193/220/203
+f 210/238/221 191/221/204 209/222/205
+f 205/224/207 186/207/190 204/223/206
+f 205/224/207 224/243/226 225/225/208
+f 220/228/211 201/211/194 219/226/209
+f 215/230/213 196/213/196 214/227/210
+f 226/231/214 207/214/197 225/225/208
+f 221/232/215 202/215/198 220/228/211
+f 216/248/231 197/229/212 215/230/213
+f 227/235/218 208/218/201 226/231/214
+f 222/236/219 203/219/202 221/232/215
+f 197/229/212 216/248/231 217/233/216
+f 212/237/220 193/220/203 211/234/217
+f 228/239/222 209/222/205 227/235/218
+f 223/240/223 204/223/206 222/236/219
+f 218/241/224 199/205/188 217/233/216
+f 213/242/225 194/206/189 212/237/220
+f 229/257/240 210/238/221 228/239/222
+f 224/243/226 205/224/207 223/240/223
+f 219/226/209 200/209/192 218/241/224
+f 214/227/210 195/210/193 213/242/225
+f 224/243/226 243/262/245 244/244/227
+f 239/247/230 220/228/211 238/245/228
+f 234/249/232 215/230/213 233/246/229
+f 245/250/233 226/231/214 244/244/227
+f 240/251/234 221/232/215 239/247/230
+f 235/267/250 216/248/231 234/249/232
+f 246/269/237 227/235/218 245/250/233
+f 241/255/238 222/236/219 240/251/234
+f 216/248/231 235/267/250 236/252/235
+f 231/256/239 212/237/220 230/253/236
+f 247/258/241 228/239/222 246/254/237
+f 242/259/242 223/240/223 241/255/238
+f 237/260/243 218/241/224 236/252/235
+f 232/261/244 213/242/225 231/256/239
+f 248/401/259 229/257/240 247/258/241
+f 243/262/245 224/243/226 242/259/242
+f 238/245/228 219/226/209 237/260/243
+f 233/246/229 214/227/210 232/261/244
+f 243/262/245 262/298/279 263/263/246
+f 258/266/249 239/247/230 257/264/247
+f 253/268/251 234/249/232 252/265/248
+f 264/270/252 245/250/233 263/263/246
+f 259/271/253 240/251/234 258/266/249
+f 254/287/268 235/267/250 253/268/251
+f 265/275/256 246/269/237 264/270/252
+f 260/276/257 241/255/238 259/271/253
+f 235/267/250 254/287/268 255/272/254
+f 250/277/258 231/256/239 249/273/255
+f 266/279/260 247/274/241 265/275/256
+f 261/280/261 242/259/242 260/276/257
+f 256/281/262 237/260/243 255/272/254
+f 251/282/263 232/261/244 250/277/258
+f 267/296/277 248/278/259 266/279/260
+f 262/298/279 243/262/245 261/280/261
+f 257/264/247 238/245/228 256/281/262
+f 252/265/248 233/246/229 251/282/263
+f 277/286/267 258/266/249 276/283/264
+f 272/288/269 253/268/251 271/284/265
+f 283/289/270 264/270/252 282/285/266
+f 278/290/271 259/271/253 277/286/267
+f 273/306/287 254/287/268 272/288/269
+f 284/293/274 265/275/256 283/289/270
+f 279/294/275 260/276/257 278/290/271
+f 254/287/268 273/306/287 274/291/272
+f 269/295/276 250/277/258 268/292/273
+f 285/297/278 266/279/260 284/293/274
+f 280/299/280 261/280/261 279/294/275
+f 275/300/281 256/281/262 274/291/272
+f 270/301/282 251/282/263 269/295/276
+f 286/315/296 267/296/277 285/297/278
+f 281/302/283 262/298/279 280/299/280
+f 276/283/264 257/264/247 275/300/281
+f 271/284/265 252/265/248 270/301/282
+f 282/285/266 263/263/246 281/302/283
+f 291/307/288 272/288/269 290/303/284
+f 302/308/289 283/289/270 301/304/285
+f 297/309/290 278/290/271 296/305/286
+f 292/324/305 273/306/287 291/307/288
+f 303/312/293 284/293/274 302/308/289
+f 298/313/294 279/294/275 297/309/290
+f 273/306/287 292/324/305 293/310/291
+f 288/314/295 269/295/276 287/311/292
+f 304/316/297 285/297/278 303/312/293
+f 299/317/298 280/299/280 298/313/294
+f 294/318/299 275/300/281 293/310/291
+f 289/319/300 270/301/282 288/314/295
+f 305/333/314 286/315/296 304/316/297
+f 300/320/301 281/302/283 299/317/298
+f 295/321/302 276/283/264 294/318/299
+f 290/303/284 271/284/265 289/319/300
+f 301/304/285 282/285/266 300/320/301
+f 296/305/286 277/286/267 295/321/302
+f 301/304/285 320/338/319 321/322/303
+f 296/305/286 315/339/320 316/323/304
+f 291/307/288 310/340/321 311/325/306
+f 302/308/289 321/322/303 322/326/307
+f 297/309/290 316/323/304 317/327/308
+f 312/346/327 293/310/291 311/325/306
+f 287/311/292 306/347/328 307/328/309
+f 303/312/293 322/326/307 323/329/310
+f 298/313/294 317/327/308 318/330/311
+f 293/310/291 312/346/327 313/331/312
+f 288/314/295 307/328/309 308/332/313
+f 304/316/297 323/329/310 324/334/315
+f 299/317/298 318/330/311 319/335/316
+f 294/318/299 313/331/312 314/336/317
+f 289/319/300 308/332/313 309/337/318
+f 300/320/301 319/335/316 320/338/319
+f 295/321/302 314/336/317 315/339/320
+f 290/303/284 309/337/318 310/340/321
+f 320/338/319 339/357/338 340/341/322
+f 315/339/320 334/358/339 335/342/323
+f 310/340/321 329/359/340 330/343/324
+f 321/322/303 340/341/322 341/344/325
+f 316/323/304 335/342/323 336/345/326
+f 331/365/346 312/346/327 330/343/324
+f 306/347/328 325/366/347 326/348/329
+f 322/326/307 341/344/325 342/349/330
+f 317/327/308 336/345/326 337/350/331
+f 312/346/327 331/365/346 332/351/332
+f 307/328/309 326/348/329 327/352/333
+f 323/329/310 342/349/330 343/353/334
+f 318/330/311 337/350/331 338/354/335
+f 313/331/312 332/351/332 333/355/336
+f 308/332/313 327/352/333 328/356/337
+f 319/335/316 338/354/335 339/357/338
+f 314/336/317 333/355/336 334/358/339
+f 309/337/318 328/356/337 329/359/340
+f 339/357/338 359/376/357 360/360/341
+f 334/358/339 354/377/358 355/361/342
+f 329/359/340 349/378/359 350/362/343
+f 340/341/322 360/360/341 361/363/344
+f 335/342/323 355/361/342 356/364/345
+f 351/382/363 331/365/346 350/362/343
+f 325/366/347 345/383/364 346/367/348
+f 341/344/325 361/363/344 362/368/349
+f 336/345/326 356/364/345 357/369/350
+f 331/365/346 351/382/363 352/370/351
+f 326/348/329 346/367/348 347/371/352
+f 342/349/330 362/368/349 363/372/353
+f 337/350/331 357/369/350 358/373/354
+f 332/351/332 352/370/351 353/374/355
+f 327/352/333 347/371/352 348/375/356
+f 338/354/335 358/373/354 359/376/357
+f 333/355/336 353/374/355 354/377/358
+f 328/356/337 348/375/356 349/378/359
+f 349/378/359 368/395/376 369/379/360
+f 360/360/341 379/396/377 380/380/361
+f 355/361/342 374/397/378 375/381/362
+f 370/410/382 351/382/363 369/379/360
+f 345/383/364 364/408/381 365/384/365
+f 361/363/344 380/380/361 381/385/366
+f 356/364/345 375/381/362 376/386/367
+f 351/382/363 370/410/382 371/387/368
+f 346/367/348 365/384/365 366/388/369
+f 362/368/349 381/385/366 382/389/370
+f 357/369/350 376/386/367 377/390/371
+f 352/370/351 371/387/368 372/391/372
+f 347/371/352 366/388/369 367/392/373
+f 358/373/354 377/390/371 378/393/374
+f 353/374/355 372/391/372 373/394/375
+f 348/375/356 367/392/373 368/395/376
+f 359/376/357 378/393/374 379/396/377
+f 354/377/358 373/394/375 374/397/378
+f 17/1/1 380/380/361 16/2/2
+f 374/397/378 11/5/5 12/4/4
+f 369/379/360 6/8/8 7/7/7
+f 364/408/381 1/11/11 2/10/10
+f 18/13/13 381/385/366 17/1/1
+f 375/381/362 12/4/4 13/15/15
+f 370/410/382 7/7/7 8/17/17
+f 365/384/365 2/10/10 3/19/19
+f 19/21/21 382/389/370 18/13/13
+f 14/23/23 377/390/371 13/15/15
+f 371/387/368 8/17/17 9/25/25
+f 366/388/369 3/19/19 4/27/27
+f 15/29/29 378/393/374 14/23/23
+f 372/391/372 9/25/25 10/31/31
+f 367/392/373 4/27/27 5/33/33
+f 16/2/2 379/396/377 15/29/29
+f 373/394/375 10/31/31 11/5/5
+f 368/395/376 5/33/33 6/8/8
diff --git a/examples/datavisualization/rotations/mesh/narrowarrow.obj b/examples/datavisualization/rotations/mesh/narrowarrow.obj
new file mode 100644
index 00000000..481fc1d1
--- /dev/null
+++ b/examples/datavisualization/rotations/mesh/narrowarrow.obj
@@ -0,0 +1,413 @@
+# Blender v2.69 (sub 0) OBJ File: ''
+# www.blender.org
+v 0.000000 0.986570 0.000000
+v 0.000000 0.500000 -0.218399
+v -0.042608 0.500000 -0.214202
+v -0.083578 0.500000 -0.201774
+v -0.121336 0.500000 -0.181592
+v -0.154431 0.500000 -0.154431
+v -0.181592 0.500000 -0.121336
+v -0.201774 0.500000 -0.083578
+v -0.214202 0.500000 -0.042608
+v -0.218399 0.500000 -0.000000
+v -0.214202 0.500000 0.042607
+v -0.201774 0.500000 0.083578
+v -0.181592 0.500000 0.121336
+v -0.154431 0.500000 0.154431
+v -0.121336 0.500000 0.181592
+v -0.083578 0.500000 0.201774
+v -0.042607 0.500000 0.214202
+v 0.000000 0.500000 0.218399
+v 0.042608 0.500000 0.214202
+v 0.083578 0.500000 0.201774
+v 0.121336 0.500000 0.181592
+v 0.154431 0.500000 0.154431
+v 0.181592 0.500000 0.121336
+v 0.201774 0.500000 0.083577
+v 0.214202 0.500000 0.042607
+v 0.218399 0.500000 -0.000000
+v 0.214202 0.500000 -0.042608
+v 0.201774 0.500000 -0.083578
+v 0.181592 0.500000 -0.121336
+v 0.154431 0.500000 -0.154432
+v 0.121336 0.500000 -0.181592
+v 0.083577 0.500000 -0.201774
+v 0.042607 0.500000 -0.214202
+v 0.000000 0.000000 0.000000
+v 0.000000 0.000000 0.000000
+v -0.000000 0.500000 -0.126422
+v -0.024664 0.500000 -0.123993
+v -0.048380 0.500000 -0.116799
+v -0.070236 0.500000 -0.105116
+v -0.089394 0.500000 -0.089394
+v -0.105116 0.500000 -0.070236
+v -0.116799 0.500000 -0.048380
+v -0.123993 0.500000 -0.024664
+v -0.126422 0.500000 -0.000000
+v -0.123993 0.500000 0.024664
+v -0.116799 0.500000 0.048380
+v -0.105116 0.500000 0.070236
+v -0.089394 0.500000 0.089394
+v -0.070236 0.500000 0.105116
+v -0.048380 0.500000 0.116799
+v -0.024664 0.500000 0.123993
+v 0.000000 0.500000 0.126422
+v 0.024664 0.500000 0.123993
+v 0.048380 0.500000 0.116799
+v 0.070236 0.500000 0.105116
+v 0.089394 0.500000 0.089394
+v 0.105116 0.500000 0.070236
+v 0.116799 0.500000 0.048380
+v 0.123993 0.500000 0.024664
+v 0.126422 0.500000 -0.000000
+v 0.123993 0.500000 -0.024664
+v 0.116799 0.500000 -0.048380
+v 0.105116 0.500000 -0.070237
+v 0.089394 0.500000 -0.089394
+v 0.070236 0.500000 -0.105116
+v 0.048380 0.500000 -0.116799
+v 0.024664 0.500000 -0.123993
+v 0.126422 -0.983070 -0.000000
+v 0.123993 -0.983070 0.024664
+v -0.048380 -0.983070 -0.116799
+v -0.024664 -0.983070 -0.123993
+v -0.070236 -0.983070 0.105116
+v -0.089394 -0.983070 0.089394
+v 0.116799 -0.983070 0.048380
+v 0.105116 -0.983070 0.070236
+v -0.105116 -0.983070 0.070236
+v -0.116799 -0.983070 0.048380
+v 0.024664 -0.983070 -0.123993
+v 0.048380 -0.983070 -0.116799
+v 0.089394 -0.983070 0.089394
+v 0.070236 -0.983070 0.105116
+v -0.123993 -0.983070 0.024664
+v -0.126422 -0.983070 -0.000000
+v 0.070236 -0.983070 -0.105116
+v 0.089394 -0.983070 -0.089394
+v 0.048380 -0.983070 0.116799
+v 0.024664 -0.983070 0.123993
+v -0.123993 -0.983070 -0.024664
+v -0.116799 -0.983070 -0.048380
+v 0.105116 -0.983070 -0.070237
+v 0.116799 -0.983070 -0.048380
+v -0.105116 -0.983070 -0.070236
+v -0.089394 -0.983070 -0.089394
+v 0.000000 -0.983070 0.126422
+v -0.024664 -0.983070 0.123993
+v 0.123993 -0.983070 -0.024664
+v -0.070236 -0.983070 -0.105116
+v -0.048380 -0.983070 0.116799
+v -0.000000 -0.983070 -0.126422
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt 0.500000 1.000000
+vt 0.597545 0.990393
+vt 0.402456 0.990393
+vt 0.691342 0.961940
+vt 0.777785 0.915735
+vt 0.853553 0.853553
+vt 0.915735 0.777785
+vt 0.961940 0.691342
+vt 0.990393 0.597545
+vt 1.000000 0.500000
+vt 0.990393 0.402455
+vt 0.961940 0.308658
+vt 0.915735 0.222215
+vt 0.853553 0.146447
+vt 0.777785 0.084265
+vt 0.691342 0.038060
+vt 0.597545 0.009607
+vt 0.308659 0.961940
+vt 0.222215 0.915735
+vt 0.146447 0.853554
+vt 0.308658 0.038060
+vt 0.500000 0.000000
+vt 0.402455 0.009607
+vt 0.222215 0.084265
+vt 0.146446 0.146447
+vt 0.084265 0.222215
+vt 0.009607 0.402455
+vt 0.038060 0.308659
+vt 0.009607 0.597546
+vt 0.000000 0.500000
+vt 0.038060 0.691342
+vt 0.084266 0.777786
+vn -0.089495 0.407852 -0.908651
+vn -0.265044 0.407852 -0.873733
+vn -0.430408 0.407852 -0.805236
+vn -0.579231 0.407852 -0.705796
+vn -0.705796 0.407852 -0.579232
+vn -0.805237 0.407852 -0.430408
+vn -0.873733 0.407852 -0.265043
+vn -0.908651 0.407852 -0.089495
+vn -0.908652 0.407852 0.089494
+vn -0.873732 0.407852 0.265044
+vn -0.805237 0.407852 0.430407
+vn -0.705796 0.407852 0.579232
+vn -0.579231 0.407852 0.705796
+vn -0.430408 0.407852 0.805237
+vn -0.265044 0.407852 0.873733
+vn -0.089494 0.407852 0.908652
+vn 0.089495 0.407852 0.908651
+vn 0.265044 0.407852 0.873732
+vn 0.430408 0.407852 0.805237
+vn 0.579232 0.407852 0.705796
+vn 0.705796 0.407852 0.579231
+vn 0.805237 0.407852 0.430406
+vn 0.873733 0.407852 0.265044
+vn 0.908652 0.407852 0.089493
+vn 0.908651 0.407852 -0.089496
+vn 0.873732 0.407852 -0.265045
+vn 0.805236 0.407852 -0.430409
+vn 0.705795 0.407852 -0.579232
+vn 0.579231 0.407852 -0.705796
+vn 0.430407 0.407852 -0.805237
+vn 0.265042 0.407852 -0.873733
+vn 0.089494 0.407852 -0.908652
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000062
+vn -0.290284 0.000000 0.956940
+vn -0.098017 0.000000 0.995185
+vn -0.634393 0.000000 -0.773010
+vn -0.773010 0.000000 -0.634393
+vn 0.956940 0.000000 -0.290286
+vn 0.881921 0.000000 -0.471398
+vn -0.881922 0.000000 -0.471396
+vn -0.956940 0.000000 -0.290285
+vn 0.098017 0.000000 0.995185
+vn 0.290285 0.000000 0.956940
+vn 0.773010 0.000000 -0.634394
+vn 0.634392 0.000000 -0.773011
+vn -0.995185 0.000000 -0.098017
+vn -0.995185 0.000000 0.098017
+vn 0.471397 0.000000 0.881921
+vn 0.634394 0.000000 0.773010
+vn 0.471395 0.000000 -0.881922
+vn 0.290283 0.000000 -0.956941
+vn 0.098016 0.000000 -0.995185
+vn -0.956940 0.000000 0.290285
+vn -0.881922 0.000000 0.471396
+vn 0.773011 0.000000 0.634393
+vn 0.881922 0.000000 0.471396
+vn -0.773010 0.000000 0.634393
+vn -0.634394 0.000000 0.773010
+vn -0.471397 0.000000 0.881921
+vn -0.098016 0.000000 -0.995185
+vn -0.290284 0.000000 -0.956940
+vn -0.471397 0.000000 -0.881921
+vn 0.956941 0.000000 0.290284
+vn 0.995185 0.000000 0.098016
+vn 0.995185 0.000000 -0.098018
+vn 0.000000 -1.000000 0.000001
+vn 0.000000 -1.000000 0.000018
+vn 0.000000 -1.000000 -0.000013
+vn 0.000000 -1.000000 0.000011
+vn 0.000000 -1.000000 0.000002
+vn 0.000000 -1.000000 -0.000031
+vn 0.000000 -1.000000 0.000031
+vn 0.000000 -1.000000 -0.000021
+vn 0.000000 -1.000000 -0.000016
+vn 0.000000 -1.000000 -0.000005
+vn 0.000000 -1.000000 0.000003
+vn -0.098015 0.000000 0.995185
+vn -0.773011 0.000000 -0.634393
+vn -0.881921 0.000000 -0.471396
+vn 0.773009 0.000000 -0.634394
+vn 0.098017 0.000000 -0.995185
+vn -0.634393 0.000000 0.773011
+vn -0.098018 0.000000 -0.995185
+vn -0.290285 0.000000 -0.956940
+s off
+f 1/1/1 2/2/1 3/3/1
+f 1/1/2 3/2/2 4/3/2
+f 1/1/3 4/2/3 5/3/3
+f 1/1/4 5/2/4 6/3/4
+f 1/1/5 6/2/5 7/3/5
+f 1/1/6 7/2/6 8/3/6
+f 1/1/7 8/2/7 9/3/7
+f 1/1/8 9/2/8 10/3/8
+f 1/1/9 10/2/9 11/3/9
+f 1/1/10 11/2/10 12/3/10
+f 1/1/11 12/2/11 13/3/11
+f 1/1/12 13/2/12 14/3/12
+f 1/1/13 14/2/13 15/3/13
+f 1/1/14 15/2/14 16/3/14
+f 1/1/15 16/2/15 17/3/15
+f 1/1/16 17/2/16 18/3/16
+f 1/1/17 18/2/17 19/3/17
+f 1/1/18 19/2/18 20/3/18
+f 1/1/19 20/2/19 21/3/19
+f 1/1/20 21/2/20 22/3/20
+f 1/1/21 22/2/21 23/3/21
+f 1/1/22 23/2/22 24/3/22
+f 1/1/23 24/2/23 25/3/23
+f 1/1/24 25/2/24 26/3/24
+f 1/1/25 26/2/25 27/3/25
+f 1/1/26 27/2/26 28/3/26
+f 1/1/27 28/2/27 29/3/27
+f 1/1/28 29/2/28 30/3/28
+f 1/1/29 30/2/29 31/3/29
+f 1/1/30 31/2/30 32/3/30
+f 1/1/31 32/2/31 33/3/31
+f 1/1/32 33/2/32 2/3/32
+f 24/1/33 23/2/33 58/4/33
+f 13/1/33 12/2/33 47/4/33
+f 2/1/33 33/2/33 36/4/33
+f 23/1/33 22/2/33 57/4/33
+f 12/1/33 11/2/33 46/4/33
+f 33/1/33 32/2/33 67/4/33
+f 22/1/33 21/2/33 56/4/33
+f 11/1/33 10/2/33 45/4/33
+f 32/1/33 31/2/33 66/4/33
+f 21/1/33 20/2/33 55/4/33
+f 10/1/33 9/2/33 44/4/33
+f 31/1/33 30/2/33 65/4/33
+f 20/1/33 19/2/33 54/4/33
+f 9/1/33 8/2/33 43/4/33
+f 30/1/33 29/2/33 64/4/33
+f 19/1/33 18/2/33 53/4/33
+f 3/1/33 2/2/33 37/4/33
+f 8/1/33 7/2/33 42/4/33
+f 29/1/33 28/2/33 63/4/33
+f 7/1/33 6/2/33 41/4/33
+f 18/1/33 17/2/33 52/4/33
+f 28/1/33 27/2/33 62/4/33
+f 6/1/33 5/2/33 40/4/33
+f 17/1/33 16/2/33 51/4/33
+f 27/1/33 26/2/33 61/4/33
+f 5/1/33 4/2/33 39/4/33
+f 16/1/33 15/2/33 50/4/33
+f 26/1/33 25/2/33 60/4/33
+f 4/1/33 3/2/33 38/4/33
+f 15/1/33 14/2/33 49/4/33
+f 25/1/33 24/2/33 59/4/33
+f 14/1/33 13/2/33 48/4/33
+f 81/5/34 86/6/34 80/7/34
+f 51/1/35 50/2/35 95/4/35
+f 52/1/36 51/2/36 94/4/36
+f 40/1/37 39/2/37 93/4/37
+f 41/1/38 40/2/38 92/4/38
+f 62/1/39 61/2/39 91/4/39
+f 63/1/40 62/2/40 90/4/40
+f 42/1/41 41/2/41 89/4/41
+f 43/1/42 42/2/42 88/4/42
+f 53/1/43 52/2/43 87/4/43
+f 54/1/44 53/2/44 86/4/44
+f 64/1/45 63/2/45 85/4/45
+f 65/1/46 64/2/46 84/4/46
+f 44/1/47 43/2/47 83/4/47
+f 45/1/48 44/2/48 82/4/48
+f 55/1/49 54/2/49 81/4/49
+f 56/1/50 55/2/50 80/4/50
+f 66/1/51 65/2/51 79/4/51
+f 67/1/52 66/2/52 78/4/52
+f 36/1/53 67/2/53 99/4/53
+f 46/1/54 45/2/54 77/4/54
+f 47/1/55 46/2/55 76/4/55
+f 57/1/56 56/2/56 75/4/56
+f 58/1/57 57/2/57 74/4/57
+f 48/1/58 47/2/58 73/4/58
+f 49/1/59 48/2/59 72/4/59
+f 50/1/60 49/2/60 98/4/60
+f 37/1/61 36/2/61 71/4/61
+f 38/1/62 37/2/62 70/4/62
+f 39/1/63 38/2/63 97/4/63
+f 59/1/64 58/2/64 69/4/64
+f 60/1/65 59/2/65 68/4/65
+f 61/1/66 60/2/66 96/4/66
+f 23/2/33 57/3/33 58/4/33
+f 12/2/33 46/3/33 47/4/33
+f 33/2/33 67/3/33 36/4/33
+f 22/2/33 56/3/33 57/4/33
+f 11/2/33 45/3/33 46/4/33
+f 32/2/67 66/3/67 67/4/67
+f 21/2/33 55/3/33 56/4/33
+f 10/2/33 44/3/33 45/4/33
+f 31/2/33 65/3/33 66/4/33
+f 20/2/33 54/3/33 55/4/33
+f 9/2/33 43/3/33 44/4/33
+f 30/2/33 64/3/33 65/4/33
+f 19/2/33 53/3/33 54/4/33
+f 8/2/33 42/3/33 43/4/33
+f 29/2/33 63/3/33 64/4/33
+f 18/2/33 52/3/33 53/4/33
+f 2/2/33 36/3/33 37/4/33
+f 7/2/33 41/3/33 42/4/33
+f 28/2/33 62/3/33 63/4/33
+f 6/2/33 40/3/33 41/4/33
+f 17/2/33 51/3/33 52/4/33
+f 27/2/33 61/3/33 62/4/33
+f 5/2/33 39/3/33 40/4/33
+f 16/2/67 50/3/67 51/4/67
+f 26/2/33 60/3/33 61/4/33
+f 4/2/33 38/3/33 39/4/33
+f 15/2/33 49/3/33 50/4/33
+f 25/2/33 59/3/33 60/4/33
+f 3/2/33 37/3/33 38/4/33
+f 14/2/33 48/3/33 49/4/33
+f 24/2/33 58/3/33 59/4/33
+f 13/2/33 47/3/33 48/4/33
+f 86/6/33 87/8/33 80/7/33
+f 87/8/33 94/9/33 80/7/33
+f 94/9/33 95/10/33 80/7/33
+f 95/10/68 98/11/68 80/7/68
+f 98/11/69 72/12/69 80/7/69
+f 72/12/70 73/13/70 80/7/70
+f 73/13/33 76/14/33 80/7/33
+f 76/14/33 77/15/33 80/7/33
+f 77/15/33 82/16/33 80/7/33
+f 82/16/33 83/17/33 80/7/33
+f 83/17/33 88/18/33 80/7/33
+f 88/18/33 89/19/33 80/7/33
+f 89/19/33 92/20/33 93/21/33
+f 80/7/71 89/19/71 93/21/71
+f 75/22/33 80/7/33 93/21/33
+f 74/23/33 75/22/33 93/21/33
+f 69/24/33 74/23/33 93/21/33
+f 71/25/72 97/26/72 70/27/72
+f 71/25/73 93/21/73 97/26/73
+f 99/28/74 93/21/74 71/25/74
+f 78/29/33 93/21/33 99/28/33
+f 79/30/33 93/21/33 78/29/33
+f 85/31/73 79/30/73 84/32/73
+f 85/31/33 93/21/33 79/30/33
+f 91/33/75 85/31/75 90/34/75
+f 91/33/33 93/21/33 85/31/33
+f 96/35/33 68/36/33 91/33/33
+f 68/36/76 69/24/76 93/21/76
+f 91/33/77 68/36/77 93/21/77
+f 50/2/35 98/3/35 95/4/35
+f 51/2/78 95/3/78 94/4/78
+f 39/2/37 97/3/37 93/4/37
+f 40/2/79 93/3/79 92/4/79
+f 61/2/39 96/3/39 91/4/39
+f 62/2/40 91/3/40 90/4/40
+f 41/2/80 92/3/80 89/4/80
+f 42/2/42 89/3/42 88/4/42
+f 52/2/43 94/3/43 87/4/43
+f 53/2/44 87/3/44 86/4/44
+f 63/2/81 90/3/81 85/4/81
+f 64/2/46 85/3/46 84/4/46
+f 43/2/47 88/3/47 83/4/47
+f 44/2/48 83/3/48 82/4/48
+f 54/2/49 86/3/49 81/4/49
+f 55/2/50 81/3/50 80/4/50
+f 65/2/51 84/3/51 79/4/51
+f 66/2/52 79/3/52 78/4/52
+f 67/2/82 78/3/82 99/4/82
+f 45/2/54 82/3/54 77/4/54
+f 46/2/55 77/3/55 76/4/55
+f 56/2/56 80/3/56 75/4/56
+f 57/2/57 75/3/57 74/4/57
+f 47/2/58 76/3/58 73/4/58
+f 48/2/83 73/3/83 72/4/83
+f 49/2/60 72/3/60 98/4/60
+f 36/2/84 99/3/84 71/4/84
+f 37/2/85 71/3/85 70/4/85
+f 38/2/63 70/3/63 97/4/63
+f 58/2/64 74/3/64 69/4/64
+f 59/2/65 69/3/65 68/4/65
+f 60/2/66 68/3/66 96/4/66
diff --git a/examples/datavisualization/rotations/rotations.pro b/examples/datavisualization/rotations/rotations.pro
new file mode 100644
index 00000000..fbad4271
--- /dev/null
+++ b/examples/datavisualization/rotations/rotations.pro
@@ -0,0 +1,13 @@
+!include( ../examples.pri ) {
+ error( "Couldn't find the examples.pri file!" )
+}
+
+SOURCES += main.cpp scatterdatamodifier.cpp
+HEADERS += scatterdatamodifier.h
+
+QT += widgets
+
+RESOURCES += rotations.qrc
+
+OTHER_FILES += doc/src/* \
+ doc/images/*
diff --git a/examples/datavisualization/rotations/rotations.qrc b/examples/datavisualization/rotations/rotations.qrc
new file mode 100644
index 00000000..bf66ebeb
--- /dev/null
+++ b/examples/datavisualization/rotations/rotations.qrc
@@ -0,0 +1,6 @@
+<RCC>
+ <qresource prefix="/">
+ <file>mesh/narrowarrow.obj</file>
+ <file>mesh/largesphere.obj</file>
+ </qresource>
+</RCC>
diff --git a/examples/datavisualization/rotations/scatterdatamodifier.cpp b/examples/datavisualization/rotations/scatterdatamodifier.cpp
new file mode 100644
index 00000000..90af63ab
--- /dev/null
+++ b/examples/datavisualization/rotations/scatterdatamodifier.cpp
@@ -0,0 +1,183 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+#include "scatterdatamodifier.h"
+#include <QtDataVisualization/qscatterdataproxy.h>
+#include <QtDataVisualization/qvalue3daxis.h>
+#include <QtDataVisualization/q3dscene.h>
+#include <QtDataVisualization/q3dcamera.h>
+#include <QtDataVisualization/qscatter3dseries.h>
+#include <QtDataVisualization/q3dtheme.h>
+#include <QtCore/qmath.h>
+
+using namespace QtDataVisualization;
+
+static const float verticalRange = 8.0f;
+static const float horizontalRange = verticalRange;
+static const float ellipse_a = horizontalRange / 3.0f;
+static const float ellipse_b = verticalRange;
+static const float doublePi = float(M_PI) * 2.0f;
+static const float radiansToDegrees = 360.0f / doublePi;
+static const float animationFrames = 30.0f;
+
+ScatterDataModifier::ScatterDataModifier(Q3DScatter *scatter)
+ : m_graph(scatter),
+ m_fieldLines(12),
+ m_arrowsPerLine(16),
+ m_magneticField(new QScatter3DSeries),
+ m_sun(new QScatter3DSeries),
+ m_magneticFieldArray(0),
+ m_angleOffset(0.0f),
+ m_angleStep(doublePi / m_arrowsPerLine / animationFrames)
+{
+ m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualityNone);
+ m_graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetFront);
+
+ // Magnetic field lines use custom narrow arrow
+ m_magneticField->setItemSize(0.2f);
+ //! [3]
+ m_magneticField->setMesh(QAbstract3DSeries::MeshUserDefined);
+ m_magneticField->setUserDefinedMesh(QStringLiteral(":/mesh/narrowarrow.obj"));
+ //! [3]
+ //! [4]
+ QLinearGradient fieldGradient(0, 0, 16, 1024);
+ fieldGradient.setColorAt(0.0, Qt::black);
+ fieldGradient.setColorAt(1.0, Qt::white);
+ m_magneticField->setBaseGradient(fieldGradient);
+ m_magneticField->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
+ //! [4]
+
+ // For 'sun' we use a custom large sphere.
+ m_sun->setItemSize(0.2f);
+ m_sun->setName(QStringLiteral("Sun"));
+ m_sun->setItemLabelFormat(QStringLiteral("@seriesName"));
+ m_sun->setMesh(QAbstract3DSeries::MeshUserDefined);
+ m_sun->setUserDefinedMesh(QStringLiteral(":/mesh/largesphere.obj"));
+ m_sun->setBaseColor(QColor(0xff, 0xBB, 0x00));
+ m_sun->dataProxy()->addItem(QScatterDataItem(QVector3D()));
+
+ m_graph->addSeries(m_magneticField);
+ m_graph->addSeries(m_sun);
+
+ // Configure the axes according to the data
+ m_graph->axisX()->setRange(-horizontalRange, horizontalRange);
+ m_graph->axisY()->setRange(-verticalRange, verticalRange);
+ m_graph->axisZ()->setRange(-horizontalRange, horizontalRange);
+ m_graph->axisX()->setSegmentCount(int(horizontalRange));
+ m_graph->axisZ()->setSegmentCount(int(horizontalRange));
+
+ QObject::connect(&m_rotationTimer, &QTimer::timeout, this,
+ &ScatterDataModifier::triggerRotation);
+
+ toggleRotation();
+ generateData();
+}
+
+ScatterDataModifier::~ScatterDataModifier()
+{
+ delete m_graph;
+}
+
+void ScatterDataModifier::generateData()
+{
+ // Reusing existing array is computationally cheaper than always generating new array, even if
+ // all data items change in the array, if the array size doesn't change.
+ if (!m_magneticFieldArray)
+ m_magneticFieldArray = new QScatterDataArray;
+
+ int arraySize = m_fieldLines * m_arrowsPerLine;
+ if (arraySize != m_magneticFieldArray->size())
+ m_magneticFieldArray->resize(arraySize);
+
+ QScatterDataItem *ptrToDataArray = &m_magneticFieldArray->first();
+
+ for (float i = 0; i < m_fieldLines; i++) {
+ float horizontalAngle = (doublePi * i) / m_fieldLines;
+ float xCenter = ellipse_a * qCos(horizontalAngle);
+ float zCenter = ellipse_a * qSin(horizontalAngle);
+
+ // Rotate - arrow always tangential to origo
+ //! [0]
+ QQuaternion yRotation = QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, horizontalAngle * radiansToDegrees);
+ //! [0]
+
+ for (float j = 0; j < m_arrowsPerLine; j++) {
+ // Calculate point on ellipse centered on origo and parallel to x-axis
+ float verticalAngle = ((doublePi * j) / m_arrowsPerLine) + m_angleOffset;
+ float xUnrotated = ellipse_a * qCos(verticalAngle);
+ float y = ellipse_b * qSin(verticalAngle);
+
+ // Rotate the ellipse around y-axis
+ float xRotated = xUnrotated * qCos(horizontalAngle);
+ float zRotated = xUnrotated * qSin(horizontalAngle);
+
+ // Add offset
+ float x = xCenter + xRotated;
+ float z = zCenter + zRotated;
+
+ //! [1]
+ QQuaternion zRotation = QQuaternion::fromAxisAndAngle(0.0f, 0.0f, 1.0f, verticalAngle * radiansToDegrees);
+ QQuaternion totalRotation = yRotation * zRotation;
+ //! [1]
+
+ ptrToDataArray->setPosition(QVector3D(x, y, z));
+ //! [2]
+ ptrToDataArray->setRotation(totalRotation);
+ //! [2]
+ ptrToDataArray++;
+ }
+ }
+
+ if (m_graph->selectedSeries() == m_magneticField)
+ m_graph->clearSelection();
+
+ m_magneticField->dataProxy()->resetArray(m_magneticFieldArray);
+}
+
+void ScatterDataModifier::setFieldLines(int lines)
+{
+ m_fieldLines = lines;
+ generateData();
+}
+
+void ScatterDataModifier::setArrowsPerLine(int arrows)
+{
+ m_angleOffset = 0.0f;
+ m_angleStep = doublePi / m_arrowsPerLine / animationFrames;
+ m_arrowsPerLine = arrows;
+ generateData();
+}
+
+void ScatterDataModifier::triggerRotation()
+{
+ m_angleOffset += m_angleStep;
+ generateData();
+}
+
+void ScatterDataModifier::toggleSun()
+{
+ m_sun->setVisible(!m_graph->seriesList().at(1)->isVisible());
+}
+
+void ScatterDataModifier::toggleRotation()
+{
+ if (m_rotationTimer.isActive())
+ m_rotationTimer.stop();
+ else
+ m_rotationTimer.start(15);
+}
diff --git a/examples/datavisualization/rotations/scatterdatamodifier.h b/examples/datavisualization/rotations/scatterdatamodifier.h
new file mode 100644
index 00000000..9df1f26a
--- /dev/null
+++ b/examples/datavisualization/rotations/scatterdatamodifier.h
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+#ifndef SCATTERDATAMODIFIER_H
+#define SCATTERDATAMODIFIER_H
+
+#include <QtDataVisualization/q3dscatter.h>
+#include <QtDataVisualization/qscatterdataproxy.h>
+#include <QtCore/QTimer>
+
+using namespace QtDataVisualization;
+
+class ScatterDataModifier : public QObject
+{
+ Q_OBJECT
+public:
+ explicit ScatterDataModifier(Q3DScatter *scatter);
+ ~ScatterDataModifier();
+
+ void generateData();
+
+public slots:
+ void setFieldLines(int lines);
+ void setArrowsPerLine(int arrows);
+ void toggleRotation();
+ void triggerRotation();
+ void toggleSun();
+
+private:
+ Q3DScatter *m_graph;
+ QTimer m_rotationTimer;
+ int m_fieldLines;
+ int m_arrowsPerLine;
+ QScatter3DSeries *m_magneticField;
+ QScatter3DSeries *m_sun;
+ QScatterDataArray *m_magneticFieldArray;
+ float m_angleOffset;
+ float m_angleStep;
+};
+
+#endif
diff --git a/examples/datavisualization/scatter/doc/images/scatter-example.png b/examples/datavisualization/scatter/doc/images/scatter-example.png
new file mode 100644
index 00000000..82c13855
--- /dev/null
+++ b/examples/datavisualization/scatter/doc/images/scatter-example.png
Binary files differ
diff --git a/examples/scatter/doc/src/scatter.qdoc b/examples/datavisualization/scatter/doc/src/scatter.qdoc
index 31cfeb09..3c9d72bc 100644
--- a/examples/scatter/doc/src/scatter.qdoc
+++ b/examples/datavisualization/scatter/doc/src/scatter.qdoc
@@ -41,7 +41,7 @@
First, in main.cpp, we create a QApplication, instantiate Q3DScatter, and a window container
for it:
- \snippet ../examples/scatter/main.cpp 0
+ \snippet scatter/main.cpp 0
The call to QWidget::createWindowContainer is required, as all data visualization types
(Q3DBars, Q3DScatter, and Q3DSurface) inherit QWindow. Any class inheriting QWindow cannot be used
@@ -50,7 +50,7 @@
Then we'll create horizontal and vertical layouts. We'll add the graph and the vertical
layout into the horizontal one:
- \snippet ../examples/scatter/main.cpp 1
+ \snippet scatter/main.cpp 1
We're not using the vertical layout for anything yet, but we'll get back to it in
\l {Using widgets to control the graph}
@@ -59,30 +59,26 @@
graph. Let's call it \c ScatterDataModifier (See \l {Setting up the graph} and
\l {Adding data to the graph} for details):
- \snippet ../examples/scatter/main.cpp 2
+ \snippet scatter/main.cpp 2
The application main is done. We can show the graph and start the event loop:
- \snippet ../examples/scatter/main.cpp 3
+ \snippet scatter/main.cpp 3
\section1 Setting up the graph
Let's set up some visual qualities for the graph in the constructor of the \c ScatterDataModifier
class we instantiated in the application main:
- \snippet ../examples/scatter/scatterdatamodifier.cpp 0
+ \snippet scatter/scatterdatamodifier.cpp 0
None of these are required, but are used to override graph defaults. You can try how it looks
with the preset defaults by commenting the block above out.
- Then we'll set axes for the graph:
-
- \snippet ../examples/scatter/scatterdatamodifier.cpp 1
-
- And finally we create a QScatterDataProxy and the associated QScatter3DSeries. We set custom label format
+ Finally we create a QScatterDataProxy and the associated QScatter3DSeries. We set custom label format
and mesh smoothing for the series and add it to the graph:
- \snippet ../examples/scatter/scatterdatamodifier.cpp 2
+ \snippet scatter/scatterdatamodifier.cpp 2
That concludes setting up the graph.
@@ -90,27 +86,26 @@
The last thing we do in the \c ScatterDataModifier constructor is to add data to the graph:
- \snippet ../examples/scatter/scatterdatamodifier.cpp 3
+ \snippet scatter/scatterdatamodifier.cpp 3
- The actual data addition is done in \c addData() method. First we configure the axes we created
- in constructor:
+ The actual data addition is done in \c addData() method. First we configure the axes:
- \snippet ../examples/scatter/scatterdatamodifier.cpp 4
+ \snippet scatter/scatterdatamodifier.cpp 4
This could have been done in the constructor of \c {ScatterDataModifier}, but we added it here
to keep the constructor simpler and the axes configuration near the data.
Next we create a data array:
- \snippet ../examples/scatter/scatterdatamodifier.cpp 5
+ \snippet scatter/scatterdatamodifier.cpp 5
and populate it:
- \snippet ../examples/scatter/scatterdatamodifier.cpp 6
+ \snippet scatter/scatterdatamodifier.cpp 6
Finally we tell the proxy to start using the data we gave it:
- \snippet ../examples/scatter/scatterdatamodifier.cpp 7
+ \snippet scatter/scatterdatamodifier.cpp 7
Now our graph has the data and is ready to be used. There isn't much interaction yet, though,
so let's continue by adding some widgets to play with.
@@ -119,19 +114,19 @@
First, back in the application main, we'll create some widgets:
- \snippet ../examples/scatter/main.cpp 4
+ \snippet scatter/main.cpp 4
And add them to the vertical layout we created earlier:
- \snippet ../examples/scatter/main.cpp 5
+ \snippet scatter/main.cpp 5
Now, let's connect them to methods in ScatterDataModifier:
- \snippet ../examples/scatter/main.cpp 6
+ \snippet scatter/main.cpp 6
Here are the methods in ScatterDataModifier the signals were connected to:
- \snippet ../examples/scatter/scatterdatamodifier.cpp 8
+ \snippet scatter/scatterdatamodifier.cpp 8
And so we have an application in which we can control:
diff --git a/examples/scatter/main.cpp b/examples/datavisualization/scatter/main.cpp
index dc71667f..21530b82 100644
--- a/examples/scatter/main.cpp
+++ b/examples/datavisualization/scatter/main.cpp
@@ -18,17 +18,17 @@
#include "scatterdatamodifier.h"
-#include <QApplication>
-#include <QWidget>
-#include <QHBoxLayout>
-#include <QVBoxLayout>
-#include <QPushButton>
-#include <QCheckBox>
-#include <QComboBox>
-#include <QFontComboBox>
-#include <QLabel>
-#include <QScreen>
-#include <QFontDatabase>
+#include <QtWidgets/QApplication>
+#include <QtWidgets/QWidget>
+#include <QtWidgets/QHBoxLayout>
+#include <QtWidgets/QVBoxLayout>
+#include <QtWidgets/QPushButton>
+#include <QtWidgets/QCheckBox>
+#include <QtWidgets/QComboBox>
+#include <QtWidgets/QFontComboBox>
+#include <QtWidgets/QLabel>
+#include <QtGui/QScreen>
+#include <QtGui/QFontDatabase>
int main(int argc, char **argv)
{
@@ -83,6 +83,9 @@ int main(int argc, char **argv)
QPushButton *cameraButton = new QPushButton(widget);
cameraButton->setText(QStringLiteral("Change camera preset"));
+ QPushButton *itemCountButton = new QPushButton(widget);
+ itemCountButton->setText(QStringLiteral("Toggle item count"));
+
QCheckBox *backgroundCheckBox = new QCheckBox(widget);
backgroundCheckBox->setText(QStringLiteral("Show background"));
backgroundCheckBox->setChecked(true);
@@ -108,6 +111,7 @@ int main(int argc, char **argv)
//! [5]
vLayout->addWidget(labelButton, 0, Qt::AlignTop);
vLayout->addWidget(cameraButton, 0, Qt::AlignTop);
+ vLayout->addWidget(itemCountButton, 0, Qt::AlignTop);
vLayout->addWidget(backgroundCheckBox);
vLayout->addWidget(gridCheckBox);
vLayout->addWidget(smoothCheckBox, 0, Qt::AlignTop);
@@ -130,6 +134,8 @@ int main(int argc, char **argv)
&ScatterDataModifier::changePresetCamera);
QObject::connect(labelButton, &QPushButton::clicked, modifier,
&ScatterDataModifier::changeLabelStyle);
+ QObject::connect(itemCountButton, &QPushButton::clicked, modifier,
+ &ScatterDataModifier::toggleItemCount);
QObject::connect(backgroundCheckBox, &QCheckBox::stateChanged, modifier,
&ScatterDataModifier::setBackgroundEnabled);
diff --git a/examples/scatter/scatter.pro b/examples/datavisualization/scatter/scatter.pro
index beff2164..7f676caa 100644
--- a/examples/scatter/scatter.pro
+++ b/examples/datavisualization/scatter/scatter.pro
@@ -7,7 +7,5 @@ HEADERS += scatterdatamodifier.h
QT += widgets
-INSTALLS += target
-
OTHER_FILES += doc/src/* \
doc/images/*
diff --git a/examples/scatter/scatterdatamodifier.cpp b/examples/datavisualization/scatter/scatterdatamodifier.cpp
index db2426ce..b38c043e 100644
--- a/examples/scatter/scatterdatamodifier.cpp
+++ b/examples/datavisualization/scatter/scatterdatamodifier.cpp
@@ -23,20 +23,25 @@
#include <QtDataVisualization/q3dcamera.h>
#include <QtDataVisualization/qscatter3dseries.h>
#include <QtDataVisualization/q3dtheme.h>
-#include <qmath.h>
-#include <QComboBox>
+#include <QtCore/qmath.h>
+#include <QtWidgets/QComboBox>
using namespace QtDataVisualization;
//#define RANDOM_SCATTER // Uncomment this to switch to random scatter
const int numberOfItems = 3600;
+const float curveDivider = 3.0f;
+const int lowerNumberOfItems = 900;
+const float lowerCurveDivider = 0.75f;
ScatterDataModifier::ScatterDataModifier(Q3DScatter *scatter)
: m_graph(scatter),
m_fontSize(40.0f),
m_style(QAbstract3DSeries::MeshSphere),
- m_smooth(true)
+ m_smooth(true),
+ m_itemCount(lowerNumberOfItems),
+ m_curveDivider(lowerCurveDivider)
{
//! [0]
m_graph->activeTheme()->setType(Q3DTheme::ThemeEbony);
@@ -47,12 +52,6 @@ ScatterDataModifier::ScatterDataModifier(Q3DScatter *scatter)
m_graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetFront);
//! [0]
- //! [1]
- m_graph->setAxisX(new QValue3DAxis);
- m_graph->setAxisY(new QValue3DAxis);
- m_graph->setAxisZ(new QValue3DAxis);
- //! [1]
-
//! [2]
QScatterDataProxy *proxy = new QScatterDataProxy;
QScatter3DSeries *series = new QScatter3DSeries(proxy);
@@ -78,28 +77,27 @@ void ScatterDataModifier::addData()
m_graph->axisX()->setTitle("X");
m_graph->axisY()->setTitle("Y");
m_graph->axisZ()->setTitle("Z");
- m_graph->axisX()->setRange(-30.0f, 30.0f);
- m_graph->axisY()->setRange(-1.0f, 1.0f);
- m_graph->axisZ()->setRange(-30.0f, 30.0f);
//! [4]
//! [5]
QScatterDataArray *dataArray = new QScatterDataArray;
- dataArray->resize(numberOfItems);
+ dataArray->resize(m_itemCount);
QScatterDataItem *ptrToDataArray = &dataArray->first();
//! [5]
#ifdef RANDOM_SCATTER
- for (int i = 0; i < numberOfItems; i++) {
+ for (int i = 0; i < m_itemCount; i++) {
ptrToDataArray->setPosition(randVector());
ptrToDataArray++;
}
#else
//! [6]
- float limit = qSqrt(numberOfItems) / 2.0f;
+ float limit = qSqrt(m_itemCount) / 2.0f;
for (float i = -limit; i < limit; i++) {
for (float j = -limit; j < limit; j++) {
- ptrToDataArray->setPosition(QVector3D(i, qCos(qDegreesToRadians((i * j) / 3.0f)), j));
+ ptrToDataArray->setPosition(QVector3D(i + 0.5f,
+ qCos(qDegreesToRadians((i * j) / m_curveDivider)),
+ j + 0.5f));
ptrToDataArray++;
}
}
@@ -183,6 +181,19 @@ void ScatterDataModifier::setGridEnabled(int enabled)
}
//! [8]
+void ScatterDataModifier::toggleItemCount()
+{
+ if (m_itemCount == numberOfItems) {
+ m_itemCount = lowerNumberOfItems;
+ m_curveDivider = lowerCurveDivider;
+ } else {
+ m_itemCount = numberOfItems;
+ m_curveDivider = curveDivider;
+ }
+ m_graph->seriesList().at(0)->dataProxy()->resetArray(0);
+ addData();
+}
+
QVector3D ScatterDataModifier::randVector()
{
return QVector3D(
diff --git a/examples/scatter/scatterdatamodifier.h b/examples/datavisualization/scatter/scatterdatamodifier.h
index e22f24c7..7cfe7ff8 100644
--- a/examples/scatter/scatterdatamodifier.h
+++ b/examples/datavisualization/scatter/scatterdatamodifier.h
@@ -41,6 +41,7 @@ public:
void setBackgroundEnabled(int enabled);
void setGridEnabled(int enabled);
void setSmoothDots(int smooth);
+ void toggleItemCount();
void start();
public slots:
@@ -61,6 +62,8 @@ private:
int m_fontSize;
QAbstract3DSeries::Mesh m_style;
bool m_smooth;
+ int m_itemCount;
+ float m_curveDivider;
};
#endif
diff --git a/examples/surface/doc/images/surface-example.png b/examples/datavisualization/surface/doc/images/surface-example.png
index c323df78..c323df78 100644
--- a/examples/surface/doc/images/surface-example.png
+++ b/examples/datavisualization/surface/doc/images/surface-example.png
Binary files differ
diff --git a/examples/surface/doc/src/surface.qdoc b/examples/datavisualization/surface/doc/src/surface.qdoc
index 4b0ec63d..14a04668 100644
--- a/examples/surface/doc/src/surface.qdoc
+++ b/examples/datavisualization/surface/doc/src/surface.qdoc
@@ -44,7 +44,7 @@
First, in \c main.cpp, we create a QApplication, instantiate Q3DSurface, and a window container
for it:
- \snippet ../examples/surface/main.cpp 0
+ \snippet surface/main.cpp 0
The call to QWidget::createWindowContainer is required, as all data visualization types
(Q3DBars, Q3DScatter, and Q3DSurface) inherit QWindow. Any class inheriting QWindow cannot be used
@@ -53,7 +53,7 @@
Then we'll create horizontal and vertical layouts. We'll add the graph with the container and
the vertical layout into the horizontal one:
- \snippet ../examples/surface/main.cpp 1
+ \snippet surface/main.cpp 1
The rest of the code in \c main.cpp is creating control widgets for features in Q3DSurface. We
have separated code for changing these features into \c surfacegraph.cpp and only connect
@@ -64,13 +64,13 @@
First we instantiate a new QSurfaceDataProxy and attach it to a new QSurface3DSeries:
- \snippet ../examples/surface/surfacegraph.cpp 0
+ \snippet surface/surfacegraph.cpp 0
- Then we fill the proxy with a simple square root and sin wave data. This is done by
+ Then we fill the proxy with a simple square root and sine wave data. This is done by
creating a new \c QSurfaceDataArray instance and adding \c QSurfaceDataRow elements to it.
- The created \c QSurfaceDataArray is set to be a the data array for the QSurfaceDataProxy.
+ The created \c QSurfaceDataArray is set to be the data array for the QSurfaceDataProxy.
- \snippet ../examples/surface/surfacegraph.cpp 1
+ \snippet surface/surfacegraph.cpp 1
The height map is created by instantiating a QHeightMapSurfaceDataProxy with
a QImage containing the height data. The method QHeightMapSurfaceDataProxy::setValueRanges() is
@@ -78,27 +78,23 @@
34.0\unicode 0x00B0 N - 40.0\unicode 0x00B0 N and 18.0\unicode 0x00B0 E - 24.0\unicode 0x00B0 E.
These values are used to show and position the map to the axis.
- \snippet ../examples/surface/surfacegraph.cpp 2
+ \snippet surface/surfacegraph.cpp 2
For demonstrating different proxies this example has two radio buttons which
the user can use to switch between the series. When the user selects the
\c {Sqrt & Sin} radio button, the selected series is activated with the following
code. First we set the decorative issues like enable the grid for the surface and
select the flat shading mode. Next lines define the axis label format and value
- ranges. The Y-value value of the function we use to generate the points varies between
- 0.0 and 2.0, but no individual point actually hits exactly those, so we set the Y-axis range
- explicitly. The other axes we are happy to leave to automatically adjust their range to the
- data, which is the default behavior. Finally we make sure the correct series is added to the
- graph. We need to first remove the other series, since surface graphs only support a single
- series at a time:
+ ranges. Finally we make sure the correct series is added to the
+ graph:
- \snippet ../examples/surface/surfacegraph.cpp 3
+ \snippet surface/surfacegraph.cpp 3
When the \c{Height Map} radio button is activated, the following code sets the correct series active.
The axis label format is set to show N and E letters and ranges are set to the imaginary coordinates.
Auto adjusting Y-axis range is fine for our height map surface, so we ensure it is set.
- \snippet ../examples/surface/surfacegraph.cpp 4
+ \snippet surface/surfacegraph.cpp 4
\section1 Selection modes
@@ -106,7 +102,7 @@
example with radio buttons, which the user can use to activate a suitable selection mode.
The following inline methods are connected to radio buttons to activate the selected mode.
- \snippet ../examples/surface/surfacegraph.h 0
+ \snippet surface/surfacegraph.h 0
\section1 Axis ranges for studying the graph
@@ -114,11 +110,11 @@
axis. When selecting the proxy these sliders are adjusted so that one step on the slider
moves the range by one segment step:
- \snippet ../examples/surface/surfacegraph.cpp 8
+ \snippet surface/surfacegraph.cpp 8
The ranges are set for the axes like this:
- \snippet ../examples/surface/surfacegraph.cpp 5
+ \snippet surface/surfacegraph.cpp 5
\section1 Themes
@@ -127,7 +123,7 @@
menu to activate the selected theme. The theme type is changed to another predefined theme,
which overwrites all theme properties to predefined values:
- \snippet ../examples/surface/surfacegraph.cpp 6
+ \snippet surface/surfacegraph.cpp 6
\section1 Custom surface gradients
@@ -136,5 +132,5 @@
code shows how to create an example gradient and set it to the series. Note that you also need
to change the color style to Q3DTheme::ColorStyleRangeGradient to actually use the gradient.
- \snippet ../examples/surface/surfacegraph.cpp 7
+ \snippet surface/surfacegraph.cpp 7
*/
diff --git a/examples/surface/main.cpp b/examples/datavisualization/surface/main.cpp
index 4e82eca8..4db614e6 100644
--- a/examples/surface/main.cpp
+++ b/examples/datavisualization/surface/main.cpp
@@ -29,6 +29,7 @@
#include <QtWidgets/QComboBox>
#include <QtWidgets/QLabel>
#include <QtGui/QPainter>
+#include <QtGui/QScreen>
int main(int argc, char **argv)
{
diff --git a/examples/datavisualization/surface/mountain.png b/examples/datavisualization/surface/mountain.png
new file mode 100644
index 00000000..9138c710
--- /dev/null
+++ b/examples/datavisualization/surface/mountain.png
Binary files differ
diff --git a/examples/surface/surface.pro b/examples/datavisualization/surface/surface.pro
index 20c8a1a8..2858f875 100644
--- a/examples/surface/surface.pro
+++ b/examples/datavisualization/surface/surface.pro
@@ -9,8 +9,6 @@ HEADERS += surfacegraph.h
QT += widgets
-INSTALLS += target
-
RESOURCES += surface.qrc
OTHER_FILES += doc/src/* \
diff --git a/examples/surface/surface.qrc b/examples/datavisualization/surface/surface.qrc
index e4a7c38b..e4a7c38b 100644
--- a/examples/surface/surface.qrc
+++ b/examples/datavisualization/surface/surface.qrc
diff --git a/examples/surface/surfacegraph.cpp b/examples/datavisualization/surface/surfacegraph.cpp
index 5dd64c1f..d7524fbc 100644
--- a/examples/surface/surfacegraph.cpp
+++ b/examples/datavisualization/surface/surfacegraph.cpp
@@ -136,6 +136,10 @@ void SurfaceGraph::enableHeightMapModel(bool enable)
m_graph->axisY()->setAutoAdjustRange(true);
m_graph->axisZ()->setRange(18.0f, 24.0f);
+ m_graph->axisX()->setTitle(QStringLiteral("Latitude"));
+ m_graph->axisY()->setTitle(QStringLiteral("Height"));
+ m_graph->axisZ()->setTitle(QStringLiteral("Longitude"));
+
m_graph->removeSeries(m_sqrtSinSeries);
m_graph->addSeries(m_heightMapSeries);
//! [4]
diff --git a/examples/surface/surfacegraph.h b/examples/datavisualization/surface/surfacegraph.h
index 8047be11..8047be11 100644
--- a/examples/surface/surfacegraph.h
+++ b/examples/datavisualization/surface/surfacegraph.h
diff --git a/examples/examples.pri b/examples/examples.pri
deleted file mode 100644
index 046d6cd1..00000000
--- a/examples/examples.pri
+++ /dev/null
@@ -1,111 +0,0 @@
-android {
- target.path = /libs/$$ANDROID_TARGET_ARCH
-} else {
- target.path = $$[QT_INSTALL_EXAMPLES]/datavisualization/$$TARGET
-}
-
-win32 {
- CONFIG(debug, release|debug):DESTDIR = $$OUT_PWD/debug
- CONFIG(release, release|debug):DESTDIR = $$OUT_PWD/release
-} else {
- DESTDIR = $$OUT_PWD
-}
-
-INCLUDEPATH += ../../include
-
-LIBS += -L$$OUT_PWD/../../lib
-
-TEMPLATE = app
-
-QT += datavisualization
-
-!static:android {
- # Add Qt library to be loaded in shared android build
- vis_lib_name = DataVisualization
- vis_src_lib = lib$${vis_lib_name}.so
- vis_lib_dir = $$OUT_PWD/../../lib/$$vis_src_lib
- ANDROID_EXTRA_LIBS = $$vis_lib_dir
-}
-
-contains(TARGET, qml.*) {
- uri = QtDataVisualization
- lib_name = datavisualizationqml2
-
- uri_replaced = $$replace(uri, \\., $$QMAKE_DIR_SEP)
- make_qmldir_path = $$DESTDIR/$$uri_replaced
- !exists($$make_qmldir_path) {
- make_qmldir_target = \"$$replace(make_qmldir_path, /, $$QMAKE_DIR_SEP)\"
- system($$QMAKE_MKDIR $$make_qmldir_target)
- }
- copy_qmldir.target = $$make_qmldir_path/qmldir
- copy_qmldir.depends = $$_PRO_FILE_PWD_/../../src/$$lib_name/qmldir
- copy_qmldir_formatted = \"$$replace(copy_qmldir.depends, /, $$QMAKE_DIR_SEP)\" \"$$replace(copy_qmldir.target, /, $$QMAKE_DIR_SEP)\"
- copy_qmldir.commands = $(COPY_FILE) $$copy_qmldir_formatted
- QMAKE_EXTRA_TARGETS += copy_qmldir
- PRE_TARGETDEPS += $$copy_qmldir.target
-
- static:contains(QT_CONFIG, static) {
- # Make import scan find our copied qmldir & statically built qml lib
- !win32 {
- LIB_EXTENSION = a
- } else {
- LIB_EXTENSION = lib
- }
- QMLPATHS += $$DESTDIR
- # We need to copy the qmldir & lib already at qmake run stage as import scan is done then
- exists($$copy_qmldir.depends): system($$QMAKE_COPY $$copy_qmldir_formatted)
- } else {
- win32 {
- LIB_EXTENSION = dll
- } else {
- mac|ios {
- LIB_EXTENSION = dylib
- } else {
- LIB_EXTENSION = so
- }
- }
- }
-
- win32 {
- CONFIG(debug, release|debug) {
- src_dir = /debug
- src_lib = $${lib_name}d.$$LIB_EXTENSION
- }
- CONFIG(release, release|debug){
- src_dir = /release
- src_lib = $${lib_name}.$$LIB_EXTENSION
- }
- } else {
- src_dir =
- mac|ios {
- CONFIG(debug, release|debug) {
- src_lib = lib$${lib_name}_debug.$$LIB_EXTENSION
- }
- CONFIG(release, release|debug){
- src_lib = lib$${lib_name}.$$LIB_EXTENSION
- }
- } else {
- # linux, android
- src_lib = lib$${lib_name}.$$LIB_EXTENSION
- }
- }
- copy_lib.target = $$make_qmldir_path/$$src_lib
- copy_lib.depends = $$OUT_PWD/../../src/$$lib_name$$src_dir/$$src_lib
- copy_lib_formatted = \"$$replace(copy_lib.depends, /, $$QMAKE_DIR_SEP)\" \"$$replace(copy_lib.target, /, $$QMAKE_DIR_SEP)\"
- copy_lib.commands = $(COPY_FILE) $$copy_lib_formatted
- QMAKE_EXTRA_TARGETS += copy_lib
- PRE_TARGETDEPS += $$copy_lib.target
-
- android {
- system($$QMAKE_COPY $$copy_qmldir_formatted)
- android_qmldir.files = $$copy_qmldir.target
- android_qmldir.path = /assets/qml/$$uri_replaced
- INSTALLS += android_qmldir
- }
- android|ios {
- system($$QMAKE_COPY $$copy_lib_formatted)
- android_qmlplugin.files = $$copy_lib.target
- android_qmlplugin.path = $$target.path
- INSTALLS += android_qmlplugin
- }
-}
diff --git a/examples/examples.pro b/examples/examples.pro
index 4dd3edef..6d79e543 100644
--- a/examples/examples.pro
+++ b/examples/examples.pro
@@ -1,18 +1,2 @@
TEMPLATE = subdirs
-SUBDIRS += qmlbars \
- qmlscatter \
- qmlsurface \
- qmlcustominput \
- qmllegend \
- qmlmultigraph
-
-!android:!ios {
- SUBDIRS += bars \
- custominput \
- customproxy \
- itemmodel \
- scatter \
- surface
-}
-
-qtHaveModule(multimedia):!android: SUBDIRS += audiolevels
+SUBDIRS += datavisualization
diff --git a/examples/qmlbars/qmlbars.desktop b/examples/qmlbars/qmlbars.desktop
deleted file mode 100644
index cf59c6b8..00000000
--- a/examples/qmlbars/qmlbars.desktop
+++ /dev/null
@@ -1,11 +0,0 @@
-[Desktop Entry]
-Encoding=UTF-8
-Version=1.0
-Type=Application
-Terminal=false
-Name=qmlbars
-Exec=/opt/qmlbars/bin/qmlbars
-Icon=qmlbars64
-X-Window-Icon=
-X-HildonDesk-ShowInToolbar=true
-X-Osso-Type=application/x-executable
diff --git a/examples/qmlbars/qmlbars.pro b/examples/qmlbars/qmlbars.pro
deleted file mode 100644
index 758e7b76..00000000
--- a/examples/qmlbars/qmlbars.pro
+++ /dev/null
@@ -1,25 +0,0 @@
-!include( ../examples.pri ) {
- error( "Couldn't find the examples.pri file!" )
-}
-
-QT += widgets
-
-# Add more folders to ship with the application, here
-folder_01.source = qml/qmlbars
-folder_01.target = qml
-DEPLOYMENTFOLDERS = folder_01
-
-# Additional import path used to resolve QML modules in Creator's code model
-QML_IMPORT_PATH =
-
-# The .cpp file which was generated for your project. Feel free to hack it.
-SOURCES += main.cpp
-
-# Please do not modify the following two lines. Required for deployment.
-include(qtquick2applicationviewer/qtquick2applicationviewer.pri)
-qtcAddDeployment()
-
-RESOURCES += qmlbars.qrc
-
-OTHER_FILES += doc/src/* \
- doc/images/*
diff --git a/examples/qmlbars/qmlbars.qrc b/examples/qmlbars/qmlbars.qrc
deleted file mode 100644
index 7c291fd3..00000000
--- a/examples/qmlbars/qmlbars.qrc
+++ /dev/null
@@ -1,7 +0,0 @@
-<RCC>
- <qresource prefix="/qml">
- <file alias="Axes.qml">qml/qmlbars/axes.qml</file>
- <file alias="Data.qml">qml/qmlbars/data.qml</file>
- <file alias="main.qml">qml/qmlbars/main.qml</file>
- </qresource>
-</RCC>
diff --git a/examples/qmlbars/qmlbars64.png b/examples/qmlbars/qmlbars64.png
deleted file mode 100644
index 707d5c4e..00000000
--- a/examples/qmlbars/qmlbars64.png
+++ /dev/null
Binary files differ
diff --git a/examples/qmlbars/qtquick2applicationviewer/qtquick2applicationviewer.cpp b/examples/qmlbars/qtquick2applicationviewer/qtquick2applicationviewer.cpp
deleted file mode 100644
index 10709d7a..00000000
--- a/examples/qmlbars/qtquick2applicationviewer/qtquick2applicationviewer.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-// checksum 0x4f6f version 0x90005
-/*
- This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
- QtQuick2ApplicationViewer is a convenience class containing mobile device specific
- code such as screen orientation handling. Also QML paths and debugging are
- handled here.
- It is recommended not to modify this file, since newer versions of Qt Creator
- may offer an updated version of it.
-*/
-
-#include "qtquick2applicationviewer.h"
-
-#include <QtCore/QCoreApplication>
-#include <QtCore/QDir>
-#include <QtQml/QQmlEngine>
-
-class QtQuick2ApplicationViewerPrivate
-{
- QString mainQmlFile;
- friend class QtQuick2ApplicationViewer;
- static QString adjustPath(const QString &path);
-};
-
-QString QtQuick2ApplicationViewerPrivate::adjustPath(const QString &path)
-{
-#if defined(Q_OS_MAC)
- if (!QDir::isAbsolutePath(path))
- return QString::fromLatin1("%1/../Resources/%2")
- .arg(QCoreApplication::applicationDirPath(), path);
-#elif defined(Q_OS_BLACKBERRY)
- if (!QDir::isAbsolutePath(path))
- return QString::fromLatin1("app/native/%1").arg(path);
-#elif !defined(Q_OS_ANDROID)
- QString pathInInstallDir =
- QString::fromLatin1("%1/../%2").arg(QCoreApplication::applicationDirPath(), path);
- if (QFileInfo(pathInInstallDir).exists())
- return pathInInstallDir;
- pathInInstallDir =
- QString::fromLatin1("%1/%2").arg(QCoreApplication::applicationDirPath(), path);
- if (QFileInfo(pathInInstallDir).exists())
- return pathInInstallDir;
-#endif
- return path;
-}
-
-QtQuick2ApplicationViewer::QtQuick2ApplicationViewer(QWindow *parent)
- : QQuickView(parent)
- , d(new QtQuick2ApplicationViewerPrivate())
-{
- connect(engine(), SIGNAL(quit()), SLOT(close()));
- setResizeMode(QQuickView::SizeRootObjectToView);
-}
-
-QtQuick2ApplicationViewer::~QtQuick2ApplicationViewer()
-{
- delete d;
-}
-
-void QtQuick2ApplicationViewer::setMainQmlFile(const QString &file)
-{
- d->mainQmlFile = QtQuick2ApplicationViewerPrivate::adjustPath(file);
-#ifdef Q_OS_ANDROID
- setSource(QUrl(QLatin1String("assets:/")+d->mainQmlFile));
-#else
- setSource(QUrl::fromLocalFile(d->mainQmlFile));
-#endif
-}
-
-void QtQuick2ApplicationViewer::addImportPath(const QString &path)
-{
- engine()->addImportPath(QtQuick2ApplicationViewerPrivate::adjustPath(path));
-}
-
-void QtQuick2ApplicationViewer::showExpanded()
-{
-#if defined(Q_WS_SIMULATOR) || defined(Q_OS_QNX)
- showFullScreen();
-#else
- show();
-#endif
-}
diff --git a/examples/qmlbars/qtquick2applicationviewer/qtquick2applicationviewer.h b/examples/qmlbars/qtquick2applicationviewer/qtquick2applicationviewer.h
deleted file mode 100644
index cf66f140..00000000
--- a/examples/qmlbars/qtquick2applicationviewer/qtquick2applicationviewer.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// checksum 0xfde6 version 0x90005
-/*
- This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
- QtQuick2ApplicationViewer is a convenience class containing mobile device specific
- code such as screen orientation handling. Also QML paths and debugging are
- handled here.
- It is recommended not to modify this file, since newer versions of Qt Creator
- may offer an updated version of it.
-*/
-
-#ifndef QTQUICK2APPLICATIONVIEWER_H
-#define QTQUICK2APPLICATIONVIEWER_H
-
-#include <QtQuick/QQuickView>
-
-class QtQuick2ApplicationViewer : public QQuickView
-{
- Q_OBJECT
-
-public:
- explicit QtQuick2ApplicationViewer(QWindow *parent = 0);
- virtual ~QtQuick2ApplicationViewer();
-
- void setMainQmlFile(const QString &file);
- void addImportPath(const QString &path);
-
- void showExpanded();
-
-private:
- class QtQuick2ApplicationViewerPrivate *d;
-};
-
-#endif // QTQUICK2APPLICATIONVIEWER_H
diff --git a/examples/qmlbars/qtquick2applicationviewer/qtquick2applicationviewer.pri b/examples/qmlbars/qtquick2applicationviewer/qtquick2applicationviewer.pri
deleted file mode 100644
index e5f7990f..00000000
--- a/examples/qmlbars/qtquick2applicationviewer/qtquick2applicationviewer.pri
+++ /dev/null
@@ -1,180 +0,0 @@
-# checksum 0x7b0d version 0x90005
-# This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
-# The code below adds the QtQuick2ApplicationViewer to the project and handles
-# the activation of QML debugging.
-# It is recommended not to modify this file, since newer versions of Qt Creator
-# may offer an updated version of it.
-
-QT += qml quick
-
-SOURCES += $$PWD/qtquick2applicationviewer.cpp
-HEADERS += $$PWD/qtquick2applicationviewer.h
-INCLUDEPATH += $$PWD
-# This file was generated by an application wizard of Qt Creator.
-# The code below handles deployment to Android and Maemo, aswell as copying
-# of the application data to shadow build directories on desktop.
-# It is recommended not to modify this file, since newer versions of Qt Creator
-# may offer an updated version of it.
-
-defineTest(qtcAddDeployment) {
-for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- greaterThan(QT_MAJOR_VERSION, 4) {
- itemsources = $${item}.files
- } else {
- itemsources = $${item}.sources
- }
- $$itemsources = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath= $$eval($${deploymentfolder}.target)
- export($$itemsources)
- export($$itempath)
- DEPLOYMENT += $$item
-}
-
-MAINPROFILEPWD = $$PWD
-
-android-no-sdk {
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- itemfiles = $${item}.files
- $$itemfiles = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath = /data/user/qt/$$eval($${deploymentfolder}.target)
- export($$itemfiles)
- export($$itempath)
- INSTALLS += $$item
- }
-
- target.path = /data/user/qt
-
- export(target.path)
- INSTALLS += target
-} else:android {
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- itemfiles = $${item}.files
- $$itemfiles = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath = /assets/$$eval($${deploymentfolder}.target)
- export($$itemfiles)
- export($$itempath)
- INSTALLS += $$item
- }
-
- x86 {
- target.path = /libs/x86
- } else: armeabi-v7a {
- target.path = /libs/armeabi-v7a
- } else {
- target.path = /libs/armeabi
- }
-
- export(target.path)
- INSTALLS += target
-} else:win32 {
- copyCommand =
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
- source = $$replace(source, /, \\)
- sourcePathSegments = $$split(source, \\)
- target = $$OUT_PWD/$$eval($${deploymentfolder}.target)/$$last(sourcePathSegments)
- target = $$replace(target, /, \\)
- target ~= s,\\\\\\.?\\\\,\\,
- !isEqual(source,$$target) {
- !isEmpty(copyCommand):copyCommand += &&
- isEqual(QMAKE_DIR_SEP, \\) {
- copyCommand += $(COPY_DIR) \"$$source\" \"$$target\"
- } else {
- source = $$replace(source, \\\\, /)
- target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
- target = $$replace(target, \\\\, /)
- copyCommand += test -d \"$$target\" || mkdir -p \"$$target\" && cp -r \"$$source\" \"$$target\"
- }
- }
- }
- !isEmpty(copyCommand) {
- copyCommand = @echo Copying application data... && $$copyCommand
- copydeploymentfolders.commands = $$copyCommand
- first.depends = $(first) copydeploymentfolders
- export(first.depends)
- export(copydeploymentfolders.commands)
- QMAKE_EXTRA_TARGETS += first copydeploymentfolders
- }
-} else:unix {
- maemo5 {
- desktopfile.files = $${TARGET}.desktop
- desktopfile.path = /usr/share/applications/hildon
- icon.files = $${TARGET}64.png
- icon.path = /usr/share/icons/hicolor/64x64/apps
- } else:!isEmpty(MEEGO_VERSION_MAJOR) {
- desktopfile.files = $${TARGET}_harmattan.desktop
- desktopfile.path = /usr/share/applications
- icon.files = $${TARGET}80.png
- icon.path = /usr/share/icons/hicolor/80x80/apps
- } else { # Assumed to be a Desktop Unix
- copyCommand =
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
- source = $$replace(source, \\\\, /)
- macx {
- target = $$OUT_PWD/$${TARGET}.app/Contents/Resources/$$eval($${deploymentfolder}.target)
- } else {
- target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
- }
- target = $$replace(target, \\\\, /)
- sourcePathSegments = $$split(source, /)
- targetFullPath = $$target/$$last(sourcePathSegments)
- targetFullPath ~= s,/\\.?/,/,
- !isEqual(source,$$targetFullPath) {
- !isEmpty(copyCommand):copyCommand += &&
- copyCommand += $(MKDIR) \"$$target\"
- copyCommand += && $(COPY_DIR) \"$$source\" \"$$target\"
- }
- }
- !isEmpty(copyCommand) {
- copyCommand = @echo Copying application data... && $$copyCommand
- copydeploymentfolders.commands = $$copyCommand
- first.depends = $(first) copydeploymentfolders
- export(first.depends)
- export(copydeploymentfolders.commands)
- QMAKE_EXTRA_TARGETS += first copydeploymentfolders
- }
- }
- !isEmpty(target.path) {
- installPrefix = $${target.path}
- } else {
- installPrefix = /opt/$${TARGET}
- }
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- itemfiles = $${item}.files
- $$itemfiles = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath = $${installPrefix}/$$eval($${deploymentfolder}.target)
- export($$itemfiles)
- export($$itempath)
- INSTALLS += $$item
- }
-
- !isEmpty(desktopfile.path) {
- export(icon.files)
- export(icon.path)
- export(desktopfile.files)
- export(desktopfile.path)
- INSTALLS += icon desktopfile
- }
-
- isEmpty(target.path) {
- target.path = $${installPrefix}/bin
- export(target.path)
- }
- INSTALLS += target
-}
-
-export (ICON)
-export (INSTALLS)
-export (DEPLOYMENT)
-export (LIBS)
-export (QMAKE_EXTRA_TARGETS)
-}
diff --git a/examples/qmlcustominput/doc/images/qmlcustominput-example.png b/examples/qmlcustominput/doc/images/qmlcustominput-example.png
deleted file mode 100644
index 1de740ea..00000000
--- a/examples/qmlcustominput/doc/images/qmlcustominput-example.png
+++ /dev/null
Binary files differ
diff --git a/examples/qmlcustominput/qmlcustominput.desktop b/examples/qmlcustominput/qmlcustominput.desktop
deleted file mode 100644
index 536f87a9..00000000
--- a/examples/qmlcustominput/qmlcustominput.desktop
+++ /dev/null
@@ -1,11 +0,0 @@
-[Desktop Entry]
-Encoding=UTF-8
-Version=1.0
-Type=Application
-Terminal=false
-Name=qmlcustominput
-Exec=/opt/qmlcustominput/bin/qmlcustominput
-Icon=qmlcustominput64
-X-Window-Icon=
-X-HildonDesk-ShowInToolbar=true
-X-Osso-Type=application/x-executable
diff --git a/examples/qmlcustominput/qmlcustominput.pro b/examples/qmlcustominput/qmlcustominput.pro
deleted file mode 100644
index c58eff49..00000000
--- a/examples/qmlcustominput/qmlcustominput.pro
+++ /dev/null
@@ -1,26 +0,0 @@
-!include( ../examples.pri ) {
- error( "Couldn't find the examples.pri file!" )
-}
-
-QT += widgets
-
-# Add more folders to ship with the application, here
-folder_01.source = qml/qmlcustominput
-folder_01.target = qml
-DEPLOYMENTFOLDERS = folder_01
-
-# Additional import path used to resolve QML modules in Creator's code model
-QML_IMPORT_PATH =
-
-# The .cpp file which was generated for your project. Feel free to hack it.
-SOURCES += main.cpp
-
-# Please do not modify the following two lines. Required for deployment.
-include(qtquick2applicationviewer/qtquick2applicationviewer.pri)
-qtcAddDeployment()
-
-RESOURCES += \
- qmlcustominput.qrc
-
-OTHER_FILES += doc/src/* \
- doc/images/*
diff --git a/examples/qmlcustominput/qmlcustominput.qrc b/examples/qmlcustominput/qmlcustominput.qrc
deleted file mode 100644
index 5e1ff40c..00000000
--- a/examples/qmlcustominput/qmlcustominput.qrc
+++ /dev/null
@@ -1,7 +0,0 @@
-<RCC>
- <qresource prefix="/qml">
- <file alias="main.qml">qml/qmlcustominput/main.qml</file>
- <file alias="Data.qml">qml/qmlcustominput/data.qml</file>
- <file alias="NewButton.qml">qml/qmlcustominput/newbutton.qml</file>
- </qresource>
-</RCC>
diff --git a/examples/qmlcustominput/qmlcustominput64.png b/examples/qmlcustominput/qmlcustominput64.png
deleted file mode 100644
index 707d5c4e..00000000
--- a/examples/qmlcustominput/qmlcustominput64.png
+++ /dev/null
Binary files differ
diff --git a/examples/qmlcustominput/qmlcustominput80.png b/examples/qmlcustominput/qmlcustominput80.png
deleted file mode 100644
index 6ad8096c..00000000
--- a/examples/qmlcustominput/qmlcustominput80.png
+++ /dev/null
Binary files differ
diff --git a/examples/qmlcustominput/qtquick2applicationviewer/qtquick2applicationviewer.cpp b/examples/qmlcustominput/qtquick2applicationviewer/qtquick2applicationviewer.cpp
deleted file mode 100644
index 10709d7a..00000000
--- a/examples/qmlcustominput/qtquick2applicationviewer/qtquick2applicationviewer.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-// checksum 0x4f6f version 0x90005
-/*
- This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
- QtQuick2ApplicationViewer is a convenience class containing mobile device specific
- code such as screen orientation handling. Also QML paths and debugging are
- handled here.
- It is recommended not to modify this file, since newer versions of Qt Creator
- may offer an updated version of it.
-*/
-
-#include "qtquick2applicationviewer.h"
-
-#include <QtCore/QCoreApplication>
-#include <QtCore/QDir>
-#include <QtQml/QQmlEngine>
-
-class QtQuick2ApplicationViewerPrivate
-{
- QString mainQmlFile;
- friend class QtQuick2ApplicationViewer;
- static QString adjustPath(const QString &path);
-};
-
-QString QtQuick2ApplicationViewerPrivate::adjustPath(const QString &path)
-{
-#if defined(Q_OS_MAC)
- if (!QDir::isAbsolutePath(path))
- return QString::fromLatin1("%1/../Resources/%2")
- .arg(QCoreApplication::applicationDirPath(), path);
-#elif defined(Q_OS_BLACKBERRY)
- if (!QDir::isAbsolutePath(path))
- return QString::fromLatin1("app/native/%1").arg(path);
-#elif !defined(Q_OS_ANDROID)
- QString pathInInstallDir =
- QString::fromLatin1("%1/../%2").arg(QCoreApplication::applicationDirPath(), path);
- if (QFileInfo(pathInInstallDir).exists())
- return pathInInstallDir;
- pathInInstallDir =
- QString::fromLatin1("%1/%2").arg(QCoreApplication::applicationDirPath(), path);
- if (QFileInfo(pathInInstallDir).exists())
- return pathInInstallDir;
-#endif
- return path;
-}
-
-QtQuick2ApplicationViewer::QtQuick2ApplicationViewer(QWindow *parent)
- : QQuickView(parent)
- , d(new QtQuick2ApplicationViewerPrivate())
-{
- connect(engine(), SIGNAL(quit()), SLOT(close()));
- setResizeMode(QQuickView::SizeRootObjectToView);
-}
-
-QtQuick2ApplicationViewer::~QtQuick2ApplicationViewer()
-{
- delete d;
-}
-
-void QtQuick2ApplicationViewer::setMainQmlFile(const QString &file)
-{
- d->mainQmlFile = QtQuick2ApplicationViewerPrivate::adjustPath(file);
-#ifdef Q_OS_ANDROID
- setSource(QUrl(QLatin1String("assets:/")+d->mainQmlFile));
-#else
- setSource(QUrl::fromLocalFile(d->mainQmlFile));
-#endif
-}
-
-void QtQuick2ApplicationViewer::addImportPath(const QString &path)
-{
- engine()->addImportPath(QtQuick2ApplicationViewerPrivate::adjustPath(path));
-}
-
-void QtQuick2ApplicationViewer::showExpanded()
-{
-#if defined(Q_WS_SIMULATOR) || defined(Q_OS_QNX)
- showFullScreen();
-#else
- show();
-#endif
-}
diff --git a/examples/qmlcustominput/qtquick2applicationviewer/qtquick2applicationviewer.h b/examples/qmlcustominput/qtquick2applicationviewer/qtquick2applicationviewer.h
deleted file mode 100644
index cf66f140..00000000
--- a/examples/qmlcustominput/qtquick2applicationviewer/qtquick2applicationviewer.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// checksum 0xfde6 version 0x90005
-/*
- This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
- QtQuick2ApplicationViewer is a convenience class containing mobile device specific
- code such as screen orientation handling. Also QML paths and debugging are
- handled here.
- It is recommended not to modify this file, since newer versions of Qt Creator
- may offer an updated version of it.
-*/
-
-#ifndef QTQUICK2APPLICATIONVIEWER_H
-#define QTQUICK2APPLICATIONVIEWER_H
-
-#include <QtQuick/QQuickView>
-
-class QtQuick2ApplicationViewer : public QQuickView
-{
- Q_OBJECT
-
-public:
- explicit QtQuick2ApplicationViewer(QWindow *parent = 0);
- virtual ~QtQuick2ApplicationViewer();
-
- void setMainQmlFile(const QString &file);
- void addImportPath(const QString &path);
-
- void showExpanded();
-
-private:
- class QtQuick2ApplicationViewerPrivate *d;
-};
-
-#endif // QTQUICK2APPLICATIONVIEWER_H
diff --git a/examples/qmlcustominput/qtquick2applicationviewer/qtquick2applicationviewer.pri b/examples/qmlcustominput/qtquick2applicationviewer/qtquick2applicationviewer.pri
deleted file mode 100644
index e5f7990f..00000000
--- a/examples/qmlcustominput/qtquick2applicationviewer/qtquick2applicationviewer.pri
+++ /dev/null
@@ -1,180 +0,0 @@
-# checksum 0x7b0d version 0x90005
-# This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
-# The code below adds the QtQuick2ApplicationViewer to the project and handles
-# the activation of QML debugging.
-# It is recommended not to modify this file, since newer versions of Qt Creator
-# may offer an updated version of it.
-
-QT += qml quick
-
-SOURCES += $$PWD/qtquick2applicationviewer.cpp
-HEADERS += $$PWD/qtquick2applicationviewer.h
-INCLUDEPATH += $$PWD
-# This file was generated by an application wizard of Qt Creator.
-# The code below handles deployment to Android and Maemo, aswell as copying
-# of the application data to shadow build directories on desktop.
-# It is recommended not to modify this file, since newer versions of Qt Creator
-# may offer an updated version of it.
-
-defineTest(qtcAddDeployment) {
-for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- greaterThan(QT_MAJOR_VERSION, 4) {
- itemsources = $${item}.files
- } else {
- itemsources = $${item}.sources
- }
- $$itemsources = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath= $$eval($${deploymentfolder}.target)
- export($$itemsources)
- export($$itempath)
- DEPLOYMENT += $$item
-}
-
-MAINPROFILEPWD = $$PWD
-
-android-no-sdk {
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- itemfiles = $${item}.files
- $$itemfiles = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath = /data/user/qt/$$eval($${deploymentfolder}.target)
- export($$itemfiles)
- export($$itempath)
- INSTALLS += $$item
- }
-
- target.path = /data/user/qt
-
- export(target.path)
- INSTALLS += target
-} else:android {
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- itemfiles = $${item}.files
- $$itemfiles = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath = /assets/$$eval($${deploymentfolder}.target)
- export($$itemfiles)
- export($$itempath)
- INSTALLS += $$item
- }
-
- x86 {
- target.path = /libs/x86
- } else: armeabi-v7a {
- target.path = /libs/armeabi-v7a
- } else {
- target.path = /libs/armeabi
- }
-
- export(target.path)
- INSTALLS += target
-} else:win32 {
- copyCommand =
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
- source = $$replace(source, /, \\)
- sourcePathSegments = $$split(source, \\)
- target = $$OUT_PWD/$$eval($${deploymentfolder}.target)/$$last(sourcePathSegments)
- target = $$replace(target, /, \\)
- target ~= s,\\\\\\.?\\\\,\\,
- !isEqual(source,$$target) {
- !isEmpty(copyCommand):copyCommand += &&
- isEqual(QMAKE_DIR_SEP, \\) {
- copyCommand += $(COPY_DIR) \"$$source\" \"$$target\"
- } else {
- source = $$replace(source, \\\\, /)
- target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
- target = $$replace(target, \\\\, /)
- copyCommand += test -d \"$$target\" || mkdir -p \"$$target\" && cp -r \"$$source\" \"$$target\"
- }
- }
- }
- !isEmpty(copyCommand) {
- copyCommand = @echo Copying application data... && $$copyCommand
- copydeploymentfolders.commands = $$copyCommand
- first.depends = $(first) copydeploymentfolders
- export(first.depends)
- export(copydeploymentfolders.commands)
- QMAKE_EXTRA_TARGETS += first copydeploymentfolders
- }
-} else:unix {
- maemo5 {
- desktopfile.files = $${TARGET}.desktop
- desktopfile.path = /usr/share/applications/hildon
- icon.files = $${TARGET}64.png
- icon.path = /usr/share/icons/hicolor/64x64/apps
- } else:!isEmpty(MEEGO_VERSION_MAJOR) {
- desktopfile.files = $${TARGET}_harmattan.desktop
- desktopfile.path = /usr/share/applications
- icon.files = $${TARGET}80.png
- icon.path = /usr/share/icons/hicolor/80x80/apps
- } else { # Assumed to be a Desktop Unix
- copyCommand =
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
- source = $$replace(source, \\\\, /)
- macx {
- target = $$OUT_PWD/$${TARGET}.app/Contents/Resources/$$eval($${deploymentfolder}.target)
- } else {
- target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
- }
- target = $$replace(target, \\\\, /)
- sourcePathSegments = $$split(source, /)
- targetFullPath = $$target/$$last(sourcePathSegments)
- targetFullPath ~= s,/\\.?/,/,
- !isEqual(source,$$targetFullPath) {
- !isEmpty(copyCommand):copyCommand += &&
- copyCommand += $(MKDIR) \"$$target\"
- copyCommand += && $(COPY_DIR) \"$$source\" \"$$target\"
- }
- }
- !isEmpty(copyCommand) {
- copyCommand = @echo Copying application data... && $$copyCommand
- copydeploymentfolders.commands = $$copyCommand
- first.depends = $(first) copydeploymentfolders
- export(first.depends)
- export(copydeploymentfolders.commands)
- QMAKE_EXTRA_TARGETS += first copydeploymentfolders
- }
- }
- !isEmpty(target.path) {
- installPrefix = $${target.path}
- } else {
- installPrefix = /opt/$${TARGET}
- }
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- itemfiles = $${item}.files
- $$itemfiles = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath = $${installPrefix}/$$eval($${deploymentfolder}.target)
- export($$itemfiles)
- export($$itempath)
- INSTALLS += $$item
- }
-
- !isEmpty(desktopfile.path) {
- export(icon.files)
- export(icon.path)
- export(desktopfile.files)
- export(desktopfile.path)
- INSTALLS += icon desktopfile
- }
-
- isEmpty(target.path) {
- target.path = $${installPrefix}/bin
- export(target.path)
- }
- INSTALLS += target
-}
-
-export (ICON)
-export (INSTALLS)
-export (DEPLOYMENT)
-export (LIBS)
-export (QMAKE_EXTRA_TARGETS)
-}
diff --git a/examples/qmllegend/qmllegend.desktop b/examples/qmllegend/qmllegend.desktop
deleted file mode 100644
index 6ad68edd..00000000
--- a/examples/qmllegend/qmllegend.desktop
+++ /dev/null
@@ -1,11 +0,0 @@
-[Desktop Entry]
-Encoding=UTF-8
-Version=1.0
-Type=Application
-Terminal=false
-Name=qmllegend
-Exec=/opt/qmllegend/bin/qmllegend
-Icon=qmllegend64
-X-Window-Icon=
-X-HildonDesk-ShowInToolbar=true
-X-Osso-Type=application/x-executable
diff --git a/examples/qmllegend/qmllegend.pro b/examples/qmllegend/qmllegend.pro
deleted file mode 100644
index d896e7ac..00000000
--- a/examples/qmllegend/qmllegend.pro
+++ /dev/null
@@ -1,25 +0,0 @@
-!include( ../examples.pri ) {
- error( "Couldn't find the examples.pri file!" )
-}
-
-QT += widgets
-
-# Add more folders to ship with the application, here
-folder_01.source = qml/qmllegend
-folder_01.target = qml
-DEPLOYMENTFOLDERS = folder_01
-
-# Additional import path used to resolve QML modules in Creator's code model
-QML_IMPORT_PATH =
-
-# The .cpp file which was generated for your project. Feel free to hack it.
-SOURCES += main.cpp
-
-# Please do not modify the following two lines. Required for deployment.
-include(qtquick2applicationviewer/qtquick2applicationviewer.pri)
-qtcAddDeployment()
-
-RESOURCES += qmllegend.qrc
-
-OTHER_FILES += doc/src/* \
- doc/images/*
diff --git a/examples/qmllegend/qmllegend.qrc b/examples/qmllegend/qmllegend.qrc
deleted file mode 100644
index 6496cfdb..00000000
--- a/examples/qmllegend/qmllegend.qrc
+++ /dev/null
@@ -1,8 +0,0 @@
-<RCC>
- <qresource prefix="/qml">
- <file alias="Data.qml">qml/qmllegend/data.qml</file>
- <file alias="main.qml">qml/qmllegend/main.qml</file>
- <file alias="LegendItem.qml">qml/qmllegend/legenditem.qml</file>
- <file alias="NewButton.qml">qml/qmllegend/newbutton.qml</file>
- </qresource>
-</RCC>
diff --git a/examples/qmllegend/qmllegend64.png b/examples/qmllegend/qmllegend64.png
deleted file mode 100644
index 707d5c4e..00000000
--- a/examples/qmllegend/qmllegend64.png
+++ /dev/null
Binary files differ
diff --git a/examples/qmllegend/qtquick2applicationviewer/qtquick2applicationviewer.cpp b/examples/qmllegend/qtquick2applicationviewer/qtquick2applicationviewer.cpp
deleted file mode 100644
index 10709d7a..00000000
--- a/examples/qmllegend/qtquick2applicationviewer/qtquick2applicationviewer.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-// checksum 0x4f6f version 0x90005
-/*
- This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
- QtQuick2ApplicationViewer is a convenience class containing mobile device specific
- code such as screen orientation handling. Also QML paths and debugging are
- handled here.
- It is recommended not to modify this file, since newer versions of Qt Creator
- may offer an updated version of it.
-*/
-
-#include "qtquick2applicationviewer.h"
-
-#include <QtCore/QCoreApplication>
-#include <QtCore/QDir>
-#include <QtQml/QQmlEngine>
-
-class QtQuick2ApplicationViewerPrivate
-{
- QString mainQmlFile;
- friend class QtQuick2ApplicationViewer;
- static QString adjustPath(const QString &path);
-};
-
-QString QtQuick2ApplicationViewerPrivate::adjustPath(const QString &path)
-{
-#if defined(Q_OS_MAC)
- if (!QDir::isAbsolutePath(path))
- return QString::fromLatin1("%1/../Resources/%2")
- .arg(QCoreApplication::applicationDirPath(), path);
-#elif defined(Q_OS_BLACKBERRY)
- if (!QDir::isAbsolutePath(path))
- return QString::fromLatin1("app/native/%1").arg(path);
-#elif !defined(Q_OS_ANDROID)
- QString pathInInstallDir =
- QString::fromLatin1("%1/../%2").arg(QCoreApplication::applicationDirPath(), path);
- if (QFileInfo(pathInInstallDir).exists())
- return pathInInstallDir;
- pathInInstallDir =
- QString::fromLatin1("%1/%2").arg(QCoreApplication::applicationDirPath(), path);
- if (QFileInfo(pathInInstallDir).exists())
- return pathInInstallDir;
-#endif
- return path;
-}
-
-QtQuick2ApplicationViewer::QtQuick2ApplicationViewer(QWindow *parent)
- : QQuickView(parent)
- , d(new QtQuick2ApplicationViewerPrivate())
-{
- connect(engine(), SIGNAL(quit()), SLOT(close()));
- setResizeMode(QQuickView::SizeRootObjectToView);
-}
-
-QtQuick2ApplicationViewer::~QtQuick2ApplicationViewer()
-{
- delete d;
-}
-
-void QtQuick2ApplicationViewer::setMainQmlFile(const QString &file)
-{
- d->mainQmlFile = QtQuick2ApplicationViewerPrivate::adjustPath(file);
-#ifdef Q_OS_ANDROID
- setSource(QUrl(QLatin1String("assets:/")+d->mainQmlFile));
-#else
- setSource(QUrl::fromLocalFile(d->mainQmlFile));
-#endif
-}
-
-void QtQuick2ApplicationViewer::addImportPath(const QString &path)
-{
- engine()->addImportPath(QtQuick2ApplicationViewerPrivate::adjustPath(path));
-}
-
-void QtQuick2ApplicationViewer::showExpanded()
-{
-#if defined(Q_WS_SIMULATOR) || defined(Q_OS_QNX)
- showFullScreen();
-#else
- show();
-#endif
-}
diff --git a/examples/qmllegend/qtquick2applicationviewer/qtquick2applicationviewer.h b/examples/qmllegend/qtquick2applicationviewer/qtquick2applicationviewer.h
deleted file mode 100644
index cf66f140..00000000
--- a/examples/qmllegend/qtquick2applicationviewer/qtquick2applicationviewer.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// checksum 0xfde6 version 0x90005
-/*
- This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
- QtQuick2ApplicationViewer is a convenience class containing mobile device specific
- code such as screen orientation handling. Also QML paths and debugging are
- handled here.
- It is recommended not to modify this file, since newer versions of Qt Creator
- may offer an updated version of it.
-*/
-
-#ifndef QTQUICK2APPLICATIONVIEWER_H
-#define QTQUICK2APPLICATIONVIEWER_H
-
-#include <QtQuick/QQuickView>
-
-class QtQuick2ApplicationViewer : public QQuickView
-{
- Q_OBJECT
-
-public:
- explicit QtQuick2ApplicationViewer(QWindow *parent = 0);
- virtual ~QtQuick2ApplicationViewer();
-
- void setMainQmlFile(const QString &file);
- void addImportPath(const QString &path);
-
- void showExpanded();
-
-private:
- class QtQuick2ApplicationViewerPrivate *d;
-};
-
-#endif // QTQUICK2APPLICATIONVIEWER_H
diff --git a/examples/qmllegend/qtquick2applicationviewer/qtquick2applicationviewer.pri b/examples/qmllegend/qtquick2applicationviewer/qtquick2applicationviewer.pri
deleted file mode 100644
index e5f7990f..00000000
--- a/examples/qmllegend/qtquick2applicationviewer/qtquick2applicationviewer.pri
+++ /dev/null
@@ -1,180 +0,0 @@
-# checksum 0x7b0d version 0x90005
-# This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
-# The code below adds the QtQuick2ApplicationViewer to the project and handles
-# the activation of QML debugging.
-# It is recommended not to modify this file, since newer versions of Qt Creator
-# may offer an updated version of it.
-
-QT += qml quick
-
-SOURCES += $$PWD/qtquick2applicationviewer.cpp
-HEADERS += $$PWD/qtquick2applicationviewer.h
-INCLUDEPATH += $$PWD
-# This file was generated by an application wizard of Qt Creator.
-# The code below handles deployment to Android and Maemo, aswell as copying
-# of the application data to shadow build directories on desktop.
-# It is recommended not to modify this file, since newer versions of Qt Creator
-# may offer an updated version of it.
-
-defineTest(qtcAddDeployment) {
-for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- greaterThan(QT_MAJOR_VERSION, 4) {
- itemsources = $${item}.files
- } else {
- itemsources = $${item}.sources
- }
- $$itemsources = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath= $$eval($${deploymentfolder}.target)
- export($$itemsources)
- export($$itempath)
- DEPLOYMENT += $$item
-}
-
-MAINPROFILEPWD = $$PWD
-
-android-no-sdk {
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- itemfiles = $${item}.files
- $$itemfiles = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath = /data/user/qt/$$eval($${deploymentfolder}.target)
- export($$itemfiles)
- export($$itempath)
- INSTALLS += $$item
- }
-
- target.path = /data/user/qt
-
- export(target.path)
- INSTALLS += target
-} else:android {
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- itemfiles = $${item}.files
- $$itemfiles = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath = /assets/$$eval($${deploymentfolder}.target)
- export($$itemfiles)
- export($$itempath)
- INSTALLS += $$item
- }
-
- x86 {
- target.path = /libs/x86
- } else: armeabi-v7a {
- target.path = /libs/armeabi-v7a
- } else {
- target.path = /libs/armeabi
- }
-
- export(target.path)
- INSTALLS += target
-} else:win32 {
- copyCommand =
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
- source = $$replace(source, /, \\)
- sourcePathSegments = $$split(source, \\)
- target = $$OUT_PWD/$$eval($${deploymentfolder}.target)/$$last(sourcePathSegments)
- target = $$replace(target, /, \\)
- target ~= s,\\\\\\.?\\\\,\\,
- !isEqual(source,$$target) {
- !isEmpty(copyCommand):copyCommand += &&
- isEqual(QMAKE_DIR_SEP, \\) {
- copyCommand += $(COPY_DIR) \"$$source\" \"$$target\"
- } else {
- source = $$replace(source, \\\\, /)
- target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
- target = $$replace(target, \\\\, /)
- copyCommand += test -d \"$$target\" || mkdir -p \"$$target\" && cp -r \"$$source\" \"$$target\"
- }
- }
- }
- !isEmpty(copyCommand) {
- copyCommand = @echo Copying application data... && $$copyCommand
- copydeploymentfolders.commands = $$copyCommand
- first.depends = $(first) copydeploymentfolders
- export(first.depends)
- export(copydeploymentfolders.commands)
- QMAKE_EXTRA_TARGETS += first copydeploymentfolders
- }
-} else:unix {
- maemo5 {
- desktopfile.files = $${TARGET}.desktop
- desktopfile.path = /usr/share/applications/hildon
- icon.files = $${TARGET}64.png
- icon.path = /usr/share/icons/hicolor/64x64/apps
- } else:!isEmpty(MEEGO_VERSION_MAJOR) {
- desktopfile.files = $${TARGET}_harmattan.desktop
- desktopfile.path = /usr/share/applications
- icon.files = $${TARGET}80.png
- icon.path = /usr/share/icons/hicolor/80x80/apps
- } else { # Assumed to be a Desktop Unix
- copyCommand =
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
- source = $$replace(source, \\\\, /)
- macx {
- target = $$OUT_PWD/$${TARGET}.app/Contents/Resources/$$eval($${deploymentfolder}.target)
- } else {
- target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
- }
- target = $$replace(target, \\\\, /)
- sourcePathSegments = $$split(source, /)
- targetFullPath = $$target/$$last(sourcePathSegments)
- targetFullPath ~= s,/\\.?/,/,
- !isEqual(source,$$targetFullPath) {
- !isEmpty(copyCommand):copyCommand += &&
- copyCommand += $(MKDIR) \"$$target\"
- copyCommand += && $(COPY_DIR) \"$$source\" \"$$target\"
- }
- }
- !isEmpty(copyCommand) {
- copyCommand = @echo Copying application data... && $$copyCommand
- copydeploymentfolders.commands = $$copyCommand
- first.depends = $(first) copydeploymentfolders
- export(first.depends)
- export(copydeploymentfolders.commands)
- QMAKE_EXTRA_TARGETS += first copydeploymentfolders
- }
- }
- !isEmpty(target.path) {
- installPrefix = $${target.path}
- } else {
- installPrefix = /opt/$${TARGET}
- }
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- itemfiles = $${item}.files
- $$itemfiles = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath = $${installPrefix}/$$eval($${deploymentfolder}.target)
- export($$itemfiles)
- export($$itempath)
- INSTALLS += $$item
- }
-
- !isEmpty(desktopfile.path) {
- export(icon.files)
- export(icon.path)
- export(desktopfile.files)
- export(desktopfile.path)
- INSTALLS += icon desktopfile
- }
-
- isEmpty(target.path) {
- target.path = $${installPrefix}/bin
- export(target.path)
- }
- INSTALLS += target
-}
-
-export (ICON)
-export (INSTALLS)
-export (DEPLOYMENT)
-export (LIBS)
-export (QMAKE_EXTRA_TARGETS)
-}
diff --git a/examples/qmlmultigraph/doc/images/qmlmultigraph-example.png b/examples/qmlmultigraph/doc/images/qmlmultigraph-example.png
deleted file mode 100644
index d4e524e2..00000000
--- a/examples/qmlmultigraph/doc/images/qmlmultigraph-example.png
+++ /dev/null
Binary files differ
diff --git a/examples/qmlmultigraph/qml/qmlmultigraph/data.qml b/examples/qmlmultigraph/qml/qmlmultigraph/data.qml
deleted file mode 100644
index 679cb067..00000000
--- a/examples/qmlmultigraph/qml/qmlmultigraph/data.qml
+++ /dev/null
@@ -1,76 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2014 Digia Plc
-** All rights reserved.
-** For any questions to Digia, please use contact form at http://qt.digia.com
-**
-** This file is part of the QtDataVisualization module.
-**
-** Licensees holding valid Qt Enterprise licenses may use this file in
-** accordance with the Qt Enterprise License Agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Digia.
-**
-** If you have questions regarding the use of this file, please use
-** contact form at http://qt.digia.com
-**
-****************************************************************************/
-
-import QtQuick 2.1
-
-Item {
- property alias barData: barDataModel
- property alias scatterData: scatterDataModel
- property alias surfaceData: surfaceDataModel
-
- ListModel {
- id: barDataModel
- ListElement{ year: "2012"; city: "Oulu"; expenses: "4200"; income: "8300"; }
- ListElement{ year: "2012"; city: "Kemi"; expenses: "2100"; income: "6500"; }
- ListElement{ year: "2012"; city: "Helsinki"; expenses: "7040"; income: "7500"; }
- ListElement{ year: "2012"; city: "Tampere"; expenses: "4330"; income: "5800"; }
- ListElement{ year: "2013"; city: "Oulu"; expenses: "3960"; income: "9000"; }
- ListElement{ year: "2013"; city: "Kemi"; expenses: "1990"; income: "3000"; }
- ListElement{ year: "2013"; city: "Helsinki"; expenses: "7230"; income: "9900"; }
- ListElement{ year: "2013"; city: "Tampere"; expenses: "4650"; income: "7600"; }
- }
-
- ListModel {
- id: scatterDataModel
- ListElement{ xPos: "2.754"; yPos: "1.000"; zPos: "3.362"; }
- ListElement{ xPos: "3.164"; yPos: "2.022"; zPos: "4.348"; }
- ListElement{ xPos: "4.564"; yPos: "1.865"; zPos: "1.000"; }
- ListElement{ xPos: "1.000"; yPos: "1.224"; zPos: "2.983"; }
- ListElement{ xPos: "2.323"; yPos: "2.502"; zPos: "3.133"; }
- ListElement{ xPos: "3.663"; yPos: "3.186"; zPos: "2.843"; }
- ListElement{ xPos: "4.190"; yPos: "4.875"; zPos: "3.942"; }
- ListElement{ xPos: "3.569"; yPos: "3.685"; zPos: "1.456"; }
- ListElement{ xPos: "5.000"; yPos: "5.000"; zPos: "4.678"; }
- ListElement{ xPos: "4.349"; yPos: "3.850"; zPos: "5.000"; }
- }
-
- ListModel {
- id: surfaceDataModel
- ListElement{ longitude: "20"; latitude: "10"; pop_density: "4.75"; }
- ListElement{ longitude: "21"; latitude: "10"; pop_density: "3.00"; }
- ListElement{ longitude: "22"; latitude: "10"; pop_density: "1.24"; }
- ListElement{ longitude: "23"; latitude: "10"; pop_density: "2.53"; }
- ListElement{ longitude: "20"; latitude: "11"; pop_density: "3.55"; }
- ListElement{ longitude: "21"; latitude: "11"; pop_density: "3.03"; }
- ListElement{ longitude: "22"; latitude: "11"; pop_density: "3.46"; }
- ListElement{ longitude: "23"; latitude: "11"; pop_density: "4.12"; }
- ListElement{ longitude: "20"; latitude: "12"; pop_density: "3.37"; }
- ListElement{ longitude: "21"; latitude: "12"; pop_density: "2.98"; }
- ListElement{ longitude: "22"; latitude: "12"; pop_density: "3.33"; }
- ListElement{ longitude: "23"; latitude: "12"; pop_density: "3.23"; }
- ListElement{ longitude: "20"; latitude: "13"; pop_density: "5.34"; }
- ListElement{ longitude: "21"; latitude: "13"; pop_density: "4.54"; }
- ListElement{ longitude: "22"; latitude: "13"; pop_density: "4.65"; }
- ListElement{ longitude: "23"; latitude: "13"; pop_density: "6.67"; }
- ListElement{ longitude: "20"; latitude: "14"; pop_density: "6.01"; }
- ListElement{ longitude: "21"; latitude: "14"; pop_density: "5.83"; }
- ListElement{ longitude: "22"; latitude: "14"; pop_density: "5.90"; }
- ListElement{ longitude: "23"; latitude: "14"; pop_density: "7.32"; }
- }
-}
-
diff --git a/examples/qmlmultigraph/qml/qmlmultigraph/main.qml b/examples/qmlmultigraph/qml/qmlmultigraph/main.qml
deleted file mode 100644
index bc2f7fe3..00000000
--- a/examples/qmlmultigraph/qml/qmlmultigraph/main.qml
+++ /dev/null
@@ -1,169 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2014 Digia Plc
-** All rights reserved.
-** For any questions to Digia, please use contact form at http://qt.digia.com
-**
-** This file is part of the QtDataVisualization module.
-**
-** Licensees holding valid Qt Enterprise licenses may use this file in
-** accordance with the Qt Enterprise License Agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Digia.
-**
-** If you have questions regarding the use of this file, please use
-** contact form at http://qt.digia.com
-**
-****************************************************************************/
-
-import QtQuick 2.1
-import QtQuick.Layouts 1.0
-import QtDataVisualization 1.0
-import "."
-
-Item {
- id: mainView
- width: 1280
- height: 400
-
- Data {
- id: data
- }
-
- //! [0]
- RowLayout {
- id: graphLayout
- spacing: 1
- anchors.top: buttonLayout.bottom
- anchors.bottom: mainView.bottom
- anchors.left: mainView.left
- anchors.right: mainView.right
-
- Rectangle {
- Layout.fillHeight: true
- Layout.fillWidth: true
- border.color: surfaceGraph.theme.gridLineColor
- border.width: 2
- color: "#00000000" // Transparent
-
- Surface3D {
- id: surfaceGraph
- anchors.fill: parent
- anchors.margins: parent.border.width
- theme: Theme3D { type: Theme3D.ThemePrimaryColors }
- scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricLeftHigh
-
- Surface3DSeries {
- itemLabelFormat: "Pop density at (@xLabel N, @zLabel E): @yLabel"
- ItemModelSurfaceDataProxy {
- itemModel: data.surfaceData
- // Mapping model roles to surface series rows, columns, and values.
- rowRole: "longitude"
- columnRole: "latitude"
- valueRole: "pop_density"
- }
- }
- }
- }
-
-
- Rectangle {
- Layout.fillHeight: true
- Layout.fillWidth: true
- border.color: scatterGraph.theme.gridLineColor
- border.width: 2
- color: "#00000000" // Transparent
-
- Scatter3D {
- id: scatterGraph
- anchors.fill: parent
- anchors.margins: parent.border.width
- theme: Theme3D { type: Theme3D.ThemeDigia }
- scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricLeftHigh
-
- Scatter3DSeries {
- ItemModelScatterDataProxy {
- itemModel: data.scatterData
- // Mapping model roles to scatter series item coordinates.
- xPosRole: "xPos"
- yPosRole: "yPos"
- zPosRole: "zPos"
- }
- }
- }
- }
-
- Rectangle {
- Layout.fillHeight: true
- Layout.fillWidth: true
- border.color: barGraph.theme.gridLineColor
- border.width: 2
- color: "#00000000" // Transparent
-
- Bars3D {
- id: barGraph
- anchors.fill: parent
- anchors.margins: parent.border.width
- theme: Theme3D { type: Theme3D.ThemeQt }
- selectionMode: AbstractGraph3D.SelectionItemAndRow | AbstractGraph3D.SelectionSlice
- scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricLeftHigh
-
- Bar3DSeries {
- itemLabelFormat: "@seriesName for @colLabel, @rowLabel: @valueLabel"
- name: "Yearly expenses"
-
- ItemModelBarDataProxy {
- itemModel: data.barData
- // Mapping model roles to bar series rows, columns, and values.
- rowRole: "year"
- columnRole: "city"
- valueRole: "expenses"
- }
- }
-
- Bar3DSeries {
- itemLabelFormat: "@seriesName for @colLabel, @rowLabel: @valueLabel"
- name: "Yearly income"
-
- ItemModelBarDataProxy {
- itemModel: data.barData
- // Mapping model roles to bar series rows, columns, and values.
- rowRole: "year"
- columnRole: "city"
- valueRole: "income"
- }
- }
- }
- }
- }
- //! [0]
-
- RowLayout {
- id: buttonLayout
- Layout.minimumHeight: exitButton.height
- width: parent.width
- anchors.left: parent.left
- anchors.top: parent.top
- spacing: 0
-
- NewButton {
- id: clearSelectionsButton
- Layout.fillHeight: true
- Layout.fillWidth: true
- text: "Clear Selections"
- onClicked: {
- barGraph.clearSelection()
- scatterGraph.clearSelection()
- surfaceGraph.clearSelection()
- }
- }
-
- NewButton {
- id: exitButton
- Layout.fillHeight: true
- Layout.fillWidth: true
- text: "Quit"
- onClicked: Qt.quit(0);
- }
- }
-}
diff --git a/examples/qmlmultigraph/qmlmultigraph.desktop b/examples/qmlmultigraph/qmlmultigraph.desktop
deleted file mode 100644
index 90b16a4e..00000000
--- a/examples/qmlmultigraph/qmlmultigraph.desktop
+++ /dev/null
@@ -1,11 +0,0 @@
-[Desktop Entry]
-Encoding=UTF-8
-Version=1.0
-Type=Application
-Terminal=false
-Name=qmlmultigraph
-Exec=/opt/qmlmultigraph/bin/qmlmultigraph
-Icon=qmlmultigraph64
-X-Window-Icon=
-X-HildonDesk-ShowInToolbar=true
-X-Osso-Type=application/x-executable
diff --git a/examples/qmlmultigraph/qmlmultigraph.pro b/examples/qmlmultigraph/qmlmultigraph.pro
deleted file mode 100644
index af4e0d90..00000000
--- a/examples/qmlmultigraph/qmlmultigraph.pro
+++ /dev/null
@@ -1,25 +0,0 @@
-!include( ../examples.pri ) {
- error( "Couldn't find the examples.pri file!" )
-}
-
-QT += widgets
-
-# Add more folders to ship with the application, here
-folder_01.source = qml/qmlmultigraph
-folder_01.target = qml
-DEPLOYMENTFOLDERS = folder_01
-
-# Additional import path used to resolve QML modules in Creator's code model
-QML_IMPORT_PATH =
-
-# The .cpp file which was generated for your project. Feel free to hack it.
-SOURCES += main.cpp
-
-# Please do not modify the following two lines. Required for deployment.
-include(qtquick2applicationviewer/qtquick2applicationviewer.pri)
-qtcAddDeployment()
-
-RESOURCES += qmlmultigraph.qrc
-
-OTHER_FILES += doc/src/* \
- doc/images/*
diff --git a/examples/qmlmultigraph/qmlmultigraph.qrc b/examples/qmlmultigraph/qmlmultigraph.qrc
deleted file mode 100644
index 02e0c682..00000000
--- a/examples/qmlmultigraph/qmlmultigraph.qrc
+++ /dev/null
@@ -1,7 +0,0 @@
-<RCC>
- <qresource prefix="/qml">
- <file alias="main.qml">qml/qmlmultigraph/main.qml</file>
- <file alias="NewButton.qml">qml/qmlmultigraph/newbutton.qml</file>
- <file alias="Data.qml">qml/qmlmultigraph/data.qml</file>
- </qresource>
-</RCC>
diff --git a/examples/qmlmultigraph/qmlmultigraph64.png b/examples/qmlmultigraph/qmlmultigraph64.png
deleted file mode 100644
index 707d5c4e..00000000
--- a/examples/qmlmultigraph/qmlmultigraph64.png
+++ /dev/null
Binary files differ
diff --git a/examples/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.cpp b/examples/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.cpp
deleted file mode 100644
index 10709d7a..00000000
--- a/examples/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-// checksum 0x4f6f version 0x90005
-/*
- This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
- QtQuick2ApplicationViewer is a convenience class containing mobile device specific
- code such as screen orientation handling. Also QML paths and debugging are
- handled here.
- It is recommended not to modify this file, since newer versions of Qt Creator
- may offer an updated version of it.
-*/
-
-#include "qtquick2applicationviewer.h"
-
-#include <QtCore/QCoreApplication>
-#include <QtCore/QDir>
-#include <QtQml/QQmlEngine>
-
-class QtQuick2ApplicationViewerPrivate
-{
- QString mainQmlFile;
- friend class QtQuick2ApplicationViewer;
- static QString adjustPath(const QString &path);
-};
-
-QString QtQuick2ApplicationViewerPrivate::adjustPath(const QString &path)
-{
-#if defined(Q_OS_MAC)
- if (!QDir::isAbsolutePath(path))
- return QString::fromLatin1("%1/../Resources/%2")
- .arg(QCoreApplication::applicationDirPath(), path);
-#elif defined(Q_OS_BLACKBERRY)
- if (!QDir::isAbsolutePath(path))
- return QString::fromLatin1("app/native/%1").arg(path);
-#elif !defined(Q_OS_ANDROID)
- QString pathInInstallDir =
- QString::fromLatin1("%1/../%2").arg(QCoreApplication::applicationDirPath(), path);
- if (QFileInfo(pathInInstallDir).exists())
- return pathInInstallDir;
- pathInInstallDir =
- QString::fromLatin1("%1/%2").arg(QCoreApplication::applicationDirPath(), path);
- if (QFileInfo(pathInInstallDir).exists())
- return pathInInstallDir;
-#endif
- return path;
-}
-
-QtQuick2ApplicationViewer::QtQuick2ApplicationViewer(QWindow *parent)
- : QQuickView(parent)
- , d(new QtQuick2ApplicationViewerPrivate())
-{
- connect(engine(), SIGNAL(quit()), SLOT(close()));
- setResizeMode(QQuickView::SizeRootObjectToView);
-}
-
-QtQuick2ApplicationViewer::~QtQuick2ApplicationViewer()
-{
- delete d;
-}
-
-void QtQuick2ApplicationViewer::setMainQmlFile(const QString &file)
-{
- d->mainQmlFile = QtQuick2ApplicationViewerPrivate::adjustPath(file);
-#ifdef Q_OS_ANDROID
- setSource(QUrl(QLatin1String("assets:/")+d->mainQmlFile));
-#else
- setSource(QUrl::fromLocalFile(d->mainQmlFile));
-#endif
-}
-
-void QtQuick2ApplicationViewer::addImportPath(const QString &path)
-{
- engine()->addImportPath(QtQuick2ApplicationViewerPrivate::adjustPath(path));
-}
-
-void QtQuick2ApplicationViewer::showExpanded()
-{
-#if defined(Q_WS_SIMULATOR) || defined(Q_OS_QNX)
- showFullScreen();
-#else
- show();
-#endif
-}
diff --git a/examples/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.h b/examples/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.h
deleted file mode 100644
index cf66f140..00000000
--- a/examples/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// checksum 0xfde6 version 0x90005
-/*
- This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
- QtQuick2ApplicationViewer is a convenience class containing mobile device specific
- code such as screen orientation handling. Also QML paths and debugging are
- handled here.
- It is recommended not to modify this file, since newer versions of Qt Creator
- may offer an updated version of it.
-*/
-
-#ifndef QTQUICK2APPLICATIONVIEWER_H
-#define QTQUICK2APPLICATIONVIEWER_H
-
-#include <QtQuick/QQuickView>
-
-class QtQuick2ApplicationViewer : public QQuickView
-{
- Q_OBJECT
-
-public:
- explicit QtQuick2ApplicationViewer(QWindow *parent = 0);
- virtual ~QtQuick2ApplicationViewer();
-
- void setMainQmlFile(const QString &file);
- void addImportPath(const QString &path);
-
- void showExpanded();
-
-private:
- class QtQuick2ApplicationViewerPrivate *d;
-};
-
-#endif // QTQUICK2APPLICATIONVIEWER_H
diff --git a/examples/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.pri b/examples/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.pri
deleted file mode 100644
index e5f7990f..00000000
--- a/examples/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.pri
+++ /dev/null
@@ -1,180 +0,0 @@
-# checksum 0x7b0d version 0x90005
-# This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
-# The code below adds the QtQuick2ApplicationViewer to the project and handles
-# the activation of QML debugging.
-# It is recommended not to modify this file, since newer versions of Qt Creator
-# may offer an updated version of it.
-
-QT += qml quick
-
-SOURCES += $$PWD/qtquick2applicationviewer.cpp
-HEADERS += $$PWD/qtquick2applicationviewer.h
-INCLUDEPATH += $$PWD
-# This file was generated by an application wizard of Qt Creator.
-# The code below handles deployment to Android and Maemo, aswell as copying
-# of the application data to shadow build directories on desktop.
-# It is recommended not to modify this file, since newer versions of Qt Creator
-# may offer an updated version of it.
-
-defineTest(qtcAddDeployment) {
-for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- greaterThan(QT_MAJOR_VERSION, 4) {
- itemsources = $${item}.files
- } else {
- itemsources = $${item}.sources
- }
- $$itemsources = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath= $$eval($${deploymentfolder}.target)
- export($$itemsources)
- export($$itempath)
- DEPLOYMENT += $$item
-}
-
-MAINPROFILEPWD = $$PWD
-
-android-no-sdk {
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- itemfiles = $${item}.files
- $$itemfiles = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath = /data/user/qt/$$eval($${deploymentfolder}.target)
- export($$itemfiles)
- export($$itempath)
- INSTALLS += $$item
- }
-
- target.path = /data/user/qt
-
- export(target.path)
- INSTALLS += target
-} else:android {
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- itemfiles = $${item}.files
- $$itemfiles = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath = /assets/$$eval($${deploymentfolder}.target)
- export($$itemfiles)
- export($$itempath)
- INSTALLS += $$item
- }
-
- x86 {
- target.path = /libs/x86
- } else: armeabi-v7a {
- target.path = /libs/armeabi-v7a
- } else {
- target.path = /libs/armeabi
- }
-
- export(target.path)
- INSTALLS += target
-} else:win32 {
- copyCommand =
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
- source = $$replace(source, /, \\)
- sourcePathSegments = $$split(source, \\)
- target = $$OUT_PWD/$$eval($${deploymentfolder}.target)/$$last(sourcePathSegments)
- target = $$replace(target, /, \\)
- target ~= s,\\\\\\.?\\\\,\\,
- !isEqual(source,$$target) {
- !isEmpty(copyCommand):copyCommand += &&
- isEqual(QMAKE_DIR_SEP, \\) {
- copyCommand += $(COPY_DIR) \"$$source\" \"$$target\"
- } else {
- source = $$replace(source, \\\\, /)
- target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
- target = $$replace(target, \\\\, /)
- copyCommand += test -d \"$$target\" || mkdir -p \"$$target\" && cp -r \"$$source\" \"$$target\"
- }
- }
- }
- !isEmpty(copyCommand) {
- copyCommand = @echo Copying application data... && $$copyCommand
- copydeploymentfolders.commands = $$copyCommand
- first.depends = $(first) copydeploymentfolders
- export(first.depends)
- export(copydeploymentfolders.commands)
- QMAKE_EXTRA_TARGETS += first copydeploymentfolders
- }
-} else:unix {
- maemo5 {
- desktopfile.files = $${TARGET}.desktop
- desktopfile.path = /usr/share/applications/hildon
- icon.files = $${TARGET}64.png
- icon.path = /usr/share/icons/hicolor/64x64/apps
- } else:!isEmpty(MEEGO_VERSION_MAJOR) {
- desktopfile.files = $${TARGET}_harmattan.desktop
- desktopfile.path = /usr/share/applications
- icon.files = $${TARGET}80.png
- icon.path = /usr/share/icons/hicolor/80x80/apps
- } else { # Assumed to be a Desktop Unix
- copyCommand =
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
- source = $$replace(source, \\\\, /)
- macx {
- target = $$OUT_PWD/$${TARGET}.app/Contents/Resources/$$eval($${deploymentfolder}.target)
- } else {
- target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
- }
- target = $$replace(target, \\\\, /)
- sourcePathSegments = $$split(source, /)
- targetFullPath = $$target/$$last(sourcePathSegments)
- targetFullPath ~= s,/\\.?/,/,
- !isEqual(source,$$targetFullPath) {
- !isEmpty(copyCommand):copyCommand += &&
- copyCommand += $(MKDIR) \"$$target\"
- copyCommand += && $(COPY_DIR) \"$$source\" \"$$target\"
- }
- }
- !isEmpty(copyCommand) {
- copyCommand = @echo Copying application data... && $$copyCommand
- copydeploymentfolders.commands = $$copyCommand
- first.depends = $(first) copydeploymentfolders
- export(first.depends)
- export(copydeploymentfolders.commands)
- QMAKE_EXTRA_TARGETS += first copydeploymentfolders
- }
- }
- !isEmpty(target.path) {
- installPrefix = $${target.path}
- } else {
- installPrefix = /opt/$${TARGET}
- }
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- itemfiles = $${item}.files
- $$itemfiles = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath = $${installPrefix}/$$eval($${deploymentfolder}.target)
- export($$itemfiles)
- export($$itempath)
- INSTALLS += $$item
- }
-
- !isEmpty(desktopfile.path) {
- export(icon.files)
- export(icon.path)
- export(desktopfile.files)
- export(desktopfile.path)
- INSTALLS += icon desktopfile
- }
-
- isEmpty(target.path) {
- target.path = $${installPrefix}/bin
- export(target.path)
- }
- INSTALLS += target
-}
-
-export (ICON)
-export (INSTALLS)
-export (DEPLOYMENT)
-export (LIBS)
-export (QMAKE_EXTRA_TARGETS)
-}
diff --git a/examples/qmlscatter/doc/images/qmlscatter-newproject.png b/examples/qmlscatter/doc/images/qmlscatter-newproject.png
deleted file mode 100644
index 7c81cae8..00000000
--- a/examples/qmlscatter/doc/images/qmlscatter-newproject.png
+++ /dev/null
Binary files differ
diff --git a/examples/qmlscatter/qmlscatter.desktop b/examples/qmlscatter/qmlscatter.desktop
deleted file mode 100644
index 0f9e5498..00000000
--- a/examples/qmlscatter/qmlscatter.desktop
+++ /dev/null
@@ -1,11 +0,0 @@
-[Desktop Entry]
-Encoding=UTF-8
-Version=1.0
-Type=Application
-Terminal=false
-Name=qmlscatter
-Exec=/opt/qmlscatter/bin/qmlscatter
-Icon=qmlscatter64
-X-Window-Icon=
-X-HildonDesk-ShowInToolbar=true
-X-Osso-Type=application/x-executable
diff --git a/examples/qmlscatter/qmlscatter.pro b/examples/qmlscatter/qmlscatter.pro
deleted file mode 100644
index 0c66c5ae..00000000
--- a/examples/qmlscatter/qmlscatter.pro
+++ /dev/null
@@ -1,25 +0,0 @@
-!include( ../examples.pri ) {
- error( "Couldn't find the examples.pri file!" )
-}
-
-QT += widgets
-
-# Add more folders to ship with the application, here
-folder_01.source = qml/qmlscatter
-folder_01.target = qml
-DEPLOYMENTFOLDERS = folder_01
-
-# Additional import path used to resolve QML modules in Creator's code model
-QML_IMPORT_PATH =
-
-# The .cpp file which was generated for your project. Feel free to hack it.
-SOURCES += main.cpp
-
-# Please do not modify the following two lines. Required for deployment.
-include(qtquick2applicationviewer/qtquick2applicationviewer.pri)
-qtcAddDeployment()
-
-RESOURCES += qmlscatter.qrc
-
-OTHER_FILES += doc/src/* \
- doc/images/*
diff --git a/examples/qmlscatter/qmlscatter.qrc b/examples/qmlscatter/qmlscatter.qrc
deleted file mode 100644
index 6b77a4bc..00000000
--- a/examples/qmlscatter/qmlscatter.qrc
+++ /dev/null
@@ -1,7 +0,0 @@
-<RCC>
- <qresource prefix="/qml">
- <file alias="main.qml">qml/qmlscatter/main.qml</file>
- <file alias="Data.qml">qml/qmlscatter/data.qml</file>
- <file alias="NewButton.qml">qml/qmlscatter/newbutton.qml</file>
- </qresource>
-</RCC>
diff --git a/examples/qmlscatter/qmlscatter64.png b/examples/qmlscatter/qmlscatter64.png
deleted file mode 100644
index 707d5c4e..00000000
--- a/examples/qmlscatter/qmlscatter64.png
+++ /dev/null
Binary files differ
diff --git a/examples/qmlscatter/qtquick2applicationviewer/qtquick2applicationviewer.cpp b/examples/qmlscatter/qtquick2applicationviewer/qtquick2applicationviewer.cpp
deleted file mode 100644
index 10709d7a..00000000
--- a/examples/qmlscatter/qtquick2applicationviewer/qtquick2applicationviewer.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-// checksum 0x4f6f version 0x90005
-/*
- This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
- QtQuick2ApplicationViewer is a convenience class containing mobile device specific
- code such as screen orientation handling. Also QML paths and debugging are
- handled here.
- It is recommended not to modify this file, since newer versions of Qt Creator
- may offer an updated version of it.
-*/
-
-#include "qtquick2applicationviewer.h"
-
-#include <QtCore/QCoreApplication>
-#include <QtCore/QDir>
-#include <QtQml/QQmlEngine>
-
-class QtQuick2ApplicationViewerPrivate
-{
- QString mainQmlFile;
- friend class QtQuick2ApplicationViewer;
- static QString adjustPath(const QString &path);
-};
-
-QString QtQuick2ApplicationViewerPrivate::adjustPath(const QString &path)
-{
-#if defined(Q_OS_MAC)
- if (!QDir::isAbsolutePath(path))
- return QString::fromLatin1("%1/../Resources/%2")
- .arg(QCoreApplication::applicationDirPath(), path);
-#elif defined(Q_OS_BLACKBERRY)
- if (!QDir::isAbsolutePath(path))
- return QString::fromLatin1("app/native/%1").arg(path);
-#elif !defined(Q_OS_ANDROID)
- QString pathInInstallDir =
- QString::fromLatin1("%1/../%2").arg(QCoreApplication::applicationDirPath(), path);
- if (QFileInfo(pathInInstallDir).exists())
- return pathInInstallDir;
- pathInInstallDir =
- QString::fromLatin1("%1/%2").arg(QCoreApplication::applicationDirPath(), path);
- if (QFileInfo(pathInInstallDir).exists())
- return pathInInstallDir;
-#endif
- return path;
-}
-
-QtQuick2ApplicationViewer::QtQuick2ApplicationViewer(QWindow *parent)
- : QQuickView(parent)
- , d(new QtQuick2ApplicationViewerPrivate())
-{
- connect(engine(), SIGNAL(quit()), SLOT(close()));
- setResizeMode(QQuickView::SizeRootObjectToView);
-}
-
-QtQuick2ApplicationViewer::~QtQuick2ApplicationViewer()
-{
- delete d;
-}
-
-void QtQuick2ApplicationViewer::setMainQmlFile(const QString &file)
-{
- d->mainQmlFile = QtQuick2ApplicationViewerPrivate::adjustPath(file);
-#ifdef Q_OS_ANDROID
- setSource(QUrl(QLatin1String("assets:/")+d->mainQmlFile));
-#else
- setSource(QUrl::fromLocalFile(d->mainQmlFile));
-#endif
-}
-
-void QtQuick2ApplicationViewer::addImportPath(const QString &path)
-{
- engine()->addImportPath(QtQuick2ApplicationViewerPrivate::adjustPath(path));
-}
-
-void QtQuick2ApplicationViewer::showExpanded()
-{
-#if defined(Q_WS_SIMULATOR) || defined(Q_OS_QNX)
- showFullScreen();
-#else
- show();
-#endif
-}
diff --git a/examples/qmlscatter/qtquick2applicationviewer/qtquick2applicationviewer.h b/examples/qmlscatter/qtquick2applicationviewer/qtquick2applicationviewer.h
deleted file mode 100644
index cf66f140..00000000
--- a/examples/qmlscatter/qtquick2applicationviewer/qtquick2applicationviewer.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// checksum 0xfde6 version 0x90005
-/*
- This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
- QtQuick2ApplicationViewer is a convenience class containing mobile device specific
- code such as screen orientation handling. Also QML paths and debugging are
- handled here.
- It is recommended not to modify this file, since newer versions of Qt Creator
- may offer an updated version of it.
-*/
-
-#ifndef QTQUICK2APPLICATIONVIEWER_H
-#define QTQUICK2APPLICATIONVIEWER_H
-
-#include <QtQuick/QQuickView>
-
-class QtQuick2ApplicationViewer : public QQuickView
-{
- Q_OBJECT
-
-public:
- explicit QtQuick2ApplicationViewer(QWindow *parent = 0);
- virtual ~QtQuick2ApplicationViewer();
-
- void setMainQmlFile(const QString &file);
- void addImportPath(const QString &path);
-
- void showExpanded();
-
-private:
- class QtQuick2ApplicationViewerPrivate *d;
-};
-
-#endif // QTQUICK2APPLICATIONVIEWER_H
diff --git a/examples/qmlscatter/qtquick2applicationviewer/qtquick2applicationviewer.pri b/examples/qmlscatter/qtquick2applicationviewer/qtquick2applicationviewer.pri
deleted file mode 100644
index e5f7990f..00000000
--- a/examples/qmlscatter/qtquick2applicationviewer/qtquick2applicationviewer.pri
+++ /dev/null
@@ -1,180 +0,0 @@
-# checksum 0x7b0d version 0x90005
-# This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
-# The code below adds the QtQuick2ApplicationViewer to the project and handles
-# the activation of QML debugging.
-# It is recommended not to modify this file, since newer versions of Qt Creator
-# may offer an updated version of it.
-
-QT += qml quick
-
-SOURCES += $$PWD/qtquick2applicationviewer.cpp
-HEADERS += $$PWD/qtquick2applicationviewer.h
-INCLUDEPATH += $$PWD
-# This file was generated by an application wizard of Qt Creator.
-# The code below handles deployment to Android and Maemo, aswell as copying
-# of the application data to shadow build directories on desktop.
-# It is recommended not to modify this file, since newer versions of Qt Creator
-# may offer an updated version of it.
-
-defineTest(qtcAddDeployment) {
-for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- greaterThan(QT_MAJOR_VERSION, 4) {
- itemsources = $${item}.files
- } else {
- itemsources = $${item}.sources
- }
- $$itemsources = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath= $$eval($${deploymentfolder}.target)
- export($$itemsources)
- export($$itempath)
- DEPLOYMENT += $$item
-}
-
-MAINPROFILEPWD = $$PWD
-
-android-no-sdk {
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- itemfiles = $${item}.files
- $$itemfiles = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath = /data/user/qt/$$eval($${deploymentfolder}.target)
- export($$itemfiles)
- export($$itempath)
- INSTALLS += $$item
- }
-
- target.path = /data/user/qt
-
- export(target.path)
- INSTALLS += target
-} else:android {
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- itemfiles = $${item}.files
- $$itemfiles = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath = /assets/$$eval($${deploymentfolder}.target)
- export($$itemfiles)
- export($$itempath)
- INSTALLS += $$item
- }
-
- x86 {
- target.path = /libs/x86
- } else: armeabi-v7a {
- target.path = /libs/armeabi-v7a
- } else {
- target.path = /libs/armeabi
- }
-
- export(target.path)
- INSTALLS += target
-} else:win32 {
- copyCommand =
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
- source = $$replace(source, /, \\)
- sourcePathSegments = $$split(source, \\)
- target = $$OUT_PWD/$$eval($${deploymentfolder}.target)/$$last(sourcePathSegments)
- target = $$replace(target, /, \\)
- target ~= s,\\\\\\.?\\\\,\\,
- !isEqual(source,$$target) {
- !isEmpty(copyCommand):copyCommand += &&
- isEqual(QMAKE_DIR_SEP, \\) {
- copyCommand += $(COPY_DIR) \"$$source\" \"$$target\"
- } else {
- source = $$replace(source, \\\\, /)
- target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
- target = $$replace(target, \\\\, /)
- copyCommand += test -d \"$$target\" || mkdir -p \"$$target\" && cp -r \"$$source\" \"$$target\"
- }
- }
- }
- !isEmpty(copyCommand) {
- copyCommand = @echo Copying application data... && $$copyCommand
- copydeploymentfolders.commands = $$copyCommand
- first.depends = $(first) copydeploymentfolders
- export(first.depends)
- export(copydeploymentfolders.commands)
- QMAKE_EXTRA_TARGETS += first copydeploymentfolders
- }
-} else:unix {
- maemo5 {
- desktopfile.files = $${TARGET}.desktop
- desktopfile.path = /usr/share/applications/hildon
- icon.files = $${TARGET}64.png
- icon.path = /usr/share/icons/hicolor/64x64/apps
- } else:!isEmpty(MEEGO_VERSION_MAJOR) {
- desktopfile.files = $${TARGET}_harmattan.desktop
- desktopfile.path = /usr/share/applications
- icon.files = $${TARGET}80.png
- icon.path = /usr/share/icons/hicolor/80x80/apps
- } else { # Assumed to be a Desktop Unix
- copyCommand =
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
- source = $$replace(source, \\\\, /)
- macx {
- target = $$OUT_PWD/$${TARGET}.app/Contents/Resources/$$eval($${deploymentfolder}.target)
- } else {
- target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
- }
- target = $$replace(target, \\\\, /)
- sourcePathSegments = $$split(source, /)
- targetFullPath = $$target/$$last(sourcePathSegments)
- targetFullPath ~= s,/\\.?/,/,
- !isEqual(source,$$targetFullPath) {
- !isEmpty(copyCommand):copyCommand += &&
- copyCommand += $(MKDIR) \"$$target\"
- copyCommand += && $(COPY_DIR) \"$$source\" \"$$target\"
- }
- }
- !isEmpty(copyCommand) {
- copyCommand = @echo Copying application data... && $$copyCommand
- copydeploymentfolders.commands = $$copyCommand
- first.depends = $(first) copydeploymentfolders
- export(first.depends)
- export(copydeploymentfolders.commands)
- QMAKE_EXTRA_TARGETS += first copydeploymentfolders
- }
- }
- !isEmpty(target.path) {
- installPrefix = $${target.path}
- } else {
- installPrefix = /opt/$${TARGET}
- }
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- itemfiles = $${item}.files
- $$itemfiles = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath = $${installPrefix}/$$eval($${deploymentfolder}.target)
- export($$itemfiles)
- export($$itempath)
- INSTALLS += $$item
- }
-
- !isEmpty(desktopfile.path) {
- export(icon.files)
- export(icon.path)
- export(desktopfile.files)
- export(desktopfile.path)
- INSTALLS += icon desktopfile
- }
-
- isEmpty(target.path) {
- target.path = $${installPrefix}/bin
- export(target.path)
- }
- INSTALLS += target
-}
-
-export (ICON)
-export (INSTALLS)
-export (DEPLOYMENT)
-export (LIBS)
-export (QMAKE_EXTRA_TARGETS)
-}
diff --git a/examples/qmlsurface/doc/images/qmlsurface-example.png b/examples/qmlsurface/doc/images/qmlsurface-example.png
deleted file mode 100644
index d8d394fa..00000000
--- a/examples/qmlsurface/doc/images/qmlsurface-example.png
+++ /dev/null
Binary files differ
diff --git a/examples/qmlsurface/qmlsurface.desktop b/examples/qmlsurface/qmlsurface.desktop
deleted file mode 100644
index 66dd0a72..00000000
--- a/examples/qmlsurface/qmlsurface.desktop
+++ /dev/null
@@ -1,11 +0,0 @@
-[Desktop Entry]
-Encoding=UTF-8
-Version=1.0
-Type=Application
-Terminal=false
-Name=qmlsurface
-Exec=/opt/qmlsurface/bin/qmlsurface
-Icon=qmlsurface64
-X-Window-Icon=
-X-HildonDesk-ShowInToolbar=true
-X-Osso-Type=application/x-executable
diff --git a/examples/qmlsurface/qmlsurface.pro b/examples/qmlsurface/qmlsurface.pro
deleted file mode 100644
index 64c72cf7..00000000
--- a/examples/qmlsurface/qmlsurface.pro
+++ /dev/null
@@ -1,25 +0,0 @@
-!include( ../examples.pri ) {
- error( "Couldn't find the examples.pri file!" )
-}
-
-QT += widgets
-
-# Add more folders to ship with the application, here
-folder_01.source = qml/qmlsurface
-folder_01.target = qml
-DEPLOYMENTFOLDERS = folder_01
-
-# Additional import path used to resolve QML modules in Creator's code model
-QML_IMPORT_PATH =
-
-# The .cpp file which was generated for your project. Feel free to hack it.
-SOURCES += main.cpp
-
-# Please do not modify the following two lines. Required for deployment.
-include(qtquick2applicationviewer/qtquick2applicationviewer.pri)
-qtcAddDeployment()
-
-RESOURCES += qmlsurface.qrc
-
-OTHER_FILES += doc/src/* \
- doc/images/*
diff --git a/examples/qmlsurface/qmlsurface.qrc b/examples/qmlsurface/qmlsurface.qrc
deleted file mode 100644
index d0745b94..00000000
--- a/examples/qmlsurface/qmlsurface.qrc
+++ /dev/null
@@ -1,10 +0,0 @@
-<RCC>
- <qresource prefix="/qml">
- <file alias="main.qml">qml/qmlsurface/main.qml</file>
- <file alias="Data.qml">qml/qmlsurface/data.qml</file>
- <file alias="NewButton.qml">qml/qmlsurface/newbutton.qml</file>
- </qresource>
- <qresource prefix="/heightmaps">
- <file alias="image">heightmap.png</file>
- </qresource>
-</RCC>
diff --git a/examples/qmlsurface/qmlsurface64.png b/examples/qmlsurface/qmlsurface64.png
deleted file mode 100644
index 707d5c4e..00000000
--- a/examples/qmlsurface/qmlsurface64.png
+++ /dev/null
Binary files differ
diff --git a/examples/qmlsurface/qtquick2applicationviewer/qtquick2applicationviewer.cpp b/examples/qmlsurface/qtquick2applicationviewer/qtquick2applicationviewer.cpp
deleted file mode 100644
index 10709d7a..00000000
--- a/examples/qmlsurface/qtquick2applicationviewer/qtquick2applicationviewer.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-// checksum 0x4f6f version 0x90005
-/*
- This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
- QtQuick2ApplicationViewer is a convenience class containing mobile device specific
- code such as screen orientation handling. Also QML paths and debugging are
- handled here.
- It is recommended not to modify this file, since newer versions of Qt Creator
- may offer an updated version of it.
-*/
-
-#include "qtquick2applicationviewer.h"
-
-#include <QtCore/QCoreApplication>
-#include <QtCore/QDir>
-#include <QtQml/QQmlEngine>
-
-class QtQuick2ApplicationViewerPrivate
-{
- QString mainQmlFile;
- friend class QtQuick2ApplicationViewer;
- static QString adjustPath(const QString &path);
-};
-
-QString QtQuick2ApplicationViewerPrivate::adjustPath(const QString &path)
-{
-#if defined(Q_OS_MAC)
- if (!QDir::isAbsolutePath(path))
- return QString::fromLatin1("%1/../Resources/%2")
- .arg(QCoreApplication::applicationDirPath(), path);
-#elif defined(Q_OS_BLACKBERRY)
- if (!QDir::isAbsolutePath(path))
- return QString::fromLatin1("app/native/%1").arg(path);
-#elif !defined(Q_OS_ANDROID)
- QString pathInInstallDir =
- QString::fromLatin1("%1/../%2").arg(QCoreApplication::applicationDirPath(), path);
- if (QFileInfo(pathInInstallDir).exists())
- return pathInInstallDir;
- pathInInstallDir =
- QString::fromLatin1("%1/%2").arg(QCoreApplication::applicationDirPath(), path);
- if (QFileInfo(pathInInstallDir).exists())
- return pathInInstallDir;
-#endif
- return path;
-}
-
-QtQuick2ApplicationViewer::QtQuick2ApplicationViewer(QWindow *parent)
- : QQuickView(parent)
- , d(new QtQuick2ApplicationViewerPrivate())
-{
- connect(engine(), SIGNAL(quit()), SLOT(close()));
- setResizeMode(QQuickView::SizeRootObjectToView);
-}
-
-QtQuick2ApplicationViewer::~QtQuick2ApplicationViewer()
-{
- delete d;
-}
-
-void QtQuick2ApplicationViewer::setMainQmlFile(const QString &file)
-{
- d->mainQmlFile = QtQuick2ApplicationViewerPrivate::adjustPath(file);
-#ifdef Q_OS_ANDROID
- setSource(QUrl(QLatin1String("assets:/")+d->mainQmlFile));
-#else
- setSource(QUrl::fromLocalFile(d->mainQmlFile));
-#endif
-}
-
-void QtQuick2ApplicationViewer::addImportPath(const QString &path)
-{
- engine()->addImportPath(QtQuick2ApplicationViewerPrivate::adjustPath(path));
-}
-
-void QtQuick2ApplicationViewer::showExpanded()
-{
-#if defined(Q_WS_SIMULATOR) || defined(Q_OS_QNX)
- showFullScreen();
-#else
- show();
-#endif
-}
diff --git a/examples/qmlsurface/qtquick2applicationviewer/qtquick2applicationviewer.h b/examples/qmlsurface/qtquick2applicationviewer/qtquick2applicationviewer.h
deleted file mode 100644
index cf66f140..00000000
--- a/examples/qmlsurface/qtquick2applicationviewer/qtquick2applicationviewer.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// checksum 0xfde6 version 0x90005
-/*
- This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
- QtQuick2ApplicationViewer is a convenience class containing mobile device specific
- code such as screen orientation handling. Also QML paths and debugging are
- handled here.
- It is recommended not to modify this file, since newer versions of Qt Creator
- may offer an updated version of it.
-*/
-
-#ifndef QTQUICK2APPLICATIONVIEWER_H
-#define QTQUICK2APPLICATIONVIEWER_H
-
-#include <QtQuick/QQuickView>
-
-class QtQuick2ApplicationViewer : public QQuickView
-{
- Q_OBJECT
-
-public:
- explicit QtQuick2ApplicationViewer(QWindow *parent = 0);
- virtual ~QtQuick2ApplicationViewer();
-
- void setMainQmlFile(const QString &file);
- void addImportPath(const QString &path);
-
- void showExpanded();
-
-private:
- class QtQuick2ApplicationViewerPrivate *d;
-};
-
-#endif // QTQUICK2APPLICATIONVIEWER_H
diff --git a/examples/qmlsurface/qtquick2applicationviewer/qtquick2applicationviewer.pri b/examples/qmlsurface/qtquick2applicationviewer/qtquick2applicationviewer.pri
deleted file mode 100644
index e5f7990f..00000000
--- a/examples/qmlsurface/qtquick2applicationviewer/qtquick2applicationviewer.pri
+++ /dev/null
@@ -1,180 +0,0 @@
-# checksum 0x7b0d version 0x90005
-# This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
-# The code below adds the QtQuick2ApplicationViewer to the project and handles
-# the activation of QML debugging.
-# It is recommended not to modify this file, since newer versions of Qt Creator
-# may offer an updated version of it.
-
-QT += qml quick
-
-SOURCES += $$PWD/qtquick2applicationviewer.cpp
-HEADERS += $$PWD/qtquick2applicationviewer.h
-INCLUDEPATH += $$PWD
-# This file was generated by an application wizard of Qt Creator.
-# The code below handles deployment to Android and Maemo, aswell as copying
-# of the application data to shadow build directories on desktop.
-# It is recommended not to modify this file, since newer versions of Qt Creator
-# may offer an updated version of it.
-
-defineTest(qtcAddDeployment) {
-for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- greaterThan(QT_MAJOR_VERSION, 4) {
- itemsources = $${item}.files
- } else {
- itemsources = $${item}.sources
- }
- $$itemsources = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath= $$eval($${deploymentfolder}.target)
- export($$itemsources)
- export($$itempath)
- DEPLOYMENT += $$item
-}
-
-MAINPROFILEPWD = $$PWD
-
-android-no-sdk {
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- itemfiles = $${item}.files
- $$itemfiles = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath = /data/user/qt/$$eval($${deploymentfolder}.target)
- export($$itemfiles)
- export($$itempath)
- INSTALLS += $$item
- }
-
- target.path = /data/user/qt
-
- export(target.path)
- INSTALLS += target
-} else:android {
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- itemfiles = $${item}.files
- $$itemfiles = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath = /assets/$$eval($${deploymentfolder}.target)
- export($$itemfiles)
- export($$itempath)
- INSTALLS += $$item
- }
-
- x86 {
- target.path = /libs/x86
- } else: armeabi-v7a {
- target.path = /libs/armeabi-v7a
- } else {
- target.path = /libs/armeabi
- }
-
- export(target.path)
- INSTALLS += target
-} else:win32 {
- copyCommand =
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
- source = $$replace(source, /, \\)
- sourcePathSegments = $$split(source, \\)
- target = $$OUT_PWD/$$eval($${deploymentfolder}.target)/$$last(sourcePathSegments)
- target = $$replace(target, /, \\)
- target ~= s,\\\\\\.?\\\\,\\,
- !isEqual(source,$$target) {
- !isEmpty(copyCommand):copyCommand += &&
- isEqual(QMAKE_DIR_SEP, \\) {
- copyCommand += $(COPY_DIR) \"$$source\" \"$$target\"
- } else {
- source = $$replace(source, \\\\, /)
- target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
- target = $$replace(target, \\\\, /)
- copyCommand += test -d \"$$target\" || mkdir -p \"$$target\" && cp -r \"$$source\" \"$$target\"
- }
- }
- }
- !isEmpty(copyCommand) {
- copyCommand = @echo Copying application data... && $$copyCommand
- copydeploymentfolders.commands = $$copyCommand
- first.depends = $(first) copydeploymentfolders
- export(first.depends)
- export(copydeploymentfolders.commands)
- QMAKE_EXTRA_TARGETS += first copydeploymentfolders
- }
-} else:unix {
- maemo5 {
- desktopfile.files = $${TARGET}.desktop
- desktopfile.path = /usr/share/applications/hildon
- icon.files = $${TARGET}64.png
- icon.path = /usr/share/icons/hicolor/64x64/apps
- } else:!isEmpty(MEEGO_VERSION_MAJOR) {
- desktopfile.files = $${TARGET}_harmattan.desktop
- desktopfile.path = /usr/share/applications
- icon.files = $${TARGET}80.png
- icon.path = /usr/share/icons/hicolor/80x80/apps
- } else { # Assumed to be a Desktop Unix
- copyCommand =
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
- source = $$replace(source, \\\\, /)
- macx {
- target = $$OUT_PWD/$${TARGET}.app/Contents/Resources/$$eval($${deploymentfolder}.target)
- } else {
- target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
- }
- target = $$replace(target, \\\\, /)
- sourcePathSegments = $$split(source, /)
- targetFullPath = $$target/$$last(sourcePathSegments)
- targetFullPath ~= s,/\\.?/,/,
- !isEqual(source,$$targetFullPath) {
- !isEmpty(copyCommand):copyCommand += &&
- copyCommand += $(MKDIR) \"$$target\"
- copyCommand += && $(COPY_DIR) \"$$source\" \"$$target\"
- }
- }
- !isEmpty(copyCommand) {
- copyCommand = @echo Copying application data... && $$copyCommand
- copydeploymentfolders.commands = $$copyCommand
- first.depends = $(first) copydeploymentfolders
- export(first.depends)
- export(copydeploymentfolders.commands)
- QMAKE_EXTRA_TARGETS += first copydeploymentfolders
- }
- }
- !isEmpty(target.path) {
- installPrefix = $${target.path}
- } else {
- installPrefix = /opt/$${TARGET}
- }
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- itemfiles = $${item}.files
- $$itemfiles = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath = $${installPrefix}/$$eval($${deploymentfolder}.target)
- export($$itemfiles)
- export($$itempath)
- INSTALLS += $$item
- }
-
- !isEmpty(desktopfile.path) {
- export(icon.files)
- export(icon.path)
- export(desktopfile.files)
- export(desktopfile.path)
- INSTALLS += icon desktopfile
- }
-
- isEmpty(target.path) {
- target.path = $${installPrefix}/bin
- export(target.path)
- }
- INSTALLS += target
-}
-
-export (ICON)
-export (INSTALLS)
-export (DEPLOYMENT)
-export (LIBS)
-export (QMAKE_EXTRA_TARGETS)
-}
diff --git a/examples/scatter/doc/images/scatter-example.png b/examples/scatter/doc/images/scatter-example.png
deleted file mode 100644
index 97a9ba78..00000000
--- a/examples/scatter/doc/images/scatter-example.png
+++ /dev/null
Binary files differ
diff --git a/qtdatavisualization.pro b/qtdatavisualization.pro
index d7cb1c90..bb98435e 100644
--- a/qtdatavisualization.pro
+++ b/qtdatavisualization.pro
@@ -7,3 +7,5 @@ load(qt_parts)
contains(QT_CONFIG, opengles1) {
error(QtDataVisualization does not support OpenGL ES 1!)
}
+
+OTHER_FILES += README dist/*
diff --git a/src/datavisualization/axis/qabstract3daxis.cpp b/src/datavisualization/axis/qabstract3daxis.cpp
index 2ee7a25d..39b1230e 100644
--- a/src/datavisualization/axis/qabstract3daxis.cpp
+++ b/src/datavisualization/axis/qabstract3daxis.cpp
@@ -151,7 +151,7 @@ QAbstract3DAxis::AxisType QAbstract3DAxis::type() const
*
* Defines the title for the axis.
*/
-void QAbstract3DAxis::setTitle(QString title)
+void QAbstract3DAxis::setTitle(const QString &title)
{
if (d_ptr->m_title != title) {
d_ptr->m_title = title;
diff --git a/src/datavisualization/axis/qabstract3daxis.h b/src/datavisualization/axis/qabstract3daxis.h
index 28b93f36..0d63615a 100644
--- a/src/datavisualization/axis/qabstract3daxis.h
+++ b/src/datavisualization/axis/qabstract3daxis.h
@@ -20,11 +20,9 @@
#define QABSTRACT3DAXIS_H
#include <QtDataVisualization/qdatavisualizationglobal.h>
-
-#include <QObject>
-#include <QScopedPointer>
-#include <QVector>
-#include <QStringList>
+#include <QtCore/QObject>
+#include <QtCore/QScopedPointer>
+#include <QtCore/QStringList>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -63,7 +61,7 @@ protected:
public:
virtual ~QAbstract3DAxis();
- void setTitle(QString title);
+ void setTitle(const QString &title);
QString title() const;
void setLabels(const QStringList &labels);
@@ -84,7 +82,7 @@ public:
void setRange(float min, float max);
signals:
- void titleChanged(QString newTitle);
+ void titleChanged(const QString &newTitle);
void labelsChanged();
void orientationChanged(AxisOrientation orientation);
void minChanged(float value);
diff --git a/src/datavisualization/axis/qvalue3daxis.h b/src/datavisualization/axis/qvalue3daxis.h
index c930c700..f0af759b 100644
--- a/src/datavisualization/axis/qvalue3daxis.h
+++ b/src/datavisualization/axis/qvalue3daxis.h
@@ -48,7 +48,7 @@ public:
signals:
void segmentCountChanged(int count);
void subSegmentCountChanged(int count);
- void labelFormatChanged(QString format);
+ void labelFormatChanged(const QString &format);
protected:
QValue3DAxisPrivate *dptr();
diff --git a/src/datavisualization/data/abstractitemmodelhandler.cpp b/src/datavisualization/data/abstractitemmodelhandler.cpp
index 63eb7e45..9f2ccd86 100644
--- a/src/datavisualization/data/abstractitemmodelhandler.cpp
+++ b/src/datavisualization/data/abstractitemmodelhandler.cpp
@@ -17,7 +17,6 @@
****************************************************************************/
#include "abstractitemmodelhandler_p.h"
-#include <QTimer>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/data/abstractitemmodelhandler_p.h b/src/datavisualization/data/abstractitemmodelhandler_p.h
index c238a63b..ecbfe61c 100644
--- a/src/datavisualization/data/abstractitemmodelhandler_p.h
+++ b/src/datavisualization/data/abstractitemmodelhandler_p.h
@@ -30,9 +30,9 @@
#define ABSTRACTITEMMODELHANDLER_P_H
#include "datavisualizationglobal_p.h"
-#include <QAbstractItemModel>
-#include <QPointer>
-#include <QTimer>
+#include <QtCore/QAbstractItemModel>
+#include <QtCore/QPointer>
+#include <QtCore/QTimer>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/data/abstractrenderitem.cpp b/src/datavisualization/data/abstractrenderitem.cpp
index 522fd144..59ffab22 100644
--- a/src/datavisualization/data/abstractrenderitem.cpp
+++ b/src/datavisualization/data/abstractrenderitem.cpp
@@ -21,39 +21,17 @@
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
AbstractRenderItem::AbstractRenderItem()
- : m_selectionLabelItem(0)
{
}
AbstractRenderItem::AbstractRenderItem(const AbstractRenderItem &other)
{
- m_selectionLabel = other.m_selectionLabel;
m_translation = other.m_translation;
- m_selectionLabelItem = 0;
+ m_rotation = other.m_rotation;
}
AbstractRenderItem::~AbstractRenderItem()
{
- delete m_selectionLabelItem;
-}
-
-LabelItem &AbstractRenderItem::selectionLabelItem()
-{
- if (!m_selectionLabelItem)
- m_selectionLabelItem = new LabelItem;
- return *m_selectionLabelItem;
-}
-
-void AbstractRenderItem::setSelectionLabel(const QString &label)
-{
- if (m_selectionLabelItem)
- m_selectionLabelItem->clear();
- m_selectionLabel = label;
-}
-
-QString &AbstractRenderItem::selectionLabel()
-{
- return m_selectionLabel;
}
QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/data/abstractrenderitem_p.h b/src/datavisualization/data/abstractrenderitem_p.h
index fa06db54..912a09f3 100644
--- a/src/datavisualization/data/abstractrenderitem_p.h
+++ b/src/datavisualization/data/abstractrenderitem_p.h
@@ -32,10 +32,10 @@
#include "datavisualizationglobal_p.h"
#include "labelitem_p.h"
-#include <QOpenGLFunctions>
-#include <QString>
-#include <QVector3D>
-#include <QQuaternion>
+#include <QtCore/QString>
+#include <QtGui/QOpenGLFunctions>
+#include <QtGui/QVector3D>
+#include <QtGui/QQuaternion>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -50,17 +50,16 @@ public:
inline void setTranslation(const QVector3D &translation) { m_translation = translation; }
inline const QVector3D &translation() const {return m_translation; }
- // Selection label item (containing special selection texture, if mode is activated)
- LabelItem &selectionLabelItem();
-
- // Formatted selection label for item.
- void setSelectionLabel(const QString &label);
- QString &selectionLabel(); // Formats selection label if not previously formatted
+ inline QQuaternion rotation() const { return m_rotation; }
+ inline void setRotation(const QQuaternion &rotation)
+ {
+ if (m_rotation != rotation)
+ m_rotation = rotation;
+ }
protected:
- QString m_selectionLabel;
QVector3D m_translation;
- LabelItem *m_selectionLabelItem;
+ QQuaternion m_rotation;
friend class QAbstractDataItem;
};
diff --git a/src/datavisualization/data/baritemmodelhandler.cpp b/src/datavisualization/data/baritemmodelhandler.cpp
index 611fbcb9..4f44fe1d 100644
--- a/src/datavisualization/data/baritemmodelhandler.cpp
+++ b/src/datavisualization/data/baritemmodelhandler.cpp
@@ -20,6 +20,8 @@
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
+static const int noRoleIndex = -1;
+
BarItemModelHandler::BarItemModelHandler(QItemModelBarDataProxy *proxy, QObject *parent)
: AbstractItemModelHandler(parent),
m_proxy(proxy),
@@ -51,8 +53,9 @@ void BarItemModelHandler::resolveModel()
QHash<int, QByteArray> roleHash = m_itemModel->roleNames();
- // Default to display role if no mapping
+ // Default value role to display role if no mapping
int valueRole = roleHash.key(m_proxy->valueRole().toLatin1(), Qt::DisplayRole);
+ int rotationRole = roleHash.key(m_proxy->rotationRole().toLatin1(), noRoleIndex);
int rowCount = m_itemModel->rowCount();
int columnCount = m_itemModel->columnCount();
@@ -67,8 +70,11 @@ void BarItemModelHandler::resolveModel()
}
for (int i = 0; i < rowCount; i++) {
QBarDataRow &newProxyRow = *m_proxyArray->at(i);
- for (int j = 0; j < columnCount; j++)
+ for (int j = 0; j < columnCount; j++) {
newProxyRow[j].setValue(m_itemModel->index(i, j).data(valueRole).toReal());
+ if (rotationRole != noRoleIndex)
+ newProxyRow[j].setRotation(m_itemModel->index(i, j).data(rotationRole).toReal());
+ }
}
// Generate labels from headers if using model rows/columns
for (int i = 0; i < rowCount; i++)
@@ -92,12 +98,15 @@ void BarItemModelHandler::resolveModel()
// Sort values into rows and columns
typedef QHash<QString, float> ColumnValueMap;
QHash <QString, ColumnValueMap> itemValueMap;
+ QHash <QString, ColumnValueMap> itemRotationMap;
for (int i = 0; i < rowCount; i++) {
for (int j = 0; j < columnCount; j++) {
QModelIndex index = m_itemModel->index(i, j);
QString rowRoleStr = index.data(rowRole).toString();
QString columnRoleStr = index.data(columnRole).toString();
itemValueMap[rowRoleStr][columnRoleStr] = index.data(valueRole).toReal();
+ if (rotationRole != noRoleIndex)
+ itemRotationMap[rowRoleStr][columnRoleStr] = index.data(rotationRole).toReal();
if (generateRows && !rowListHash.value(rowRoleStr, false)) {
rowListHash.insert(rowRoleStr, true);
rowList << rowRoleStr;
@@ -131,8 +140,11 @@ void BarItemModelHandler::resolveModel()
for (int i = 0; i < rowList.size(); i++) {
QString rowKey = rowList.at(i);
QBarDataRow &newProxyRow = *m_proxyArray->at(i);
- for (int j = 0; j < columnList.size(); j++)
+ for (int j = 0; j < columnList.size(); j++) {
newProxyRow[j].setValue(itemValueMap[rowKey][columnList.at(j)]);
+ if (rotationRole != noRoleIndex)
+ newProxyRow[j].setRotation(itemRotationMap[rowKey][columnList.at(j)]);
+ }
}
rowLabels = rowList;
diff --git a/src/datavisualization/data/barrenderitem.cpp b/src/datavisualization/data/barrenderitem.cpp
index 915f3f78..50d2a4b4 100644
--- a/src/datavisualization/data/barrenderitem.cpp
+++ b/src/datavisualization/data/barrenderitem.cpp
@@ -25,7 +25,6 @@ BarRenderItem::BarRenderItem()
: AbstractRenderItem(),
m_value(0),
m_height(0.0f),
- m_sliceLabelItem(0),
m_seriesIndex(0)
{
}
@@ -36,32 +35,58 @@ BarRenderItem::BarRenderItem(const BarRenderItem &other)
m_value = other.m_value;
m_position = other.m_position;
m_height = other.m_height;
- m_sliceLabel = other.m_sliceLabel;
- m_sliceLabelItem = 0;
m_seriesIndex = other.m_seriesIndex;
- m_rotation = other.m_rotation;
}
BarRenderItem::~BarRenderItem()
{
+}
+
+BarRenderSliceItem::BarRenderSliceItem()
+ : BarRenderItem(),
+ m_sliceLabelItem(0)
+{
+}
+
+BarRenderSliceItem::BarRenderSliceItem(const BarRenderSliceItem &other)
+ : BarRenderItem(other)
+{
+ m_sliceLabel = other.m_sliceLabel;
+ m_sliceLabelItem = 0;
+}
+
+BarRenderSliceItem::~BarRenderSliceItem()
+{
delete m_sliceLabelItem;
}
-LabelItem &BarRenderItem::sliceLabelItem()
+void BarRenderSliceItem::setItem(const BarRenderItem &renderItem)
+{
+ m_translation = renderItem.translation();
+ m_rotation = renderItem.rotation();
+ m_value = renderItem.value();
+ m_position = renderItem.position();
+ m_height = renderItem.height();
+ m_seriesIndex = renderItem.seriesIndex();
+ m_sliceLabel = QString();
+ m_sliceLabelItem = 0;
+}
+
+LabelItem &BarRenderSliceItem::sliceLabelItem()
{
if (!m_sliceLabelItem)
m_sliceLabelItem = new LabelItem;
return *m_sliceLabelItem;
}
-void BarRenderItem::setSliceLabel(const QString &label)
+void BarRenderSliceItem::setSliceLabel(const QString &label)
{
if (m_sliceLabelItem)
m_sliceLabelItem->clear();
m_sliceLabel = label;
}
-const QString &BarRenderItem::sliceLabel() const
+const QString &BarRenderSliceItem::sliceLabel() const
{
return m_sliceLabel;
}
diff --git a/src/datavisualization/data/barrenderitem_p.h b/src/datavisualization/data/barrenderitem_p.h
index e1062969..1122053d 100644
--- a/src/datavisualization/data/barrenderitem_p.h
+++ b/src/datavisualization/data/barrenderitem_p.h
@@ -47,48 +47,49 @@ public:
inline const QPoint &position() const { return m_position; }
// Actual cached data value of the bar (needed to trigger label reformats)
- inline void setValue(float value)
- {
- m_value = value;
- // Force reformatting on next access by setting label string to null string
- if (!m_sliceLabel.isNull())
- setSliceLabel(QString());
- if (!m_selectionLabel.isNull())
- setSelectionLabel(QString());
- }
+ inline void setValue(float value) { m_value = value; }
inline float value() const { return m_value; }
// Normalized bar height
inline void setHeight(GLfloat height) { m_height = height; }
inline GLfloat height() const { return m_height; }
- // Label item for formatted label
- LabelItem &sliceLabelItem();
-
- // Formatted label for item.
- void setSliceLabel(const QString &label);
- const QString &sliceLabel() const; // Formats label if not previously formatted
-
// Series index in visual series that this item belongs to.
// This is only utilized by slicing, so it may not be up to date on all items.
inline void setSeriesIndex(int seriesIndex) { m_seriesIndex = seriesIndex; }
inline int seriesIndex() const { return m_seriesIndex; }
- inline void setRotation(const QQuaternion &rotation) { m_rotation = rotation; }
- inline const QQuaternion &rotation() const { return m_rotation; }
-
protected:
float m_value;
QPoint m_position; // x = row, y = column
GLfloat m_height;
- QString m_sliceLabel;
- LabelItem *m_sliceLabelItem;
int m_seriesIndex;
- QQuaternion m_rotation;
friend class QBarDataItem;
};
+class BarRenderSliceItem : public BarRenderItem
+{
+public:
+ BarRenderSliceItem();
+ BarRenderSliceItem(const BarRenderSliceItem &other);
+ virtual ~BarRenderSliceItem();
+
+ void setItem(const BarRenderItem &renderItem);
+
+ // Label item for formatted label
+ LabelItem &sliceLabelItem();
+
+ // Formatted label for item.
+ void setSliceLabel(const QString &label);
+ const QString &sliceLabel() const; // Formats label if not previously formatted
+
+protected:
+ QString m_sliceLabel;
+ LabelItem *m_sliceLabelItem;
+ bool m_isNull;
+};
+
typedef QVector<BarRenderItem> BarRenderItemRow;
typedef QVector<BarRenderItemRow> BarRenderItemArray;
diff --git a/src/datavisualization/data/labelitem_p.h b/src/datavisualization/data/labelitem_p.h
index ca60f742..3a2c1eb1 100644
--- a/src/datavisualization/data/labelitem_p.h
+++ b/src/datavisualization/data/labelitem_p.h
@@ -30,8 +30,8 @@
#define LABELITEM_P_H
#include "datavisualizationglobal_p.h"
-#include <QOpenGLFunctions>
-#include <QSize>
+#include <QtGui/QOpenGLFunctions>
+#include <QtCore/QSize>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/data/qabstract3dseries.cpp b/src/datavisualization/data/qabstract3dseries.cpp
index dc241fdb..4d201c45 100644
--- a/src/datavisualization/data/qabstract3dseries.cpp
+++ b/src/datavisualization/data/qabstract3dseries.cpp
@@ -240,6 +240,14 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION
*/
/*!
+ * \qmlmethod void Abstract3DSeries::setMeshAxisAndAngle(vector3d axis, real angle)
+ *
+ * A convenience function to construct mesh rotation quaternion from axis and angle.
+ *
+ * \sa meshRotation
+ */
+
+/*!
* \internal
*/
QAbstract3DSeries::QAbstract3DSeries(QAbstract3DSeriesPrivate *d, QObject *parent) :
@@ -375,6 +383,16 @@ QQuaternion QAbstract3DSeries::meshRotation() const
}
/*!
+ * A convenience function to construct mesh rotation quaternion from \a axis and \a angle.
+ *
+ * \sa meshRotation
+ */
+void QAbstract3DSeries::setMeshAxisAndAngle(const QVector3D &axis, float angle)
+{
+ setMeshRotation(QQuaternion::fromAxisAndAngle(axis, angle));
+}
+
+/*!
* \property QAbstract3DSeries::userDefinedMesh
*
* Sets the \a fileName for user defined custom mesh for objects that is used when mesh
diff --git a/src/datavisualization/data/qabstract3dseries.h b/src/datavisualization/data/qabstract3dseries.h
index ebb22b7f..9f82901d 100644
--- a/src/datavisualization/data/qabstract3dseries.h
+++ b/src/datavisualization/data/qabstract3dseries.h
@@ -20,10 +20,11 @@
#define QABSTRACT3DSERIES_H
#include <QtDataVisualization/q3dtheme.h>
-#include <QObject>
-#include <QScopedPointer>
-#include <QLinearGradient>
-#include <QQuaternion>
+#include <QtCore/QObject>
+#include <QtCore/QScopedPointer>
+#include <QtCore/QString>
+#include <QtGui/QLinearGradient>
+#include <QtGui/QQuaternion>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -95,6 +96,7 @@ public:
void setMeshRotation(const QQuaternion &rotation);
QQuaternion meshRotation() const;
+ Q_INVOKABLE void setMeshAxisAndAngle(const QVector3D &axis, float angle);
void setUserDefinedMesh(const QString &fileName);
QString userDefinedMesh() const;
@@ -118,20 +120,20 @@ public:
QString name() const;
signals:
- void itemLabelFormatChanged(QString format);
+ void itemLabelFormatChanged(const QString &format);
void visibilityChanged(bool visible);
void meshChanged(Mesh mesh);
void meshSmoothChanged(bool enabled);
- void meshRotationChanged(QQuaternion rotation);
- void userDefinedMeshChanged(QString fileName);
+ void meshRotationChanged(const QQuaternion &rotation);
+ void userDefinedMeshChanged(const QString &fileName);
void colorStyleChanged(Q3DTheme::ColorStyle style);
- void baseColorChanged(QColor color);
- void baseGradientChanged(QLinearGradient gradient);
- void singleHighlightColorChanged(QColor color);
- void singleHighlightGradientChanged(QLinearGradient gradient);
- void multiHighlightColorChanged(QColor color);
- void multiHighlightGradientChanged(QLinearGradient gradient);
- void nameChanged(QString name);
+ void baseColorChanged(const QColor &color);
+ void baseGradientChanged(const QLinearGradient &gradient);
+ void singleHighlightColorChanged(const QColor &color);
+ void singleHighlightGradientChanged(const QLinearGradient &gradient);
+ void multiHighlightColorChanged(const QColor &color);
+ void multiHighlightGradientChanged(const QLinearGradient &gradient);
+ void nameChanged(const QString &name);
protected:
QScopedPointer<QAbstract3DSeriesPrivate> d_ptr;
@@ -142,6 +144,7 @@ private:
friend class Abstract3DController;
friend class Bars3DController;
friend class Surface3DController;
+ friend class Surface3DRenderer;
friend class Scatter3DController;
friend class QBar3DSeries;
friend class SeriesRenderCache;
diff --git a/src/datavisualization/data/qabstract3dseries_p.h b/src/datavisualization/data/qabstract3dseries_p.h
index 6fbabd3d..a803e99b 100644
--- a/src/datavisualization/data/qabstract3dseries_p.h
+++ b/src/datavisualization/data/qabstract3dseries_p.h
@@ -28,7 +28,6 @@
#include "datavisualizationglobal_p.h"
#include "qabstract3dseries.h"
-#include <QString>
#ifndef QABSTRACT3DSERIES_P_H
#define QABSTRACT3DSERIES_P_H
diff --git a/src/datavisualization/data/qabstractdataproxy.h b/src/datavisualization/data/qabstractdataproxy.h
index 52c2e2c6..c643c675 100644
--- a/src/datavisualization/data/qabstractdataproxy.h
+++ b/src/datavisualization/data/qabstractdataproxy.h
@@ -20,9 +20,8 @@
#define QABSTRACTDATAPROXY_H
#include <QtDataVisualization/qdatavisualizationglobal.h>
-
-#include <QObject>
-#include <QScopedPointer>
+#include <QtCore/QObject>
+#include <QtCore/QScopedPointer>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/data/qabstractdataproxy_p.h b/src/datavisualization/data/qabstractdataproxy_p.h
index 093629d5..eb901f4c 100644
--- a/src/datavisualization/data/qabstractdataproxy_p.h
+++ b/src/datavisualization/data/qabstractdataproxy_p.h
@@ -28,7 +28,6 @@
#include "datavisualizationglobal_p.h"
#include "qabstractdataproxy.h"
-#include <QString>
#ifndef QABSTRACTDATAPROXY_P_H
#define QABSTRACTDATAPROXY_P_H
diff --git a/src/datavisualization/data/qbar3dseries.cpp b/src/datavisualization/data/qbar3dseries.cpp
index 1440476b..ed4ffaba 100644
--- a/src/datavisualization/data/qbar3dseries.cpp
+++ b/src/datavisualization/data/qbar3dseries.cpp
@@ -18,6 +18,7 @@
#include "qbar3dseries_p.h"
#include "bars3dcontroller_p.h"
+#include <QtCore/qmath.h>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -114,6 +115,17 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION
*/
/*!
+ * \qmlproperty real Bar3DSeries::meshAngle
+ *
+ * A convenience property for defining the series rotation \a angle in degrees.
+ *
+ * \note: When reading this property, it is calculated from Abstract3DSeries::meshRotation value
+ * using floating point precision and always returns a value from zero to 360 degrees.
+ *
+ * \sa Abstract3DSeries::meshRotation
+ */
+
+/*!
* Constructs QBar3DSeries with the given \a parent.
*/
QBar3DSeries::QBar3DSeries(QObject *parent) :
@@ -121,6 +133,7 @@ QBar3DSeries::QBar3DSeries(QObject *parent) :
{
// Default proxy
dptr()->setDataProxy(new QBarDataProxy);
+ dptr()->connectSignals();
}
/*!
@@ -130,14 +143,7 @@ QBar3DSeries::QBar3DSeries(QBarDataProxy *dataProxy, QObject *parent) :
QAbstract3DSeries(new QBar3DSeriesPrivate(this), parent)
{
dptr()->setDataProxy(dataProxy);
-}
-
-/*!
- * \internal
- */
-QBar3DSeries::QBar3DSeries(QBar3DSeriesPrivate *d, QObject *parent) :
- QAbstract3DSeries(d, parent)
-{
+ dptr()->connectSignals();
}
/*!
@@ -183,7 +189,7 @@ void QBar3DSeries::setSelectedBar(const QPoint &position)
{
// Don't do this in private to avoid loops, as that is used for callback from controller.
if (d_ptr->m_controller)
- static_cast<Bars3DController *>(d_ptr->m_controller)->setSelectedBar(position, this);
+ static_cast<Bars3DController *>(d_ptr->m_controller)->setSelectedBar(position, this, true);
else
dptr()->setSelectedBar(position);
}
@@ -204,6 +210,38 @@ QPoint QBar3DSeries::invalidSelectionPosition()
return Bars3DController::invalidSelectionPosition();
}
+static inline float quaternionAngle(const QQuaternion &rotation)
+{
+ return qAcos(rotation.scalar()) * 360.0f / M_PI;
+}
+
+/*!
+ * \property QBar3DSeries::meshAngle
+ *
+ * A convenience property for defining the series rotation \a angle in degrees.
+ * Setting this property is equivalent to the following call:
+ * \code setMeshRotation(QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, angle)) \endcode
+ *
+ * \note: When reading this property, it is calculated from QAbstract3DSeries::meshRotation value
+ * using floating point precision and always returns a value from zero to 360 degrees.
+ *
+ * \sa QAbstract3DSeries::meshRotation
+ */
+void QBar3DSeries::setMeshAngle(float angle)
+{
+ setMeshRotation(QQuaternion::fromAxisAndAngle(upVector, angle));
+}
+
+float QBar3DSeries::meshAngle() const
+{
+ QQuaternion rotation = meshRotation();
+
+ if (rotation.isIdentity() || rotation.x() != 0.0f || rotation.z() != 0.0f)
+ return 0.0f;
+ else
+ return quaternionAngle(rotation);
+}
+
/*!
* \internal
*/
@@ -279,6 +317,11 @@ void QBar3DSeriesPrivate::connectControllerAndProxy(Abstract3DController *newCon
}
}
+void QBar3DSeriesPrivate::handleMeshRotationChanged(const QQuaternion &rotation)
+{
+ emit qptr()->meshAngleChanged(quaternionAngle(rotation));
+}
+
void QBar3DSeriesPrivate::setSelectedBar(const QPoint &position)
{
if (position != m_selectedBar) {
@@ -287,4 +330,10 @@ void QBar3DSeriesPrivate::setSelectedBar(const QPoint &position)
}
}
+void QBar3DSeriesPrivate::connectSignals()
+{
+ QObject::connect(q_ptr, &QAbstract3DSeries::meshRotationChanged, this,
+ &QBar3DSeriesPrivate::handleMeshRotationChanged);
+}
+
QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/data/qbar3dseries.h b/src/datavisualization/data/qbar3dseries.h
index be748516..c56bc354 100644
--- a/src/datavisualization/data/qbar3dseries.h
+++ b/src/datavisualization/data/qbar3dseries.h
@@ -21,7 +21,7 @@
#include <QtDataVisualization/qabstract3dseries.h>
#include <QtDataVisualization/qbardataproxy.h>
-#include <QPoint>
+#include <QtCore/QPoint>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -32,6 +32,7 @@ class QT_DATAVISUALIZATION_EXPORT QBar3DSeries : public QAbstract3DSeries
Q_OBJECT
Q_PROPERTY(QBarDataProxy *dataProxy READ dataProxy WRITE setDataProxy NOTIFY dataProxyChanged)
Q_PROPERTY(QPoint selectedBar READ selectedBar WRITE setSelectedBar NOTIFY selectedBarChanged)
+ Q_PROPERTY(float meshAngle READ meshAngle WRITE setMeshAngle NOTIFY meshAngleChanged)
public:
explicit QBar3DSeries(QObject *parent = 0);
@@ -45,12 +46,15 @@ public:
QPoint selectedBar() const;
static QPoint invalidSelectionPosition();
+ void setMeshAngle(float angle);
+ float meshAngle() const;
+
signals:
void dataProxyChanged(QBarDataProxy *proxy);
- void selectedBarChanged(QPoint position);
+ void selectedBarChanged(const QPoint &position);
+ void meshAngleChanged(float angle);
protected:
- explicit QBar3DSeries(QBar3DSeriesPrivate *d, QObject *parent = 0);
QBar3DSeriesPrivate *dptr();
const QBar3DSeriesPrivate *dptrc() const;
diff --git a/src/datavisualization/data/qbar3dseries_p.h b/src/datavisualization/data/qbar3dseries_p.h
index 173f1cd9..718f1237 100644
--- a/src/datavisualization/data/qbar3dseries_p.h
+++ b/src/datavisualization/data/qbar3dseries_p.h
@@ -44,8 +44,12 @@ public:
virtual void setDataProxy(QAbstractDataProxy *proxy);
virtual void connectControllerAndProxy(Abstract3DController *newController);
+ void handleMeshRotationChanged(const QQuaternion &rotation);
+
void setSelectedBar(const QPoint &position);
+ void connectSignals();
+
private:
QBar3DSeries *qptr();
diff --git a/src/datavisualization/data/qbardataitem.h b/src/datavisualization/data/qbardataitem.h
index 84e7cd92..e7fce93b 100644
--- a/src/datavisualization/data/qbardataitem.h
+++ b/src/datavisualization/data/qbardataitem.h
@@ -42,7 +42,7 @@ public:
inline float rotation() const { return m_angle; }
protected:
- virtual void createExtraData();
+ void createExtraData();
QBarDataItemPrivate *d_ptr;
diff --git a/src/datavisualization/data/qbardataproxy.cpp b/src/datavisualization/data/qbardataproxy.cpp
index a26e446e..d2553f32 100644
--- a/src/datavisualization/data/qbardataproxy.cpp
+++ b/src/datavisualization/data/qbardataproxy.cpp
@@ -130,7 +130,7 @@ QBarDataProxy::~QBarDataProxy()
*
* The series this proxy is attached to.
*/
-QBar3DSeries *QBarDataProxy::series()
+QBar3DSeries *QBarDataProxy::series() const
{
return static_cast<QBar3DSeries *>(d_ptr->series());
}
@@ -227,6 +227,15 @@ void QBarDataProxy::setItem(int rowIndex, int columnIndex, const QBarDataItem &i
}
/*!
+ * Changes a single item at \a position to the \a item.
+ * The X-value of \a position indicates the row and the Y-value indicates the column.
+ */
+void QBarDataProxy::setItem(const QPoint &position, const QBarDataItem &item)
+{
+ setItem(position.x(), position.y(), item);
+}
+
+/*!
* Adds a new \a row to the end of array.
* Existing row labels are not affected.
*
@@ -427,6 +436,16 @@ const QBarDataItem *QBarDataProxy::itemAt(int rowIndex, int columnIndex) const
}
/*!
+ * \return pointer to the item at \a position. The X-value of \a position indicates the row
+ * and the Y-value indicates the column. The item is guaranteed to be valid only
+ * until the next call that modifies data.
+ */
+const QBarDataItem *QBarDataProxy::itemAt(const QPoint &position) const
+{
+ return itemAt(position.x(), position.y());
+}
+
+/*!
* \internal
*/
QBarDataProxyPrivate *QBarDataProxy::dptr()
diff --git a/src/datavisualization/data/qbardataproxy.h b/src/datavisualization/data/qbardataproxy.h
index 0ad71365..55c11de3 100644
--- a/src/datavisualization/data/qbardataproxy.h
+++ b/src/datavisualization/data/qbardataproxy.h
@@ -21,8 +21,8 @@
#include <QtDataVisualization/qabstractdataproxy.h>
#include <QtDataVisualization/qbardataitem.h>
-#include <QVector>
-#include <QStringList>
+#include <QtCore/QVector>
+#include <QtCore/QStringList>
namespace QtDataVisualization {
// typedefs introduced this way because QDoc doesn't understand namespace macros
@@ -47,7 +47,7 @@ public:
explicit QBarDataProxy(QObject *parent = 0);
virtual ~QBarDataProxy();
- QBar3DSeries *series();
+ QBar3DSeries *series() const;
int rowCount() const;
QStringList rowLabels() const;
@@ -58,6 +58,7 @@ public:
const QBarDataArray *array() const;
const QBarDataRow *rowAt(int rowIndex) const;
const QBarDataItem *itemAt(int rowIndex, int columnIndex) const;
+ const QBarDataItem *itemAt(const QPoint &position) const;
void resetArray();
void resetArray(QBarDataArray *newArray);
@@ -70,6 +71,7 @@ public:
void setRows(int rowIndex, const QBarDataArray &rows, const QStringList &labels);
void setItem(int rowIndex, int columnIndex, const QBarDataItem &item);
+ void setItem(const QPoint &position, const QBarDataItem &item);
int addRow(QBarDataRow *row);
int addRow(QBarDataRow *row, const QString &label);
diff --git a/src/datavisualization/data/qheightmapsurfacedataproxy.cpp b/src/datavisualization/data/qheightmapsurfacedataproxy.cpp
index 9ac5c90f..1aead1d7 100644
--- a/src/datavisualization/data/qheightmapsurfacedataproxy.cpp
+++ b/src/datavisualization/data/qheightmapsurfacedataproxy.cpp
@@ -134,6 +134,18 @@ QHeightMapSurfaceDataProxy::QHeightMapSurfaceDataProxy(const QImage &image, QObj
}
/*!
+ * Constructs QHeightMapSurfaceDataProxy from the given image \a filename and \a parent. Height map is set
+ * by calling setHeightMapFile() with \a filename.
+ *
+ * \sa heightMapFile
+ */
+QHeightMapSurfaceDataProxy::QHeightMapSurfaceDataProxy(const QString &filename, QObject *parent) :
+ QSurfaceDataProxy(new QHeightMapSurfaceDataProxyPrivate(this), parent)
+{
+ setHeightMapFile(filename);
+}
+
+/*!
* \internal
*/
QHeightMapSurfaceDataProxy::QHeightMapSurfaceDataProxy(
diff --git a/src/datavisualization/data/qheightmapsurfacedataproxy.h b/src/datavisualization/data/qheightmapsurfacedataproxy.h
index d506d4e8..5b6eb284 100644
--- a/src/datavisualization/data/qheightmapsurfacedataproxy.h
+++ b/src/datavisualization/data/qheightmapsurfacedataproxy.h
@@ -20,8 +20,8 @@
#define QHEIGHTMAPSURFACEDATAPROXY_H
#include <QtDataVisualization/qsurfacedataproxy.h>
-
-#include <QImage>
+#include <QtGui/QImage>
+#include <QtCore/QString>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -41,6 +41,7 @@ class QT_DATAVISUALIZATION_EXPORT QHeightMapSurfaceDataProxy : public QSurfaceDa
public:
explicit QHeightMapSurfaceDataProxy(QObject *parent = 0);
explicit QHeightMapSurfaceDataProxy(const QImage &image, QObject *parent = 0);
+ explicit QHeightMapSurfaceDataProxy(const QString &filename, QObject *parent = 0);
virtual ~QHeightMapSurfaceDataProxy();
void setHeightMap(const QImage &image);
@@ -59,8 +60,8 @@ public:
float maxZValue() const;
signals:
- void heightMapChanged(QImage image);
- void heightMapFileChanged(QString filename);
+ void heightMapChanged(const QImage &image);
+ void heightMapFileChanged(const QString &filename);
void minXValueChanged(float value);
void maxXValueChanged(float value);
void minZValueChanged(float value);
diff --git a/src/datavisualization/data/qheightmapsurfacedataproxy_p.h b/src/datavisualization/data/qheightmapsurfacedataproxy_p.h
index 0e947666..5cc9993a 100644
--- a/src/datavisualization/data/qheightmapsurfacedataproxy_p.h
+++ b/src/datavisualization/data/qheightmapsurfacedataproxy_p.h
@@ -31,7 +31,7 @@
#include "qheightmapsurfacedataproxy.h"
#include "qsurfacedataproxy_p.h"
-#include <QTimer>
+#include <QtCore/QTimer>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/data/qitemmodelbardataproxy.cpp b/src/datavisualization/data/qitemmodelbardataproxy.cpp
index 97289da1..0e880c77 100644
--- a/src/datavisualization/data/qitemmodelbardataproxy.cpp
+++ b/src/datavisualization/data/qitemmodelbardataproxy.cpp
@@ -18,7 +18,6 @@
#include "qitemmodelbardataproxy_p.h"
#include "baritemmodelhandler_p.h"
-#include <QTimer>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -105,6 +104,12 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION
*/
/*!
+ * \qmlproperty string ItemModelBarDataProxy::rotationRole
+ *
+ * Defines the rotation role for the mapping.
+ */
+
+/*!
* \qmlproperty list ItemModelBarDataProxy::rowCategories
* The row categories of the mapping. Only items with row roles that are found in this list are
* included when the data is resolved. The rows are ordered in the same order as they are in this list.
@@ -195,6 +200,27 @@ QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemMod
/*!
* Constructs QItemModelBarDataProxy with \a itemModel and optional \a parent. Proxy doesn't take
* ownership of the \a itemModel, as typically item models are owned by other controls.
+ * The role mappings are set with \a rowRole, \a columnRole, \a valueRole, and \a rotationRole.
+ */
+QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemModel,
+ const QString &rowRole,
+ const QString &columnRole,
+ const QString &valueRole,
+ const QString &rotationRole,
+ QObject *parent)
+ : QBarDataProxy(new QItemModelBarDataProxyPrivate(this), parent)
+{
+ dptr()->m_itemModelHandler->setItemModel(itemModel);
+ dptr()->m_rowRole = rowRole;
+ dptr()->m_columnRole = columnRole;
+ dptr()->m_valueRole = valueRole;
+ dptr()->m_rotationRole = rotationRole;
+ dptr()->connectItemModelHandler();
+}
+
+/*!
+ * Constructs QItemModelBarDataProxy with \a itemModel and optional \a parent. Proxy doesn't take
+ * ownership of the \a itemModel, as typically item models are owned by other controls.
* The role mappings are set with \a rowRole, \a columnRole, and \a valueRole.
* Row and column categories are set with \a rowCategories and \a columnCategories.
* This constructor also sets autoRowCategories and autoColumnCategories to false.
@@ -220,6 +246,35 @@ QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemMod
}
/*!
+ * Constructs QItemModelBarDataProxy with \a itemModel and optional \a parent. Proxy doesn't take
+ * ownership of the \a itemModel, as typically item models are owned by other controls.
+ * The role mappings are set with \a rowRole, \a columnRole, \a valueRole, and \a rotationRole.
+ * Row and column categories are set with \a rowCategories and \a columnCategories.
+ * This constructor also sets autoRowCategories and autoColumnCategories to false.
+ */
+QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemModel,
+ const QString &rowRole,
+ const QString &columnRole,
+ const QString &valueRole,
+ const QString &rotationRole,
+ const QStringList &rowCategories,
+ const QStringList &columnCategories,
+ QObject *parent)
+ : QBarDataProxy(new QItemModelBarDataProxyPrivate(this), parent)
+{
+ dptr()->m_itemModelHandler->setItemModel(itemModel);
+ dptr()->m_rowRole = rowRole;
+ dptr()->m_columnRole = columnRole;
+ dptr()->m_valueRole = valueRole;
+ dptr()->m_rotationRole = rotationRole;
+ dptr()->m_rowCategories = rowCategories;
+ dptr()->m_columnCategories = columnCategories;
+ dptr()->m_autoRowCategories = false;
+ dptr()->m_autoColumnCategories = false;
+ dptr()->connectItemModelHandler();
+}
+
+/*!
* Destroys QItemModelBarDataProxy.
*/
QItemModelBarDataProxy::~QItemModelBarDataProxy()
@@ -297,6 +352,24 @@ QString QItemModelBarDataProxy::valueRole() const
}
/*!
+ * \property QItemModelBarDataProxy::rotationRole
+ *
+ * Defines the rotation role for the mapping.
+ */
+void QItemModelBarDataProxy::setRotationRole(const QString &role)
+{
+ if (dptr()->m_rotationRole != role) {
+ dptr()->m_rotationRole = role;
+ emit rotationRoleChanged(role);
+ }
+}
+
+QString QItemModelBarDataProxy::rotationRole() const
+{
+ return dptrc()->m_rotationRole;
+}
+
+/*!
* \property QItemModelBarDataProxy::rowCategories
*
* Defines the row categories for the mapping.
@@ -305,7 +378,7 @@ void QItemModelBarDataProxy::setRowCategories(const QStringList &categories)
{
if (dptr()->m_rowCategories != categories) {
dptr()->m_rowCategories = categories;
- emit rowCategoriesChanged(categories);
+ emit rowCategoriesChanged();
}
}
@@ -323,7 +396,7 @@ void QItemModelBarDataProxy::setColumnCategories(const QStringList &categories)
{
if (dptr()->m_columnCategories != categories) {
dptr()->m_columnCategories = categories;
- emit columnCategoriesChanged(categories);
+ emit columnCategoriesChanged();
}
}
@@ -392,24 +465,26 @@ bool QItemModelBarDataProxy::autoColumnCategories() const
}
/*!
- * Changes \a rowRole, \a columnRole, \a valueRole, \a rowCategories and \a columnCategories to the
- * mapping.
+ * Changes \a rowRole, \a columnRole, \a valueRole, \a rotationRole,
+ * \a rowCategories and \a columnCategories to the mapping.
*/
void QItemModelBarDataProxy::remap(const QString &rowRole,
const QString &columnRole,
const QString &valueRole,
+ const QString &rotationRole,
const QStringList &rowCategories,
const QStringList &columnCategories)
{
setRowRole(rowRole);
setColumnRole(columnRole);
setValueRole(valueRole);
+ setRotationRole(rotationRole);
setRowCategories(rowCategories);
setColumnCategories(columnCategories);
}
/*!
- * /return index of the specified \a category in row categories list.
+ * \return index of the specified \a category in row categories list.
* If the row categories list is empty, -1 is returned.
* \note If the automatic row categories generation is in use, this method will
* not return a valid index before the data in the model is resolved for the first time.
@@ -420,7 +495,7 @@ int QItemModelBarDataProxy::rowCategoryIndex(const QString &category)
}
/*!
- * /return index of the specified \a category in column categories list.
+ * \return index of the specified \a category in column categories list.
* If the category is not found, -1 is returned.
* \note If the automatic column categories generation is in use, this method will
* not return a valid index before the data in the model is resolved for the first time.
@@ -477,6 +552,8 @@ void QItemModelBarDataProxyPrivate::connectItemModelHandler()
m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged);
QObject::connect(qptr(), &QItemModelBarDataProxy::valueRoleChanged,
m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged);
+ QObject::connect(qptr(), &QItemModelBarDataProxy::rotationRoleChanged,
+ m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged);
QObject::connect(qptr(), &QItemModelBarDataProxy::rowCategoriesChanged,
m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged);
QObject::connect(qptr(), &QItemModelBarDataProxy::columnCategoriesChanged,
diff --git a/src/datavisualization/data/qitemmodelbardataproxy.h b/src/datavisualization/data/qitemmodelbardataproxy.h
index 4e62b4c3..f19b4445 100644
--- a/src/datavisualization/data/qitemmodelbardataproxy.h
+++ b/src/datavisualization/data/qitemmodelbardataproxy.h
@@ -20,8 +20,7 @@
#define QITEMMODELBARDATAPROXY_H
#include <QtDataVisualization/qbardataproxy.h>
-#include <QAbstractItemModel>
-#include <QStringList>
+#include <QtCore/QAbstractItemModel>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -34,6 +33,7 @@ class QT_DATAVISUALIZATION_EXPORT QItemModelBarDataProxy : public QBarDataProxy
Q_PROPERTY(QString rowRole READ rowRole WRITE setRowRole NOTIFY rowRoleChanged)
Q_PROPERTY(QString columnRole READ columnRole WRITE setColumnRole NOTIFY columnRoleChanged)
Q_PROPERTY(QString valueRole READ valueRole WRITE setValueRole NOTIFY valueRoleChanged)
+ Q_PROPERTY(QString rotationRole READ rotationRole WRITE setRotationRole NOTIFY rotationRoleChanged)
Q_PROPERTY(QStringList rowCategories READ rowCategories WRITE setRowCategories NOTIFY rowCategoriesChanged)
Q_PROPERTY(QStringList columnCategories READ columnCategories WRITE setColumnCategories NOTIFY columnCategoriesChanged)
Q_PROPERTY(bool useModelCategories READ useModelCategories WRITE setUseModelCategories NOTIFY useModelCategoriesChanged)
@@ -50,8 +50,15 @@ public:
QObject *parent = 0);
QItemModelBarDataProxy(const QAbstractItemModel *itemModel, const QString &rowRole,
const QString &columnRole, const QString &valueRole,
+ const QString &rotationRole, QObject *parent = 0);
+ QItemModelBarDataProxy(const QAbstractItemModel *itemModel, const QString &rowRole,
+ const QString &columnRole, const QString &valueRole,
const QStringList &rowCategories, const QStringList &columnCategories,
QObject *parent = 0);
+ QItemModelBarDataProxy(const QAbstractItemModel *itemModel, const QString &rowRole,
+ const QString &columnRole, const QString &valueRole,
+ const QString &rotationRole, const QStringList &rowCategories,
+ const QStringList &columnCategories, QObject *parent = 0);
virtual ~QItemModelBarDataProxy();
void setItemModel(const QAbstractItemModel *itemModel);
@@ -63,6 +70,8 @@ public:
QString columnRole() const;
void setValueRole(const QString &role);
QString valueRole() const;
+ void setRotationRole(const QString &role);
+ QString rotationRole() const;
void setRowCategories(const QStringList &categories);
QStringList rowCategories() const;
@@ -77,7 +86,8 @@ public:
bool autoColumnCategories() const;
void remap(const QString &rowRole, const QString &columnRole,
- const QString &valueRole, const QStringList &rowCategories,
+ const QString &valueRole, const QString &rotationRole,
+ const QStringList &rowCategories,
const QStringList &columnCategories);
Q_INVOKABLE int rowCategoryIndex(const QString& category);
@@ -85,11 +95,12 @@ public:
signals:
void itemModelChanged(const QAbstractItemModel* itemModel);
- void rowRoleChanged(QString role);
- void columnRoleChanged(QString role);
- void valueRoleChanged(QString role);
- void rowCategoriesChanged(QStringList categories);
- void columnCategoriesChanged(QStringList categories);
+ void rowRoleChanged(const QString &role);
+ void columnRoleChanged(const QString &role);
+ void valueRoleChanged(const QString &role);
+ void rotationRoleChanged(const QString &role);
+ void rowCategoriesChanged();
+ void columnCategoriesChanged();
void useModelCategoriesChanged(bool enable);
void autoRowCategoriesChanged(bool enable);
void autoColumnCategoriesChanged(bool enable);
diff --git a/src/datavisualization/data/qitemmodelbardataproxy_p.h b/src/datavisualization/data/qitemmodelbardataproxy_p.h
index 0c987a00..2fd74bb2 100644
--- a/src/datavisualization/data/qitemmodelbardataproxy_p.h
+++ b/src/datavisualization/data/qitemmodelbardataproxy_p.h
@@ -53,6 +53,7 @@ private:
QString m_rowRole;
QString m_columnRole;
QString m_valueRole;
+ QString m_rotationRole;
// For row/column items, sort items into these categories. Other categories are ignored.
QStringList m_rowCategories;
diff --git a/src/datavisualization/data/qitemmodelscatterdataproxy.cpp b/src/datavisualization/data/qitemmodelscatterdataproxy.cpp
index 1edee53c..a5287abc 100644
--- a/src/datavisualization/data/qitemmodelscatterdataproxy.cpp
+++ b/src/datavisualization/data/qitemmodelscatterdataproxy.cpp
@@ -18,7 +18,6 @@
#include "qitemmodelscatterdataproxy_p.h"
#include "scatteritemmodelhandler_p.h"
-#include <QTimer>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -93,6 +92,16 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION
*/
/*!
+ * \qmlproperty string ItemModelScatterDataProxy::rotationRole
+ *
+ * Defines the rotation role for the mapping.
+ * The model may supply the value for rotation as either variant that is directly convertible
+ * to QQuaternion, or as one of the string representations: \c{"scalar,x,y,z"} or \c{"@angle,x,y,z"}. The first
+ * will construct the quaternion directly with given values, and the second one will construct
+ * the quaternion using QQuaternion::fromAxisAndAngle() method.
+ */
+
+/*!
* Constructs QItemModelScatterDataProxy with optional \a parent.
*/
QItemModelScatterDataProxy::QItemModelScatterDataProxy(QObject *parent)
@@ -134,6 +143,28 @@ QItemModelScatterDataProxy::QItemModelScatterDataProxy(const QAbstractItemModel
}
/*!
+ * Constructs QItemModelScatterDataProxy with \a itemModel and optional \a parent. Proxy doesn't take
+ * ownership of the \a itemModel, as typically item models are owned by other controls.
+ * The xPosRole property is set to \a xPosRole, yPosRole property to \a yPosRole, zPosRole property
+ * to \a zPosRole, and rotationRole property to \a rotationRole.
+ */
+QItemModelScatterDataProxy::QItemModelScatterDataProxy(const QAbstractItemModel *itemModel,
+ const QString &xPosRole,
+ const QString &yPosRole,
+ const QString &zPosRole,
+ const QString &rotationRole,
+ QObject *parent)
+ : QScatterDataProxy(new QItemModelScatterDataProxyPrivate(this), parent)
+{
+ dptr()->m_itemModelHandler->setItemModel(itemModel);
+ dptr()->m_xPosRole = xPosRole;
+ dptr()->m_yPosRole = yPosRole;
+ dptr()->m_zPosRole = zPosRole;
+ dptr()->m_rotationRole = rotationRole;
+ dptr()->connectItemModelHandler();
+}
+
+/*!
* Destroys QItemModelScatterDataProxy.
*/
QItemModelScatterDataProxy::~QItemModelScatterDataProxy()
@@ -211,14 +242,38 @@ QString QItemModelScatterDataProxy::zPosRole() const
}
/*!
- * Changes \a xPosRole, \a yPosRole and \a zPosRole mapping.
+ * \property QItemModelScatterDataProxy::rotationRole
+ *
+ * Defines the rotation role for the mapping.
+ *
+ * The model may supply the value for rotation as either variant that is directly convertible
+ * to QQuartenion, or as one of the string representations: \c{"scalar,x,y,z"} or \c{"@angle,x,y,z"}. The first
+ * will construct the quaternion directly with given values, and the second one will construct
+ * the quaternion using QQuaternion::fromAxisAndAngle() method.
+ */
+void QItemModelScatterDataProxy::setRotationRole(const QString &role)
+{
+ if (dptr()->m_rotationRole != role) {
+ dptr()->m_rotationRole = role;
+ emit rotationRoleChanged(role);
+ }
+}
+
+QString QItemModelScatterDataProxy::rotationRole() const
+{
+ return dptrc()->m_rotationRole;
+}
+
+/*!
+ * Changes \a xPosRole, \a yPosRole, \a zPosRole, and \a rotationRole mapping.
*/
void QItemModelScatterDataProxy::remap(const QString &xPosRole, const QString &yPosRole,
- const QString &zPosRole)
+ const QString &zPosRole, const QString &rotationRole)
{
setXPosRole(xPosRole);
setYPosRole(yPosRole);
setZPosRole(zPosRole);
+ setRotationRole(rotationRole);
}
/*!
diff --git a/src/datavisualization/data/qitemmodelscatterdataproxy.h b/src/datavisualization/data/qitemmodelscatterdataproxy.h
index 0f69afa7..c6d2245d 100644
--- a/src/datavisualization/data/qitemmodelscatterdataproxy.h
+++ b/src/datavisualization/data/qitemmodelscatterdataproxy.h
@@ -20,8 +20,8 @@
#define QITEMMODELSCATTERDATAPROXY_H
#include <QtDataVisualization/qscatterdataproxy.h>
-#include <QAbstractItemModel>
-#include <QStringList>
+#include <QtCore/QAbstractItemModel>
+#include <QtCore/QString>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -34,6 +34,7 @@ class QT_DATAVISUALIZATION_EXPORT QItemModelScatterDataProxy : public QScatterDa
Q_PROPERTY(QString xPosRole READ xPosRole WRITE setXPosRole NOTIFY xPosRoleChanged)
Q_PROPERTY(QString yPosRole READ yPosRole WRITE setYPosRole NOTIFY yPosRoleChanged)
Q_PROPERTY(QString zPosRole READ zPosRole WRITE setZPosRole NOTIFY zPosRoleChanged)
+ Q_PROPERTY(QString rotationRole READ rotationRole WRITE setRotationRole NOTIFY rotationRoleChanged)
public:
explicit QItemModelScatterDataProxy(QObject *parent = 0);
@@ -41,6 +42,10 @@ public:
QItemModelScatterDataProxy(const QAbstractItemModel *itemModel,
const QString &xPosRole, const QString &yPosRole,
const QString &zPosRole, QObject *parent = 0);
+ QItemModelScatterDataProxy(const QAbstractItemModel *itemModel,
+ const QString &xPosRole, const QString &yPosRole,
+ const QString &zPosRole, const QString &rotationRole,
+ QObject *parent = 0);
virtual ~QItemModelScatterDataProxy();
void setItemModel(const QAbstractItemModel *itemModel);
@@ -52,14 +57,18 @@ public:
QString yPosRole() const;
void setZPosRole(const QString &role);
QString zPosRole() const;
+ void setRotationRole(const QString &role);
+ QString rotationRole() const;
- void remap(const QString &xPosRole, const QString &yPosRole, const QString &zPosRole);
+ void remap(const QString &xPosRole, const QString &yPosRole, const QString &zPosRole,
+ const QString &rotationRole);
signals:
void itemModelChanged(const QAbstractItemModel* itemModel);
- void xPosRoleChanged(QString role);
- void yPosRoleChanged(QString role);
- void zPosRoleChanged(QString role);
+ void xPosRoleChanged(const QString &role);
+ void yPosRoleChanged(const QString &role);
+ void zPosRoleChanged(const QString &role);
+ void rotationRoleChanged(const QString &role);
protected:
QItemModelScatterDataProxyPrivate *dptr();
diff --git a/src/datavisualization/data/qitemmodelscatterdataproxy_p.h b/src/datavisualization/data/qitemmodelscatterdataproxy_p.h
index b8804c5c..4e1f321f 100644
--- a/src/datavisualization/data/qitemmodelscatterdataproxy_p.h
+++ b/src/datavisualization/data/qitemmodelscatterdataproxy_p.h
@@ -52,6 +52,7 @@ private:
QString m_xPosRole;
QString m_yPosRole;
QString m_zPosRole;
+ QString m_rotationRole;
friend class ScatterItemModelHandler;
friend class QItemModelScatterDataProxy;
diff --git a/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp b/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp
index 0c206b81..f15a8923 100644
--- a/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp
+++ b/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp
@@ -18,7 +18,6 @@
#include "qitemmodelsurfacedataproxy_p.h"
#include "surfaceitemmodelhandler_p.h"
-#include <QTimer>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -30,7 +29,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION
*
* QItemModelSurfaceDataProxy allows you to use QAbstractItemModel derived models as a data source
* for Q3DSurface. It uses the defined mappings to map data from the model to rows, columns, and
- * values of Q3DSurface graph.
+ * surface points of Q3DSurface graph.
*
* Data is resolved asynchronously whenever the mapping or the model changes.
* QSurfaceDataProxy::arrayReset() is emitted when the data has been resolved.
@@ -39,8 +38,12 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION
*
* 1) If useModelCategories property is set to true, this proxy will map rows and
* columns of QAbstractItemModel to rows and columns of Q3DSurface, and uses the value returned for
- * Qt::DisplayRole as bar value by default.
- * The value role to be used can be redefined if Qt::DisplayRole is not suitable.
+ * Qt::DisplayRole as Y-position by default. Row and column headers are used for Z-position and
+ * X-position by default, if they can be converted to floats. Otherwise row and column indices
+ * are used.
+ * The Y-position role to be used can be redefined if Qt::DisplayRole is not suitable.
+ * The Z-position and X-position roles to be used can be redefined if the headers or indices
+ * are not suitable.
*
* 2) For models that do not have data already neatly sorted into rows and columns, such as
* QAbstractListModel based models, you can define a role from the model to map for each of row,
@@ -105,10 +108,18 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION
*/
/*!
- * \qmlproperty string ItemModelSurfaceDataProxy::valueRole
- * The value role of the mapping.
- * The value indicated by value role is set as Y-coodrinate value of the
- * QSurfaceDataItem when model data is resolved.
+ * \qmlproperty string ItemModelSurfaceDataProxy::xPosRole
+ * The X position role of the mapping.
+ */
+
+/*!
+ * \qmlproperty string ItemModelSurfaceDataProxy::yPosRole
+ * The Y position role of the mapping.
+ */
+
+/*!
+ * \qmlproperty string ItemModelSurfaceDataProxy::zPosRole
+ * The Z position role of the mapping.
*/
/*!
@@ -169,17 +180,17 @@ QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(const QAbstractItemModel
/*!
* Constructs QItemModelSurfaceDataProxy with \a itemModel and optional \a parent. Proxy doesn't take
* ownership of the \a itemModel, as typically item models are owned by other controls.
- * The value role is set to \a valueRole.
+ * The yPosRole role is set to \a yPosRole.
* This constructor is meant to be used with models that have data properly sorted
* in rows and columns already, so it also sets useModelCategories property to true.
*/
QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel,
- const QString &valueRole,
+ const QString &yPosRole,
QObject *parent)
: QSurfaceDataProxy(new QItemModelSurfaceDataProxyPrivate(this), parent)
{
dptr()->m_itemModelHandler->setItemModel(itemModel);
- dptr()->m_valueRole = valueRole;
+ dptr()->m_yPosRole = yPosRole;
dptr()->m_useModelCategories = true;
dptr()->connectItemModelHandler();
}
@@ -187,33 +198,93 @@ QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(const QAbstractItemModel
/*!
* Constructs QItemModelSurfaceDataProxy with \a itemModel and optional \a parent. Proxy doesn't take
* ownership of the \a itemModel, as typically item models are owned by other controls.
- * The role mappings are set with \a rowRole, \a columnRole, and \a valueRole.
+ * The role mappings are set with \a rowRole, \a columnRole, and \a yPosRole.
+ * The zPosRole and the xPosRole are set to \a rowRole and \a columnRole, respectively.
+ */
+QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel,
+ const QString &rowRole,
+ const QString &columnRole,
+ const QString &yPosRole,
+ QObject *parent)
+ : QSurfaceDataProxy(new QItemModelSurfaceDataProxyPrivate(this), parent)
+{
+ dptr()->m_itemModelHandler->setItemModel(itemModel);
+ dptr()->m_rowRole = rowRole;
+ dptr()->m_columnRole = columnRole;
+ dptr()->m_xPosRole = columnRole;
+ dptr()->m_yPosRole = yPosRole;
+ dptr()->m_zPosRole = rowRole;
+ dptr()->connectItemModelHandler();
+}
+
+/*!
+ * Constructs QItemModelSurfaceDataProxy with \a itemModel and optional \a parent. Proxy doesn't take
+ * ownership of the \a itemModel, as typically item models are owned by other controls.
+ * The role mappings are set with \a rowRole, \a columnRole, \a xPosRole, \a yPosRole, and
+ * \a zPosRole.
+ */
+QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel,
+ const QString &rowRole,
+ const QString &columnRole,
+ const QString &xPosRole,
+ const QString &yPosRole,
+ const QString &zPosRole,
+ QObject *parent)
+ : QSurfaceDataProxy(new QItemModelSurfaceDataProxyPrivate(this), parent)
+{
+ dptr()->m_itemModelHandler->setItemModel(itemModel);
+ dptr()->m_rowRole = rowRole;
+ dptr()->m_columnRole = columnRole;
+ dptr()->m_xPosRole = xPosRole;
+ dptr()->m_yPosRole = yPosRole;
+ dptr()->m_zPosRole = zPosRole;
+ dptr()->connectItemModelHandler();
+}
+
+/*!
+ * Constructs QItemModelSurfaceDataProxy with \a itemModel and optional \a parent. Proxy doesn't take
+ * ownership of the \a itemModel, as typically item models are owned by other controls.
+ * The role mappings are set with \a rowRole, \a columnRole, and \a yPosRole.
+ * The zPosRole and the xPosRole are set to \a rowRole and \a columnRole, respectively.
+ * Row and column categories are set with \a rowCategories and \a columnCategories.
+ * This constructor also sets autoRowCategories and autoColumnCategories to false.
*/
QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel,
const QString &rowRole,
const QString &columnRole,
- const QString &valueRole,
+ const QString &yPosRole,
+ const QStringList &rowCategories,
+ const QStringList &columnCategories,
QObject *parent)
: QSurfaceDataProxy(new QItemModelSurfaceDataProxyPrivate(this), parent)
{
dptr()->m_itemModelHandler->setItemModel(itemModel);
dptr()->m_rowRole = rowRole;
dptr()->m_columnRole = columnRole;
- dptr()->m_valueRole = valueRole;
+ dptr()->m_xPosRole = columnRole;
+ dptr()->m_yPosRole = yPosRole;
+ dptr()->m_zPosRole = rowRole;
+ dptr()->m_rowCategories = rowCategories;
+ dptr()->m_columnCategories = columnCategories;
+ dptr()->m_autoRowCategories = false;
+ dptr()->m_autoColumnCategories = false;
dptr()->connectItemModelHandler();
}
/*!
* Constructs QItemModelSurfaceDataProxy with \a itemModel and optional \a parent. Proxy doesn't take
* ownership of the \a itemModel, as typically item models are owned by other controls.
- * The role mappings are set with \a rowRole, \a columnRole, and \a valueRole.
+ * The role mappings are set with \a rowRole, \a columnRole, \a xPosRole, \a yPosRole,
+ * and \a zPosRole.
* Row and column categories are set with \a rowCategories and \a columnCategories.
* This constructor also sets autoRowCategories and autoColumnCategories to false.
*/
QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel,
const QString &rowRole,
const QString &columnRole,
- const QString &valueRole,
+ const QString &xPosRole,
+ const QString &yPosRole,
+ const QString &zPosRole,
const QStringList &rowCategories,
const QStringList &columnCategories,
QObject *parent)
@@ -222,7 +293,9 @@ QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(const QAbstractItemModel
dptr()->m_itemModelHandler->setItemModel(itemModel);
dptr()->m_rowRole = rowRole;
dptr()->m_columnRole = columnRole;
- dptr()->m_valueRole = valueRole;
+ dptr()->m_xPosRole = xPosRole;
+ dptr()->m_yPosRole = yPosRole;
+ dptr()->m_zPosRole = zPosRole;
dptr()->m_rowCategories = rowCategories;
dptr()->m_columnCategories = columnCategories;
dptr()->m_autoRowCategories = false;
@@ -290,21 +363,57 @@ QString QItemModelSurfaceDataProxy::columnRole() const
}
/*!
- * \property QItemModelSurfaceDataProxy::valueRole
+ * \property QItemModelSurfaceDataProxy::xPosRole
+ *
+ * Defines the X position role for the mapping.
+ */
+void QItemModelSurfaceDataProxy::setXPosRole(const QString &role)
+{
+ if (dptr()->m_xPosRole != role) {
+ dptr()->m_xPosRole = role;
+ emit xPosRoleChanged(role);
+ }
+}
+
+QString QItemModelSurfaceDataProxy::xPosRole() const
+{
+ return dptrc()->m_xPosRole;
+}
+
+/*!
+ * \property QItemModelSurfaceDataProxy::yPosRole
*
- * Defines the value role for the mapping.
+ * Defines the Y position role for the mapping.
*/
-void QItemModelSurfaceDataProxy::setValueRole(const QString &role)
+void QItemModelSurfaceDataProxy::setYPosRole(const QString &role)
{
- if (dptr()->m_valueRole != role) {
- dptr()->m_valueRole = role;
- emit valueRoleChanged(role);
+ if (dptr()->m_yPosRole != role) {
+ dptr()->m_yPosRole = role;
+ emit yPosRoleChanged(role);
}
}
-QString QItemModelSurfaceDataProxy::valueRole() const
+QString QItemModelSurfaceDataProxy::yPosRole() const
{
- return dptrc()->m_valueRole;
+ return dptrc()->m_yPosRole;
+}
+
+/*!
+ * \property QItemModelSurfaceDataProxy::zPosRole
+ *
+ * Defines the Z position role for the mapping.
+ */
+void QItemModelSurfaceDataProxy::setZPosRole(const QString &role)
+{
+ if (dptr()->m_zPosRole != role) {
+ dptr()->m_zPosRole = role;
+ emit zPosRoleChanged(role);
+ }
+}
+
+QString QItemModelSurfaceDataProxy::zPosRole() const
+{
+ return dptrc()->m_zPosRole;
}
/*!
@@ -316,7 +425,7 @@ void QItemModelSurfaceDataProxy::setRowCategories(const QStringList &categories)
{
if (dptr()->m_rowCategories != categories) {
dptr()->m_rowCategories = categories;
- emit rowCategoriesChanged(categories);
+ emit rowCategoriesChanged();
}
}
@@ -334,7 +443,7 @@ void QItemModelSurfaceDataProxy::setColumnCategories(const QStringList &categori
{
if (dptr()->m_columnCategories != categories) {
dptr()->m_columnCategories = categories;
- emit columnCategoriesChanged(categories);
+ emit columnCategoriesChanged();
}
}
@@ -403,24 +512,28 @@ bool QItemModelSurfaceDataProxy::autoColumnCategories() const
}
/*!
- * Changes \a rowRole, \a columnRole, \a valueRole, \a rowCategories and \a columnCategories to the
- * mapping.
+ * Changes \a rowRole, \a columnRole, \a xPosRole, \a yPosRole, \a zPosRole,
+ * \a rowCategories and \a columnCategories to the mapping.
*/
void QItemModelSurfaceDataProxy::remap(const QString &rowRole,
const QString &columnRole,
- const QString &valueRole,
+ const QString &xPosRole,
+ const QString &yPosRole,
+ const QString &zPosRole,
const QStringList &rowCategories,
const QStringList &columnCategories)
{
setRowRole(rowRole);
setColumnRole(columnRole);
- setValueRole(valueRole);
+ setXPosRole(xPosRole);
+ setYPosRole(yPosRole);
+ setZPosRole(zPosRole);
setRowCategories(rowCategories);
setColumnCategories(columnCategories);
}
/*!
- * /return index of the specified \a category in row categories list.
+ * \return index of the specified \a category in row categories list.
* If the row categories list is empty, -1 is returned.
* \note If the automatic row categories generation is in use, this method will
* not return a valid index before the data in the model is resolved for the first time.
@@ -431,7 +544,7 @@ int QItemModelSurfaceDataProxy::rowCategoryIndex(const QString &category)
}
/*!
- * /return index of the specified \a category in column categories list.
+ * \return index of the specified \a category in column categories list.
* If the category is not found, -1 is returned.
* \note If the automatic column categories generation is in use, this method will
* not return a valid index before the data in the model is resolved for the first time.
@@ -486,7 +599,11 @@ void QItemModelSurfaceDataProxyPrivate::connectItemModelHandler()
m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged);
QObject::connect(qptr(), &QItemModelSurfaceDataProxy::columnRoleChanged,
m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged);
- QObject::connect(qptr(), &QItemModelSurfaceDataProxy::valueRoleChanged,
+ QObject::connect(qptr(), &QItemModelSurfaceDataProxy::xPosRoleChanged,
+ m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged);
+ QObject::connect(qptr(), &QItemModelSurfaceDataProxy::yPosRoleChanged,
+ m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged);
+ QObject::connect(qptr(), &QItemModelSurfaceDataProxy::zPosRoleChanged,
m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged);
QObject::connect(qptr(), &QItemModelSurfaceDataProxy::rowCategoriesChanged,
m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged);
diff --git a/src/datavisualization/data/qitemmodelsurfacedataproxy.h b/src/datavisualization/data/qitemmodelsurfacedataproxy.h
index d1e0f2b8..b1ebbeed 100644
--- a/src/datavisualization/data/qitemmodelsurfacedataproxy.h
+++ b/src/datavisualization/data/qitemmodelsurfacedataproxy.h
@@ -20,8 +20,8 @@
#define QITEMMODELSURFACEDATAPROXY_H
#include <QtDataVisualization/qsurfacedataproxy.h>
-#include <QAbstractItemModel>
-#include <QStringList>
+#include <QtCore/QAbstractItemModel>
+#include <QtCore/QStringList>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -33,7 +33,9 @@ class QT_DATAVISUALIZATION_EXPORT QItemModelSurfaceDataProxy : public QSurfaceDa
Q_PROPERTY(const QAbstractItemModel* itemModel READ itemModel WRITE setItemModel NOTIFY itemModelChanged)
Q_PROPERTY(QString rowRole READ rowRole WRITE setRowRole NOTIFY rowRoleChanged)
Q_PROPERTY(QString columnRole READ columnRole WRITE setColumnRole NOTIFY columnRoleChanged)
- Q_PROPERTY(QString valueRole READ valueRole WRITE setValueRole NOTIFY valueRoleChanged)
+ Q_PROPERTY(QString xPosRole READ xPosRole WRITE setXPosRole NOTIFY xPosRoleChanged)
+ Q_PROPERTY(QString yPosRole READ yPosRole WRITE setYPosRole NOTIFY yPosRoleChanged)
+ Q_PROPERTY(QString zPosRole READ zPosRole WRITE setZPosRole NOTIFY zPosRoleChanged)
Q_PROPERTY(QStringList rowCategories READ rowCategories WRITE setRowCategories NOTIFY rowCategoriesChanged)
Q_PROPERTY(QStringList columnCategories READ columnCategories WRITE setColumnCategories NOTIFY columnCategoriesChanged)
Q_PROPERTY(bool useModelCategories READ useModelCategories WRITE setUseModelCategories NOTIFY useModelCategoriesChanged)
@@ -43,13 +45,22 @@ class QT_DATAVISUALIZATION_EXPORT QItemModelSurfaceDataProxy : public QSurfaceDa
public:
explicit QItemModelSurfaceDataProxy(QObject *parent = 0);
QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, QObject *parent = 0);
- QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, const QString &valueRole,
+ QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, const QString &yPosRole,
QObject *parent = 0);
QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, const QString &rowRole,
- const QString &columnRole, const QString &valueRole,
+ const QString &columnRole, const QString &yPosRole,
QObject *parent = 0);
QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, const QString &rowRole,
- const QString &columnRole, const QString &valueRole,
+ const QString &columnRole, const QString &xPosRole,
+ const QString &yPosRole, const QString &zPosRole,
+ QObject *parent = 0);
+ QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, const QString &rowRole,
+ const QString &columnRole, const QString &yPosRole,
+ const QStringList &rowCategories, const QStringList &columnCategories,
+ QObject *parent = 0);
+ QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, const QString &rowRole,
+ const QString &columnRole, const QString &xPosRole,
+ const QString &yPosRole, const QString &zPosRole,
const QStringList &rowCategories, const QStringList &columnCategories,
QObject *parent = 0);
virtual ~QItemModelSurfaceDataProxy();
@@ -61,8 +72,12 @@ public:
QString rowRole() const;
void setColumnRole(const QString &role);
QString columnRole() const;
- void setValueRole(const QString &role);
- QString valueRole() const;
+ void setXPosRole(const QString &role);
+ QString xPosRole() const;
+ void setYPosRole(const QString &role);
+ QString yPosRole() const;
+ void setZPosRole(const QString &role);
+ QString zPosRole() const;
void setRowCategories(const QStringList &categories);
QStringList rowCategories() const;
@@ -77,7 +92,8 @@ public:
bool autoColumnCategories() const;
void remap(const QString &rowRole, const QString &columnRole,
- const QString &valueRole, const QStringList &rowCategories,
+ const QString &xPosRole, const QString &yPosRole,
+ const QString &zPosRole, const QStringList &rowCategories,
const QStringList &columnCategories);
Q_INVOKABLE int rowCategoryIndex(const QString& category);
@@ -85,11 +101,13 @@ public:
signals:
void itemModelChanged(const QAbstractItemModel* itemModel);
- void rowRoleChanged(QString role);
- void columnRoleChanged(QString role);
- void valueRoleChanged(QString role);
- void rowCategoriesChanged(QStringList categories);
- void columnCategoriesChanged(QStringList categories);
+ void rowRoleChanged(const QString &role);
+ void columnRoleChanged(const QString &role);
+ void xPosRoleChanged(const QString &role);
+ void yPosRoleChanged(const QString &role);
+ void zPosRoleChanged(const QString &role);
+ void rowCategoriesChanged();
+ void columnCategoriesChanged();
void useModelCategoriesChanged(bool enable);
void autoRowCategoriesChanged(bool enable);
void autoColumnCategoriesChanged(bool enable);
diff --git a/src/datavisualization/data/qitemmodelsurfacedataproxy_p.h b/src/datavisualization/data/qitemmodelsurfacedataproxy_p.h
index 5049a25e..0aaea8fd 100644
--- a/src/datavisualization/data/qitemmodelsurfacedataproxy_p.h
+++ b/src/datavisualization/data/qitemmodelsurfacedataproxy_p.h
@@ -52,7 +52,9 @@ private:
QString m_rowRole;
QString m_columnRole;
- QString m_valueRole;
+ QString m_xPosRole;
+ QString m_yPosRole;
+ QString m_zPosRole;
// For row/column items, sort items into these categories. Other categories are ignored.
QStringList m_rowCategories;
diff --git a/src/datavisualization/data/qscatterdataitem.cpp b/src/datavisualization/data/qscatterdataitem.cpp
index 33f8bed0..9751dfeb 100644
--- a/src/datavisualization/data/qscatterdataitem.cpp
+++ b/src/datavisualization/data/qscatterdataitem.cpp
@@ -52,6 +52,16 @@ QScatterDataItem::QScatterDataItem(const QVector3D &position)
}
/*!
+ * Constructs QScatterDataItem with \a position and \a rotation.
+ */
+QScatterDataItem::QScatterDataItem(const QVector3D &position, const QQuaternion &rotation)
+ : d_ptr(0),
+ m_position(position),
+ m_rotation(rotation)
+{
+}
+
+/*!
* Constructs a copy of \a other.
*/
QScatterDataItem::QScatterDataItem(const QScatterDataItem &other)
diff --git a/src/datavisualization/data/qscatterdataitem.h b/src/datavisualization/data/qscatterdataitem.h
index d2ef3bcc..87cc1fc5 100644
--- a/src/datavisualization/data/qscatterdataitem.h
+++ b/src/datavisualization/data/qscatterdataitem.h
@@ -20,9 +20,7 @@
#define QSCATTERDATAITEM_H
#include <QtDataVisualization/qdatavisualizationglobal.h>
-
-#include <QVector3D>
-#include <QQuaternion>
+#include <QtGui/QQuaternion>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -33,6 +31,7 @@ class QT_DATAVISUALIZATION_EXPORT QScatterDataItem
public:
QScatterDataItem();
QScatterDataItem(const QVector3D &position);
+ QScatterDataItem(const QVector3D &position, const QQuaternion &rotation);
QScatterDataItem(const QScatterDataItem &other);
~QScatterDataItem();
@@ -50,7 +49,7 @@ public:
inline float z() const { return m_position.z(); }
protected:
- virtual void createExtraData();
+ void createExtraData();
QScatterDataItemPrivate *d_ptr;
diff --git a/src/datavisualization/data/qscatterdataproxy.cpp b/src/datavisualization/data/qscatterdataproxy.cpp
index b5e3863d..dbbb4384 100644
--- a/src/datavisualization/data/qscatterdataproxy.cpp
+++ b/src/datavisualization/data/qscatterdataproxy.cpp
@@ -98,7 +98,7 @@ QScatterDataProxy::~QScatterDataProxy()
*
* The series this proxy is attached to.
*/
-QScatter3DSeries *QScatterDataProxy::series()
+QScatter3DSeries *QScatterDataProxy::series() const
{
return static_cast<QScatter3DSeries *>(d_ptr->series());
}
diff --git a/src/datavisualization/data/qscatterdataproxy.h b/src/datavisualization/data/qscatterdataproxy.h
index b8179166..fe561bbd 100644
--- a/src/datavisualization/data/qscatterdataproxy.h
+++ b/src/datavisualization/data/qscatterdataproxy.h
@@ -43,7 +43,7 @@ public:
explicit QScatterDataProxy(QObject *parent = 0);
virtual ~QScatterDataProxy();
- QScatter3DSeries *series();
+ QScatter3DSeries *series() const;
int itemCount() const;
const QScatterDataArray *array() const;
const QScatterDataItem *itemAt(int index) const;
diff --git a/src/datavisualization/data/qsurface3dseries.cpp b/src/datavisualization/data/qsurface3dseries.cpp
index e5f06cc6..b7e15014 100644
--- a/src/datavisualization/data/qsurface3dseries.cpp
+++ b/src/datavisualization/data/qsurface3dseries.cpp
@@ -221,7 +221,7 @@ void QSurface3DSeries::setSelectedPoint(const QPoint &position)
{
// Don't do this in private to avoid loops, as that is used for callback from controller.
if (d_ptr->m_controller)
- static_cast<Surface3DController *>(d_ptr->m_controller)->setSelectedPoint(position, this);
+ static_cast<Surface3DController *>(d_ptr->m_controller)->setSelectedPoint(position, this, true);
else
dptr()->setSelectedPoint(position);
}
diff --git a/src/datavisualization/data/qsurface3dseries.h b/src/datavisualization/data/qsurface3dseries.h
index b8a1a62b..8347104e 100644
--- a/src/datavisualization/data/qsurface3dseries.h
+++ b/src/datavisualization/data/qsurface3dseries.h
@@ -65,7 +65,7 @@ public:
signals:
void dataProxyChanged(QSurfaceDataProxy *proxy);
- void selectedPointChanged(QPoint position);
+ void selectedPointChanged(const QPoint &position);
void flatShadingEnabledChanged(bool enable);
void flatShadingSupportedChanged(bool enable);
void drawModeChanged(QSurface3DSeries::DrawFlags mode);
diff --git a/src/datavisualization/data/qsurfacedataitem.h b/src/datavisualization/data/qsurfacedataitem.h
index f305952b..1e4a384d 100644
--- a/src/datavisualization/data/qsurfacedataitem.h
+++ b/src/datavisualization/data/qsurfacedataitem.h
@@ -20,8 +20,7 @@
#define QSURFACEDATAITEM_H
#include <QtDataVisualization/qdatavisualizationglobal.h>
-
-#include <QVector3D>
+#include <QtGui/QVector3D>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -47,7 +46,7 @@ public:
inline float z() const { return m_position.z(); }
protected:
- virtual void createExtraData();
+ void createExtraData();
QSurfaceDataItemPrivate *d_ptr;
diff --git a/src/datavisualization/data/qsurfacedataproxy.cpp b/src/datavisualization/data/qsurfacedataproxy.cpp
index 43ce40eb..34cea326 100644
--- a/src/datavisualization/data/qsurfacedataproxy.cpp
+++ b/src/datavisualization/data/qsurfacedataproxy.cpp
@@ -131,7 +131,7 @@ QSurfaceDataProxy::~QSurfaceDataProxy()
*
* The series this proxy is attached to.
*/
-QSurface3DSeries *QSurfaceDataProxy::series()
+QSurface3DSeries *QSurfaceDataProxy::series() const
{
return static_cast<QSurface3DSeries *>(d_ptr->series());
}
@@ -186,6 +186,15 @@ void QSurfaceDataProxy::setItem(int rowIndex, int columnIndex, const QSurfaceDat
}
/*!
+ * Changes a single item at \a position to the \a item.
+ * The X-value of \a position indicates the row and the Y-value indicates the column.
+ */
+void QSurfaceDataProxy::setItem(const QPoint &position, const QSurfaceDataItem &item)
+{
+ setItem(position.x(), position.y(), item);
+}
+
+/*!
* Adds a new \a row to the end of array. The new \a row must have
* the same number of columns as the rows at the initial array.
*
@@ -259,6 +268,29 @@ const QSurfaceDataArray *QSurfaceDataProxy::array() const
}
/*!
+ * \return pointer to the item at \a rowIndex, \a columnIndex. It is guaranteed to be valid only
+ * until the next call that modifies data.
+ */
+const QSurfaceDataItem *QSurfaceDataProxy::itemAt(int rowIndex, int columnIndex) const
+{
+ const QSurfaceDataArray &dataArray = *dptrc()->m_dataArray;
+ Q_ASSERT(rowIndex >= 0 && rowIndex < dataArray.size());
+ const QSurfaceDataRow &dataRow = *dataArray[rowIndex];
+ Q_ASSERT(columnIndex >= 0 && columnIndex < dataRow.size());
+ return &dataRow.at(columnIndex);
+}
+
+/*!
+ * \return pointer to the item at \a position. The X-value of \a position indicates the row
+ * and the Y-value indicates the column. The item is guaranteed to be valid only
+ * until the next call that modifies data.
+ */
+const QSurfaceDataItem *QSurfaceDataProxy::itemAt(const QPoint &position) const
+{
+ return itemAt(position.x(), position.y());
+}
+
+/*!
* \property QSurfaceDataProxy::rowCount
*
* \return number of rows in the data.
@@ -282,15 +314,6 @@ int QSurfaceDataProxy::columnCount() const
}
/*!
- * \return pointer to the item at \a index. It is guaranteed to be valid only until the next call that
- * modifies data.
- */
-const QSurfaceDataItem *QSurfaceDataProxy::itemAt(int index) const
-{
- return &dptrc()->m_dataArray->at(index)->at(2);
-}
-
-/*!
* \internal
*/
QSurfaceDataProxyPrivate *QSurfaceDataProxy::dptr()
diff --git a/src/datavisualization/data/qsurfacedataproxy.h b/src/datavisualization/data/qsurfacedataproxy.h
index 0933faf6..475f1f2d 100644
--- a/src/datavisualization/data/qsurfacedataproxy.h
+++ b/src/datavisualization/data/qsurfacedataproxy.h
@@ -45,11 +45,12 @@ public:
explicit QSurfaceDataProxy(QObject *parent = 0);
virtual ~QSurfaceDataProxy();
- QSurface3DSeries *series();
+ QSurface3DSeries *series() const;
int rowCount() const;
int columnCount() const;
const QSurfaceDataArray *array() const;
- const QSurfaceDataItem *itemAt(int index) const;
+ const QSurfaceDataItem *itemAt(int rowIndex, int columnIndex) const;
+ const QSurfaceDataItem *itemAt(const QPoint &position) const;
void resetArray(QSurfaceDataArray *newArray);
@@ -57,6 +58,7 @@ public:
void setRows(int rowIndex, const QSurfaceDataArray &rows);
void setItem(int rowIndex, int columnIndex, const QSurfaceDataItem &item);
+ void setItem(const QPoint &position, const QSurfaceDataItem &item);
int addRow(QSurfaceDataRow *row);
int addRows(const QSurfaceDataArray &rows);
diff --git a/src/datavisualization/data/qsurfacedataproxy_p.h b/src/datavisualization/data/qsurfacedataproxy_p.h
index 658abe32..7c3486d2 100644
--- a/src/datavisualization/data/qsurfacedataproxy_p.h
+++ b/src/datavisualization/data/qsurfacedataproxy_p.h
@@ -32,8 +32,6 @@
#include "qsurfacedataproxy.h"
#include "qabstractdataproxy_p.h"
-#include <QSize>
-
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
class QSurfaceDataProxyPrivate : public QAbstractDataProxyPrivate
diff --git a/src/datavisualization/data/scatteritemmodelhandler.cpp b/src/datavisualization/data/scatteritemmodelhandler.cpp
index 1c936d08..08ed12f3 100644
--- a/src/datavisualization/data/scatteritemmodelhandler.cpp
+++ b/src/datavisualization/data/scatteritemmodelhandler.cpp
@@ -17,7 +17,6 @@
****************************************************************************/
#include "scatteritemmodelhandler_p.h"
-#include <QTimer>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -92,6 +91,41 @@ void ScatterItemModelHandler::handleRowsRemoved(const QModelIndex &parent, int s
}
}
+static inline QQuaternion toQuaternion(const QVariant &variant)
+{
+ if (variant.canConvert<QQuaternion>()) {
+ return variant.value<QQuaternion>();
+ } else if (variant.canConvert<QString>()) {
+ QString s = variant.toString();
+ if (!s.isEmpty()) {
+ bool angleAndAxis = false;
+ if (s.startsWith(QLatin1Char('@'))) {
+ angleAndAxis = true;
+ s = s.mid(1);
+ }
+ if (s.count(QLatin1Char(',')) == 3) {
+ int index = s.indexOf(QLatin1Char(','));
+ int index2 = s.indexOf(QLatin1Char(','), index + 1);
+ int index3 = s.indexOf(QLatin1Char(','), index2 + 1);
+
+ bool sGood, xGood, yGood, zGood;
+ float sCoord = s.left(index).toFloat(&sGood);
+ float xCoord = s.mid(index + 1, index2 - index - 1).toFloat(&xGood);
+ float yCoord = s.mid(index2 + 1, index3 - index2 - 1).toFloat(&yGood);
+ float zCoord = s.mid(index3 + 1).toFloat(&zGood);
+
+ if (sGood && xGood && yGood && zGood) {
+ if (angleAndAxis)
+ return QQuaternion::fromAxisAndAngle(xCoord, yCoord, zCoord, sCoord);
+ else
+ return QQuaternion(sCoord, xCoord, yCoord, zCoord);
+ }
+ }
+ }
+ }
+ return QQuaternion();
+}
+
void ScatterItemModelHandler::modelPosToScatterItem(int modelRow, int modelColumn,
QScatterDataItem &item)
{
@@ -105,6 +139,8 @@ void ScatterItemModelHandler::modelPosToScatterItem(int modelRow, int modelColum
yPos = index.data(m_yPosRole).toFloat();
if (m_zPosRole != noRoleIndex)
zPos = index.data(m_zPosRole).toFloat();
+ if (m_rotationRole != noRoleIndex)
+ item.setRotation(toQuaternion(index.data(m_rotationRole)));
item.setPosition(QVector3D(xPos, yPos, zPos));
}
@@ -121,6 +157,7 @@ void ScatterItemModelHandler::resolveModel()
m_xPosRole = roleHash.key(m_proxy->xPosRole().toLatin1(), noRoleIndex);
m_yPosRole = roleHash.key(m_proxy->yPosRole().toLatin1(), noRoleIndex);
m_zPosRole = roleHash.key(m_proxy->zPosRole().toLatin1(), noRoleIndex);
+ m_rotationRole = roleHash.key(m_proxy->rotationRole().toLatin1(), noRoleIndex);
const int columnCount = m_itemModel->columnCount();
const int rowCount = m_itemModel->rowCount();
const int totalCount = rowCount * columnCount;
diff --git a/src/datavisualization/data/scatteritemmodelhandler_p.h b/src/datavisualization/data/scatteritemmodelhandler_p.h
index f0e4fa84..0661d734 100644
--- a/src/datavisualization/data/scatteritemmodelhandler_p.h
+++ b/src/datavisualization/data/scatteritemmodelhandler_p.h
@@ -58,6 +58,7 @@ private:
int m_xPosRole;
int m_yPosRole;
int m_zPosRole;
+ int m_rotationRole;
};
QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/data/scatterrenderitem.cpp b/src/datavisualization/data/scatterrenderitem.cpp
index d39af816..3b2e64c5 100644
--- a/src/datavisualization/data/scatterrenderitem.cpp
+++ b/src/datavisualization/data/scatterrenderitem.cpp
@@ -33,7 +33,6 @@ ScatterRenderItem::ScatterRenderItem(const ScatterRenderItem &other)
m_visible(false)
{
m_position = other.m_position;
- m_rotation = other.m_rotation;
}
ScatterRenderItem::~ScatterRenderItem()
diff --git a/src/datavisualization/data/scatterrenderitem_p.h b/src/datavisualization/data/scatterrenderitem_p.h
index 45066dd8..eb070682 100644
--- a/src/datavisualization/data/scatterrenderitem_p.h
+++ b/src/datavisualization/data/scatterrenderitem_p.h
@@ -45,19 +45,8 @@ public:
inline const QVector3D &position() const { return m_position; }
inline void setPosition(const QVector3D &pos)
{
- if (m_position != pos) {
+ if (m_position != pos)
m_position = pos;
- // Force reformatting on next access by setting label string to null string
- if (!m_selectionLabel.isNull())
- setSelectionLabel(QString());
- }
- }
-
- inline QQuaternion rotation() const { return m_rotation; }
- inline void setRotation(const QQuaternion &rotation)
- {
- if (m_rotation != rotation)
- m_rotation = rotation;
}
inline bool isVisible() const { return m_visible; }
@@ -65,7 +54,6 @@ public:
protected:
QVector3D m_position;
- QQuaternion m_rotation;
bool m_visible;
friend class QScatterDataItem;
diff --git a/src/datavisualization/data/surfaceitemmodelhandler.cpp b/src/datavisualization/data/surfaceitemmodelhandler.cpp
index 767425e9..f4383dbf 100644
--- a/src/datavisualization/data/surfaceitemmodelhandler.cpp
+++ b/src/datavisualization/data/surfaceitemmodelhandler.cpp
@@ -20,6 +20,8 @@
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
+static const int noRoleIndex = -1;
+
SurfaceItemModelHandler::SurfaceItemModelHandler(QItemModelSurfaceDataProxy *proxy, QObject *parent)
: AbstractItemModelHandler(parent),
m_proxy(proxy),
@@ -50,7 +52,9 @@ void SurfaceItemModelHandler::resolveModel()
QHash<int, QByteArray> roleHash = m_itemModel->roleNames();
// Default to display role if no mapping
- int valueRole = roleHash.key(m_proxy->valueRole().toLatin1(), Qt::DisplayRole);
+ int xPosRole = roleHash.key(m_proxy->xPosRole().toLatin1(), noRoleIndex);
+ int yPosRole = roleHash.key(m_proxy->yPosRole().toLatin1(), Qt::DisplayRole);
+ int zPosRole = roleHash.key(m_proxy->zPosRole().toLatin1(), noRoleIndex);
int rowCount = m_itemModel->rowCount();
int columnCount = m_itemModel->columnCount();
@@ -66,15 +70,41 @@ void SurfaceItemModelHandler::resolveModel()
for (int i = 0; i < rowCount; i++) {
QSurfaceDataRow &newProxyRow = *m_proxyArray->at(i);
for (int j = 0; j < columnCount; j++) {
+ float xPos = j;
+ float zPos = i;
+ if (xPosRole != noRoleIndex) {
+ xPos = m_itemModel->index(i, j).data(xPosRole).toFloat();
+ } else {
+ QString header = m_itemModel->headerData(j, Qt::Horizontal).toString();
+ bool ok = false;
+ float headerValue = header.toFloat(&ok);
+ if (ok)
+ xPos = headerValue;
+ }
+
+ if (zPosRole != noRoleIndex) {
+ zPos = m_itemModel->index(i, j).data(zPosRole).toFloat();
+ } else {
+ QString header = m_itemModel->headerData(i, Qt::Vertical).toString();
+ bool ok = false;
+ float headerValue = header.toFloat(&ok);
+ if (ok)
+ zPos = headerValue;
+ }
+
newProxyRow[j].setPosition(
- QVector3D(m_itemModel->headerData(j, Qt::Horizontal).toFloat(),
- m_itemModel->index(i, j).data(valueRole).toFloat(),
- m_itemModel->headerData(i, Qt::Vertical).toFloat()));
+ QVector3D(xPos,
+ m_itemModel->index(i, j).data(yPosRole).toFloat(),
+ zPos));
}
}
} else {
int rowRole = roleHash.key(m_proxy->rowRole().toLatin1());
int columnRole = roleHash.key(m_proxy->columnRole().toLatin1());
+ if (xPosRole == noRoleIndex)
+ xPosRole = columnRole;
+ if (zPosRole == noRoleIndex)
+ zPosRole = rowRole;
bool generateRows = m_proxy->autoRowCategories();
bool generateColumns = m_proxy->autoColumnCategories();
@@ -87,14 +117,17 @@ void SurfaceItemModelHandler::resolveModel()
QHash<QString, bool> columnListHash;
// Sort values into rows and columns
- typedef QHash<QString, float> ColumnValueMap;
+ typedef QHash<QString, QVector3D> ColumnValueMap;
QHash <QString, ColumnValueMap> itemValueMap;
for (int i = 0; i < rowCount; i++) {
for (int j = 0; j < columnCount; j++) {
QModelIndex index = m_itemModel->index(i, j);
QString rowRoleStr = index.data(rowRole).toString();
QString columnRoleStr = index.data(columnRole).toString();
- itemValueMap[rowRoleStr][columnRoleStr] = index.data(valueRole).toReal();
+ QVector3D itemPos(index.data(xPosRole).toReal(),
+ index.data(yPosRole).toReal(),
+ index.data(zPosRole).toReal());
+ itemValueMap[rowRoleStr][columnRoleStr] = itemPos;
if (generateRows && !rowListHash.value(rowRoleStr, false)) {
rowListHash.insert(rowRoleStr, true);
rowList << rowRoleStr;
@@ -128,11 +161,8 @@ void SurfaceItemModelHandler::resolveModel()
for (int i = 0; i < rowList.size(); i++) {
QString rowKey = rowList.at(i);
QSurfaceDataRow &newProxyRow = *m_proxyArray->at(i);
- for (int j = 0; j < columnList.size(); j++) {
- newProxyRow[j].setPosition(QVector3D(columnList.at(j).toFloat(),
- itemValueMap[rowKey][columnList.at(j)],
- rowList.at(i).toFloat()));
- }
+ for (int j = 0; j < columnList.size(); j++)
+ newProxyRow[j].setPosition(itemValueMap[rowKey][columnList.at(j)]);
}
}
diff --git a/src/datavisualization/doc/qtdatavisualization.qdocconf b/src/datavisualization/doc/qtdatavisualization.qdocconf
index 81922313..8bf5a012 100644
--- a/src/datavisualization/doc/qtdatavisualization.qdocconf
+++ b/src/datavisualization/doc/qtdatavisualization.qdocconf
@@ -1,10 +1,14 @@
-include($QT_INSTALL_DOCS/global/qt-module-defaults.qdocconf)
+include($QT_INSTALL_DOCS/global/macros.qdocconf)
+include($QT_INSTALL_DOCS/global/qt-cpp-defines.qdocconf)
+include($QT_INSTALL_DOCS/global/compat.qdocconf)
+include($QT_INSTALL_DOCS/global/fileextensions.qdocconf)
+include($QT_INSTALL_DOCS/global/qt-html-templates-offline.qdocconf)
project = QtDataVisualization
description = Qt Data Visualization Reference Documentation
version = 1.0.0
-exampledirs += ../../../examples \
+exampledirs += ../../../examples/datavisualization \
snippets
headerdirs += ..
@@ -12,9 +16,11 @@ imagedirs += ../images \
images
sourcedirs += ..
-depends += qtcore qtgui qtdeclarative
-
-indexes += $QTDIR/doc/html/qt.index
+indexes += $QT_INSTALL_DOCS/qtcore/qtcore.index \
+ $QT_INSTALL_DOCS/qtgui/qtgui.index \
+ $QT_INSTALL_DOCS/qtqml/qtqml.index \
+ $QT_INSTALL_DOCS/qtquick/qtquick.index \
+ $QT_INSTALL_DOCS/qtmultimedia/qtmultimedia.index
qhp.projects = qtdatavisualization
@@ -45,23 +51,6 @@ qhp.qtdatavisualization.subprojects.types.indexTitle = Qt Data Visual
qhp.qtdatavisualization.subprojects.types.selectors = fake:qmlclass
qhp.qtdatavisualization.subprojects.types.sortPages = true
-HTML.footer = \
- "<div class=\"footer\">\n" \
- " <p>\n" \
- " <acronym title=\"Copyright\">&copy;</acronym> 2014 Digia. Qt and Qt logos are\n" \
- " trademarks of of Digia Corporation in Finland and/or other countries worldwide.\n" \
- " </p>\n" \
- " All other trademarks are property of their respective owners.\n" \
- " <br />\n" \
- " <p>\n" \
- " Licensees holding valid Qt Enterprise licenses may use this document in accordance\n" \
- " with the Qt Enterprise License Agreement provided with the Software or,\n" \
- " alternatively, in accordance with the terms contained in a written agreement\n" \
- " between you and Digia.\n" \
- " </p>\n" \
- "</div>\n"
-
-navigation.homepage = Qt Enterprise:
navigation.landingpage = Qt Data Visualization
navigation.cppclassespage = Qt Data Visualization C++ Classes
navigation.qmltypespage = Qt Data Visualization QML Types
diff --git a/src/datavisualization/doc/snippets/doc_src_qtdatavisualization.cpp b/src/datavisualization/doc/snippets/doc_src_qtdatavisualization.cpp
index 458eeb45..6c6e49aa 100644
--- a/src/datavisualization/doc/snippets/doc_src_qtdatavisualization.cpp
+++ b/src/datavisualization/doc/snippets/doc_src_qtdatavisualization.cpp
@@ -72,7 +72,7 @@ QItemModelScatterDataProxy *proxy = new QItemModelScatterDataProxy(customModel,
QItemModelSurfaceDataProxy *proxy = new QItemModelSurfaceDataProxy(customModel,
QStringLiteral("longitude"), // Row role
QStringLiteral("latitude"), // Column role
- QStringLiteral("height")); // value role
+ QStringLiteral("height")); // Y-position role
//! [5]
//! [6]
diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc
index df503eb4..5b251768 100644
--- a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc
+++ b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc
@@ -28,12 +28,6 @@
Note that this type is uncreatable, but contains properties that are shared between
the 3D visualizations.
- \note QML doesn't support the type of anti-aliasing used by Qt Data Visualization graphs
- by default. Setting the \c antialiasing property doesn't affect graphs. To enable
- anti-aliasing for graphs, a custom surface format must be set up for the QQuickView
- before showing it. You can use the convenience function
- \c{QtDataVisualization::qDefaultSurfaceFormat()} to create the custom surface format object.
-
For AbstractGraph3D enums, see \l QAbstract3DGraph::SelectionFlag and
\l QAbstract3DGraph::ShadowQuality
@@ -66,24 +60,62 @@
*/
/*!
- \qmlproperty bool AbstractGraph3D::clearWindowBeforeRendering
-
- Indicates if the graph should also clear the whole window before rendering the graph,
- including the areas outside the graph.
- Since the graphs are drawn first under other QML items, the regular QML window clearing
- before rendering is suppressed when there are any graphs in the window; the graphs
- handle the clearing themselves instead.
- If you have any other items besides graphs that do similar
- custom drawing under other QML items, you need to set this property to false on all graphs
- drawn to same window with the other custom items, or it is likely that the
- other custom items do not render properly.
- Defaults to true.
-
- \note This property should be set to the same value for all graphs in the same window.
- Otherwise some graphs may not show.
-
- \note If window clearing before rendering is suppressed, any areas of the window not fully
- covered with opaque items may not draw properly.
+ \qmlproperty AbstractGraph3D.RenderingMode AbstractGraph3D::renderingMode
+
+ Defaults to \c{RenderIndirect}.
+
+ \table
+ \header
+ \li Render Mode
+ \li Description
+ \row
+ \li RenderDirectToBackground
+ \li Indicates the graph will be rendered directly on the window background.
+ This mode also clears the whole window before rendering the graph, including the areas
+ outside the graph.
+ Since the graphs in this rendering mode are drawn on the window background under other QML
+ items, the regular QML window clearing before rendering is suppressed. The graphs handle the clearing
+ themselves instead.
+ If the surface format of the window supports antialiasing, it will be used (see
+ \c {QtDataVisualization::qDefaultSurfaceFormat()}).
+ This rendering mode offers the best performance at the expense of non-standard QML behavior. For example,
+ the graphs do not obey the Z ordering of QML items and the opacity value has no effect on them.
+ \row
+ \li RenderDirectToBackground_NoClear
+ \li Similar to RenderDirectToBackground mode, except that the graph will not clear the whole
+ window before rendering the graph. This mode is better for windows where you have other custom items
+ besides the graphs that also draw on the window background. In that case you need to either take care
+ of the window clearing yourself or ensure that all areas of the window are fully covered with opaque
+ items.
+ If one graph in the window uses either of the direct rendering modes, then all other graphs in the
+ same window also drawn in direct modes should use the exact same direct rendering mode.
+ Otherwise some graphs may not show up, depending on the drawing order of the graphs.
+ \row
+ \li RenderIndirect
+ \li Indicates the graph will be first rendered to an offscreen surface that
+ is then drawn during normal QML item rendering. The rendered image is
+ antialiased using multisampling method if it is supported in the current environment and the
+ msaaSamples property value is greater than zero.
+ This rendering mode offers good quality and normal QML item behavior at the expense of performance.
+ \endtable
+
+ \note Antialiasing is not supported in OpenGL ES2 environments in any rendering mode.
+
+ \note Setting the \c antialiasing property of the graphs doesn't do anything. However, it is
+ set by the graph itself if the current rendering mode uses antialiasing.
+
+ \sa msaaSamples
+ */
+
+/*!
+ \qmlproperty int AbstractGraph3D::msaaSamples
+ The number of samples used in multisample antialiasing when renderingMode is \c RenderIndirect.
+ When renderingMode is \c RenderDirectToBackground or \c RenderDirectToBackground_NoClear, this
+ property value is read-only and returns the number of samples specified by the window surface
+ format.
+ Defaults to 4.
+
+ \sa renderingMode
*/
/*!
diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-bars3d.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-bars3d.qdoc
index aaafe217..6ee51742 100644
--- a/src/datavisualization/doc/src/qtdatavisualization-qml-bars3d.qdoc
+++ b/src/datavisualization/doc/src/qtdatavisualization-qml-bars3d.qdoc
@@ -36,11 +36,6 @@
*
* See \l{Qt Quick 2 Bars Example} for more thorough usage example.
*
- * \note Qt Data Visualization graphs are rendered behind any other QML elements on screen, including
- * the parent elements of the graph. To make the whole graph show, ensure that no other element
- * draws anything over the area the graph occupies. For example, having a non-transparent \c Rectangle
- * item as the parent of a graph causes the graph to be hidden.
- *
* \sa Bar3DSeries, ItemModelBarDataProxy, Scatter3D, Surface3D, {Qt Data Visualization C++ Classes}
*/
@@ -93,6 +88,12 @@
*/
/*!
+ * \qmlproperty Bar3DSeries Bars3D::selectedSeries
+ * The selected series or \c null. If \l {QAbstract3DGraph::selectionMode}{selectionMode} has
+ * \c SelectionMultiSeries flag set, this property holds the series which owns the selected bar.
+ */
+
+/*!
* \qmlproperty list<Bar3DSeries> Bars3D::seriesList
* \default
* This property holds the series of the graph.
diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-scatter3d.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-scatter3d.qdoc
index b969c536..4ea7888c 100644
--- a/src/datavisualization/doc/src/qtdatavisualization-qml-scatter3d.qdoc
+++ b/src/datavisualization/doc/src/qtdatavisualization-qml-scatter3d.qdoc
@@ -36,11 +36,6 @@
See \l{Qt Quick 2 Scatter Example} for more thorough usage example.
- \note Qt Data Visualization graphs are rendered behind any other QML elements on screen, including
- the parent elements of the graph. To make the whole graph show, ensure that no other element
- draws anything over the area the graph occupies. For example, having a non-transparent \c Rectangle
- item as the parent of a graph causes the graph to be hidden.
-
\sa Scatter3DSeries, ScatterDataProxy, Bars3D, Surface3D, {Qt Data Visualization C++ Classes}
*/
@@ -72,7 +67,12 @@
*/
/*!
- * \qmlproperty list<QScatter3DSeries> Scatter3D::seriesList
+ * \qmlproperty Scatter3DSeries Scatter3D::selectedSeries
+ * The selected series or \c null.
+ */
+
+/*!
+ * \qmlproperty list<Scatter3DSeries> Scatter3D::seriesList
* \default
* This property holds the series of the graph.
* By default, this property contains an empty list.
@@ -80,13 +80,13 @@
*/
/*!
- * \qmlmethod void Scatter3D::addSeries(QScatter3DSeries *series)
+ * \qmlmethod void Scatter3D::addSeries(Scatter3DSeries series)
* Adds the \a series to the graph. A graph can contain multiple series, but has only one set of
* axes. If the newly added series has specified a selected item, it will be highlighted and
* any existing selection will be cleared. Only one added series can have an active selection.
*/
/*!
- * \qmlmethod void Scatter3D::removeSeries(QScatter3DSeries *series)
+ * \qmlmethod void Scatter3D::removeSeries(Scatter3DSeries series)
* Remove the \a series from the graph.
*/
diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-surface3d.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-surface3d.qdoc
index 3011336b..23a9a004 100644
--- a/src/datavisualization/doc/src/qtdatavisualization-qml-surface3d.qdoc
+++ b/src/datavisualization/doc/src/qtdatavisualization-qml-surface3d.qdoc
@@ -36,11 +36,6 @@
See \l{Qt Quick 2 Surface Example} for more thorough usage example.
- \note Qt Data Visualization graphs are rendered behind any other QML elements on screen, including
- the parent elements of the graph. To make the whole graph show, ensure that no other element
- draws anything over the area the graph occupies. For example, having a non-transparent \c Rectangle
- item as the parent of a graph causes the graph to be hidden.
-
\sa Surface3DSeries, ItemModelSurfaceDataProxy, Bars3D, Scatter3D, {Qt Data Visualization C++ Classes}
*/
@@ -72,27 +67,30 @@
*/
/*!
+ * \qmlproperty Surface3DSeries Surface3D::selectedSeries
+ * The selected series or \c null. If \l {QAbstract3DGraph::selectionMode}{selectionMode} has
+ * \c SelectionMultiSeries flag set, this property holds the series which owns the selected point.
+ */
+
/*!
\qmlproperty ColorGradient Surface3D::gradient
The current surface gradient. Setting this property replaces the previous gradient.
*/
/*!
- * \qmlproperty list<QSurface3DSeries> Surface3D::seriesList
+ * \qmlproperty list<Surface3DSeries> Surface3D::seriesList
* \default
* This property holds the series of the graph.
* By default, this property contains an empty list.
* To set the series, either use the addSeries() function or define them as children of the graph.
- * \note The surface graph currently supports only a single series at a time.
*/
/*!
- * \qmlmethod void Surface3D::addSeries(QSurface3DSeries *series)
+ * \qmlmethod void Surface3D::addSeries(Surface3DSeries series)
* Adds the \a series to the graph.
- * \note The surface graph currently supports only a single series at a time.
*/
/*!
- * \qmlmethod void Surface3D::removeSeries(QSurface3DSeries *series)
+ * \qmlmethod void Surface3D::removeSeries(Surface3DSeries series)
* Remove the \a series from the graph.
*/
diff --git a/src/datavisualization/doc/src/qtdatavisualization.qdoc b/src/datavisualization/doc/src/qtdatavisualization.qdoc
index c85b9dbb..e68a1086 100644
--- a/src/datavisualization/doc/src/qtdatavisualization.qdoc
+++ b/src/datavisualization/doc/src/qtdatavisualization.qdoc
@@ -301,24 +301,34 @@
* \fn QSurfaceFormat QtDataVisualization::qDefaultSurfaceFormat(bool antialias = true)
* \relates QAbstract3DGraph
*
- * Anti-aliasing is turned on by default on C++ and turned off on QML, except in OpenGL ES2
- * environments, where anti-aliasing is not supported by Qt Data Visualization.
- * This convenience function can be used to construct a suitable surface format for use by
+ * This convenience function can be used to create a custom surface format suitable for use by
* Qt Data Visualization graphs.
- * The \a{antialias} parameter specifies whether or not anti-aliasing is activated.
+ *
+ * The \a antialias parameter specifies whether or not antialiasing is activated.
+ *
* Give the surface format returned by this function to the graph constructor (C++) or set
* it as the window format for QQuickView (QML) before calling show on it.
*
- * For example, disable anti-aliasing on C++ application:
+ * For example, disable antialiasing on C++ application:
*
* \code
+ * #include <QtDataVisualization/qutils.h>
+ *
+ * // ...
+ *
* Q3DBars *graph = new Q3DBars(QtDataVisualization::qDefaultSurfaceFormat(false));
* \endcode
*
- * For example, enable anti-aliasing on QML application:
+ * For example, enable antialiasing for direct rendering modes on QML application:
*
* \code
- * QtQuick2ApplicationViewer viewer;
+ * #include <QtDataVisualization/qutils.h>
+ *
+ * // ...
+ *
+ * QQuickView viewer;
* viewer.setFormat(QtDataVisualization::qDefaultSurfaceFormat());
* \endcode
+ *
+ * \note Antialiasing is not supported in OpenGL ES2 environments.
*/
diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp
index 4989ddb5..d2b59c58 100644
--- a/src/datavisualization/engine/abstract3dcontroller.cpp
+++ b/src/datavisualization/engine/abstract3dcontroller.cpp
@@ -32,8 +32,7 @@
#include "q3dtheme_p.h"
#include "q3dscene_p.h"
#include "q3dscene.h"
-
-#include <QThread>
+#include <QtCore/QThread>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h
index cac46ddf..f9b6588d 100644
--- a/src/datavisualization/engine/abstract3dcontroller_p.h
+++ b/src/datavisualization/engine/abstract3dcontroller_p.h
@@ -35,10 +35,7 @@
#include "qabstract3dinputhandler.h"
#include "qabstractdataproxy.h"
#include "q3dscene_p.h"
-#include "q3dbox.h"
-
-#include <QObject>
-#include <QLinearGradient>
+#include <QtGui/QLinearGradient>
class QFont;
diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp
index 7824000e..3122cf76 100644
--- a/src/datavisualization/engine/abstract3drenderer.cpp
+++ b/src/datavisualization/engine/abstract3drenderer.cpp
@@ -44,7 +44,8 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller)
m_devicePixelRatio(1.0f),
m_selectionLabelDirty(true),
m_clickPending(false),
- m_clickedSeries(0)
+ m_clickedSeries(0),
+ m_selectionLabelItem(0)
#ifdef DISPLAY_RENDER_SPEED
, m_isFirstFrame(true),
m_numFrames(0)
@@ -67,6 +68,7 @@ Abstract3DRenderer::~Abstract3DRenderer()
delete m_textureHelper;
delete m_cachedScene;
delete m_cachedTheme;
+ delete m_selectionLabelItem;
}
void Abstract3DRenderer::initializeOpenGL()
@@ -188,7 +190,7 @@ void Abstract3DRenderer::updateScene(Q3DScene *scene)
scene->activeCamera()->d_ptr->updateViewMatrix(m_autoScaleAdjustment);
// Set light position (rotate light with activeCamera, a bit above it (as set in defaultLightPos))
- scene->setLightPositionRelativeToCamera(defaultLightPos);
+ scene->d_ptr->setLightPositionRelativeToCamera(defaultLightPos);
QPoint logicalPixelPosition = scene->selectionQueryPosition();
updateInputPosition(QPoint(logicalPixelPosition.x() * m_devicePixelRatio,
@@ -426,8 +428,17 @@ void Abstract3DRenderer::lowerShadowQuality()
updateShadowQuality(newQuality);
}
-void Abstract3DRenderer::fixGradientAndGenerateTexture(QLinearGradient *gradient,
- GLuint *gradientTexture)
+void Abstract3DRenderer::generateBaseColorTexture(const QColor &color, GLuint *texture)
+{
+ if (*texture) {
+ m_textureHelper->deleteTexture(texture);
+ *texture = 0;
+ }
+
+ *texture = m_textureHelper->createUniformTexture(color);
+}
+
+void Abstract3DRenderer::fixGradientAndGenerateTexture(QLinearGradient *gradient, GLuint *gradientTexture)
{
// Readjust start/stop to match gradient texture size
gradient->setStart(qreal(gradientTextureWidth), qreal(gradientTextureHeight));
@@ -441,4 +452,23 @@ void Abstract3DRenderer::fixGradientAndGenerateTexture(QLinearGradient *gradient
*gradientTexture = m_textureHelper->createGradientTexture(*gradient);
}
+LabelItem &Abstract3DRenderer::selectionLabelItem()
+{
+ if (!m_selectionLabelItem)
+ m_selectionLabelItem = new LabelItem;
+ return *m_selectionLabelItem;
+}
+
+void Abstract3DRenderer::setSelectionLabel(const QString &label)
+{
+ if (m_selectionLabelItem)
+ m_selectionLabelItem->clear();
+ m_selectionLabel = label;
+}
+
+QString &Abstract3DRenderer::selectionLabel()
+{
+ return m_selectionLabel;
+}
+
QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h
index e7591a10..4eb8426f 100644
--- a/src/datavisualization/engine/abstract3drenderer_p.h
+++ b/src/datavisualization/engine/abstract3drenderer_p.h
@@ -33,7 +33,7 @@
#include <QtGui/QOpenGLFunctions>
#ifdef DISPLAY_RENDER_SPEED
-#include <QTime>
+#include <QtCore/QTime>
#endif
#include "datavisualizationglobal_p.h"
@@ -94,12 +94,17 @@ public:
virtual void updateAxisLabelFormat(QAbstract3DAxis::AxisOrientation orientation, const QString &format);
virtual void fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh);
+ void generateBaseColorTexture(const QColor &color, GLuint *texture);
void fixGradientAndGenerateTexture(QLinearGradient *gradient, GLuint *gradientTexture);
inline bool isClickPending() { return m_clickPending; }
inline void clearClickPending() { m_clickPending = false; }
inline QAbstract3DSeries *clickedSeries() const { return m_clickedSeries; }
+ LabelItem &selectionLabelItem();
+ void setSelectionLabel(const QString &label);
+ QString &selectionLabel();
+
signals:
void needRender(); // Emit this if something in renderer causes need for another render pass.
void requestShadowQuality(QAbstract3DGraph::ShadowQuality quality); // For automatic quality adjustments
@@ -132,7 +137,6 @@ protected:
AxisRenderCache m_axisCacheY;
AxisRenderCache m_axisCacheZ;
TextureHelper *m_textureHelper;
- Q3DBox m_boundingBox;
Q3DScene *m_cachedScene;
bool m_selectionDirty;
@@ -146,6 +150,9 @@ protected:
bool m_clickPending;
QAbstract3DSeries *m_clickedSeries;
+ QString m_selectionLabel;
+ LabelItem *m_selectionLabelItem;
+
#ifdef DISPLAY_RENDER_SPEED
bool m_isFirstFrame;
QTime m_lastFrameTime;
diff --git a/src/datavisualization/engine/axisrendercache.cpp b/src/datavisualization/engine/axisrendercache.cpp
index c1c2d5bd..a107dd23 100644
--- a/src/datavisualization/engine/axisrendercache.cpp
+++ b/src/datavisualization/engine/axisrendercache.cpp
@@ -17,8 +17,9 @@
****************************************************************************/
#include "axisrendercache_p.h"
-#include "qmath.h"
-#include <QFontMetrics>
+
+#include <QtCore/qmath.h>
+#include <QtGui/QFontMetrics>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/engine/bars3dcontroller.cpp b/src/datavisualization/engine/bars3dcontroller.cpp
index 5bd37ccf..442601eb 100644
--- a/src/datavisualization/engine/bars3dcontroller.cpp
+++ b/src/datavisualization/engine/bars3dcontroller.cpp
@@ -27,8 +27,8 @@
#include "thememanager_p.h"
#include "q3dtheme_p.h"
-#include <QMatrix4x4>
-#include <qmath.h>
+#include <QtGui/QMatrix4x4>
+#include <QtCore/qmath.h>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -109,7 +109,7 @@ void Bars3DController::handleArrayReset()
m_isDataDirty = true;
}
// Clear selection unless still valid
- setSelectedBar(m_selectedBar, m_selectedBarSeries);
+ setSelectedBar(m_selectedBar, m_selectedBarSeries, false);
emitNeedRender();
}
@@ -152,7 +152,7 @@ void Bars3DController::handleRowsRemoved(int startIndex, int count)
else
selectedRow -= count; // Move selected row down by amount of rows removed
- setSelectedBar(QPoint(selectedRow, m_selectedBar.y()), m_selectedBarSeries);
+ setSelectedBar(QPoint(selectedRow, m_selectedBar.y()), m_selectedBarSeries, false);
}
}
@@ -174,7 +174,7 @@ void Bars3DController::handleRowsInserted(int startIndex, int count)
int selectedRow = m_selectedBar.x();
if (startIndex <= selectedRow) {
selectedRow += count;
- setSelectedBar(QPoint(selectedRow, m_selectedBar.y()), m_selectedBarSeries);
+ setSelectedBar(QPoint(selectedRow, m_selectedBar.y()), m_selectedBarSeries, false);
}
}
@@ -240,9 +240,9 @@ void Bars3DController::handleSeriesVisibilityChangedBySender(QObject *sender)
adjustAxisRanges();
- // Visibility changes may require disabling/enabling slicing,
+ // Visibility changes may require disabling slicing,
// so just reset selection to ensure everything is still valid.
- setSelectedBar(m_selectedBar, m_selectedBarSeries);
+ setSelectedBar(m_selectedBar, m_selectedBarSeries, false);
}
void Bars3DController::handlePendingClick()
@@ -251,7 +251,7 @@ void Bars3DController::handlePendingClick()
QPoint position = m_renderer->clickedPosition();
QBar3DSeries *series = static_cast<QBar3DSeries *>(m_renderer->clickedSeries());
- setSelectedBar(position, series);
+ setSelectedBar(position, series, true);
m_renderer->resetClickedStatus();
}
@@ -309,7 +309,7 @@ void Bars3DController::removeSeries(QAbstract3DSeries *series)
Abstract3DController::removeSeries(series);
if (m_selectedBarSeries == series)
- setSelectedBar(invalidSelectionPosition(), 0);
+ setSelectedBar(invalidSelectionPosition(), 0, false);
if (wasVisible)
adjustAxisRanges();
@@ -348,7 +348,7 @@ void Bars3DController::insertSeries(int index, QAbstract3DSeries *series)
}
if (barSeries->selectedBar() != invalidSelectionPosition())
- setSelectedBar(barSeries->selectedBar(), barSeries);
+ setSelectedBar(barSeries->selectedBar(), barSeries, false);
if (!oldSize)
emit primarySeriesChanged(m_primarySeries);
@@ -381,7 +381,7 @@ void Bars3DController::handleAxisRangeChangedBySender(QObject *sender)
Abstract3DController::handleAxisRangeChangedBySender(sender);
// Update selected bar - may be moved offscreen
- setSelectedBar(m_selectedBar, m_selectedBarSeries);
+ setSelectedBar(m_selectedBar, m_selectedBarSeries, false);
}
void Bars3DController::setMultiSeriesScaling(bool uniform)
@@ -436,7 +436,7 @@ void Bars3DController::setSelectionMode(QAbstract3DGraph::SelectionFlags mode)
if (mode != oldMode) {
// Refresh selection upon mode change to ensure slicing is correctly updated
// according to series the visibility.
- setSelectedBar(m_selectedBar, m_selectedBarSeries);
+ setSelectedBar(m_selectedBar, m_selectedBarSeries, true);
// Special case: Always deactivate slicing when changing away from slice
// automanagement, as this can't be handled in setSelectedBar.
@@ -448,7 +448,7 @@ void Bars3DController::setSelectionMode(QAbstract3DGraph::SelectionFlags mode)
}
}
-void Bars3DController::setSelectedBar(const QPoint &position, QBar3DSeries *series)
+void Bars3DController::setSelectedBar(const QPoint &position, QBar3DSeries *series, bool enterSlice)
{
// If the selection targets non-existent bar, clear selection instead.
QPoint pos = position;
@@ -465,13 +465,14 @@ void Bars3DController::setSelectedBar(const QPoint &position, QBar3DSeries *seri
|| pos.y() < m_axisX->min() || pos.y() > m_axisX->max()
|| !series->isVisible()) {
scene()->setSlicingActive(false);
- } else {
+ } else if (enterSlice) {
scene()->setSlicingActive(true);
}
emitNeedRender();
}
if (pos != m_selectedBar || series != m_selectedBarSeries) {
+ bool seriesChanged = (series != m_selectedBarSeries);
m_selectedBar = pos;
m_selectedBarSeries = series;
m_changeTracker.selectedBarChanged = true;
@@ -485,13 +486,16 @@ void Bars3DController::setSelectedBar(const QPoint &position, QBar3DSeries *seri
if (m_selectedBarSeries)
m_selectedBarSeries->dptr()->setSelectedBar(m_selectedBar);
+ if (seriesChanged)
+ emit selectedSeriesChanged(m_selectedBarSeries);
+
emitNeedRender();
}
}
void Bars3DController::clearSelection()
{
- setSelectedBar(invalidSelectionPosition(), 0);
+ setSelectedBar(invalidSelectionPosition(), 0, false);
}
void Bars3DController::adjustAxisRanges()
diff --git a/src/datavisualization/engine/bars3dcontroller_p.h b/src/datavisualization/engine/bars3dcontroller_p.h
index e704aea1..9ea59c89 100644
--- a/src/datavisualization/engine/bars3dcontroller_p.h
+++ b/src/datavisualization/engine/bars3dcontroller_p.h
@@ -94,11 +94,14 @@ public:
QSizeF barSpacing();
bool isBarSpecRelative();
+ inline QBar3DSeries *selectedSeries() const { return m_selectedBarSeries; }
+
void setSelectionMode(QAbstract3DGraph::SelectionFlags mode);
- void setSelectedBar(const QPoint &position, QBar3DSeries *series);
+ void setSelectedBar(const QPoint &position, QBar3DSeries *series, bool enterSlice);
virtual void clearSelection();
- virtual void handleAxisAutoAdjustRangeChangedInOrientation(QAbstract3DAxis::AxisOrientation orientation, bool autoAdjust);
+ virtual void handleAxisAutoAdjustRangeChangedInOrientation(
+ QAbstract3DAxis::AxisOrientation orientation, bool autoAdjust);
virtual void handleSeriesVisibilityChangedBySender(QObject *sender);
virtual void handlePendingClick();
@@ -128,6 +131,7 @@ public slots:
signals:
void primarySeriesChanged(QBar3DSeries *series);
+ void selectedSeriesChanged(QBar3DSeries *series);
protected:
virtual QAbstract3DAxis *createDefaultAxis(QAbstract3DAxis::AxisOrientation orientation);
diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp
index 664dbabd..be1be0dc 100644
--- a/src/datavisualization/engine/bars3drenderer.cpp
+++ b/src/datavisualization/engine/bars3drenderer.cpp
@@ -28,11 +28,10 @@
#include "q3dlight.h"
#include "qbar3dseries_p.h"
-#include <QMatrix4x4>
-#include <QMouseEvent>
-#include <QThread>
-#include <qmath.h>
-#include <QDebug>
+#include <QtGui/QMatrix4x4>
+#include <QtGui/QMouseEvent>
+#include <QtCore/QThread>
+#include <QtCore/qmath.h>
// You can verify that depth buffer drawing works correctly by uncommenting this.
// You should see the scene from where the light is
@@ -44,7 +43,6 @@ const GLfloat labelMargin = 0.05f;
const GLfloat gridLineWidth = 0.005f;
const bool sliceGridLabels = true;
-const QQuaternion identityQuaternion;
Bars3DRenderer::Bars3DRenderer(Bars3DController *controller)
: Abstract3DRenderer(controller),
@@ -168,7 +166,6 @@ void Bars3DRenderer::updateData()
m_seriesStart = -((float(seriesCount) - 1.0f) / 2.0f) * m_seriesStep;
}
-
if (m_keepSeriesUniform)
m_seriesScaleZ = m_seriesScaleX;
else
@@ -259,30 +256,18 @@ void Bars3DRenderer::updateData()
updateSelectedBar(m_selectedBarPos, m_selectedBarSeries);
}
-void Bars3DRenderer::updateSeries(const QList<QAbstract3DSeries *> &seriesList, bool updateVisibility)
-{
- Abstract3DRenderer::updateSeries(seriesList, updateVisibility);
-
- // Fix the series rotations - ignore any rotations that are not along Y-axis
- for (int series = 0; series < m_visibleSeriesList.size(); series++) {
- QVector3D vector = m_visibleSeriesList.at(series).meshRotation().vector();
- if (vector.x() || vector.z())
- m_visibleSeriesList[series].setMeshRotation(identityQuaternion);
- }
-}
-
void Bars3DRenderer::updateScene(Q3DScene *scene)
{
if (m_hasNegativeValues)
- scene->activeCamera()->setMinYRotation(-90.0);
+ scene->activeCamera()->d_ptr->setMinYRotation(-90.0);
else
- scene->activeCamera()->setMinYRotation(0.0f);
+ scene->activeCamera()->d_ptr->setMinYRotation(0.0f);
if (m_hasHeightAdjustmentChanged) {
// Set initial camera position. Also update if height adjustment has changed.
- scene->activeCamera()->setBaseOrientation(cameraDistanceVector,
- zeroVector,
- upVector);
+ scene->activeCamera()->d_ptr->setBaseOrientation(cameraDistanceVector,
+ zeroVector,
+ upVector);
m_hasHeightAdjustmentChanged = false;
}
@@ -499,14 +484,14 @@ void Bars3DRenderer::drawSlicedScene()
int sliceItemCount = m_sliceSelection.size();
for (int bar = 0; bar < sliceItemCount; bar++) {
- BarRenderItem *item = m_sliceSelection.at(bar);
- if (!item)
+ const BarRenderSliceItem &item = m_sliceSelection.at(bar);
+ if (!item.value())
continue;
QQuaternion seriesRotation;
- if (item->seriesIndex() != currentSeriesIndex) {
- currentSeriesIndex = item->seriesIndex();
+ if (item.seriesIndex() != currentSeriesIndex) {
+ currentSeriesIndex = item.seriesIndex();
currentSeries = &(m_visibleSeriesList.at(currentSeriesIndex));
barObj = currentSeries->object();
colorStyle = currentSeries->colorStyle();
@@ -538,7 +523,7 @@ void Bars3DRenderer::drawSlicedScene()
seriesRotation = currentSeries->meshRotation();
}
- if (item->height() < 0)
+ if (item.height() < 0)
glCullFace(GL_FRONT);
else
glCullFace(GL_BACK);
@@ -546,18 +531,18 @@ void Bars3DRenderer::drawSlicedScene()
QMatrix4x4 MVPMatrix;
QMatrix4x4 modelMatrix;
QMatrix4x4 itModelMatrix;
- QQuaternion barRotation = item->rotation();
- GLfloat barPosY = item->translation().y() + barPosYAdjustment - zeroPosAdjustment;
+ QQuaternion barRotation = item.rotation();
+ GLfloat barPosY = item.translation().y() + barPosYAdjustment - zeroPosAdjustment;
if (rowMode) {
- barPosX = item->translation().x();
+ barPosX = item.translation().x();
} else {
- barPosX = -(item->translation().z()); // flip z; frontmost bar to the left
+ barPosX = -(item.translation().z()); // flip z; frontmost bar to the left
barRotation *= ninetyDegreeRotation;
}
modelMatrix.translate(barPosX, barPosY, 0.0f);
- modelMatrixScaler.setY(item->height());
+ modelMatrixScaler.setY(item.height());
if (!seriesRotation.isIdentity())
barRotation *= seriesRotation;
@@ -575,8 +560,8 @@ void Bars3DRenderer::drawSlicedScene()
QVector3D barColor;
GLuint gradientTexture = 0;
- if (itemMode && m_visualSelectedBarPos.x() == item->position().x()
- && m_visualSelectedBarPos.y() == item->position().y()) {
+ if (itemMode && m_visualSelectedBarPos.x() == item.position().x()
+ && m_visualSelectedBarPos.y() == item.position().y()) {
if (colorStyleIsUniform)
barColor = highlightColor;
else
@@ -588,7 +573,7 @@ void Bars3DRenderer::drawSlicedScene()
gradientTexture = baseGradientTexture;
}
- if (item->height() != 0) {
+ if (item.height() != 0) {
// Set shader bindings
barShader->setUniformValue(barShader->model(), modelMatrix);
barShader->setUniformValue(barShader->nModel(),
@@ -598,7 +583,7 @@ void Bars3DRenderer::drawSlicedScene()
barShader->setUniformValue(barShader->color(), barColor);
} else if (colorStyle == Q3DTheme::ColorStyleRangeGradient) {
barShader->setUniformValue(barShader->gradientHeight(),
- (qAbs(item->height()) / m_gradientFraction));
+ (qAbs(item.height()) / m_gradientFraction));
}
// Draw the object
@@ -628,10 +613,10 @@ void Bars3DRenderer::drawSlicedScene()
for (int labelNo = 0; labelNo <= lastLabel; labelNo++) {
// Get labels from first series only
- BarRenderItem *item = m_sliceSelection.at(labelNo);
- m_dummyBarRenderItem.setTranslation(QVector3D(item->translation().x(),
+ const BarRenderSliceItem &item = m_sliceSelection.at(labelNo);
+ m_dummyBarRenderItem.setTranslation(QVector3D(item.translation().x(),
barLabelYPos,
- item->translation().z()));
+ item.translation().z()));
// Draw labels
m_drawer->drawLabel(m_dummyBarRenderItem, *m_sliceCache->labelItems().at(labelNo),
viewMatrix, projectionMatrix, positionComp, sliceLabelRotation,
@@ -641,53 +626,53 @@ void Bars3DRenderer::drawSlicedScene()
}
for (int col = 0; col < sliceItemCount; col++) {
- BarRenderItem *item = m_sliceSelection.at(col);
+ BarRenderSliceItem &item = m_sliceSelection[col];
if (!sliceGridLabels) {
// Draw values
- if (item->height() != 0.0f || (!m_noZeroInRange && item->value() == 0.0f)) {
+ if (item.height() != 0.0f || (!m_noZeroInRange && item.value() == 0.0f)) {
// Create label texture if we need it
- if (item->sliceLabel().isNull() || m_updateLabels) {
- item->setSliceLabel(generateValueLabel(m_axisCacheY.labelFormat(),
- item->value()));
- m_drawer->generateLabelItem(item->sliceLabelItem(), item->sliceLabel());
+ if (item.sliceLabel().isNull() || m_updateLabels) {
+ item.setSliceLabel(generateValueLabel(m_axisCacheY.labelFormat(),
+ item.value()));
+ m_drawer->generateLabelItem(item.sliceLabelItem(), item.sliceLabel());
m_updateLabels = false;
}
- Qt::AlignmentFlag alignment = (item->height() < 0) ? Qt::AlignBottom : Qt::AlignTop;
- Drawer::LabelPosition labelPos = (item->height() < 0) ? Drawer::LabelBelow : Drawer::LabelOver;
- m_dummyBarRenderItem.setTranslation(QVector3D(item->translation().x(),
+ Qt::AlignmentFlag alignment = (item.height() < 0) ? Qt::AlignBottom : Qt::AlignTop;
+ Drawer::LabelPosition labelPos = (item.height() < 0) ? Drawer::LabelBelow : Drawer::LabelOver;
+ m_dummyBarRenderItem.setTranslation(QVector3D(item.translation().x(),
barPosYAdjustment - zeroPosAdjustment
- + item->height(),
- item->translation().z()));
+ + item.height(),
+ item.translation().z()));
- m_drawer->drawLabel(m_dummyBarRenderItem, item->sliceLabelItem(), viewMatrix,
+ m_drawer->drawLabel(m_dummyBarRenderItem, item.sliceLabelItem(), viewMatrix,
projectionMatrix, zeroVector, sliceValueRotation,
- item->height(), m_cachedSelectionMode, m_labelShader,
+ item.height(), m_cachedSelectionMode, m_labelShader,
m_labelObj, activeCamera, false, false, labelPos,
alignment, true);
}
} else {
// Only draw value for selected item when grid labels are on
- if (itemMode && m_visualSelectedBarPos.x() == item->position().x()
- && m_visualSelectedBarPos.y() == item->position().y()
- && item->seriesIndex() == m_visualSelectedBarSeriesIndex) {
+ if (itemMode && m_visualSelectedBarPos.x() == item.position().x()
+ && m_visualSelectedBarPos.y() == item.position().y()
+ && item.seriesIndex() == m_visualSelectedBarSeriesIndex) {
// Create label texture if we need it
- if (item->sliceLabel().isNull() || m_updateLabels) {
- item->setSliceLabel(generateValueLabel(m_axisCacheY.labelFormat(),
- item->value()));
- m_drawer->generateLabelItem(item->sliceLabelItem(), item->sliceLabel());
+ if (item.sliceLabel().isNull() || m_updateLabels) {
+ item.setSliceLabel(generateValueLabel(m_axisCacheY.labelFormat(),
+ item.value()));
+ m_drawer->generateLabelItem(item.sliceLabelItem(), item.sliceLabel());
m_updateLabels = false;
}
- Qt::AlignmentFlag alignment = (item->height() < 0) ? Qt::AlignBottom : Qt::AlignTop;
- Drawer::LabelPosition labelPos = (item->height() < 0) ? Drawer::LabelBelow : Drawer::LabelOver;
- m_dummyBarRenderItem.setTranslation(QVector3D(item->translation().x(),
+ Qt::AlignmentFlag alignment = (item.height() < 0) ? Qt::AlignBottom : Qt::AlignTop;
+ Drawer::LabelPosition labelPos = (item.height() < 0) ? Drawer::LabelBelow : Drawer::LabelOver;
+ m_dummyBarRenderItem.setTranslation(QVector3D(item.translation().x(),
barPosYAdjustment - zeroPosAdjustment
- + item->height(),
- item->translation().z()));
+ + item.height(),
+ item.translation().z()));
- m_drawer->drawLabel(m_dummyBarRenderItem, item->sliceLabelItem(), viewMatrix,
+ m_drawer->drawLabel(m_dummyBarRenderItem, item.sliceLabelItem(), viewMatrix,
projectionMatrix, zeroVector, sliceValueRotation,
- item->height(), m_cachedSelectionMode, m_labelShader,
+ item.height(), m_cachedSelectionMode, m_labelShader,
m_labelObj, activeCamera, false, false, labelPos,
alignment, true);
}
@@ -767,7 +752,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
projectionMatrix.perspective(45.0f, viewPortRatio, 0.1f, 100.0f);
// Get the view matrix
- QMatrix4x4 viewMatrix = activeCamera->viewMatrix();
+ QMatrix4x4 viewMatrix = activeCamera->d_ptr->viewMatrix();
// Calculate drawing order
// Draw order is reversed to optimize amount of drawing (ie. draw front objects first,
@@ -842,7 +827,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
// Get the depth view matrix
// It may be possible to hack lightPos here if we want to make some tweaks to shadow
- QVector3D depthLightPos = activeCamera->calculatePositionRelativeToCamera(
+ QVector3D depthLightPos = activeCamera->d_ptr->calculatePositionRelativeToCamera(
zeroVector, 0.0f, 3.5f / m_autoScaleAdjustment);
depthViewMatrix.lookAt(depthLightPos, zeroVector, upVector);
@@ -1213,9 +1198,9 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
item.setPosition(QPoint(row, bar));
item.setSeriesIndex(series);
if (rowMode)
- m_sliceSelection[sliceSeriesAdjust + bar] = &item;
+ m_sliceSelection[sliceSeriesAdjust + bar].setItem(item);
else
- m_sliceSelection[sliceSeriesAdjust + row] = &item;
+ m_sliceSelection[sliceSeriesAdjust + row].setItem(item);
}
break;
}
@@ -1235,7 +1220,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
item.setSeriesIndex(series);
if (!m_sliceTitleItem && m_axisCacheZ.labelItems().size() > row)
m_sliceTitleItem = m_axisCacheZ.labelItems().at(row);
- m_sliceSelection[sliceSeriesAdjust + bar] = &item;
+ m_sliceSelection[sliceSeriesAdjust + bar].setItem(item);
}
}
break;
@@ -1262,7 +1247,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
item.setSeriesIndex(series);
if (!m_sliceTitleItem && m_axisCacheX.labelItems().size() > bar)
m_sliceTitleItem = m_axisCacheX.labelItems().at(bar);
- m_sliceSelection[sliceSeriesAdjust + row] = &item;
+ m_sliceSelection[sliceSeriesAdjust + row].setItem(item);
}
}
break;
@@ -1304,6 +1289,8 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
// Draw the object
m_drawer->drawObject(barShader, barObj, gradientTexture, m_depthTexture);
} else
+#else
+ Q_UNUSED(shadowLightStrength);
#endif
{
// Set shadowless shader bindings
@@ -1816,10 +1803,10 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
// Print value of selected bar
glDisable(GL_DEPTH_TEST);
// Draw the selection label
- LabelItem &labelItem = selectedBar->selectionLabelItem();
+ LabelItem &labelItem = selectionLabelItem();
if (m_selectedBar != selectedBar || m_updateLabels || !labelItem.textureId()
|| m_selectionLabelDirty) {
- QString labelText = selectedBar->selectionLabel();
+ QString labelText = selectionLabel();
if (labelText.isNull() || m_selectionLabelDirty) {
static const QString rowIndexTag(QStringLiteral("@rowIdx"));
static const QString rowLabelTag(QStringLiteral("@rowLabel"));
@@ -1863,7 +1850,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
labelText.replace(seriesNameTag,
m_visibleSeriesList[m_visualSelectedBarSeriesIndex].name());
- selectedBar->setSelectionLabel(labelText);
+ setSelectionLabel(labelText);
m_selectionLabelDirty = false;
}
m_drawer->generateLabelItem(labelItem, labelText);
@@ -1954,6 +1941,7 @@ void Bars3DRenderer::updateSelectedBar(const QPoint &position, const QBar3DSerie
m_selectedBarPos = position;
m_selectedBarSeries = series;
m_selectionDirty = true;
+ m_selectionLabelDirty = true;
m_visualSelectedBarSeriesIndex = -1;
if (m_renderingArrays.isEmpty()) {
diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h
index e53f9bc5..37ac2b76 100644
--- a/src/datavisualization/engine/bars3drenderer_p.h
+++ b/src/datavisualization/engine/bars3drenderer_p.h
@@ -60,7 +60,7 @@ private:
// Internal state
BarRenderItem *m_selectedBar; // points to renderitem array
- QVector<BarRenderItem *> m_sliceSelection;
+ QVector<BarRenderSliceItem> m_sliceSelection;
AxisRenderCache *m_sliceCache; // not owned
const LabelItem *m_sliceTitleItem; // not owned
bool m_xFlipped;
@@ -114,7 +114,6 @@ public:
~Bars3DRenderer();
void updateData();
- void updateSeries(const QList<QAbstract3DSeries *> &seriesList, bool updateVisibility);
void updateScene(Q3DScene *scene);
void render(GLuint defaultFboHandle = 0);
diff --git a/src/datavisualization/engine/drawer.cpp b/src/datavisualization/engine/drawer.cpp
index dd82eadc..55a2c2a5 100644
--- a/src/datavisualization/engine/drawer.cpp
+++ b/src/datavisualization/engine/drawer.cpp
@@ -24,8 +24,10 @@
#include "q3dcamera.h"
#include "utils_p.h"
#include "texturehelper_p.h"
-#include <QMatrix4x4>
-#include <qmath.h>
+#include "abstract3drenderer_p.h"
+
+#include <QtGui/QMatrix4x4>
+#include <QtCore/qmath.h>
// Resources need to be explicitly initialized when building as static library
class StaticLibInitializer
@@ -348,10 +350,10 @@ void Drawer::drawLabel(const AbstractRenderItem &item, const LabelItem &labelIte
drawObject(shader, object, labelItem.textureId());
}
-void Drawer::generateSelectionLabelTexture(AbstractRenderItem *item)
+void Drawer::generateSelectionLabelTexture(Abstract3DRenderer *renderer)
{
- LabelItem &labelItem = item->selectionLabelItem();
- generateLabelItem(labelItem, item->selectionLabel());
+ LabelItem &labelItem = renderer->selectionLabelItem();
+ generateLabelItem(labelItem, renderer->selectionLabel());
}
void Drawer::generateLabelItem(LabelItem &item, const QString &text, int widestLabel)
diff --git a/src/datavisualization/engine/drawer_p.h b/src/datavisualization/engine/drawer_p.h
index 35a0a7ff..8e98aa3a 100644
--- a/src/datavisualization/engine/drawer_p.h
+++ b/src/datavisualization/engine/drawer_p.h
@@ -34,7 +34,6 @@
#include "q3dtheme.h"
#include "labelitem_p.h"
#include "abstractrenderitem_p.h"
-#include <QFont>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -44,6 +43,7 @@ class AbstractObjectHelper;
class SurfaceObject;
class TextureHelper;
class Q3DCamera;
+class Abstract3DRenderer;
class Drawer : public QObject, public QOpenGLFunctions
{
@@ -84,7 +84,7 @@ public:
LabelPosition position = LabelOver,
Qt::AlignmentFlag alignment = Qt::AlignCenter, bool isSlicing = false);
- void generateSelectionLabelTexture(AbstractRenderItem *item);
+ void generateSelectionLabelTexture(Abstract3DRenderer *item);
void generateLabelItem(LabelItem &item, const QString &text, int widestLabel = 0);
Q_SIGNALS:
diff --git a/src/datavisualization/engine/engine.pri b/src/datavisualization/engine/engine.pri
index e13a9a04..9c2e71e4 100644
--- a/src/datavisualization/engine/engine.pri
+++ b/src/datavisualization/engine/engine.pri
@@ -23,10 +23,10 @@ HEADERS += $$PWD/qabstract3dgraph_p.h \
$$PWD/q3dscene.h \
$$PWD/q3dlight.h \
$$PWD/q3dlight_p.h \
- $$PWD/q3dbox.h \
$$PWD/q3dobject.h \
$$PWD/q3dobject_p.h \
- $$PWD/q3dscene_p.h
+ $$PWD/q3dscene_p.h \
+ $$PWD/surfaceseriesrendercache_p.h
SOURCES += $$PWD/qabstract3dgraph.cpp \
$$PWD/q3dbars.cpp \
@@ -46,8 +46,10 @@ SOURCES += $$PWD/qabstract3dgraph.cpp \
$$PWD/selectionpointer.cpp \
$$PWD/q3dcamera.cpp \
$$PWD/q3dlight.cpp \
- $$PWD/q3dbox.cpp \
$$PWD/q3dobject.cpp \
- $$PWD/q3dscene.cpp
+ $$PWD/q3dscene.cpp \
+ $$PWD/surfaceseriesrendercache.cpp
RESOURCES += engine/engine.qrc
+
+OTHER_FILES += $$PWD/meshes/* $$PWD/shaders/*
diff --git a/src/datavisualization/engine/q3dbars.cpp b/src/datavisualization/engine/q3dbars.cpp
index 787033ad..7b37715f 100644
--- a/src/datavisualization/engine/q3dbars.cpp
+++ b/src/datavisualization/engine/q3dbars.cpp
@@ -104,6 +104,8 @@ Q3DBars::Q3DBars(const QSurfaceFormat *format, QWindow *parent)
dptr()->m_shared->initializeOpenGL();
QObject::connect(dptr()->m_shared, &Bars3DController::primarySeriesChanged,
this, &Q3DBars::primarySeriesChanged);
+ QObject::connect(dptr()->m_shared, &Bars3DController::selectedSeriesChanged,
+ this, &Q3DBars::selectedSeriesChanged);
}
/*!
@@ -328,6 +330,17 @@ QValue3DAxis *Q3DBars::valueAxis() const
}
/*!
+ * \property Q3DBars::selectedSeries
+ *
+ * The selected series or \c null. If selectionMode has \c SelectionMultiSeries flag set, this
+ * property holds the series which owns the selected bar.
+ */
+QBar3DSeries *Q3DBars::selectedSeries() const
+{
+ return dptrc()->m_shared->selectedSeries();
+}
+
+/*!
* Adds \a axis to the graph. The axes added via addAxis are not yet taken to use,
* addAxis is simply used to give the ownership of the \a axis to the graph.
* The \a axis must not be null or added to another graph.
diff --git a/src/datavisualization/engine/q3dbars.h b/src/datavisualization/engine/q3dbars.h
index 06dcfedb..7f9c981f 100644
--- a/src/datavisualization/engine/q3dbars.h
+++ b/src/datavisualization/engine/q3dbars.h
@@ -20,16 +20,13 @@
#define Q3DBARS_H
#include <QtDataVisualization/qabstract3dgraph.h>
-#include <QFont>
-#include <QLinearGradient>
+#include <QtDataVisualization/qvalue3daxis.h>
+#include <QtDataVisualization/qcategory3daxis.h>
+#include <QtDataVisualization/qbar3dseries.h>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
class Q3DBarsPrivate;
-class QAbstract3DAxis;
-class QCategory3DAxis;
-class QValue3DAxis;
-class QBar3DSeries;
class QT_DATAVISUALIZATION_EXPORT Q3DBars : public QAbstract3DGraph
{
@@ -42,6 +39,7 @@ class QT_DATAVISUALIZATION_EXPORT Q3DBars : public QAbstract3DGraph
Q_PROPERTY(QCategory3DAxis *columnAxis READ columnAxis WRITE setColumnAxis NOTIFY columnAxisChanged)
Q_PROPERTY(QValue3DAxis *valueAxis READ valueAxis WRITE setValueAxis NOTIFY valueAxisChanged)
Q_PROPERTY(QBar3DSeries *primarySeries READ primarySeries WRITE setPrimarySeries NOTIFY primarySeriesChanged)
+ Q_PROPERTY(QBar3DSeries *selectedSeries READ selectedSeries NOTIFY selectedSeriesChanged)
public:
explicit Q3DBars(const QSurfaceFormat *format = 0, QWindow *parent = 0);
@@ -76,15 +74,18 @@ public:
void releaseAxis(QAbstract3DAxis *axis);
QList<QAbstract3DAxis *> axes() const;
+ QBar3DSeries *selectedSeries() const;
+
signals:
void multiSeriesUniformChanged(bool uniform);
void barThicknessChanged(float thicknessRatio);
- void barSpacingChanged(QSizeF spacing);
+ void barSpacingChanged(const QSizeF &spacing);
void barSpacingRelativeChanged(bool relative);
void rowAxisChanged(QCategory3DAxis *axis);
void columnAxisChanged(QCategory3DAxis *axis);
void valueAxisChanged(QValue3DAxis *axis);
void primarySeriesChanged(QBar3DSeries *series);
+ void selectedSeriesChanged(QBar3DSeries *series);
private:
Q3DBarsPrivate *dptr();
diff --git a/src/datavisualization/engine/q3dbox.cpp b/src/datavisualization/engine/q3dbox.cpp
deleted file mode 100644
index c5caea75..00000000
--- a/src/datavisualization/engine/q3dbox.cpp
+++ /dev/null
@@ -1,485 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2014 Digia Plc
-** All rights reserved.
-** For any questions to Digia, please use contact form at http://qt.digia.com
-**
-** This file is part of the QtDataVisualization module.
-**
-** Licensees holding valid Qt Enterprise licenses may use this file in
-** accordance with the Qt Enterprise License Agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Digia.
-**
-** If you have questions regarding the use of this file, please use
-** contact form at http://qt.digia.com
-**
-****************************************************************************/
-
-#include "datavisualizationglobal_p.h"
-#include "q3dbox.h"
-#include <QtCore/QList>
-
-QT_BEGIN_NAMESPACE_DATAVISUALIZATION
-
-/*!
- \class Q3DBox
- \inmodule QtDataVisualization
- \brief The Q3DBox class represents an axis-aligned box in 3D space.
- \since Qt Data Visualization 1.0
-
- Q3DBox can be used to represent the bounding box of objects in a 3D
- scene so that they can be easily culled if they are out of view.
-
- The sides of the box are always aligned with the x, y, and z axes of
- the world co-ordinate system. Transforming a box with transformed()
- will result in the smallest axis-aligned bounding box that contains
- the transformed box.
-
- Boxes may be null, finite, or infinite. A null box does not occupy
- any space and does not intersect with any other box. A finite
- box consists of a minimum() and maximum() extent in 3D space.
- An infinite box encompasses all points in 3D space.
-
- The extents of a finite box are also included within the box.
- A box with minimum() and maximum() set to the same value
- contains a single point.
-*/
-
-/*!
- \fn Q3DBox::Q3DBox()
-
- Constructs a null box in 3D space.
-
- \sa isNull()
-*/
-
-/*!
- \fn Q3DBox::Q3DBox(const QVector3D& corner1, const QVector3D& corner2)
-
- Constructs a finite box in 3D space from \a corner1 to \a corner2.
- The minimum() and maximum() co-ordinates of the new box are set
- to the minimum and maximum x, y, and z values from \a corner1 and
- \a corner2. The \a corner1 and \a corner2 values can be any two
- opposite corners that define the box.
-
- \sa isFinite(), minimum(), maximum()
-*/
-
-/*!
- \fn bool Q3DBox::isNull() const
-
- Returns true if this box is null; false otherwise.
-
- \sa isFinite(), isInfinite(), setToNull()
-*/
-
-/*!
- \fn bool Q3DBox::isFinite() const
-
- Returns true if this box is finite in size; false otherwise.
-
- \sa isNull(), isInfinite(), setExtents()
-*/
-
-/*!
- \fn bool Q3DBox::isInfinite() const
-
- Returns true if this box is infinite in size; false otherwise.
-
- \sa isNull(), isFinite(), setToInfinite()
-*/
-
-/*!
- \fn QVector3D Q3DBox::minimum() const
-
- Returns the minimum corner of this box.
-
- \sa maximum(), setExtents()
-*/
-
-/*!
- \fn QVector3D Q3DBox::maximum() const
-
- Returns the maximum corner of this box.
-
- \sa minimum(), setExtents()
-*/
-
-/*!
- \fn void Q3DBox::setExtents(const QVector3D& corner1, const QVector3D& corner2)
-
- Sets the extents of this box to a finite region from \a corner1 to
- \a corner2. The minimum() and maximum() co-ordinates of the box are
- set to the minimum and maximum x, y, and z values from \a corner1 and
- \a corner2. The \a corner1 and \a corner2 values can be any two
- opposite corners that define the box.
-
- \sa minimum(), maximum()
-*/
-
-/*!
- \fn void Q3DBox::setToNull()
-
- Sets this box to null.
-
- \sa isNull()
-*/
-
-/*!
- \fn void Q3DBox::setToInfinite()
-
- Sets this box to be infinite in size.
-
- \sa isInfinite()
-*/
-
-/*!
- \fn QVector3D Q3DBox::size() const
-
- Returns the finite size of this box. If this box is null or
- infinite, the returned value will be zero.
-
- \sa center(), isNull(), isInfinite()
-*/
-
-/*!
- \fn QVector3D Q3DBox::center() const
-
- Returns the finite center of this box. If this box is null
- or infinite, the returned value will be zero.
-
- \sa size(), isNull(), isInfinite()
-*/
-
-/*!
- \fn bool Q3DBox::contains(const QVector3D& point) const
-
- Returns true if this box contains \a point; false otherwise.
- Null boxes do not contain any points and infinite boxes contain
- all points.
-
- Containment is not a strict test: the point is contained if it
- lies on one of the faces of the box.
-
- \sa intersects()
-*/
-
-/*!
- \fn bool Q3DBox::contains(const Q3DBox& box) const
-
- Returns true if this box completely contains \a box. If this box
- is null, then it will not contain \a box. If this box is infinite,
- and \a box is not null, then \a box will be contained within this box.
- If \a box is infinite, then this box must also be infinite to contain it.
-
- \sa intersects()
-*/
-
-/*!
- Returns true if \a box intersects this box; false otherwise.
-
- \sa intersect(), intersected(), contains()
-*/
-bool Q3DBox::intersects(const Q3DBox& box) const
-{
- if (boxtype == Null)
- return false;
- else if (boxtype == Infinite)
- return box.boxtype != Null;
- else if (box.boxtype == Null)
- return false;
- else if (box.boxtype == Infinite)
- return true;
-
- if (maxcorner.x() < box.mincorner.x())
- return false;
- if (mincorner.x() > box.maxcorner.x())
- return false;
-
- if (maxcorner.y() < box.mincorner.y())
- return false;
- if (mincorner.y() > box.maxcorner.y())
- return false;
-
- if (maxcorner.z() < box.mincorner.z())
- return false;
- if (mincorner.z() > box.maxcorner.z())
- return false;
-
- return true;
-}
-
-/*!
- Intersects this box with \a box.
-
- \sa intersected(), intersects(), unite()
-*/
-void Q3DBox::intersect(const Q3DBox& box)
-{
- // Handle the simple cases first.
- if (boxtype == Null) {
- // Null intersected with anything is null.
- return;
- } else if (boxtype == Infinite) {
- // Infinity intersected with a box is that box.
- *this = box;
- return;
- } else if (box.boxtype == Null) {
- // Anything intersected with null is null.
- setToNull();
- return;
- } else if (box.boxtype == Infinite) {
- // Box intersected with infinity is the box.
- return;
- }
-
- // Intersect two finite boxes.
- QVector3D min1 = mincorner;
- QVector3D max1 = maxcorner;
- QVector3D min2 = box.mincorner;
- QVector3D max2 = box.maxcorner;
- if (min2.x() > min1.x())
- min1.setX(min2.x());
- if (min2.y() > min1.y())
- min1.setY(min2.y());
- if (min2.z() > min1.z())
- min1.setZ(min2.z());
- if (max2.x() < max1.x())
- max1.setX(max2.x());
- if (max2.y() < max1.y())
- max1.setY(max2.y());
- if (max2.z() < max1.z())
- max1.setZ(max2.z());
- if (min1.x() > max1.x() || min1.y() > max1.y() || min1.z() > max1.z()) {
- setToNull();
- } else {
- mincorner = min1;
- maxcorner = max1;
- }
-}
-
-/*!
- Returns a new box which is the intersection of this box with \a box.
-
- \sa intersect(), intersects(), united()
-*/
-Q3DBox Q3DBox::intersected(const Q3DBox& box) const
-{
- Q3DBox result(*this);
- result.intersect(box);
- return result;
-}
-
-/*!
- Unites this box with \a point by expanding it to encompass \a point.
- If \a point is already contained within this box, then this box
- will be unchanged.
-
- \sa united(), intersect()
-*/
-void Q3DBox::unite(const QVector3D& point)
-{
- if (boxtype == Finite) {
- if (point.x() < mincorner.x())
- mincorner.setX(point.x());
- else if (point.x() > maxcorner.x())
- maxcorner.setX(point.x());
- if (point.y() < mincorner.y())
- mincorner.setY(point.y());
- else if (point.y() > maxcorner.y())
- maxcorner.setY(point.y());
- if (point.z() < mincorner.z())
- mincorner.setZ(point.z());
- else if (point.z() > maxcorner.z())
- maxcorner.setZ(point.z());
- } else if (boxtype == Null) {
- boxtype = Finite;
- mincorner = point;
- maxcorner = point;
- }
-}
-
-/*!
- Unites this box with \a box by expanding this box to encompass the
- region defined by \a box. If \a box is already contained within
- this box, then this box will be unchanged.
-
- \sa united(), intersect()
-*/
-void Q3DBox::unite(const Q3DBox& box)
-{
- if (box.boxtype == Finite) {
- unite(box.minimum());
- unite(box.maximum());
- } else if (box.boxtype == Infinite) {
- setToInfinite();
- }
-}
-
-/*!
- Returns a new box which unites this box with \a point. The returned
- value will be the smallest box that contains both this box and \a point.
-
- \sa unite(), intersected()
-*/
-Q3DBox Q3DBox::united(const QVector3D& point) const
-{
- if (boxtype == Finite) {
- Q3DBox result(*this);
- result.unite(point);
- return result;
- } else if (boxtype == Null) {
- return Q3DBox(point, point);
- } else {
- return *this;
- }
-}
-
-/*!
- Returns a new box which unites this box with \a box. The returned value
- will be the smallest box that contains both this box and \a box.
-
- \sa unite(), intersected()
-*/
-Q3DBox Q3DBox::united(const Q3DBox& box) const
-{
- if (boxtype == Finite) {
- Q3DBox result(*this);
- result.unite(box);
- return result;
- } else if (boxtype == Null) {
- return box;
- } else {
- return *this;
- }
-}
-
-/*!
- Transforms this box according to \a matrix. Each of the 8 box
- corners are transformed and then a new box that encompasses all
- of the transformed corner values is created.
-
- \sa transformed()
-*/
-void Q3DBox::transform(const QMatrix4x4& matrix)
-{
- *this = transformed(matrix);
-}
-
-/*!
- Returns this box transformed by \a matrix. Each of the 8 box
- corners are transformed and then a new box that encompasses all
- of the transformed corner values is returned.
-
- \sa transform()
-*/
-Q3DBox Q3DBox::transformed(const QMatrix4x4& matrix) const
-{
- if (boxtype != Finite)
- return *this;
- Q3DBox result;
- result.unite(matrix * mincorner);
- result.unite(matrix * QVector3D(mincorner.x(), mincorner.y(), maxcorner.z()));
- result.unite(matrix * QVector3D(mincorner.x(), maxcorner.y(), maxcorner.z()));
- result.unite(matrix * QVector3D(mincorner.x(), maxcorner.y(), mincorner.z()));
- result.unite(matrix * QVector3D(maxcorner.x(), mincorner.y(), mincorner.z()));
- result.unite(matrix * QVector3D(maxcorner.x(), maxcorner.y(), mincorner.z()));
- result.unite(matrix * QVector3D(maxcorner.x(), mincorner.y(), maxcorner.z()));
- result.unite(matrix * maxcorner);
- return result;
-}
-
-/*!
- \fn bool Q3DBox::operator==(const Q3DBox& box) const
-
- Returns true if this box is identical to \a box.
-*/
-
-/*!
- \fn bool Q3DBox::operator!=(const Q3DBox& box) const
-
- Returns true if this box is not identical to \a box.
-*/
-
-/*!
- \fn bool qFuzzyCompare(const Q3DBox& box1, const Q3DBox& box2)
- \relates Q3DBox
-
- Returns true if \a box1 and \a box2 are almost equal; false otherwise.
-*/
-
-#ifndef QT_NO_DEBUG_STREAM
-
-/*!
- \fn operator<<(QDebug dbg, const Q3DBox &box)
- \internal
- */
-QDebug operator<<(QDebug dbg, const Q3DBox &box)
-{
- if (box.isFinite()) {
- dbg.nospace() << "Q3DBox(("
- << box.minimum().x() << ", " << box.minimum().y() << ", "
- << box.minimum().z() << ") - ("
- << box.maximum().x() << ", " << box.maximum().y() << ", "
- << box.maximum().z() << "))";
- return dbg.space();
- } else if (box.isNull()) {
- dbg << "Q3DBox(null)";
- return dbg;
- } else {
- dbg << "Q3DBox(infinite)";
- return dbg;
- }
-}
-
-#endif
-
-#ifndef QT_NO_DATASTREAM
-
-/*!
- \relates Q3DBox
-
- Writes the given \a box to the given \a stream and returns a
- reference to the stream.
-*/
-QDataStream &operator<<(QDataStream &stream, const Q3DBox &box)
-{
- if (box.isNull()) {
- stream << int(0);
- } else if (box.isInfinite()) {
- stream << int(2);
- } else {
- stream << int(1);
- stream << box.minimum();
- stream << box.maximum();
- }
- return stream;
-}
-
-/*!
- \relates Q3DBox
-
- Reads a 3D box from the given \a stream into the given \a box
- and returns a reference to the stream.
-*/
-QDataStream &operator>>(QDataStream &stream, Q3DBox &box)
-{
- int type;
- stream >> type;
- if (type == 1) {
- QVector3D minimum, maximum;
- stream >> minimum;
- stream >> maximum;
- box = Q3DBox(minimum, maximum);
- } else if (type == 2) {
- box.setToInfinite();
- } else {
- box.setToNull();
- }
- return stream;
-}
-
-#endif
-
-QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/engine/q3dbox.h b/src/datavisualization/engine/q3dbox.h
deleted file mode 100644
index 6dbaefa1..00000000
--- a/src/datavisualization/engine/q3dbox.h
+++ /dev/null
@@ -1,158 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2014 Digia Plc
-** All rights reserved.
-** For any questions to Digia, please use contact form at http://qt.digia.com
-**
-** This file is part of the QtDataVisualization module.
-**
-** Licensees holding valid Qt Enterprise licenses may use this file in
-** accordance with the Qt Enterprise License Agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Digia.
-**
-** If you have questions regarding the use of this file, please use
-** contact form at http://qt.digia.com
-**
-****************************************************************************/
-
-#ifndef Q3DBOX_H
-#define Q3DBOX_H
-
-#include <QtDataVisualization/qdatavisualizationglobal.h>
-#include <QtGui/QMatrix4x4>
-#include <QtGui/QVector3D>
-
-QT_BEGIN_NAMESPACE_DATAVISUALIZATION
-
-class Q3DBox; // Needed to circumvent an issue with qdoc. If this line is removed, make docs will not work for this.
-
-class QT_DATAVISUALIZATION_EXPORT Q3DBox
-{
-public:
- inline Q3DBox() : boxtype(Null), mincorner(0, 0, 0), maxcorner(0, 0, 0) {}
- inline Q3DBox(const QVector3D& corner1, const QVector3D& corner2): boxtype(Finite),
- mincorner(qMin(corner1.x(), corner2.x()),
- qMin(corner1.y(), corner2.y()),
- qMin(corner1.z(), corner2.z())),
- maxcorner(qMax(corner1.x(), corner2.x()),
- qMax(corner1.y(), corner2.y()),
- qMax(corner1.z(), corner2.z())) {}
-
- inline bool isNull() const { return (boxtype == Null); }
- inline bool isFinite() const { return (boxtype == Finite); }
- inline bool isInfinite() const { return (boxtype == Infinite); }
-
- inline QVector3D minimum() const { return mincorner; }
- inline QVector3D maximum() const { return maxcorner; }
- inline void setExtents(const QVector3D& corner1, const QVector3D& corner2)
- {
- boxtype = Finite;
- mincorner = QVector3D(qMin(corner1.x(), corner2.x()),
- qMin(corner1.y(), corner2.y()),
- qMin(corner1.z(), corner2.z()));
- maxcorner = QVector3D(qMax(corner1.x(), corner2.x()),
- qMax(corner1.y(), corner2.y()),
- qMax(corner1.z(), corner2.z()));
- }
-
- inline void setToNull()
- {
- boxtype = Null;
- mincorner = QVector3D(0, 0, 0);
- maxcorner = QVector3D(0, 0, 0);
- }
-
- inline void setToInfinite()
- {
- boxtype = Infinite;
- mincorner = QVector3D(0, 0, 0);
- maxcorner = QVector3D(0, 0, 0);
- }
-
- inline QVector3D size() const { return maxcorner - mincorner; }
- inline QVector3D center() const { return (mincorner + maxcorner) * 0.5f; }
-
- inline bool contains(const QVector3D& point) const
- {
- if (boxtype == Finite) {
- return (point.x() >= mincorner.x() && point.x() <= maxcorner.x() &&
- point.y() >= mincorner.y() && point.y() <= maxcorner.y() &&
- point.z() >= mincorner.z() && point.z() <= maxcorner.z());
- } else if (boxtype == Infinite) {
- return true;
- } else {
- return false;
- }
- }
-
- inline bool contains(const Q3DBox& box) const
- {
- if (box.boxtype == Finite)
- return contains(box.mincorner) && contains(box.maxcorner);
- else if (box.boxtype == Infinite)
- return (boxtype == Infinite);
- else
- return false;
- }
-
- bool intersects(const Q3DBox& box) const;
- void intersect(const Q3DBox& box);
- Q3DBox intersected(const Q3DBox& box) const;
-
- void unite(const QVector3D& point);
- void unite(const Q3DBox& box);
-
- Q3DBox united(const QVector3D& point) const;
- Q3DBox united(const Q3DBox& box) const;
-
- void transform(const QMatrix4x4& matrix);
- Q3DBox transformed(const QMatrix4x4& matrix) const;
-
- inline bool operator==(const Q3DBox& box) const
- {
- return (boxtype == box.boxtype &&
- mincorner == box.mincorner &&
- maxcorner == box.maxcorner);
- }
-
- inline bool operator!=(const Q3DBox& box) const
- {
- return (boxtype != box.boxtype ||
- mincorner != box.mincorner ||
- maxcorner != box.maxcorner);
- }
-
- friend bool qFuzzyCompare(const Q3DBox& box1, const Q3DBox& box2);
-
-private:
- enum Type
- {
- Null,
- Finite,
- Infinite
- };
-
- Q3DBox::Type boxtype;
- QVector3D mincorner, maxcorner;
-};
-
-inline bool qFuzzyCompare(const Q3DBox& box1, const Q3DBox& box2)
-{
- return box1.boxtype == box2.boxtype &&
- qFuzzyCompare(box1.mincorner, box2.mincorner) &&
- qFuzzyCompare(box1.maxcorner, box2.maxcorner);
-}
-
-#ifndef QT_NO_DEBUG_STREAM
-QT_DATAVISUALIZATION_EXPORT QDebug operator<<(QDebug dbg, const Q3DBox &box);
-#endif
-
-#ifndef QT_NO_DATASTREAM
-QT_DATAVISUALIZATION_EXPORT QDataStream &operator<<(QDataStream &stream, const Q3DBox &box);
-QT_DATAVISUALIZATION_EXPORT QDataStream &operator>>(QDataStream &stream, Q3DBox &box);
-#endif
-
-QT_END_NAMESPACE_DATAVISUALIZATION
-
-#endif
diff --git a/src/datavisualization/engine/q3dcamera.cpp b/src/datavisualization/engine/q3dcamera.cpp
index 426fa51d..c7342aa9 100644
--- a/src/datavisualization/engine/q3dcamera.cpp
+++ b/src/datavisualization/engine/q3dcamera.cpp
@@ -19,12 +19,10 @@
#include "q3dcamera.h"
#include "q3dcamera_p.h"
#include "q3dscene.h"
-#include "q3dbox.h"
#include "q3dobject.h"
#include "utils_p.h"
-#include <qmath.h>
-#include <QVector3D>
+#include <QtCore/qmath.h>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -35,9 +33,8 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION
* \since Qt Data Visualization 1.0
*
* Q3DCamera represents a basic orbit around centerpoint 3D camera that is used when rendering the
- * data visualization. The class offers simple methods for setting the orbit point in rotations,
- * but allows also setting the 4x4 view matrix directly in case a more customized camera behavior is
- * needed.
+ * data visualization. The class offers simple methods for rotating the camera around the origin
+ * and setting zoom level.
*/
/*!
@@ -85,9 +82,8 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION
* \brief Representation of a camera in 3D space.
*
* Camera3D represents a basic orbit around centerpoint 3D camera that is used when rendering the
- * data visualization. The class offers simple methods for setting the orbit point in rotations,
- * but allows also setting the 4x4 view matrix directly in case a more customized camera behavior is
- * needed.
+ * data visualization. The type offers simple methods for rotating the camera around the origin
+ * and setting zoom level.
*
* For Camera3D enums, see \l Q3DCamera::CameraPreset
*/
@@ -107,74 +103,6 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION
*/
/*!
- * \qmlproperty float Camera3D::minXRotation
- *
- * This property contains the current minimum X-rotation for the camera.
- * The full circle range is \c{[-180, 180]} and the minimum value is limited to \c -180.
- * Also the value can't be higher than the maximum, and is adjusted if necessary.
- *
- * \sa wrapXRotation, maxXRotation
- */
-
-/*!
- * \qmlproperty float Camera3D::minYRotation
- *
- * This property contains the current minimum Y-rotation for the camera.
- * The full Y angle range is \c{[-90, 90]} and the minimum value is limited to \c -90.
- * Also the value can't be higher than the maximum, and is adjusted if necessary.
- *
- * \sa wrapYRotation, maxYRotation
- */
-
-/*!
- * \qmlproperty float Camera3D::maxXRotation
- *
- * This property contains the current maximum X-rotation for the camera.
- * The full circle range is \c{[-180, 180]} and the maximum value is limited to \c 180.
- * Also the value can't be lower than the minimum, and is adjusted if necessary.
- *
- * \sa wrapXRotation, minXRotation
- */
-
-/*!
- * \qmlproperty float Camera3D::maxYRotation
- *
- * This property contains the current maximum Y-rotation for the camera.
- * The full Y angle range is \c{[-90, 90]} and the maximum value is limited to \c 90.
- * Also the value can't be lower than the minimum, and is adjusted if necessary.
- *
- * \sa wrapYRotation, minYRotation
- */
-
-/*!
- * \qmlmethod void Camera3D::setBaseOrientation(vector3d basePosition, vector3d target, vector3d baseUp)
- *
- * Sets the base values for the camera that are used when calculating the camera position using the
- * rotation values. The base position of the camera is defined by \a basePosition, expectation is
- * that the x and y values are 0. Look at target point is defined by \a target and the camera
- * rotates around it. Up direction for the camera is defined by \a baseUp, normally this is a
- * vector with only y value set to 1.
- */
-
-/*!
- * \qmlproperty matrix4x4 Camera3D::viewMatrix
- *
- * This property contains the view matrix used in the 3D calculations. When the default orbiting
- * camera behavior is sufficient, there is no need to touch this property. If the default
- * behavior is insufficient, the view matrix can be set directly.
- * \note When setting the view matrix directly remember to set viewMatrixAutoUpdateEnabled
- * property to \c false.
- */
-
-/*!
- * \qmlproperty bool Camera3D::viewMatrixAutoUpdateEnabled
- *
- * This property determines if view matrix is automatically updated each render cycle using the
- * current base orientation and rotations. If set to \c false, no automatic recalculation is done and
- * the view matrix can be set using the viewMatrix property.
- */
-
-/*!
* \qmlproperty Camera3D.CameraPreset Camera3D::cameraPreset
*
* This property contains the currently active camera preset, which is one of
@@ -272,8 +200,7 @@ void Q3DCamera::copyValuesFrom(const Q3DObject &source)
/*!
* \property Q3DCamera::xRotation
*
- * This property contains the X-rotation angle of the camera around the target point in degrees
- * starting from the current base position set by the setBaseOrientation() method.
+ * This property contains the X-rotation angle of the camera around the target point in degrees.
*/
float Q3DCamera::xRotation() const {
return d_ptr->m_xRotation;
@@ -300,8 +227,7 @@ void Q3DCamera::setXRotation(float rotation)
/*!
* \property Q3DCamera::yRotation
*
- * This property contains the Y-rotation angle of the camera around the target point in degrees
- * starting from the current base position set by the setBaseOrientation() method.
+ * This property contains the Y-rotation angle of the camera around the target point in degrees.
*/
float Q3DCamera::yRotation() const {
return d_ptr->m_yRotation;
@@ -326,192 +252,10 @@ void Q3DCamera::setYRotation(float rotation)
}
/*!
- * \property Q3DCamera::minXRotation
- *
- * This property contains the current minimum X-rotation for the camera.
- * The full circle range is \c{[-180, 180]} and the minimum value is limited to \c -180.
- * Also the value can't be higher than the maximum, and is adjusted if necessary.
- *
- * \sa wrapXRotation, maxXRotation
- */
-float Q3DCamera::minXRotation() const
-{
- return d_ptr->m_minXRotation;
-}
-
-void Q3DCamera::setMinXRotation(float minRotation)
-{
- minRotation = qBound(-180.0f, minRotation, 180.0f);
- if (minRotation > d_ptr->m_maxXRotation)
- minRotation = d_ptr->m_maxXRotation;
-
- if (d_ptr->m_minXRotation != minRotation) {
- d_ptr->m_minXRotation = minRotation;
- emit minXRotationChanged(minRotation);
-
- if (d_ptr->m_xRotation < d_ptr->m_minXRotation)
- setXRotation(d_ptr->m_xRotation);
- }
-}
-
-/*!
- * \property Q3DCamera::minYRotation
- *
- * This property contains the current minimum Y-rotation for the camera.
- * The full Y angle range is \c{[-90, 90]} and the minimum value is limited to \c -90.
- * Also the value can't be higher than the maximum, and is adjusted if necessary.
- *
- * \sa wrapYRotation, maxYRotation
- */
-float Q3DCamera::minYRotation() const
-{
- return d_ptr->m_minYRotation;
-}
-
-void Q3DCamera::setMinYRotation(float minRotation)
-{
- minRotation = qBound(-90.0f, minRotation, 90.0f);
- if (minRotation > d_ptr->m_maxYRotation)
- minRotation = d_ptr->m_maxYRotation;
-
- if (d_ptr->m_minYRotation != minRotation) {
- d_ptr->m_minYRotation = minRotation;
- emit minYRotationChanged(minRotation);
-
- if (d_ptr->m_yRotation < d_ptr->m_minYRotation)
- setYRotation(d_ptr->m_yRotation);
- }
-}
-
-/*!
- * \property Q3DCamera::maxXRotation
- *
- * This property contains the current maximum X-rotation for the camera.
- * The full circle range is \c{[-180, 180]} and the maximum value is limited to \c 180.
- * Also the value can't be lower than the minimum, and is adjusted if necessary.
- *
- * \sa wrapXRotation, minXRotation
- */
-float Q3DCamera::maxXRotation() const
-{
- return d_ptr->m_maxXRotation;
-}
-
-void Q3DCamera::setMaxXRotation(float maxRotation)
-{
- maxRotation = qBound(-180.0f, maxRotation, 180.0f);
-
- if (maxRotation < d_ptr->m_minXRotation)
- maxRotation = d_ptr->m_minXRotation;
-
- if (d_ptr->m_maxXRotation != maxRotation) {
- d_ptr->m_maxXRotation = maxRotation;
- emit maxXRotationChanged(maxRotation);
-
- if (d_ptr->m_xRotation > d_ptr->m_maxXRotation)
- setXRotation(d_ptr->m_xRotation);
- }
-}
-
-/*!
- * \property Q3DCamera::maxYRotation
- *
- * This property contains the current maximum Y-rotation for the camera.
- * The full Y angle range is \c{[-90, 90]} and the maximum value is limited to \c 90.
- * Also the value can't be lower than the minimum, and is adjusted if necessary.
- *
- * \sa wrapYRotation, minYRotation
- */
-float Q3DCamera::maxYRotation() const
-{
- return d_ptr->m_maxYRotation;
-}
-
-void Q3DCamera::setMaxYRotation(float maxRotation)
-{
- maxRotation = qBound(-90.0f, maxRotation, 90.0f);
-
- if (maxRotation < d_ptr->m_minYRotation)
- maxRotation = d_ptr->m_minYRotation;
-
- if (d_ptr->m_maxYRotation != maxRotation) {
- d_ptr->m_maxYRotation = maxRotation;
- emit maxYRotationChanged(maxRotation);
-
- if (d_ptr->m_yRotation > d_ptr->m_maxYRotation)
- setYRotation(d_ptr->m_yRotation);
- }
-}
-
-/*!
- * Sets the base values for the camera that are used when calculating the camera position using the
- * rotation values. The base position of the camera is defined by \a basePosition, expectation is
- * that the x and y values are 0. Look at target point is defined by \a target and the camera
- * rotates around it. Up direction for the camera is defined by \a baseUp, normally this is a
- * vector with only y value set to 1.
- */
-void Q3DCamera::setBaseOrientation(const QVector3D &basePosition,
- const QVector3D &target,
- const QVector3D &baseUp)
-{
- if (position() != basePosition
- || d_ptr->m_target != target
- || d_ptr->m_up != baseUp) {
- setPosition(basePosition);
- d_ptr->m_target = target;
- d_ptr->m_up = baseUp;
- setDirty(true);
- }
-}
-
-/*!
- * \property Q3DCamera::viewMatrix
- *
- * This property contains the view matrix used in the 3D calculations. When the default orbiting
- * camera behavior is sufficient, there is no need to touch this property. If the default
- * behavior is insufficient, the view matrix can be set directly.
- * \note When setting the view matrix directly remember to set viewMatrixAutoUpdateEnabled to
- * \c false.
- */
-QMatrix4x4 Q3DCamera::viewMatrix() const
-{
- return d_ptr->m_viewMatrix;
-}
-
-void Q3DCamera::setViewMatrix(const QMatrix4x4 &viewMatrix)
-{
- if (d_ptr->m_viewMatrix != viewMatrix) {
- d_ptr->m_viewMatrix = viewMatrix;
- setDirty(true);
- emit viewMatrixChanged(d_ptr->m_viewMatrix);
- }
-}
-
-/*!
- * \property Q3DCamera::viewMatrixAutoUpdateEnabled
- *
- * This property determines if view matrix is automatically updated each render cycle using the
- * current base orientation and rotations. If set to \c false, no automatic recalculation is done
- * and the view matrix can be set using the viewMatrix property.
- */
-bool Q3DCamera::isViewMatrixAutoUpdateEnabled() const
-{
- return d_ptr->m_isViewMatrixUpdateActive;
-}
-
-void Q3DCamera::setViewMatrixAutoUpdateEnabled(bool isEnabled)
-{
- d_ptr->m_isViewMatrixUpdateActive = isEnabled;
- emit viewMatrixAutoUpdateChanged(isEnabled);
-}
-
-/*!
* \property Q3DCamera::cameraPreset
*
* This property contains the currently active camera preset, if no preset is active the value
* is CameraPresetNone.
- * \note The base camera orientation set by setBaseOrientation() will affect
- * the presets as all calculations are based on those values.
*/
Q3DCamera::CameraPreset Q3DCamera::cameraPreset() const
{
@@ -674,42 +418,6 @@ void Q3DCamera::setZoomLevel(int zoomLevel)
}
/*!
- * Calculates and returns a position relative to the camera using the given parameters
- * and the current camera viewMatrix property.
- * The relative 3D offset to the current camera position is defined in \a relativePosition.
- * An optional fixed rotation of the calculated point around the data visualization area can be
- * given in \a fixedRotation. The rotation is given in degrees.
- * An optional \a distanceModifier modifies the distance of the calculated point from the data
- * visualization.
- * \return calculated position relative to this camera's position.
- */
-QVector3D Q3DCamera::calculatePositionRelativeToCamera(const QVector3D &relativePosition,
- float fixedRotation,
- float distanceModifier) const
-{
- // Move the position with camera
- GLfloat radiusFactor = cameraDistance * (1.5f + distanceModifier);
- GLfloat xAngle;
- GLfloat yAngle;
- if (!fixedRotation) {
- xAngle = qDegreesToRadians(d_ptr->m_xRotation);
- yAngle = qDegreesToRadians(d_ptr->m_yRotation);
- } else {
- xAngle = qDegreesToRadians(fixedRotation);
- yAngle = 0;
- }
- GLfloat radius = (radiusFactor + relativePosition.y()); // set radius to match the highest height of the position
- GLfloat zPos = radius * qCos(xAngle) * qCos(yAngle);
- GLfloat xPos = radius * qSin(xAngle) * qCos(yAngle);
- GLfloat yPos = (radiusFactor + relativePosition.y()) * qSin(yAngle);
-
- // Keep in the set position in relation to camera
- return QVector3D(-xPos + relativePosition.x(),
- yPos + relativePosition.y(),
- zPos + relativePosition.z());
-}
-
-/*!
* \property Q3DCamera::wrapXRotation
*
* This property determines the behavior of the minimum and maximum limits in the X-rotation.
@@ -809,34 +517,120 @@ void Q3DCameraPrivate::setYRotation(const float rotation)
}
}
-void Q3DCameraPrivate::setMinXRotation(const float rotation)
+/*!
+ * \internal
+ * This property contains the current minimum X-rotation for the camera.
+ * The full circle range is \c{[-180, 180]} and the minimum value is limited to \c -180.
+ * Also the value can't be higher than the maximum, and is adjusted if necessary.
+ *
+ * \sa wrapXRotation, maxXRotation
+ */
+float Q3DCameraPrivate::minXRotation() const
+{
+ return m_minXRotation;
+}
+
+void Q3DCameraPrivate::setMinXRotation(float minRotation)
{
- if (m_minXRotation != rotation) {
- m_minXRotation = rotation;
+ minRotation = qBound(-180.0f, minRotation, 180.0f);
+ if (minRotation > m_maxXRotation)
+ minRotation = m_maxXRotation;
+
+ if (m_minXRotation != minRotation) {
+ m_minXRotation = minRotation;
+ emit minXRotationChanged(minRotation);
+
+ if (m_xRotation < m_minXRotation)
+ setXRotation(m_xRotation);
q_ptr->setDirty(true);
}
}
-void Q3DCameraPrivate::setMinYRotation(const float rotation)
+/*!
+ * \internal
+ * This property contains the current minimum Y-rotation for the camera.
+ * The full Y angle range is \c{[-90, 90]} and the minimum value is limited to \c -90.
+ * Also the value can't be higher than the maximum, and is adjusted if necessary.
+ *
+ * \sa wrapYRotation, maxYRotation
+ */
+float Q3DCameraPrivate::minYRotation() const
+{
+ return m_minYRotation;
+}
+
+void Q3DCameraPrivate::setMinYRotation(float minRotation)
{
- if (m_minYRotation != rotation) {
- m_minYRotation = rotation;
+ minRotation = qBound(-90.0f, minRotation, 90.0f);
+ if (minRotation > m_maxYRotation)
+ minRotation = m_maxYRotation;
+
+ if (m_minYRotation != minRotation) {
+ m_minYRotation = minRotation;
+ emit minYRotationChanged(minRotation);
+
+ if (m_yRotation < m_minYRotation)
+ setYRotation(m_yRotation);
q_ptr->setDirty(true);
}
}
-void Q3DCameraPrivate::setMaxXRotation(const float rotation)
+/*!
+ * \internal
+ * This property contains the current maximum X-rotation for the camera.
+ * The full circle range is \c{[-180, 180]} and the maximum value is limited to \c 180.
+ * Also the value can't be lower than the minimum, and is adjusted if necessary.
+ *
+ * \sa wrapXRotation, minXRotation
+ */
+float Q3DCameraPrivate::maxXRotation() const
{
- if (m_maxXRotation != rotation) {
- m_maxXRotation = rotation;
+ return m_maxXRotation;
+}
+
+void Q3DCameraPrivate::setMaxXRotation(float maxRotation)
+{
+ maxRotation = qBound(-180.0f, maxRotation, 180.0f);
+
+ if (maxRotation < m_minXRotation)
+ maxRotation = m_minXRotation;
+
+ if (m_maxXRotation != maxRotation) {
+ m_maxXRotation = maxRotation;
+ emit maxXRotationChanged(maxRotation);
+
+ if (m_xRotation > m_maxXRotation)
+ setXRotation(m_xRotation);
q_ptr->setDirty(true);
}
}
-void Q3DCameraPrivate::setMaxYRotation(const float rotation)
+/*!
+ * \internal
+ * This property contains the current maximum Y-rotation for the camera.
+ * The full Y angle range is \c{[-90, 90]} and the maximum value is limited to \c 90.
+ * Also the value can't be lower than the minimum, and is adjusted if necessary.
+ *
+ * \sa wrapYRotation, minYRotation
+ */
+float Q3DCameraPrivate::maxYRotation() const
+{
+ return m_maxYRotation;
+}
+
+void Q3DCameraPrivate::setMaxYRotation(float maxRotation)
{
- if (m_maxYRotation != rotation) {
- m_maxYRotation = rotation;
+ maxRotation = qBound(-90.0f, maxRotation, 90.0f);
+
+ if (maxRotation < m_minYRotation)
+ maxRotation = m_minYRotation;
+
+ if (m_maxYRotation != maxRotation) {
+ m_maxYRotation = maxRotation;
+ emit maxYRotationChanged(maxRotation);
+
+ if (m_yRotation > m_maxYRotation)
+ setYRotation(m_yRotation);
q_ptr->setDirty(true);
}
}
@@ -866,7 +660,103 @@ void Q3DCameraPrivate::updateViewMatrix(float zoomAdjustment)
// Compensate for translation (if d_ptr->m_target is off origin)
viewMatrix.translate(-m_target.x(), -m_target.y(), -m_target.z());
- q_ptr->setViewMatrix(viewMatrix);
+ setViewMatrix(viewMatrix);
+}
+
+/*!
+ * \internal
+ * This property contains the view matrix used in the 3D calculations. When the default orbiting
+ * camera behavior is sufficient, there is no need to touch this property. If the default
+ * behavior is insufficient, the view matrix can be set directly.
+ * \note When setting the view matrix directly remember to set viewMatrixAutoUpdateEnabled to
+ * \c false.
+ */
+QMatrix4x4 Q3DCameraPrivate::viewMatrix() const
+{
+ return m_viewMatrix;
+}
+
+void Q3DCameraPrivate::setViewMatrix(const QMatrix4x4 &viewMatrix)
+{
+ if (m_viewMatrix != viewMatrix) {
+ m_viewMatrix = viewMatrix;
+ q_ptr->setDirty(true);
+ emit viewMatrixChanged(m_viewMatrix);
+ }
+}
+
+/*!
+ * \internal
+ * This property determines if view matrix is automatically updated each render cycle using the
+ * current base orientation and rotations. If set to \c false, no automatic recalculation is done
+ * and the view matrix can be set using the viewMatrix property.
+ */
+bool Q3DCameraPrivate::isViewMatrixAutoUpdateEnabled() const
+{
+ return m_isViewMatrixUpdateActive;
+}
+
+void Q3DCameraPrivate::setViewMatrixAutoUpdateEnabled(bool isEnabled)
+{
+ m_isViewMatrixUpdateActive = isEnabled;
+ emit viewMatrixAutoUpdateChanged(isEnabled);
+}
+
+/*!
+ * \internal
+ * Sets the base values for the camera that are used when calculating the camera position using the
+ * rotation values. The base position of the camera is defined by \a basePosition, expectation is
+ * that the x and y values are 0. Look at target point is defined by \a target and the camera
+ * rotates around it. Up direction for the camera is defined by \a baseUp, normally this is a
+ * vector with only y value set to 1.
+ */
+void Q3DCameraPrivate::setBaseOrientation(const QVector3D &basePosition,
+ const QVector3D &target,
+ const QVector3D &baseUp)
+{
+ if (q_ptr->position() != basePosition || m_target != target || m_up != baseUp) {
+ q_ptr->setPosition(basePosition);
+ m_target = target;
+ m_up = baseUp;
+ q_ptr->setDirty(true);
+ }
+}
+
+/*!
+ * \internal
+ * Calculates and returns a position relative to the camera using the given parameters
+ * and the current camera viewMatrix property.
+ * The relative 3D offset to the current camera position is defined in \a relativePosition.
+ * An optional fixed rotation of the calculated point around the data visualization area can be
+ * given in \a fixedRotation. The rotation is given in degrees.
+ * An optional \a distanceModifier modifies the distance of the calculated point from the data
+ * visualization.
+ * \return calculated position relative to this camera's position.
+ */
+QVector3D Q3DCameraPrivate::calculatePositionRelativeToCamera(const QVector3D &relativePosition,
+ float fixedRotation,
+ float distanceModifier) const
+{
+ // Move the position with camera
+ GLfloat radiusFactor = cameraDistance * (1.5f + distanceModifier);
+ GLfloat xAngle;
+ GLfloat yAngle;
+ if (!fixedRotation) {
+ xAngle = qDegreesToRadians(m_xRotation);
+ yAngle = qDegreesToRadians(m_yRotation);
+ } else {
+ xAngle = qDegreesToRadians(fixedRotation);
+ yAngle = 0;
+ }
+ GLfloat radius = (radiusFactor + relativePosition.y()); // set radius to match the highest height of the position
+ GLfloat zPos = radius * qCos(xAngle) * qCos(yAngle);
+ GLfloat xPos = radius * qSin(xAngle) * qCos(yAngle);
+ GLfloat yPos = (radiusFactor + relativePosition.y()) * qSin(yAngle);
+
+ // Keep in the set position in relation to camera
+ return QVector3D(-xPos + relativePosition.x(),
+ yPos + relativePosition.y(),
+ zPos + relativePosition.z());
}
QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/engine/q3dcamera.h b/src/datavisualization/engine/q3dcamera.h
index 1a3a3284..87602e5c 100644
--- a/src/datavisualization/engine/q3dcamera.h
+++ b/src/datavisualization/engine/q3dcamera.h
@@ -20,10 +20,6 @@
#define Q3DCAMERA_H
#include <QtDataVisualization/q3dobject.h>
-#include <QMatrix4x4>
-
-class QVector3D;
-class QPoint;
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -35,14 +31,8 @@ class QT_DATAVISUALIZATION_EXPORT Q3DCamera : public Q3DObject
Q_ENUMS(CameraPreset)
Q_PROPERTY(float xRotation READ xRotation WRITE setXRotation NOTIFY xRotationChanged)
Q_PROPERTY(float yRotation READ yRotation WRITE setYRotation NOTIFY yRotationChanged)
- Q_PROPERTY(float minXRotation READ minXRotation NOTIFY minXRotationChanged)
- Q_PROPERTY(float minYRotation READ minYRotation NOTIFY minYRotationChanged)
- Q_PROPERTY(float maxXRotation READ maxXRotation NOTIFY maxXRotationChanged)
- Q_PROPERTY(float maxYRotation READ maxYRotation NOTIFY maxYRotationChanged)
Q_PROPERTY(int zoomLevel READ zoomLevel WRITE setZoomLevel NOTIFY zoomLevelChanged)
- Q_PROPERTY(QMatrix4x4 viewMatrix READ viewMatrix WRITE setViewMatrix NOTIFY viewMatrixChanged)
Q_PROPERTY(CameraPreset cameraPreset READ cameraPreset WRITE setCameraPreset NOTIFY cameraPresetChanged)
- Q_PROPERTY(bool viewMatrixAutoUpdateEnabled READ isViewMatrixAutoUpdateEnabled WRITE setViewMatrixAutoUpdateEnabled NOTIFY viewMatrixAutoUpdateChanged)
Q_PROPERTY(bool wrapXRotation READ wrapXRotation WRITE setWrapXRotation NOTIFY wrapXRotationChanged)
Q_PROPERTY(bool wrapYRotation READ wrapYRotation WRITE setWrapYRotation NOTIFY wrapYRotationChanged)
@@ -75,7 +65,6 @@ public:
CameraPresetDirectlyBelow
};
-public:
Q3DCamera(QObject *parent = 0);
virtual ~Q3DCamera();
@@ -84,12 +73,6 @@ public:
float yRotation() const;
void setYRotation(float rotation);
- float minXRotation() const;
- float maxXRotation() const;
-
- float minYRotation() const;
- float maxYRotation() const;
-
bool wrapXRotation() const;
void setWrapXRotation(bool isEnabled);
@@ -98,48 +81,23 @@ public:
virtual void copyValuesFrom(const Q3DObject &source);
- QMatrix4x4 viewMatrix() const;
- void setViewMatrix(const QMatrix4x4 &viewMatrix);
-
- bool isViewMatrixAutoUpdateEnabled() const;
- void setViewMatrixAutoUpdateEnabled(bool isEnabled);
-
CameraPreset cameraPreset() const;
void setCameraPreset(CameraPreset preset);
int zoomLevel() const;
void setZoomLevel(int zoomLevel);
- Q_INVOKABLE void setBaseOrientation(const QVector3D &defaultPosition,
- const QVector3D &defaultTarget,
- const QVector3D &defaultUp);
-
- QVector3D calculatePositionRelativeToCamera(const QVector3D &relativePosition,
- float fixedRotation,
- float distanceModifier) const;
void setCameraPosition(float horizontal, float vertical, float distance = 100.0f);
signals:
void xRotationChanged(float rotation);
void yRotationChanged(float rotation);
- void minXRotationChanged(float rotation);
- void minYRotationChanged(float rotation);
- void maxXRotationChanged(float rotation);
- void maxYRotationChanged(float rotation);
void zoomLevelChanged(int zoomLevel);
- void viewMatrixChanged(QMatrix4x4 viewMatrix);
void cameraPresetChanged(CameraPreset preset);
- void viewMatrixAutoUpdateChanged(bool enabled);
void wrapXRotationChanged(bool isEnabled);
void wrapYRotationChanged(bool isEnabled);
private:
- void setMinXRotation(float rotation);
- void setMinYRotation(float rotation);
- void setMaxXRotation(float rotation);
- void setMaxYRotation(float rotation);
-
-private:
QScopedPointer<Q3DCameraPrivate> d_ptr;
Q_DISABLE_COPY(Q3DCamera)
@@ -153,7 +111,6 @@ private:
friend class SelectionPointer;
friend class Q3DInputHandler;
friend class QTouch3DInputHandlerPrivate;
- friend class QMac3DInputHandler;
};
QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/engine/q3dcamera_p.h b/src/datavisualization/engine/q3dcamera_p.h
index b55010c8..884229e3 100644
--- a/src/datavisualization/engine/q3dcamera_p.h
+++ b/src/datavisualization/engine/q3dcamera_p.h
@@ -31,13 +31,15 @@
#include "datavisualizationglobal_p.h"
#include "q3dcamera.h"
+#include <QtGui/QMatrix4x4>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
class Q3DCamera;
-class Q3DCameraPrivate
+class Q3DCameraPrivate : public QObject
{
+ Q_OBJECT
public:
Q3DCameraPrivate(Q3DCamera *q);
~Q3DCameraPrivate();
@@ -47,12 +49,38 @@ public:
void setXRotation(float rotation);
void setYRotation(float rotation);
void setMinXRotation(float rotation);
+ float minXRotation() const;
void setMinYRotation(float rotation);
+ float minYRotation() const;
void setMaxXRotation(float rotation);
+ float maxXRotation() const;
void setMaxYRotation(float rotation);
+ float maxYRotation() const;
void updateViewMatrix(float zoomAdjustment);
+ QMatrix4x4 viewMatrix() const;
+ void setViewMatrix(const QMatrix4x4 &viewMatrix);
+
+ bool isViewMatrixAutoUpdateEnabled() const;
+ void setViewMatrixAutoUpdateEnabled(bool isEnabled);
+
+ void setBaseOrientation(const QVector3D &defaultPosition,
+ const QVector3D &defaultTarget,
+ const QVector3D &defaultUp);
+
+ QVector3D calculatePositionRelativeToCamera(const QVector3D &relativePosition,
+ float fixedRotation,
+ float distanceModifier) const;
+
+signals:
+ void minXRotationChanged(float rotation);
+ void minYRotationChanged(float rotation);
+ void maxXRotationChanged(float rotation);
+ void maxYRotationChanged(float rotation);
+ void viewMatrixChanged(QMatrix4x4 viewMatrix);
+ void viewMatrixAutoUpdateChanged(bool enabled);
+
public:
Q3DCamera *q_ptr;
@@ -79,7 +107,6 @@ public:
friend class SelectionPointer;
friend class Q3DInputHandler;
friend class QTouch3DInputHandler;
- friend class QMac3DInputHandler;
};
QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/engine/q3dlight.h b/src/datavisualization/engine/q3dlight.h
index 876601a7..6d51b90f 100644
--- a/src/datavisualization/engine/q3dlight.h
+++ b/src/datavisualization/engine/q3dlight.h
@@ -24,7 +24,6 @@
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
class Q3DLightPrivate;
-class Q3DScene;
class QT_DATAVISUALIZATION_EXPORT Q3DLight : public Q3DObject
{
diff --git a/src/datavisualization/engine/q3dobject.h b/src/datavisualization/engine/q3dobject.h
index 07506f63..4ea505bb 100644
--- a/src/datavisualization/engine/q3dobject.h
+++ b/src/datavisualization/engine/q3dobject.h
@@ -19,14 +19,14 @@
#ifndef Q3DOBJECT_H
#define Q3DOBJECT_H
-#include <QtDataVisualization/q3dscene.h>
-
-#include <QObject>
-#include <QVector3D>
+#include <QtDataVisualization/qdatavisualizationglobal.h>
+#include <QtCore/QObject>
+#include <QtGui/QVector3D>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
class Q3DObjectPrivate;
+class Q3DScene;
class QT_DATAVISUALIZATION_EXPORT Q3DObject : public QObject
{
@@ -46,7 +46,7 @@ public:
void setPosition(const QVector3D &position);
signals:
- void positionChanged(QVector3D position);
+ void positionChanged(const QVector3D &position);
protected:
void setDirty(bool dirty);
diff --git a/src/datavisualization/engine/q3dscatter.cpp b/src/datavisualization/engine/q3dscatter.cpp
index db7d2491..7c7809f3 100644
--- a/src/datavisualization/engine/q3dscatter.cpp
+++ b/src/datavisualization/engine/q3dscatter.cpp
@@ -87,6 +87,8 @@ Q3DScatter::Q3DScatter(const QSurfaceFormat *format, QWindow *parent)
dptr()->m_shared = new Scatter3DController(geometry());
d_ptr->setVisualController(dptr()->m_shared);
dptr()->m_shared->initializeOpenGL();
+ QObject::connect(dptr()->m_shared, &Scatter3DController::selectedSeriesChanged,
+ this, &Q3DScatter::selectedSeriesChanged);
}
/*!
@@ -202,6 +204,16 @@ QValue3DAxis *Q3DScatter::axisZ() const
}
/*!
+ * \property Q3DScatter::selectedSeries
+ *
+ * The selected series or \c null.
+ */
+QScatter3DSeries *Q3DScatter::selectedSeries() const
+{
+ return dptrc()->m_shared->selectedSeries();
+}
+
+/*!
* Adds \a axis to the graph. The axes added via addAxis are not yet taken to use,
* addAxis is simply used to give the ownership of the \a axis to the graph.
* The \a axis must not be null or added to another graph.
diff --git a/src/datavisualization/engine/q3dscatter.h b/src/datavisualization/engine/q3dscatter.h
index 55158537..016431af 100644
--- a/src/datavisualization/engine/q3dscatter.h
+++ b/src/datavisualization/engine/q3dscatter.h
@@ -20,16 +20,12 @@
#define Q3DSCATTER_H
#include <QtDataVisualization/qabstract3dgraph.h>
-#include <QtDataVisualization/q3dscene.h>
-#include <QFont>
-#include <QLinearGradient>
+#include <QtDataVisualization/qvalue3daxis.h>
+#include <QtDataVisualization/qscatter3dseries.h>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
class Q3DScatterPrivate;
-class QValue3DAxis;
-class QCategory3DAxis;
-class QScatter3DSeries;
class QT_DATAVISUALIZATION_EXPORT Q3DScatter : public QAbstract3DGraph
{
@@ -37,6 +33,7 @@ class QT_DATAVISUALIZATION_EXPORT Q3DScatter : public QAbstract3DGraph
Q_PROPERTY(QValue3DAxis *axisX READ axisX WRITE setAxisX NOTIFY axisXChanged)
Q_PROPERTY(QValue3DAxis *axisY READ axisY WRITE setAxisY NOTIFY axisYChanged)
Q_PROPERTY(QValue3DAxis *axisZ READ axisZ WRITE setAxisZ NOTIFY axisZChanged)
+ Q_PROPERTY(QScatter3DSeries *selectedSeries READ selectedSeries NOTIFY selectedSeriesChanged)
public:
explicit Q3DScatter(const QSurfaceFormat *format = 0, QWindow *parent = 0);
@@ -56,10 +53,13 @@ public:
void releaseAxis(QValue3DAxis *axis);
QList<QValue3DAxis *> axes() const;
+ QScatter3DSeries *selectedSeries() const;
+
signals:
void axisXChanged(QValue3DAxis *axis);
void axisYChanged(QValue3DAxis *axis);
void axisZChanged(QValue3DAxis *axis);
+ void selectedSeriesChanged(QScatter3DSeries *series);
private:
Q3DScatterPrivate *dptr();
diff --git a/src/datavisualization/engine/q3dscene.cpp b/src/datavisualization/engine/q3dscene.cpp
index 6ee4e275..be64b928 100644
--- a/src/datavisualization/engine/q3dscene.cpp
+++ b/src/datavisualization/engine/q3dscene.cpp
@@ -16,8 +16,6 @@
**
****************************************************************************/
-#include <qmath.h>
-
#include "datavisualizationglobal_p.h"
#include "q3dscene.h"
@@ -25,6 +23,8 @@
#include "q3dcamera_p.h"
#include "q3dlight_p.h"
+#include <QtCore/qmath.h>
+
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
/*!
@@ -438,23 +438,6 @@ void Q3DScene::setDevicePixelRatio(float pixelRatio)
}
}
-/*!
- * Calculates and sets the light position relative to the currently active camera using the given
- * parameters.
- * The relative 3D offset to the current camera position is defined in \a relativePosition.
- * Optional \a fixedRotation fixes the light rotation around the data visualization area to the
- * given value in degrees.
- * Optional \a distanceModifier modifies the distance of the light from the data visualization.
- */
-void Q3DScene::setLightPositionRelativeToCamera(const QVector3D &relativePosition,
- float fixedRotation, float distanceModifier)
-{
- d_ptr->m_light->setPosition(
- d_ptr->m_camera->calculatePositionRelativeToCamera(relativePosition,
- fixedRotation,
- distanceModifier));
-}
-
Q3DScenePrivate::Q3DScenePrivate(Q3DScene *q) :
QObject(0),
q_ptr(q),
@@ -650,4 +633,21 @@ QRect Q3DScenePrivate::glSecondarySubViewport()
return m_glSecondarySubViewport;
}
+/*!
+ * \internal
+ * Calculates and sets the light position relative to the currently active camera using the given
+ * parameters.
+ * The relative 3D offset to the current camera position is defined in \a relativePosition.
+ * Optional \a fixedRotation fixes the light rotation around the data visualization area to the
+ * given value in degrees.
+ * Optional \a distanceModifier modifies the distance of the light from the data visualization.
+ */
+void Q3DScenePrivate::setLightPositionRelativeToCamera(const QVector3D &relativePosition,
+ float fixedRotation, float distanceModifier)
+{
+ m_light->setPosition(m_camera->d_ptr->calculatePositionRelativeToCamera(relativePosition,
+ fixedRotation,
+ distanceModifier));
+}
+
QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/engine/q3dscene.h b/src/datavisualization/engine/q3dscene.h
index 61a18c9d..d663744e 100644
--- a/src/datavisualization/engine/q3dscene.h
+++ b/src/datavisualization/engine/q3dscene.h
@@ -20,15 +20,13 @@
#define Q3DSCENE_H
#include <QtDataVisualization/qdatavisualizationglobal.h>
-
-#include <QObject>
-#include <QRect>
+#include <QtDataVisualization/q3dcamera.h>
+#include <QtDataVisualization/q3dlight.h>
+#include <QtCore/QObject>
+#include <QtCore/QRect>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
-class Q3DCamera;
-class Q3DBox;
-class Q3DLight;
class Q3DScenePrivate;
class QT_DATAVISUALIZATION_EXPORT Q3DScene : public QObject
@@ -46,7 +44,7 @@ class QT_DATAVISUALIZATION_EXPORT Q3DScene : public QObject
public:
Q3DScene(QObject *parent = 0);
- ~Q3DScene();
+ virtual ~Q3DScene();
QRect viewport() const;
@@ -77,19 +75,16 @@ public:
float devicePixelRatio() const;
void setDevicePixelRatio(float pixelRatio);
- Q_INVOKABLE void setLightPositionRelativeToCamera(const QVector3D &relativePosition,
- float fixedRotation = 0.0f,
- float distanceModifier = 0.0f);
signals:
- void viewportChanged(QRect viewport);
- void primarySubViewportChanged(QRect subViewport);
- void secondarySubViewportChanged(QRect subViewport);
+ void viewportChanged(const QRect &viewport);
+ void primarySubViewportChanged(const QRect &subViewport);
+ void secondarySubViewportChanged(const QRect &subViewport);
void secondarySubviewOnTopChanged(bool isSecondaryOnTop);
void slicingActiveChanged(bool isSlicingActive);
- void activeCameraChanged(const Q3DCamera *camera);
- void activeLightChanged(const Q3DLight *light);
+ void activeCameraChanged(Q3DCamera *camera);
+ void activeLightChanged(Q3DLight *light);
void devicePixelRatioChanged(float pixelRatio);
- void selectionQueryPositionChanged(const QPoint position);
+ void selectionQueryPositionChanged(const QPoint &position);
private:
QScopedPointer<Q3DScenePrivate> d_ptr;
diff --git a/src/datavisualization/engine/q3dscene_p.h b/src/datavisualization/engine/q3dscene_p.h
index be0d3dc5..bc6a7223 100644
--- a/src/datavisualization/engine/q3dscene_p.h
+++ b/src/datavisualization/engine/q3dscene_p.h
@@ -30,7 +30,7 @@
#define Q3DSCENE_P_H
#include "datavisualizationglobal_p.h"
-#include <QRect>
+#include "q3dscene.h"
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -86,6 +86,10 @@ public:
QRect glPrimarySubViewport();
QRect glSecondarySubViewport();
+ void setLightPositionRelativeToCamera(const QVector3D &relativePosition,
+ float fixedRotation = 0.0f,
+ float distanceModifier = 0.0f);
+
signals:
void needRender();
diff --git a/src/datavisualization/engine/q3dsurface.cpp b/src/datavisualization/engine/q3dsurface.cpp
index a8a8235e..7724cb24 100644
--- a/src/datavisualization/engine/q3dsurface.cpp
+++ b/src/datavisualization/engine/q3dsurface.cpp
@@ -32,8 +32,8 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION
* \since Qt Data Visualization 1.0
*
* This class enables developers to render 3D surface plots and to view them by rotating the scene
- * freely. The surface plotting includes also gridline that can be set on or off.
- * The visual appearance of the surface can be changed by controlling the smooth status.
+ * freely. The visual properties of the surface such as draw mode and shading can be controlled
+ * via QSurface3DSeries.
*
* The Q3DSurface supports selection by showing a highlighted ball on the data point where the user has clicked
* with left mouse button (when default input handler is in use) or selected via QSurface3DSeries.
@@ -49,8 +49,6 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION
* These default axes can be modified via axis accessors, but as soon any axis is set explicitly
* for the orientation, the default axis for that orientation is destroyed.
*
- * Q3DSurface supports only single series at a time.
- *
* \section1 How to construct a minimal Q3DSurface graph
*
* First, construct Q3DSurface. Since we are running the graph as top level window
@@ -100,6 +98,8 @@ Q3DSurface::Q3DSurface(const QSurfaceFormat *format, QWindow *parent)
dptr()->m_shared = new Surface3DController(geometry());
d_ptr->setVisualController(dptr()->m_shared);
dptr()->m_shared->initializeOpenGL();
+ QObject::connect(dptr()->m_shared, &Surface3DController::selectedSeriesChanged,
+ this, &Q3DSurface::selectedSeriesChanged);
}
/*!
@@ -111,8 +111,6 @@ Q3DSurface::~Q3DSurface()
/*!
* Adds the \a series to the graph.
- *
- * \note The surface graph currently supports only a single series at a time.
*/
void Q3DSurface::addSeries(QSurface3DSeries *series)
{
@@ -129,8 +127,6 @@ void Q3DSurface::removeSeries(QSurface3DSeries *series)
/*!
* \return list of series added to this graph.
- *
- * \note The surface graph currently supports only a single series at a time.
*/
QList<QSurface3DSeries *> Q3DSurface::seriesList() const
{
@@ -223,6 +219,17 @@ QValue3DAxis *Q3DSurface::axisZ() const
}
/*!
+ * \property Q3DSurface::selectedSeries
+ *
+ * The selected series or \c null. If selectionMode has \c SelectionMultiSeries flag set, this
+ * property holds the series which owns the selected point.
+ */
+QSurface3DSeries *Q3DSurface::selectedSeries() const
+{
+ return dptrc()->m_shared->selectedSeries();
+}
+
+/*!
* Adds \a axis to the graph. The axes added via addAxis are not yet taken to use,
* addAxis is simply used to give the ownership of the \a axis to the graph.
* The \a axis must not be null or added to another graph.
diff --git a/src/datavisualization/engine/q3dsurface.h b/src/datavisualization/engine/q3dsurface.h
index 7fb6e58a..9868c844 100644
--- a/src/datavisualization/engine/q3dsurface.h
+++ b/src/datavisualization/engine/q3dsurface.h
@@ -20,14 +20,12 @@
#define Q3DSURFACE_H
#include <QtDataVisualization/qabstract3dgraph.h>
-#include <QtDataVisualization/q3dscene.h>
-#include <QFont>
+#include <QtDataVisualization/qvalue3daxis.h>
+#include <QtDataVisualization/qsurface3dseries.h>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
class Q3DSurfacePrivate;
-class QValue3DAxis;
-class QSurface3DSeries;
class QT_DATAVISUALIZATION_EXPORT Q3DSurface : public QAbstract3DGraph
{
@@ -35,6 +33,7 @@ class QT_DATAVISUALIZATION_EXPORT Q3DSurface : public QAbstract3DGraph
Q_PROPERTY(QValue3DAxis *axisX READ axisX WRITE setAxisX NOTIFY axisXChanged)
Q_PROPERTY(QValue3DAxis *axisY READ axisY WRITE setAxisY NOTIFY axisYChanged)
Q_PROPERTY(QValue3DAxis *axisZ READ axisZ WRITE setAxisZ NOTIFY axisZChanged)
+ Q_PROPERTY(QSurface3DSeries *selectedSeries READ selectedSeries NOTIFY selectedSeriesChanged)
public:
explicit Q3DSurface(const QSurfaceFormat *format = 0, QWindow *parent = 0);
@@ -55,10 +54,13 @@ public:
void releaseAxis(QValue3DAxis *axis);
QList<QValue3DAxis *> axes() const;
+ QSurface3DSeries *selectedSeries() const;
+
signals:
void axisXChanged(QValue3DAxis *axis);
void axisYChanged(QValue3DAxis *axis);
void axisZChanged(QValue3DAxis *axis);
+ void selectedSeriesChanged(QSurface3DSeries *series);
private:
Q3DSurfacePrivate *dptr();
diff --git a/src/datavisualization/engine/q3dsurface_p.h b/src/datavisualization/engine/q3dsurface_p.h
index 540956b6..0e5a5121 100644
--- a/src/datavisualization/engine/q3dsurface_p.h
+++ b/src/datavisualization/engine/q3dsurface_p.h
@@ -32,8 +32,6 @@
#include "surface3dcontroller_p.h"
#include "qabstract3dgraph_p.h"
-#include <QList>
-
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
class Q3DSurface;
diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp
index d8146149..f2102b29 100644
--- a/src/datavisualization/engine/qabstract3dgraph.cpp
+++ b/src/datavisualization/engine/qabstract3dgraph.cpp
@@ -23,11 +23,10 @@
#include "q3dscene_p.h"
#include "qutils.h"
-#include <QGuiApplication>
-#include <QOpenGLContext>
-#include <QOpenGLPaintDevice>
-#include <QPainter>
-
+#include <QtGui/QGuiApplication>
+#include <QtGui/QOpenGLContext>
+#include <QtGui/QOpenGLPaintDevice>
+#include <QtGui/QPainter>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -85,10 +84,16 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION
automatically. If you wish to control the slice view yourself via Q3DScene, do not set this
flag. When setting this mode flag, either \c SelectionRow or \c SelectionColumn must also
be set, but not both. Slicing is supported by Q3DBars and Q3DSurface only.
+ When this flag is set, slice mode is entered in the following situations:
+ \list
+ \li When selection is changed explicitly via series API to a visible item
+ \li When selection is changed by clicking on the graph
+ \li When the selection mode changes and the selected item is visible
+ \endlist
\value SelectionMultiSeries
Setting this mode means that items for all series at same position are highlighted, instead
of just the selected item. The actual selection in the other series doesn't change.
- Multi-series selection is only supported for Q3DBars.
+ Multi-series selection is not supported for Q3DScatter.
*/
/*!
@@ -216,7 +221,7 @@ void QAbstract3DGraph::setActiveInputHandler(QAbstract3DInputHandler *inputHandl
d_ptr->m_visualController->setActiveInputHandler(inputHandler);
}
-QAbstract3DInputHandler *QAbstract3DGraph::activeInputHandler()
+QAbstract3DInputHandler *QAbstract3DGraph::activeInputHandler() const
{
return d_ptr->m_visualController->activeInputHandler();
}
diff --git a/src/datavisualization/engine/qabstract3dgraph.h b/src/datavisualization/engine/qabstract3dgraph.h
index 9534ce5c..adf67912 100644
--- a/src/datavisualization/engine/qabstract3dgraph.h
+++ b/src/datavisualization/engine/qabstract3dgraph.h
@@ -20,18 +20,15 @@
#define QABSTRACT3DGRAPH_H
#include <QtDataVisualization/qdatavisualizationglobal.h>
-
-#include <QWindow>
-#include <QOpenGLFunctions>
-#include <QScreen>
+#include <QtDataVisualization/q3dtheme.h>
+#include <QtDataVisualization/q3dscene.h>
+#include <QtDataVisualization/qabstract3dinputhandler.h>
+#include <QtGui/QWindow>
+#include <QtGui/QOpenGLFunctions>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
class QAbstract3DGraphPrivate;
-class Abstract3DController;
-class QAbstract3DInputHandler;
-class Q3DTheme;
-class Q3DScene;
class QT_DATAVISUALIZATION_EXPORT QAbstract3DGraph : public QWindow, protected QOpenGLFunctions
{
@@ -78,7 +75,7 @@ public:
void addInputHandler(QAbstract3DInputHandler *inputHandler);
void releaseInputHandler(QAbstract3DInputHandler *inputHandler);
void setActiveInputHandler(QAbstract3DInputHandler *inputHandler);
- QAbstract3DInputHandler *activeInputHandler();
+ QAbstract3DInputHandler *activeInputHandler() const;
QList<QAbstract3DInputHandler *> inputHandlers() const;
void addTheme(Q3DTheme *theme);
@@ -117,6 +114,7 @@ signals:
void shadowQualityChanged(ShadowQuality quality);
private:
+ Q_DISABLE_COPY(QAbstract3DGraph)
QScopedPointer<QAbstract3DGraphPrivate> d_ptr;
friend class Q3DBars;
diff --git a/src/datavisualization/engine/qabstract3dgraph_p.h b/src/datavisualization/engine/qabstract3dgraph_p.h
index a353797b..d28495ab 100644
--- a/src/datavisualization/engine/qabstract3dgraph_p.h
+++ b/src/datavisualization/engine/qabstract3dgraph_p.h
@@ -31,8 +31,6 @@
#include "datavisualizationglobal_p.h"
-#include <QObject>
-
class QOpenGLContext;
class QOpenGLPaintDevice;
diff --git a/src/datavisualization/engine/scatter3dcontroller.cpp b/src/datavisualization/engine/scatter3dcontroller.cpp
index a1850a3c..54292ac0 100644
--- a/src/datavisualization/engine/scatter3dcontroller.cpp
+++ b/src/datavisualization/engine/scatter3dcontroller.cpp
@@ -24,8 +24,8 @@
#include "qscatterdataproxy_p.h"
#include "qscatter3dseries_p.h"
-#include <QMatrix4x4>
-#include <qmath.h>
+#include <QtGui/QMatrix4x4>
+#include <QtCore/qmath.h>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -303,6 +303,7 @@ void Scatter3DController::setSelectedItem(int index, QScatter3DSeries *series)
index = invalidSelectionIndex();
if (index != m_selectedItem || series != m_selectedItemSeries) {
+ bool seriesChanged = (series != m_selectedItemSeries);
m_selectedItem = index;
m_selectedItemSeries = series;
m_changeTracker.selectedItemChanged = true;
@@ -316,6 +317,9 @@ void Scatter3DController::setSelectedItem(int index, QScatter3DSeries *series)
if (m_selectedItemSeries)
m_selectedItemSeries->dptr()->setSelectedItem(m_selectedItem);
+ if (seriesChanged)
+ emit selectedSeriesChanged(m_selectedItemSeries);
+
emitNeedRender();
}
}
diff --git a/src/datavisualization/engine/scatter3dcontroller_p.h b/src/datavisualization/engine/scatter3dcontroller_p.h
index 173d4e05..53d24549 100644
--- a/src/datavisualization/engine/scatter3dcontroller_p.h
+++ b/src/datavisualization/engine/scatter3dcontroller_p.h
@@ -93,6 +93,8 @@ public:
// Change selection mode
void setSelectionMode(QAbstract3DGraph::SelectionFlags mode);
+ inline QScatter3DSeries *selectedSeries() const { return m_selectedItemSeries; }
+
void setSelectedItem(int index, QScatter3DSeries *series);
static inline int invalidSelectionIndex() { return -1; }
virtual void clearSelection();
@@ -116,6 +118,9 @@ public slots:
void handleItemsRemoved(int startIndex, int count);
void handleItemsInserted(int startIndex, int count);
+signals:
+ void selectedSeriesChanged(QScatter3DSeries *series);
+
protected:
virtual void startRecordingRemovesAndInserts();
diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp
index cf9dbefe..de1a769a 100644
--- a/src/datavisualization/engine/scatter3drenderer.cpp
+++ b/src/datavisualization/engine/scatter3drenderer.cpp
@@ -27,11 +27,10 @@
#include "q3dlight.h"
#include "qscatter3dseries_p.h"
-#include <QMatrix4x4>
-#include <QMouseEvent>
-#include <QThread>
-#include <qmath.h>
-#include <QDebug>
+#include <QtGui/QMatrix4x4>
+#include <QtGui/QMouseEvent>
+#include <QtCore/QThread>
+#include <QtCore/qmath.h>
// Commenting this draws the shadow map with perspective projection. Otherwise it's drawn in
// orthographic projection.
@@ -210,7 +209,10 @@ void Scatter3DRenderer::updateData()
&& (dotPos.z() >= minZ && dotPos.z() <= maxZ)) {
renderItem.setPosition(dotPos);
renderItem.setVisible(true);
- renderItem.setRotation(dataArray.at(i).rotation());
+ if (!dataArray.at(i).rotation().isIdentity())
+ renderItem.setRotation(dataArray.at(i).rotation().normalized());
+ else
+ renderItem.setRotation(identityQuaternion);
calculateTranslation(renderItem);
} else {
renderItem.setVisible(false);
@@ -225,11 +227,11 @@ void Scatter3DRenderer::updateData()
void Scatter3DRenderer::updateScene(Q3DScene *scene)
{
- scene->activeCamera()->setMinYRotation(-90.0f);
+ scene->activeCamera()->d_ptr->setMinYRotation(-90.0f);
if (m_hasHeightAdjustmentChanged) {
// Set initial camera position. Also update if height adjustment has changed.
- scene->activeCamera()->setBaseOrientation(cameraDistanceVector, zeroVector, upVector);
+ scene->activeCamera()->d_ptr->setBaseOrientation(cameraDistanceVector, zeroVector, upVector);
m_hasHeightAdjustmentChanged = false;
}
@@ -273,7 +275,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
projectionMatrix.perspective(45.0f, viewPortRatio, 0.1f, 100.0f);
// Calculate view matrix
- QMatrix4x4 viewMatrix = activeCamera->viewMatrix();
+ QMatrix4x4 viewMatrix = activeCamera->d_ptr->viewMatrix();
QMatrix4x4 projectionViewMatrix = projectionMatrix * viewMatrix;
int seriesCount = m_visibleSeriesList.size();
@@ -354,7 +356,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
// Get the depth view matrix
// It may be possible to hack lightPos here if we want to make some tweaks to shadow
- QVector3D depthLightPos = activeCamera->calculatePositionRelativeToCamera(
+ QVector3D depthLightPos = activeCamera->d_ptr->calculatePositionRelativeToCamera(
zeroVector, 0.0f, 2.5f / m_autoScaleAdjustment);
depthViewMatrix.lookAt(depthLightPos, zeroVector, upVector);
// Set the depth projection matrix
@@ -444,6 +446,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
ShaderHelper *pointSelectionShader = m_selectionShader;
#else
+ Q_UNUSED(havePointSeries);
ShaderHelper *pointSelectionShader = m_pointShader;
#endif
ShaderHelper *selectionShader = m_selectionShader;
@@ -714,7 +717,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
dotShader->setUniformValue(dotShader->color(), dotColor);
} else if (colorStyle == Q3DTheme::ColorStyleRangeGradient) {
dotShader->setUniformValue(dotShader->gradientMin(),
- (item.position().y() + 1.0f) / 2.0f);
+ (item.translation().y() + 1.0f) / 2.0f);
}
#if !defined(QT_OPENGL_ES_2)
if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) {
@@ -1457,10 +1460,10 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
} else {
glDisable(GL_DEPTH_TEST);
// Draw the selection label
- LabelItem &labelItem = selectedItem->selectionLabelItem();
+ LabelItem &labelItem = selectionLabelItem();
if (m_selectedItem != selectedItem || m_updateLabels
|| !labelItem.textureId() || m_selectionLabelDirty) {
- QString labelText = selectedItem->selectionLabel();
+ QString labelText = selectionLabel();
if (labelText.isNull() || m_selectionLabelDirty) {
static const QString xTitleTag(QStringLiteral("@xTitle"));
static const QString yTitleTag(QStringLiteral("@yTitle"));
@@ -1502,7 +1505,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
}
labelText.replace(seriesNameTag, m_visibleSeriesList[m_selectedItemSeriesIndex].name());
- selectedItem->setSelectionLabel(labelText);
+ setSelectionLabel(labelText);
m_selectionLabelDirty = false;
}
m_drawer->generateLabelItem(labelItem, labelText);
@@ -1531,6 +1534,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
void Scatter3DRenderer::updateSelectedItem(int index, const QScatter3DSeries *series)
{
m_selectionDirty = true;
+ m_selectionLabelDirty = true;
m_selectedSeries = series;
m_selectedItemIndex = Scatter3DController::invalidSelectionIndex();
m_selectedItemTotalIndex = Scatter3DController::invalidSelectionIndex();
@@ -1633,12 +1637,6 @@ void Scatter3DRenderer::fixMeshFileName(QString &fileName, QAbstract3DSeries::Me
}
}
-void Scatter3DRenderer::updateAxisRange(QAbstract3DAxis::AxisOrientation orientation,
- float min, float max)
-{
- Abstract3DRenderer::updateAxisRange(orientation, min, max);
-}
-
void Scatter3DRenderer::calculateTranslation(ScatterRenderItem &item)
{
// We need to normalize translations
diff --git a/src/datavisualization/engine/scatter3drenderer_p.h b/src/datavisualization/engine/scatter3drenderer_p.h
index d7a880f9..5591a362 100644
--- a/src/datavisualization/engine/scatter3drenderer_p.h
+++ b/src/datavisualization/engine/scatter3drenderer_p.h
@@ -141,10 +141,6 @@ private:
friend class ScatterRenderItem;
public slots:
- // Overloaded from abstract renderer
- virtual void updateAxisRange(QAbstract3DAxis::AxisOrientation orientation, float min,
- float max);
-
void updateSelectedItem(int index, const QScatter3DSeries *series);
private:
diff --git a/src/datavisualization/engine/selectionpointer.cpp b/src/datavisualization/engine/selectionpointer.cpp
index 4f5e2114..d4e635bc 100644
--- a/src/datavisualization/engine/selectionpointer.cpp
+++ b/src/datavisualization/engine/selectionpointer.cpp
@@ -21,12 +21,12 @@
#include "shaderhelper_p.h"
#include "objecthelper_p.h"
#include "texturehelper_p.h"
-#include "q3dcamera.h"
+#include "q3dcamera_p.h"
#include "drawer_p.h"
#include "utils_p.h"
#include "q3dlight.h"
-#include <QMatrix4x4>
+#include <QtGui/QMatrix4x4>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -91,11 +91,13 @@ void SelectionPointer::render(GLuint defaultFboHandle)
QMatrix4x4 projectionMatrix;
if (m_cachedIsSlicingActivated) {
GLfloat aspect = (GLfloat)m_mainViewPort.width() / (GLfloat)m_mainViewPort.height();
+ GLfloat sliceUnitsScaled = sliceUnits / m_autoScaleAdjustment;
viewMatrix.lookAt(QVector3D(0.0f, 0.0f, 1.0f), zeroVector, upVector);
- projectionMatrix.ortho(-sliceUnits * aspect, sliceUnits * aspect,
- -sliceUnits, sliceUnits, -1.0f, 4.0f);
+ projectionMatrix.ortho(-sliceUnitsScaled * aspect, sliceUnitsScaled * aspect,
+ -sliceUnitsScaled, sliceUnitsScaled,
+ -1.0f, 4.0f);
} else {
- viewMatrix = camera->viewMatrix();
+ viewMatrix = camera->d_ptr->viewMatrix();
projectionMatrix.perspective(45.0f, (GLfloat)m_mainViewPort.width()
/ (GLfloat)m_mainViewPort.height(), 0.1f, 100.0f);
}
diff --git a/src/datavisualization/engine/selectionpointer_p.h b/src/datavisualization/engine/selectionpointer_p.h
index c72b3510..1eac22be 100644
--- a/src/datavisualization/engine/selectionpointer_p.h
+++ b/src/datavisualization/engine/selectionpointer_p.h
@@ -29,8 +29,6 @@
#ifndef SELECTIONPOINTER_P_H
#define SELECTIONPOINTER_P_H
-#include <QVector3D>
-
#include "q3dscene.h"
#include "datavisualizationglobal_p.h"
#include "surface3dcontroller_p.h"
diff --git a/src/datavisualization/engine/seriesrendercache.cpp b/src/datavisualization/engine/seriesrendercache.cpp
index fe2db319..896b3b28 100644
--- a/src/datavisualization/engine/seriesrendercache.cpp
+++ b/src/datavisualization/engine/seriesrendercache.cpp
@@ -30,6 +30,7 @@ SeriesRenderCache::SeriesRenderCache()
: m_series(0),
m_object(0),
m_mesh(QAbstract3DSeries::MeshCube),
+ m_baseUniformTexture(0),
m_baseGradientTexture(0),
m_singleHighlightGradientTexture(0),
m_multiHighlightGradientTexture(0)
@@ -127,7 +128,11 @@ void SeriesRenderCache::populate(QAbstract3DSeries *series, Abstract3DRenderer *
}
if (seriesChanged || changeTracker.meshRotationChanged) {
- m_meshRotation = series->meshRotation();
+ m_meshRotation = series->meshRotation().normalized();
+ if (m_series->type() == QAbstract3DSeries::SeriesTypeBar
+ && (m_meshRotation.x() || m_meshRotation.z())) {
+ m_meshRotation = identityQuaternion;
+ }
changeTracker.meshRotationChanged = false;
}
@@ -138,6 +143,8 @@ void SeriesRenderCache::populate(QAbstract3DSeries *series, Abstract3DRenderer *
if (seriesChanged || changeTracker.baseColorChanged) {
m_baseColor = Utils::vectorFromColor(series->baseColor());
+ if (m_series->type() == QAbstract3DSeries::SeriesTypeSurface)
+ renderer->generateBaseColorTexture(series->baseColor(), &m_baseUniformTexture);
changeTracker.baseColorChanged = false;
}
@@ -178,9 +185,12 @@ void SeriesRenderCache::populate(QAbstract3DSeries *series, Abstract3DRenderer *
void SeriesRenderCache::cleanup(TextureHelper *texHelper)
{
delete m_object;
- texHelper->deleteTexture(&m_baseGradientTexture);
- texHelper->deleteTexture(&m_singleHighlightGradientTexture);
- texHelper->deleteTexture(&m_multiHighlightGradientTexture);
+ if (QOpenGLContext::currentContext()) {
+ texHelper->deleteTexture(&m_baseUniformTexture);
+ texHelper->deleteTexture(&m_baseGradientTexture);
+ texHelper->deleteTexture(&m_singleHighlightGradientTexture);
+ texHelper->deleteTexture(&m_multiHighlightGradientTexture);
+ }
}
QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/engine/seriesrendercache_p.h b/src/datavisualization/engine/seriesrendercache_p.h
index 82f69ccd..77e050b0 100644
--- a/src/datavisualization/engine/seriesrendercache_p.h
+++ b/src/datavisualization/engine/seriesrendercache_p.h
@@ -45,7 +45,7 @@ public:
virtual ~SeriesRenderCache();
void populate(QAbstract3DSeries *series, Abstract3DRenderer *renderer);
- void cleanup(TextureHelper *texHelper);
+ virtual void cleanup(TextureHelper *texHelper);
// NOTE: Series pointer can only be used to access the series when syncing with controller.
// It is not guaranteed to be valid while rendering and should only be used as an identifier.
@@ -58,6 +58,7 @@ public:
inline ObjectHelper *object() const { return m_object; }
inline const Q3DTheme::ColorStyle &colorStyle() const { return m_colorStyle; }
inline const QVector3D &baseColor() const { return m_baseColor; }
+ inline const GLuint &baseUniformTexture() const { return m_baseUniformTexture; }
inline const GLuint &baseGradientTexture() const { return m_baseGradientTexture; }
inline const QVector3D &singleHighlightColor() const { return m_singleHighlightColor; }
inline const GLuint &singleHighlightGradientTexture() const { return m_singleHighlightGradientTexture; }
@@ -74,6 +75,7 @@ protected:
Q3DTheme::ColorStyle m_colorStyle;
QVector3D m_baseColor;
+ GLuint m_baseUniformTexture;
GLuint m_baseGradientTexture;
QVector3D m_singleHighlightColor;
GLuint m_singleHighlightGradientTexture;
diff --git a/src/datavisualization/engine/surface3dcontroller.cpp b/src/datavisualization/engine/surface3dcontroller.cpp
index 0eb66d0e..991a1ce8 100644
--- a/src/datavisualization/engine/surface3dcontroller.cpp
+++ b/src/datavisualization/engine/surface3dcontroller.cpp
@@ -26,9 +26,7 @@
#include "qsurface3dseries_p.h"
#include "shaderhelper_p.h"
-#include <QMatrix4x4>
-
-#include <QDebug>
+#include <QtGui/QMatrix4x4>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -68,6 +66,11 @@ void Surface3DController::synchDataToRenderer()
if (!isInitialized())
return;
+ if (m_changedSeriesList.size()) {
+ m_renderer->modifiedSeriesList(m_changedSeriesList);
+ m_changedSeriesList.clear();
+ }
+
Abstract3DController::synchDataToRenderer();
// Notify changes to renderer
@@ -103,7 +106,7 @@ void Surface3DController::handleAxisRangeChangedBySender(QObject *sender)
Abstract3DController::handleAxisRangeChangedBySender(sender);
// Update selected point - may be moved offscreen
- setSelectedPoint(m_selectedPoint, m_selectedSeries);
+ setSelectedPoint(m_selectedPoint, m_selectedSeries, false);
}
void Surface3DController::handleSeriesVisibilityChangedBySender(QObject *sender)
@@ -112,9 +115,9 @@ void Surface3DController::handleSeriesVisibilityChangedBySender(QObject *sender)
adjustValueAxisRange();
- // Visibility changes may require disabling/enabling slicing,
+ // Visibility changes may require disabling slicing,
// so just reset selection to ensure everything is still valid.
- setSelectedPoint(m_selectedPoint, m_selectedSeries);
+ setSelectedPoint(m_selectedPoint, m_selectedSeries, false);
}
void Surface3DController::handlePendingClick()
@@ -123,7 +126,7 @@ void Surface3DController::handlePendingClick()
QPoint position = m_renderer->clickedPosition();
QSurface3DSeries *series = static_cast<QSurface3DSeries *>(m_renderer->clickedSeries());
- setSelectedPoint(position, series);
+ setSelectedPoint(position, series, true);
m_renderer->resetClickedStatus();
}
@@ -143,18 +146,14 @@ void Surface3DController::addSeries(QAbstract3DSeries *series)
{
Q_ASSERT(series && series->type() == QAbstract3DSeries::SeriesTypeSurface);
- if (!m_seriesList.size()) {
- Abstract3DController::addSeries(series);
+ Abstract3DController::addSeries(series);
- if (series->isVisible())
- adjustValueAxisRange();
- } else {
- qWarning("Surface graph only supports a single series.");
- }
+ if (series->isVisible())
+ adjustValueAxisRange();
QSurface3DSeries *surfaceSeries = static_cast<QSurface3DSeries *>(series);
if (surfaceSeries->selectedPoint() != invalidSelectionPosition())
- setSelectedPoint(surfaceSeries->selectedPoint(), surfaceSeries);
+ setSelectedPoint(surfaceSeries->selectedPoint(), surfaceSeries, false);
}
void Surface3DController::removeSeries(QAbstract3DSeries *series)
@@ -164,7 +163,7 @@ void Surface3DController::removeSeries(QAbstract3DSeries *series)
Abstract3DController::removeSeries(series);
if (m_selectedSeries == series)
- setSelectedPoint(invalidSelectionPosition(), 0);
+ setSelectedPoint(invalidSelectionPosition(), 0, false);
if (wasVisible)
adjustValueAxisRange();
@@ -203,7 +202,7 @@ void Surface3DController::setSelectionMode(QAbstract3DGraph::SelectionFlags mode
if (mode != oldMode) {
// Refresh selection upon mode change to ensure slicing is correctly updated
// according to series the visibility.
- setSelectedPoint(m_selectedPoint, m_selectedSeries);
+ setSelectedPoint(m_selectedPoint, m_selectedSeries, true);
// Special case: Always deactivate slicing when changing away from slice
// automanagement, as this can't be handled in setSelectedBar.
@@ -215,7 +214,7 @@ void Surface3DController::setSelectionMode(QAbstract3DGraph::SelectionFlags mode
}
}
-void Surface3DController::setSelectedPoint(const QPoint &position, QSurface3DSeries *series)
+void Surface3DController::setSelectedPoint(const QPoint &position, QSurface3DSeries *series, bool enterSlice)
{
// If the selection targets non-existent point, clear selection instead.
QPoint pos = position;
@@ -253,14 +252,15 @@ void Surface3DController::setSelectedPoint(const QPoint &position, QSurface3DSer
if (item.x() < axisMinX || item.x() > axisMaxX
|| item.z() < axisMinZ || item.z() > axisMaxZ) {
scene()->setSlicingActive(false);
- } else {
+ } else if (enterSlice) {
scene()->setSlicingActive(true);
}
}
emitNeedRender();
}
- if (pos != m_selectedPoint) {
+ if (pos != m_selectedPoint || series != m_selectedSeries) {
+ bool seriesChanged = (series != m_selectedSeries);
m_selectedPoint = pos;
m_selectedSeries = series;
m_changeTracker.selectedPointChanged = true;
@@ -274,13 +274,16 @@ void Surface3DController::setSelectedPoint(const QPoint &position, QSurface3DSer
if (m_selectedSeries)
m_selectedSeries->dptr()->setSelectedPoint(m_selectedPoint);
+ if (seriesChanged)
+ emit selectedSeriesChanged(m_selectedSeries);
+
emitNeedRender();
}
}
void Surface3DController::clearSelection()
{
- setSelectedPoint(invalidSelectionPosition(), 0);
+ setSelectedPoint(invalidSelectionPosition(), 0, false);
}
void Surface3DController::handleArrayReset()
@@ -288,10 +291,12 @@ void Surface3DController::handleArrayReset()
QSurface3DSeries *series = static_cast<QSurfaceDataProxy *>(sender())->series();
if (series->isVisible()) {
adjustValueAxisRange();
+ if (!m_changedSeriesList.contains(series))
+ m_changedSeriesList.append(series);
m_isDataDirty = true;
}
// Clear selection unless still valid
- setSelectedPoint(m_selectedPoint, m_selectedSeries);
+ setSelectedPoint(m_selectedPoint, m_selectedSeries, false);
emitNeedRender();
}
@@ -315,56 +320,55 @@ void Surface3DController::handleRowsChanged(int startIndex, int count)
m_changedRows.reserve(sender->rowCount());
QSurface3DSeries *series = sender->series();
- if (series->isVisible()) {
- // Change is for the visible series, put the change to queue
- int oldChangeCount = m_changedRows.size();
- for (int i = 0; i < count; i++) {
- bool newItem = true;
- int candidate = startIndex + i;
- for (int i = 0; i < oldChangeCount; i++) {
- if (m_changedRows.at(i) == candidate) {
- newItem = false;
- break;
- }
+ int oldChangeCount = m_changedRows.size();
+ for (int i = 0; i < count; i++) {
+ bool newItem = true;
+ int candidate = startIndex + i;
+ for (int i = 0; i < oldChangeCount; i++) {
+ if (m_changedRows.at(i).row == candidate &&
+ series == m_changedRows.at(i).series) {
+ newItem = false;
+ break;
}
- if (newItem)
- m_changedRows.append(candidate);
}
- if (m_changedRows.size()) {
- m_changeTracker.rowsChanged = true;
-
- adjustValueAxisRange();
- // Clear selection unless still valid
- setSelectedPoint(m_selectedPoint, m_selectedSeries);
- emitNeedRender();
+ if (newItem) {
+ ChangeRow newItem = {series, candidate};
+ m_changedRows.append(newItem);
}
}
+ if (m_changedRows.size()) {
+ m_changeTracker.rowsChanged = true;
+
+ adjustValueAxisRange();
+ // Clear selection unless still valid
+ setSelectedPoint(m_selectedPoint, m_selectedSeries, false);
+ emitNeedRender();
+ }
}
void Surface3DController::handleItemChanged(int rowIndex, int columnIndex)
{
QSurfaceDataProxy *sender = static_cast<QSurfaceDataProxy *>(QObject::sender());
QSurface3DSeries *series = sender->series();
- if (series->isVisible()) {
- // Change is for the visible series, put the change to queue
- bool newItem = true;
- QPoint candidate(columnIndex, rowIndex);
- foreach (QPoint item, m_changedItems) {
- if (item == candidate) {
- newItem = false;
- break;
- }
- }
- if (newItem) {
- m_changedItems.append(candidate);
- m_changeTracker.itemChanged = true;
- adjustValueAxisRange();
- // Clear selection unless still valid
- setSelectedPoint(m_selectedPoint, m_selectedSeries);
- emitNeedRender();
+ bool newItem = true;
+ QPoint candidate(columnIndex, rowIndex);
+ foreach (ChangeItem item, m_changedItems) {
+ if (item.point == candidate && item.series == series) {
+ newItem = false;
+ break;
}
}
+ if (newItem) {
+ ChangeItem newItem = {series, candidate};
+ m_changedItems.append(newItem);
+ m_changeTracker.itemChanged = true;
+
+ adjustValueAxisRange();
+ // Clear selection unless still valid
+ setSelectedPoint(m_selectedPoint, m_selectedSeries, false);
+ emitNeedRender();
+ }
}
void Surface3DController::handleRowsAdded(int startIndex, int count)
@@ -375,6 +379,8 @@ void Surface3DController::handleRowsAdded(int startIndex, int count)
if (series->isVisible()) {
adjustValueAxisRange();
m_isDataDirty = true;
+ if (!m_changedSeriesList.contains(series))
+ m_changedSeriesList.append(series);
}
emitNeedRender();
}
@@ -389,13 +395,15 @@ void Surface3DController::handleRowsInserted(int startIndex, int count)
int selectedRow = m_selectedPoint.x();
if (startIndex <= selectedRow) {
selectedRow += count;
- setSelectedPoint(QPoint(selectedRow, m_selectedPoint.y()), m_selectedSeries);
+ setSelectedPoint(QPoint(selectedRow, m_selectedPoint.y()), m_selectedSeries, false);
}
}
if (series->isVisible()) {
adjustValueAxisRange();
m_isDataDirty = true;
+ if (!m_changedSeriesList.contains(series))
+ m_changedSeriesList.append(series);
}
emitNeedRender();
@@ -415,13 +423,15 @@ void Surface3DController::handleRowsRemoved(int startIndex, int count)
else
selectedRow -= count; // Move selected row down by amount of rows removed
- setSelectedPoint(QPoint(selectedRow, m_selectedPoint.y()), m_selectedSeries);
+ setSelectedPoint(QPoint(selectedRow, m_selectedPoint.y()), m_selectedSeries, false);
}
}
if (series->isVisible()) {
adjustValueAxisRange();
m_isDataDirty = true;
+ if (!m_changedSeriesList.contains(series))
+ m_changedSeriesList.append(series);
}
emitNeedRender();
@@ -435,6 +445,7 @@ void Surface3DController::adjustValueAxisRange()
bool adjustX = (valueAxisX && valueAxisX->isAutoAdjustRange());
bool adjustY = (valueAxisY && valueAxisY->isAutoAdjustRange());
bool adjustZ = (valueAxisZ && valueAxisZ->isAutoAdjustRange());
+ bool first = true;
if (adjustX || adjustY || adjustZ) {
float minValueX = 0.0f;
@@ -453,7 +464,7 @@ void Surface3DController::adjustValueAxisRange()
QVector3D maxLimits;
proxy->dptrc()->limitValues(minLimits, maxLimits);
if (adjustX) {
- if (!series) {
+ if (first) {
// First series initializes the values
minValueX = minLimits.x();
maxValueX = maxLimits.x();
@@ -463,7 +474,7 @@ void Surface3DController::adjustValueAxisRange()
}
}
if (adjustY) {
- if (!series) {
+ if (first) {
// First series initializes the values
minValueY = minLimits.y();
maxValueY = maxLimits.y();
@@ -473,7 +484,7 @@ void Surface3DController::adjustValueAxisRange()
}
}
if (adjustZ) {
- if (!series) {
+ if (first) {
// First series initializes the values
minValueZ = minLimits.z();
maxValueZ = maxLimits.z();
@@ -482,6 +493,7 @@ void Surface3DController::adjustValueAxisRange()
maxValueZ = qMax(maxValueZ, maxLimits.z());
}
}
+ first = false;
}
}
diff --git a/src/datavisualization/engine/surface3dcontroller_p.h b/src/datavisualization/engine/surface3dcontroller_p.h
index 624bea47..14c0dd40 100644
--- a/src/datavisualization/engine/surface3dcontroller_p.h
+++ b/src/datavisualization/engine/surface3dcontroller_p.h
@@ -58,6 +58,16 @@ class QT_DATAVISUALIZATION_EXPORT Surface3DController : public Abstract3DControl
{
Q_OBJECT
+public:
+ struct ChangeItem {
+ QSurface3DSeries *series;
+ QPoint point;
+ };
+ struct ChangeRow {
+ QSurface3DSeries *series;
+ int row;
+ };
+
private:
Surface3DChangeBitField m_changeTracker;
Surface3DRenderer *m_renderer;
@@ -65,8 +75,9 @@ private:
QSurface3DSeries *m_selectedSeries; // Points to the series for which the point is selected in
// single series selection cases.
bool m_flatShadingSupported;
- QVector<QPoint> m_changedItems;
- QVector<int> m_changedRows;
+ QVector<ChangeItem> m_changedItems;
+ QVector<ChangeRow> m_changedRows;
+ QVector<QSurface3DSeries *> m_changedSeriesList;
public:
explicit Surface3DController(QRect rect, Q3DScene *scene = 0);
@@ -76,9 +87,11 @@ public:
virtual void synchDataToRenderer();
void setSelectionMode(QAbstract3DGraph::SelectionFlags mode);
- void setSelectedPoint(const QPoint &position, QSurface3DSeries *series);
+ void setSelectedPoint(const QPoint &position, QSurface3DSeries *series, bool enterSlice);
virtual void clearSelection();
+ inline QSurface3DSeries *selectedSeries() const { return m_selectedSeries; }
+
virtual void handleAxisAutoAdjustRangeChangedInOrientation(
QAbstract3DAxis::AxisOrientation orientation, bool autoAdjust);
virtual void handleAxisRangeChangedBySender(QObject *sender);
@@ -102,6 +115,9 @@ public slots:
void handleFlatShadingSupportedChange(bool supported);
+signals:
+ void selectedSeriesChanged(QSurface3DSeries *series);
+
private:
void adjustValueAxisRange();
diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp
index 82f9eae1..ffcdeb7a 100644
--- a/src/datavisualization/engine/surface3drenderer.cpp
+++ b/src/datavisualization/engine/surface3drenderer.cpp
@@ -30,11 +30,9 @@
#include "q3dlight.h"
#include "qsurface3dseries_p.h"
-#include <QMatrix4x4>
-#include <QMouseEvent>
-#include <qmath.h>
-
-#include <QDebug>
+#include <QtGui/QMatrix4x4>
+#include <QtGui/QMouseEvent>
+#include <QtCore/qmath.h>
static const int ID_TO_RGBA_MASK = 0xff;
@@ -45,22 +43,17 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION
const GLfloat aspectRatio = 2.0f; // Forced ratio of x and z to y. Dynamic will make it look odd.
const GLfloat backgroundMargin = 1.1f; // Margin for background (1.1f = make it 10% larger to avoid items being drawn inside background)
const GLfloat labelMargin = 0.05f;
-const GLfloat backgroundBottom = 1.0f;
const GLfloat gridLineWidth = 0.005f;
const GLfloat sliceZScale = 0.1f;
const GLfloat sliceUnits = 2.5f;
-const int subViewDivider = 5;
-const uint invalidSelectionId = uint(-1);
Surface3DRenderer::Surface3DRenderer(Surface3DController *controller)
: Abstract3DRenderer(controller),
- m_labelBackground(false),
- m_font(QFont(QStringLiteral("Arial"))),
- m_isGridEnabled(true),
m_cachedIsSlicingActivated(false),
m_depthShader(0),
m_backgroundShader(0),
- m_surfaceShader(0),
+ m_surfaceFlatShader(0),
+ m_surfaceSmoothShader(0),
m_surfaceGridShader(0),
m_selectionShader(0),
m_labelShader(0),
@@ -70,10 +63,6 @@ Surface3DRenderer::Surface3DRenderer(Surface3DController *controller)
m_scaleZ(0.0f),
m_scaleXWithBackground(0.0f),
m_scaleZWithBackground(0.0f),
- m_surfaceScaleX(0.0f),
- m_surfaceScaleZ(0.0f),
- m_surfaceOffsetX(0.0f),
- m_surfaceOffsetZ(0.0f),
m_minVisibleColumnValue(0.0f),
m_maxVisibleColumnValue(0.0f),
m_minVisibleRowValue(0.0f),
@@ -83,33 +72,25 @@ Surface3DRenderer::Surface3DRenderer(Surface3DController *controller)
m_backgroundObj(0),
m_gridLineObj(0),
m_labelObj(0),
- m_surfaceObj(0),
- m_sliceSurfaceObj(0),
m_depthTexture(0),
m_depthModelTexture(0),
m_depthFrameBuffer(0),
m_selectionFrameBuffer(0),
m_selectionDepthBuffer(0),
- m_selectionTexture(0),
m_selectionResultTexture(0),
m_shadowQualityToShader(33.3f),
- m_cachedFlatShading(false),
m_flatSupported(true),
- m_cachedSurfaceVisible(true),
- m_cachedSurfaceGridOn(true),
- m_selectionPointer(0),
m_selectionActive(false),
m_xFlipped(false),
m_zFlipped(false),
m_yFlipped(false),
- m_sampleSpace(QRect(0, 0, 0, 0)),
m_shadowQualityMultiplier(3),
- m_clickedPointId(invalidSelectionId),
m_hasHeightAdjustmentChanged(true),
m_selectedPoint(Surface3DController::invalidSelectionPosition()),
m_selectedSeries(0),
- m_uniformGradientTexture(0),
- m_clickedPosition(Surface3DController::invalidSelectionPosition())
+ m_clickedPosition(Surface3DController::invalidSelectionPosition()),
+ m_selectionTexturesDirty(false),
+ m_noShadowTexture(0)
{
// Check if flat feature is supported
ShaderHelper tester(this, QStringLiteral(":/shaders/vertexSurfaceFlat"),
@@ -125,9 +106,6 @@ Surface3DRenderer::Surface3DRenderer(Surface3DController *controller)
initializeOpenGLFunctions();
initializeOpenGL();
-
- // Create initial uniform gradient
- generateUniformGradient(m_uniformGradientTextureColor);
}
Surface3DRenderer::~Surface3DRenderer()
@@ -137,34 +115,28 @@ Surface3DRenderer::~Surface3DRenderer()
m_textureHelper->glDeleteRenderbuffers(1, &m_selectionDepthBuffer);
m_textureHelper->glDeleteFramebuffers(1, &m_selectionFrameBuffer);
+ m_textureHelper->deleteTexture(&m_noShadowTexture);
m_textureHelper->deleteTexture(&m_depthTexture);
m_textureHelper->deleteTexture(&m_depthModelTexture);
- m_textureHelper->deleteTexture(&m_selectionTexture);
m_textureHelper->deleteTexture(&m_selectionResultTexture);
- m_textureHelper->deleteTexture(&m_uniformGradientTexture);
}
delete m_depthShader;
delete m_backgroundShader;
delete m_selectionShader;
- delete m_surfaceShader;
+ delete m_surfaceFlatShader;
+ delete m_surfaceSmoothShader;
delete m_surfaceGridShader;
delete m_labelShader;
delete m_backgroundObj;
- delete m_surfaceObj;
- delete m_sliceSurfaceObj;
delete m_gridLineObj;
delete m_labelObj;
- delete m_selectionPointer;
-
- for (int i = 0; i < m_dataArray.size(); i++)
- delete m_dataArray.at(i);
- m_dataArray.clear();
-
- for (int i = 0; i < m_sliceDataArray.size(); i++)
- delete m_sliceDataArray.at(i);
- m_sliceDataArray.clear();
+ foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) {
+ cache->cleanup(m_textureHelper);
+ delete cache;
+ }
+ m_renderCacheList.clear();
}
void Surface3DRenderer::initializeOpenGL()
@@ -196,81 +168,65 @@ void Surface3DRenderer::initializeOpenGL()
// Load background mesh (we need to be initialized first)
loadBackgroundMesh();
+
+ // Create texture for no shadows
+ QImage image(2, 2, QImage::Format_RGB32);
+ image.fill(Qt::white);
+ m_noShadowTexture = m_textureHelper->create2DTexture(image, false, true, false, true);
}
void Surface3DRenderer::updateData()
{
- // Surface only supports single series for now, so we are only interested in the first series
- const QSurfaceDataArray *array = 0;
- if (m_visibleSeriesList.size()) {
- QSurface3DSeries *firstSeries = static_cast<QSurface3DSeries *>(m_visibleSeriesList.at(0).series());
- QSurfaceDataProxy *dataProxy = firstSeries->dataProxy();
- if (dataProxy)
- array = dataProxy->array();
- }
-
calculateSceneScalingFactors();
- // Need minimum of 2x2 array to draw a surface
- if (array && array->size() >= 2 && array->at(0)->size() >= 2) {
- QRect sampleSpace = calculateSampleRect(*array);
+ foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) {
+ const QSurface3DSeries *currentSeries = cache->series();
+ QSurfaceDataProxy *dataProxy = currentSeries->dataProxy();
+ const QSurfaceDataArray &array = *dataProxy->array();
- bool dimensionChanged = false;
- if (m_sampleSpace != sampleSpace) {
- dimensionChanged = true;
- m_sampleSpace = sampleSpace;
+ // Need minimum of 2x2 array to draw a surface
+ if (array.size() >= 2 && array.at(0)->size() >= 2) {
+ QRect sampleSpace = calculateSampleRect(cache, array);
- for (int i = 0; i < m_dataArray.size(); i++)
- delete m_dataArray.at(i);
- m_dataArray.clear();
- }
+ QSurfaceDataArray &dataArray = cache->dataArray();
+ bool dimensionChanged = false;
+ if (cache->sampleSpace() != sampleSpace) {
+ if (sampleSpace.width() >= 2)
+ m_selectionTexturesDirty = true;
- if (sampleSpace.width() >= 2 && sampleSpace.height() >= 2) {
- if (dimensionChanged) {
- m_dataArray.reserve(sampleSpace.height());
- for (int i = 0; i < sampleSpace.height(); i++)
- m_dataArray << new QSurfaceDataRow(sampleSpace.width());
- }
- for (int i = 0; i < sampleSpace.height(); i++) {
- for (int j = 0; j < sampleSpace.width(); j++)
- (*(m_dataArray.at(i)))[j] = array->at(i + sampleSpace.y())->at(
- j + sampleSpace.x());
- }
+ dimensionChanged = true;
+ cache->setSampleSpace(sampleSpace);
- if (m_dataArray.size() > 0) {
- if (!m_surfaceObj)
- loadSurfaceObj();
+ for (int i = 0; i < dataArray.size(); i++)
+ delete dataArray.at(i);
+ dataArray.clear();
+ }
- // Note: Data setup can change sample space (as min width/height is 1)
- if (!m_cachedFlatShading) {
- m_surfaceObj->setUpSmoothData(m_dataArray, m_sampleSpace, m_heightNormalizer,
- m_axisCacheY.min(), dimensionChanged);
- } else {
- m_surfaceObj->setUpData(m_dataArray, m_sampleSpace, m_heightNormalizer,
- m_axisCacheY.min(), dimensionChanged);
+ if (sampleSpace.width() >= 2 && sampleSpace.height() >= 2) {
+ if (dimensionChanged) {
+ dataArray.reserve(sampleSpace.height());
+ for (int i = 0; i < sampleSpace.height(); i++)
+ dataArray << new QSurfaceDataRow(sampleSpace.width());
+ }
+ for (int i = 0; i < sampleSpace.height(); i++) {
+ for (int j = 0; j < sampleSpace.width(); j++) {
+ (*(dataArray.at(i)))[j] = array.at(i + sampleSpace.y())->at(
+ j + sampleSpace.x());
+ }
}
- if (dimensionChanged)
- updateSelectionTexture();
+ if (dataArray.size() > 0 && (cache->objectDirty() || dimensionChanged)) {
+ checkFlatSupport(cache);
+ updateObjects(cache, dimensionChanged);
+ cache->setObjectDirty(false);
+ cache->setFlatStatusDirty(false);
+ }
}
}
- } else {
- for (int i = 0; i < m_dataArray.size(); i++)
- delete m_dataArray.at(i);
- m_dataArray.clear();
- m_sampleSpace = QRect();
-
- delete m_surfaceObj;
- m_surfaceObj = 0;
-#if !defined(QT_OPENGL_ES_2)
- m_textureHelper->fillDepthTexture(m_depthTexture, m_primarySubViewport.size(),
- m_shadowQualityMultiplier, 1.0f);
-#endif
}
- for (int i = 0; i < m_sliceDataArray.size(); i++)
- delete m_sliceDataArray.at(i);
- m_sliceDataArray.clear();
+ if (m_selectionTexturesDirty && m_cachedSelectionMode > QAbstract3DGraph::SelectionNone)
+ updateSelectionTextures();
updateSelectedPoint(m_selectedPoint, m_selectedSeries);
}
@@ -278,171 +234,360 @@ void Surface3DRenderer::updateData()
void Surface3DRenderer::updateSeries(const QList<QAbstract3DSeries *> &seriesList,
bool updateVisibility)
{
- Abstract3DRenderer::updateSeries(seriesList, updateVisibility);
+ Q_UNUSED(updateVisibility);
- if (m_visibleSeriesList.size()) {
- QSurface3DSeries *series = static_cast<QSurface3DSeries *>(m_visibleSeriesList.at(0).series());
- updateFlatStatus(series->isFlatShadingEnabled());
+ foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList)
+ cache->setValid(false);
- QSurface3DSeries::DrawFlags drawMode = series->drawMode();
- m_cachedSurfaceVisible = drawMode.testFlag(QSurface3DSeries::DrawSurface);
-#if !defined(QT_OPENGL_ES_2)
- if (!m_cachedSurfaceVisible) {
- m_textureHelper->fillDepthTexture(m_depthTexture, m_primarySubViewport.size(),
- m_shadowQualityMultiplier, 1.0f);
+ foreach (QAbstract3DSeries *series, seriesList) {
+ // Item selection label may need update
+ if (series->d_ptr->m_changeTracker.nameChanged
+ || series->d_ptr->m_changeTracker.itemLabelFormatChanged) {
+ m_selectionLabelDirty = true;
}
-#endif
- m_cachedSurfaceGridOn = drawMode.testFlag(QSurface3DSeries::DrawWireframe);
-
- QVector3D seriesColor = Utils::vectorFromColor(series->baseColor());
- if (m_uniformGradientTextureColor != seriesColor)
- generateUniformGradient(seriesColor);
- if (m_selectionPointer) {
- m_selectionPointer->setHighlightColor(
- Utils::vectorFromColor(series->singleHighlightColor()));
- // Make sure selection pointer object reference is still good
- m_selectionPointer->setPointerObject(m_visibleSeriesList.at(0).object());
- m_selectionPointer->setRotation(m_visibleSeriesList.at(0).meshRotation());
+
+ QSurface3DSeries *surfaceSeries = static_cast<QSurface3DSeries *>(series);
+ SurfaceSeriesRenderCache *cache = m_renderCacheList.value(surfaceSeries);
+ if (!cache) {
+ cache = new SurfaceSeriesRenderCache;
+ m_renderCacheList[surfaceSeries] = cache;
+
+ m_selectionTexturesDirty = true;
+ }
+ cache->setValid(true);
+ cache->populate(surfaceSeries, this);
+ if (cache->isFlatStatusDirty() && cache->sampleSpace().width()) {
+ checkFlatSupport(cache);
+ updateObjects(cache, true);
+ cache->setFlatStatusDirty(false);
+ }
+ }
+
+ // Remove non-valid objects from the cache list
+ foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) {
+ if (!cache->isValid()) {
+ if (cache->series() == m_selectedSeries)
+ updateSelectedPoint(Surface3DController::invalidSelectionPosition(), 0);
+
+ m_renderCacheList.remove(cache->series());
+ cache->cleanup(m_textureHelper);
+ delete cache;
+
+ m_selectionTexturesDirty = true;
+ }
+ }
+
+ // Selection pointer issues
+ if (m_selectedSeries) {
+ foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) {
+ QVector3D highlightColor =
+ Utils::vectorFromColor(cache->series()->singleHighlightColor());
+ SelectionPointer *slicePointer = cache->sliceSelectionPointer();
+ if (slicePointer) {
+ slicePointer->setHighlightColor(highlightColor);
+ slicePointer->setPointerObject(cache->object());
+ slicePointer->setRotation(cache->meshRotation());
+ }
+ SelectionPointer *mainPointer = cache->mainSelectionPointer();
+ if (mainPointer) {
+ mainPointer->setHighlightColor(highlightColor);
+ mainPointer->setPointerObject(cache->object());
+ mainPointer->setRotation(cache->meshRotation());
+ }
}
}
}
-void Surface3DRenderer::updateRows(const QVector<int> &rows)
+void Surface3DRenderer::modifiedSeriesList(const QVector<QSurface3DSeries *> &seriesList)
{
- // Surface only supports single series for now, so we are only interested in the first series
- const QSurfaceDataArray *array = 0;
- if (m_visibleSeriesList.size()) {
- QSurface3DSeries *firstSeries = static_cast<QSurface3DSeries *>(m_visibleSeriesList.at(0).series());
- QSurfaceDataProxy *dataProxy = firstSeries->dataProxy();
- if (dataProxy)
- array = dataProxy->array();
+ foreach (QSurface3DSeries *series, seriesList) {
+ SurfaceSeriesRenderCache *cache = m_renderCacheList.value(series);
+ if (cache)
+ cache->setObjectDirty(true);
}
+}
+
+void Surface3DRenderer::updateRows(const QVector<Surface3DController::ChangeRow> &rows)
+{
+ foreach (Surface3DController::ChangeRow item, rows) {
+ SurfaceSeriesRenderCache *cache = m_renderCacheList.value(item.series);
+ QSurfaceDataArray &dstArray = cache->dataArray();
+ const QRect &sampleSpace = cache->sampleSpace();
- if (array && array->size() >= 2 && array->at(0)->size() >= 2
- && m_sampleSpace.width() >= 2 && m_sampleSpace.height() >= 2) {
- bool updateBuffers = false;
- int sampleSpaceTop = m_sampleSpace.y() + m_sampleSpace.height();
- foreach (int row, rows) {
- if (row >= m_sampleSpace.y() && row <= sampleSpaceTop) {
+ const QSurfaceDataArray *srcArray = 0;
+ QSurfaceDataProxy *dataProxy = item.series->dataProxy();
+ if (dataProxy)
+ srcArray = dataProxy->array();
+
+ if (cache && srcArray->size() >= 2 && srcArray->at(0)->size() >= 2 &&
+ sampleSpace.width() >= 2 && sampleSpace.height() >= 2) {
+ bool updateBuffers = false;
+ int sampleSpaceTop = sampleSpace.y() + sampleSpace.height();
+ int row = item.row;
+ if (row >= sampleSpace.y() && row <= sampleSpaceTop) {
updateBuffers = true;
- for (int j = 0; j < m_sampleSpace.width(); j++)
- (*(m_dataArray.at(row - m_sampleSpace.y())))[j] =
- array->at(row)->at(j + m_sampleSpace.x());
-
- if (m_cachedFlatShading) {
- m_surfaceObj->updateCoarseRow(m_dataArray, row - m_sampleSpace.y(),
- m_heightNormalizer,
- m_axisCacheY.min());
+ for (int j = 0; j < sampleSpace.width(); j++) {
+ (*(dstArray.at(row - sampleSpace.y())))[j] =
+ srcArray->at(row)->at(j + sampleSpace.x());
+ }
+
+ if (cache->isFlatShadingEnabled()) {
+ cache->surfaceObject()->updateCoarseRow(dstArray, row - sampleSpace.y(),
+ m_heightNormalizer,
+ m_axisCacheY.min());
} else {
- m_surfaceObj->updateSmoothRow(m_dataArray, row - m_sampleSpace.y(),
- m_heightNormalizer,
- m_axisCacheY.min());
+ cache->surfaceObject()->updateSmoothRow(dstArray, row - sampleSpace.y(),
+ m_heightNormalizer,
+ m_axisCacheY.min());
}
}
+ if (updateBuffers)
+ cache->surfaceObject()->uploadBuffers();
}
- if (updateBuffers)
- m_surfaceObj->uploadBuffers();
}
updateSelectedPoint(m_selectedPoint, m_selectedSeries);
}
-void Surface3DRenderer::updateItem(const QVector<QPoint> &points)
+void Surface3DRenderer::updateItem(const QVector<Surface3DController::ChangeItem> &points)
{
- // Surface only supports single series for now, so we are only interested in the first series
- const QSurfaceDataArray *array = 0;
- if (m_visibleSeriesList.size()) {
- QSurface3DSeries *firstSeries = static_cast<QSurface3DSeries *>(m_visibleSeriesList.at(0).series());
- QSurfaceDataProxy *dataProxy = firstSeries->dataProxy();
+ foreach (Surface3DController::ChangeItem item, points) {
+ SurfaceSeriesRenderCache *cache = m_renderCacheList.value(item.series);
+ QSurfaceDataArray &dstArray = cache->dataArray();
+ const QRect &sampleSpace = cache->sampleSpace();
+
+ const QSurfaceDataArray *srcArray = 0;
+ QSurfaceDataProxy *dataProxy = item.series->dataProxy();
if (dataProxy)
- array = dataProxy->array();
- }
+ srcArray = dataProxy->array();
- if (array && array->size() >= 2 && array->at(0)->size() >= 2
- && m_sampleSpace.width() >= 2 && m_sampleSpace.height() >= 2) {
- int sampleSpaceTop = m_sampleSpace.y() + m_sampleSpace.height();
- int sampleSpaceRight = m_sampleSpace.x() + m_sampleSpace.width();
- bool updateBuffers = false;
- foreach (QPoint item, points) {
- if (item.y() <= sampleSpaceTop && item.y() >= m_sampleSpace.y() &&
- item.x() <= sampleSpaceRight && item.x() >= m_sampleSpace.x()) {
+ if (cache && srcArray->size() >= 2 && srcArray->at(0)->size() >= 2 &&
+ sampleSpace.width() >= 2 && sampleSpace.height() >= 2) {
+ int sampleSpaceTop = sampleSpace.y() + sampleSpace.height();
+ int sampleSpaceRight = sampleSpace.x() + sampleSpace.width();
+ bool updateBuffers = false;
+ QPoint point = item.point;
+
+ if (point.y() <= sampleSpaceTop && point.y() >= sampleSpace.y() &&
+ point.x() <= sampleSpaceRight && point.x() >= sampleSpace.x()) {
updateBuffers = true;
- int x = item.x() - m_sampleSpace.x();
- int y = item.y() - m_sampleSpace.y();
- (*(m_dataArray.at(y)))[x] = array->at(item.y())->at(item.x());
+ int x = point.x() - sampleSpace.x();
+ int y = point.y() - sampleSpace.y();
+ (*(dstArray.at(y)))[x] = srcArray->at(point.y())->at(point.x());
- if (m_cachedFlatShading) {
- m_surfaceObj->updateCoarseItem(m_dataArray, y, x, m_heightNormalizer,
- m_axisCacheY.min());
+ if (cache->isFlatShadingEnabled()) {
+ cache->surfaceObject()->updateCoarseItem(dstArray, y, x, m_heightNormalizer,
+ m_axisCacheY.min());
} else {
- m_surfaceObj->updateSmoothItem(m_dataArray, y, x, m_heightNormalizer,
- m_axisCacheY.min());
+ cache->surfaceObject()->updateSmoothItem(dstArray, y, x, m_heightNormalizer,
+ m_axisCacheY.min());
}
}
+ if (updateBuffers)
+ cache->surfaceObject()->uploadBuffers();
}
- if (updateBuffers)
- m_surfaceObj->uploadBuffers();
+
}
updateSelectedPoint(m_selectedPoint, m_selectedSeries);
}
+void Surface3DRenderer::updateAxisRange(QAbstract3DAxis::AxisOrientation orientation, float min,
+ float max)
+{
+ Abstract3DRenderer::updateAxisRange(orientation, min, max);
+
+ if (orientation == QAbstract3DAxis::AxisOrientationY) {
+ foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList)
+ cache->setObjectDirty(true);
+ }
+}
+
void Surface3DRenderer::updateSliceDataModel(const QPoint &point)
{
+ foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList)
+ cache->sliceSurfaceObject()->clear();
+
+ if (m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionMultiSeries)) {
+ // Find axis coordinates for the selected point
+ SurfaceSeriesRenderCache *selectedCache =
+ m_renderCacheList.value(const_cast<QSurface3DSeries *>(m_selectedSeries));
+ QSurfaceDataArray &dataArray = selectedCache->dataArray();
+ QSurfaceDataItem item = dataArray.at(point.x())->at(point.y());
+ QPointF coords(item.x(), item.z());
+
+ foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) {
+ if (cache->series() != m_selectedSeries) {
+ QPoint mappedPoint = mapCoordsToSampleSpace(cache, coords);
+ updateSliceObject(cache, mappedPoint);
+ } else {
+ updateSliceObject(cache, point);
+ }
+ }
+ } else {
+ if (m_selectedSeries) {
+ SurfaceSeriesRenderCache *cache =
+ m_renderCacheList.value(const_cast<QSurface3DSeries *>(m_selectedSeries));
+ if (cache)
+ updateSliceObject(cache, point);
+ }
+ }
+}
+
+QPoint Surface3DRenderer::mapCoordsToSampleSpace(SurfaceSeriesRenderCache *cache,
+ const QPointF &coords)
+{
+ QPoint point(-1, -1);
+
+ QSurfaceDataArray &dataArray = cache->dataArray();
+ int top = dataArray.size() - 1;
+ int right = dataArray.at(top)->size() - 1;
+ QSurfaceDataItem itemBottomLeft = dataArray.at(0)->at(0);
+ QSurfaceDataItem itemTopRight = dataArray.at(top)->at(right);
+
+ if (itemBottomLeft.x() <= coords.x() && itemTopRight.x() >= coords.x()) {
+ float modelX = coords.x() - itemBottomLeft.x();
+ float spanX = itemTopRight.x() - itemBottomLeft.x();
+ float stepX = spanX / float(right);
+ int sampleX = int((modelX + (stepX / 2.0f)) / stepX);
+
+ QSurfaceDataItem item = dataArray.at(0)->at(sampleX);
+ if (!::qFuzzyCompare(float(coords.x()), item.x())) {
+ int direction = 1;
+ if (item.x() > coords.x())
+ direction = -1;
+
+ findMatchingColumn(coords.x(), sampleX, direction, dataArray);
+ }
+
+ if (sampleX >= 0 && sampleX <= right)
+ point.setY(sampleX);
+ }
+
+ if (itemBottomLeft.z() <= coords.y() && itemTopRight.z() >= coords.y()) {
+ float modelY = coords.y() - itemBottomLeft.z();
+ float spanY = itemTopRight.z() - itemBottomLeft.z();
+ float stepY = spanY / float(top);
+ int sampleY = int((modelY + (stepY / 2.0f)) / stepY);
+
+ QSurfaceDataItem item = dataArray.at(sampleY)->at(0);
+ if (!::qFuzzyCompare(float(coords.y()), item.z())) {
+ int direction = 1;
+ if (item.z() > coords.y())
+ direction = -1;
+
+ findMatchingRow(coords.y(), sampleY, direction, dataArray);
+ }
+
+ if (sampleY >= 0 && sampleY <= top)
+ point.setX(sampleY);
+ }
+
+ return point;
+}
+
+void Surface3DRenderer::findMatchingRow(float z, int &sample, int direction,
+ QSurfaceDataArray &dataArray)
+{
+ int maxZ = dataArray.size() - 1;
+ QSurfaceDataItem item = dataArray.at(sample)->at(0);
+ float distance = qAbs(z - item.z());
+ int newSample = sample + direction;
+ while (newSample >= 0 && newSample <= maxZ) {
+ item = dataArray.at(newSample)->at(0);
+ float newDist = qAbs(z - item.z());
+ if (newDist < distance) {
+ sample = newSample;
+ distance = newDist;
+ } else {
+ break;
+ }
+ newSample = sample + direction;
+ }
+}
+
+void Surface3DRenderer::findMatchingColumn(float x, int &sample, int direction,
+ QSurfaceDataArray &dataArray)
+{
+ int maxX = dataArray.at(0)->size() - 1;
+ QSurfaceDataItem item = dataArray.at(0)->at(sample);
+ float distance = qAbs(x - item.x());
+ int newSample = sample + direction;
+ while (newSample >= 0 && newSample <= maxX) {
+ item = dataArray.at(0)->at(newSample);
+ float newDist = qAbs(x - item.x());
+ if (newDist < distance) {
+ sample = newSample;
+ distance = newDist;
+ } else {
+ break;
+ }
+ newSample = sample + direction;
+ }
+}
+
+void Surface3DRenderer::updateSliceObject(SurfaceSeriesRenderCache *cache, const QPoint &point)
+{
int column = point.y();
int row = point.x();
- for (int i = 0; i < m_sliceDataArray.size(); i++)
- delete m_sliceDataArray.at(i);
- m_sliceDataArray.clear();
+ if ((m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionRow) && row == -1) ||
+ (m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionColumn) && column == -1)) {
+ cache->sliceSurfaceObject()->clear();
+ return;
+ }
- m_sliceDataArray.reserve(2);
- QSurfaceDataRow *sliceRow;
+ QSurfaceDataArray &sliceDataArray = cache->sliceDataArray();
+ for (int i = 0; i < sliceDataArray.size(); i++)
+ delete sliceDataArray.at(i);
+ sliceDataArray.clear();
+ sliceDataArray.reserve(2);
+ QSurfaceDataRow *sliceRow;
+ QSurfaceDataArray &dataArray = cache->dataArray();
float adjust = (0.025f * m_heightNormalizer) / 2.0f;
float stepDown = 2.0f * adjust;
if (m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionRow)) {
- QSurfaceDataRow *src = m_dataArray.at(row);
+ QSurfaceDataRow *src = dataArray.at(row);
sliceRow = new QSurfaceDataRow(src->size());
for (int i = 0; i < sliceRow->size(); i++)
(*sliceRow)[i].setPosition(QVector3D(src->at(i).x(), src->at(i).y() + adjust, -1.0f));
} else {
- sliceRow = new QSurfaceDataRow(m_sampleSpace.height());
- for (int i = 0; i < m_sampleSpace.height(); i++) {
- (*sliceRow)[i].setPosition(QVector3D(m_dataArray.at(i)->at(column).z(),
- m_dataArray.at(i)->at(column).y() + adjust,
+ const QRect &sampleSpace = cache->sampleSpace();
+ sliceRow = new QSurfaceDataRow(sampleSpace.height());
+ for (int i = 0; i < sampleSpace.height(); i++) {
+ (*sliceRow)[i].setPosition(QVector3D(dataArray.at(i)->at(column).z(),
+ dataArray.at(i)->at(column).y() + adjust,
-1.0f));
}
}
-
- m_sliceDataArray << sliceRow;
+ sliceDataArray << sliceRow;
// Make a duplicate, so that we get a little bit depth
QSurfaceDataRow *duplicateRow = new QSurfaceDataRow(*sliceRow);
for (int i = 0; i < sliceRow->size(); i++) {
- (*sliceRow)[i].setPosition(QVector3D(sliceRow->at(i).x(), sliceRow->at(i).y() - stepDown,
+ (*sliceRow)[i].setPosition(QVector3D(sliceRow->at(i).x(),
+ sliceRow->at(i).y() - stepDown,
1.0f));
}
-
- m_sliceDataArray << duplicateRow;
+ sliceDataArray << duplicateRow;
QRect sliceRect(0, 0, sliceRow->size(), 2);
-
if (sliceRow->size() > 0) {
- if (!m_sliceSurfaceObj)
- loadSliceSurfaceObj();
-
- if (!m_cachedFlatShading) {
- m_sliceSurfaceObj->setUpSmoothData(m_sliceDataArray, sliceRect, m_heightNormalizer,
- m_axisCacheY.min(), true);
+ if (cache->isFlatShadingEnabled()) {
+ cache->sliceSurfaceObject()->setUpData(sliceDataArray, sliceRect,
+ m_heightNormalizer,
+ m_axisCacheY.min(), true);
} else {
- m_sliceSurfaceObj->setUpData(m_sliceDataArray, sliceRect, m_heightNormalizer,
- m_axisCacheY.min(), true);
+ cache->sliceSurfaceObject()->setUpSmoothData(sliceDataArray, sliceRect,
+ m_heightNormalizer,
+ m_axisCacheY.min(), true);
}
}
}
-QRect Surface3DRenderer::calculateSampleRect(const QSurfaceDataArray &array)
+QRect Surface3DRenderer::calculateSampleRect(SurfaceSeriesRenderCache *cache,
+ const QSurfaceDataArray &array)
{
QRect sampleSpace;
@@ -518,14 +663,17 @@ QRect Surface3DRenderer::calculateSampleRect(const QSurfaceDataArray &array)
m_visibleColumnRange = m_maxVisibleColumnValue - m_minVisibleColumnValue;
m_visibleRowRange = m_maxVisibleRowValue - m_minVisibleRowValue;
- m_surfaceScaleX = m_scaleX * m_visibleColumnRange / m_areaSize.width();
- m_surfaceScaleZ = m_scaleZ * m_visibleRowRange / m_areaSize.height();
+ GLfloat surfaceScaleX = m_scaleX * m_visibleColumnRange / m_areaSize.width();
+ GLfloat surfaceScaleZ = m_scaleZ * m_visibleRowRange / m_areaSize.height();
GLfloat axis2XCenterX = axisMinX + axisMaxX;
GLfloat axis2XCenterZ = axisMinZ + axisMaxZ;
GLfloat data2XCenterX = GLfloat(m_minVisibleColumnValue + m_maxVisibleColumnValue);
GLfloat data2XCenterZ = GLfloat(m_minVisibleRowValue + m_maxVisibleRowValue);
- m_surfaceOffsetX = m_scaleX * (data2XCenterX - axis2XCenterX) / m_areaSize.width();
- m_surfaceOffsetZ = -m_scaleZ * (data2XCenterZ - axis2XCenterZ) / m_areaSize.height();
+ GLfloat surfaceOffsetX = m_scaleX * (data2XCenterX - axis2XCenterX) / m_areaSize.width();
+ GLfloat surfaceOffsetZ = -m_scaleZ * (data2XCenterZ - axis2XCenterZ) / m_areaSize.height();
+
+ cache->setScale(QVector3D(surfaceScaleX, 1.0f, surfaceScaleZ));
+ cache->setOffset(QVector3D(surfaceOffsetX, 0.0f, surfaceOffsetZ));
return sampleSpace;
}
@@ -535,14 +683,15 @@ void Surface3DRenderer::updateScene(Q3DScene *scene)
// Set initial camera position
// X must be 0 for rotation to work - we can use "setCameraRotation" for setting it later
if (m_hasHeightAdjustmentChanged) {
- scene->activeCamera()->setBaseOrientation(cameraDistanceVector, zeroVector, upVector);
+ scene->activeCamera()->d_ptr->setBaseOrientation(cameraDistanceVector, zeroVector,
+ upVector);
// For now this is used just to make things once. Proper use will come
m_hasHeightAdjustmentChanged = false;
}
Abstract3DRenderer::updateScene(scene);
- if (m_selectionPointer && m_selectionActive
+ if (m_selectionActive
&& m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionItem)) {
m_selectionDirty = true; // Ball may need repositioning if scene changes
}
@@ -560,9 +709,16 @@ void Surface3DRenderer::render(GLuint defaultFboHandle)
drawSlicedScene();
// Render selection ball
- if (m_selectionPointer && m_selectionActive
+ if (m_selectionActive
&& m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionItem)) {
- m_selectionPointer->render(defaultFboHandle);
+ foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) {
+ if (cache->slicePointerActive() && cache->renderable() &&
+ m_cachedIsSlicingActivated ) {
+ cache->sliceSelectionPointer()->render(defaultFboHandle);
+ }
+ if (cache->mainPointerActive() && cache->renderable())
+ cache->mainSelectionPointer()->render(defaultFboHandle);
+ }
}
}
@@ -583,8 +739,10 @@ void Surface3DRenderer::drawSlicedScene()
GLfloat aspect = (GLfloat)m_secondarySubViewport.width()
/ (GLfloat)m_secondarySubViewport.height();
- projectionMatrix.ortho(-sliceUnits * aspect, sliceUnits * aspect,
- -sliceUnits, sliceUnits, -1.0f, 4.0f);
+ GLfloat sliceUnitsScaled = sliceUnits / m_autoScaleAdjustment;
+ projectionMatrix.ortho(-sliceUnitsScaled * aspect, sliceUnitsScaled * aspect,
+ -sliceUnitsScaled, sliceUnitsScaled,
+ -1.0f, 4.0f);
// Set view matrix
QMatrix4x4 viewMatrix;
@@ -595,72 +753,85 @@ void Surface3DRenderer::drawSlicedScene()
QMatrix4x4 projectionViewMatrix = projectionMatrix * viewMatrix;
+ const Q3DCamera *activeCamera = m_cachedScene->activeCamera();
+
bool rowMode = m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionRow);
- GLfloat scaleX = 0.0f;
GLfloat scaleXBackground = 0.0f;
- GLfloat offset = 0.0f;
- if (rowMode) {
- scaleX = m_surfaceScaleX;
- scaleXBackground = m_scaleXWithBackground;
- offset = m_surfaceOffsetX;
- } else {
- scaleX = m_surfaceScaleZ;
- scaleXBackground = m_scaleZWithBackground;
- offset = -m_surfaceOffsetZ;
- }
- if (m_surfaceObj) {
- QMatrix4x4 MVPMatrix;
- QMatrix4x4 modelMatrix;
- QMatrix4x4 itModelMatrix;
+ if (m_renderCacheList.size()) {
+ bool drawGrid = false;
- const SeriesRenderCache &series = m_visibleSeriesList.at(0);
+ foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) {
+ if (cache->sliceSurfaceObject()->indexCount() && cache->renderable()) {
+ if (!drawGrid && cache->surfaceGridVisible()) {
+ glEnable(GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset(0.5f, 1.0f);
+ drawGrid = true;
+ }
- modelMatrix.translate(offset, 0.0f, 0.0f);
- QVector3D scaling(scaleX, 1.0f, sliceZScale);
- modelMatrix.scale(scaling);
- itModelMatrix.scale(scaling);
+ GLfloat scaleX = 0.0f;
+ GLfloat offset = 0.0f;
+ if (rowMode) {
+ scaleX = cache->scale().x();
+ scaleXBackground = m_scaleXWithBackground;
+ offset = cache->offset().x();
+ } else {
+ scaleX = cache->scale().z();
+ scaleXBackground = m_scaleZWithBackground;
+ offset = -cache->offset().z();
+ }
- MVPMatrix = projectionViewMatrix * modelMatrix;
+ QMatrix4x4 MVPMatrix;
+ QMatrix4x4 modelMatrix;
+ QMatrix4x4 itModelMatrix;
- if (m_cachedSurfaceVisible) {
- if (m_cachedSurfaceGridOn) {
- glEnable(GL_POLYGON_OFFSET_FILL);
- glPolygonOffset(0.5f, 1.0f);
- }
+ modelMatrix.translate(offset, 0.0f, 0.0f);
+ QVector3D scaling(scaleX, 1.0f, sliceZScale);
+ modelMatrix.scale(scaling);
+ itModelMatrix.scale(scaling);
- ShaderHelper *surfaceShader = m_surfaceShader;
- surfaceShader->bind();
-
- GLuint baseGradientTexture = m_uniformGradientTexture;
- if (series.colorStyle() != Q3DTheme::ColorStyleUniform)
- baseGradientTexture = series.baseGradientTexture();
-
- // Set shader bindings
- surfaceShader->setUniformValue(surfaceShader->lightP(), lightPos);
- surfaceShader->setUniformValue(surfaceShader->view(), viewMatrix);
- surfaceShader->setUniformValue(surfaceShader->model(), modelMatrix);
- surfaceShader->setUniformValue(surfaceShader->nModel(),
- itModelMatrix.inverted().transposed());
- surfaceShader->setUniformValue(surfaceShader->MVP(), MVPMatrix);
- surfaceShader->setUniformValue(surfaceShader->lightS(), 0.15f);
- surfaceShader->setUniformValue(surfaceShader->ambientS(),
- m_cachedTheme->ambientLightStrength() * 2.3f);
- surfaceShader->setUniformValue(surfaceShader->lightColor(), lightColor);
-
- m_drawer->drawObject(surfaceShader, m_sliceSurfaceObj, baseGradientTexture);
+ MVPMatrix = projectionViewMatrix * modelMatrix;
+ cache->setMVPMatrix(MVPMatrix);
+
+ if (cache->surfaceVisible()) {
+ ShaderHelper *surfaceShader = m_surfaceFlatShader;
+ surfaceShader->bind();
+
+ GLuint colorTexture = cache->baseUniformTexture();;
+ if (cache->colorStyle() != Q3DTheme::ColorStyleUniform)
+ colorTexture = cache->baseGradientTexture();
+
+ // Set shader bindings
+ surfaceShader->setUniformValue(surfaceShader->lightP(), lightPos);
+ surfaceShader->setUniformValue(surfaceShader->view(), viewMatrix);
+ surfaceShader->setUniformValue(surfaceShader->model(), modelMatrix);
+ surfaceShader->setUniformValue(surfaceShader->nModel(),
+ itModelMatrix.inverted().transposed());
+ surfaceShader->setUniformValue(surfaceShader->MVP(), MVPMatrix);
+ surfaceShader->setUniformValue(surfaceShader->lightS(), 0.15f);
+ surfaceShader->setUniformValue(surfaceShader->ambientS(),
+ m_cachedTheme->ambientLightStrength() * 2.3f);
+ surfaceShader->setUniformValue(surfaceShader->lightColor(), lightColor);
+
+ m_drawer->drawObject(surfaceShader, cache->sliceSurfaceObject(), colorTexture);
+ }
+ }
}
// Draw surface grid
- if (m_cachedSurfaceGridOn) {
+ if (drawGrid) {
+ glDisable(GL_POLYGON_OFFSET_FILL);
m_surfaceGridShader->bind();
m_surfaceGridShader->setUniformValue(m_surfaceGridShader->color(),
Utils::vectorFromColor(m_cachedTheme->gridLineColor()));
- m_surfaceGridShader->setUniformValue(m_surfaceGridShader->MVP(), MVPMatrix);
- m_drawer->drawSurfaceGrid(m_surfaceGridShader, m_sliceSurfaceObj);
-
- glDisable(GL_POLYGON_OFFSET_FILL);
+ foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) {
+ if (cache->sliceSurfaceObject()->indexCount() && cache->isSeriesVisible() &&
+ cache->surfaceGridVisible()) {
+ m_surfaceGridShader->setUniformValue(m_surfaceGridShader->MVP(), cache->MVPMatrix());
+ m_drawer->drawSurfaceGrid(m_surfaceGridShader, cache->sliceSurfaceObject());
+ }
+ }
}
}
@@ -756,7 +927,7 @@ void Surface3DRenderer::drawSlicedScene()
}
}
- // Draw axis labels
+ // Draw labels
m_labelShader->bind();
glEnable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);
@@ -781,7 +952,7 @@ void Surface3DRenderer::drawSlicedScene()
m_dummyRenderItem.setTranslation(labelTrans);
m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix,
positionComp, rotation, 0, m_cachedSelectionMode, m_labelShader,
- m_labelObj, m_cachedScene->activeCamera(),
+ m_labelObj, activeCamera,
true, true, Drawer::LabelMid, Qt::AlignRight, true);
}
labelNbr++;
@@ -822,13 +993,35 @@ void Surface3DRenderer::drawSlicedScene()
m_drawer->drawLabel(m_dummyRenderItem, *axisLabelItem, viewMatrix, projectionMatrix,
positionComp, rotation, 0, QAbstract3DGraph::SelectionRow,
- m_labelShader, m_labelObj, m_cachedScene->activeCamera(),
+ m_labelShader, m_labelObj, activeCamera,
false, false, Drawer::LabelBelow, Qt::AlignBottom, true);
}
labelNbr++;
labelPos += posStep;
}
+ // Draw labels for axes
+ AbstractRenderItem *dummyItem(0);
+ positionComp.setY(m_autoScaleAdjustment);
+ if (rowMode) {
+ m_drawer->drawLabel(*dummyItem, m_axisCacheX.titleItem(), viewMatrix, projectionMatrix,
+ positionComp, zeroVector, 0, m_cachedSelectionMode, m_labelShader,
+ m_labelObj, activeCamera, false, false, Drawer::LabelBottom,
+ Qt::AlignCenter, true);
+ } else {
+ m_drawer->drawLabel(*dummyItem, m_axisCacheZ.titleItem(), viewMatrix, projectionMatrix,
+ positionComp, zeroVector, 0, m_cachedSelectionMode, m_labelShader,
+ m_labelObj, activeCamera, false, false, Drawer::LabelBottom,
+ Qt::AlignCenter, true);
+ }
+ // Y-axis label
+ labelTrans = QVector3D(-scaleXBackground - labelMargin, 0.0f, 0.0f);
+ m_dummyRenderItem.setTranslation(labelTrans);
+ m_drawer->drawLabel(m_dummyRenderItem, m_axisCacheY.titleItem(), viewMatrix,
+ projectionMatrix, zeroVector, QVector3D(0.0f, 0.0f, 90.0f), 0,
+ m_cachedSelectionMode, m_labelShader, m_labelObj, activeCamera,
+ false, false, Drawer::LabelMid, Qt::AlignHCenter);
+
glDisable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
@@ -839,6 +1032,8 @@ void Surface3DRenderer::drawSlicedScene()
void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
{
+ bool noShadows = true;
+
GLfloat backgroundRotation = 0;
QVector3D lightColor = Utils::vectorFromColor(m_cachedTheme->lightColor());
@@ -847,15 +1042,15 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
m_primarySubViewport.width(),
m_primarySubViewport.height());
- // Specify viewport
-
// Set up projection matrix
QMatrix4x4 projectionMatrix;
projectionMatrix.perspective(45.0f, (GLfloat)m_primarySubViewport.width()
/ (GLfloat)m_primarySubViewport.height(), 0.1f, 100.0f);
+ const Q3DCamera *activeCamera = m_cachedScene->activeCamera();
+
// Calculate view matrix
- QMatrix4x4 viewMatrix = m_cachedScene->activeCamera()->viewMatrix();
+ QMatrix4x4 viewMatrix = activeCamera->d_ptr->viewMatrix();
QMatrix4x4 projectionViewMatrix = projectionMatrix * viewMatrix;
@@ -885,14 +1080,10 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
QMatrix4x4 depthProjectionMatrix;
QMatrix4x4 depthProjectionViewMatrix;
- QVector3D surfaceScaler(m_surfaceScaleX, 1.0f, m_surfaceScaleZ);
- QVector3D surfaceOffset(m_surfaceOffsetX, 0.0f, m_surfaceOffsetZ);
-
// Draw depth buffer
#if !defined(QT_OPENGL_ES_2)
GLfloat adjustedLightStrength = m_cachedTheme->lightStrength() / 10.0f;
- if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone && m_surfaceObj
- && m_cachedSurfaceVisible) {
+ if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone && m_renderCacheList.size()) {
// Render scene into a depth texture for using with shadow mapping
// Enable drawing to depth framebuffer
glBindFramebuffer(GL_FRAMEBUFFER, m_depthFrameBuffer);
@@ -912,47 +1103,44 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
// Get the depth view matrix
// It may be possible to hack lightPos here if we want to make some tweaks to shadow
- QVector3D depthLightPos = m_cachedScene->activeCamera()->calculatePositionRelativeToCamera(
- zeroVector, 0.0f, 3.5f / m_autoScaleAdjustment);
+ QVector3D depthLightPos = activeCamera->d_ptr->calculatePositionRelativeToCamera(
+ zeroVector, 0.0f, 4.0f / m_autoScaleAdjustment);
depthViewMatrix.lookAt(depthLightPos, zeroVector, upVector);
// Set the depth projection matrix
-#ifndef USE_WIDER_SHADOWS
- // Use this for perspective shadows
depthProjectionMatrix.perspective(10.0f, (GLfloat)m_primarySubViewport.width()
/ (GLfloat)m_primarySubViewport.height(), 3.0f, 100.0f);
-#else
- // Use these for orthographic shadows
- depthProjectionMatrix.ortho(-2.0f * 2.0f, 2.0f * 2.0f,
- -2.0f, 2.0f,
- 0.0f, 100.0f);
-#endif
depthProjectionViewMatrix = depthProjectionMatrix * depthViewMatrix;
glDisable(GL_CULL_FACE);
- QMatrix4x4 modelMatrix;
- QMatrix4x4 MVPMatrix;
-
- modelMatrix.translate(surfaceOffset);
- modelMatrix.scale(surfaceScaler);
-
- MVPMatrix = depthProjectionViewMatrix * modelMatrix;
+ foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) {
+ SurfaceObject *object = cache->surfaceObject();
+ if (object->indexCount() && cache->surfaceVisible() && cache->isSeriesVisible()
+ && cache->sampleSpace().width() >= 2 && cache->sampleSpace().height() >= 2) {
+ QMatrix4x4 modelMatrix;
+ QMatrix4x4 MVPMatrix;
- m_depthShader->setUniformValue(m_depthShader->MVP(), MVPMatrix);
+ modelMatrix.translate(cache->offset());
+ modelMatrix.scale(cache->scale());
+ MVPMatrix = depthProjectionViewMatrix * modelMatrix;
+ cache->setMVPMatrix(MVPMatrix);
+ m_depthShader->setUniformValue(m_depthShader->MVP(), MVPMatrix);
- // 1st attribute buffer : vertices
- glEnableVertexAttribArray(m_depthShader->posAtt());
- glBindBuffer(GL_ARRAY_BUFFER, m_surfaceObj->vertexBuf());
- glVertexAttribPointer(m_depthShader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0,
- (void *)0);
+ // 1st attribute buffer : vertices
+ glEnableVertexAttribArray(m_depthShader->posAtt());
+ glBindBuffer(GL_ARRAY_BUFFER, object->vertexBuf());
+ glVertexAttribPointer(m_depthShader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0,
+ (void *)0);
- // Index buffer
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_surfaceObj->elementBuf());
+ // Index buffer
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, object->elementBuf());
- // Draw the triangles
- glDrawElements(GL_TRIANGLES, m_surfaceObj->indexCount(), m_surfaceObj->indicesType(),
- (void *)0);
+ // Draw the triangles
+ glDrawElements(GL_TRIANGLES, object->indexCount(),
+ object->indicesType(), (void *)0);
+ }
+ }
glEnable(GL_CULL_FACE);
glCullFace(GL_FRONT);
@@ -961,9 +1149,26 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
m_depthModelTexture, 0);
glClear(GL_DEPTH_BUFFER_BIT);
- // Draw the triangles
- glDrawElements(GL_TRIANGLES, m_surfaceObj->indexCount(), m_surfaceObj->indicesType(),
- (void *)0);
+ foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) {
+ SurfaceObject *object = cache->surfaceObject();
+ if (object->indexCount() && cache->surfaceVisible() && cache->isSeriesVisible()
+ && cache->sampleSpace().width() >= 2 && cache->sampleSpace().height() >= 2) {
+ m_depthShader->setUniformValue(m_depthShader->MVP(), cache->MVPMatrix());
+
+ // 1st attribute buffer : vertices
+ glEnableVertexAttribArray(m_depthShader->posAtt());
+ glBindBuffer(GL_ARRAY_BUFFER, object->vertexBuf());
+ glVertexAttribPointer(m_depthShader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0,
+ (void *)0);
+
+ // Index buffer
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, object->elementBuf());
+
+ // Draw the triangles
+ glDrawElements(GL_TRIANGLES, object->indexCount(),
+ object->indicesType(), (void *)0);
+ }
+ }
// Free buffers
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
@@ -989,10 +1194,8 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
glEnable(GL_TEXTURE_2D);
// Draw selection buffer
- if (!m_cachedIsSlicingActivated && m_surfaceObj && m_selectionState == SelectOnScene
- && m_cachedSelectionMode > QAbstract3DGraph::SelectionNone
- && (m_cachedSurfaceVisible || m_cachedSurfaceGridOn)
- && m_visibleSeriesList.size() > 0) {
+ if (!m_cachedIsSlicingActivated && m_renderCacheList.size() && m_selectionState == SelectOnScene
+ && m_cachedSelectionMode > QAbstract3DGraph::SelectionNone) {
m_selectionShader->bind();
glBindFramebuffer(GL_FRAMEBUFFER, m_selectionFrameBuffer);
glViewport(0,
@@ -1007,17 +1210,21 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
glDisable(GL_CULL_FACE);
- QMatrix4x4 modelMatrix;
- QMatrix4x4 MVPMatrix;
-
- modelMatrix.translate(surfaceOffset);
- modelMatrix.scale(surfaceScaler);
+ foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) {
+ if (cache->surfaceObject()->indexCount() && cache->renderable()) {
+ QMatrix4x4 modelMatrix;
+ QMatrix4x4 MVPMatrix;
- MVPMatrix = projectionViewMatrix * modelMatrix;
+ modelMatrix.translate(cache->offset());
+ modelMatrix.scale(cache->scale());
- m_selectionShader->setUniformValue(m_selectionShader->MVP(), MVPMatrix);
+ MVPMatrix = projectionViewMatrix * modelMatrix;
+ m_selectionShader->setUniformValue(m_selectionShader->MVP(), MVPMatrix);
- m_drawer->drawObject(m_selectionShader, m_surfaceObj, m_selectionTexture);
+ m_drawer->drawObject(m_selectionShader, cache->surfaceObject(),
+ cache->selectionTexture());
+ }
+ }
glEnable(GL_DITHER);
@@ -1035,7 +1242,6 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
#endif
m_clickedPosition = selectionIdToSurfacePoint(selectionId);
- m_clickedSeries = m_visibleSeriesList.at(0).series();
emit needRender();
@@ -1047,81 +1253,102 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
}
// Draw the surface
- if (m_surfaceObj && m_sampleSpace.width() >= 2 && m_sampleSpace.height() >= 2) {
- m_surfaceShader->bind();
+ if (m_renderCacheList.size()) {
// For surface we can see climpses from underneath
glDisable(GL_CULL_FACE);
- if (m_cachedSurfaceGridOn) {
- glEnable(GL_POLYGON_OFFSET_FILL);
- glPolygonOffset(0.5f, 1.0f);
- }
- QMatrix4x4 modelMatrix;
- QMatrix4x4 MVPMatrix;
- QMatrix4x4 itModelMatrix;
+ bool drawGrid = false;
+
+ foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) {
+ QMatrix4x4 modelMatrix;
+ QMatrix4x4 MVPMatrix;
+ QMatrix4x4 itModelMatrix;
- modelMatrix.translate(surfaceOffset);
- modelMatrix.scale(surfaceScaler);
- itModelMatrix.scale(surfaceScaler);
+ modelMatrix.translate(cache->offset());
+ modelMatrix.scale(cache->scale());
+ itModelMatrix.scale(cache->scale());
#ifdef SHOW_DEPTH_TEXTURE_SCENE
- MVPMatrix = depthProjectionViewMatrix * modelMatrix;
+ MVPMatrix = depthProjectionViewMatrix * modelMatrix;
#else
- MVPMatrix = projectionViewMatrix * modelMatrix;
+ MVPMatrix = projectionViewMatrix * modelMatrix;
#endif
+ cache->setMVPMatrix(MVPMatrix);
+
+ const QRect &sampleSpace = cache->sampleSpace();
+ if (cache->surfaceObject()->indexCount() && cache->isSeriesVisible() &&
+ sampleSpace.width() >= 2 && sampleSpace.height() >= 2) {
+ noShadows = false;
+ if (!drawGrid && cache->surfaceGridVisible()) {
+ glEnable(GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset(0.5f, 1.0f);
+ drawGrid = true;
+ }
- if (m_cachedSurfaceVisible) {
- // Set shader bindings
- m_surfaceShader->setUniformValue(m_surfaceShader->lightP(), lightPos);
- m_surfaceShader->setUniformValue(m_surfaceShader->view(), viewMatrix);
- m_surfaceShader->setUniformValue(m_surfaceShader->model(), modelMatrix);
- m_surfaceShader->setUniformValue(m_surfaceShader->nModel(),
- itModelMatrix.inverted().transposed());
- m_surfaceShader->setUniformValue(m_surfaceShader->MVP(), MVPMatrix);
- m_surfaceShader->setUniformValue(m_surfaceShader->ambientS(),
- m_cachedTheme->ambientLightStrength());
- m_surfaceShader->setUniformValue(m_surfaceShader->lightColor(), lightColor);
-
- GLuint gradientTexture;
- if (m_visibleSeriesList.at(0).colorStyle() == Q3DTheme::ColorStyleUniform)
- gradientTexture = m_uniformGradientTexture;
- else
- gradientTexture = m_visibleSeriesList.at(0).baseGradientTexture();
+ if (cache->surfaceVisible()) {
+ ShaderHelper *shader = m_surfaceFlatShader;
+ if (!cache->isFlatShadingEnabled())
+ shader = m_surfaceSmoothShader;
+ shader->bind();
+
+ // Set shader bindings
+ shader->setUniformValue(shader->lightP(), lightPos);
+ shader->setUniformValue(shader->view(), viewMatrix);
+ shader->setUniformValue(shader->model(), modelMatrix);
+ shader->setUniformValue(shader->nModel(),
+ itModelMatrix.inverted().transposed());
+ shader->setUniformValue(shader->MVP(), MVPMatrix);
+ shader->setUniformValue(shader->ambientS(),
+ m_cachedTheme->ambientLightStrength());
+ shader->setUniformValue(shader->lightColor(), lightColor);
-#if !defined(QT_OPENGL_ES_2)
- if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) {
- // Set shadow shader bindings
- QMatrix4x4 depthMVPMatrix = depthProjectionViewMatrix * modelMatrix;
- m_surfaceShader->setUniformValue(m_surfaceShader->shadowQ(),
- m_shadowQualityToShader);
- m_surfaceShader->setUniformValue(m_surfaceShader->depth(), depthMVPMatrix);
- m_surfaceShader->setUniformValue(m_surfaceShader->lightS(), adjustedLightStrength);
+ GLuint gradientTexture;
+ if (cache->colorStyle() == Q3DTheme::ColorStyleUniform)
+ gradientTexture = cache->baseUniformTexture();
+ else
+ gradientTexture = cache->baseGradientTexture();
- // Draw the object
- m_drawer->drawObject(m_surfaceShader, m_surfaceObj, gradientTexture,
- m_depthModelTexture);
- } else
+#if !defined(QT_OPENGL_ES_2)
+ if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) {
+ // Set shadow shader bindings
+ QMatrix4x4 depthMVPMatrix = depthProjectionViewMatrix * modelMatrix;
+ shader->setUniformValue(shader->shadowQ(), m_shadowQualityToShader);
+ shader->setUniformValue(shader->depth(), depthMVPMatrix);
+ shader->setUniformValue(shader->lightS(), adjustedLightStrength);
+
+ // Draw the objects
+ m_drawer->drawObject(shader, cache->surfaceObject(), gradientTexture,
+ m_depthModelTexture);
+ } else
#endif
- {
- // Set shadowless shader bindings
- m_surfaceShader->setUniformValue(m_surfaceShader->lightS(),
- m_cachedTheme->lightStrength());
+ {
+ // Set shadowless shader bindings
+ shader->setUniformValue(shader->lightS(),
+ m_cachedTheme->lightStrength());
- // Draw the object
- m_drawer->drawObject(m_surfaceShader, m_surfaceObj, gradientTexture);
+ // Draw the objects
+ m_drawer->drawObject(shader, cache->surfaceObject(), gradientTexture);
+ }
+ }
}
- glEnable(GL_CULL_FACE);
}
+ glEnable(GL_CULL_FACE);
// Draw surface grid
- if (m_cachedSurfaceGridOn) {
+ if (drawGrid) {
+ glDisable(GL_POLYGON_OFFSET_FILL);
m_surfaceGridShader->bind();
m_surfaceGridShader->setUniformValue(m_surfaceGridShader->color(),
Utils::vectorFromColor(m_cachedTheme->gridLineColor()));
- m_surfaceGridShader->setUniformValue(m_surfaceGridShader->MVP(), MVPMatrix);
- m_drawer->drawSurfaceGrid(m_surfaceGridShader, m_surfaceObj);
+ foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) {
+ m_surfaceGridShader->setUniformValue(m_surfaceGridShader->MVP(), cache->MVPMatrix());
- glDisable(GL_POLYGON_OFFSET_FILL);
+ const QRect &sampleSpace = cache->sampleSpace();
+ if (cache->surfaceObject()->indexCount() && cache->surfaceGridVisible() &&
+ cache->isSeriesVisible() && sampleSpace.width() >= 2 && sampleSpace.height() >= 2) {
+ m_drawer->drawSurfaceGrid(m_surfaceGridShader, cache->surfaceObject());
+ }
+ }
}
}
@@ -1177,10 +1404,14 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
m_backgroundShader->setUniformValue(m_backgroundShader->depth(), depthMVPMatrix);
m_backgroundShader->setUniformValue(m_backgroundShader->lightS(),
adjustedLightStrength);
-
// Draw the object
- m_drawer->drawObject(m_backgroundShader, m_backgroundObj, 0, m_depthTexture);
+ if (noShadows)
+ m_drawer->drawObject(m_backgroundShader, m_backgroundObj, 0, m_noShadowTexture);
+ else
+ m_drawer->drawObject(m_backgroundShader, m_backgroundObj, 0, m_depthTexture);
} else
+#else
+ Q_UNUSED(noShadows);
#endif
{
// Set shadowless shader bindings
@@ -1565,7 +1796,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix,
positionZComp, rotation, 0, m_cachedSelectionMode,
- m_labelShader, m_labelObj, m_cachedScene->activeCamera(),
+ m_labelShader, m_labelObj, activeCamera,
true, true, Drawer::LabelMid, alignment);
}
labelNbr++;
@@ -1611,7 +1842,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix,
positionZComp, rotation, 0, m_cachedSelectionMode,
- m_labelShader, m_labelObj, m_cachedScene->activeCamera(),
+ m_labelShader, m_labelObj, activeCamera,
true, true, Drawer::LabelMid, alignment);
}
labelNbr++;
@@ -1671,7 +1902,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
m_dummyRenderItem.setTranslation(labelTransBack);
m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix,
positionZComp, labelRotateVectorBack, 0, m_cachedSelectionMode,
- m_labelShader, m_labelObj, m_cachedScene->activeCamera(),
+ m_labelShader, m_labelObj, activeCamera,
true, true, Drawer::LabelMid, alignmentBack);
// Side wall
@@ -1679,7 +1910,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
m_dummyRenderItem.setTranslation(labelTransSide);
m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix,
positionZComp, labelRotateVectorSide, 0, m_cachedSelectionMode,
- m_labelShader, m_labelObj, m_cachedScene->activeCamera(),
+ m_labelShader, m_labelObj, activeCamera,
true, true, Drawer::LabelMid, alignmentSide);
}
labelNbr++;
@@ -1697,12 +1928,17 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
// Selection handling
if (m_selectionDirty || m_selectionLabelDirty) {
QPoint visiblePoint = Surface3DController::invalidSelectionPosition();
- if (m_selectedPoint != Surface3DController::invalidSelectionPosition()) {
- int x = m_selectedPoint.x() - m_sampleSpace.y();
- int y = m_selectedPoint.y() - m_sampleSpace.x();
- if (x >= 0 && y >= 0 && x < m_sampleSpace.height() && y < m_sampleSpace.width()
- && m_dataArray.size()) {
- visiblePoint = QPoint(x, y);
+ if (m_selectedSeries) {
+ SurfaceSeriesRenderCache *cache =
+ m_renderCacheList.value(const_cast<QSurface3DSeries *>(m_selectedSeries));
+ if (cache && m_selectedPoint != Surface3DController::invalidSelectionPosition()) {
+ const QRect &sampleSpace = cache->sampleSpace();
+ int x = m_selectedPoint.x() - sampleSpace.y();
+ int y = m_selectedPoint.y() - sampleSpace.x();
+ if (x >= 0 && y >= 0 && x < sampleSpace.height() && y < sampleSpace.width()
+ && cache->dataArray().size()) {
+ visiblePoint = QPoint(x, y);
+ }
}
}
@@ -1721,47 +1957,65 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
}
}
-// This one needs to be called when the data size changes
-void Surface3DRenderer::updateSelectionTexture()
+void Surface3DRenderer::updateSelectionMode(QAbstract3DGraph::SelectionFlags mode)
+{
+ Abstract3DRenderer::updateSelectionMode(mode);
+
+ if (m_cachedSelectionMode > QAbstract3DGraph::SelectionNone)
+ updateSelectionTextures();
+}
+
+void Surface3DRenderer::updateSelectionTextures()
+{
+ uint lastSelectionId = 1;
+
+ foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) {
+ GLuint texture = cache->selectionTexture();
+ m_textureHelper->deleteTexture(&texture);
+ createSelectionTexture(cache, lastSelectionId);
+ }
+ m_selectionTexturesDirty = false;
+}
+
+void Surface3DRenderer::createSelectionTexture(SurfaceSeriesRenderCache *cache,
+ uint &lastSelectionId)
{
// Create the selection ID image. Each grid corner gets 2x2 pixel area of
// ID color so that each vertex (data point) has 4x4 pixel area of ID color
- int idImageWidth = (m_sampleSpace.width() - 1) * 4;
- int idImageHeight = (m_sampleSpace.height() - 1) * 4;
+ const QRect &sampleSpace = cache->sampleSpace();
+ int idImageWidth = (sampleSpace.width() - 1) * 4;
+ int idImageHeight = (sampleSpace.height() - 1) * 4;
int stride = idImageWidth * 4 * sizeof(uchar); // 4 = number of color components (rgba)
+ uint idStart = lastSelectionId;
uchar *bits = new uchar[idImageWidth * idImageHeight * 4 * sizeof(uchar)];
- uint id = 1;
for (int i = 0; i < idImageHeight; i += 4) {
for (int j = 0; j < idImageWidth; j += 4) {
int p = (i * idImageWidth + j) * 4;
uchar r, g, b, a;
- idToRGBA(id, &r, &g, &b, &a);
+ idToRGBA(lastSelectionId, &r, &g, &b, &a);
fillIdCorner(&bits[p], r, g, b, a, stride);
- idToRGBA(id + 1, &r, &g, &b, &a);
+ idToRGBA(lastSelectionId + 1, &r, &g, &b, &a);
fillIdCorner(&bits[p + 8], r, g, b, a, stride);
- idToRGBA(id + m_sampleSpace.width(), &r, &g, &b, &a);
+ idToRGBA(lastSelectionId + sampleSpace.width(), &r, &g, &b, &a);
fillIdCorner(&bits[p + 2 * stride], r, g, b, a, stride);
- idToRGBA(id + m_sampleSpace.width() + 1, &r, &g, &b, &a);
+ idToRGBA(lastSelectionId + sampleSpace.width() + 1, &r, &g, &b, &a);
fillIdCorner(&bits[p + 2 * stride + 8], r, g, b, a, stride);
- id++;
+ lastSelectionId++;
}
- id++;
- }
-
- // If old texture exists, delete it
- if (m_selectionTexture) {
- m_textureHelper->deleteTexture(&m_selectionTexture);
- m_selectionTexture = 0;
+ lastSelectionId++;
}
+ lastSelectionId += sampleSpace.width();
+ cache->setSelectionIdRange(idStart, lastSelectionId - 1);
// Move the ID image (bits) to the texture
QImage image = QImage(bits, idImageWidth, idImageHeight, QImage::Format_RGB32);
- m_selectionTexture = m_textureHelper->create2DTexture(image, false, false, false);
+ GLuint selectionTexture = m_textureHelper->create2DTexture(image, false, false, false);
+ cache->setSelectionTexture(selectionTexture);
// Release the temp bits allocation
delete[] bits;
@@ -1821,33 +2075,30 @@ void Surface3DRenderer::calculateSceneScalingFactors()
m_scaleZWithBackground = m_scaleZ * backgroundMargin;
}
-bool Surface3DRenderer::updateFlatStatus(bool enable)
+void Surface3DRenderer::checkFlatSupport(SurfaceSeriesRenderCache *cache)
{
- if (enable && !m_flatSupported) {
+ bool flatEnable = cache->isFlatShadingEnabled();
+ if (flatEnable && !m_flatSupported) {
qWarning() << "Warning: Flat qualifier not supported on your platform's GLSL language."
" Requires at least GLSL version 1.2 with GL_EXT_gpu_shader4 extension.";
- enable = false;
+ cache->setFlatShadingEnabled(false);
+ cache->setFlatChangeAllowed(false);
}
+}
- bool changed = false;
- if (enable != m_cachedFlatShading) {
- m_cachedFlatShading = enable;
- changed = true;
- initSurfaceShaders();
- }
+void Surface3DRenderer::updateObjects(SurfaceSeriesRenderCache *cache, bool dimensionChanged)
+{
+ QSurfaceDataArray &dataArray = cache->dataArray();
+ const QRect &sampleSpace = cache->sampleSpace();
- // If no surface object created yet, don't try to update the object
- if (m_surfaceObj && changed && m_sampleSpace.width() >= 2 && m_sampleSpace.height() >= 2) {
- if (!m_cachedFlatShading) {
- m_surfaceObj->setUpSmoothData(m_dataArray, m_sampleSpace, m_heightNormalizer,
- m_axisCacheY.min(), true);
- } else {
- m_surfaceObj->setUpData(m_dataArray, m_sampleSpace, m_heightNormalizer,
- m_axisCacheY.min(), true);
- }
- }
- return m_cachedFlatShading;
+ if (cache->isFlatShadingEnabled()) {
+ cache->surfaceObject()->setUpData(dataArray, sampleSpace, m_heightNormalizer,
+ m_axisCacheY.min(), dimensionChanged);
+ } else {
+ cache->surfaceObject()->setUpSmoothData(dataArray, sampleSpace, m_heightNormalizer,
+ m_axisCacheY.min(), dimensionChanged);
+ }
}
void Surface3DRenderer::updateSelectedPoint(const QPoint &position, const QSurface3DSeries *series)
@@ -1863,11 +2114,6 @@ void Surface3DRenderer::resetClickedStatus()
m_clickedSeries = 0;
}
-void Surface3DRenderer::updateSurfaceGridStatus(bool enable)
-{
- m_cachedSurfaceGridOn = enable;
-}
-
void Surface3DRenderer::loadBackgroundMesh()
{
if (m_backgroundObj)
@@ -1876,20 +2122,6 @@ void Surface3DRenderer::loadBackgroundMesh()
m_backgroundObj->load();
}
-void Surface3DRenderer::loadSurfaceObj()
-{
- if (m_surfaceObj)
- delete m_surfaceObj;
- m_surfaceObj = new SurfaceObject();
-}
-
-void Surface3DRenderer::loadSliceSurfaceObj()
-{
- if (m_sliceSurfaceObj)
- delete m_sliceSurfaceObj;
- m_sliceSurfaceObj = new SurfaceObject();
-}
-
void Surface3DRenderer::loadGridLineMesh()
{
if (m_gridLineObj)
@@ -1900,56 +2132,132 @@ void Surface3DRenderer::loadGridLineMesh()
void Surface3DRenderer::surfacePointSelected(const QPoint &point)
{
+ foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) {
+ cache->setSlicePointerActivity(false);
+ cache->setMainPointerActivity(false);
+ }
+
+ if (m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionMultiSeries)) {
+ // Find axis coordinates for the selected point
+ SurfaceSeriesRenderCache *selectedCache =
+ m_renderCacheList.value(const_cast<QSurface3DSeries *>(m_selectedSeries));
+ QSurfaceDataArray &dataArray = selectedCache->dataArray();
+ QSurfaceDataItem item = dataArray.at(point.x())->at(point.y());
+ QPointF coords(item.x(), item.z());
+
+ foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) {
+ if (cache->series() != m_selectedSeries) {
+ QPoint mappedPoint = mapCoordsToSampleSpace(cache, coords);
+ updateSelectionPoint(cache, mappedPoint, false);
+ } else {
+ updateSelectionPoint(cache, point, true);
+ }
+ }
+ } else {
+ if (m_selectedSeries) {
+ SurfaceSeriesRenderCache *cache =
+ m_renderCacheList.value(const_cast<QSurface3DSeries *>(m_selectedSeries));
+ if (cache)
+ updateSelectionPoint(cache, point, true);
+ }
+ }
+}
+
+void Surface3DRenderer::updateSelectionPoint(SurfaceSeriesRenderCache *cache, const QPoint &point,
+ bool label)
+{
int row = point.x();
int column = point.y();
- float value = m_dataArray.at(row)->at(column).y();
+ if (column < 0 || row < 0)
+ return;
+
+ QSurfaceDataArray &dataArray = cache->dataArray();
+ float value = dataArray.at(row)->at(column).y();
+
+ SelectionPointer *slicePointer = cache->sliceSelectionPointer();
+ if (!slicePointer && m_cachedIsSlicingActivated) {
+ slicePointer = new SelectionPointer(m_drawer);
+ cache->setSliceSelectionPointer(slicePointer);
+ }
+ SelectionPointer *mainPointer = cache->mainSelectionPointer();
+ if (!mainPointer) {
+ mainPointer = new SelectionPointer(m_drawer);
+ cache->setMainSelectionPointer(mainPointer);
+ }
- if (!m_selectionPointer)
- m_selectionPointer = new SelectionPointer(m_drawer);
+ const QVector3D &scale = cache->scale();
+ const QVector3D &offset = cache->offset();
+ QString selectionLabel;
+ if (label)
+ selectionLabel = createSelectionLabel(cache, value, column, row);
- QVector3D pos;
if (m_cachedIsSlicingActivated) {
+ QVector3D subPos;
if (m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionRow)) {
- pos = m_sliceSurfaceObj->vertexAt(column, 0);
- pos *= QVector3D(m_surfaceScaleX, 1.0f, 0.0f);
- pos += QVector3D(m_surfaceOffsetX, 0.0f, 0.0f);
- m_selectionPointer->updateBoundingRect(m_secondarySubViewport);
- m_selectionPointer->updateSliceData(true, m_autoScaleAdjustment);
+ subPos = cache->sliceSurfaceObject()->vertexAt(column, 0);
+ subPos *= QVector3D(scale.x(), 1.0f, 0.0f);
+ subPos += QVector3D(offset.x(), 0.0f, 0.0f);
} else if (m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionColumn)) {
- pos = m_sliceSurfaceObj->vertexAt(row, 0);
- pos *= QVector3D(m_surfaceScaleZ, 1.0f, 0.0f);
- pos += QVector3D(-m_surfaceOffsetZ, 0.0f, 0.0f);
- m_selectionPointer->updateBoundingRect(m_secondarySubViewport);
- m_selectionPointer->updateSliceData(true, m_autoScaleAdjustment);
+ subPos = cache->sliceSurfaceObject()->vertexAt(row, 0);
+ subPos *= QVector3D(scale.z(), 1.0f, 0.0f);
+ subPos += QVector3D(-offset.z(), 0.0f, 0.0f);
}
- } else {
- pos = m_surfaceObj->vertexAt(column, row);
- pos *= QVector3D(m_surfaceScaleX, 1.0f, m_surfaceScaleZ);;
- pos += QVector3D(m_surfaceOffsetX, 0.0f, m_surfaceOffsetZ);
- m_selectionPointer->updateBoundingRect(m_primarySubViewport);
- m_selectionPointer->updateSliceData(false, m_autoScaleAdjustment);
- }
-
- m_selectionPointer->setPosition(pos);
- m_selectionPointer->setLabel(createSelectionLabel(value, column, row));
- m_selectionPointer->setPointerObject(m_visibleSeriesList.at(0).object());
- m_selectionPointer->setHighlightColor(m_visibleSeriesList.at(0).singleHighlightColor());
- m_selectionPointer->updateScene(m_cachedScene);
- m_selectionPointer->setRotation(m_visibleSeriesList.at(0).meshRotation());
+ slicePointer->updateBoundingRect(m_secondarySubViewport);
+ slicePointer->updateSliceData(true, m_autoScaleAdjustment);
+ slicePointer->setPosition(subPos);
+ slicePointer->setLabel(selectionLabel);
+ slicePointer->setPointerObject(cache->object());
+ slicePointer->setHighlightColor(cache->singleHighlightColor());
+ slicePointer->updateScene(m_cachedScene);
+ slicePointer->setRotation(cache->meshRotation());
+ cache->setSlicePointerActivity(true);
+ }
+
+ QVector3D mainPos;
+ mainPos = cache->surfaceObject()->vertexAt(column, row);
+ mainPos *= scale;
+ mainPos += offset;
+ mainPointer->updateBoundingRect(m_primarySubViewport);
+ mainPointer->updateSliceData(false, m_autoScaleAdjustment);
+ mainPointer->setPosition(mainPos);
+ mainPointer->setLabel(selectionLabel);
+ mainPointer->setPointerObject(cache->object());
+ mainPointer->setHighlightColor(cache->singleHighlightColor());
+ mainPointer->updateScene(m_cachedScene);
+ mainPointer->setRotation(cache->meshRotation());
+ cache->setMainPointerActivity(true);
}
// Maps selection Id to surface point in data array
QPoint Surface3DRenderer::selectionIdToSurfacePoint(uint id)
{
- int column = ((id - 1) % m_sampleSpace.width()) + m_sampleSpace.x();
- int row = ((id - 1) / m_sampleSpace.width()) + m_sampleSpace.y();
+ SurfaceSeriesRenderCache *selectedCache = 0;
+ foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) {
+ if (cache->isWithinIdRange(id)) {
+ selectedCache = cache;
+ break;
+ }
+ }
+ if (!selectedCache) {
+ m_clickedSeries = 0;
+ return Surface3DController::invalidSelectionPosition();
+ }
+
+ uint idInSeries = id - selectedCache->selectionIdStart() + 1;
+ const QRect &sampleSpace = selectedCache->sampleSpace();
+ int column = ((idInSeries - 1) % sampleSpace.width()) + sampleSpace.x();
+ int row = ((idInSeries - 1) / sampleSpace.width()) + sampleSpace.y();
+
+ m_clickedSeries = selectedCache->series();
return QPoint(row, column);
}
-QString Surface3DRenderer::createSelectionLabel(float value, int column, int row)
+QString Surface3DRenderer::createSelectionLabel(SurfaceSeriesRenderCache *cache, float value,
+ int column, int row)
{
- QString labelText = m_visibleSeriesList[0].itemLabelFormat();
+ QSurfaceDataArray &dataArray = cache->dataArray();
+ QString labelText = cache->itemLabelFormat();
static const QString xTitleTag(QStringLiteral("@xTitle"));
static const QString yTitleTag(QStringLiteral("@yTitle"));
static const QString zTitleTag(QStringLiteral("@zTitle"));
@@ -1967,7 +2275,7 @@ QString Surface3DRenderer::createSelectionLabel(float value, int column, int row
if (labelFormat.isEmpty())
labelFormat = Utils::defaultLabelFormat();
QString valueLabelText = generateValueLabel(labelFormat,
- m_dataArray.at(row)->at(column).x());
+ dataArray.at(row)->at(column).x());
labelText.replace(xLabelTag, valueLabelText);
}
if (labelText.contains(yLabelTag)) {
@@ -1982,11 +2290,11 @@ QString Surface3DRenderer::createSelectionLabel(float value, int column, int row
if (labelFormat.isEmpty())
labelFormat = Utils::defaultLabelFormat();
QString valueLabelText = generateValueLabel(labelFormat,
- m_dataArray.at(row)->at(column).z());
+ dataArray.at(row)->at(column).z());
labelText.replace(zLabelTag, valueLabelText);
}
- labelText.replace(seriesNameTag, m_visibleSeriesList[0].name());
+ labelText.replace(seriesNameTag, cache->name());
m_selectionLabelDirty = false;
@@ -2055,6 +2363,11 @@ void Surface3DRenderer::updateSlicingActive(bool isSlicing)
#endif
m_selectionDirty = true;
+
+ foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) {
+ if (cache->mainSelectionPointer())
+ cache->mainSelectionPointer()->updateBoundingRect(m_primarySubViewport);
+ }
}
void Surface3DRenderer::loadLabelMesh()
@@ -2071,31 +2384,34 @@ void Surface3DRenderer::initShaders(const QString &vertexShader, const QString &
Q_UNUSED(fragmentShader);
// draw the shader for the surface according to smooth status, shadow and uniform color
- if (m_surfaceShader)
- delete m_surfaceShader;
+ if (m_surfaceFlatShader)
+ delete m_surfaceFlatShader;
+ if (m_surfaceSmoothShader)
+ delete m_surfaceSmoothShader;
+
#if !defined(QT_OPENGL_ES_2)
- if (!m_cachedFlatShading) {
- if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) {
- m_surfaceShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertexShadow"),
- QStringLiteral(":/shaders/fragmentSurfaceShadowNoTex"));
- } else {
- m_surfaceShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertex"),
- QStringLiteral(":/shaders/fragmentSurface"));
- }
+ if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) {
+ m_surfaceSmoothShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertexShadow"),
+ QStringLiteral(":/shaders/fragmentSurfaceShadowNoTex"));
} else {
- if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) {
- m_surfaceShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertexSurfaceShadowFlat"),
+ m_surfaceSmoothShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertex"),
+ QStringLiteral(":/shaders/fragmentSurface"));
+ }
+ if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) {
+ m_surfaceFlatShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertexSurfaceShadowFlat"),
QStringLiteral(":/shaders/fragmentSurfaceShadowFlat"));
- } else {
- m_surfaceShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertexSurfaceFlat"),
+ } else {
+ m_surfaceFlatShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertexSurfaceFlat"),
QStringLiteral(":/shaders/fragmentSurfaceFlat"));
- }
}
#else
- m_surfaceShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertex"),
- QStringLiteral(":/shaders/fragmentSurfaceES2"));
+ m_surfaceSmoothShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertex"),
+ QStringLiteral(":/shaders/fragmentSurfaceES2"));
+ m_surfaceFlatShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertex"),
+ QStringLiteral(":/shaders/fragmentSurfaceES2"));
#endif
- m_surfaceShader->initialize();
+ m_surfaceSmoothShader->initialize();
+ m_surfaceFlatShader->initialize();
}
void Surface3DRenderer::initBackgroundShaders(const QString &vertexShader,
@@ -2175,16 +2491,4 @@ void Surface3DRenderer::updateDepthBuffer()
}
#endif
-void Surface3DRenderer::generateUniformGradient(const QVector3D newColor)
-{
- if (m_visibleSeriesList.size()) {
- QColor newQColor = Utils::colorFromVector(newColor);
- m_uniformGradientTextureColor = newColor;
- QLinearGradient newGradient;
- newGradient.setColorAt(0.0, newQColor);
- newGradient.setColorAt(1.0, newQColor);
- fixGradientAndGenerateTexture(&newGradient, &m_uniformGradientTexture);
- }
-}
-
QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/engine/surface3drenderer_p.h b/src/datavisualization/engine/surface3drenderer_p.h
index 06973f43..7a4422e4 100644
--- a/src/datavisualization/engine/surface3drenderer_p.h
+++ b/src/datavisualization/engine/surface3drenderer_p.h
@@ -34,6 +34,7 @@
#include "abstract3drenderer_p.h"
#include "scatterrenderitem_p.h"
#include "qsurfacedataproxy.h"
+#include "surfaceseriesrendercache_p.h"
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -47,20 +48,14 @@ class QT_DATAVISUALIZATION_EXPORT Surface3DRenderer : public Abstract3DRenderer
{
Q_OBJECT
-public:
- // Visual parameters
- QRect m_boundingRect;
- bool m_labelBackground;
- QFont m_font;
- bool m_isGridEnabled;
-
private:
bool m_cachedIsSlicingActivated;
// Internal attributes purely related to how the scene is drawn with GL.
ShaderHelper *m_depthShader;
ShaderHelper *m_backgroundShader;
- ShaderHelper *m_surfaceShader;
+ ShaderHelper *m_surfaceFlatShader;
+ ShaderHelper *m_surfaceSmoothShader;
ShaderHelper *m_surfaceGridShader;
ShaderHelper *m_selectionShader;
ShaderHelper *m_labelShader;
@@ -70,10 +65,6 @@ private:
GLfloat m_scaleZ;
GLfloat m_scaleXWithBackground;
GLfloat m_scaleZWithBackground;
- GLfloat m_surfaceScaleX;
- GLfloat m_surfaceScaleZ;
- GLfloat m_surfaceOffsetX;
- GLfloat m_surfaceOffsetZ;
GLfloat m_minVisibleColumnValue;
GLfloat m_maxVisibleColumnValue;
GLfloat m_minVisibleRowValue;
@@ -83,38 +74,28 @@ private:
ObjectHelper *m_backgroundObj;
ObjectHelper *m_gridLineObj;
ObjectHelper *m_labelObj;
- SurfaceObject *m_surfaceObj;
- SurfaceObject *m_sliceSurfaceObj;
GLuint m_depthTexture;
GLuint m_depthModelTexture;
GLuint m_depthFrameBuffer;
GLuint m_selectionFrameBuffer;
GLuint m_selectionDepthBuffer;
- GLuint m_selectionTexture;
GLuint m_selectionResultTexture;
GLfloat m_shadowQualityToShader;
- bool m_cachedFlatShading;
bool m_flatSupported;
- bool m_cachedSurfaceVisible;
- bool m_cachedSurfaceGridOn;
- SelectionPointer *m_selectionPointer;
bool m_selectionActive;
bool m_xFlipped;
bool m_zFlipped;
bool m_yFlipped;
AbstractRenderItem m_dummyRenderItem;
- QSurfaceDataArray m_dataArray;
- QSurfaceDataArray m_sliceDataArray;
- QRect m_sampleSpace;
GLint m_shadowQualityMultiplier;
QSizeF m_areaSize;
- uint m_clickedPointId;
bool m_hasHeightAdjustmentChanged;
QPoint m_selectedPoint;
const QSurface3DSeries *m_selectedSeries;
- GLuint m_uniformGradientTexture;
- QVector3D m_uniformGradientTextureColor;
QPoint m_clickedPosition;
+ QHash<QSurface3DSeries *, SurfaceSeriesRenderCache *> m_renderCacheList;
+ bool m_selectionTexturesDirty;
+ GLuint m_noShadowTexture;
public:
explicit Surface3DRenderer(Surface3DController *controller);
@@ -122,11 +103,12 @@ public:
void updateData();
void updateSeries(const QList<QAbstract3DSeries *> &seriesList, bool updateVisibility);
- void updateRows(const QVector<int> &rows);
- void updateItem(const QVector<QPoint> &points);
+ void updateSelectionMode(QAbstract3DGraph::SelectionFlags mode);
+ void modifiedSeriesList(const QVector<QSurface3DSeries *> &seriesList);
+ void updateRows(const QVector<Surface3DController::ChangeRow> &rows);
+ void updateItem(const QVector<Surface3DController::ChangeItem> &points);
+ void updateAxisRange(QAbstract3DAxis::AxisOrientation orientation, float min, float max);
void updateScene(Q3DScene *scene);
- bool updateFlatStatus(bool enable);
- void updateSurfaceGridStatus(bool enable);
void updateSlicingActive(bool isSlicing);
void updateSelectedPoint(const QPoint &position, const QSurface3DSeries *series);
inline QPoint clickedPosition() const { return m_clickedPosition; }
@@ -142,16 +124,20 @@ signals:
void flatShadingSupportedChanged(bool supported);
private:
+ void checkFlatSupport(SurfaceSeriesRenderCache *cache);
+ void updateObjects(SurfaceSeriesRenderCache *cache, bool dimensionChanged);
void updateSliceDataModel(const QPoint &point);
+ QPoint mapCoordsToSampleSpace(SurfaceSeriesRenderCache *cache, const QPointF &coords);
+ void findMatchingRow(float z, int &sample, int direction, QSurfaceDataArray &dataArray);
+ void findMatchingColumn(float x, int &sample, int direction, QSurfaceDataArray &dataArray);
+ void updateSliceObject(SurfaceSeriesRenderCache *cache, const QPoint &point);
void updateShadowQuality(QAbstract3DGraph::ShadowQuality quality);
void updateTextures();
void initShaders(const QString &vertexShader, const QString &fragmentShader);
- QRect calculateSampleRect(const QSurfaceDataArray &array);
+ QRect calculateSampleRect(SurfaceSeriesRenderCache *cache, const QSurfaceDataArray &array);
void loadBackgroundMesh();
void loadGridLineMesh();
void loadLabelMesh();
- void loadSurfaceObj();
- void loadSliceSurfaceObj();
void drawScene(GLuint defaultFboHandle);
void calculateSceneScalingFactors();
void initBackgroundShaders(const QString &vertexShader, const QString &fragmentShader);
@@ -160,17 +146,18 @@ private:
void initSurfaceShaders();
void initSelectionBuffer();
void initDepthShader();
- void updateSelectionTexture();
+ void updateSelectionTextures();
+ void createSelectionTexture(SurfaceSeriesRenderCache *cache, uint &lastSelectionId);
void idToRGBA(uint id, uchar *r, uchar *g, uchar *b, uchar *a);
void fillIdCorner(uchar *p, uchar r, uchar g, uchar b, uchar a, int stride);
void surfacePointSelected(const QPoint &point);
+ void updateSelectionPoint(SurfaceSeriesRenderCache *cache, const QPoint &point, bool label);
QPoint selectionIdToSurfacePoint(uint id);
- QString createSelectionLabel(float value, int column, int row);
+ QString createSelectionLabel(SurfaceSeriesRenderCache *cache, float value, int column, int row);
#if !defined(QT_OPENGL_ES_2)
void updateDepthBuffer();
#endif
void emitSelectedPointChanged(QPoint position);
- void generateUniformGradient(const QVector3D newColor);
Q_DISABLE_COPY(Surface3DRenderer)
};
diff --git a/src/datavisualization/engine/surfaceseriesrendercache.cpp b/src/datavisualization/engine/surfaceseriesrendercache.cpp
new file mode 100644
index 00000000..ba25d71d
--- /dev/null
+++ b/src/datavisualization/engine/surfaceseriesrendercache.cpp
@@ -0,0 +1,91 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+#include "seriesrendercache_p.h"
+#include "surfaceseriesrendercache_p.h"
+#include "objecthelper_p.h"
+#include "abstract3drenderer_p.h"
+#include "texturehelper_p.h"
+#include "utils_p.h"
+
+QT_BEGIN_NAMESPACE_DATAVISUALIZATION
+
+SurfaceSeriesRenderCache::SurfaceSeriesRenderCache()
+ : m_surfaceVisible(false),
+ m_surfaceGridVisible(false),
+ m_surfaceFlatShading(true),
+ m_surfaceObj(new SurfaceObject),
+ m_sliceSurfaceObj(new SurfaceObject),
+ m_sampleSpace(QRect(0, 0, 0 , 0)),
+ m_selectionTexture(0),
+ m_selectionIdStart(0),
+ m_selectionIdEnd(0),
+ m_flatChangeAllowed(true),
+ m_flatStatusDirty(false),
+ m_scale(QVector3D(1.0f, 1.0f, 1.0f)),
+ m_offset(QVector3D(0.0f, 0.0f, 0.0f)),
+ m_sliceSelectionPointer(0),
+ m_mainSelectionPointer(0),
+ m_slicePointerActive(false),
+ m_mainPointerActive(false),
+ m_valid(false),
+ m_objectDirty(true)
+{
+}
+
+SurfaceSeriesRenderCache::~SurfaceSeriesRenderCache()
+{
+}
+
+void SurfaceSeriesRenderCache::populate(QSurface3DSeries *series, Abstract3DRenderer *renderer)
+{
+ Q_ASSERT(series);
+
+ SeriesRenderCache::populate(series, renderer);
+
+ QSurface3DSeries::DrawFlags drawMode = series->drawMode();
+ m_surfaceVisible = drawMode.testFlag(QSurface3DSeries::DrawSurface);
+ m_surfaceGridVisible = drawMode.testFlag(QSurface3DSeries::DrawWireframe);
+ if (m_flatChangeAllowed && m_surfaceFlatShading != series->isFlatShadingEnabled()) {
+ m_surfaceFlatShading = series->isFlatShadingEnabled();
+ m_flatStatusDirty = true;
+ }
+}
+
+void SurfaceSeriesRenderCache::cleanup(TextureHelper *texHelper)
+{
+ if (QOpenGLContext::currentContext())
+ texHelper->deleteTexture(&m_selectionTexture);
+
+ delete m_surfaceObj;
+ delete m_sliceSurfaceObj;
+ for (int i = 0; i < m_dataArray.size(); i++)
+ delete m_dataArray.at(i);
+ m_dataArray.clear();
+
+ for (int i = 0; i < m_sliceDataArray.size(); i++)
+ delete m_sliceDataArray.at(i);
+ m_sliceDataArray.clear();
+
+ delete m_sliceSelectionPointer;
+ delete m_mainSelectionPointer;
+
+ SeriesRenderCache::cleanup(texHelper);
+}
+
+QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/engine/surfaceseriesrendercache_p.h b/src/datavisualization/engine/surfaceseriesrendercache_p.h
new file mode 100644
index 00000000..2dda0670
--- /dev/null
+++ b/src/datavisualization/engine/surfaceseriesrendercache_p.h
@@ -0,0 +1,130 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the QtDataVisualization 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 SURFACESERIESRENDERCACHE_P_H
+#define SURFACESERIESRENDERCACHE_P_H
+
+#include "datavisualizationglobal_p.h"
+#include "seriesrendercache_p.h"
+#include "qabstract3dseries_p.h"
+#include "qsurface3dseries_p.h"
+#include "surfaceobject_p.h"
+#include "selectionpointer_p.h"
+
+#include <QtGui/QMatrix4x4>
+
+QT_BEGIN_NAMESPACE_DATAVISUALIZATION
+
+class Abstract3DRenderer;
+class ObjectHelper;
+class TextureHelper;
+
+class SurfaceSeriesRenderCache : public SeriesRenderCache
+{
+public:
+ SurfaceSeriesRenderCache();
+ virtual ~SurfaceSeriesRenderCache();
+
+ void populate(QSurface3DSeries *series, Abstract3DRenderer *renderer);
+ virtual void cleanup(TextureHelper *texHelper);
+
+ inline bool surfaceVisible() const { return m_surfaceVisible; }
+ inline bool surfaceGridVisible() const { return m_surfaceGridVisible; }
+ inline bool isFlatShadingEnabled() const { return m_surfaceFlatShading; }
+ inline void setFlatShadingEnabled(bool enabled) { m_surfaceFlatShading = enabled; }
+ inline void setFlatChangeAllowed(bool allowed) { m_flatChangeAllowed = allowed; }
+ inline void setValid(bool valid) { m_valid = valid; }
+ inline bool isValid() const { return m_valid; }
+ inline SurfaceObject *surfaceObject() { return m_surfaceObj; }
+ inline SurfaceObject *sliceSurfaceObject() { return m_sliceSurfaceObj; }
+ inline const QRect &sampleSpace() const { return m_sampleSpace; }
+ inline void setSampleSpace(const QRect &sampleSpace) { m_sampleSpace = sampleSpace; }
+ inline QSurface3DSeries *series() const { return static_cast<QSurface3DSeries *>(m_series); }
+ inline QSurfaceDataArray &dataArray() { return m_dataArray; }
+ inline QSurfaceDataArray &sliceDataArray() { return m_sliceDataArray; }
+ inline bool isSeriesVisible() const { return m_series->isVisible(); }
+ inline bool renderable() const { return m_series->isVisible() && (m_surfaceVisible ||
+ m_surfaceGridVisible); }
+ inline void setObjectDirty(bool state) { m_objectDirty = state; }
+ inline bool objectDirty() const { return m_objectDirty; }
+ inline void setSelectionTexture(GLuint texture) { m_selectionTexture = texture; }
+ inline GLuint selectionTexture() const { return m_selectionTexture; }
+ inline void setSelectionIdRange(uint start, uint end) { m_selectionIdStart = start;
+ m_selectionIdEnd = end; }
+ inline uint selectionIdStart() const { return m_selectionIdStart; }
+ inline bool isWithinIdRange(uint selection) const { return selection >= m_selectionIdStart &&
+ selection <= m_selectionIdEnd; }
+ inline bool isFlatStatusDirty() const { return m_flatStatusDirty; }
+ inline void setFlatStatusDirty(bool status) { m_flatStatusDirty = status; }
+ inline void setScale(const QVector3D &scale) { m_scale = scale; }
+ inline const QVector3D &scale() const { return m_scale; }
+ inline void setOffset(const QVector3D &offset) { m_offset = offset; }
+ inline const QVector3D &offset() const { return m_offset; }
+ // m_MVPMatrix is volatile, used only for optimizing rendering a bit
+ inline void setMVPMatrix(const QMatrix4x4 &matrix) { m_MVPMatrix = matrix; }
+ inline const QMatrix4x4 &MVPMatrix() { return m_MVPMatrix; }
+
+ inline void setSliceSelectionPointer(SelectionPointer *pointer) { m_sliceSelectionPointer = pointer; }
+ inline SelectionPointer *sliceSelectionPointer() const { return m_sliceSelectionPointer; }
+ inline void setMainSelectionPointer(SelectionPointer *pointer) { m_mainSelectionPointer = pointer; }
+ inline SelectionPointer *mainSelectionPointer() const { return m_mainSelectionPointer; }
+
+ inline void setSlicePointerActivity(bool activity) { m_slicePointerActive = activity; }
+ inline bool slicePointerActive() const { return m_slicePointerActive; }
+ inline void setMainPointerActivity(bool activity) { m_mainPointerActive = activity; }
+ inline bool mainPointerActive() const { return m_mainPointerActive; }
+
+protected:
+ bool m_surfaceVisible;
+ bool m_surfaceGridVisible;
+ bool m_surfaceFlatShading;
+ SurfaceObject *m_surfaceObj;
+ SurfaceObject *m_sliceSurfaceObj;
+ QRect m_sampleSpace;
+ QSurfaceDataArray m_dataArray;
+ QSurfaceDataArray m_sliceDataArray;
+ GLuint m_selectionTexture;
+ uint m_selectionIdStart;
+ uint m_selectionIdEnd;
+ bool m_flatChangeAllowed;
+ bool m_flatStatusDirty;
+ QVector3D m_scale;
+ QVector3D m_offset;
+ QMatrix4x4 m_MVPMatrix;
+ SelectionPointer *m_sliceSelectionPointer;
+ SelectionPointer *m_mainSelectionPointer;
+ bool m_slicePointerActive;
+ bool m_mainPointerActive;
+
+ bool m_valid;
+ bool m_objectDirty;
+};
+
+QT_END_NAMESPACE_DATAVISUALIZATION
+
+#endif
diff --git a/src/datavisualization/global/datavisualizationglobal_p.h b/src/datavisualization/global/datavisualizationglobal_p.h
index 83af408a..e448c1cb 100644
--- a/src/datavisualization/global/datavisualizationglobal_p.h
+++ b/src/datavisualization/global/datavisualizationglobal_p.h
@@ -30,9 +30,10 @@
#define DATAVISUALIZATIONGLOBAL_P_H
#include "qdatavisualizationglobal.h"
-#include <QOpenGLFunctions>
-#include <QVector3D>
-#include <QDebug>
+#include <QtGui/QOpenGLFunctions>
+#include <QtGui/QVector3D>
+#include <QtGui/QQuaternion>
+#include <QtCore/QDebug>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -49,12 +50,15 @@ static const QVector3D defaultLightPos = QVector3D(0.0f, 0.5f, 0.0f);
static const QVector3D zeroVector = QVector3D(0.0f, 0.0f, 0.0f);
static const QVector3D upVector = QVector3D(0.0f, 1.0f, 0.0f);
static const QVector3D cameraDistanceVector = QVector3D(0.0f, 0.0f, cameraDistance);
+static const QQuaternion identityQuaternion;
// Skip color == selection texture's background color
static const QVector3D selectionSkipColor = QVector3D(255.0f, 255.0f, 255.0f);
static const QVector3D invalidColorVector = QVector3D(-1.0f, -1.0f, -1.0f);
static const GLfloat gradientTextureHeight = 1024.0f;
static const GLfloat gradientTextureWidth = 2.0f;
+static const GLfloat uniformTextureHeight = 64.0f;
+static const GLfloat uniformTextureWidth = 2.0f;
QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/global/qdatavisualizationglobal.h b/src/datavisualization/global/qdatavisualizationglobal.h
index d7e71265..186db94c 100644
--- a/src/datavisualization/global/qdatavisualizationglobal.h
+++ b/src/datavisualization/global/qdatavisualizationglobal.h
@@ -19,7 +19,7 @@
#ifndef QDATAVISUALIZATIONGLOBAL_H
#define QDATAVISUALIZATIONGLOBAL_H
-#include <qglobal.h>
+#include <QtCore/qglobal.h>
#define QT_DATAVISUALIZATION_VERSION_STR "1.0.0"
/*
diff --git a/src/datavisualization/input/q3dinputhandler.h b/src/datavisualization/input/q3dinputhandler.h
index 49471d72..118bd829 100644
--- a/src/datavisualization/input/q3dinputhandler.h
+++ b/src/datavisualization/input/q3dinputhandler.h
@@ -16,8 +16,8 @@
**
****************************************************************************/
-#ifndef QDEFAULT3DINPUTHANDLER_H
-#define QDEFAULT3DINPUTHANDLER_H
+#ifndef Q3DINPUTHANDLER_H
+#define Q3DINPUTHANDLER_H
#include <QtDataVisualization/qabstract3dinputhandler.h>
diff --git a/src/datavisualization/input/qabstract3dinputhandler.cpp b/src/datavisualization/input/qabstract3dinputhandler.cpp
index f786d466..5360eb38 100644
--- a/src/datavisualization/input/qabstract3dinputhandler.cpp
+++ b/src/datavisualization/input/qabstract3dinputhandler.cpp
@@ -17,6 +17,7 @@
****************************************************************************/
#include "qabstract3dinputhandler_p.h"
+#include "q3dscene.h"
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/input/qabstract3dinputhandler.h b/src/datavisualization/input/qabstract3dinputhandler.h
index 803517ed..75ec8c1b 100644
--- a/src/datavisualization/input/qabstract3dinputhandler.h
+++ b/src/datavisualization/input/qabstract3dinputhandler.h
@@ -19,8 +19,13 @@
#ifndef QABSTRACT3DINPUTHANDLER_H
#define QABSTRACT3DINPUTHANDLER_H
+#include <QtDataVisualization/qdatavisualizationglobal.h>
#include <QtDataVisualization/q3dscene.h>
-#include <QMouseEvent>
+#include <QtCore/QObject>
+#include <QtCore/QPoint>
+#include <QtGui/QWheelEvent>
+#include <QtGui/QMouseEvent>
+#include <QtGui/QTouchEvent>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -41,8 +46,9 @@ public:
InputViewOnSecondary
};
-public:
+protected:
explicit QAbstract3DInputHandler(QObject *parent = 0);
+public:
virtual ~QAbstract3DInputHandler();
// Input event listeners
@@ -53,7 +59,6 @@ public:
virtual void mouseMoveEvent(QMouseEvent *event, const QPoint &mousePos);
virtual void wheelEvent(QWheelEvent *event);
-public:
InputView inputView() const;
void setInputView(InputView inputView);
@@ -64,9 +69,9 @@ public:
void setScene(Q3DScene *scene);
signals:
- void positionChanged(QPoint position);
+ void positionChanged(const QPoint &position);
void inputViewChanged(InputView view);
- void sceneChanged(const Q3DScene *scene);
+ void sceneChanged(Q3DScene *scene);
protected:
void setPrevDistance(int distance);
diff --git a/src/datavisualization/input/qabstract3dinputhandler_p.h b/src/datavisualization/input/qabstract3dinputhandler_p.h
index 52b1a5f6..fa5a2315 100644
--- a/src/datavisualization/input/qabstract3dinputhandler_p.h
+++ b/src/datavisualization/input/qabstract3dinputhandler_p.h
@@ -31,7 +31,6 @@
#include "datavisualizationglobal_p.h"
#include "qabstract3dinputhandler.h"
-#include <QRect>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -62,7 +61,6 @@ public:
private:
QAbstract3DInputHandler::InputView m_inputView;
QPoint m_inputPosition;
- QRect m_mainViewPort;
Q3DScene *m_scene;
bool m_isDefaultHandler;
diff --git a/src/datavisualization/input/qtouch3dinputhandler.cpp b/src/datavisualization/input/qtouch3dinputhandler.cpp
index 76b5721b..da84b33f 100644
--- a/src/datavisualization/input/qtouch3dinputhandler.cpp
+++ b/src/datavisualization/input/qtouch3dinputhandler.cpp
@@ -18,8 +18,8 @@
#include "qtouch3dinputhandler_p.h"
#include "q3dcamera_p.h"
-#include <QTimer>
-#include <qmath.h>
+#include <QtCore/QTimer>
+#include <QtCore/qmath.h>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/input/qtouch3dinputhandler_p.h b/src/datavisualization/input/qtouch3dinputhandler_p.h
index 19c30142..613b5f28 100644
--- a/src/datavisualization/input/qtouch3dinputhandler_p.h
+++ b/src/datavisualization/input/qtouch3dinputhandler_p.h
@@ -22,6 +22,8 @@
#include "qabstract3dinputhandler_p.h"
#include "qtouch3dinputhandler.h"
+class QTimer;
+
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
class QAbstract3DInputHandler;
diff --git a/src/datavisualization/theme/q3dtheme.h b/src/datavisualization/theme/q3dtheme.h
index 91c5bb6f..43278c79 100644
--- a/src/datavisualization/theme/q3dtheme.h
+++ b/src/datavisualization/theme/q3dtheme.h
@@ -20,10 +20,10 @@
#define Q3DTHEME_H
#include <QtDataVisualization/qdatavisualizationglobal.h>
-
-#include <QLinearGradient>
-#include <QFont>
-#include <QColor>
+#include <QtCore/QObject>
+#include <QtGui/QLinearGradient>
+#include <QtGui/QFont>
+#include <QtGui/QColor>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -149,23 +149,23 @@ public:
signals:
void typeChanged(Theme themeType);
- void baseColorsChanged(QList<QColor> colors);
- void backgroundColorChanged(QColor color);
- void windowColorChanged(QColor color);
- void labelTextColorChanged(QColor color);
- void labelBackgroundColorChanged(QColor color);
- void gridLineColorChanged(QColor color);
- void singleHighlightColorChanged(QColor color);
- void multiHighlightColorChanged(QColor color);
- void lightColorChanged(QColor color);
- void baseGradientsChanged(QList<QLinearGradient> gradients);
- void singleHighlightGradientChanged(QLinearGradient gradient);
- void multiHighlightGradientChanged(QLinearGradient gradient);
+ void baseColorsChanged(const QList<QColor> &colors);
+ void backgroundColorChanged(const QColor &color);
+ void windowColorChanged(const QColor &color);
+ void labelTextColorChanged(const QColor &color);
+ void labelBackgroundColorChanged(const QColor &color);
+ void gridLineColorChanged(const QColor &color);
+ void singleHighlightColorChanged(const QColor &color);
+ void multiHighlightColorChanged(const QColor &color);
+ void lightColorChanged(const QColor &color);
+ void baseGradientsChanged(const QList<QLinearGradient> &gradients);
+ void singleHighlightGradientChanged(const QLinearGradient &gradient);
+ void multiHighlightGradientChanged(const QLinearGradient &gradient);
void lightStrengthChanged(float strength);
void ambientLightStrengthChanged(float strength);
void highlightLightStrengthChanged(float strength);
void labelBorderEnabledChanged(bool enabled);
- void fontChanged(QFont font);
+ void fontChanged(const QFont &font);
void backgroundEnabledChanged(bool enabled);
void gridEnabledChanged(bool enabled);
void labelBackgroundEnabledChanged(bool enabled);
@@ -173,16 +173,17 @@ signals:
protected:
explicit Q3DTheme(Q3DThemePrivate *d, Theme themeType, QObject *parent = 0);
+
QScopedPointer<Q3DThemePrivate> d_ptr;
+private:
+ Q_DISABLE_COPY(Q3DTheme)
+
friend class ThemeManager;
friend class Abstract3DRenderer;
friend class Bars3DController;
friend class AbstractDeclarative;
friend class Abstract3DController;
-
-private:
- Q_DISABLE_COPY(Q3DTheme)
};
QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/utils/abstractobjecthelper.cpp b/src/datavisualization/utils/abstractobjecthelper.cpp
index 9ced43a1..c350d096 100644
--- a/src/datavisualization/utils/abstractobjecthelper.cpp
+++ b/src/datavisualization/utils/abstractobjecthelper.cpp
@@ -18,8 +18,6 @@
#include "abstractobjecthelper_p.h"
-#include <QDebug>
-
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
AbstractObjectHelper::AbstractObjectHelper()
diff --git a/src/datavisualization/utils/abstractobjecthelper_p.h b/src/datavisualization/utils/abstractobjecthelper_p.h
index 5ec34318..3220b37d 100644
--- a/src/datavisualization/utils/abstractobjecthelper_p.h
+++ b/src/datavisualization/utils/abstractobjecthelper_p.h
@@ -30,7 +30,7 @@
#define ABSTRACTOBJECTHELPER_H
#include "datavisualizationglobal_p.h"
-#include <QOpenGLFunctions>
+#include <QtGui/QOpenGLFunctions>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/utils/camerahelper.cpp b/src/datavisualization/utils/camerahelper.cpp
index 220c49db..ee4c27e0 100644
--- a/src/datavisualization/utils/camerahelper.cpp
+++ b/src/datavisualization/utils/camerahelper.cpp
@@ -18,9 +18,8 @@
#include "camerahelper_p.h"
-#include <qmath.h>
-#include <QMatrix4x4>
-#include <QVector3D>
+#include <QtCore/qmath.h>
+#include <QtGui/QMatrix4x4>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/utils/camerahelper_p.h b/src/datavisualization/utils/camerahelper_p.h
index e78bc24c..f410ceb5 100644
--- a/src/datavisualization/utils/camerahelper_p.h
+++ b/src/datavisualization/utils/camerahelper_p.h
@@ -31,8 +31,6 @@
#include "datavisualizationglobal_p.h"
#include "q3dcamera.h"
-#include "q3dbars.h"
-#include <QObject>
class QMatrix4x4;
class QVector3D;
@@ -71,17 +69,17 @@ public:
QPointF getCameraRotations();
// Set default camera orientation. Position's x and y should be 0.
void setDefaultCameraOrientation(const QVector3D &defaultPosition,
- const QVector3D &defaultTarget,
- const QVector3D &defaultUp);
+ const QVector3D &defaultTarget,
+ const QVector3D &defaultUp);
// Calculate view matrix based on rotation and zoom
QMatrix4x4 calculateViewMatrix(const QPoint &mousePos, int zoom,
- int screenWidth, int screenHeight,
- bool showUnder = false);
+ int screenWidth, int screenHeight,
+ bool showUnder = false);
// Calcluate light position based on rotation. Call after calling calculateViewMatrix to get
// up-to-date position
QVector3D calculateLightPosition(const QVector3D &lightPosition,
- GLfloat fixedRotation = 0.0f,
- GLfloat distanceModifier = 0.0f);
+ GLfloat fixedRotation = 0.0f,
+ GLfloat distanceModifier = 0.0f);
void updateMousePos(const QPoint &mousePos);
void setCameraPreset(Q3DCamera::CameraPreset preset);
};
diff --git a/src/datavisualization/utils/meshloader.cpp b/src/datavisualization/utils/meshloader.cpp
index 49bdf710..615a7909 100644
--- a/src/datavisualization/utils/meshloader.cpp
+++ b/src/datavisualization/utils/meshloader.cpp
@@ -18,11 +18,10 @@
#include "meshloader_p.h"
-#include <QFile>
-#include <QStringList>
-#include <QVector>
-#include <QVector2D>
-#include <QVector3D>
+#include <QtCore/QFile>
+#include <QtCore/QStringList>
+#include <QtCore/QVector>
+#include <QtGui/QVector2D>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/utils/meshloader_p.h b/src/datavisualization/utils/meshloader_p.h
index e7425ae6..16ddaf6d 100644
--- a/src/datavisualization/utils/meshloader_p.h
+++ b/src/datavisualization/utils/meshloader_p.h
@@ -30,9 +30,7 @@
#define MESHLOADER_P_H
#include "datavisualizationglobal_p.h"
-
-class QVector2D;
-class QVector3D;
+#include <QtGui/QVector2D>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/utils/objecthelper_p.h b/src/datavisualization/utils/objecthelper_p.h
index f96fc87d..0260dd05 100644
--- a/src/datavisualization/utils/objecthelper_p.h
+++ b/src/datavisualization/utils/objecthelper_p.h
@@ -31,7 +31,7 @@
#include "datavisualizationglobal_p.h"
#include "abstractobjecthelper_p.h"
-#include <QOpenGLFunctions>
+#include <QtGui/QOpenGLFunctions>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/utils/shaderhelper.cpp b/src/datavisualization/utils/shaderhelper.cpp
index d4df11b4..7fb237c6 100644
--- a/src/datavisualization/utils/shaderhelper.cpp
+++ b/src/datavisualization/utils/shaderhelper.cpp
@@ -18,7 +18,7 @@
#include "shaderhelper_p.h"
-#include <QOpenGLShader>
+#include <QtGui/QOpenGLShader>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/utils/shaderhelper_p.h b/src/datavisualization/utils/shaderhelper_p.h
index 34bbf39e..ced27572 100644
--- a/src/datavisualization/utils/shaderhelper_p.h
+++ b/src/datavisualization/utils/shaderhelper_p.h
@@ -30,7 +30,7 @@
#define SHADERHELPER_P_H
#include "datavisualizationglobal_p.h"
-#include <QOpenGLFunctions>
+#include <QtGui/QOpenGLFunctions>
class QOpenGLShaderProgram;
diff --git a/src/datavisualization/utils/surfaceobject.cpp b/src/datavisualization/utils/surfaceobject.cpp
index b0cd6c82..9bcdfee2 100644
--- a/src/datavisualization/utils/surfaceobject.cpp
+++ b/src/datavisualization/utils/surfaceobject.cpp
@@ -19,12 +19,15 @@
#include "surfaceobject_p.h"
#include "abstractobjecthelper_p.h"
-#include <QVector3D>
-#include <QVector2D>
+#include <QtGui/QVector2D>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
SurfaceObject::SurfaceObject()
+ : m_surfaceType(Undefined),
+ m_columns(0),
+ m_rows(0),
+ m_gridIndexCount(0)
{
m_indicesType = GL_UNSIGNED_INT;
initializeOpenGLFunctions();
@@ -668,6 +671,9 @@ GLuint SurfaceObject::gridIndexCount()
QVector3D SurfaceObject::vertexAt(int column, int row)
{
int pos = 0;
+ if (m_surfaceType == Undefined || !m_vertices.size())
+ return zeroVector;
+
if (m_surfaceType == SurfaceFlat)
pos = row * (m_columns * 2 - 2) + column * 2 - (column > 0);
else
@@ -675,6 +681,13 @@ QVector3D SurfaceObject::vertexAt(int column, int row)
return m_vertices.at(pos);
}
+void SurfaceObject::clear()
+{
+ m_gridIndexCount = 0;
+ m_indexCount = 0;
+ m_surfaceType = Undefined;
+}
+
QVector3D SurfaceObject::normal(const QVector3D &a, const QVector3D &b, const QVector3D &c)
{
QVector3D v1 = b - a;
diff --git a/src/datavisualization/utils/surfaceobject_p.h b/src/datavisualization/utils/surfaceobject_p.h
index ec1a30bd..69cb7e5d 100644
--- a/src/datavisualization/utils/surfaceobject_p.h
+++ b/src/datavisualization/utils/surfaceobject_p.h
@@ -33,13 +33,20 @@
#include "abstractobjecthelper_p.h"
#include "qsurfacedataproxy.h"
-#include <QRect>
+#include <QtCore/QRect>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
class SurfaceObject : public AbstractObjectHelper
{
public:
+ enum SurfaceType {
+ SurfaceSmooth,
+ SurfaceFlat,
+ Undefined
+ };
+
+public:
SurfaceObject();
~SurfaceObject();
@@ -63,6 +70,7 @@ public:
GLuint gridElementBuf();
GLuint gridIndexCount();
QVector3D vertexAt(int column, int row);
+ void clear();
private:
QVector3D normal(const QVector3D &a, const QVector3D &b, const QVector3D &c);
@@ -71,11 +79,7 @@ private:
bool changeGeometry);
private:
- enum SurfaceType {
- SurfaceSmooth,
- SurfaceFlat
- };
- int m_surfaceType;
+ SurfaceType m_surfaceType;
int m_columns;
int m_rows;
GLuint m_gridElementbuffer;
diff --git a/src/datavisualization/utils/texturehelper.cpp b/src/datavisualization/utils/texturehelper.cpp
index b5079f1b..52c673dc 100644
--- a/src/datavisualization/utils/texturehelper.cpp
+++ b/src/datavisualization/utils/texturehelper.cpp
@@ -19,10 +19,8 @@
#include "texturehelper_p.h"
#include "utils_p.h"
-#include <QImage>
-#include <QPainter>
-
-#include <QDebug>
+#include <QtGui/QImage>
+#include <QtGui/QPainter>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -45,7 +43,6 @@ GLuint TextureHelper::create2DTexture(const QImage &image, bool useTrilinearFilt
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
GLuint temp;
- //qDebug() << "old size" << image.size();
GLuint imageWidth = Utils::getNearestPowerOfTwo(image.width(), temp);
GLuint imageHeight = Utils::getNearestPowerOfTwo(image.height(), temp);
if (smoothScale) {
@@ -54,7 +51,6 @@ GLuint TextureHelper::create2DTexture(const QImage &image, bool useTrilinearFilt
} else {
texImage = image.scaled(imageWidth, imageHeight, Qt::IgnoreAspectRatio);
}
- //qDebug() << "new size" << texImage.size();
#endif
GLuint textureId;
@@ -155,6 +151,18 @@ GLuint TextureHelper::createSelectionTexture(const QSize &size, GLuint &frameBuf
return textureid;
}
+GLuint TextureHelper::createUniformTexture(const QColor &color)
+{
+ QImage image(QSize(int(uniformTextureWidth), int(uniformTextureHeight)),
+ QImage::Format_RGB32);
+ QPainter pmp(&image);
+ pmp.setBrush(QBrush(color));
+ pmp.setPen(Qt::NoPen);
+ pmp.drawRect(0, 0, int(uniformTextureWidth), int(uniformTextureHeight));
+
+ return create2DTexture(image, false, true, false, true);
+}
+
GLuint TextureHelper::createGradientTexture(const QLinearGradient &gradient)
{
QImage image(QSize(int(gradientTextureWidth), int(gradientTextureHeight)),
diff --git a/src/datavisualization/utils/texturehelper_p.h b/src/datavisualization/utils/texturehelper_p.h
index 17553f30..ebfaa042 100644
--- a/src/datavisualization/utils/texturehelper_p.h
+++ b/src/datavisualization/utils/texturehelper_p.h
@@ -30,9 +30,9 @@
#define TEXTUREHELPER_P_H
#include "datavisualizationglobal_p.h"
-#include <QOpenGLFunctions>
-#include <QRgb>
-#include <QLinearGradient>
+#include <QtGui/QOpenGLFunctions>
+#include <QtGui/QRgb>
+#include <QtGui/QLinearGradient>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -48,6 +48,7 @@ class TextureHelper : protected QOpenGLFunctions
GLuint createCubeMapTexture(const QImage &image, bool useTrilinearFiltering = false);
// Returns selection texture and inserts generated framebuffers to framebuffer parameters
GLuint createSelectionTexture(const QSize &size, GLuint &frameBuffer, GLuint &depthBuffer);
+ GLuint createUniformTexture(const QColor &color);
GLuint createGradientTexture(const QLinearGradient &gradient);
#if !defined(QT_OPENGL_ES_2)
GLuint createDepthTexture(const QSize &size, GLuint textureSize);
diff --git a/src/datavisualization/utils/utils.cpp b/src/datavisualization/utils/utils.cpp
index 482fc831..e0b1370e 100644
--- a/src/datavisualization/utils/utils.cpp
+++ b/src/datavisualization/utils/utils.cpp
@@ -18,13 +18,12 @@
#include "utils_p.h"
-#include <QVector3D>
-#include <QColor>
-#include <QPainter>
-#include <QPoint>
-#include <QImage>
-#include <QRegExp>
-#include <qmath.h>
+#include <QtGui/QColor>
+#include <QtGui/QPainter>
+#include <QtCore/QPoint>
+#include <QtGui/QImage>
+#include <QtCore/QRegExp>
+#include <QtCore/qmath.h>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/utils/vertexindexer.cpp b/src/datavisualization/utils/vertexindexer.cpp
index f089ce6e..2a496ebc 100644
--- a/src/datavisualization/utils/vertexindexer.cpp
+++ b/src/datavisualization/utils/vertexindexer.cpp
@@ -18,7 +18,7 @@
#include "vertexindexer_p.h"
-#include <qmath.h>
+#include <QtCore/qmath.h>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/utils/vertexindexer_p.h b/src/datavisualization/utils/vertexindexer_p.h
index fe100e21..260afad4 100644
--- a/src/datavisualization/utils/vertexindexer_p.h
+++ b/src/datavisualization/utils/vertexindexer_p.h
@@ -31,9 +31,8 @@
#include "datavisualizationglobal_p.h"
-#include <QVector>
-#include <QVector2D>
-#include <QVector3D>
+#include <QtCore/QVector>
+#include <QtGui/QVector2D>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualizationqml2/abstractdeclarative.cpp b/src/datavisualizationqml2/abstractdeclarative.cpp
index f251f52b..ce74d541 100644
--- a/src/datavisualizationqml2/abstractdeclarative.cpp
+++ b/src/datavisualizationqml2/abstractdeclarative.cpp
@@ -19,26 +19,129 @@
#include "abstractdeclarative_p.h"
#include "qvalue3daxis.h"
#include "declarativetheme_p.h"
+#include "declarativerendernode_p.h"
-#include <QThread>
-#include <QGuiApplication>
-#include <QSGSimpleRectNode>
+#include <QtCore/QThread>
+#include <QtGui/QGuiApplication>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
static QList<const QQuickWindow *> clearList;
+static QHash<AbstractDeclarative *, QQuickWindow *> graphWindowList;
+static QHash<QQuickWindow *, bool> windowClearList;
AbstractDeclarative::AbstractDeclarative(QQuickItem *parent) :
QQuickItem(parent),
m_controller(0),
- m_clearWindowBeforeRendering(true)
+ m_context(0),
+ m_qtContext(0),
+ m_contextWindow(0),
+ m_renderMode(RenderIndirect),
+#if defined(QT_OPENGL_ES_2)
+ m_samples(0),
+#else
+ m_samples(4),
+#endif
+ m_windowSamples(0),
+ m_initialisedSize(0, 0)
{
connect(this, &QQuickItem::windowChanged, this, &AbstractDeclarative::handleWindowChanged);
- setAntialiasing(true);
+ setAntialiasing(m_samples > 0);
+
+ // Set contents to false in case we are in qml designer to make component look nice
+ setFlag(ItemHasContents, QGuiApplication::applicationDisplayName() != "Qml2Puppet");
}
AbstractDeclarative::~AbstractDeclarative()
{
+#if !defined(Q_OS_MAC)
+ // Context can be in another thread, don't delete it directly in that case
+ if (m_context && m_context->thread() != QThread::currentThread())
+ m_context->deleteLater();
+ else
+ delete m_context;
+#endif
+
+ disconnect(this, 0, this, 0);
+ checkWindowList(0);
+}
+
+void AbstractDeclarative::setRenderingMode(AbstractDeclarative::RenderingMode mode)
+{
+ if (mode == m_renderMode)
+ return;
+
+ RenderingMode previousMode = m_renderMode;
+
+ m_renderMode = mode;
+
+ QQuickWindow *win = window();
+
+ switch (mode) {
+ case RenderDirectToBackground:
+ // Intentional flowthrough
+ case RenderDirectToBackground_NoClear:
+ m_initialisedSize = QSize(0, 0);
+ if (previousMode == RenderIndirect) {
+ update();
+ setFlag(ItemHasContents, false);
+ if (win) {
+ QObject::connect(win, &QQuickWindow::beforeRendering, this,
+ &AbstractDeclarative::render, Qt::DirectConnection);
+ checkWindowList(win);
+ setAntialiasing(m_windowSamples > 0);
+ if (m_windowSamples != m_samples)
+ emit msaaSamplesChanged(m_windowSamples);
+ }
+ }
+ break;
+ case RenderIndirect:
+ m_initialisedSize = QSize(0, 0);
+ setFlag(ItemHasContents, true);
+ update();
+ if (win) {
+ QObject::disconnect(win, &QQuickWindow::beforeRendering, this,
+ &AbstractDeclarative::render);
+ checkWindowList(win);
+ }
+ setAntialiasing(m_samples > 0);
+ if (m_windowSamples != m_samples)
+ emit msaaSamplesChanged(m_samples);
+ break;
+ }
+
+ updateWindowParameters();
+
+ emit renderingModeChanged(mode);
+}
+
+AbstractDeclarative::RenderingMode AbstractDeclarative::renderingMode() const
+{
+ return m_renderMode;
+}
+
+QSGNode *AbstractDeclarative::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *)
+{
+ QSize boundingSize = boundingRect().size().toSize() * m_controller->scene()->devicePixelRatio();
+ if (boundingSize.width() <= 0 || boundingSize.height() <= 0
+ || m_controller.isNull() || !window()) {
+ delete oldNode;
+ return 0;
+ }
+ DeclarativeRenderNode *node = static_cast<DeclarativeRenderNode *>(oldNode);
+
+ if (!node) {
+ node = new DeclarativeRenderNode(this);
+ node->setController(m_controller.data());
+ node->setQuickWindow(window());
+ }
+
+ node->setSize(boundingSize);
+ node->setSamples(m_samples);
+ node->update();
+ node->markDirty(QSGNode::DirtyMaterial);
+
+ return node;
}
Declarative3DScene* AbstractDeclarative::scene() const
@@ -61,19 +164,6 @@ void AbstractDeclarative::clearSelection()
m_controller->clearSelection();
}
-void AbstractDeclarative::setClearWindowBeforeRendering(bool enable)
-{
- if (m_clearWindowBeforeRendering != enable) {
- m_clearWindowBeforeRendering = enable;
- emit clearWindowBeforeRenderingChanged(enable);
- }
-}
-
-bool AbstractDeclarative::clearWindowBeforeRendering() const
-{
- return m_clearWindowBeforeRendering;
-}
-
void AbstractDeclarative::setSelectionMode(SelectionFlags mode)
{
int intmode = int(mode);
@@ -107,45 +197,117 @@ void AbstractDeclarative::setSharedController(Abstract3DController *controller)
defaultTheme->setType(Q3DTheme::ThemeQt);
m_controller->setActiveTheme(defaultTheme);
- QObject::connect(m_controller, &Abstract3DController::shadowQualityChanged, this,
+ QObject::connect(m_controller.data(), &Abstract3DController::shadowQualityChanged, this,
&AbstractDeclarative::handleShadowQualityChange);
- QObject::connect(m_controller, &Abstract3DController::activeInputHandlerChanged, this,
+ QObject::connect(m_controller.data(), &Abstract3DController::activeInputHandlerChanged, this,
&AbstractDeclarative::inputHandlerChanged);
- QObject::connect(m_controller, &Abstract3DController::activeThemeChanged, this,
+ QObject::connect(m_controller.data(), &Abstract3DController::activeThemeChanged, this,
&AbstractDeclarative::themeChanged);
- QObject::connect(m_controller, &Abstract3DController::selectionModeChanged, this,
+ QObject::connect(m_controller.data(), &Abstract3DController::selectionModeChanged, this,
&AbstractDeclarative::handleSelectionModeChange);
- QObject::connect(m_controller, &Abstract3DController::axisXChanged, this,
+ QObject::connect(m_controller.data(), &Abstract3DController::axisXChanged, this,
&AbstractDeclarative::handleAxisXChanged);
- QObject::connect(m_controller, &Abstract3DController::axisYChanged, this,
+ QObject::connect(m_controller.data(), &Abstract3DController::axisYChanged, this,
&AbstractDeclarative::handleAxisYChanged);
- QObject::connect(m_controller, &Abstract3DController::axisZChanged, this,
+ QObject::connect(m_controller.data(), &Abstract3DController::axisZChanged, this,
&AbstractDeclarative::handleAxisZChanged);
}
+void AbstractDeclarative::activateOpenGLContext(QQuickWindow *window)
+{
+#if !defined(Q_OS_MAC)
+ if (!m_context || m_contextWindow != window) {
+ m_contextWindow = window;
+ delete m_context;
+ m_qtContext = QOpenGLContext::currentContext();
+ m_context = new QOpenGLContext();
+ m_context->setFormat(window->requestedFormat());
+ m_context->setShareContext(m_qtContext);
+ m_context->create();
+ }
+ m_context->makeCurrent(window);
+#else
+ Q_UNUSED(window)
+#endif
+}
+
+void AbstractDeclarative::doneOpenGLContext(QQuickWindow *window)
+{
+#if !defined(Q_OS_MAC)
+ m_qtContext->makeCurrent(window);
+#else
+ Q_UNUSED(window)
+#endif
+}
+
void AbstractDeclarative::synchDataToRenderer()
{
- if (m_clearWindowBeforeRendering && clearList.size())
+ if (m_renderMode == RenderDirectToBackground && clearList.size())
clearList.clear();
+
+ QQuickWindow *win = window();
+ activateOpenGLContext(win);
m_controller->initializeOpenGL();
m_controller->synchDataToRenderer();
+ doneOpenGLContext(win);
+}
+
+int AbstractDeclarative::msaaSamples() const
+{
+ if (m_renderMode == RenderIndirect)
+ return m_samples;
+ else
+ return m_windowSamples;
+}
+
+void AbstractDeclarative::setMsaaSamples(int samples)
+{
+ if (m_renderMode != RenderIndirect) {
+ qWarning("Multisampling cannot be adjusted in this render mode");
+ } else {
+#if defined(QT_OPENGL_ES_2)
+ if (samples > 0)
+ qWarning("Multisampling is not supported in OpenGL ES2");
+#else
+ if (m_samples != samples) {
+ m_samples = samples;
+ setAntialiasing(m_samples > 0);
+ emit msaaSamplesChanged(samples);
+ update();
+ }
+#endif
+ }
}
void AbstractDeclarative::handleWindowChanged(QQuickWindow *window)
{
+ checkWindowList(window);
+
if (!window)
return;
- // Disable clearing of the window as we render underneath
- window->setClearBeforeRendering(false);
+ connect(window, &QObject::destroyed, this, &AbstractDeclarative::windowDestroyed);
+
+ int oldWindowSamples = m_windowSamples;
+ m_windowSamples = window->format().samples();
+ if (m_windowSamples < 0)
+ m_windowSamples = 0;
- connect(window, &QQuickWindow::beforeSynchronizing, this,
- &AbstractDeclarative::synchDataToRenderer, Qt::DirectConnection);
- connect(window, &QQuickWindow::beforeRendering, this,
- &AbstractDeclarative::render, Qt::DirectConnection);
- connect(m_controller, &Abstract3DController::needRender, window,
- &QQuickWindow::update);
+ connect(window, &QQuickWindow::beforeSynchronizing,
+ this, &AbstractDeclarative::synchDataToRenderer,
+ Qt::DirectConnection);
+
+ if (m_renderMode == RenderDirectToBackground_NoClear
+ || m_renderMode == RenderDirectToBackground) {
+ connect(window, &QQuickWindow::beforeRendering, this, &AbstractDeclarative::render,
+ Qt::DirectConnection);
+ setAntialiasing(m_windowSamples > 0);
+ if (m_windowSamples != oldWindowSamples)
+ emit msaaSamplesChanged(m_windowSamples);
+ }
+
+ connect(m_controller.data(), &Abstract3DController::needRender, window, &QQuickWindow::update);
updateWindowParameters();
}
@@ -169,22 +331,36 @@ void AbstractDeclarative::updateWindowParameters()
{
// Update the device pixel ratio, window size and bounding box
QQuickWindow *win = window();
- Q3DScene *scene = m_controller->scene();
- if (win) {
+ if (win && !m_controller.isNull()) {
+ Q3DScene *scene = m_controller->scene();
if (win->devicePixelRatio() != scene->devicePixelRatio()) {
scene->setDevicePixelRatio(win->devicePixelRatio());
win->update();
}
- if (win->size() != scene->d_ptr->windowSize()) {
- scene->d_ptr->setWindowSize(QSize(win->width(), win->height()));
+ bool directRender = m_renderMode == RenderDirectToBackground
+ || m_renderMode == RenderDirectToBackground_NoClear;
+ QSize windowSize;
+
+ if (directRender)
+ windowSize = win->size();
+ else
+ windowSize = m_cachedGeometry.size().toSize();
+
+ if (windowSize != scene->d_ptr->windowSize()) {
+ scene->d_ptr->setWindowSize(windowSize);
win->update();
}
- QPointF point = QQuickItem::mapToScene(QPointF(0.0f, 0.0f));
- if (m_controller) {
+ if (directRender) {
+ // Origin mapping is needed when rendering directly to background
+ QPointF point = QQuickItem::mapToScene(QPointF(0.0, 0.0));
scene->d_ptr->setViewport(QRect(point.x(), point.y(), m_cachedGeometry.width(),
m_cachedGeometry.height()));
+ } else {
+ // No translation needed when rendering to FBO
+ scene->d_ptr->setViewport(QRect(0.0, 0.0, m_cachedGeometry.width(),
+ m_cachedGeometry.height()));
}
}
}
@@ -204,25 +380,33 @@ void AbstractDeclarative::render()
{
updateWindowParameters();
+ // If we're not rendering directly to the background, return
+ if (m_renderMode != RenderDirectToBackground && m_renderMode != RenderDirectToBackground_NoClear)
+ return;
+
// Clear the background once per window as that is not done by default
- const QQuickWindow *win = window();
- if (m_clearWindowBeforeRendering && !clearList.contains(win)) {
+ QQuickWindow *win = window();
+ activateOpenGLContext(win);
+ if (m_renderMode == RenderDirectToBackground && !clearList.contains(win)) {
clearList.append(win);
QColor clearColor = win->color();
glClearColor(clearColor.redF(), clearColor.greenF(), clearColor.blueF(), 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
}
- glDepthMask(GL_TRUE);
- glEnable(GL_DEPTH_TEST);
- glDepthFunc(GL_LESS);
- glEnable(GL_CULL_FACE);
- glCullFace(GL_BACK);
- glDisable(GL_BLEND);
+ if (isVisible()) {
+ glDepthMask(GL_TRUE);
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+ glDisable(GL_BLEND);
- m_controller->render();
+ m_controller->render();
- glEnable(GL_BLEND);
+ glEnable(GL_BLEND);
+ }
+ doneOpenGLContext(win);
}
QAbstract3DInputHandler* AbstractDeclarative::inputHandler() const
@@ -269,4 +453,66 @@ void AbstractDeclarative::wheelEvent(QWheelEvent *event)
m_controller->wheelEvent(event);
}
+void AbstractDeclarative::checkWindowList(QQuickWindow *window)
+{
+ QQuickWindow *oldWindow = graphWindowList.value(this);
+
+ graphWindowList[this] = window;
+
+ if (oldWindow != window && oldWindow) {
+ QObject::disconnect(oldWindow, &QObject::destroyed, this,
+ &AbstractDeclarative::windowDestroyed);
+ QObject::disconnect(oldWindow, &QQuickWindow::beforeSynchronizing, this,
+ &AbstractDeclarative::synchDataToRenderer);
+ QObject::disconnect(oldWindow, &QQuickWindow::beforeRendering, this,
+ &AbstractDeclarative::render);
+ if (!m_controller.isNull()) {
+ QObject::disconnect(m_controller.data(), &Abstract3DController::needRender,
+ oldWindow, &QQuickWindow::update);
+ }
+ }
+
+ QList<QQuickWindow *> windowList;
+
+ foreach (AbstractDeclarative *graph, graphWindowList.keys()) {
+ if (graph->m_renderMode == RenderDirectToBackground
+ || graph->m_renderMode == RenderDirectToBackground_NoClear) {
+ windowList.append(graphWindowList.value(graph));
+ }
+ }
+
+ if (oldWindow && !windowList.contains(oldWindow)
+ && windowClearList.values(oldWindow).size() != 0) {
+ // Return window clear value
+ oldWindow->setClearBeforeRendering(windowClearList.value(oldWindow));
+ windowClearList.remove(oldWindow);
+ }
+
+ if (!window) {
+ graphWindowList.remove(this);
+ return;
+ }
+
+ if ((m_renderMode == RenderDirectToBackground
+ || m_renderMode == RenderDirectToBackground_NoClear)
+ && windowClearList.values(window).size() == 0) {
+ // Save old clear value
+ windowClearList[window] = window->clearBeforeRendering();
+ // Disable clearing of the window as we render underneath
+ window->setClearBeforeRendering(false);
+ }
+}
+
+void AbstractDeclarative::windowDestroyed(QObject *obj)
+{
+ // Remove destroyed window from window lists
+ QQuickWindow *win = static_cast<QQuickWindow *>(obj);
+ QQuickWindow *oldWindow = graphWindowList.value(this);
+
+ if (win == oldWindow)
+ graphWindowList.remove(this);
+
+ windowClearList.remove(win);
+}
+
QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualizationqml2/abstractdeclarative_p.h b/src/datavisualizationqml2/abstractdeclarative_p.h
index 85616560..d44a154d 100644
--- a/src/datavisualizationqml2/abstractdeclarative_p.h
+++ b/src/datavisualizationqml2/abstractdeclarative_p.h
@@ -34,24 +34,28 @@
#include "qabstract3dinputhandler.h"
#include "declarativescene_p.h"
-#include <QAbstractItemModel>
-#include <QQuickItem>
-#include <QObject>
-#include <QQuickWindow>
+#include <QtCore/QAbstractItemModel>
+#include <QtQuick/QQuickItem>
+#include <QtQuick/QQuickWindow>
+#include <QtCore/QPointer>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
+class DeclarativeRenderNode;
+
class AbstractDeclarative : public QQuickItem
{
Q_OBJECT
Q_ENUMS(ShadowQuality)
+ Q_ENUMS(RenderingMode)
Q_FLAGS(SelectionFlag SelectionFlags)
Q_PROPERTY(SelectionFlags selectionMode READ selectionMode WRITE setSelectionMode NOTIFY selectionModeChanged)
Q_PROPERTY(ShadowQuality shadowQuality READ shadowQuality WRITE setShadowQuality NOTIFY shadowQualityChanged)
+ Q_PROPERTY(int msaaSamples READ msaaSamples WRITE setMsaaSamples NOTIFY msaaSamplesChanged)
Q_PROPERTY(Declarative3DScene* scene READ scene NOTIFY sceneChanged)
Q_PROPERTY(QAbstract3DInputHandler* inputHandler READ inputHandler WRITE setInputHandler NOTIFY inputHandlerChanged)
Q_PROPERTY(Q3DTheme* theme READ theme WRITE setTheme NOTIFY themeChanged)
- Q_PROPERTY(bool clearWindowBeforeRendering READ clearWindowBeforeRendering WRITE setClearWindowBeforeRendering NOTIFY clearWindowBeforeRenderingChanged)
+ Q_PROPERTY(RenderingMode renderingMode READ renderingMode WRITE setRenderingMode NOTIFY renderingModeChanged)
public:
enum SelectionFlag {
@@ -78,16 +82,28 @@ public:
ShadowQualitySoftHigh
};
+ enum RenderingMode {
+ RenderDirectToBackground = 0,
+ RenderDirectToBackground_NoClear,
+ RenderIndirect
+ };
+
public:
explicit AbstractDeclarative(QQuickItem *parent = 0);
virtual ~AbstractDeclarative();
+ virtual void setRenderingMode(RenderingMode mode);
+ virtual AbstractDeclarative::RenderingMode renderingMode() const;
+
virtual void setSelectionMode(SelectionFlags mode);
virtual AbstractDeclarative::SelectionFlags selectionMode() const;
virtual void setShadowQuality(ShadowQuality quality);
virtual AbstractDeclarative::ShadowQuality shadowQuality() const;
+ virtual void setMsaaSamples(int samples);
+ virtual int msaaSamples() const;
+
virtual Declarative3DScene *scene() const;
virtual QAbstract3DInputHandler *inputHandler() const;
@@ -98,9 +114,6 @@ public:
Q_INVOKABLE virtual void clearSelection();
- virtual void setClearWindowBeforeRendering(bool enable);
- virtual bool clearWindowBeforeRendering() const;
-
virtual void geometryChanged(const QRectF & newGeometry, const QRectF & oldGeometry);
void setSharedController(Abstract3DController *controller);
@@ -108,10 +121,16 @@ public:
void synchDataToRenderer();
void render();
+ void activateOpenGLContext(QQuickWindow *window);
+ void doneOpenGLContext(QQuickWindow *window);
+
+ void checkWindowList(QQuickWindow *window);
+
public slots:
virtual void handleAxisXChanged(QAbstract3DAxis *axis) = 0;
virtual void handleAxisYChanged(QAbstract3DAxis *axis) = 0;
virtual void handleAxisZChanged(QAbstract3DAxis *axis) = 0;
+ void windowDestroyed(QObject *obj);
protected:
virtual void mouseDoubleClickEvent(QMouseEvent *event);
@@ -125,23 +144,30 @@ protected:
virtual void updateWindowParameters();
virtual void handleSelectionModeChange(QAbstract3DGraph::SelectionFlags mode);
virtual void handleShadowQualityChange(QAbstract3DGraph::ShadowQuality quality);
+ virtual QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *);
signals:
- // Signals shadow quality changes.
void selectionModeChanged(SelectionFlags mode);
void shadowQualityChanged(ShadowQuality quality);
+ void msaaSamplesChanged(int samples);
void sceneChanged(Q3DScene *scene);
void inputHandlerChanged(QAbstract3DInputHandler *inputHandler);
void themeChanged(Q3DTheme *theme);
- void clearWindowBeforeRenderingChanged(bool enable);
+ void renderingModeChanged(RenderingMode mode);
private:
- Abstract3DController *m_controller;
+ QPointer<Abstract3DController> m_controller;
QRectF m_cachedGeometry;
- bool m_clearWindowBeforeRendering;
+ QOpenGLContext *m_context;
+ QOpenGLContext *m_qtContext;
+ QQuickWindow *m_contextWindow;
+ AbstractDeclarative::RenderingMode m_renderMode;
+ int m_samples;
+ int m_windowSamples;
+ QSize m_initialisedSize;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(AbstractDeclarative::SelectionFlags)
QT_END_NAMESPACE_DATAVISUALIZATION
-#endif // ABSTRACTDECLARATIVE_P_H
+#endif
diff --git a/src/datavisualizationqml2/colorgradient_p.h b/src/datavisualizationqml2/colorgradient_p.h
index 31e3d305..c870ebcb 100644
--- a/src/datavisualizationqml2/colorgradient_p.h
+++ b/src/datavisualizationqml2/colorgradient_p.h
@@ -30,8 +30,8 @@
#define COLORGRADIENT_P_H
#include "datavisualizationglobal_p.h"
-#include <QColor>
-#include <QQmlListProperty>
+#include <QtGui/QColor>
+#include <QtQml/QQmlListProperty>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualizationqml2/datavisualizationqml2.pro b/src/datavisualizationqml2/datavisualizationqml2.pro
index 6396b86b..df6c647d 100644
--- a/src/datavisualizationqml2/datavisualizationqml2.pro
+++ b/src/datavisualizationqml2/datavisualizationqml2.pro
@@ -1,19 +1,12 @@
-TEMPLATE = lib
TARGET = datavisualizationqml2
QT += qml quick datavisualization
-CONFIG += qt plugin
+TARGETPATH = QtDataVisualization
+IMPORT_VERSION = $$MODULE_VERSION
-TARGET = $$qtLibraryTarget($$TARGET)
-uri = QtDataVisualization
+# Only build qml plugin static if Qt itself is also built static
+!contains(QT_CONFIG, static): CONFIG -= static staticlib
-static {
- DEFINES += QT_DATAVISUALIZATION_STATICLIB
- # Only build qml plugin static if Qt itself is also built static
- !contains(QT_CONFIG, static): CONFIG -= static staticlib
-
- # Insert the plugin URI into its meta data to enable static plugin usage
- QMAKE_MOC_OPTIONS += -Muri=$$uri
-}
+include($$PWD/designer/designer.pri)
INCLUDEPATH += ../../include \
../../include/QtDataVisualization \
@@ -32,7 +25,8 @@ SOURCES += \
declarativeseries.cpp \
declarativetheme.cpp \
declarativecolor.cpp \
- declarativescene.cpp
+ declarativescene.cpp \
+ declarativerendernode.cpp
HEADERS += \
datavisualizationqml2_plugin.h \
@@ -44,22 +38,21 @@ HEADERS += \
declarativeseries_p.h \
declarativetheme_p.h \
declarativecolor_p.h \
- declarativescene_p.h
+ declarativescene_p.h \
+ declarativerendernode_p.h
OTHER_FILES = qmldir
-!equals(_PRO_FILE_PWD_, $$OUT_PWD) {
- copy_qmldir.target = $$OUT_PWD/qmldir
+CONFIG += no_cxx_module
+
+load(qml_plugin)
+
+# Copy qmldir to DESTDIR so we can use the plugin directly from there in our examples
+# without having to do 'make install'.
+!android:!ios {
+ copy_qmldir.target = $$DESTDIR/qmldir
copy_qmldir.depends = $$_PRO_FILE_PWD_/qmldir
copy_qmldir.commands = $(COPY_FILE) \"$$replace(copy_qmldir.depends, /, $$QMAKE_DIR_SEP)\" \"$$replace(copy_qmldir.target, /, $$QMAKE_DIR_SEP)\"
QMAKE_EXTRA_TARGETS += copy_qmldir
PRE_TARGETDEPS += $$copy_qmldir.target
}
-
-qmldir.files = qmldir
-
-installPath = $$[QT_INSTALL_QML]/$$replace(uri, \\., /)
-qmldir.path = $$installPath
-target.path = $$installPath
-INSTALLS += target qmldir
-
diff --git a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp
index f926b7fa..04e70ecb 100644
--- a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp
+++ b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp
@@ -18,7 +18,7 @@
#include "datavisualizationqml2_plugin.h"
-#include <qqml.h>
+#include <QtQml>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualizationqml2/datavisualizationqml2_plugin.h b/src/datavisualizationqml2/datavisualizationqml2_plugin.h
index c12c2cb2..e39d6b35 100644
--- a/src/datavisualizationqml2/datavisualizationqml2_plugin.h
+++ b/src/datavisualizationqml2/datavisualizationqml2_plugin.h
@@ -44,7 +44,7 @@
#include "declarativecolor_p.h"
#include "declarativescene_p.h"
-#include <QQmlExtensionPlugin>
+#include <QtQml/QQmlExtensionPlugin>
using namespace QtDataVisualization;
diff --git a/src/datavisualizationqml2/declarativebars.cpp b/src/datavisualizationqml2/declarativebars.cpp
index e24526c3..4f984c32 100644
--- a/src/datavisualizationqml2/declarativebars.cpp
+++ b/src/datavisualizationqml2/declarativebars.cpp
@@ -35,6 +35,8 @@ DeclarativeBars::DeclarativeBars(QQuickItem *parent)
QObject::connect(m_barsController, &Bars3DController::primarySeriesChanged,
this, &DeclarativeBars::primarySeriesChanged);
+ QObject::connect(m_barsController, &Bars3DController::selectedSeriesChanged,
+ this, &DeclarativeBars::selectedSeriesChanged);
}
DeclarativeBars::~DeclarativeBars()
@@ -124,6 +126,11 @@ bool DeclarativeBars::isBarSpacingRelative() const
return m_barsController->isBarSpecRelative();
}
+QBar3DSeries *DeclarativeBars::selectedSeries() const
+{
+ return m_barsController->selectedSeries();
+}
+
QQmlListProperty<QBar3DSeries> DeclarativeBars::seriesList()
{
return QQmlListProperty<QBar3DSeries>(this, this,
diff --git a/src/datavisualizationqml2/declarativebars_p.h b/src/datavisualizationqml2/declarativebars_p.h
index e5a90a01..97f5882a 100644
--- a/src/datavisualizationqml2/declarativebars_p.h
+++ b/src/datavisualizationqml2/declarativebars_p.h
@@ -38,11 +38,6 @@
#include "qbardataproxy.h"
#include "qbar3dseries.h"
-#include <QAbstractItemModel>
-#include <QQuickItem>
-#include <QObject>
-#include <QQuickWindow>
-
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
class DeclarativeBars : public AbstractDeclarative
@@ -56,6 +51,7 @@ class DeclarativeBars : public AbstractDeclarative
Q_PROPERTY(QSizeF barSpacing READ barSpacing WRITE setBarSpacing NOTIFY barSpacingChanged)
Q_PROPERTY(bool barSpacingRelative READ isBarSpacingRelative WRITE setBarSpacingRelative NOTIFY barSpacingRelativeChanged)
Q_PROPERTY(QQmlListProperty<QBar3DSeries> seriesList READ seriesList)
+ Q_PROPERTY(QBar3DSeries *selectedSeries READ selectedSeries NOTIFY selectedSeriesChanged)
Q_PROPERTY(QBar3DSeries *primarySeries READ primarySeries WRITE setPrimarySeries NOTIFY primarySeriesChanged)
Q_CLASSINFO("DefaultProperty", "seriesList")
@@ -93,6 +89,8 @@ public:
void setPrimarySeries(QBar3DSeries *series);
QBar3DSeries *primarySeries() const;
+ QBar3DSeries *selectedSeries() const;
+
public slots:
void handleAxisXChanged(QAbstract3DAxis *axis);
void handleAxisYChanged(QAbstract3DAxis *axis);
@@ -108,6 +106,7 @@ signals:
void barSpacingRelativeChanged(bool relative);
void meshFileNameChanged(QString filename);
void primarySeriesChanged(QBar3DSeries *series);
+ void selectedSeriesChanged(QBar3DSeries *series);
private:
Bars3DController *m_barsController;
diff --git a/src/datavisualizationqml2/declarativecolor_p.h b/src/datavisualizationqml2/declarativecolor_p.h
index 67eb9a2b..87463384 100644
--- a/src/datavisualizationqml2/declarativecolor_p.h
+++ b/src/datavisualizationqml2/declarativecolor_p.h
@@ -30,7 +30,7 @@
#define DECLARATIVECOLOR_P_H
#include "datavisualizationglobal_p.h"
-#include <QColor>
+#include <QtGui/QColor>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualizationqml2/declarativerendernode.cpp b/src/datavisualizationqml2/declarativerendernode.cpp
new file mode 100644
index 00000000..1f6d4b56
--- /dev/null
+++ b/src/datavisualizationqml2/declarativerendernode.cpp
@@ -0,0 +1,150 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+#include "declarativerendernode_p.h"
+#include "abstract3dcontroller_p.h"
+#include "abstractdeclarative_p.h"
+#include <QtGui/QOpenGLContext>
+#include <QtGui/QOpenGLFramebufferObject>
+
+QT_BEGIN_NAMESPACE_DATAVISUALIZATION
+
+DeclarativeRenderNode::DeclarativeRenderNode(AbstractDeclarative *declarative)
+ : QSGGeometryNode(),
+ m_geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 4),
+ m_texture(0),
+ m_declarative(declarative),
+ m_controller(0),
+ m_fbo(0),
+ m_multisampledFBO(0),
+ m_window(0),
+ m_samples(0),
+ m_dirtyFBO(false)
+{
+ setMaterial(&m_material);
+ setOpaqueMaterial(&m_materialO);
+ setGeometry(&m_geometry);
+ setFlag(UsePreprocess);
+}
+
+DeclarativeRenderNode::~DeclarativeRenderNode()
+{
+ delete m_fbo;
+ delete m_multisampledFBO;
+ delete m_texture;
+}
+
+void DeclarativeRenderNode::setSize(const QSize &size)
+{
+ if (size == m_size)
+ return;
+
+ m_size = size;
+ m_dirtyFBO = true;
+ markDirty(DirtyGeometry);
+}
+
+void DeclarativeRenderNode::update()
+{
+ if (m_dirtyFBO) {
+ updateFBO();
+ m_dirtyFBO = false;
+ }
+}
+
+void DeclarativeRenderNode::updateFBO()
+{
+ m_declarative->activateOpenGLContext(m_window);
+
+ if (m_fbo)
+ delete m_fbo;
+
+ m_fbo = new QOpenGLFramebufferObject(m_size);
+ m_fbo->setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
+
+ // Multisampled
+ if (m_multisampledFBO) {
+ delete m_multisampledFBO;
+ m_multisampledFBO = 0;
+ }
+ if (m_samples > 0) {
+ QOpenGLFramebufferObjectFormat multisampledFrambufferFormat;
+ multisampledFrambufferFormat.setSamples(m_samples);
+ multisampledFrambufferFormat.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
+
+ m_multisampledFBO = new QOpenGLFramebufferObject(m_size, multisampledFrambufferFormat);
+ }
+
+ QSGGeometry::updateTexturedRectGeometry(&m_geometry,
+ QRectF(0, 0,
+ m_size.width() / m_controller->scene()->devicePixelRatio(),
+ m_size.height() / m_controller->scene()->devicePixelRatio()),
+ QRectF(0, 1, 1, -1));
+
+ delete m_texture;
+ m_texture = m_window->createTextureFromId(m_fbo->texture(), m_size);
+ m_material.setTexture(m_texture);
+ m_materialO.setTexture(m_texture);
+
+ m_declarative->doneOpenGLContext(m_window);
+}
+
+void DeclarativeRenderNode::setQuickWindow(QQuickWindow *window)
+{
+ Q_ASSERT(window);
+
+ m_window = window;
+}
+
+void DeclarativeRenderNode::setController(Abstract3DController *controller)
+{
+ m_controller = controller;
+}
+
+void DeclarativeRenderNode::setSamples(int samples)
+{
+ if (m_samples == samples)
+ return;
+
+ m_samples = samples;
+ m_dirtyFBO = true;
+}
+
+void DeclarativeRenderNode::preprocess()
+{
+ QOpenGLFramebufferObject *targetFBO;
+ if (m_samples > 0)
+ targetFBO = m_multisampledFBO;
+ else
+ targetFBO = m_fbo;
+
+ m_declarative->activateOpenGLContext(m_window);
+
+ targetFBO->bind();
+ // Render scene here
+ m_controller->render(targetFBO->handle());
+
+ targetFBO->release();
+
+ if (m_samples > 0)
+ QOpenGLFramebufferObject::blitFramebuffer(m_fbo, m_multisampledFBO);
+
+ m_declarative->doneOpenGLContext(m_window);
+}
+
+QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualizationqml2/declarativerendernode_p.h b/src/datavisualizationqml2/declarativerendernode_p.h
new file mode 100644
index 00000000..e35791d4
--- /dev/null
+++ b/src/datavisualizationqml2/declarativerendernode_p.h
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVis3D module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the QtDataVisualization 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 DECLARATIVERENDERNODE_P_H
+#define DECLARATIVERENDERNODE_P_H
+
+#include "datavisualizationglobal_p.h"
+
+#include <QtQuick/QSGGeometryNode>
+#include <QtQuick/QSGTextureMaterial>
+#include <QtQuick/QSGOpaqueTextureMaterial>
+#include <QtQuick/QQuickWindow>
+
+class QOpenGLContext;
+class QOpenGLFramebufferObject;
+
+QT_BEGIN_NAMESPACE_DATAVISUALIZATION
+
+class Abstract3DController;
+class AbstractDeclarative;
+
+class DeclarativeRenderNode : public QSGGeometryNode
+{
+public:
+ DeclarativeRenderNode(AbstractDeclarative *declarative);
+ ~DeclarativeRenderNode();
+
+ void setSize(const QSize &size);
+ QSize size() const { return m_size; }
+
+ void update();
+ void updateFBO();
+
+ void setController(Abstract3DController *controller);
+ void setQuickWindow(QQuickWindow *window);
+ void setSamples(int samples);
+
+ void preprocess();
+
+private:
+ QSGTextureMaterial m_material;
+ QSGOpaqueTextureMaterial m_materialO;
+ QSGGeometry m_geometry;
+ QSGTexture *m_texture;
+ QSize m_size;
+
+ AbstractDeclarative *m_declarative;
+ Abstract3DController *m_controller;
+ QOpenGLFramebufferObject *m_fbo;
+ QOpenGLFramebufferObject *m_multisampledFBO;
+ QQuickWindow *m_window;
+ int m_samples;
+
+ bool m_dirtyFBO;
+};
+
+QT_END_NAMESPACE_DATAVISUALIZATION
+
+#endif
diff --git a/src/datavisualizationqml2/declarativescatter.cpp b/src/datavisualizationqml2/declarativescatter.cpp
index 81a1e879..dcc52a3d 100644
--- a/src/datavisualizationqml2/declarativescatter.cpp
+++ b/src/datavisualizationqml2/declarativescatter.cpp
@@ -31,6 +31,9 @@ DeclarativeScatter::DeclarativeScatter(QQuickItem *parent)
// Create the shared component on the main GUI thread.
m_scatterController = new Scatter3DController(boundingRect().toRect(), new Declarative3DScene);
setSharedController(m_scatterController);
+
+ QObject::connect(m_scatterController, &Scatter3DController::selectedSeriesChanged,
+ this, &DeclarativeScatter::selectedSeriesChanged);
}
DeclarativeScatter::~DeclarativeScatter()
@@ -68,6 +71,11 @@ void DeclarativeScatter::setAxisZ(QValue3DAxis *axis)
m_scatterController->setAxisZ(axis);
}
+QScatter3DSeries *DeclarativeScatter::selectedSeries() const
+{
+ return m_scatterController->selectedSeries();
+}
+
QQmlListProperty<QScatter3DSeries> DeclarativeScatter::seriesList()
{
return QQmlListProperty<QScatter3DSeries>(this, this,
diff --git a/src/datavisualizationqml2/declarativescatter_p.h b/src/datavisualizationqml2/declarativescatter_p.h
index bca44085..79b56e02 100644
--- a/src/datavisualizationqml2/declarativescatter_p.h
+++ b/src/datavisualizationqml2/declarativescatter_p.h
@@ -37,10 +37,6 @@
#include "qscatterdataproxy.h"
#include "qscatter3dseries.h"
-#include <QAbstractItemModel>
-#include <QQuickItem>
-#include <QObject>
-
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
class DeclarativeScatter : public AbstractDeclarative
@@ -49,6 +45,7 @@ class DeclarativeScatter : public AbstractDeclarative
Q_PROPERTY(QValue3DAxis *axisX READ axisX WRITE setAxisX NOTIFY axisXChanged)
Q_PROPERTY(QValue3DAxis *axisY READ axisY WRITE setAxisY NOTIFY axisYChanged)
Q_PROPERTY(QValue3DAxis *axisZ READ axisZ WRITE setAxisZ NOTIFY axisZChanged)
+ Q_PROPERTY(QScatter3DSeries *selectedSeries READ selectedSeries NOTIFY selectedSeriesChanged)
Q_PROPERTY(QQmlListProperty<QScatter3DSeries> seriesList READ seriesList)
Q_CLASSINFO("DefaultProperty", "seriesList")
@@ -71,6 +68,8 @@ public:
Q_INVOKABLE void addSeries(QScatter3DSeries *series);
Q_INVOKABLE void removeSeries(QScatter3DSeries *series);
+ QScatter3DSeries *selectedSeries() const;
+
public slots:
void handleAxisXChanged(QAbstract3DAxis *axis);
void handleAxisYChanged(QAbstract3DAxis *axis);
@@ -80,6 +79,7 @@ signals:
void axisXChanged(QValue3DAxis *axis);
void axisYChanged(QValue3DAxis *axis);
void axisZChanged(QValue3DAxis *axis);
+ void selectedSeriesChanged(QScatter3DSeries *series);
protected:
Scatter3DController *m_scatterController;
diff --git a/src/datavisualizationqml2/declarativeseries.cpp b/src/datavisualizationqml2/declarativeseries.cpp
index 1a762152..21555f45 100644
--- a/src/datavisualizationqml2/declarativeseries.cpp
+++ b/src/datavisualizationqml2/declarativeseries.cpp
@@ -20,7 +20,7 @@
#include "qbardataproxy.h"
#include "qscatterdataproxy.h"
#include "qsurfacedataproxy.h"
-#include <QMetaMethod>
+#include <QtCore/QMetaMethod>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualizationqml2/declarativeseries_p.h b/src/datavisualizationqml2/declarativeseries_p.h
index f196e311..25540e9b 100644
--- a/src/datavisualizationqml2/declarativeseries_p.h
+++ b/src/datavisualizationqml2/declarativeseries_p.h
@@ -34,7 +34,7 @@
#include "qscatter3dseries.h"
#include "qsurface3dseries.h"
#include "colorgradient_p.h"
-#include <QQmlListProperty>
+#include <QtQml/QQmlListProperty>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualizationqml2/declarativesurface.cpp b/src/datavisualizationqml2/declarativesurface.cpp
index c0e1ddcc..78519586 100644
--- a/src/datavisualizationqml2/declarativesurface.cpp
+++ b/src/datavisualizationqml2/declarativesurface.cpp
@@ -32,6 +32,9 @@ DeclarativeSurface::DeclarativeSurface(QQuickItem *parent)
// Create the shared component on the main GUI thread.
m_surfaceController = new Surface3DController(boundingRect().toRect(), new Declarative3DScene);
setSharedController(m_surfaceController);
+
+ QObject::connect(m_surfaceController, &Surface3DController::selectedSeriesChanged,
+ this, &DeclarativeSurface::selectedSeriesChanged);
}
DeclarativeSurface::~DeclarativeSurface()
@@ -69,16 +72,22 @@ void DeclarativeSurface::setAxisZ(QValue3DAxis *axis)
m_surfaceController->setAxisZ(axis);
}
+QSurface3DSeries *DeclarativeSurface::selectedSeries() const
+{
+ return m_surfaceController->selectedSeries();
+}
+
QQmlListProperty<QSurface3DSeries> DeclarativeSurface::seriesList()
{
return QQmlListProperty<QSurface3DSeries>(this, this,
- &DeclarativeSurface::appendSeriesFunc,
- &DeclarativeSurface::countSeriesFunc,
- &DeclarativeSurface::atSeriesFunc,
- &DeclarativeSurface::clearSeriesFunc);
+ &DeclarativeSurface::appendSeriesFunc,
+ &DeclarativeSurface::countSeriesFunc,
+ &DeclarativeSurface::atSeriesFunc,
+ &DeclarativeSurface::clearSeriesFunc);
}
-void DeclarativeSurface::appendSeriesFunc(QQmlListProperty<QSurface3DSeries> *list, QSurface3DSeries *series)
+void DeclarativeSurface::appendSeriesFunc(QQmlListProperty<QSurface3DSeries> *list,
+ QSurface3DSeries *series)
{
reinterpret_cast<DeclarativeSurface *>(list->data)->addSeries(series);
}
diff --git a/src/datavisualizationqml2/declarativesurface_p.h b/src/datavisualizationqml2/declarativesurface_p.h
index b354fe59..a4747167 100644
--- a/src/datavisualizationqml2/declarativesurface_p.h
+++ b/src/datavisualizationqml2/declarativesurface_p.h
@@ -37,11 +37,6 @@
#include "qsurfacedataproxy.h"
#include "qsurface3dseries.h"
-#include <QAbstractItemModel>
-#include <QQuickItem>
-#include <QObject>
-#include <QQuickWindow>
-
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
class DeclarativeSurface : public AbstractDeclarative
@@ -50,6 +45,7 @@ class DeclarativeSurface : public AbstractDeclarative
Q_PROPERTY(QValue3DAxis *axisX READ axisX WRITE setAxisX NOTIFY axisXChanged)
Q_PROPERTY(QValue3DAxis *axisY READ axisY WRITE setAxisY NOTIFY axisYChanged)
Q_PROPERTY(QValue3DAxis *axisZ READ axisZ WRITE setAxisZ NOTIFY axisZChanged)
+ Q_PROPERTY(QSurface3DSeries *selectedSeries READ selectedSeries NOTIFY selectedSeriesChanged)
Q_PROPERTY(QQmlListProperty<QSurface3DSeries> seriesList READ seriesList)
Q_CLASSINFO("DefaultProperty", "seriesList")
@@ -72,6 +68,8 @@ public:
Q_INVOKABLE void addSeries(QSurface3DSeries *series);
Q_INVOKABLE void removeSeries(QSurface3DSeries *series);
+ QSurface3DSeries *selectedSeries() const;
+
public slots:
void handleAxisXChanged(QAbstract3DAxis *axis);
void handleAxisYChanged(QAbstract3DAxis *axis);
@@ -81,6 +79,7 @@ signals:
void axisXChanged(QValue3DAxis *axis);
void axisYChanged(QValue3DAxis *axis);
void axisZChanged(QValue3DAxis *axis);
+ void selectedSeriesChanged(QSurface3DSeries *series);
private:
Surface3DController *m_surfaceController;
diff --git a/src/datavisualizationqml2/declarativetheme_p.h b/src/datavisualizationqml2/declarativetheme_p.h
index 8101cf71..a7f40b1e 100644
--- a/src/datavisualizationqml2/declarativetheme_p.h
+++ b/src/datavisualizationqml2/declarativetheme_p.h
@@ -34,7 +34,7 @@
#include "colorgradient_p.h"
#include "q3dtheme_p.h"
-#include <QtQml/qqmlparserstatus.h>
+#include <QtQml/QQmlParserStatus>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualizationqml2/designer/Bars3DSpecifics.qml b/src/datavisualizationqml2/designer/Bars3DSpecifics.qml
new file mode 100644
index 00000000..ce07f88c
--- /dev/null
+++ b/src/datavisualizationqml2/designer/Bars3DSpecifics.qml
@@ -0,0 +1,169 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import HelperWidgets 2.0
+import QtQuick.Layouts 1.0
+
+Column {
+ anchors.left: parent.left
+ anchors.right: parent.right
+
+ Section {
+ anchors.left: parent.left
+ anchors.right: parent.right
+ caption: qsTr("Bars3D")
+
+ SectionLayout {
+ Label {
+ text: qsTr("multiSeriesUniform")
+ toolTip: qsTr("Multiseries Uniform")
+ Layout.fillWidth: true
+ }
+ SecondColumnLayout {
+ CheckBox {
+ backendValue: backendValues.multiSeriesUniform
+ Layout.fillWidth: true
+ }
+ }
+ Label {
+ text: qsTr("barThickness")
+ toolTip: qsTr("Bar Thickness Ratio")
+ Layout.fillWidth: true
+ }
+ SecondColumnLayout {
+ SpinBox {
+ backendValue: backendValues.barThickness // Why does this export value as string?
+ minimumValue: 0.001
+ maximumValue: 10.0
+ stepSize: 0.001
+ decimals: 3
+ Layout.fillWidth: true
+ }
+ }
+ Label {
+ text: qsTr("barSpacing")
+ toolTip: qsTr("Bar Spacing")
+ Layout.fillWidth: true
+ }
+ SecondColumnLayout {
+ SpinBox {
+ prefix: "col: "
+ backendValue: backendValues.barSpacing.width // Does not work
+ minimumValue: 0.0
+ maximumValue: 10.0
+ stepSize: 0.01
+ decimals: 2
+ Layout.fillWidth: true
+ }
+ SpinBox {
+ prefix: "row: "
+ backendValue: backendValues.barSpacing.height // Does not work
+ minimumValue: 0.0
+ maximumValue: 10.0
+ stepSize: 0.01
+ decimals: 2
+ Layout.fillWidth: true
+ }
+ }
+ Label {
+ text: qsTr("barSpacingRelative")
+ toolTip: qsTr("Bar Spacing Relative")
+ Layout.fillWidth: true
+ }
+ SecondColumnLayout {
+ CheckBox {
+ backendValue: backendValues.barSpacingRelative
+ Layout.fillWidth: true
+ }
+ }
+ Label {
+ text: qsTr("renderingMode")
+ toolTip: qsTr("Rendering Mode")
+ Layout.fillWidth: true
+ }
+ SecondColumnLayout {
+ ComboBox {
+ backendValue: backendValues.renderingMode
+ model: ["RenderIndirect", "RenderDirectoToBackground",
+ "RenderDirectoToBackground_NoClear"]
+ Layout.fillWidth: true
+ }
+ }
+ Label {
+ text: qsTr("msaaSamples")
+ toolTip: qsTr("MSAA Sample Count")
+ Layout.fillWidth: true
+ }
+ SpinBox {
+ suffix: " x MSAA"
+ backendValue: backendValues.msaaSamples
+ minimumValue: 0
+ maximumValue: 16
+ Layout.fillWidth: true
+ }
+ Label {
+ text: qsTr("shadowQuality")
+ toolTip: qsTr("Shadow Quality")
+ Layout.fillWidth: true
+ }
+ SecondColumnLayout {
+ ComboBox {
+ backendValue: backendValues.shadowQuality
+ model: ["ShadowQualityNone", "ShadowQualityLow", "ShadowQualityMedium",
+ "ShadowQualityHigh", "ShadowQualitySoftLow", "ShadowQualitySoftMedium",
+ "ShadowQualitySoftHigh"]
+ Layout.fillWidth: true
+ }
+ }
+ Label {
+ text: qsTr("selectionMode")
+ toolTip: qsTr("Selection Mode")
+ Layout.fillWidth: true
+ }
+ SecondColumnLayout {
+ ComboBox {
+ backendValue: backendValues.selectionMode
+ model: [
+ "SelectionNone",
+ "SelectionItem",
+ "SelectionRow",
+ "SelectionItemAndRow",
+ "SelectionColumn",
+ "SelectionItemAndColumn",
+ "SelectionRowAndColumn",
+ "SelectionItemRowAndColumn",
+ "SelectionRow | SelectionSlice",
+ "SelectionItemAndRow | SelectionSlice",
+ "SelectionColumn | SelectionSlice",
+ "SelectionItemAndColumn | SelectionSlice",
+ "SelectionRow | SelectionMultiSeries",
+ "SelectionItemAndRow | SelectionMultiSeries",
+ "SelectionColumn | SelectionMultiSeries",
+ "SelectionItemAndColumn | SelectionMultiSeries",
+ "SelectionRow | SelectionSlice | SelectionMultiSeries",
+ "SelectionItemAndRow | SelectionSlice | SelectionMultiSeries",
+ "SelectionColumn | SelectionSlice | SelectionMultiSeries",
+ "SelectionItemAndColumn | SelectionSlice | SelectionMultiSeries"
+ ]
+ Layout.fillWidth: true
+ }
+ }
+ }
+ }
+}
diff --git a/src/datavisualizationqml2/designer/Scatter3DSpecifics.qml b/src/datavisualizationqml2/designer/Scatter3DSpecifics.qml
new file mode 100644
index 00000000..9ba6bf00
--- /dev/null
+++ b/src/datavisualizationqml2/designer/Scatter3DSpecifics.qml
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import HelperWidgets 2.0
+import QtQuick.Layouts 1.0
+
+Column {
+ anchors.left: parent.left
+ anchors.right: parent.right
+
+ Section {
+ anchors.left: parent.left
+ anchors.right: parent.right
+ caption: qsTr("Scatter3D")
+
+ SectionLayout {
+ Label {
+ text: qsTr("renderingMode")
+ toolTip: qsTr("Rendering Mode")
+ Layout.fillWidth: true
+ }
+ SecondColumnLayout {
+ ComboBox {
+ backendValue: backendValues.renderingMode
+ model: ["RenderIndirect", "RenderDirectoToBackground",
+ "RenderDirectoToBackground_NoClear"]
+ Layout.fillWidth: true
+ }
+ }
+ Label {
+ text: qsTr("msaaSamples")
+ toolTip: qsTr("MSAA Sample Count")
+ Layout.fillWidth: true
+ }
+ SpinBox {
+ suffix: " x MSAA"
+ backendValue: backendValues.msaaSamples
+ minimumValue: 0
+ maximumValue: 16
+ Layout.fillWidth: true
+ }
+ Label {
+ text: qsTr("shadowQuality")
+ toolTip: qsTr("Shadow Quality")
+ Layout.fillWidth: true
+ }
+ SecondColumnLayout {
+ ComboBox {
+ backendValue: backendValues.shadowQuality
+ model: ["ShadowQualityNone", "ShadowQualityLow", "ShadowQualityMedium",
+ "ShadowQualityHigh", "ShadowQualitySoftLow", "ShadowQualitySoftMedium",
+ "ShadowQualitySoftHigh"]
+ Layout.fillWidth: true
+ }
+ }
+ Label {
+ text: qsTr("selectionMode")
+ toolTip: qsTr("Selection Mode")
+ Layout.fillWidth: true
+ }
+ SecondColumnLayout {
+ ComboBox {
+ backendValue: backendValues.selectionMode
+ model: ["SelectionNone", "SelectionItem"]
+ Layout.fillWidth: true
+ }
+ }
+ }
+ }
+}
diff --git a/src/datavisualizationqml2/designer/Surface3DSpecifics.qml b/src/datavisualizationqml2/designer/Surface3DSpecifics.qml
new file mode 100644
index 00000000..edd109e0
--- /dev/null
+++ b/src/datavisualizationqml2/designer/Surface3DSpecifics.qml
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import HelperWidgets 2.0
+import QtQuick.Layouts 1.0
+
+Column {
+ anchors.left: parent.left
+ anchors.right: parent.right
+
+ Section {
+ anchors.left: parent.left
+ anchors.right: parent.right
+ caption: qsTr("Surface3D")
+
+ SectionLayout {
+ Label {
+ text: qsTr("renderingMode")
+ toolTip: qsTr("Rendering Mode")
+ Layout.fillWidth: true
+ }
+ SecondColumnLayout {
+ ComboBox {
+ backendValue: backendValues.renderingMode
+ model: ["RenderIndirect", "RenderDirectoToBackground",
+ "RenderDirectoToBackground_NoClear"]
+ Layout.fillWidth: true
+ }
+ }
+ Label {
+ text: qsTr("msaaSamples")
+ toolTip: qsTr("MSAA Sample Count")
+ Layout.fillWidth: true
+ }
+ SpinBox {
+ suffix: " x MSAA"
+ backendValue: backendValues.msaaSamples
+ minimumValue: 0
+ maximumValue: 16
+ Layout.fillWidth: true
+ }
+ Label {
+ text: qsTr("shadowQuality")
+ toolTip: qsTr("Shadow Quality")
+ Layout.fillWidth: true
+ }
+ SecondColumnLayout {
+ ComboBox {
+ backendValue: backendValues.shadowQuality
+ model: ["ShadowQualityNone", "ShadowQualityLow", "ShadowQualityMedium",
+ "ShadowQualityHigh", "ShadowQualitySoftLow", "ShadowQualitySoftMedium",
+ "ShadowQualitySoftHigh"]
+ Layout.fillWidth: true
+ }
+ }
+ Label {
+ text: qsTr("selectionMode")
+ toolTip: qsTr("Selection Mode")
+ Layout.fillWidth: true
+ }
+ SecondColumnLayout {
+ ComboBox {
+ backendValue: backendValues.selectionMode
+ model: [
+ "SelectionNone",
+ "SelectionItem",
+ "SelectionRow | SelectionSlice",
+ "SelectionItemAndRow | SelectionSlice",
+ "SelectionColumn | SelectionSlice",
+ "SelectionItemAndColumn | SelectionSlice",
+ "SelectionRow | SelectionSlice | SelectionMultiSeries",
+ "SelectionItemAndRow | SelectionSlice | SelectionMultiSeries",
+ "SelectionColumn | SelectionSlice | SelectionMultiSeries",
+ "SelectionItemAndColumn | SelectionSlice | SelectionMultiSeries"
+ ]
+ Layout.fillWidth: true
+ }
+ }
+ }
+ }
+}
diff --git a/src/datavisualizationqml2/designer/designer.pri b/src/datavisualizationqml2/designer/designer.pri
new file mode 100644
index 00000000..db7c9b96
--- /dev/null
+++ b/src/datavisualizationqml2/designer/designer.pri
@@ -0,0 +1,16 @@
+QML_FILES += \
+ $$PWD/Bars3DSpecifics.qml \
+ $$PWD/Scatter3DSpecifics.qml \
+ $$PWD/Surface3DSpecifics.qml
+
+QML_FILES += $$PWD/qtdatavisualization.metainfo
+
+# Images
+QML_FILES += \
+ $$PWD/images/bars3d-icon.png \
+ $$PWD/images/bars3d-icon16.png \
+ $$PWD/images/scatter3d-icon.png \
+ $$PWD/images/scatter3d-icon16.png \
+ $$PWD/images/surface3d-icon.png \
+ $$PWD/images/surface3d-icon16.png
+
diff --git a/src/datavisualizationqml2/designer/images/bars3d-icon.png b/src/datavisualizationqml2/designer/images/bars3d-icon.png
new file mode 100644
index 00000000..3312602e
--- /dev/null
+++ b/src/datavisualizationqml2/designer/images/bars3d-icon.png
Binary files differ
diff --git a/src/datavisualizationqml2/designer/images/bars3d-icon16.png b/src/datavisualizationqml2/designer/images/bars3d-icon16.png
new file mode 100644
index 00000000..b21c825e
--- /dev/null
+++ b/src/datavisualizationqml2/designer/images/bars3d-icon16.png
Binary files differ
diff --git a/src/datavisualizationqml2/designer/images/scatter3d-icon.png b/src/datavisualizationqml2/designer/images/scatter3d-icon.png
new file mode 100644
index 00000000..f8487a90
--- /dev/null
+++ b/src/datavisualizationqml2/designer/images/scatter3d-icon.png
Binary files differ
diff --git a/src/datavisualizationqml2/designer/images/scatter3d-icon16.png b/src/datavisualizationqml2/designer/images/scatter3d-icon16.png
new file mode 100644
index 00000000..6fb41943
--- /dev/null
+++ b/src/datavisualizationqml2/designer/images/scatter3d-icon16.png
Binary files differ
diff --git a/src/datavisualizationqml2/designer/images/surface3d-icon.png b/src/datavisualizationqml2/designer/images/surface3d-icon.png
new file mode 100644
index 00000000..bc1e4ee0
--- /dev/null
+++ b/src/datavisualizationqml2/designer/images/surface3d-icon.png
Binary files differ
diff --git a/src/datavisualizationqml2/designer/images/surface3d-icon16.png b/src/datavisualizationqml2/designer/images/surface3d-icon16.png
new file mode 100644
index 00000000..917dcdf9
--- /dev/null
+++ b/src/datavisualizationqml2/designer/images/surface3d-icon16.png
Binary files differ
diff --git a/src/datavisualizationqml2/designer/qtdatavisualization.metainfo b/src/datavisualizationqml2/designer/qtdatavisualization.metainfo
new file mode 100644
index 00000000..0d7b14be
--- /dev/null
+++ b/src/datavisualizationqml2/designer/qtdatavisualization.metainfo
@@ -0,0 +1,38 @@
+MetaInfo {
+ Type {
+ name: "QtDataVisualization.Bars3D"
+ icon: "images/bars3d-icon16.png"
+
+ ItemLibraryEntry {
+ name: "Bars3D"
+ category: "Qt Data Visualization"
+ libraryIcon: "images/bars3d-icon.png"
+ version: "1.0"
+ requiredImport: "QtDataVisualization"
+ }
+ }
+ Type {
+ name: "QtDataVisualization.Scatter3D"
+ icon: "images/scatter3d-icon16.png"
+
+ ItemLibraryEntry {
+ name: "Scatter3D"
+ category: "Qt Data Visualization"
+ libraryIcon: "images/scatter3d-icon.png"
+ version: "1.0"
+ requiredImport: "QtDataVisualization"
+ }
+ }
+ Type {
+ name: "QtDataVisualization.Surface3D"
+ icon: "images/surface3d-icon16.png"
+
+ ItemLibraryEntry {
+ name: "Surface3D"
+ category: "Qt Data Visualization"
+ libraryIcon: "images/surface3d-icon.png"
+ version: "1.0"
+ requiredImport: "QtDataVisualization"
+ }
+ }
+}
diff --git a/tests/barstest/barstest.pro b/tests/barstest/barstest.pro
index 108f8aa7..f213ea9e 100644
--- a/tests/barstest/barstest.pro
+++ b/tests/barstest/barstest.pro
@@ -6,5 +6,3 @@ SOURCES += main.cpp chart.cpp custominputhandler.cpp
HEADERS += chart.h custominputhandler.h
QT += widgets
-
-INSTALLS += target
diff --git a/tests/barstest/chart.cpp b/tests/barstest/chart.cpp
index 8ab619ec..e7a0e2ca 100644
--- a/tests/barstest/chart.cpp
+++ b/tests/barstest/chart.cpp
@@ -1095,10 +1095,8 @@ void GraphModifier::triggerRotation()
} else {
// Rotate the first series instead
static float seriesAngle = 0.0f;
- if (m_graph->seriesList().size()) {
- QQuaternion rotation = QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, seriesAngle++);
- m_graph->seriesList().at(0)->setMeshRotation(rotation);
- }
+ if (m_graph->seriesList().size())
+ m_graph->seriesList().at(0)->setMeshAngle(seriesAngle++);
}
}
diff --git a/tests/directional/directional.pro b/tests/directional/directional.pro
index 7138e1f2..25b2a1f6 100644
--- a/tests/directional/directional.pro
+++ b/tests/directional/directional.pro
@@ -6,5 +6,3 @@ SOURCES += main.cpp scatterdatamodifier.cpp
HEADERS += scatterdatamodifier.h
QT += widgets
-
-INSTALLS += target
diff --git a/tests/directional/main.cpp b/tests/directional/main.cpp
index f4871a70..2b077b97 100644
--- a/tests/directional/main.cpp
+++ b/tests/directional/main.cpp
@@ -32,11 +32,9 @@
int main(int argc, char **argv)
{
- //! [0]
QApplication app(argc, argv);
Q3DScatter *graph = new Q3DScatter();
QWidget *container = QWidget::createWindowContainer(graph);
- //! [0]
QSize screenSize = graph->screen()->size();
container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 1.5));
@@ -44,17 +42,14 @@ int main(int argc, char **argv)
container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
container->setFocusPolicy(Qt::StrongFocus);
- //! [1]
QWidget *widget = new QWidget;
QHBoxLayout *hLayout = new QHBoxLayout(widget);
QVBoxLayout *vLayout = new QVBoxLayout();
hLayout->addWidget(container, 1);
hLayout->addLayout(vLayout);
- //! [1]
widget->setWindowTitle(QStringLiteral("Directional scatter"));
- //! [4]
QComboBox *themeList = new QComboBox(widget);
themeList->addItem(QStringLiteral("Qt"));
themeList->addItem(QStringLiteral("Primary Colors"));
@@ -79,7 +74,7 @@ int main(int argc, char **argv)
cameraButton->setText(QStringLiteral("Change camera preset"));
QPushButton *toggleRotationButton = new QPushButton(widget);
- toggleRotationButton->setText(QStringLiteral("Toggle rotation"));
+ toggleRotationButton->setText(QStringLiteral("Toggle animation"));
QCheckBox *backgroundCheckBox = new QCheckBox(widget);
backgroundCheckBox->setText(QStringLiteral("Show background"));
@@ -101,9 +96,7 @@ int main(int argc, char **argv)
QFontComboBox *fontList = new QFontComboBox(widget);
fontList->setCurrentFont(QFont("Arial"));
- //! [4]
- //! [5]
vLayout->addWidget(labelButton, 0, Qt::AlignTop);
vLayout->addWidget(cameraButton, 0, Qt::AlignTop);
vLayout->addWidget(toggleRotationButton, 0, Qt::AlignTop);
@@ -117,13 +110,9 @@ int main(int argc, char **argv)
vLayout->addWidget(shadowQuality);
vLayout->addWidget(new QLabel(QStringLiteral("Change font")));
vLayout->addWidget(fontList, 1, Qt::AlignTop);
- //! [5]
- //! [2]
ScatterDataModifier *modifier = new ScatterDataModifier(graph);
- //! [2]
- //! [6]
QObject::connect(cameraButton, &QPushButton::clicked, modifier,
&ScatterDataModifier::changePresetCamera);
QObject::connect(toggleRotationButton, &QPushButton::clicked, modifier,
@@ -159,12 +148,9 @@ int main(int argc, char **argv)
QObject::connect(modifier, &ScatterDataModifier::fontChanged, fontList,
&QFontComboBox::setCurrentFont);
- //! [6]
itemStyleList->setCurrentIndex(0);
- //! [3]
widget->show();
return app.exec();
- //! [3]
}
diff --git a/tests/directional/scatterdatamodifier.cpp b/tests/directional/scatterdatamodifier.cpp
index 96a7b975..1422cebb 100644
--- a/tests/directional/scatterdatamodifier.cpp
+++ b/tests/directional/scatterdatamodifier.cpp
@@ -32,7 +32,7 @@ const int numberOfCols = 8;
const int numberOfRows = 8;
const float limit = 8.0f;
const float PI = 3.14159f;
-//#define HEDGEHOG
+#define HEDGEHOG
ScatterDataModifier::ScatterDataModifier(Q3DScatter *scatter)
: m_graph(scatter),
diff --git a/tests/kinectsurface/main.cpp b/tests/kinectsurface/main.cpp
index 1e7fe118..60465915 100644
--- a/tests/kinectsurface/main.cpp
+++ b/tests/kinectsurface/main.cpp
@@ -71,46 +71,63 @@ int main(int argc, char **argv)
hLayout->addLayout(vLayout);
QPushButton *startButton = new QPushButton(widget);
+ startButton->setFont(QFont("Arial", 30));
startButton->setText(QStringLiteral("Start Kinect"));
QPushButton *stopButton = new QPushButton(widget);
+ stopButton->setFont(QFont("Arial", 30));
stopButton->setText(QStringLiteral("Stop Kinect"));
+ QLabel *resolutionLabel = new QLabel(QStringLiteral("Change resolution"));
+ resolutionLabel->setFont(QFont("Arial", 15));
+
QComboBox *resolutionBox = new QComboBox(widget);
+ resolutionBox->setFont(QFont("Arial", 30));
resolutionBox->addItem(QStringLiteral("Low"));
resolutionBox->addItem(QStringLiteral("Medium"));
resolutionBox->addItem(QStringLiteral("High"));
resolutionBox->addItem(QStringLiteral("Max")); // Comment this out if demo machine is low-perf
resolutionBox->setCurrentIndex(0);
+ QLabel *modeLabel = new QLabel(QStringLiteral("Change visualization type"));
+ modeLabel->setFont(QFont("Arial", 15));
+
QComboBox *modeBox = new QComboBox(widget);
+ modeBox->setFont(QFont("Arial", 30));
modeBox->addItem(QStringLiteral("Surface Plot"));
modeBox->addItem(QStringLiteral("Scatter Chart"));
modeBox->addItem(QStringLiteral("Bar Chart"));
modeBox->setCurrentIndex(0);
+ QLabel *distanceLabel = new QLabel(QStringLiteral("Adjust far distance"));
+ distanceLabel->setFont(QFont("Arial", 15));
+
QSlider *distanceSlider = new QSlider(Qt::Horizontal, widget);
+ distanceSlider->setMinimumHeight(60);
distanceSlider->setTickInterval(10);
distanceSlider->setTickPosition(QSlider::TicksBelow);
distanceSlider->setMinimum(10);
distanceSlider->setValue(50);
distanceSlider->setMaximum(200);
+ QLabel *gradientLabel = new QLabel(QStringLiteral("Change color scheme"));
+ gradientLabel->setFont(QFont("Arial", 15));
+
QLinearGradient gradientOne(0, 0, 200, 1);
gradientOne.setColorAt(0.0, Qt::black);
gradientOne.setColorAt(0.33, Qt::blue);
gradientOne.setColorAt(0.67, Qt::red);
gradientOne.setColorAt(1.0, Qt::yellow);
- QPixmap pm(200, 24);
+ QPixmap pm(200, 60);
QPainter pmp(&pm);
pmp.setBrush(QBrush(gradientOne));
pmp.setPen(Qt::NoPen);
- pmp.drawRect(0, 0, 200, 24);
+ pmp.drawRect(0, 0, 200, 60);
QPushButton *gradientOneButton = new QPushButton(widget);
gradientOneButton->setIcon(QIcon(pm));
- gradientOneButton->setIconSize(QSize(200, 24));
+ gradientOneButton->setIconSize(QSize(200, 60));
gradientOneButton->setToolTip(QStringLiteral("Colors: Thermal Imitation"));
QLinearGradient gradientTwo(0, 0, 200, 1);
@@ -120,11 +137,11 @@ int main(int argc, char **argv)
pmp.setBrush(QBrush(gradientTwo));
pmp.setPen(Qt::NoPen);
- pmp.drawRect(0, 0, 200, 24);
+ pmp.drawRect(0, 0, 200, 60);
QPushButton *gradientTwoButton = new QPushButton(widget);
gradientTwoButton->setIcon(QIcon(pm));
- gradientTwoButton->setIconSize(QSize(200, 24));
+ gradientTwoButton->setIconSize(QSize(200, 60));
gradientTwoButton->setToolTip(QStringLiteral("Colors: Highlight Foreground"));
QTextEdit *status = new QTextEdit(QStringLiteral("<b>Ready</b><br>"), widget);
@@ -132,13 +149,13 @@ int main(int argc, char **argv)
vLayout->addWidget(startButton);
vLayout->addWidget(stopButton);
- vLayout->addWidget(new QLabel(QStringLiteral("Change resolution")));
+ vLayout->addWidget(resolutionLabel);
vLayout->addWidget(resolutionBox);
- vLayout->addWidget(new QLabel(QStringLiteral("Change visualization type")));
+ vLayout->addWidget(modeLabel);
vLayout->addWidget(modeBox);
- vLayout->addWidget(new QLabel(QStringLiteral("Adjust far distance")));
+ vLayout->addWidget(distanceLabel);
vLayout->addWidget(distanceSlider);
- vLayout->addWidget(new QLabel(QStringLiteral("Change color scheme")));
+ vLayout->addWidget(gradientLabel);
vLayout->addWidget(gradientOneButton);
vLayout->addWidget(gradientTwoButton);
vLayout->addWidget(status, 1, Qt::AlignBottom);
diff --git a/tests/kinectsurface/surfacedata.cpp b/tests/kinectsurface/surfacedata.cpp
index 85d048a5..14f37288 100644
--- a/tests/kinectsurface/surfacedata.cpp
+++ b/tests/kinectsurface/surfacedata.cpp
@@ -16,8 +16,6 @@
**
****************************************************************************/
-#define NOMINMAX
-
#include "surfacedata.h"
#include "QKinectWrapper.h"
#include <QtDataVisualization/QValue3DAxis>
@@ -32,44 +30,86 @@
using namespace QtDataVisualization;
+//#define LOW_END_DEVICE // Uncomment for devices with limited processing/grpahics power
+
+#ifdef LOW_END_DEVICE
+const QSize lowRes = QSize(160, 120);
+const QSize medRes = QSize(192, 144);
+const QSize hiRes = QSize(256, 192);
+const QSize maxRes = QSize(320, 240);
+#else
+const QSize lowRes = QSize(320, 240);
+const QSize medRes = QSize(384, 288);
+const QSize hiRes = QSize(512, 384);
+const QSize maxRes = QSize(640, 480);
+#endif
+
SurfaceData::SurfaceData(Q3DSurface *surface, Q3DScatter *scatter, Q3DBars *bars,
QTextEdit *statusArea) :
+ m_thermalTheme(new Q3DTheme(Q3DTheme::ThemeIsabelle)),
+ m_highlightTheme(new Q3DTheme(Q3DTheme::ThemeQt)),
m_surface(surface),
m_scatter(scatter),
m_bars(bars),
m_statusArea(statusArea),
m_resize(true),
- m_resolution(QSize(320, 240)),
+ m_resolution(lowRes),
m_resolutionLevel(0),
m_mode(Surface)
{
+ // Initialize themes for surface
+ m_thermalTheme->setGridEnabled(false);
+ m_thermalTheme->setBackgroundEnabled(false);
+ m_thermalTheme->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
+ QLinearGradient thermalGradient;
+ thermalGradient.setColorAt(0.0, Qt::black);
+ thermalGradient.setColorAt(0.33, Qt::blue);
+ thermalGradient.setColorAt(0.67, Qt::red);
+ thermalGradient.setColorAt(1.0, Qt::yellow);
+ QList<QLinearGradient> thermalGradients;
+ thermalGradients.append(thermalGradient);
+ m_thermalTheme->setBaseGradients(thermalGradients);
+
+ m_highlightTheme->setGridEnabled(false);
+ m_highlightTheme->setBackgroundEnabled(false);
+ m_highlightTheme->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
+ QLinearGradient highlightGradient;
+ highlightGradient.setColorAt(0.0, Qt::white);
+ highlightGradient.setColorAt(0.8, Qt::red);
+ highlightGradient.setColorAt(1.0, Qt::green);
+ QList<QLinearGradient> highlightGradients;
+ highlightGradients.append(highlightGradient);
+ m_highlightTheme->setBaseGradients(highlightGradients);
+
// Initialize surface
- m_surface->activeTheme()->setType(Q3DTheme::ThemeIsabelle);
+ m_surface->setActiveTheme(m_thermalTheme);
QLinearGradient gradient;
gradient.setColorAt(0.0, Qt::black);
gradient.setColorAt(0.33, Qt::blue);
gradient.setColorAt(0.67, Qt::red);
gradient.setColorAt(1.0, Qt::yellow);
m_surface->setSelectionMode(QAbstract3DGraph::SelectionNone);
- m_surface->activeTheme()->setGridEnabled(false);
- m_surface->activeTheme()->setBackgroundEnabled(false);
+ m_surface->setShadowQuality(QAbstract3DGraph::ShadowQualityNone);
m_surface->scene()->activeCamera()->setCameraPosition(0.0, 90.0, 150);
m_surface->axisY()->setMax(255);
QSurface3DSeries *series1 = new QSurface3DSeries(new QHeightMapSurfaceDataProxy());
series1->setFlatShadingEnabled(true);
series1->setDrawMode(QSurface3DSeries::DrawSurface);
- series1->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
- series1->setBaseGradient(gradient);
m_surface->addSeries(series1);
// Initialize scatter
m_scatter->activeTheme()->setType(Q3DTheme::ThemeStoneMoss);
m_scatter->setSelectionMode(QAbstract3DGraph::SelectionNone);
m_scatter->activeTheme()->setGridEnabled(false);
- m_scatter->setShadowQuality(QAbstract3DGraph::ShadowQualitySoftLow);
- m_scatter->scene()->activeCamera()->setCameraPosition(0.0, 85.0, 150);
+ m_scatter->setShadowQuality(QAbstract3DGraph::ShadowQualityLow);
+ m_scatter->scene()->activeCamera()->setCameraPosition(0.0, 60.0, 150);
QScatter3DSeries *series2 = new QScatter3DSeries;
+#ifdef LOW_END_DEVICE
series2->setMesh(QAbstract3DSeries::MeshPoint);
+#else
+ m_scatter->activeTheme()->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
+ series2->setMesh(QAbstract3DSeries::MeshMinimal);
+#endif
m_scatter->addSeries(series2);
m_scatter->axisY()->setMin(-128);
m_scatter->axisY()->setMax(128);
@@ -79,15 +119,28 @@ SurfaceData::SurfaceData(Q3DSurface *surface, Q3DScatter *scatter, Q3DBars *bars
m_scatter->axisZ()->setMax(m_resolution.height() / 2);
// Initialize bars
- m_bars->activeTheme()->setType(Q3DTheme::ThemeQt);
+ m_bars->activeTheme()->setType(Q3DTheme::ThemeArmyBlue);
+ QLinearGradient bargradient;
+ bargradient.setColorAt(0.48, Qt::white);
+ bargradient.setColorAt(0.481, Qt::red);
+ bargradient.setColorAt(0.52, Qt::red);
+ bargradient.setColorAt(0.521, Qt::black);
+ QList<QLinearGradient> bargradients;
+ bargradients.append(bargradient);
+ m_bars->activeTheme()->setBaseGradients(bargradients);
+ m_bars->activeTheme()->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
m_bars->setSelectionMode(QAbstract3DGraph::SelectionNone);
m_bars->activeTheme()->setGridEnabled(false);
+ m_bars->activeTheme()->setBackgroundEnabled(false);
+#ifdef LOW_END_DEVICE
+ m_bars->setShadowQuality(QAbstract3DGraph::ShadowQualityNone);
+#else
m_bars->setShadowQuality(QAbstract3DGraph::ShadowQualityLow);
+#endif
m_bars->setBarSpacing(QSizeF(0.0, 0.0));
- m_bars->scene()->activeCamera()->setCameraPosition(0.0, 75.0, 150);
+ m_bars->scene()->activeCamera()->setCameraPosition(0.0, 65.0, 130);
QBar3DSeries *series3 = new QBar3DSeries;
series3->setMesh(QAbstract3DSeries::MeshBar);
- series3->setMeshSmooth(true);
m_bars->addSeries(series3);
m_bars->valueAxis()->setMax(255);
@@ -115,8 +168,10 @@ void SurfaceData::updateData()
if (m_mode != Surface) {
setData(depthMap);
} else {
+ static_cast<QHeightMapSurfaceDataProxy *>(m_surface->seriesList().at(0)->dataProxy())->setValueRanges(
+ 0, depthMap.width(), 0, depthMap.height());
static_cast<QHeightMapSurfaceDataProxy *>(m_surface->seriesList().at(0)->dataProxy())->setHeightMap(
- depthMap);
+ depthMap);
}
}
@@ -172,22 +227,22 @@ void SurfaceData::setResolution(int selection)
switch (selection) {
case 0: {
m_resize = true;
- m_resolution = QSize(320, 240);
+ m_resolution = lowRes;
break;
}
case 1: {
m_resize = true;
- m_resolution = QSize(384, 288);
+ m_resolution = medRes;
break;
}
case 2: {
m_resize = true;
- m_resolution = QSize(512, 384);
+ m_resolution = hiRes;
break;
}
case 3: {
m_resize = false;
- m_resolution = QSize(640, 480);
+ m_resolution = maxRes;
break;
}
};
@@ -225,26 +280,13 @@ void SurfaceData::scrollDown()
void SurfaceData::useGradientOne()
{
- m_surface->activeTheme()->setType(Q3DTheme::ThemeIsabelle);
- QLinearGradient gradient;
- gradient.setColorAt(0.0, Qt::black);
- gradient.setColorAt(0.33, Qt::blue);
- gradient.setColorAt(0.67, Qt::red);
- gradient.setColorAt(1.0, Qt::yellow);
- m_surface->seriesList().at(0)->setBaseGradient(gradient);
- m_surface->seriesList().at(0)->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
+ m_surface->setActiveTheme(m_thermalTheme);
m_statusArea->append(QStringLiteral("<b>Colors:</b> Thermal image imitation"));
}
void SurfaceData::useGradientTwo()
{
- m_surface->activeTheme()->setType(Q3DTheme::ThemeQt);
- QLinearGradient gradient;
- gradient.setColorAt(0.0, Qt::white);
- gradient.setColorAt(0.8, Qt::red);
- gradient.setColorAt(1.0, Qt::green);
- m_surface->seriesList().at(0)->setBaseGradient(gradient);
- m_surface->seriesList().at(0)->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
+ m_surface->setActiveTheme(m_highlightTheme);
m_statusArea->append(QStringLiteral("<b>Colors:</b> Highlight foreground"));
}
diff --git a/tests/kinectsurface/surfacedata.h b/tests/kinectsurface/surfacedata.h
index 7193e446..b607ae76 100644
--- a/tests/kinectsurface/surfacedata.h
+++ b/tests/kinectsurface/surfacedata.h
@@ -19,6 +19,8 @@
#ifndef SURFACEDATA_H
#define SURFACEDATA_H
+#define NOMINMAX
+
#include "QKinectWrapper.h"
#include <QtDataVisualization/Q3DScatter>
#include <QtDataVisualization/Q3DBars>
@@ -63,6 +65,8 @@ public slots:
void changeMode(int mode);
private:
+ Q3DTheme *m_thermalTheme;
+ Q3DTheme *m_highlightTheme;
Q3DSurface *m_surface;
Q3DScatter *m_scatter;
Q3DBars *m_bars;
diff --git a/tests/multigraphs/data.cpp b/tests/multigraphs/data.cpp
index 1164a2f1..9fd27b96 100644
--- a/tests/multigraphs/data.cpp
+++ b/tests/multigraphs/data.cpp
@@ -149,6 +149,7 @@ void Data::setResolution(int selection)
if (m_mode == Scatter) {
m_resize = true;
m_resolution /= 3;
+ delete m_scatterDataArray;
m_scatterDataArray = new QScatterDataArray;
m_scatterDataArray->resize(m_resolution.width() * m_resolution.height());
} else if (m_mode == Bars) {
diff --git a/tests/multigraphs/multigraphs.pro b/tests/multigraphs/multigraphs.pro
index 914a816a..f1a7cffe 100644
--- a/tests/multigraphs/multigraphs.pro
+++ b/tests/multigraphs/multigraphs.pro
@@ -8,7 +8,5 @@ HEADERS += data.h
QT += widgets
-INSTALLS += target
-
RESOURCES += \
multigraphs.qrc
diff --git a/tests/qmlcamera/main.cpp b/tests/qmlcamera/main.cpp
index c93502f7..040eaed3 100644
--- a/tests/qmlcamera/main.cpp
+++ b/tests/qmlcamera/main.cpp
@@ -16,30 +16,30 @@
**
****************************************************************************/
-#include <QtDataVisualization/qutils.h>
#include <QtGui/QGuiApplication>
-#include "qtquick2applicationviewer.h"
+#include <QtCore/QDir>
+#include <QtQuick/QQuickView>
+#include <QtQml/QQmlEngine>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
- QtQuick2ApplicationViewer viewer;
+ QQuickView viewer;
- // Enable antialiasing
- viewer.setFormat(QtDataVisualization::qDefaultSurfaceFormat());
-
-#ifdef Q_OS_ANDROID
- viewer.addImportPath(QString::fromLatin1("assets:/qml"));
- viewer.engine()->addPluginPath(QString::fromLatin1("%1/../%2").arg(QDir::homePath(),
- QString::fromLatin1("lib")));
+ // The following are needed to make examples run without having to install the module
+ // in desktop environments.
+#ifdef Q_OS_WIN
+ QString extraImportPath(QStringLiteral("%1/../../../%2"));
#else
- viewer.addImportPath(QString::fromLatin1("%1/%2").arg(QCoreApplication::applicationDirPath(),
- QString::fromLatin1("qml")));
+ QString extraImportPath(QStringLiteral("%1/../../%2"));
#endif
- viewer.setMainQmlFile(QStringLiteral("qml/qmlcamera/main.qml"));
+ viewer.engine()->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
+ QString::fromLatin1("qml")));
+
+ viewer.setSource(QUrl("qrc:/qml/qmlcamera/main.qml"));
viewer.setResizeMode(QQuickView::SizeRootObjectToView);
- viewer.showExpanded();
+ viewer.show();
return app.exec();
}
diff --git a/tests/qmlcamera/qml/qmlcamera/Data.qml b/tests/qmlcamera/qml/qmlcamera/Data.qml
index 3c787186..bab6bf78 100644
--- a/tests/qmlcamera/qml/qmlcamera/Data.qml
+++ b/tests/qmlcamera/qml/qmlcamera/Data.qml
@@ -30,41 +30,44 @@ Item {
rowRole: "year"
columnRole: "month"
valueRole: "expenses"
+ rotationRole: "angle"
}
Bar3DSeries {
id: barSeries
dataProxy: modelProxy
itemLabelFormat: "@valueTitle for @colLabel, @rowLabel: @valueLabel"
+
+ onMeshAngleChanged: console.log("angle changed:", angle)
}
ListModel {
id: dataModel
- ListElement{ year: "2006"; month: "Jan"; expenses: "4"; income: "5" }
- ListElement{ year: "2006"; month: "Feb"; expenses: "5"; income: "6" }
- ListElement{ year: "2006"; month: "Mar"; expenses: "7"; income: "4" }
- ListElement{ year: "2006"; month: "Apr"; expenses: "3"; income: "2" }
- ListElement{ year: "2006"; month: "May"; expenses: "4"; income: "1" }
- ListElement{ year: "2006"; month: "Jun"; expenses: "2"; income: "2" }
- ListElement{ year: "2006"; month: "Jul"; expenses: "1"; income: "3" }
- ListElement{ year: "2006"; month: "Aug"; expenses: "5"; income: "1" }
- ListElement{ year: "2006"; month: "Sep"; expenses: "2"; income: "3" }
- ListElement{ year: "2006"; month: "Oct"; expenses: "5"; income: "2" }
- ListElement{ year: "2006"; month: "Nov"; expenses: "8"; income: "5" }
- ListElement{ year: "2006"; month: "Dec"; expenses: "3"; income: "3" }
+ ListElement{ year: "2006"; month: "Jan"; expenses: "4"; angle: "1"; income: "5" }
+ ListElement{ year: "2006"; month: "Feb"; expenses: "5"; angle: "2"; income: "6" }
+ ListElement{ year: "2006"; month: "Mar"; expenses: "7"; angle: "3"; income: "4" }
+ ListElement{ year: "2006"; month: "Apr"; expenses: "3"; angle: "4"; income: "2" }
+ ListElement{ year: "2006"; month: "May"; expenses: "4"; angle: "5"; income: "1" }
+ ListElement{ year: "2006"; month: "Jun"; expenses: "2"; angle: "6"; income: "2" }
+ ListElement{ year: "2006"; month: "Jul"; expenses: "1"; angle: "7"; income: "3" }
+ ListElement{ year: "2006"; month: "Aug"; expenses: "5"; angle: "8"; income: "1" }
+ ListElement{ year: "2006"; month: "Sep"; expenses: "2"; angle: "9"; income: "3" }
+ ListElement{ year: "2006"; month: "Oct"; expenses: "5"; angle: "10"; income: "2" }
+ ListElement{ year: "2006"; month: "Nov"; expenses: "8"; angle: "11"; income: "5" }
+ ListElement{ year: "2006"; month: "Dec"; expenses: "3"; angle: "12"; income: "3" }
- ListElement{ year: "2007"; month: "Jan"; expenses: "3"; income: "1" }
- ListElement{ year: "2007"; month: "Feb"; expenses: "4"; income: "2" }
- ListElement{ year: "2007"; month: "Mar"; expenses: "12"; income: "4" }
- ListElement{ year: "2007"; month: "Apr"; expenses: "13"; income: "6" }
- ListElement{ year: "2007"; month: "May"; expenses: "14"; income: "11" }
- ListElement{ year: "2007"; month: "Jun"; expenses: "7"; income: "7" }
- ListElement{ year: "2007"; month: "Jul"; expenses: "6"; income: "4" }
- ListElement{ year: "2007"; month: "Aug"; expenses: "4"; income: "15" }
- ListElement{ year: "2007"; month: "Sep"; expenses: "2"; income: "18" }
- ListElement{ year: "2007"; month: "Oct"; expenses: "29"; income: "25" }
- ListElement{ year: "2007"; month: "Nov"; expenses: "23"; income: "29" }
- ListElement{ year: "2007"; month: "Dec"; expenses: "5"; income: "9" }
+ ListElement{ year: "2007"; month: "Jan"; expenses: "3"; angle: "13"; income: "1" }
+ ListElement{ year: "2007"; month: "Feb"; expenses: "4"; angle: "14"; income: "2" }
+ ListElement{ year: "2007"; month: "Mar"; expenses: "12";angle: "15"; income: "4" }
+ ListElement{ year: "2007"; month: "Apr"; expenses: "13";angle: "16"; income: "6" }
+ ListElement{ year: "2007"; month: "May"; expenses: "14";angle: "17"; income: "11" }
+ ListElement{ year: "2007"; month: "Jun"; expenses: "7"; angle: "18"; income: "7" }
+ ListElement{ year: "2007"; month: "Jul"; expenses: "6"; angle: "19"; income: "4" }
+ ListElement{ year: "2007"; month: "Aug"; expenses: "4"; angle: "20"; income: "15" }
+ ListElement{ year: "2007"; month: "Sep"; expenses: "2"; angle: "21"; income: "18" }
+ ListElement{ year: "2007"; month: "Oct"; expenses: "29";angle: "22"; income: "25" }
+ ListElement{ year: "2007"; month: "Nov"; expenses: "23";angle: "23"; income: "29" }
+ ListElement{ year: "2007"; month: "Dec"; expenses: "5"; angle: "24"; income: "9" }
ListElement{ year: "2008"; month: "Jan"; expenses: "3"; income: "8" }
ListElement{ year: "2008"; month: "Feb"; expenses: "8"; income: "14" }
@@ -79,56 +82,56 @@ Item {
ListElement{ year: "2008"; month: "Nov"; expenses: "16"; income: "25" }
ListElement{ year: "2008"; month: "Dec"; expenses: "2"; income: "7" }
- ListElement{ year: "2009"; month: "Jan"; expenses: "4"; income: "5" }
- ListElement{ year: "2009"; month: "Feb"; expenses: "4"; income: "7" }
- ListElement{ year: "2009"; month: "Mar"; expenses: "11"; income: "14" }
- ListElement{ year: "2009"; month: "Apr"; expenses: "16"; income: "22" }
- ListElement{ year: "2009"; month: "May"; expenses: "3"; income: "5" }
- ListElement{ year: "2009"; month: "Jun"; expenses: "4"; income: "8" }
- ListElement{ year: "2009"; month: "Jul"; expenses: "7"; income: "9" }
- ListElement{ year: "2009"; month: "Aug"; expenses: "9"; income: "13" }
- ListElement{ year: "2009"; month: "Sep"; expenses: "1"; income: "6" }
- ListElement{ year: "2009"; month: "Oct"; expenses: "14"; income: "25" }
- ListElement{ year: "2009"; month: "Nov"; expenses: "19"; income: "29" }
- ListElement{ year: "2009"; month: "Dec"; expenses: "5"; income: "7" }
+ ListElement{ year: "2009"; month: "Jan"; expenses: "4"; angle: "37"; income: "5" }
+ ListElement{ year: "2009"; month: "Feb"; expenses: "4"; angle: "38"; income: "7" }
+ ListElement{ year: "2009"; month: "Mar"; expenses: "11";angle: "39"; income: "14" }
+ ListElement{ year: "2009"; month: "Apr"; expenses: "16";angle: "40"; income: "22" }
+ ListElement{ year: "2009"; month: "May"; expenses: "3"; angle: "41"; income: "5" }
+ ListElement{ year: "2009"; month: "Jun"; expenses: "4"; angle: "42"; income: "8" }
+ ListElement{ year: "2009"; month: "Jul"; expenses: "7"; angle: "43"; income: "9" }
+ ListElement{ year: "2009"; month: "Aug"; expenses: "9"; angle: "44"; income: "13" }
+ ListElement{ year: "2009"; month: "Sep"; expenses: "1"; angle: "45"; income: "6" }
+ ListElement{ year: "2009"; month: "Oct"; expenses: "14";angle: "46"; income: "25" }
+ ListElement{ year: "2009"; month: "Nov"; expenses: "19";angle: "47"; income: "29" }
+ ListElement{ year: "2009"; month: "Dec"; expenses: "5"; angle: "48"; income: "7" }
- ListElement{ year: "2010"; month: "Jan"; expenses: "14"; income: "22" }
- ListElement{ year: "2010"; month: "Feb"; expenses: "5"; income: "7" }
- ListElement{ year: "2010"; month: "Mar"; expenses: "1"; income: "9" }
- ListElement{ year: "2010"; month: "Apr"; expenses: "1"; income: "12" }
- ListElement{ year: "2010"; month: "May"; expenses: "5"; income: "9" }
- ListElement{ year: "2010"; month: "Jun"; expenses: "5"; income: "8" }
- ListElement{ year: "2010"; month: "Jul"; expenses: "3"; income: "7" }
- ListElement{ year: "2010"; month: "Aug"; expenses: "1"; income: "5" }
- ListElement{ year: "2010"; month: "Sep"; expenses: "2"; income: "4" }
- ListElement{ year: "2010"; month: "Oct"; expenses: "10"; income: "13" }
- ListElement{ year: "2010"; month: "Nov"; expenses: "12"; income: "17" }
- ListElement{ year: "2010"; month: "Dec"; expenses: "6"; income: "9" }
+ ListElement{ year: "2010"; month: "Jan"; expenses: "14";angle: "49"; income: "22" }
+ ListElement{ year: "2010"; month: "Feb"; expenses: "5"; angle: "50"; income: "7" }
+ ListElement{ year: "2010"; month: "Mar"; expenses: "1"; angle: "51"; income: "9" }
+ ListElement{ year: "2010"; month: "Apr"; expenses: "1"; angle: "52"; income: "12" }
+ ListElement{ year: "2010"; month: "May"; expenses: "5"; angle: "53"; income: "9" }
+ ListElement{ year: "2010"; month: "Jun"; expenses: "5"; angle: "54"; income: "8" }
+ ListElement{ year: "2010"; month: "Jul"; expenses: "3"; angle: "55"; income: "7" }
+ ListElement{ year: "2010"; month: "Aug"; expenses: "1"; angle: "56"; income: "5" }
+ ListElement{ year: "2010"; month: "Sep"; expenses: "2"; angle: "57"; income: "4" }
+ ListElement{ year: "2010"; month: "Oct"; expenses: "10";angle: "58"; income: "13" }
+ ListElement{ year: "2010"; month: "Nov"; expenses: "12";angle: "59"; income: "17" }
+ ListElement{ year: "2010"; month: "Dec"; expenses: "6"; angle: "60"; income: "9" }
- ListElement{ year: "2011"; month: "Jan"; expenses: "2"; income: "6" }
- ListElement{ year: "2011"; month: "Feb"; expenses: "4"; income: "8" }
- ListElement{ year: "2011"; month: "Mar"; expenses: "7"; income: "12" }
- ListElement{ year: "2011"; month: "Apr"; expenses: "9"; income: "15" }
- ListElement{ year: "2011"; month: "May"; expenses: "7"; income: "19" }
- ListElement{ year: "2011"; month: "Jun"; expenses: "9"; income: "18" }
- ListElement{ year: "2011"; month: "Jul"; expenses: "13"; income: "17" }
- ListElement{ year: "2011"; month: "Aug"; expenses: "5"; income: "9" }
- ListElement{ year: "2011"; month: "Sep"; expenses: "3"; income: "8" }
- ListElement{ year: "2011"; month: "Oct"; expenses: "13"; income: "15" }
- ListElement{ year: "2011"; month: "Nov"; expenses: "8"; income: "17" }
- ListElement{ year: "2011"; month: "Dec"; expenses: "7"; income: "10" }
+ ListElement{ year: "2011"; month: "Jan"; expenses: "2"; angle: "61"; income: "6" }
+ ListElement{ year: "2011"; month: "Feb"; expenses: "4"; angle: "62"; income: "8" }
+ ListElement{ year: "2011"; month: "Mar"; expenses: "7"; angle: "63"; income: "12" }
+ ListElement{ year: "2011"; month: "Apr"; expenses: "9"; angle: "64"; income: "15" }
+ ListElement{ year: "2011"; month: "May"; expenses: "7"; angle: "65"; income: "19" }
+ ListElement{ year: "2011"; month: "Jun"; expenses: "9"; angle: "66"; income: "18" }
+ ListElement{ year: "2011"; month: "Jul"; expenses: "13";angle: "67"; income: "17" }
+ ListElement{ year: "2011"; month: "Aug"; expenses: "5"; angle: "68"; income: "9" }
+ ListElement{ year: "2011"; month: "Sep"; expenses: "3"; angle: "69"; income: "8" }
+ ListElement{ year: "2011"; month: "Oct"; expenses: "13";angle: "70"; income: "15" }
+ ListElement{ year: "2011"; month: "Nov"; expenses: "8"; angle: "71"; income: "17" }
+ ListElement{ year: "2011"; month: "Dec"; expenses: "7"; angle: "72"; income: "10" }
- ListElement{ year: "2012"; month: "Jan"; expenses: "12"; income: "16" }
- ListElement{ year: "2012"; month: "Feb"; expenses: "24"; income: "28" }
- ListElement{ year: "2012"; month: "Mar"; expenses: "27"; income: "22" }
- ListElement{ year: "2012"; month: "Apr"; expenses: "29"; income: "25" }
- ListElement{ year: "2012"; month: "May"; expenses: "27"; income: "29" }
- ListElement{ year: "2012"; month: "Jun"; expenses: "19"; income: "18" }
- ListElement{ year: "2012"; month: "Jul"; expenses: "13"; income: "17" }
- ListElement{ year: "2012"; month: "Aug"; expenses: "15"; income: "19" }
- ListElement{ year: "2012"; month: "Sep"; expenses: "3"; income: "8" }
- ListElement{ year: "2012"; month: "Oct"; expenses: "3"; income: "6" }
- ListElement{ year: "2012"; month: "Nov"; expenses: "4"; income: "8" }
- ListElement{ year: "2012"; month: "Dec"; expenses: "5"; income: "9" }
+ ListElement{ year: "2012"; month: "Jan"; expenses: "12";angle: "73"; income: "16" }
+ ListElement{ year: "2012"; month: "Feb"; expenses: "24";angle: "74"; income: "28" }
+ ListElement{ year: "2012"; month: "Mar"; expenses: "27";angle: "75"; income: "22" }
+ ListElement{ year: "2012"; month: "Apr"; expenses: "29";angle: "76"; income: "25" }
+ ListElement{ year: "2012"; month: "May"; expenses: "27";angle: "77"; income: "29" }
+ ListElement{ year: "2012"; month: "Jun"; expenses: "19";angle: "78"; income: "18" }
+ ListElement{ year: "2012"; month: "Jul"; expenses: "13";angle: "79"; income: "17" }
+ ListElement{ year: "2012"; month: "Aug"; expenses: "15";angle: "80"; income: "19" }
+ ListElement{ year: "2012"; month: "Sep"; expenses: "3"; angle: "81"; income: "8" }
+ ListElement{ year: "2012"; month: "Oct"; expenses: "3"; angle: "82"; income: "6" }
+ ListElement{ year: "2012"; month: "Nov"; expenses: "4"; angle: "83"; income: "8" }
+ ListElement{ year: "2012"; month: "Dec"; expenses: "5"; angle: "84"; income: "9" }
}
}
diff --git a/tests/qmlcamera/qml/qmlcamera/main.qml b/tests/qmlcamera/qml/qmlcamera/main.qml
index a5176553..264d613e 100644
--- a/tests/qmlcamera/qml/qmlcamera/main.qml
+++ b/tests/qmlcamera/qml/qmlcamera/main.qml
@@ -21,7 +21,7 @@ import QtQuick.Controls 1.0
import QtDataVisualization 1.0
import "."
-Item {
+Rectangle {
id: mainview
width: 1280
height: 1024
@@ -99,10 +99,10 @@ Item {
y: 0
width: 298
height: 298
- minXValue: testChart.scene.activeCamera.minXRotation
- minYValue: testChart.scene.activeCamera.minYRotation
- maxXValue: testChart.scene.activeCamera.maxXRotation
- maxYValue: testChart.scene.activeCamera.maxYRotation
+ minXValue: -180
+ minYValue: 0
+ maxXValue: 180
+ maxYValue: 90
}
Slider {
@@ -133,24 +133,20 @@ Item {
}
Button {
- id: shadowToggle
+ id: angleAdjust
anchors.bottom: mappingToggle.top
width: camControlArea.width
- text: "Hide Shadows"
+ text: "Adjust angle"
+ property real currentAngle: 0
onClicked: {
- if (testChart.shadowQuality == AbstractGraph3D.ShadowQualityNone) {
- testChart.shadowQuality = AbstractGraph3D.ShadowQualityMedium;
- text = "Hide Shadows"
- } else {
- testChart.shadowQuality = AbstractGraph3D.ShadowQualityNone;
- text = "Show Shadows"
- }
+ currentAngle += 5
+ chartData.series.meshAngle = currentAngle
}
}
Button {
id: dataToggle
- anchors.bottom: shadowToggle.top
+ anchors.bottom: angleAdjust.top
width: camControlArea.width
text: "Show 2010 - 2012"
onClicked: {
diff --git a/tests/qmlcamera/qmlcamera.desktop b/tests/qmlcamera/qmlcamera.desktop
deleted file mode 100644
index 10a0a2e7..00000000
--- a/tests/qmlcamera/qmlcamera.desktop
+++ /dev/null
@@ -1,11 +0,0 @@
-[Desktop Entry]
-Encoding=UTF-8
-Version=1.0
-Type=Application
-Terminal=false
-Name=qmlcamera
-Exec=/opt/qmlcamera/bin/qmlcamera
-Icon=qmlcamera64
-X-Window-Icon=
-X-HildonDesk-ShowInToolbar=true
-X-Osso-Type=application/x-executable
diff --git a/tests/qmlcamera/qmlcamera.pro b/tests/qmlcamera/qmlcamera.pro
index 374dc012..098d7a85 100644
--- a/tests/qmlcamera/qmlcamera.pro
+++ b/tests/qmlcamera/qmlcamera.pro
@@ -2,34 +2,9 @@
error( "Couldn't find the tests.pri file!" )
}
-# Add more folders to ship with the application, here
-folder_01.source = qml/qmlcamera
-folder_01.target = qml
-DEPLOYMENTFOLDERS = folder_01
-
-# Additional import path used to resolve QML modules in Creator's code model
-QML_IMPORT_PATH =
-
-# If your application uses the Qt Mobility libraries, uncomment the following
-# lines and add the respective components to the MOBILITY variable.
-# CONFIG += mobility
-# MOBILITY +=
-
-# The .cpp file which was generated for your project. Feel free to hack it.
SOURCES += main.cpp
-# Installation path
-# target.path =
-
-# Please do not modify the following two lines. Required for deployment.
-include(qtquick2applicationviewer/qtquick2applicationviewer.pri)
-qtcAddDeployment()
+RESOURCES += qmlcamera.qrc
-RESOURCES += \
- qmlcamera.qrc
+OTHER_FILES += qml/qmlcamera/*
-OTHER_FILES += \
- qml/qmlcamera/Data.qml \
- qml/qmlcamera/Axes.qml \
- qml/qmlcamera/main.qml \
- qml/qmlcamera/ControlSurface.qml
diff --git a/tests/qmlcamera/qmlcamera.qrc b/tests/qmlcamera/qmlcamera.qrc
index d9b993c7..90cb0867 100644
--- a/tests/qmlcamera/qmlcamera.qrc
+++ b/tests/qmlcamera/qmlcamera.qrc
@@ -1,7 +1,8 @@
<RCC>
- <qresource prefix="/qml">
- <file alias="main.qml">qml/qmlcamera/main.qml</file>
- <file alias="Data.qml">qml/qmlcamera/Data.qml</file>
- <file alias="Axes.qml">qml/qmlcamera/Axes.qml</file>
+ <qresource prefix="/">
+ <file>qml/qmlcamera/Axes.qml</file>
+ <file>qml/qmlcamera/ControlSurface.qml</file>
+ <file>qml/qmlcamera/Data.qml</file>
+ <file>qml/qmlcamera/main.qml</file>
</qresource>
</RCC>
diff --git a/tests/qmlcamera/qmlcamera64.png b/tests/qmlcamera/qmlcamera64.png
deleted file mode 100644
index 707d5c4e..00000000
--- a/tests/qmlcamera/qmlcamera64.png
+++ /dev/null
Binary files differ
diff --git a/tests/qmlcamera/qmlcamera80.png b/tests/qmlcamera/qmlcamera80.png
deleted file mode 100644
index 6ad8096c..00000000
--- a/tests/qmlcamera/qmlcamera80.png
+++ /dev/null
Binary files differ
diff --git a/tests/qmlcamera/qmlcamera_harmattan.desktop b/tests/qmlcamera/qmlcamera_harmattan.desktop
deleted file mode 100644
index 8e9e9857..00000000
--- a/tests/qmlcamera/qmlcamera_harmattan.desktop
+++ /dev/null
@@ -1,11 +0,0 @@
-[Desktop Entry]
-Encoding=UTF-8
-Version=1.0
-Type=Application
-Terminal=false
-Name=qmlcamera
-Exec=/usr/bin/single-instance /opt/qmlcamera/bin/qmlcamera
-Icon=/usr/share/icons/hicolor/80x80/apps/qmlcamera80.png
-X-Window-Icon=
-X-HildonDesk-ShowInToolbar=true
-X-Osso-Type=application/x-executable
diff --git a/tests/qmlcamera/qtquick2applicationviewer/qtquick2applicationviewer.cpp b/tests/qmlcamera/qtquick2applicationviewer/qtquick2applicationviewer.cpp
deleted file mode 100644
index 10709d7a..00000000
--- a/tests/qmlcamera/qtquick2applicationviewer/qtquick2applicationviewer.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-// checksum 0x4f6f version 0x90005
-/*
- This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
- QtQuick2ApplicationViewer is a convenience class containing mobile device specific
- code such as screen orientation handling. Also QML paths and debugging are
- handled here.
- It is recommended not to modify this file, since newer versions of Qt Creator
- may offer an updated version of it.
-*/
-
-#include "qtquick2applicationviewer.h"
-
-#include <QtCore/QCoreApplication>
-#include <QtCore/QDir>
-#include <QtQml/QQmlEngine>
-
-class QtQuick2ApplicationViewerPrivate
-{
- QString mainQmlFile;
- friend class QtQuick2ApplicationViewer;
- static QString adjustPath(const QString &path);
-};
-
-QString QtQuick2ApplicationViewerPrivate::adjustPath(const QString &path)
-{
-#if defined(Q_OS_MAC)
- if (!QDir::isAbsolutePath(path))
- return QString::fromLatin1("%1/../Resources/%2")
- .arg(QCoreApplication::applicationDirPath(), path);
-#elif defined(Q_OS_BLACKBERRY)
- if (!QDir::isAbsolutePath(path))
- return QString::fromLatin1("app/native/%1").arg(path);
-#elif !defined(Q_OS_ANDROID)
- QString pathInInstallDir =
- QString::fromLatin1("%1/../%2").arg(QCoreApplication::applicationDirPath(), path);
- if (QFileInfo(pathInInstallDir).exists())
- return pathInInstallDir;
- pathInInstallDir =
- QString::fromLatin1("%1/%2").arg(QCoreApplication::applicationDirPath(), path);
- if (QFileInfo(pathInInstallDir).exists())
- return pathInInstallDir;
-#endif
- return path;
-}
-
-QtQuick2ApplicationViewer::QtQuick2ApplicationViewer(QWindow *parent)
- : QQuickView(parent)
- , d(new QtQuick2ApplicationViewerPrivate())
-{
- connect(engine(), SIGNAL(quit()), SLOT(close()));
- setResizeMode(QQuickView::SizeRootObjectToView);
-}
-
-QtQuick2ApplicationViewer::~QtQuick2ApplicationViewer()
-{
- delete d;
-}
-
-void QtQuick2ApplicationViewer::setMainQmlFile(const QString &file)
-{
- d->mainQmlFile = QtQuick2ApplicationViewerPrivate::adjustPath(file);
-#ifdef Q_OS_ANDROID
- setSource(QUrl(QLatin1String("assets:/")+d->mainQmlFile));
-#else
- setSource(QUrl::fromLocalFile(d->mainQmlFile));
-#endif
-}
-
-void QtQuick2ApplicationViewer::addImportPath(const QString &path)
-{
- engine()->addImportPath(QtQuick2ApplicationViewerPrivate::adjustPath(path));
-}
-
-void QtQuick2ApplicationViewer::showExpanded()
-{
-#if defined(Q_WS_SIMULATOR) || defined(Q_OS_QNX)
- showFullScreen();
-#else
- show();
-#endif
-}
diff --git a/tests/qmlcamera/qtquick2applicationviewer/qtquick2applicationviewer.h b/tests/qmlcamera/qtquick2applicationviewer/qtquick2applicationviewer.h
deleted file mode 100644
index cf66f140..00000000
--- a/tests/qmlcamera/qtquick2applicationviewer/qtquick2applicationviewer.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// checksum 0xfde6 version 0x90005
-/*
- This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
- QtQuick2ApplicationViewer is a convenience class containing mobile device specific
- code such as screen orientation handling. Also QML paths and debugging are
- handled here.
- It is recommended not to modify this file, since newer versions of Qt Creator
- may offer an updated version of it.
-*/
-
-#ifndef QTQUICK2APPLICATIONVIEWER_H
-#define QTQUICK2APPLICATIONVIEWER_H
-
-#include <QtQuick/QQuickView>
-
-class QtQuick2ApplicationViewer : public QQuickView
-{
- Q_OBJECT
-
-public:
- explicit QtQuick2ApplicationViewer(QWindow *parent = 0);
- virtual ~QtQuick2ApplicationViewer();
-
- void setMainQmlFile(const QString &file);
- void addImportPath(const QString &path);
-
- void showExpanded();
-
-private:
- class QtQuick2ApplicationViewerPrivate *d;
-};
-
-#endif // QTQUICK2APPLICATIONVIEWER_H
diff --git a/tests/qmlcamera/qtquick2applicationviewer/qtquick2applicationviewer.pri b/tests/qmlcamera/qtquick2applicationviewer/qtquick2applicationviewer.pri
deleted file mode 100644
index e5f7990f..00000000
--- a/tests/qmlcamera/qtquick2applicationviewer/qtquick2applicationviewer.pri
+++ /dev/null
@@ -1,180 +0,0 @@
-# checksum 0x7b0d version 0x90005
-# This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
-# The code below adds the QtQuick2ApplicationViewer to the project and handles
-# the activation of QML debugging.
-# It is recommended not to modify this file, since newer versions of Qt Creator
-# may offer an updated version of it.
-
-QT += qml quick
-
-SOURCES += $$PWD/qtquick2applicationviewer.cpp
-HEADERS += $$PWD/qtquick2applicationviewer.h
-INCLUDEPATH += $$PWD
-# This file was generated by an application wizard of Qt Creator.
-# The code below handles deployment to Android and Maemo, aswell as copying
-# of the application data to shadow build directories on desktop.
-# It is recommended not to modify this file, since newer versions of Qt Creator
-# may offer an updated version of it.
-
-defineTest(qtcAddDeployment) {
-for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- greaterThan(QT_MAJOR_VERSION, 4) {
- itemsources = $${item}.files
- } else {
- itemsources = $${item}.sources
- }
- $$itemsources = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath= $$eval($${deploymentfolder}.target)
- export($$itemsources)
- export($$itempath)
- DEPLOYMENT += $$item
-}
-
-MAINPROFILEPWD = $$PWD
-
-android-no-sdk {
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- itemfiles = $${item}.files
- $$itemfiles = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath = /data/user/qt/$$eval($${deploymentfolder}.target)
- export($$itemfiles)
- export($$itempath)
- INSTALLS += $$item
- }
-
- target.path = /data/user/qt
-
- export(target.path)
- INSTALLS += target
-} else:android {
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- itemfiles = $${item}.files
- $$itemfiles = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath = /assets/$$eval($${deploymentfolder}.target)
- export($$itemfiles)
- export($$itempath)
- INSTALLS += $$item
- }
-
- x86 {
- target.path = /libs/x86
- } else: armeabi-v7a {
- target.path = /libs/armeabi-v7a
- } else {
- target.path = /libs/armeabi
- }
-
- export(target.path)
- INSTALLS += target
-} else:win32 {
- copyCommand =
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
- source = $$replace(source, /, \\)
- sourcePathSegments = $$split(source, \\)
- target = $$OUT_PWD/$$eval($${deploymentfolder}.target)/$$last(sourcePathSegments)
- target = $$replace(target, /, \\)
- target ~= s,\\\\\\.?\\\\,\\,
- !isEqual(source,$$target) {
- !isEmpty(copyCommand):copyCommand += &&
- isEqual(QMAKE_DIR_SEP, \\) {
- copyCommand += $(COPY_DIR) \"$$source\" \"$$target\"
- } else {
- source = $$replace(source, \\\\, /)
- target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
- target = $$replace(target, \\\\, /)
- copyCommand += test -d \"$$target\" || mkdir -p \"$$target\" && cp -r \"$$source\" \"$$target\"
- }
- }
- }
- !isEmpty(copyCommand) {
- copyCommand = @echo Copying application data... && $$copyCommand
- copydeploymentfolders.commands = $$copyCommand
- first.depends = $(first) copydeploymentfolders
- export(first.depends)
- export(copydeploymentfolders.commands)
- QMAKE_EXTRA_TARGETS += first copydeploymentfolders
- }
-} else:unix {
- maemo5 {
- desktopfile.files = $${TARGET}.desktop
- desktopfile.path = /usr/share/applications/hildon
- icon.files = $${TARGET}64.png
- icon.path = /usr/share/icons/hicolor/64x64/apps
- } else:!isEmpty(MEEGO_VERSION_MAJOR) {
- desktopfile.files = $${TARGET}_harmattan.desktop
- desktopfile.path = /usr/share/applications
- icon.files = $${TARGET}80.png
- icon.path = /usr/share/icons/hicolor/80x80/apps
- } else { # Assumed to be a Desktop Unix
- copyCommand =
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
- source = $$replace(source, \\\\, /)
- macx {
- target = $$OUT_PWD/$${TARGET}.app/Contents/Resources/$$eval($${deploymentfolder}.target)
- } else {
- target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
- }
- target = $$replace(target, \\\\, /)
- sourcePathSegments = $$split(source, /)
- targetFullPath = $$target/$$last(sourcePathSegments)
- targetFullPath ~= s,/\\.?/,/,
- !isEqual(source,$$targetFullPath) {
- !isEmpty(copyCommand):copyCommand += &&
- copyCommand += $(MKDIR) \"$$target\"
- copyCommand += && $(COPY_DIR) \"$$source\" \"$$target\"
- }
- }
- !isEmpty(copyCommand) {
- copyCommand = @echo Copying application data... && $$copyCommand
- copydeploymentfolders.commands = $$copyCommand
- first.depends = $(first) copydeploymentfolders
- export(first.depends)
- export(copydeploymentfolders.commands)
- QMAKE_EXTRA_TARGETS += first copydeploymentfolders
- }
- }
- !isEmpty(target.path) {
- installPrefix = $${target.path}
- } else {
- installPrefix = /opt/$${TARGET}
- }
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- itemfiles = $${item}.files
- $$itemfiles = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath = $${installPrefix}/$$eval($${deploymentfolder}.target)
- export($$itemfiles)
- export($$itempath)
- INSTALLS += $$item
- }
-
- !isEmpty(desktopfile.path) {
- export(icon.files)
- export(icon.path)
- export(desktopfile.files)
- export(desktopfile.path)
- INSTALLS += icon desktopfile
- }
-
- isEmpty(target.path) {
- target.path = $${installPrefix}/bin
- export(target.path)
- }
- INSTALLS += target
-}
-
-export (ICON)
-export (INSTALLS)
-export (DEPLOYMENT)
-export (LIBS)
-export (QMAKE_EXTRA_TARGETS)
-}
diff --git a/tests/qmldynamicdata/main.cpp b/tests/qmldynamicdata/main.cpp
index 7c9bcf86..fa3ea866 100644
--- a/tests/qmldynamicdata/main.cpp
+++ b/tests/qmldynamicdata/main.cpp
@@ -16,32 +16,31 @@
**
****************************************************************************/
-#include <QtDataVisualization/qutils.h>
#include <QtGui/QGuiApplication>
-#include "qtquick2applicationviewer.h"
-#ifdef Q_OS_ANDROID
-#include <QDir>
-#include <QQmlEngine>
-#endif
-#include <QDebug>
+#include <QtCore/QDir>
+#include <QtQuick/QQuickView>
+#include <QtQml/QQmlEngine>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
- QtQuick2ApplicationViewer viewer;
-
- // Enable antialiasing
- viewer.setFormat(QtDataVisualization::qDefaultSurfaceFormat());
+ QQuickView viewer;
-#ifdef Q_OS_ANDROID
- viewer.addImportPath(QString::fromLatin1("assets:/qml"));
- viewer.engine()->addPluginPath(QString::fromLatin1("%1/../%2").arg(QDir::homePath(),
- QString::fromLatin1("lib")));
+ // The following are needed to make examples run without having to install the module
+ // in desktop environments.
+#ifdef Q_OS_WIN
+ QString extraImportPath(QStringLiteral("%1/../../../%2"));
+#else
+ QString extraImportPath(QStringLiteral("%1/../../%2"));
#endif
+ viewer.engine()->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
+ QString::fromLatin1("qml")));
+ QObject::connect(viewer.engine(), &QQmlEngine::quit, &viewer, &QWindow::close);
+
viewer.setTitle(QStringLiteral("QML Dynamic Data Test"));
- viewer.setSource(QUrl("qrc:/qml/main.qml"));
+ viewer.setSource(QUrl("qrc:/qml/qmldynamicdata/main.qml"));
viewer.setResizeMode(QQuickView::SizeRootObjectToView);
viewer.show();
diff --git a/tests/qmldynamicdata/qml/qmldynamicdata/newbutton.qml b/tests/qmldynamicdata/qml/qmldynamicdata/NewButton.qml
index 0b792dbf..0b792dbf 100644
--- a/tests/qmldynamicdata/qml/qmldynamicdata/newbutton.qml
+++ b/tests/qmldynamicdata/qml/qmldynamicdata/NewButton.qml
diff --git a/tests/qmldynamicdata/qml/qmldynamicdata/main.qml b/tests/qmldynamicdata/qml/qmldynamicdata/main.qml
index 6f0032ac..0ec9d277 100644
--- a/tests/qmldynamicdata/qml/qmldynamicdata/main.qml
+++ b/tests/qmldynamicdata/qml/qmldynamicdata/main.qml
@@ -20,7 +20,7 @@ import QtQuick 2.1
import QtDataVisualization 1.0
import "."
-Item {
+Rectangle {
id: mainView
width: 1280
height: 720
@@ -28,8 +28,8 @@ Item {
ListModel {
id: graphModel
- ListElement{ xPos: 0.0; yPos: 0.0; zPos: 0.0 }
- ListElement{ xPos: 1.0; yPos: 1.0; zPos: 1.0 }
+ ListElement{ xPos: 0.0; yPos: 0.0; zPos: 0.0; rotation: "0.92388, 0.220942, 0.220942, 0.220942"}
+ ListElement{ xPos: 1.0; yPos: 1.0; zPos: 1.0; rotation: "@45,1.0,1.0,1.0" }
}
Timer {
@@ -38,19 +38,34 @@ Item {
running: true
repeat: true
property bool isIncreasing: true
+ property real rotationAngle: 0
+
+ function generateQuaternion() {
+ return "@" + Math.random() * 360 + "," + Math.random() + "," + Math.random() + "," + Math.random()
+ }
+
+ function appendRow() {
+ graphModel.append({"xPos": Math.random(),
+ "yPos": Math.random(),
+ "zPos": Math.random(),
+ "rotation": generateQuaternion()
+ });
+ }
onTriggered: {
+ rotationAngle = rotationAngle + 1
+ scatterSeries.setMeshAxisAndAngle(Qt.vector3d(1,1,1), rotationAngle)
if (isIncreasing) {
- graphModel.append({"xPos": Math.random(), "yPos": Math.random(), "zPos": Math.random()});
- graphModel.append({"xPos": Math.random(), "yPos": Math.random(), "zPos": Math.random()});
- graphModel.append({"xPos": Math.random(), "yPos": Math.random(), "zPos": Math.random()});
- graphModel.append({"xPos": Math.random(), "yPos": Math.random(), "zPos": Math.random()});
- graphModel.append({"xPos": Math.random(), "yPos": Math.random(), "zPos": Math.random()});
- graphModel.append({"xPos": Math.random(), "yPos": Math.random(), "zPos": Math.random()});
- graphModel.append({"xPos": Math.random(), "yPos": Math.random(), "zPos": Math.random()});
- graphModel.append({"xPos": Math.random(), "yPos": Math.random(), "zPos": Math.random()});
- graphModel.append({"xPos": Math.random(), "yPos": Math.random(), "zPos": Math.random()});
- graphModel.append({"xPos": Math.random(), "yPos": Math.random(), "zPos": Math.random()});
+ appendRow()
+ appendRow()
+ appendRow()
+ appendRow()
+ appendRow()
+ appendRow()
+ appendRow()
+ appendRow()
+ appendRow()
+ appendRow()
if (graphModel.count > 5000) {
scatterGraph.theme.type = Theme3D.ThemeIsabelle;
isIncreasing = false;
@@ -114,6 +129,7 @@ Item {
xPosRole: "xPos"
yPosRole: "yPos"
zPosRole: "zPos"
+ rotationRole: "rotation"
}
}
}
diff --git a/tests/qmldynamicdata/qmldynamicdata.pro b/tests/qmldynamicdata/qmldynamicdata.pro
index b95f1577..a6ffeb3d 100644
--- a/tests/qmldynamicdata/qmldynamicdata.pro
+++ b/tests/qmldynamicdata/qmldynamicdata.pro
@@ -2,25 +2,8 @@
error( "Couldn't find the tests.pri file!" )
}
-QT += widgets
-
-# Add more folders to ship with the application, here
-folder_01.source = qml/qmldynamicdata
-folder_01.target = qml
-DEPLOYMENTFOLDERS = folder_01
-
-# Additional import path used to resolve QML modules in Creator's code model
-QML_IMPORT_PATH =
-
-# The .cpp file which was generated for your project. Feel free to hack it.
SOURCES += main.cpp
-# Please do not modify the following two lines. Required for deployment.
-include(qtquick2applicationviewer/qtquick2applicationviewer.pri)
-qtcAddDeployment()
-
-RESOURCES += \
- qmldynamicdata.qrc
+RESOURCES += qmldynamicdata.qrc
-OTHER_FILES += doc/src/* \
- doc/images/*
+OTHER_FILES += qml/qmldynamicdata/*
diff --git a/tests/qmldynamicdata/qmldynamicdata.qrc b/tests/qmldynamicdata/qmldynamicdata.qrc
index 3a13d7b4..76641cf9 100644
--- a/tests/qmldynamicdata/qmldynamicdata.qrc
+++ b/tests/qmldynamicdata/qmldynamicdata.qrc
@@ -1,6 +1,6 @@
<RCC>
- <qresource prefix="/qml">
- <file alias="main.qml">qml/qmldynamicdata/main.qml</file>
- <file alias="NewButton.qml">qml/qmldynamicdata/newbutton.qml</file>
+ <qresource prefix="/">
+ <file>qml/qmldynamicdata/main.qml</file>
+ <file>qml/qmldynamicdata/NewButton.qml</file>
</qresource>
</RCC>
diff --git a/tests/qmldynamicdata/qtquick2applicationviewer/qtquick2applicationviewer.cpp b/tests/qmldynamicdata/qtquick2applicationviewer/qtquick2applicationviewer.cpp
deleted file mode 100644
index 10709d7a..00000000
--- a/tests/qmldynamicdata/qtquick2applicationviewer/qtquick2applicationviewer.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-// checksum 0x4f6f version 0x90005
-/*
- This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
- QtQuick2ApplicationViewer is a convenience class containing mobile device specific
- code such as screen orientation handling. Also QML paths and debugging are
- handled here.
- It is recommended not to modify this file, since newer versions of Qt Creator
- may offer an updated version of it.
-*/
-
-#include "qtquick2applicationviewer.h"
-
-#include <QtCore/QCoreApplication>
-#include <QtCore/QDir>
-#include <QtQml/QQmlEngine>
-
-class QtQuick2ApplicationViewerPrivate
-{
- QString mainQmlFile;
- friend class QtQuick2ApplicationViewer;
- static QString adjustPath(const QString &path);
-};
-
-QString QtQuick2ApplicationViewerPrivate::adjustPath(const QString &path)
-{
-#if defined(Q_OS_MAC)
- if (!QDir::isAbsolutePath(path))
- return QString::fromLatin1("%1/../Resources/%2")
- .arg(QCoreApplication::applicationDirPath(), path);
-#elif defined(Q_OS_BLACKBERRY)
- if (!QDir::isAbsolutePath(path))
- return QString::fromLatin1("app/native/%1").arg(path);
-#elif !defined(Q_OS_ANDROID)
- QString pathInInstallDir =
- QString::fromLatin1("%1/../%2").arg(QCoreApplication::applicationDirPath(), path);
- if (QFileInfo(pathInInstallDir).exists())
- return pathInInstallDir;
- pathInInstallDir =
- QString::fromLatin1("%1/%2").arg(QCoreApplication::applicationDirPath(), path);
- if (QFileInfo(pathInInstallDir).exists())
- return pathInInstallDir;
-#endif
- return path;
-}
-
-QtQuick2ApplicationViewer::QtQuick2ApplicationViewer(QWindow *parent)
- : QQuickView(parent)
- , d(new QtQuick2ApplicationViewerPrivate())
-{
- connect(engine(), SIGNAL(quit()), SLOT(close()));
- setResizeMode(QQuickView::SizeRootObjectToView);
-}
-
-QtQuick2ApplicationViewer::~QtQuick2ApplicationViewer()
-{
- delete d;
-}
-
-void QtQuick2ApplicationViewer::setMainQmlFile(const QString &file)
-{
- d->mainQmlFile = QtQuick2ApplicationViewerPrivate::adjustPath(file);
-#ifdef Q_OS_ANDROID
- setSource(QUrl(QLatin1String("assets:/")+d->mainQmlFile));
-#else
- setSource(QUrl::fromLocalFile(d->mainQmlFile));
-#endif
-}
-
-void QtQuick2ApplicationViewer::addImportPath(const QString &path)
-{
- engine()->addImportPath(QtQuick2ApplicationViewerPrivate::adjustPath(path));
-}
-
-void QtQuick2ApplicationViewer::showExpanded()
-{
-#if defined(Q_WS_SIMULATOR) || defined(Q_OS_QNX)
- showFullScreen();
-#else
- show();
-#endif
-}
diff --git a/tests/qmldynamicdata/qtquick2applicationviewer/qtquick2applicationviewer.h b/tests/qmldynamicdata/qtquick2applicationviewer/qtquick2applicationviewer.h
deleted file mode 100644
index cf66f140..00000000
--- a/tests/qmldynamicdata/qtquick2applicationviewer/qtquick2applicationviewer.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// checksum 0xfde6 version 0x90005
-/*
- This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
- QtQuick2ApplicationViewer is a convenience class containing mobile device specific
- code such as screen orientation handling. Also QML paths and debugging are
- handled here.
- It is recommended not to modify this file, since newer versions of Qt Creator
- may offer an updated version of it.
-*/
-
-#ifndef QTQUICK2APPLICATIONVIEWER_H
-#define QTQUICK2APPLICATIONVIEWER_H
-
-#include <QtQuick/QQuickView>
-
-class QtQuick2ApplicationViewer : public QQuickView
-{
- Q_OBJECT
-
-public:
- explicit QtQuick2ApplicationViewer(QWindow *parent = 0);
- virtual ~QtQuick2ApplicationViewer();
-
- void setMainQmlFile(const QString &file);
- void addImportPath(const QString &path);
-
- void showExpanded();
-
-private:
- class QtQuick2ApplicationViewerPrivate *d;
-};
-
-#endif // QTQUICK2APPLICATIONVIEWER_H
diff --git a/tests/qmldynamicdata/qtquick2applicationviewer/qtquick2applicationviewer.pri b/tests/qmldynamicdata/qtquick2applicationviewer/qtquick2applicationviewer.pri
deleted file mode 100644
index e5f7990f..00000000
--- a/tests/qmldynamicdata/qtquick2applicationviewer/qtquick2applicationviewer.pri
+++ /dev/null
@@ -1,180 +0,0 @@
-# checksum 0x7b0d version 0x90005
-# This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
-# The code below adds the QtQuick2ApplicationViewer to the project and handles
-# the activation of QML debugging.
-# It is recommended not to modify this file, since newer versions of Qt Creator
-# may offer an updated version of it.
-
-QT += qml quick
-
-SOURCES += $$PWD/qtquick2applicationviewer.cpp
-HEADERS += $$PWD/qtquick2applicationviewer.h
-INCLUDEPATH += $$PWD
-# This file was generated by an application wizard of Qt Creator.
-# The code below handles deployment to Android and Maemo, aswell as copying
-# of the application data to shadow build directories on desktop.
-# It is recommended not to modify this file, since newer versions of Qt Creator
-# may offer an updated version of it.
-
-defineTest(qtcAddDeployment) {
-for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- greaterThan(QT_MAJOR_VERSION, 4) {
- itemsources = $${item}.files
- } else {
- itemsources = $${item}.sources
- }
- $$itemsources = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath= $$eval($${deploymentfolder}.target)
- export($$itemsources)
- export($$itempath)
- DEPLOYMENT += $$item
-}
-
-MAINPROFILEPWD = $$PWD
-
-android-no-sdk {
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- itemfiles = $${item}.files
- $$itemfiles = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath = /data/user/qt/$$eval($${deploymentfolder}.target)
- export($$itemfiles)
- export($$itempath)
- INSTALLS += $$item
- }
-
- target.path = /data/user/qt
-
- export(target.path)
- INSTALLS += target
-} else:android {
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- itemfiles = $${item}.files
- $$itemfiles = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath = /assets/$$eval($${deploymentfolder}.target)
- export($$itemfiles)
- export($$itempath)
- INSTALLS += $$item
- }
-
- x86 {
- target.path = /libs/x86
- } else: armeabi-v7a {
- target.path = /libs/armeabi-v7a
- } else {
- target.path = /libs/armeabi
- }
-
- export(target.path)
- INSTALLS += target
-} else:win32 {
- copyCommand =
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
- source = $$replace(source, /, \\)
- sourcePathSegments = $$split(source, \\)
- target = $$OUT_PWD/$$eval($${deploymentfolder}.target)/$$last(sourcePathSegments)
- target = $$replace(target, /, \\)
- target ~= s,\\\\\\.?\\\\,\\,
- !isEqual(source,$$target) {
- !isEmpty(copyCommand):copyCommand += &&
- isEqual(QMAKE_DIR_SEP, \\) {
- copyCommand += $(COPY_DIR) \"$$source\" \"$$target\"
- } else {
- source = $$replace(source, \\\\, /)
- target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
- target = $$replace(target, \\\\, /)
- copyCommand += test -d \"$$target\" || mkdir -p \"$$target\" && cp -r \"$$source\" \"$$target\"
- }
- }
- }
- !isEmpty(copyCommand) {
- copyCommand = @echo Copying application data... && $$copyCommand
- copydeploymentfolders.commands = $$copyCommand
- first.depends = $(first) copydeploymentfolders
- export(first.depends)
- export(copydeploymentfolders.commands)
- QMAKE_EXTRA_TARGETS += first copydeploymentfolders
- }
-} else:unix {
- maemo5 {
- desktopfile.files = $${TARGET}.desktop
- desktopfile.path = /usr/share/applications/hildon
- icon.files = $${TARGET}64.png
- icon.path = /usr/share/icons/hicolor/64x64/apps
- } else:!isEmpty(MEEGO_VERSION_MAJOR) {
- desktopfile.files = $${TARGET}_harmattan.desktop
- desktopfile.path = /usr/share/applications
- icon.files = $${TARGET}80.png
- icon.path = /usr/share/icons/hicolor/80x80/apps
- } else { # Assumed to be a Desktop Unix
- copyCommand =
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
- source = $$replace(source, \\\\, /)
- macx {
- target = $$OUT_PWD/$${TARGET}.app/Contents/Resources/$$eval($${deploymentfolder}.target)
- } else {
- target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
- }
- target = $$replace(target, \\\\, /)
- sourcePathSegments = $$split(source, /)
- targetFullPath = $$target/$$last(sourcePathSegments)
- targetFullPath ~= s,/\\.?/,/,
- !isEqual(source,$$targetFullPath) {
- !isEmpty(copyCommand):copyCommand += &&
- copyCommand += $(MKDIR) \"$$target\"
- copyCommand += && $(COPY_DIR) \"$$source\" \"$$target\"
- }
- }
- !isEmpty(copyCommand) {
- copyCommand = @echo Copying application data... && $$copyCommand
- copydeploymentfolders.commands = $$copyCommand
- first.depends = $(first) copydeploymentfolders
- export(first.depends)
- export(copydeploymentfolders.commands)
- QMAKE_EXTRA_TARGETS += first copydeploymentfolders
- }
- }
- !isEmpty(target.path) {
- installPrefix = $${target.path}
- } else {
- installPrefix = /opt/$${TARGET}
- }
- for(deploymentfolder, DEPLOYMENTFOLDERS) {
- item = item$${deploymentfolder}
- itemfiles = $${item}.files
- $$itemfiles = $$eval($${deploymentfolder}.source)
- itempath = $${item}.path
- $$itempath = $${installPrefix}/$$eval($${deploymentfolder}.target)
- export($$itemfiles)
- export($$itempath)
- INSTALLS += $$item
- }
-
- !isEmpty(desktopfile.path) {
- export(icon.files)
- export(icon.path)
- export(desktopfile.files)
- export(desktopfile.path)
- INSTALLS += icon desktopfile
- }
-
- isEmpty(target.path) {
- target.path = $${installPrefix}/bin
- export(target.path)
- }
- INSTALLS += target
-}
-
-export (ICON)
-export (INSTALLS)
-export (DEPLOYMENT)
-export (LIBS)
-export (QMAKE_EXTRA_TARGETS)
-}
diff --git a/tests/scattertest/scatterchart.cpp b/tests/scattertest/scatterchart.cpp
index 6ee7711e..aa0c5454 100644
--- a/tests/scattertest/scatterchart.cpp
+++ b/tests/scattertest/scatterchart.cpp
@@ -433,19 +433,21 @@ void ScatterDataModifier::setGradient()
singleHighlightGradient.setColorAt(0.25, Qt::yellow);
singleHighlightGradient.setColorAt(0.0, Qt::white);
- m_targetSeries->setBaseColor(Qt::green);
- m_targetSeries->setSingleHighlightColor(Qt::white);
-
- m_targetSeries->setBaseGradient(baseGradient);
- m_targetSeries->setSingleHighlightGradient(singleHighlightGradient);
-
- Q3DTheme::ColorStyle oldStyle = m_targetSeries->colorStyle();
- if (oldStyle == Q3DTheme::ColorStyleUniform)
- m_targetSeries->setColorStyle(Q3DTheme::ColorStyleObjectGradient);
- else if (oldStyle == Q3DTheme::ColorStyleObjectGradient)
- m_targetSeries->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
- if (oldStyle == Q3DTheme::ColorStyleRangeGradient)
- m_targetSeries->setColorStyle(Q3DTheme::ColorStyleUniform);
+ if (m_targetSeries) {
+ m_targetSeries->setBaseColor(Qt::green);
+ m_targetSeries->setSingleHighlightColor(Qt::white);
+
+ m_targetSeries->setBaseGradient(baseGradient);
+ m_targetSeries->setSingleHighlightGradient(singleHighlightGradient);
+
+ Q3DTheme::ColorStyle oldStyle = m_targetSeries->colorStyle();
+ if (oldStyle == Q3DTheme::ColorStyleUniform)
+ m_targetSeries->setColorStyle(Q3DTheme::ColorStyleObjectGradient);
+ else if (oldStyle == Q3DTheme::ColorStyleObjectGradient)
+ m_targetSeries->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
+ if (oldStyle == Q3DTheme::ColorStyleRangeGradient)
+ m_targetSeries->setColorStyle(Q3DTheme::ColorStyleUniform);
+ }
}
void ScatterDataModifier::addSeries()
diff --git a/tests/scattertest/scattertest.pro b/tests/scattertest/scattertest.pro
index 62fb3d39..4fec5b34 100644
--- a/tests/scattertest/scattertest.pro
+++ b/tests/scattertest/scattertest.pro
@@ -6,5 +6,3 @@ SOURCES += main.cpp scatterchart.cpp
HEADERS += scatterchart.h
QT += widgets
-
-INSTALLS += target
diff --git a/tests/spectrum/spectrumapp/spectrumapp.pro b/tests/spectrum/spectrumapp/spectrumapp.pro
index f5b52954..ab12e221 100644
--- a/tests/spectrum/spectrumapp/spectrumapp.pro
+++ b/tests/spectrum/spectrumapp/spectrumapp.pro
@@ -47,14 +47,6 @@ RESOURCES = spectrum.qrc
}
}
-
-android {
- target.path = /libs/$$ANDROID_TARGET_ARCH
-} else {
- target.path = $$[QT_INSTALL_EXAMPLES]/datavisualization/spectrum
-}
-INSTALLS += target
-
# Deployment
DESTDIR = ..$${spectrum_build_dir}
diff --git a/tests/surfacetest/graphmodifier.cpp b/tests/surfacetest/graphmodifier.cpp
index 528a803b..7f2a3ef2 100644
--- a/tests/surfacetest/graphmodifier.cpp
+++ b/tests/surfacetest/graphmodifier.cpp
@@ -34,14 +34,18 @@ using namespace QtDataVisualization;
GraphModifier::GraphModifier(Q3DSurface *graph)
: m_graph(graph),
+ m_series1(new QSurface3DSeries),
+ m_series2(new QSurface3DSeries),
+ m_series3(new QSurface3DSeries),
+ m_series4(new QSurface3DSeries),
m_gridSliderX(0),
m_gridSliderZ(0),
m_axisRangeSliderX(0),
m_axisRangeSliderZ(0),
m_axisMinSliderX(0),
m_axisMinSliderZ(0),
- m_xCount(50),
- m_zCount(50),
+ m_xCount(24),
+ m_zCount(24),
m_activeSample(0),
m_fontSize(40),
m_rangeX(16.0),
@@ -53,15 +57,50 @@ GraphModifier::GraphModifier(Q3DSurface *graph)
m_insertTestIndexPos(1),
m_planeArray(0),
m_theSeries(new QSurface3DSeries),
- m_drawMode(QSurface3DSeries::DrawSurfaceAndWireframe)
+ m_drawMode(QSurface3DSeries::DrawSurfaceAndWireframe),
+ m_drawMode2(QSurface3DSeries::DrawSurfaceAndWireframe),
+ m_drawMode3(QSurface3DSeries::DrawSurfaceAndWireframe),
+ m_drawMode4(QSurface3DSeries::DrawSurfaceAndWireframe),
+ m_offset(4.0f)
{
m_graph->setAxisX(new QValue3DAxis);
+ m_graph->axisX()->setTitle("X-Axis");
m_graph->setAxisY(new QValue3DAxis);
+ m_graph->axisY()->setTitle("Value Axis");
m_graph->setAxisZ(new QValue3DAxis);
+ m_graph->axisZ()->setTitle("Z-Axis");
+#ifdef MULTI_SERIES
+ m_limitX = float(m_xCount) / 2.0f;
+ m_limitZ = float(m_zCount) / 2.0f;
+ // Series 1
+ m_multiSampleOffsetX[0] = -m_offset;
+ m_multiSampleOffsetZ[0] = -m_offset;
+ // Series 2
+ m_multiSampleOffsetX[1] = -m_offset;
+ m_multiSampleOffsetZ[1] = m_offset;
+ // Series 3
+ m_multiSampleOffsetX[2] = m_offset;
+ m_multiSampleOffsetZ[2] = -m_offset;
+ // Series 4
+ m_multiSampleOffsetX[3] = m_offset;
+ m_multiSampleOffsetZ[3] = m_offset;
+
+ m_graph->axisX()->setRange(-m_limitX - m_offset, m_limitX + m_offset);
+ m_graph->axisY()->setRange(-1.0f, 4.5f);
+ m_graph->axisZ()->setRange(-m_limitZ - m_offset, m_limitZ + m_offset);
+#else
m_graph->axisX()->setRange(m_minX, m_minX + m_rangeX);
m_graph->axisZ()->setRange(m_minZ, m_minZ + m_rangeZ);
m_graph->addSeries(m_theSeries);
+#endif
+ for (int i = 0; i < 4; i++) {
+ m_multiseries[i] = new QSurface3DSeries;
+ m_multiseries[i]->setName(QStringLiteral("Series %1").arg(i+1));
+ m_multiseries[i]->setItemLabelFormat(QStringLiteral("@seriesName: (@xLabel, @zLabel): @yLabel"));
+ }
+
+ fillSeries();
changeStyle();
m_theSeries->setItemLabelFormat(QStringLiteral("@seriesName: (@xLabel, @zLabel): @yLabel"));
@@ -82,10 +121,94 @@ GraphModifier::~GraphModifier()
delete m_graph;
}
+void GraphModifier::fillSeries()
+{
+ float full = m_limitX * m_limitZ;
+
+ QSurfaceDataArray *dataArray1 = new QSurfaceDataArray;
+ dataArray1->reserve(m_zCount);
+ QSurfaceDataArray *dataArray2 = new QSurfaceDataArray;
+ dataArray2->reserve(m_zCount);
+ QSurfaceDataArray *dataArray3 = new QSurfaceDataArray;
+ dataArray3->reserve(m_zCount);
+ QSurfaceDataArray *dataArray4 = new QSurfaceDataArray;
+ dataArray4->reserve(m_zCount);
+
+ for (int i = 0; i < m_zCount; i++) {
+ QSurfaceDataRow *newRow[4];
+ for (int s = 0; s < 4; s++) {
+ newRow[s] = new QSurfaceDataRow(m_xCount);
+ float z = float(i) - m_limitZ + 0.5f + m_multiSampleOffsetZ[s];
+ for (int j = 0; j < m_xCount; j++) {
+ float x = float(j) - m_limitX + 0.5f + m_multiSampleOffsetX[s];
+ float angle = (z * x) / full * 1.57f;
+ float y = qSin(angle * float(qPow(1.3f, s))) + 1.1f * s;
+ (*newRow[s])[j].setPosition(QVector3D(x, y, z));
+ }
+ }
+ *dataArray1 << newRow[0];
+ *dataArray2 << newRow[1];
+ *dataArray3 << newRow[2];
+ *dataArray4 << newRow[3];
+ }
+
+ m_multiseries[0]->dataProxy()->resetArray(dataArray1);
+ m_multiseries[1]->dataProxy()->resetArray(dataArray2);
+ m_multiseries[2]->dataProxy()->resetArray(dataArray3);
+ m_multiseries[3]->dataProxy()->resetArray(dataArray4);
+}
+
+void GraphModifier::toggleSeries1(bool enabled)
+{
+ qDebug() << __FUNCTION__ << " enabled = " << enabled;
+
+ if (enabled) {
+ m_graph->addSeries(m_multiseries[0]);
+ } else {
+ m_graph->removeSeries(m_multiseries[0]);
+ }
+}
+
+void GraphModifier::toggleSeries2(bool enabled)
+{
+ qDebug() << __FUNCTION__ << " enabled = " << enabled;
+
+ if (enabled) {
+ m_graph->addSeries(m_multiseries[1]);
+ } else {
+ m_graph->removeSeries(m_multiseries[1]);
+ }
+}
+
+void GraphModifier::toggleSeries3(bool enabled)
+{
+ qDebug() << __FUNCTION__ << " enabled = " << enabled;
+
+ if (enabled) {
+ m_graph->addSeries(m_multiseries[2]);
+ } else {
+ m_graph->removeSeries(m_multiseries[2]);
+ }
+}
+
+void GraphModifier::toggleSeries4(bool enabled)
+{
+ qDebug() << __FUNCTION__ << " enabled = " << enabled;
+
+ if (enabled) {
+ m_graph->addSeries(m_multiseries[3]);
+ } else {
+ m_graph->removeSeries(m_multiseries[3]);
+ }
+}
+
void GraphModifier::toggleSmooth(bool enabled)
{
qDebug() << "GraphModifier::toggleSmooth " << enabled;
m_theSeries->setFlatShadingEnabled(enabled);
+#ifdef MULTI_SERIES
+ m_multiseries[0]->setFlatShadingEnabled(enabled);
+#endif
}
void GraphModifier::toggleSurfaceGrid(bool enable)
@@ -97,6 +220,9 @@ void GraphModifier::toggleSurfaceGrid(bool enable)
m_drawMode &= ~QSurface3DSeries::DrawWireframe;
m_theSeries->setDrawMode(m_drawMode);
+#ifdef MULTI_SERIES
+ m_multiseries[0]->setDrawMode(m_drawMode);
+#endif
}
void GraphModifier::toggleSurface(bool enable)
@@ -108,11 +234,119 @@ void GraphModifier::toggleSurface(bool enable)
m_drawMode &= ~QSurface3DSeries::DrawSurface;
m_theSeries->setDrawMode(m_drawMode);
+#ifdef MULTI_SERIES
+ m_multiseries[0]->setDrawMode(m_drawMode);
+#endif
}
void GraphModifier::toggleSeriesVisible(bool enable)
{
m_theSeries->setVisible(enable);
+#ifdef MULTI_SERIES
+ m_multiseries[0]->setVisible(enable);
+#endif
+}
+
+void GraphModifier::toggleSmoothS2(bool enabled)
+{
+ qDebug() << __FUNCTION__ << enabled;
+ m_multiseries[1]->setFlatShadingEnabled(enabled);
+}
+
+void GraphModifier::toggleSurfaceGridS2(bool enable)
+{
+ qDebug() << __FUNCTION__ << enable;
+ if (enable)
+ m_drawMode2 |= QSurface3DSeries::DrawWireframe;
+ else
+ m_drawMode2 &= ~QSurface3DSeries::DrawWireframe;
+
+ m_multiseries[1]->setDrawMode(m_drawMode2);
+}
+
+void GraphModifier::toggleSurfaceS2(bool enable)
+{
+ qDebug() << __FUNCTION__ << enable;
+ if (enable)
+ m_drawMode2 |= QSurface3DSeries::DrawSurface;
+ else
+ m_drawMode2 &= ~QSurface3DSeries::DrawSurface;
+
+ m_multiseries[1]->setDrawMode(m_drawMode2);
+}
+
+void GraphModifier::toggleSeries2Visible(bool enable)
+{
+ qDebug() << __FUNCTION__ << enable;
+ m_multiseries[1]->setVisible(enable);
+}
+
+void GraphModifier::toggleSmoothS3(bool enabled)
+{
+ qDebug() << __FUNCTION__ << enabled;
+ m_multiseries[2]->setFlatShadingEnabled(enabled);
+}
+
+void GraphModifier::toggleSurfaceGridS3(bool enable)
+{
+ qDebug() << __FUNCTION__ << enable;
+ if (enable)
+ m_drawMode3 |= QSurface3DSeries::DrawWireframe;
+ else
+ m_drawMode3 &= ~QSurface3DSeries::DrawWireframe;
+
+ m_multiseries[2]->setDrawMode(m_drawMode3);
+}
+
+void GraphModifier::toggleSurfaceS3(bool enable)
+{
+ qDebug() << __FUNCTION__ << enable;
+ if (enable)
+ m_drawMode3 |= QSurface3DSeries::DrawSurface;
+ else
+ m_drawMode3 &= ~QSurface3DSeries::DrawSurface;
+
+ m_multiseries[2]->setDrawMode(m_drawMode3);
+}
+
+void GraphModifier::toggleSeries3Visible(bool enable)
+{
+ qDebug() << __FUNCTION__ << enable;
+ m_multiseries[2]->setVisible(enable);
+}
+
+void GraphModifier::toggleSmoothS4(bool enabled)
+{
+ qDebug() << __FUNCTION__ << enabled;
+ m_multiseries[3]->setFlatShadingEnabled(enabled);
+}
+
+void GraphModifier::toggleSurfaceGridS4(bool enable)
+{
+ qDebug() << __FUNCTION__ << enable;
+ if (enable)
+ m_drawMode4 |= QSurface3DSeries::DrawWireframe;
+ else
+ m_drawMode4 &= ~QSurface3DSeries::DrawWireframe;
+
+ m_multiseries[3]->setDrawMode(m_drawMode4);
+}
+
+void GraphModifier::toggleSurfaceS4(bool enable)
+{
+ qDebug() << __FUNCTION__ << enable;
+ if (enable)
+ m_drawMode4 |= QSurface3DSeries::DrawSurface;
+ else
+ m_drawMode4 &= ~QSurface3DSeries::DrawSurface;
+
+ m_multiseries[3]->setDrawMode(m_drawMode4);
+}
+
+void GraphModifier::toggleSeries4Visible(bool enable)
+{
+ qDebug() << __FUNCTION__ << enable;
+ m_multiseries[3]->setVisible(enable);
}
void GraphModifier::toggleSqrtSin(bool enable)
@@ -347,9 +581,14 @@ void GraphModifier::gradientPressed()
gradient.setColorAt(0.33, Qt::blue);
gradient.setColorAt(0.67, Qt::red);
gradient.setColorAt(1.0, Qt::yellow);
- m_graph->seriesList().at(0)->setBaseGradient(gradient);
- m_graph->seriesList().at(0)->setSingleHighlightColor(Qt::red);
- m_graph->seriesList().at(0)->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
+// m_graph->seriesList().at(0)->setBaseGradient(gradient);
+// m_graph->seriesList().at(0)->setSingleHighlightColor(Qt::red);
+// m_graph->seriesList().at(0)->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
+
+ QList<QLinearGradient> gradients;
+ gradients << gradient;
+ m_graph->activeTheme()->setBaseGradients(gradients);
+ m_graph->activeTheme()->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
}
void GraphModifier::changeFont(const QFont &font)
@@ -474,10 +713,39 @@ void GraphModifier::changeRow()
m_theSeries->dataProxy()->setRow(int(i), newRow);
} else {
+#ifdef MULTI_SERIES
+ static int changeRowSeries = 0;
+ qDebug() << "Generating new values to a row at random pos for series " << changeRowSeries;
+
+ int row = rand() % m_zCount;
+ QSurfaceDataRow *newRow = createMultiRow(row, changeRowSeries, true);
+ m_multiseries[changeRowSeries]->dataProxy()->setRow(row, newRow);
+
+ changeRowSeries++;
+ if (changeRowSeries > 3)
+ changeRowSeries = 0;
+#else
qDebug() << "Change row function active only for SqrtSin";
+#endif
}
}
+QSurfaceDataRow *GraphModifier::createMultiRow(int row, int series, bool change)
+{
+ int full = m_limitX * m_limitZ;
+ float i = float(row);
+ QSurfaceDataRow *newRow = new QSurfaceDataRow(m_xCount);
+ float z = float(i) - m_limitZ + 0.5f + m_multiSampleOffsetZ[series];
+ for (int j = 0; j < m_xCount; j++) {
+ float x = float(j) - m_limitX + 0.5f + m_multiSampleOffsetX[series];
+ float angle = (z * x) / float(full) * 1.57f;
+ float y = qSin(angle * float(qPow(1.3f, series))) + 0.2f * float(change) + 1.1f *series;
+ (*newRow)[j].setPosition(QVector3D(x, y, z));
+ }
+
+ return newRow;
+}
+
void GraphModifier::changeRows()
{
if (m_activeSample == GraphModifier::SqrtSin) {
@@ -507,7 +775,24 @@ void GraphModifier::changeRows()
m_theSeries->dataProxy()->setRows(int(start), dataArray);
} else {
+#ifdef MULTI_SERIES
+ static int changeRowSeries = 0;
+ qDebug() << "Generating new values for 3 rows at random pos for series " << changeRowSeries;
+
+ int row = rand() % (m_zCount - 3);
+ QSurfaceDataArray dataArray;
+ for (int i = 0; i < 3; i++) {
+ QSurfaceDataRow *newRow = createMultiRow(row + i, changeRowSeries, true);
+ dataArray.append(newRow);
+ }
+ m_multiseries[changeRowSeries]->dataProxy()->setRows(row, dataArray);
+
+ changeRowSeries++;
+ if (changeRowSeries > 3)
+ changeRowSeries = 0;
+#else
qDebug() << "Change row function active only for SqrtSin";
+#endif
}
}
@@ -532,7 +817,23 @@ void GraphModifier::changeItem()
m_theSeries->dataProxy()->setItem(int(i), int(j), newItem);
} else {
- qDebug() << "Change row function active only for SqrtSin";
+#ifdef MULTI_SERIES
+ static int changeItemSeries = 0;
+ int full = m_limitX * m_limitZ;
+ float i = float(rand() % m_zCount);
+ float j = float(rand() % m_xCount);
+ float x = float(j) - m_limitX + 0.5f + m_multiSampleOffsetX[changeItemSeries];
+ float z = float(i) - m_limitZ + 0.5f + m_multiSampleOffsetZ[changeItemSeries];
+ float angle = (z * x) / float(full) * 1.57f;
+ float y = qSin(angle * float(qPow(1.3f, changeItemSeries))) + 0.2f + 1.1f *changeItemSeries;
+ QSurfaceDataItem newItem(QVector3D(x, y, z));
+ m_multiseries[changeItemSeries]->dataProxy()->setItem(int(i), int(j), newItem);
+ changeItemSeries++;
+ if (changeItemSeries > 3)
+ changeItemSeries = 0;
+#else
+ qDebug() << "Change item function active only for SqrtSin";
+#endif
}
}
@@ -572,7 +873,24 @@ void GraphModifier::addRow()
m_theSeries->dataProxy()->addRow(newRow);
} else {
- qDebug() << "Change row function active only for SqrtSin";
+#ifdef MULTI_SERIES
+ qDebug() << "Adding a row into series 3";
+ int full = m_limitX * m_limitZ;
+ int series = 2;
+
+ QSurfaceDataRow *newRow = new QSurfaceDataRow(m_xCount);
+ float z = float(m_addRowCounter) - m_limitZ + 0.5f + m_multiSampleOffsetZ[series];
+ for (int j = 0; j < m_xCount; j++) {
+ float x = float(j) - m_limitX + 0.5f + m_multiSampleOffsetX[series];
+ float angle = float(z * x) / float(full) * 1.57f;
+ (*newRow)[j].setPosition(QVector3D(x, qSin(angle *float(qPow(1.3f, series))) + 1.1f * series, z));
+ }
+ m_addRowCounter++;
+
+ m_multiseries[series]->dataProxy()->addRow(newRow);
+#else
+ qDebug() << "Add row function active only for SqrtSin";
+#endif
}
}
@@ -605,7 +923,21 @@ void GraphModifier::addRows()
m_theSeries->dataProxy()->addRows(dataArray);
} else {
- qDebug() << "Change row function active only for SqrtSin";
+#ifdef MULTI_SERIES
+ qDebug() << "Adding 3 rows into series 3";
+ int changedSeries = 2;
+
+ QSurfaceDataArray dataArray;
+ for (int i = 0; i < 3; i++) {
+ QSurfaceDataRow *newRow = createMultiRow(m_addRowCounter, changedSeries, false);
+ dataArray.append(newRow);
+ m_addRowCounter++;
+ }
+
+ m_multiseries[changedSeries]->dataProxy()->addRows(dataArray);
+#else
+ qDebug() << "Add rows function active only for SqrtSin";
+#endif
}
}
@@ -633,7 +965,28 @@ void GraphModifier::insertRow()
m_theSeries->dataProxy()->insertRow(m_insertTestIndexPos, newRow);
m_insertTestIndexPos += 2;
} else {
- qDebug() << "Change row function active only for SqrtSin";
+#ifdef MULTI_SERIES
+ qDebug() << "Inserting a row into series 3";
+ int full = m_limitX * m_limitZ;
+ int changedSeries = 2;
+
+ QSurfaceDataRow *newRow = new QSurfaceDataRow(m_xCount);
+ float z = float(m_insertTestZPos) - m_limitZ + m_multiSampleOffsetZ[changedSeries];
+ for (int j = 0; j < m_xCount; j++) {
+ float x = float(j) - m_limitX + m_multiSampleOffsetX[changedSeries];
+ float angle = (z * x) / float(full) * 1.57f;
+ (*newRow)[j].setPosition(QVector3D(x + 0.5f,
+ qSin(angle * float(qPow(1.3f, changedSeries))) + 1.2f * changedSeries,
+ z + 1.0f));
+ }
+
+ m_insertTestZPos++;
+
+ m_multiseries[2]->dataProxy()->insertRow(m_insertTestIndexPos, newRow);
+ m_insertTestIndexPos += 2;
+#else
+ qDebug() << "Insert row function active only for SqrtSin";
+#endif
}
}
@@ -665,15 +1018,50 @@ void GraphModifier::insertRows()
m_theSeries->dataProxy()->insertRows(m_insertTestIndexPos, dataArray);
m_insertTestIndexPos += 4;
} else {
- qDebug() << "Change row function active only for SqrtSin";
+#ifdef MULTI_SERIES
+ qDebug() << "Inserting 3 rows into series 3";
+ int full = m_limitX * m_limitZ;
+ int changedSeries = 2;
+
+ QSurfaceDataArray dataArray;
+ float zAdd = 0.25f;
+ for (int i = 0; i < 3; i++) {
+ QSurfaceDataRow *newRow = new QSurfaceDataRow(m_xCount);
+ float z = float(m_insertTestZPos) - m_limitZ + 0.5f + zAdd + m_multiSampleOffsetZ[changedSeries];
+ for (int j = 0; j < m_xCount; j++) {
+ float x = float(j) - m_limitX + 0.5f + m_multiSampleOffsetX[changedSeries];
+ float angle = (z * x) / float(full) * 1.57f;
+ float y = qSin(angle * float(qPow(1.3f, changedSeries))) + + 1.2f * changedSeries;
+ (*newRow)[j].setPosition(QVector3D(x, y, z));
+ }
+ zAdd += 0.25f;
+ dataArray.append(newRow);
+ }
+
+ m_insertTestZPos++;
+
+ m_multiseries[2]->dataProxy()->insertRows(m_insertTestIndexPos, dataArray);
+ m_insertTestIndexPos += 4;
+#else
+ qDebug() << "Insert rows function active only for SqrtSin";
+#endif
}
}
void GraphModifier::removeRow()
{
qDebug() << "Remove an arbitrary row";
+ if (m_zCount < 1)
+ return;
+
int row = rand() % m_zCount;
+
+#ifdef MULTI_SERIES
+ int series = rand() % 4;
+ m_multiseries[series]->dataProxy()->removeRows(row, 1);
+#else
m_theSeries->dataProxy()->removeRows(row, 1);
+#endif
m_zCount--;
}
diff --git a/tests/surfacetest/graphmodifier.h b/tests/surfacetest/graphmodifier.h
index 8ccff62f..7d7d425e 100644
--- a/tests/surfacetest/graphmodifier.h
+++ b/tests/surfacetest/graphmodifier.h
@@ -25,6 +25,9 @@
#include <QSlider>
#include <QTimer>
#include <QLabel>
+#include <QCheckBox>
+
+#define MULTI_SERIES
using namespace QtDataVisualization;
@@ -41,10 +44,27 @@ public:
explicit GraphModifier(Q3DSurface *graph);
~GraphModifier();
+ void toggleSeries1(bool enabled);
+ void toggleSeries2(bool enabled);
+ void toggleSeries3(bool enabled);
+ void toggleSeries4(bool enabled);
void toggleSmooth(bool enabled);
void toggleSurfaceGrid(bool enable);
void toggleSurface(bool enable);
void toggleSeriesVisible(bool enable);
+ void toggleSmoothS2(bool enabled);
+ void toggleSurfaceGridS2(bool enable);
+ void toggleSurfaceS2(bool enable);
+ void toggleSeries2Visible(bool enable);
+ void toggleSmoothS3(bool enabled);
+ void toggleSurfaceGridS3(bool enable);
+ void toggleSurfaceS3(bool enable);
+ void toggleSeries3Visible(bool enable);
+ void toggleSmoothS4(bool enabled);
+ void toggleSurfaceGridS4(bool enable);
+ void toggleSurfaceS4(bool enable);
+ void toggleSeries4Visible(bool enable);
+
void toggleSqrtSin(bool enable);
void togglePlane(bool enable);
void setHeightMapData(bool enable);
@@ -55,6 +75,10 @@ public:
void setAxisRangeSliderZ(QSlider *slider) { m_axisRangeSliderZ = slider; }
void setAxisMinSliderX(QSlider *slider) { m_axisMinSliderX = slider; }
void setAxisMinSliderZ(QSlider *slider) { m_axisMinSliderZ = slider; }
+ void setSeries1CB(QCheckBox *cb) { m_series1CB = cb; }
+ void setSeries2CB(QCheckBox *cb) { m_series2CB = cb; }
+ void setSeries3CB(QCheckBox *cb) { m_series3CB = cb; }
+ void setSeries4CB(QCheckBox *cb) { m_series4CB = cb; }
void adjustXCount(int count);
void adjustZCount(int count);
void adjustXRange(int range);
@@ -92,16 +116,27 @@ public slots:
void handleAxisZChanged(QValue3DAxis *axis);
private:
+ void fillSeries();
void resetArrayAndSliders(QSurfaceDataArray *array, float minZ, float maxZ, float minX,
float maxX);
+ QSurfaceDataRow *createMultiRow(int row, int series, bool change);
Q3DSurface *m_graph;
+ QSurface3DSeries *m_multiseries[4];
+ QSurface3DSeries *m_series1;
+ QSurface3DSeries *m_series2;
+ QSurface3DSeries *m_series3;
+ QSurface3DSeries *m_series4;
QSlider *m_gridSliderX;
QSlider *m_gridSliderZ;
QSlider *m_axisRangeSliderX;
QSlider *m_axisRangeSliderZ;
QSlider *m_axisMinSliderX;
QSlider *m_axisMinSliderZ;
+ QCheckBox *m_series1CB;
+ QCheckBox *m_series2CB;
+ QCheckBox *m_series3CB;
+ QCheckBox *m_series4CB;
bool m_gridSlidersLocked;
int m_xCount;
int m_zCount;
@@ -119,6 +154,14 @@ private:
QLabel *m_selectionInfoLabel;
QSurface3DSeries *m_theSeries;
QSurface3DSeries::DrawFlags m_drawMode;
+ QSurface3DSeries::DrawFlags m_drawMode2;
+ QSurface3DSeries::DrawFlags m_drawMode3;
+ QSurface3DSeries::DrawFlags m_drawMode4;
+ float m_limitX;
+ float m_limitZ;
+ float m_offset;
+ float m_multiSampleOffsetX[4];
+ float m_multiSampleOffsetZ[4];
};
#endif
diff --git a/tests/surfacetest/main.cpp b/tests/surfacetest/main.cpp
index b31586b0..99c60893 100644
--- a/tests/surfacetest/main.cpp
+++ b/tests/surfacetest/main.cpp
@@ -31,6 +31,7 @@
#include <QScreen>
#include <QPainter>
#include <QFontComboBox>
+#include <QFrame>
#include <QDebug>
using namespace QtDataVisualization;
@@ -82,6 +83,72 @@ int main(int argc, char *argv[])
seriesVisibleCB->setText(QStringLiteral("Series Visible"));
seriesVisibleCB->setChecked(true);
+#ifdef MULTI_SERIES
+ smoothCB->setText(QStringLiteral("S1 Flat Surface"));
+ surfaceGridCB->setText(QStringLiteral("S1 Surface Grid"));
+ surfaceCB->setText(QStringLiteral("S1 Surface Visible"));
+ seriesVisibleCB->setText(QStringLiteral("Series 1 Visible"));
+
+ QCheckBox *smoothS2CB = new QCheckBox(widget);
+ smoothS2CB->setText(QStringLiteral("S2 Flat Surface"));
+ smoothS2CB->setChecked(true);
+
+ QCheckBox *surfaceGridS2CB = new QCheckBox(widget);
+ surfaceGridS2CB->setText(QStringLiteral("S2 Surface Grid"));
+ surfaceGridS2CB->setChecked(true);
+
+ QCheckBox *surfaceS2CB = new QCheckBox(widget);
+ surfaceS2CB->setText(QStringLiteral("S2 Surface Visible"));
+ surfaceS2CB->setChecked(true);
+
+ QCheckBox *series2VisibleCB = new QCheckBox(widget);
+ series2VisibleCB->setText(QStringLiteral("Series 2 Visible"));
+ series2VisibleCB->setChecked(true);
+
+ QCheckBox *smoothS3CB = new QCheckBox(widget);
+ smoothS3CB->setText(QStringLiteral("S3 Flat Surface"));
+ smoothS3CB->setChecked(true);
+
+ QCheckBox *surfaceGridS3CB = new QCheckBox(widget);
+ surfaceGridS3CB->setText(QStringLiteral("S3 Surface Grid"));
+ surfaceGridS3CB->setChecked(true);
+
+ QCheckBox *surfaceS3CB = new QCheckBox(widget);
+ surfaceS3CB->setText(QStringLiteral("S3 Surface Visible"));
+ surfaceS3CB->setChecked(true);
+
+ QCheckBox *series3VisibleCB = new QCheckBox(widget);
+ series3VisibleCB->setText(QStringLiteral("Series 3 Visible"));
+ series3VisibleCB->setChecked(true);
+
+ QCheckBox *smoothS4CB = new QCheckBox(widget);
+ smoothS4CB->setText(QStringLiteral("S4 Flat Surface"));
+ smoothS4CB->setChecked(true);
+
+ QCheckBox *surfaceGridS4CB = new QCheckBox(widget);
+ surfaceGridS4CB->setText(QStringLiteral("S4 Surface Grid"));
+ surfaceGridS4CB->setChecked(true);
+
+ QCheckBox *surfaceS4CB = new QCheckBox(widget);
+ surfaceS4CB->setText(QStringLiteral("S4 Surface Visible"));
+ surfaceS4CB->setChecked(true);
+
+ QCheckBox *series4VisibleCB = new QCheckBox(widget);
+ series4VisibleCB->setText(QStringLiteral("Series 4 Visible"));
+ series4VisibleCB->setChecked(true);
+
+ QCheckBox *series1CB = new QCheckBox(widget);
+ series1CB->setText(QStringLiteral("Series 1"));
+
+ QCheckBox *series2CB = new QCheckBox(widget);
+ series2CB->setText(QStringLiteral("Series 2"));
+
+ QCheckBox *series3CB = new QCheckBox(widget);
+ series3CB->setText(QStringLiteral("Series 3"));
+
+ QCheckBox *series4CB = new QCheckBox(widget);
+ series4CB->setText(QStringLiteral("Series 4"));
+#else
//QCheckBox *sqrtSinCB = new QCheckBox(widget);
QRadioButton *sqrtSinCB = new QRadioButton(widget);
sqrtSinCB->setText(QStringLiteral("Sqrt & Sin"));
@@ -111,6 +178,7 @@ int main(int argc, char *argv[])
gridSliderZ->setValue(30);
gridSliderZ->setMaximum(200);
gridSliderZ->setEnabled(true);
+#endif
QSlider *axisRangeSliderX = new QSlider(Qt::Horizontal, widget);
axisRangeSliderX->setTickInterval(1);
@@ -187,6 +255,8 @@ int main(int argc, char *argv[])
int(QAbstract3DGraph::SelectionNone));
selectionMode->addItem(QStringLiteral("Item"),
int(QAbstract3DGraph::SelectionItem));
+ selectionMode->addItem(QStringLiteral("Multi: Item"),
+ int(QAbstract3DGraph::SelectionItem | QAbstract3DGraph::SelectionMultiSeries));
selectionMode->addItem(QStringLiteral("Row"),
int(QAbstract3DGraph::SelectionRow));
selectionMode->addItem(QStringLiteral("Item and Row"),
@@ -199,16 +269,24 @@ int main(int argc, char *argv[])
int(QAbstract3DGraph::SelectionRowAndColumn));
selectionMode->addItem(QStringLiteral("Item, Row and Column"),
int(QAbstract3DGraph::SelectionItemRowAndColumn));
+ selectionMode->addItem(QStringLiteral("Multi: Item, Row and Column"),
+ int(QAbstract3DGraph::SelectionItemRowAndColumn | QAbstract3DGraph::SelectionMultiSeries));
selectionMode->addItem(QStringLiteral("Slice into Row"),
int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionRow));
selectionMode->addItem(QStringLiteral("Slice into Row and Item"),
int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndRow));
+ selectionMode->addItem(QStringLiteral("Multi: Slice, Row & Item"),
+ int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndRow
+ | QAbstract3DGraph::SelectionMultiSeries));
selectionMode->addItem(QStringLiteral("Slice into Column"),
int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionColumn));
selectionMode->addItem(QStringLiteral("Slice into Column and Item"),
int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndColumn));
- selectionMode->setCurrentIndex(1);
+ selectionMode->addItem(QStringLiteral("Multi: Slice, Column & Item"),
+ int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndColumn
+ | QAbstract3DGraph::SelectionMultiSeries));
+#ifndef MULTI_SERIES
QPushButton *selectButton = new QPushButton(widget);
selectButton->setText(QStringLiteral("Select random point"));
@@ -216,6 +294,7 @@ int main(int argc, char *argv[])
flipViewsButton->setText(QStringLiteral("Flip Views"));
QLabel *selectionInfoLabel = new QLabel(widget);
+#endif
QPushButton *changeRowButton = new QPushButton(widget);
changeRowButton->setText(QStringLiteral("Change a row"));
@@ -247,11 +326,47 @@ int main(int argc, char *argv[])
QPushButton *removeRowButton = new QPushButton(widget);
removeRowButton->setText(QStringLiteral("Remove a row"));
+ QFrame* line = new QFrame();
+ line->setFrameShape(QFrame::HLine);
+ line->setFrameShadow(QFrame::Sunken);
+
+ QFrame* line2 = new QFrame();
+ line2->setFrameShape(QFrame::HLine);
+ line2->setFrameShadow(QFrame::Sunken);
+
+ QFrame* line3 = new QFrame();
+ line3->setFrameShape(QFrame::HLine);
+ line3->setFrameShadow(QFrame::Sunken);
+
// Add controls to the layout
+#ifdef MULTI_SERIES
+ vLayout->addWidget(series1CB);
+#endif
vLayout->addWidget(smoothCB);
vLayout->addWidget(surfaceGridCB);
vLayout->addWidget(surfaceCB);
vLayout->addWidget(seriesVisibleCB);
+#ifdef MULTI_SERIES
+ vLayout->addWidget(line);
+ vLayout->addWidget(series2CB);
+ vLayout->addWidget(smoothS2CB);
+ vLayout->addWidget(surfaceGridS2CB);
+ vLayout->addWidget(surfaceS2CB);
+ vLayout->addWidget(series2VisibleCB);
+ vLayout->addWidget(line2);
+ vLayout->addWidget(series3CB);
+ vLayout->addWidget(smoothS3CB);
+ vLayout->addWidget(surfaceGridS3CB);
+ vLayout->addWidget(surfaceS3CB);
+ vLayout->addWidget(series3VisibleCB);
+ vLayout->addWidget(line3);
+ vLayout->addWidget(series4CB);
+ vLayout->addWidget(smoothS4CB);
+ vLayout->addWidget(surfaceGridS4CB);
+ vLayout->addWidget(surfaceS4CB);
+ vLayout->addWidget(series4VisibleCB);
+#endif
+#ifndef MULTI_SERIES
vLayout->addWidget(new QLabel(QStringLiteral("Select surface sample")));
vLayout->addWidget(sqrtSinCB);
vLayout->addWidget(planeCB);
@@ -260,27 +375,30 @@ int main(int argc, char *argv[])
vLayout->addWidget(gridSlidersLockCB);
vLayout->addWidget(gridSliderX);
vLayout->addWidget(gridSliderZ);
+#endif
vLayout->addWidget(new QLabel(QStringLiteral("Adjust axis range")));
vLayout->addWidget(axisRangeSliderX);
vLayout->addWidget(axisRangeSliderZ);
vLayout->addWidget(new QLabel(QStringLiteral("Adjust axis minimum")));
vLayout->addWidget(axisMinSliderX);
vLayout->addWidget(axisMinSliderZ);
- vLayout->addWidget(colorPB);
- vLayout->addWidget(new QLabel(QStringLiteral("Change font")));
- vLayout->addWidget(fontList);
- vLayout->addWidget(labelButton);
- vLayout->addWidget(meshButton);
- vLayout->addWidget(new QLabel(QStringLiteral("Change theme")));
- vLayout->addWidget(themeList);
- vLayout->addWidget(new QLabel(QStringLiteral("Adjust shadow quality")));
- vLayout->addWidget(shadowQuality);
- vLayout->addWidget(new QLabel(QStringLiteral("Selection Mode")));
- vLayout->addWidget(selectionMode);
- vLayout->addWidget(selectButton);
- vLayout->addWidget(selectionInfoLabel);
- vLayout->addWidget(flipViewsButton);
-
+ vLayout2->addWidget(new QLabel(QStringLiteral("Change font")));
+ vLayout2->addWidget(fontList);
+ vLayout2->addWidget(labelButton);
+ vLayout2->addWidget(meshButton);
+ vLayout2->addWidget(new QLabel(QStringLiteral("Change theme")));
+ vLayout2->addWidget(themeList);
+ vLayout2->addWidget(new QLabel(QStringLiteral("Adjust shadow quality")));
+ vLayout2->addWidget(shadowQuality);
+ vLayout2->addWidget(new QLabel(QStringLiteral("Selection Mode")));
+ vLayout2->addWidget(selectionMode);
+#ifndef MULTI_SERIES
+ vLayout2->addWidget(selectButton);
+ vLayout2->addWidget(selectionInfoLabel);
+ vLayout2->addWidget(flipViewsButton);
+#endif
+
+ vLayout2->addWidget(colorPB);
vLayout2->addWidget(changeRowButton);
vLayout2->addWidget(changeRowsButton);
vLayout2->addWidget(changeMultipleRowsButton);
@@ -305,6 +423,78 @@ int main(int argc, char *argv[])
modifier, &GraphModifier::toggleSurface);
QObject::connect(seriesVisibleCB, &QCheckBox::stateChanged,
modifier, &GraphModifier::toggleSeriesVisible);
+#ifdef MULTI_SERIES
+ QObject::connect(smoothS2CB, &QCheckBox::stateChanged,
+ modifier, &GraphModifier::toggleSmoothS2);
+ QObject::connect(surfaceGridS2CB, &QCheckBox::stateChanged,
+ modifier, &GraphModifier::toggleSurfaceGridS2);
+ QObject::connect(surfaceS2CB, &QCheckBox::stateChanged,
+ modifier, &GraphModifier::toggleSurfaceS2);
+ QObject::connect(series2VisibleCB, &QCheckBox::stateChanged,
+ modifier, &GraphModifier::toggleSeries2Visible);
+
+ QObject::connect(smoothS3CB, &QCheckBox::stateChanged,
+ modifier, &GraphModifier::toggleSmoothS3);
+ QObject::connect(surfaceGridS3CB, &QCheckBox::stateChanged,
+ modifier, &GraphModifier::toggleSurfaceGridS3);
+ QObject::connect(surfaceS3CB, &QCheckBox::stateChanged,
+ modifier, &GraphModifier::toggleSurfaceS3);
+ QObject::connect(series3VisibleCB, &QCheckBox::stateChanged,
+ modifier, &GraphModifier::toggleSeries3Visible);
+
+ QObject::connect(smoothS4CB, &QCheckBox::stateChanged,
+ modifier, &GraphModifier::toggleSmoothS4);
+ QObject::connect(surfaceGridS4CB, &QCheckBox::stateChanged,
+ modifier, &GraphModifier::toggleSurfaceGridS4);
+ QObject::connect(surfaceS4CB, &QCheckBox::stateChanged,
+ modifier, &GraphModifier::toggleSurfaceS4);
+ QObject::connect(series4VisibleCB, &QCheckBox::stateChanged,
+ modifier, &GraphModifier::toggleSeries4Visible);
+
+ QObject::connect(series1CB, &QCheckBox::stateChanged,
+ modifier, &GraphModifier::toggleSeries1);
+ QObject::connect(series1CB, &QCheckBox::stateChanged,
+ smoothCB, &QPushButton::setEnabled);
+ QObject::connect(series1CB, &QCheckBox::stateChanged,
+ surfaceGridCB, &QPushButton::setEnabled);
+ QObject::connect(series1CB, &QCheckBox::stateChanged,
+ surfaceCB, &QPushButton::setEnabled);
+ QObject::connect(series1CB, &QCheckBox::stateChanged,
+ seriesVisibleCB, &QPushButton::setEnabled);
+
+ QObject::connect(series2CB, &QCheckBox::stateChanged,
+ modifier, &GraphModifier::toggleSeries2);
+ QObject::connect(series2CB, &QCheckBox::stateChanged,
+ smoothS2CB, &QPushButton::setEnabled);
+ QObject::connect(series2CB, &QCheckBox::stateChanged,
+ surfaceGridS2CB, &QPushButton::setEnabled);
+ QObject::connect(series2CB, &QCheckBox::stateChanged,
+ surfaceS2CB, &QPushButton::setEnabled);
+ QObject::connect(series2CB, &QCheckBox::stateChanged,
+ series2VisibleCB, &QPushButton::setEnabled);
+
+ QObject::connect(series3CB, &QCheckBox::stateChanged,
+ modifier, &GraphModifier::toggleSeries3);
+ QObject::connect(series3CB, &QCheckBox::stateChanged,
+ smoothS3CB, &QPushButton::setEnabled);
+ QObject::connect(series3CB, &QCheckBox::stateChanged,
+ surfaceGridS3CB, &QPushButton::setEnabled);
+ QObject::connect(series3CB, &QCheckBox::stateChanged,
+ surfaceS3CB, &QPushButton::setEnabled);
+ QObject::connect(series3CB, &QCheckBox::stateChanged,
+ series3VisibleCB, &QPushButton::setEnabled);
+
+ QObject::connect(series4CB, &QCheckBox::stateChanged,
+ modifier, &GraphModifier::toggleSeries4);
+ QObject::connect(series4CB, &QCheckBox::stateChanged,
+ smoothS4CB, &QPushButton::setEnabled);
+ QObject::connect(series4CB, &QCheckBox::stateChanged,
+ surfaceGridS4CB, &QPushButton::setEnabled);
+ QObject::connect(series4CB, &QCheckBox::stateChanged,
+ surfaceS4CB, &QPushButton::setEnabled);
+ QObject::connect(series4CB, &QCheckBox::stateChanged,
+ series4VisibleCB, &QPushButton::setEnabled);
+#else
QObject::connect(sqrtSinCB, &QRadioButton::toggled,
modifier, &GraphModifier::toggleSqrtSin);
QObject::connect(planeCB, &QCheckBox::toggled,
@@ -317,6 +507,7 @@ int main(int argc, char *argv[])
modifier, &GraphModifier::adjustXCount);
QObject::connect(gridSliderZ, &QSlider::valueChanged,
modifier, &GraphModifier::adjustZCount);
+#endif
QObject::connect(axisRangeSliderX, &QSlider::valueChanged,
modifier, &GraphModifier::adjustXRange);
QObject::connect(axisRangeSliderZ, &QSlider::valueChanged,
@@ -339,10 +530,12 @@ int main(int argc, char *argv[])
modifier, SLOT(changeShadowQuality(int)));
QObject::connect(selectionMode, SIGNAL(currentIndexChanged(int)),
modifier, SLOT(changeSelectionMode(int)));
+#ifndef MULTI_SERIES
QObject::connect(selectButton, &QPushButton::clicked,
modifier, &GraphModifier::selectButtonClicked);
QObject::connect(flipViewsButton, &QPushButton::clicked,
modifier, &GraphModifier::flipViews);
+#endif
QObject::connect(changeRowButton,&QPushButton::clicked,
modifier, &GraphModifier::changeRow);
QObject::connect(changeRowsButton,&QPushButton::clicked,
@@ -364,15 +557,28 @@ int main(int argc, char *argv[])
QObject::connect(removeRowButton,&QPushButton::clicked,
modifier, &GraphModifier::removeRow);
- modifier->setGridSliderZ(gridSliderZ);
- modifier->setGridSliderX(gridSliderX);
+#ifdef MULTI_SERIES
+ modifier->setSeries1CB(series1CB);
+ modifier->setSeries2CB(series2CB);
+ modifier->setSeries3CB(series3CB);
+ modifier->setSeries4CB(series4CB);
+ series1CB->setChecked(true);
+ series2CB->setChecked(true);
+ series3CB->setChecked(true);
+ series4CB->setChecked(true);
+#endif
modifier->setAxisRangeSliderX(axisRangeSliderX);
modifier->setAxisRangeSliderZ(axisRangeSliderZ);
modifier->setAxisMinSliderX(axisMinSliderX);
modifier->setAxisMinSliderZ(axisMinSliderZ);
+ selectionMode->setCurrentIndex(1);
+#ifndef MULTI_SERIES
+ modifier->setGridSliderZ(gridSliderZ);
+ modifier->setGridSliderX(gridSliderX);
modifier->toggleGridSliderLock(gridSlidersLockCB->checkState());
modifier->setSelectionInfoLabel(selectionInfoLabel);
sqrtSinCB->setChecked(true);
+#endif
shadowQuality->setCurrentIndex(3);
return app.exec();
diff --git a/tests/surfacetest/surfacetest.pro b/tests/surfacetest/surfacetest.pro
index 9ab890a7..134e8a6e 100644
--- a/tests/surfacetest/surfacetest.pro
+++ b/tests/surfacetest/surfacetest.pro
@@ -7,8 +7,6 @@ SOURCES += main.cpp \
QT += widgets
-INSTALLS += target
-
HEADERS += \
graphmodifier.h
diff --git a/tests/tests.pri b/tests/tests.pri
index 59253152..d6474f1b 100644
--- a/tests/tests.pri
+++ b/tests/tests.pri
@@ -1,16 +1,3 @@
-android {
- target.path = /libs/$$ANDROID_TARGET_ARCH
-} else {
- target.path = $$[QT_INSTALL_TESTS]/datavisualization/$$TARGET
-}
-
-win32 {
- CONFIG(debug, release|debug):DESTDIR = $$OUT_PWD/debug
- CONFIG(release, release|debug):DESTDIR = $$OUT_PWD/release
-} else {
- DESTDIR = $$OUT_PWD
-}
-
INCLUDEPATH += ../../include
LIBS += -L$$OUT_PWD/../../lib
@@ -19,94 +6,9 @@ TEMPLATE = app
QT += datavisualization
-!static:android {
- # Add Qt library to be loaded in shared android build
- vis_lib_name = DataVisualization
- vis_src_lib = lib$${vis_lib_name}.so
- vis_lib_dir = $$OUT_PWD/../../lib/$$vis_src_lib
- vis_lib_formatted = $$replace(vis_lib_dir, /, $$QMAKE_DIR_SEP)
- ANDROID_EXTRA_LIBS = $$vis_lib_formatted
-}
-
contains(TARGET, qml.*) {
- uri = QtDataVisualization
- lib_name = datavisualizationqml2
-
- uri_replaced = $$replace(uri, \\., $$QMAKE_DIR_SEP)
- make_qmldir_path = $$DESTDIR/$$uri_replaced
- !exists($$make_qmldir_path) {
- make_qmldir_target = \"$$replace(make_qmldir_path, /, $$QMAKE_DIR_SEP)\"
- system($$QMAKE_MKDIR $$make_qmldir_target)
- }
- copy_qmldir.target = $$make_qmldir_path/qmldir
- copy_qmldir.depends = $$_PRO_FILE_PWD_/../../src/$$lib_name/qmldir
- copy_qmldir_formatted = \"$$replace(copy_qmldir.depends, /, $$QMAKE_DIR_SEP)\" \"$$replace(copy_qmldir.target, /, $$QMAKE_DIR_SEP)\"
- copy_qmldir.commands = $(COPY_FILE) $$copy_qmldir_formatted
- QMAKE_EXTRA_TARGETS += copy_qmldir
- PRE_TARGETDEPS += $$copy_qmldir.target
-
- static:contains(QT_CONFIG, static) {
- # Make import scan find our copied qmldir & statically built qml lib
- !win32 {
- LIB_EXTENSION = a
- } else {
- LIB_EXTENSION = lib
- }
- QMLPATHS += $$DESTDIR
- # We need to copy the qmldir & lib already at qmake run stage as import scan is done then
- exists($$copy_qmldir.depends): system($$QMAKE_COPY $$copy_qmldir_formatted)
- } else {
- win32 {
- LIB_EXTENSION = dll
- } else {
- mac|ios {
- LIB_EXTENSION = dylib
- } else {
- LIB_EXTENSION = so
- }
- }
- }
-
- win32 {
- CONFIG(debug, release|debug) {
- src_dir = /debug
- src_lib = $${lib_name}d.$$LIB_EXTENSION
- }
- CONFIG(release, release|debug){
- src_dir = /release
- src_lib = $${lib_name}.$$LIB_EXTENSION
- }
- } else {
- src_dir =
- mac|ios {
- CONFIG(debug, release|debug) {
- src_lib = lib$${lib_name}_debug.$$LIB_EXTENSION
- }
- CONFIG(release, release|debug){
- src_lib = lib$${lib_name}.$$LIB_EXTENSION
- }
- } else {
- # linux, android
- src_lib = lib$${lib_name}.$$LIB_EXTENSION
- }
- }
- copy_lib.target = $$make_qmldir_path/$$src_lib
- copy_lib.depends = $$OUT_PWD/../../src/$$lib_name$$src_dir/$$src_lib
- copy_lib_formatted = \"$$replace(copy_lib.depends, /, $$QMAKE_DIR_SEP)\" \"$$replace(copy_lib.target, /, $$QMAKE_DIR_SEP)\"
- copy_lib.commands = $(COPY_FILE) $$copy_lib_formatted
- QMAKE_EXTRA_TARGETS += copy_lib
- PRE_TARGETDEPS += $$copy_lib.target
-
- android {
- system($$QMAKE_COPY $$copy_qmldir_formatted)
- android_qmldir.files = $$copy_qmldir.target
- android_qmldir.path = /assets/qml/$$uri_replaced
- INSTALLS += android_qmldir
- }
- android|ios {
- system($$QMAKE_COPY $$copy_lib_formatted)
- android_qmlplugin.files = $$copy_lib.target
- android_qmlplugin.path = $$target.path
- INSTALLS += android_qmlplugin
- }
+ QT += qml quick
}
+
+target.path = $$[QT_INSTALL_TESTS]/datavisualization/$$TARGET
+INSTALLS += target
diff --git a/tools/blender/backgroud.blend b/tools/blender/backgroud.blend
new file mode 100644
index 00000000..83cc2f5a
--- /dev/null
+++ b/tools/blender/backgroud.blend
Binary files differ
diff --git a/tools/blender/backgroudNegatives.blend b/tools/blender/backgroudNegatives.blend
new file mode 100644
index 00000000..067ea19a
--- /dev/null
+++ b/tools/blender/backgroudNegatives.blend
Binary files differ
diff --git a/tools/blender/backgroudNegativesWall.blend b/tools/blender/backgroudNegativesWall.blend
new file mode 100644
index 00000000..77566dc9
--- /dev/null
+++ b/tools/blender/backgroudNegativesWall.blend
Binary files differ
diff --git a/tools/blender/cone.blend b/tools/blender/cone.blend
new file mode 100644
index 00000000..2782e346
--- /dev/null
+++ b/tools/blender/cone.blend
Binary files differ
diff --git a/tools/blender/cone_filled.blend b/tools/blender/cone_filled.blend
new file mode 100644
index 00000000..cbdf7812
--- /dev/null
+++ b/tools/blender/cone_filled.blend
Binary files differ
diff --git a/tools/blender/cube.blend b/tools/blender/cube.blend
new file mode 100644
index 00000000..cb3c63a8
--- /dev/null
+++ b/tools/blender/cube.blend
Binary files differ
diff --git a/tools/blender/cube_filled.blend b/tools/blender/cube_filled.blend
new file mode 100644
index 00000000..1be0865d
--- /dev/null
+++ b/tools/blender/cube_filled.blend
Binary files differ
diff --git a/tools/blender/cylinder.blend b/tools/blender/cylinder.blend
new file mode 100644
index 00000000..c787b019
--- /dev/null
+++ b/tools/blender/cylinder.blend
Binary files differ
diff --git a/tools/blender/cylinder_filled.blend b/tools/blender/cylinder_filled.blend
new file mode 100644
index 00000000..1d681b42
--- /dev/null
+++ b/tools/blender/cylinder_filled.blend
Binary files differ
diff --git a/tools/blender/plane.blend b/tools/blender/plane.blend
new file mode 100644
index 00000000..96becb43
--- /dev/null
+++ b/tools/blender/plane.blend
Binary files differ
diff --git a/tools/blender/pyramid.blend b/tools/blender/pyramid.blend
new file mode 100644
index 00000000..bcf36101
--- /dev/null
+++ b/tools/blender/pyramid.blend
Binary files differ
diff --git a/tools/blender/pyramid_filled.blend b/tools/blender/pyramid_filled.blend
new file mode 100644
index 00000000..eb9801ab
--- /dev/null
+++ b/tools/blender/pyramid_filled.blend
Binary files differ
diff --git a/tools/blender/scatterdot.blend b/tools/blender/scatterdot.blend
new file mode 100644
index 00000000..4d4d6247
--- /dev/null
+++ b/tools/blender/scatterdot.blend
Binary files differ
diff --git a/tools/blender/smoothcube.blend b/tools/blender/smoothcube.blend
new file mode 100644
index 00000000..eff5fd8a
--- /dev/null
+++ b/tools/blender/smoothcube.blend
Binary files differ
diff --git a/tools/blender/smoothcube_filled.blend b/tools/blender/smoothcube_filled.blend
new file mode 100644
index 00000000..7ba1877d
--- /dev/null
+++ b/tools/blender/smoothcube_filled.blend
Binary files differ
diff --git a/tools/blender/sphere.blend b/tools/blender/sphere.blend
new file mode 100644
index 00000000..b3f817cb
--- /dev/null
+++ b/tools/blender/sphere.blend
Binary files differ