Commit 17cdf125d83978445407004964e1ec45eebeba27

  • Tree SHA1: 8028e4d
  • Parent SHA1: ef6f71d (Fixed a bunch of build issues with the Windows version of tiled, where the main tiled.dll was put inside libs/ instead of ./ with tiled.exe (resulting in runtime link failures). Now the win32 build emits the dll to the same folder as the exe, and order has once again been restored.)
  • raw diff | raw patch
Added a manual reload option for tileset images, with context menu action and F5-key hook (works when tileset view is focused). Added a context menu to the tab bar, which is partially written. More work is needed, however. It does not yet have actions for removing/renaming tilesets, and it does not remember where to start the file dialog for import browsing (shoddy code duplication from mainwindow.cpp for now -- needs reworking).
  
3737#include <QStackedWidget>
3838#include <QTabBar>
3939#include <QVBoxLayout>
40#include <QMenu>
4041
42#include "newtilesetdialog.h"
43#include "tmxmapreader.h"
44#include <QFileDialog>
45
4146using namespace Tiled;
4247using namespace Tiled::Internal;
4348
6464
6565 mTabBar->setTabsClosable(true);
6666 mTabBar->setMovable(true);
67 mTabBar->setContextMenuPolicy(Qt::CustomContextMenu);
6768
6869 connect(mTabBar, SIGNAL(currentChanged(int)),
6970 mViewStack, SLOT(setCurrentIndex(int)));
7272 this, SLOT(removeTileset(int)));
7373 connect(mTabBar, SIGNAL(tabMoved(int,int)),
7474 this, SLOT(moveTileset(int,int)));
75 connect(mTabBar, SIGNAL(customContextMenuRequested(const QPoint&)),
76 this, SLOT(tabContext(const QPoint&)));
7577
7678 connect(TilesetManager::instance(), SIGNAL(tilesetChanged(Tileset*)),
7779 this, SLOT(tilesetChanged(Tileset*)));
133133 TilesetView *view = new TilesetView(mMapDocument);
134134 view->setModel(new TilesetModel(tileset, view));
135135
136 connect(view, SIGNAL(reloadRequested(QString)),
137 TilesetManager::instance(),
138 SLOT(reloadRequested(QString)));
139
136140 connect(view->selectionModel(),
137141 SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
138142 SLOT(selectionChanged()));
286286 QUndoCommand *command = new MoveTileset(mMapDocument, from, to);
287287 mMapDocument->undoStack()->push(command);
288288}
289
290// TODO: remove duplication, and probably move into a specialization of MapDocumentHandler relating to tilesets.
291void TilesetDock::tabContext(const QPoint &point)
292{
293 if (point.isNull())
294 return;
295
296 int index = mTabBar->tabAt(point);
297
298 QMenu menu(mTabBar);
299
300 QAction *actionNewTileset = menu.addAction(tr("New Tileset..."));
301 actionNewTileset->setIcon(QIcon(QLatin1String(":/images/16x16/document-new.png")));
302 QAction *actionAddExternalTileset = menu.addAction(tr("Add External Tileset..."));
303
304 connect(actionNewTileset, SIGNAL(triggered()), this, SLOT(newTileset()));
305 connect(actionAddExternalTileset, SIGNAL(triggered()), this, SLOT(addExternalTileset()));
306
307 if (index == -1) {
308 menu.exec(mTabBar->mapToGlobal(point));
309 } else {
310 menu.addSeparator();
311 mTabBar->setCurrentIndex(index);
312 tilesetViewAt(index)->contextMenu(menu, mTabBar->mapToGlobal(point), true);
313 }
314}
315
316void TilesetDock::newTileset()
317{
318 if (!mMapDocument)
319 return;
320
321 Map *map = mMapDocument->map();
322
323 //NewTilesetDialog newTileset(fileDialogStartLocation(), this);
324 NewTilesetDialog newTileset(QString(), this);
325 newTileset.setTileWidth(map->tileWidth());
326 newTileset.setTileHeight(map->tileHeight());
327
328 if (Tileset *tileset = newTileset.createTileset())
329 mMapDocument->undoStack()->push(new AddTileset(mMapDocument, tileset));
330}
331
332void TilesetDock::addExternalTileset()
333{
334 if (!mMapDocument)
335 return;
336
337 //const QString start = fileDialogStartLocation();
338 const QString start;
339 const QString fileName =
340 QFileDialog::getOpenFileName(this, tr("Add External Tileset"),
341 start,
342 tr("Tiled tileset files (*.tsx)"));
343 if (fileName.isEmpty())
344 return;
345
346 TmxMapReader reader;
347 if (Tileset *tileset = reader.readTileset(fileName)) {
348 mMapDocument->undoStack()->push(new AddTileset(mMapDocument, tileset));
349 } else {
350 QMessageBox::critical(this, tr("Error Reading Tileset"),
351 reader.errorString());
352 }
353}
354
289355
290356void TilesetDock::setCurrentTiles(TileLayer *tiles)
291357{
  
7777 void removeTileset(int index);
7878 void moveTileset(int from, int to);
7979
80 void tabContext(const QPoint &point);
81 void newTileset();
82 void addExternalTileset();
8083private:
8184 void setCurrentTiles(TileLayer *tiles);
8285 void retranslateUi();
  
2222#include "tilesetmanager.h"
2323
2424#include "tileset.h"
25
25#include <QString>
26#include <QMessageBox>
2627#include <QFileSystemWatcher>
2728
2829using namespace Tiled;
145145
146146void TilesetManager::fileChangedTimeout()
147147{
148 mChangedFilesTimer.stop();
148149 foreach (Tileset *tileset, tilesets()) {
149150 if (mChangedFiles.contains(tileset->imageSource())) {
150151 tileset->loadFromImage(tileset->imageSource());
154154 }
155155
156156 mChangedFiles.clear();
157}
158
159void TilesetManager::reloadRequested(const QString &path)
160{
161 /*
162 * Use a one-shot timer since GIMP (for example) seems to generate many
163 * file changes during a save, and some of the intermediate attempts to
164 * reload the tileset images actually fail (at least for .png files).
165 */
166 mChangedFiles.insert(path);
167 mChangedFilesTimer.start();
157168}
  
118118private slots:
119119 void fileChanged(const QString &path);
120120 void fileChangedTimeout();
121 void reloadRequested(const QString &path);
121122
122123private:
123124 Q_DISABLE_COPY(TilesetManager)
  
3939#include <QPainter>
4040#include <QUndoCommand>
4141#include <QWheelEvent>
42#include <QKeyEvent>
4243
4344using namespace Tiled;
4445using namespace Tiled::Internal;
214214 SLOT(editTileProperties()));
215215 }
216216
217 contextMenu(menu, event->globalPos(), false);
218}
219
220void TilesetView::contextMenu(QMenu& menu, const QPoint& position, bool fromTabBar)
221{
222 const TilesetModel *m = tilesetModel();
223 const bool isExternal = m->tileset()->isExternal();
224
217225 QIcon exportIcon(QLatin1String(":images/16x16/document-export.png"));
218226 QIcon importIcon(QLatin1String(":images/16x16/document-import.png"));
219227
238238 connect(exportTileset, SIGNAL(triggered()), SLOT(exportTileset()));
239239 connect(importTileset, SIGNAL(triggered()), SLOT(importTileset()));
240240
241 menu.exec(event->globalPos());
241 menu.addSeparator();
242
243 QAction *reloadAction = menu.addAction(tr("Reload"));
244 connect(reloadAction, SIGNAL(triggered()), SLOT(requestReload()));
245
246 menu.exec(position);
247}
248
249void TilesetView::keyPressEvent(QKeyEvent *event)
250{
251 if (event->key() == Qt::Key_F5) {
252 Tileset *tileset = tilesetModel()->tileset();
253 if (tileset) {
254 emit reloadRequested(tileset->imageSource());
255 return;
256 }
257 }
258
259 QTableView::keyPressEvent(event);
260}
261
262void TilesetView::requestReload()
263{
264 Tileset *tileset = tilesetModel()->tileset();
265 if (tileset) {
266 emit reloadRequested(tileset->imageSource());
267 }
242268}
243269
244270void TilesetView::editTileProperties()
  
5151 TilesetModel *tilesetModel() const
5252 { return static_cast<TilesetModel *>(model()); }
5353
54 void contextMenu(QMenu& menu, const QPoint& point, bool fromTabBar);
55
5456protected:
5557 void wheelEvent(QWheelEvent *event);
5658 void contextMenuEvent(QContextMenuEvent *event);
59 void keyPressEvent(QKeyEvent *event);
5760
61signals:
62 void reloadRequested(const QString &path);
63
5864private slots:
5965 void editTileProperties();
6066 void exportTileset();
6167 void importTileset();
68 void requestReload();
6269
6370 void adjustScale();
6471