added deckstats.net interface in deck editor, fixing issue #39

This commit is contained in:
Max-Wilhelm Bruker 2012-05-17 20:11:46 +02:00
parent 3ba3952604
commit 44d688b1d5
7 changed files with 99 additions and 1 deletions

View file

@ -62,6 +62,7 @@ SET(cockatrice_SOURCES
src/tab_userlists.cpp src/tab_userlists.cpp
src/tab_deck_editor.cpp src/tab_deck_editor.cpp
src/replay_timeline_widget.cpp src/replay_timeline_widget.cpp
src/deckstats_interface.cpp
src/chatview.cpp src/chatview.cpp
src/userlist.cpp src/userlist.cpp
src/userinfobox.cpp src/userinfobox.cpp
@ -137,6 +138,7 @@ SET(cockatrice_HEADERS
src/tab_userlists.h src/tab_userlists.h
src/tab_deck_editor.h src/tab_deck_editor.h
src/replay_timeline_widget.h src/replay_timeline_widget.h
src/deckstats_interface.h
src/chatview.h src/chatview.h
src/userlist.h src/userlist.h
src/userinfobox.h src/userinfobox.h

View file

@ -0,0 +1,53 @@
#include "deckstats_interface.h"
#include "decklist.h"
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QRegExp>
#include <QMessageBox>
#include <QDesktopServices>
DeckStatsInterface::DeckStatsInterface(QObject *parent)
: QObject(parent)
{
manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(queryFinished(QNetworkReply *)));
}
void DeckStatsInterface::queryFinished(QNetworkReply *reply)
{
if (reply->error() != QNetworkReply::NoError) {
QMessageBox::critical(0, tr("Error"), reply->errorString());
reply->deleteLater();
deleteLater();
return;
}
QString data(reply->readAll());
reply->deleteLater();
QRegExp rx("id=\"deckstats_deck_url\" value=\"([^\"]+)\"");
if (!rx.indexIn(data)) {
QMessageBox::critical(0, tr("Error"), tr("The reply from the server could not be parsed."));
deleteLater();
return;
}
QString deckUrl = rx.cap(1);
QDesktopServices::openUrl(deckUrl);
deleteLater();
}
void DeckStatsInterface::analyzeDeck(DeckList *deck)
{
QUrl params;
params.addQueryItem("deck", deck->writeToString_Plain());
QByteArray data;
data.append(params.encodedQuery());
QNetworkRequest request(QUrl("http://deckstats.net/index.php"));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
manager->post(request, data);
}

View file

@ -0,0 +1,21 @@
#ifndef DECKSTATS_INTERFACE_H
#define DECKSTATS_INTERFACE_H
#include <QObject>
class QNetworkAccessManager;
class QNetworkReply;
class DeckList;
class DeckStatsInterface : public QObject {
Q_OBJECT
private:
QNetworkAccessManager *manager;
private slots:
void queryFinished(QNetworkReply *reply);
public:
DeckStatsInterface(QObject *parent = 0);
void analyzeDeck(DeckList *deck);
};
#endif

View file

@ -29,6 +29,7 @@
#include "settingscache.h" #include "settingscache.h"
#include "priceupdater.h" #include "priceupdater.h"
#include "tab_supervisor.h" #include "tab_supervisor.h"
#include "deckstats_interface.h"
#include "abstractclient.h" #include "abstractclient.h"
#include "pending_command.h" #include "pending_command.h"
#include "pb/response.pb.h" #include "pb/response.pb.h"
@ -183,6 +184,8 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent)
aPrintDeck = new QAction(QString(), this); aPrintDeck = new QAction(QString(), this);
aPrintDeck->setShortcuts(QKeySequence::Print); aPrintDeck->setShortcuts(QKeySequence::Print);
connect(aPrintDeck, SIGNAL(triggered()), this, SLOT(actPrintDeck())); connect(aPrintDeck, SIGNAL(triggered()), this, SLOT(actPrintDeck()));
aAnalyzeDeck = new QAction(QString(), this);
connect(aAnalyzeDeck, SIGNAL(triggered()), this, SLOT(actAnalyzeDeck()));
aClose = new QAction(QString(), this); aClose = new QAction(QString(), this);
connect(aClose, SIGNAL(triggered()), this, SLOT(closeRequest())); connect(aClose, SIGNAL(triggered()), this, SLOT(closeRequest()));
@ -202,6 +205,8 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent)
deckMenu->addSeparator(); deckMenu->addSeparator();
deckMenu->addAction(aPrintDeck); deckMenu->addAction(aPrintDeck);
deckMenu->addSeparator(); deckMenu->addSeparator();
deckMenu->addAction(aAnalyzeDeck);
deckMenu->addSeparator();
deckMenu->addAction(aClose); deckMenu->addAction(aClose);
addTabMenu(deckMenu); addTabMenu(deckMenu);
@ -268,6 +273,7 @@ void TabDeckEditor::retranslateUi()
aLoadDeckFromClipboard->setText(tr("Load deck from cl&ipboard...")); aLoadDeckFromClipboard->setText(tr("Load deck from cl&ipboard..."));
aSaveDeckToClipboard->setText(tr("Save deck to clip&board")); aSaveDeckToClipboard->setText(tr("Save deck to clip&board"));
aPrintDeck->setText(tr("&Print deck...")); aPrintDeck->setText(tr("&Print deck..."));
aAnalyzeDeck->setText(tr("&Analyze deck on deckstats.net"));
aClose->setText(tr("&Close")); aClose->setText(tr("&Close"));
aClose->setShortcut(tr("Ctrl+Q")); aClose->setShortcut(tr("Ctrl+Q"));
@ -471,6 +477,12 @@ void TabDeckEditor::actPrintDeck()
dlg->exec(); dlg->exec();
} }
void TabDeckEditor::actAnalyzeDeck()
{
DeckStatsInterface *interface = new DeckStatsInterface(this); // it deletes itself when done
interface->analyzeDeck(deckModel->getDeckList());
}
void TabDeckEditor::actEditSets() void TabDeckEditor::actEditSets()
{ {
WndSets *w = new WndSets; WndSets *w = new WndSets;

View file

@ -44,6 +44,7 @@ private slots:
void actLoadDeckFromClipboard(); void actLoadDeckFromClipboard();
void actSaveDeckToClipboard(); void actSaveDeckToClipboard();
void actPrintDeck(); void actPrintDeck();
void actAnalyzeDeck();
void actEditSets(); void actEditSets();
void actEditTokens(); void actEditTokens();
@ -82,7 +83,7 @@ private:
DlgCardSearch *dlgCardSearch; DlgCardSearch *dlgCardSearch;
QMenu *deckMenu, *dbMenu; QMenu *deckMenu, *dbMenu;
QAction *aNewDeck, *aLoadDeck, *aSaveDeck, *aSaveDeckAs, *aLoadDeckFromClipboard, *aSaveDeckToClipboard, *aPrintDeck, *aClose; QAction *aNewDeck, *aLoadDeck, *aSaveDeck, *aSaveDeckAs, *aLoadDeckFromClipboard, *aSaveDeckToClipboard, *aPrintDeck, *aAnalyzeDeck, *aClose;
QAction *aEditSets, *aEditTokens, *aSearch, *aClearSearch; QAction *aEditSets, *aEditTokens, *aSearch, *aClearSearch;
QAction *aAddCard, *aAddCardToSideboard, *aRemoveCard, *aIncrement, *aDecrement, *aUpdatePrices; QAction *aAddCard, *aAddCardToSideboard, *aRemoveCard, *aIncrement, *aDecrement, *aUpdatePrices;

View file

@ -480,6 +480,14 @@ bool DeckList::saveToFile_Plain(QIODevice *device)
return saveToStream_Plain(out); return saveToStream_Plain(out);
} }
QString DeckList::writeToString_Plain()
{
QString result;
QTextStream out(&result);
saveToStream_Plain(out);
return result;
}
void DeckList::cleanList() void DeckList::cleanList()
{ {
root->clearTree(); root->clearTree();

View file

@ -144,6 +144,7 @@ public:
bool loadFromFile_Plain(QIODevice *device); bool loadFromFile_Plain(QIODevice *device);
bool saveToStream_Plain(QTextStream &stream); bool saveToStream_Plain(QTextStream &stream);
bool saveToFile_Plain(QIODevice *device); bool saveToFile_Plain(QIODevice *device);
QString writeToString_Plain();
void cleanList(); void cleanList();
bool isEmpty() const { return root->isEmpty() && name.isEmpty() && comments.isEmpty() && sideboardPlans.isEmpty(); } bool isEmpty() const { return root->isEmpty() && name.isEmpty() && comments.isEmpty() && sideboardPlans.isEmpty(); }