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