[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
4 changed files with 23 additions and 39 deletions

View File

@@ -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"

View File

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

View File

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

View File

@@ -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