Skip to content

Commit

Permalink
Allow to make custom objects private to an extension (#7275)
Browse files Browse the repository at this point in the history
  • Loading branch information
D8H authored Jan 3, 2025
1 parent 8e29c72 commit 0ec0654
Show file tree
Hide file tree
Showing 23 changed files with 196 additions and 61 deletions.
2 changes: 1 addition & 1 deletion Core/GDCore/Extensions/Metadata/BehaviorMetadata.h
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ class GD_CORE_API BehaviorMetadata : public InstructionOrExpressionContainerMeta
* Check if the behavior is private - it can't be used outside of its
* extension.
*/
bool IsPrivate() const { return isPrivate; }
bool IsPrivate() const override { return isPrivate; }

/**
* Set that the behavior is private - it can't be used outside of its
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ class GD_CORE_API InstructionOrExpressionContainerMetadata {
virtual const gd::String &GetFullName() const = 0;
virtual const gd::String &GetDescription() const = 0;
virtual const gd::String &GetIconFilename() const = 0;
virtual bool IsPrivate() const = 0;

/**
* \brief Return a reference to a map containing the names of the actions
Expand Down
17 changes: 17 additions & 0 deletions Core/GDCore/Extensions/Metadata/ObjectMetadata.h
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,22 @@ class GD_CORE_API ObjectMetadata : public InstructionOrExpressionContainerMetada
*/
std::map<gd::String, gd::ExpressionMetadata>& GetAllStrExpressions() override { return strExpressionsInfos; };


/**
* Check if the behavior is private - it can't be used outside of its
* extension.
*/
bool IsPrivate() const override { return isPrivate; }

/**
* Set that the behavior is private - it can't be used outside of its
* extension.
*/
ObjectMetadata &SetPrivate() {
isPrivate = true;
return *this;
}

/**
* \brief Set the object to be hidden in the IDE.
*
Expand Down Expand Up @@ -356,6 +372,7 @@ class GD_CORE_API ObjectMetadata : public InstructionOrExpressionContainerMetada
gd::String iconFilename;
gd::String categoryFullName;
std::set<gd::String> defaultBehaviorTypes;
bool isPrivate = false;
bool hidden = false;
bool isRenderedIn3D = false;
gd::String openFullEditorLabel;
Expand Down
4 changes: 4 additions & 0 deletions Core/GDCore/Project/AbstractEventsBasedEntity.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ void AbstractEventsBasedEntity::SerializeTo(SerializerElement& element) const {
element.SetAttribute("description", description);
element.SetAttribute("name", name);
element.SetAttribute("fullName", fullName);
if (isPrivate) {
element.SetBoolAttribute("private", isPrivate);
}

gd::SerializerElement& eventsFunctionsElement =
element.AddChild("eventsFunctions");
Expand All @@ -36,6 +39,7 @@ void AbstractEventsBasedEntity::UnserializeFrom(
description = element.GetStringAttribute("description");
name = element.GetStringAttribute("name");
fullName = element.GetStringAttribute("fullName");
isPrivate = element.GetBoolAttribute("private");

const gd::SerializerElement& eventsFunctionsElement =
element.GetChild("eventsFunctions");
Expand Down
21 changes: 17 additions & 4 deletions Core/GDCore/Project/AbstractEventsBasedEntity.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@
* Copyright 2008-2016 Florian Rival ([email protected]). All rights
* reserved. This project is released under the MIT License.
*/
#ifndef GDCORE_ABSTRACTEVENTSBASEDENTITY_H
#define GDCORE_ABSTRACTEVENTSBASEDENTITY_H
#pragma once

#include <vector>
#include "GDCore/Project/NamedPropertyDescriptor.h"
Expand Down Expand Up @@ -40,6 +39,21 @@ class GD_CORE_API AbstractEventsBasedEntity {
*/
AbstractEventsBasedEntity* Clone() const { return new AbstractEventsBasedEntity(*this); };

/**
* \brief Check if the behavior or object is private - it can't be used outside of its
* extension.
*/
bool IsPrivate() const { return isPrivate; }

/**
* \brief Set that the behavior or object is private - it can't be used outside of its
* extension.
*/
AbstractEventsBasedEntity& SetPrivate(bool isPrivate_) {
isPrivate = isPrivate_;
return *this;
}

/**
* \brief Get the description of the behavior or object, that is displayed in the
* editor.
Expand Down Expand Up @@ -151,8 +165,7 @@ class GD_CORE_API AbstractEventsBasedEntity {
gd::EventsFunctionsContainer eventsFunctionsContainer;
gd::PropertiesContainer propertyDescriptors;
gd::String extensionName;
bool isPrivate = false;
};

} // namespace gd

#endif // GDCORE_ABSTRACTEVENTSBASEDENTITY_H
4 changes: 0 additions & 4 deletions Core/GDCore/Project/EventsBasedBehavior.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,6 @@ EventsBasedBehavior::EventsBasedBehavior()
void EventsBasedBehavior::SerializeTo(SerializerElement& element) const {
AbstractEventsBasedEntity::SerializeTo(element);
element.SetAttribute("objectType", objectType);
if (isPrivate) {
element.SetBoolAttribute("private", isPrivate);
}
sharedPropertyDescriptors.SerializeElementsTo(
"propertyDescriptor", element.AddChild("sharedPropertyDescriptors"));
if (quickCustomizationVisibility != QuickCustomization::Visibility::Default) {
Expand All @@ -39,7 +36,6 @@ void EventsBasedBehavior::UnserializeFrom(gd::Project& project,
const SerializerElement& element) {
AbstractEventsBasedEntity::UnserializeFrom(project, element);
objectType = element.GetStringAttribute("objectType");
isPrivate = element.GetBoolAttribute("private");
sharedPropertyDescriptors.UnserializeElementsFrom(
"propertyDescriptor", element.GetChild("sharedPropertyDescriptors"));
if (element.HasChild("quickCustomizationVisibility")) {
Expand Down
18 changes: 4 additions & 14 deletions Core/GDCore/Project/EventsBasedBehavior.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@
* Copyright 2008-2016 Florian Rival ([email protected]). All rights
* reserved. This project is released under the MIT License.
*/
#ifndef GDCORE_EVENTSBASEDBEHAVIOR_H
#define GDCORE_EVENTSBASEDBEHAVIOR_H
#pragma once

#include <vector>
#include "GDCore/Project/AbstractEventsBasedEntity.h"
Expand Down Expand Up @@ -75,17 +74,11 @@ class GD_CORE_API EventsBasedBehavior: public AbstractEventsBasedEntity {
}

/**
* \brief Check if the behavior is private - it can't be used outside of its
* \brief Set that the behavior or object is private - it can't be used outside of its
* extension.
*/
bool IsPrivate() const { return isPrivate; }

/**
* \brief Set that the behavior is private - it can't be used outside of its
* extension.
*/
EventsBasedBehavior& SetPrivate(bool _isPrivate) {
isPrivate = _isPrivate;
EventsBasedBehavior& SetPrivate(bool isPrivate) {
AbstractEventsBasedEntity::SetPrivate(isPrivate);
return *this;
}

Expand Down Expand Up @@ -149,11 +142,8 @@ class GD_CORE_API EventsBasedBehavior: public AbstractEventsBasedEntity {

private:
gd::String objectType;
bool isPrivate = false;
gd::PropertiesContainer sharedPropertyDescriptors;
QuickCustomization::Visibility quickCustomizationVisibility;
};

} // namespace gd

#endif // GDCORE_EVENTSBASEDBEHAVIOR_H
9 changes: 9 additions & 0 deletions Core/GDCore/Project/EventsBasedObject.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,15 @@ class GD_CORE_API EventsBasedObject: public AbstractEventsBasedEntity {
return *this;
}

/**
* \brief Set that the object is private - it can't be used outside of its
* extension.
*/
EventsBasedObject& SetPrivate(bool isPrivate) {
AbstractEventsBasedEntity::SetPrivate(isPrivate);
return *this;
}

/**
* \brief Declare a usage of the 3D renderer.
*/
Expand Down
3 changes: 3 additions & 0 deletions GDJS/GDJS/Events/CodeGeneration/MetadataDeclarationHelper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,9 @@ gd::ObjectMetadata &MetadataDeclarationHelper::DeclareObjectMetadata(
.AddDefaultBehavior("TextContainerCapability::TextContainerBehavior");
}

if (eventsBasedObject.IsPrivate())
objectMetadata.SetPrivate();

// TODO EBO Use full type to identify object to avoid collision.
// Objects are identified by their name alone.
const gd::String &objectType = eventsBasedObject.GetName();
Expand Down
25 changes: 14 additions & 11 deletions GDevelop.js/Bindings/Bindings.idl
Original file line number Diff line number Diff line change
Expand Up @@ -1928,6 +1928,9 @@ interface ObjectMetadata {
boolean HasDefaultBehavior([Const] DOMString behaviorType);
[Ref] ObjectMetadata AddDefaultBehavior([Const] DOMString behaviorType);

boolean IsPrivate();
[Ref] ObjectMetadata SetPrivate();

[Ref] ObjectMetadata SetHidden();
boolean IsHidden();

Expand Down Expand Up @@ -3006,23 +3009,25 @@ interface AbstractEventsBasedEntity {
[Ref] EventsFunctionsContainer GetEventsFunctions();
[Ref] PropertiesContainer GetPropertyDescriptors();

[Const, Ref] DOMString GetName();
[Const, Ref] DOMString GetFullName();
[Const, Ref] DOMString GetDescription();
boolean IsPrivate();

void SerializeTo([Ref] SerializerElement element);
void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element);
};

interface EventsBasedBehavior {
void EventsBasedBehavior();

[Ref] EventsBasedBehavior SetDescription([Const] DOMString description);
[Const, Ref] DOMString GetDescription();
[Ref] EventsBasedBehavior SetName([Const] DOMString name);
[Const, Ref] DOMString GetName();
[Ref] EventsBasedBehavior SetFullName([Const] DOMString fullName);
[Const, Ref] DOMString GetFullName();
[Ref] EventsBasedBehavior SetDescription([Const] DOMString description);
[Ref] EventsBasedBehavior SetPrivate(boolean isPrivate);

[Ref] EventsBasedBehavior SetObjectType([Const] DOMString fullName);
[Const, Ref] DOMString GetObjectType();
[Ref] EventsBasedBehavior SetPrivate(boolean isPrivate);
boolean IsPrivate();
[Ref] EventsBasedBehavior SetQuickCustomizationVisibility(QuickCustomization_Visibility visibility);
QuickCustomization_Visibility GetQuickCustomizationVisibility();

Expand Down Expand Up @@ -3057,15 +3062,13 @@ interface EventsBasedBehaviorsList {
interface EventsBasedObject {
void EventsBasedObject();

[Ref] EventsBasedObject SetDescription([Const] DOMString description);
[Const, Ref] DOMString GetDescription();
[Ref] EventsBasedObject SetName([Const] DOMString name);
[Const, Ref] DOMString GetName();
[Ref] EventsBasedObject SetFullName([Const] DOMString fullName);
[Const, Ref] DOMString GetFullName();
[Ref] EventsBasedObject SetDescription([Const] DOMString description);
[Ref] EventsBasedObject SetPrivate(boolean isPrivate);

[Ref] EventsBasedObject SetDefaultName([Const] DOMString defaultName);
[Const, Ref] DOMString GetDefaultName();

[Ref] EventsBasedObject MarkAsRenderedIn3D(boolean isRenderedIn3D);
boolean IsRenderedIn3D();
[Ref] EventsBasedObject MarkAsAnimatable(boolean isAnimatable);
Expand Down
20 changes: 10 additions & 10 deletions GDevelop.js/types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1543,6 +1543,8 @@ export class ObjectMetadata extends EmscriptenObject {
getDefaultBehaviors(): SetString;
hasDefaultBehavior(behaviorType: string): boolean;
addDefaultBehavior(behaviorType: string): ObjectMetadata;
isPrivate(): boolean;
setPrivate(): ObjectMetadata;
setHidden(): ObjectMetadata;
isHidden(): boolean;
markAsRenderedIn3D(): ObjectMetadata;
Expand Down Expand Up @@ -2172,22 +2174,22 @@ export class EventsFunctionsContainer extends EmscriptenObject {
export class AbstractEventsBasedEntity extends EmscriptenObject {
getEventsFunctions(): EventsFunctionsContainer;
getPropertyDescriptors(): PropertiesContainer;
getName(): string;
getFullName(): string;
getDescription(): string;
isPrivate(): boolean;
serializeTo(element: SerializerElement): void;
unserializeFrom(project: Project, element: SerializerElement): void;
}

export class EventsBasedBehavior extends AbstractEventsBasedEntity {
constructor();
setDescription(description: string): EventsBasedBehavior;
getDescription(): string;
setName(name: string): EventsBasedBehavior;
getName(): string;
setFullName(fullName: string): EventsBasedBehavior;
getFullName(): string;
setDescription(description: string): EventsBasedBehavior;
setPrivate(isPrivate: boolean): EventsBasedBehavior;
setObjectType(fullName: string): EventsBasedBehavior;
getObjectType(): string;
setPrivate(isPrivate: boolean): EventsBasedBehavior;
isPrivate(): boolean;
setQuickCustomizationVisibility(visibility: QuickCustomization_Visibility): EventsBasedBehavior;
getQuickCustomizationVisibility(): QuickCustomization_Visibility;
getSharedPropertyDescriptors(): PropertiesContainer;
Expand Down Expand Up @@ -2217,12 +2219,10 @@ export class EventsBasedBehaviorsList extends EmscriptenObject {

export class EventsBasedObject extends AbstractEventsBasedEntity {
constructor();
setDescription(description: string): EventsBasedObject;
getDescription(): string;
setName(name: string): EventsBasedObject;
getName(): string;
setFullName(fullName: string): EventsBasedObject;
getFullName(): string;
setDescription(description: string): EventsBasedObject;
setPrivate(isPrivate: boolean): EventsBasedObject;
setDefaultName(defaultName: string): EventsBasedObject;
getDefaultName(): string;
markAsRenderedIn3D(isRenderedIn3D: boolean): EventsBasedObject;
Expand Down
4 changes: 4 additions & 0 deletions GDevelop.js/types/gdabstracteventsbasedentity.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@
declare class gdAbstractEventsBasedEntity {
getEventsFunctions(): gdEventsFunctionsContainer;
getPropertyDescriptors(): gdPropertiesContainer;
getName(): string;
getFullName(): string;
getDescription(): string;
isPrivate(): boolean;
serializeTo(element: gdSerializerElement): void;
unserializeFrom(project: gdProject, element: gdSerializerElement): void;
delete(): void;
Expand Down
8 changes: 2 additions & 6 deletions GDevelop.js/types/gdeventsbasedbehavior.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@
// Automatically generated by GDevelop.js/scripts/generate-types.js
declare class gdEventsBasedBehavior extends gdAbstractEventsBasedEntity {
constructor(): void;
setDescription(description: string): gdEventsBasedBehavior;
getDescription(): string;
setName(name: string): gdEventsBasedBehavior;
getName(): string;
setFullName(fullName: string): gdEventsBasedBehavior;
getFullName(): string;
setDescription(description: string): gdEventsBasedBehavior;
setPrivate(isPrivate: boolean): gdEventsBasedBehavior;
setObjectType(fullName: string): gdEventsBasedBehavior;
getObjectType(): string;
setPrivate(isPrivate: boolean): gdEventsBasedBehavior;
isPrivate(): boolean;
setQuickCustomizationVisibility(visibility: QuickCustomization_Visibility): gdEventsBasedBehavior;
getQuickCustomizationVisibility(): QuickCustomization_Visibility;
getSharedPropertyDescriptors(): gdPropertiesContainer;
Expand Down
6 changes: 2 additions & 4 deletions GDevelop.js/types/gdeventsbasedobject.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
// Automatically generated by GDevelop.js/scripts/generate-types.js
declare class gdEventsBasedObject extends gdAbstractEventsBasedEntity {
constructor(): void;
setDescription(description: string): gdEventsBasedObject;
getDescription(): string;
setName(name: string): gdEventsBasedObject;
getName(): string;
setFullName(fullName: string): gdEventsBasedObject;
getFullName(): string;
setDescription(description: string): gdEventsBasedObject;
setPrivate(isPrivate: boolean): gdEventsBasedObject;
setDefaultName(defaultName: string): gdEventsBasedObject;
getDefaultName(): string;
markAsRenderedIn3D(isRenderedIn3D: boolean): gdEventsBasedObject;
Expand Down
2 changes: 2 additions & 0 deletions GDevelop.js/types/gdobjectmetadata.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ declare class gdObjectMetadata {
getDefaultBehaviors(): gdSetString;
hasDefaultBehavior(behaviorType: string): boolean;
addDefaultBehavior(behaviorType: string): gdObjectMetadata;
isPrivate(): boolean;
setPrivate(): gdObjectMetadata;
setHidden(): gdObjectMetadata;
isHidden(): boolean;
markAsRenderedIn3D(): gdObjectMetadata;
Expand Down
3 changes: 3 additions & 0 deletions newIDE/app/scripts/lib/ExtensionReferenceGenerator.js
Original file line number Diff line number Diff line change
Expand Up @@ -403,6 +403,9 @@ const generateExtensionReference = extension => {
/** @type {Array<ObjectReference>} */
let objectReferences = objectTypes.map(objectType => {
const objectMetadata = extension.getObjectMetadata(objectType);
if (objectMetadata.isPrivate()) {
return null;
}
const actionsReferenceTexts = generateInstructionsReferenceRowsTexts({
areConditions: false,
instructionsMetadata: extension.getAllActionsForObject(objectType),
Expand Down
12 changes: 12 additions & 0 deletions newIDE/app/src/EventsBasedBehaviorEditor/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,18 @@ export default function EventsBasedBehaviorEditor({
if (onConfigurationUpdated) onConfigurationUpdated('isPrivate');
onChange();
}}
tooltipOrHelperText={
eventsBasedBehavior.isPrivate() ? (
<Trans>
This behavior won't be visible in the scene and events
editors.
</Trans>
) : (
<Trans>
This behavior will be visible in the scene and events editors.
</Trans>
)
}
/>
{eventsBasedBehavior
.getEventsFunctions()
Expand Down
Loading

0 comments on commit 0ec0654

Please sign in to comment.