lolautoaccept/src/runepagelist.cpp

176 lines
4.5 KiB
C++

#include "runepagelist.h"
#include "ui_runepagelist.h"
#include <QDebug>
#include <QDropEvent>
#include <QMenu>
#include <QMimeData>
#include <QTextStream>
#include "datadragon.h"
RunePageList::RunePageList(QWidget* parent) : QListWidget(parent), ui(new Ui::RunePageList) {
ui->setupUi(this);
QObject::connect(this, &QListWidget::itemChanged, this, &RunePageList::itemChangedCallback);
QObject::connect(this, &QListWidget::customContextMenuRequested, this, &RunePageList::openContextMenu);
}
RunePageList::~RunePageList() {
delete this->ui;
}
void RunePageList::loadRunePages(const std::vector<ClientAPI::RunePage>& pages) {
clearItems();
for(const ClientAPI::RunePage& rp : pages) {
addRunepageItem(QString::fromStdString(rp.name), rp.id, rp.runepage, rp.isCurrent);
}
}
void RunePageList::loadRunePages(const std::vector<std::shared_ptr<Config::RunePageConfig>>& pages) {
clearItems();
for(size_t i = 0; i < pages.size(); ++i) {
std::shared_ptr<Config::RunePageConfig> rp = pages.at(i);
addRunepageItem(rp->name, i, rp->runepage);
}
}
void RunePageList::setRuneInfos(const std::vector<RuneAspekt>& runeInfo, const std::vector<RuneStyle>& runeStyles) {
this->runeInfo = &runeInfo;
this->runeStyles = &runeStyles;
}
void RunePageList::dropEvent(QDropEvent* event) {
qDebug() << "drop event";
if(event->source() == nullptr || event->source() != other) {
event->ignore();
return;
}
auto selected = other->selectedItems();
if(selected.size() != 1) {
event->ignore();
return;
}
QListWidgetItem* item = selected.at(0);
qDebug() << "data: " << item->data(RoleId);
// compare rune pages for duplicates?
// QListWidget::dropEvent(event);
// save change
QString name = item->text();
const RunePage* oldPage = (RunePage*) item->data(RolePointer).toULongLong();
emit runepageChanged(-1, name, *oldPage);
}
void RunePageList::itemChangedCallback(QListWidgetItem* item) {
int pageId = item->data(RunePageList::RoleId).toUInt();
QString newName = item->text();
const ::RunePage* page = (::RunePage*) item->data(RunePageList::RolePointer).toULongLong();
emit runepageChanged(pageId, newName, *page);
}
void RunePageList::openContextMenu(const QPoint& pos) {
QPoint globalPos = mapToGlobal(pos);
QMenu menu;
menu.addAction(QIcon::fromTheme("edit-delete"), RunePageList::tr("Delete"), this, &RunePageList::deleteCurrentItem);
menu.exec(globalPos);
}
void RunePageList::deleteCurrentItem() {
QListWidgetItem* item = currentItem();
if (item) {
uint32_t id = item->data(RoleId).toUInt();
RunePage* page = (RunePage*) item->data(RolePointer).toULongLong();
removeItemWidget(item);
delete item;
delete page;
emit runepageDeleted(id);
}
}
void RunePageList::clearItems() {
while(count()) {
QListWidgetItem* item = takeItem(0);
delete (RunePage*) item->data(RolePointer).toULongLong();
delete item;
}
clear();
}
void RunePageList::addRunepageItem(QString name, int id, const ::RunePage& rp, bool isCurrent) {
QListWidgetItem* item = new QListWidgetItem(name);
item->setData(RoleId, (uint) id);
item->setData(RolePointer, (qulonglong) new ::RunePage(rp));
if(dd) {
const DataDragon::ChampData& champData = dd->getBestMatchingChamp(name.toStdString());
if(champData.key != -1) {
QPixmap iamge = dd->getImage(champData.id);
item->setIcon(iamge);
}
}
QString tooltipStr;
if(id != -1) {
tooltipStr = QString("id: %0\n").arg(id);
}
tooltipStr += getRuneDescription(rp);
item->setToolTip(tooltipStr);
item->setFlags(item->flags() | Qt::ItemIsEditable);
if(isCurrent) {
item->setSelected(true);
}
addItem(item);
}
QString RunePageList::getRuneDescription(const ::RunePage& runepage) {
QString outStr;
outStr.reserve(100);
QTextStream out(&outStr);
if(! (bool) runepage) {
return {};
}
out << getRuneStyleByID(runepage.primaryStyle) << ' ' << RunePageList::tr("with") << ' ' << getRuneStyleByID(runepage.secondaryStyle);
for(uint32_t rune : runepage.selectedAspects) {
out << '\n' << getRuneText(rune);
}
return outStr;
}
QString RunePageList::getRuneText(uint32_t id) {
if(runeInfo != nullptr) {
for(const RuneAspekt& ra : *runeInfo) {
if(ra.id == id) {
return QString::fromStdString(ra.name);
}
}
}
return QString("(%0)").arg(id);
}
QString RunePageList::getRuneStyleByID(uint32_t id) {
if(runeStyles != nullptr) {
auto it = std::find_if(runeStyles->begin(), runeStyles->end(), [id](const RuneStyle& rs) { return rs.id == id; });
if(it != runeStyles->end()) {
return QString::fromStdString(it->name);
}
}
return QString("(%0)").arg(id);
}