mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 03:58:07 +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() {
|
void Menu::editPreferences() {
|
||||||
Application* applicationInstance = Application::getInstance();
|
Application* applicationInstance = Application::getInstance();
|
||||||
ModelBrowser browser;
|
ModelBrowser headBrowser(Head);
|
||||||
|
ModelBrowser skeletonBrowser(Skeleton);
|
||||||
|
|
||||||
const QString BROWSE_BUTTON_TEXT = "Browse";
|
const QString BROWSE_BUTTON_TEXT = "Browse";
|
||||||
|
|
||||||
|
@ -712,8 +713,8 @@ void Menu::editPreferences() {
|
||||||
QString faceURLString = applicationInstance->getAvatar()->getHead()->getFaceModel().getURL().toString();
|
QString faceURLString = applicationInstance->getAvatar()->getHead()->getFaceModel().getURL().toString();
|
||||||
QLineEdit headURLEdit(faceURLString);
|
QLineEdit headURLEdit(faceURLString);
|
||||||
QPushButton headBrowseButton(BROWSE_BUTTON_TEXT);
|
QPushButton headBrowseButton(BROWSE_BUTTON_TEXT);
|
||||||
connect(&headBrowseButton, SIGNAL(clicked()), &browser, SLOT(browseHead()));
|
connect(&headBrowseButton, SIGNAL(clicked()), &headBrowser, SLOT(browse()));
|
||||||
connect(&browser, SIGNAL(selectedHead(QString)), &headURLEdit, SLOT(setText(QString)));
|
connect(&headBrowser, SIGNAL(selected (QString)), &headURLEdit, SLOT(setText(QString)));
|
||||||
headURLEdit.setReadOnly(true);
|
headURLEdit.setReadOnly(true);
|
||||||
headURLEdit.setMinimumWidth(QLINE_MINIMUM_WIDTH);
|
headURLEdit.setMinimumWidth(QLINE_MINIMUM_WIDTH);
|
||||||
headURLEdit.setPlaceholderText(DEFAULT_HEAD_MODEL_URL.toString());
|
headURLEdit.setPlaceholderText(DEFAULT_HEAD_MODEL_URL.toString());
|
||||||
|
@ -725,8 +726,8 @@ void Menu::editPreferences() {
|
||||||
QString skeletonURLString = applicationInstance->getAvatar()->getSkeletonModel().getURL().toString();
|
QString skeletonURLString = applicationInstance->getAvatar()->getSkeletonModel().getURL().toString();
|
||||||
QLineEdit skeletonURLEdit(skeletonURLString);
|
QLineEdit skeletonURLEdit(skeletonURLString);
|
||||||
QPushButton SkeletonBrowseButton(BROWSE_BUTTON_TEXT);
|
QPushButton SkeletonBrowseButton(BROWSE_BUTTON_TEXT);
|
||||||
connect(&SkeletonBrowseButton, SIGNAL(clicked()), &browser, SLOT(browseSkeleton()));
|
connect(&SkeletonBrowseButton, SIGNAL(clicked()), &skeletonBrowser, SLOT(browse()));
|
||||||
connect(&browser, SIGNAL(selectedSkeleton(QString)), &skeletonURLEdit, SLOT(setText(QString)));
|
connect(&skeletonBrowser, SIGNAL(selected(QString)), &skeletonURLEdit, SLOT(setText(QString)));
|
||||||
skeletonURLEdit.setReadOnly(true);
|
skeletonURLEdit.setReadOnly(true);
|
||||||
skeletonURLEdit.setMinimumWidth(QLINE_MINIMUM_WIDTH);
|
skeletonURLEdit.setMinimumWidth(QLINE_MINIMUM_WIDTH);
|
||||||
skeletonURLEdit.setPlaceholderText(DEFAULT_BODY_MODEL_URL.toString());
|
skeletonURLEdit.setPlaceholderText(DEFAULT_BODY_MODEL_URL.toString());
|
||||||
|
|
|
@ -19,23 +19,36 @@
|
||||||
|
|
||||||
#include "ModelBrowser.h"
|
#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 CONTAINER_NAME = "Contents";
|
||||||
static const QString KEY_NAME = "Key";
|
static const QString KEY_NAME = "Key";
|
||||||
|
|
||||||
ModelBrowser::ModelBrowser(QWidget* parent) :
|
ModelBrowser::ModelBrowser(ModelType modelType, QWidget* parent) : QWidget(parent), _type(modelType) {
|
||||||
QWidget(parent),
|
QUrl url(S3_URL);
|
||||||
_downloader(QUrl(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) {
|
ModelBrowser::~ModelBrowser() {
|
||||||
_models.clear();
|
delete _downloader;
|
||||||
if (!parseXML(modelType)) {
|
}
|
||||||
return QString();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
void ModelBrowser::downloadFinished() {
|
||||||
|
parseXML(_downloader->getData());
|
||||||
|
}
|
||||||
|
|
||||||
|
void ModelBrowser::browse() {
|
||||||
QDialog dialog(this);
|
QDialog dialog(this);
|
||||||
dialog.setWindowTitle("Browse models");
|
dialog.setWindowTitle("Browse models");
|
||||||
|
|
||||||
|
@ -61,47 +74,38 @@ QString ModelBrowser::browse(ModelType modelType) {
|
||||||
dialog.connect(buttons, SIGNAL(rejected()), SLOT(reject()));
|
dialog.connect(buttons, SIGNAL(rejected()), SLOT(reject()));
|
||||||
|
|
||||||
if (dialog.exec() == QDialog::Rejected) {
|
if (dialog.exec() == QDialog::Rejected) {
|
||||||
return QString();
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString selectedKey = model->data(listView->currentIndex(), Qt::DisplayRole).toString();
|
QString selectedKey = model->data(listView->currentIndex(), Qt::DisplayRole).toString();
|
||||||
return _models[selectedKey];
|
|
||||||
|
emit selected(_models[selectedKey]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelBrowser::browseHead() {
|
bool ModelBrowser::parseXML(QByteArray xmlFile) {
|
||||||
QString model = browse(Head);
|
QXmlStreamReader xml(xmlFile);
|
||||||
emit selectedHead(model);
|
QRegExp rx(".*fst");
|
||||||
}
|
bool truncated = false;
|
||||||
|
QString lastKey;
|
||||||
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");
|
|
||||||
|
|
||||||
// Read xml until the end or an error is detected
|
// Read xml until the end or an error is detected
|
||||||
while(!xml.atEnd() && !xml.hasError()) {
|
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) {
|
if(xml.tokenType() == QXmlStreamReader::StartElement && xml.name() == CONTAINER_NAME) {
|
||||||
while(!(xml.tokenType() == QXmlStreamReader::EndElement && xml.name() == CONTAINER_NAME)) {
|
while(!(xml.tokenType() == QXmlStreamReader::EndElement && xml.name() == CONTAINER_NAME)) {
|
||||||
// If a file is find, process it
|
// If a file is find, process it
|
||||||
if(xml.tokenType() == QXmlStreamReader::StartElement && xml.name() == KEY_NAME) {
|
if(xml.tokenType() == QXmlStreamReader::StartElement && xml.name() == KEY_NAME) {
|
||||||
xml.readNext();
|
xml.readNext();
|
||||||
|
lastKey = xml.text().toString();
|
||||||
if (rx.exactMatch(xml.text().toString())) {
|
if (rx.exactMatch(xml.text().toString())) {
|
||||||
// Add the found file to the list
|
// Add the found file to the list
|
||||||
_models.insert(QFileInfo(xml.text().toString()).baseName(),
|
_models.insert(QFileInfo(xml.text().toString()).baseName(),
|
||||||
|
@ -123,5 +127,24 @@ bool ModelBrowser::parseXML(ModelType modelType) {
|
||||||
QMessageBox::Ok);
|
QMessageBox::Ok);
|
||||||
return false;
|
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;
|
return true;
|
||||||
}
|
}
|
|
@ -27,25 +27,28 @@ class ModelBrowser : public QWidget {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ModelBrowser(QWidget* parent = NULL);
|
ModelBrowser(ModelType modelType, QWidget* parent = NULL);
|
||||||
|
~ModelBrowser();
|
||||||
QString browse(ModelType modelType);
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void selectedHead(QString);
|
void selected(QString);
|
||||||
void selectedSkeleton(QString);
|
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void browseHead();
|
void browse();
|
||||||
void browseSkeleton();
|
|
||||||
|
private slots:
|
||||||
|
void downloadFinished();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
FileDownloader _downloader;
|
ModelType _type;
|
||||||
|
FileDownloader* _downloader;
|
||||||
QHash<QString, QString> _models;
|
QHash<QString, QString> _models;
|
||||||
|
|
||||||
bool parseXML(ModelType modelType);
|
bool parseXML(QByteArray xmlFile);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ListView : public QListView {
|
class ListView : public QListView {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
|
|
Loading…
Reference in a new issue