mirror of
https://github.com/overte-org/overte.git
synced 2025-04-22 09:33:36 +02:00
Modified Browser to be able to dowload all the fst file when there are more than 1000
This commit is contained in:
parent
1e2dabfd5e
commit
76c2a9fdad
3 changed files with 82 additions and 55 deletions
|
@ -694,7 +694,8 @@ void Menu::loginForCurrentDomain() {
|
|||
|
||||
void Menu::editPreferences() {
|
||||
Application* applicationInstance = Application::getInstance();
|
||||
ModelBrowser browser;
|
||||
ModelBrowser headBrowser(Head);
|
||||
ModelBrowser skeletonBrowser(Skeleton);
|
||||
|
||||
const QString BROWSE_BUTTON_TEXT = "Browse";
|
||||
|
||||
|
@ -712,8 +713,8 @@ void Menu::editPreferences() {
|
|||
QString faceURLString = applicationInstance->getAvatar()->getHead()->getFaceModel().getURL().toString();
|
||||
QLineEdit headURLEdit(faceURLString);
|
||||
QPushButton headBrowseButton(BROWSE_BUTTON_TEXT);
|
||||
connect(&headBrowseButton, SIGNAL(clicked()), &browser, SLOT(browseHead()));
|
||||
connect(&browser, SIGNAL(selectedHead(QString)), &headURLEdit, SLOT(setText(QString)));
|
||||
connect(&headBrowseButton, SIGNAL(clicked()), &headBrowser, SLOT(browse()));
|
||||
connect(&headBrowser, SIGNAL(selected (QString)), &headURLEdit, SLOT(setText(QString)));
|
||||
headURLEdit.setReadOnly(true);
|
||||
headURLEdit.setMinimumWidth(QLINE_MINIMUM_WIDTH);
|
||||
headURLEdit.setPlaceholderText(DEFAULT_HEAD_MODEL_URL.toString());
|
||||
|
@ -725,8 +726,8 @@ void Menu::editPreferences() {
|
|||
QString skeletonURLString = applicationInstance->getAvatar()->getSkeletonModel().getURL().toString();
|
||||
QLineEdit skeletonURLEdit(skeletonURLString);
|
||||
QPushButton SkeletonBrowseButton(BROWSE_BUTTON_TEXT);
|
||||
connect(&SkeletonBrowseButton, SIGNAL(clicked()), &browser, SLOT(browseSkeleton()));
|
||||
connect(&browser, SIGNAL(selectedSkeleton(QString)), &skeletonURLEdit, SLOT(setText(QString)));
|
||||
connect(&SkeletonBrowseButton, SIGNAL(clicked()), &skeletonBrowser, SLOT(browse()));
|
||||
connect(&skeletonBrowser, SIGNAL(selected(QString)), &skeletonURLEdit, SLOT(setText(QString)));
|
||||
skeletonURLEdit.setReadOnly(true);
|
||||
skeletonURLEdit.setMinimumWidth(QLINE_MINIMUM_WIDTH);
|
||||
skeletonURLEdit.setPlaceholderText(DEFAULT_BODY_MODEL_URL.toString());
|
||||
|
|
|
@ -19,23 +19,36 @@
|
|||
|
||||
#include "ModelBrowser.h"
|
||||
|
||||
static const int DOWNLOAD_TIMEOUT = 1000;
|
||||
static const QString PREFIX_PARAMETER_NAME = "prefix";
|
||||
static const QString MARKER_PARAMETER_NAME = "marker";
|
||||
static const QString IS_TRUNCATED_NAME = "IsTruncated";
|
||||
static const QString CONTAINER_NAME = "Contents";
|
||||
static const QString KEY_NAME = "Key";
|
||||
|
||||
ModelBrowser::ModelBrowser(QWidget* parent) :
|
||||
QWidget(parent),
|
||||
_downloader(QUrl(S3_URL))
|
||||
{
|
||||
ModelBrowser::ModelBrowser(ModelType modelType, QWidget* parent) : QWidget(parent), _type(modelType) {
|
||||
QUrl url(S3_URL);
|
||||
QUrlQuery query;
|
||||
|
||||
if (_type == Head) {
|
||||
query.addQueryItem(PREFIX_PARAMETER_NAME, HEAD_MODELS_LOCATION);
|
||||
} else if (_type == Skeleton) {
|
||||
query.addQueryItem(PREFIX_PARAMETER_NAME, SKELETON_MODELS_LOCATION);
|
||||
}
|
||||
url.setQuery(query);
|
||||
|
||||
_downloader = new FileDownloader(url);
|
||||
connect(_downloader, SIGNAL(done(QNetworkReply::NetworkError)), SLOT(downloadFinished()));
|
||||
}
|
||||
|
||||
QString ModelBrowser::browse(ModelType modelType) {
|
||||
_models.clear();
|
||||
if (!parseXML(modelType)) {
|
||||
return QString();
|
||||
}
|
||||
|
||||
|
||||
ModelBrowser::~ModelBrowser() {
|
||||
delete _downloader;
|
||||
}
|
||||
|
||||
void ModelBrowser::downloadFinished() {
|
||||
parseXML(_downloader->getData());
|
||||
}
|
||||
|
||||
void ModelBrowser::browse() {
|
||||
QDialog dialog(this);
|
||||
dialog.setWindowTitle("Browse models");
|
||||
|
||||
|
@ -61,47 +74,38 @@ QString ModelBrowser::browse(ModelType modelType) {
|
|||
dialog.connect(buttons, SIGNAL(rejected()), SLOT(reject()));
|
||||
|
||||
if (dialog.exec() == QDialog::Rejected) {
|
||||
return QString();
|
||||
return;
|
||||
}
|
||||
|
||||
QString selectedKey = model->data(listView->currentIndex(), Qt::DisplayRole).toString();
|
||||
return _models[selectedKey];
|
||||
}
|
||||
|
||||
void ModelBrowser::browseHead() {
|
||||
QString model = browse(Head);
|
||||
emit selectedHead(model);
|
||||
}
|
||||
|
||||
void ModelBrowser::browseSkeleton() {
|
||||
QString model = browse(Skeleton);
|
||||
emit selectedSkeleton(model);
|
||||
}
|
||||
|
||||
bool ModelBrowser::parseXML(ModelType modelType) {
|
||||
_downloader.waitForFile(DOWNLOAD_TIMEOUT);
|
||||
QString location;
|
||||
switch (modelType) {
|
||||
case Head:
|
||||
location = HEAD_MODELS_LOCATION;
|
||||
break;
|
||||
case Skeleton:
|
||||
location = SKELETON_MODELS_LOCATION;
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
QXmlStreamReader xml(_downloader.getData());
|
||||
QRegExp rx(location + "[^/]*fst");
|
||||
emit selected(_models[selectedKey]);
|
||||
}
|
||||
|
||||
bool ModelBrowser::parseXML(QByteArray xmlFile) {
|
||||
QXmlStreamReader xml(xmlFile);
|
||||
QRegExp rx(".*fst");
|
||||
bool truncated = false;
|
||||
QString lastKey;
|
||||
|
||||
// Read xml until the end or an error is detected
|
||||
while(!xml.atEnd() && !xml.hasError()) {
|
||||
if(xml.tokenType() == QXmlStreamReader::StartElement && xml.name() == IS_TRUNCATED_NAME) {
|
||||
while(!(xml.tokenType() == QXmlStreamReader::EndElement && xml.name() == IS_TRUNCATED_NAME)) {
|
||||
// Let's check if there is more
|
||||
xml.readNext();
|
||||
if (xml.text().toString() == "True") {
|
||||
truncated = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(xml.tokenType() == QXmlStreamReader::StartElement && xml.name() == CONTAINER_NAME) {
|
||||
while(!(xml.tokenType() == QXmlStreamReader::EndElement && xml.name() == CONTAINER_NAME)) {
|
||||
// If a file is find, process it
|
||||
if(xml.tokenType() == QXmlStreamReader::StartElement && xml.name() == KEY_NAME) {
|
||||
xml.readNext();
|
||||
lastKey = xml.text().toString();
|
||||
if (rx.exactMatch(xml.text().toString())) {
|
||||
// Add the found file to the list
|
||||
_models.insert(QFileInfo(xml.text().toString()).baseName(),
|
||||
|
@ -123,5 +127,24 @@ bool ModelBrowser::parseXML(ModelType modelType) {
|
|||
QMessageBox::Ok);
|
||||
return false;
|
||||
}
|
||||
|
||||
// If we didn't all the files, download the next ones
|
||||
if (truncated) {
|
||||
QUrl url(S3_URL);
|
||||
QUrlQuery query;
|
||||
|
||||
if (_type == Head) {
|
||||
query.addQueryItem(PREFIX_PARAMETER_NAME, HEAD_MODELS_LOCATION);
|
||||
} else if (_type == Skeleton) {
|
||||
query.addQueryItem(PREFIX_PARAMETER_NAME, SKELETON_MODELS_LOCATION);
|
||||
}
|
||||
query.addQueryItem(MARKER_PARAMETER_NAME, lastKey);
|
||||
url.setQuery(query);
|
||||
|
||||
delete _downloader;
|
||||
_downloader = new FileDownloader(url);
|
||||
connect(_downloader, SIGNAL(done(QNetworkReply::NetworkError)), SLOT(downloadFinished()));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
|
@ -27,25 +27,28 @@ class ModelBrowser : public QWidget {
|
|||
Q_OBJECT
|
||||
|
||||
public:
|
||||
ModelBrowser(QWidget* parent = NULL);
|
||||
|
||||
QString browse(ModelType modelType);
|
||||
ModelBrowser(ModelType modelType, QWidget* parent = NULL);
|
||||
~ModelBrowser();
|
||||
|
||||
signals:
|
||||
void selectedHead(QString);
|
||||
void selectedSkeleton(QString);
|
||||
void selected(QString);
|
||||
|
||||
public slots:
|
||||
void browseHead();
|
||||
void browseSkeleton();
|
||||
void browse();
|
||||
|
||||
private slots:
|
||||
void downloadFinished();
|
||||
|
||||
private:
|
||||
FileDownloader _downloader;
|
||||
ModelType _type;
|
||||
FileDownloader* _downloader;
|
||||
QHash<QString, QString> _models;
|
||||
|
||||
bool parseXML(ModelType modelType);
|
||||
bool parseXML(QByteArray xmlFile);
|
||||
};
|
||||
|
||||
|
||||
|
||||
class ListView : public QListView {
|
||||
Q_OBJECT
|
||||
public:
|
||||
|
|
Loading…
Reference in a new issue