Skip to content

Commit

Permalink
allow editing color, drawFill, usageFlags, enum values, enum storage …
Browse files Browse the repository at this point in the history
…type from scripting
  • Loading branch information
dogboydog committed Jan 24, 2025
1 parent 2a61fa5 commit d293bea
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 14 deletions.
5 changes: 3 additions & 2 deletions src/tiled/editableproject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -102,14 +102,15 @@ ScriptPropertyType *EditableProject::findTypeByName(const QString &name)
return it == types.end() ? nullptr : toScriptType(*it);
}

void EditableProject::removeTypeByName(const QString &name)
bool EditableProject::removeTypeByName(const QString &name)
{
int index = project()->propertyTypes()->findIndexByName(name);
if (index < 0)
return;
return false;

project()->propertyTypes()->removeAt(index);
applyPropertyChanges();
return true;
}

void EditableProject::applyPropertyChanges()
Expand Down
2 changes: 1 addition & 1 deletion src/tiled/editableproject.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ class EditableProject final : public EditableAsset

QSharedPointer<Document> createDocument() override;

Q_INVOKABLE void removeTypeByName(const QString &name);
Q_INVOKABLE bool removeTypeByName(const QString &name);
Q_INVOKABLE ScriptPropertyType *findTypeByName(const QString &name);

private:
Expand Down
16 changes: 16 additions & 0 deletions src/tiled/scriptpropertytype.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@
* this program. If not, see <http://www.gnu.org/licenses/>.
*/

#include "preferences.h"
#include "project.h"
#include "projectmanager.h"
#include "scriptpropertytype.h"

namespace Tiled {
Expand All @@ -35,6 +38,19 @@ void registerPropertyTypes(QJSEngine *jsEngine)
jsEngine->newQMetaObject<ScriptClassPropertyType>());
}

/*
* Called when we make a change to a property type -
* this will reflect any property changes in the UI.
*
* TODO: Scheduling project save rather than every time
*/
void ScriptPropertyType::applyPropertyChanges()
{
emit Preferences::instance()->propertyTypesChanged();

Project &project = ProjectManager::instance()->project();
project.save();
}
} // namespace Tiled

#include "moc_scriptpropertytype.cpp"
56 changes: 45 additions & 11 deletions src/tiled/scriptpropertytype.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ namespace Tiled {
class ScriptPropertyType : public QObject
{
Q_OBJECT
Q_PROPERTY(QString name READ name)
Q_PROPERTY(QString name READ name WRITE setName)
Q_PROPERTY(bool isClass READ isClass)
Q_PROPERTY(bool isEnum READ isEnum)
Q_PROPERTY(QVariant defaultValue READ defaultValue)
Expand All @@ -44,10 +44,17 @@ class ScriptPropertyType : public QObject
{}

const QString &name() const;
void setName(const QString &value)
{
mType->name =value;
applyPropertyChanges();
}
bool isClass() const { return mType->isClass(); }
bool isEnum() const { return mType->isEnum(); }
QVariant defaultValue() { return mType->defaultValue(); }

protected:
void applyPropertyChanges();
private:
SharedPropertyType mType;
};
Expand All @@ -56,8 +63,8 @@ class ScriptEnumPropertyType : public ScriptPropertyType
{
Q_OBJECT

Q_PROPERTY(StorageType storageType READ storageType)
Q_PROPERTY(QStringList values READ values)
Q_PROPERTY(StorageType storageType READ storageType WRITE setStorageType)
Q_PROPERTY(QStringList values READ values WRITE setValues)

public:
ScriptEnumPropertyType(const QSharedPointer<EnumPropertyType> &propertyType)
Expand All @@ -72,19 +79,29 @@ class ScriptEnumPropertyType : public ScriptPropertyType
Q_ENUM(StorageType);

StorageType storageType() const { return static_cast<StorageType>(mEnumType->storageType); }
void setStorageType(StorageType value)
{
mEnumType->storageType = (EnumPropertyType::StorageType)value;
applyPropertyChanges();
}
QStringList values() const { return mEnumType->values; }

void setValues(const QStringList &values)
{
mEnumType->values.clear();
mEnumType->values.append(values);
applyPropertyChanges();
}
private:
QSharedPointer<EnumPropertyType> mEnumType;
};

class ScriptClassPropertyType : public ScriptPropertyType
{
Q_OBJECT
Q_PROPERTY(QColor color READ color)
Q_PROPERTY(QColor color READ color WRITE setColor)
Q_PROPERTY(QVariantMap members READ members)
Q_PROPERTY(bool drawFill READ drawFill)
Q_PROPERTY(int usageFlags READ usageFlags)
Q_PROPERTY(bool drawFill READ drawFill WRITE setDrawFill)
Q_PROPERTY(int usageFlags READ usageFlags WRITE setUsageFlags)

public:
ScriptClassPropertyType(const QSharedPointer<ClassPropertyType> &propertyType)
Expand All @@ -111,13 +128,30 @@ class ScriptClassPropertyType : public ScriptPropertyType
Q_ENUM(ClassUsageFlag)

QColor color() const { return mClassType->color; }
// TODO: " No viable overloaded '=' "
// void setColor(QColor &value) { mClassType->color = value; }

void setColor(QColor &value)
{
mClassType->color = value;
applyPropertyChanges();
}
QVariantMap members() const {return mClassType->members; }
// todo add members, remove members

bool drawFill() const { return mClassType->drawFill; }
// void setDrawFill(bool value) { mClassType->drawFill = value; }
void setDrawFill(bool value)
{
mClassType->drawFill = value;
applyPropertyChanges();
}
int usageFlags() const { return mClassType->usageFlags; }
//void setUsageFlags(int value) { mClassType->setUsageFlags(value); }
void setUsageFlags(int value) {
// clear any existing values first so that we set to exactly
// the new value rather than just turning all flags in `value`
// on.
mClassType->setUsageFlags(ClassUsageFlag::AnyUsage, false);
mClassType->setUsageFlags(value, true);
applyPropertyChanges();
}

private:
QSharedPointer<ClassPropertyType> mClassType;
Expand Down

0 comments on commit d293bea

Please sign in to comment.