Something went wrong. Try again.
OpenMW is an open implementation of the Morrowind engine
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215#include "loader.hpp"
#include <QCloseEvent>#include <QCursor>#include <QDialogButtonBox>#include <QLabel>#include <QListWidget>#include <QProgressBar>#include <QVBoxLayout>
#include <apps/opencs/model/world/data.hpp>
#include <components/debug/debuglog.hpp>#include <components/files/qtconversion.hpp>
#include <filesystem>#include <stddef.h>#include <type_traits>#include <utility>#include <vector>
#include "../../model/doc/document.hpp"
void CSVDoc::LoadingDocument::closeEvent(QCloseEvent* event){ event->ignore(); cancel();}
CSVDoc::LoadingDocument::LoadingDocument(CSMDoc::Document* document) : mDocument(document) , mTotalRecordsLabel(0) , mRecordsLabel(0) , mAborted(false) , mMessages(nullptr) , mRecords(0){ setWindowTitle("Opening " + Files::pathToQString(document->getSavePath().filename()));
setMinimumWidth(400);
mLayout = new QVBoxLayout(this);
// total progress mTotalRecordsLabel = new QLabel(this);
mLayout->addWidget(mTotalRecordsLabel);
mTotalProgress = new QProgressBar(this);
mLayout->addWidget(mTotalProgress);
mTotalProgress->setMinimum(0); mTotalProgress->setMaximum(document->getData().getTotalRecords(document->getContentFiles())); mTotalProgress->setTextVisible(true); mTotalProgress->setValue(0); mTotalRecords = 0;
mFilesLoaded = 0;
// record progress mLayout->addWidget(mRecordsLabel = new QLabel("Records", this));
mRecordProgress = new QProgressBar(this);
mLayout->addWidget(mRecordProgress);
mRecordProgress->setMinimum(0); mRecordProgress->setTextVisible(true); mRecordProgress->setValue(0);
// error message mError = new QLabel(this); mError->setWordWrap(true); mError->setTextInteractionFlags(Qt::TextSelectableByMouse);
mLayout->addWidget(mError);
// buttons mButtons = new QDialogButtonBox(QDialogButtonBox::Cancel, Qt::Horizontal, this);
mLayout->addWidget(mButtons);
setLayout(mLayout);
move(QCursor::pos());
show();
connect(mButtons, &QDialogButtonBox::rejected, this, qOverload<>(&LoadingDocument::cancel));}
void CSVDoc::LoadingDocument::nextStage(const std::string& name, int fileRecords){ ++mFilesLoaded; size_t numFiles = mDocument->getContentFiles().size();
mTotalRecordsLabel->setText(QString::fromUtf8( ("Loading: " + name + " (" + std::to_string(mFilesLoaded) + " of " + std::to_string((numFiles)) + ")") .c_str()));
mTotalRecords = mTotalProgress->value();
mRecordProgress->setValue(0); mRecordProgress->setMaximum(fileRecords > 0 ? fileRecords : 1);
mRecords = fileRecords;}
void CSVDoc::LoadingDocument::nextRecord(int records){ if (records <= mRecords) { mTotalProgress->setValue(mTotalRecords + records);
mRecordProgress->setValue(records);
mRecordsLabel->setText("Records: " + QString::number(records) + " of " + QString::number(mRecords)); }}
void CSVDoc::LoadingDocument::abort(const std::string& error){ mAborted = true; mError->setText(QString::fromUtf8(("<font color=red>Loading failed: " + error + "</font>").c_str())); Log(Debug::Error) << "Loading failed: " << error; mButtons->setStandardButtons(QDialogButtonBox::Close);}
void CSVDoc::LoadingDocument::addMessage(const std::string& message){ if (!mMessages) { mMessages = new QListWidget(this); mLayout->insertWidget(4, mMessages); }
new QListWidgetItem(QString::fromUtf8(message.c_str()), mMessages);}
void CSVDoc::LoadingDocument::cancel(){ if (!mAborted) emit cancel(mDocument); else { emit close(mDocument); deleteLater(); }}
CSVDoc::Loader::~Loader(){ for (std::map<CSMDoc::Document*, LoadingDocument*>::iterator iter(mDocuments.begin()); iter != mDocuments.end(); ++iter) delete iter->second;}
void CSVDoc::Loader::add(CSMDoc::Document* document){ LoadingDocument* loading = new LoadingDocument(document); mDocuments.insert(std::make_pair(document, loading));
connect(loading, qOverload<CSMDoc::Document*>(&LoadingDocument::cancel), this, &Loader::cancel); connect(loading, &LoadingDocument::close, this, &Loader::close);}
void CSVDoc::Loader::loadingStopped(CSMDoc::Document* document, bool completed, const std::string& error){ std::map<CSMDoc::Document*, LoadingDocument*>::iterator iter = mDocuments.begin();
for (; iter != mDocuments.end(); ++iter) if (iter->first == document) break;
if (iter == mDocuments.end()) return;
if (completed || error.empty()) { delete iter->second; mDocuments.erase(iter); } else { iter->second->abort(error); // Leave the window open for now (wait for the user to close it) mDocuments.erase(iter); }}
void CSVDoc::Loader::nextStage(CSMDoc::Document* document, const std::string& name, int fileRecords){ std::map<CSMDoc::Document*, LoadingDocument*>::iterator iter = mDocuments.find(document);
if (iter != mDocuments.end()) iter->second->nextStage(name, fileRecords);}
void CSVDoc::Loader::nextRecord(CSMDoc::Document* document, int records){ std::map<CSMDoc::Document*, LoadingDocument*>::iterator iter = mDocuments.find(document);
if (iter != mDocuments.end()) iter->second->nextRecord(records);}
void CSVDoc::Loader::loadMessage(CSMDoc::Document* document, const std::string& message){ std::map<CSMDoc::Document*, LoadingDocument*>::iterator iter = mDocuments.find(document);
if (iter != mDocuments.end()) iter->second->addMessage(message);}