Commit 4ca49dc9 authored by Tim Jenssen's avatar Tim Jenssen

QmlDesigner: add more specifics

Fix: QTCREATORBUG-12798

Change-Id: I8d36bb4ccae05cdb28833317d74a06e7628540a1
Reviewed-by: default avatarThomas Hartmann <Thomas.Hartmann@digia.com>
parent 61b699b3
......@@ -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);
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;
}
Q_ASSERT(value.canConvert<Enumeration>());
int propertyIndex = object()->metaObject()->indexOfProperty(name);
QMetaProperty metaProperty = object()->metaObject()->property(propertyIndex);
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) {
......
/****************************************************************************
**
** 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"
}
/****************************************************************************
**
** 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
}
}
}
}
/****************************************************************************
**
** 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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment