tahoma2d/toonz/sources/toonz/xdtsimportpopup.cpp
2020-11-04 12:19:59 -07:00

181 lines
6.1 KiB
C++

#include "xdtsimportpopup.h"
#include "tapp.h"
#include "tsystem.h"
#include "toonzqt/filefield.h"
#include "toonz/toonzscene.h"
#include <QMainWindow>
#include <QTableView>
#include <QPushButton>
#include <QScrollArea>
#include <QGridLayout>
#include <QLabel>
using namespace DVGui;
XDTSImportPopup::XDTSImportPopup(QStringList levelNames, ToonzScene* scene,
TFilePath scenePath)
: m_scene(scene)
, DVGui::Dialog(TApp::instance()->getMainWindow(), true, false,
"XDTSImport") {
setWindowTitle(tr("Importing XDTS file %1")
.arg(QString::fromStdString(scenePath.getLevelName())));
QPushButton* loadButton = new QPushButton(tr("Load"), this);
QPushButton* cancelButton = new QPushButton(tr("Cancel"), this);
QString description =
tr("Please specify the level locations. Suggested paths "
"are input in the fields with blue border.");
m_topLayout->addWidget(new QLabel(description, this), 0);
m_topLayout->addSpacing(15);
QScrollArea* fieldsArea = new QScrollArea(this);
fieldsArea->setWidgetResizable(true);
QWidget* fieldsWidget = new QWidget(this);
QGridLayout* fieldsLay = new QGridLayout();
fieldsLay->setMargin(0);
fieldsLay->setHorizontalSpacing(10);
fieldsLay->setVerticalSpacing(10);
fieldsLay->addWidget(new QLabel(tr("Level Name"), this), 0, 0,
Qt::AlignLeft | Qt::AlignVCenter);
fieldsLay->addWidget(new QLabel(tr("Level Path"), this), 0, 1,
Qt::AlignLeft | Qt::AlignVCenter);
for (QString& levelName : levelNames) {
int row = fieldsLay->rowCount();
fieldsLay->addWidget(new QLabel(levelName, this), row, 0,
Qt::AlignRight | Qt::AlignVCenter);
FileField* fileField = new FileField(this);
fieldsLay->addWidget(fileField, row, 1);
m_fields.insert(levelName, fileField);
fileField->setFileMode(QFileDialog::AnyFile);
fileField->setObjectName("SuggestiveFileField");
connect(fileField, SIGNAL(pathChanged()), this, SLOT(onPathChanged()));
}
fieldsLay->setColumnStretch(1, 1);
fieldsLay->setRowStretch(fieldsLay->rowCount(), 1);
fieldsWidget->setLayout(fieldsLay);
fieldsArea->setWidget(fieldsWidget);
m_topLayout->addWidget(fieldsArea, 1);
connect(loadButton, SIGNAL(clicked()), this, SLOT(accept()));
connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject()));
addButtonBarWidget(loadButton, cancelButton);
updateSuggestions(scenePath.getQString());
}
//-----------------------------------------------------------------------------
void XDTSImportPopup::onPathChanged() {
FileField* fileField = dynamic_cast<FileField*>(sender());
if (!fileField) return;
QString levelName = m_fields.key(fileField);
// make the field non-suggestive
m_pathSuggestedLevels.removeAll(levelName);
// if the path is specified under the sub-folder with the same name as the
// level, then try to make suggestions from the parent folder of it
TFilePath fp =
m_scene->decodeFilePath(TFilePath(fileField->getPath())).getParentDir();
if (QDir(fp.getQString()).dirName() == levelName)
updateSuggestions(fp.getQString());
updateSuggestions(fileField->getPath());
}
//-----------------------------------------------------------------------------
void XDTSImportPopup::updateSuggestions(const QString samplePath) {
TFilePath fp(samplePath);
fp = m_scene->decodeFilePath(fp).getParentDir();
QDir suggestFolder(fp.getQString());
QStringList filters;
filters << "*.bmp"
<< "*.jpg"
<< "*.png"
<< "*.rgb"
<< "*.sgi"
<< "*.tga"
<< "*.tif"
<< "*.tiff"
<< "*.tlv"
<< "*.pli"
<< "*.psd";
suggestFolder.setNameFilters(filters);
suggestFolder.setFilter(QDir::Files);
TFilePathSet pathSet;
try {
TSystem::readDirectory(pathSet, suggestFolder, true);
} catch (...) {
return;
}
QMap<QString, FileField*>::iterator fieldsItr = m_fields.begin();
while (fieldsItr != m_fields.end()) {
QString levelName = fieldsItr.key();
FileField* fileField = fieldsItr.value();
// check if the field can be filled with suggestion
if (fileField->getPath().isEmpty() ||
m_pathSuggestedLevels.contains(levelName)) {
// input suggestion if there is a file with the same level name
bool found = false;
for (TFilePath path : pathSet) {
if (path.getName() == levelName.toStdString()) {
TFilePath codedPath = m_scene->codeFilePath(path);
fileField->setPath(codedPath.getQString());
if (!m_pathSuggestedLevels.contains(levelName))
m_pathSuggestedLevels.append(levelName);
found = true;
break;
}
}
// Not found in the current folder.
// Then check if there is a sub-folder with the same name as the level
// (like foo/A/A.tlv), as CSP exports levels like that.
if (!found && suggestFolder.cd(levelName)) {
TFilePathSet subPathSet;
try {
TSystem::readDirectory(subPathSet, suggestFolder, true);
} catch (...) {
return;
}
for (TFilePath path : subPathSet) {
if (path.getName() == levelName.toStdString()) {
TFilePath codedPath = m_scene->codeFilePath(path);
fileField->setPath(codedPath.getQString());
if (!m_pathSuggestedLevels.contains(levelName))
m_pathSuggestedLevels.append(levelName);
break;
}
}
// back to parent folder
suggestFolder.cdUp();
}
}
++fieldsItr;
}
// repaint fields
fieldsItr = m_fields.begin();
while (fieldsItr != m_fields.end()) {
if (m_pathSuggestedLevels.contains(fieldsItr.key()))
fieldsItr.value()->setStyleSheet(
QString("#SuggestiveFileField "
"QLineEdit{border-color:#2255aa;border-width:2px;}"));
else
fieldsItr.value()->setStyleSheet(QString(""));
++fieldsItr;
}
}
QString XDTSImportPopup::getLevelPath(QString levelName) {
FileField* field = m_fields.value(levelName);
if (!field) return QString();
return field->getPath();
}