Commit 34c503c7 authored by twanvl's avatar twanvl

dependency handling for keywords

parent 40d167bf
...@@ -124,6 +124,7 @@ bool TextValueEditor::onRightDown(const RealPoint& pos, wxMouseEvent& ev) { ...@@ -124,6 +124,7 @@ bool TextValueEditor::onRightDown(const RealPoint& pos, wxMouseEvent& ev) {
// ----------------------------------------------------------------------------- : Keyboard // ----------------------------------------------------------------------------- : Keyboard
bool TextValueEditor::onChar(wxKeyEvent& ev) { bool TextValueEditor::onChar(wxKeyEvent& ev) {
if (ev.AltDown()) return false;
fixSelection(); fixSelection();
switch (ev.GetKeyCode()) { switch (ev.GetKeyCode()) {
case WXK_LEFT: case WXK_LEFT:
...@@ -198,6 +199,8 @@ bool TextValueEditor::onChar(wxKeyEvent& ev) { ...@@ -198,6 +199,8 @@ bool TextValueEditor::onChar(wxKeyEvent& ev) {
// this might not work for internationalized input. // this might not work for internationalized input.
// It might also not be portable! // It might also not be portable!
replaceSelection(escape(String(ev.GetUnicodeKey(), 1)), _("Typing")); replaceSelection(escape(String(ev.GetUnicodeKey(), 1)), _("Typing"));
} else {
return false;
} }
} }
return true; return true;
...@@ -365,7 +368,8 @@ bool TextValueEditor::canFormat(int type) const { ...@@ -365,7 +368,8 @@ bool TextValueEditor::canFormat(int type) const {
case ID_FORMAT_SYMBOL: case ID_FORMAT_SYMBOL:
return !style().always_symbol && style().allow_formating && style().symbol_font.valid(); return !style().always_symbol && style().allow_formating && style().symbol_font.valid();
case ID_FORMAT_REMINDER: case ID_FORMAT_REMINDER:
return false; // TODO return !style().always_symbol && style().allow_formating &&
in_tag(value().value(), _("<kw"), selection_start_i, selection_end_i) != String::npos;
default: default:
return false; return false;
} }
...@@ -379,9 +383,15 @@ bool TextValueEditor::hasFormat(int type) const { ...@@ -379,9 +383,15 @@ bool TextValueEditor::hasFormat(int type) const {
return in_tag(value().value(), _("<i"), selection_start_i, selection_end_i) != String::npos; return in_tag(value().value(), _("<i"), selection_start_i, selection_end_i) != String::npos;
case ID_FORMAT_SYMBOL: case ID_FORMAT_SYMBOL:
return in_tag(value().value(), _("<sym"), selection_start_i, selection_end_i) != String::npos; return in_tag(value().value(), _("<sym"), selection_start_i, selection_end_i) != String::npos;
case ID_FORMAT_REMINDER: case ID_FORMAT_REMINDER: {
return false; // TODO const String& v = value().value();
default: size_t tag = in_tag(v, _("<kw"), selection_start_i, selection_end_i);
if (tag != String::npos && tag + 4 < v.size()) {
Char c = v.GetChar(tag + 4);
return c == _('1') || c == _('A');
}
return false;
} default:
return false; return false;
} }
} }
......
...@@ -219,7 +219,7 @@ SCRIPT_FUNCTION(number_of_items) { ...@@ -219,7 +219,7 @@ SCRIPT_FUNCTION(number_of_items) {
// ----------------------------------------------------------------------------- : Keywords // ----------------------------------------------------------------------------- : Keywords
SCRIPT_RULE_2_N(expand_keywords, ScriptValueP, _("default expand"), default_expand, SCRIPT_RULE_2_N_DEP(expand_keywords, ScriptValueP, _("default expand"), default_expand,
ScriptValueP, _("combine"), combine) { ScriptValueP, _("combine"), combine) {
SCRIPT_PARAM(String, input); SCRIPT_PARAM(String, input);
SCRIPT_PARAM(Set*, set); SCRIPT_PARAM(Set*, set);
...@@ -232,7 +232,13 @@ SCRIPT_RULE_2_N(expand_keywords, ScriptValueP, _("default expand"), default_exp ...@@ -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_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 // ----------------------------------------------------------------------------- : Rules : regex replace
......
...@@ -143,6 +143,13 @@ ...@@ -143,6 +143,13 @@
SCRIPT_RULE_2_N(funname, type1, _(#name1), name1, type2, _(#name2), name2) SCRIPT_RULE_2_N(funname, type1, _(#name1), name1, type2, _(#name2), name2)
/// Utility for defining a script rule with two named parameters /// Utility for defining a script rule with two named parameters
#define SCRIPT_RULE_2_N(funname, type1, str1, name1, type2, str2, name2) \ #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 { \ class ScriptRule_##funname: public ScriptValue { \
public: \ public: \
inline ScriptRule_##funname(const type1& name1, const type2& name2) \ inline ScriptRule_##funname(const type1& name1, const type2& name2) \
...@@ -150,6 +157,7 @@ ...@@ -150,6 +157,7 @@
virtual ScriptType type() const { return SCRIPT_FUNCTION; } \ virtual ScriptType type() const { return SCRIPT_FUNCTION; } \
virtual String typeName() const { return _(#funname)_("_rule"); } \ virtual String typeName() const { return _(#funname)_("_rule"); } \
virtual ScriptValueP eval(Context& ctx) const; \ virtual ScriptValueP eval(Context& ctx) const; \
dep \
private: \ private: \
type1 name1; \ type1 name1; \
type2 name2; \ type2 name2; \
...@@ -166,6 +174,9 @@ ...@@ -166,6 +174,9 @@
} \ } \
ScriptValueP ScriptRule_##funname::eval(Context& ctx) const ScriptValueP ScriptRule_##funname::eval(Context& ctx) const
#define SCRIPT_RULE_2_DEPENDENCIES(name) \
ScriptValueP ScriptRule_##name::dependencies(Context& ctx, const Dependency& dep) const
// ----------------------------------------------------------------------------- : EOF // ----------------------------------------------------------------------------- : EOF
#endif #endif
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <data/field.hpp> #include <data/field.hpp>
#include <data/action/set.hpp> #include <data/action/set.hpp>
#include <data/action/value.hpp> #include <data/action/value.hpp>
#include <data/action/keyword.hpp>
#include <util/error.hpp> #include <util/error.hpp>
typedef map<const StyleSheet*,Context*> Contexts; typedef map<const StyleSheet*,Context*> Contexts;
...@@ -131,6 +132,12 @@ void SetScriptManager::initDependencies(Context& ctx, StyleSheet& stylesheet) { ...@@ -131,6 +132,12 @@ void SetScriptManager::initDependencies(Context& ctx, StyleSheet& stylesheet) {
void SetScriptManager::onAction(const Action& action, bool undone) { void SetScriptManager::onAction(const Action& action, bool undone) {
TYPE_CASE(action, ValueAction) { TYPE_CASE(action, ValueAction) {
// is it a keyword's fake value?
KeywordTextValue* value = dynamic_cast<KeywordTextValue*>(action.valueP.get());
if (value) {
updateAllDependend(set.game->dependent_scripts_keywords);
return;
}
// find the affected card // find the affected card
FOR_EACH(card, set.cards) { FOR_EACH(card, set.cards) {
if (card->data.contains(action.valueP)) { if (card->data.contains(action.valueP)) {
...@@ -138,6 +145,7 @@ void SetScriptManager::onAction(const Action& action, bool undone) { ...@@ -138,6 +145,7 @@ void SetScriptManager::onAction(const Action& action, bool undone) {
return; return;
} }
} }
// not a card value
updateValue(*action.valueP, CardP()); updateValue(*action.valueP, CardP());
} }
TYPE_CASE_(action, ScriptValueEvent) { TYPE_CASE_(action, ScriptValueEvent) {
...@@ -160,6 +168,14 @@ void SetScriptManager::onAction(const Action& action, bool undone) { ...@@ -160,6 +168,14 @@ void SetScriptManager::onAction(const Action& action, bool undone) {
wxLogDebug(_("-------------------------------\n")); wxLogDebug(_("-------------------------------\n"));
#endif #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) { void SetScriptManager::updateStyles(const CardP& card) {
......
...@@ -33,8 +33,10 @@ void ActionStack::add(Action* action, bool allow_merge) { ...@@ -33,8 +33,10 @@ void ActionStack::add(Action* action, bool allow_merge) {
FOR_EACH(a, redo_actions) delete a; FOR_EACH(a, redo_actions) delete a;
redo_actions.clear(); redo_actions.clear();
// try to merge? // try to merge?
if (allow_merge && !undo_actions.empty() && undo_actions.back()->merge(*action)) { if (allow_merge && !undo_actions.empty() &&
// merged with top undo action undo_actions.back() != save_point && // never merge with the save point
undo_actions.back()->merge(*action) // merged with top undo action
) {
delete action; delete action;
} else { } else {
undo_actions.push_back(action); undo_actions.push_back(action);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment