Commit 79b10780 authored by twanvl's avatar twanvl

Fixed: failed to re-prepare text after content dependent script changed

parent ebe8f653
...@@ -183,8 +183,8 @@ void Style::removeListener(StyleListener* listener) { ...@@ -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)
......
...@@ -132,7 +132,7 @@ class Style : public IntrusivePtrVirtualBase { ...@@ -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 { ...@@ -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) { ...@@ -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) { ...@@ -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() { ...@@ -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 { ...@@ -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) { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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() { ...@@ -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 { ...@@ -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) { ...@@ -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() { ...@@ -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 { ...@@ -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 { ...@@ -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>& ...@@ -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 + _("'"));
......
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