Improved special field handling in text element.
authoreshe <jessehakanen@gmail.com>
Tue, 13 Jul 2010 20:34:56 +0000 (21:34 +0100)
committereshe <jessehakanen@gmail.com>
Tue, 13 Jul 2010 20:34:56 +0000 (21:34 +0100)
src/textelement.cpp
src/textelement.h

index 92bf7fa..98b2fb8 100644 (file)
@@ -40,10 +40,14 @@ namespace
      {"size", true},
      {"font", false}
     };
+
+    const QString FIELDS[TextElement::FIELD_COUNT] =  {"TRIP", "TOTAL", "SPEED",
+                                                       "MAXSPEED", "AVGSPEED",
+                                                       "UNIT", "SPEEDUNIT"};
 }
 
 TextElement::TextElement(Reader* reader): GraphicsElement(reader),
-data_(""), format_(""), align_("left"), fontSize_(16), hasSpecialField_(false)
+data_(""), format_(""), align_("left"), fontSize_(16)
 {
     element_ = new QGraphicsTextItem();
 }
@@ -130,10 +134,18 @@ void TextElement::addToScene(GraphicsScene* scene)
 {
     Location::Fix fix;
 
-    QString replaced = data_;
+    specialFields_.clear();
 
-    hasSpecialField_ = replaceSpecialField(replaced);
+    for(int i = 0; i < FIELD_COUNT; i++)
+    {
+        if(data_.indexOf("{" + FIELDS[i] + "}") != -1)
+        {
+            specialFields_.push_back(static_cast<Field>(i));
+        }
+    }
 
+    QString replaced = data_;
+    replaceSpecialFields(replaced);
     updateHtml(replaced);
 
     scene->addItem(element_);
@@ -141,13 +153,13 @@ void TextElement::addToScene(GraphicsScene* scene)
 
 void TextElement::update()
 {
-    if(!hasSpecialField_)
+    if(specialFields_.isEmpty())
     {
         return;
     }
 
     QString replaced = data_;
-    replaceSpecialField(replaced);
+    replaceSpecialFields(replaced);
 
     updateHtml(replaced);
 }
@@ -157,42 +169,47 @@ void TextElement::updateHtml(QString const& data)
     element_->setHtml("<div align='"+align_+"'>"+data+"</div>");
 }
 
-bool TextElement::replaceSpecialField(QString& value)
+void TextElement::replaceSpecialFields(QString& value)
 {
-    bool found = false;
-
-    if(value.indexOf("{TRIP}") != -1)
-    {
-        value = value.replace("{TRIP}", formatString(Odometer::instance().getTrip()));
-        found = true;
-    }
-
-    if(value.indexOf("{TOTAL}") != -1)
-    {
-        value = value.replace("{TOTAL}", formatString(Odometer::instance().getTotal()));
-        found = true;
-    }
-
-    if(value.indexOf("{SPEED}") != -1)
-    {
-        value = value.replace("{SPEED}", formatString(Odometer::instance().getLatestFix().speed));
-        found = true;
-    }
-
-    if(value.indexOf("{SPEED_UNIT}") != -1)
+    for(int i = 0; i < specialFields_.size(); i++)
     {
-        value = value.replace("{SPEED_UNIT}", Odometer::getSpeedUnit());
-        found = true;
-    }
+        Field f = specialFields_.at(i);
+        Odometer* o = &(Odometer::instance());
 
-    if(value.indexOf("{UNIT}") != -1)
-    {
-        value = value.replace("{UNIT}", Odometer::getUnit());
-        found = true;
+        switch(f)
+        {
+        case TRIP:
+            replaceValue(value, f, formatString(o->getTrip()));
+            break;
+        case TOTAL:
+            replaceValue(value, f, formatString(o->getTotal()));
+            break;
+        case SPEED:
+            replaceValue(value, f, formatString(o->getLatestFix().speed));
+            break;
+        case MAXSPEED:
+            replaceValue(value, f, formatString(o->getMaxSpeed()));
+            break;
+        case AVGSPEED:
+            replaceValue(value, f, formatString(o->getAverageSpeed()));
+            break;
+        case UNIT:
+            replaceValue(value, f, o->getUnit());
+            break;
+        case SPEEDUNIT:
+            replaceValue(value, f, o->getSpeedUnit());
+            break;
+        default:
+            qDebug() << "Unknown field: " << f;
+        }
     }
+}
 
-    return found;
-
+void TextElement::replaceValue(QString& value,
+                               TextElement::Field field,
+                               QString const& replace)
+{
+    value = value.replace("{" + FIELDS[field] + "}", replace);
 }
 
 QString TextElement::formatString(double val)
index 02e34f8..ec4f7f1 100644 (file)
@@ -30,6 +30,7 @@ class TextElement : public GraphicsElement
 {
 public:
     enum Attribute {XPOS, YPOS, DATA, FORMAT, WIDTH, ALIGN, COLOR, SIZE, FONT, ATTRIBUTE_COUNT};
+    enum Field {TRIP, TOTAL, SPEED, MAXSPEED, AVGSPEED, UNIT, SPEEDUNIT, FIELD_COUNT};
     TextElement(Reader* reader);
     virtual bool setAttribute(QString const& name, QString const& value);
     virtual void addToScene(GraphicsScene* scene);
@@ -37,7 +38,8 @@ public:
 
 private:
     void updateHtml(QString const& data);
-    bool replaceSpecialField(QString& value);
+    void replaceSpecialFields(QString& value);
+    void replaceValue(QString& value, Field field, QString const& replace);
     QString formatString(double val);
     QGraphicsTextItem* element_;
     QString data_;
@@ -45,7 +47,7 @@ private:
     QString align_;
     int fontSize_;
     QString fontFile_;
-    bool hasSpecialField_;
+    QList<Field> specialFields_;
 };
 
 #endif