1 /* 2 * tilesetdock.h 3 * Copyright 2008-2010, Thorbjørn Lindeijer <thorbjorn@lindeijer.nl> 4 * Copyright 2009, Edward Hutchins <eah1@yahoo.com> 5 * Copyright 2012, Stefan Beller <stefanbeller@googlemail.com> 6 * 7 * This file is part of Tiled. 8 * 9 * This program is free software; you can redistribute it and/or modify it 10 * under the terms of the GNU General Public License as published by the Free 11 * Software Foundation; either version 2 of the License, or (at your option) 12 * any later version. 13 * 14 * This program is distributed in the hope that it will be useful, but WITHOUT 15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 16 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 17 * more details. 18 * 19 * You should have received a copy of the GNU General Public License along with 20 * this program. If not, see <http://www.gnu.org/licenses/>. 21 */ 22 23 #pragma once 24 25 #include "tileset.h" 26 27 #include <QAbstractItemModel> 28 #include <QDockWidget> 29 #include <QList> 30 #include <QMap> 31 32 #include <memory> 33 34 class QAction; 35 class QActionGroup; 36 class QComboBox; 37 class QMenu; 38 class QModelIndex; 39 class QStackedWidget; 40 class QTabBar; 41 class QToolBar; 42 class QToolButton; 43 44 namespace Tiled { 45 46 class Tile; 47 class TileLayer; 48 class Tileset; 49 50 class Document; 51 class EditableTileset; 52 class MapDocument; 53 class TileStamp; 54 class TilesetDocument; 55 class TilesetDocumentsFilterModel; 56 class TilesetView; 57 class Zoomable; 58 59 /** 60 * The dock widget that displays the tilesets. Also keeps track of the 61 * currently selected tile. 62 */ 63 class TilesetDock : public QDockWidget 64 { 65 Q_OBJECT 66 67 Q_PROPERTY(Tiled::EditableTileset *currentTileset READ currentEditableTileset WRITE setCurrentEditableTileset) 68 Q_PROPERTY(QList<QObject*> selectedTiles READ selectedTiles WRITE setSelectedTiles) 69 70 public: 71 TilesetDock(QWidget *parent = nullptr); 72 73 ~TilesetDock() override; 74 75 /** 76 * Sets the map for which the tilesets should be displayed. 77 */ 78 void setMapDocument(MapDocument *mapDocument); 79 80 /** 81 * Returns the currently selected tile. 82 */ currentTile()83 Tile *currentTile() const { return mCurrentTile; } 84 85 void setCurrentTileset(const SharedTileset &tileset); 86 SharedTileset currentTileset() const; 87 TilesetDocument *currentTilesetDocument() const; 88 89 void setCurrentEditableTileset(EditableTileset *tileset); 90 EditableTileset *currentEditableTileset() const; 91 92 void setSelectedTiles(const QList<QObject*> &tiles); 93 QList<QObject*> selectedTiles() const; 94 95 void selectTilesInStamp(const TileStamp &); 96 actionSelectNextTileset()97 QAction *actionSelectNextTileset() const { return mSelectNextTileset; } actionSelectPreviousTileset()98 QAction *actionSelectPreviousTileset() const { return mSelectPreviousTileset; } 99 100 signals: 101 /** 102 * Emitted when the current tile changed. 103 */ 104 void currentTileChanged(Tile *tile); 105 106 /** 107 * Emitted when the currently selected tiles changed. 108 */ 109 void stampCaptured(const TileStamp &); 110 111 /** 112 * Emitted when files are dropped at the tileset dock. 113 */ 114 // todo: change to QList<QUrl> 115 void localFilesDropped(const QStringList &paths); 116 117 protected: 118 void changeEvent(QEvent *e) override; 119 120 void dragEnterEvent(QDragEnterEvent *) override; 121 void dropEvent(QDropEvent *) override; 122 123 private: 124 void currentTilesetChanged(); 125 void selectionChanged(); 126 void currentChanged(const QModelIndex &index); 127 128 void updateActions(); 129 void updateCurrentTiles(); 130 void indexPressed(const QModelIndex &index); 131 132 void tilesetChanged(Tileset *tileset); 133 void tilesetFileNameChanged(const QString &fileName); 134 135 void replaceTileset(); 136 void replaceTilesetAt(int index); 137 void removeTileset(); 138 void removeTilesetAt(int index); 139 140 void newTileset(); 141 void editTileset(); 142 void embedTileset(); 143 void exportTileset(); 144 145 void refreshTilesetMenu(); 146 147 void swapTiles(Tile *tileA, Tile *tileB); 148 149 void selectTiles(const QList<Tile *> &tiles); 150 void setCurrentTile(Tile *tile); 151 void setCurrentTiles(std::unique_ptr<TileLayer> tiles); 152 153 void retranslateUi(); 154 155 void onTilesetRowsInserted(const QModelIndex &parent, int first, int last); 156 void onTilesetRowsAboutToBeRemoved(const QModelIndex &parent, int first, int last); 157 void onTilesetRowsMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row); 158 void onTilesetLayoutChanged(const QList<QPersistentModelIndex> &parents, QAbstractItemModel::LayoutChangeHint hint); 159 void onTilesetDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight); 160 161 void onTabMoved(int from, int to); 162 void tabContextMenuRequested(const QPoint &pos); 163 164 TilesetView *currentTilesetView() const; 165 TilesetView *tilesetViewAt(int index) const; 166 167 void createTilesetView(int index, TilesetDocument *tilesetDocument); 168 void deleteTilesetView(int index); 169 void moveTilesetView(int from, int to); 170 void setupTilesetModel(TilesetView *view, TilesetDocument *tilesetDocument); 171 172 MapDocument *mMapDocument = nullptr; 173 174 // Shared tileset references because the dock wants to add new tiles 175 QVector<SharedTileset> mTilesets; 176 QList<TilesetDocument *> mTilesetDocuments; 177 TilesetDocumentsFilterModel *mTilesetDocumentsFilterModel; 178 179 QTabBar *mTabBar; 180 QStackedWidget *mSuperViewStack; 181 QStackedWidget *mViewStack; 182 QToolBar *mToolBar; 183 Tile *mCurrentTile = nullptr; 184 std::unique_ptr<TileLayer> mCurrentTiles; 185 186 QAction *mNewTileset; 187 QAction *mEmbedTileset; 188 QAction *mExportTileset; 189 QAction *mEditTileset; 190 QAction *mReplaceTileset; 191 QAction *mRemoveTileset; 192 QAction *mSelectNextTileset; 193 QAction *mSelectPreviousTileset; 194 QAction *mDynamicWrappingToggle; 195 196 QToolButton *mTilesetMenuButton; 197 QMenu *mTilesetMenu; //opens on click of mTilesetMenu 198 QActionGroup *mTilesetActionGroup; 199 200 QComboBox *mZoomComboBox; 201 202 bool mEmittingStampCaptured = false; 203 bool mSynchronizingSelection = false; 204 }; 205 206 } // namespace Tiled 207