forked from qt-creator/qt-creator
QmlDesigner: add more specifics
Fix: QTCREATORBUG-12798 Change-Id: I8d36bb4ccae05cdb28833317d74a06e7628540a1 Reviewed-by: Thomas Hartmann <Thomas.Hartmann@digia.com>
This commit is contained in:
@@ -475,33 +475,21 @@ PropertyNameList ObjectNodeInstance::ignoredProperties() const
|
||||
|
||||
QVariant ObjectNodeInstance::convertEnumToValue(const QVariant &value, const PropertyName &name)
|
||||
{
|
||||
int idx = object()->metaObject()->indexOfProperty(name);
|
||||
QMetaProperty metaProperty = object()->metaObject()->property(idx);
|
||||
Q_ASSERT(value.canConvert<Enumeration>());
|
||||
int propertyIndex = object()->metaObject()->indexOfProperty(name);
|
||||
QMetaProperty metaProperty = object()->metaObject()->property(propertyIndex);
|
||||
|
||||
QVariant fixedValue = fixResourcePaths(value);
|
||||
|
||||
if (value.canConvert<Enumeration>()) {
|
||||
Enumeration enumeration = value.value<Enumeration>();
|
||||
if (metaProperty.isValid() && metaProperty.isEnumType()) {
|
||||
fixedValue = metaProperty.enumerator().keyToValue(enumeration.name());
|
||||
} else if (metaProperty.isValid()
|
||||
&& (QLatin1String(metaProperty.typeName()) == QLatin1String("int"))) {
|
||||
|
||||
//If the target property is an integer handle an enum as binding
|
||||
QQmlExpression expression(context(), object(), enumeration.toString());
|
||||
fixedValue = expression.evaluate();
|
||||
if (expression.hasError())
|
||||
qDebug() << "Enum can not be evaluated:" << object() << name << enumeration;
|
||||
} else if (!metaProperty.isValid()) { //In this case this is most likely an attached property
|
||||
QQmlExpression expression(context(), object(), enumeration.toString());
|
||||
fixedValue = expression.evaluate();
|
||||
|
||||
if (expression.hasError())
|
||||
qDebug() << "Enum can not be evaluated:" << object() << name << enumeration;
|
||||
}
|
||||
QVariant adjustedValue;
|
||||
Enumeration enumeration = value.value<Enumeration>();
|
||||
if (metaProperty.isValid() && metaProperty.isEnumType()) {
|
||||
adjustedValue = metaProperty.enumerator().keyToValue(enumeration.name());
|
||||
} else {
|
||||
QQmlExpression expression(context(), object(), enumeration.toString());
|
||||
adjustedValue = expression.evaluate();
|
||||
if (expression.hasError())
|
||||
qDebug() << "Enumeration can not be evaluated:" << object() << name << enumeration;
|
||||
}
|
||||
|
||||
return fixedValue;
|
||||
return adjustedValue;
|
||||
}
|
||||
|
||||
void ObjectNodeInstance::setPropertyVariant(const PropertyName &name, const QVariant &value)
|
||||
@@ -514,8 +502,12 @@ void ObjectNodeInstance::setPropertyVariant(const PropertyName &name, const QVar
|
||||
if (!property.isValid())
|
||||
return;
|
||||
|
||||
QVariant fixedValue = fixResourcePaths(value);
|
||||
fixedValue = convertEnumToValue(fixedValue, name);
|
||||
QVariant adjustedValue;
|
||||
if (value.canConvert<Enumeration>())
|
||||
adjustedValue = convertEnumToValue(value, name);
|
||||
else
|
||||
adjustedValue = fixResourcePaths(value);
|
||||
|
||||
|
||||
QVariant oldValue = property.read();
|
||||
if (oldValue.type() == QVariant::Url) {
|
||||
@@ -529,10 +521,10 @@ void ObjectNodeInstance::setPropertyVariant(const PropertyName &name, const QVar
|
||||
QQmlPropertyPrivate::setBinding(property, 0, QQmlPropertyPrivate::BypassInterceptor | QQmlPropertyPrivate::DontRemoveBinding);
|
||||
}
|
||||
|
||||
bool isWritten = property.write(convertSpecialCharacter(fixedValue));
|
||||
bool isWritten = property.write(convertSpecialCharacter(adjustedValue));
|
||||
|
||||
if (!isWritten)
|
||||
qDebug() << "ObjectNodeInstance.setPropertyVariant: Cannot be written: " << object() << name << fixedValue;
|
||||
qDebug() << "ObjectNodeInstance.setPropertyVariant: Cannot be written: " << object() << name << adjustedValue;
|
||||
|
||||
QVariant newValue = property.read();
|
||||
if (newValue.type() == QVariant::Url) {
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of Qt Creator.
|
||||
**
|
||||
** 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 Digia. For licensing terms and
|
||||
** conditions see http://qt.digia.com/licensing. For further information
|
||||
** use the contact form at http://qt.digia.com/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Digia gives you certain additional
|
||||
** rights. These rights are described in the Digia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.1
|
||||
import HelperWidgets 2.0
|
||||
import QtQuick.Layouts 1.0
|
||||
|
||||
ComboBox {
|
||||
backendValue: backendValues.orientation
|
||||
implicitWidth: 180
|
||||
model: [ "Horizontal", "Vertical" ]
|
||||
scope: "Qt"
|
||||
}
|
||||
@@ -0,0 +1,147 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of Qt Creator.
|
||||
**
|
||||
** 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 Digia. For licensing terms and
|
||||
** conditions see http://qt.digia.com/licensing. For further information
|
||||
** use the contact form at http://qt.digia.com/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Digia gives you certain additional
|
||||
** rights. These rights are described in the Digia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
****************************************************************************/
|
||||
import HelperWidgets 2.0
|
||||
import QtQuick 2.1
|
||||
import QtQuick.Layouts 1.1
|
||||
Section {
|
||||
caption: "Slider"
|
||||
SectionLayout {
|
||||
Label {
|
||||
text: qsTr("Value")
|
||||
toolTip: qsTr("Current value of the Slider. The default value is 0.0.")
|
||||
}
|
||||
SecondColumnLayout {
|
||||
SpinBox {
|
||||
maximumValue: backendValues.maximumValue.value
|
||||
minimumValue: backendValues.minimumValue.value
|
||||
decimals: 2
|
||||
stepSize: backendValues.stepSize.value
|
||||
backendValue: backendValues.value
|
||||
implicitWidth: 180
|
||||
}
|
||||
ExpandingSpacer {}
|
||||
}
|
||||
Label {
|
||||
text: qsTr("Maximum Value")
|
||||
toolTip: qsTr("This property holds the maximum value of the Slider The default value is 1.0.")
|
||||
}
|
||||
SecondColumnLayout {
|
||||
SpinBox {
|
||||
maximumValue: 9999999
|
||||
minimumValue: -9999999
|
||||
decimals: 2
|
||||
backendValue: backendValues.maximumValue
|
||||
implicitWidth: 180
|
||||
}
|
||||
ExpandingSpacer {
|
||||
|
||||
}
|
||||
}
|
||||
Label {
|
||||
text: qsTr("Minimum Value")
|
||||
toolTip: qsTr("This property holds the minimum value of the Slider. The default value is 0.0.")
|
||||
}
|
||||
SecondColumnLayout {
|
||||
SpinBox {
|
||||
maximumValue: 9999999
|
||||
minimumValue: -9999999
|
||||
decimals: 2
|
||||
backendValue: backendValues.minimumValue
|
||||
implicitWidth: 180
|
||||
}
|
||||
ExpandingSpacer {
|
||||
|
||||
}
|
||||
}
|
||||
Label {
|
||||
text: qsTr("Orientation")
|
||||
toolTip: qsTr("This property holds the layout orientation of the Slider.")
|
||||
}
|
||||
SecondColumnLayout {
|
||||
OrientationCombobox {
|
||||
}
|
||||
ExpandingSpacer {
|
||||
|
||||
}
|
||||
}
|
||||
Label {
|
||||
text: qsTr("Step Size")
|
||||
toolTip: qsTr("This property indicates the Slider step size.")
|
||||
}
|
||||
SecondColumnLayout {
|
||||
SpinBox {
|
||||
maximumValue: 9999999
|
||||
minimumValue: -9999999
|
||||
decimals: 2
|
||||
backendValue: backendValues.stepSize
|
||||
implicitWidth: 180
|
||||
}
|
||||
ExpandingSpacer {}
|
||||
}
|
||||
|
||||
Label {
|
||||
text: qsTr("Active Focus On Press")
|
||||
toolTip: qsTr("This property indicates whether the Slider should receive active focus when pressed.")
|
||||
}
|
||||
|
||||
SecondColumnLayout {
|
||||
CheckBox {
|
||||
text: backendValues.activeFocusOnPress.valueToString
|
||||
backendValue: backendValues.activeFocusOnPress
|
||||
implicitWidth: 180
|
||||
}
|
||||
ExpandingSpacer {}
|
||||
}
|
||||
Label {
|
||||
text: qsTr("Tickmarks Enabled")
|
||||
toolTip: qsTr("TIndicates whether the Slider should display tickmarks at step intervals.")
|
||||
}
|
||||
|
||||
SecondColumnLayout {
|
||||
CheckBox {
|
||||
text: backendValues.tickmarksEnabled.valueToString
|
||||
backendValue: backendValues.tickmarksEnabled
|
||||
implicitWidth: 180
|
||||
}
|
||||
ExpandingSpacer {}
|
||||
}
|
||||
Label {
|
||||
text: qsTr("Update Value While Dragging")
|
||||
toolTip: qsTr("Current value should be updated while the user is moving the Slider handle, or only when the button has been released.")
|
||||
}
|
||||
|
||||
SecondColumnLayout {
|
||||
CheckBox {
|
||||
text: backendValues.updateValueWhileDragging.valueToString
|
||||
backendValue: backendValues.updateValueWhileDragging
|
||||
implicitWidth: 180
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of Qt Creator.
|
||||
**
|
||||
** 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 Digia. For licensing terms and
|
||||
** conditions see http://qt.digia.com/licensing. For further information
|
||||
** use the contact form at http://qt.digia.com/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Digia gives you certain additional
|
||||
** rights. These rights are described in the Digia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.1
|
||||
import HelperWidgets 2.0
|
||||
import QtQuick.Layouts 1.0
|
||||
|
||||
Column {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
Section {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
caption: qsTr("Split View")
|
||||
|
||||
SectionLayout {
|
||||
Label {
|
||||
text: qsTr("Orientation")
|
||||
toolTip: qsTr("This property holds the orientation of the SplitView.")
|
||||
}
|
||||
|
||||
SecondColumnLayout {
|
||||
OrientationCombobox {
|
||||
}
|
||||
|
||||
ExpandingSpacer {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -171,7 +171,7 @@ MetaInfo {
|
||||
libraryIcon: ":/componentsplugin/images/sliderh.png"
|
||||
version: "1.0"
|
||||
requiredImport: "QtQuick.Controls"
|
||||
Property { name: "orientation"; type: "int"; value: "0"; }
|
||||
Property { name: "orientation"; type: "Enumeration"; value: "Qt.Vertical"; }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -46,5 +46,8 @@
|
||||
<file>Controls/TabViewSpecifics.qml</file>
|
||||
<file>Controls/TabPositionComboBox.qml</file>
|
||||
<file>Controls/CurrentIndexComboBox.qml</file>
|
||||
<file>Controls/SplitViewSpecifics.qml</file>
|
||||
<file>Controls/SliderSpecifics.qml</file>
|
||||
<file>Controls/OrientationCombobox.qml</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
||||
@@ -41,7 +41,6 @@ namespace PropertyParser {
|
||||
QVariant read(const QString &typeStr, const QString &str, const MetaInfo &metaInfo);
|
||||
QVariant read(const QString &typeStr, const QString &str);
|
||||
QVariant read(int variantType, const QString &str);
|
||||
QString write(const QVariant &variant, const MetaInfo &metaInfo);
|
||||
QVariant variantFromString(const QString &s);
|
||||
|
||||
} // namespace PropertyParser
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
****************************************************************************/
|
||||
|
||||
#include "propertyparser.h"
|
||||
#include "enumeration.h"
|
||||
#include <modelnode.h>
|
||||
#include <metainfo.h>
|
||||
|
||||
@@ -178,6 +179,15 @@ QVector3D vector3DFromString(const QString &s, bool *ok)
|
||||
return QVector3D(xCoord, yCoord, zCoord);
|
||||
}
|
||||
|
||||
QmlDesigner::Enumeration enumerationFromString(const QString &string, bool *ok)
|
||||
{
|
||||
QmlDesigner::Enumeration tEnumeration(string);
|
||||
if (ok)
|
||||
*ok = !tEnumeration.scope().isEmpty() && !tEnumeration.name().isEmpty();
|
||||
return tEnumeration;
|
||||
}
|
||||
|
||||
|
||||
} //namespace
|
||||
|
||||
namespace QmlDesigner {
|
||||
@@ -238,8 +248,12 @@ QVariant read(int variantType, const QString &str)
|
||||
value = vector3DFromString(str, &conversionOk);
|
||||
break;
|
||||
default: {
|
||||
value = QVariant(str);
|
||||
value.convert(static_cast<QVariant::Type>(variantType));
|
||||
if (variantType == QMetaType::type("Enumeration")) {
|
||||
value = QVariant::fromValue<Enumeration>(enumerationFromString(str, &conversionOk));
|
||||
} else {
|
||||
value = QVariant(str);
|
||||
value.convert(static_cast<QVariant::Type>(variantType));
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -251,7 +265,6 @@ QVariant read(int variantType, const QString &str)
|
||||
}
|
||||
|
||||
return value;
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
QVariant variantFromString(const QString &s)
|
||||
@@ -273,63 +286,6 @@ QVariant variantFromString(const QString &s)
|
||||
return QVariant(s);
|
||||
}
|
||||
|
||||
QString write(const QVariant &variant)
|
||||
{
|
||||
if (!variant.isValid()) {
|
||||
qWarning() << "Trying to serialize invalid QVariant";
|
||||
return QString();
|
||||
}
|
||||
QString value;
|
||||
switch (variant.type()) {
|
||||
case QMetaType::QPoint:
|
||||
{
|
||||
QPoint p = variant.toPoint();
|
||||
value = QString("%1,%2").arg(QString::number(p.x()), QString::number(p.y()));
|
||||
break;
|
||||
}
|
||||
case QMetaType::QPointF:
|
||||
{
|
||||
QPointF p = variant.toPointF();
|
||||
value = QString("%1,%2").arg(QString::number(p.x(), 'f'), QString::number(p.y(), 'f'));
|
||||
break;
|
||||
}
|
||||
case QMetaType::QSize:
|
||||
{
|
||||
QSize s = variant.toSize();
|
||||
value = QString("%1x%2").arg(QString::number(s.width()), QString::number(s.height()));
|
||||
break;
|
||||
}
|
||||
case QMetaType::QSizeF:
|
||||
{
|
||||
QSizeF s = variant.toSizeF();
|
||||
value = QString("%1x%2").arg(QString::number(s.width(), 'f'), QString::number(s.height(), 'f'));
|
||||
break;
|
||||
}
|
||||
case QMetaType::QRect:
|
||||
{
|
||||
QRect r = variant.toRect();
|
||||
value = QString("%1,%2,%3x%4").arg(QString::number(r.x()), QString::number(r.y()),
|
||||
QString::number(r.width()), QString::number(r.height()));
|
||||
break;
|
||||
}
|
||||
case QMetaType::QRectF:
|
||||
{
|
||||
QRectF r = variant.toRectF();
|
||||
value = QString("%1,%2,%3x%4").arg(QString::number(r.x(), 'f'), QString::number(r.y(), 'f'),
|
||||
QString::number(r.width(), 'f'), QString::number(r.height(), 'f'));
|
||||
break;
|
||||
}
|
||||
default:
|
||||
QVariant strVariant = variant;
|
||||
strVariant.convert(QVariant::String);
|
||||
if (!strVariant.isValid())
|
||||
qWarning() << Q_FUNC_INFO << "cannot serialize type " << QMetaType::typeName(variant.type());
|
||||
value = strVariant.toString();
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
} // namespace PropertyParser
|
||||
} // namespace Internal
|
||||
} // namespace Designer
|
||||
|
||||
Reference in New Issue
Block a user