@@ -28,20 +28,47 @@ import QtQuick 2.0
2828
2929Item {
3030 id: cardTool
31+
32+ /*!
33+ type:int \brief number of cards.
34+ */
35+ property int count
36+
37+ /*!
38+ type:real \brief width of the category view.
39+ */
40+ property real viewWidth
41+
42+ /*!
43+ type:real \brief Scaling factor of selected Carousel item.
44+ */
45+ readonly property real carouselSelectedItemScaleFactor: 1.38 // XXX assuming 1.38 carousel scaling factor for cards
46+
3147 /*!
3248 \brief Template supplied for the category.
3349 */
3450 property var template
3551
52+ /*!
53+ \brief Tool component for Carousel.
54+ */
55+ property var carouselTool
56+
3657 /*!
3758 \brief Component mapping supplied for the category.
3859 */
3960 property var components
4061
4162 /*!
42− \brief Width of the view, based on which carousel width is calculated.
63+ type:string \brief The category layout for this card tool.
4364 */
44− property var viewWidth
65+ property string categoryLayout: {
66+ var layout = template["category-layout"];
67+
68+ // carousel fallback mode to grid
69+ if (layout === "carousel" && count <= Math.ceil(carouselTool.realPathItemCount)) layout = "grid";
70+ return layout;
71+ }
4572
4673 // FIXME: Saviq
4774 // Only way for the card below to actually be laid out completely.
@@ -56,7 +83,7 @@ Item {
5683 If undefined, should use implicit width of the actual card.
5784 */
5885 readonly property var cardWidth: {
59− switch (template !== undefined && template["category-layout"]) {
86+ switch (categoryLayout) {
6087 case "grid":
6188 case "vertical-journal":
6289 if (template["card-layout"] === "horizontal") return units.gu(38);
@@ -66,10 +93,7 @@ Item {
6693 }
6794 return units.gu(18.5);
6895 case "carousel":
69− if (viewWidth === undefined) return undefined
70− if (viewWidth <= units.gu(40)) return units.gu(18)
71− if (viewWidth >= units.gu(128)) return units.gu(26)
72− return units.gu(18 + Math.round((viewWidth - units.gu(40))/ units.gu(11)))
96+ return carouselTool.minimumTileWidth;
7397 case undefined:
7498 case "organic-grid":
7599 case "journal":
@@ -84,7 +108,7 @@ Item {
84108 If undefined, should use implicit height of the actual card.
85109 */
86110 readonly property var cardHeight: {
87− switch (template !== undefined && template["category-layout"]) {
111+ switch (categoryLayout) {
88112 case "journal":
89113 if (template["card-size"] >= 12 && template["card-size"] <= 38) return units.gu(template["card-size"]);
90114 return units.gu(18.5);
@@ -123,6 +147,25 @@ Item {
123147 return (template["card-layout"] === "horizontal") ? Text.AlignLeft : Text.AlignHCenter;
124148 }
125149
150+ QtObject {
151+ id: carouselTool
152+
153+ property real minimumTileWidth: {
154+ if (cardTool.viewWidth === undefined) return undefined;
155+ if (cardTool.viewWidth <= units.gu(40)) return units.gu(18);
156+ if (cardTool.viewWidth >= units.gu(128)) return units.gu(26);
157+ return units.gu(18 + Math.round((cardTool.viewWidth - units.gu(40)) / units.gu(11)));
158+ }
159+
160+ readonly property real pathItemCount: 4.8457 /// (848 / 175) reference values
161+
162+ property real realPathItemCount: {
163+ var scaledMinimumTileWidth = minimumTileWidth / cardTool.carouselSelectedItemScaleFactor;
164+ var tileWidth = Math.max(cardTool.viewWidth / pathItemCount, scaledMinimumTileWidth);
165+ return Math.min(cardTool.viewWidth / tileWidth, pathItemCount);
166+ }
167+ }
168+
126169 Card {
127170 id: card
128171 objectName: "card"