Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
* Persisted collapsed state of the properties groups in the session (#4561)
* Scripting: Added 'tiled.cell' function, 'cell.flags' property and 'TileLayerEdit.setCell' function (#4538)
* Scripting: Added MapObject.resolvedClassName() (by MatusGuy, #4529)
* Scripting: Added Tileset.selectedTilesChanged signal (#4615)
* Fixed crash when the selection becomes empty while starting a move (#4536)
* Fixed Properties view update on 'Reset Template Instance' and 'Replace With Template' actions
* Fixed restoring of the layout for maximized windows on startup (#4580)
Expand Down
7 changes: 7 additions & 0 deletions docs/scripting-doc/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4288,6 +4288,13 @@ declare class Tileset extends Asset {
*/
selectedTiles: Tile[];

/**
* The signal emitted when {@link selectedTiles} changes.
*
* @since 1.13
*/
readonly selectedTilesChanged: Signal<void>;

/**
* Constructs a new Tileset.
*/
Expand Down
6 changes: 3 additions & 3 deletions src/tiled/editableobject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ void EditableObject::setPropertyImpl(const QString &name, const QVariant &value)
{
if (Document *doc = document())
asset()->push(new SetProperty(doc, { mObject }, name, propertyValueFromScript(value)));
else
else if (!checkReadOnly())
mObject->setProperty(name, propertyValueFromScript(value));
}

Expand All @@ -67,15 +67,15 @@ void EditableObject::setPropertyImpl(const QStringList &path, const QVariant &va
if (Document *doc = document())
// todo: add support for array indices in path
asset()->push(new SetProperty(doc, { mObject }, toPropertyPath(path), propertyValueFromScript(value)));
else
else if (!checkReadOnly())
mObject->setProperty(toPropertyPath(path), propertyValueFromScript(value));
}

void EditableObject::setProperties(const QVariantMap &properties)
{
if (Document *doc = document())
asset()->push(new ChangeProperties(doc, QString(), mObject, propertyValueFromScript(properties)));
else
else if (!checkReadOnly())
mObject->setProperties(propertyValueFromScript(properties));
}

Expand Down
1 change: 1 addition & 0 deletions src/tiled/editabletileset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -422,6 +422,7 @@ void EditableTileset::setDocument(Document *document)
connect(doc, &TilesetDocument::tilesAdded, this, &EditableTileset::attachTiles);
connect(doc, &TilesetDocument::tilesRemoved, this, &EditableTileset::detachTiles);
connect(doc, &TilesetDocument::tileObjectGroupChanged, this, &EditableTileset::tileObjectGroupChanged);
connect(doc, &TilesetDocument::selectedTilesChanged, this, &EditableTileset::selectedTilesChanged);
connect(doc->wangSetModel(), &TilesetWangSetModel::wangSetAdded, this, &EditableTileset::wangSetAdded);
connect(doc->wangSetModel(), &TilesetWangSetModel::wangSetRemoved, this, &EditableTileset::wangSetRemoved);
}
Expand Down
5 changes: 4 additions & 1 deletion src/tiled/editabletileset.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ class EditableTileset final : public EditableAsset
Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor)
Q_PROPERTY(bool collection READ isCollection) // deprecated
Q_PROPERTY(bool isCollection READ isCollection)
Q_PROPERTY(QList<QObject*> selectedTiles READ selectedTiles WRITE setSelectedTiles)
Q_PROPERTY(QList<QObject*> selectedTiles READ selectedTiles WRITE setSelectedTiles NOTIFY selectedTilesChanged)
Q_PROPERTY(Tileset::TransformationFlags transformationFlags READ transformationFlags WRITE setTransformationFlags)

public:
Expand Down Expand Up @@ -188,6 +188,9 @@ public slots:
void setBackgroundColor(const QColor &color);
void setTransformationFlags(Tileset::TransformationFlags flags);

signals:
void selectedTilesChanged();

protected:
void setDocument(Document *document) override;

Expand Down
12 changes: 10 additions & 2 deletions src/tiled/tileseteditor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -562,6 +562,10 @@ void TilesetEditor::selectionChanged()

updateActions();

// The view is being updated to match the document
if (mSynchronizingSelection)
return;

const QItemSelectionModel *s = view->selectionModel();
const QModelIndexList indexes = s->selection().indexes();
if (indexes.isEmpty())
Expand All @@ -574,7 +578,7 @@ void TilesetEditor::selectionChanged()
if (Tile *tile = model->tileAt(index))
selectedTiles.append(tile);

QScopedValueRollback<bool> settingSelectedTiles(mSettingSelectedTiles, true);
QScopedValueRollback<bool> synchronizingSelection(mSynchronizingSelection, true);
mCurrentTilesetDocument->setSelectedTiles(selectedTiles);
}

Expand Down Expand Up @@ -655,7 +659,8 @@ void TilesetEditor::tilesetChanged()

void TilesetEditor::selectedTilesChanged()
{
if (mSettingSelectedTiles)
// The document is being updated to match the view
if (mSynchronizingSelection)
return;

if (mCurrentTilesetDocument != sender())
Expand All @@ -671,6 +676,9 @@ void TilesetEditor::selectedTilesChanged()
tileSelection.select(modelIndex, modelIndex);
}

// Avoid setting the selection on the document again from selectionChanged
QScopedValueRollback<bool> synchronizingSelection(mSynchronizingSelection, true);

QItemSelectionModel *selectionModel = tilesetView->selectionModel();
selectionModel->select(tileSelection, QItemSelectionModel::SelectCurrent);
if (!tileSelection.isEmpty()) {
Expand Down
2 changes: 1 addition & 1 deletion src/tiled/tileseteditor.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ class TilesetEditor final : public Editor
TilesetDocument *mCurrentTilesetDocument = nullptr;

Tile *mCurrentTile = nullptr;
bool mSettingSelectedTiles = false;
bool mSynchronizingSelection = false;
};

inline QAction *TilesetEditor::addTilesAction() const
Expand Down
Loading