| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- /*
- * CardItem.cpp, part of VCMI engine
- *
- * Authors: listed in file AUTHORS in main folder
- *
- * License: GNU General Public License v2.0 or later
- * Full text of license available in license.txt file, in main folder
- *
- */
- #include "StdInc.h"
- #include "CardItem.h"
- #include <QObject>
- #include "../../../lib/constants/EntityIdentifiers.h"
- #include "../../../lib/constants/StringConstants.h"
- #include "../../../lib/rmg/CRmgTemplate.h"
- QDomElement CardItem::getElementById(const QDomDocument& doc, const QString& id)
- {
- QDomElement root = doc.documentElement();
- std::function<QDomElement(const QDomElement&)> findById = [&](const QDomElement& elem) -> QDomElement {
- if (elem.attribute("id") == id)
- return elem;
- QDomElement child = elem.firstChildElement();
- while (!child.isNull())
- {
- QDomElement found = findById(child);
- if (!found.isNull())
- return found;
- child = child.nextSiblingElement();
- }
- return QDomElement();
- };
- return findById(root);
- }
- bool isBlackTextNeeded(const QColor& bg)
- {
- int r = bg.red();
- int g = bg.green();
- int b = bg.blue();
- double luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;
- return luminance > 0.5;
- }
- CardItem::CardItem():
- selectCallback(nullptr),
- posChangeCallback(nullptr),
- useBlackText(false),
- mousePressed(false)
- {
- QFile file(":/icons/templateSquare.svg");
- file.open(QIODevice::ReadOnly);
- QByteArray data = file.readAll();
- doc.setContent(data);
- updateContent();
- }
- void CardItem::setSelectCallback(std::function<void(bool)> func)
- {
- selectCallback = func;
- }
- void CardItem::setPosChangeCallback(std::function<void(QPointF)> func)
- {
- posChangeCallback = func;
- }
- void CardItem::updateContent()
- {
- setSharedRenderer(new QSvgRenderer(doc.toByteArray()));
- }
- void CardItem::setFillColor(QColor color)
- {
- auto squareElem = getElementById(doc, "rect");
- squareElem.setAttribute("style", squareElem.attribute("style").replace(QRegularExpression("fill:.*?;"), "fill:" + color.name() + ";"));
- useBlackText = isBlackTextNeeded(color);
- }
- void CardItem::setMultiFillColor(QColor color1, QColor color2)
- {
- auto squareElem = getElementById(doc, "rect");
- squareElem.setAttribute("style", squareElem.attribute("style").replace(QRegularExpression("fill:.*?;"), "fill:url(#gradientExtra);"));
- auto gradientStopElem1 = getElementById(doc, "gradientExtraColorStop1");
- auto gradientStopElem2 = getElementById(doc, "gradientExtraColorStop2");
- auto gradientStopElem3 = getElementById(doc, "gradientExtraColorStop3");
- auto gradientStopElem4 = getElementById(doc, "gradientExtraColorStop4");
- auto gradientStopElem5 = getElementById(doc, "gradientExtraColorStop5");
- gradientStopElem1.setAttribute("style", gradientStopElem1.attribute("style").replace(QRegularExpression("stop-color:.*?;"), "stop-color:" + color1.name() + ";"));
- gradientStopElem2.setAttribute("style", gradientStopElem2.attribute("style").replace(QRegularExpression("stop-color:.*?;"), "stop-color:" + color2.name() + ";"));
- gradientStopElem3.setAttribute("style", gradientStopElem3.attribute("style").replace(QRegularExpression("stop-color:.*?;"), "stop-color:" + color1.name() + ";"));
- gradientStopElem4.setAttribute("style", gradientStopElem4.attribute("style").replace(QRegularExpression("stop-color:.*?;"), "stop-color:" + color2.name() + ";"));
- gradientStopElem5.setAttribute("style", gradientStopElem5.attribute("style").replace(QRegularExpression("stop-color:.*?;"), "stop-color:" + color1.name() + ";"));
- useBlackText = isBlackTextNeeded(color1);
- }
- void CardItem::setPlayerColor(PlayerColor color)
- {
- std::map<PlayerColor, std::pair<QString, QString>> colors =
- {
- { PlayerColor(0), { "#F80000", "#920000" } }, //red
- { PlayerColor(1), { "#0000F8", "#000092" } }, //blue
- { PlayerColor(2), { "#9B7251", "#35271C" } }, //tan
- { PlayerColor(3), { "#00FC00", "#009600" } }, //green
- { PlayerColor(4), { "#F88000", "#924B00" } }, //orange
- { PlayerColor(5), { "#F800F8", "#920092" } }, //purple
- { PlayerColor(6), { "#00FCF8", "#009694" } }, //teal
- { PlayerColor(7), { "#C07888", "#5A3840" } }, //pink
- };
- auto squareElem = getElementById(doc, "rect");
- squareElem.setAttribute("style", squareElem.attribute("style").replace(QRegularExpression("fill:.*?;"), "fill:url(#gradientPlayer);"));
- auto gradientStopElem1 = getElementById(doc, "gradientPlayerColorStop1");
- auto gradientStopElem2 = getElementById(doc, "gradientPlayerColorStop2");
- gradientStopElem1.setAttribute("style", gradientStopElem1.attribute("style").replace(QRegularExpression("stop-color:.*?;"), "stop-color:" + colors[color].first + ";"));
- gradientStopElem2.setAttribute("style", gradientStopElem2.attribute("style").replace(QRegularExpression("stop-color:.*?;"), "stop-color:" + colors[color].second + ";"));
- useBlackText = isBlackTextNeeded(QColor(colors[color].first));
- }
- void CardItem::setJunction(bool val)
- {
- auto squareElem = getElementById(doc, "rectJunction");
- squareElem.setAttribute("style", squareElem.attribute("style").replace(QRegularExpression("stroke-opacity:.*?;"), "stroke-opacity:" + QString::fromStdString(val ? "0.3" : "0.0") + ";"));
- }
- void CardItem::setId(int val)
- {
- auto textIdElem = getElementById(doc, "textId");
- textIdElem.setAttribute("style", textIdElem.attribute("style").replace(QRegularExpression("fill:.*?;"), "fill:" + QColor(useBlackText ? Qt::black : Qt::white).name() + ";"));
- textIdElem.firstChild().setNodeValue(QString::number(val));
- id = val;
- }
- int CardItem::getId()
- {
- return id;
- }
- void CardItem::setResAmount(GameResID res, int val)
- {
- auto textElem = getElementById(doc, "text" + QString::fromStdString(GameConstants::RESOURCE_NAMES[res]));
- textElem.setAttribute("style", textElem.attribute("style").replace(QRegularExpression("fill:.*?;"), "fill:" + QColor(useBlackText ? Qt::black : Qt::white).name() + ";"));
- textElem.firstChild().setNodeValue(val ? QString::number(val) : "");
- auto iconElem = getElementById(doc, "icon" + QString::fromStdString(GameConstants::RESOURCE_NAMES[res]));
- iconElem.setAttribute("opacity", val ? "1.0" : "0.1");
- }
- void CardItem::setChestValue(int val)
- {
- auto textElem = getElementById(doc, "textChest");
- textElem.setAttribute("style", textElem.attribute("style").replace(QRegularExpression("fill:.*?;"), "fill:" + QColor(useBlackText ? Qt::black : Qt::white).name() + ";"));
- textElem.firstChild().setNodeValue(val ? QString::number(val) : "");
- auto iconElem = getElementById(doc, "iconChest");
- iconElem.setAttribute("opacity", val ? "1.0" : "0.1");
- }
- void CardItem::setMonsterStrength(EMonsterStrength::EMonsterStrength val)
- {
- int level = 0;
- if(val == EMonsterStrength::ZONE_WEAK || val == EMonsterStrength::GLOBAL_WEAK)
- level = 1;
- else if(val == EMonsterStrength::ZONE_NORMAL || val == EMonsterStrength::GLOBAL_NORMAL)
- level = 2;
- else if(val == EMonsterStrength::ZONE_STRONG || val == EMonsterStrength::GLOBAL_STRONG)
- level = 3;
-
- getElementById(doc, "iconSword1").setAttribute("opacity", level > 0 ? "1.0" : "0.1");
- getElementById(doc, "iconSword2").setAttribute("opacity", level > 1 ? "1.0" : "0.1");
- getElementById(doc, "iconSword3").setAttribute("opacity", level > 2 ? "1.0" : "0.1");
- }
- void CardItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
- {
- if(event->button() == Qt::LeftButton)
- {
- // set element in grid
- double xx = x() + (boundingRect().width() / 2);
- double yy = y() + (boundingRect().height() / 2);
- xx = GRID_SIZE * round(xx / GRID_SIZE);
- yy = GRID_SIZE * round(yy / GRID_SIZE);
- setPos(xx - (boundingRect().width() / 2), yy - (boundingRect().height() / 2));
- }
- QGraphicsSvgItem::mouseReleaseEvent(event);
- if(posChangeCallback)
- posChangeCallback(pos());
- mousePressed = false;
- }
- void CardItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
- {
- QGraphicsSvgItem::mousePressEvent(event);
- mousePressed = true;
- }
- QVariant CardItem::itemChange(GraphicsItemChange change, const QVariant &value)
- {
- if(change == ItemSelectedHasChanged && selectCallback)
- selectCallback(isSelected());
- else if(change == ItemPositionHasChanged && posChangeCallback && mousePressed)
- posChangeCallback(pos());
- return QGraphicsSvgItem::itemChange(change, value);
- }
|