2 * Copyright (C) 2014 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 0.1
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.implicitHeight;
45 return ratingLabelAndWidgetContainer.implicitHeight;
47 return reviewContainer.implicitHeight;
52 // checks rating-input requirements
53 if (((widgetData["required"] === "both" ||
54 widgetData["required"] === "rating") &&
56 ((widgetData["required"] === "both" ||
57 widgetData["required"] === "review") &&
58 reviewTextArea.text === "")) return;
60 var data = {"rating": rating.value, "review": reviewTextArea.text, "author": null};
61 triggered(root.widgetId, "rated", data);
65 id: ratingLabelAndWidgetContainer
70 implicitHeight: rating.height
71 visible: widgetData["visible"] !== "review"
74 objectName: "ratingLabel"
76 verticalCenter: parent.verticalCenter
79 color: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText
81 text: widgetData["rating-label"] || i18n.tr("Rate this")
88 verticalCenter: parent.verticalCenter
93 if (widgetData["visible"] === "rating") root.submit();
96 property var urlIconEmpty: widgetData["rating-icon-empty"]
97 property var urlIconFull: widgetData["rating-icon-full"]
103 implicitHeight: reviewLabel.implicitHeight + reviewSubmitContainer.implicitHeight + anchors.topMargin
105 readonly property real innerMargin: units.gu(1)
110 top: ratingLabelAndWidgetContainer.visible ? ratingLabelAndWidgetContainer.bottom : parent.top
111 bottom: parent.bottom
112 topMargin: ratingLabelAndWidgetContainer.visible ? reviewContainer.innerMargin : 0
114 visible: widgetData["visible"] !== "rating"
117 objectName: "reviewLabel"
124 color: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText
126 text: widgetData["review-label"] || i18n.tr("Add a review")
130 id: reviewSubmitContainer
132 top: reviewLabel.bottom
135 bottom: parent.bottom
136 topMargin: reviewContainer.innerMargin
138 implicitHeight: reviewTextArea.implicitHeight + anchors.topMargin
142 objectName: "reviewTextArea"
146 right: submitButton.left
147 rightMargin: reviewContainer.innerMargin
153 objectName: "submitButton"
155 readonly property bool readyToSubmit: {
156 if ((widgetData["required"] !== "review" && rating.value < 0) ||
157 (widgetData["required"] !== "rating" && reviewTextArea.text === "")) return false;
165 color: readyToSubmit ? Theme.palette.selected.base : Theme.palette.normal.base
166 text: widgetData["submit-label"] || i18n.tr("Send")
168 if (readyToSubmit) root.submit()