Files
GDevelop/Core/GDCore/Events/Builtin/LinkEvent.h
D8H 859b1d0a1c Refactor events when project elements are renamed (#5031)
* Project elements are: scenes, external layouts, external events, layers, layer effects, object effects, sprite animations and sprite points.
2023-03-20 12:02:36 +01:00

145 lines
4.9 KiB
C++

/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#ifndef GDCORE_LINKEVENT_H
#define GDCORE_LINKEVENT_H
#include "GDCore/Events/Event.h"
#include "GDCore/String.h"
namespace gd {
/**
* \brief A link pointing to external events (or events of another layout) that
* should be included and run instead of the link.
*/
class GD_CORE_API LinkEvent : public gd::BaseEvent {
public:
enum IncludeConfig {
INCLUDE_ALL = 0,
INCLUDE_EVENTS_GROUP = 1,
INCLUDE_BY_INDEX = 2 // Deprecated
};
LinkEvent()
: BaseEvent(),
includeConfig(INCLUDE_ALL),
eventsGroupName(),
includeStart(gd::String::npos),
includeEnd(gd::String::npos),
linkWasInvalid(false){};
virtual ~LinkEvent();
virtual gd::LinkEvent* Clone() const override { return new LinkEvent(*this); }
/**
* Get the link target (i.e. the scene or external events the link refers to).
*/
const gd::String& GetTarget() const { return target; };
/**
* Change the link target (i.e. the scene or external events the link refers
* to).
*/
void SetTarget(const gd::String& target_) { target = target_; };
/**
* Return the include config.
*/
IncludeConfig GetIncludeConfig() const { return includeConfig; }
/**
* Return true if the link event must include all the events of the target.
*/
void SetIncludeAllEvents() { includeConfig = INCLUDE_ALL; }
void SetIncludeEventsGroup(const gd::String& name) {
includeConfig = INCLUDE_EVENTS_GROUP;
eventsGroupName = name;
}
/**
* Set the number of the first and last event to be included ( Meaningful only
* if includeAll was set to false, see SetIncludeAllEvents )
*/
void SetIncludeStartAndEnd(std::size_t includeStart_,
std::size_t includeEnd_) {
includeConfig = INCLUDE_BY_INDEX;
includeStart = includeStart_;
includeEnd = includeEnd_;
}
gd::String GetEventsGroupName() const { return eventsGroupName; }
/**
* Get the number of the first event to be included. (Meaningful only if
* includeAll was set to false, see SetIncludeAllEvents)
*/
std::size_t GetIncludeStart() const { return includeStart; };
/**
* Get the number of the last event to be included. (Meaningful only if
* includeAll was set to false, see SetIncludeAllEvents)
*/
std::size_t GetIncludeEnd() const { return includeEnd; };
/**
* The link event must always be preprocessed.
*/
virtual bool MustBePreprocessed() override { return true; }
/**
* \brief Get a pointer to the list of events that are targeted by the link.
*
* @param project The project containing the link.
* @return NULL if nothing is found or a pointer to the list of events being
* linked.
*/
const EventsList* GetLinkedEvents(const gd::Project& project) const;
/**
* \brief Replace the link in the events list by the linked events.
* When implementing a platform with a link event, you should call this
* function when preprocessing the events (See
* gd::EventMetadata::codeGeneration).
*/
void ReplaceLinkByLinkedEvents(const gd::Project& project,
EventsList& eventList,
std::size_t indexOfTheEventInThisList);
virtual bool IsExecutable() const override { return true; };
virtual void SerializeTo(SerializerElement& element) const override;
virtual void UnserializeFrom(gd::Project& project,
const SerializerElement& element) override;
bool AcceptVisitor(gd::EventVisitor& eventVisitor) override;
void AcceptVisitor(gd::ReadOnlyEventVisitor& eventVisitor) const override;
private:
gd::String
target; ///< The name of the external events (or scene) to be included
IncludeConfig
includeConfig; ///< Defines which events are included by this link
gd::String eventsGroupName; ///< If includeConfig is set to
///< INCLUDE_EVENTS_GROUP, represents the name of
///< the events group to be included.
std::size_t includeStart; ///< If includeConfig is set to INCLUDE_BY_INDEX,
///< represents the number of the first event of
///< the target to included.
std::size_t
includeEnd; ///< If includeConfig is set to INCLUDE_BY_INDEX, represents
///< the number of the last event of the target to included.
bool linkWasInvalid; ///< Set to true by Preprocess if the links was invalid
///< the last time is was processed. Used to display a
///< warning in the events editor.
};
} // namespace gd
#endif // GDCORE_LINKEVENT_H