mirror of
https://github.com/amyinspace/MagicSetEditor2.git
synced 2026-06-12 13:37:00 -04:00
Fixed: failed to re-prepare text after content dependent script changed
git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@482 0fc631ac-6414-0410-93d0-97cfa31319b6
This commit is contained in:
+2
-2
@@ -183,8 +183,8 @@ void Style::removeListener(StyleListener* listener) {
|
|||||||
listeners.end()
|
listeners.end()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
void Style::tellListeners() {
|
void Style::tellListeners(bool already_prepared) {
|
||||||
FOR_EACH(l, listeners) l->onStyleChange();
|
FOR_EACH(l, listeners) l->onStyleChange(already_prepared);
|
||||||
}
|
}
|
||||||
|
|
||||||
StyleListener::StyleListener(const StyleP& style)
|
StyleListener::StyleListener(const StyleP& style)
|
||||||
|
|||||||
+3
-2
@@ -132,7 +132,7 @@ class Style : public IntrusivePtrVirtualBase {
|
|||||||
/// Remove a StyleListener
|
/// Remove a StyleListener
|
||||||
void removeListener(StyleListener*);
|
void removeListener(StyleListener*);
|
||||||
/// Tell the StyleListeners that this style has changed
|
/// Tell the StyleListeners that this style has changed
|
||||||
void tellListeners();
|
void tellListeners(bool already_prepared);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DECLARE_REFLECTION_VIRTUAL();
|
DECLARE_REFLECTION_VIRTUAL();
|
||||||
@@ -156,7 +156,8 @@ class StyleListener : public IntrusivePtrVirtualBase {
|
|||||||
virtual ~StyleListener();
|
virtual ~StyleListener();
|
||||||
|
|
||||||
/// Called when a (scripted) property of the viewed style has changed
|
/// Called when a (scripted) property of the viewed style has changed
|
||||||
virtual void onStyleChange() {}
|
/** already_prepared indicates that this change happend after preparing text for content properties */
|
||||||
|
virtual void onStyleChange(bool already_prepared) {}
|
||||||
protected:
|
protected:
|
||||||
const StyleP styleP; ///< The style we are listening to
|
const StyleP styleP; ///< The style we are listening to
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -252,7 +252,7 @@ void ChoiceStyle::invalidate(Context& ctx) {
|
|||||||
thumbnails_status[i] = THUMB_CHANGED;
|
thumbnails_status[i] = THUMB_CHANGED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (change) tellListeners();
|
if (change) tellListeners(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChoiceStyle::loadMask(Package& pkg) {
|
void ChoiceStyle::loadMask(Package& pkg) {
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ void DataViewer::updateStyles(bool only_content_dependent) {
|
|||||||
Style& s = *v->getStyle();
|
Style& s = *v->getStyle();
|
||||||
if (only_content_dependent && !s.content_dependent) continue;
|
if (only_content_dependent && !s.content_dependent) continue;
|
||||||
if (s.update(ctx)) {
|
if (s.update(ctx)) {
|
||||||
s.tellListeners();
|
s.tellListeners(only_content_dependent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -146,6 +146,9 @@ void TextViewer::reset() {
|
|||||||
elements.clear();
|
elements.clear();
|
||||||
lines.clear();
|
lines.clear();
|
||||||
}
|
}
|
||||||
|
bool TextViewer::prepared() const {
|
||||||
|
return !lines.empty();
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- : Positions
|
// ----------------------------------------------------------------------------- : Positions
|
||||||
|
|
||||||
|
|||||||
@@ -58,6 +58,8 @@ class TextViewer {
|
|||||||
bool prepare(RotatedDC& dc, const String& text, TextStyle& style, Context&);
|
bool prepare(RotatedDC& dc, const String& text, TextStyle& style, Context&);
|
||||||
/// Reset the cached data, at a new call to draw it will be recalculated
|
/// Reset the cached data, at a new call to draw it will be recalculated
|
||||||
void reset();
|
void reset();
|
||||||
|
/// Is the viewer prepare()d?
|
||||||
|
bool prepared() const;
|
||||||
|
|
||||||
// --------------------------------------------------- : Positions
|
// --------------------------------------------------- : Positions
|
||||||
|
|
||||||
|
|||||||
@@ -72,6 +72,6 @@ void ChoiceValueViewer::draw(RotatedDC& dc) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChoiceValueViewer::onStyleChange() {
|
void ChoiceValueViewer::onStyleChange(bool already_prepared) {
|
||||||
viewer.redraw(*this);
|
if (!already_prepared) viewer.redraw(*this);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class ChoiceValueViewer : public ValueViewer {
|
|||||||
DECLARE_VALUE_VIEWER(Choice) : ValueViewer(parent,style) {}
|
DECLARE_VALUE_VIEWER(Choice) : ValueViewer(parent,style) {}
|
||||||
|
|
||||||
virtual void draw(RotatedDC& dc);
|
virtual void draw(RotatedDC& dc);
|
||||||
virtual void onStyleChange();
|
virtual void onStyleChange(bool);
|
||||||
};
|
};
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- : EOF
|
// ----------------------------------------------------------------------------- : EOF
|
||||||
|
|||||||
@@ -86,9 +86,9 @@ bool ColorValueViewer::containsPoint(const RealPoint& p) const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColorValueViewer::onStyleChange() {
|
void ColorValueViewer::onStyleChange(bool already_prepared) {
|
||||||
alpha_mask = AlphaMaskP();
|
alpha_mask = AlphaMaskP();
|
||||||
viewer.redraw(*this);
|
if (!already_prepared) viewer.redraw(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColorValueViewer::loadMask(const Rotation& rot) const {
|
void ColorValueViewer::loadMask(const Rotation& rot) const {
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ class ColorValueViewer : public ValueViewer {
|
|||||||
virtual void draw(RotatedDC& dc);
|
virtual void draw(RotatedDC& dc);
|
||||||
virtual bool containsPoint(const RealPoint& p) const;
|
virtual bool containsPoint(const RealPoint& p) const;
|
||||||
|
|
||||||
virtual void onStyleChange();
|
virtual void onStyleChange(bool);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
mutable AlphaMaskP alpha_mask;
|
mutable AlphaMaskP alpha_mask;
|
||||||
|
|||||||
@@ -77,10 +77,10 @@ void ImageValueViewer::onValueChange() {
|
|||||||
bitmap = Bitmap();
|
bitmap = Bitmap();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImageValueViewer::onStyleChange() {
|
void ImageValueViewer::onStyleChange(bool already_prepared) {
|
||||||
bitmap = Bitmap();
|
bitmap = Bitmap();
|
||||||
alpha_mask = AlphaMaskP(); // TODO: only reload whatever has changed
|
alpha_mask = AlphaMaskP(); // TODO: only reload whatever has changed
|
||||||
viewer.redraw(*this);
|
if (!already_prepared) viewer.redraw(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImageValueViewer::loadMask(const Rotation& rot) const {
|
void ImageValueViewer::loadMask(const Rotation& rot) const {
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ class ImageValueViewer : public ValueViewer {
|
|||||||
virtual bool containsPoint(const RealPoint& p) const;
|
virtual bool containsPoint(const RealPoint& p) const;
|
||||||
|
|
||||||
virtual void onValueChange();
|
virtual void onValueChange();
|
||||||
virtual void onStyleChange();
|
virtual void onStyleChange(bool);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Bitmap bitmap;
|
Bitmap bitmap;
|
||||||
|
|||||||
@@ -21,12 +21,14 @@ bool TextValueViewer::prepare(RotatedDC& dc) {
|
|||||||
style().mask.load(image);
|
style().mask.load(image);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
v.prepare(dc, value().value(), style(), viewer.getContext());
|
return v.prepare(dc, value().value(), style(), viewer.getContext());
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextValueViewer::draw(RotatedDC& dc) {
|
void TextValueViewer::draw(RotatedDC& dc) {
|
||||||
drawFieldBorder(dc);
|
drawFieldBorder(dc);
|
||||||
|
if (!v.prepared()) {
|
||||||
|
v.prepare(dc, value().value(), style(), viewer.getContext());
|
||||||
|
}
|
||||||
v.draw(dc, style(), (DrawWhat)(
|
v.draw(dc, style(), (DrawWhat)(
|
||||||
DRAW_NORMAL
|
DRAW_NORMAL
|
||||||
| (viewer.drawBorders() ? DRAW_BORDERS : 0)
|
| (viewer.drawBorders() ? DRAW_BORDERS : 0)
|
||||||
@@ -38,7 +40,7 @@ void TextValueViewer::onValueChange() {
|
|||||||
v.reset();
|
v.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextValueViewer::onStyleChange() {
|
void TextValueViewer::onStyleChange(bool already_prepared) {
|
||||||
v.reset();
|
v.reset();
|
||||||
viewer.redraw(*this);
|
if (!already_prepared) viewer.redraw(*this);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ class TextValueViewer : public ValueViewer {
|
|||||||
virtual bool prepare(RotatedDC& dc);
|
virtual bool prepare(RotatedDC& dc);
|
||||||
virtual void draw(RotatedDC& dc);
|
virtual void draw(RotatedDC& dc);
|
||||||
virtual void onValueChange();
|
virtual void onValueChange();
|
||||||
virtual void onStyleChange();
|
virtual void onStyleChange(bool);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
TextViewer v;
|
TextViewer v;
|
||||||
|
|||||||
@@ -57,7 +57,8 @@ class ValueViewer : public StyleListener {
|
|||||||
*/
|
*/
|
||||||
virtual void onValueChange() {}
|
virtual void onValueChange() {}
|
||||||
/// Called when a (scripted) property of the associated style has changed
|
/// Called when a (scripted) property of the associated style has changed
|
||||||
virtual void onStyleChange() {}
|
/** If alread_prepared, should make sure the viewer stays in a state similair to that after prepare() */
|
||||||
|
virtual void onStyleChange(bool already_prepared) {}
|
||||||
/// Called when an action is performed on the associated value
|
/// Called when an action is performed on the associated value
|
||||||
virtual void onAction(const Action&, bool undone) { onValueChange(); }
|
virtual void onAction(const Action&, bool undone) { onValueChange(); }
|
||||||
|
|
||||||
|
|||||||
@@ -226,7 +226,7 @@ void SetScriptManager::updateStyles(Context& ctx, const IndexMap<FieldP,StyleP>&
|
|||||||
try {
|
try {
|
||||||
if (s->update(ctx)) {
|
if (s->update(ctx)) {
|
||||||
// style has changed, tell listeners
|
// style has changed, tell listeners
|
||||||
s->tellListeners();
|
s->tellListeners(only_content_dependent);
|
||||||
}
|
}
|
||||||
} catch (const ScriptError& e) {
|
} catch (const ScriptError& e) {
|
||||||
throw ScriptError(e.what() + _("\n while updating styles for '") + s->fieldP->name + _("'"));
|
throw ScriptError(e.what() + _("\n while updating styles for '") + s->fieldP->name + _("'"));
|
||||||
|
|||||||
Reference in New Issue
Block a user