on xenial help sign in
Card: Empty mascot or art also trigger the fallback image showing
f672002Albert Astals Cid
plugins/Dash/CardCreator.js+8−5
@@ -61,6 +61,7 @@ var kBackgroundLoaderCode = 'Loader {\n\
61// %1 is used as anchors of artShapeHolder
61// %1 is used as anchors of artShapeHolder
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 used as image fallback
64var kArtShapeHolderCode = 'Item { \n\
65var kArtShapeHolderCode = 'Item { \n\
65 id: artShapeHolder; \n\
66 id: artShapeHolder; \n\
66 height: root.fixedArtShapeSize.height > 0 ? root.fixedArtShapeSize.height : artShapeLoader.height; \n\
67 height: root.fixedArtShapeSize.height > 0 ? root.fixedArtShapeSize.height : artShapeLoader.height; \n\
@@ -69,7 +70,8 @@ var kArtShapeHolderCode = 'Item { \n\
69 Loader { \n\
70 Loader { \n\
70 id: artShapeLoader; \n\
71 id: artShapeLoader; \n\
71 objectName: "artShapeLoader"; \n\
72 objectName: "artShapeLoader"; \n\
72− active: cardData && cardData["art"] || false; \n\
73+ readonly property string cardArt: cardData && cardData["art"] || "%4"; \n\
74+ active: cardArt != "" || false; \n\
73 asynchronous: root.asynchronous; \n\
75 asynchronous: root.asynchronous; \n\
74 visible: status == Loader.Ready; \n\
76 visible: status == Loader.Ready; \n\
75 sourceComponent: Item { \n\
77 sourceComponent: Item { \n\
@@ -127,7 +129,7 @@ var kArtShapeHolderCode = 'Item { \n\
127 CroppedImageMinimumSourceSize { \n\
129 CroppedImageMinimumSourceSize { \n\
128 id: artImage; \n\
130 id: artImage; \n\
129 objectName: "artImage"; \n\
131 objectName: "artImage"; \n\
130− source: cardData && cardData["art"] || ""; \n\
132+ source: artShapeLoader.cardArt; \n\
131 asynchronous: root.asynchronous; \n\
133 asynchronous: root.asynchronous; \n\
132 width: %2; \n\
134 width: %2; \n\
133 height: %3; \n\
135 height: %3; \n\
@@ -205,11 +207,12 @@ var kMascotShapeLoaderCode = 'Loader { \n\
205
207
206// %1 is used as anchors of mascotImage
208// %1 is used as anchors of mascotImage
207// %2 is used as visible of mascotImage
209// %2 is used as visible of mascotImage
210+// %3 is used as fallback image
208var kMascotImageCode = 'CroppedImageMinimumSourceSize { \n\
211var kMascotImageCode = 'CroppedImageMinimumSourceSize { \n\
209 id: mascotImage; \n\
212 id: mascotImage; \n\
210 objectName: "mascotImage"; \n\
213 objectName: "mascotImage"; \n\
211 anchors { %1 } \n\
214 anchors { %1 } \n\
212− source: cardData && cardData["mascot"] || ""; \n\
215+ source: cardData && cardData["mascot"] || "%3"; \n\
213 width: units.gu(6); \n\
216 width: units.gu(6); \n\
214 height: units.gu(5.625); \n\
217 height: units.gu(5.625); \n\
215 horizontalAlignment: Image.AlignHCenter; \n\
218 horizontalAlignment: Image.AlignHCenter; \n\
@@ -390,8 +393,8 @@ function cardString(template, components) {
390 heightCode = 'width / artShape.aspect';
393 heightCode = 'width / artShape.aspect';
391 }
394 }
392
395
393− code += kArtShapeHolderCode.arg(artAnchors).arg(widthCode).arg(heightCode);
394 var fallback = components["art"] && components["art"]["fallback"] || "";
396 var fallback = components["art"] && components["art"]["fallback"] || "";
397+ code += kArtShapeHolderCode.arg(artAnchors).arg(widthCode).arg(heightCode).arg(fallback);
395 if (fallback !== "") {
398 if (fallback !== "") {
396 code += 'Connections { target: artShapeLoader.item ? artShapeLoader.item.image : null; onStatusChanged: if (artShapeLoader.item.image.status === Image.Error) artShapeLoader.item.image.source = "%1"; } \n'.arg(fallback);
399 code += 'Connections { target: artShapeLoader.item ? artShapeLoader.item.image : null; onStatusChanged: if (artShapeLoader.item.image.status === Image.Error) artShapeLoader.item.image.source = "%1"; } \n'.arg(fallback);
397 }
400 }
@@ -473,8 +476,8 @@ function cardString(template, components) {
473 }
476 }
474
477
475 var mascotImageVisible = useMascotShape ? 'false' : 'showHeader';
478 var mascotImageVisible = useMascotShape ? 'false' : 'showHeader';
476− mascotCode = kMascotImageCode.arg(mascotAnchors).arg(mascotImageVisible);
477 var fallback = components["mascot"] && components["mascot"]["fallback"] || "";
479 var fallback = components["mascot"] && components["mascot"]["fallback"] || "";
480+ mascotCode = kMascotImageCode.arg(mascotAnchors).arg(mascotImageVisible).arg(fallback);
478 if (fallback !== "") {
481 if (fallback !== "") {
479 code += 'Connections { target: mascotImage; onStatusChanged: if (mascotImage.status === Image.Error) mascotImage.source = "%1"; } \n'.arg(fallback);
482 code += 'Connections { target: mascotImage; onStatusChanged: if (mascotImage.status === Image.Error) mascotImage.source = "%1"; } \n'.arg(fallback);
480 }
483 }
tests/qmltests/Dash/tst_Card.qml+18
@@ -470,6 +470,15 @@ Rectangle {
470 card.cardDataChanged();
470 card.cardDataChanged();
471 waitForRendering(card);
471 waitForRendering(card);
472 tryCompare(art, "visible", true);
472 tryCompare(art, "visible", true);
473+ compare(artImage.source, Qt.resolvedUrl("artwork/emblem.png"));
474+
475+ cardTool.components["art"]["fallback"] = Qt.resolvedUrl("artwork/checkers.png");
476+ cardTool.componentsChanged();
477+ card.cardData["art"] = "";
478+ card.cardDataChanged();
479+ waitForRendering(card);
480+ tryCompare(art, "visible", true);
481+ compare(artImage.source, Qt.resolvedUrl("artwork/checkers.png"));
473
482
474 card.cardData["mascot"] = "somethingbroken2";
483 card.cardData["mascot"] = "somethingbroken2";
475 card.cardDataChanged();
484 card.cardDataChanged();
@@ -481,6 +490,15 @@ Rectangle {
481 card.cardDataChanged();
490 card.cardDataChanged();
482 waitForRendering(card);
491 waitForRendering(card);
483 tryCompare(mascotImage, "status", Image.Ready);
492 tryCompare(mascotImage, "status", Image.Ready);
493+ compare(mascotImage.source, Qt.resolvedUrl("artwork/emblem.png"));
494+
495+ cardTool.components["mascot"] = {"fallback": Qt.resolvedUrl("artwork/checkers.png")};
496+ cardTool.componentsChanged();
497+ card.cardData["mascot"] = "";
498+ card.cardDataChanged();
499+ waitForRendering(card);
500+ tryCompare(mascotImage, "status", Image.Ready);
501+ compare(mascotImage.source, Qt.resolvedUrl("artwork/checkers.png"));
484 }
502 }
485
503
486 function test_font_weights_data() {
504 function test_font_weights_data() {