diff --git a/src/data/action/set.cpp b/src/data/action/set.cpp new file mode 100644 index 00000000..1a4fde67 --- /dev/null +++ b/src/data/action/set.cpp @@ -0,0 +1,81 @@ +//+----------------------------------------------------------------------------+ +//| Description: Magic Set Editor - Program to make Magic (tm) cards | +//| Copyright: (C) 2001 - 2006 Twan van Laarhoven | +//| License: GNU General Public License 2 or later (see file COPYING) | +//+----------------------------------------------------------------------------+ + +// ----------------------------------------------------------------------------- : Includes + +#include +#include +#include +#include + +// ----------------------------------------------------------------------------- : Add card + +AddCardAction::AddCardAction(Set& set) + : CardListAction(set), card(new Card(*set.game)) +{} + +AddCardAction::AddCardAction(Set& set, const CardP& card) + : CardListAction(set), card(card) +{} + +String AddCardAction::getName(bool to_undo) const { + return _("Add card"); +} + +void AddCardAction::perform(bool to_undo) { + if (!to_undo) { + set.cards.push_back(card); + } else { + assert(!set.cards.empty()); + set.cards.pop_back(); + } +} + + +// ----------------------------------------------------------------------------- : Remove card + +RemoveCardAction::RemoveCardAction(Set& set, const CardP& card) + : CardListAction(set), card(card) +{ + // find the card_id of the card we want to remove + vector::iterator it = find(set.cards.begin(), set.cards.end(), card); + if (it != set.cards.end()) { + card_id = it - set.cards.begin(); + } else { + throw InternalError(_("Card to remove not found in set")); + } +} + +String RemoveCardAction::getName(bool to_undo) const { + return _("Remove card"); +} + +void RemoveCardAction::perform(bool to_undo) { + if (!to_undo) { + assert(card_id < set.cards.size()); + set.cards.erase(set.cards.begin() + card_id); + } else { + assert(card_id <= set.cards.size()); + set.cards.insert(set.cards.begin() + card_id, card); + } +} + + +// ----------------------------------------------------------------------------- : Reorder cards + +ReorderCardsAction::ReorderCardsAction(Set& set, size_t card_id1, size_t card_id2) + : CardListAction(set), card_id1(card_id1), card_id2(card_id2) +{} + +String ReorderCardsAction::getName(bool to_undo) const { + return _("Reorder cards"); +} + +void ReorderCardsAction::perform(bool to_undo) { + assert(card_id1 < set.cards.size()); + assert(card_id2 < set.cards.size()); + swap(set.cards[card_id1], set.cards[card_id2]); +} diff --git a/src/data/action/set.hpp b/src/data/action/set.hpp new file mode 100644 index 00000000..638c25cc --- /dev/null +++ b/src/data/action/set.hpp @@ -0,0 +1,77 @@ +//+----------------------------------------------------------------------------+ +//| Description: Magic Set Editor - Program to make Magic (tm) cards | +//| Copyright: (C) 2001 - 2006 Twan van Laarhoven | +//| License: GNU General Public License 2 or later (see file COPYING) | +//+----------------------------------------------------------------------------+ + +#ifndef HEADER_DATA_ACTION_SET +#define HEADER_DATA_ACTION_SET + +/** @file data/action/set.hpp + * + * Actions operating on Sets + */ + +// ----------------------------------------------------------------------------- : Includes + +#include +#include + +class Set; +DECLARE_POINTER_TYPE(Card); + +// ----------------------------------------------------------------------------- : Add card + +/// An Action the changes the card list of a set +class CardListAction : public Action { + public: + inline CardListAction(Set& set) : set(set) {} + + protected: + Set& set; // the set owns this action, so the set will not be destroyed before this +}; + +/// Adding a new card to a set +class AddCardAction : public CardListAction { + public: + AddCardAction(Set& set); + AddCardAction(Set& set, const CardP& card); + + virtual String getName(bool to_undo) const; + virtual void perform(bool to_undo); + + private: + CardP card; ///< The new card +}; + +// ----------------------------------------------------------------------------- : Remove card + +/// Removing a card from a set +class RemoveCardAction : public CardListAction { + public: + RemoveCardAction(Set& set, const CardP& card); + + virtual String getName(bool to_undo) const; + virtual void perform(bool to_undo); + + private: + CardP card; ///< The removed card + size_t card_id; ///< Position of the card in the set +}; + +// ----------------------------------------------------------------------------- : Reorder cards + +/// Change the position of a card in the card list by swapping two cards +class ReorderCardsAction : public CardListAction { + public: + ReorderCardsAction(Set& set, size_t card_id1, size_t card_id2); + + virtual String getName(bool to_undo) const; + virtual void perform(bool to_undo); + + private: + size_t card_id1, card_id2; ///< Positions of the two cards to swap +}; + +// ----------------------------------------------------------------------------- : EOF +#endif