1 #include "dlg_load_deck_from_clipboard.h"
2 
3 #include "deck_loader.h"
4 #include "settingscache.h"
5 
6 #include <QApplication>
7 #include <QClipboard>
8 #include <QDialogButtonBox>
9 #include <QMessageBox>
10 #include <QPlainTextEdit>
11 #include <QPushButton>
12 #include <QTextStream>
13 #include <QVBoxLayout>
14 
DlgLoadDeckFromClipboard(QWidget * parent)15 DlgLoadDeckFromClipboard::DlgLoadDeckFromClipboard(QWidget *parent) : QDialog(parent), deckList(nullptr)
16 {
17     contentsEdit = new QPlainTextEdit;
18 
19     refreshButton = new QPushButton(tr("&Refresh"));
20     connect(refreshButton, SIGNAL(clicked()), this, SLOT(actRefresh()));
21 
22     QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
23     buttonBox->addButton(refreshButton, QDialogButtonBox::ActionRole);
24     connect(buttonBox, SIGNAL(accepted()), this, SLOT(actOK()));
25     connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
26 
27     auto *mainLayout = new QVBoxLayout;
28     mainLayout->addWidget(contentsEdit);
29     mainLayout->addWidget(buttonBox);
30 
31     setLayout(mainLayout);
32 
33     setWindowTitle(tr("Load deck from clipboard"));
34     resize(500, 500);
35 
36     actRefresh();
37     connect(&SettingsCache::instance().shortcuts(), SIGNAL(shortCutChanged()), this, SLOT(refreshShortcuts()));
38     refreshShortcuts();
39 }
40 
actRefresh()41 void DlgLoadDeckFromClipboard::actRefresh()
42 {
43     contentsEdit->setPlainText(QApplication::clipboard()->text());
44 }
45 
refreshShortcuts()46 void DlgLoadDeckFromClipboard::refreshShortcuts()
47 {
48     refreshButton->setShortcut(
49         SettingsCache::instance().shortcuts().getSingleShortcut("DlgLoadDeckFromClipboard/refreshButton"));
50 }
51 
actOK()52 void DlgLoadDeckFromClipboard::actOK()
53 {
54     QString buffer = contentsEdit->toPlainText();
55     QTextStream stream(&buffer);
56 
57     auto *deckLoader = new DeckLoader;
58     if (buffer.contains("<cockatrice_deck version=\"1\">")) {
59         if (deckLoader->loadFromString_Native(buffer)) {
60             deckList = deckLoader;
61             accept();
62         } else {
63             QMessageBox::critical(this, tr("Error"), tr("Invalid deck list."));
64             delete deckLoader;
65         }
66     } else if (deckLoader->loadFromStream_Plain(stream)) {
67         deckList = deckLoader;
68         accept();
69     } else {
70         QMessageBox::critical(this, tr("Error"), tr("Invalid deck list."));
71         delete deckLoader;
72     }
73 }
74