blob: 78ef8b7b1628f4e5df556dd4469020c052052e0c [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the test suite of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
import QtQuick 2.2
import QtQuick.Controls 1.2
import QtQuick.Layouts 1.0
import "content"
ApplicationWindow {
width: 950
height: 600
signal propertyChanged
property bool ignoreUpdate: false
onPropertyChanged: container.resetSize()
property var propertyMap: ({})
property SpinBox widthControl
property SpinBox heightControl
color: "lightgray"
Components{ id: components }
SystemPalette { id: syspal }
toolBar: ToolBar {
width: parent.width
RowLayout {
id: alwaysVisible
anchors.left: parent.left
anchors.leftMargin: 8
height: parent.height
ComboBox {
id: selector
Layout.preferredWidth: 140
model: components.componentModel
textRole: "name"
}
CheckBox {
id: patternCheckBox
checked: false
text: "Background"
}
CheckBox {
id: customStyle
visible: components.customStyles.get(selector.currentIndex).component !== undefined
checked: false
text: !checked ? "Load Custom Style" : "Custom Style loaded"
onCheckedChanged: {
if (checked) {
loader.item.style = components.customStyles.get(selector.currentIndex).component
enabled = false
}
}
}
}
CheckBox {
id: startStopAnim
anchors.left: alwaysVisible.right
anchors.verticalCenter: parent.verticalCenter
text: "Stop Animation"
checked: true
visible: false
onCheckedChanged: if (visible) loader.item.___isRunning = checked
}
}
statusBar: StatusBar {
Row {
anchors.left: parent.left
anchors.leftMargin: 8
anchors.verticalCenter: parent.verticalCenter
spacing: 5
Label { text: "X: " + topLeftHandle.x; width: 70 }
Label { text: "Y: " + topLeftHandle.y; width: 70 }
Label { text: "Width: " + container.width; width: 80 }
Label { text: "Height: "+container.height; width: 80 }
}
}
SplitView {
anchors.fill: parent
Flickable {
id: testBenchRect
clip: true
Layout.fillWidth: true
Image {
anchors.fill: parent
source: "../images/checkered.png"
fillMode: Image.Tile
opacity: patternCheckBox.checked ? 0.12 : 0
Behavior on opacity { NumberAnimation { duration: 100 } }
}
Rectangle {
id: container
property bool pressed: topLeftHandle.pressed || bottomRightHandle.pressed
function resetSize() {
topLeftHandle.x = (testBenchRect.width - loader.item.implicitWidth) / 2 - topLeftHandle.width;
topLeftHandle.y = (testBenchRect.height - loader.item.implicitHeight) / 2 - topLeftHandle.height;
bottomRightHandle.x = topLeftHandle.x + loader.item.implicitWidth;
bottomRightHandle.y = topLeftHandle.y + loader.item.implicitHeight;
}
function updateSize() {
ignoreUpdate = true
if (widthControl)
widthControl.value = loader.item.width
if (heightControl)
heightControl.value = loader.item.height
ignoreUpdate = false
}
onHeightChanged: updateSize()
onWidthChanged: updateSize()
y: Math.floor(topLeftHandle.y + topLeftHandle.height - topLeftHandle.width/2)
x: Math.floor(topLeftHandle.x + topLeftHandle.width - topLeftHandle.height/2)
width: Math.floor(bottomRightHandle.x - topLeftHandle.x )
height: Math.floor(bottomRightHandle.y - topLeftHandle.y)
color: "transparent"
border.color: pressed ? "darkgray" : "transparent"
Loader {
id: loader
focus: true
sourceComponent: selector.model.get(selector.currentIndex).component
anchors.fill: parent
PropertyLayouts{ id: layouts }
onStatusChanged: {
startStopAnim.visible = false
customStyle.enabled = true
customStyle.checked = false
if (status == Loader.Ready) {
propertyMap = {}
var arr = {}
for (var prop in item) {
if (prop.toString() === "___isRunning") {
startStopAnim.visible = true
continue;
}
if (!(item[prop] instanceof Function)) { // We only want properties
var typeName = "None";
var layout
var enumModelData
var isColor = false
switch (prop) {
case "activeFocusOnPress":
case "activeFocusOnTab":
case "enabled":
case "visible":
case "checkable":
case "checked":
case "running":
case "editable":
case "frameVisible":
case "adjustToContentSize":
case "flat":
case "selectByMouse":
case "selectByKeyboard":
case "readOnly":
case "indeterminate":
case "updateValueWhileDragging":
case "tickmarksEnabled":
case "sortIndicatorVisible":
case "isDefault":
case "partiallyCheckedEnabled":
case "alternatingRowColors":
case "movableColumns":
case "gridVisible":
case "weekNumbersVisible":
layout = layouts.boolLayout
typeName = "Boolean";
break
case "maximumValue":
case "minimumValue":
case "decimals":
case "currentIndex":
case "sortIndicatorColumn":
case "visibleMonth":
case "visibleYear":
layout = layouts.intLayout
typeName = "Int"
break;
case "scale":
case "height":
case "width":
case "stepSize":
case "value":
case "opacity":
layout = layouts.realLayout
typeName = "Real";
break;
case "implicitHeight":
case "activeFocus":
case "implicitWidth":
case "acceptableInput":
case "pressed":
case "currentText":
layout = layouts.readonlyLayout
typeName = "ReadOnly"
break;
case "prefix":
case "suffix":
case "text":
case "title":
case "tooltip":
case "iconSource":
layout = layouts.stringLayout
typeName = "String";
break;
case "horizontalAlignment":
layout = layouts.enumLayout
enumModelData = Qt.createQmlObject('import QtQuick 2.2; import QtQuick.Controls 1.2; ListModel {}', layout, '');
typeName = "Enum";
enumModelData.append({ text: "TextEdit.AlignLeft", value: TextEdit.AlignLeft});
enumModelData.append({ text: "TextEdit.AlignRight", value: TextEdit.AlignRight});
enumModelData.append({ text: "TextEdit.AlignHCenter", value: TextEdit.AlignHCenter});
break;
case "textFormat":
layout = layouts.enumLayout
enumModelData = Qt.createQmlObject('import QtQuick 2.2; import QtQuick.Controls 1.2; ListModel {}', layout, '');
typeName = "Enum";
enumModelData.append({ text: "TextEdit.RichText", value: TextEdit.RichText});
enumModelData.append({ text: "TextEdit.PlainText", value: TextEdit.PlainText});
enumModelData.append({ text: "TextEdit.AutoText", value: TextEdit.AutoText});
break;
case "verticalAlignment":
layout = layouts.enumLayout
enumModelData = Qt.createQmlObject('import QtQuick 2.2; import QtQuick.Controls 1.2; ListModel {}', layout, '');
typeName = "Enum";
enumModelData.append({ text: "TextEdit.AlignTop", value: TextEdit.AlignTop});
enumModelData.append({ text: "TextEdit.AlignBottom", value: TextEdit.AlignBottom});
enumModelData.append({ text: "TextEdit.AlignVCenter", value: TextEdit.AlignVCenter});
break;
case "textFormat":
layout = layouts.enumLayout
enumModelData = Qt.createQmlObject('import QtQuick 2.2; import QtQuick.Controls 1.2; ListModel {}', layout, '');
typeName = "Enum";
enumModelData.append({ text: "TextEdit.RichText", value: TextEdit.RichText});
enumModelData.append({ text: "TextEdit.PlainText", value: TextEdit.PlainText});
enumModelData.append({ text: "TextEdit.AutoText", value: TextEdit.AutoText});
break;
case "inputMethodHints":
layout = layouts.enumLayout
enumModelData = Qt.createQmlObject('import QtQuick 2.2; import QtQuick.Controls 1.2; ListModel {}', layout, '');
typeName = "Enum";
enumModelData.append({ text: "Qt.ImhNone", value: Qt.ImhNone});
enumModelData.append({ text: "Qt.ImhHiddenText", value: Qt.ImhHiddenText});
enumModelData.append({ text: "Qt.ImhSensitiveData", value: Qt.ImhSensitiveData});
enumModelData.append({ text: "Qt.ImhNoAutoUppercase", value: Qt.ImhNoAutoUppercase});
enumModelData.append({ text: "Qt.ImhPreferNumbers", value: Qt.ImhPreferNumbers});
enumModelData.append({ text: "Qt.ImhPreferUppercase", value: Qt.ImhPreferUppercase});
enumModelData.append({ text: "Qt.ImhPreferLowercase", value: Qt.ImhPreferLowercase});
enumModelData.append({ text: "Qt.ImhNoPredictiveText", value: Qt.ImhNoPredictiveText});
enumModelData.append({ text: "Qt.ImhDate", value: Qt.ImhDate});
enumModelData.append({ text: "Qt.ImhTime", value: Qt.ImhTime});
enumModelData.append({ text: "Qt.ImhDigitsOnly", value: Qt.ImhDigitsOnly});
enumModelData.append({ text: "Qt.ImhFormattedNumbersOnly", value: Qt.ImhFormattedNumbersOnly});
enumModelData.append({ text: "Qt.ImhUppercaseOnly", value: Qt.ImhUppercaseOnly});
enumModelData.append({ text: "Qt.ImhLowercaseOnly", value: Qt.ImhLowercaseOnly});
enumModelData.append({ text: "Qt.ImhDialableCharactersOnly",value: Qt.ImhDialableCharactersOnly});
enumModelData.append({ text: "Qt.ImhEmailCharactersOnly", value: Qt.ImhEmailCharactersOnly});
enumModelData.append({ text: "Qt.ImhUrlCharactersOnly", value: Qt.ImhUrlCharactersOnly});
break;
case "orientation":
layout = layouts.enumLayout
enumModelData = Qt.createQmlObject('import QtQuick 2.2; import QtQuick.Controls 1.2; ListModel {}', layout, '');
typeName = "Enum";
enumModelData.append({ text: "Qt.Horizontal", value: Qt.Horizontal});
enumModelData.append({ text: "Qt.Vertical", value: Qt.Vertical});
break;
case "echoMode":
layout = layouts.enumLayout
enumModelData = Qt.createQmlObject('import QtQuick 2.2; import QtQuick.Controls 1.2; ListModel {}', layout, '');
typeName = "Enum";
enumModelData.append({ text: "TextInput.Normal", value: TextInput.Normal});
enumModelData.append({ text: "TextInput.Password", value: TextInput.Password});
enumModelData.append({ text: "TextInput.NoEcho", value: TextInput.NoEcho});
enumModelData.append({ text: "TextInput.PasswordEchoOnEdit",value: TextInput.PasswordEchoOnEdit});
break;
case "backgroundColor":
case "textColor":
isColor = true
layout = layouts.enumLayout
enumModelData = Qt.createQmlObject('import QtQuick 2.2; import QtQuick.Controls 1.2; ListModel {}', layout, '');
typeName = "Enum";
enumModelData.append({ text: "Amber", value: "#FF7E00"});
enumModelData.append({ text: "Azure", value: "#007FFF"});
enumModelData.append({ text: "Carmine red", value: "#FF0038"});
break;
case "sortIndicatorOrder":
layout = layouts.enumLayout
enumModelData = Qt.createQmlObject('import QtQuick 2.2; import QtQuick.Controls 1.2; ListModel {}', layout, '');
typeName = "Enum";
enumModelData.append({ text: "Qt.AscendingOrder", value: Qt.AscendingOrder});
enumModelData.append({ text: "Qt.DescendingOrder", value: Qt.DescendingOrder});
break;
case "checkedState":
layout = layouts.enumLayout
enumModelData = Qt.createQmlObject('import QtQuick 2.2; import QtQuick.Controls 1.2; ListModel {}', layout, '');
typeName = "Enum";
enumModelData.append({ text: "Qt.Checked", value: Qt.Checked});
enumModelData.append({ text: "Qt.Unchecked", value: Qt.Unchecked});
enumModelData.append({ text: "Qt.PartiallyChecked", value: Qt.PartiallyChecked});
break;
case "dayOfWeekFormat":
layout = layouts.enumLayout
enumModelData = Qt.createQmlObject('import QtQuick 2.2; import QtQuick.Controls 1.2; ListModel {}', layout, '');
typeName = "Enum";
enumModelData.append({ text: "ShortFormat", value: Locale.ShortFormat});
enumModelData.append({ text: "LongFormat", value: Locale.LongFormat});
enumModelData.append({ text: "NarrowFormat", value: Locale.NarrowFormat});
break;
default:
break;
}
var val = item[prop] + "" // All model properties must be the same type
if (typeName != "None" && val !== undefined) {
if (isColor)
enumModelData.append({ text: "Default", value: val})
if (arr[typeName] === undefined)
arr[typeName] = []
arr[typeName].push({name: prop , result: val, typeString: typeName, layoutComponent: layout, enumModel: enumModelData})
}
}
}
propertyMap = arr;
container.resetSize();
}
}
Rectangle {
id: marginsRect
color: "transparent"
// opacity: container.pressed && loader.item.styling && loader.item.styling.topMargin != undefined ? 1 : 0
border.color: Qt.rgba(0, 0, 0, 0.2)
anchors.fill: parent
z: 2
Connections {
target: loader
onItemChanged: {
if (!loader.item || !loader.item.styling) return;
marginsRect.anchors.leftMargin = Math.max(loader.item.styling.leftMargin, 0);
marginsRect.anchors.rightMargin = Math.max(loader.item.styling.rightMargin, 0);
marginsRect.anchors.topMargin = Math.max(loader.item.styling.topMargin, 0);
marginsRect.anchors.bottomMargin = Math.max(loader.item.styling.bottomMargin, 0);
}
}
}
}
}
MouseArea {
id: topLeftHandle
width: 10
height: 10
drag.target: topLeftHandle
drag.minimumX: 0; drag.minimumY: 0
drag.maximumX: bottomRightHandle.x - width
drag.maximumY: bottomRightHandle.y - height
Rectangle {
anchors.fill: parent
color: "lightsteelblue"
border.color: "steelblue"
}
}
MouseArea {
id: bottomRightHandle
width: 10
height: 10
drag.target: bottomRightHandle
drag.minimumX: topLeftHandle.x + width
drag.minimumY: topLeftHandle.y + height
drag.maximumX: testBenchRect.width - width;
drag.maximumY: testBenchRect.height - height
Rectangle {
anchors.fill: parent
color: "lightsteelblue"
border.color: "steelblue"
}
}
}
Rectangle {
id: sidebar
color : syspal.window
width: 200
ScrollView {
id: scrollView
anchors.fill: parent
flickableItem.flickableDirection: Flickable.VerticalFlick
Column {
id: properties
anchors.left: parent ? parent.left : undefined
anchors.top: parent ? parent.top : undefined
anchors.margins: 10
width: scrollView.viewport.width - 20
spacing: 8
Repeater {
model: ["Boolean", "String","Int", "Real", "ReadOnly", "Enum"]
Repeater {
model: propertyMap[modelData]
Loader {
width: properties.width
sourceComponent: modelData.layoutComponent
property string name: modelData.name
property var value: modelData.value
property var result: modelData.result
property var enumModel: modelData.enumModel
}
}
}
}
}
}
}
}