From 617abf7afedbc910a3549138b15ae885e5782dd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Poizl?= Date: Fri, 28 Feb 2025 10:42:39 +0100 Subject: [PATCH] Better handling of FITS loading error --- imageringlist.cpp | 11 ++++++++++- imageringlist.h | 1 + imagescrollarea.cpp | 2 +- loadimage.cpp | 38 +++++++++++++++++++++++--------------- 4 files changed, 35 insertions(+), 17 deletions(-) diff --git a/imageringlist.cpp b/imageringlist.cpp index e36b193..8d4794e 100644 --- a/imageringlist.cpp +++ b/imageringlist.cpp @@ -85,6 +85,11 @@ void Image::clearThumbnail() m_thumbnail.reset(); } +bool Image::isLoading() const +{ + return m_loading; +} + void Image::imageLoaded(std::shared_ptr rawImage, ImageInfoData info) { m_loading = false; @@ -200,7 +205,7 @@ void ImageRingList::increment() if(m_images.size()) { //don't increment if current image was not loaded yet - if(!(*m_currImage)->rawImage()) + if((*m_currImage)->isLoading()) return; (*m_firstImage)->release(); @@ -216,6 +221,10 @@ void ImageRingList::decrement() { if(m_images.size()) { + //don't decrement if current image was not loaded yet + if((*m_currImage)->isLoading()) + return; + (*m_lastImage)->release(); m_firstImage = decrement(m_firstImage); m_currImage = decrement(m_currImage); diff --git a/imageringlist.h b/imageringlist.h index 229ce6e..d75efa5 100644 --- a/imageringlist.h +++ b/imageringlist.h @@ -38,6 +38,7 @@ public: bool isCurrent() const; int number() const; void clearThumbnail(); + bool isLoading() const; signals: void pixmapLoaded(Image *ptr); void thumbnailLoaded(Image *ptr); diff --git a/imagescrollarea.cpp b/imagescrollarea.cpp index 260a416..b4c41c1 100644 --- a/imagescrollarea.cpp +++ b/imagescrollarea.cpp @@ -110,7 +110,7 @@ void ImageScrollArea::oneToOne() void ImageScrollArea::imageLoaded(Image *image) { - if(image && image->rawImage()) + if(image) { m_imageWidget->setImage(image->rawImage(), image->number()); m_imageWidget->setWCS(image->info().wcs); diff --git a/loadimage.cpp b/loadimage.cpp index 14e5b9c..1bc71aa 100644 --- a/loadimage.cpp +++ b/loadimage.cpp @@ -86,19 +86,31 @@ bool loadFITS(const QString path, ImageInfoData &info, std::shared_ptr fitsfile *file; int status = 0; int type = -1; - fits_open_diskfile(&file, path.toLocal8Bit().data(), READONLY, &status); int num = 0; + long naxes[3] = {0}; + + auto checkError = [&info, &status]() + { + char err[100]; + fits_get_errstatus(status, err); + info.info.append({QObject::tr("Error"), QString(err)}); + qDebug() << "Failed to load FITS file" << err; + return false; + }; + + fits_open_diskfile(&file, path.toLocal8Bit().data(), READONLY, &status); + if(status)return checkError(); fits_get_num_hdus(file, &num, &status); + if(status)return checkError(); int imgtype; int naxis; - long naxes[3] = {0}; for(int i=1; i <= num; i++) { - fits_movabs_hdu(file, i, IMAGE_HDU, &status); - fits_get_hdu_type(file, &type, &status); - fits_get_img_param(file, 3, &imgtype, &naxis, naxes, &status); - fits_get_img_equivtype(file, &imgtype, &status); + fits_movabs_hdu(file, i, IMAGE_HDU, &status);if(status)return checkError(); + fits_get_hdu_type(file, &type, &status);if(status)return checkError(); + fits_get_img_param(file, 3, &imgtype, &naxis, naxes, &status);if(status)return checkError(); + fits_get_img_equivtype(file, &imgtype, &status);if(status)return checkError(); if(type == IMAGE_HDU && naxis >= 2 && naxis <= 3 && status == 0) { @@ -150,6 +162,7 @@ bool loadFITS(const QString path, ImageInfoData &info, std::shared_ptr { fpixel[2] = i; fits_read_pix(file, fitstype, fpixel, size, NULL, data + img.size() * RawImage::typeSize(type) * (i-1), NULL, &status); + if(status)return checkError(); } if(fitstype == TSHORT) { @@ -169,7 +182,10 @@ bool loadFITS(const QString path, ImageInfoData &info, std::shared_ptr } noload: if(file) - loadFITSHeader(file, info); + { + status = loadFITSHeader(file, info); + if(status)return checkError(); + } if(image) { @@ -181,14 +197,6 @@ noload: } fits_close_file(file, &status); - if(status) - { - char err[100]; - fits_get_errstatus(status, err); - info.info.append({QObject::tr("Error"), QString(err)}); - qDebug() << "Failed to load FITS file" << err; - } - return true; }