Oracle: download tokens; fix #915

This commit is contained in:
Fabio Bas 2015-07-07 20:06:14 +02:00
parent 685aa99ad6
commit 24aabc4cfe
2 changed files with 253 additions and 0 deletions

View file

@ -39,6 +39,8 @@
#define ALLSETS_URL "http://mtgjson.com/json/AllSets.json"
#endif
#define TOKENS_URL "https://raw.githubusercontent.com/Psithief/Cockatrice-tokens/master/tokens.xml"
OracleWizard::OracleWizard(QWidget *parent)
: QWizard(parent)
@ -57,6 +59,8 @@ OracleWizard::OracleWizard(QWidget *parent)
addPage(new IntroPage);
addPage(new LoadSetsPage);
addPage(new SaveSetsPage);
addPage(new LoadTokensPage);
addPage(new SaveTokensPage);
retranslateUi();
}
@ -100,6 +104,17 @@ void OracleWizard::disableButtons()
button(QWizard::BackButton)->setDisabled(true);
}
bool OracleWizard::saveTokensToFile(const QString & fileName)
{
QFile file(fileName);
if(!file.open(QIODevice::WriteOnly))
return false;
if(file.write(tokensData) == -1)
return false;
file.close();
return true;
}
IntroPage::IntroPage(QWidget *parent)
: OracleWizardPage(parent)
{
@ -529,3 +544,203 @@ bool SaveSetsPage::validatePage()
return true;
}
LoadTokensPage::LoadTokensPage(QWidget *parent)
: OracleWizardPage(parent), nam(0)
{
urlLabel = new QLabel(this);
urlLineEdit = new QLineEdit(this);
progressLabel = new QLabel(this);
progressBar = new QProgressBar(this);
urlButton = new QPushButton(this);
connect(urlButton, SIGNAL(clicked()), this, SLOT(actRestoreDefaultUrl()));
QGridLayout *layout = new QGridLayout(this);
layout->addWidget(urlLabel, 0, 0);
layout->addWidget(urlLineEdit, 0, 1);
layout->addWidget(urlButton, 1, 1, Qt::AlignRight);
layout->addWidget(progressLabel, 2, 0);
layout->addWidget(progressBar, 2, 1);
setLayout(layout);
}
void LoadTokensPage::initializePage()
{
urlLineEdit->setText(wizard()->settings->value("tokensurl", TOKENS_URL).toString());
progressLabel->hide();
progressBar->hide();
}
void LoadTokensPage::retranslateUi()
{
setTitle(tr("Tokens source selection"));
setSubTitle(tr("Please specify a source for the list of tokens. "
"You can specify an url address that will be download or "
"use an existing file from your computer."));
urlLabel->setText(tr("Download url:"));
urlButton->setText(tr("Restore default url"));
}
void LoadTokensPage::actRestoreDefaultUrl()
{
urlLineEdit->setText(TOKENS_URL);
}
bool LoadTokensPage::validatePage()
{
// once the import is finished, we call next(); skip validation
if(wizard()->hasTokensData())
return true;
QUrl url = QUrl::fromUserInput(urlLineEdit->text());
if(!url.isValid())
{
QMessageBox::critical(this, tr("Error"), tr("The provided url is not valid."));
return false;
}
progressLabel->setText(tr("Downloading (0MB)"));
// show an infinite progressbar
progressBar->setMaximum(0);
progressBar->setMinimum(0);
progressBar->setValue(0);
progressLabel->show();
progressBar->show();
wizard()->disableButtons();
setEnabled(false);
if(!nam)
nam = new QNetworkAccessManager(this);
QNetworkReply *reply = nam->get(QNetworkRequest(url));
connect(reply, SIGNAL(finished()), this, SLOT(actDownloadFinishedTokensFile()));
connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(actDownloadProgressTokensFile(qint64, qint64)));
return false;
}
void LoadTokensPage::actDownloadProgressTokensFile(qint64 received, qint64 total)
{
if(total > 0)
{
progressBar->setMaximum(total);
progressBar->setValue(received);
}
progressLabel->setText(tr("Downloading (%1MB)").arg((int) received / 1048576));
}
void LoadTokensPage::actDownloadFinishedTokensFile()
{
progressLabel->hide();
progressBar->hide();
// check for a reply
QNetworkReply *reply = static_cast<QNetworkReply *>(sender());
QNetworkReply::NetworkError errorCode = reply->error();
if (errorCode != QNetworkReply::NoError) {
QMessageBox::critical(this, tr("Error"), tr("Network error: %1.").arg(reply->errorString()));
wizard()->enableButtons();
setEnabled(true);
reply->deleteLater();
return;
}
// save allsets.json url, but only if the user customized it and download was successfull
if(urlLineEdit->text() != QString(TOKENS_URL))
wizard()->settings->setValue("tokensurl", urlLineEdit->text());
else
wizard()->settings->remove("tokensurl");
wizard()->setTokensData(reply->readAll());
reply->deleteLater();
wizard()->enableButtons();
setEnabled(true);
progressLabel->hide();
progressBar->hide();
wizard()->next();
}
SaveTokensPage::SaveTokensPage(QWidget *parent)
: OracleWizardPage(parent)
{
defaultPathCheckBox = new QCheckBox(this);
defaultPathCheckBox->setChecked(true);
QGridLayout *layout = new QGridLayout(this);
layout->addWidget(defaultPathCheckBox, 0, 0);
setLayout(layout);
}
void SaveTokensPage::retranslateUi()
{
setTitle(tr("Tokens imported"));
setSubTitle(tr("The tokens has been imported. "
"Press \"Save\" to save the imported tokens to the Cockatrice tokens database."));
defaultPathCheckBox->setText(tr("Save to the default path (recommended)"));
}
bool SaveTokensPage::validatePage()
{
bool ok = false;
const QString dataDir =
#if QT_VERSION < 0x050000
QDesktopServices::storageLocation(QDesktopServices::DataLocation);
#else
QStandardPaths::standardLocations(QStandardPaths::DataLocation).first();
#endif
QSettings* settings = new QSettings(this);
QString defaultPath = settings->value("paths/tokendatabase").toString();
QString windowName = tr("Save token database");
QString fileType = tr("XML; token database (*.xml)");
do {
QString fileName;
if (defaultPath.isEmpty()) {
if (defaultPathCheckBox->isChecked())
fileName = dataDir + "/tokens.xml";
else
fileName = QFileDialog::getSaveFileName(this, windowName, dataDir + "/tokens.xml", fileType);
settings->setValue("paths/tokendatabase", fileName);
}
else {
if (defaultPathCheckBox->isChecked())
fileName = defaultPath;
else
fileName = QFileDialog::getSaveFileName(this, windowName, defaultPath, fileType);
}
if (fileName.isEmpty()) {
return false;
}
QFileInfo fi(fileName);
QDir fileDir(fi.path());
if (!fileDir.exists() && !fileDir.mkpath(fileDir.absolutePath())) {
return false;
}
if (wizard()->saveTokensToFile(fileName))
{
ok = true;
QMessageBox::information(this,
tr("Success"),
tr("The token database has been saved successfully to\n%1").arg(fileName));
} else {
QMessageBox::critical(this, tr("Error"), tr("The file could not be saved to %1").arg(fileName));;
if (defaultPathCheckBox->isChecked())
defaultPathCheckBox->setChecked(false);
}
} while (!ok);
return true;
}

