From 2ba1d0b1b815dfcb40ae7820bb8705b2d4b43246 Mon Sep 17 00:00:00 2001 From: twanvl Date: Thu, 21 Dec 2006 21:56:49 +0000 Subject: [PATCH] events on script update; fix in cycle_sort; card list updated on value action git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@136 0fc631ac-6414-0410-93d0-97cfa31319b6 --- src/data/action/value.cpp | 9 +++++++++ src/data/action/value.hpp | 15 +++++++++++++++ src/data/set.cpp | 2 ++ src/gui/control/card_list.cpp | 9 +++++++++ src/script/functions.cpp | 2 +- src/script/script_manager.cpp | 10 +++++----- src/script/script_manager.hpp | 11 ++++++----- 7 files changed, 47 insertions(+), 11 deletions(-) diff --git a/src/data/action/value.cpp b/src/data/action/value.cpp index 353cd524..6c638de9 100644 --- a/src/data/action/value.cpp +++ b/src/data/action/value.cpp @@ -141,3 +141,12 @@ TextValueAction* typing_action(const TextValueP& value, size_t start, size_t end } } +// ----------------------------------------------------------------------------- : Event + +String ScriptValueEvent::getName(bool) const { + assert(false); // this action is just an event, getName shouldn't be called + throw InternalError(_("ScriptValueEvent::getName")); +} +void ScriptValueEvent::perform(bool) { + assert(false); // this action is just an event, it should not be performed +} diff --git a/src/data/action/value.hpp b/src/data/action/value.hpp index 426fc62b..1300ce1e 100644 --- a/src/data/action/value.hpp +++ b/src/data/action/value.hpp @@ -18,6 +18,7 @@ #include #include +class Card; DECLARE_POINTER_TYPE(Value); DECLARE_POINTER_TYPE(TextValue); DECLARE_POINTER_TYPE(ChoiceValue); @@ -72,5 +73,19 @@ TextValueAction* toggle_format_action(const TextValueP& value, const String& tag /// Typing in a TextValue, replace the selection [start...end) with replacement TextValueAction* typing_action(const TextValueP& value, size_t start, size_t end, const String& replacement, const String& action_name); +// ----------------------------------------------------------------------------- : Event + +/// Notification that a script caused a value to change +class ScriptValueEvent : public Action { + public: + inline ScriptValueEvent(const Card* card, const Value* value) : card(card), value(value) {} + + virtual String getName(bool to_undo) const; + virtual void perform(bool to_undo); + + const Card* card; ///< Card the value is on + const Value* value; ///< The modified value +}; + // ----------------------------------------------------------------------------- : EOF #endif diff --git a/src/data/set.cpp b/src/data/set.cpp index ce67cea5..b86fb80e 100644 --- a/src/data/set.cpp +++ b/src/data/set.cpp @@ -99,6 +99,8 @@ void Set::validate(Version file_app_version) { FOR_EACH(v, s.second->data) fix_value_207(v); } */ } + // update scripts + script_manager->updateAll(); } IMPLEMENT_REFLECTION(Set) { diff --git a/src/gui/control/card_list.cpp b/src/gui/control/card_list.cpp index 24736dc0..a99ccaa3 100644 --- a/src/gui/control/card_list.cpp +++ b/src/gui/control/card_list.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -97,6 +98,14 @@ void CardListBase::onAction(const Action& action, bool undone) { RefreshItem((long)action.card_id1); RefreshItem((long)action.card_id2); } + TYPE_CASE_(action, ScriptValueEvent) { + // No refresh needed, a ScriptValueEvent is only generated in response to a ValueAction + return; + } + TYPE_CASE_(action, ValueAction) { + refreshList(); + return; + } } const vector& CardListBase::getCards() const { diff --git a/src/script/functions.cpp b/src/script/functions.cpp index 6f757a2f..029dfa89 100644 --- a/src/script/functions.cpp +++ b/src/script/functions.cpp @@ -225,7 +225,7 @@ String spec_sort(const String& spec, const String& input) { } else if (c == _('(')) { // in a cycle size_t end = spec.find_first_of(_(')')); if (end == String::npos) throw ParseError(_("Expected ')' in sort_rule specification")); - ret += cycle_sort(spec.substr(pos, end - pos - 1), input); + ret += cycle_sort(spec.substr(pos + 1, end - pos - 1), input); pos = end; } else { // single char diff --git a/src/script/script_manager.cpp b/src/script/script_manager.cpp index 6ddf205a..02acc874 100644 --- a/src/script/script_manager.cpp +++ b/src/script/script_manager.cpp @@ -98,9 +98,6 @@ void SetScriptManager::onInit(const StyleSheetP& stylesheet, Context* ctx) { // find script dependencies initDependencies(*ctx, *set.game); initDependencies(*ctx, *stylesheet); - // apply scripts to everything - // TODO : don't updateAll here, it will be done repeatedly - updateAll(); } catch (Error e) { handle_error(e, false, false); } @@ -142,6 +139,9 @@ void SetScriptManager::onAction(const Action& action, bool undone) { } updateValue(*action.valueP, CardP()); } + TYPE_CASE_(action, ScriptValueEvent) { + return; // Don't go into an infinite loop because of our own events + } TYPE_CASE_(action, CardListAction) { updateAllDependend(set.game->dependent_scripts_cards); } @@ -209,8 +209,8 @@ void SetScriptManager::updateToUpdate(const ToUpdate& u, deque& to_upd Context& ctx = getContext(u.card); if (u.value->update(ctx)) { // changed, send event -// ScriptValueEvent change(&*u.card, u.value); -// set.actions.tellListeners(change); + ScriptValueEvent change(u.card.get(), u.value); + set.actions.tellListeners(change, false); // u.value has changed, also update values with a dependency on u.value alsoUpdate(to_update, u.value->fieldP->dependent_scripts, u.card); } diff --git a/src/script/script_manager.hpp b/src/script/script_manager.hpp index 3e049d8e..92a49848 100644 --- a/src/script/script_manager.hpp +++ b/src/script/script_manager.hpp @@ -61,6 +61,12 @@ class SetScriptManager : public SetScriptContext, public ActionListener { // Update all styles for a particular card void updateStyles(const CardP& card); + /// Update all fields of all cards + /** Update all set info fields + * Doesn't update styles + */ + void updateAll(); + private: virtual void onInit(const StyleSheetP& stylesheet, Context* ctx); @@ -70,11 +76,6 @@ class SetScriptManager : public SetScriptContext, public ActionListener { /// Updates scripts, starting at some value /** if the value changes any dependend values are updated as well */ void updateValue(Value& value, const CardP& card); - /// Update all fields of all cards - /** Update all set info fields - * Doesn't update styles - */ - void updateAll(); // Update all values with a specific dependency void updateAllDependend(const vector& dependent_scripts);