diff options
Diffstat (limited to 'src/Viewer/Qt3DViewer/viewer.cpp')
-rw-r--r-- | src/Viewer/Qt3DViewer/viewer.cpp | 401 |
1 files changed, 0 insertions, 401 deletions
diff --git a/src/Viewer/Qt3DViewer/viewer.cpp b/src/Viewer/Qt3DViewer/viewer.cpp deleted file mode 100644 index 4d6bcea3..00000000 --- a/src/Viewer/Qt3DViewer/viewer.cpp +++ /dev/null @@ -1,401 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 or (at your option) any later version -** approved by the KDE Free Qt Foundation. The licenses are as published by -** the Free Software Foundation and appearing in the file LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtCore/qdebug.h> -#include <QtCore/qsettings.h> -#include <QtCore/qfileinfo.h> -#include <QtStudio3D/private/q3dsviewersettings_p.h> -#include <QtStudio3D/private/q3dspresentation_p.h> -#include <QtGui/qguiapplication.h> -#include <QtGui/qscreen.h> -#include <QtQuick/qquickwindow.h> - -#include "viewer.h" -#include "q3dspresentationitem.h" - -Viewer::Viewer(bool generatorMode, QObject *parent) - : QObject(parent) - , m_generatorMode(generatorMode) -{ - if (m_generatorMode) - setContentView(SequenceView); - - m_connectTextResetTimer.setInterval(5000); - m_connectTextResetTimer.setSingleShot(true); - connect(&m_connectTextResetTimer, &QTimer::timeout, this, &Viewer::resetConnectionInfoText); -} - -Viewer::~Viewer() -{ -} - -void Viewer::connectRemote() -{ - if (m_remoteDeploymentReceiver) { - delete m_remoteDeploymentReceiver; - m_remoteDeploymentReceiver = 0; - Q_EMIT connectedChanged(); - } - - m_remoteDeploymentReceiver = new RemoteDeploymentReceiver(m_connectPort, this); - QString error = m_remoteDeploymentReceiver->startServer(); - if (!error.isEmpty()) { - delete m_remoteDeploymentReceiver; - m_remoteDeploymentReceiver = nullptr; - setContentView(DefaultView); - m_qmlRootObject->setProperty("error", QVariant(error)); - return; - } - - resetConnectionInfoText(); - - connect(m_remoteDeploymentReceiver, &RemoteDeploymentReceiver::remoteConnected, - this, &Viewer::remoteConnected); - - connect(m_remoteDeploymentReceiver, &RemoteDeploymentReceiver::remoteDisconnected, - this, &Viewer::remoteDisconnected); - - connect(m_remoteDeploymentReceiver, &RemoteDeploymentReceiver::projectChanging, - this, &Viewer::remoteProjectChanging); - - connect(m_remoteDeploymentReceiver, &RemoteDeploymentReceiver::projectChanged, - this, &Viewer::loadRemoteDeploymentReceiver); - - Q_EMIT connectedChanged(); -} - -void Viewer::disconnectRemote() -{ - m_remoteDeploymentReceiver->disconnectRemote(); -} - -// Used to load files via command line and when using remote deployment -void Viewer::loadFile(const QString &filename) -{ - QString targetFilename = filename; - // Try to find the application (*.uia) file for loading instead of the presentation (*.uip) - // in case we are connected to remote sender. - if (isConnected() && targetFilename.endsWith(QStringLiteral(".uip"))) { - targetFilename.chop(4); - targetFilename.append(QStringLiteral(".uia")); - QFileInfo targetfileInfo(targetFilename); - // uia not found, revert to given uip - if (!targetfileInfo.exists()) - targetFilename = filename; - } - - QFileInfo fileInfo(targetFilename); - if (!fileInfo.exists()) { - setContentView(DefaultView); - m_qmlRootObject->setProperty( - "error", QVariant(tr("Tried to load nonexistent file %1").arg(targetFilename))); - return; - } - - QUrl sourceUrl = QUrl::fromLocalFile(fileInfo.absoluteFilePath()); - - setContentView(StudioView); - - if (qmlStudio()) - qmlStudio()->presentation()->setSource(sourceUrl); -} - -QString Viewer::convertUrlListToFilename(const QList<QUrl> &list) -{ - for (const QUrl &url : list) { - QString str = url.toLocalFile(); - if (!str.isEmpty()) { - if (QFileInfo(str).suffix() == QStringLiteral("uip") - || QFileInfo(str).suffix() == QStringLiteral("uia")) { - return str; - } - } - } - return QString(); -} - -void Viewer::restoreWindowState(QWindow *window) -{ - QSettings settings; - QRect geo = settings.value(QStringLiteral("WindowGeometry"), QRect()).toRect(); - int visibility = settings.value(QStringLiteral("WindowVisibility"), - QWindow::Windowed).toInt(); - - // Do not restore geometry if resulting geometry means the center of the window - // would be offscreen on the virtual desktop - QRect vgeo = window->screen()->availableVirtualGeometry(); - QPoint center(geo.x() + geo.width() / 2, geo.y() + geo.height() / 2); - bool offscreen = center.x() > vgeo.width() || center.x() < 0 - || center.y() > vgeo.height() || center.y() < 0; - - if (!offscreen && !geo.isNull()) { - // The first geometry set at startup may adjust the geometry according to pixel - // ratio if mouse cursor is on different screen than where window goes and the - // two screens have different pixel ratios. Setting geometry twice seems to - // work around this. - geo.adjust(0, 0, -1, 0); - window->setGeometry(geo); - geo.adjust(0, 0, 1, 0); - window->setGeometry(geo); - } - - window->setVisibility(QWindow::Visibility(visibility)); -} - -void Viewer::storeWindowState(QWindow *window) -{ - QSettings settings; - settings.setValue(QStringLiteral("WindowGeometry"), window->geometry()); - settings.setValue(QStringLiteral("WindowState"), window->visibility()); -} - -// Since we need mouse events for handling the swipe gesture in viewer, we need to generate -// a fake event for the presentation. -void Viewer::handleMousePress(int x, int y, int button, int buttons, int modifiers) -{ - if (qmlStudio()) { - QMouseEvent fakeEvent(QEvent::MouseButtonPress, - QPointF(x, y) * qmlStudio()->window()->devicePixelRatio(), - Qt::MouseButton(button), - Qt::MouseButtons(buttons), - Qt::KeyboardModifiers(modifiers)); - qmlStudio()->presentation()->mousePressEvent(&fakeEvent); - } -} - -void Viewer::handleMouseRelease(int x, int y, int button, int buttons, int modifiers) -{ - if (qmlStudio()) { - QMouseEvent fakeEvent(QEvent::MouseButtonRelease, - QPointF(x, y) * qmlStudio()->window()->devicePixelRatio(), - Qt::MouseButton(button), - Qt::MouseButtons(buttons), - Qt::KeyboardModifiers(modifiers)); - qmlStudio()->presentation()->mouseReleaseEvent(&fakeEvent); - } -} - -void Viewer::handleMouseMove(int x, int y, int button, int buttons, int modifiers) -{ - if (qmlStudio()) { - QMouseEvent fakeEvent(QEvent::MouseMove, - QPointF(x, y) * qmlStudio()->window()->devicePixelRatio(), - Qt::MouseButton(button), - Qt::MouseButtons(buttons), - Qt::KeyboardModifiers(modifiers)); - qmlStudio()->presentation()->mouseMoveEvent(&fakeEvent); - } -} - -void Viewer::setContentView(Viewer::ContentView view) -{ - if (view != m_contentView) { - m_qmlStudio = nullptr; - m_contentView = view; - Q_EMIT contentViewChanged(); - } -} - -Viewer::ContentView Viewer::contentView() const -{ - return m_contentView; -} - -void Viewer::setOpenFolder(const QUrl &folder) -{ - QString localFolder = folder.toLocalFile(); - QFileInfo fi(localFolder); - QString newDir; - if (fi.isDir()) - newDir = fi.absoluteFilePath(); - else - newDir = fi.absolutePath(); - if (newDir != m_openFileDir) { - m_openFileDir = newDir; - QSettings settings; - settings.setValue(QStringLiteral("DirectoryOfLastOpen"), m_openFileDir); - Q_EMIT openFolderChanged(); - } -} - -QUrl Viewer::openFolder() -{ - if (m_openFileDir.size() == 0) { - QSettings settings; - m_openFileDir = settings.value(QStringLiteral("DirectoryOfLastOpen"), - QString("")).toString(); -#ifdef Q_OS_ANDROID - if (m_openFileDir.isEmpty()) - m_openFileDir = QStringLiteral("/sdcard/qt3dviewer"); // Add default folder for Android -#endif - } - return QUrl::fromLocalFile(m_openFileDir); -} - -void Viewer::setConnectPort(int port) -{ - if (m_connectPort != port) { - QSettings settings; - m_connectPort = port; - settings.setValue(QStringLiteral("ConnectPort"), m_connectPort); - Q_EMIT connectPortChanged(); - } -} - -int Viewer::connectPort() -{ - if (m_connectPort < 0) { - QSettings settings; - m_connectPort = settings.value(QStringLiteral("ConnectPort"), 36000).toInt(); - } - return m_connectPort; -} - -QString Viewer::connectText() const -{ - return m_connectText; -} - -bool Viewer::isConnected() const -{ - return m_remoteDeploymentReceiver ? m_remoteDeploymentReceiver->isConnected() : false; -} - -void Viewer::setQmlRootObject(QObject *obj) -{ - m_qmlRootObject = obj; -} - -void Viewer::loadRemoteDeploymentReceiver() -{ - Q_ASSERT(m_remoteDeploymentReceiver); - const QString remote = m_remoteDeploymentReceiver->fileName(); - QMetaObject::invokeMethod(this, "loadFile", Qt::QueuedConnection, Q_ARG(QString, remote)); -} - -void Viewer::remoteProjectChanging() -{ - if (m_contentView != ConnectView) - setContentView(ConnectView); - m_connectText = tr("Loading remote project..."); - Q_EMIT connectTextChanged(); -} - -void Viewer::remoteConnected() -{ - m_connectText = tr("Remote Connected"); - Q_EMIT connectTextChanged(); - Q_EMIT connectedChanged(); - if (m_contentView != ConnectView) - Q_EMIT showInfoOverlay(m_connectText); -} - -void Viewer::remoteDisconnected() -{ - m_connectText = tr("Remote Disconnected"); - Q_EMIT connectTextChanged(); - Q_EMIT connectedChanged(); - if (m_contentView != ConnectView) { - Q_EMIT showInfoOverlay(m_connectText); - } else { - // Start timer to reset connection info text - m_connectTextResetTimer.start(); - } -} - -void Viewer::resetConnectionInfoText() -{ - m_connectText.clear(); - QTextStream stream(&m_connectText); - stream << tr("Use IP: %1 and Port: %2\n" - "in Qt 3D Studio Editor to connect to this viewer.\n\n" - "Use File/Open... to open a local presentation.") - .arg(m_remoteDeploymentReceiver->hostAddress().toString()) - .arg(QString::number(m_connectPort)); - Q_EMIT connectTextChanged(); -} - -Q3DSView *Viewer::qmlStudio() -{ - if (m_contentView == StudioView) { - if (!m_qmlStudio) { - QObject *loadedContent = m_qmlRootObject->property("loadedContent").value<QObject *>(); - m_qmlStudio = static_cast<Q3DSView *>(loadedContent); - } - } else { - m_qmlStudio = nullptr; - } - return m_qmlStudio; -} - -void Viewer::generatorProgress(int totalFrames, int frameCount) -{ - QString progressString; - if (frameCount >= totalFrames) { - progressString = - QCoreApplication::translate( - "main", "Image sequence generation done! (%2 frames generated)") - .arg(totalFrames); - } else { - progressString = - QCoreApplication::translate("main", "Image sequence generation progress: %1 / %2") - .arg(frameCount).arg(totalFrames); - } - QObject *loadedContent = m_qmlRootObject->property("loadedContent").value<QObject *>(); - loadedContent->setProperty("mainText", progressString); -} - -void Viewer::generatorFinished(bool success, const QString &details) -{ - QObject *loadedContent = m_qmlRootObject->property("loadedContent").value<QObject *>(); - if (success) { - loadedContent->setProperty("detailsText", details); - } else { - QString mainString = - QCoreApplication::translate("main", "Image sequence generation failed:"); - loadedContent->setProperty("mainText", mainString); - loadedContent->setProperty("detailsText", details); - } -} - -void Viewer::updateProgress(int percent) -{ - // Don't wait for 100%, as it'll already start loading and text isn't updated anymore - if (percent >= 99) - m_connectText = tr("Loading remote project..."); - else - m_connectText = QStringLiteral("Receiving (%1%)").arg(percent); - Q_EMIT connectTextChanged(); -} - -void Viewer::setGeneratorDetails(const QString &filename) -{ - QObject *loadedContent = m_qmlRootObject->property("loadedContent").value<QObject *>(); - loadedContent->setProperty("detailsText", filename); -} |