View file

@ -27,6 +27,9 @@ public:
void enableButtons();
void disableButtons();
void retranslateUi();
void setTokensData(QByteArray _tokensData) { tokensData = _tokensData; }
bool hasTokensData() { return !tokensData.isEmpty(); }
bool saveTokensToFile(const QString & fileName);
public:
OracleImporter *importer;
QSettings * settings;
@ -35,6 +38,7 @@ private slots:
private:
QStringList findQmFiles();
QString languageName(const QString &qmFile);
QByteArray tokensData;
protected:
void changeEvent(QEvent *event);
};
@ -115,4 +119,38 @@ private slots:
void updateTotalProgress(int cardsImported, int setIndex, const QString &setName);
};
class LoadTokensPage : public OracleWizardPage
{
Q_OBJECT
public:
LoadTokensPage(QWidget *parent = 0);
void retranslateUi();
protected:
void initializePage();
bool validatePage();
private:
QLabel *urlLabel;
QLineEdit *urlLineEdit;
QPushButton *urlButton;
QLabel *progressLabel;
QProgressBar * progressBar;
QNetworkAccessManager *nam;
private slots:
void actRestoreDefaultUrl();
void actDownloadProgressTokensFile(qint64 received, qint64 total);
void actDownloadFinishedTokensFile();
};
class SaveTokensPage : public OracleWizardPage
{
Q_OBJECT
public:
SaveTokensPage(QWidget *parent = 0);
void retranslateUi();
private:
QCheckBox * defaultPathCheckBox;
protected:
bool validatePage();
};
#endif