diff options
Diffstat (limited to 'examples/quick')
64 files changed, 5206 insertions, 2 deletions
diff --git a/examples/quick/models/objectlistmodel/doc/objectlistmodel.png b/examples/quick/models/objectlistmodel/doc/objectlistmodel.png Binary files differnew file mode 100644 index 000000000..416e08a85 --- /dev/null +++ b/examples/quick/models/objectlistmodel/doc/objectlistmodel.png diff --git a/examples/quick/models/objectlistmodel/doc/objectlistmodel.rst b/examples/quick/models/objectlistmodel/doc/objectlistmodel.rst new file mode 100644 index 000000000..a4af62706 --- /dev/null +++ b/examples/quick/models/objectlistmodel/doc/objectlistmodel.rst @@ -0,0 +1,14 @@ +Object List Model Example +========================= + +.. tags:: Android + +A list of QObject values can also be used as a model. +A list[QObject,] provides the properties of the objects in the list as roles. + +The following application creates a DataObject class with Property values +that will be accessible as named roles when a list[DataObject,] is exposed to QML: + +.. image:: objectlistmodel.png + :width: 400 + :alt: Object List Model Screenshot diff --git a/examples/quick/models/objectlistmodel/objectlistmodel.py b/examples/quick/models/objectlistmodel/objectlistmodel.py new file mode 100644 index 000000000..968761e5c --- /dev/null +++ b/examples/quick/models/objectlistmodel/objectlistmodel.py @@ -0,0 +1,61 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +from pathlib import Path +import sys +from PySide6.QtCore import QObject, QUrl, Property, Signal +from PySide6.QtGui import QGuiApplication +from PySide6.QtQuick import QQuickView + +# This example illustrates exposing a list of QObjects as a model in QML + + +class DataObject(QObject): + + nameChanged = Signal() + colorChanged = Signal() + + def __init__(self, name, color, parent=None): + super().__init__(parent) + self._name = name + self._color = color + + def name(self): + return self._name + + def setName(self, name): + if name != self._name: + self._name = name + self.nameChanged.emit() + + def color(self): + return self._color + + def setColor(self, color): + if color != self._color: + self._color = color + self.colorChanged.emit() + + name = Property(str, name, setName, notify=nameChanged) + color = Property(str, color, setColor, notify=colorChanged) + + +if __name__ == '__main__': + app = QGuiApplication(sys.argv) + + dataList = [DataObject("Item 1", "red"), + DataObject("Item 2", "green"), + DataObject("Item 3", "blue"), + DataObject("Item 4", "yellow")] + + view = QQuickView() + view.setResizeMode(QQuickView.SizeRootObjectToView) + view.setInitialProperties({"model": dataList}) + + qml_file = Path(__file__).parent / "view.qml" + view.setSource(QUrl.fromLocalFile(qml_file)) + view.show() + + r = app.exec() + del view + sys.exit(r) diff --git a/examples/quick/models/objectlistmodel/objectlistmodel.pyproject b/examples/quick/models/objectlistmodel/objectlistmodel.pyproject new file mode 100644 index 000000000..556e399f4 --- /dev/null +++ b/examples/quick/models/objectlistmodel/objectlistmodel.pyproject @@ -0,0 +1,3 @@ +{ + "files": ["objectlistmodel.py", "view.qml"] +} diff --git a/examples/quick/models/objectlistmodel/view.qml b/examples/quick/models/objectlistmodel/view.qml new file mode 100644 index 000000000..b7cf68a9b --- /dev/null +++ b/examples/quick/models/objectlistmodel/view.qml @@ -0,0 +1,15 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick + +ListView { + width: 100; height: 100 + + delegate: Rectangle { + color: model.modelData.color + height: 25 + width: 100 + Text { text: model.modelData.name } + } +} diff --git a/examples/quick/models/stringlistmodel/doc/stringlistmodel.png b/examples/quick/models/stringlistmodel/doc/stringlistmodel.png Binary files differnew file mode 100644 index 000000000..eeb9b518a --- /dev/null +++ b/examples/quick/models/stringlistmodel/doc/stringlistmodel.png diff --git a/examples/quick/models/stringlistmodel/doc/stringlistmodel.rst b/examples/quick/models/stringlistmodel/doc/stringlistmodel.rst new file mode 100644 index 000000000..ce11674b4 --- /dev/null +++ b/examples/quick/models/stringlistmodel/doc/stringlistmodel.rst @@ -0,0 +1,11 @@ +String List Model Example +========================= + +.. tags:: Android + +A model may be a simple 'list', +which provides the contents of the list via the modelData role. + +.. image:: stringlistmodel.png + :width: 400 + :alt: String List Model Screenshot diff --git a/examples/quick/models/stringlistmodel/stringlistmodel.py b/examples/quick/models/stringlistmodel/stringlistmodel.py new file mode 100644 index 000000000..3982b1ffc --- /dev/null +++ b/examples/quick/models/stringlistmodel/stringlistmodel.py @@ -0,0 +1,26 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +from pathlib import Path +import sys +from PySide6.QtCore import QUrl +from PySide6.QtGui import QGuiApplication +from PySide6.QtQuick import QQuickView + +# This example illustrates exposing a QStringList as a model in QML + +if __name__ == '__main__': + app = QGuiApplication(sys.argv) + + dataList = ["Item 1", "Item 2", "Item 3", "Item 4"] + + view = QQuickView() + view.setInitialProperties({"model": dataList}) + + qml_file = Path(__file__).parent / "view.qml" + view.setSource(QUrl.fromLocalFile(qml_file)) + view.show() + + r = app.exec() + del view + sys.exit(r) diff --git a/examples/quick/models/stringlistmodel/stringlistmodel.pyproject b/examples/quick/models/stringlistmodel/stringlistmodel.pyproject new file mode 100644 index 000000000..5ec3e85d1 --- /dev/null +++ b/examples/quick/models/stringlistmodel/stringlistmodel.pyproject @@ -0,0 +1,3 @@ +{ + "files": ["stringlistmodel.py", "view.qml"] +} diff --git a/examples/quick/models/stringlistmodel/view.qml b/examples/quick/models/stringlistmodel/view.qml new file mode 100644 index 000000000..5db5576f4 --- /dev/null +++ b/examples/quick/models/stringlistmodel/view.qml @@ -0,0 +1,17 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick + +ListView { + width: 100 + height: 100 + required model + + delegate: Rectangle { + required property string modelData + height: 25 + width: 100 + Text { text: parent.modelData } + } +} diff --git a/examples/quick/painteditem/doc/painteditem.rst b/examples/quick/painteditem/doc/painteditem.rst index 6f12355ca..5c3e8935b 100644 --- a/examples/quick/painteditem/doc/painteditem.rst +++ b/examples/quick/painteditem/doc/painteditem.rst @@ -1,6 +1,8 @@ Scene Graph Painted Item Example ================================ +.. tags:: Android + Shows how to implement QPainter-based custom scenegraph items. The Painted Item example shows how to use the QML Scene Graph framework to diff --git a/examples/quick/painteditem/painteditem.py b/examples/quick/painteditem/painteditem.py index dc9575e67..cf5a05ada 100644 --- a/examples/quick/painteditem/painteditem.py +++ b/examples/quick/painteditem/painteditem.py @@ -1,16 +1,22 @@ # Copyright (C) 2022 The Qt Company Ltd. # SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause +from argparse import ArgumentParser, RawTextHelpFormatter from pathlib import Path import sys from PySide6.QtGui import QPainter, QBrush, QColor from PySide6.QtWidgets import QApplication -from PySide6.QtQml import qmlRegisterType +from PySide6.QtQml import QmlElement, QQmlDebuggingEnabler from PySide6.QtCore import QUrl, Property, Signal, Qt, QPointF from PySide6.QtQuick import QQuickPaintedItem, QQuickView +QML_IMPORT_NAME = "TextBalloonPlugin" +QML_IMPORT_MAJOR_VERSION = 1 +QML_IMPORT_MINOR_VERSION = 0 # Optional + +@QmlElement class TextBalloon(QQuickPaintedItem): rightAlignedChanged = Signal() @@ -57,10 +63,16 @@ class TextBalloon(QQuickPaintedItem): if __name__ == "__main__": + argument_parser = ArgumentParser(description="Scene Graph Painted Item Example", + formatter_class=RawTextHelpFormatter) + argument_parser.add_argument("-qmljsdebugger", action="store", + help="Enable QML debugging") + options = argument_parser.parse_args() + if options.qmljsdebugger: + QQmlDebuggingEnabler.enableDebugging(True) app = QApplication(sys.argv) view = QQuickView() view.setResizeMode(QQuickView.SizeRootObjectToView) - qmlRegisterType(TextBalloon, "TextBalloonPlugin", 1, 0, "TextBalloon") qml_file = Path(__file__).parent / "main.qml" view.setSource(QUrl.fromLocalFile(qml_file)) diff --git a/examples/quick/rendercontrol/rendercontrol_opengl/cuberenderer.py b/examples/quick/rendercontrol/rendercontrol_opengl/cuberenderer.py new file mode 100644 index 000000000..69e7321f9 --- /dev/null +++ b/examples/quick/rendercontrol/rendercontrol_opengl/cuberenderer.py @@ -0,0 +1,183 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import ctypes +import numpy +from OpenGL.GL import (GL_COLOR_BUFFER_BIT, GL_CULL_FACE, GL_CW, + GL_DEPTH_BUFFER_BIT, GL_DEPTH_TEST, GL_FALSE, GL_FLOAT, + GL_TEXTURE_2D, GL_TRIANGLES) + +from PySide6.QtGui import QMatrix4x4, QOpenGLContext +from PySide6.QtOpenGL import (QOpenGLBuffer, QOpenGLShader, + QOpenGLShaderProgram, QOpenGLVertexArrayObject) +from shiboken6 import VoidPtr + + +VERTEXSHADER_SOURCE = """attribute highp vec4 vertex; +attribute lowp vec2 coord; +varying lowp vec2 v_coord; +uniform highp mat4 matrix; +void main() { + v_coord = coord; + gl_Position = matrix * vertex; +} +""" + + +FRAGMENTSHADER_SOURCE = """varying lowp vec2 v_coord; +uniform sampler2D sampler; +void main() { + gl_FragColor = vec4(texture2D(sampler, v_coord).rgb, 1.0); +} +""" + + +FLOAT_SIZE = ctypes.sizeof(ctypes.c_float) + + +VERTEXES = numpy.array([-0.5, 0.5, 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, 0.5, + 0.5, -0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5, + -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, + 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5, -0.5, -0.5, + + 0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5, 0.5, -0.5, + 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, -0.5, 0.5, + -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5, + -0.5, -0.5, 0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, + + 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, -0.5, + -0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, + -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, 0.5, -0.5, -0.5, + 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, -0.5, -0.5, 0.5], + dtype=numpy.float32) + + +TEX_COORDS = numpy.array([0.0, 0.0, 1.0, 1.0, 1.0, 0.0, + 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, + 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, + 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, + + 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, + 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, + 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, + 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, + + 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, + 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, + 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, 1.0, 1.0], dtype=numpy.float32) + + +class CubeRenderer(): + def __init__(self, offscreenSurface): + self.m_angle = 0 + self.m_offscreenSurface = offscreenSurface + self.m_context = None + self.m_program = None + self.m_vbo = None + self.m_vao = None + self.m_matrixLoc = 0 + self.m_proj = QMatrix4x4() + + def __del__(self): + # Use a temporary offscreen surface to do the cleanup. There may not + # be a native window surface available anymore at self stage. + self.m_context.makeCurrent(self.m_offscreenSurface) + del self.m_program + del self.m_vbo + del self.m_vao + self.m_context.doneCurrent() + + def init(self, w, share): + self.m_context = QOpenGLContext() + self.m_context.setShareContext(share) + self.m_context.setFormat(w.requestedFormat()) + self.m_context.create() + if not self.m_context.makeCurrent(w): + return + + f = self.m_context.functions() + f.glClearColor(0.0, 0.1, 0.25, 1.0) + f.glViewport(0, 0, w.width() * w.devicePixelRatio(), + w.height() * w.devicePixelRatio()) + + self.m_program = QOpenGLShaderProgram() + self.m_program.addCacheableShaderFromSourceCode(QOpenGLShader.Vertex, + VERTEXSHADER_SOURCE) + self.m_program.addCacheableShaderFromSourceCode(QOpenGLShader.Fragment, + FRAGMENTSHADER_SOURCE) + self.m_program.bindAttributeLocation("vertex", 0) + self.m_program.bindAttributeLocation("coord", 1) + self.m_program.link() + self.m_matrixLoc = self.m_program.uniformLocation("matrix") + + self.m_vao = QOpenGLVertexArrayObject() + self.m_vao.create() + + self.m_vbo = QOpenGLBuffer() + self.m_vbo.create() + self.m_vbo.bind() + + vertexCount = 36 + self.m_vbo.allocate(FLOAT_SIZE * vertexCount * 5) + vertex_data = VERTEXES.tobytes() + tex_coord_data = TEX_COORDS.tobytes() + self.m_vbo.write(0, VoidPtr(vertex_data), + FLOAT_SIZE * vertexCount * 3) + self.m_vbo.write(FLOAT_SIZE * vertexCount * 3, + VoidPtr(tex_coord_data), + FLOAT_SIZE * vertexCount * 2) + self.m_vbo.release() + + if self.m_vao.isCreated(): + self.setupVertexAttribs() + + def resize(self, w, h): + self.m_proj.setToIdentity() + self.m_proj.perspective(45, w / float(h), 0.01, 100.0) + + def setupVertexAttribs(self): + self.m_vbo.bind() + self.m_program.enableAttributeArray(0) + self.m_program.enableAttributeArray(1) + f = self.m_context.functions() + + null = VoidPtr(0) + pointer = VoidPtr(36 * 3 * FLOAT_SIZE) + f.glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, null) + f.glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, pointer) + self.m_vbo.release() + + def render(self, w, share, texture): + if not self.m_context: + self.init(w, share) + + if not self.m_context.makeCurrent(w): + return + + f = self.m_context.functions() + f.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) + + if texture: + f.glBindTexture(GL_TEXTURE_2D, texture) + f.glFrontFace(GL_CW) # because our cube's vertex data is such + f.glEnable(GL_CULL_FACE) + f.glEnable(GL_DEPTH_TEST) + + self.m_program.bind() + # If VAOs are not supported, set the vertex attributes every time. + if not self.m_vao.isCreated(): + self.setupVertexAttribs() + + m = QMatrix4x4() + m.translate(0, 0, -2) + m.rotate(90, 0, 0, 1) + m.rotate(self.m_angle, 0.5, 1, 0) + self.m_angle += 0.5 + + self.m_program.setUniformValue(self.m_matrixLoc, self.m_proj * m) + + # Draw the cube. + f.glDrawArrays(GL_TRIANGLES, 0, 36) + + self.m_context.swapBuffers(w) diff --git a/examples/quick/rendercontrol/rendercontrol_opengl/demo.qml b/examples/quick/rendercontrol/rendercontrol_opengl/demo.qml new file mode 100644 index 000000000..00f6a81e9 --- /dev/null +++ b/examples/quick/rendercontrol/rendercontrol_opengl/demo.qml @@ -0,0 +1,161 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Particles 2.0 + +Rectangle { + id: root + + gradient: Gradient { + GradientStop { position: 0; color: mouse.pressed ? "lightsteelblue" : "steelblue" } + GradientStop { position: 1; color: "black" } + } + + Text { + anchors.centerIn: parent + text: "Qt Quick in a texture" + font.pointSize: 40 + color: "white" + + SequentialAnimation on rotation { + PauseAnimation { duration: 2500 } + NumberAnimation { from: 0; to: 360; duration: 5000; easing.type: Easing.InOutCubic } + loops: Animation.Infinite + } + } + + ParticleSystem { + id: particles + anchors.fill: parent + + ImageParticle { + id: smoke + system: particles + anchors.fill: parent + groups: ["A", "B"] + source: "qrc:///particleresources/glowdot.png" + colorVariation: 0 + color: "#00111111" + } + ImageParticle { + id: flame + anchors.fill: parent + system: particles + groups: ["C", "D"] + source: "qrc:///particleresources/glowdot.png" + colorVariation: 0.1 + color: "#00ff400f" + } + + Emitter { + id: fire + system: particles + group: "C" + + y: parent.height + width: parent.width + + emitRate: 350 + lifeSpan: 3500 + + acceleration: PointDirection { y: -17; xVariation: 3 } + velocity: PointDirection {xVariation: 3} + + size: 24 + sizeVariation: 8 + endSize: 4 + } + + TrailEmitter { + id: fireSmoke + group: "B" + system: particles + follow: "C" + width: root.width + height: root.height - 68 + + emitRatePerParticle: 1 + lifeSpan: 2000 + + velocity: PointDirection {y:-17*6; yVariation: -17; xVariation: 3} + acceleration: PointDirection {xVariation: 3} + + size: 36 + sizeVariation: 8 + endSize: 16 + } + + TrailEmitter { + id: fireballFlame + anchors.fill: parent + system: particles + group: "D" + follow: "E" + + emitRatePerParticle: 120 + lifeSpan: 180 + emitWidth: TrailEmitter.ParticleSize + emitHeight: TrailEmitter.ParticleSize + emitShape: EllipseShape{} + + size: 16 + sizeVariation: 4 + endSize: 4 + } + + TrailEmitter { + id: fireballSmoke + anchors.fill: parent + system: particles + group: "A" + follow: "E" + + emitRatePerParticle: 128 + lifeSpan: 2400 + emitWidth: TrailEmitter.ParticleSize + emitHeight: TrailEmitter.ParticleSize + emitShape: EllipseShape{} + + velocity: PointDirection {yVariation: 16; xVariation: 16} + acceleration: PointDirection {y: -16} + + size: 24 + sizeVariation: 8 + endSize: 8 + } + + Emitter { + id: balls + system: particles + group: "E" + + y: parent.height + width: parent.width + + emitRate: 2 + lifeSpan: 7000 + + velocity: PointDirection {y:-17*4*2; xVariation: 6*6} + acceleration: PointDirection {y: 17*2; xVariation: 6*6} + + size: 8 + sizeVariation: 4 + } + + Turbulence { //A bit of turbulence makes the smoke look better + anchors.fill: parent + groups: ["A","B"] + strength: 32 + system: particles + } + } + + onWidthChanged: particles.reset() + onHeightChanged: particles.reset() + + MouseArea { + id: mouse + anchors.fill: parent + } +} diff --git a/examples/quick/rendercontrol/rendercontrol_opengl/doc/rendercontrol_opengl.rst b/examples/quick/rendercontrol/rendercontrol_opengl/doc/rendercontrol_opengl.rst new file mode 100644 index 000000000..f47567f52 --- /dev/null +++ b/examples/quick/rendercontrol/rendercontrol_opengl/doc/rendercontrol_opengl.rst @@ -0,0 +1,5 @@ +QQuickRenderControl OpenGL Example +================================== + +The QQuickRenderControl OpenGL Example shows how to render a Qt Quick scene into a +texture that is then used by a non-Quick based OpenGL renderer. diff --git a/examples/quick/rendercontrol/rendercontrol_opengl/main.py b/examples/quick/rendercontrol/rendercontrol_opengl/main.py new file mode 100644 index 000000000..ee885ae6d --- /dev/null +++ b/examples/quick/rendercontrol/rendercontrol_opengl/main.py @@ -0,0 +1,20 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import sys +from PySide6.QtGui import QGuiApplication +from PySide6.QtQuick import QQuickWindow, QSGRendererInterface + +from window_singlethreaded import WindowSingleThreaded + + +if __name__ == "__main__": + app = QGuiApplication(sys.argv) + # only functional when Qt Quick is also using OpenGL + QQuickWindow.setGraphicsApi(QSGRendererInterface.OpenGLRhi) + window = WindowSingleThreaded() + window.resize(1024, 768) + window.show() + ex = app.exec() + del window + sys.exit(ex) diff --git a/examples/quick/rendercontrol/rendercontrol_opengl/rendercontrol_opengl.pyproject b/examples/quick/rendercontrol/rendercontrol_opengl/rendercontrol_opengl.pyproject new file mode 100644 index 000000000..b2e80ab23 --- /dev/null +++ b/examples/quick/rendercontrol/rendercontrol_opengl/rendercontrol_opengl.pyproject @@ -0,0 +1,6 @@ +{ + "files": ["cuberenderer.py", + "main.py", + "window_singlethreaded.py", + "demo.qml"] +} diff --git a/examples/quick/rendercontrol/rendercontrol_opengl/window_singlethreaded.py b/examples/quick/rendercontrol/rendercontrol_opengl/window_singlethreaded.py new file mode 100644 index 000000000..6f1e61f94 --- /dev/null +++ b/examples/quick/rendercontrol/rendercontrol_opengl/window_singlethreaded.py @@ -0,0 +1,272 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import numpy +from pathlib import Path +import weakref +from OpenGL.GL import (GL_TEXTURE_MAG_FILTER, GL_TEXTURE_MIN_FILTER, + GL_NEAREST, GL_RGBA, GL_TEXTURE_2D, GL_UNSIGNED_BYTE) + +from PySide6.QtGui import (QMouseEvent, QOffscreenSurface, + QOpenGLContext, QSurface, + QSurfaceFormat, QWindow) +from PySide6.QtOpenGL import QOpenGLFramebufferObject +from PySide6.QtQml import QQmlComponent, QQmlEngine +from PySide6.QtQuick import (QQuickGraphicsDevice, + QQuickRenderControl, + QQuickRenderTarget, QQuickWindow) +from PySide6.QtCore import QCoreApplication, QTimer, QUrl, Slot +from shiboken6 import VoidPtr + +from cuberenderer import CubeRenderer + + +class RenderControl(QQuickRenderControl): + def __init__(self, window=None): + super().__init__() + self._window = window + + def renderWindow(self, offset): + return self._window() # Dereference the weak reference + + +class WindowSingleThreaded(QWindow): + + def __init__(self): + super().__init__() + self.m_rootItem = None + self.m_device = None + self.m_texture_ids = numpy.array([0], dtype=numpy.uint32) + + self.m_quickInitialized = False + self.m_quickReady = False + self.m_dpr = 0 + self.m_status_conn_id = None + self.setSurfaceType(QSurface.OpenGLSurface) + + format = QSurfaceFormat() + # Qt Quick may need a depth and stencil buffer. Always make sure these + # are available. + format.setDepthBufferSize(16) + format.setStencilBufferSize(8) + self.setFormat(format) + + self.m_context = QOpenGLContext() + self.m_context.setFormat(format) + self.m_context.create() + + self.m_offscreenSurface = QOffscreenSurface() + # Pass m_context.format(), not format. Format does not specify and + # color buffer sizes, while the context, that has just been created, + # reports a format that has these values filled in. Pass self to the + # offscreen surface to make sure it will be compatible with the + # context's configuration. + self.m_offscreenSurface.setFormat(self.m_context.format()) + self.m_offscreenSurface.create() + + self.m_cubeRenderer = CubeRenderer(self.m_offscreenSurface) + + self.m_renderControl = RenderControl(weakref.ref(self)) + + # Create a QQuickWindow that is associated with out render control. + # Note that this window never gets created or shown, meaning that + # will never get an underlying native (platform) window. + self.m_quickWindow = QQuickWindow(self.m_renderControl) + + # Create a QML engine. + self.m_qmlEngine = QQmlEngine() + if not self.m_qmlEngine.incubationController(): + c = self.m_quickWindow.incubationController() + self.m_qmlEngine.setIncubationController(c) + + # When Quick says there is a need to render, we will not render + # immediately. Instead, a timer with a small interval is used + # to get better performance. + self.m_updateTimer = QTimer() + self.m_updateTimer.setSingleShot(True) + self.m_updateTimer.setInterval(5) + self.m_updateTimer.timeout.connect(self.render) + + # Now hook up the signals. For simplicy we don't differentiate between + # renderRequested (only render is needed, no sync) and sceneChanged + # (polish and sync is needed too). + self.m_quickWindow.sceneGraphInitialized.connect(self.createTexture) + self.m_quickWindow.sceneGraphInvalidated.connect(self.destroyTexture) + self.m_renderControl.renderRequested.connect(self.requestUpdate) + self.m_renderControl.sceneChanged.connect(self.requestUpdate) + + # Just recreating the texture on resize is not sufficient, when moving + # between screens with different devicePixelRatio the QWindow size may + # remain the same but the texture dimension is to change regardless. + self.screenChanged.connect(self.handleScreenChange) + + def __del__(self): + # Make sure the context is current while doing cleanup. Note that + # we use the offscreen surface here because passing 'self' at self + # point is not safe: the underlying platform window may already be + # destroyed. To avoid all the trouble, use another surface that is + # valid for sure. + self.m_context.makeCurrent(self.m_offscreenSurface) + + del self.m_qmlComponent + del self.m_qmlEngine + del self.m_quickWindow + del self.m_renderControl + + if self.texture_id(): + self.m_context.functions().glDeleteTextures(1, self.m_texture_ids) + + self.m_context.doneCurrent() + + def texture_id(self): + return self.m_texture_ids[0] + + def set_texture_id(self, texture_id): + self.m_texture_ids[0] = texture_id + + @Slot() + def createTexture(self): + # The scene graph has been initialized. It is now time to create a + # texture and associate it with the QQuickWindow. + self.m_dpr = self.devicePixelRatio() + self.m_textureSize = self.size() * self.m_dpr + f = self.m_context.functions() + f.glGenTextures(1, self.m_texture_ids) + f.glBindTexture(GL_TEXTURE_2D, self.texture_id()) + + f.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST) + f.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST) + null = VoidPtr(0) + f.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, self.m_textureSize.width(), + self.m_textureSize.height(), 0, + GL_RGBA, GL_UNSIGNED_BYTE, null) + target = QQuickRenderTarget.fromOpenGLTexture(self.texture_id(), + self.m_textureSize) + self.m_quickWindow.setRenderTarget(target) + + @Slot() + def destroyTexture(self): + self.m_context.functions().glDeleteTextures(1, self.m_texture_ids) + self.set_texture_id(0) + + @Slot() + def render(self): + if not self.m_context.makeCurrent(self.m_offscreenSurface): + return + + # Polish, synchronize and render the next frame (into our texture). + # In this example everything happens on the same thread and therefore + # all three steps are performed in succession from here. In a threaded + # setup the render() call would happen on a separate thread. + self.m_renderControl.beginFrame() + self.m_renderControl.polishItems() + self.m_renderControl.sync() + self.m_renderControl.render() + self.m_renderControl.endFrame() + + QOpenGLFramebufferObject.bindDefault() + self.m_context.functions().glFlush() + + self.m_quickReady = True + + # Get something onto the screen. + texture_id = self.texture_id() if self.m_quickReady else 0 + self.m_cubeRenderer.render(self, self.m_context, texture_id) + + def requestUpdate(self): + if not self.m_updateTimer.isActive(): + self.m_updateTimer.start() + + def run(self): + if self.m_status_conn_id: + self.m_qmlComponent.statusChanged.disconnect(self.m_status_conn_id) + self.m_status_conn_id = None + + if self.m_qmlComponent.isError(): + for error in self.m_qmlComponent.errors(): + print(error.url().toString(), error.line(), error.toString()) + return + + self.m_rootItem = self.m_qmlComponent.create() + if self.m_qmlComponent.isError(): + for error in self.m_qmlComponent.errors(): + print(error.url().toString(), error.line(), error.toString()) + return + + if not self.m_rootItem: + print("run: Not a QQuickItem") + del self.m_rootItem + + # The root item is ready. Associate it with the window. + self.m_rootItem.setParentItem(self.m_quickWindow.contentItem()) + + # Update item and rendering related geometries. + self.updateSizes() + + # Initialize the render control and our OpenGL resources. + self.m_context.makeCurrent(self.m_offscreenSurface) + self.m_device = QQuickGraphicsDevice.fromOpenGLContext(self.m_context) + self.m_quickWindow.setGraphicsDevice(self.m_device) + self.m_renderControl.initialize() + self.m_quickInitialized = True + + def updateSizes(self): + # Behave like SizeRootObjectToView. + w = self.width() + h = self.height() + self.m_rootItem.setWidth(w) + self.m_rootItem.setHeight(h) + self.m_quickWindow.setGeometry(0, 0, w, h) + self.m_cubeRenderer.resize(w, h) + + def startQuick(self, filename): + url = QUrl.fromLocalFile(filename) + self.m_qmlComponent = QQmlComponent(self.m_qmlEngine, url) + if self.m_qmlComponent.isLoading(): + self.m_status_conn_id = self.m_qmlComponent.statusChanged.connect(self.run) + else: + self.run() + + def exposeEvent(self, event): + if self.isExposed() and not self.m_quickInitialized: + texture_id = self.texture_id() if self.m_quickReady else 0 + self.m_cubeRenderer.render(self, self.m_context, texture_id) + qml_file = Path(__file__).parent / "demo.qml" + self.startQuick(qml_file) + + def resizeTexture(self): + if self.m_rootItem and self.m_context.makeCurrent(self.m_offscreenSurface): + self.m_context.functions().glDeleteTextures(1, self.m_texture_ids) + self.set_texture_id(0) + self.createTexture() + self.m_context.doneCurrent() + self.updateSizes() + self.render() + + def resizeEvent(self, event): + # If self is a resize after the scene is up and running, recreate the + # texture and the Quick item and scene. + if (self.texture_id() + and self.m_textureSize != self.size() * self.devicePixelRatio()): + self.resizeTexture() + + @Slot() + def handleScreenChange(self): + if self.m_dpr != self.devicePixelRatio(): + self.resizeTexture() + + def mousePressEvent(self, e): + # Use the constructor taking position and globalPosition. That puts + # position into the event's position and scenePosition, and + # globalPosition into the event's globalPosition. This way the + # scenePosition in `e` is ignored and is replaced by position. + # This is necessary because QQuickWindow thinks of itself as + # a top-level window always. + mappedEvent = QMouseEvent(e.type(), e.position(), e.globalPosition(), + e.button(), e.buttons(), e.modifiers()) + QCoreApplication.sendEvent(self.m_quickWindow, mappedEvent) + + def mouseReleaseEvent(self, e): + mappedEvent = QMouseEvent(e.type(), e.position(), e.globalPosition(), + e.button(), e.buttons(), e.modifiers()) + QCoreApplication.sendEvent(self.m_quickWindow, mappedEvent) diff --git a/examples/quick/scenegraph/openglunderqml/doc/openglunderqml.rst b/examples/quick/scenegraph/openglunderqml/doc/openglunderqml.rst new file mode 100644 index 000000000..6a89a99d9 --- /dev/null +++ b/examples/quick/scenegraph/openglunderqml/doc/openglunderqml.rst @@ -0,0 +1,21 @@ +OpenGL under QML Squircle +========================= + +The OpenGL under QML example shows how an application can make use of the +QQuickWindow::beforeRendering() signal to draw custom OpenGL content under a Qt +Quick scene. This signal is emitted at the start of every frame, before the +scene graph starts its rendering, thus any OpenGL draw calls that are made as +a response to this signal, will stack under the Qt Quick items. + +As an alternative, applications that wish to render OpenGL content on top of +the Qt Quick scene, can do so by connecting to the +QQuickWindow::afterRendering() signal. + +In this example, we will also see how it is possible to have values that are +exposed to QML which affect the OpenGL rendering. We animate the threshold +value using a NumberAnimation in the QML file and this value is used by the +OpenGL shader program that draws the squircles. + +.. image:: squircle.png + :width: 400 + :alt: Squircle Screenshot diff --git a/examples/quick/scenegraph/openglunderqml/doc/squircle.png b/examples/quick/scenegraph/openglunderqml/doc/squircle.png Binary files differnew file mode 100644 index 000000000..c099a6b7e --- /dev/null +++ b/examples/quick/scenegraph/openglunderqml/doc/squircle.png diff --git a/examples/quick/scenegraph/openglunderqml/main.py b/examples/quick/scenegraph/openglunderqml/main.py new file mode 100644 index 000000000..0e24877bd --- /dev/null +++ b/examples/quick/scenegraph/openglunderqml/main.py @@ -0,0 +1,27 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import sys +from pathlib import Path + +from PySide6.QtCore import QUrl +from PySide6.QtGui import QGuiApplication +from PySide6.QtQuick import QQuickView, QQuickWindow, QSGRendererInterface + +from squircle import Squircle # noqa: F401 + +if __name__ == "__main__": + app = QGuiApplication(sys.argv) + + QQuickWindow.setGraphicsApi(QSGRendererInterface.OpenGL) + + view = QQuickView() + view.setResizeMode(QQuickView.SizeRootObjectToView) + qml_file = Path(__file__).parent / "main.qml" + view.setSource(QUrl.fromLocalFile(qml_file)) + + if view.status() == QQuickView.Error: + sys.exit(-1) + view.show() + + sys.exit(app.exec()) diff --git a/examples/quick/scenegraph/openglunderqml/main.qml b/examples/quick/scenegraph/openglunderqml/main.qml new file mode 100644 index 000000000..73bfa3262 --- /dev/null +++ b/examples/quick/scenegraph/openglunderqml/main.qml @@ -0,0 +1,39 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import OpenGLUnderQML + +Item { + + width: 320 + height: 480 + + Squircle { + SequentialAnimation on t { + NumberAnimation { to: 1; duration: 2500; easing.type: Easing.InQuad } + NumberAnimation { to: 0; duration: 2500; easing.type: Easing.OutQuad } + loops: Animation.Infinite + running: true + } + } + Rectangle { + color: Qt.rgba(1, 1, 1, 0.7) + radius: 10 + border.width: 1 + border.color: "white" + anchors.fill: label + anchors.margins: -10 + } + + Text { + id: label + color: "black" + wrapMode: Text.WordWrap + text: "The background here is a squircle rendered with raw OpenGL using the 'beforeRender()' signal in QQuickWindow. This text label and its border is rendered using QML" + anchors.right: parent.right + anchors.left: parent.left + anchors.bottom: parent.bottom + anchors.margins: 20 + } +} diff --git a/examples/quick/scenegraph/openglunderqml/openglunderqml.pyproject b/examples/quick/scenegraph/openglunderqml/openglunderqml.pyproject new file mode 100644 index 000000000..e7cfbc570 --- /dev/null +++ b/examples/quick/scenegraph/openglunderqml/openglunderqml.pyproject @@ -0,0 +1,3 @@ +{ + "files": [ "main.py", "main.qml", "squircle.py", "squirclerenderer.py"] +} diff --git a/examples/quick/scenegraph/openglunderqml/squircle.py b/examples/quick/scenegraph/openglunderqml/squircle.py new file mode 100644 index 000000000..d2900198b --- /dev/null +++ b/examples/quick/scenegraph/openglunderqml/squircle.py @@ -0,0 +1,79 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +from PySide6.QtCore import Property, QRunnable, Qt, Signal, Slot +from PySide6.QtQml import QmlElement +from PySide6.QtQuick import QQuickItem, QQuickWindow + +from squirclerenderer import SquircleRenderer + +# To be used on the @QmlElement decorator +# (QML_IMPORT_MINOR_VERSION is optional) +QML_IMPORT_NAME = "OpenGLUnderQML" +QML_IMPORT_MAJOR_VERSION = 1 + + +class CleanupJob(QRunnable): + def __init__(self, renderer): + super().__init__() + self._renderer = renderer + + def run(self): + del self._renderer + + +@QmlElement +class Squircle(QQuickItem): + + tChanged = Signal() + + def __init__(self, parent=None): + super().__init__(parent) + self._t = 0.0 + self._renderer = None + self.windowChanged.connect(self.handleWindowChanged) + + def t(self): + return self._t + + def setT(self, value): + if self._t == value: + return + self._t = value + self.tChanged.emit() + if self.window(): + self.window().update() + + @Slot(QQuickWindow) + def handleWindowChanged(self, win): + if win: + win.beforeSynchronizing.connect(self.sync, type=Qt.DirectConnection) + win.sceneGraphInvalidated.connect(self.cleanup, type=Qt.DirectConnection) + win.setColor(Qt.black) + self.sync() + + @Slot() + def cleanup(self): + del self._renderer + self._renderer = None + + @Slot() + def sync(self): + window = self.window() + if not self._renderer: + self._renderer = SquircleRenderer() + window.beforeRendering.connect(self._renderer.init, Qt.DirectConnection) + window.beforeRenderPassRecording.connect( + self._renderer.paint, Qt.DirectConnection + ) + self._renderer.setViewportSize(window.size() * window.devicePixelRatio()) + self._renderer.setT(self._t) + self._renderer.setWindow(window) + + def releaseResources(self): + self.window().scheduleRenderJob( + CleanupJob(self._renderer), QQuickWindow.BeforeSynchronizingStage + ) + self._renderer = None + + t = Property(float, t, setT, notify=tChanged) diff --git a/examples/quick/scenegraph/openglunderqml/squirclerenderer.py b/examples/quick/scenegraph/openglunderqml/squirclerenderer.py new file mode 100644 index 000000000..d824f96ab --- /dev/null +++ b/examples/quick/scenegraph/openglunderqml/squirclerenderer.py @@ -0,0 +1,98 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +from textwrap import dedent + +import numpy as np +from OpenGL.GL import (GL_ARRAY_BUFFER, GL_BLEND, GL_DEPTH_TEST, GL_FLOAT, + GL_ONE, GL_SRC_ALPHA, GL_TRIANGLE_STRIP) +from PySide6.QtCore import QSize, Slot +from PySide6.QtGui import QOpenGLFunctions +from PySide6.QtOpenGL import QOpenGLShader, QOpenGLShaderProgram +from PySide6.QtQuick import QQuickWindow, QSGRendererInterface + +VERTEX_SHADER = dedent( + """\ + attribute highp vec4 vertices; + varying highp vec2 coords; + void main() { + gl_Position = vertices; + coords = vertices.xy; + } + """ +) +FRAGMENT_SHADER = dedent( + """\ + uniform lowp float t; + varying highp vec2 coords; + void main() { + lowp float i = 1. - (pow(abs(coords.x), 4.) + pow(abs(coords.y), 4.)); + i = smoothstep(t - 0.8, t + 0.8, i); + i = floor(i * 20.) / 20.; + gl_FragColor = vec4(coords * .5 + .5, i, i); + } + """ +) + + +class SquircleRenderer(QOpenGLFunctions): + def __init__(self): + QOpenGLFunctions.__init__(self) + self._viewport_size = QSize() + self._t = 0.0 + self._program = None + self._window = QQuickWindow() + + def setT(self, t): + self._t = t + + def setViewportSize(self, size): + self._viewport_size = size + + def setWindow(self, window): + self._window = window + + @Slot() + def init(self): + if not self._program: + rif = self._window.rendererInterface() + assert (rif.graphicsApi() == QSGRendererInterface.OpenGL) + self.initializeOpenGLFunctions() + self._program = QOpenGLShaderProgram() + self._program.addCacheableShaderFromSourceCode(QOpenGLShader.Vertex, VERTEX_SHADER) + self._program.addCacheableShaderFromSourceCode(QOpenGLShader.Fragment, FRAGMENT_SHADER) + self._program.bindAttributeLocation("vertices", 0) + self._program.link() + + @Slot() + def paint(self): + # Play nice with the RHI. Not strictly needed when the scenegraph uses + # OpenGL directly. + self._window.beginExternalCommands() + + self._program.bind() + + self._program.enableAttributeArray(0) + + values = np.array([-1, -1, 1, -1, -1, 1, 1, 1], dtype="single") + + # This example relies on (deprecated) client-side pointers for the vertex + # input. Therefore, we have to make sure no vertex buffer is bound. + self.glBindBuffer(GL_ARRAY_BUFFER, 0) + + self._program.setAttributeArray(0, GL_FLOAT, values, 2) + self._program.setUniformValue1f("t", self._t) + + self.glViewport(0, 0, self._viewport_size.width(), self._viewport_size.height()) + + self.glDisable(GL_DEPTH_TEST) + + self.glEnable(GL_BLEND) + self.glBlendFunc(GL_SRC_ALPHA, GL_ONE) + + self.glDrawArrays(GL_TRIANGLE_STRIP, 0, 4) + + self._program.disableAttributeArray(0) + self._program.release() + + self._window.endExternalCommands() diff --git a/examples/quick/scenegraph/scenegraph_customgeometry/doc/scenegraph_customgeometry.rst b/examples/quick/scenegraph/scenegraph_customgeometry/doc/scenegraph_customgeometry.rst new file mode 100644 index 000000000..190ab80c2 --- /dev/null +++ b/examples/quick/scenegraph/scenegraph_customgeometry/doc/scenegraph_customgeometry.rst @@ -0,0 +1,7 @@ +Scene Graph - Custom Geometry +============================= + +The custom geometry example shows how to create a QQuickItem which uses the +scene graph API to build a custom geometry for the scene graph. It does this +by creating a BezierCurve item which is made part of the CustomGeometry module +and makes use of this in a QML file. diff --git a/examples/quick/scenegraph/scenegraph_customgeometry/main.py b/examples/quick/scenegraph/scenegraph_customgeometry/main.py new file mode 100644 index 000000000..60a904065 --- /dev/null +++ b/examples/quick/scenegraph/scenegraph_customgeometry/main.py @@ -0,0 +1,152 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +"""PySide6 port of the Qt Quick customgeometry example from Qt v6.x""" + +import sys +from pathlib import Path + +from PySide6.QtQuick import (QQuickView, QQuickItem, QSGNode, QSGGeometryNode, + QSGGeometry, QSGFlatColorMaterial) +from PySide6.QtQml import QmlElement +from PySide6.QtGui import QGuiApplication, QColor +from PySide6.QtCore import (QPointF, QUrl, Property, Signal, Slot) + +# To be used on the @QmlElement decorator +# (QML_IMPORT_MINOR_VERSION is optional) +QML_IMPORT_NAME = "CustomGeometry" +QML_IMPORT_MAJOR_VERSION = 1 + + +@QmlElement +class BezierCurve(QQuickItem): + p1Changed = Signal() + p2Changed = Signal() + p3Changed = Signal() + p4Changed = Signal() + segmentCountChanged = Signal() + + def __init__(self, parent=None): + super().__init__(parent) + + self._p1 = QPointF(0, 0) + self._p2 = QPointF(1, 0) + self._p3 = QPointF(0, 1) + self._p4 = QPointF(1, 1) + self._segmentCount = 32 + + self._node = None + self._geometry = None + self.setFlag(QQuickItem.Flags.ItemHasContents, True) + + def p1(self): + return self._p1 + + def p2(self): + return self._p2 + + def p3(self): + return self._p3 + + def p4(self): + return self._p4 + + def segmentCount(self): + return self._segmentCount + + @Slot(QPointF) + def setP1(self, p): + if p != self._p1: + self._p1 = p + self.p1Changed.emit() + self.update() + + @Slot(QPointF) + def setP2(self, p): + if p != self._p2: + self._p2 = p + self.p2Changed.emit() + self.update() + + @Slot(QPointF) + def setP3(self, p): + if p != self._p3: + self._p3 = p + self.p3Changed.emit() + self.update() + + @Slot(QPointF) + def setP4(self, p): + if p != self._p4: + self._p4 = p + self.p4Changed.emit() + self.update() + + @Slot(int) + def setSegmentCount(self, p): + if p != self._segmentCount: + self._segmentCount = p + self.segmentCountChanged.emit() + self.update() + + def updatePaintNode(self, oldNode, updatePaintNodeData): + self._node = oldNode + if not self._node: + self._default_attributes = QSGGeometry.defaultAttributes_Point2D() + self._geometry = QSGGeometry(self._default_attributes, self._segmentCount) + self._geometry.setLineWidth(2) + self._geometry.setDrawingMode(QSGGeometry.DrawingMode.DrawLineStrip) + + self._node = QSGGeometryNode() + self._node.setGeometry(self._geometry) + self._node.setFlag(QSGNode.Flags.OwnsGeometry) + self._material = QSGFlatColorMaterial() + self._material.setColor(QColor(255, 0, 0)) + self._node.setMaterial(self._material) + self._node.setFlag(QSGNode.Flags.OwnsMaterial) + else: + self._geometry = self._node.geometry() + self._geometry.allocate(self._segmentCount) + + item_size = self.size() + item_width = float(item_size.width()) + item_height = float(item_size.height()) + vertices = self._geometry.vertexDataAsPoint2D() + for i in range(self._segmentCount): + t = float(i) / float(self._segmentCount - 1) + inv_t = 1 - t + pos = ((inv_t * inv_t * inv_t * self._p1) + + (3 * inv_t * inv_t * t * self._p2) + + (3 * inv_t * t * t * self._p3) + + (t * t * t * self._p4)) + vertices[i].set(pos.x() * item_width, pos.y() * item_height) + + self._geometry.setVertexDataAsPoint2D(vertices) + + self._node.markDirty(QSGNode.DirtyGeometry) + return self._node + + p1 = Property(QPointF, p1, setP1, notify=p1Changed) + p2 = Property(QPointF, p2, setP2, notify=p2Changed) + p3 = Property(QPointF, p3, setP3, notify=p3Changed) + p4 = Property(QPointF, p4, setP4, notify=p4Changed) + + segmentCount = Property(int, segmentCount, setSegmentCount, + notify=segmentCountChanged) + + +if __name__ == "__main__": + app = QGuiApplication([]) + view = QQuickView() + format = view.format() + format.setSamples(16) + view.setFormat(format) + + qml_file = Path(__file__).parent / "main.qml" + view.setSource(QUrl.fromLocalFile(qml_file)) + if not view.rootObject(): + sys.exit(-1) + view.show() + ex = app.exec() + del view + sys.exit(ex) diff --git a/examples/quick/scenegraph/scenegraph_customgeometry/main.qml b/examples/quick/scenegraph/scenegraph_customgeometry/main.qml new file mode 100644 index 000000000..88431a176 --- /dev/null +++ b/examples/quick/scenegraph/scenegraph_customgeometry/main.qml @@ -0,0 +1,34 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import CustomGeometry + +Item { + width: 300 + height: 200 + + BezierCurve { + id: line + anchors.fill: parent + anchors.margins: 20 + property real t + SequentialAnimation on t { + NumberAnimation { to: 1; duration: 2000; easing.type: Easing.InOutQuad } + NumberAnimation { to: 0; duration: 2000; easing.type: Easing.InOutQuad } + loops: Animation.Infinite + } + + p2: Qt.point(t, 1 - t) + p3: Qt.point(1 - t, t) + } + + Text { + anchors.bottom: line.bottom + x: 20 + width: parent.width - 40 + wrapMode: Text.WordWrap + + text: "This curve is a custom scene graph item, implemented using GL_LINE_STRIP" + } +} diff --git a/examples/quick/scenegraph/scenegraph_customgeometry/scenegraph_customgeometry.pyproject b/examples/quick/scenegraph/scenegraph_customgeometry/scenegraph_customgeometry.pyproject new file mode 100644 index 000000000..a5247ef6c --- /dev/null +++ b/examples/quick/scenegraph/scenegraph_customgeometry/scenegraph_customgeometry.pyproject @@ -0,0 +1,3 @@ +{ + "files": ["main.py","main.qml"] +} diff --git a/examples/quick/shared/Button.qml b/examples/quick/shared/Button.qml new file mode 100644 index 000000000..2d4797a96 --- /dev/null +++ b/examples/quick/shared/Button.qml @@ -0,0 +1,50 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Window 2.1 + +Item { + id: container + + property alias text: buttonLabel.text + property alias label: buttonLabel + signal clicked + property alias containsMouse: hoverHandler.hovered + property alias pressed: tapHandler.pressed + implicitHeight: Math.max(Screen.pixelDensity * 7, buttonLabel.implicitHeight * 1.2) + implicitWidth: Math.max(Screen.pixelDensity * 11, buttonLabel.implicitWidth * 1.3) + height: implicitHeight + width: implicitWidth + + SystemPalette { id: palette } + + Rectangle { + id: frame + anchors.fill: parent + color: palette.button + gradient: Gradient { + GradientStop { position: 0.0; color: tapHandler.pressed ? Qt.darker(palette.button, 1.3) : palette.button } + GradientStop { position: 1.0; color: Qt.darker(palette.button, 1.3) } + } + antialiasing: true + radius: height / 6 + border.color: Qt.darker(palette.button, 1.5) + border.width: 1 + } + + TapHandler { + id: tapHandler + onTapped: container.clicked(); + } + HoverHandler { + id: hoverHandler + } + + Text { + id: buttonLabel + text: container.text + color: palette.buttonText + anchors.centerIn: parent + } +} diff --git a/examples/quick/shared/CheckBox.qml b/examples/quick/shared/CheckBox.qml new file mode 100644 index 000000000..45c4f4e67 --- /dev/null +++ b/examples/quick/shared/CheckBox.qml @@ -0,0 +1,59 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick + +Item { + id: root + implicitHeight: frame.height + implicitWidth: row.implicitWidth + width: implicitWidth + height: implicitHeight + property alias text: label.text + property bool checked + property alias pressed: tapHandler.pressed + property alias row: row + signal clicked + + SystemPalette { id: palette } + + Row { + id: row + anchors.verticalCenter: parent.verticalCenter + spacing: 6 + Rectangle { + id: frame + gradient: Gradient { + GradientStop { position: 0.0; color: tapHandler.pressed ? Qt.darker(palette.button, 1.3) : palette.button } + GradientStop { position: 1.0; color: Qt.darker(palette.button, 1.3) } + } + height: label.implicitHeight * 1.5 + width: height + anchors.margins: 1 + radius: 3 + antialiasing: true + border.color: Qt.darker(palette.button, 1.5) + Image { + id: theX + source: "images/checkmark.png" + anchors.fill: frame + anchors.margins: frame.width / 5 + fillMode: Image.PreserveAspectFit + smooth: true + visible: root.checked + } + } + Text { + id: label + color: palette.text + anchors.verticalCenter: frame.verticalCenter + } + } + TapHandler { + id: tapHandler + onTapped: { + parent.checked = !parent.checked + parent.clicked() + } + } +} diff --git a/examples/quick/shared/FlickrRssModel.qml b/examples/quick/shared/FlickrRssModel.qml new file mode 100644 index 000000000..e78d1ffa2 --- /dev/null +++ b/examples/quick/shared/FlickrRssModel.qml @@ -0,0 +1,45 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick + +ListModel { + id: flickrImages + property string tags : "" + readonly property string queryUrl : "http://api.flickr.com/services/feeds/photos_public.gne?" + + function encodeParams(x) { + return encodeURIComponent(x.replace(" ",",")); + } + function fetchImages(format) { + var requestURL = queryUrl + (tags ? "tags="+encodeParams(tags)+"&" : "") + "format=" + format + "&nojsoncallback=1"; + var xhr = new XMLHttpRequest; + xhr.onreadystatechange = function() { + if (xhr.readyState === XMLHttpRequest.DONE) { + + if (xhr.status !== 200) { + console.log("Failed to get images from flickr. status code: " + xhr.status); + return; + } + + var jsonText = xhr.responseText; + var objArray = JSON.parse(jsonText.replace(/\'/g,"'")) + if (objArray.errors !== undefined) + console.log("Error fetching tweets: " + objArray.errors[0].message) + else { + for (var key in objArray.items) { + var rssItem = objArray.items[key]; + var jsonObject = "{ \"title\": \"" + rssItem.title +"\",\"media\": \"" + rssItem.media.m + "\", \"thumbnail\": \"" + rssItem.media.m.replace(/\_m\.jpg/,"_s.jpg") +"\"}" + flickrImages.append(JSON.parse(jsonObject)); + } + } + } + } + xhr.open("GET", requestURL, true); + xhr.send(); + } + Component.onCompleted: { + fetchImages("json"); + } +} + diff --git a/examples/quick/shared/Images.qml b/examples/quick/shared/Images.qml new file mode 100644 index 000000000..ade3619d8 --- /dev/null +++ b/examples/quick/shared/Images.qml @@ -0,0 +1,14 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +pragma Singleton +import QtQml + +QtObject { + readonly property url back: Qt.resolvedUrl("images/back.png") + readonly property url checkmark: Qt.resolvedUrl("images/checkmark.png") + readonly property url next: Qt.resolvedUrl("images/next.png") + readonly property url qtLogo: Qt.resolvedUrl("images/qt-logo.png") + readonly property url sliderHandle: Qt.resolvedUrl("images/slider_handle.png") + readonly property url tab: Qt.resolvedUrl("images/tab.png") +} diff --git a/examples/quick/shared/Label.qml b/examples/quick/shared/Label.qml new file mode 100644 index 000000000..5393336ca --- /dev/null +++ b/examples/quick/shared/Label.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick + +Text { + SystemPalette { id: palette } + color: palette.text +} diff --git a/examples/quick/shared/LauncherList.qml b/examples/quick/shared/LauncherList.qml new file mode 100644 index 000000000..ff383e4e4 --- /dev/null +++ b/examples/quick/shared/LauncherList.qml @@ -0,0 +1,205 @@ +// Copyright (C) 2017 Crimson AS <info@crimson.no> +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQml +import QtQml.Models 2.12 +import QtQuick + +Rectangle { + id: root + property int activePageCount: 0 + + //model is a list of {"name":"somename", "url":"file:///some/url/mainfile.qml"} + //function used to add to model A) to enforce scheme B) to allow Qt.resolveUrl in url assignments + + color: "#eee" + function addExample(name, desc, url) { + myModel.append({"name":name, "description":desc, "url":url}) + } + function showExample(url) { + pageComponent.createObject(pageContainer, { exampleUrl: url }).show() + } + + // The container rectangle here is used to give a nice "feel" when + // transitioning into an example. + Rectangle { + anchors.fill: parent + color: "black" + + ListView { + id: launcherList + clip: true + delegate: SimpleLauncherDelegate{ + required property url url + onClicked: root.showExample(url) + } + model: ListModel {id:myModel} + anchors.fill: parent + enabled: opacity == 1.0 + } + } + + Item { + id: pageContainer + anchors.fill: parent + } + + Component { + id: pageComponent + Rectangle { + id: page + clip: true + property url exampleUrl + width: parent.width + height: parent.height - bar.height + color: "white" + TapHandler { + //Eats mouse events + } + Loader{ + focus: true + source: parent.exampleUrl + anchors.fill: parent + } + + function show() { + showAnim.start() + } + + function exit() { + exitAnim.start() + } + + ParallelAnimation { + id: showAnim + ScriptAction { + script: root.activePageCount++ + } + NumberAnimation { + target: launcherList + property: "opacity" + from: 1.0 + to: 0.0 + duration: 500 + } + NumberAnimation { + target: launcherList + property: "scale" + from: 1.0 + to: 0.0 + duration: 500 + } + NumberAnimation { + target: page + property: "x" + from: -page.width + to: 0 + duration: 300 + } + } + SequentialAnimation { + id: exitAnim + + ScriptAction { + script: root.activePageCount-- + } + + ParallelAnimation { + NumberAnimation { + target: launcherList + property: "opacity" + from: 0.0 + to: 1.0 + duration: 300 + } + NumberAnimation { + target: launcherList + property: "scale" + from: 0.0 + to: 1.0 + duration: 300 + } + NumberAnimation { + target: page + property: "x" + from: 0 + to: -page.width + duration: 300 + } + } + + ScriptAction { + script: page.destroy() + } + } + } + } + Rectangle { + id: bar + visible: height > 0 + anchors.bottom: parent.bottom + width: parent.width + height: root.activePageCount > 0 ? 40 : 0 + + Behavior on height { + NumberAnimation { + duration: 300 + } + } + + Rectangle { + height: 1 + color: "#ccc" + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + } + + Rectangle { + height: 1 + color: "#fff" + anchors.top: parent.top + anchors.topMargin: 1 + anchors.left: parent.left + anchors.right: parent.right + } + + gradient: Gradient { + GradientStop { position: 0 ; color: "#eee" } + GradientStop { position: 1 ; color: "#ccc" } + } + + Image { + id: back + source: "images/back.png" + anchors.verticalCenter: parent.verticalCenter + anchors.verticalCenterOffset: 2 + anchors.left: parent.left + anchors.leftMargin: 16 + + TapHandler { + id: tapHandler + enabled: root.activePageCount > 0 + onTapped: { + pageContainer.children[pageContainer.children.length - 1].exit() + } + } + Rectangle { + anchors.centerIn: back + width: 38 + height: 31 + anchors.verticalCenterOffset: -1 + opacity: tapHandler.pressed ? 1 : 0 + Behavior on opacity { NumberAnimation{ duration: 100 }} + gradient: Gradient { + GradientStop { position: 0 ; color: "#22000000" } + GradientStop { position: 0.2 ; color: "#11000000" } + } + border.color: "darkgray" + antialiasing: true + radius: 4 + } + } + } +} diff --git a/examples/quick/shared/README b/examples/quick/shared/README new file mode 100644 index 000000000..2bf26d7c8 --- /dev/null +++ b/examples/quick/shared/README @@ -0,0 +1,11 @@ +These files are shared between multiple examples as a set of common and +reusuable components. While they do demonstrate the building of reusable +components in QML, they are not official examples themselves. +Consequently they do not have entries in the Qt documentation, and are +documented only through the code comments within the files. Developers +new to QML are strongly encouraged to go through the official examples +before delving into this directory. + +For most application use, see the Qt Quick Components project to find +ready-made Components you can use in your own projects. Qt Quick +examples do not use them only to avoid external dependencies. diff --git a/examples/quick/shared/SimpleLauncherDelegate.qml b/examples/quick/shared/SimpleLauncherDelegate.qml new file mode 100644 index 000000000..c6ca9802d --- /dev/null +++ b/examples/quick/shared/SimpleLauncherDelegate.qml @@ -0,0 +1,96 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause +import QtQuick + +Rectangle { + id: container + required property string name + required property string description + + property Item exampleItem + width: ListView.view.width + height: button.implicitHeight + 22 + + signal clicked() + + gradient: Gradient { + GradientStop { + position: 0 + Behavior on color {ColorAnimation { duration: 100 }} + color: tapHandler.pressed ? "#e0e0e0" : "#fff" + } + GradientStop { + position: 1 + Behavior on color {ColorAnimation { duration: 100 }} + color: tapHandler.pressed ? "#e0e0e0" : button.containsMouse ? "#f5f5f5" : "#eee" + } + } + + Image { + id: image + opacity: 0.7 + Behavior on opacity {NumberAnimation {duration: 100}} + source: "images/next.png" + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: 16 + } + + Item { + id: button + anchors.top: parent.top + anchors.left: parent.left + anchors.bottom: parent.bottom + anchors.right:image.left + implicitHeight: col.height + height: implicitHeight + width: buttonLabel.width + 20 + property alias containsMouse: hoverHandler.hovered + + TapHandler { + id: tapHandler + onTapped: container.clicked() + } + HoverHandler { + id: hoverHandler + } + + Column { + spacing: 2 + id: col + anchors.verticalCenter: parent.verticalCenter + width: parent.width + Text { + id: buttonLabel + anchors.left: parent.left + anchors.leftMargin: 10 + anchors.right: parent.right + anchors.rightMargin: 10 + text: container.name + color: "black" + font.pixelSize: 22 + wrapMode: Text.WrapAtWordBoundaryOrAnywhere + styleColor: "white" + style: Text.Raised + + } + Text { + id: buttonLabel2 + anchors.left: parent.left + anchors.leftMargin: 10 + text: container.description + wrapMode: Text.WrapAtWordBoundaryOrAnywhere + color: "#666" + font.pixelSize: 12 + } + } + } + + Rectangle { + height: 1 + color: "#ccc" + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + } +} diff --git a/examples/quick/shared/Slider.qml b/examples/quick/shared/Slider.qml new file mode 100644 index 000000000..b8bb6ed30 --- /dev/null +++ b/examples/quick/shared/Slider.qml @@ -0,0 +1,82 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick + +Item { + id: slider + height: 26 + // default drag range is 180: divisible by 2, 3, 4, 5, 6, 9, 10, ... + width: sliderName.width + 223 + handle.width / 2 + + property real min: 0 + property real max: 1 + property real value: min + (max - min) * dragHandler.value + property real init: min+(max-min)/2 + property string name: "Slider" + property color color: "#0066cc" + property real minLabelWidth: 44 + + DragHandler { + id: dragHandler + target: handle + xAxis.minimum: Math.round(-handle.width / 2 + 3) + xAxis.maximum: Math.round(groove.width - handle.width / 2 - 3) + property real value: (handle.x - xAxis.minimum) / (xAxis.maximum - xAxis.minimum) + } + + Component.onCompleted: setValue(init) + function setValue(v) { + if (min < max) { + handle.x = Math.round( v / (max - min) * + (dragHandler.xAxis.maximum - dragHandler.xAxis.minimum) + + dragHandler.xAxis.minimum); +// console.log(name, v, "-> handle.x", handle.x, "from fraction", (v / (max - min)), +// "of drag range", (dragHandler.xAxis.maximum - dragHandler.xAxis.minimum), "px", min, ":", max) + } + } + Rectangle { + id:sliderName + anchors.left: parent.left + anchors.leftMargin: 16 + height: childrenRect.height + width: Math.max(slider.minLabelWidth, childrenRect.width) + anchors.verticalCenter: parent.verticalCenter + Text { + text: slider.name + ":" + font.pointSize: 12 + color: "#333" + } + } + + Rectangle { + id: groove + width: parent.width - 8 - sliderName.width + color: "#eee" + height: 7 + radius: 3 + antialiasing: true + border.color: Qt.darker(color, 1.2) + anchors.left: sliderName.right + anchors.right: parent.right + anchors.leftMargin: 10 + anchors.rightMargin: 24 + anchors.verticalCenter: parent.verticalCenter + + Rectangle { + height: parent.height + anchors.left: parent.left + anchors.right: handle.horizontalCenter + color: slider.color + radius: 3 + border.width: 1 + border.color: Qt.darker(color, 1.3) + opacity: 0.8 + } + Image { + id: handle + source: "images/slider_handle.png" + anchors.verticalCenter: parent.verticalCenter + } + } +} diff --git a/examples/quick/shared/TabSet.qml b/examples/quick/shared/TabSet.qml new file mode 100644 index 000000000..e78880b91 --- /dev/null +++ b/examples/quick/shared/TabSet.qml @@ -0,0 +1,69 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Window 2.1 + +Item { + id: tabWidget + + // Setting the default property to stack.children means any child items + // of the TabWidget are actually added to the 'stack' item's children. + // See the "Property Binding" + // documentation for details on default properties. + default property alias content: stack.children + + property int current: 0 + + onCurrentChanged: setZOrders() + Component.onCompleted: setZOrders() + + function setZOrders() { + for (var i = 0; i < stack.children.length; ++i) { + stack.children[i].z = (i == current ? 1 : 0) + stack.children[i].enabled = (i == current) + } + } + + Row { + id: header + + Repeater { + model: stack.children.length + delegate: Rectangle { + required property int index + width: tabWidget.width / stack.children.length + height: Math.max(Screen.pixelDensity * 7, label.implicitHeight * 1.2) + + Rectangle { + width: parent.width; height: 1 + anchors { bottom: parent.bottom; bottomMargin: 1 } + color: "#acb2c2" + } + BorderImage { + anchors { fill: parent; leftMargin: 2; topMargin: 5; rightMargin: 1 } + border { left: 7; right: 7 } + source: "images/tab.png" + visible: tabWidget.current == parent.index + } + Text { + id: label + horizontalAlignment: Qt.AlignHCenter; verticalAlignment: Qt.AlignVCenter + anchors.fill: parent + text: stack.children[parent.index].title + elide: Text.ElideRight + font.bold: tabWidget.current == parent.index + } + TapHandler { + onTapped: tabWidget.current = parent.index + } + } + } + } + + Item { + id: stack + width: tabWidget.width + anchors.top: header.bottom; anchors.bottom: tabWidget.bottom + } +} diff --git a/examples/quick/shared/TextField.qml b/examples/quick/shared/TextField.qml new file mode 100644 index 000000000..66854c89b --- /dev/null +++ b/examples/quick/shared/TextField.qml @@ -0,0 +1,43 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick + +Item { + id: root + + property alias textInput: textInput + property alias text: textInput.text + signal accepted + signal downPressed + implicitWidth: textInput.implicitWidth + rect.radius * 2 + implicitHeight: textInput.implicitHeight + + function copyAll() { + textInput.selectAll() + textInput.copy() + } + + SystemPalette { id: palette } + height: textInput.implicitHeight + 8 + clip: true + + Rectangle { + id: rect + anchors.fill: parent + radius: height / 4 + color: palette.button + border.color: Qt.darker(palette.button, 1.5) + } + + TextInput { + id: textInput + color: palette.text + anchors.fill: parent + anchors.leftMargin: rect.radius + anchors.rightMargin: rect.radius + verticalAlignment: Text.AlignVCenter + onAccepted: root.accepted() + Keys.onDownPressed: root.downPressed() + } +} diff --git a/examples/quick/shared/images/back.png b/examples/quick/shared/images/back.png Binary files differnew file mode 100644 index 000000000..53402096b --- /dev/null +++ b/examples/quick/shared/images/back.png diff --git a/examples/quick/shared/images/checkmark.png b/examples/quick/shared/images/checkmark.png Binary files differnew file mode 100644 index 000000000..821aafccd --- /dev/null +++ b/examples/quick/shared/images/checkmark.png diff --git a/examples/quick/shared/images/next.png b/examples/quick/shared/images/next.png Binary files differnew file mode 100644 index 000000000..cdef8db6e --- /dev/null +++ b/examples/quick/shared/images/next.png diff --git a/examples/quick/shared/images/qt-logo.png b/examples/quick/shared/images/qt-logo.png Binary files differnew file mode 100644 index 000000000..a3e793b87 --- /dev/null +++ b/examples/quick/shared/images/qt-logo.png diff --git a/examples/quick/shared/images/slider_handle.png b/examples/quick/shared/images/slider_handle.png Binary files differnew file mode 100644 index 000000000..63c518be7 --- /dev/null +++ b/examples/quick/shared/images/slider_handle.png diff --git a/examples/quick/shared/images/tab.png b/examples/quick/shared/images/tab.png Binary files differnew file mode 100644 index 000000000..2ea989b68 --- /dev/null +++ b/examples/quick/shared/images/tab.png diff --git a/examples/quick/shared/qmldir b/examples/quick/shared/qmldir new file mode 100644 index 000000000..5ccdf6021 --- /dev/null +++ b/examples/quick/shared/qmldir @@ -0,0 +1,11 @@ +module shared +Button 2.0 Button.qml +CheckBox 2.1 CheckBox.qml +FlickrRssModel 2.0 FlickrRssModel.qml +Label 2.0 Label.qml +LauncherList 2.0 LauncherList.qml +SimpleLauncherDelegate 2.0 SimpleLauncherDelegate.qml +Slider 2.0 Slider.qml +TabSet 2.1 TabSet.qml +TextField 2.1 TextField.qml +singleton Images 2.2 Images.qml diff --git a/examples/quick/shared/quick_shared.qrc b/examples/quick/shared/quick_shared.qrc new file mode 100644 index 000000000..21f393a64 --- /dev/null +++ b/examples/quick/shared/quick_shared.qrc @@ -0,0 +1,15 @@ +<RCC> + <qresource prefix="/quick/shared"> + <file>LauncherList.qml</file> + <file>SimpleLauncherDelegate.qml</file> + <file>Button.qml</file> + <file>CheckBox.qml</file> + <file>Label.qml</file> + <file>TextField.qml</file> + <file>images/back.png</file> + <file>images/next.png</file> + <file>images/checkmark.png</file> + <file>Slider.qml</file> + <file>images/slider_handle.png</file> + </qresource> +</RCC> diff --git a/examples/quick/shared/shared.qrc b/examples/quick/shared/shared.qrc new file mode 100644 index 000000000..c19063a58 --- /dev/null +++ b/examples/quick/shared/shared.qrc @@ -0,0 +1,21 @@ +<RCC> + <qresource prefix="/shared"> + <file>Button.qml</file> + <file>CheckBox.qml</file> + <file>FlickrRssModel.qml</file> + <file>Images.qml</file> + <file>Label.qml</file> + <file>LauncherList.qml</file> + <file>SimpleLauncherDelegate.qml</file> + <file>Slider.qml</file> + <file>TabSet.qml</file> + <file>TextField.qml</file> + <file>images/back.png</file> + <file>images/checkmark.png</file> + <file>images/next.png</file> + <file>images/qt-logo.png</file> + <file>images/slider_handle.png</file> + <file>images/tab.png</file> + <file>qmldir</file> + </qresource> +</RCC> diff --git a/examples/quick/shared/shared_rc.py b/examples/quick/shared/shared_rc.py new file mode 100644 index 000000000..14a9da5b9 --- /dev/null +++ b/examples/quick/shared/shared_rc.py @@ -0,0 +1,2253 @@ +# Resource object code (Python 3) +# Created by: object code +# Created by: The Resource Compiler for Qt version 6.5.0 +# WARNING! All changes made in this file will be lost! + +from PySide6 import QtCore + +qt_resource_data = b"\ +\x00\x00\x06\xd1\ +/\ +/ Copyright (C) \ +2017 The Qt Comp\ +any Ltd.\x0d\x0a// SPD\ +X-License-Identi\ +fier: LicenseRef\ +-Qt-Commercial O\ +R BSD-3-Clause\x0d\x0a\ +\x0d\x0aimport QtQuick\ +\x0d\x0a\x0d\x0aItem {\x0d\x0a \ +id: root\x0d\x0a im\ +plicitHeight: fr\ +ame.height\x0d\x0a \ +implicitWidth: r\ +ow.implicitWidth\ +\x0d\x0a width: imp\ +licitWidth\x0d\x0a \ +height: implicit\ +Height\x0d\x0a prop\ +erty alias text:\ + label.text\x0d\x0a \ + property bool c\ +hecked\x0d\x0a prop\ +erty alias press\ +ed: tapHandler.p\ +ressed\x0d\x0a prop\ +erty alias row: \ +row\x0d\x0a signal \ +clicked\x0d\x0a\x0d\x0a S\ +ystemPalette { i\ +d: palette }\x0d\x0a\x0d\x0a\ + Row {\x0d\x0a \ + id: row\x0d\x0a \ + anchors.vert\ +icalCenter: pare\ +nt.verticalCente\ +r\x0d\x0a spaci\ +ng: 6\x0d\x0a R\ +ectangle {\x0d\x0a \ + id: fram\ +e\x0d\x0a g\ +radient: Gradien\ +t {\x0d\x0a \ + GradientSto\ +p { position: 0.\ +0; color: tapHan\ +dler.pressed ? Q\ +t.darker(palette\ +.button, 1.3) : \ +palette.button }\ +\x0d\x0a \ + GradientStop {\ + position: 1.0; \ +color: Qt.darker\ +(palette.button,\ + 1.3) }\x0d\x0a \ + }\x0d\x0a \ + height: labe\ +l.implicitHeight\ + * 1.5\x0d\x0a \ + width: heigh\ +t\x0d\x0a a\ +nchors.margins: \ +1\x0d\x0a r\ +adius: 3\x0d\x0a \ + antialiasi\ +ng: true\x0d\x0a \ + border.col\ +or: Qt.darker(pa\ +lette.button, 1.\ +5)\x0d\x0a \ +Image {\x0d\x0a \ + id: the\ +X\x0d\x0a \ + source: \x22imag\ +es/checkmark.png\ +\x22\x0d\x0a \ + anchors.fill:\ + frame\x0d\x0a \ + anchors.\ +margins: frame.w\ +idth / 5\x0d\x0a \ + fillMo\ +de: Image.Preser\ +veAspectFit\x0d\x0a \ + smo\ +oth: true\x0d\x0a \ + visib\ +le: root.checked\ +\x0d\x0a }\x0d\ +\x0a }\x0d\x0a \ + Text {\x0d\x0a \ + id: labe\ +l\x0d\x0a c\ +olor: palette.te\ +xt\x0d\x0a \ +anchors.vertical\ +Center: frame.ve\ +rticalCenter\x0d\x0a \ + }\x0d\x0a }\x0d\x0a\ + TapHandler {\ +\x0d\x0a id: ta\ +pHandler\x0d\x0a \ + onTapped: {\x0d\x0a \ + paren\ +t.checked = !par\ +ent.checked\x0d\x0a \ + parent.\ +clicked()\x0d\x0a \ + }\x0d\x0a }\x0d\x0a}\x0d\x0a\ +\ +\x00\x00\x04C\ +/\ +/ Copyright (C) \ +2017 The Qt Comp\ +any Ltd.\x0d\x0a// SPD\ +X-License-Identi\ +fier: LicenseRef\ +-Qt-Commercial O\ +R BSD-3-Clause\x0d\x0a\ +\x0d\x0aimport QtQuick\ +\x0d\x0a\x0d\x0aItem {\x0d\x0a \ +id: root\x0d\x0a\x0d\x0a \ +property alias t\ +extInput: textIn\ +put\x0d\x0a propert\ +y alias text: te\ +xtInput.text\x0d\x0a \ + signal accepte\ +d\x0d\x0a signal do\ +wnPressed\x0d\x0a i\ +mplicitWidth: te\ +xtInput.implicit\ +Width + rect.rad\ +ius * 2\x0d\x0a imp\ +licitHeight: tex\ +tInput.implicitH\ +eight\x0d\x0a\x0d\x0a fun\ +ction copyAll() \ +{\x0d\x0a textI\ +nput.selectAll()\ +\x0d\x0a textIn\ +put.copy()\x0d\x0a \ +}\x0d\x0a\x0d\x0a SystemP\ +alette { id: pal\ +ette }\x0d\x0a heig\ +ht: textInput.im\ +plicitHeight + 8\ +\x0d\x0a clip: true\ +\x0d\x0a\x0d\x0a Rectangl\ +e {\x0d\x0a id:\ + rect\x0d\x0a a\ +nchors.fill: par\ +ent\x0d\x0a rad\ +ius: height / 4\x0d\ +\x0a color: \ +palette.button\x0d\x0a\ + border.c\ +olor: Qt.darker(\ +palette.button, \ +1.5)\x0d\x0a }\x0d\x0a\x0d\x0a \ + TextInput {\x0d\x0a\ + id: text\ +Input\x0d\x0a c\ +olor: palette.te\ +xt\x0d\x0a anch\ +ors.fill: parent\ +\x0d\x0a anchor\ +s.leftMargin: re\ +ct.radius\x0d\x0a \ + anchors.right\ +Margin: rect.rad\ +ius\x0d\x0a ver\ +ticalAlignment: \ +Text.AlignVCente\ +r\x0d\x0a onAcc\ +epted: root.acce\ +pted()\x0d\x0a \ +Keys.onDownPress\ +ed: root.downPre\ +ssed()\x0d\x0a }\x0d\x0a}\ +\x0d\x0a\ +\x00\x00\x00\xcc\ +/\ +/ Copyright (C) \ +2017 The Qt Comp\ +any Ltd.\x0d\x0a// SPD\ +X-License-Identi\ +fier: LicenseRef\ +-Qt-Commercial O\ +R BSD-3-Clause\x0d\x0a\ +\x0d\x0aimport QtQuick\ +\x0d\x0a\x0d\x0aText {\x0d\x0a \ +SystemPalette { \ +id: palette }\x0d\x0a \ + color: palett\ +e.text\x0d\x0a}\x0d\x0a\ +\x00\x00\x039\ +\x00\ +\x00\x0a\xd3x\xda\xc5VYO\xdb@\x10~\x8f\x94\xff\ +0\x0a/\xa0*\xceQ5H~\xa9 H\x05\x09J\ +9T\xfa\xba\xb1'\xf6\x0a{\xd7\xdd]\x13R\xc4\x7f\ +\xef\xac\x8f\xf8J(\xa0\xaauP\xd8\x9d\xf9fw\x8e\ +o\xc6\x19\x8d`.\x93\xb5\xe2Ah`\x7f~\x00\xd3\ +\xf1\xe4\x10nC\x84+C\x9a8ab\x0d\xe7\xc6w\ +\xfa\xbd\xd1\x08n\xbe\x9d\xfc\x18\x9es\x0f\x85\xc6\xe1\x99\ +\x8f\xc2\xf0%G\xe5B!\xbb\xc6\xe5\xf0\xca\x0c\xc9.\ +F\xe5q\x16\xc1\xe55\x1c\xdf\x9c\x0c?\x0e\xe7\x11K\ +5\xf6{<N\xa42t\xfaU\xca\xbd\xfb~\xaf\xdf\ +\xbbF\xcf0\x11D\x08O\xfd\x1e\xd0\xc3}\x17<)\ +\x0c\xe3\x02U.R\xf83\xe5\x0a}H\x94LP\x99\ +5h\xa3\xb8\x08@\xb0\x18\xff\x00\xf1Q{\x8a'\x86\ +Ka\xaf\xb3\xd8\x0d\xe4\xcc`\x0c\xf8\xc8\xe2$B\xbb\ +\xce\xd5+\xee\x9b\xd0\x06\xa5\xcdw\x8e+\xe7\xc1~e\ +\xc2\x5c\x1f\xa2M\x97\x0b\x8b\xd4\x18)\x1c\x0a)\xe2\x1e\ +7\xa7\x99\x18>\xc0tZ^\xa4y (\x0b\x1e\xe9\ +\xef\xd1\xdf?(\xe5\x81b>\xa7\xf4\xb9\xf0\xa5X\x95\ +\xc1\xdb\xa7\x94\xdd\x18\x99\xd4\xe5\x99\xebRs\x1b\x8a\x0b\ +\xe3\xa6\xe2\x18C\xf6\xc0\xa5\x02)({\x11-\x9e\xe6\ +\xf6\xdf\x91\xe01\xb3\x16\xf0\x04~\xaaXn<\x19\x8f\ +\xe1\xf9\xb9yBf\xe5\x82a\xc9)\x13~\x84\xcaI\ +\x14jM)\xfd\x0c\x83=\x1c\xdb\xcf\x00\x5cZ/\x97\ +\xcbAe\xfb\xfcV\xcf'\xff\xcb\xf3\xa2`\x05\xb9\xf4\ +\x85$Jf\x90\xe5'\xfb\xc9\x83C\xc4np\xcfe\ +\xe5\xceb\x16`=4\xcbVn\x85\x95H&\x8c\xe8\ +\xb0\xa6\x129\x87\x95\xb4\x1ef\x81\x80\xa7\xafi\xbc\xc0\ +z\xa4\x8d@\xebqj\x99*\x0f\xc9\xc1\xec2=\x12\ +\xf8h\x9cD\x045_\x99\xf0B\xa9\xb4\xf3@\xdc\xe6\ +\x1e\x8b\xe6T\x09\xdb\x9d\x09S\xb4j\x89\xbbf*g\ +u\x81\xcev;@\x17L\x05\xdc\xba8kg\xc7\xf6\ +S+9y\xd2\xbb'\x11E6\x97\xd1\xba\x0b\x88p\ +Y\xb9c7]\xc8B\xd2\xd9\xf1\x06\x94owE\x96\ +%\xaeuP\xb3w\xed\xdc\x89\x9c\xbc\xbd+L\xd9\xee\ +Ml\xa5/\xc6E\x1e\xe79[`\x94\x0f\x0b;\x09\ +jM\xba\x19:,\xe2LC\x83\x84.\x84\x92\xcaS\ +\xb27\xdb\xa0_f\xd5>\xb7\x1bn\xb7\xfb\xca\xe6\xb8\ +b~S'\x05\xd9%X\x1f\xa8Nm\x18m\xe9\xe0\ +\xd3\x9a\x1f\xdbn\xaa\xfb\xd98\xa0\xdaP\xf3\xa6\xb1h\ +\x1bkKy\x11\xb80\xed\x1eJYo\x0a\xdf\xc9\xe4\ +Z5\x0admjo2I\x8d\xd3v\xae\xc9\xd5\xac\ +\x86]\xc0+x\xb9\x0d\xbai\x96\xf1n\xdc\x8b\xad\xf7\ +r\x0bn9\xd5P\x84\xf5\x8aW/\xc9-Cs\xb0\ +\x88\x98w?\xe8\xea\x97d\xef$\xfc\x11\xa3\x1b\xfe\x8b\ +\x18:\x9dv1+\xc5\x92\x0b\xe9\x93\xd6f\xd5\xb9\xa3\ +\xed\x91\xb9\x93\xca?\x96\xa9\xf0\x99Z_\xd2l[\xaf\ +Bbs\xd7X\x9bu\x84\xf3\xc2\x8bU\xc8\x0d\x0ev\ +\x80\x8a\xe3\xaf\x19\xd7\xcd\xaeh\x91\xf7\x0d\xe5\x9d\xfe\x93\ +\xfa\xb6+\xd1\xf8-\xf2W\x93YVso6\x9b\xbd\ +\xa2\x98\x93\xe9\xce$\xb6\xdfx\x9d\xdfg\xf5\x99X{\ +\x95o<\xf0<o\xf0\xeeQ\xfd\x8a\xa1\xbf\xb3Y\xc8\ +e\xfa\xfb\x0d5\xf4\xfb\x95\ +\x00\x00\x05\xa1\ +\x00\ +\x00\x17\xafx\xda\xd5\x18ko\xdb6\xf0{\x80\xfc\x07\ +B\xfdb\xa3\xb1d;\xdd\x03\xda\xda.u\x8b.@\ +\xba>\xdc\x0d\x03\x86}\xa0\xa5\x93\xcdU\x22U\x92N\ +\x1a\x18\xfe\xef;J\xa2-\xc9\x94\xe2\xac\xdd\x86\x12y\ +\x88\xc7\xbb\xe3\xbdyd\x10\x90\x99\xc8o%[\xae4\ +\x19\xcc\x86d:\x9e|Gf\x92eJpr1'\ +?2\x9e\x88\x9f\xa2\x12\xe0s\xf1\xe4\xf4$p\xd2\xbc\ +_\x01y\xabq%\xcb)\xbf%W:\xf6\x0b\xd4\xf9\ +\x9b\xe7\xbf\x8f\xaeX\x04\x5c\xc1\xe82\x06\xaeY\xc2@\ +\x86\xa4\x82\xbd\x83d\xf4V\x8f\x90.\x03\x191\x9a\x92\ +\xd7\xef\xc8\xb3\xf9\xf3\xd1\xf9h\x96\xd2\xb5\x82\xd3\x93\xd3\ +\x13\x96\xe5Bj\xe4\xff6K\x9b3\xff\x95\x88!U\ +d\xeaO\xa6\xf5\x955\x8b>\x18\xcaw\x10i\xca\x97\ +)\x90\xcd\xe9\x09\xc1\xc1\xe2\x90H!t9\xcb\xa5\xc8\ +A\xea[\xc2\xb8&4\xd2\xec\x1a\xde\xd0%\xcc\xc4\x9a\ +\xeb\x90\x8c\x0d\x07\x83\x16\x04\x99\xd9\x860E(I\x99\ +\xd2D$d\xe3q\x9a\x81\x17zJdP|\x9e\x11\ +o-S\x84$,\x850\x08\x02\xb3\x12 (\xc8(\ +\xda\x11\x81\xfe\xc7,\xf5\xb6\x96i\xb2\xe6\xb8%\x1a\x1a\ +\xd5\x8c\x89\x16\x84\xc6\xc5\xbfr\xb3\x8b\xa1\xf9\x06\xb4\xbf\ +\x8c\x80\xa8h\x05\x19\x90g\x05\x90\xa6\xa9\xb8A5}\ +\x09J\xa4\xd7\xf0\xabD\xd9\x90\x0d\xfe\xa3J\xb1%G\ +\x81\xb4\xb2\xd2G\x22\x15hp\xef\x01\x00x%h\xb7\ +3\xee\xf8\xe2\x13\xcd\xf2\x14\x06F\x853\x12\x83\x8a\xce\ +\x0c\xa7\xa1\xb5\x98\x19\xd9mag\x9f\xe69\xf0x`\ +U/I<C#Yn\x18za\xc9\xa04\x04\xfe\ +\xd9\x0eK.\xdb\xd6\xc6j%n\xec\xce\xed\xdd\xf2\xc2\ +\x05\xe8K\x8ej\xf8\x91\x04\xaa\xe1\xf5\xe2/t\xe5\xa0\ +\x5c\xe2\x1a\xed\x09\xf2\x8cl\x08\x94<\xd0\x02a\xa1\xff\ +v\xe8\x1b\xd6\x83\xfd\xb6\xd6\xdaE\x88F\x96\x96\xc8]\ +d\xac@\x82q\xad\xf5\xc2\x12\xa3\x00\xfd\xcc1@\x89\ +\x97\x00\xa4\x1e\xb9Y\x01\xdf\xf1\xd1\x92r\xc5\x8c\x16\x8c\ +/M\xe4\xa0C\xb8\x15\xc4/\xd1\x0e\xe2\xce\x0c\xca\xa3\ +\x95\x90\xca\xc7H@is*Q\xbd\xfd\xaau\xd3\x22\ +\xa5\xd1\x07\xcf\xcam\xc6\x15F\xdco\x0cn\xea\xbcl\ +,c\x8e W\x90\x06\xa7\xb9\x1a\xa5,\x0fQ\xd85\ +4\xe1\xe8GX\xa2EC2gF\xe2\xab\x8a\xc3\xf3\ +\x0a\xde\xda\xc4\x0c\x09\x1f\xd7L\xa2uv\xf9bL\x8d\ +\xbf\x87\xa8\x82\xcfR\xcc=\xa8\xd2\xcco\xfb\xb9I\xb1\ +mN\x8b\xc0\x0f\x0b}\x8bx#\x1bT\xb1\x8a\xbd\x16\ +j\xbf-\xcd\xc0\x9c\x5c\xa4F\x0e\x91\xd3\x88\xa1\xcc\x8f\ +\x1f\x93\x89?\xde#m[!r\xa9!\xab\x9b\xd8\x98\ +\xb7\x11o\xc7xr\xc7m\x17\xc0n\x96\xd5\xe2~\xc9\ +\x191u\x9a\xe3\xbc\xdb\xf0\xd0>9\x9aH7,\xd6\ +++\xb7_\xcc\x9a\x08+0\xd5}\x87QN\xc9\x88\ +,\xa8\xac&-i\xaa\xd8\xbdY1mk\x8c\x1d\xef\ +i\xfe3\xe5q\x8a9\xe7\x08\xad xA\xb5B\xcf\ +c\xf6\x11\xb8.\xebVO\x88\x5c\x09\x1a\x83t0J\ +D\xb4V.\x8b\x98\xa1\xc4\x1a\x8b\xe8N\x9f.\xbb\x1c\ +\x17X\xdbzn\x1e\x14\xb5\xc1\xd0\xa5\xa6Y\xb9\xe0,\ +\xf3\x95\xa6R\x0f\x86\xc7r\x84OL\xbb9\x9a\x95{\ +p|C%\x9e\x1a\x90\x1a\x12Z\xb0v\xf04\xa1f\ +%=\x5c\x9d\x17E\xfe\x22\xea\xa2.\xf4,p\xaa\xdc\ +o\x1d\xa8\x0f\x1f\x1e\xd2l\x0fA\xbf\xac\xb3\x05\xc8^\ +9\xcd@\xad\x97\xa0\xfb\x0a`;%0>\xabR\xe0\ +\xb9\x11\x13)\xb2\xb0Y#\x1a;\x0al\x09\xba\x16\xe3\ +\xb5,\xc4\x0d\xc97\xe3\xf1\xff\xae\xa7\x8ah\x0a_\xa3\ +\x96\x87\x85\xce\xa1\xdd\xa7^\xcdF\x86\x87\xab\xa854\ +\xbcK\xbf\xf3#\xf4kM\xe7xJ\x9a\xfe\x96\xde\x9d\ +d6y\xdbY\xfa%\xd2l4r\x0a~\x08<\xaa\ +$\xdc\xc3\x87\xf7\x8b\xd6{e\xe6\xde\xbb\x9d\xa1i=\ +;\xe9C\xb8\xc3\xbf\x1d1\xfc_\xd9\xa0/k\xbfJ\ +\x0btg\xf3\x91\x19]\xd3\xba_\xe7;\x93\xfe\x9f\xeb\ +\xbe\xfd\xdc$-D\xc3k\x91\x96\xe2\xb6}N\xf7W\ +\x95m\xe3\xee\xe4\xec\x10M5\xc1\xael\x0f\xb8f\x8a\ +a\xdf\x1bV=\x1cyR7\x9dmn\x16Bkc\ +\xd5\xaa\x1f*\xa7{\xb4\xde\xfe\xd0\xf6\x86\xae\xdacv\ +#O\xc9\xa31\xa9\xdd\x9e\xcdx\x06+z\xcd\x84\xc4\ +\xfb\x81\x15\xace\xb5#\xc2\xab\xc7\x7fM\xa3\x1d\xd1U\ +[-&\xeeF\xf6A\x14E\x9e\xfb\xc6\xa1E\xbe3\ +\x0d~\xbb\x91RH\xf6\xed\xb3\x99\xb8\xd1d\xa3\xcd\x96\ +\xcd\xc6\xfa\xcb(\x92$\xc9\xe7(\x82\x0b\xaf0\x9b\x19\ +?\xd8\xe1_Su)i\xcc\xc0<\xc0\xbc\xac\xbe\xda\ +:[\xf8\x1c\xa5#\x1b\x92\x8b\xf2:\x8e1G~h\ +>w\xb4\x93\xab\x93rR\xa74\xce\xef\x0c\xa9\xcb\x0c\ +\xa3\xdduI[P\xf3\xe6\xe4\xbavx\xcc\xd0\xa8\xc0\ +`\xf89_v8\xe4\x1a\xab!\xc33`\x86\x02\x9a\ +'\xb2\xcaVM\xf01\xa4\xaf\x93D\x99\xfa;\xfd,\ +\x8f\x99\x95\x9d\xef\xbfmW\xc1\xfek\x9d\xb1\x87\xdea\ +8n/\xf6r\xdeUE\x5c/\x0b\xef\xcd\xf3\x13\xd2\ +t\xd4\xdb\xc6]\xdd\x8fV,\x8dQ\xc3?\xdc`\xd4\ +\x8e/\xf5\x0a\xef\xb4\x93?\xfd\xf2\x96u\xdf~\xaf3\ +%\xebF\x8c\x0a\x87\x5crWx\xd4J\xed\xf9\xf7\x87\ +K6\xb3\xcf'\xdd\xec\xdd~\x1f9(\xaa\x06\xab\xee\ +\x16?\x97\xa0\xcc\xa3\xd7S\x0c\x7f\xe7\x11[/\xdb\xf6\ +\x19e\xd3.\xd5\x9bZa\x9e\x8c\xc7d\xeb8D\xef\ +\xce\xe9\xfb\xe5\xf6t:.\x86\xd7\xd5\xadt\xb3\xf1\xa7\ +uF\x93I\x0f#\x07h!dl\xc2\xa8\xa2\x8f\xa9\ +\xfc\x80\xba\xb9\xfaVZ\x5c\x05\x18U\x8c/\xbb\xde%\ +\x8c\x90\xe6\xd5\xe2\xd1\x11-\x00\xfe\xfc\x0d[\xcf\xd1\xfe\ +\ +\x00\x00\x0a\x95\ +/\ +/ Copyright (C) \ +2016 The Qt Comp\ +any Ltd.\x0d\x0a// SPD\ +X-License-Identi\ +fier: LicenseRef\ +-Qt-Commercial O\ +R BSD-3-Clause\x0d\x0a\ +\x0d\x0aimport QtQuick\ +\x0d\x0a\x0d\x0aItem {\x0d\x0a \ +id: slider\x0d\x0a \ +height: 26\x0d\x0a \ +// default drag \ +range is 180: di\ +visible by 2, 3,\ + 4, 5, 6, 9, 10,\ + ...\x0d\x0a width:\ + sliderName.widt\ +h + 223 + handle\ +.width / 2\x0d\x0a\x0d\x0a \ + property real \ +min: 0\x0d\x0a prop\ +erty real max: 1\ +\x0d\x0a property r\ +eal value: min +\ + (max - min) * d\ +ragHandler.value\ +\x0d\x0a property r\ +eal init: min+(m\ +ax-min)/2\x0d\x0a p\ +roperty string n\ +ame: \x22Slider\x22\x0d\x0a \ + property colo\ +r color: \x22#0066c\ +c\x22\x0d\x0a property\ + real minLabelWi\ +dth: 44\x0d\x0a\x0d\x0a D\ +ragHandler {\x0d\x0a \ + id: dragHa\ +ndler\x0d\x0a t\ +arget: handle\x0d\x0a \ + xAxis.min\ +imum: Math.round\ +(-handle.width /\ + 2 + 3)\x0d\x0a \ + xAxis.maximum: \ +Math.round(groov\ +e.width - handle\ +.width / 2 - 3)\x0d\ +\x0a propert\ +y real value: (h\ +andle.x - xAxis.\ +minimum) / (xAxi\ +s.maximum - xAxi\ +s.minimum)\x0d\x0a \ +}\x0d\x0a\x0d\x0a Compone\ +nt.onCompleted: \ +setValue(init)\x0d\x0a\ + function set\ +Value(v) {\x0d\x0a \ + if (min < ma\ +x) {\x0d\x0a \ + handle.x = Mat\ +h.round( v / (ma\ +x - min) *\x0d\x0a \ + \ + (dra\ +gHandler.xAxis.m\ +aximum - dragHan\ +dler.xAxis.minim\ +um)\x0d\x0a \ + \ + + dragHandl\ +er.xAxis.minimum\ +);\x0d\x0a// \ + console.log(na\ +me, v, \x22-> handl\ +e.x\x22, handle.x, \ +\x22from fraction\x22,\ + (v / (max - min\ +)),\x0d\x0a// \ + \x22of drag \ +range\x22, (dragHan\ +dler.xAxis.maxim\ +um - dragHandler\ +.xAxis.minimum),\ + \x22px\x22, min, \x22:\x22,\ + max)\x0d\x0a }\ +\x0d\x0a }\x0d\x0a Rec\ +tangle {\x0d\x0a \ + id:sliderName\x0d\ +\x0a anchors\ +.left: parent.le\ +ft\x0d\x0a anch\ +ors.leftMargin: \ +16\x0d\x0a heig\ +ht: childrenRect\ +.height\x0d\x0a \ + width: Math.max\ +(slider.minLabel\ +Width, childrenR\ +ect.width)\x0d\x0a \ + anchors.vert\ +icalCenter: pare\ +nt.verticalCente\ +r\x0d\x0a Text \ +{\x0d\x0a t\ +ext: slider.name\ + + \x22:\x22\x0d\x0a \ + font.pointSi\ +ze: 12\x0d\x0a \ + color: \x22#333\ +\x22\x0d\x0a }\x0d\x0a \ + }\x0d\x0a\x0d\x0a Recta\ +ngle {\x0d\x0a \ +id: groove\x0d\x0a \ + width: paren\ +t.width - 8 - sl\ +iderName.width\x0d\x0a\ + color: \x22\ +#eee\x22\x0d\x0a h\ +eight: 7\x0d\x0a \ + radius: 3\x0d\x0a \ + antialiasin\ +g: true\x0d\x0a \ + border.color: Q\ +t.darker(color, \ +1.2)\x0d\x0a an\ +chors.left: slid\ +erName.right\x0d\x0a \ + anchors.ri\ +ght: parent.righ\ +t\x0d\x0a ancho\ +rs.leftMargin: 1\ +0\x0d\x0a ancho\ +rs.rightMargin: \ +24\x0d\x0a anch\ +ors.verticalCent\ +er: parent.verti\ +calCenter\x0d\x0a\x0d\x0a \ + Rectangle {\ +\x0d\x0a he\ +ight: parent.hei\ +ght\x0d\x0a \ + anchors.left: p\ +arent.left\x0d\x0a \ + anchors.\ +right: handle.ho\ +rizontalCenter\x0d\x0a\ + colo\ +r: slider.color\x0d\ +\x0a rad\ +ius: 3\x0d\x0a \ + border.width\ +: 1\x0d\x0a \ + border.color: Q\ +t.darker(color, \ +1.3)\x0d\x0a \ + opacity: 0.8\x0d\x0a\ + }\x0d\x0a \ + Image {\x0d\x0a \ + id: hand\ +le\x0d\x0a \ +source: \x22images/\ +slider_handle.pn\ +g\x22\x0d\x0a \ +anchors.vertical\ +Center: parent.v\ +erticalCenter\x0d\x0a \ + }\x0d\x0a }\x0d\ +\x0a}\x0d\x0a\ +\x00\x00\x06\xed\ +/\ +/ Copyright (C) \ +2017 The Qt Comp\ +any Ltd.\x0d\x0a// SPD\ +X-License-Identi\ +fier: LicenseRef\ +-Qt-Commercial O\ +R BSD-3-Clause\x0d\x0a\ +\x0d\x0aimport QtQuick\ +\x0d\x0a\x0d\x0aListModel {\x0d\ +\x0a id: flickrI\ +mages\x0d\x0a prope\ +rty string tags \ +: \x22\x22\x0d\x0a readon\ +ly property stri\ +ng queryUrl : \x22h\ +ttp://api.flickr\ +.com/services/fe\ +eds/photos_publi\ +c.gne?\x22\x0d\x0a\x0d\x0a f\ +unction encodePa\ +rams(x) {\x0d\x0a \ + return encode\ +URIComponent(x.r\ +eplace(\x22 \x22,\x22,\x22))\ +;\x0d\x0a }\x0d\x0a fu\ +nction fetchImag\ +es(format) {\x0d\x0a \ + var reques\ +tURL = queryUrl \ ++ (tags ? \x22tags=\ +\x22+encodeParams(t\ +ags)+\x22&\x22 : \x22\x22) +\ + \x22format=\x22 + for\ +mat + \x22&nojsonca\ +llback=1\x22;\x0d\x0a \ + var xhr = ne\ +w XMLHttpRequest\ +;\x0d\x0a xhr.o\ +nreadystatechang\ +e = function() {\ +\x0d\x0a if\ + (xhr.readyState\ + === XMLHttpRequ\ +est.DONE) {\x0d\x0a\x0d\x0a \ + i\ +f (xhr.status !=\ += 200) {\x0d\x0a \ + co\ +nsole.log(\x22Faile\ +d to get images \ +from flickr. sta\ +tus code: \x22 + xh\ +r.status);\x0d\x0a \ + \ +return;\x0d\x0a \ + }\x0d\x0a\x0d\x0a \ + va\ +r jsonText = xhr\ +.responseText;\x0d\x0a\ + \ +var objArray = J\ +SON.parse(jsonTe\ +xt.replace(/\x5c'/g\ +,\x22'\x22))\x0d\x0a \ + if (objA\ +rray.errors !== \ +undefined)\x0d\x0a \ + \ +console.log(\x22Err\ +or fetching twee\ +ts: \x22 + objArray\ +.errors[0].messa\ +ge)\x0d\x0a \ + else {\x0d\x0a \ + \ + for (var key in\ + objArray.items)\ + {\x0d\x0a \ + var \ +rssItem = objArr\ +ay.items[key];\x0d\x0a\ + \ + var json\ +Object = \x22{ \x5c\x22ti\ +tle\x5c\x22: \x5c\x22\x22 + rss\ +Item.title +\x22\x5c\x22,\ +\x5c\x22media\x5c\x22: \x5c\x22\x22 +\ + rssItem.media.m\ + + \x22\x5c\x22, \x5c\x22thumbn\ +ail\x5c\x22: \x5c\x22\x22 + rss\ +Item.media.m.rep\ +lace(/\x5c_m\x5c.jpg/,\ +\x22_s.jpg\x22) +\x22\x5c\x22}\x22\ +\x0d\x0a \ + flickr\ +Images.append(JS\ +ON.parse(jsonObj\ +ect));\x0d\x0a \ + }\x0d\x0a \ + }\ +\x0d\x0a }\x0d\ +\x0a }\x0d\x0a \ + xhr.open(\x22GE\ +T\x22, requestURL, \ +true);\x0d\x0a \ +xhr.send();\x0d\x0a \ + }\x0d\x0a Componen\ +t.onCompleted: {\ +\x0d\x0a fetchI\ +mages(\x22json\x22);\x0d\x0a\ + }\x0d\x0a}\x0d\x0a\x0d\x0a\ +\x00\x00\x01C\ +m\ +odule shared\x0d\x0aBu\ +tton 2.0 Button.\ +qml\x0d\x0aCheckBox 2.\ +1 CheckBox.qml\x0d\x0a\ +FlickrRssModel 2\ +.0 FlickrRssMode\ +l.qml\x0d\x0aLabel 2.0\ + Label.qml\x0d\x0aLaun\ +cherList 2.0 Lau\ +ncherList.qml\x0d\x0aS\ +impleLauncherDel\ +egate 2.0 Simple\ +LauncherDelegate\ +.qml\x0d\x0aSlider 2.0\ + Slider.qml\x0d\x0aTab\ +Set 2.1 TabSet.q\ +ml\x0d\x0aTextField 2.\ +1 TextField.qml\x0d\ +\x0asingleton Image\ +s 2.2 Images.qml\ +\x0d\x0a\ +\x00\x00\x09\x1c\ +/\ +/ Copyright (C) \ +2017 The Qt Comp\ +any Ltd.\x0d\x0a// SPD\ +X-License-Identi\ +fier: LicenseRef\ +-Qt-Commercial O\ +R BSD-3-Clause\x0d\x0a\ +\x0d\x0aimport QtQuick\ +\x0d\x0aimport QtQuick\ +.Window 2.1\x0d\x0a\x0d\x0aI\ +tem {\x0d\x0a id: t\ +abWidget\x0d\x0a\x0d\x0a \ +// Setting the d\ +efault property \ +to stack.childre\ +n means any chil\ +d items\x0d\x0a // \ +of the TabWidget\ + are actually ad\ +ded to the 'stac\ +k' item's childr\ +en.\x0d\x0a // See \ +the \x22Property Bi\ +nding\x22\x0d\x0a // d\ +ocumentation for\ + details on defa\ +ult properties.\x0d\ +\x0a default pro\ +perty alias cont\ +ent: stack.child\ +ren\x0d\x0a\x0d\x0a prope\ +rty int current:\ + 0\x0d\x0a\x0d\x0a onCurr\ +entChanged: setZ\ +Orders()\x0d\x0a Co\ +mponent.onComple\ +ted: setZOrders(\ +)\x0d\x0a\x0d\x0a functio\ +n setZOrders() {\ +\x0d\x0a for (v\ +ar i = 0; i < st\ +ack.children.len\ +gth; ++i) {\x0d\x0a \ + stack.c\ +hildren[i].z = (\ +i == current ? 1\ + : 0)\x0d\x0a \ + stack.childre\ +n[i].enabled = (\ +i == current)\x0d\x0a \ + }\x0d\x0a }\x0d\ +\x0a\x0d\x0a Row {\x0d\x0a \ + id: header\ +\x0d\x0a\x0d\x0a Repe\ +ater {\x0d\x0a \ + model: stack\ +.children.length\ +\x0d\x0a de\ +legate: Rectangl\ +e {\x0d\x0a \ + required pr\ +operty int index\ +\x0d\x0a \ + width: tabWidg\ +et.width / stack\ +.children.length\ +\x0d\x0a \ + height: Math.m\ +ax(Screen.pixelD\ +ensity * 7, labe\ +l.implicitHeight\ + * 1.2)\x0d\x0a\x0d\x0a \ + Recta\ +ngle {\x0d\x0a \ + widt\ +h: parent.width;\ + height: 1\x0d\x0a \ + \ +anchors { bottom\ +: parent.bottom;\ + bottomMargin: 1\ + }\x0d\x0a \ + color: \x22\ +#acb2c2\x22\x0d\x0a \ + }\x0d\x0a \ + Bor\ +derImage {\x0d\x0a \ + \ +anchors { fill: \ +parent; leftMarg\ +in: 2; topMargin\ +: 5; rightMargin\ +: 1 }\x0d\x0a \ + borde\ +r { left: 7; rig\ +ht: 7 }\x0d\x0a \ + sou\ +rce: \x22images/tab\ +.png\x22\x0d\x0a \ + visib\ +le: tabWidget.cu\ +rrent == parent.\ +index\x0d\x0a \ + }\x0d\x0a \ + Text {\ +\x0d\x0a \ + id: label\x0d\ +\x0a \ + horizontalA\ +lignment: Qt.Ali\ +gnHCenter; verti\ +calAlignment: Qt\ +.AlignVCenter\x0d\x0a \ + \ + anchors.fill:\ + parent\x0d\x0a \ + tex\ +t: stack.childre\ +n[parent.index].\ +title\x0d\x0a \ + elide\ +: Text.ElideRigh\ +t\x0d\x0a \ + font.bold\ +: tabWidget.curr\ +ent == parent.in\ +dex\x0d\x0a \ + }\x0d\x0a \ + TapHandl\ +er {\x0d\x0a \ + onTapp\ +ed: tabWidget.cu\ +rrent = parent.i\ +ndex\x0d\x0a \ + }\x0d\x0a \ + }\x0d\x0a \ +}\x0d\x0a }\x0d\x0a\x0d\x0a \ +Item {\x0d\x0a \ +id: stack\x0d\x0a \ + width: tabWid\ +get.width\x0d\x0a \ + anchors.top: \ +header.bottom; a\ +nchors.bottom: t\ +abWidget.bottom\x0d\ +\x0a }\x0d\x0a}\x0d\x0a\ +\x00\x00\x02v\ +/\ +/ Copyright (C) \ +2021 The Qt Comp\ +any Ltd.\x0d\x0a// SPD\ +X-License-Identi\ +fier: LicenseRef\ +-Qt-Commercial O\ +R BSD-3-Clause\x0d\x0a\ +\x0d\x0apragma Singlet\ +on\x0d\x0aimport QtQml\ +\x0d\x0a\x0d\x0aQtObject {\x0d\x0a\ + readonly pro\ +perty url back: \ + Qt.resol\ +vedUrl(\x22images/b\ +ack.png\x22)\x0d\x0a r\ +eadonly property\ + url checkmark: \ + Qt.resolvedUr\ +l(\x22images/checkm\ +ark.png\x22)\x0d\x0a r\ +eadonly property\ + url next: \ + Qt.resolvedUr\ +l(\x22images/next.p\ +ng\x22)\x0d\x0a readon\ +ly property url \ +qtLogo: Qt\ +.resolvedUrl(\x22im\ +ages/qt-logo.png\ +\x22)\x0d\x0a readonly\ + property url sl\ +iderHandle: Qt.r\ +esolvedUrl(\x22imag\ +es/slider_handle\ +.png\x22)\x0d\x0a read\ +only property ur\ +l tab: \ +Qt.resolvedUrl(\x22\ +images/tab.png\x22)\ +\x0d\x0a}\x0d\x0a\ +\x00\x00\x05\xa1\ +/\ +/ Copyright (C) \ +2017 The Qt Comp\ +any Ltd.\x0d\x0a// SPD\ +X-License-Identi\ +fier: LicenseRef\ +-Qt-Commercial O\ +R BSD-3-Clause\x0d\x0a\ +\x0d\x0aimport QtQuick\ +\x0d\x0aimport QtQuick\ +.Window 2.1\x0d\x0a\x0d\x0aI\ +tem {\x0d\x0a id: c\ +ontainer\x0d\x0a\x0d\x0a \ +property alias t\ +ext: buttonLabel\ +.text\x0d\x0a prope\ +rty alias label:\ + buttonLabel\x0d\x0a \ + signal clicked\ +\x0d\x0a property a\ +lias containsMou\ +se: hoverHandler\ +.hovered\x0d\x0a pr\ +operty alias pre\ +ssed: tapHandler\ +.pressed\x0d\x0a im\ +plicitHeight: Ma\ +th.max(Screen.pi\ +xelDensity * 7, \ +buttonLabel.impl\ +icitHeight * 1.2\ +)\x0d\x0a implicitW\ +idth: Math.max(S\ +creen.pixelDensi\ +ty * 11, buttonL\ +abel.implicitWid\ +th * 1.3)\x0d\x0a h\ +eight: implicitH\ +eight\x0d\x0a width\ +: implicitWidth\x0d\ +\x0a\x0d\x0a SystemPal\ +ette { id: palet\ +te }\x0d\x0a\x0d\x0a Rect\ +angle {\x0d\x0a \ + id: frame\x0d\x0a \ + anchors.fill\ +: parent\x0d\x0a \ + color: palette\ +.button\x0d\x0a \ + gradient: Gradi\ +ent {\x0d\x0a \ + GradientStop \ +{ position: 0.0;\ + color: tapHandl\ +er.pressed ? Qt.\ +darker(palette.b\ +utton, 1.3) : pa\ +lette.button }\x0d\x0a\ + Grad\ +ientStop { posit\ +ion: 1.0; color:\ + Qt.darker(palet\ +te.button, 1.3) \ +}\x0d\x0a }\x0d\x0a \ + antialiasi\ +ng: true\x0d\x0a \ + radius: height\ + / 6\x0d\x0a bo\ +rder.color: Qt.d\ +arker(palette.bu\ +tton, 1.5)\x0d\x0a \ + border.width\ +: 1\x0d\x0a }\x0d\x0a\x0d\x0a \ + TapHandler {\x0d\x0a\ + id: tapH\ +andler\x0d\x0a \ +onTapped: contai\ +ner.clicked();\x0d\x0a\ + }\x0d\x0a Hover\ +Handler {\x0d\x0a \ + id: hoverHand\ +ler\x0d\x0a }\x0d\x0a\x0d\x0a \ + Text {\x0d\x0a \ + id: buttonLabe\ +l\x0d\x0a text:\ + container.text\x0d\ +\x0a color: \ +palette.buttonTe\ +xt\x0d\x0a anch\ +ors.centerIn: pa\ +rent\x0d\x0a }\x0d\x0a}\x0d\x0a\ +\ +\x00\x00\x03)\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00@\x00\x00\x00@\x08\x06\x00\x00\x00\xaaiq\xde\ +\x00\x00\x02\xf0IDATx\xda\xe5\x9b_h\xcda\ +\x18\xc7?\x9bm1\xab\x91\xc2\xd0Y+5\xbb`h\ +\xc9\x85\x0b7HJ\x93H))\xe5\xc2\xcd\xb0\x91R\ +\xdc(7\xbbP\xae\x88\x5cXI[v%\xc9\x9fb\ +.\xfc\xbd\xc0(\xffN\xc8\xc6\xd9p16\x8c9.\ +~?u\xac\xe3\x9c\xf3}\xb7\xc3\xfb{\xce\xb7\xde\xab\ +\xd3\xef=\xef\xe7y\xdf\xe7\xf7{\xde\xe7}^\xb0\xa7\ +\x12\xa0\x1aX\x03\xb4\x02W\x8080\x00\x0c\x03\x83@\ +w\xf8\xbb9m\x04n\x03\x9f\x80d\x96v\xc3\x12x\ +\x05p1\x07\xe8\xd4\xb6\xc2\x0a|5\xf0Z\x84?\x0f\ +L\xb0\x00_\x16\xfa\xb6\x02\xff\xde\xca\xccO\x04\xee\x89\ +\xf0\x1f\x81\x1a+\x068)\xc2'\x81uV\xe0\x0f8\ +\xc0\xef\xb6\x02\xbf\x0a\xf8.\xc2\xb7\x01\xc5\x16\xe0k\x80\ +!\x11\xfe!Pj\x01~*\xd0#\xc2\xf7\x02\x95V\ +\x96~\x9b\x08?b)\xd89\xec\xf0\xd2\xdbb\xe9\xa5\ +\xa7\xc2\x1f\xb3\x14\xec$D\xf8\xa7\xe1s&\xd4-\xc2\ +\x0f\x02\xe5\x85\xea\xf7?\x81\x95V\xe0\xeb\x1d\xfc\xbe\xd5\ +\x0a\xfcl\xe0\xb3\x08\x7f\xd6\x0a|)pI\x84\xef\x01\ +\xa6Y1@\x93\x83\xdf7X\x81_V\xc8\xdb\xdb\x0a\ +\xe0\xb9\x83\xdf\x17Y1\xc0\x09\x11>\x8e!m\x10\xe1\ +\x07\x809V\xe0g\x02}\xa2\x01\xb6Y\x9a\xfd\x0e\x87\ +\xcc\x8e\x19\xed\x13\xe1\xef[\xda\xe4\xd4\x91\xdb\xf1Uj\ +rc\x91\xa5\xd9\xbf.\xce\xfe&K\xf0\x07E\xf8\xd3\ +\x96\xbe\xf7\x0b\xd0R\xda\x09`J!/\xfd\x98%\xf8\ +\xfd\x22\xfc^K\xf0\x0d\xc07\xb4\xc3\x0cS\xba\x8av\ +\x82;\xd9\x12\xfc\x1e\xf1{\xdf\xe8\xcb\xc0g\x01k\x09\ +\x8e\xa1\xaf\x01G\x80*\xb1\x8fZ\xd1\xef;|\x00/\ +&8X\xe8O3\xc0w\xe2\xf2\xbc \xc0?\xc2\x83\ +\x13\xdc%\xc0\x87,\x03=\x9ac_\x8d\x02\xfcW\x1f\ +B\xdd\x96\xd0\x07\xb3\x0d\xf6Y\x98\xc1\xc9\xa4\x18AM\ +^\xae\x068\xf4\xbf\xe1\xeb\xc5\x08m^\x16\x17:'\ +\xf4u\xc7\x07\xbfW\x8f\x9e\x8fg\xe8k\xb9\x98\xdd\xf1\ +\xa2h\xe9.zF6\x9d\x8a\xc4\xa5\xdf\xe2\xcb'\xaf\ +\xdd\xc1\x00;\xd2\xf4\xa3$7;}\x0aV\x9a\x1c\x0c\ +p\x8b?ko\xe6\x0a\xef\x91^`\xbaO\x06X\xec\ +`\x80a`~J\x1f\x0f\x84g\xb7\xfa\x16\xaeV\x85\ +A\x8ej\x84\xc7\x0e.\xe4eb\xb3$\x5c\xd2\xc9<\ +\xb77\xc0$\x9f\xc0\x7f\x87\x9e?\x80\xcb\xff\xe0\xff\x9a\ +\x81/\xbe\xee\xdaj\xf3<\xfb\xedQ\xd8\xba\xbe\xca\x13\ +\xfc\x8b\x1c\xc2g/\xb4+O\x06\x88LZ;\x86^\ +\x88\x9c\xad\x9d\x89R\xf6\xa6\x1c\xfd\x12B\xa6\xf6\xd6w\ +\xe0\xd1\x09\x88!\xa0k\x1c\xfb\xdf\x19\xc5\x1c\xde\xc2q\ +\x9a\xfd.\x22\xac'c\x84\xef'\xe2\x15\x9b\xab\xc7\x00\ +?\x02l&\xe2*\x03^:\x1a\xe0f\x94@\xffv\ +yp\x04\x98AP\xba\xa6\xaa.\xdc)F^\x95\xe8\ +%\xab\xdb1\xa6\xa5\x02\xfc)\x8c\xdc\xcc\x1a\xad\xf5a\ +\xce0\x1efr\xfa\x08\xae\x9f&\x08.'t:\xba\ +\x8a\x17\xfa\x05\xc1\xf2\xa6\x01\x10\xe5*G\x00\x00\x00\x00\ +IEND\xaeB`\x82\ +\x00\x00\x015\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x1f\x08\x00\x00\x00\x00\xcb\xce\x12h\ +\x00\x00\x00\xfcIDAT(\x15\x05\xc1AjTa\ +\x10\x06\xc0\xea\x9e\x7fF\x12\x17\x22(\xe8\x01t#\xf1\ +\x12\x9e\xdc\xadk\x97\x0a\x0aB\x5cj\x22$\x99y\xaf\ +?\xabj\xeb\xbbo\x7f\x1f\x8e[e\xbd}\xf5&U\ +\xf3\xfd\xc7\xcd\xcbc\x0a\xbf\x7f\x9d>V\xfd\xf9\xf2i\ +{\x08\xb8:|}\xfe\xae\x7f~\xd8\xee\x0a\xd8\xee\xdf\ +\xdfN\xff{vn@\xf4<\xae\xfb\xeb\xc7\x9e\x80\xbd\ +\xfa\xf2\xd4\xe7\x95\x00Fm\xb3ZK\x81\xe9\x9a\xee\xde\ +;\x80JJ\xc7\x000\x95\x85t\x80\x99\xb2jT\x88\ +\xa8\xb2[\x95)AIfY\x22\x22\xe8\x12\x0bB)\ +\xfb!,\x12\x80$\x96\x1a*%\xe20\x16Q#J\ +\xd2m\x91\xda+\x85\xba\xecc\xc5t\x22\xe8\xde\x97%\ +\x00b\xc6\x22\x09P\x11-\x00Bi\x00D\xd3I\x12\ +\x01I,\x92\x10\xa8\xa2\x8bD\x00t\x0e\xba\x04\xb2\x1d\ +j\xfa\xf0\x94\xcbX\xe0x\xc9iM\x9f\xe6\x9cKc\ +j{\xfd\xb9\xce\xe7\xdb\xab\x9a\x14\xb6\xd3\x8b\xe3\xf1?\ +V\x8e\x9e\xad\xee\x91\x1e\xc8\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x066\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0d\x00\x00\x00\x17\x08\x06\x00\x00\x00\xd0\xa6\xc5\x81\ +\x00\x00\x00\x19tEXtSoftware\ +\x00Adobe ImageRead\ +yq\xc9e<\x00\x00\x03$iTXtXML\ +:com.adobe.xmp\x00\x00\ +\x00\x00\x00<?xpacket beg\ +in=\x22\xef\xbb\xbf\x22 id=\x22W5M\ +0MpCehiHzreSzNTc\ +zkc9d\x22?> <x:xmpm\ +eta xmlns:x=\x22ado\ +be:ns:meta/\x22 x:x\ +mptk=\x22Adobe XMP \ +Core 5.3-c011 66\ +.145661, 2012/02\ +/06-14:56:27 \ + \x22> <rdf:RDF \ +xmlns:rdf=\x22http:\ +//www.w3.org/199\ +9/02/22-rdf-synt\ +ax-ns#\x22> <rdf:De\ +scription rdf:ab\ +out=\x22\x22 xmlns:xmp\ +=\x22http://ns.adob\ +e.com/xap/1.0/\x22 \ +xmlns:xmpMM=\x22htt\ +p://ns.adobe.com\ +/xap/1.0/mm/\x22 xm\ +lns:stRef=\x22http:\ +//ns.adobe.com/x\ +ap/1.0/sType/Res\ +ourceRef#\x22 xmp:C\ +reatorTool=\x22Adob\ +e Photoshop CS6 \ +(Macintosh)\x22 xmp\ +MM:InstanceID=\x22x\ +mp.iid:DCE827695\ +74811E2B0EE92BEE\ +27047DB\x22 xmpMM:D\ +ocumentID=\x22xmp.d\ +id:DCE8276A57481\ +1E2B0EE92BEE2704\ +7DB\x22> <xmpMM:Der\ +ivedFrom stRef:i\ +nstanceID=\x22xmp.i\ +id:DCE8276757481\ +1E2B0EE92BEE2704\ +7DB\x22 stRef:docum\ +entID=\x22xmp.did:D\ +CE82768574811E2B\ +0EE92BEE27047DB\x22\ +/> </rdf:Descrip\ +tion> </rdf:RDF>\ + </x:xmpmeta> <?\ +xpacket end=\x22r\x22?\ +>\x97\xa0=\xd8\x00\x00\x02\xa8IDATx\xda\x8c\ +\x94_HSQ\x1c\xc7\xcf\xbd\xbb\xd7;\xb7\xdd\xddQ\ +\x90\xbe\x0cb\x9b\x93\xd4\xf5\x10\xc1\x0a\xf4\xc5)\xd8\x1f\ +)Fd\xd4C\xeaK\xe4CB\xf6\x98\xb4\xb5\xad=\ +\xc8\xe8\xc9\xf5\x1e\xf4\x92\xd2\x96E\xeb!Y\x96\xc5\x94\ +\xc2\x94\x05\xb2\xf9\x10H\xed\xa1\x8767\xc1\xfd\xf3\xf6\ +=\xd7ML\x97z\xe0\xcb\xdd\xef\xdc}8\xbf\xf3\xfd\ +\x9es\x19Y\x96\xc9A\xc3j\xb5\x0ep\x1c\xf7\x98\xc8\ +r\xa1P,\xde`\x0e\x82\xdaZ[\xefiu\xba1\ +\xb5 \x90r\xb9Lr\xeb\xeb1n?\xc0f\xb3\xb9\ +\x0c\x06\xc3\x03Q\xaf'u<O\x0a\x85\x02\x11Eq\ +\xb5&d6\x99\x18\xadV;\x06`D\x02\xa0\xd1h\ +\x94\xf9c\x0d\x0d?\xfc~\xff\xcc\x1e\xc8l6\xabt\ +:\xdd\xb8$I\xb7 R__O\x18\x86!\x8d\x8d\ +\x8d\x09\xaf\xcf7\xb1g%\xcb\x16\xf0\xd4 I\xd7\xf5\ +U\x00\xf3F\xa3\xf1\xbb\xc7\xeb\x0d\xa1^A\xf9v\x1b\ +\xb2X,u:Q\x9c\x04\xd0\xabGK\xea\x0a`2\ +\x99\xbe=\xf4x\xa6x\x9e_F9\x09\x15\xb9\x0a\xa0\ +\xc1\xb2/\x01t)\x80ZM\xa8\xa7\xd6\xe6\xe6y\xb7\ +\xdb\x1daY6\x8e2\x04\x95\xe9\xff\x19\xb4$\x01x\ +-\x19\x0c\xedzQ\xdc\x06N\xdal\xb3\xf7GG\xa7\ +\xf1s\x01z\x05mV\xbb\xe2\x90\xc1sl\xb8]\xaa\ +\xae\x80\xdc\xce\xd8\xed\xd3wGFf\xf1~\x1e\x8a@\ +\xff\x84\xc9\xc1\xdaN\xecE\xb1\x95\xba\x84\xf6V\xef\x0c\ +\x0f\x7f\xc2;\x0a\xbd\xab\x15\x09\xdb\xda\xd2\xf2\x91\xe78\ +\x82\xbe\x95\x89T*e\xbc\xd6\xd7w\x16'\xe1\xfd\xff\ +Bg\xc7\x83\xc1\x0f8[\x0b\xa5RI\x99P\xa9T\ +$\x9dNw\xd7\x09\xc2\x0b\xeahM\x08V~y\xe4\ +\xf7O\xc1\xa99\x0a\xa2&h\x99`\x8f\xbd0(\xd2\ +\x04gwC\xf4\xc0\xd2\xbe.B\xa7|^o\xe7\xe2\ +\xd2R\x07\xcd'\x9f\xcf\x93\xcc\xda\x1a\xc9\xa4\xd3\x9f\xb3\ +\xb9\xdc\xf9d2\x99\xd9\x09)O\xa8\x07\xb2\x07\x02\x81\ +\xf6\xb9X\xccA\xf7\xb8\xb1\xb1A\xd6\x00\xa63\x99\xaf\ +\xb9\x5c\xee\x5c\x22\x91\xf8\xbd\x13\xaa\x0e\x07\xd4\xf1$\x18\ +<\x1d\x8dF/( V\xccf\xb3t\x9fq<{\ +\x00\xfe\xdc}`i\x98\xf9\xdbCC4\xb3\xe2\x9bH\ +\xe4\x12\xee\x11\xc3l\xb5\xd2\x06\xcd\xc04G\xad\xabA\ +\xf3\xc9\x0f\x0c\x0eR\xb0\x10\x0e\x87\xaf\x08\x82\xc0\xd2\x0c\ +\xd1\x93yS\x96C*\x97\xcbU\xcb\xd5_\xd0\x1f\x5c\ +\xc2\xa3\x88 \x15\x8f\xc7O\xe0\xc9\x22}\xb2Y.\x1f\ +a\xf7\xb9\xb8\x8b\xd0\x84\xd3\xe9\x5c\xbe\xd9\xdf\xff\x0c\xdf\ +\x88\x0c\x96+uuw\x87\x99C|X\x9a\xa0\xab\x10\ +_\xa9K\x87\x81\xe88\x0e]\x86\xb4\xf4<\xfe\x15`\ +\x00\x07\x7f\xeb\x18\x9af\x83_\x00\x00\x00\x00IEN\ +D\xaeB`\x82\ +\x00\x00\x05[\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x12\x00\x00\x00\x1f\x08\x06\x00\x00\x00\xeaP\x9d\x89\ +\x00\x00\x00\x19tEXtSoftware\ +\x00Adobe ImageRead\ +yq\xc9e<\x00\x00\x03$iTXtXML\ +:com.adobe.xmp\x00\x00\ +\x00\x00\x00<?xpacket beg\ +in=\x22\xef\xbb\xbf\x22 id=\x22W5M\ +0MpCehiHzreSzNTc\ +zkc9d\x22?> <x:xmpm\ +eta xmlns:x=\x22ado\ +be:ns:meta/\x22 x:x\ +mptk=\x22Adobe XMP \ +Core 5.3-c011 66\ +.145661, 2012/02\ +/06-14:56:27 \ + \x22> <rdf:RDF \ +xmlns:rdf=\x22http:\ +//www.w3.org/199\ +9/02/22-rdf-synt\ +ax-ns#\x22> <rdf:De\ +scription rdf:ab\ +out=\x22\x22 xmlns:xmp\ +=\x22http://ns.adob\ +e.com/xap/1.0/\x22 \ +xmlns:xmpMM=\x22htt\ +p://ns.adobe.com\ +/xap/1.0/mm/\x22 xm\ +lns:stRef=\x22http:\ +//ns.adobe.com/x\ +ap/1.0/sType/Res\ +ourceRef#\x22 xmp:C\ +reatorTool=\x22Adob\ +e Photoshop CS6 \ +(Macintosh)\x22 xmp\ +MM:InstanceID=\x22x\ +mp.iid:DCE827655\ +74811E2B0EE92BEE\ +27047DB\x22 xmpMM:D\ +ocumentID=\x22xmp.d\ +id:DCE8276657481\ +1E2B0EE92BEE2704\ +7DB\x22> <xmpMM:Der\ +ivedFrom stRef:i\ +nstanceID=\x22xmp.i\ +id:DCE8276357481\ +1E2B0EE92BEE2704\ +7DB\x22 stRef:docum\ +entID=\x22xmp.did:D\ +CE82764574811E2B\ +0EE92BEE27047DB\x22\ +/> </rdf:Descrip\ +tion> </rdf:RDF>\ + </x:xmpmeta> <?\ +xpacket end=\x22r\x22?\ +>\xd9\x0c\xdf\xc0\x00\x00\x01\xcdIDATx\xda\xac\ +\x95;K\x03A\x14\x857\x994\xdaF1>@\xc5\ +\x88A\x8c,*\x16b#XZ\x08\x06\x04\x0b\xa3\xad\ +\x85\x9d`\x13\x0b\x1bm,5\x8d\x88\x89\xd8(B4\ +>@B\x88\x16\x16\x22b:\xff\x86 X\x04]\xcf\ +\x95+\x84e\xe6\xee\xaef\xe0\xec\xcc\xee\x1c\xbey\xec\ +\xbd3\x91\xa5t\xba\xd9\xb2\xac\x03h\x0ez\x832\x87\ +\xb9\x5c\xd6\x0aX\xc2\xd0\x064\x0fE\xa0(\xb4\x07\xf8\ +\xfa_@\xe3\x9a\xef[\x80e\x82\x82\x1e\x0d}\x9b\x80\ +m\xfb\x05)\xdb\xb6\x1fPO@\xbd\x9a\xfeI\xf47\ +\xbdT\xab%/P\x88\x1e\xbc\xe1\x97\xd0\x94\xc1\xb7\x03\ +\xad\xe1'8\xc6\x19\xd1\x03#\xd60\xf2\xa903\xfa\ +\xde\x06\xcf5\xbcf\x90\x0b6\x0c\x0dh\xbcc\x12L\ +\xd5\xbf0\xec\x0cM[\x80\xb5\xc3s\x03\xafc\x041\ +\xec\xd3\x036\x0a\xc5\xe19\xaf\x87)\xddz\xeb`q\ +(\xa9\xb1$\xdd0e\xfa\x0b\x0c+x\xc0\xfa\xe1)\ +\x927\xe4\x15\x1f\x08\x0d\x1a,\x0f-\x18,E(\xa5\ +\xbc@4uZ\x02\x9a1\xde\x1fw\xa1}\x8c)?\ +\xe1\xcf\xb0+4;\xa1\x11\xdd2\xc3\x01\xf22\xca1\ +\xa6+\xef!?\x04\xecS+\xaa24d\xb0\xac\xa8\ +\x06@V\x91\x83\xbb\xca\x03\xd2\x81\xaa$\xcd\x84 b\ +\x1c\x01\xd2\x85\xea\x0eJ\x08\x90\xac\x18\xd9\x0c\xa9@}\ +\x9a\xee/h\x19\x90}1\xd7\x00\xe9\xe1=1A\x16\ +\x019\x12\xb3\x1f\x10J\x87{\xa8[\x80\x1c\x8b\xe7\x11\ +C*\x1ct\xeeR\xa3\x9b\x06\x90\x13\xf1\x84\x04$\xc1\ +\xcb1AR\x80\x14\xc4\xc3\x1f\x90A^NL\x80\x5c\ +x\xc5\x1b]\x8a\xb4q-\x9a\xbe\x0fh\x16\x90[?\ +\xd1\x1f1$!Af\x00)\x07\xb9 \x9f\xff\x0b\xf9\ +\x05\xd1\x81\xf5\xc4\xef\xaf\xd0tP\xc8\xcf\x05\xe98\x8e\ +\xd5\x88\xf2-\xc0\x00\xaa\xfa\xae\x1fG|9m\x00\x00\ +\x00\x00IEND\xaeB`\x82\ +\x00\x00\x03w\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x1b\x00\x00\x00\x1c\x08\x06\x00\x00\x00\x90\xd1\xc4\xed\ +\x00\x00\x00\x09pHYs\x00\x00\x0b\x13\x00\x00\x0b\x13\ +\x01\x00\x9a\x9c\x18\x00\x00\x03)IDATH\x0d\xbd\ +V=LZQ\x14\x06\xa4\xd1PE\x03\x14\x08\x83\xc8\ +fL\xd3\x10\x93\x06\x97\xa6\xdd\xbb3th\x8c\xa1\x1b\ +\x9d\x18\xbauaj\x22k'6\x17\x87v\xec\xd6\xa5\ +\x1b.\x84\x04\x02&\x18\x15\x02\x89\xd2\x8a\xfc$\xb6D\ +y\xaf\xdfw\xfb\xde\xf5\xf9\xfa\xe4\xa76\x9e\xe4\xe4\xde\ +\xc7\xbd\xdf\xf9\xee\xf9\xdey\xe7bWU\xd5v_\xe6\ +\xb8/\x22\xf28'%\xb3\xc3\xb4\xbd\xfah\x84\x0ay\ +\xa0\xd2H\x99\xecc\xd6m\x1a\x09\x09\x8cn$\xe2\x9c\ +$\xd2o#\x1dI\x06\x22\xcaL\x12\xf3\xa8\x13K\x02\ +\xecQ4B1\x82\x90\xe3\x0d\xb3\x94\xd1\x90\x0dI\xe8\ +3\xf0\xd9\x85\x85\x85@\x22\x91x\xbe\xbc\xbc\xbc\xb6\xb8\ +\xb8\xf8\xa8\xdb\xed~\xaf\xd7\xeb\xe5l6\xfb\xad\xdf\xef\ +\x9fb\xcf\x00>\x84+\x9a\xeaL\xf2ZZ\xce\xcd\x8e\ +\xcd$\xe0Af\xe1\x0f\xa3\xd1\xe8\xd3\x9d\x9d\x9dO\xd5\ +j\xf5\xe7\xd9\xd9\x99z~~\xae\xb6\xdbm1\xf2\x99\ +\xbfs=\x16\x8b=\xe1~\x0dG\xbc\xc3\x18{\x1c\xd1\ +<2y]\xa9T\xba$h6\x9b\xea\xe1\xe1!\x83\ +K\xe73\x7f\xe7z\xa9T\xea\xc6\xe3\xf17 \x99\xb7\ +\x22\xbc\xf1\xce4\xf9t\xd9\x1e\x00\xf8j{{\xfb#\ +\xe4s\x22\x03q0\x04\xb14\xca\xe6\xf7\xfbm \xbd\ +L\xa7\xd3\x09H\xfb\x19\x1b/\xe1BVd\xa8\x9a\xc9\ +t\x22'\xa4{\xbc\xbb\xbb\xfb5\x14\x0a\xb9OO\xf9\ +:&3\x9f\xcfg;99\xe9mnn>\xdb\xdb\ +\xdb\xab\x02u\x05\x1f\x82Kapa\x86\xa2`\xa5\xcd\ +\xa6R\xa9w\x81@\xc0\xddj\xb5\xb4\x1d\x93\x0dT \ +\x18\x0c\xba\x93\xc9\xe4{\xc6\x81\x8b\xcae|I\xa6\x85\ +\x12e\xce\xaa\xdb\xd8\xd8xyqq1R:+z\ +\x16\x04q\xc43\x0e\xf6\x90\x83q\xc5\x84#M\x9c\x80\ +\xe3\xd6\xd6\xd6\x0b\x8f\xc737\x18\xb0\x92\xa77\xe2\x88\ +g\x1c\xa0e\x5csf\x8cl\x8fD\x22\xab\x0e\x87\xc3\ +6\x1c\xf2\xddNo\xc4\x11\x1f\x0e\x87\xd7\x80&\x990\ +K2\xb7\xdb\xed\xa7\x1cw1\xe2\x97\x96\x96|\x881\ +\x92L\xed\xf5z-\x96\xf2]\x8c\xf8N\xa7\xf3\x031\ +\xe4\xa9\xad2S\x8f\x8e\x8e\xf6\x15E\xb1\xcd\xcc\xb0K\ +Mo\xc4\x11_\xab\xd5\xca@K2\xf9\x9d\xb14\xb1\ +\xc0\xe8NTQ8\x9f\xcf\x17\x5c.\xd7\x1c+kZ\ +\x03\x8e\x15\xf9k}}=\x8a\x9eY\x03^|k\xe6\ +\xccx\x0a\x85M5\x97\xcb}!hZ9\xb9\x9f8\ +\xe2\xb5\xe6\xac\xdf\x06\xd7\xa5\x8f\x17J\x22\xdd\x07\x99L\ +\xe6\x03;\x81\xd7\xeb\x9d*1\xb6\xacF\xa3\xd1'\x1e\ +@~;\x22&\xe3[f\x86\x0d\xc3B\xa1P\x06\xe0\ +-Nw\x85N26Cf\xc4V\x85\xa2\xb8Bo\ +L\x11\xcf8p\x99\xd9\xd8\xae\xcf.^,\x16{\x93\ +t\xfd\x83\x83\x83\x0eo\x09\x10Xv\xfd\xbf\xc8\xfe\xa8\ +\xf9o\xf7\x19\xef=\x10\xddz\x9f\xc9j\xc4&i\x90\ +\x84\x95I\xa7\xcc\xf4\x1b7\xf5\xca\xca\xca*\xfb\x1e\x0b\ +\xe0\xf8\xf8x\xdf\xea\xa6\x06F\xc8\xc7w\x85\xb90K\ +2\xb9\xf8\x9f\xff\x83\x8c$#\xa9!K=[\x8ef\ +\xd3\xabXV\x9ey\x03\x9f\xc7\x92\xe9 \x8dT`\xf4\ +\xdf\x0c\xa3\x90\xca(\x99aMN'&\x93\x88;L\ +~\x03}U80w\xf4\xee\xee\x00\x00\x00\x00IE\ +ND\xaeB`\x82\ +\x00\x005\x1c\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x01\x00\x00\x00\x01\x00\x08\x03\x00\x00\x00k\xacXT\ +\x00\x00\x18\x8azTXtRaw prof\ +ile type exif\x00\x00x\ +\xda\xd5\x9bYv\xdc\xb8\x96E\xff1\x8a\x1a\x02\xfaf\ +8h\xd7\xaa\x19\xd4\xf0k\x1f0\xa4\xb4l\xcb\x96^\ +~=+\x1d!\x07\x19$p\x9b\xd3\x00L\xb3\xff\xef\ +\x7f\x8f\xf9\x1f\xfe\x14\xe7\xac\x89\xa9\xd4\xdcr\xb6\xfc\x89\ +-6\xdf\xf9\xa5\xda\xe7O\xbf\xaf\xce\xc6\xfb\xfa\xf6\xc7\ +\xbd^?|n\xde\x7f\xf5\xbc\x07\xde\xc3s\xa0\xe6\xd7\ +\xb7\xde>w\x1f.c]\xe7\xb7\xf4\xc3\x85\xea|\x1d\ +\x18\x1f\x0f\xb4\xf8\xbc\xfb\xfa\xd3\x85^7\x0a\x1a\x91\xe7\ +\x97\xf5\xbaP{](\xf8\xe7\x80{]\xa0?\xd3\xb2\ +\xb9\xd5\xf2\xe3\x14\xc6~\xde\xd7\xdbD\xeb\xf3\xd7\xe8\xa5\ +\x8e\xe7>.\xbd\x8e\xfd\xf4\xefX\x88\xdeJ\xdc'x\ +\xbf\x83\x0b\x96\xd7\x10^\x03\x08\xfa\x1bL\xe8\xfc\x12x\ +\xf5!r\xa2\xe3\xa7\x87x_]x\x8b\x09\x01\xf9]\ +\x9c\xde\xff4Ft4\xd4\xf8\xdb\x93\xbe\x94\xad\xb7\xdf\ +\xcc\xcf\xd9\x8a\xfeuJ\xf8)\xc8\xf9\xfd\xfd\xb7\x9f\x1b\ +\xe2\xf0\xdb\xac\xdc\xd0\xffp\xe7X\xdf\xcb\xe4\xc3\xe7\xa5\ +\xb8\xfeVG\x1f\xa2\xaf\xbf\xe7\xacz\xee\x9c\x99E\x8f\ +\x99P\xe7\xd7\xa4\xde\xa3\xa6_8op\x0b\xdd\xba\x1a\ +\x86\x96m\xe1o\xe2\x12\xe5\xfe4~*U=)\x85\ +e\xa7\x1d\xfcL\xd7\x9c'\xfa\xc7E\xb7\x5cw\xc7\xed\ +\xfb>\xddd\x88\xd1o\xe3\x0b\xbfx?}\xb8\x1f\xd6\ +P|\xf33(\x7fQ?\xee\xf8\x12ZX\xa1\x92\xd7\ +y\xd3\x1e\x83\x7f\x1f\x8b\xbb\xb7mv\x9a{\xb7\xca\x9d\ +\x97\xe3T\xef\xb8\x98\xe3+\xdf\xfe1\xdf\xfd\xc29j\ +\x05\xda\xbd\xbe\xc7\x8aqy\xaf`3\x0ceN\xaf\x9c\ +FF\xdcy\x055\xdd\x00\xbf\xfd\xfc\xfcGy\x0dd\ +0)\xcaj\x91F`\xc7s\x89\x91\xdc?H\x10n\ +\xa2\x03'&\xde\x9f\x1ete\xbd.@\x88\xb8ub\ +0tCtd\xcd\x85\xe4\xb2\xb3\xc5{\x00\x8a@V\ +\x12\xd4\x19\xbazf\x90\x01\x97\x92_\x0c\xd2\xc7\x102\ +\xb9\xa9^\xb7\xe6+\xc5\xddS}\xf2|l\xf8\x1c0\ +#\x13)\xe4P\xc8M\x0b\x9dd\xc5\x98\xa8\x9f\x12+\ +5\xd4SH1\xa5\x94SI5\xb5\xd4s\xc81\xa7\ +\x9cs\xc9\x02\xc5^B\x89\xa6\xa4\x92K)\xb5\xb4\xd2\ +k\xa8\xb1\xa6\x9ak\xa9\xb5\xb6\xda\x9bo\x01\xd0L-\ +\xb7\xd2jk\xadw\xee\xd9\xb9r\xe7\xdb\x9d\x13z\x1f\ +~\x84\x11G2#\x8f2\xeah\xa3O\xcag\xc6\x99\ +f\x9ee\xd6\xd9f_~\x85\x05~\xac\xbc\xca\xaa\xab\ +\xad\xbe\xdd\xa6\x94v\xdci\xe7]v\xddm\xf7C\xa9\ +\x9d`N<\xe9\xe4SN=\xed\xf4\xf7\xac\xbd\xd2\xfa\ +\xcb\xcf7\xb2\xe6^Y\xf37S:\xb1\xbcg\x8dO\ +Ky\xbb\x84\x13\x9c$\xe5\x8c\x84y\x13\x1d\x19/J\ +\x01\x05\xed\x953[]\x8c^\x99S\xcel\x03\xfeB\ +\xf2\x0c2)g\xcb)cd0n\xe7\xd3qo\xb9\ +3\xfe\xc9\xa82\xf7\xaf\xf2fJ\xfc\x907\xff\x9ff\ +\xce(u\xdf\xcc\xdc\xafy\xfb]\xd6\x96\xf0n\xde\x8c\ +=]\xa8\xa0\xda@\xf7q|\xd7\xeek\x17\xd9\xfd\xf2\ +n>;\xf0\xdd\xf7\xff\x9a\x0b\x8dQ\x8e]g\x862\ +\xd6*!.\xe0\x83\xec\x12M[{\x14\xa4\x86\x98\xc6\ +\xea1\x9d}\xb2\xd8\xd6\x80\xc6\xab\xf4\xc3\xc1P\x00\xbf\ +\xb2\x09\xec\xc8\x87Z\x99yPn\xa7S\x8b+\x9f<\ +w8\xbcw\xa8\xfa\xec}:\xaf\xfe\xf4\xb2\xf6I\x8d\ +s\xe9~\xbf\xba\x0f\xbb\x9c\xe0\xe7Z+\xb42\xa8\x81\ +\xb1R\xde\xe7\x08\xe0\xe7\xd0\xfbv\xf1\xe8}\xc5R\xf4\ +\xeeS8g@\xec\xe79b~=t\x92U\xcd1\ +\xee1\xda\x8e\xe5\xe4\xb1\x19m\xd39\x96\xa9D*W\ +\xbfO\xdf\xee\xa5{\xe5\x8e\xdb\xc4\xce\xa7\x99\xfa>\x1f\ +\x0f\xbc>O\xbb\xbb\x98\xdc^>\xad\xc9\xa4\xe9\xaeq\ +\xe69\x15\x16\xf0w\xb0w@\x12\x11\xcf\x80\xeep\xe8\ +\xfe\xf7\xb1R\x80?\x1f\xb9C\xad'7\xbf\xb7\xa3r\ +O]\x87\x90L\x02\xd9\x9c\xd9\xe9~\xc9\xf6;\xdc\xdd\ +\xc3\x8dH\xd3\xe8\xe8\x07h\xe5\x93#\xb4Yr\xb1\x8c\ +\xd8\x00\x96\xb3\x97)3\x9f\xc3(@\xa4Yi\x1a\x9d\ +\x5c5\x08\xde\x93[\xc0T\xbb\xe3\xdbs\xd7?\x1c\x1b\ +fE*\xe7\x89l\xfd1\xae\xefQ\xbd\xa1c\xcc7\ +t|)>#\xfc'\xac\xcf1\xf3\xf1\xe0g\xb1e\ +$\xfef\xf6\xd3b0\x1f\xab\xe1\x93b\xf8,\xc2\x0a\ +\xb0\x8a\x82q \xfdn\x14\xdb3\xc8W|\xef\xa1_\ +\x8e\xfc\x1c\xdf\x1b^A\x8c\x02l\x9e\x083\xcf\xfa\xa4\ +\xf9\xdc(Rn\x8a\xe3\x13\xe1O\x8e\x8c\x0f\xe15_\ +\xab\xdb\xbf\x97\xad\xf9Z\xdd\xfe\xbdl\xcd\xd7\xea\xf6\xef\ +ek\xbeV\xb7\x7f/[\xf3\xb5\xba\xfd{\xd9\x9a\xaf\ +\xd5\xed\xdf\xcb\xd6|\xac\xdb\x9d-h\x99\xe1\xe7S5\ +\xa5\xb1\x138\xd9\xa7 \xb5\x8e\x19\x80\xd7\x11\xee\xd8\xd3\ +\xd8u\xea*\xbc\x87S\x87\xd9\xed\x94\xfa\x1f|Q\xdf\ +\x1b+\xe7\xbe{\x8a\xbbVsR\x09i\xae\xd2\xf2!\ +\x0e\xc2\xefq\x96\xb4!cO\xb5\x1d\x982\xea\x1f\xf6\ +/\xef\xc6~\xf1\xc4\x7fy\xa1\x04\xa1\xe7\x05?\x8c\x98\ +\x97\xdf\x85\xec\xed9\x08\xa9Ksd4B\xf3\xf1z\ +\xd0b\x90\x1b\xd1\x9e\xb8s\x05\xf0]\xf1\x99\xd7\xb5\x9a\ +_\x9b\x9f\x91\xdb\xca\x5c\x06\xc5\x10\xf9\xfe\x1aS\x84\xb0\ +\xd6\xc0\x19S\xd2\xb0\x5c\x18\xad\x1f8'\x9b\xb0\xfd\x9c\ +\xc9\x8d\xd9\x5c\xa6\xae\xe1\xa5\x1cjB\x9bT\xac\x0a\x8a\ +f\x17\x8bb\xf2\x16\xd9\xc1\xeb\x09\xb3n>th\x96\ +\xb6}\x1c\xeb\xb8\x901P\xdbt\x94\xc9\xac\x0d\xb5&\ +\xa5F\xd2\x90a\xbb\xc7S\xc2\xc2l\xc9\xd8\x85\x94\x8f\ +\xa3\x14{;\x09\x19\xc6l\xda\xf4\xbe\xa7D\x9e\x18\x9b\ +\x7f\xa0\x04\x18\xd9$\xacL(\xd3\x93b\xe4\x98\x1b\xc9\ +\x97\x9aCs\x08\xdflc\xaa\x93\xd1\xb7+N\xc7\xa0\ +N\x0e$\x9e\xda\x85\x14z\x8a\xb2\xbft\x14\x1d\xf5\x7f\ +\xfb\xcc\xaa\x90\xe1i\x8f\x0a\x82p\xa9\xdc\x19\x0b\x88I\ +\x8d\xe2\x9c\x18\xa8\x8fh4\xea\x9d\xc1\xa1\xa7\x96\xcd'\ +]\x8f\xa3\x82w\x04{\xaf03\xfa\xd9\x0f\xdf\xa2B\ +5\x5c\xc9\xc4\xad\xe4\xeds\x0b\x93\xab\xc0\xf8;\xe6R\ +\xb9;G%5f\xa5\xfcOl\x9dz\xedg\x88\xd7\ +\xea\xe8\xa9\xcc\xd4\xc6\xaa\x05\xf1\xd9\xfb\xaa\xb3(\xc2\xb9\ +\xb7\x86Qa2\x0e\xe9<\xa3\xe3\xcb\x04\xce\x06\x92\x82\ +\xe0\xab\xad\x13\x81Vb;\xe8\xe4h\xe8\x07\xbf\xd1\x1e\ +\xd1\x8eV\xaa;D\x09\xcf\x9f\x8bW+x\x8bxe\ +(\x03\x1c\xd9+\x85\xd5\xd2^s\x033\xc3%\xce\x9c\ +\x13\xc38c\x5c\xa3\x19'\xec\x09\xc2\xb9\xecC\xc7\x0a\ +9\xdfs\xdb\xb34$\xedl\xb9\xa6\x14\xd1(\x07m\ +$\xbc+\xd8Y\xc4*\xf58\x0f_\x9b(&\xb2\x84\ +\x801\xbeSv\x8e\x8a\xf5I\xd7\xb7\x01_u\x16\x02\ +\x95\xf4\xee\xb4\xecA\x87#\x84)\xaf>7\xdfF\x90\ +\x0f\xf0$\xe6L1\xa1\xb4\xebK\x9c\x99\x89!F\xdf\ +\xd6SQ\xbe\x83VV\xdc\xe3(\x0c\x07\xda\x18c\xe4\ +:\x171u\xb1\xa2\xcfq\x12\xfb\x14\x8a\x14N\xd96\ +\x15W\xde\x8a\xc0\x8c\x9b\xfa_\x8b\x00\xdd\xbf\x06\xc8\xb0\ +\xfa$c\x94\x16\xff\xd5\x15\x93\x8f\x8c\x0e%\x18Si\ +\x93Z\xe0{\xfd\xd6Q\x22\xbe(\xba\xc1T\xd7$\x90\ +\x13{\x9eK;\x88y\xc5\xf5\xa0\xf8H\x8e0\xc8\x0b\ +\xf2zm2h\x0e\xb5\xee\x87\xdd\x94\x00\xa5\xe9\x11w\ +\x06P\xf7\xa3^\xf8\x89\x951\xf7;g\xfb\xf5\xf7\xe3\ +\x08{;\xa6_\xb0\xc7\x9aP\x8e`\x9d\xf3\x99\xb1\xc1\ +h\x80\xdf\x22\x9e\xd8\x19ej\xba\xd5\x03\xe3\x02@p\ +5\xa5/\xd2\xb1&\xa6\x0a5:\x17h\xeeL\x83\x88\ +\xa8+\x82l\x99n\xc5\x99\xb5Y\xc6q\xe9\x84\xac\xb9\ +\xce\x01K`\x8e\x16Q\x1e;7R\x12\xe9B\xee\x0d\ +~\xce\x16\xaa\x9b:\xdc\x0dL\x805\x0a\x8c\xa22\xe7\ +^RZ\x09\xc2)4R\xc6Y\x95\x13\x09-\x99J\ +\x8b\xa8\x12\x9c\xe1\xea(t1 P*\xdekS\x13\ +eXw\xf5\xd1\xcaN\xf0\xd6;\xe5\xba\x86\x94z\xf4\ +\xc8\x84v\xec\xf6k\xcd~\x9d\x13m\xd2I\x88{\xf8\ +\x14#\x07X\xd0>m\xd8\xc2t\x86AWK\x0b3\ +\x87\xe0\x00\x9c\xd4\x03|XJ\xf7\x9e\x91\x04\x8a\x99\xda\ +\xee\xb8@+h\xc5\x0f\x14\x1b\x89L\x1a-Y\xd4x\ +.\xb6Q\xc582S\x99\x8eZ\xbc\xe0f\xc9\x1c\x97\ +\xf3Q\xcb\x0b\xb38\xb2\x92\xb8\x84\xd3\x12P\xc1\xd2\x12\ +\xdb\x88\x11\xe0\x1aX\x83\x02\xb4\xe6N\x22\xf0\x84\x07\x7f\ +iZ\xc8\xd0\x0ee\xc7\x8c\xa9\xb2U\xb8\x10U\x05\x9a\ +\xa5](\x1e\xea%$J\x17g\x89\x8b\x83\xb0}q\ +\x9b\xd7\x1be\x97\x06\x9e\x84A\xd5f\xb8i[\xa1\xd0\ +f\x05\x87\x0a\xe3V\xa2\xe1\x1d7$\xaa\xccx\x8c\x9e\ +W\x00\x82g\x0c\x80\xe6T\x83\xa3(`\xe3-\x10]\ +\xd3\xeeLk5C^G\xa4\x91\xc9V\xe0\xee`\x0a\ +}a\xd1\x144Z\xb5\xb1\x12\xf7\x10\xd6t\x88\x85Q\ +U\x14*\x9cA\xc0\x8a\xb2>\xe2n\xc3\x13\xc6e:\ +\x97-\x1e\x99Z\xb5\x9e\xd2T\x15.-h\xa0PB\ +)\xec\x19<\xd3\x1e3\xa5P\xc8\x06\x08r\xb0\xbbS\ +\xab.\x8b\xacP\x03\x85\xfe\x1d\xd9\x0cn9\xc5\x14\x90\ +\xbc\xbf\x8c\xe0f.4\xd1\x14\xa2-\x01\xec\xd4H0\ +\xf0\x89\x0c\x88\x86\xfc\x8c{\x00\xe0h\x12\xe6\x16w\x0c\ +\x80\x8f\xa9\x90U\xd1\x90A8B9U\xc3\xfe\x02A\ +\xd1w\x98\xedB\xc4\xe1\xc4\x01\xe2\x025V\xb2\x8e\xd2\ +\xe1~\xd5\xcb\xc11H\x90\xb0wC\xf6=g\xd4\x12\ +\xb7s\x9d\xc1&\xe9\xc3q:\xad?\x1eW=\xe3i\ +\x0c\x85\xf0z4\xd0\xacX9n\x04\xf9\x028\x1d\xfc\ +\xa1\x96\x88\x11~\x93B@&\x82\xfa\x85+\xd0>\x87\ +y\x94\xbe\x9d\x1f\xd4:\xba1`\x18=\xe4U@F\ +2/Jr\xb7\xd5[\x9dw\xf9\xef\xe2\xd1\xa2\xa2\xb6\ +z\xe3\xcaM\xfb(\xca\x1c\xaeD\xcd\xe8\xa1\x93!\x19\ +\x14%\xd5\xa6\x12,\xe4\xeb\xcatZ80\xd0\x1d_\ +Xk\xe0\xe0\xf5]\x10\x0a\x8c\xbaBv\x95F;\x16\ +\x90\x80\x13\xcdD\x8ePBP\x00\xa0\x9e\x8b\x93\xe4\xb2\ +\x05\xdaJ)\xc1N\x09\x84\xec\xda\x16`X +b\ +F\x08\x9e\xaeJA\xa3\x14q\x13\x15{\x1a\xd2oh\ +\xe5F\x18\xd4\x1a\xae\x99\xd8\xb5\xa0f\xf1 D;9\ +q\x1f\x0a{zJ\xb1\xf0\x0d>\xd3\xb2\xcfD.\xc5\ +\x15\xe9\x9e\x01$\xd6Fe\xe78jC\x84 \xa1 \ +\x07\xce\xa1\x99\xcf@&\x9c\xd8\x85\xbf\xb4;H\x16c\ +\x1d\x14X%\x9a4w\xb6\x9e\xfa\xb5\xb7\x8fa\x93\xb6\ +-\x05\x09R#F2\xc4=\x93gZ\x1d\xccm\xe8\ +3-$1.j\xc5\xceNz\xa0\x94q\xb4\x8a\x04\ +\xab\x13\xd7\xedmo\xf4\xbe\xa5\xbe\x80\xbf\xf1\x18?\xf7\ +\x0a\xfd\xd4\x92\xcd\x0f\xb8~\x13\x0b\xbfC\x88\xdc{\x07\ +\xdb$6\x98\xda\x96\x06B\xe3u4\x95\xe4X\x0a\xa8\ +Z\x98\xaaA\xa7+\x81\xd4\x94\x8c*\xa1\x1c\x07\xc0\xf3\ +\xeb\xb8\x5cC\x9f\xb9\x10!\xa2\x09\xef\x00^\x9d\x92\x91\ +Pd\xd4~\x12\xe8\xb3\xc8\x1a\x818k\x87\x95\xe1y\ +\x11\x85G\x05\x80\x1c\xcc\x02\x05t\x02\xec\x07\x02T\xe8\ +\x10\xa0\x93\x96k\xd0m(\xb4\xbc\x1a\x88\x99\xddD8\ +o\x0d\xb4\x89\x09r\xb4\x04G\xc1\xc9[\x96so\xd8\ +\xf5*>\x07Z2\x80\x81\xa4\x88\xa2\x0d\x10\xc9:\x8c\ +\x15\x84\xd0\x22\xf2-g\x14+\xfdf\xe6!\xca\xb3\x8b\ +\xe5bG\xec\xc3s\xe8\x05\xfa7\xa9F>\xca\xbb_\ +\x89]\xea\xea\x00\x8cg\x1b:uq\x03\xb8\xaf\x91\x05\ +\x8c\x94\x1f2\x9f9\xc1\x194\xee\xd1\xa2\x22\xect\xc6\ +\xc4\xca\xe5-6\x99]\x0c\xc6\xb7\x0a\xe2\x03\x01\x0a\x9e\ +\x94aZ\xb3~\xdfh\xd4\x04\xf0\x80\xd9-\xa0\x9b\xe8\ +\xa3\x15i\xaf\xb5V\xd5\xdf\x08\xad\x80\x8b\x09\xa1\xd8\xa3\ +\x1f\x12\xcf\xcb5\x00\x87\xeeF\xfalm\xb0\xa4dS\ +&T\x01q\x05]\xc3x\x09exEF\xdcwJ\ +\x99)\xc1l\xf9\x84 \xabJ\xfd\xb6\x80\x1cG\xd7\xa9\ +\x99@\x83\xd0\x87Qt_Ax\x0f\xc1\xe3\xd3&p\ +\xb5\x1a\x93)o\x8e\x0d\xbd\xd70@\xa8\xad\x22\x9f\x0a\ +U\xdd\x1eX\x01J1\xb3D\xa6\x011\x12\x99\x98G\ +\xe2\x82\xdd\xc2X\xdc\x00>{\xad:\xc07\x13,\x9a\ +\x81\xc4\xca\xe7\xa1~\xdcO\x030?\x8e` 9\xa6\ +\x05\x0d\x91\x02\xa5\x86\x002n\xf1\xa7GP\x12\xe3\xb5\ +\xa4\xb2R\xa3\xd8\xe8\xb6\x00\xff\x85\x85j\xab7\x8ff\ +\xc2\x7f\xfd\x0e|Y\xa7\xc5]]\x92\xc3\xcfz\x04\x84\ +\xcd}`\x1d\x12\x873\x86\xe0\x10\xbf\x04\xba\xfa\x0c\xcc\ +\x07:\x87\x86\x01\xf4\xe8~Wa\x890AW\xe6\xaf\ +\xe5\xd6\x18@\x9d\xadM\x9f\x956\xce\x83qRjc\ +h\xeb\xecv\xe1p\xb7\x9a\x7fZ(4\x9f-->\ +\x0b\x1dU\xb1\x08\xf6\x82\xeb\xb8\xaf\x07N\x1cS\xda\x91\ +*\x0c@\xf3\x9cdr/\xc5\x08\x0f\x81k\xb1}7\ +2)\xac_R\xb9|\xa9x\xf8\x89\x0b\xe1\xab!\x81\ +\xbb\x84\x01\xf0\xe1\xd4)\xa6\x9b\x86\xda\x0b\xb6\x84\xbf\x16\ +O[_\xcb<\x04\xb8\xdd\xb0e\xd8\xe4DI\xbe\x81\ +\xf5\x00\x7f\x90\x11\x93\xc9\xdf8\xc2\x0b\x08\xf7$Y\xf4\ +\xcc3@\x99\xfa\xd5\xbc\x90\xe7O\x13\x811)\xea\x0f\ +\x13y\xcdc0\x05\xc7\x10\xfc\xec\x06\xb2<\xd9\x1d\xdc\ +@k\x1b\xe0\x04E\xe6ky\x83\x06\x8f\xeb\xb9(\x1f\ +t\xdf6v\x05{\x8eP\xd1:E=X\x02\xf1Z\ +zx\x0d\xf1\x94\xb8\xe1v\xf0-u\x8f\x11[\x9d\x1b\ +\xd5\xbbZ\xc1\xe4\xaeGV9\xf2S?\xa7S\x03\x9f\ +\x22\xfe+lw\xa8\xa8t\x83\xb8T\x83\x00\x02\x82t\ +\xa2USd\x0chR<2\xd3\xda-\x0a\xf2\xe2\x91\ +\xa9\xb96\x14\x91\x02f\xe7\xab.e\x11\xdeBa\xef\ +\xe1\x89&!\x0eU/\xf1\xae\x09!\x16\xd0\x154Z\ +\x9ew\xc2K\xe8\xe2\x09\xc9]m\xd0ffi\xfd\xbb\ +\x8b\x06Z\xa1\x99\x99[\xb6\xaa`\x0c-\xd6-\xb4\xb5\ +\xa2\xac\xfe\x83\x1eV\xf7yY\xc1|\xed\x1b\x17\xb5\xb7\ +`\x08D\xdfj\xfd\xda\xe4Kq\xd6\x80\x0f\xba\x08\x8a\ +\x8eT\x03\x95W\x0c\xb6\x15\xd5\x851\xe5\x1f$\xf7\x93\ +\x9c\xdc\x94 Jh0a\xf2e\xa3\x04\xd5\xe0ya\ +V\x00a\x1a\x04\xbd@\xb1\xda\x82\xe0\x0c#Udh\ +'\xf5\xd2h\x89\x92\xc6\x15 \xf5\xb4\x08\x8er\x14\xdf\ +\x9f\xfeV\x8b\xda\xdc|'Ask\xf1V\xa2\x8c=\ +cP%*\xfco\x95\xd8\xc6\xf6\xda\x04\xa1\x87\x0b\x16\ +\xces>\xcatZ\xb4\xeb\xc1\x1bb\x06*\xd2\x91^\ +\x93\x13*\x94\x0e\x94\x81\xcf\x97zgJN\xae]\xe0\ +\x86\x22jW\xcd\x7f\xdak\xdcd\x003\xe8l4\x22\ +r\x99QY\xc1\x16B\x19,\x81\x96\x98,\xd8N$\ +\x91$@\xa3\xd8\x94\x5cM\xd4_\x1fS\xfb\xf6\xc5.\ +$\xf4\x9eO\xa7\xa2\xd8\x1e\xa1\xb8\x11/6j\x1d\xf2\ +\x8f\xc5)jT\x81\xe1%\x9f4\x10\x9ag\x85}I\ +.\xc36\xbb\x03\x19\xa0\x07\x83\x19j\x13/\x1dt\x19\ +R\xab\xb6W\x0b^%\x08:<Z\xf0\x96\xd2?Z\ +\xd2\xbc\x89\xc97-\x89\xa5\xc0Y\xe2i\xd7\x03*\x1a\ +;\xa9j\xaf\xfct1\xe0\xef\xc0\xd0\xfci\x03F\x0b\ +\xa3\x85\xa8#\xdep)#E>\x07\xa3k\xc4\xab\xe1\ +o\x90WZ\x82\xe1\xac(YSW\xa9\x80\xfd\x0a\x08\ +\x0cl\x16&\x0d\xc1\xd5=ra0\xc8\xa2*\x83\x0d\ +h\xb6X\xae\xb0G\x19\xd0\x0c\xb1\xf5\xb8/:\x16\x0a\ +\xa4jWt\x22\xaf`\x81\x00\xb3k5v]\x1b\xc3\ +\xb7\x06\xa2\xa07\x81\x167Ar\xad\x94\x00\x8d\xce\xe0\ +\x08a81&\x84 \x0a\xd36\xfcA\xcd&\xd2N\ +\xf85m\xc2#I\x82\x97n\xd1B\x18\xb6{7\xcf\ +8\x91\x9bE\xb5\x88)\x18\x9b\xae[\xcb\xc6-\x91\x80\ +\x81\xd3Z\x1a\xe4\x94\xa3\xdb\x06|=\xe8\x15\xc4I\xef\ +\x97\x19p\xe0uh\xaf\x89b`\x1c'\xb6-\xc7H\ ++;\xf2\x82m\xda\xc8l-\xb7\x04ms\xeaz'\ +\x92I\xc3\xd7;\xbe\x0f;4\xb4|\x02\xb7U\x89\x0d\ +ej\x95\xdd\x9feda$\x9a\xba\xbe\x16\x1a\xac\xf8\ +\x15H\x8e\xc8\xbbp\xc4\x84\xb9\x18\xd0\x14O\x80\x08b\ +\x02\x03\xfds\xd0\xb1Yf:x\xc4H\xb1J=\xe2\ +\xba\x82m\xd4\x22*\xb0bz\xec\xdeb\xf4\xc9\xbd\x91\ +\x9ah\xca\xe4\xcdjz\x1c ]\x1esx'=\xae\ +@\xc3\xa3\xe0#\x8d\x93\x94Q\x92\xac5\x84\xcd\x99D\ +1\x90\x1e\xa0\x1c\xdb\xab-\xcb\xc7\xc7\xe0}\x88\x117\ +\x06\xe9\x88\xaf\x9a\x15?\xae\x95%\xf4\x8fv\xdb\xda|\ +\xd9\x9b\xa4\x85#.\xb5\x04s\x82\xc01\x1d~\xcc\xaa\ +Xd\xe8\xacC\xf9\xa3\xc2\xa4\x08\x98\x06\x9a.\xa2\xbf\ +m\x90\x1b\x8c\x1e\x81\x05\xf3n4\x0f\x86\xb7\xfb\x82\x1a\ ++\xa0$l\x89\x03\xd5\xc6\xed\xe9M\xcfR\xdc\x10\xa2\ +j)^\x12\xf1\xa1\x17\x9fN|\xda0\xa0U\xc2\xa7\ +\x96\xaf\xa4\x95\xb4\x15\xe2\x0c\xc5\xd9\x04g=QdA\ +\xf9\xff\x8cEd\xfejt\xc09v*\xe1\x00v\xa7\ +\x84\xee\x964n\xc4\xc4\x0ar\xdcu_\xc0\xec\xdc\xec\ +\xf8\x7f\x98\xa7\xdc\x9d\xc7\x0f\xbcsi\xa7\xfeB/\xe6\ +o\xfc#\x90E#\x0f\x10\x8d\xe2s\xe0S\xe7\xe2\x99\ +\x86\x92\xc5*Q\xe5\x80ro\xc0\xc8\x96\x88\xc74Q\ +\xa5J\xba\xc5?,O\xf7\xd3\xad\xa9a\x91+\x05\x01\ +\xe2V\xb4i\xefQ\xb5\xcfP\xe5\x82\xa4\x0c\xa8,b\ +\xdf,\x1a2\x00T]\x126\x07OK\xc6\x11\xa8\x0b\ +,\xfc\xa1[\x8bl\xbd\xe0}\x07\xad\xfa\xc2\xa4q \ +MI\xefq\xf8\x84E_\xd6IJqr\x06\xd7\xc5\ +\xd9\xce\xa1\xcbK\x9c9\xa2\xf2\xdc\xc1R\xe2\xdeh\xfc\ +\x08Zw\x10\x8e\x82\xc4h\x8dN_$\xbbr\x9f\x88\ +\x19\xa1/\x0d\xa1=\xaa:\xa7\xa1'0HT\x9cu\ +\xa32\x82\xa1Up\xac\xd4\x8e\x5c\xf8d\xb1/}\x9b\ +\x89\xee\xa2\xf0\x0e\xe8\xa2\xb5A\xcc\xf5@\xb1W\x00O\ +\x0bE8,\xe3\xf6\x12\xf9\xe2\x15A\x0aOk\xf6\x81\ +1\xe5\x18\x22\xa5\xaevTwR\x5c9<;9#\ +\xf4\x0b\xcd\x90\xc9\x15\xe3L\x18\xc9u7|\xab\x9e\x17\ +\xa0\x8d\xb5\x0c\xb6\x19\x04S_Z\x98w\x8b\xfc,|\ +\x858\xb4\xc1]Y52\x22\xf81\xddlZ\xb3\xef\ +NK\xe6w\xc1\xcal_k\xcd\x00~\xac\x085j\ +na4\xee\xce\x81t@\x19\xaf\x9d\x83\x15\x92\xd6\xd8\ +\x9e\x9d\x03\xd4\x95\x96\x9b,\x83\xa3\xaa\xb4\xbac!H\ +J\x04\x98\xddx\xd1\xdc\x18\x82VS*\x91Dqp\ +\xe7\xeeI#\xf3\xe8\xb6j\x1dkg\x9aV\xad\x83<\ +\xc1\x9e\xc8\x91\xca\xd3\x8e\x16\xb1\xa2U\x8fgH\x81P\ +\xeb\x05\xcb\x12\xa1\xe3\x0d \xb9\xcd\x84]E\xde\xe0^\ +<\xfeeG\x8a\xed\xc0\xfa[\xf2\x12\x0a\xb1\xb02\x11\ +F\xe0\x80\xfb\x86\xe1j5\xa8j\x91\x19\x09T\x05\x22\ +\xf4z\xadc\x11bY\xba\x0d\xdf'\x89\xa56Gk\ +\x22w\xeav\x0b\xc3F\xd7\xf8\xf0\x03\xf6\xf2\x1a\xc9\x93\ +\x92\xc6gxd)\x81\x90|\xa0\x88z\xce\xae\x12~\ +\x8c\xdfP\xd5d\x0b\xca\xe8\xd1\x80\x84\x0c\xe1\x12]\xcb\ +B\xa0\x86\xe7\x15`\xab5\x90\x0a\xf47\xe7\xa9\x99!\ +\x89\xfb\xf8\x01\xb1Gw\xce\xcdD\xb4\xe5\x02ZQX\ +\xb2g@c\x09Ryw\x9d\xad\xa1\x7f\x82\x9e\x821\ +\xe8|-r\xd9\xd7>\xdf$\xa6\xf1.\x8d\x00b9\ +l!\xc3\x8cZ +\x87\xbbPM-<\xe2^\xab\ +dwq\x90\x89/\x7f\xcc^\xd4\x1fc*\x996\xa2\ +\x9b\xa5e\x9cx\xa6\xea\xec\xa0\xcdI\xd9\xa7\xdd\x8a\xa3\ +=:x8c\xcdi\xd0\x1b\xa9Y\xfam\xd3\xcaH\ +\x22\xa3\xf83\x10\x18`\xe1\xccP>\xbd\xf6\x0e.D\ +<\xe6\x08\xa8\xa3\x82\x80\xc6j\xef\x8c\x99O\xe1>r\ +\xe7\xf2\xd4J\xb94\xde\xbe\xde\x1c\x0c7\xda\x05\xc6Q\ +\xf6\xb5\x1c4Z\xb5i\xe7\xb3\x05\x14W\x22\xe7\x84\x98\ +P\x83\xeb\xd2\x85tURU\xc3\xc9\x95\x9a\x1d \x15\ +\xce0\xabk\x11ZC\x22U\x9a3\x83\x9a\xfb8 \ +\x98a`\xb6r\xbfe\xa3uen\xa5us.!\ +QA\x07B\xbe-\x06+l\xd6\xca\xf9\x86\x15L\xb8\ +P\x98\xc1\x87\xfd\x0f\x8f~\xf5\x9d\x8b\xe8\xe9M\x9a6\ +\x99\x5ca*\xe4\xeb\x94[\x95Q\xe8=\xc7\x88\x9c\xa4\ +\xa6%2urh\x22N\x0b.\x80\xbeA\x0f\x01Q\ +%D0P\xb6p/\x8e\x0e\x11\xd16\xaa\xdb\xeb\x89\ +\x15R\xc6I\xbaW\xb7\x1d\x08\xe4\x03\x88r\x03\xfa]\ +\xfb\xc6\x7f\xdcc\xc7\x1d!\x05IOw\xadg\xbf5\ +\xa0|\xb8t9\x8a\xc3\x9f\xf6\xaf)\xc6:0g{\ +j\xf5|Y\x83\xd6\xd6\xbc6zZ6$\xa5\xd1\xf0\ +\xe1 \x22\x93\xc9 \x08\xcd\xb9\xa7E\xfc/\xd0\x11\xf3\ +Z\xb4\x0e\x1c1\xdf^\xf0\x08\xbd\xb5\xe42mdH\ +4\xba\xc6\xce\x9am\x91\xc2:Q+\xaf\xa8\x5c\xa4\xc3\ +a\xaa\x89le\xb2N\xf5\xee\x96\xaf\x1b\x9c\x93\xa2\x1f\ +@o\x04{\xb4\x83C\xdf\x1c\x83\xa8\x99q\x11B\xba\ +'\x22\xd2\xc5\x04\xd3YZK\xff\xa9\xc3\x98\xa1C\xd7\ +9\x8f\x8f\xa6\xcc\x88\x18J\xa7\xa2\xa0\x8e\xd7b\xa6\x05\ +\xd0g\xf3\x06v\xa17%\xda\xe8N\xb4C\x9e\xb4X\ +R\xff\xa1\xb9\x91s\xa8\x16\xa4\x02\xc4\xd1\xf0M\x0d\xc9\ +\x00\x9fP\xe2X\xd4.gQ\xa3D\x0f\xb6\x02\xe3\xb7\ +\xa1.\xbe\x06\xd8p\x87\xa2\x87\x13\xdbD\xd0u\x9ai\ +\xab?\xb5;K\x0dc9\xa2\xd6\x18\xc7\x09\xb4\x1c\x8a\ +\x82\xf2\x86n\xa5\x9d+4d\x9c\x96\xeaH\xed\xd4\xc6\ +\x8ev\xba\x06\xcd\x1f\xe2\x0e\xa0\x9e l\x06\xe2\x86U\ +m3\xf4\x80(\xd5\xda\xf1k\xd1\x16\x1cs\xe4\x99\xee\ +\x07\xad\x0d\xa4\x97GM\xf6\xee\xac!5'~\xe0\xee\ +\x5c\xa1\x99\xb7\x9eD%l\xd8G\x8a\xaf\x93\x17O?\ +-=\xc9\xe6D\xf8\x98\x80$\xc6r[\x0f\xc4\xb5\x83\ +X\xc3Thu\x1cq?\x1a4\xd9\xb4\x12xwZ\ +\xd1\xd8\xc0$*\x1fo\xae\x0d\xa0O\x9f\x042\xf7\xa9\ +\xa5\xf3<\xb5DG\x87,\xf9C\xbe\xdf\x9e\xaa\x80\x5c\ +\xc0\x97\x16\xd0\xbb\xd22D\xdd\xc1QQl+\x19\xed\ +}\x13\xdb\xfaf,n\x0fL\xca\x03\x06\xf3\xdaaA\ +o\xf9q\xd7\xb6BVL\xab6?I\xc5Xw\x15\ +\xd3\x92\x8a\xe1\xc0%Z\x0f\xf8f\x06\xb4\x17i7h\ +\x06l\x11|\x90\x226\xe2\xb5f\x0b\x9b~h\xf5\x80\ +\xd0\x04\xb8\xb3G\xdd\xe9\xb9\xc1}\xb7$6\x83\xd2\x83\ +\xe1\xbbSBf\xea\xd9\xf2\xf5\x1f>3\x80\xf2\x22\xe5\ +GOS\x1a=\xfcB}\xc0E(\x12\x04s^-\ +k\xdfjC\xca\xa1\xae\xd9\xe5\xb2\xbd*\x1e\xb8\xd3\x7f\ +\x90\x22\x10p\xe2Y\x04s\xc8\x01\xc48\xf22\xb4\xa5\ +\x9eu\xa4\xae\xf4\x08Kn\xc8\xf9\xb1\x93Oz\x18\x19\ +}#\xa7G\xebo\x22\x03\x80`\xeb\xb5.<\x22\xaa\ +a\xa7\x94s\xa1\xc0\xc0Vj\xd7\xa4\x8eo`jE\ +a\x86\xac\x91\x08\x1b\x00\x0d\xd4\x11BY\x9b+\xc8\x0d\ +4\x88\x5c\x0d\x15\x88\xc0@*\xe89\xc7\xa0\x07\x04N\ +\x81\x17\x81=Oe\xa3\x08\xe1\xd65igl4\xc6\ +S\xef\x03\xb6\x05O\xc8\xc0b\x5c\x11\x8d\x94\x11\x0c\x07\ +\xd3\xe8\x1e\x19\x16z\xd3F\xac\xb6\xd8P#\xb833\ +\xd0\xa1\x8dXh\xe3\xc6\xa3\x06b\xd3\x86O_\xafe\ +=\xadQ|\xe5\xd1\xc1f\x9a\xa7, \x9a\x80\xd5A\ +qi\x9f\xaf\xe9\xc9\xcfp\xf7\xf9\xa0\xa4\x93U\x04\x91\ +\x1a\xc2c0Cq\xfe\xddF@\xf2R\x96\xdaF\xa0\ +\xff\xf1\xfd\xf5\xaemR\x1a\x5c\x04\xd69 UM2\ +Q\x05\xb5+\xd7A\x84\x10LL4\x92+\x87\x05\xbf\ +\xbb\x15J\xbb\x9bX[\x04\xc5\xca\x0eU\x8b\x1d\x06\xfa\ +\x98\x5c\xc3~\x96_\xbe\x01S\x03>zp#\xd1\x8d\ +\xda\x0fh\xe90\xf8\x94\xd5\xf7\xf86I\x0eZ\xd5\x88\ +\x8b\x8e6\x97\xee^\xf2\xb9j\x13\x91-\xad)\xe3_\ +\x9e\x85\xe8\x83\x16\x0a\x0fWk\x99WL\x9d\x9fU\xad\ +\xf1P\x837\xf4)2\xe3>G\xb5\xf5\xfc*\xff8\ +J\x9e\xb6\xcf\xab\x8c\xbf\xd7sM\x1c\x04\x07^k\x80\ +\xe7Y\xcf\x81\xdc\x9e'\xcc\x86\x1e$\xba\xfb\x22L\xe6\ +\xae\xc1\x1c\xad/\xcaIB\xccCHt\xb2\xcf\x9e\x89\ +\xdc\x85z\x94\x19\x1a\xe3\xb3q=\x1b,\xfe\xedy\xa8\ +\x8f\xf3\xba\x1a\xfay\x8c\x8a\x99\xad\x86\xf8:t\xbe+\ +\xab\x95\x85\x22t\x0b\xa0\x0e\xd2\xe1COh\xca\x88\xfe\ +8$\x22\xe2\x9e\x07\xa2\xfe4)\x95\x1c0][\x1d\ +h\xb7}\x0c\xc8\xf2\xaf\x03\xcd|\xb2IP\xd0\x97\xa2\ +|\x87\xc3e_1\xbe\x11\xfea.\xe6\x87\xc9|!\ +\xbe\x8fF\xd3j\xe0\x1d\xce\x13\xdc;\x13\xf3\xc9T\xfe\ +\x14Y\xfb6\x9c\x1f\xf3m\xfeI\xf8\x1f'\xf3sl\ +\x7f\x08\xed\x93m\xf3y\xba\xff<\xa1\xfcSp\xcd\xf7\ +k\xf8\xf7%l\xbe_\xc3\xbf/a\xf3\xfd\x1a\xfe}\ +\x09\x9b\xef\xd7\xf0\xefK\xd8|\xbf\x86\x7f_\xc2\xe6\xfb\ +5\xfc\xfb\x126\xaf\xf8\x22\xe0`bW\xa5\xe9e\x82\ +p\xc8q\x04\x84\xc5\xb4H\xeb\xde|\x19z\x8c\xa60\ +\xa3\xa2M\xa8\xa5Uk\xfd_;9#;\xd1\x0a\x06\ +_}\x9f\x9a\xc0\x19bc\xa1\xc3)\x0d\x0a\xa4\x8b\xb1\ +H\x9d\x1e\xdf\xc0^\xae,\xf9\x81\xa4\xc8\xe2\xb5]\xf0\ +<h\x16\xe7q\xfb\xc8\x8f\xb8\xa3\xb1{\xdcDZW\ +\xf5\xb8\x05\x1c\x1aF\xd6CL\xa8\x13\xf8z\x91>\x94\ +\x89\x085\xde\x95o\xff\xf0\xfe\xdd\xef\xfcQ\x0a\x98\x7f\ +\xff\xdc\xe1\x7f\xe5\x85(\x1el\x87\xb5\xe6\xff\x015\x94\ +3\xa6\xf6\xe2\x8e\xf3\x00\x00\x01\x85iCCPIC\ +C profile\x00\x00x\x9c}\x91=\ +H\xc3@\x1c\xc5_S\xa5R*\x0ev\xa8\xe2\x90\xa1\ +\x8a\x83\x05Q\x11G\xadB\x11*\x84Z\xa1U\x07\x93\ +K\xbf\xa0IC\x92\xe2\xe2(\xb8\x16\x1c\xfcX\xac:\ +\xb88\xeb\xea\xe0*\x08\x82\x1f \xae.N\x8a.R\ +\xe2\xff\xd2B\x8b\x18\x0f\x8e\xfb\xf1\xee\xde\xe3\xee\x1d \ +\xd4\xcbL\xb3\xba\xc6\x01M\xb7\xcdT\x22.f\xb2\xab\ +b\xe0\x15~D\x10\xc4(\x06df\x19s\x92\x94\x84\ +\xe7\xf8\xba\x87\x8f\xafw1\x9e\xe5}\xee\xcf\xd1\xab\xe6\ +,\x06\xf8D\xe2Yf\x986\xf1\x06\xf1\xf4\xa6mp\ +\xde'\x0e\xb3\xa2\xac\x12\x9f\x13\x8f\x99tA\xe2G\xae\ ++M~\xe3\x5cpY\xe0\x99a3\x9d\x9a'\x0e\x13\ +\x8b\x85\x0eV:\x98\x15M\x8dx\x8a8\xaaj:\xe5\ +\x0b\x99&\xab\x9c\xb78k\xe5*k\xdd\x93\xbf0\x94\ +\xd3W\x96\xb9Ns\x08\x09,b\x09\x12D(\xa8\xa2\ +\x842l\xc4h\xd5I\xb1\x90\xa2\xfd\xb8\x87\x7f\xd0\xf5\ +K\xe4R\xc8U\x02#\xc7\x02*\xd0 \xbb~\xf0?\ +\xf8\xdd\xad\x95\x9f\x9ch&\x85\xe2@\xf7\x8b\xe3|\x0c\ +\x03\x81]\xa0Qs\x9c\xefc\xc7i\x9c\x00\xfeg\xe0\ +Jo\xfb+u`\xe6\x93\xf4Z[\x8b\x1e\x01}\xdb\ +\xc0\xc5u[S\xf6\x80\xcb\x1d \xf2d\xc8\xa6\xecJ\ +~\x9aB>\x0f\xbc\x9f\xd17e\x81\xfe[ \xb8\xd6\ +\xec\xad\xb5\x8f\xd3\x07 M]%o\x80\x83C`\xa4\ +@\xd9\xeb\x1e\xef\xee\xe9\xec\xed\xdf3\xad\xfe~\x00p\ +\xa2r\xa6'\xfd-\xde\x00\x00\x0d\x1aiTXtX\ +ML:com.adobe.xmp\ +\x00\x00\x00\x00\x00<?xpacket b\ +egin=\x22\xef\xbb\xbf\x22 id=\x22W\ +5M0MpCehiHzreSzN\ +Tczkc9d\x22?>\x0a<x:xm\ +pmeta xmlns:x=\x22a\ +dobe:ns:meta/\x22 x\ +:xmptk=\x22XMP Core\ + 4.4.0-Exiv2\x22>\x0a \ +<rdf:RDF xmlns:r\ +df=\x22http://www.w\ +3.org/1999/02/22\ +-rdf-syntax-ns#\x22\ +>\x0a <rdf:Descrip\ +tion rdf:about=\x22\ +\x22\x0a xmlns:xmpM\ +M=\x22http://ns.ado\ +be.com/xap/1.0/m\ +m/\x22\x0a xmlns:st\ +Evt=\x22http://ns.a\ +dobe.com/xap/1.0\ +/sType/ResourceE\ +vent#\x22\x0a xmlns\ +:dc=\x22http://purl\ +.org/dc/elements\ +/1.1/\x22\x0a xmlns\ +:GIMP=\x22http://ww\ +w.gimp.org/xmp/\x22\ +\x0a xmlns:tiff=\ +\x22http://ns.adobe\ +.com/tiff/1.0/\x22\x0a\ + xmlns:xmp=\x22h\ +ttp://ns.adobe.c\ +om/xap/1.0/\x22\x0a \ +xmpMM:DocumentID\ +=\x22gimp:docid:gim\ +p:b21310e5-9d21-\ +44d1-ab3c-9dd6d0\ +c05628\x22\x0a xmpMM\ +:InstanceID=\x22xmp\ +.iid:a07b1f50-06\ +03-4181-85bb-849\ +97bf046ec\x22\x0a xm\ +pMM:OriginalDocu\ +mentID=\x22xmp.did:\ +568dcc6e-5cfb-43\ +c4-9d41-f5c9e488\ +6fd8\x22\x0a dc:Form\ +at=\x22image/png\x22\x0a \ + GIMP:API=\x222.0\x22\ +\x0a GIMP:Platfor\ +m=\x22Linux\x22\x0a GIM\ +P:TimeStamp=\x22167\ +9654470333966\x22\x0a \ + GIMP:Version=\x22\ +2.10.30\x22\x0a tiff\ +:Orientation=\x221\x22\ +\x0a xmp:CreatorT\ +ool=\x22GIMP 2.10\x22>\ +\x0a <xmpMM:Histo\ +ry>\x0a <rdf:Seq\ +>\x0a <rdf:li\x0a \ + stEvt:actio\ +n=\x22saved\x22\x0a \ +stEvt:changed=\x22/\ +\x22\x0a stEvt:in\ +stanceID=\x22xmp.ii\ +d:e3a96143-5dee-\ +4ed6-917c-416fe8\ +b91c1a\x22\x0a st\ +Evt:softwareAgen\ +t=\x22Gimp 2.10 (Li\ +nux)\x22\x0a stEv\ +t:when=\x222023-03-\ +24T11:41:10+01:0\ +0\x22/>\x0a </rdf:S\ +eq>\x0a </xmpMM:H\ +istory>\x0a </rdf:\ +Description>\x0a </\ +rdf:RDF>\x0a</x:xmp\ +meta>\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \x0a<?xpacket \ +end=\x22w\x22?>\x88u\x1fu\x00\x00\x00\ +\x09pHYs\x00\x00\x10\xdf\x00\x00\x10\xdf\x01tU\ +^0\x00\x00\x00\x07tIME\x07\xe7\x03\x18\x0a)\ +\x0a\xbc\x9cw\x19\x00\x00\x02\xdfPLTE\x00\x00\x00\ +\x00\xff\xff\x00\xff\x80U\xff\xaa@\xbf\x803\xcc\x99+\ +\xd5\x80$\xdb\x92 \xdf\x809\xe3\x8e3\xe6\x80.\xe8\ +\x8b+\xd5\x80$\xdb\x803\xdd\x880\xdf\x80-\xe1\x87\ ++\xe3\x80(\xe4\x86&\xd9\x801\xdb\x86,\xde\x85+\ +\xdf\x8a)\xe0\x85'\xe2\x89/\xe3\x84.\xdb\x89,\xdc\ +\x84+\xdd\x88)\xde\x840\xdf\x87.\xe0\x83-\xe1\x87\ +,\xdb\x83+\xdc\x87)\xdd\x83/\xdd\x86.\xde\x83-\ +\xdf\x86,\xe0\x83+\xe1\x86*\xdb\x82.\xdc\x85-\xdd\ +\x82,\xde\x85+\xde\x88+\xdf\x85*\xe0\x87.\xe0\x85\ +-\xdc\x87,\xdd\x84+\xdd\x87+\xde\x84*\xdf\x86.\ +\xdf\x84-\xe0\x86,\xdc\x84+\xdc\x86+\xdd\x84.\xde\ +\x86-\xde\x84-\xdf\x86,\xdf\x83+\xe0\x85+\xdc\x83\ +.\xdd\x85-\xdd\x83,\xde\x85,\xde\x87+\xdf\x85+\ +\xdf\x87-\xe0\x85-\xdd\x86,\xdd\x85,\xdd\x86+\xde\ +\x84+\xde\x86-\xdf\x84-\xdf\x86,\xe0\x84,\xdd\x86\ ++\xdd\x84+\xde\x86-\xde\x84,\xde\x85,\xdf\x84+\ +\xdf\x85+\xdd\x84-\xdd\x85,\xde\x85,\xde\x86+\xde\ +\x85+\xdf\x86-\xdf\x85-\xdd\x86,\xdd\x85,\xde\x86\ ++\xde\x85+\xde\x86-\xdf\x85,\xdf\x84,\xdd\x86+\ +\xdd\x84+\xde\x85-\xde\x84,\xde\x85,\xdf\x85+\xdf\ +\x84+\xdd\x85-\xdd\x84,\xde\x85,\xde\x84,\xde\x85\ ++\xdf\x86-\xdf\x85-\xdd\x86,\xdd\x85,\xde\x86,\ +\xde\x85+\xde\x86-\xde\x85-\xdf\x86,\xdf\x85,\xdd\ +\x85+\xdd\x84+\xde\x85-\xde\x84,\xde\x85,\xde\x84\ +,\xdf\x85+\xdf\x84+\xdd\x85-\xdd\x84,\xde\x84,\ +\xde\x85+\xde\x86+\xdf\x85-\xdd\x86,\xdd\x85,\xde\ +\x86,\xde\x85+\xde\x86-\xde\x85,\xde\x85,\xdf\x85\ +,\xdd\x85,\xdd\x85+\xde\x85-\xde\x84,\xde\x85,\ +\xde\x84+\xdd\x85-\xde\x84,\xde\x85,\xde\x84,\xde\ +\x85,\xde\x86+\xdf\x85-\xdf\x86,\xdd\x85,\xde\x86\ +,\xde\x85,\xde\x86-\xde\x85,\xde\x85,\xdf\x85,\ +\xdd\x85,\xdd\x85+\xde\x85-\xde\x85,\xde\x85,\xde\ +\x84,\xde\x85,\xdf\x84+\xdd\x85-\xde\x84,\xde\x85\ +,\xde\x84,\xde\x85+\xde\x85-\xdf\x86,\xdd\x85,\ +\xde\x86,\xde\x85,\xde\x85,\xde\x85,\xde\x85,\xdf\ +\x85,\xde\x85,\xde\x85-\xde\x85,\xde\x85,\xde\x85\ +,\xde\x85,\xdf\x85,\xdd\x85-\xde\x84,\xde\x85,\ +\xde\x84,\xde\x85,\xde\x86,\xde\x85-\xdf\x86,\xdd\ +\x85,\xde\x85,\xde\x85,\xde\x85+\xde\x85,\xde\x85\ +,\xdf\x85,\xde\x85,\xde\x85+\xde\x85,\xde\x85,\ +\xde\x85,\xde\x85,\xde\x85,\xdd\x85-\xde\x85,\xde\ +\x85,\xde\x84,\xde\x85,\xde\x86,\xde\x85,\xde\x85\ +,\xde\x85,\xde\x85,\xde\x85,\xde\x85,\xde\x85,\ +\xde\x85,\xde\x85,\xde\x85,\xde\x85,\xde\x85,\xde\ +\x85,\xde\x85,\xde\x85,\xde\x85,\xde\x85,\xde\x85\ +,\xde\x85,\xde\x85,\xde\x85,\xde\x85\x1ci\x96\x02\ +\x00\x00\x00\xf4tRNS\x00\x01\x02\x03\x04\x05\x06\x07\ +\x08\x09\x0a\x0b\x0c\x0e\x0f\x10\x11\x12\x13\x14\x15\x17\x18\x19\ +\x1a\x1b\x1c\x1d\x1e\x1f !\x22#$%&'()\ +*+,-./0123456789\ +:;<=>?@ABCDEFGHI\ +JKLMNOPQRSTUVWXY\ +Z\x5c]^_`abcdefhijk\ +lmopqrstuvwxyz{|\ +}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8b\x8c\x8d\ +\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9f\ +\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\ +\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbc\xbd\xbe\xbf\xc0\ +\xc1\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\ +\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdc\xdd\xde\xdf\xe0\xe1\xe2\ +\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\ +\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\x88\x04\x8a\x05\ +\x00\x00\x00\x01bKGD\x00\x88\x05\x1dH\x00\x00\x09\ +vIDATx\xda\xed\x9d\xf9_UE\x18\xc6\x0f\ +\x8ak\xd2&Y\xeeK\x0be\x92\x91\xa5\xa5\x94\x8a\x9a\ +\x99\xa6Yi\x0b\xe6Jfj\x8bXR\x16b\xde\x8a\ +\xd2\x16\xcb\x12\x836\xcd\xca\xa5\x05\x13\xc3\x0c\xcd\xc4\xd4\ +J\x055KD\xad@\x13Q\x90\xcb\x9d? \xf9T\ +Z\xcc{\xce\x9d\x99{\xb9s\xde;\xef\xf3\xabg\x9e\ +\x99\xe7\x8b\xf7\x9c3s\xde3\xc7\xb2H$\x12\x89D\ +\x22\x91H$\x12\x89D\x22\x91H$\x12\x89D\x22\x91\ +H$\x12\x89D\x22\x91H$\x92\xb1\xea\x7f\x9c\x85\xbd\ +L\xcf\xef\x04\xa0\x9f\x09\xf9\x99\xe9\xf9\x99\xe9\xf9\x99\xe9\ +\xf9\x99\xe9\xf9\x99\xe9\xf9\x99\xe9\xf9\x99\xe9\xf9\x99\xe9\xf9\ +\x99\xe9\xf9\x99\xe9\xf9\x99\xe9\xf9k\x03\x88?\xc6\x8c\x06\ +`^~fz~fz~fz~fz~f\ +z~fz\xfe\x7f\x01\xc4\x971\xa3\x01\x98\x9b\x9f\x99\ +\x9e\x9f\x99\x9e\xbf\x06@/\x93\xf33\xd3\xf33\xabO\ +y\x1d\xb8V\xee\xca\xc9\x98y\xff\xa0\x84\xeb\xe2:\xb6\ +k\xd9!6\xaeo\xff{\xa6\xbd\xba\xf2\x87?\xdd\x08\ + \xe8\xf9\x0b2'v\x8d\xb4Ymo;\xf2\xa5\xf5\ +\x15.\x03\x10T\xb7\xaa\xec1\xcd\xfd=rn\xd4\x7f\ +aI\x98\x02\xc8\x1d\x7f\xbe\xd8c\xf7\x06\x03\x17\x1d\x0f\ +;\x00\xde\xb7\xaf\x92)=\x88~\xf2\x8f\xf0\x02\xb0\xf4\ +2\xd9\xea\x8b\xa8\xd4\xf2\xf0\x01P\xd8O\xa5\x00\xa5\xdd\ +\x8ap\x01\x90y\x96b\x0dN\xe2\xd1p\x00P>B\ +\xbd\x0a\xe9\x92\x9d\xfe\xfdWyj\xeb\x90\xab\x00\x14\xc7\ +\x05R\x87uN\x8e\xdf\x0e&r\x8d\xbew\x13\x80\xe2\ +\xcb\x03\xabDk\xb4\x0c7\x80\x83\x9d\x02\xad\xc5k\xb8\ +\x1a3\x80\xb2k\x02\xafF\x8c\xda\x8a\x18\xc0}\xc1\xa8\ +\xc7l[\x82\x16\xc0[\xc1\xa9H\x1d\x8e\x15\xc0\x81s\ +\x82T\x93\xbb\x0c)\x80;\x9dB]<2%#w\ +S\xc1\xde\xe2\xdd\xf9y\x1f\xce\x19\xd7#\xd2\xe1\xd8\xd6\ +e(\x01|f\x1b(rX\xe6>\xee|\xf9\xc5d\ +\xfb\xc9\xe2T\x8c\x00*\xdb\xdb\xa49?\xad\x18nQ\ +\xf1\xee\xd5v\xc4\xb6#\x04\xb0\xd0f\xb2?\xe1w\xfb\ +6\xbe\xcc\x166\xb3\x02|\x00\xbc\x17\xc3\xd7\xb4|\xe7\ +f\xa5\x03\xe1\xff\x02{\xd0\x01x\x1f\x0cr\xd3o\xfe\ +\xdaUO\x07\x1b>\x80\x0d\x80\xaf\x0b\x14\xa3\xa7\xc8R\ +\xd7\x0c\xa8e\xe3\x83\xc8\x00\xe4A)\xae,\x15b7\ +\x16j\xfb\x022\x00I\xd0\xcc\xee'\xc1\xebGg\xa0\ +q,.\x00\x95\xd05\xfd9\xd1\xd6\x9b\x1b\x00\xad\xb7\ +\xa2\x02\xb0\x14Hpy\x95p\xf3\x07\x81\xe6\x8f\xa2\x02\ +0\x14H\xf0\xbex\xf3_\x1b\xf2\xcd[\xfa\x10\x01\xa8\ +l\xc6\x07\x88\xa9\x960\x80\xce\x83\xdb\x10\x01\xc8\x05\xc6\ +?_\xc6`\xab\xf8u\xc0\x95\x00\x80Ky\xe3R)\ +\x87X\xdea\x00\x22\x00\xdd\xf8\xe1\x8f\x90sH\xe7\x1d\ +\x9a\x9c@\x03\xa0\xa4>?\xfc\x8f\xe5,\xf6\x01\xbf\x81\ +\xff,\x8f\x96L8-~\xd9y\xf8\x04H\xd3B\x08\ +\xe0S`\x12xD\xd2\x03XN\x9f}\xe6_\x7f\x91\ +_V\xba(\x84\x00R\x81Y\x90\xac\xc7T\xde\xe3\x0e\ +4\x00n\xe7\xbb\x9f#\xeb\xf19\xef\xd1\x11\x0d\x80\xb6\ +|\xf7ke=J#8\x8f\x88R$\x00\xfe\xe0{\ +\xaf'\xff\x9c\x17x\xa6\x94\x8b\x04\xc0j`\x1e \xef\ +2\x92w\x99\x8b\x04\xc0\xebRkzvz\x9ew\x99\ +\x84\x04\xc04\xbe\xf7g\xe5]V\xf0.\xb7\x22\x01\x00\ +<\x10Y*\xef\xb2\x83w\xe9\x8c\x04@7\xe1\x99\x9c\ +\xe3\x8c\x92\xbf\x9d<\x0b\x09\x80h\xfe\x02\xa6R\xf1\xd5\ +\x81\x0fq\x08\x05\x802\xa0\xecO\xa5\xef\x1by\x9fo\ +Q\x00(\xe0;\xef\xa2\xd27p\x1d\x5c\x8e\x02\xc0z\ +\xe1\xa9\xbc\xb3\xa6\xf0>\x19(\x00\x00w\xf1\xa3T\xfa\ +\xf6\xf0>\xe9\xff\xfe\xdb\xa1\x84\xd3j\xc5\x1du]\x02\ +\xa4\x11!\x03\x90\xc5\x0f\x5ci.\xbe\x88\xf7\x99\x81b\ +Ad\xae\xe3L^\x5c\x1f\xf3>\x13Q\x00\x98\xc9\x0f\ +\xfc\x95 M)F\xa2\x00\xf0\x10?\xf0E*}o\ +\x046\xb0C\x01`\x5c\xc0\x0b\x82\xb6\xf7\xc2\xf1(\x00\ +\x8c\xe2\x07\xfe\xa5J\xdfE\xbcOw\x14\x00\xeevZ\ +\xc9\x90\xd0o\xbcO\x1c\x0a\x00\xc3\xf9\x81\xafS\xe9\xbb\ +\x14(0@\x01`\x08?\xf0\x0d*}\x1f\xe5}.\ +E\x01\xe0f~\xe0\x9bT\xfa>\xc1\xfbt@\x01\xa0\ +/?\xf0-*}W\x01\x8f\xc8Q\x00H\xb0\x823\ +$/P3\x8b\xf5'\xf0\x9dJ\xdf\x15@\x811\xd6\ +\x93\xe0z\x95\xbe\xcb\x9c\x16\x05M\xb8\x0c\x1e\xc6z\x1f\ +\x10\xac\x1b\xa1\xdfy\x9f\xebQ\x00H\xe4\x07\xbeJ\xa5\ +\xefb\xde\xa77\x0a\x00@\x81\xd3G*}\x17\xf2>\ +\x03\xb1N\x873T\xfa\xce\xe7}\x86b]\x10yY\ +\xa5\xef\x5c\xb1B#\xf7\x01\x98\xc7\x0f<M\xa5\xef\x95\ +\xbc\xcfh\x14\x00\xb2\xc4\xcb\x5c\x1d\xf5\x8e\x98\x8f\xfb\x00\ +\x00%R\xf7\xa9\xf4\x0dT\xcayP\x00\x00^\x15H\ +P\xe9\x1bx\xca\xbe\x10\x05\x80\x02\xb1[X\x95\xa5\xb5\ +OP\x00\x00\xee\xe1\x9b\xab\xf4=\xc0\xe1\xe1\xa8\xab\x01\ +0`\xaf \x95\xbd0\xae\xe0m\xf6\xe3\x00\x00\xbc3\ +\xbfY\xde\xa5\xba\x09_n\xea\xc5\x01\x00(\x91\xf9@\ +\xde\x05x\x00\xdc\x86\xe1\x00\xf0\x18?\xf4Ty\x97\x1c\ +\xde\xa5/\x12\x00\xf3\x03.\x96\xb7qy\x00\x09\x80\xd5\ +b\xcb\xb9~4\x86w\x99\x87\x04@\x09P\xe6+\xbf\ +5\x18\xf0\xeai6\x12\x00\xac\x9d\xe0\xd8\x9dt\x0c\xd8\ +Q\xe1 \x16\x00@\xb9\xfc\xf4 \x9c\x03[1,\x00\ +f\xf1\x83\xbf*\x083\x81!h\x00\x00\x9bgD\x14\ +Kz\x00\xdb\x0f\xce\x12\x04\x90\xaf\x1d\xc0a\xe0\xf7\xbb\ +@\xce\xa2\x88?\x91Z_\x0b\x02\xd8\xa0\x1d\x00\xeb!\ +\xb6\xa2\xed \xa0F\xae)\xbc\xdf\xea\xa4\xe0<\x85\x08\ +.\x80\xa7\x80B\xc5\x9dR\x0e1\x82\xf7\x81\xd0\xdbU\ +k\xf4\x03X'\xb9\x15\x8e\x90\xc1K\xa27\xde\xd9\xfa\ +\x01T\x9d\x0d\xbc;\xbb_\xc2\x00\xdaJe7|\xe8\ +\xe3\x81\xbc\xa6^W\x00\xd8=@\x80)\xe2\xcd\xbf\xb5\ +\xc4\xcacj\xc4\xbf\xa4\xf8\xaa\x0b\x00d\x03\x09\x1a\x0a\ +_\x9f\xab\x80\x93(\xb8 Z\xa3\x97\xb9#\x9fq\x01\ +\x00\xefE@\x84\xce\xa2\xdbf\xa7B;\x09\xd9\xddH\ +dr\x87&\xb9\x00\x00\xb4&`Y\xa3\xc4\xf6P\xf8\ +\x12\xdaBd\xb0\xdd\xd1+\x84\x1e\xa1\x86\x1c\xc0\x8f`\ +\xcd\xfeD\x9f@\xd3\xdc\xa6P\xd3\x1c\xbb\xc3\xf9\xd7\x13\ +.t\x03\x00\xa8P\xe6\x94\xee\xf5\xff\xb5\x9a\xc5\xcd\xa0\ +\x86\xd7\xda\x1e\x0f\xbch\xbf\xcf\x0d\x00\xbe\x81\xdf\xdb\x88\ +\xf1\xb3Chy\x12\xdc\xce~OEod]^\x06\ +\x02\xd8M\xae\x0f\x9c\xa4\xfeX\x87\xbfO\xd5\x9b-\xe1\ +V\xbd\x1c:j\xc3\x1d}\x8d\xcf\x0d\x00\xd6\xd8\xbd\xbc\ +\xd3$1\x07>\x19\xeeM\xebh\xd3\xa4\xde&\xb9\x1f\ +\xdb\x0c7\x00`\xb7\xd9\xbf\xc0\xd4ztF\xe1\xff\x0f\ +>\xf2\xd9\xe3=\x22l\x8fO\x92\x5c9\xb0\x06o\xf4\ +\xe9\x07P\x14\xe5\xf8\x16W\xe3\x98A\xe3\xa7\xa5x<\ +\xa9\xc9\x0f\xdeum\xb4\xe3\xa1\xed\x1d\x1f,e\x81m\ +.\xb8{\xca\xactOJr\xd2\xf8;\x87%\xf4\x8a\ +\x8b\xe90$\xe4\x00\xa0\x85m%\xd5w.2\xdb%\ +\xe6\x12\x1bz\x00\xd5\xbd\x82\x03\xe0\x05?\xfd\xb4\x11r\ +i\x1fz\x00\xac\xe8\x82`\xe4\xbf\xd7_7\xf7\x0b\xd9\ +\x9c\xa7\x01\x00[\xd7$\xf0\xfc\xb7T*,AB\x93\ +\x09\x9f\x06\x00le\x83@\xf3\xf7\xf1\xbf\x0b\xe7\xc9h\ +!\xa7c:\x00\xb0\xe5\x8d\x03\xcb?\x5cd\x17\xd2d\ +!\xab\xfdZ\x00\xb0\xb5\xcd\x03\xc9?Uh\xfexH\ +\xe8#&\xdb\xf5\x00`{\xd5\xbf\xb1q\xf6\x12\xc1>\ +\x9e\x14q\xdb\xa0\x09\x00;\x99\x12\xa9\x08@\xf8=\x8b\ +\xcaX\x01\xb7U\xba\x000\xb6%^\x0d\xc08\xe1\x1e\ +\x0a[\xf8w[\xa2\x0f\x00\xf3\xadP\xba'\x8a\x10\x7f\ +\xc4\xb1\xedB\xbfn\x0b5\x028\xa5\xbca\xf5\xe4\x09\ +t>)\xec\x7f\xa0\xb7?\xb3t\xbd\x00\x18\xfb9\xbd\ +\xa74\x03\x89M\xe8\xaa3[;{\xcd\xd4\x0d\xa0\xe6\ +\xcf\xf4\xc6\xb0VR\x00\x9a\xee\x91p\xafx'\xdev\ +F\xdd\xac\xfb\x84\x5c\x17\x00\xa8Q\xf1\xf2\x94\xc1W\x9e\ +\xcb\x8f\xb0\x1f\xb8\x1f\xff@I\xc2o'v\xa9u\xf3\ +\x19}\xc3\xe89\x1f\xed\xaaV\x1cm\x1d\x00\xf8[e\ +?e/^0\xdf\x93\x96\x9c\xfc\x8cg\xc1\xa2%_\ +\xfd\xeacy\xe0\x0fd\xb1\xfcew{NV\xba\xe7\ +\x89\xe4\xe9\x9e\xb9Ykv\x04\xf8\xcd\xd8:\x03\x00i\ +\x1c\x04\xa0\xc5a\xa6S!\x05P\x02\xde5O2\x07\ +\x00{\x13\x5c\x10\xcd3\x07@5\xf4P\xd4\xear\xd2\ +\x18\x00l\x1b8kx\xd1\x1c\x00l2x3\xf0\xb3\ +9\x00\x8e\x82O\x86\x86\x9a\x03\x80\xbd'\xf9d0\xec\ +\x00@\x1bp\xf8\xf9\xdaZ]\xaa<\xf4\x00\x0a\x1bA\ +\x04\x1e\xd6\x94\xbfo\xe8\x01\xc0\xdfY\xaa\xbfYS~\ +\x0d\x00\x8e\x83_\xa9\xeb\xe6\xd5\x93_\x03\x00hG\xca\ +SzMO~\x1d\x00\xa0]X,+\xaaHK~\ +-\x00\xf6\x82UR\x8fh\xc9\xaf\x05\x00\x9b\xcd\xc7\xbf\ +:\xd3\xab%\xbf\x1e\x00\x95\xb5k\xc5{\xae\x0c\xf5\x99\ +\xf8\xf4\xed\x88\x9e\xeb\xef\xda\xff\xae\xed\xd5\x1b\xbc1\xe4\ +W\xa23\xdb\x81i\xba\x03;Sl\xdd(\xb1\x80i\ +\xcc\xaf\x0b\xc0\xc1\x7f\xbe\xd9\x1c5\xb9\x98i\xcd\xaf\x0b\ +\xc0\xdf;\xb1\xb4x\xfa\x08\xd3\x9c_\x1b\x00oW\xab\ +\xd3\xbc\x13L{~m\x00X\xfe\xb2j\xe6\x82\xfc\xfa\ +\x00hR\xed\xfc\x96\xe9\xf9-\xd3\xf3[\xa6\xe7\xb7L\ +\xcfo\x99\x9e\xdf \x00\x15\x83,\xa3\x01\xd8\xe4\xb7L\ +\xcfo\x99\x9e\xdf2=\xbfez~\xcb\xf4\xfc\x96\xe9\ +\xf9-\xd3\xf3\x93H$\x12\x89D\x22\x91H$\x12\x89\ +D\x22\x91H$\x12\x89D\x22\x91H$\x12\x89D\x22\ +\x91H$RX\xeb/\xa5p6\xac\x5c\xb9\xe4\xd3\x00\ +\x00\x00\x00IEND\xaeB`\x82\ +" + +qt_resource_name = b"\ +\x00\x06\ +\x07\x9e\x88\xb4\ +\x00s\ +\x00h\x00a\x00r\x00e\x00d\ +\x00\x0c\ +\x00V'\xdc\ +\x00C\ +\x00h\x00e\x00c\x00k\x00B\x00o\x00x\x00.\x00q\x00m\x00l\ +\x00\x0d\ +\x01\xb8P\x9c\ +\x00T\ +\x00e\x00x\x00t\x00F\x00i\x00e\x00l\x00d\x00.\x00q\x00m\x00l\ +\x00\x09\ +\x08\xbf\xf4\xdc\ +\x00L\ +\x00a\x00b\x00e\x00l\x00.\x00q\x00m\x00l\ +\x00\x1a\ +\x04'S\xdc\ +\x00S\ +\x00i\x00m\x00p\x00l\x00e\x00L\x00a\x00u\x00n\x00c\x00h\x00e\x00r\x00D\x00e\x00l\ +\x00e\x00g\x00a\x00t\x00e\x00.\x00q\x00m\x00l\ +\x00\x10\ +\x09\x8e}\x5c\ +\x00L\ +\x00a\x00u\x00n\x00c\x00h\x00e\x00r\x00L\x00i\x00s\x00t\x00.\x00q\x00m\x00l\ +\x00\x0a\ +\x0a\xce\x15\xdc\ +\x00S\ +\x00l\x00i\x00d\x00e\x00r\x00.\x00q\x00m\x00l\ +\x00\x12\ +\x06\xc0(<\ +\x00F\ +\x00l\x00i\x00c\x00k\x00r\x00R\x00s\x00s\x00M\x00o\x00d\x00e\x00l\x00.\x00q\x00m\ +\x00l\ +\x00\x06\ +\x07\x03}\xc3\ +\x00i\ +\x00m\x00a\x00g\x00e\x00s\ +\x00\x06\ +\x07\x84+\x02\ +\x00q\ +\x00m\x00l\x00d\x00i\x00r\ +\x00\x0a\ +\x09\xcc\x1a\xdc\ +\x00T\ +\x00a\x00b\x00S\x00e\x00t\x00.\x00q\x00m\x00l\ +\x00\x0a\ +\x0d\xd0R\xdc\ +\x00I\ +\x00m\x00a\x00g\x00e\x00s\x00.\x00q\x00m\x00l\ +\x00\x0a\ +\x0bhq\x5c\ +\x00B\ +\x00u\x00t\x00t\x00o\x00n\x00.\x00q\x00m\x00l\ +\x00\x0d\ +\x0b]\x12\x87\ +\x00c\ +\x00h\x00e\x00c\x00k\x00m\x00a\x00r\x00k\x00.\x00p\x00n\x00g\ +\x00\x07\ +\x0auW\xa7\ +\x00t\ +\x00a\x00b\x00.\x00p\x00n\x00g\ +\x00\x08\ +\x07\x9eZG\ +\x00b\ +\x00a\x00c\x00k\x00.\x00p\x00n\x00g\ +\x00\x08\ +\x0c\xf7Y\xc7\ +\x00n\ +\x00e\x00x\x00t\x00.\x00p\x00n\x00g\ +\x00\x11\ +\x02G!g\ +\x00s\ +\x00l\x00i\x00d\x00e\x00r\x00_\x00h\x00a\x00n\x00d\x00l\x00e\x00.\x00p\x00n\x00g\ +\ +\x00\x0b\ +\x05R\xbf'\ +\x00q\ +\x00t\x00-\x00l\x00o\x00g\x00o\x00.\x00p\x00n\x00g\ +" + +qt_resource_struct = b"\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x0c\x00\x00\x00\x02\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00\x01\x87\xc7\xa1\xf0\xe5\ +\x00\x00\x000\x00\x00\x00\x00\x00\x01\x00\x00\x06\xd5\ +\x00\x00\x01\x87\xc7\xa1\xf0\xe5\ +\x00\x00\x00h\x00\x01\x00\x00\x00\x01\x00\x00\x0b\xec\ +\x00\x00\x01\x87\xc7\xa1\xf0\xe5\ +\x00\x00\x00\xe2\x00\x00\x00\x00\x00\x01\x00\x00\x1fg\ +\x00\x00\x01\x87\xc7\xa1\xf0\xe5\ +\x00\x00\x01\x0c\x00\x02\x00\x00\x00\x06\x00\x00\x00\x0e\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x01\x1e\x00\x00\x00\x00\x00\x01\x00\x00&X\ +\x00\x00\x01\x87V\x12\x92B\ +\x00\x00\x00P\x00\x00\x00\x00\x00\x01\x00\x00\x0b\x1c\ +\x00\x00\x01\x87\xc7\xa1\xf0\xe5\ +\x00\x00\x00\xa2\x00\x01\x00\x00\x00\x01\x00\x00\x0f)\ +\x00\x00\x01\x87\xc7\xa1\xf0\xe5\ +\x00\x00\x010\x00\x00\x00\x00\x00\x01\x00\x00'\x9f\ +\x00\x00\x01\x87\xc7\xa1\xf0\xe5\ +\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x01\x00\x00\x14\xce\ +\x00\x00\x01\x87\xc7\xa1\xf0\xe5\ +\x00\x00\x01d\x00\x00\x00\x00\x00\x01\x00\x0039\ +\x00\x00\x01\x87\xc7\xa1\xf0\xe5\ +\x00\x00\x01J\x00\x00\x00\x00\x00\x01\x00\x000\xbf\ +\x00\x00\x01\x87V\x12\x92B\ +\x00\x00\x01\xde\x00\x00\x00\x00\x00\x01\x00\x00H\xdd\ +\x00\x00\x01\x87V\x12\x92B\ +\x00\x00\x02\x06\x00\x00\x00\x00\x00\x01\x00\x00LX\ +\x00\x00\x01\x87V\x12\x92B\ +\x00\x00\x01\xb2\x00\x00\x00\x00\x00\x01\x00\x00=D\ +\x00\x00\x01\x87V\x12\x92B\ +\x00\x00\x01\x9e\x00\x00\x00\x00\x00\x01\x00\x00<\x0b\ +\x00\x00\x01\x87V\x12\x92B\ +\x00\x00\x01~\x00\x00\x00\x00\x00\x01\x00\x008\xde\ +\x00\x00\x01\x87V\x12\x92B\ +\x00\x00\x01\xc8\x00\x00\x00\x00\x00\x01\x00\x00C~\ +\x00\x00\x01\x87V\x12\x92B\ +" + +def qInitResources(): + QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) + +def qCleanupResources(): + QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) + +qInitResources() diff --git a/examples/quick/window/AllScreens.qml b/examples/quick/window/AllScreens.qml new file mode 100644 index 000000000..25438f21a --- /dev/null +++ b/examples/quick/window/AllScreens.qml @@ -0,0 +1,42 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Controls + +Column { + id: root + spacing: 8 + + Label { + text: "Total number of screens: " + screenInfo.count + font.bold: true + } + + Flow { + spacing: 12 + width: parent.width + + Repeater { + id: screenInfo + model: (Qt.application as Application).screens + Label { + required property string name + required property int virtualX + required property int virtualY + required property var modelData // avoid shadowing Label.width and height + + lineHeight: 1.5 + text: name + "\n" + virtualX + ", " + virtualY + " " + modelData.width + "x" + modelData.height + } + } + } + + Component.onCompleted: { + var screens = (Qt.application as Application).screens; + for (var i = 0; i < screens.length; ++i) + console.log("screen " + screens[i].name + " has geometry " + + screens[i].virtualX + ", " + screens[i].virtualY + " " + + screens[i].width + "x" + screens[i].height) + } +} diff --git a/examples/quick/window/CurrentScreen.qml b/examples/quick/window/CurrentScreen.qml new file mode 100644 index 000000000..1f4da7f0b --- /dev/null +++ b/examples/quick/window/CurrentScreen.qml @@ -0,0 +1,83 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Controls + +Item { + id: root + width: 400 + height: propertyGrid.implicitHeight + 16 + + function orientationToString(o) { + switch (o) { + case Qt.PrimaryOrientation: + return "primary"; + case Qt.PortraitOrientation: + return "portrait"; + case Qt.LandscapeOrientation: + return "landscape"; + case Qt.InvertedPortraitOrientation: + return "inverted portrait"; + case Qt.InvertedLandscapeOrientation: + return "inverted landscape"; + } + return "unknown"; + } + + Grid { + id: propertyGrid + columns: 2 + spacing: 8 + x: spacing + y: spacing + + //! [screen] + Label { + text: "Screen \"" + Screen.name + "\":" + font.bold: true + } + Item { width: 1; height: 1 } // spacer + + Label { text: "manufacturer" } + Label { text: Screen.manufacturer ? Screen.manufacturer : "unknown" } + + Label { text: "model" } + Label { text: Screen.model ? Screen.model : "unknown" } + + Label { text: "serial number" } + Label { text: Screen.serialNumber ? Screen.serialNumber : "unknown" } + + Label { text: "dimensions" } + Label { text: Screen.width + "x" + Screen.height } + + Label { text: "pixel density" } + Label { text: Screen.pixelDensity.toFixed(2) + " dots/mm (" + (Screen.pixelDensity * 25.4).toFixed(2) + " dots/inch)" } + + Label { text: "logical pixel density" } + Label { text: Screen.logicalPixelDensity.toFixed(2) + " dots/mm (" + (Screen.logicalPixelDensity * 25.4).toFixed(2) + " dots/inch)" } + + Label { text: "device pixel ratio" } + Label { text: Screen.devicePixelRatio.toFixed(2) } + + Label { text: "available virtual desktop" } + Label { text: Screen.desktopAvailableWidth + "x" + Screen.desktopAvailableHeight } + + Label { text: "position in virtual desktop" } + Label { text: Screen.virtualX + ", " + Screen.virtualY } + + Label { text: "orientation" } + Label { text: root.orientationToString(Screen.orientation) + " (" + Screen.orientation + ")" } + + Label { text: "primary orientation" } + Label { text: root.orientationToString(Screen.primaryOrientation) + " (" + Screen.primaryOrientation + ")" } + //! [screen] + + Label { text: "10mm rectangle" } + Rectangle { + color: "red" + width: Screen.pixelDensity * 10 + height: width + } + } +} diff --git a/examples/quick/window/Splash.qml b/examples/quick/window/Splash.qml new file mode 100644 index 000000000..0a7da219d --- /dev/null +++ b/examples/quick/window/Splash.qml @@ -0,0 +1,42 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import shared + +//! [splash-properties] +Window { + id: splash + color: "transparent" + title: "Splash Window" + modality: Qt.ApplicationModal + flags: Qt.SplashScreen + property int timeoutInterval: 2000 + signal timeout +//! [splash-properties] +//! [screen-properties] + x: (Screen.width - splashImage.width) / 2 + y: (Screen.height - splashImage.height) / 2 +//! [screen-properties] + width: splashImage.width + height: splashImage.height + + Image { + id: splashImage + source: Images.qtLogo + MouseArea { + anchors.fill: parent + onClicked: Qt.quit() + } + } + //! [timer] + Timer { + interval: splash.timeoutInterval; running: true; repeat: false + onTriggered: { + splash.visible = false + splash.timeout() + } + } + //! [timer] + Component.onCompleted: visible = true +} diff --git a/examples/quick/window/doc/window.png b/examples/quick/window/doc/window.png Binary files differnew file mode 100644 index 000000000..72487b4d9 --- /dev/null +++ b/examples/quick/window/doc/window.png diff --git a/examples/quick/window/doc/window.rst b/examples/quick/window/doc/window.rst new file mode 100644 index 000000000..6a8f73eed --- /dev/null +++ b/examples/quick/window/doc/window.rst @@ -0,0 +1,35 @@ +Qt Quick Examples - Window and Screen +===================================== + +This example demonstrates the Window and Screen types in QML. + +.. image:: window.png + :width: 392 + :alt: Window and Screen screenshot + +In addition, this example demonstrates the usage of the Qt Resource System in +Qt for Python for more advanced scenarios. There are several QML files, one of +which imports a module from this sibling directory. Both this "shared" module +and the QML files of the example need to be compiled into Python modules with +the resource compiler rcc. + +For the "shared" module approach to work with QML and rcc, you need: + +* A module definition *qmldir* file +* A Qt Resource Collection file (.qrc) specifying all the QML files and other + resources, plus the *qmldir* file + +The .qrc file is the input to rcc. This will generate a Python module (called +*shared_rc* here) that can then be imported from the Python code. At runtime, +only this Python module is needed, not the .qrc file or any of the .qml files +or even the image resources, as they have all been compiled into the Python +module. + +For the example, rcc needs: + +* A Qt Resource Collection file (.qrc) specifying all the QML files and other + resources. There is no qmldir file here because this is not a module. + +This will generate a Python module (called *window_rc* here) that can then be +imported from the Python code. Again, only the Python module is needed at +runtime. diff --git a/examples/quick/window/main.py b/examples/quick/window/main.py new file mode 100644 index 000000000..62ba6a5e9 --- /dev/null +++ b/examples/quick/window/main.py @@ -0,0 +1,40 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import os +from pathlib import Path +import sys + +from PySide6.QtCore import QUrl, qWarning +from PySide6.QtGui import QGuiApplication +from PySide6.QtQml import QQmlComponent, QQmlEngine +from PySide6.QtQuick import QQuickWindow +from PySide6.QtQuickControls2 import QQuickStyle + +import rc_window # noqa: F401 + +# Append the parent directory of this file so that Python can find and +# import from the "shared" sibling directory. +sys.path.append(os.fspath(Path(__file__).parent.parent)) +from shared import shared_rc # noqa: F401, E402 + + +if __name__ == "__main__": + app = QGuiApplication(sys.argv) + if sys.platform == "win32": + QQuickStyle.setStyle("Fusion") + engine = QQmlEngine() + + # Add the qrc root as QML import path so that the "shared" module + # can be found. + engine.addImportPath(":/") + + component = QQmlComponent(engine) + QQuickWindow.setDefaultAlphaBuffer(True) + component.loadUrl(QUrl("qrc:///window/window.qml")) + if component.isReady(): + component.create() + else: + qWarning(component.errorString()) + app.exit(1) + app.exec() diff --git a/examples/quick/window/rc_window.py b/examples/quick/window/rc_window.py new file mode 100644 index 000000000..30b1fbf0a --- /dev/null +++ b/examples/quick/window/rc_window.py @@ -0,0 +1,335 @@ +# Resource object code (Python 3) +# Created by: object code +# Created by: The Resource Compiler for Qt version 6.5.0 +# WARNING! All changes made in this file will be lost! + +from PySide6 import QtCore + +qt_resource_data = b"\ +\x00\x00\x05\x12\ +/\ +/ Copyright (C) \ +2021 The Qt Comp\ +any Ltd.\x0d\x0a// SPD\ +X-License-Identi\ +fier: LicenseRef\ +-Qt-Commercial O\ +R BSD-3-Clause\x0d\x0a\ +\x0d\x0aimport QtQuick\ +\x0d\x0aimport QtQuick\ +.Controls\x0d\x0a\x0d\x0aCol\ +umn {\x0d\x0a id: r\ +oot\x0d\x0a spacing\ +: 8\x0d\x0a\x0d\x0a Label\ + {\x0d\x0a text\ +: \x22Total number \ +of screens: \x22 + \ +screenInfo.count\ +\x0d\x0a font.b\ +old: true\x0d\x0a }\ +\x0d\x0a\x0d\x0a Flow {\x0d\x0a\ + spacing:\ + 12\x0d\x0a wid\ +th: parent.width\ +\x0d\x0a\x0d\x0a Repe\ +ater {\x0d\x0a \ + id: screenIn\ +fo\x0d\x0a \ +model: (Qt.appli\ +cation as Applic\ +ation).screens\x0d\x0a\ + Labe\ +l {\x0d\x0a \ + required pr\ +operty string na\ +me\x0d\x0a \ + required pro\ +perty int virtua\ +lX\x0d\x0a \ + required pro\ +perty int virtua\ +lY\x0d\x0a \ + required pro\ +perty var modelD\ +ata // avoid sha\ +dowing Label.wid\ +th and height\x0d\x0a\x0d\ +\x0a \ + lineHeight: 1.5\ +\x0d\x0a \ + text: name + \x22\ +\x5cn\x22 + virtualX +\ + \x22, \x22 + virtualY\ + + \x22 \x22 + modelDa\ +ta.width + \x22x\x22 +\ + modelData.heigh\ +t\x0d\x0a }\ +\x0d\x0a }\x0d\x0a \ + }\x0d\x0a\x0d\x0a Compon\ +ent.onCompleted:\ + {\x0d\x0a var \ +screens = (Qt.ap\ +plication as App\ +lication).screen\ +s;\x0d\x0a for \ +(var i = 0; i < \ +screens.length; \ +++i)\x0d\x0a \ + console.log(\x22s\ +creen \x22 + screen\ +s[i].name + \x22 ha\ +s geometry \x22 +\x0d\x0a\ + \ + screens[\ +i].virtualX + \x22,\ + \x22 + screens[i].\ +virtualY + \x22 \x22 +\ +\x0d\x0a \ + screen\ +s[i].width + \x22x\x22\ + + screens[i].he\ +ight)\x0d\x0a }\x0d\x0a}\x0d\ +\x0a\ +\x00\x00\x04\x8a\ +\x00\ +\x00\x16\xa7x\xda\xcdXYo\xdbF\x10~7\xe0\xff\ +0a_\xec\x06\xba\x93\x17\x15Fa+H\x1d\xc0A\ +b\xcb\xa8\x03\x14}\xa0\xc9\x91\xb8\xf5\x8a+\xec.-\ +9\xae\xff{\x87\xc7\x92\x94\xb8$\xe5ZnJ\x08\x10\ +\xb9;;\xc77\x07g\xd8\xeb\xc1D,\x1f$\x9b\x07\ +\x1a\x8e&\xc70\xec\x0f\x07p\x1d \x5cj\xdaY,\ +\xdd\xf0\x01.\xb4\xdf=<\xe8\xf5`\xfa\xf5\xc3\xb7\xce\ +\x05\xf30T\xd8\xf9\xe4c\xa8\xd9\x8c\xa1\x1cC\xb6v\ +\x85\xb3\xce\xa5\xee\xd0\xb9\x05J\x8f\xb9\x1c\xbe\x5c\xc1\xd9\ +\xf4Cg\xd4\x99p7Rxxpx\xc0\x16K!\ +5\xf1\xbf\x8c\x98w\xb7\xfd\xdc\x9d\x88PK\xc1UL\ +z\xa9\xbf\xdc\xfe\x85\x9e\x86\xc7\xc3\x03\xa0\x8b\xf9c\x90\ +B\xe8\xf4i)\xc5\x12\xa5~\x00\x89$\xc9\xc7\x99\x1b\ +q=]\xba\x1e\x0b\xe7c\x18\xf4\xb7\xa8\xa6\x0fJ\xe3\ +\xe2\xab\xcbQk\x84e\xfa?\xdeZ~\x84\xa7X\xf0\ +\xc6\xc1{W\x82\x97ju\xc3B_\xac\xc6\x90\xfe\x1b\ +\xb5\xe2k\xc5|\x1d\x8c\x89\x8ew\xc9 \xce<\xa6o\ +\xe2%x\x9bh\xdc\xddT\x0f~\x86aq6\xc0\x18\ +\xfe\xcd\xc3\xe7\xc9\xda.\xa7\xe9\x94\x90).\xdd\xcc\xaa\ +\xee*\xd1\xaf\xa0\xd1Ls\xb2\xd5\xc9\xc0\xcd\xf4w\x0a\ +\x82\x89\xe0\xd1\x22,\x1bd\xf0&\xf6\x9b\x8bn\xe8\x05\ +B\xaa\xee\x8cq>&\x1c%\x85\x81\x9db\xe1\xca9\ +\x0b\xd5\xd8f\xc3\xe6\x09e\xbc\xd6J\xb9\xe9t\x0f9\ +\xbf)\x90O\x9c\x00=\x18A\xc7\xb0\xdc<}\xe1\xde\ +\x22''k\x5c\xeb\x12\x1c\x9a\xe2]!\xf9\xd8\x87\x14\ +\xb9\xb1\x13\xc7A\xf9\xe4o\x92\xf9\xdb\xf0\x18\x88\xe6\xb4\ +W\xdd\xf1\x12H\xc9\xfaQuow{K\xb1\x95B\ +\x9d\x1aY%:\x8b\xb4\x16\xa1ME\xa3\xa6\x0a\xc4*\ +\xa5\xb2\xd3\x94B8\xc7\xd5N\x99\xc2\x97\xe8\xaeQ\xe9\ +4\x9a\xba\xf7L\xb1[\x8e\xf0+8\xe7\xccG\x07\x08\ +\xe1i\xb0\x11f\xe5K\x84\x13\x8a\xf4;\xf4\xeb9\x9d\ +\xc0\x9b\x9a\xad*\xcb\xa7\xeaR\xaf\xf7\x06\xfeH\x1d\x8a\ +\xfe$@\xef\xeeV\xac\xff\xac\xd2%[gb]\x07\ +^\x16-7\x19\xa7\x1a{L\x16\x170w\xd3\xa5\x97\ +\xa2}Fr\xe3\xac'\xefz\xb1\xa6H\x81HE\x89\ +GX\x83\x1c\xe3\x8c\x12\xe4\xe4\xe4$\xcb\xf3\xae\xd1\xdc\ +\x06\xd2.\xae\xc8\x18n\xb3\xfbO\x9d\xf0j\xf0f\xde\ +\xfd\x18q\x0eSO\x22\x86\xcek\xf9!\x96\x91\x8a\xd8\ +\x93'\x0a\x86;\xf9\xa2\xbdF\xb8\x91\x16\xfb\xac\x11\xce\ +)1\x5c\xb8\x9ay\xce^\x0c\xce\xd9\xfd\x9eo\xeed\ +\xf9\xae\xd1U\xd8\xdf\x18]\x99q\x9fY\xc8\x16\xec{\ +mIxy\xc4\xe4\x12\xf6\x1409\xbf\x1f\x89\x9a\xbb\ +~m\xd4\x8c\x84}\xa1f\xf8\xb5\xa2\xb6\xf58\x8bB\ +O32\xa4\xe0z-\xa6Z\x92yG\xf7\xc76X\ +\xd5\x8ai/\x80\x9a]\xcfU\xb8]\x85\xc7v\x13%\ +\xeaH\x86\xe0\x98\xd2\xeb\xfc\xd2\xcc.\x8f\x8c\x16~\x8b\ +<\xe6\xdb\x18\x1a\xd0\xda\x18\xe6\xe1\xd0\xc2\xb0(v-\ +\x1cgD\xa8\xd2J\xde\xc2\xd2RNZx\xbby=\ +kaM-\x90\xdf\xaai\x90\x10\xd9XY\x02\xd7\x1c\ +\x8a\xc2\xbbP\xac*\xa7\x9e\xac\xad\xae\xbdc-\xc21\ +!\xab\x12e\xa9\xba\xd1\x14\x03S\xe0\xd0Dr\xd4\xd0\ +\xf8e\xb7I\xef\xc7B\xf3t\x0co\xed8\x001t\ +I@\xe0\xaa\x92N\x89\x94\xac\xdb\xb5$N}\xc6\x1e\ +7\x22rE\x93\xa4\x1b\xceI\xd1Gk\xb7^\x99\xa2\ +b\x10\xfee7n*\xe3\xa0Q\xa3I$c&Y\ +K\xf0\xf8\xffW\xf8\xd4d\xa0\x22m-|\xcb\xf4\xd9\ +\xad}\x9e.\xdc\xd70L\x8f\x86\xfd\xea\x90<|\xd7\ +\xaf\xcc\xbe\xceO\xc3\xc1\xfbw\xfd\xbeS\x9dx\xafI\ +\x90\x91@\xa55H\x8f$\x11\x96\xdc\x15'f\xdc\x9d\ +\xd3\xb4v\xa9\xb3\xca\x0a\x7f\x17\xf7\x1f\xf3\x8a\x92\xbe\xe6\ +\xceYy\xe6\xad\xf5\xd3k\x8c\xca\xb5ymXy$\ +\x04\xe5\xa7\xd0.\xb0\x94\xdc\xd34\xb9+\xdf\x02,~\ +\xff,\x22\x85\xa74r7\x09\xae\xb7\xb2\xe5\x95\x9b\xba\ +\xe4\x84\xdc\x88}o4\xc0f]\xea\x9bX\xa3\x88L\ +#%\x0bLioH\x0c\xb1\x16\xcb\x9c\x94\xee\xeb\x09\ +wwQ\xcb\x88\xdc4\x16P\x09\xc55\xd3Pz\x85\ +\xc5\xa5t.\xca+\xb5)>x\xdfo\x04\xbe\xae\xf1\ +\x9f\xc1\xd1s5=\xae+\xe8\xb0\xbf>>\xbe\x90+\ +|\x99\xa8g\xccH\xcf\x8e4\x8e\xb3\x22\xd0\xe2\x87\x1f\ +\x14g\xce\xb7\xfa\xa0\x18\xf5\x9f\x97\x8c\x5c(<\xaa\x7f\ +\x936\x96u\xb5\xe4\xae\x0aLa\x9f&Oe\xfcD\ +x\xcd\x16(\x22\x93\x1a\x1b\x9fUK\x9f}\xb4\x8c0\ +\x97C\xbf\x7f\x00\xe8k\x05\xe6\ +\x00\x00\x04$\ +/\ +/ Copyright (C) \ +2021 The Qt Comp\ +any Ltd.\x0d\x0a// SPD\ +X-License-Identi\ +fier: LicenseRef\ +-Qt-Commercial O\ +R BSD-3-Clause\x0d\x0a\ +\x0d\x0aimport QtQuick\ +\x0d\x0aimport shared\x0d\ +\x0a\x0d\x0a//! [splash-p\ +roperties]\x0d\x0aWind\ +ow {\x0d\x0a id: sp\ +lash\x0d\x0a color:\ + \x22transparent\x22\x0d\x0a\ + title: \x22Spla\ +sh Window\x22\x0d\x0a \ +modality: Qt.App\ +licationModal\x0d\x0a \ + flags: Qt.Spl\ +ashScreen\x0d\x0a p\ +roperty int time\ +outInterval: 200\ +0\x0d\x0a signal ti\ +meout\x0d\x0a//! [spla\ +sh-properties]\x0d\x0a\ +//! [screen-prop\ +erties]\x0d\x0a x: \ +(Screen.width - \ +splashImage.widt\ +h) / 2\x0d\x0a y: (\ +Screen.height - \ +splashImage.heig\ +ht) / 2\x0d\x0a//! [sc\ +reen-properties]\ +\x0d\x0a width: spl\ +ashImage.width\x0d\x0a\ + height: spla\ +shImage.height\x0d\x0a\ +\x0d\x0a Image {\x0d\x0a \ + id: splas\ +hImage\x0d\x0a \ +source: Images.q\ +tLogo\x0d\x0a M\ +ouseArea {\x0d\x0a \ + anchors.\ +fill: parent\x0d\x0a \ + onClic\ +ked: Qt.quit()\x0d\x0a\ + }\x0d\x0a }\ +\x0d\x0a //! [timer\ +]\x0d\x0a Timer {\x0d\x0a\ + interval\ +: splash.timeout\ +Interval; runnin\ +g: true; repeat:\ + false\x0d\x0a \ +onTriggered: {\x0d\x0a\ + spla\ +sh.visible = fal\ +se\x0d\x0a \ +splash.timeout()\ +\x0d\x0a }\x0d\x0a \ + }\x0d\x0a //! [tim\ +er]\x0d\x0a Compone\ +nt.onCompleted: \ +visible = true\x0d\x0a\ +}\x0d\x0a\ +\x00\x00\x03\x08\ +\x00\ +\x00\x0a\xb7x\xda\xadV\xdfo\xda0\x10~G\xe2\x7f\ +\xb8\xe5\x09\xb6\x91\x00\xeb\xa6)}\x986\xaam\x95\xd0\ +\xdaB\xa5uZ\xf7`\x92\x03\xac&v\xe48\x144\ +\xf5\x7f\x9f\x9d\x1f\x8d\x01\x0f\x82\xb6\x08\x89\xdc\xf9\xbb\xfb\ +>\xdbg_<\x0fF<\xd9\x08\xbaXJ\xe8\x8c\xba\ +0\xec\x0f\x07p\xbbD\xb8\x91j$N\x08\xdb\xc0X\ +\x86n\xbb\xe5y0\xbd\xbe\xb8\xeb\x8di\x80,\xc5\xde\ +e\x88L\xd29E\xe1C\xe9\x9b\xe0\xbcw#{*\ +.F\x11P\x12\xc1\xd5\x04>M/zoz\xa3\x88\ +d)\xb6[\xed\x16\x8d\x13.\xa4\xca\x7f\x93\xd1\xe0a\ +\xd7vG\x9cI\xc1\xa3TC/%\xc6\xf0\xbb\xdd\x02\ +\xf5\xd0\xd0\x07\xc1\xb9,\xacG\x1a\xca\xa5\x0fg\xfd~\ +a/Q\xcf\xc0\x87D\xf0\x04\x85\xdc|\x114tU\ +\xe6\x88\x06T~\xcd\x07\xe1\x15\x0c\xde\xe9\xac\x1a?\xcf\ +X )g\xc0\x05U\xd3 \xfa\xfd\x96O\xa5\xa0l\ +\xd1\xe1\xdd\x8aT?\xe9#\x95\xc1\x12v\xbc\x01I\xf5\ +\x1a\xb9\xd7\x82\xc6Dl\xae\xea4~\x0d\xd2\x8f@\x99\ +\x09\x06NR\x00\x9dsK\x0e5\x7fA\xa8l\x90\xa4\ +D\xda\xb2\x8c\x09\x0b\xd3\x80$x<MTAmy\ +.\xd9J\xad \x86\xcdU\xd12\x02\x0e\xc9\xab\xd2\x9e\ + \xf39\xafU\xefS\xfdZ\x05d\xec\x81\xf1GV\ +\xa1\x9e\xaa\xdd\xd6\xd5`n\x9e\xae%\xb3R\x0c\xb5<\ +\xcab\x96\xfa04\x0a !\x81*\x0b\x1f\xde\xd7\xbe\ +\xb5_\xb9k\xdf\xc6\xf0\xd5^\xcf{\x01?\xd3@ \ +\xb2_\xb5wLf\x18\x99\x92\xf4#q\xadJ\xd8\x99\ +\xe6`\xb8w\x1cU\xb2\x85\xe12\x12\xa3\xb2\x9c{\xc7\ +w\xb6\x83\xe6\xea\xbc\xb83\x1e\xa9)I\x91\xa1u}\ +\x8asT\x1d\x9a\xc1\xf9\xf3q\x19\xc0\x93\x12\x98\xcbF\ +a\xaa.\xf5U\x92b\xc2\xb29\x09\xd4*\xa3p\xcc\ +\xcc\xdb\xb8R\xac\x89\x86\x0fV\xaf_oV\xbdM6\ +b\x1eb\xd4\x80Q\xc3\x0c\xaa\xdcl\xca\x91\xa2\xd0W\ +\x15\xcb\xe2Y\x93\xd9\x15\xf0o9\xba\xa6\xdc\xf26e\ +\x0ei\xac\xaeMu\x00\xd2\xe3\xb4\xf9\xe6\xe9\x12X\x1b\ +eQ\xec\xe3A\x8e\x84\xae\x95\x19j\x1e\xb99N\x93\ +\xc3/\x0a\xb4+\xf9ge\x86\x9daW\x13C\xc8e\ +\xea\xc51t\xb4\x82\x8e%\x00^\xc2\xf0\xad{\xd6\xb5\ +\x06R\x16,\xbb\x87\xd7#\xe2\x0b\x1a\xa8\xad8Qs\ +\x19v}\xaatK\xdc\xbf\xce \xc4\x95j\x85\xe5\x04\ +\x84\xbe\xdc\x8e\xcb/br\x15\x13\x1dar\x1f\xe2\x22\ ++B#2\x8b\x10VT\xc8\x8c\xe8\x15K\x1f$O\ +\x9aP\xe6\xc0\x8fU\x86\xef\xb6\xe2\xda\x05}mPl\ +\x5c-\xa2n\xab\x94\x9d.\xaa\x0c\xb8\xd3:^\x83!\ +\xa4\x1c\xf8q\x90\xdah\xe4\x07\xa8\xf4\x17\x84k\xeb\xf9\ +%\x951Tl|\xc7\xd0a\x0c\xea\xb1#\xa5P6\ +|\xf8?\xc2\x92\xbd\xef\x8c}}\xfb\x98Z\xa6\xbd\x1d\ +\xfdU\xfc\xa0\xaf\x0e\x8b\xc0@\x12\xb6\x88p+\xc3\xa4\ +\xf2\xee\xb6/\xd5;\xb9\xfa\x16t\x04\x86;=\xaal\ +<\xf6\x1bc\xd0\xdf\x06W\xbd)\x0f\xdakg\xeaO\ +\xfd\xfe\x00\x1e\x91\x1e\xa9\ +" + +qt_resource_name = b"\ +\x00\x06\ +\x07\xe0Kg\ +\x00w\ +\x00i\x00n\x00d\x00o\x00w\ +\x00\x0e\ +\x0ei\x17\x5c\ +\x00A\ +\x00l\x00l\x00S\x00c\x00r\x00e\x00e\x00n\x00s\x00.\x00q\x00m\x00l\ +\x00\x0a\ +\x0bi\x98\xbc\ +\x00w\ +\x00i\x00n\x00d\x00o\x00w\x00.\x00q\x00m\x00l\ +\x00\x0a\ +\x08\x90\x1a|\ +\x00S\ +\x00p\x00l\x00a\x00s\x00h\x00.\x00q\x00m\x00l\ +\x00\x11\ +\x02YG\x1c\ +\x00C\ +\x00u\x00r\x00r\x00e\x00n\x00t\x00S\x00c\x00r\x00e\x00e\x00n\x00.\x00q\x00m\x00l\ +\ +" + +qt_resource_struct = b"\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x04\x00\x00\x00\x02\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00h\x00\x01\x00\x00\x00\x01\x00\x00\x0d\xcc\ +\x00\x00\x01\x87V\x12\x92R\ +\x00\x00\x00N\x00\x00\x00\x00\x00\x01\x00\x00\x09\xa4\ +\x00\x00\x01\x87V\x12\x92R\ +\x00\x00\x004\x00\x01\x00\x00\x00\x01\x00\x00\x05\x16\ +\x00\x00\x01\x87V\x12\x92R\ +\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00\x01\x87V\x12\x92R\ +" + +def qInitResources(): + QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) + +def qCleanupResources(): + QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) + +qInitResources() diff --git a/examples/quick/window/resources/icon.icns b/examples/quick/window/resources/icon.icns Binary files differnew file mode 100644 index 000000000..88b4b2444 --- /dev/null +++ b/examples/quick/window/resources/icon.icns diff --git a/examples/quick/window/resources/icon.ico b/examples/quick/window/resources/icon.ico Binary files differnew file mode 100644 index 000000000..52af30a6c --- /dev/null +++ b/examples/quick/window/resources/icon.ico diff --git a/examples/quick/window/resources/icon.svg b/examples/quick/window/resources/icon.svg new file mode 100644 index 000000000..0b6153206 --- /dev/null +++ b/examples/quick/window/resources/icon.svg @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="128" + height="128" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.48.2 r9819" + version="1.0" + sodipodi:docname="icon.svg" + inkscape:export-filename="/Users/rutledge/dev/qt5-stable/qtdeclarative/examples/quick/window/window/icon80.png" + inkscape:export-xdpi="61.509998" + inkscape:export-ydpi="61.509998" + inkscape:output_extension="org.inkscape.output.svg.inkscape"> + <defs + id="defs4"> + <linearGradient + id="linearGradient4009"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop4011" /> + <stop + id="stop4019" + offset="0.875" + style="stop-color:#ffffff;stop-opacity:0.49803922;" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop4013" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 186.64798 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="559.62469 : 186.64798 : 1" + inkscape:persp3d-origin="279.81235 : 124.43199 : 1" + id="perspective4876" /> + <inkscape:perspective + id="perspective2836" + inkscape:persp3d-origin="22 : 14.666667 : 1" + inkscape:vp_z="44 : 22 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 22 : 1" + sodipodi:type="inkscape:persp3d" /> + <filter + inkscape:collect="always" + id="filter4063" + x="-0.195491" + width="1.390982" + y="-0.16235915" + height="1.3247183"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="3.3077485" + id="feGaussianBlur4065" /> + </filter> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10" + guidetolerance="10" + objecttolerance="10000" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="2.9775825" + inkscape:cx="62.656189" + inkscape:cy="42.423381" + inkscape:document-units="px" + inkscape:current-layer="layer1" + inkscape:window-width="1280" + inkscape:window-height="744" + inkscape:window-x="2003" + inkscape:window-y="156" + showgrid="true" + borderlayer="true" + showguides="true" + inkscape:guide-bbox="true" + inkscape:snap-global="false" + inkscape:window-maximized="0"> + <inkscape:grid + type="xygrid" + id="grid7194" + visible="true" + enabled="true" + spacingx="8px" + spacingy="8px" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-66.38047,-391.3222)"> + <path + id="path7304" + d="M 95.556318,434.65407 L 165.25811,434.65407 L 165.25811,490.10429 L 95.556318,490.10429 L 95.556318,434.65407 z" + style="fill:#01afaf;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:5.24121141000000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + style="fill:#a7c706;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 96.869177,465.30846 c 27.677903,3.04574 41.155393,12.11589 48.000003,24 l -48.000003,0 0,-24 z" + id="path7300" + sodipodi:nodetypes="cccc" + inkscape:connector-curvature="0" /> + <path + sodipodi:nodetypes="cccc" + id="path7302" + d="M 165.46767,465.22201 C 137.78977,468.26775 124.31228,477.33791 117.46767,489.22201 L 165.46767,489.22201 L 165.46767,465.22201 z" + style="fill:#966406;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:1" /> + <path + style="fill:#80ffff;fill-rule:evenodd;stroke:#000000;stroke-width:5.24121141000000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;opacity:1;fill-opacity:1" + d="M 95.532809,434.35736 L 74.567964,420.38079 L 74.567964,497.25189 L 95.532809,490.26361 L 95.532809,434.35736 z" + id="path7270" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:5.24121141;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 74.567964,455.3222 L 95.532809,462.31048" + id="path7272" + sodipodi:nodetypes="cc" /> + <g + style="fill:#80ffff;fill-opacity:1" + id="g7278" + transform="matrix(-0.8735352,0,0,0.8735352,244.36615,64.570513)"> + <path + style="fill:#80ffff;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1" + d="M 24,32 L 0,16 L 0,104 L 24,96 L 24,32 z" + id="path7280" + transform="translate(66.38047,391.3222)" /> + <path + style="fill:#80ffff;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1" + d="M 0,56 L 24,64" + id="path7282" + transform="translate(66.38047,391.3222)" + sodipodi:nodetypes="cc" /> + </g> + <path + style="fill:#ffffff;fill-opacity:1;filter:url(#filter4063)" + d="m 119.74679,437.94232 c -0.0487,0.003 -0.0932,0.0315 -0.14149,0.0354 -0.1659,0.0132 -0.33372,0.008 -0.49523,0.0354 -0.96156,0.0643 -1.9037,0.14607 -2.86523,0.21224 -2.94807,0.23566 -5.19987,2.66253 -5.19987,6.01345 l 0,39.51194 3.32508,3.07747 0,-0.0354 33.2155,-5.58898 c 2.28673,-0.39587 4.06792,-3.06727 4.06792,-5.97808 l 0,-32.18967 -30.5625,-5.023 c -0.45263,-0.0748 -0.91269,-0.0942 -1.34418,-0.0708 z" + id="path3987" + inkscape:connector-curvature="0" /> + <g + id="g3" + transform="matrix(0.20572087,0,0,0.20572087,113.4162,440.80626)"> + <path + sodipodi:nodetypes="cccccccc" + id="path5" + style="fill:#006225" + d="M 43.09,0.3586 C 40.94,0.0036 38.84,-0.0824 36.81,0.0776 31.968136,0.39505671 27.122677,0.73638425 22.28,1.0696 9.62,2.0816 0,12.4996 0,26.8896 l 0,169.7 14.19,13.2 28.87,-209.42 0.03,-0.011 z" + inkscape:connector-curvature="0" /> + <path + id="path7" + style="fill:#80c342" + d="m 174.4,160 c 0,12.5 -7.75,24.07 -17.57,25.77 L 14.23,209.73 V 25.93 C 14.23,9.21 27.57,-2.27 43.12,0.3 l 131.3,21.52 v 138.2 z" + inkscape:connector-curvature="0" /> + <path + id="path11" + style="fill:#006225" + d="m 154.9,80.96 -12.96,-0.598 0,0.278 6.945,0.32 6.016,0 z" + inkscape:connector-curvature="0" /> + <path + id="path13" + style="fill:#006225" + d="m 144.6,135.6 c 0.66,0.328 1.43,0.476 2.351,0.476 0.161,0 0.329,-0.004 0.497,-0.016 2.55,-0.148 5.32,-0.933 8.343,-2.308 h -6.015 c -1.821,0.832 -3.532,1.457 -5.176,1.848 z" + inkscape:connector-curvature="0" /> + <path + d="m 91.15,132.4 c 2.351,-6.051 3.511,-17.91 3.511,-35.62 0,-15.89 -1.148,-26.82 -3.484,-32.81 -2.336,-6.027 -5.832,-9.281 -10.52,-9.691 -0.359,-0.031 -0.714,-0.051 -1.058,-0.051 -4.34,0 -7.68,2.535 -10.01,7.625 -2.52,5.543 -3.793,17.04 -3.793,34.44 0,16.82 1.238,28.75 3.734,35.75 2.356,6.672 5.879,9.976 10.5,9.976 0.207,0 0.41,-0.008 0.621,-0.019 4.633,-0.293 8.121,-3.496 10.49,-9.602 m 17.98,3.75 c -4.117,9.707 -10.39,16.06 -18.99,19 0.867,4.449 2.176,7.441 3.922,9.019 1.351,1.211 3.433,1.821 6.222,1.821 0.805,0 1.668,-0.055 2.59,-0.157 v 13.12 l -5.961,0.782 c -1.758,0.23 -3.426,0.343 -5.004,0.343 -5.218,0 -9.445,-1.265 -12.62,-3.824 -4.207,-3.379 -7.308,-9.894 -9.297,-19.54 -9.136,-1.945 -16.26,-7.754 -21.19,-17.5 -5.004,-9.902 -7.551,-24.39 -7.551,-43.34 0,-20.43 3.484,-35.51 10.34,-45.07 5.789,-8.07 13.86,-12.04 24.02,-12.04 1.629,0 3.309,0.102 5.043,0.305 11.95,1.375 20.62,7.016 26.26,16.79 5.535,9.562 8.254,23.27 8.254,41.26 0,16.48 -2,29.45 -6.043,39.02 z M 130.4,45.91 l 11.52,1.238 0,20.21 12.96,0.914 0,12.68 -12.96,-0.598 0,46.33 c 0,4.032 0.445,6.625 1.34,7.789 0.8,1.067 2.046,1.594 3.71,1.594 0.161,0 0.329,-0.004 0.497,-0.016 2.55,-0.148 5.32,-0.933 8.343,-2.308 v 11.65 c -5.136,2.258 -10.18,3.598 -15.12,4.02 -0.718,0.055 -1.41,0.086 -2.078,0.086 -4.48,0 -7.906,-1.301 -10.25,-3.934 -2.73,-3.051 -4.09,-7.949 -4.09,-14.67 V 79.535 L 118.046,79.25 V 65.66 l 7.586,0.547 4.773,-20.3 z" + style="fill:#ffffff" + id="path17" + inkscape:connector-curvature="0" /> + <path + id="path19" + style="fill:#006225" + d="m 100.3,166 c 0.809,0 1.672,-0.055 2.59,-0.157 H 98.054 C 98.73,165.949 99.507,166 100.3,166 z" + inkscape:connector-curvature="0" /> + <path + d="m 84.85,63.98 c 2.336,5.997 3.484,16.92 3.484,32.81 0,17.7 -1.16,29.57 -3.512,35.62 -1.894,4.879 -4.527,7.902 -7.863,9.07 0.965,0.368 1.992,0.551 3.078,0.551 0.207,0 0.41,-0.008 0.621,-0.019 4.633,-0.293 8.121,-3.496 10.49,-9.602 2.351,-6.051 3.511,-17.91 3.511,-35.62 0,-15.89 -1.148,-26.82 -3.484,-32.81 -2.336,-6.027 -5.832,-9.281 -10.52,-9.691 -0.359,-0.031 -0.714,-0.051 -1.058,-0.051 -1.09,0 -2.117,0.16 -3.082,0.481 h -0.004 c 3.601,1.121 6.379,4.215 8.336,9.261 z m -2.344,114.3 c -0.113,-0.05 -0.227,-0.105 -0.336,-0.16 -0.012,-0.004 -0.023,-0.012 -0.035,-0.015 -0.102,-0.051 -0.207,-0.106 -0.309,-0.157 -0.019,-0.011 -0.039,-0.019 -0.058,-0.031 -0.09,-0.051 -0.184,-0.098 -0.278,-0.148 -0.027,-0.016 -0.054,-0.036 -0.086,-0.051 -0.082,-0.043 -0.164,-0.09 -0.242,-0.137 -0.039,-0.023 -0.078,-0.047 -0.113,-0.07 -0.07,-0.039 -0.145,-0.082 -0.215,-0.125 -0.047,-0.031 -0.094,-0.059 -0.14,-0.09 -0.059,-0.039 -0.118,-0.074 -0.176,-0.113 -0.059,-0.039 -0.114,-0.075 -0.168,-0.114 -0.051,-0.031 -0.102,-0.066 -0.149,-0.097 -0.066,-0.047 -0.132,-0.094 -0.195,-0.137 -0.039,-0.027 -0.078,-0.055 -0.113,-0.082 -0.078,-0.055 -0.153,-0.113 -0.231,-0.172 -0.023,-0.016 -0.05,-0.035 -0.078,-0.055 -0.098,-0.078 -0.199,-0.156 -0.297,-0.234 -4.207,-3.379 -7.308,-9.894 -9.297,-19.54 -9.136,-1.945 -16.26,-7.754 -21.19,-17.5 -5.004,-9.902 -7.551,-24.39 -7.551,-43.34 0,-20.43 3.484,-35.51 10.34,-45.07 5.789,-8.07 13.86,-12.04 24.02,-12.04 h -6.351 c -10.15,0.008 -18.22,3.977 -24,12.04 -6.855,9.563 -10.34,24.64 -10.34,45.07 0,18.95 2.547,33.44 7.551,43.34 4.934,9.75 12.05,15.56 21.19,17.5 1.989,9.641 5.09,16.16 9.297,19.54 3.176,2.559 7.403,3.824 12.62,3.824 0.098,0 0.199,0 0.297,-0.004 h 5.539 c -3.406,-0.05 -6.383,-0.66 -8.906,-1.828 L 82.498,178.28 z M 128.4,145.6 c -2.73,-3.051 -4.09,-7.949 -4.09,-14.67 V 79.57 l -6.226,-0.285 v -13.59 h -6.016 v 3.035 c 0.871,3.273 1.555,6.82 2.063,10.64 l 4.164,0.192 v 51.36 c 0,6.723 1.367,11.62 4.09,14.67 2.343,2.633 5.765,3.934 10.25,3.934 h 6.015 c -4.48,0 -7.906,-1.301 -10.25,-3.934 z m 2.043,-99.66 -6.016,0 -4.668,19.88 5.911,0.422 4.773,-20.3 z" + style="fill:#006225" + id="path21" + inkscape:connector-curvature="0" /> + </g> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:5.24121141;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 96.506224,434.65407 L 166.20801,434.65407 L 166.20801,490.10429 L 96.506224,490.10429 L 96.506224,434.65407 z" + id="rect7265" /> + </g> +</svg> diff --git a/examples/quick/window/resources/icon64.png b/examples/quick/window/resources/icon64.png Binary files differnew file mode 100644 index 000000000..0fa324401 --- /dev/null +++ b/examples/quick/window/resources/icon64.png diff --git a/examples/quick/window/window.pyproject b/examples/quick/window/window.pyproject new file mode 100644 index 000000000..d3375e95b --- /dev/null +++ b/examples/quick/window/window.pyproject @@ -0,0 +1,3 @@ +{ + "files": ["main.py", "window.qml", "window.qrc", "Splash.qml", "AllScreens.qml", "CurrentScreen.qml"] +} diff --git a/examples/quick/window/window.qml b/examples/quick/window/window.qml new file mode 100644 index 000000000..47cc5257b --- /dev/null +++ b/examples/quick/window/window.qml @@ -0,0 +1,151 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Controls + +QtObject { + id: root + property real defaultSpacing: 10 + property SystemPalette palette: SystemPalette { } + + property var controlWindow: Window { + width: col.implicitWidth + root.defaultSpacing * 2 + height: col.implicitHeight + root.defaultSpacing * 2 + color: root.palette.window + title: "Control Window" + Column { + id: col + anchors.fill: parent + anchors.margins: root.defaultSpacing + spacing: root.defaultSpacing + property real cellWidth: col.width / 3 - spacing + Label { text: "Control the second window:" } + Grid { + id: grid + columns: 3 + spacing: root.defaultSpacing + width: parent.width + Button { + id: showButton + width: col.cellWidth + text: root.testWindow.visible ? "Hide" : "Show" + onClicked: root.testWindow.visible = !root.testWindow.visible + } + //! [windowedCheckbox] + CheckBox { + text: "Windowed" + height: showButton.height + width: col.cellWidth + Binding on checked { value: root.testWindow.visibility === Window.Windowed } + onClicked: root.testWindow.visibility = Window.Windowed + } + //! [windowedCheckbox] + CheckBox { + height: showButton.height + width: col.cellWidth + text: "Full Screen" + Binding on checked { value: root.testWindow.visibility === Window.FullScreen } + onClicked: root.testWindow.visibility = Window.FullScreen + } + Button { + id: autoButton + width: col.cellWidth + text: "Automatic" + onClicked: root.testWindow.visibility = Window.AutomaticVisibility + } + CheckBox { + height: autoButton.height + text: "Minimized" + Binding on checked { value: root.testWindow.visibility === Window.Minimized } + onClicked: root.testWindow.visibility = Window.Minimized + } + CheckBox { + height: autoButton.height + text: "Maximized" + Binding on checked { value: root.testWindow.visibility === Window.Maximized } + onClicked: root.testWindow.visibility = Window.Maximized + } + } + function visibilityToString(v) { + switch (v) { + case Window.Windowed: + return "windowed"; + case Window.Minimized: + return "minimized"; + case Window.Maximized: + return "maximized"; + case Window.FullScreen: + return "fullscreen"; + case Window.AutomaticVisibility: + return "automatic"; + case Window.Hidden: + return "hidden"; + } + return "unknown"; + } + Label { + id: visibilityLabel + text: "second window is " + (root.testWindow.visible ? "visible" : "invisible") + + " and has visibility " + parent.visibilityToString(root.testWindow.visibility) + } + Rectangle { + color: root.palette.text + width: parent.width + height: 1 + } + CurrentScreen { } + Rectangle { + color: root.palette.text + width: parent.width + height: 1 + } + AllScreens { width: parent.width } + } + } + + property var testWindow: Window { + width: 320 + height: 240 + color: "#215400" + title: "Test Window with color " + color + flags: Qt.Window | Qt.WindowFullscreenButtonHint + Rectangle { + anchors.fill: parent + anchors.margins: root.defaultSpacing + Label { + anchors.centerIn: parent + text: "Second Window" + } + MouseArea { + anchors.fill: parent + onClicked: root.testWindow.color = "#e0c31e" + } + Button { + anchors.right: parent.right + anchors.top: parent.top + anchors.margins: root.defaultSpacing + text: root.testWindow.visibility === Window.FullScreen ? "exit fullscreen" : "go fullscreen" + width: 150 + onClicked: { + if (root.testWindow.visibility === Window.FullScreen) + root.testWindow.visibility = Window.AutomaticVisibility + else + root.testWindow.visibility = Window.FullScreen + } + } + Button { + anchors.left: parent.left + anchors.top: parent.top + anchors.margins: root.defaultSpacing + text: "X" + width: 30 + onClicked: root.testWindow.close() + } + } + } + + property var splashWindow: Splash { + onTimeout: root.controlWindow.visible = true + } +} diff --git a/examples/quick/window/window.qrc b/examples/quick/window/window.qrc new file mode 100644 index 000000000..89d1de1b1 --- /dev/null +++ b/examples/quick/window/window.qrc @@ -0,0 +1,8 @@ +<RCC> + <qresource prefix="/window"> + <file>window.qml</file> + <file>Splash.qml</file> + <file>CurrentScreen.qml</file> + <file>AllScreens.qml</file> + </qresource> +</RCC> |