on xenial help sign in
Grab the updated ratingstars widget I wrote months ago, branching textSummary preview branch too
commitfc277e5ff321259181bfc5331d2b9fbfadede88a authorAndrea Cimitan <andrea.cimitan@gmail.com> dateThu 6 Feb 2014, 18:06 (13 years ago) parent8486b8af1c608b
3 files changed+98−45
qml/Components/RatingStars.qml+35−14 tests/qmltests/CMakeLists.txt+1−1 tests/qmltests/Components/tst_RatingStars.qml+62−30
qml/Components/RatingStars.qml+35−14
@@ -15,27 +15,48 @@
1515 */
1616
1717import QtQuick 2.0
18+import Ubuntu.Components 0.1
1819
19−Row {
20+Item {
2021 id: root
22+
23+ //! True if it accepts user input.
24+ property bool interactive: true
25+
26+ //! Current rating.
2127 property int rating
28+
29+ //! Maximum rating.
2230 property int maximumRating: 5
23− property int starCount: 5
24− height: childrenRect.height
25− width: childrenRect.width
2631
27− readonly property int effectiveRating: Math.max(0, Math.min(root.starCount * root.rating / root.maximumRating, root.maximumRating))
32+ //! Number of rating stars.
33+ property int starsCount: 5
34+
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
2842
29− Repeater {
30− model: root.effectiveRating
31− Image {
32− source: "graphics/icon_star_on.png"
43+ Repeater {
44+ id: repeater
45+
46+ property int averageDelegateWidth: row.width / root.starsCount
47+
48+ model: root.starsCount
49+
50+ Image {
51+ objectName: "ratingStar" + index
52+ source: index < root.effectiveRating ? "graphics/icon_star_on.png" : "graphics/icon_star_off.png"
53+ }
3354 }
3455 }
35− Repeater {
36− model: root.starCount - root.effectiveRating
37− Image {
38− source: "graphics/icon_star_off.png"
39− }
56+
57+ MouseArea {
58+ anchors.fill: row
59+ enabled: root.interactive
60+ onClicked: root.rating = Math.ceil(mouse.x / repeater.averageDelegateWidth) * root.maximumRating / root.starsCount
4061 }
4162}
tests/qmltests/CMakeLists.txt+1−1
@@ -14,7 +14,6 @@ set(qmltest_DEFAULT_PROPERTIES ENVIRONMENT "QT_QPA_PLATFORM=minimal")
1414add_qml_test(Components AnimationControllerWithSignals)
1515add_qml_test(Components Carousel)
1616add_qml_test(Components OpenEffect)
17−add_qml_test(Components RatingStars)
1817add_qml_test(Panel IndicatorItem)
1918add_qml_test(utils/Unity/Test UnityTest)
2019
@@ -29,6 +28,7 @@ add_qml_test(Components DraggingArea)
2928add_qml_test(Components EdgeDemoOverlay)
3029add_qml_test(Components FilterGrid IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
3130add_qml_test(Components LazyImage)
31+add_qml_test(Components RatingStars)
3232add_qml_test(Components ResponsiveFlowView)
3333add_qml_test(Components ResponsiveGridView)
3434add_qml_test(Components Revealer)
tests/qmltests/Components/tst_RatingStars.qml+62−30
@@ -17,46 +17,78 @@
1717import QtQuick 2.0
1818import QtTest 1.0
1919import "../../../qml/Components"
20+import Ubuntu.Components 0.1
21+import Unity.Test 0.1 as UT
2022
21−TestCase {
22− name: "RatingStars"
23−
24− property int maximumRating: 5
25− property int rating: 3
26− property alias effectiveRating: ratingStars.effectiveRating
23+Rectangle {
24+ id: root
25+ width: units.gu(20)
26+ height: units.gu(10)
27+ color: "black"
2728
2829 RatingStars {
2930 id: ratingStars
30− maximumRating: parent.maximumRating
31− rating: parent.rating
31+ anchors.centerIn: parent
32+ maximumRating: 5
33+ rating: 3
3234 }
3335
34− function test_rating_init() {
35− compare(effectiveRating, rating, "EffectiveRating not initialized properly")
36− }
36+ UT.UnityTestCase {
37+ name: "RatingStars"
38+ when: windowShown
3739
38− function test_rating_negative() {
39− rating = -3
40− compare(effectiveRating, 0, "EffectiveRating not calculated correctly")
41− }
40+ function init() {
41+ ratingStars.maximumRating = 5
42+ ratingStars.rating = 3
43+ }
4244
43− function test_rating_set_ok() {
44− rating = 2
45− compare(effectiveRating, rating, "EffectiveRating not calculated correctly")
46− }
45+ function test_interactive_rating_data() {
46+ return [
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+ ];
52+ }
4753
48− function test_rating_set_too_big() {
49− rating = 200
50− compare(effectiveRating, maximumRating, "EffectiveRating not calculated correctly")
51− }
54+ function test_interactive_rating(data) {
55+ ratingStars.interactive = data.interactive
56+ ratingStars.maximumRating = data.maximumRating
5257
53− function test_rating_set_min() {
54− rating = 0
55− compare(effectiveRating, 0, "EffectiveRating not calculated correctly")
56− }
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+
84+ function test_rating_set_min() {
85+ ratingStars.rating = 0
86+ compare(ratingStars.effectiveRating, 0, "EffectiveRating not calculated correctly")
87+ }
5788
58− function test_rating_set_max() {
59− rating = maximumRating
60− compare(effectiveRating, maximumRating, "EffectiveRating not calculated correctly")
89+ function test_rating_set_max() {
90+ ratingStars.rating = ratingStars.maximumRating
91+ compare(ratingStars.effectiveRating, ratingStars.maximumRating, "EffectiveRating not calculated correctly")
92+ }
6193 }
6294}