2 * Copyright (C) 2014,2015 Canonical, Ltd.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; version 3.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 import Ubuntu.Components 1.3
19 import "../../Components"
21 /*! \brief Preview widget for rating.
23 The widget can show a rating widget and a field to enter a comment.
24 The visibility of the two widgets is specified by widgetData["visible"],
25 accepting "both", "rating" or "review".
26 The requirement of the review is specified by widgetData["visible"],
27 accepting "both", "rating" or "review".
28 It is possible to customise labels, widgetData["rating-label"] for the rating,
29 widgetData["rewiew-label"] for the comment field and widgetData["submit-label"]
30 for the submit button.
31 The icons used in the rating widget can be customised with
32 widgetData["rating-icon-empty"] and widgetData["rating-icon-full"].
33 The successeful submit emits triggered(widgetId, widgetData["required"], data),
34 with data being {"rating": rating value, "review": review comment, "author": null (for now)}.
40 switch(widgetData["visible"]) {
43 return ratingLabelAndWidgetContainer.implicitHeight + (reviewContainer.visible ? reviewContainer.implicitHeight : 0);
45 return ratingLabelAndWidgetContainer.implicitHeight;
47 return reviewContainer.implicitHeight;
51 clip: reviewContainer.visible
53 property alias ratingValue: rating.value
54 property alias reviewText: reviewTextArea.text
57 // checks rating-input requirements
58 if (((widgetData["required"] === "both" ||
59 widgetData["required"] === "rating") &&
61 ((widgetData["required"] === "both" ||
62 widgetData["required"] === "review") &&
63 reviewTextArea.text === "")) return;
65 var data = {"rating": rating.value, "review": reviewTextArea.text, "author": null};
66 triggered(root.widgetId, "rated", data);
70 id: ratingLabelAndWidgetContainer
71 anchors { left: parent.left; right: parent.right; }
72 spacing: units.gu(0.5)
73 visible: widgetData["visible"] !== "review"
77 objectName: "ratingLabel"
78 anchors { left: parent.left; right: parent.right; }
80 color: root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText
82 text: widgetData["rating-label"] || i18n.tr("Rate this")
88 anchors.left: parent.left
92 if (widgetData["visible"] === "rating") root.submit();
95 property var urlIconEmpty: widgetData["rating-icon-empty"] || "image://theme/non-starred"
96 property var urlIconFull: widgetData["rating-icon-full"] || "image://theme/starred"
102 objectName: "reviewContainer"
103 implicitHeight: visible ? reviewSubmitContainer.implicitHeight + anchors.topMargin : 0
105 readonly property real innerMargin: units.gu(1)
110 top: ratingLabelAndWidgetContainer.visible ? ratingLabelAndWidgetContainer.bottom : parent.top
111 bottom: parent.bottom
112 topMargin: ratingLabelAndWidgetContainer.visible ? innerMargin : 0
115 switch(widgetData["visible"]) {
118 return widgetData["required"] === "review" || rating.value > 0;
126 Behavior on implicitHeight {
127 UbuntuNumberAnimation {
128 duration: UbuntuAnimation.FastDuration
129 easing.type: Easing.OutCubic
134 id: reviewSubmitContainer
135 objectName: "reviewSubmitContainer"
137 implicitHeight: reviewTextArea.implicitHeight + anchors.topMargin
141 objectName: "reviewTextArea"
142 property bool inputMethodVisible: Qt.inputMethod.visible
143 onInputMethodVisibleChanged: {
144 if(inputMethodVisible && activeFocus)
145 root.makeSureVisible(reviewTextArea);
148 if (visible && widgetData["visible"] !== "review")
154 right: submitButton.left
155 rightMargin: reviewContainer.innerMargin
157 placeholderText: widgetData["review-label"] || i18n.tr("Add a review")
162 objectName: "submitButton"
164 readonly property bool readyToSubmit: {
165 if ((widgetData["required"] !== "review" && rating.value < 0) ||
166 (widgetData["required"] !== "rating" && reviewTextArea.text === "")) return false;
174 enabled: readyToSubmit
175 text: widgetData["submit-label"] || i18n.tr("Send")
176 onClicked: root.submit()