aboutsummaryrefslogtreecommitdiffstats
path: root/examples/quick/shared
Commit message (Collapse)AuthorAgeFilesLines
* Examples: Use XmlHttpRequest to fetch flickr public photosVenugopal Shivashankar2018-10-112-0/+87
| | | | | | | | | | | | | | | | | | This change is to facilite moving the XmlListModel code to the qtxmlpatterns repo, but still keep all the Particles examples together. Also fixed: - the old TODO about darkening images according to depth, and make it generally look a bit better. - move the visualdatamodel examples to a directory called delegatemodel, since that's how they work now. And add them to the main "views" example launcher so that they become more visible to users. Change-Id: I78f9f19e1e110608580adedcf4cd3be554222515 Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
* Example: Update the shared UI controls to use input handlersVenugopal Shivashankar2018-10-036-62/+58
| | | | | | Change-Id: I077754d9d9d713d01c7711175eb1b5da5e1f6869 Reviewed-by: Liang Qi <liang.qi@qt.io> Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
* examples: Fix LauncherList page components being hidden on window resizeTor Arne Vestbø2018-09-071-2/+0
| | | | | | | | | | | | | | | | | | The binding for x to -width will take effect after the enter-transition finishes animating x from -page.width to 0, but will not update the x value for some reason, so the item stays at the correct position at the end of the transition, even if the binding is still active. Once the window is resized though, and the new window width gets propagated to the page component, the x-value will be re-evaluated and the page component ends up on -width again, hiding it. It doesn't look like the explicit property binding adds anything to the example, as the transition takes care of starting at -width, so by removing it we fix the issue. Change-Id: If0e693ae85fe3e0aa49f59832cbb1ba2804b7b6b Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* Merge remote-tracking branch 'origin/5.9' into 5.10Liang Qi2018-01-241-6/+1
|\ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: .qmake.conf src/qml/compiler/qv4codegen.cpp src/qml/compiler/qv4compileddata_p.h src/qml/debugger/qqmlprofiler_p.h src/qml/jsruntime/qv4engine.cpp src/qml/memory/qv4mm.cpp src/qml/qml/qqmlcomponent.cpp src/qml/qml/qqmlobjectcreator.cpp src/qml/qml/qqmlobjectcreator_p.h src/qml/types/qqmldelegatemodel.cpp src/quick/items/qquickitem_p.h src/quick/items/qquickwindow.cpp tests/auto/quick/touchmouse/BLACKLIST tests/benchmarks/qml/holistic/tst_holistic.cpp Change-Id: I520f349ab4b048dd337d9647113564fc257865c2
| * Let platform decide what the default show action isTor Arne Vestbø2017-12-191-6/+1
| | | | | | | | | | | | | | | | | | | | | | The platform handles this through the ShowIsMaximized and ShowIsFullScreen platform integration style-hints, as well as QPlatformIntegration::defaultWindowState(), which was added specifically so that we wouldn't have to hard-code the behavior in user code. Change-Id: Ic019ccc2edd871a78bf94fd5fe572b9659416582 Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
* | Merge remote-tracking branch 'origin/5.9' into 5.10Liang Qi2017-10-248-24/+104
|\| | | | | | | | | | | | | | | | | | | Conflicts: src/qml/qml/qqmlimport.cpp src/qml/qml/qqmlimport_p.h src/qml/qml/qqmltypenamecache.cpp Done-with: Ulf Hermann<ulf.hermann@qt.io> Change-Id: I41ba7a592b2659ddf53da6952ea3b456a7bba319
| * Fix outdated BSD license headerKai Koehne2017-10-178-24/+104
| | | | | | | | | | Change-Id: Icc08925454445fc9497fb3bfd2c26efe90605983 Reviewed-by: Jani Heikkinen <jani.heikkinen@qt.io>
* | pointerhandlers manual test: get command-line arg working againShawn Rutledge2017-10-051-14/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | 4e7041c65216ada4f5fb604a9df840152ba60317 added a convenient feature to launch a specific test rather than needing to use the menu; e8f36458276cc989dc5f0c33ec27c90fad15137b broke it; and at some point the functions removed there were added back in a way that couldn't work (during a merge?) addExample is in use everywhere; showExample is in use only for the pointer handlers manual test; and hideExample isn't in use, so we can remove it again. Change-Id: I19cacbd3324889da9768b73ec2640aa0c1de96ef Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
* | Merge remote-tracking branch 'origin/dev' into wip/pointerhandlerJan Arve Saether2017-07-113-32/+134
|\ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: examples/quick/shared/LauncherList.qml src/quick/items/qquickevents.cpp src/quick/items/qquickevents_p_p.h src/quick/items/qquickwindow.cpp tests/auto/quick/touchmouse/tst_touchmouse.cpp Change-Id: Id692d291455093fc72db61f1b854f3fc9190267b
| * | Merge remote-tracking branch 'origin/dev' into wip/scenegraphngLaszlo Agocs2017-06-082-36/+128
| |\| | | | | | | | | | | | | | | | | | | Conflicts: src/quick/scenegraph/adaptations/software/qsgsoftwarerenderablenode.cpp Change-Id: Id8107cb0de0fbfe7120a90a137b49c2b915ff2d3
| | * LauncherList: Add some simple animations to help it look prettierRobin Burchell2017-05-202-36/+128
| | | | | | | | | | | | | | | | | | | | | | | | Nothing over the top, just some page animations on enter/exit. Change-Id: I822efe3e25928ff7797dd2911b9d2ce8dce00936 Reviewed-by: Gunnar Sletta <gunnar@crimson.no> Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
| * | Add QQuickPathItem and its backend infraLaszlo Agocs2016-12-191-0/+5
| |/ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The generic backend uses the triangulator from QtGui, but is in fact OpenGL-only for now due to materials. The NVPR backend uses GL_NV_path_rendering on NVIDIA hardware with OpenGL 4.3+ or OpenGL ES 3.1+. The software backend simply uses QPainter. With the generic backend each PathItem is backed by a non-visual root node and 0, 1 or 2 child geometry nodes, depending on the presence of visible stroking and filling. The potentially expensive triangulation happens on updatePolish(), on the gui thread. This is proven to provide much smoother results when compared to doing the geometry generation on the render thread in updatePaintNode(), in particular on power-limited embedded devices. The NVPR backend uses a QSGRenderNode in DepthAware mode so that the batch renderer can continue to rely on the depth buffer and use opaque batches. Due to not relying on slow CPU-side triangulation, this backend uses 5-10 times less CPU, even when properties of the path or its elements are animated. The path itself is specified with the PathView's Path, PathLine, PathArc, PathQuad, etc. types. This allows for consistency with PathView and the 2D Canvas and avoids a naming mess in the API. However, there won't be a 100% symmetry: backends like NVPR will not rely on QPainterPath but process the path elements on their own (as QPainterPath is essentially useless with these APIs), which can lead to differences in the supported path elements. The supported common set is currently Move, Line, Quad, Cubic, Arc. The patch introduces PathMove, which is essentially PathLine but maps to moveTo instead of lineTo. More types may get added later (e.g. NVPR can do a wide variety of optimized rounded rects, but this requires directly specifying a GL_ROUNDED_RECTx_NV command, thus neededing a dedicated Path type on our side too) For filling with gradients only linear gradients are supported at the moment. In addition to the declarative API, a more lightweight, QObject-less JS-callable API should be considered as well for the future. Change-Id: I335ad64b425ee279505d60e3e57ac6841e1cbd24 Reviewed-by: Andy Nichols <andy.nichols@qt.io>
* / pointer handlers manual test: can give arg with qml to launchShawn Rutledge2017-02-141-0/+4
|/ | | | | | | | | This makes it easier to repeatedly launch the same test: specify the qml file on the command line instead of having to click the list item each time. e.g. ./pointer tapHandler.qml Change-Id: I30b449b161107b1746418fc45518d202ba7d8381 Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
* Merge remote-tracking branch 'origin/5.8' into devLiang Qi2016-11-231-0/+1
|\ | | | | | | | | | | | | Conflicts: src/qml/jsruntime/qv4object_p.h Change-Id: Iff4d3aba7710a999b8befdc493cbe959e1ce02f9
| * Merge remote-tracking branch 'origin/5.6' into 5.7Liang Qi2016-11-151-0/+1
| |\ | | | | | | | | | | | | | | | | | | | | | Conflicts: src/qmldevtools/qmldevtools.pro tests/auto/qml/qqmlconnections/tst_qqmlconnections.cpp Change-Id: I12255c16716bd8a74e7047cdb1f9302a4d1ea827
| | * Example: Enable auto scaling on HighDPI screensVenugopal Shivashankar2016-10-281-0/+1
| | | | | | | | | | | | | | | | | | Task-number: QTBUG-56425 Change-Id: I2246245216fb8cd0d4dc4b15a0687edfc64ccad1 Reviewed-by: J-P Nurmi <jpnurmi@qt.io>
* | | add shared Label for examples, and use in the Window exampleShawn Rutledge2016-10-103-0/+48
|/ / | | | | | | | | | | | | | | | | It just saves the trouble of setting the Text color to the correct palette text color repeatedly, and avoids having black text on a dark background in case a dark theme is in use. Change-Id: If5c38fabe7f047fa5f6956a9d8b235886ab7ab5c Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
* | Merge remote-tracking branch 'origin/5.6' into 5.7Liang Qi2016-04-082-0/+0
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This change also fixes the build of two benchmarks, tst_affectors and tst_emission. Conflicts: src/plugins/qmltooling/qmldbg_native/qmldbg_native.pro src/qml/qml/ftw/qhashfield_p.h tests/benchmarks/particles/affectors/tst_affectors.cpp tests/benchmarks/particles/emission/tst_emission.cpp tests/benchmarks/qml/pointers/pointers.pro tests/benchmarks/qml/pointers/tst_pointers.cpp tests/benchmarks/qml/qmltime/qmltime.pro tests/benchmarks/qml/qquickwindow/qquickwindow.pro Change-Id: I595309d1e183c18371cb9b07af6e4681059de3b2
| * Purge sRGB chunks from PNGs in examples.Edward Welbourne2016-03-242-0/+0
| | | | | | | | | | | | | | | | | | | | | | | | Subjects each *.png file that matched grep -law "sRGB" to: pngcrush -ow -brute -rem allb -reduce Various tools grumble about sRGB tables in PNG images; and our handling of them doesn't pay attention to these, so purging them makes the images smaller with no loss to the images. Change-Id: If3baf60fb7c0045446ddfddecef96374845e739e Reviewed-by: Topi Reiniö <topi.reinio@theqtcompany.com>
* | Updated license headersJani Heikkinen2016-01-201-16/+33
|/ | | | | | | | | | | From Qt 5.7 -> examples are lisenced under BSD license, see http://blog.qt.io/blog/2016/01/13/new-agreement-with-the-kde-free-qt-foundation/ Updated license headers to use new BSD header instead of LGPL21 one (in those files which will be under BSD) Change-Id: I09ba19590e9425d5116a6c27cbc183debb485dde Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
* Fix shared example header.Friedemann Kleint2015-08-031-1/+3
| | | | | | | | | Use new connection syntax and return -1 on load failures, which avoids hanging processes and empty windows in case some module is not installed. Change-Id: I4966c9657b752eee8612fa893a0489bc8a64ccfc Reviewed-by: Shawn Rutledge <shawn.rutledge@theqtcompany.com>
* add manual tests for touch interactionShawn Rutledge2015-04-212-1/+5
| | | | | | | | So far there are manual tests for Flickable and MultiPointTouchArea. It can be expanded later. Change-Id: Ifa838b68f137a49647a208dc15f22c90f1e02d1f Reviewed-by: Laszlo Agocs <laszlo.agocs@theqtcompany.com>
* Fixed license headersJani Heikkinen2015-02-177-21/+21
| | | | | Change-Id: I4d5640ff95e1361ec7e65fb3e87d7726d8185ff5 Reviewed-by: Sergio Ahumada <sahumada@texla.cl>
* Update copyright headersJani Heikkinen2015-02-128-42/+42
| | | | | | | | | Qt copyrights are now in The Qt Company, so we could update the source code headers accordingly. In the same go we should also fix the links to point to qt.io. Change-Id: I61120571787870c0ed17066afb31779b1e6e30e9 Reviewed-by: Iikka Eklund <iikka.eklund@theqtcompany.com>
* Update license headers and add new licensesJani Heikkinen2014-08-251-19/+11
| | | | | | | | | - Renamed LICENSE.LGPL to LICENSE.LGPLv21 - Added LICENSE.LGPLv3 & LICENSE.GPLv2 - Removed LICENSE.GPL Change-Id: I84a565e2e0caa3b76bf291a7d188a57a4b00e1b0 Reviewed-by: Jani Heikkinen <jani.heikkinen@digia.com>
* Tools and examples: consistently use organization name QtProjectShawn Rutledge2014-07-021-1/+1
| | | | | | | | | | | | This affects the location of the QSettings files or registry entries. Other parts of Qt are using this organization name so it's good to have all the settings in the same place. [ChangeLog][QtQuick] tools and examples consistently use the QtProject organization name Change-Id: I1fae4eaed0248411fe95dda9572d38006648b162 Reviewed-by: J-P Nurmi <jpnurmi@digia.com>
* Adapt Qt Quick 2 renderer to work with OpenGL Core ProfileSean Harmer2013-11-131-0/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The basic approach is to have the batched renderer create and bind a vertex array object if it detects we are using an OpenGL Core profile context. The VAO is bound for the duration of the QQ2 renderer's work cycle and unbound at the end so as to not interfere with any other VAO's a user may wish to use. All shaders have been copied and ported to be compliant with the GLSL 150 core specification which is the minimum for a Core profile context (OpenGL 3.2 Core). We are not using any newer features as yet so this will work anywhere we can get a Core profile context. The QSGShaderSourceBuilder class has been extended to resolve any requests for shaders to the same basefilename with "_core" appended prior to any file extension. This could be extended in the future to allow version, or GPU or platform specific shaders. The QSGShaderSourceBuilder has also been extended to allow it to insert #define definitions in the prologue of a shader. Any such definition is inserted: * After the last #extension directive (if any are found) * Otherwise after the #version directive (if found) * Otherwise at the start of the shader source This is required by the custom particle shaders which make extensive use of such #defines. In addition the mechanism used by the distance field glyph cache to extend the cache with new glyphs has been modified to work (and work more efficiently) when using a Core profile context. Rather than using a shader program and a buffer filling quad to blit the old texture into the new cache texture, we instead use the technique of framebuffer blitting. The existing fallback implementation using glTexSubImage2D() is still available if needed. The DECLARATIVE_EXAMPLE_MAIN macro has been extended to allow easy testing of any of the QtDeclarative examples with a core profile context. Just run the example with QT_QUICK_CORE_PROFILE=1 ./text for e.g. The only ones that may not work out of the box are those that provide GLSL shader source e.g. the customparticles or shader effect examples. These work fine if the shader source is adapted to GLSL 150 core. In the future it may be a good idea to expose some context property to QML that the user can use to determine what shader source variation to provide to Qt Quick. Along these lines it would also be very nice to allow the provision of shader source to ShaderEffect or CustomParticle from a separate source file just as we now do within Qt Quick. Task-number: QTBUG-32050 Change-Id: Ia6e9f06dbb8508af9ae03c6b60fb418b4cc9e41f Reviewed-by: Lars Knoll <lars.knoll@digia.com>
* Polish up QQmlFileSelectorAlan Alpert2013-11-131-1/+1
| | | | | | | | Incorporate beta feedback, and hide QQmlAbstractUrlInterceptor as the implementation (instead of making that "the API"). Change-Id: Ib7b14afeb9205fb8a87ed16a6d38b1f468b2aaaa Reviewed-by: Lars Knoll <lars.knoll@digia.com>
* QtQuick examples make use of the new pixelDensity propertyShawn Rutledge2013-10-302-3/+3
| | | | | Change-Id: I273fc08405724158fbf7c7d410bfa38fef4600b1 Reviewed-by: Jens Bache-Wiig <jens.bache-wiig@digia.com>
* Apply file selectors to QQmlApplicationEngine appsAlan Alpert2013-09-201-1/+3
| | | | | | | | | You can also manually apply them to a QQmlEngine using setUrlInterceptor(new QQmlFileSelector(parent)), or using your own QQmlAbstractUrlInterceptor subclass. Change-Id: I0c0ff8b080c138686b3c03e0bc3b9f25bcd11a85 Reviewed-by: Lars Knoll <lars.knoll@digia.com>
* Adding QtQuick.Dialogs.MessageDialogShawn Rutledge2013-09-195-0/+84
| | | | | Change-Id: Ifa3de21e6f611c24742118d6d178edbe14f243be Reviewed-by: Liang Qi <liang.qi@digia.com>
* systemdialogs example bug fix: don't allow clicking through tabsShawn Rutledge2013-09-131-1/+3
| | | | | | | | | | | For example on Font Dialogs tab of examples/quick/dialogs/systemdialogs/systemdialogs.qml it was possible to open the color dialog by clicking slightly below the open button, because the color dialog tab was behind the current one. Change-Id: If9917e2baef7cfd49a0d01acd73ffa69dfcee088 Reviewed-by: Liang Qi <liang.qi@digia.com>
* Merge remote-tracking branch 'origin/stable' into devFrederik Gladhorn2013-08-192-4/+8
|\ | | | | | | | | | | | | | | Conflicts: tests/auto/quick/qquickgridview/qquickgridview.pro tests/auto/quick/qquickitem/qquickitem.pro Change-Id: Ic54cafbdda1ac22757d2ee65dcc63a1b167c7556
| * Make buttons and tabs larger in QML examples and dialogsShawn Rutledge2013-07-292-4/+8
| | | | | | | | | | | | Task-number: QTBUG-32578 Change-Id: Ic89058abc55e5e079f44862986b2132114456147 Reviewed-by: Liang Qi <liang.qi@digia.com>
* | examples: set application name and organization for QSettingsShawn Rutledge2013-08-151-0/+3
|/ | | | | | | | With the Qt.labs.settings module available, it makes sense for each example to have its own settings file. Change-Id: I8257f04ec13c7caf9995e03626e5453c653cfb92 Reviewed-by: J-P Nurmi <jpnurmi@digia.com>
* Declarative dialog improvements for the non-Window use caseShawn Rutledge2013-06-261-9/+7
| | | | | | | | | | | | | Platforms like Android and EGL don't support multiple top-level windows, so we have to avoid trying to use widget-based dialogs (because a widget dialog on top of a scene graph will result in a second window), allow the QML dialog to be an Item, and decorate it to look like a window. Task-number: QTBUG-31898 Change-Id: I9af049f3265188e8be677a05a8bc6d1699b4cd00 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com> Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
* Package dialogs examples into a single executableShawn Rutledge2013-05-285-1/+105
| | | | | | | Introduced tabs and added the C++ boilerplate launcher. Change-Id: Ibb49a182e3928aba5dced097d5307eb7d1f4b42d Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
* window and Screen example: new properties; splash screenShawn Rutledge2013-05-282-0/+2
| | | | | | | | | Demonstrates the new properties, how to make a splash screen, and how to make a standalone app with an icon. Combined the Screen info into this example too. Change-Id: I5b731539b39c55327f4e5b93860a880a35835896 Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
* Doc: Update module "Qt Declarative" -> "Qt Quick"Sze Howe Koh2013-03-301-1/+1
| | | | | | | | Also update examples/README to show the relationship between Qt Quick and Qt QML. Change-Id: I4e50d9f0ddb1ac25ccdfed09f579f76a375b14fe Reviewed-by: Alan Alpert <aalpert@blackberry.com>
* Cosmetic changes in common controls for examplesShawn Rutledge2013-03-148-181/+112
| | | | | | | | | Use system palette colors. SimpleLauncherDelegate has its own "button" rather than using the shared one, which really wasn't suitable for any other purpose. So now example apps can use Button, and ToolButton isn't necessary. Change-Id: I632397f36b96a26c32a86301ddacb85d5c3221f0 Reviewed-by: Jens Bache-Wiig <jens.bache-wiig@digia.com>
* adding QtQuick.Dialogs, with FileDialog implementationShawn Rutledge2013-03-045-0/+201
| | | | | | | | | | This will obsolete the QFileDialogItem in desktop components and be available to all QtQuick applications. The QML FileDialog type is dynamically defined in the plugin by detecting which implementation will work on the current platform. Change-Id: I073c7a84bff6c02cf592dc46822a5a4b9c9bcaea Reviewed-by: Jens Bache-Wiig <jens.bache-wiig@digia.com>
* Various improvements to Canvas examplesJens Bache-Wiig2013-02-264-0/+120
| | | | | | | | | | | | | | | | | | | | | | | | | | | | I noticed these examples were rather "aestetically challenged" and decided to make it a test case for our WIP style guidelines. - Use consistent margins (12 px) - Use proposed color palettes - Use proposed fonts and header styles I created a new Slider graphic and moved this into the shared folder as I think it is useful for other examples. I removed a lot of unused files which seem to have been added but never actually used. I also found several bugs in our implementation, including not scaling or rotation around the correct origin. In many cases I simplified the examples, removing variables/sliders where they did not add significantly to the example itself. Change-Id: Ie09da33deaf56a3ec45a2031b87a24a8602e994a Reviewed-by: Samuel Rødal <samuel.rodal@digia.com> Reviewed-by: Jerome Pasion <jerome.pasion@digia.com> Reviewed-by: Jens Bache-Wiig <jens.bache-wiig@digia.com>
* Add next.png to shared qrc filesAlan Alpert2013-02-062-0/+2
| | | | | | | | | | Otherwise the executable versions of the examples print errors instead of loading it. Change-Id: I7d370ce3ee172491c004668847cdb6d5967f2b24 Reviewed-by: Laszlo Papp <lpapp@kde.org> Reviewed-by: Jens Bache-Wiig <jens.bache-wiig@digia.com> Reviewed-by: Kai Koehne <kai.koehne@digia.com>
* Improve the look and feel of our demo launcherJens Bache-Wiig2013-01-175-14/+123
| | | | | | | | | | | The existing demo launcher looks rather ugly. This does some visual tweaks to make it look better, including adding support for proper text wrapping. It was approved by our design lead Diana. Change-Id: I660764575a411f598c53c9c42e290a807e20c0cf Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@digia.com>
* Update copyright year in Digia's license headersSergio Ahumada2013-01-104-4/+4
| | | | | | Change-Id: I6c3bd7bebe3d62d1cfd0fa6334544c9db8398c76 Reviewed-by: Akseli Salovaara <akseli.salovaara@digia.com> Reviewed-by: Sergio Ahumada <sergio.ahumada@digia.com>
* Use resource files for most examplesKai Koehne2012-12-123-25/+17
| | | | | | | | | Make examples shadow-build-friendly by using resource files instead of trying to derive the qml path from applicationDirPath(). Change-Id: I669424554c772d9b261249b366247190f5fbd8b1 Reviewed-by: Oliver Wolff <oliver.wolff@digia.com>
* centralize and fixup example sources install targetsOswald Buddenhagen2012-12-107-0/+320
follow respective change in qtbase Change-Id: I27502eb7ebea973e19ec5f7c3ec0e2338556f6e0 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com> Reviewed-by: Alan Alpert (Personal) <416365416c@gmail.com>