Add action to Edit Deck via Clipboard (#5681)

* implement functionality in dlg

* add action to deck editor

* refactor and comments

* is this refactor even a good idea?

* remove the friend class stuff

* reorder

* add option for not annotated
This commit is contained in:
RickyRister 2025-03-04 16:55:05 -08:00 committed by GitHub
parent 8fc1b22889
commit 2f415dcc6e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 237 additions and 54 deletions

View file

@ -2,6 +2,7 @@
#include "../deck/deck_loader.h"
#include "../settings/cache_settings.h"
#include "dlg_settings.h"
#include <QApplication>
#include <QCheckBox>
@ -13,17 +14,20 @@
#include <QTextStream>
#include <QVBoxLayout>
DlgLoadDeckFromClipboard::DlgLoadDeckFromClipboard(QWidget *parent) : QDialog(parent), deckList(nullptr)
/**
* Creates the main layout and connects the signals that are common to all versions of this window
*/
AbstractDlgDeckTextEdit::AbstractDlgDeckTextEdit(QWidget *parent) : QDialog(parent)
{
contentsEdit = new QPlainTextEdit;
refreshButton = new QPushButton(tr("&Refresh"));
connect(refreshButton, SIGNAL(clicked()), this, SLOT(actRefresh()));
connect(refreshButton, &QPushButton::clicked, this, &AbstractDlgDeckTextEdit::actRefresh);
QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
buttonBox->addButton(refreshButton, QDialogButtonBox::ActionRole);
connect(buttonBox, SIGNAL(accepted()), this, SLOT(actOK()));
connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
connect(buttonBox, &QDialogButtonBox::accepted, this, &AbstractDlgDeckTextEdit::actOK);
connect(buttonBox, &QDialogButtonBox::rejected, this, &AbstractDlgDeckTextEdit::reject);
loadSetNameAndNumberCheckBox = new QCheckBox(tr("Parse Set Name and Number (if available)"));
loadSetNameAndNumberCheckBox->setChecked(true);
@ -38,54 +42,57 @@ DlgLoadDeckFromClipboard::DlgLoadDeckFromClipboard(QWidget *parent) : QDialog(pa
setLayout(mainLayout);
setWindowTitle(tr("Load deck from clipboard"));
resize(500, 500);
actRefresh();
connect(&SettingsCache::instance().shortcuts(), SIGNAL(shortCutChanged()), this, SLOT(refreshShortcuts()));
connect(&SettingsCache::instance().shortcuts(), &ShortcutsSettings::shortCutChanged, this,
&AbstractDlgDeckTextEdit::refreshShortcuts);
refreshShortcuts();
}
void DlgLoadDeckFromClipboard::actRefresh()
{
contentsEdit->setPlainText(QApplication::clipboard()->text());
}
void DlgLoadDeckFromClipboard::refreshShortcuts()
void AbstractDlgDeckTextEdit::refreshShortcuts()
{
refreshButton->setShortcut(
SettingsCache::instance().shortcuts().getSingleShortcut("DlgLoadDeckFromClipboard/refreshButton"));
}
void DlgLoadDeckFromClipboard::actOK()
/**
* Replaces the contents of the contentsEdit with the given text.
* @param text The text
*/
void AbstractDlgDeckTextEdit::setText(const QString &text)
{
QString buffer = contentsEdit->toPlainText();
QTextStream stream(&buffer);
auto *deckLoader = new DeckLoader;
deckLoader->setParent(this);
if (buffer.contains("<cockatrice_deck version=\"1\">")) {
if (deckLoader->loadFromString_Native(buffer)) {
deckList = deckLoader;
accept();
} else {
QMessageBox::critical(this, tr("Error"), tr("Invalid deck list."));
}
} else if (deckLoader->loadFromStream_Plain(stream)) {
deckList = deckLoader;
if (loadSetNameAndNumberCheckBox->isChecked()) {
deckList->resolveSetNameAndNumberToProviderID();
} else {
deckList->clearSetNamesAndNumbers();
}
accept();
} else {
QMessageBox::critical(this, tr("Error"), tr("Invalid deck list."));
}
contentsEdit->setPlainText(text);
}
void DlgLoadDeckFromClipboard::keyPressEvent(QKeyEvent *event)
/**
* Tries to load the current contents of the contentsEdit into the DeckLoader
*
* @param deckLoader The DeckLoader to load the deck into
* @return Whether the loading was successful
*/
bool AbstractDlgDeckTextEdit::loadIntoDeck(DeckLoader *deckLoader) const
{
QString buffer = contentsEdit->toPlainText();
if (buffer.contains("<cockatrice_deck version=\"1\">")) {
return deckLoader->loadFromString_Native(buffer);
}
QTextStream stream(&buffer);
if (deckLoader->loadFromStream_Plain(stream)) {
if (loadSetNameAndNumberCheckBox->isChecked()) {
deckLoader->resolveSetNameAndNumberToProviderID();
} else {
deckLoader->clearSetNamesAndNumbers();
}
return true;
}
return false;
}
void AbstractDlgDeckTextEdit::keyPressEvent(QKeyEvent *event)
{
if (event->key() == Qt::Key_Return && event->modifiers() & Qt::ControlModifier) {
event->accept();
@ -93,4 +100,79 @@ void DlgLoadDeckFromClipboard::keyPressEvent(QKeyEvent *event)
return;
}
QDialog::keyPressEvent(event);
}
/**
* Creates the dialog window for the "Load deck from clipboard" action
*
* @param parent The parent widget
*/
DlgLoadDeckFromClipboard::DlgLoadDeckFromClipboard(QWidget *parent) : AbstractDlgDeckTextEdit(parent), deckList(nullptr)
{
setWindowTitle(tr("Load deck from clipboard"));
DlgLoadDeckFromClipboard::actRefresh();
}
void DlgLoadDeckFromClipboard::actRefresh()
{
setText(QApplication::clipboard()->text());
}
void DlgLoadDeckFromClipboard::actOK()
{
deckList = new DeckLoader;
deckList->setParent(this);
if (loadIntoDeck(deckList)) {
accept();
} else {
QMessageBox::critical(this, tr("Error"), tr("Invalid deck list."));
}
}
/**
* Creates the dialog window for the "Edit deck in clipboard" action
*
* @param deckList The existing deck in the deck editor. Copies the instance
* @param _annotated Whether to add annotations to the text that is loaded from the deck
* @param parent The parent widget
*/
DlgEditDeckInClipboard::DlgEditDeckInClipboard(const DeckLoader &deckList, bool _annotated, QWidget *parent)
: AbstractDlgDeckTextEdit(parent), annotated(_annotated)
{
setWindowTitle(tr("Edit deck in clipboard"));
deckLoader = new DeckLoader(deckList);
deckLoader->setParent(this);
DlgEditDeckInClipboard::actRefresh();
}
/**
* Loads the contents of the DeckList into a String. Always loads it with addSetNameAndNumber=true
* @param deckList The deck to load
* @param addComments Whether to add annotations
* @return A QString
*/
static QString deckListToString(const DeckLoader *deckList, bool addComments)
{
QString buffer;
QTextStream stream(&buffer);
deckList->saveToStream_Plain(stream, addComments);
return buffer;
}
void DlgEditDeckInClipboard::actRefresh()
{
setText(deckListToString(deckLoader, annotated));
}
void DlgEditDeckInClipboard::actOK()
{
if (loadIntoDeck(deckLoader)) {
accept();
} else {
QMessageBox::critical(this, tr("Error"), tr("Invalid deck list."));
}
}