Another fix to theme scheduler saving.
[jspeed] / src / textelement.cpp
index 92bf7fa..4f4fab7 100644 (file)
 
 #include <QtCore/QString>
 #include <QtCore/QDebug>
+#include <QtCore/QTime>
 #include <QtGui/QGraphicsScene>
 #include <QtGui/QGraphicsTextItem>
-#include "reader.h"
 #include "textelement.h"
+#include "reader.h"
 #include "odometer.h"
 #include "graphicsscene.h"
-#include "location.h"
+#include "poialerts.h"
 
 namespace
 {
@@ -32,18 +33,33 @@ namespace
     {
      {"xpos", true},
      {"ypos", true},
+     {"zpos", true},
+     {"visiblewhen", false},
      {"data", false},
      {"format", false},
      {"width", true},
      {"align", false},
      {"color", false},
      {"size", true},
-     {"font", false}
+     {"font", false},
+     {"bold", false},
+     {"italic", false},
+     {"uppercase", false},
+     {"letterspacing", true},
+     {"timeformat", false},
+     {"dateformat", false}
     };
+
+    const QString FIELDS[TextElement::FIELD_COUNT] =  {"TRIP", "TOTAL", "SPEED",
+                                                       "MAXSPEED", "AVGSPEED",
+                                                       "UNIT", "SPEEDUNIT", "TIME", "DATE",
+                                                       "POIDISTANCE", "ANGLE", "LATITUDE",
+                                                       "LONGITUDE"};
 }
 
 TextElement::TextElement(Reader* reader): GraphicsElement(reader),
-data_(""), format_(""), align_("left"), fontSize_(16), hasSpecialField_(false)
+data_(""), format_(""), align_("left"), timeFormat_("hh:mm"), dateFormat_("dd.MM.yyyy"), fontSize_(16), bold_(false), italic_(false),
+uppercase_(false), letterSpacing_(0)
 {
     element_ = new QGraphicsTextItem();
 }
@@ -67,6 +83,12 @@ bool TextElement::setAttribute(QString const& name, QString const& value)
         case YPOS:
             element_->setY(intVal);
             break;
+        case ZPOS:
+            element_->setZValue(intVal);
+            break;
+        case VISIBLEWHEN:
+            setVisibleWhen(strToVisibleWhen(value));
+            break;
         case DATA:
             data_ = value;
             break;
@@ -90,6 +112,36 @@ bool TextElement::setAttribute(QString const& name, QString const& value)
             fontFile_ = value;
             fontChanged = true;
             break;
+        case BOLD:
+            if(value != "false" && value != "0")
+            {
+                bold_ = true;
+                fontChanged = true;
+            }
+            break;
+        case ITALIC:
+            if(value != "false" && value != "0")
+            {
+                italic_ = true;
+                fontChanged = true;
+            }
+            break;
+        case UPPERCASE:
+            if(value != "false" && value != "0")
+            {
+                uppercase_ = true;
+            }
+            break;
+        case LETTERSPACING:
+            letterSpacing_ = intVal;
+            fontChanged = true;
+            break;
+        case TIMEFORMAT:
+            timeFormat_ = value;
+            break;
+        case DATEFORMAT:
+            dateFormat_ = value;
+            break;
         default:
             qDebug() << "Unknown attribute: " << attr;
             return false;
@@ -97,24 +149,7 @@ bool TextElement::setAttribute(QString const& name, QString const& value)
 
         if(fontChanged)
         {
-            if(!fontFile_.isEmpty())
-            {
-                QFont font;
-
-                if(getFont(fontFile_, font))
-                {
-                    font.setPointSize(fontSize_);
-                    element_->setFont(font);
-                }
-                else
-                {
-                    return false;
-                }
-            }
-            else
-            {
-                element_->setFont(QFont("Default", fontSize_));
-            }
+            return applyFont();
         }
 
         return true;
@@ -126,14 +161,55 @@ bool TextElement::setAttribute(QString const& name, QString const& value)
     }
 }
 
