mirror of
https://github.com/amyinspace/MagicSetEditor2.git
synced 2026-06-12 05:36:59 -04:00
dependency handling for keywords
git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@265 0fc631ac-6414-0410-93d0-97cfa31319b6
This commit is contained in:
+14
-4
@@ -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) {
|
|||||||
// 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 {
|
|||||||
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 {
|
|||||||
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,8 +219,8 @@ 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);
|
||||||
KeywordDatabase& db = set->keyword_db;
|
KeywordDatabase& db = set->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_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 @@
|
|||||||
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 @@
|
|||||||
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 @@
|
|||||||
} \
|
} \
|
||||||
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 @@
|
|||||||
#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) {
|
|||||||
|
|
||||||
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) {
|
|||||||
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) {
|
|||||||
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) {
|
|||||||
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);
|
||||||
|
|||||||
Reference in New Issue
Block a user