/*
Copyright 2006-2026 The QElectroTech Team
This file is part of QElectroTech.
QElectroTech is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
QElectroTech is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with QElectroTech. If not, see .
*/
#include "imagedrop.h"
#include
#include
#include
#include
#include
#include
namespace
{
bool isImageFile(const QUrl &url)
{
if (!url.isLocalFile())
return false;
const QString suffix = QFileInfo(url.toLocalFile()).suffix().toLower();
return ImageDrop::supportedSuffixes().contains(suffix);
}
QString tr(const char *text)
{
return QCoreApplication::translate("ImageDrop", text);
}
}
QStringList ImageDrop::supportedSuffixes()
{
return {QStringLiteral("png"), QStringLiteral("jpg"), QStringLiteral("jpeg"),
QStringLiteral("bmp"), QStringLiteral("svg")};
}
QStringList ImageDrop::imageFiles(const QMimeData *mime)
{
QStringList files;
if (!mime || !mime->hasUrls())
return files;
for (const QUrl &url : mime->urls())
if (isImageFile(url))
files << url.toLocalFile();
return files;
}
bool ImageDrop::hasOnlyOtherUrls(const QMimeData *mime)
{
return mime && mime->hasUrls() && imageFiles(mime).isEmpty();
}
QImage ImageDrop::load(const QString &path, QString *error)
{
auto fail = [error](const QString &message) {
if (error)
*error = message;
return QImage();
};
const QFileInfo info(path);
if (!info.isFile())
return fail(tr("not a file"));
if (info.size() > maxFileBytes)
return fail(tr("the file is larger than 10 MB"));
QImageReader reader(path);
const QSize size = reader.size();
if (size.isValid() && qint64(size.width()) * size.height() > maxPixels)
return fail(tr("the image has too many pixels"));
const QImage image = reader.read();
if (image.isNull())
return fail(tr("unable to read the image"));
return image;
}
qreal ImageDrop::fitScale(const QSizeF &size, const QSizeF &available)
{
if (size.isEmpty() || available.isEmpty())
return 1.0;
const qreal scale = std::min(available.width() * fitMargin / size.width(),
available.height() * fitMargin / size.height());
return std::min(1.0, scale);
}
QPointF ImageDrop::cascadeOffset(int index)
{
return QPointF(cascadeStep * index, cascadeStep * index);
}