diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/ExtendedFunctionButton.qml b/share/qtcreator/qmldesigner/propertyeditor/Qt/ExtendedFunctionButton.qml index 3f2956c93a0352b9716ebfc0ace19c42becd3014..b943e395d39f37e6da8eb299121f250a23752f40 100644 --- a/share/qtcreator/qmldesigner/propertyeditor/Qt/ExtendedFunctionButton.qml +++ b/share/qtcreator/qmldesigner/propertyeditor/Qt/ExtendedFunctionButton.qml @@ -11,8 +11,12 @@ AnimatedToolButton { function setIcon() { if (backendValue == null) extendedFunctionButton.iconFromFile = "images/placeholder.png" - else if (backendValue.isBound) { - extendedFunctionButton.iconFromFile = "images/expression.png" + else if (backendValue.isBound ) { + if (backendValue.isTranslated) { //translations are a special case + extendedFunctionButton.iconFromFile = "images/placeholder.png" + } else { + extendedFunctionButton.iconFromFile = "images/expression.png" + } } else { if (backendValue.complexNode != null && backendValue.complexNode.exists) { extendedFunctionButton.iconFromFile = "images/behaivour.png" @@ -26,11 +30,16 @@ AnimatedToolButton { setIcon(); } property bool isBoundBackend: backendValue.isBound; + property string backendExpression: backendValue.expression; onIsBoundBackendChanged: { setIcon(); } + onBackendExpressionChanged: { + setIcon(); + } + toolButtonStyle: "Qt::ToolButtonIconOnly" popupMode: "QToolButton::InstantPopup"; property bool active: false; diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/LineEdit.qml b/share/qtcreator/qmldesigner/propertyeditor/Qt/LineEdit.qml index e1bb4c72384a8f8ff60ad5a0cd294fdc343f18fc..0909caf84663f7075c8e90c9736e26b4172d4d3d 100644 --- a/share/qtcreator/qmldesigner/propertyeditor/Qt/LineEdit.qml +++ b/share/qtcreator/qmldesigner/propertyeditor/Qt/LineEdit.qml @@ -9,6 +9,7 @@ QWidget { property variant baseStateFlag property alias text: lineEditWidget.text property alias readOnly: lineEditWidget.readOnly + property alias translation: trCheckbox.visible minimumHeight: 24; @@ -68,7 +69,11 @@ QWidget { } onEditingFinished: { - backendValue.value = text + if (backendValue.isTranslated) { + backendValue.expression = "qsTr(\"" + text + "\")" + } else { + backendValue.value = text + } evaluate(); } @@ -87,4 +92,30 @@ QWidget { x: 0 visible: lineEdit.enabled } + QCheckBox { + id: trCheckbox + y: 2 + styleSheetFile: "checkbox_tr.css"; + toolTip: qsTr("Translate this string") + x: lineEditWidget.width - 22 + height: lineEdit.height - 2; + width: 24 + visible: false + checked: backendValue.isTranslated + onToggled: { + if (trCheckbox.checked) { + backendValue.expression = "qsTr(\"" + lineEditWidget.text + "\")" + } else { + backendValue.value = lineEditWidget.text + } + evaluate(); + } + + onVisibleChanged: { + if (trCheckbox.visible) { + trCheckbox.raise(); + lineEditWidget.styleSheet = "QLineEdit { padding-left: 32; padding-right: 62;}" + } + } + } } diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/StandardTextGroupBox.qml b/share/qtcreator/qmldesigner/propertyeditor/Qt/StandardTextGroupBox.qml index 1662a2419e2c1e083e5cb170977815ff19a7361a..3f29936cbfbf3236524dd3fdedc3f6c4e32b5e0c 100644 --- a/share/qtcreator/qmldesigner/propertyeditor/Qt/StandardTextGroupBox.qml +++ b/share/qtcreator/qmldesigner/propertyeditor/Qt/StandardTextGroupBox.qml @@ -18,6 +18,7 @@ GroupBox { LineEdit { backendValue: backendValues.text baseStateFlag: isBaseState; + translation: true } } } diff --git a/src/libs/qmleditorwidgets/images/checkbox_tr_checked.png b/src/libs/qmleditorwidgets/images/checkbox_tr_checked.png new file mode 100644 index 0000000000000000000000000000000000000000..af0cedd9765432aecf1bd77f13f7c4816232f285 Binary files /dev/null and b/src/libs/qmleditorwidgets/images/checkbox_tr_checked.png differ diff --git a/src/libs/qmleditorwidgets/images/checkbox_tr_checked_hover.png b/src/libs/qmleditorwidgets/images/checkbox_tr_checked_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..5815357d255b688d6a6aba88f83178421473a9c8 Binary files /dev/null and b/src/libs/qmleditorwidgets/images/checkbox_tr_checked_hover.png differ diff --git a/src/libs/qmleditorwidgets/images/checkbox_tr_checked_pressed.png b/src/libs/qmleditorwidgets/images/checkbox_tr_checked_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..b4a3be55c3376e2fa0c3245821ff2d52adc9ff6c Binary files /dev/null and b/src/libs/qmleditorwidgets/images/checkbox_tr_checked_pressed.png differ diff --git a/src/libs/qmleditorwidgets/images/checkbox_tr_unchecked.png b/src/libs/qmleditorwidgets/images/checkbox_tr_unchecked.png new file mode 100644 index 0000000000000000000000000000000000000000..528d1f9afe41d92642eb9ae65c63f6b01b812c58 Binary files /dev/null and b/src/libs/qmleditorwidgets/images/checkbox_tr_unchecked.png differ diff --git a/src/libs/qmleditorwidgets/images/checkbox_tr_unchecked_hover.png b/src/libs/qmleditorwidgets/images/checkbox_tr_unchecked_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..6d038b0e6dab4b6291d0087af24e1a548a40ce70 Binary files /dev/null and b/src/libs/qmleditorwidgets/images/checkbox_tr_unchecked_hover.png differ diff --git a/src/libs/qmleditorwidgets/images/checkbox_tr_unchecked_pressed.png b/src/libs/qmleditorwidgets/images/checkbox_tr_unchecked_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..1b731b2e98e127bbfb85b2563136c3eb78c82c8d Binary files /dev/null and b/src/libs/qmleditorwidgets/images/checkbox_tr_unchecked_pressed.png differ diff --git a/src/libs/qmleditorwidgets/resources.qrc b/src/libs/qmleditorwidgets/resources.qrc index ee4949f2dc2ee3c51e321a58664ce5944ac58f1d..16575214fc0b2d4b398fcacdc6c2e460ad618f1f 100644 --- a/src/libs/qmleditorwidgets/resources.qrc +++ b/src/libs/qmleditorwidgets/resources.qrc @@ -6,6 +6,12 @@ <file>images/checkbox_unchecked.png</file> <file>images/checkbox_unchecked_hover.png</file> <file>images/checkbox_unchecked_pressed.png</file> + <file>images/checkbox_tr_checked.png</file> + <file>images/checkbox_tr_checked_hover.png</file> + <file>images/checkbox_tr_checked_pressed.png</file> + <file>images/checkbox_tr_unchecked.png</file> + <file>images/checkbox_tr_unchecked_hover.png</file> + <file>images/checkbox_tr_unchecked_pressed.png</file> <file>images/eye_open.png</file> <file>images/eye_crossed.png</file> <file>images/lock.png</file> diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp index 2ac8ce14900cdb2b00b93318090ed031840e6e9f..a6d7019858ff48408836428f2070470a38da36c3 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp @@ -31,6 +31,7 @@ **************************************************************************/ #include "propertyeditorvalue.h" +#include <QRegExp> #include <abstractview.h> #include <nodeabstractproperty.h> #include <nodeproperty.h> @@ -97,7 +98,7 @@ static bool cleverColorCompare(QVariant value1, QVariant value2) void PropertyEditorValue::setValueWithEmit(const QVariant &value) { - if (m_value != value) { + if (m_value != value || isBound()) { QVariant newValue = value; if (modelNode().isValid() && modelNode().metaInfo().isValid() && modelNode().metaInfo().hasProperty(name())) if (modelNode().metaInfo().propertyTypeName(name()) == QLatin1String("QUrl")) { @@ -190,6 +191,22 @@ void PropertyEditorValue::setIsValid(bool valid) m_isValid = valid; } +bool PropertyEditorValue::isTranslated() const +{ + if (modelNode().isValid() && modelNode().metaInfo().isValid() && modelNode().metaInfo().hasProperty(name())) + if (modelNode().metaInfo().propertyTypeName(name()) == QLatin1String("QString") || modelNode().metaInfo().propertyTypeName(name()) == QLatin1String("string")) { + const QmlDesigner::QmlObjectNode objectNode(modelNode()); + if (objectNode.isValid() && objectNode.hasBindingProperty(name())) { + //qsTr() + QRegExp rx("qsTr(\"*\")"); + rx.setPatternSyntax(QRegExp::Wildcard); + return rx.exactMatch(expression()); + } + return false; + } + return false; +} + QmlDesigner::ModelNode PropertyEditorValue::modelNode() const { return m_modelNode; diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.h b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.h index ac4a35227317ce5e14e0ff8a95ccf99009f38e12..a9bd25cd99faa72586a3f47851c73ff9fc69a541 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.h +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.h @@ -86,6 +86,8 @@ class PropertyEditorValue : public QObject Q_PROPERTY(bool isInSubState READ isInSubState NOTIFY valueChangedQml FINAL) Q_PROPERTY(bool isBound READ isBound NOTIFY isBoundChanged FINAL) Q_PROPERTY(bool isValid READ isValid NOTIFY isValidChanged FINAL) + Q_PROPERTY(bool isTranslated READ isTranslated NOTIFY valueChangedQml FINAL) + Q_PROPERTY(QString name READ name FINAL) Q_PROPERTY(PropertyEditorNodeWrapper* complexNode READ complexNode NOTIFY complexNodeChanged FINAL) @@ -109,6 +111,8 @@ public: void setIsValid(bool valid); + bool isTranslated() const; + QString name() const; void setName(const QString &name);