#include "tiercard.hpp" #include "fullsizelayout.hpp" #include "qmimedata.h" #include "utils.hpp" #include "settings.hpp" #include #include TierCard::IdType TierCard::getAvailableId() { for (IdType id = 1;; id++) { if (idMap.find(id) == idMap.end()) { return id; } } } void TierCard::releaseId(IdType id) { if (idMap.erase(id) == 0) { qDebug() << "Card id not found during destructor"; } } TierCard* TierCard::create(QWidget* parent) { TierCard* card; auto id = getAvailableId(); card = new TierCard(id, parent); idMap[id] = card; return card; } TierCard* TierCard::clone(TierCard *other, QWidget* parent) { TierCard* card; auto id = getAvailableId(); card = new TierCard(id, parent); card->setText(other->getText()); auto img = other->getImage(); if (!img.isNull()) card->setImage(img); card->setBgColor(other->getBgColor()); idMap[id] = card; return card; } TierCard::TierCard(IdType id, QWidget* parent) : QWidget{parent} { auto settings = Settings::get(); connect(settings, SIGNAL(cardSizeChange(QSize)), this, SLOT(cardResize(QSize))); background = new QWidget(); image = new AspectRatioPixmapLabel(); image->setAttribute(Qt::WA_TranslucentBackground); image->setAlignment(Qt::AlignCenter); textLabel = new QLabel(); idLabel = new QLabel(); textLabel->setWordWrap(true); // text_label->setTextFormat(Qt::RichText); textLabel->setAlignment(Qt::AlignHCenter | Qt::AlignTop); idLabel->setAlignment(Qt::AlignLeft | Qt::AlignBottom); textLabel->setAttribute(Qt::WA_TranslucentBackground); idLabel->setAttribute(Qt::WA_TranslucentBackground); textLabel->setObjectName("tierCardText"); idLabel->setObjectName("tierCardId"); idLabel->setText(QString::number(id)); auto layout = new FullSizeLayout(); layout->addWidget(background); layout->addWidget(image); layout->addWidget(textLabel); layout->addWidget(idLabel); this->setLayout(layout); cardResize(settings->cardSize()); } TierCard::~TierCard() { releaseId(getId()); // delete text_label; // text_label = nullptr; // delete id_label; // id_label = nullptr; } void TierCard::setText(QString str) { textLabel->setText(str); } QString TierCard::getText() const { return textLabel->text(); } uint32_t TierCard::getId() const { return static_cast(idLabel->text().toUInt()); } void TierCard::setBgColor(QColor color) { bgColor = color; auto str = makeBgColorString(color); background->setStyleSheet(str); } QColor TierCard::getBgColor() { return bgColor; } void TierCard::setImage(const QPixmap img) { // QMetaObject::invokeMethod() image->setPixmap(img); } QPixmap TierCard::getImage() const { return image->pixmap(); } void TierCard::mousePressEvent(QMouseEvent* event) { qDebug() << "mouse press event"; QPixmap pix(size()); render(&pix); QDrag drag(this); drag.setPixmap(pix); drag.setHotSpot(QPoint(pix.size().width() / 2, pix.size().height() / 2)); QByteArray itemData; QDataStream dataStream(&itemData, QIODevice::WriteOnly); TierCard::IdType _id = getId(); dataStream.writeRawData(reinterpret_cast(&_id), sizeof(_id)); QMimeData *mimeData = new QMimeData; mimeData->setData(MimeType, itemData); drag.setMimeData(mimeData); hide(); if (drag.exec() == Qt::MoveAction) { show(); } else { show(); } } TierCard* TierCard::getFromId(IdType id) { auto iter = idMap.find(id); if (iter == idMap.end()) return nullptr; return &(*iter->second); } void TierCard::cardResize(QSize newSize) { setFixedSize(newSize); }