on xenial help sign in
Grab the updated ratingstars widget I wrote months ago, branching textSummary preview branch too
fc277e5Andrea Cimitan
qml/Components/RatingStars.qml+35−14
@@ -15,27 +15,48 @@
15 */
15 */
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18+import Ubuntu.Components 0.1
18
19
19−Row {
20+Item {
20 id: root
21 id: root
22+
23+ //! True if it accepts user input.
24+ property bool interactive: true
25+
26+ //! Current rating.
21 property int rating
27 property int rating
28+
29+ //! Maximum rating.
22 property int maximumRating: 5
30 property int maximumRating: 5
23− property int starCount: 5
24− height: childrenRect.height
25− width: childrenRect.width
26
31
32+ //! Number of rating stars.
33+ property int starsCount: 5
34+
27− readonly property int effectiveRating: Math.max(0, Math.min(root.starCount * root.rating / root.maximumRating, root.maximumRating))
35+ readonly property int effectiveRating: MathUtils.clamp(starsCount * rating / maximumRating, 0, maximumRating)
36+
37+ Row {
38+ id: row
39+ anchors.centerIn: parent
40+ height: childrenRect.height
41+ width: childrenRect.width
28
42
29− Repeater {
43+ Repeater {
44+ id: repeater
45+
46+ property int averageDelegateWidth: row.width / root.starsCount
47+
30− model: root.effectiveRating
48+ model: root.starsCount
49+
31− Image {
50+ Image {
51+ objectName: "ratingStar" + index
32− source: "graphics/icon_star_on.png"
52+ source: index < root.effectiveRating ? "graphics/icon_star_on.png" : "graphics/icon_star_off.png"
53+ }
33 }
54 }
34 }
55 }
35− Repeater {
56+
36− model: root.starCount - root.effectiveRating
57+ MouseArea {
37− Image {
58+ anchors.fill: row
38− source: "graphics/icon_star_off.png"
59+ enabled: root.interactive
39− }
60+ onClicked: root.rating = Math.ceil(mouse.x / repeater.averageDelegateWidth) * root.maximumRating / root.starsCount
40 }
61 }
41}
62}
tests/qmltests/CMakeLists.txt+1−1
@@ -14,7 +14,6 @@ set(qmltest_DEFAULT_PROPERTIES ENVIRONMENT "QT_QPA_PLATFORM=minimal")
14add_qml_test(Components AnimationControllerWithSignals)
14add_qml_test(Components AnimationControllerWithSignals)
15add_qml_test(Components Carousel)
15add_qml_test(Components Carousel)
16add_qml_test(Components OpenEffect)
16add_qml_test(Components OpenEffect)
17−add_qml_test(Components RatingStars)
18add_qml_test(Panel IndicatorItem)
17add_qml_test(Panel IndicatorItem)
19add_qml_test(utils/Unity/Test UnityTest)
18add_qml_test(utils/Unity/Test UnityTest)
20
19
@@ -29,6 +28,7 @@ add_qml_test(Components DraggingArea)
29add_qml_test(Components EdgeDemoOverlay)
28add_qml_test(Components EdgeDemoOverlay)
30add_qml_test(Components FilterGrid IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
29add_qml_test(Components FilterGrid IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
31add_qml_test(Components LazyImage)
30add_qml_test(Components LazyImage)
31+add_qml_test(Components RatingStars)
32add_qml_test(Components ResponsiveFlowView)
32add_qml_test(Components ResponsiveFlowView)
33add_qml_test(Components ResponsiveGridView)
33add_qml_test(Components ResponsiveGridView)
34add_qml_test(Components Revealer)
34add_qml_test(Components Revealer)
tests/qmltests/Components/tst_RatingStars.qml+62−30
@@ -17,46 +17,78 @@
17import QtQuick 2.0
17import QtQuick 2.0
18import QtTest 1.0
18import QtTest 1.0
19import "../../../qml/Components"
19import "../../../qml/Components"
20+import Ubuntu.Components 0.1
21+import Unity.Test 0.1 as UT
20
22
21−TestCase {
23+Rectangle {
22− name: "RatingStars"
24+ id: root
23−
25+ width: units.gu(20)
24− property int maximumRating: 5
26+ height: units.gu(10)
25− property int rating: 3
27+ color: "black"
26− property alias effectiveRating: ratingStars.effectiveRating
27
28
28 RatingStars {
29 RatingStars {
29 id: ratingStars
30 id: ratingStars
31+ anchors.centerIn: parent
30− maximumRating: parent.maximumRating
32+ maximumRating: 5
31− rating: parent.rating
33+ rating: 3
32 }
34 }
33
35
34− function test_rating_init() {
36+ UT.UnityTestCase {
35− compare(effectiveRating, rating, "EffectiveRating not initialized properly")
37+ name: "RatingStars"
36− }
38+ when: windowShown
37
39
38− function test_rating_negative() {
40+ function init() {
41+ ratingStars.maximumRating = 5
39− rating = -3
42+ ratingStars.rating = 3
40− compare(effectiveRating, 0, "EffectiveRating not calculated correctly")
41− }
43+ }
42
44
43− function test_rating_set_ok() {
45+ function test_interactive_rating_data() {
44− rating = 2
46+ return [
45− compare(effectiveRating, rating, "EffectiveRating not calculated correctly")
47+ {tag: "first star without interactive", interactive: false, maximumRating: 5, index: 0, rating: 3},
48+ {tag: "first star", interactive: true, maximumRating: 5, index: 0, rating: 1},
49+ {tag: "second star with big maximumRating", interactive: true, maximumRating: 100, index: 1, rating: 40},
50+ {tag: "last star", interactive: true, maximumRating: 5, index: 4, rating: 5},
51+ ];
46− }
52+ }
47
53
48− function test_rating_set_too_big() {
54+ function test_interactive_rating(data) {
49− rating = 200
55+ ratingStars.interactive = data.interactive
50− compare(effectiveRating, maximumRating, "EffectiveRating not calculated correctly")
56+ ratingStars.maximumRating = data.maximumRating
51− }
52
57
58+ var ratingStar = findChild(ratingStars, "ratingStar"+data.index)
59+ mouseClick(ratingStar, ratingStar.width / 2, ratingStar.height / 2)
60+ compare(ratingStars.rating, data.rating)
61+
62+ ratingStars.interactive = false
63+ }
64+
65+ function test_rating_init() {
66+ compare(ratingStars.effectiveRating, ratingStars.rating, "EffectiveRating not initialized properly")
67+ }
68+
69+ function test_rating_negative() {
70+ ratingStars.rating = -3
71+ compare(ratingStars.effectiveRating, 0, "EffectiveRating not calculated correctly")
72+ }
73+
74+ function test_rating_set_ok() {
75+ ratingStars.rating = 2
76+ compare(ratingStars.effectiveRating, ratingStars.rating, "EffectiveRating not calculated correctly")
77+ }
78+
79+ function test_rating_set_too_big() {
80+ ratingStars.rating = 200
81+ compare(ratingStars.effectiveRating, ratingStars.maximumRating, "EffectiveRating not calculated correctly")
82+ }
83+
53− function test_rating_set_min() {
84+ function test_rating_set_min() {
54− rating = 0
85+ ratingStars.rating = 0
55− compare(effectiveRating, 0, "EffectiveRating not calculated correctly")
86+ compare(ratingStars.effectiveRating, 0, "EffectiveRating not calculated correctly")
56− }
87+ }
57
88
58− function test_rating_set_max() {
89+ function test_rating_set_max() {
59− rating = maximumRating
90+ ratingStars.rating = ratingStars.maximumRating
60− compare(effectiveRating, maximumRating, "EffectiveRating not calculated correctly")
91+ compare(ratingStars.effectiveRating, ratingStars.maximumRating, "EffectiveRating not calculated correctly")
92+ }
61 }
93 }
62}
94}