Improved special field handling in text element.
[jspeed] / src / textelement.cpp
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)