diff --git a/src/gui/value/text.cpp b/src/gui/value/text.cpp index 9dbb0a92..ec9359e7 100644 --- a/src/gui/value/text.cpp +++ b/src/gui/value/text.cpp @@ -124,6 +124,7 @@ bool TextValueEditor::onRightDown(const RealPoint& pos, wxMouseEvent& ev) { // ----------------------------------------------------------------------------- : Keyboard bool TextValueEditor::onChar(wxKeyEvent& ev) { + if (ev.AltDown()) return false; fixSelection(); switch (ev.GetKeyCode()) { case WXK_LEFT: @@ -198,6 +199,8 @@ bool TextValueEditor::onChar(wxKeyEvent& ev) { // this might not work for internationalized input. // It might also not be portable! replaceSelection(escape(String(ev.GetUnicodeKey(), 1)), _("Typing")); + } else { + return false; } } return true; @@ -365,7 +368,8 @@ bool TextValueEditor::canFormat(int type) const { case ID_FORMAT_SYMBOL: return !style().always_symbol && style().allow_formating && style().symbol_font.valid(); case ID_FORMAT_REMINDER: - return false; // TODO + return !style().always_symbol && style().allow_formating && + in_tag(value().value(), _("keyword_db; @@ -232,7 +232,13 @@ SCRIPT_RULE_2_N(expand_keywords, ScriptValueP, _("default expand"), default_exp } SCRIPT_RETURN(db.expand(input, default_expand, combine, ctx)); } - +SCRIPT_RULE_2_DEPENDENCIES(expand_keywords) { + default_expand->dependencies(ctx, dep); + combine ->dependencies(ctx, dep); + SCRIPT_PARAM(Set*, set); + set->game->dependent_scripts_keywords.add(dep); // this depends on the set's keywords + SCRIPT_RETURN(_("")); +} // ----------------------------------------------------------------------------- : Rules : regex replace diff --git a/src/script/functions/util.hpp b/src/script/functions/util.hpp index 087e01eb..3fcb3ed5 100644 --- a/src/script/functions/util.hpp +++ b/src/script/functions/util.hpp @@ -143,6 +143,13 @@ SCRIPT_RULE_2_N(funname, type1, _(#name1), name1, type2, _(#name2), name2) /// Utility for defining a script rule with two named parameters #define SCRIPT_RULE_2_N(funname, type1, str1, name1, type2, str2, name2) \ + SCRIPT_RULE_2_N_AUX(funname, type1, str1, name1, type2, str2, name2, ;) +/// Utility for defining a script rule with two named parameters, with dependencies +#define SCRIPT_RULE_2_N_DEP(funname, type1, str1, name1, type2, str2, name2)\ + SCRIPT_RULE_2_N_AUX( funname, type1, str1, name1, type2, str2, name2,\ + virtual ScriptValueP dependencies(Context&, const Dependency&) const;) + +#define SCRIPT_RULE_2_N_AUX(funname, type1, str1, name1, type2, str2, name2, dep) \ class ScriptRule_##funname: public ScriptValue { \ public: \ inline ScriptRule_##funname(const type1& name1, const type2& name2) \ @@ -150,6 +157,7 @@ virtual ScriptType type() const { return SCRIPT_FUNCTION; } \ virtual String typeName() const { return _(#funname)_("_rule"); } \ virtual ScriptValueP eval(Context& ctx) const; \ + dep \ private: \ type1 name1; \ type2 name2; \ @@ -166,6 +174,9 @@ } \ ScriptValueP ScriptRule_##funname::eval(Context& ctx) const +#define SCRIPT_RULE_2_DEPENDENCIES(name) \ + ScriptValueP ScriptRule_##name::dependencies(Context& ctx, const Dependency& dep) const + // ----------------------------------------------------------------------------- : EOF #endif diff --git a/src/script/script_manager.cpp b/src/script/script_manager.cpp index 25baa80e..13442571 100644 --- a/src/script/script_manager.cpp +++ b/src/script/script_manager.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include typedef map Contexts; @@ -131,6 +132,12 @@ void SetScriptManager::initDependencies(Context& ctx, StyleSheet& stylesheet) { void SetScriptManager::onAction(const Action& action, bool undone) { TYPE_CASE(action, ValueAction) { + // is it a keyword's fake value? + KeywordTextValue* value = dynamic_cast(action.valueP.get()); + if (value) { + updateAllDependend(set.game->dependent_scripts_keywords); + return; + } // find the affected card FOR_EACH(card, set.cards) { if (card->data.contains(action.valueP)) { @@ -138,6 +145,7 @@ void SetScriptManager::onAction(const Action& action, bool undone) { return; } } + // not a card value updateValue(*action.valueP, CardP()); } TYPE_CASE_(action, ScriptValueEvent) { @@ -160,6 +168,14 @@ void SetScriptManager::onAction(const Action& action, bool undone) { wxLogDebug(_("-------------------------------\n")); #endif } + TYPE_CASE_(action, KeywordListAction) { + updateAllDependend(set.game->dependent_scripts_keywords); + return; + } + TYPE_CASE_(action, ChangeKeywordModeAction) { + updateAllDependend(set.game->dependent_scripts_keywords); + return; + } } void SetScriptManager::updateStyles(const CardP& card) { diff --git a/src/util/action_stack.cpp b/src/util/action_stack.cpp index c9348473..bf3235cb 100644 --- a/src/util/action_stack.cpp +++ b/src/util/action_stack.cpp @@ -33,8 +33,10 @@ void ActionStack::add(Action* action, bool allow_merge) { FOR_EACH(a, redo_actions) delete a; redo_actions.clear(); // try to merge? - if (allow_merge && !undo_actions.empty() && undo_actions.back()->merge(*action)) { - // merged with top undo action + if (allow_merge && !undo_actions.empty() && + undo_actions.back() != save_point && // never merge with the save point + undo_actions.back()->merge(*action) // merged with top undo action + ) { delete action; } else { undo_actions.push_back(action);