From 17b244ec81c12cd9c2fe14c7c5d07aa605a1374a Mon Sep 17 00:00:00 2001 From: mrbesen Date: Tue, 2 May 2023 21:31:17 +0200 Subject: [PATCH] import and export runes --- include/clipboardpopup.h | 33 ++++++++++++++++++ include/runepagelist.h | 2 ++ lolautoaccept.pro | 3 ++ src/clipboardpopup.cpp | 57 +++++++++++++++++++++++++++++++ src/runeeditor.cpp | 2 ++ src/runemanager.cpp | 2 -- src/runepagelist.cpp | 43 +++++++++++++++++++++++ ui/clipboardpopup.ui | 74 ++++++++++++++++++++++++++++++++++++++++ 8 files changed, 214 insertions(+), 2 deletions(-) create mode 100644 include/clipboardpopup.h create mode 100644 src/clipboardpopup.cpp create mode 100644 ui/clipboardpopup.ui diff --git a/include/clipboardpopup.h b/include/clipboardpopup.h new file mode 100644 index 0000000..c3f1b67 --- /dev/null +++ b/include/clipboardpopup.h @@ -0,0 +1,33 @@ +#pragma once + +#include + +namespace Ui { + class ClipboardPopup; +} + +class ClipboardPopup : public QDialog { + Q_OBJECT + +public: + enum class Direction { + Paste, + Copy + }; + + explicit ClipboardPopup(Direction dir, QWidget* parent = nullptr); + ~ClipboardPopup(); + + void setText(QString text); + QString getText() const; + +private slots: + void textPasted(); + void copyButton(); + +private: + Ui::ClipboardPopup *ui; + + Direction direction; + int lastKnownTextSize = 0; +}; diff --git a/include/runepagelist.h b/include/runepagelist.h index 5c2ca74..2a84188 100644 --- a/include/runepagelist.h +++ b/include/runepagelist.h @@ -50,6 +50,8 @@ private slots: void deleteCurrentItem(); void editCurrentItem(); void duplicateCurrentItem(); + void exportCurrentItem(); + void importItem(); private: void clearItems(); diff --git a/lolautoaccept.pro b/lolautoaccept.pro index a7f2bda..dd29453 100644 --- a/lolautoaccept.pro +++ b/lolautoaccept.pro @@ -43,6 +43,7 @@ SOURCES += \ src/clientaccess.cpp \ src/clientapi_json.cpp \ src/clientapi.cpp \ + src/clipboardpopup.cpp \ src/config.cpp \ src/datadragon.cpp \ src/datadragonimagecache.cpp \ @@ -75,6 +76,7 @@ HEADERS += \ include/champrow.h \ include/clientaccess.h \ include/clientapi.h \ + include/clipboardpopup.h \ include/config.h \ include/datadragon.h \ include/datadragonimagecache.h \ @@ -97,6 +99,7 @@ HEADERS += \ FORMS += \ ui/championsearch.ui \ + ui/clipboardpopup.ui \ ui/mainwindow.ui \ ui/runeaspektbutton.ui \ ui/runedisplay.ui \ diff --git a/src/clipboardpopup.cpp b/src/clipboardpopup.cpp new file mode 100644 index 0000000..2549a0c --- /dev/null +++ b/src/clipboardpopup.cpp @@ -0,0 +1,57 @@ +#include "clipboardpopup.h" +#include "ui_clipboardpopup.h" + +#include + +ClipboardPopup::ClipboardPopup(Direction dir, QWidget* parent) : QDialog(parent), ui(new Ui::ClipboardPopup), direction(dir) { + ui->setupUi(this); + + if(direction == Direction::Paste) { + this->ui->copyButton->hide(); + this->ui->text->setPlaceholderText(ClipboardPopup::tr("Paste here")); + this->ui->buttonBox->setStandardButtons(QDialogButtonBox::Cancel); + + QObject::connect(this->ui->text, &QTextEdit::textChanged, this, &ClipboardPopup::textPasted); + } else { + // copy + this->ui->text->setReadOnly(true); + } + + QObject::connect(this->ui->copyButton, &QPushButton::pressed, this, &ClipboardPopup::copyButton); +} + +ClipboardPopup::~ClipboardPopup() { + delete this->ui; +} + +void ClipboardPopup::textPasted() { + int newTextSize = this->getText().size(); + if(newTextSize - 1 > lastKnownTextSize && newTextSize > 1) { + // asume that something was pasted + accept(); + return; + } + + if(newTextSize > 0) { + this->ui->buttonBox->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Ok); + } + + lastKnownTextSize = newTextSize; +} + +void ClipboardPopup::setText(QString text) { + this->ui->text->setText(text); + this->ui->text->selectAll(); +} + +QString ClipboardPopup::getText() const { + return this->ui->text->toPlainText(); +} + +void ClipboardPopup::copyButton() { + QClipboard* clip = qApp->clipboard(); + clip->setText(this->ui->text->toPlainText()); + + // close this dialog + accept(); +} diff --git a/src/runeeditor.cpp b/src/runeeditor.cpp index fc4de05..3396de4 100644 --- a/src/runeeditor.cpp +++ b/src/runeeditor.cpp @@ -24,6 +24,8 @@ RuneEditor::~RuneEditor() { void RuneEditor::setClient(ClientAPI& client) { this->client = &client; + if(!this->client) return; + try { // build ui aspekts = client.getAllRuneAspekts(); diff --git a/src/runemanager.cpp b/src/runemanager.cpp index 6d0066e..76ea638 100644 --- a/src/runemanager.cpp +++ b/src/runemanager.cpp @@ -109,9 +109,7 @@ void RuneManager::loadRunes() { void RuneManager::setRunesEnabled(bool enabled) { this->ui->lblClientRunes->setEnabled(enabled); - this->ui->lblaaRunes->setEnabled(enabled); this->ui->listClientRunes->setEnabled(enabled); - this->ui->listaaRunes->setEnabled(enabled); } void RuneManager::saveRunePageClient(int id, QString name, const RunePage& rp) { diff --git a/src/runepagelist.cpp b/src/runepagelist.cpp index e01a53d..ae2318b 100644 --- a/src/runepagelist.cpp +++ b/src/runepagelist.cpp @@ -7,6 +7,7 @@ #include #include +#include "clipboardpopup.h" #include "datadragon.h" #include "runeeditor.h" @@ -79,6 +80,8 @@ void RunePageList::openContextMenu(const QPoint& pos) { menu.addAction(QIcon::fromTheme("edit-delete"), RunePageList::tr("Delete"), this, &RunePageList::deleteCurrentItem); menu.addAction(QIcon::fromTheme("document-open"), RunePageList::tr("Edit (Beta)"), this, &RunePageList::editCurrentItem); menu.addAction(QIcon::fromTheme("edit-copy"), RunePageList::tr("Duplicate"), this, &RunePageList::duplicateCurrentItem); + menu.addAction(QIcon::fromTheme("document-send"), RunePageList::tr("Export"), this, &RunePageList::exportCurrentItem); + menu.addAction(QIcon::fromTheme("document-new"), RunePageList::tr("Import"), this, &RunePageList::importItem); menu.exec(globalPos); } @@ -142,6 +145,46 @@ void RunePageList::duplicateCurrentItem() { emit runepageChanged(-1, name, *rp); } +void RunePageList::exportCurrentItem() { + QListWidgetItem* item = currentItem(); + if(!item) return; + + const RunePage* rp = (RunePage*) item->data(RolePointer).toULongLong(); + + Config::RunePageConfig rpc; + rpc.name = item->text(); + rpc.runepage = *rp; + + QJsonDocument rpcDoc(rpc); // cast to QJsonObject + QByteArray jsonBytes = rpcDoc.toJson(QJsonDocument::Compact).toBase64(); + QString runePageString = QString::fromLocal8Bit(jsonBytes); + + ClipboardPopup popup(ClipboardPopup::Direction::Copy); + popup.setText(runePageString); + popup.exec(); +} + +void RunePageList::importItem() { + ClipboardPopup popup(ClipboardPopup::Direction::Paste); + if(popup.exec() != QDialog::Accepted) { + return; + } + + QString text = popup.getText(); + QByteArray jsonBytes = QByteArray::fromBase64(text.toLocal8Bit()); + QJsonDocument rpcDoc = QJsonDocument::fromJson(jsonBytes); + if(rpcDoc.isObject()) { + QJsonObject rpcJson = rpcDoc.object(); + Config::RunePageConfig rpc = rpcJson; // implicit cast + + if(rpc.name.isEmpty() || !rpc.runepage) { + return; + } + + emit runepageChanged(-1, rpc.name, rpc.runepage); + } +} + void RunePageList::clearItems() { while(count()) { QListWidgetItem* item = takeItem(0); diff --git a/ui/clipboardpopup.ui b/ui/clipboardpopup.ui new file mode 100644 index 0000000..561a322 --- /dev/null +++ b/ui/clipboardpopup.ui @@ -0,0 +1,74 @@ + + + ClipboardPopup + + + + 0 + 0 + 400 + 300 + + + + Clipboard Text + + + + + + Qt::Horizontal + + + QDialogButtonBox::Close + + + + + + + Copy To Clipboard + + + + + + + + + + + + buttonBox + accepted() + ClipboardPopup + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + ClipboardPopup + reject() + + + 316 + 260 + + + 286 + 274 + + + + +