#include "toonz/scriptbinding_files.h" #include #include #include #include #include "tsystem.h" namespace TScriptBinding { //=========================================================================== FilePath::FilePath(const QString &filePath) : m_filePath(filePath) { } FilePath::FilePath(const TFilePath &filePath) : m_filePath(QString::fromStdWString(filePath.getWideString())) { } FilePath::~FilePath() { } QScriptValue FilePath::ctor(QScriptContext *context, QScriptEngine *engine) { FilePath *file = new FilePath(); if (context->argumentCount() == 1) { file->m_filePath = context->argument(0).toString(); } return file->create(engine, file); } QScriptValue FilePath::toString() const { return tr("\"%1\"").arg(m_filePath); } QString FilePath::getExtension() const { return QString::fromStdString(getToonzFilePath().getType()); } QScriptValue FilePath::setExtension(const QString &extension) { TFilePath fp = getToonzFilePath().withType(extension.toStdString()); m_filePath = QString::fromStdWString(fp.getWideString()); return context()->thisObject(); } QString FilePath::getName() const { return QString::fromStdString(getToonzFilePath().getName()); } void FilePath::setName(const QString &name) { TFilePath fp = getToonzFilePath().withName(name.toStdString()); m_filePath = QString::fromStdWString(fp.getWideString()); } QScriptValue FilePath::getParentDirectory() const { FilePath *result = new FilePath(getToonzFilePath().getParentDir()); return create(engine(), result); } void FilePath::setParentDirectory(const QScriptValue &folder) { TFilePath fp; QScriptValue err = checkFilePath(context(), folder, fp); if (!err.isError()) { m_filePath = QString::fromStdWString(getToonzFilePath().withParentDir(fp).getWideString()); } } QScriptValue FilePath::withExtension(const QString &extension) { TFilePath fp = getToonzFilePath().withType(extension.toStdString()); return create(engine(), new FilePath(fp)); } QScriptValue FilePath::withName(const QString &extension) { TFilePath fp = getToonzFilePath().withName(extension.toStdString()); return create(engine(), new FilePath(fp)); } QScriptValue FilePath::withParentDirectory(const QScriptValue &parentDirectoryArg) { TFilePath parentDirectory; QScriptValue err = checkFilePath(context(), parentDirectoryArg, parentDirectory); if (err.isError()) return err; else return create(engine(), new FilePath(getToonzFilePath().withParentDir(parentDirectory))); } bool FilePath::exists() const { return QFile(m_filePath).exists(); } QDateTime FilePath::lastModified() const { return QFileInfo(m_filePath).lastModified(); } TFilePath FilePath::getToonzFilePath() const { return TFilePath(m_filePath.toStdWString()); } bool FilePath::isDirectory() const { return QFileInfo(m_filePath).isDir(); } QScriptValue FilePath::concat(const QScriptValue &value) const { TFilePath fp; QScriptValue err; err = checkFilePath(context(), value, fp); if (err.isError()) return err; /* if(!isDirectory()) { QScriptValue v = toString(); return context()->throwError(tr("%1 is not a directory").arg(toString().toString())); } */ if (fp.isAbsolute()) return context()->throwError(tr("can't concatenate an absolute path : %1").arg(value.toString())); fp = getToonzFilePath() + fp; return create(engine(), new FilePath(fp)); } QScriptValue FilePath::files() const { if (!isDirectory()) { return context()->throwError(tr("%1 is not a directory").arg(toString().toString())); } TFilePathSet fpset; try { TSystem::readDirectory(fpset, getToonzFilePath()); QScriptValue result = engine()->newArray(); quint32 index = 0; for (TFilePathSet::iterator it = fpset.begin(); it != fpset.end(); ++it) { FilePath *res = new FilePath(*it); result.setProperty(index++, res->create(engine())); } return result; } catch (...) { return context()->throwError(tr("can't read directory %1").arg(toString().toString())); } } QScriptValue checkFilePath(QScriptContext *context, const QScriptValue &value, TFilePath &fp) { FilePath *filePath = qscriptvalue_cast(value); if (filePath) { fp = filePath->getToonzFilePath(); } else if (value.isString()) { fp = TFilePath(value.toString().toStdWString()); } else { return context->throwError(QObject::tr("Argument doesn't look like a file path : %1").arg(value.toString())); } return QScriptValue(); } } // namespace TScriptBinding