#include "tierrow.hpp" #include "fullsizelayout.hpp" #include "qmimedata.h" #include "utils.hpp" #include TierRow::TierRow(IdType id, QWidget *parent) : QWidget{parent} { setAcceptDrops(true); auto fadeLayout = new FullSizeLayout(); fadeLayout->setSizeConstraint(QLayout::SetMinimumSize); fadeLayout->setContentsMargins(0, 0, 0, 0); fadeLayout->setSpacing(0); bgFadeContainer = new QWidget(); bgFadeContainer->setStyleSheet(makeBgColorString(QColor(255,255,255,100))); bgFadeContainer->setMinimumSize(0, 0); fadeLayout->addWidget(bgFadeContainer); this->setLayout(fadeLayout); auto splitLayout = new QHBoxLayout(); splitLayout->setSizeConstraint(QLayout::SetMinimumSize); splitLayout->setContentsMargins(0, 0, 0, 0); splitLayout->setSpacing(0); titleCard = new TierRowTitleCard(id); cardContainer = new QWidget(); cardContainer->setMinimumSize(0, 0); titleCard->setFixedSize(150, 150); cardContainer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); splitLayout->addWidget(titleCard, 0, Qt::AlignLeft | Qt::AlignTop); splitLayout->addWidget(cardContainer, 1, Qt::AlignTop); cardContainer->setStyleSheet(makeBgColorString(QColor(60,60,60,100))); bgFadeContainer->setLayout(splitLayout); cardLayout = new FlowLayout(); cardLayout->setSizeConstraint(QLayout::SetMinimumSize); cardLayout->setContentsMargins(0, 0, 0, 0); cardLayout->setSpacing(0); cardContainer->setLayout(cardLayout); // setMinimumSize(0, 0); } TierRow::~TierRow() { qDebug() << "Row destructor called " << id(); if (idMap.erase(id()) == 0) { qDebug() << "Row id not found during destructor"; } } void TierRow::addCard(TierCard* card) { cardContainer->layout()->addWidget(card); } // TierCard* TierRow::takeCard(uint32_t id) // { // for (auto i : cardContainer->children()) // } void TierRow::setColor(QColor color) { _color = color; titleCard->setColor(color); auto str = makeBgColorString(color); setStyleSheet(str); } QColor TierRow::color() { return _color; } void TierRow::setText(QString text) { titleCard->setText(text); } QString TierRow::text() { return titleCard->text(); } uint32_t TierRow::id() { return titleCard->id(); } void TierRow::resizeEvent(QResizeEvent* event) { this->QWidget::resizeEvent(event); recalcMaxHeight(); } void TierRow::recalcMaxHeight() { setMaximumHeight(cardLayout->totalMinimumHeightForWidth(cardContainer->width())); } TierRow* TierRow::create(QWidget* parent) { TierRow* row; for (IdType id = 1;; id++) { if (idMap.find(id) == idMap.end()) { row = new TierRow(id, parent); idMap[id] = row; return row; } } } TierRow* TierRow::getFromId(IdType id) { auto iter = idMap.find(id); if (iter == idMap.end()) { return nullptr; } return iter->second; } void TierRow::dropEvent(QDropEvent *event) { qDebug() << "drop event"; //card dragged to this row if (event->mimeData()->hasFormat(TierCard::MimeType)) { if (event->proposedAction() == Qt::MoveAction) { auto data = event->mimeData()->data(TierCard::MimeType); QDataStream stream(&data, QIODevice::ReadOnly); TierCard::IdType cardId; uint dataLen = 0; stream.readRawData(reinterpret_cast(&cardId), dataLen); auto card = TierCard::getFromId(cardId); addCard(card); event->acceptProposedAction(); } else { event->ignore(); } } //image(s) dragged to make new card(s) else if (event->mimeData()->hasImage()) { } } void TierRow::dragEnterEvent(QDragEnterEvent *event) { qDebug() << "drag enter event"; if (event->mimeData()->hasFormat(TierCard::MimeType)) { if (event->proposedAction() == Qt::MoveAction) { event->setDropAction(Qt::MoveAction); event->accept(cardContainer->rect()); } else { event->setDropAction(Qt::MoveAction); event->accept(cardContainer->geometry()); } } else if (event->mimeData()->hasImage()) { event->setDropAction(Qt::CopyAction); event->accept(); } else { event->ignore(); } } void TierRow::dragMoveEvent(QDragMoveEvent *event) { qDebug() << "drag move event"; if (event->mimeData()->hasFormat(TierCard::MimeType)) { if (event->proposedAction() == Qt::MoveAction) { event->acceptProposedAction(); } else { event->setDropAction(Qt::MoveAction); event->accept(cardContainer->geometry()); } } else if (event->mimeData()->hasImage()) { event->setDropAction(Qt::CopyAction); event->accept(); } else { event->ignore(); } }