From 723a20488b173fd51a3303e6701d9b6ef8266e54 Mon Sep 17 00:00:00 2001
From: Thomas Hartmann <Thomas.Hartmann@nokia.com>
Date: Tue, 21 Jun 2011 16:11:55 +0200
Subject: [PATCH] QmlDesigner.propertyEditor: adding translation support

Adding support for qsTr()

Change-Id: Ib678820c40e910f744d9722e7958225dcc115d70
Reviewed-on: http://codereview.qt.nokia.com/565
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Thomas Hartmann <Thomas.Hartmann@nokia.com>
---
 .../Qt/ExtendedFunctionButton.qml             |  13 +++++--
 .../propertyeditor/Qt/LineEdit.qml            |  33 +++++++++++++++++-
 .../Qt/StandardTextGroupBox.qml               |   1 +
 .../images/checkbox_tr_checked.png            | Bin 0 -> 449 bytes
 .../images/checkbox_tr_checked_hover.png      | Bin 0 -> 449 bytes
 .../images/checkbox_tr_checked_pressed.png    | Bin 0 -> 449 bytes
 .../images/checkbox_tr_unchecked.png          | Bin 0 -> 354 bytes
 .../images/checkbox_tr_unchecked_hover.png    | Bin 0 -> 354 bytes
 .../images/checkbox_tr_unchecked_pressed.png  | Bin 0 -> 354 bytes
 src/libs/qmleditorwidgets/resources.qrc       |   6 ++++
 .../propertyeditor/propertyeditorvalue.cpp    |  19 +++++++++-
 .../propertyeditor/propertyeditorvalue.h      |   4 +++
 12 files changed, 72 insertions(+), 4 deletions(-)
 create mode 100644 src/libs/qmleditorwidgets/images/checkbox_tr_checked.png
 create mode 100644 src/libs/qmleditorwidgets/images/checkbox_tr_checked_hover.png
 create mode 100644 src/libs/qmleditorwidgets/images/checkbox_tr_checked_pressed.png
 create mode 100644 src/libs/qmleditorwidgets/images/checkbox_tr_unchecked.png
 create mode 100644 src/libs/qmleditorwidgets/images/checkbox_tr_unchecked_hover.png
 create mode 100644 src/libs/qmleditorwidgets/images/checkbox_tr_unchecked_pressed.png

diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/ExtendedFunctionButton.qml b/share/qtcreator/qmldesigner/propertyeditor/Qt/ExtendedFunctionButton.qml
index 3f2956c93a0..b943e395d39 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 e1bb4c72384..0909caf8466 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 1662a2419e2..3f29936cbfb 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
GIT binary patch
literal 449
zcmeAS@N?(olHy`uVBq!ia0vp@Ak4wWz`#)S`biA~0|R4mkh>GZx^prw85kJYlDyqr
z82*Fcg1yTpGcYi47I;J!Gca%qgD@k*tT_@43=Hfgp1!W^x7kEF6gc-iy!oGjfkCpw
zHKN2hKQ}iuuY|$5C^fMpHASI3vm`^o-P1Q9ypd0wfq_xR)5S4F<NVY~{@zT10tf2t
zez7R2yq~e|(beF2d(~Zk2>x;VyD>jt;g-44@5?@@NjT-S+v=RC>dn3H!+uj#(}<m|
ztx<meO!M_AYeV^ZlpFH4|ISz7XyRS6O2u=NxW@F;(UVst^(6jzqO24XH)nF{O@5Ei
z?Gri*V%8@0DDpU8GWmN|MQQe-sMUY#;*BrPmEmD?{crsD()5Hy?;o~DWp6dG{cV@N
zSI+!;c#pd>gP*l5!?o8fyC3Ez8vR`JwMw?(X;Ei~f>Omi_5&&$9gi!@)t}3#Z<S&Q
z6nQv@`M_r>hBMEL=M=l%fAV;*-*SuRJL)TzT+LEcGMVMea8IoJ5MRKiYgxPRrfrRS
uyEk}gP@>uF-1#>4cj7lDTYY(7%j}!D%5qE0_EZK21_n=8KbLh*2~7Z^k+8e~

literal 0
HcmV?d00001

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
GIT binary patch
literal 449
zcmeAS@N?(olHy`uVBq!ia0vp@Ak4wWz`#)S`biA~0|R4mkh>GZx^prw85kJYlDyqr
z82*Fcg1yTpGcYi47I;J!Gca%qgD@k*tT_@43=Hfgp1!W^x7kEF6d6}4CiE~cFi4iT
zMwB?`=jNv7l`uFLr6!i7rYMwWmSiZnd-?{1H}Z)yFfht^x;TbtoS!<$-<v5=;6T0I
zFBT=0_cPW#x*9xhue$3G!9Q+)H|7T{+%h-%ec1;!38$QPTb&bCy}9>&*l&tz8nLsr
zHOlXwX}&&XZ75%lazozs-}wq0O}tB1sd#P@*O-1fdh)8Ip2R;-l$B!Q=1fk#$?p-m
zeL_b;%-W<LMIPr%CV#K0D9t_;wfb*eyz#}kGCXXq|Be4%nx3%e{loUC?5zg2zwOfZ
z%9&pe?{QaV@Uxa>xc0hb_ru&oqn~TOR>?LzE$Zx0P^y^6en5qz<8ei~`g0letx^nu
zA`j;<ANVZAaOQdOoMPAePaf~}TW;}uM}5VTt67RlCbN7Q?um6D;tSYxEo=APw5?HZ
u_XaNwN;I3DJKx6sPW;AXt1s_snSB#iS#F8hp31<$z~JfX=d#Wzp$Pyt(600V

