diff options
Diffstat (limited to 'src/imports/qtcanvas3d/teximage3d.cpp')
-rw-r--r-- | src/imports/qtcanvas3d/teximage3d.cpp | 77 |
1 files changed, 46 insertions, 31 deletions
diff --git a/src/imports/qtcanvas3d/teximage3d.cpp b/src/imports/qtcanvas3d/teximage3d.cpp index f2e1fc8..315b395 100644 --- a/src/imports/qtcanvas3d/teximage3d.cpp +++ b/src/imports/qtcanvas3d/teximage3d.cpp @@ -122,7 +122,6 @@ void CanvasTextureImageFactory::notifyLoadedImages() if (image->imageState() == CanvasTextureImage::LOADING_FINISHED) { m_loadingImagesList.removeOne(image); image->emitImageLoaded(); - } else if (image->imageState() == CanvasTextureImage::LOADING_ERROR) { m_loadingImagesList.removeOne(image); image->emitImageLoadingError(); @@ -137,12 +136,14 @@ void CanvasTextureImageFactory::notifyLoadedImages() QJSValue CanvasTextureImageFactory::newTexImage() { CanvasTextureImage *newImg = new CanvasTextureImage(this, m_qmlEngine); - connect(newImg, &CanvasTextureImage::imageLoadingStarted, - this, &CanvasTextureImageFactory::handleImageLoadingStarted); - return m_qmlEngine->newQObject(newImg); } +void CanvasTextureImageFactory::handleImageDestroyed(CanvasTextureImage *image) +{ + m_loadingImagesList.removeOne(image); +} + /*! * \qmltype TextureImage * \since QtCanvas3D 1.0 @@ -155,9 +156,10 @@ QJSValue CanvasTextureImageFactory::newTexImage() * \sa TextureImageFactory */ CanvasTextureImage::CanvasTextureImage(CanvasTextureImageFactory *parent, QQmlEngine *engine) : - CanvasAbstractObject(0, parent), + CanvasAbstractObject(0, 0), m_engine(engine), - m_networkAccessManager(0), + m_networkAccessManager(m_engine->networkAccessManager()), + m_networkReply(0), m_state(INITIALIZED), m_errorString(""), m_pixelCache(0), @@ -165,36 +167,44 @@ CanvasTextureImage::CanvasTextureImage(CanvasTextureImageFactory *parent, QQmlEn m_pixelCacheFlipY(false), m_parentFactory(parent) { - m_networkAccessManager = new QNetworkAccessManager(this); - QObject::connect(m_networkAccessManager, &QNetworkAccessManager::finished, - this, &CanvasTextureImage::handleReply); } CanvasTextureImage::CanvasTextureImage(const QImage &source, int width, int height, - QObject *parent, + CanvasTextureImageFactory *parent, QQmlEngine *engine) : - CanvasAbstractObject(0, parent), + CanvasAbstractObject(0, 0), m_engine(engine), - m_networkAccessManager(0), + m_networkAccessManager(m_engine->networkAccessManager()), + m_networkReply(0), m_state(INITIALIZED), m_errorString(""), m_pixelCache(0), m_pixelCacheFormat(CanvasContext::NONE), - m_pixelCacheFlipY(false) + m_pixelCacheFlipY(false), + m_parentFactory(parent) { - m_networkAccessManager = new QNetworkAccessManager(this); - QObject::connect(m_networkAccessManager, &QNetworkAccessManager::finished, - this, &CanvasTextureImage::handleReply); - m_image = source.scaled(width, height); setImageState(LOADING_FINISHED); } +void CanvasTextureImage::cleanupNetworkReply() +{ + if (m_networkReply) { + QObject::disconnect(m_networkReply, &QNetworkReply::finished, + this, &CanvasTextureImage::handleReply); + m_networkReply->abort(); + m_networkReply->deleteLater(); + m_networkReply = 0; + } +} + CanvasTextureImage::~CanvasTextureImage() { - delete m_networkAccessManager; - delete m_pixelCache; + if (!m_parentFactory.isNull()) + m_parentFactory->handleImageDestroyed(this); + cleanupNetworkReply(); + delete[] m_pixelCache; } /*! @@ -250,10 +260,14 @@ void CanvasTextureImage::load() return; setImageState(LOADING); + if (!m_parentFactory.isNull()) + m_parentFactory->handleImageLoadingStarted(this); emit imageLoadingStarted(this); QNetworkRequest request(m_source); - m_networkAccessManager->get(request); + m_networkReply = m_networkAccessManager->get(request); + QObject::connect(m_networkReply, &QNetworkReply::finished, + this, &CanvasTextureImage::handleReply); } /*! @@ -265,18 +279,19 @@ QString CanvasTextureImage::errorString() const return m_errorString; } -void CanvasTextureImage::handleReply(QNetworkReply *reply) +void CanvasTextureImage::handleReply() { - if (reply->error() != QNetworkReply::NoError) { - m_errorString = reply->errorString(); - emit errorStringChanged(m_errorString); - setImageState(LOADING_ERROR); - return; + if (m_networkReply) { + if (m_networkReply->error() != QNetworkReply::NoError) { + m_errorString = m_networkReply->errorString(); + emit errorStringChanged(m_errorString); + setImageState(LOADING_ERROR); + } else { + m_image.loadFromData(m_networkReply->readAll()); + setImageState(LOADING_FINISHED); + } + cleanupNetworkReply(); } - - m_image.loadFromData(reply->readAll()); - - setImageState(LOADING_FINISHED); } QImage &CanvasTextureImage::getImage() @@ -347,7 +362,7 @@ uchar *CanvasTextureImage::convertToFormat(CanvasContext::glEnums format, return m_pixelCache; // Destroy the pixel cache - delete m_pixelCache; + delete[] m_pixelCache; m_pixelCache = 0; m_pixelCacheFormat = CanvasContext::NONE; |