Files
qTier/tiercard.cpp
2024-05-22 01:19:23 -05:00

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);
}