#pragma once #include #include #include #include #include #include class Actor; typedef enum { ITEM_VALUE_BOOL = 0, ITEM_VALUE_UINT, ITEM_VALUE_NO_VALUE } item_value_type_t; typedef enum { ITEM_UPDATE_USER = 0, ITEM_UPDATE_ACTOR, ITEM_UPDATE_REMOTE, ITEM_UPDATE_LOADED, ITEM_UPDATE_BACKEND, ITEM_UPDATE_INVALID } item_update_type_t; class ItemData { protected: QString name_; uint8_t value_; uint32_t itemId_; bool loaded_; bool hidden_; item_value_type_t type_; public: ItemData(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "Item", uint8_t value = 0, bool loaded = false, bool hidden = false, item_value_type_t type = ITEM_VALUE_BOOL); inline bool operator==(const ItemData& in) const { return itemId_ == in.itemId_; } inline bool operator!=(const ItemData& in) const { return itemId_ != in.itemId_; } uint32_t id() const; bool hasChanged(const ItemData& other); void setName(QString name); uint8_t getValue() const; void setValueData(uint8_t value); bool getLoaded() const; void setLoaded(bool loaded); bool isHidden() const; void setHidden(bool hidden); item_value_type_t getValueType(); virtual QString getName() const; virtual void store(QJsonObject& json); virtual void load(const QJsonObject& json, const bool preserve = false); }; struct ItemUpdateRequest { item_update_type_t type = ITEM_UPDATE_INVALID; ItemData payload; std::vector > newActors; }; class Item: public QObject, public ItemData { Q_OBJECT private: std::vector< std::shared_ptr > actors_; bool override_ = false; signals: void updated(ItemUpdateRequest update); public slots: virtual void requestUpdate(ItemUpdateRequest update); public: Item(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "Item", uint8_t value = 0, QObject *parent = nullptr); Item(const ItemData& itemData, QObject *parent = nullptr); virtual ~Item(); Item& operator=(const ItemData& other); std::vector< std::shared_ptr >& getActors(); bool hasActors(); void addActor(std::shared_ptr actor); bool removeActor(std::shared_ptr actor); void removeAllActors(); void setActorsActive(bool in); void setOverride(const bool in); bool getOverride(); ItemUpdateRequest createValueUpdateRequest(uint8_t value, item_update_type_t type, bool withActors = false); virtual void store(QJsonObject& json); virtual void load(const QJsonObject& json, const bool preserve = false); static std::shared_ptr loadItem(const QJsonObject& json); protected: virtual void enactValue(uint8_t value); };