on xenial help sign in
Hide the preview review input field when a rating is required Fixes: #1541971

Approved by: Unity8 CI Bot, Michael Terry, Albert Astals Cid

commit6e3c4b227d068313337f8c15c6ba883aadf8085d authorAndrea Cimitan <andrea.cimitan@gmail.com> dateFri 27 May 2016, 13:51 (10 years ago) parentc5504d6af1d2a2
5 files changed+68−49
qml/Components/Rating.qml+1 qml/Components/RatingStyle.qml+3 qml/Dash/Previews/PreviewRatingInput.qml+41−42 tests/qmltests/Dash/Previews/tst_PreviewRatingEdit.qml+5−1 tests/qmltests/Dash/Previews/tst_PreviewRatingInput.qml+18−6
qml/Components/Rating.qml+1
@@ -21,6 +21,7 @@ import Ubuntu.Components 1.3
2121
2222StyledItem {
2323 id: root
24+ implicitHeight: units.gu(2)
2425
2526 //! True if it accepts user input.
2627 property bool interactive: true
qml/Components/RatingStyle.qml+3
@@ -36,6 +36,9 @@ Row {
3636 property url urlIconHalf: styledItem.urlIconHalf || "graphics/icon_star_half.png"
3737
3838 Image {
39+ height: parent.height
40+ fillMode: Image.PreserveAspectFit
41+ sourceSize.height: height
3942 opacity: styledItem.value < 0 ? 0.4 : 1 // Let's make the stars look inactive for a not-set value
4043 source: {
4144 if (index === repeater.indexHalfValue) return repeater.urlIconHalf;
qml/Dash/Previews/PreviewRatingInput.qml+41−42
@@ -40,14 +40,16 @@ PreviewWidget {
4040 switch(widgetData["visible"]) {
4141 default:
4242 case "both":
43− return ratingLabelAndWidgetContainer.implicitHeight + reviewContainer.implicitHeight;
43+ return ratingLabelAndWidgetContainer.implicitHeight + (reviewContainer.visible ? reviewContainer.implicitHeight : 0);
4444 case "rating":
4545 return ratingLabelAndWidgetContainer.implicitHeight;
4646 case "review":
4747 return reviewContainer.implicitHeight;
48− }
48+ }
4949 }
5050
51+ clip: reviewContainer.visible
52+
5153 property alias ratingValue: rating.value
5254 property alias reviewText: reviewTextArea.text
5355
@@ -64,21 +66,17 @@ PreviewWidget {
6466 triggered(root.widgetId, "rated", data);
6567 }
6668
67− Item {
69+ Column {
6870 id: ratingLabelAndWidgetContainer
69− anchors {
70− left: parent.left
71− right: parent.right
72− }
73− implicitHeight: rating.height
71+ anchors { left: parent.left; right: parent.right; }
72+ spacing: units.gu(0.5)
7473 visible: widgetData["visible"] !== "review"
7574
7675 Label {
76+ id: ratingLabel
7777 objectName: "ratingLabel"
78− anchors {
79− verticalCenter: parent.verticalCenter
80− left: parent.left
81− }
78+ anchors { left: parent.left; right: parent.right; }
79+ fontSize: "large"
8280 color: root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText
8381 opacity: .8
8482 text: widgetData["rating-label"] || i18n.tr("Rate this")
@@ -87,23 +85,22 @@ PreviewWidget {
8785 Rating {
8886 id: rating
8987 objectName: "rating"
90− anchors {
91− verticalCenter: parent.verticalCenter
92− right: parent.right
93− }
88+ anchors.left: parent.left
9489 size: 5
90+ height: units.gu(4)
9591 onValueChanged: {
9692 if (widgetData["visible"] === "rating") root.submit();
9793 }
9894
99− property var urlIconEmpty: widgetData["rating-icon-empty"]
100− property var urlIconFull: widgetData["rating-icon-full"]
95+ property var urlIconEmpty: widgetData["rating-icon-empty"] || "image://theme/non-starred"
96+ property var urlIconFull: widgetData["rating-icon-full"] || "image://theme/starred"
10197 }
10298 }
10399
104100 Item {
105101 id: reviewContainer
106− implicitHeight: reviewLabel.implicitHeight + reviewSubmitContainer.implicitHeight + anchors.topMargin
102+ objectName: "reviewContainer"
103+ implicitHeight: visible ? reviewSubmitContainer.implicitHeight + anchors.topMargin : 0
107104
108105 readonly property real innerMargin: units.gu(1)
109106
@@ -112,32 +109,31 @@ PreviewWidget {
112109 right: parent.right
113110 top: ratingLabelAndWidgetContainer.visible ? ratingLabelAndWidgetContainer.bottom : parent.top
114111 bottom: parent.bottom
115− topMargin: ratingLabelAndWidgetContainer.visible ? reviewContainer.innerMargin : 0
112+ topMargin: ratingLabelAndWidgetContainer.visible ? innerMargin : 0
113+ }
114+ visible: {
115+ switch(widgetData["visible"]) {
116+ default:
117+ case "both":
118+ return widgetData["required"] === "review" || rating.value > 0;
119+ case "rating":
120+ return false;
121+ case "review":
122+ return true;
123+ }
116124 }
117− visible: widgetData["visible"] !== "rating"
118125
119− Label {
120− objectName: "reviewLabel"
121− id: reviewLabel
122− anchors {
123− top: parent.top
124− left: parent.left
125− right: parent.right
126+ Behavior on implicitHeight {
127+ UbuntuNumberAnimation {
128+ duration: UbuntuAnimation.FastDuration
129+ easing.type: Easing.OutCubic
126130 }
127− color: root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText
128− opacity: .8
129− text: widgetData["review-label"] || i18n.tr("Add a review")
130131 }
131132
132133 Item {
133134 id: reviewSubmitContainer
134− anchors {
135− top: reviewLabel.bottom
136− left: parent.left
137− right: parent.right
138− bottom: parent.bottom
139− topMargin: reviewContainer.innerMargin
140− }
135+ objectName: "reviewSubmitContainer"
136+ anchors.fill: parent
141137 implicitHeight: reviewTextArea.implicitHeight + anchors.topMargin
142138
143139 TextArea {
@@ -148,12 +144,17 @@ PreviewWidget {
148144 if(inputMethodVisible && activeFocus)
149145 root.makeSureVisible(reviewTextArea);
150146 }
147+ onVisibleChanged: {
148+ if (visible && widgetData["visible"] !== "review")
149+ focus = true;
150+ }
151151 anchors {
152152 top: parent.top
153153 left: parent.left
154154 right: submitButton.left
155155 rightMargin: reviewContainer.innerMargin
156156 }
157+ placeholderText: widgetData["review-label"] || i18n.tr("Add a review")
157158 }
158159
159160 Button {
@@ -170,11 +171,9 @@ PreviewWidget {
170171 top: parent.top
171172 right: parent.right
172173 }
173− color: readyToSubmit ? theme.palette.selected.base : theme.palette.normal.base
174+ enabled: readyToSubmit
174175 text: widgetData["submit-label"] || i18n.tr("Send")
175− onClicked: {
176− if (readyToSubmit) root.submit()
177− }
176+ onClicked: root.submit()
178177 }
179178 }
180179 }
tests/qmltests/Dash/Previews/tst_PreviewRatingEdit.qml+5−1
@@ -50,7 +50,8 @@ Rectangle {
5050
5151 var authorLabel = findChild(previewRatingEdit, "authorLabel");
5252 var reviewTextArea = findChild(previewRatingEdit, "reviewTextArea");
53− var inputRating = findChild(findChild(previewRatingEdit, "input"), "rating");
53+ var ratingInput = findChild(previewRatingEdit, "input");
54+ var inputRating = findChild(ratingInput, "rating");
5455 verify(authorLabel.visible)
5556 verify(!reviewTextArea.visible)
5657
@@ -65,6 +66,9 @@ Rectangle {
6566 reviewTextArea.text = "Ho Ho";
6667 inputRating.value = 3;
6768
69+ var reviewContainer = findChild(ratingInput, "reviewContainer");
70+ var reviewSubmitContainer = findChild(ratingInput, "reviewSubmitContainer");
71+ tryCompare(reviewContainer, "implicitHeight", reviewSubmitContainer.implicitHeight + reviewContainer.anchors.topMargin);
6872 var submitButton = findChild(previewRatingEdit, "submitButton")
6973 mouseClick(submitButton);
7074
tests/qmltests/Dash/Previews/tst_PreviewRatingInput.qml+18−6
@@ -73,11 +73,10 @@ Rectangle {
7373
7474 function test_labels() {
7575 var ratingLabel = findChild(previewRatingInput, "ratingLabel");
76− var reviewLabel = findChild(previewRatingInput, "reviewLabel");
7776
7877 previewRatingInput.widgetData = widgetDataNewLabels;
7978 compare(ratingLabel.text, widgetDataNewLabels["rating-label"]);
80− compare(reviewLabel.text, widgetDataNewLabels["review-label"]);
79+ compare(reviewTextArea.placeholderText, widgetDataNewLabels["review-label"]);
8180 compare(submitButton.text, widgetDataNewLabels["submit-label"]);
8281 }
8382
@@ -120,10 +119,17 @@ Rectangle {
120119
121120 previewRatingInput.widgetData = data.widgetData;
122121
122+ if (data.widgetData["visible"] === "both" && data.widgetData["required"] === "both")
123+ compare(reviewTextArea.visible, false);
124+
123125 if (data.widgetData["visible"] !== "review") {
124− verify(rating.visible === true);
126+ compare(rating.visible, true);
125127
126128 rating.value = data.inputRating;
129+
130+ if (data.inputRating > 0 && data.widgetData["visible"] === "both")
131+ compare(reviewTextArea.visible, true);
132+
127133 if (data.widgetData["required"] !== "rating" ||
128134 data.widgetData["visible"] !== "rating" ||
129135 data.inputRating < 0) {
@@ -132,13 +138,19 @@ Rectangle {
132138 compare(spy.count, 1);
133139 }
134140 } else {
135− verify(rating.visible === false);
141+ compare(rating.visible, false);
136142 }
137143
138144 if (data.widgetData["visible"] !== "rating") {
139− verify(reviewTextArea.visible === true);
145+ if (data.widgetData["visible"] === "review" || data.widgetData["required"] === "review")
146+ compare(reviewTextArea.visible, true);
140147
141148 reviewTextArea.text = data.inputText;
149+ var reviewContainer = findChild(previewRatingInput, "reviewContainer");
150+ if (reviewContainer.visible) {
151+ var reviewSubmitContainer = findChild(previewRatingInput, "reviewSubmitContainer");
152+ tryCompare(reviewContainer, "implicitHeight", reviewSubmitContainer.implicitHeight + reviewContainer.anchors.topMargin);
153+ }
142154 mouseClick(submitButton);
143155 switch (data.widgetData["required"]) {
144156 case "rating": {
@@ -164,7 +176,7 @@ Rectangle {
164176 }
165177 }
166178 } else {
167− verify(reviewTextArea.visible === false);
179+ compare(reviewTextArea.visible, false);
168180 }
169181
170182 compare(spy.count === 1, data.emitted);