From d5c27a4842516b7ca1706bd54e9c2452ab78c053 Mon Sep 17 00:00:00 2001 From: twanvl Date: Sat, 30 Jun 2007 18:23:38 +0000 Subject: [PATCH] Card list colors are determined by a script instead of card_list_colors of a choice field (although that is still the default) git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@454 0fc631ac-6414-0410-93d0-97cfa31319b6 --- src/data/game.cpp | 23 ++++++++++++++++++++++- src/data/game.hpp | 4 ++++ src/data/statistics.cpp | 18 ++++++++++-------- src/gui/control/card_list.cpp | 21 +++++---------------- src/gui/control/card_list.hpp | 6 +----- src/script/to_value.hpp | 7 +++++-- src/script/value.cpp | 4 ---- 7 files changed, 47 insertions(+), 36 deletions(-) diff --git a/src/data/game.cpp b/src/data/game.cpp index 377a72e4..946c0519 100644 --- a/src/data/game.cpp +++ b/src/data/game.cpp @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -46,6 +47,7 @@ IMPLEMENT_REFLECTION(Game) { } REFLECT_NO_SCRIPT(default_set_style); REFLECT_NO_SCRIPT(card_fields); + REFLECT_NO_SCRIPT(card_list_color_script); REFLECT_NO_SCRIPT(statistics_dimensions); REFLECT_NO_SCRIPT(statistics_categories); REFLECT_NO_SCRIPT(pack_types); @@ -79,7 +81,26 @@ void Game::validate(Version v) { } } -void addStatsDimensionsForFields(); +void Game::initCardListColorScript() { + if (card_list_color_script) return; // already done + // find a field with choice_colors_cardlist + FOR_EACH(s, card_fields) { + ChoiceFieldP cf = dynamic_pointer_cast(s); + if (cf && !cf->choice_colors_cardlist.empty()) { + // found the field to use + // initialize script: field.colors[card.field-name] or else rgb(0,0,0) + Script& s = card_list_color_script.getScript(); + s.addInstruction(I_PUSH_CONST, to_script(&cf->choice_colors_cardlist)); + s.addInstruction(I_GET_VAR, string_to_variable(_("card"))); + s.addInstruction(I_MEMBER_C, cf->name); + s.addInstruction(I_BINARY, I_MEMBER); + s.addInstruction(I_PUSH_CONST, to_script(Color(0,0,0))); + s.addInstruction(I_BINARY, I_OR_ELSE); + s.addInstruction(I_RET); + return; + } + } +} // special behaviour of reading/writing GamePs: only read/write the name diff --git a/src/data/game.hpp b/src/data/game.hpp index 7d67f6a7..8d52515e 100644 --- a/src/data/game.hpp +++ b/src/data/game.hpp @@ -39,6 +39,7 @@ class Game : public Packaged { vector set_fields; ///< Fields for set information IndexMap default_set_style; ///< Default style for the set fields, because it is often the same vector card_fields; ///< Fields on each card + OptionalScript card_list_color_script; ///< Script that determines the color of items in the card list vector statistics_dimensions; ///< (Additional) statistics dimensions vector statistics_categories; ///< (Additional) statistics categories vector pack_types; ///< Types of random card packs to generate @@ -59,6 +60,9 @@ class Game : public Packaged { /// Is this Magic the Gathering? bool isMagic() const; + /// Initialize card_list_color_script + void initCardListColorScript(); + static String typeNameStatic(); virtual String typeName() const; diff --git a/src/data/statistics.cpp b/src/data/statistics.cpp index 944faf60..3d6ef1f7 100644 --- a/src/data/statistics.cpp +++ b/src/data/statistics.cpp @@ -14,6 +14,8 @@ DECLARE_TYPEOF_COLLECTION(String); DECLARE_TYPEOF_COLLECTION(StatsDimensionP); DECLARE_TYPEOF_COLLECTION(ChoiceField::ChoiceP); +extern ScriptValueP script_primary_choice; + // ----------------------------------------------------------------------------- : Statistics dimension StatsDimension::StatsDimension() @@ -44,19 +46,19 @@ StatsDimension::StatsDimension(const Field& field) FOR_EACH_CONST(g, choice_field->choices->choices) { groups.push_back(g->name); } - // initialize script, primary_choice(card.{field_name}) + // initialize script: primary_choice(card.{field_name}) Script& s = script.getScript(); - s.addInstruction(I_GET_VAR, string_to_variable(_("primary choice"))); - s.addInstruction(I_GET_VAR, string_to_variable(_("card"))); - s.addInstruction(I_MEMBER_C, field.name); - s.addInstruction(I_CALL, 1); - s.addInstruction(I_NOP, string_to_variable(_("input"))); + s.addInstruction(I_PUSH_CONST, script_primary_choice); + s.addInstruction(I_GET_VAR, string_to_variable(_("card"))); + s.addInstruction(I_MEMBER_C, field.name); + s.addInstruction(I_CALL, 1); + s.addInstruction(I_NOP, string_to_variable(_("input"))); s.addInstruction(I_RET); } else { // initialize script, card.{field_name} Script& s = script.getScript(); - s.addInstruction(I_GET_VAR, string_to_variable(_("card"))); - s.addInstruction(I_MEMBER_C, field.name); + s.addInstruction(I_GET_VAR, string_to_variable(_("card"))); + s.addInstruction(I_MEMBER_C, field.name); s.addInstruction(I_RET); } } diff --git a/src/gui/control/card_list.cpp b/src/gui/control/card_list.cpp index 78413fca..e84e2dc0 100644 --- a/src/gui/control/card_list.cpp +++ b/src/gui/control/card_list.cpp @@ -185,6 +185,8 @@ void CardListBase::rebuild() { selected_item_pos = -1; onRebuild(); if (!set) return; + // init stuff + set->game->initCardListColorScript(); // determine column order map new_column_fields; FOR_EACH(f, set->game->card_fields) { @@ -205,8 +207,6 @@ void CardListBase::rebuild() { align, cs.width); column_fields.push_back(f.second); } - // find field that determines color - color_field = findColorField(); // determine sort settings GameSettings& gs = settings.gameSettingsFor(*set->game); sort_ascending = gs.sort_cards_ascending; @@ -224,16 +224,6 @@ void CardListBase::rebuild() { refreshList(); } -ChoiceFieldP CardListBase::findColorField() { - FOR_EACH(s, set->game->card_fields) { - ChoiceFieldP cf = dynamic_pointer_cast(s); - if (cf && !cf->choice_colors_cardlist.empty()) { - return cf; - } - } - return ChoiceFieldP(); -} - // ----------------------------------------------------------------------------- : CardListBase : Columns void CardListBase::storeColumns() { @@ -279,10 +269,9 @@ int CardListBase::OnGetItemImage(long pos) const { } wxListItemAttr* CardListBase::OnGetItemAttr(long pos) const { - if (!color_field) return nullptr; - ChoiceValueP val = static_pointer_cast( getCard(pos)->data[color_field]); - assert(val); - item_attr.SetTextColour(color_field->choice_colors_cardlist[val->value()]); // if it doesn't exist we get black + if (!set->game->card_list_color_script) return nullptr; + Context& ctx = set->getContext(getCard(pos)); + item_attr.SetTextColour(*set->game->card_list_color_script.invoke(ctx)); return &item_attr; } diff --git a/src/gui/control/card_list.hpp b/src/gui/control/card_list.hpp index 9d991760..d45c0bb9 100644 --- a/src/gui/control/card_list.hpp +++ b/src/gui/control/card_list.hpp @@ -104,14 +104,10 @@ class CardListBase : public ItemList, public SetView { // --------------------------------------------------- : Data private: // display stuff - ChoiceFieldP color_field; ///< Field to use for text color (optional) - vector column_fields; ///< The field to use for each column (by column index) + vector column_fields; ///< The field to use for each column (by column index) mutable wxListItemAttr item_attr; // for OnGetItemAttr - /// Find the field that determines the color, if any. - ChoiceFieldP findColorField(); - public: /// Open a dialog for selecting columns to be shown void selectColumns(); diff --git a/src/script/to_value.hpp b/src/script/to_value.hpp index 76048cef..6c06d5d0 100644 --- a/src/script/to_value.hpp +++ b/src/script/to_value.hpp @@ -61,6 +61,9 @@ class ScriptDelayedError : public ScriptValue { ScriptError error; // the error message }; +inline ScriptValueP delayError(const String& m) { + return new_intrusive1(ScriptError(m)); +} // ----------------------------------------------------------------------------- : Iterators @@ -129,7 +132,7 @@ ScriptValueP get_member(const map& m, const String& name) { if (it != m.end()) { return to_script(it->second); } else { - throw ScriptError(_ERROR_2_("has no member", _TYPE_("collection"), name)); + return delayError(_ERROR_2_("has no member", _TYPE_("collection"), name)); } } @@ -139,7 +142,7 @@ ScriptValueP get_member(const IndexMap& m, const String& name) { if (it != m.end()) { return to_script(*it); } else { - throw ScriptError(_ERROR_2_("has no member", _TYPE_("collection"), name)); + return delayError(_ERROR_2_("has no member", _TYPE_("collection"), name)); } } diff --git a/src/script/value.cpp b/src/script/value.cpp index 80316cf6..72580f6a 100644 --- a/src/script/value.cpp +++ b/src/script/value.cpp @@ -14,10 +14,6 @@ // ----------------------------------------------------------------------------- : ScriptValue // Base cases -inline ScriptValueP delayError(const String& m) { - return new_intrusive1(ScriptError(m)); -} - ScriptValue::operator String() const { return _("[[") + typeName() + _("]]"); } ScriptValue::operator int() const { throw ScriptError(_ERROR_2_("can't convert", typeName(), _TYPE_("integer" ))); } ScriptValue::operator double() const { throw ScriptError(_ERROR_2_("can't convert", typeName(), _TYPE_("real" ))); }