168 lines
3.8 KiB
C++
168 lines
3.8 KiB
C++
#include "tiercard.hpp"
|
|
#include "fullsizelayout.hpp"
|
|
#include "qmimedata.h"
|
|
#include "utils.hpp"
|
|
#include "settings.hpp"
|
|
|
|
#include <QVBoxLayout>
|
|
#include <QDrag>
|
|
|
|
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<uint32_t>(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<char*>(&_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);
|
|
}
|