mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-01-11 04:35:44 -08:00
[DeckList] Store sideboardPlans by value to fix crash (#6475)
This commit is contained in:
@@ -21,6 +21,8 @@ uint qHash(const QRegularExpression &key, uint seed) noexcept
|
||||
}
|
||||
#endif
|
||||
|
||||
static const QString CURRENT_SIDEBOARD_PLAN_KEY = "";
|
||||
|
||||
bool DeckList::Metadata::isEmpty() const
|
||||
{
|
||||
return name.isEmpty() && comments.isEmpty() && bannerCard.isEmpty() && tags.isEmpty();
|
||||
@@ -37,36 +39,23 @@ DeckList::DeckList(const QString &nativeString)
|
||||
|
||||
DeckList::DeckList(const Metadata &metadata,
|
||||
const DecklistNodeTree &tree,
|
||||
const QMap<QString, SideboardPlan *> &sideboardPlans)
|
||||
const QMap<QString, SideboardPlan> &sideboardPlans)
|
||||
: metadata(metadata), sideboardPlans(sideboardPlans), tree(tree)
|
||||
{
|
||||
}
|
||||
|
||||
DeckList::~DeckList()
|
||||
QList<MoveCard_ToZone> DeckList::getCurrentSideboardPlan() const
|
||||
{
|
||||
QMapIterator<QString, SideboardPlan *> i(sideboardPlans);
|
||||
while (i.hasNext())
|
||||
delete i.next().value();
|
||||
}
|
||||
if (!sideboardPlans.contains(CURRENT_SIDEBOARD_PLAN_KEY)) {
|
||||
return {};
|
||||
}
|
||||
|
||||
QList<MoveCard_ToZone> DeckList::getCurrentSideboardPlan()
|
||||
{
|
||||
SideboardPlan *current = sideboardPlans.value(QString(), 0);
|
||||
if (!current)
|
||||
return QList<MoveCard_ToZone>();
|
||||
else
|
||||
return current->getMoveList();
|
||||
return sideboardPlans.value(CURRENT_SIDEBOARD_PLAN_KEY).getMoveList();
|
||||
}
|
||||
|
||||
void DeckList::setCurrentSideboardPlan(const QList<MoveCard_ToZone> &plan)
|
||||
{
|
||||
SideboardPlan *current = sideboardPlans.value(QString(), 0);
|
||||
if (!current) {
|
||||
current = new SideboardPlan;
|
||||
sideboardPlans.insert(QString(), current);
|
||||
}
|
||||
|
||||
current->setMoveList(plan);
|
||||
sideboardPlans[CURRENT_SIDEBOARD_PLAN_KEY].setMoveList(plan);
|
||||
}
|
||||
|
||||
bool DeckList::readElement(QXmlStreamReader *xml)
|
||||
@@ -95,11 +84,9 @@ bool DeckList::readElement(QXmlStreamReader *xml)
|
||||
} else if (childName == "zone") {
|
||||
tree.readZoneElement(xml);
|
||||
} else if (childName == "sideboard_plan") {
|
||||
SideboardPlan *newSideboardPlan = new SideboardPlan;
|
||||
if (newSideboardPlan->readElement(xml)) {
|
||||
sideboardPlans.insert(newSideboardPlan->getName(), newSideboardPlan);
|
||||
} else {
|
||||
delete newSideboardPlan;
|
||||
SideboardPlan newSideboardPlan;
|
||||
if (newSideboardPlan.readElement(xml)) {
|
||||
sideboardPlans.insert(newSideboardPlan.getName(), newSideboardPlan);
|
||||
}
|
||||
}
|
||||
} else if (xml->isEndElement() && (childName == "cockatrice_deck")) {
|
||||
@@ -138,9 +125,8 @@ void DeckList::write(QXmlStreamWriter *xml) const
|
||||
tree.write(xml);
|
||||
|
||||
// Write sideboard plans
|
||||
QMapIterator<QString, SideboardPlan *> i(sideboardPlans);
|
||||
while (i.hasNext()) {
|
||||
i.next().value()->write(xml);
|
||||
for (auto &sideboardPlan : sideboardPlans.values()) {
|
||||
sideboardPlan.write(xml);
|
||||
}
|
||||
|
||||
xml->writeEndElement(); // Close "cockatrice_deck"
|
||||
|
||||
@@ -78,9 +78,9 @@ public:
|
||||
};
|
||||
|
||||
private:
|
||||
Metadata metadata; ///< Deck metadata that is stored in the deck file
|
||||
QMap<QString, SideboardPlan *> sideboardPlans; ///< Named sideboard plans.
|
||||
DecklistNodeTree tree; ///< The deck tree (zones + cards).
|
||||
Metadata metadata; ///< Deck metadata that is stored in the deck file
|
||||
QMap<QString, SideboardPlan> sideboardPlans; ///< Named sideboard plans.
|
||||
DecklistNodeTree tree; ///< The deck tree (zones + cards).
|
||||
|
||||
/**
|
||||
* @brief Cached deck hash, recalculated lazily.
|
||||
@@ -132,8 +132,7 @@ public:
|
||||
/// @brief Construct from components
|
||||
DeckList(const Metadata &metadata,
|
||||
const DecklistNodeTree &tree,
|
||||
const QMap<QString, SideboardPlan *> &sideboardPlans = {});
|
||||
virtual ~DeckList();
|
||||
const QMap<QString, SideboardPlan> &sideboardPlans = {});
|
||||
|
||||
/**
|
||||
* @brief Gets a pointer to the underlying node tree.
|
||||
@@ -186,9 +185,9 @@ public:
|
||||
|
||||
/// @name Sideboard plans
|
||||
///@{
|
||||
QList<MoveCard_ToZone> getCurrentSideboardPlan();
|
||||
QList<MoveCard_ToZone> getCurrentSideboardPlan() const;
|
||||
void setCurrentSideboardPlan(const QList<MoveCard_ToZone> &plan);
|
||||
const QMap<QString, SideboardPlan *> &getSideboardPlans() const
|
||||
const QMap<QString, SideboardPlan> &getSideboardPlans() const
|
||||
{
|
||||
return sideboardPlans;
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ bool SideboardPlan::readElement(QXmlStreamReader *xml)
|
||||
return false;
|
||||
}
|
||||
|
||||
void SideboardPlan::write(QXmlStreamWriter *xml)
|
||||
void SideboardPlan::write(QXmlStreamWriter *xml) const
|
||||
{
|
||||
xml->writeStartElement("sideboard_plan");
|
||||
xml->writeTextElement("name", name);
|
||||
|
||||
@@ -36,8 +36,7 @@ public:
|
||||
* @param _name The plan name.
|
||||
* @param _moveList Initial list of card move instructions.
|
||||
*/
|
||||
explicit SideboardPlan(const QString &_name = QString(),
|
||||
const QList<MoveCard_ToZone> &_moveList = QList<MoveCard_ToZone>());
|
||||
explicit SideboardPlan(const QString &_name = "", const QList<MoveCard_ToZone> &_moveList = {});
|
||||
|
||||
/**
|
||||
* @brief Read a SideboardPlan from an XML stream.
|
||||
@@ -50,7 +49,7 @@ public:
|
||||
* @brief Write this SideboardPlan to XML.
|
||||
* @param xml Stream to append the serialized element to.
|
||||
*/
|
||||
void write(QXmlStreamWriter *xml);
|
||||
void write(QXmlStreamWriter *xml) const;
|
||||
|
||||
/// @return The plan name.
|
||||
[[nodiscard]] QString getName() const
|
||||
|
||||
Reference in New Issue
Block a user