Unity 8
PreviewRatingInput.qml
1 /*
2  * Copyright (C) 2014,2015 Canonical, Ltd.
3  *
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.
7  *
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.
12  *
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/>.
15  */
16 
17 import QtQuick 2.4
18 import Ubuntu.Components 1.3
19 import "../../Components"
20 
21 /*! \brief Preview widget for rating.
22 
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)}.
35 */
36 
37 PreviewWidget {
38  id: root
39  implicitHeight: {
40  switch(widgetData["visible"]) {
41  default:
42  case "both":
43  return ratingLabelAndWidgetContainer.implicitHeight + reviewContainer.implicitHeight;
44  case "rating":
45  return ratingLabelAndWidgetContainer.implicitHeight;
46  case "review":
47  return reviewContainer.implicitHeight;
48  }
49  }
50 
51  property alias ratingValue: rating.value
52  property alias reviewText: reviewTextArea.text
53 
54  function submit() {
55  // checks rating-input requirements
56  if (((widgetData["required"] === "both" ||
57  widgetData["required"] === "rating") &&
58  rating.value < 0) ||
59  ((widgetData["required"] === "both" ||
60  widgetData["required"] === "review") &&
61  reviewTextArea.text === "")) return;
62 
63  var data = {"rating": rating.value, "review": reviewTextArea.text, "author": null};
64  triggered(root.widgetId, "rated", data);
65  }
66 
67  Item {
68  id: ratingLabelAndWidgetContainer
69  anchors {
70  left: parent.left
71  right: parent.right
72  }
73  implicitHeight: rating.height
74  visible: widgetData["visible"] !== "review"
75 
76  Label {
77  objectName: "ratingLabel"
78  anchors {
79  verticalCenter: parent.verticalCenter
80  left: parent.left
81  }
82  color: root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText
83  opacity: .8
84  text: widgetData["rating-label"] || i18n.tr("Rate this")
85  }
86 
87  Rating {
88  id: rating
89  objectName: "rating"
90  anchors {
91  verticalCenter: parent.verticalCenter
92  right: parent.right
93  }
94  size: 5
95  onValueChanged: {
96  if (widgetData["visible"] === "rating") root.submit();
97  }
98 
99  property var urlIconEmpty: widgetData["rating-icon-empty"]
100  property var urlIconFull: widgetData["rating-icon-full"]
101  }
102  }
103 
104  Item {
105  id: reviewContainer
106  implicitHeight: reviewLabel.implicitHeight + reviewSubmitContainer.implicitHeight + anchors.topMargin
107 
108  readonly property real innerMargin: units.gu(1)
109 
110  anchors {
111  left: parent.left
112  right: parent.right
113  top: ratingLabelAndWidgetContainer.visible ? ratingLabelAndWidgetContainer.bottom : parent.top
114  bottom: parent.bottom
115  topMargin: ratingLabelAndWidgetContainer.visible ? reviewContainer.innerMargin : 0
116  }
117  visible: widgetData["visible"] !== "rating"
118 
119  Label {
120  objectName: "reviewLabel"
121  id: reviewLabel
122  anchors {
123  top: parent.top
124  left: parent.left
125  right: parent.right
126  }
127  color: root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText
128  opacity: .8
129  text: widgetData["review-label"] || i18n.tr("Add a review")
130  }
131 
132  Item {
133  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  }
141  implicitHeight: reviewTextArea.implicitHeight + anchors.topMargin
142 
143  TextArea {
144  id: reviewTextArea
145  objectName: "reviewTextArea"
146  property bool inputMethodVisible: Qt.inputMethod.visible
147  onInputMethodVisibleChanged: {
148  if(inputMethodVisible && activeFocus)
149  root.makeSureVisible(reviewTextArea);
150  }
151  anchors {
152  top: parent.top
153  left: parent.left
154  right: submitButton.left
155  rightMargin: reviewContainer.innerMargin
156  }
157  }
158 
159  Button {
160  id: submitButton
161  objectName: "submitButton"
162 
163  readonly property bool readyToSubmit: {
164  if ((widgetData["required"] !== "review" && rating.value < 0) ||
165  (widgetData["required"] !== "rating" && reviewTextArea.text === "")) return false;
166  else return true;
167  }
168 
169  anchors {
170  top: parent.top
171  right: parent.right
172  }
173  color: readyToSubmit ? theme.palette.selected.base : theme.palette.normal.base
174  text: widgetData["submit-label"] || i18n.tr("Send")
175  onClicked: {
176  if (readyToSubmit) root.submit()
177  }
178  }
179  }
180  }
181 }