mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-06-12 09:04:53 -07:00
[DeckList] Store sideboardPlans by value to fix crash (#6475)
This commit is contained in:
parent
93a4647b04
commit
84e6907fa9
4 changed files with 23 additions and 39 deletions
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue