Fix for voxelImporter

This commit is contained in:
Atlante45 2014-02-19 12:35:45 -08:00
parent f24cd0ceba
commit 7bce649080
2 changed files with 85 additions and 124 deletions

View file

@ -12,6 +12,9 @@
#include <QFileInfo> #include <QFileInfo>
#include <QThreadPool> #include <QThreadPool>
const QString SETTINGS_GROUP_NAME = "VoxelImport";
const QString IMPORT_DIALOG_SETTINGS_KEY = "ImportDialogSettings";
class ImportTask : public QObject, public QRunnable { class ImportTask : public QObject, public QRunnable {
public: public:
ImportTask(const QString &filename); ImportTask(const QString &filename);
@ -21,18 +24,16 @@ private:
QString _filename; QString _filename;
}; };
const QString SETTINGS_GROUP_NAME = "VoxelImport";
const QString IMPORT_DIALOG_SETTINGS_KEY = "ImportDialogSettings";
VoxelImporter::VoxelImporter(QWidget* parent) : VoxelImporter::VoxelImporter(QWidget* parent) :
QObject(parent), QObject(parent),
_voxelTree(true), _voxelTree(true),
_importDialog(parent), _importDialog(parent),
_currentTask(NULL), _task(NULL),
_nextTask(NULL) _didImport(false)
{ {
connect(&_importDialog, &QFileDialog::currentChanged, this, &VoxelImporter::preImport); connect(&_voxelTree, SIGNAL(importProgress(int)), &_importDialog, SLOT(setProgressBarValue(int)));
connect(&_importDialog, &QFileDialog::accepted, this, &VoxelImporter::import); connect(&_importDialog, SIGNAL(canceled()), this, SLOT(cancel()));
connect(&_importDialog, SIGNAL(accepted()), this, SLOT(import()));
} }
void VoxelImporter::saveSettings(QSettings* settings) { void VoxelImporter::saveSettings(QSettings* settings) {
@ -41,145 +42,106 @@ void VoxelImporter::saveSettings(QSettings* settings) {
settings->endGroup(); settings->endGroup();
} }
void VoxelImporter::init(QSettings* settings) { void VoxelImporter::loadSettings(QSettings* settings) {
settings->beginGroup(SETTINGS_GROUP_NAME); settings->beginGroup(SETTINGS_GROUP_NAME);
_importDialog.restoreState(settings->value(IMPORT_DIALOG_SETTINGS_KEY).toByteArray()); _importDialog.restoreState(settings->value(IMPORT_DIALOG_SETTINGS_KEY).toByteArray());
settings->endGroup(); settings->endGroup();
} }
VoxelImporter::~VoxelImporter() { VoxelImporter::~VoxelImporter() {
if (_nextTask) { cleanupTask();
delete _nextTask;
_nextTask = NULL;
}
if (_currentTask) {
disconnect(_currentTask, 0, 0, 0);
_voxelTree.cancelImport();
_currentTask = NULL;
}
} }
void VoxelImporter::reset() { void VoxelImporter::reset() {
_voxelTree.eraseAllOctreeElements(); _voxelTree.eraseAllOctreeElements();
_importDialog.reset(); _importDialog.reset();
_filename = "";
if (_nextTask) { cleanupTask();
delete _nextTask;
_nextTask = NULL;
}
if (_currentTask) {
_voxelTree.cancelImport();
}
} }
int VoxelImporter::exec() { int VoxelImporter::exec() {
reset(); reset();
_importDialog.exec();
int ret = _importDialog.exec();
if (!ret) {
reset();
} else {
_importDialog.reset();
VoxelSystem* voxelSystem = Application::getInstance()->getSharedVoxelSystem();
voxelSystem->copySubTreeIntoNewTree(voxelSystem->getTree()->getRoot(),
Application::getInstance()->getClipboard(),
true);
voxelSystem->changeTree(Application::getInstance()->getClipboard());
}
return ret;
}
int VoxelImporter::preImport() {
QString filename = _importDialog.getCurrentFile();
if (!QFileInfo(filename).isFile()) {
return 0;
}
_filename = filename; if (!_didImport) {
// if the import is rejected, we make sure to cleanup before leaving
if (_nextTask) { cleanupTask();
delete _nextTask;
}
_nextTask = new ImportTask(_filename);
connect(_nextTask, SIGNAL(destroyed()), SLOT(launchTask()));
if (_currentTask != NULL) {
_voxelTree.cancelImport();
} else {
launchTask();
}
return 1;
}
int VoxelImporter::import() {
QString filename = _importDialog.getCurrentFile();
if (!QFileInfo(filename).isFile()) {
_importDialog.reject();
return 0;
}
if (_filename == filename) {
if (_currentTask) {
connect(_currentTask, SIGNAL(destroyed()), &_importDialog, SLOT(accept()));
} else {
_importDialog.accept();
}
return 1; return 1;
}
_filename = filename;
if (_nextTask) {
delete _nextTask;
}
_nextTask = new ImportTask(_filename);
connect(_nextTask, SIGNAL(destroyed()), SLOT(launchTask()));
connect(_nextTask, SIGNAL(destroyed()), &_importDialog, SLOT(accept()));
if (_currentTask != NULL) {
_voxelTree.cancelImport();
} else { } else {
launchTask(); _didImport = false;
return 0;
} }
return 1;
} }
void VoxelImporter::launchTask() { void VoxelImporter::import() {
if (_nextTask != NULL) { switch (_importDialog.getMode()) {
_currentTask = _nextTask; case loadingMode:
_nextTask = NULL; _importDialog.setMode(placeMode);
return;
case placeMode:
// Means the user chose to import
_didImport = true;
_importDialog.close();
return;
case importMode:
default:
QString filename = _importDialog.getCurrentFile();
// if it's not a file, we ignore the call
if (!QFileInfo(filename).isFile()) {
return;
}
// Let's prepare the dialog window for import
_importDialog.setMode(loadingMode);
// If not already done, we switch to the local tree
if (Application::getInstance()->getSharedVoxelSystem()->getTree() != &_voxelTree) {
Application::getInstance()->getSharedVoxelSystem()->changeTree(&_voxelTree);
}
// Creation and launch of the import task on the thread pool
_task = new ImportTask(filename);
connect(_task, SIGNAL(destroyed()), SLOT(import()));
QThreadPool::globalInstance()->start(_task);
break;
}
}
if (Application::getInstance()->getSharedVoxelSystem()->getTree() != &_voxelTree) { void VoxelImporter::cancel() {
Application::getInstance()->getSharedVoxelSystem()->changeTree(&_voxelTree); switch (_importDialog.getMode()) {
} case loadingMode:
disconnect(_task, 0, 0, 0);
cleanupTask();
case placeMode:
_importDialog.setMode(importMode);
break;
case importMode:
default:
_importDialog.close();
break;
}
}
QThreadPool::globalInstance()->start(_currentTask); void VoxelImporter::cleanupTask() {
} else { // If a task is running, we cancel it and put the pointer to null
_currentTask = NULL; if (_task) {
_task = NULL;
_voxelTree.cancelImport();
} }
} }
ImportTask::ImportTask(const QString &filename) ImportTask::ImportTask(const QString &filename)
: _filename(filename) { : _filename(filename)
{
setAutoDelete(true);
} }
void ImportTask::run() { void ImportTask::run() {
VoxelSystem* voxelSystem = Application::getInstance()->getSharedVoxelSystem(); VoxelSystem* voxelSystem = Application::getInstance()->getSharedVoxelSystem();
// We start by cleaning up the shared voxel system just in case
voxelSystem->killLocalVoxels(); voxelSystem->killLocalVoxels();
// Then we call the righ method for the job
if (_filename.endsWith(".png", Qt::CaseInsensitive)) { if (_filename.endsWith(".png", Qt::CaseInsensitive)) {
voxelSystem->readFromSquareARGB32Pixels(_filename.toLocal8Bit().data()); voxelSystem->readFromSquareARGB32Pixels(_filename.toLocal8Bit().data());
} else if (_filename.endsWith(".svo", Qt::CaseInsensitive)) { } else if (_filename.endsWith(".svo", Qt::CaseInsensitive)) {
@ -187,8 +149,10 @@ void ImportTask::run() {
} else if (_filename.endsWith(".schematic", Qt::CaseInsensitive)) { } else if (_filename.endsWith(".schematic", Qt::CaseInsensitive)) {
voxelSystem->readFromSchematicFile(_filename.toLocal8Bit().data()); voxelSystem->readFromSchematicFile(_filename.toLocal8Bit().data());
} else { } else {
qDebug("[ERROR] Invalid file extension."); // We should never get here.
qDebug() << "[ERROR] Invalid file extension." << endl;
} }
// Here we reaverage the tree so that he is ready for preview
voxelSystem->getTree()->reaverageOctreeElements(); voxelSystem->getTree()->reaverageOctreeElements();
} }

View file

@ -23,28 +23,25 @@ public:
VoxelImporter(QWidget* parent = NULL); VoxelImporter(QWidget* parent = NULL);
~VoxelImporter(); ~VoxelImporter();
void init(QSettings* settings);
void reset(); void reset();
void loadSettings(QSettings* settings);
void saveSettings(QSettings* settings); void saveSettings(QSettings* settings);
VoxelTree* getVoxelTree() { return &_voxelTree; } VoxelTree* getVoxelTree() { return &_voxelTree; }
public slots: public slots:
int exec(); int exec();
int preImport(); void import();
int import(); void cancel();
private slots:
void launchTask();
private: private:
VoxelTree _voxelTree; VoxelTree _voxelTree;
ImportDialog _importDialog; ImportDialog _importDialog;
QString _filename; ImportTask* _task;
bool _didImport;
ImportTask* _currentTask;
ImportTask* _nextTask; void cleanupTask();
}; };
#endif /* defined(__hifi__VoxelImporter__) */ #endif /* defined(__hifi__VoxelImporter__) */