Skip to content

Commit 8c98239

Browse files
authored
Allow to swap assets of any object type (#7365)
1 parent 4d56333 commit 8c98239

File tree

4 files changed

+68
-17
lines changed

4 files changed

+68
-17
lines changed

newIDE/app/src/AssetStore/AssetStoreSearchFilter.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,16 @@ export class ColorAssetStoreSearchFilter
262262
}
263263

264264
const toAssetStoreType = (type: string) => {
265-
return type === 'Sprite' ? 'sprite' : type;
265+
switch (type) {
266+
case 'Sprite':
267+
return 'sprite';
268+
case 'TiledSpriteObject::TiledSprite':
269+
return 'tiled';
270+
case 'PanelSpriteObject::PanelSprite':
271+
return '9patch';
272+
default:
273+
return type;
274+
}
266275
};
267276

268277
// Thematic tags are noise for asset swapping as changing the theme may be what

newIDE/app/src/AssetStore/AssetSwapper.js

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,18 @@ type SpriteObjectDataType = {
8181
animations: Array<SpriteAnimationData>,
8282
};
8383

84-
export const canSwapAssetOfObject = (object: gdObject) => {
85-
const type = object.getType();
86-
return type === 'Scene3D::Model3DObject' || type === 'Sprite';
87-
};
84+
const unswappableObjectTypes = [
85+
'BBText::BBText',
86+
'TextObject::Text',
87+
'Lighting::LightObject',
88+
'PrimitiveDrawing::Drawer',
89+
'TileMap::TileMap',
90+
'TileMap::CollisionMask',
91+
'TileMap::SimpleTileMap',
92+
'Video::VideoObject',
93+
];
94+
export const canSwapAssetOfObject = (object: gdObject) =>
95+
!unswappableObjectTypes.includes(object.getType());
8896

8997
const mergeAnimations = function<A: { name: string }>(
9098
project: gdProject,
@@ -312,7 +320,7 @@ export const swapAsset = (
312320
assetObject: gdObject,
313321
assetShortHeader?: ?AssetShortHeader
314322
) => {
315-
const serializedObject = serializeToJSObject(object);
323+
let serializedObject = serializeToJSObject(object);
316324
const serializedAssetObject = serializeToJSObject(assetObject);
317325

318326
if (object.getType() === 'Sprite') {
@@ -338,6 +346,7 @@ export const swapAsset = (
338346
scaleX,
339347
scaleY
340348
);
349+
serializedObject.assetStoreId = serializedAssetObject.assetStoreId;
341350
} else if (object.getType() === 'Scene3D::Model3DObject') {
342351
const objectVolume =
343352
serializedObject.content.width *
@@ -365,6 +374,15 @@ export const swapAsset = (
365374
centerLocation: serializedObject.content.centerLocation,
366375
};
367376
serializedObject.assetStoreId = serializedAssetObject.assetStoreId;
377+
} else {
378+
serializedObject = {
379+
...serializedAssetObject,
380+
name: serializedObject.name,
381+
type: serializedObject.type,
382+
variables: serializedObject.variables,
383+
behaviors: serializedObject.behaviors,
384+
effects: serializedObject.effects,
385+
};
368386
}
369387
unserializeFromJSObject(object, serializedObject, 'unserializeFrom', project);
370388
};

newIDE/app/src/AssetStore/PrivateAssets/PrivateAssetPackInformationPage.js

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -90,22 +90,22 @@ const sortedContentType: PrivateAssetPackAssetType[] = [
9090
'TileMap::SimpleTileMap',
9191
'ParticleSystem::ParticleEmitter',
9292
'font',
93+
'bitmapFont',
9394
'audio',
94-
'partial',
9595
];
9696

9797
const contentTypeToMessageDescriptor: {
9898
[PrivateAssetPackAssetType]: MessageDescriptor,
9999
} = {
100-
sprite: t`Sprites`,
101-
'9patch': t`Panel sprites`,
102-
tiled: t`Tiled sprites`,
100+
sprite: t`sprites`,
101+
'9patch': t`panel sprites`,
102+
tiled: t`tiled sprites`,
103103
'Scene3D::Model3DObject': t`3D models`,
104-
'TileMap::SimpleTileMap': t`Tilemaps`,
105-
'ParticleSystem::ParticleEmitter': t`Particle emitters`,
106-
font: t`Fonts`,
107-
audio: t`Audios`,
108-
partial: t`Other`,
104+
'TileMap::SimpleTileMap': t`tile maps`,
105+
'ParticleSystem::ParticleEmitter': t`particle emitters`,
106+
font: t`fonts`,
107+
bitmapFont: t`bitmap fonts`,
108+
audio: t`audios`,
109109
};
110110

111111
const styles = {
@@ -521,6 +521,23 @@ const PrivateAssetPackInformationPage = ({
521521
{ subscription, privateAssetPackListingData, isAlreadyReceived }
522522
);
523523

524+
const smartObjectsCount = React.useMemo(
525+
() => {
526+
if (!assetPack) {
527+
return 0;
528+
}
529+
let smartObjectsCount = 0;
530+
for (const type in assetPack.content) {
531+
const assetCount = assetPack.content[type];
532+
if (!sortedContentType.includes(type)) {
533+
smartObjectsCount += assetCount;
534+
}
535+
}
536+
return smartObjectsCount;
537+
},
538+
[assetPack]
539+
);
540+
524541
return (
525542
<I18n>
526543
{({ i18n }) => (
@@ -714,6 +731,13 @@ const PrivateAssetPackInformationPage = ({
714731
}
715732
return null;
716733
})}
734+
{smartObjectsCount > 0 ? (
735+
<li>
736+
<Text displayInlineAsSpan noMargin>
737+
<Trans>{smartObjectsCount} smart objects</Trans>
738+
</Text>
739+
</li>
740+
) : null}
717741
</Column>
718742
{bundlesContainingPackTiles &&
719743
bundlesContainingPackTiles.length ? (

newIDE/app/src/Utils/GDevelopServices/Asset.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,10 +102,10 @@ export type PrivateAssetPackAssetType =
102102
| 'sprite'
103103
| '9patch'
104104
| 'tiled'
105-
| 'partial'
106105
| 'Scene3D::Model3DObject'
107106
| 'TileMap::SimpleTileMap'
108-
| 'ParticleSystem::ParticleEmitter';
107+
| 'ParticleSystem::ParticleEmitter'
108+
| string;
109109

110110
export type PrivateAssetPackContent = { [PrivateAssetPackAssetType]: number };
111111

0 commit comments

Comments
 (0)