From 14c813e172dd34d29987f12e1090d1553a72247f Mon Sep 17 00:00:00 2001 From: skyjake Date: Fri, 14 Jun 2013 17:24:46 +0300 Subject: [PATCH] Debug|libdeng2: Describing rules as text Added descriptions for rules so it is easier to see if there are any mistakes in them (e.g., missing edges of a rectangle). --- .../include/de/widgets/constantrule.h | 2 + .../include/de/widgets/delegaterule.h | 4 ++ .../include/de/widgets/operatorrule.h | 2 + doomsday/libdeng2/include/de/widgets/rule.h | 3 + .../include/de/widgets/rulerectangle.h | 2 + .../libdeng2/include/de/widgets/scalarrule.h | 2 + .../libdeng2/src/widgets/constantrule.cpp | 5 ++ .../libdeng2/src/widgets/delegaterule.cpp | 9 +++ .../libdeng2/src/widgets/operatorrule.cpp | 28 +++++++++ .../libdeng2/src/widgets/rulerectangle.cpp | 60 ++++++++++++++++++- doomsday/libdeng2/src/widgets/scalarrule.cpp | 10 ++++ 11 files changed, 124 insertions(+), 3 deletions(-) diff --git a/doomsday/libdeng2/include/de/widgets/constantrule.h b/doomsday/libdeng2/include/de/widgets/constantrule.h index a24e922890..86036659e1 100644 --- a/doomsday/libdeng2/include/de/widgets/constantrule.h +++ b/doomsday/libdeng2/include/de/widgets/constantrule.h @@ -65,6 +65,8 @@ class DENG2_PUBLIC ConstantRule : public Rule */ void set(float newValue); + String description() const; + protected: void update(); diff --git a/doomsday/libdeng2/include/de/widgets/delegaterule.h b/doomsday/libdeng2/include/de/widgets/delegaterule.h index 1ac4b52f81..6dfaf00316 100644 --- a/doomsday/libdeng2/include/de/widgets/delegaterule.h +++ b/doomsday/libdeng2/include/de/widgets/delegaterule.h @@ -49,6 +49,8 @@ class DENG2_PUBLIC DelegateRule : public ConstantRule virtual void delegateUpdate(int id) = 0; virtual void delegateInvalidation(int id) = 0; + + virtual String delegateDescription(int id) const = 0; }; public: @@ -71,6 +73,8 @@ class DENG2_PUBLIC DelegateRule : public ConstantRule void invalidate(); + String description() const; + protected: ~DelegateRule(); // Counted diff --git a/doomsday/libdeng2/include/de/widgets/operatorrule.h b/doomsday/libdeng2/include/de/widgets/operatorrule.h index f4a59e4311..7bfff551df 100644 --- a/doomsday/libdeng2/include/de/widgets/operatorrule.h +++ b/doomsday/libdeng2/include/de/widgets/operatorrule.h @@ -66,6 +66,8 @@ class DENG2_PUBLIC OperatorRule : public Rule void update(); + String description() const; + private: Operator _operator; Rule const *_leftOperand; diff --git a/doomsday/libdeng2/include/de/widgets/rule.h b/doomsday/libdeng2/include/de/widgets/rule.h index 9a904200cb..97ed30edac 100644 --- a/doomsday/libdeng2/include/de/widgets/rule.h +++ b/doomsday/libdeng2/include/de/widgets/rule.h @@ -23,6 +23,7 @@ #include "../libdeng2.h" #include "../Counted" #include "../Observers" +#include "../String" namespace de { @@ -113,6 +114,8 @@ class DENG2_PUBLIC Rule : public Counted, public DENG2_AUDIENCE_INTERFACE(RuleIn void independentOf(Rule const *dependencyOrNull); + virtual String description() const = 0; + public: /** * Clears the flag that determines whether there are any invalid rules. diff --git a/doomsday/libdeng2/include/de/widgets/rulerectangle.h b/doomsday/libdeng2/include/de/widgets/rulerectangle.h index bc434fa044..c1ef5823b7 100644 --- a/doomsday/libdeng2/include/de/widgets/rulerectangle.h +++ b/doomsday/libdeng2/include/de/widgets/rulerectangle.h @@ -100,6 +100,8 @@ class DENG2_PUBLIC RuleRectangle */ Rectanglei recti() const; + String description() const; + private: DENG2_PRIVATE(d) }; diff --git a/doomsday/libdeng2/include/de/widgets/scalarrule.h b/doomsday/libdeng2/include/de/widgets/scalarrule.h index 8326590d94..81a3690159 100644 --- a/doomsday/libdeng2/include/de/widgets/scalarrule.h +++ b/doomsday/libdeng2/include/de/widgets/scalarrule.h @@ -62,6 +62,8 @@ class DENG2_PUBLIC ScalarRule : public Rule, DENG2_OBSERVES(Clock, TimeChange) */ void shift(float delta); + String description() const; + protected: ~ScalarRule(); void update(); diff --git a/doomsday/libdeng2/src/widgets/constantrule.cpp b/doomsday/libdeng2/src/widgets/constantrule.cpp index c06ef2d1a0..07f4eed7b3 100644 --- a/doomsday/libdeng2/src/widgets/constantrule.cpp +++ b/doomsday/libdeng2/src/widgets/constantrule.cpp @@ -39,6 +39,11 @@ void ConstantRule::set(float newValue) invalidate(); } +String ConstantRule::description() const +{ + return String("Constant(%1)").arg(cachedValue()); +} + void ConstantRule::update() { setValue(_pendingValue); diff --git a/doomsday/libdeng2/src/widgets/delegaterule.cpp b/doomsday/libdeng2/src/widgets/delegaterule.cpp index 099599f673..b71e5afd5f 100644 --- a/doomsday/libdeng2/src/widgets/delegaterule.cpp +++ b/doomsday/libdeng2/src/widgets/delegaterule.cpp @@ -61,4 +61,13 @@ void DelegateRule::invalidate() } } +String DelegateRule::description() const +{ + if(_source) + { + return QString("Delegate(%1)").arg(_source->delegateDescription(_delegateId)); + } + return "Delegate(NULL)"; +} + } // namespace de diff --git a/doomsday/libdeng2/src/widgets/operatorrule.cpp b/doomsday/libdeng2/src/widgets/operatorrule.cpp index cbbad07648..4a8b53c3d7 100644 --- a/doomsday/libdeng2/src/widgets/operatorrule.cpp +++ b/doomsday/libdeng2/src/widgets/operatorrule.cpp @@ -101,4 +101,32 @@ void OperatorRule::update() setValue(v); } +String OperatorRule::description() const +{ + static char const *texts[] = { + "Equals", + "Negate", + "Half", + "Double", + "Sum", + "Subtract", + "Multiply", + "Divide", + "Maximum", + "Minimum", + "Floor" + }; + + String desc = String("Operator %1 { ").arg(texts[_operator]); + if(_leftOperand) + { + desc += _leftOperand->description(); + } + if(_rightOperand) + { + desc += ", " + _rightOperand->description(); + } + return desc + " }"; +} + } // namespace de diff --git a/doomsday/libdeng2/src/widgets/rulerectangle.cpp b/doomsday/libdeng2/src/widgets/rulerectangle.cpp index 75abb14f5a..4d855209b2 100644 --- a/doomsday/libdeng2/src/widgets/rulerectangle.cpp +++ b/doomsday/libdeng2/src/widgets/rulerectangle.cpp @@ -24,7 +24,7 @@ namespace de { -DENG2_PIMPL_NOREF(RuleRectangle), +DENG2_PIMPL(RuleRectangle), DENG2_OBSERVES(Clock, TimeChange), public DelegateRule::ISource { @@ -54,7 +54,7 @@ public DelegateRule::ISource // The output rules. DelegateRule *outputRules[MAX_OUTPUT_RULES]; - Instance() + Instance(Public *i) : Base(i) { zap(inputRules); @@ -187,6 +187,13 @@ public DelegateRule::ISource leftDefined = true; } +#ifdef _DEBUG + if(!leftDefined || !rightDefined) + { + qDebug() << self.description().toLatin1(); + } +#endif + DENG2_ASSERT(leftDefined); DENG2_ASSERT(rightDefined); @@ -246,6 +253,12 @@ public DelegateRule::ISource topDefined = true; } +#ifdef _DEBUG + if(!topDefined || !bottomDefined) + { + qDebug() << self.description().toLatin1(); + } +#endif DENG2_ASSERT(topDefined); DENG2_ASSERT(bottomDefined); @@ -319,6 +332,20 @@ public DelegateRule::ISource } } + String delegateDescription(int id) const + { + static char const *names[MAX_OUTPUT_RULES] = { + "Left output", + "Right output", + "Width output", + "Top output", + "Bottom output", + "Height output" + }; + return String(names[id]) + " of RuleRectangle " + + QString("0x%1").arg(dintptr(thisPublic), 0, 16); + } + void timeChanged(Clock const &clock) { invalidateOutputs(); @@ -330,7 +357,7 @@ public DelegateRule::ISource } }; -RuleRectangle::RuleRectangle() : d(new Instance) +RuleRectangle::RuleRectangle() : d(new Instance(this)) {} Rule const &RuleRectangle::left() const @@ -434,4 +461,31 @@ Rectanglei RuleRectangle::recti() const Vector2i(de::floor(r.bottomRight.x), de::floor(r.bottomRight.y))); } +String RuleRectangle::description() const +{ + String desc = String("RuleRectangle 0x%1:").arg(dintptr(this), 0, 16); + + for(int i = 0; i < int(Rule::MAX_SEMANTICS); ++i) + { + desc += String("\n - ") + + (i == Rule::Left? "Left" : + i == Rule::Top? "Top" : + i == Rule::Right? "Right" : + i == Rule::Bottom? "Bottom" : + i == Rule::Width? "Width" : + i == Rule::Height? "Height" : + i == Rule::AnchorX? "AnchorX" : "AnchorY") + ": "; + + if(d->inputRules[i]) + { + desc += d->inputRules[i]->description(); + } + else + { + desc += "(null)"; + } + } + return desc; +} + } // namespace de diff --git a/doomsday/libdeng2/src/widgets/scalarrule.cpp b/doomsday/libdeng2/src/widgets/scalarrule.cpp index 6f41837ad8..de4100a724 100644 --- a/doomsday/libdeng2/src/widgets/scalarrule.cpp +++ b/doomsday/libdeng2/src/widgets/scalarrule.cpp @@ -63,6 +63,16 @@ void ScalarRule::shift(float delta) invalidate(); } +String ScalarRule::description() const +{ + String desc = "Scalar(" + _animation.asText(); + if(_targetRule) + { + desc += "; target: " + _targetRule->description(); + } + return desc + ")"; +} + void ScalarRule::update() { // When using a rule for the target, keep it updated.