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