1 /*
2 * editablemanager.h
3 * Copyright 2019, Thorbjørn Lindeijer <bjorn@lindeijer.nl>
4 *
5 * This file is part of Tiled.
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the Free
9 * Software Foundation; either version 2 of the License, or (at your option)
10 * any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * more details.
16 *
17 * You should have received a copy of the GNU General Public License along with
18 * this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 #pragma once
22
23 #include <QHash>
24 #include <QObject>
25
26 #include <memory>
27
28 namespace Tiled {
29
30 class Layer;
31 class MapObject;
32 class ObjectGroup;
33 class Tile;
34 class Tileset;
35 class WangSet;
36
37 class EditableAsset;
38 class EditableLayer;
39 class EditableMap;
40 class EditableMapObject;
41 class EditableObjectGroup;
42 class EditableTile;
43 class EditableTileset;
44 class EditableWangSet;
45
46 /**
47 * Manages editable wrappers that are used to expose properties to scripts.
48 */
49 class EditableManager : public QObject
50 {
51 Q_OBJECT
52
53 explicit EditableManager(QObject *parent = nullptr);
54
55 public:
56 static EditableManager &instance();
57 static void deleteInstance();
58
59 EditableLayer *find(Layer *layer) const;
60 EditableMapObject *find(MapObject *mapObject) const;
61 EditableTile *find(Tile *tile) const;
62 EditableWangSet *find(WangSet *wangSet) const;
63
64 void release(Layer *layer);
65 void release(MapObject *mapObject);
66 void release(std::unique_ptr<WangSet> wangSet);
67
68 EditableLayer *editableLayer(EditableMap *map, Layer *layer);
69 EditableObjectGroup *editableObjectGroup(EditableAsset *asset, ObjectGroup *objectGroup);
70 EditableMapObject *editableMapObject(EditableAsset *asset, MapObject *mapObject);
71 EditableTileset *editableTileset(Tileset *tileset);
72 EditableTile *editableTile(EditableTileset *tileset, Tile *tile);
73 EditableWangSet *editableWangSet(EditableTileset *tileset, WangSet *wangSet);
74
75 private:
76 friend class EditableLayer;
77 friend class EditableMapObject;
78 friend class EditableTileset;
79 friend class EditableTile;
80 friend class EditableWangSet;
81
82 QHash<Layer*, EditableLayer*> mEditableLayers;
83 QHash<MapObject*, EditableMapObject*> mEditableMapObjects;
84 QHash<Tileset*, EditableTileset*> mEditableTilesets;
85 QHash<Tile*, EditableTile*> mEditableTiles;
86 QHash<WangSet*, EditableWangSet*> mEditableWangSets;
87
88 static std::unique_ptr<EditableManager> mInstance;
89 };
90
91
find(Layer * layer)92 inline EditableLayer *EditableManager::find(Layer *layer) const
93 {
94 return mEditableLayers.value(layer);
95 }
96
find(MapObject * mapObject)97 inline EditableMapObject *EditableManager::find(MapObject *mapObject) const
98 {
99 return mEditableMapObjects.value(mapObject);
100 }
101
find(Tile * tile)102 inline EditableTile *EditableManager::find(Tile *tile) const
103 {
104 return mEditableTiles.value(tile);
105 }
106
find(WangSet * wangSet)107 inline EditableWangSet *EditableManager::find(WangSet *wangSet) const
108 {
109 return mEditableWangSets.value(wangSet);
110 }
111
112 } // namespace Tiled
113