summaryrefslogtreecommitdiffstats
path: root/demos/qt3d/photobrowser3d/imagemanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'demos/qt3d/photobrowser3d/imagemanager.cpp')
-rw-r--r--demos/qt3d/photobrowser3d/imagemanager.cpp134
1 files changed, 134 insertions, 0 deletions
diff --git a/demos/qt3d/photobrowser3d/imagemanager.cpp b/demos/qt3d/photobrowser3d/imagemanager.cpp
new file mode 100644
index 000000000..30e2148d4
--- /dev/null
+++ b/demos/qt3d/photobrowser3d/imagemanager.cpp
@@ -0,0 +1,134 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtQuick3D module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include "imagemanager.h"
+#include "qatlas.h"
+#include "filescanner.h"
+#include "threadpool.h"
+
+#include <QTime>
+#include <QTimer>
+#include <QDir>
+
+ImageManager::ImageManager()
+{
+}
+
+ImageManager::~ImageManager()
+{
+}
+
+// INVARIANT: only ever called before the run() function is started
+// therefore no need for synchronized url
+void ImageManager::setImageBaseUrl(const QUrl &url)
+{
+ Q_ASSERT(!isRunning());
+ m_url = url;
+}
+
+/*!
+ Stop the running threads if any, then sit waiting in the event loop
+ for a quit call.
+*/
+void ImageManager::stop()
+{
+ emit stopAll();
+}
+
+void ImageManager::scanForFiles()
+{
+ // TODO: In a real app there would be a way to detect new files arriving
+ // and trigger a rescan to pick these new files up. Here we just scan
+ // once and then destroy the scanner, to save on resources.
+
+#ifndef QT_USE_TEST_IMAGES
+ // TODO: If the amount of files is large and the app is quit early the
+ // scanner could still be going when the threadpool quits. For now
+ // assume its ok...
+ FileScanner *scanner = new FileScanner;
+ scanner->setBaseUrl(m_url);
+ connect(scanner, SIGNAL(imageUrl(QUrl)), this, SIGNAL(imageUrl(QUrl)));
+ connect(scanner, SIGNAL(finished()), scanner, SLOT(deleteLater()));
+ connect(this, SIGNAL(stopAll()), scanner, SLOT(stop()));
+ scanner->start();
+#else
+ QDir testImages(":/pictures");
+ QStringList pics = testImages.entryList();
+ for (int i = 0; i < pics.size(); ++i)
+ {
+ QUrl url;
+ url.setScheme("file");
+ url.setPath(testImages.filePath(pics.at(i)));
+ emit imageUrl(url);
+ }
+ qDebug() << "== test images loaded ==";
+#endif
+}
+
+void ImageManager::quit()
+{
+ QThread::quit();
+}
+
+void ImageManager::run()
+{
+ if (m_url.scheme() != "file")
+ {
+ qWarning("URL scheme %s not yet supported", qPrintable(m_url.scheme()));
+ return;
+ }
+
+ // execute once in the event loop below
+ QTimer::singleShot(0, this, SLOT(scanForFiles()));
+
+#ifndef QT_NO_THREADED_FILE_LOAD
+ ThreadPool pool;
+
+ connect(this, SIGNAL(deployLoader(ThumbnailableImage)),
+ &pool, SLOT(deployLoader(ThumbnailableImage)));
+
+ connect(this, SIGNAL(stopAll()), &pool, SLOT(stop()));
+ connect(&pool, SIGNAL(stopped()), this, SLOT(quit()));
+#endif
+
+ exec();
+}