literal 0
HcmV?d00001

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
GIT binary patch
literal 449
zcmeAS@N?(olHy`uVBq!ia0vp@Ak4wWz`#)S`biA~0|R4mkh>GZx^prw85kJYlDyqr
z82*Fcg1yTpGcYi47I;J!Gca%qgD@k*tT_@43=Hfgp1!W^x7kEF6s441RwghoFi4iT
zMwB?`=jNv7l`uFLr6!i7rYMwWmSiZnd-?{1H}Z)yFfht^x;TbtoS!<$-<v5=;6T0I
zFBT=0_cPW#x*9xhue$3G!9Q+)H|7T{+%h-%ec1;!38$QPTb&bCy}9>&*l&tz8nLsr
zHOlXwX}&&XZ75%lazozs-}wq0O}tB1sd#P@*O-1fdh)8Ip2R;-l$B!Q=1fk#$?p-m
zeL_b;%-W<LMIPr%CV#K0D9t_;wfb*eyz#}kGCXXq|Be4%nx3%e{loUC?5zg2zwOfZ
z%9&pe?{QaV@Uxa>xc0hb_ru&oqn~TOR>?LzE$Zx0P^y^6en5qz<8ei~`g0letx^nu
zA`j;<ANVZAaOQdOoMPAePaf~}TW;}uM}5VTt67RlCbN7Q?um6D;tSYxEo=APw5?HZ
u_XaNwN;I3DJKx6sPW;AXt1s_snSB#iS#F8hp31<$z~JfX=d#Wzp$P!`P_D-S

literal 0
HcmV?d00001

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
GIT binary patch
literal 354
zcmeAS@N?(olHy`uVBq!ia0vp@Ak4wWz`#)S`biA~0|R4mkh>GZx^prw85kJYlDyqr
z82*Fcg1yTpGcYi47I;J!Gca%qgD@k*tT_@43=Hfgp1!W^x7kEFl;sm8>~k3y7$i$v
zBTAg}b8}PkN*J7rQWHy3QxwWGOEMJPJ$(bh8~MZ;7#Q|?x;TbtoS!=B?5bu1fmVBG
zNBIL&xtiYp_v;c+nX$IJ;pEFjDz16n>o?mNKTmI4xhzx2{59i+?|=7mUb`jEsnGIa
za=`Vkw>cex3b$PQ*QegOY8AtWd&;$O#*g_MrU=DeXS}d2w{Y?i10Ij0``?vvHgy&A
zHRRroxIR@v`PdXQMV6$V>lKv>$0Cwa!k^1%F3sMPzocjG^Ufva^E`JN_9-8m(eG40
zr|)sXyyvI4PD}k+XWOtW^WENw-~U~EZ_8-)s=2@M;I%jg1_lOCS3j3^P6<r_zOsqS

literal 0
HcmV?d00001

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
GIT binary patch
literal 354
zcmeAS@N?(olHy`uVBq!ia0vp@Ak4wWz`#)S`biA~0|R4mkh>GZx^prw85kJYlDyqr
z82*Fcg1yTpGcYi47I;J!Gca%qgD@k*tT_@43=Hfgp1!W^x7kEFRJcu=Yp*jfFi4iT
zMwB?`=jNv7l`uFLr6!i7rYMwWmSiZnd-?{1H}Z)yFfi=(ba4#PI6rmL*;UO30<HGW
zj`9blay7mG@7E=uGGlFb!^xM6R9y4C*Kf8lexBa8a#^O3`D?}t-~aCCymm{RQ=#R<
z<bdm6Z*w{X6>hoquTQ;m)hdP$_mpenj34tiOc9E`&Uj&4ZsFu320R`~_rELUZ0aiJ
zYskGFaeb<U^06sqiY!Sz*DER&jzuJ;gg=+jT$;Tne@V~W=bcN;=Xvfl>{C8Aqu;51
zPT%8%dCyO8otFBu&bDD$=DWQUzyG`T-j>noRdavi!E1303=9mOu6{1-oD!M<jpT}+

literal 0
HcmV?d00001

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
GIT binary patch
literal 354
zcmeAS@N?(olHy`uVBq!ia0vp@Ak4wWz`#)S`biA~0|R4mkh>GZx^prw85kJYlDyqr
z82*Fcg1yTpGcYi47I;J!Gca%qgD@k*tT_@43=Hfgp1!W^x7kEFR5YeN;aSSSz#v)T
z8d2h$pPQSSSHj?2l$uzQnxasiS(2gP?&%v4-pD7;z`(HA)5S4F<NVY~XIC{F2(;Qe
zJIWuJ%GLD#zh9St%8a$$4JThNQgO}mUccGK_<4HU%4L~C=C2tqeE++j^V%(OPKA~a
zlLM}Qz0K(mRJi5ZzdrTORjU|2+*7WNGk(n9FhwZ#I^%_HxrLLD81Q%`-T$tXv#G0?
zuOat##Pz8X%EzXdDY7K>T(789I2MtV68>C9b7}UT{3ShepLZ@XpXa&Luuu8ejDDy3
zIem{4<~={Xbz17rI@^Y2neX;a{QmFSds{}USIzy62d~93FfcH9y85}Sb4q9e0Lz|=
A+W-In

literal 0
HcmV?d00001

diff --git a/src/libs/qmleditorwidgets/resources.qrc b/src/libs/qmleditorwidgets/resources.qrc
index ee4949f2dc2..16575214fc0 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 2ac8ce14900..a6d7019858f 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 ac4a3522731..a9bd25cd99f 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);
 
-- 
GitLab