+bool TextElement::applyFont()
+{
+    QFont font;
+
+    if(!fontFile_.isEmpty())
+    {
+        if(!getFont(fontFile_, font))
+        {
+            return false;
+        }
+    }
+
+    font.setPointSize(fontSize_);
+
+    if(bold_)
+    {
+        font.setBold(true);
+    }
+
+    if(italic_)
+    {
+        font.setItalic(true);
+    }
+
+    if(letterSpacing_)
+    {
+        font.setLetterSpacing(QFont::PercentageSpacing, letterSpacing_);
+    }
+
+    element_->setFont(font);
+
+    return true;
+}
+
 void TextElement::addToScene(GraphicsScene* scene)
 {
-    Location::Fix fix;
+    specialFields_.clear();
 
-    QString replaced = data_;
+    for(int i = 0; i < FIELD_COUNT; i++)
+    {
+        if(data_.indexOf("{" + FIELDS[i] + "}") != -1)
+        {
+            specialFields_.push_back(static_cast<Field>(i));
+        }
 
-    hasSpecialField_ = replaceSpecialField(replaced);
+    }
 
+    QString replaced = data_;
+    replaceSpecialFields(replaced);
     updateHtml(replaced);
 
     scene->addItem(element_);
@@ -141,58 +217,96 @@ void TextElement::addToScene(GraphicsScene* scene)
 
 void TextElement::update()
 {
-    if(!hasSpecialField_)
+    if(specialFields_.isEmpty())
     {
         return;
     }
 
     QString replaced = data_;
-    replaceSpecialField(replaced);
+    replaceSpecialFields(replaced);
 
     updateHtml(replaced);
 }
 
-void TextElement::updateHtml(QString const& data)
+void TextElement::updateHtml(QString data)
 {
-    element_->setHtml("<div align='"+align_+"'>"+data+"</div>");
-}
-
-bool TextElement::replaceSpecialField(QString& value)
-{
-    bool found = false;
-
-    if(value.indexOf("{TRIP}") != -1)
+    if(uppercase_)
     {
-        value = value.replace("{TRIP}", formatString(Odometer::instance().getTrip()));
-        found = true;
+        data = data.toUpper();
     }
 
-    if(value.indexOf("{TOTAL}") != -1)
-    {
-        value = value.replace("{TOTAL}", formatString(Odometer::instance().getTotal()));
-        found = true;
-    }
+    element_->setHtml("<div align='"+align_+"'>"+data+"</div>");
+}
 
-    if(value.indexOf("{SPEED}") != -1)
+void TextElement::replaceSpecialFields(QString& value)
+{
+    for(int i = 0; i < specialFields_.size(); i++)
     {
-        value = value.replace("{SPEED}", formatString(Odometer::instance().getLatestFix().speed));
-        found = true;
-    }
+        Field f = specialFields_.at(i);
+        Odometer* o = &(Odometer::instance());
 
-    if(value.indexOf("{SPEED_UNIT}") != -1)
-    {
-        value = value.replace("{SPEED_UNIT}", Odometer::getSpeedUnit());
-        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;
+        case TIME:
+            replaceValue(value, f, QTime::currentTime().toString(timeFormat_));
+            break;
+        case DATE:
+            replaceValue(value, f, QDate::currentDate().toString(dateFormat_));
+            break;
+        case POIDISTANCE:
+            replaceValue(value, f, handleEmpty(PoiAlerts::instance().getCurrentDistance()));
+            break;
+        case ANGLE:
+            replaceValue(value, f, formatString(o->getLatestFix().track));
+            break;
+        case LATITUDE:
+            replaceValue(value, f, handleEmpty(o->getLatestFix().latitude));
+            break;
+        case LONGITUDE:
+            replaceValue(value, f, handleEmpty(o->getLatestFix().longitude));
+            break;
+        default:
+            qDebug() << "Unknown field: " << f;
+        }
     }
+}
 
-    if(value.indexOf("{UNIT}") != -1)
+QString TextElement::handleEmpty(double value)
+{
+    if(value < 0.01)
     {
-        value = value.replace("{UNIT}", Odometer::getUnit());
-        found = true;
+        return "";
     }
 
-    return found;
+    return formatString(value);
+}
 
+void TextElement::replaceValue(QString& value,
+                               TextElement::Field field,
+                               QString const& replace)
+{
+    value = value.replace("{" + FIELDS[field] + "}", replace);
 }
 
 QString TextElement::formatString(double val)
@@ -209,3 +323,9 @@ QString TextElement::formatString(double val)
 
     return result;
 }
+
+
+QGraphicsItem* TextElement::getElement() const
+{
+    return element_;
+}