@@ -62,6 +62,7 @@ var kBackgroundLoaderCode = 'Loader {\n\
62// %2 is used as image width
62// %2 is used as image width
63// %3 is used as image height
63// %3 is used as image height
64// %4 is injected as code to artImage
64// %4 is injected as code to artImage
65+// %5 is used as image fallback
65var kArtShapeHolderCode = 'Item { \n\
66var kArtShapeHolderCode = 'Item { \n\
66 id: artShapeHolder; \n\
67 id: artShapeHolder; \n\
67 height: root.fixedArtShapeSize.height > 0 ? root.fixedArtShapeSize.height : artShapeLoader.height; \n\
68 height: root.fixedArtShapeSize.height > 0 ? root.fixedArtShapeSize.height : artShapeLoader.height; \n\
@@ -70,7 +71,8 @@ var kArtShapeHolderCode = 'Item { \n\
70 Loader { \n\
71 Loader { \n\
71 id: artShapeLoader; \n\
72 id: artShapeLoader; \n\
72 objectName: "artShapeLoader"; \n\
73 objectName: "artShapeLoader"; \n\
73− active: cardData && cardData["art"] || false; \n\
74+ readonly property string cardArt: cardData && cardData["art"] || %5; \n\
75+ active: cardArt != ""; \n\
74 asynchronous: root.asynchronous; \n\
76 asynchronous: root.asynchronous; \n\
75 visible: status == Loader.Ready; \n\
77 visible: status == Loader.Ready; \n\
76 sourceComponent: Item { \n\
78 sourceComponent: Item { \n\
@@ -128,7 +130,7 @@ var kArtShapeHolderCode = 'Item { \n\
128 CroppedImageMinimumSourceSize { \n\
130 CroppedImageMinimumSourceSize { \n\
129 id: artImage; \n\
131 id: artImage; \n\
130 objectName: "artImage"; \n\
132 objectName: "artImage"; \n\
131− source: cardData && cardData["art"] || ""; \n\
133+ source: artShapeLoader.cardArt; \n\
132 asynchronous: root.asynchronous; \n\
134 asynchronous: root.asynchronous; \n\
133 width: %2; \n\
135 width: %2; \n\
134 height: %3; \n\
136 height: %3; \n\
@@ -245,11 +247,12 @@ var kMascotShapeLoaderCode = 'Loader { \n\
245// %1 is used as anchors of mascotImage
247// %1 is used as anchors of mascotImage
246// %2 is used as visible of mascotImage
248// %2 is used as visible of mascotImage
247// %3 is injected as code to mascotImage
249// %3 is injected as code to mascotImage
250+// %4 is used as fallback image
248var kMascotImageCode = 'CroppedImageMinimumSourceSize { \n\
251var kMascotImageCode = 'CroppedImageMinimumSourceSize { \n\
249 id: mascotImage; \n\
252 id: mascotImage; \n\
250 objectName: "mascotImage"; \n\
253 objectName: "mascotImage"; \n\
251 anchors { %1 } \n\
254 anchors { %1 } \n\
252− source: cardData && cardData["mascot"] || ""; \n\
255+ source: cardData && cardData["mascot"] || %4; \n\
253 width: units.gu(6); \n\
256 width: units.gu(6); \n\
254 height: units.gu(5.625); \n\
257 height: units.gu(5.625); \n\
255 horizontalAlignment: Image.AlignHCenter; \n\
258 horizontalAlignment: Image.AlignHCenter; \n\
@@ -482,11 +485,15 @@ function cardString(template, components) {
483 var fallback = components["art"] && components["art"]["fallback"] || "";
486 var fallback = components["art"] && components["art"]["fallback"] || "";
484 fallback = encodeURI(fallback);
487 fallback = encodeURI(fallback);
485− var fallbackCode = "";
488+ var fallbackStatusCode = "";
489+ var fallbackURICode = '""';
486 if (fallback !== "") {
490 if (fallback !== "") {
491+ // fallbackStatusCode has %5 in it because we want to substitute it for fallbackURICode
492+ // which in kArtShapeHolderCode is %5
487− fallbackCode += 'onStatusChanged: if (status === Image.Error) source = decodeURI("%1");'.arg(fallback);
493+ fallbackStatusCode += 'onStatusChanged: if (status === Image.Error) source = %5;';
494+ fallbackURICode = 'decodeURI("%1")'.arg(fallback);
489− code += kArtShapeHolderCode.arg(artAnchors).arg(widthCode).arg(heightCode).arg(fallbackCode);
496+ code += kArtShapeHolderCode.arg(artAnchors).arg(widthCode).arg(heightCode).arg(fallbackStatusCode).arg(fallbackURICode);
491 code += 'readonly property size artShapeSize: Qt.size(-1, -1);\n'
498 code += 'readonly property size artShapeSize: Qt.size(-1, -1);\n'
@@ -580,11 +587,15 @@ function cardString(template, components) {
580 var mascotImageVisible = useMascotShape ? 'false' : 'showHeader';
587 var mascotImageVisible = useMascotShape ? 'false' : 'showHeader';
581 var fallback = components["mascot"] && components["mascot"]["fallback"] || "";
588 var fallback = components["mascot"] && components["mascot"]["fallback"] || "";
582 fallback = encodeURI(fallback);
589 fallback = encodeURI(fallback);
583− var fallbackCode = "";
590+ var fallbackStatusCode = "";
591+ var fallbackURICode = '""';
584 if (fallback !== "") {
592 if (fallback !== "") {
593+ // fallbackStatusCode has %4 in it because we want to substitute it for fallbackURICode
594+ // which in kMascotImageCode is %4
585− fallbackCode += 'onStatusChanged: if (status === Image.Error) source = decodeURI("%1");'.arg(fallback);
595+ fallbackStatusCode += 'onStatusChanged: if (status === Image.Error) source = %4;';
596+ fallbackURICode = 'decodeURI("%1")'.arg(fallback);
587− mascotCode = kMascotImageCode.arg(mascotAnchors).arg(mascotImageVisible).arg(fallbackCode);
598+ mascotCode = kMascotImageCode.arg(mascotAnchors).arg(mascotImageVisible).arg(fallbackStatusCode).arg(fallbackURICode);
590 var summaryColorWithBackground = 'backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? theme.palette.normal.baseText : "white")';
601 var summaryColorWithBackground = 'backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? theme.palette.normal.baseText : "white")';