File indexing completed on 2024-05-19 04:26:55

0001 /*
0002  *  SPDX-FileCopyrightText: 2017 Wolthera van Hövell tot Westerflier <griffinvalley@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: LGPL-2.0-or-later
0005  */
0006 #include "FileLayer.h"
0007 #include <kis_file_layer.h>
0008 #include <kis_image.h>
0009 #include <QFileInfo>
0010 #include <QDir>
0011 
0012 FileLayer::FileLayer(KisImageSP image, const QString name, const QString baseName, const QString fileName,
0013                      const QString scalingMethod, const QString scalingFilter, QObject *parent)
0014     : Node(image, new KisFileLayer(image, name, OPACITY_OPAQUE_U8), parent)
0015 {
0016     KisFileLayer *file = dynamic_cast<KisFileLayer*>(this->node().data());
0017     KIS_ASSERT(file);
0018     KisFileLayer::ScalingMethod sm = KisFileLayer::None;
0019     if (scalingMethod=="ToImageSize") {
0020         sm= KisFileLayer::ToImageSize;
0021     } else if (scalingMethod=="ToImagePPI") {
0022         sm= KisFileLayer::ToImagePPI;
0023     }
0024     file->setScalingMethod(sm);
0025     file->setScalingFilter(scalingFilter);
0026 
0027     const QString &basePath = QFileInfo(baseName).absolutePath();
0028     const QString &absoluteFilePath = QFileInfo(fileName).absoluteFilePath();
0029     file->setFileName(basePath, getFileNameFromAbsolute(basePath, absoluteFilePath));
0030 }
0031 
0032 FileLayer::FileLayer(KisFileLayerSP layer, QObject *parent)
0033     : Node(layer->image(), layer, parent)
0034 {
0035 
0036 }
0037 
0038 FileLayer::~FileLayer()
0039 {
0040 
0041 }
0042 
0043 QString FileLayer::type() const
0044 {
0045     return "filelayer";
0046 }
0047 
0048 void FileLayer::setProperties(QString fileName, QString scalingMethod, QString scalingFilter)
0049 {
0050     KisFileLayer *file = dynamic_cast<KisFileLayer*>(this->node().data());
0051     KIS_ASSERT(file);
0052     KisFileLayer::ScalingMethod sm = KisFileLayer::None;
0053     if (scalingMethod.toLower() == "toimagesize") {
0054         sm= KisFileLayer::ToImageSize;
0055     } else if (scalingMethod.toLower() == "toimageppi") {
0056         sm= KisFileLayer::ToImagePPI;
0057     }
0058     file->setScalingMethod(sm);
0059     file->setScalingFilter(scalingFilter);
0060 
0061     const QString basePath = QFileInfo(file->path()).absolutePath();
0062     const QString absoluteFilePath = QFileInfo(fileName).absoluteFilePath();
0063     file->setFileName(basePath, getFileNameFromAbsolute(basePath, absoluteFilePath));
0064 }
0065 
0066 void FileLayer::resetCache()
0067 {
0068     KisFileLayer *file = dynamic_cast<KisFileLayer*>(this->node().data());
0069     KIS_ASSERT_RECOVER_RETURN(file);
0070     file->resetCache();
0071 }
0072 
0073 QString FileLayer::path() const
0074 {
0075     const KisFileLayer *file = qobject_cast<const KisFileLayer*>(this->node());
0076     KIS_ASSERT(file);
0077     return file->path();
0078 }
0079 
0080 QString FileLayer::scalingMethod() const
0081 {
0082     const KisFileLayer *file = qobject_cast<const KisFileLayer*>(this->node());
0083     KIS_ASSERT_RECOVER_RETURN_VALUE(file, "None");
0084     KisFileLayer::ScalingMethod sm = file->scalingMethod();
0085     QString method = "None";
0086 
0087     if (sm==KisFileLayer::ToImageSize) {
0088         method = "ToImageSize";
0089     } else if (sm==KisFileLayer::ToImagePPI) {
0090         method = "ToImagePPI";
0091     }
0092     return method;
0093 }
0094 
0095 QString FileLayer::scalingFilter() const
0096 {
0097     const KisFileLayer *file = qobject_cast<const KisFileLayer*>(this->node());
0098     KIS_ASSERT_RECOVER_RETURN_VALUE(file, "Bicubic");
0099     return file->scalingFilter();
0100 }
0101 
0102 QString FileLayer::getFileNameFromAbsolute(const QString &basePath, QString filePath)
0103 {
0104     KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(QFileInfo(filePath).isAbsolute(), filePath);
0105 
0106     // try to resolve symlink
0107     {
0108         const QFileInfo fi(filePath);
0109         if (fi.isSymLink()) {
0110             filePath = fi.symLinkTarget();
0111         }
0112     }
0113 
0114     if (!basePath.isEmpty()) {
0115         QDir directory(basePath);
0116         filePath = directory.relativeFilePath(filePath);
0117     }
0118 
0119     return filePath;
0120 }
0121 
0122