[DeckList] Store sideboardPlans by value to fix crash (#6475)

This commit is contained in:
RickyRister 2026-01-02 00:10:41 -08:00 committed by GitHub
parent 93a4647b04
commit 84e6907fa9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 23 additions and 39 deletions

View file

@ -21,6 +21,8 @@ uint qHash(const QRegularExpression &key, uint seed) noexcept
} }
#endif #endif
static const QString CURRENT_SIDEBOARD_PLAN_KEY = "";
bool DeckList::Metadata::isEmpty() const bool DeckList::Metadata::isEmpty() const
{ {
return name.isEmpty() && comments.isEmpty() && bannerCard.isEmpty() && tags.isEmpty(); return name.isEmpty() && comments.isEmpty() && bannerCard.isEmpty() && tags.isEmpty();
@ -37,36 +39,23 @@ DeckList::DeckList(const QString &nativeString)
DeckList::DeckList(const Metadata &metadata, DeckList::DeckList(const Metadata &metadata,
const DecklistNodeTree &tree, const DecklistNodeTree &tree,
const QMap<QString, SideboardPlan *> &sideboardPlans) const QMap<QString, SideboardPlan> &sideboardPlans)
: metadata(metadata), sideboardPlans(sideboardPlans), tree(tree) : metadata(metadata), sideboardPlans(sideboardPlans), tree(tree)
{ {
} }
DeckList::~DeckList() QList<MoveCard_ToZone> DeckList::getCurrentSideboardPlan() const
{ {
QMapIterator<QString, SideboardPlan *> i(sideboardPlans); if (!sideboardPlans.contains(CURRENT_SIDEBOARD_PLAN_KEY)) {
while (i.hasNext()) return {};
delete i.next().value(); }
}
QList<MoveCard_ToZone> DeckList::getCurrentSideboardPlan() return sideboardPlans.value(CURRENT_SIDEBOARD_PLAN_KEY).getMoveList();
{
SideboardPlan *current = sideboardPlans.value(QString(), 0);
if (!current)
return QList<MoveCard_ToZone>();
else
return current->getMoveList();
} }
void DeckList::setCurrentSideboardPlan(const QList<MoveCard_ToZone> &plan) void DeckList::setCurrentSideboardPlan(const QList<MoveCard_ToZone> &plan)
{ {
SideboardPlan *current = sideboardPlans.value(QString(), 0); sideboardPlans[CURRENT_SIDEBOARD_PLAN_KEY].setMoveList(plan);
if (!current) {
current = new SideboardPlan;
sideboardPlans.insert(QString(), current);
}
current->setMoveList(plan);
} }
bool DeckList::readElement(QXmlStreamReader *xml) bool DeckList::readElement(QXmlStreamReader *xml)
@ -95,11 +84,9 @@ bool DeckList::readElement(QXmlStreamReader *xml)
} else if (childName == "zone") { } else if (childName == "zone") {
tree.readZoneElement(xml); tree.readZoneElement(xml);
} else if (childName == "sideboard_plan") { } else if (childName == "sideboard_plan") {
SideboardPlan *newSideboardPlan = new SideboardPlan; SideboardPlan newSideboardPlan;
if (newSideboardPlan->readElement(xml)) { if (newSideboardPlan.readElement(xml)) {
sideboardPlans.insert(newSideboardPlan->getName(), newSideboardPlan); sideboardPlans.insert(newSideboardPlan.getName(), newSideboardPlan);
} else {
delete newSideboardPlan;
} }
} }
} else if (xml->isEndElement() && (childName == "cockatrice_deck")) { } else if (xml->isEndElement() && (childName == "cockatrice_deck")) {
@ -138,9 +125,8 @@ void DeckList::write(QXmlStreamWriter *xml) const
tree.write(xml); tree.write(xml);
// Write sideboard plans // Write sideboard plans
QMapIterator<QString, SideboardPlan *> i(sideboardPlans); for (auto &sideboardPlan : sideboardPlans.values()) {
while (i.hasNext()) { sideboardPlan.write(xml);
i.next().value()->write(xml);
} }
xml->writeEndElement(); // Close "cockatrice_deck" xml->writeEndElement(); // Close "cockatrice_deck"

View file

@ -78,9 +78,9 @@ public:
}; };
private: private:
Metadata metadata; ///< Deck metadata that is stored in the deck file Metadata metadata; ///< Deck metadata that is stored in the deck file
QMap<QString, SideboardPlan *> sideboardPlans; ///< Named sideboard plans. QMap<QString, SideboardPlan> sideboardPlans; ///< Named sideboard plans.
DecklistNodeTree tree; ///< The deck tree (zones + cards). DecklistNodeTree tree; ///< The deck tree (zones + cards).
/** /**
* @brief Cached deck hash, recalculated lazily. * @brief Cached deck hash, recalculated lazily.
@ -132,8 +132,7 @@ public:
/// @brief Construct from components /// @brief Construct from components
DeckList(const Metadata &metadata, DeckList(const Metadata &metadata,
const DecklistNodeTree &tree, const DecklistNodeTree &tree,
const QMap<QString, SideboardPlan *> &sideboardPlans = {}); const QMap<QString, SideboardPlan> &sideboardPlans = {});
virtual ~DeckList();
/** /**
* @brief Gets a pointer to the underlying node tree. * @brief Gets a pointer to the underlying node tree.
@ -186,9 +185,9 @@ public:
/// @name Sideboard plans /// @name Sideboard plans
///@{ ///@{
QList<MoveCard_ToZone> getCurrentSideboardPlan(); QList<MoveCard_ToZone> getCurrentSideboardPlan() const;
void setCurrentSideboardPlan(const QList<MoveCard_ToZone> &plan); void setCurrentSideboardPlan(const QList<MoveCard_ToZone> &plan);
const QMap<QString, SideboardPlan *> &getSideboardPlans() const const QMap<QString, SideboardPlan> &getSideboardPlans() const
{ {
return sideboardPlans; return sideboardPlans;
} }

View file

@ -44,7 +44,7 @@ bool SideboardPlan::readElement(QXmlStreamReader *xml)
return false; return false;
} }
void SideboardPlan::write(QXmlStreamWriter *xml) void SideboardPlan::write(QXmlStreamWriter *xml) const
{ {
xml->writeStartElement("sideboard_plan"); xml->writeStartElement("sideboard_plan");
xml->writeTextElement("name", name); xml->writeTextElement("name", name);

View file

@ -36,8 +36,7 @@ public:
* @param _name The plan name. * @param _name The plan name.
* @param _moveList Initial list of card move instructions. * @param _moveList Initial list of card move instructions.
*/ */
explicit SideboardPlan(const QString &_name = QString(), explicit SideboardPlan(const QString &_name = "", const QList<MoveCard_ToZone> &_moveList = {});
const QList<MoveCard_ToZone> &_moveList = QList<MoveCard_ToZone>());
/** /**
* @brief Read a SideboardPlan from an XML stream. * @brief Read a SideboardPlan from an XML stream.
@ -50,7 +49,7 @@ public:
* @brief Write this SideboardPlan to XML. * @brief Write this SideboardPlan to XML.
* @param xml Stream to append the serialized element to. * @param xml Stream to append the serialized element to.
*/ */
void write(QXmlStreamWriter *xml); void write(QXmlStreamWriter *xml) const;
/// @return The plan name. /// @return The plan name.
[[nodiscard]] QString getName() const [[nodiscard]] QString getName() const