mitsuba/src/mtsgui/importdlg.cpp

219 lines
6.7 KiB
C++

/*
This file is part of Mitsuba, a physically based rendering system.
Copyright (c) 2007-2014 by Wenzel Jakob and others.
Mitsuba is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License Version 3
as published by the Free Software Foundation.
Mitsuba 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 this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "ui_importdlg.h"
#include "importdlg.h"
#include "acknowledgmentdlg.h"
#include "mainwindow.h"
#include "sceneimporter.h"
#include "locateresourcedlg.h"
ImportDialog::ImportDialog(QWidget *parent, FileResolver *resolver) :
QDialog(parent, Qt::Sheet), ui(new Ui::ImportDialog), m_resolver(resolver) {
ui->setupUi(this);
connect(ui->sceneEdit, SIGNAL(textChanged(const QString &)),
this, SLOT(refresh()));
refresh();
#if defined(__OSX__)
ui->inputBrowse->setMaximumSize(24, 24);
ui->directoryBrowse->setMaximumSize(24, 24);
ui->adjustmentBrowse->setMaximumSize(24, 24);
#endif
}
ImportDialog::~ImportDialog() {
delete ui;
}
void ImportDialog::changeEvent(QEvent *e) {
QDialog::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
void ImportDialog::on_inputBrowse_clicked(bool checked) {
const QString filter(tr("All supported formats (*.dae *.zae *.obj);;"
"COLLADA 1.4 scenes (*.dae *.zae);; Wavefront OBJ scenes (*.obj)"));
QString fname;
#if MTSGUI_STATIC_QFILEDIALOG
QSettings settings;
const QString currInput = ui->inputEdit->text();
const QString initialDir(currInput.isEmpty() ?
settings.value("importDir").toString() :
QFileInfo(currInput).absolutePath());
fname = QFileDialog::getOpenFileName(this, QString(), initialDir, filter);
if (!fname.isEmpty()) {
settings.setValue("importDir", QFileInfo(fname).absolutePath());
}
#else
QFileDialog dialog(this);
dialog.setNameFilter(filter);
dialog.setAcceptMode(QFileDialog::AcceptOpen);
dialog.setViewMode(QFileDialog::Detail);
dialog.setWindowModality(Qt::ApplicationModal);
if (dialog.exec()) {
fname = dialog.selectedFiles()[0];
}
#endif
if (!fname.isEmpty()) {
ui->inputEdit->setText(fname);
QFileInfo info(fname);
ui->directoryEdit->setText(info.absoluteDir().absolutePath());
ui->sceneEdit->setText(info.completeBaseName() + ".xml");
refresh();
}
}
void ImportDialog::on_directoryBrowse_clicked(bool checked) {
QString dirName;
#if MTSGUI_STATIC_QFILEDIALOG
QSettings settings;
QString initialDir = ui->directoryEdit->text();
dirName = QFileDialog::getExistingDirectory(this, QString(), initialDir);
#else
QFileDialog dialog(this);
dialog.setAcceptMode(QFileDialog::AcceptOpen);
dialog.setFileMode(QFileDialog::DirectoryOnly);
dialog.setWindowModality(Qt::ApplicationModal);
if (dialog.exec()) {
dirName = dialog.selectedFiles()[0];
}
#endif
if (!dirName.isEmpty()) {
ui->directoryEdit->setText(dirName);
refresh();
}
}
void ImportDialog::on_adjustmentBrowse_clicked(bool checked) {
const QString filter(tr("Import adjustment files (*.xml)"));
QString fname;
#if MTSGUI_STATIC_QFILEDIALOG
QString currFile = ui->adjustmentEdit->text();
if (currFile.isEmpty()) {
currFile = ui->inputEdit->text();
}
fname = QFileDialog::getOpenFileName(this, QString(),
QFileInfo(currFile).absolutePath(), filter);
#else
QFileDialog dialog(this);
dialog.setNameFilter(filter);
dialog.setAcceptMode(QFileDialog::AcceptOpen);
dialog.setViewMode(QFileDialog::Detail);
dialog.setWindowModality(Qt::ApplicationModal);
if (dialog.exec()) {
fname = dialog.selectedFiles()[0];
}
#endif
if (!fname.isEmpty()) {
ui->adjustmentEdit->setText(fname);
refresh();
}
}
void ImportDialog::refresh() {
bool hasInput = ui->inputEdit->text() != "";
bool hasOutput = ui->sceneEdit->text().endsWith(".xml");
ui->directoryBrowse->setEnabled(hasInput);
ui->directoryEdit->setEnabled(hasInput);
ui->adjustmentBrowse->setEnabled(hasInput);
ui->adjustmentEdit->setEnabled(hasInput);
ui->sceneEdit->setEnabled(hasInput);
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(hasInput && hasOutput);
}
void ImportDialog::accept() {
QDialog::accept();
QString sourceFile = ui->inputEdit->text();
QString directory = ui->directoryEdit->text();
QString targetScene = ui->sceneEdit->text();
QString adjustmentFile = ui->adjustmentEdit->text();
NonClosableDialog *dialog = new NonClosableDialog(static_cast<QWidget *>(parent()));
dialog->setWindowModality(Qt::WindowModal);
dialog->setWindowTitle("Converting ..");
QVBoxLayout *layout = new QVBoxLayout(dialog);
QProgressBar *progressBar = new QProgressBar(dialog);
dialog->resize(200, 50);
layout->addWidget(progressBar);
progressBar->setTextVisible(false);
progressBar->setValue(1);
progressBar->setRange(0, 0);
dialog->show();
progressBar->show();
fs::path filePath = fs::absolute(toFsPath(sourceFile)).parent_path();
ref<FileResolver> resolver = m_resolver->clone();
resolver->prependPath(filePath);
const Logger *logger = Thread::getThread()->getLogger();
size_t initialWarningCount = logger->getWarningCount();
ref<SceneImporter> importingThread = new SceneImporter(
resolver, toFsPath(sourceFile), toFsPath(directory),
toFsPath(targetScene), toFsPath(adjustmentFile),
ui->sRGBButton->isChecked());
importingThread->start();
connect(importingThread->getConverter(),
SIGNAL(locateResource(const fs::path &, fs::path *)),
this, SLOT(onLocateResource(const fs::path &, fs::path *)),
Qt::BlockingQueuedConnection);
while (importingThread->isRunning()) {
QCoreApplication::processEvents();
importingThread->wait(20);
}
importingThread->join();
dialog->hide();
delete dialog;
if (!importingThread->getResult().empty()) {
size_t warningCount = logger->getWarningCount() - initialWarningCount;
if (warningCount > 0)
QMessageBox::warning(this, tr("Scene Import"),
tr("Encountered %1 warnings while importing -- please see "
"the log for details.").arg(warningCount), QMessageBox::Ok);
((MainWindow *) parent())->loadFile(fromFsPath(importingThread->getResult()));
} else {
QMessageBox::critical(this, tr("Scene Import"),
tr("Conversion failed -- please see the log for details."),
QMessageBox::Ok);
}
}
void ImportDialog::onLocateResource(const fs::path &path, fs::path *target) {
LocateResourceDialog locateResource(this, fromFsPath(path));
locateResource.setWindowModality(Qt::ApplicationModal);
if (locateResource.exec()) {
fs::path newPath(toFsPath(locateResource.getFilename()));
if (fs::exists(newPath))
*target = newPath;
}
}