#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
{
{
{"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();
}
case YPOS:
element_->setY(intVal);
break;
+ case ZPOS:
+ element_->setZValue(intVal);
+ break;
+ case VISIBLEWHEN:
+ setVisibleWhen(strToVisibleWhen(value));
+ break;
case DATA:
data_ = value;
break;
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;
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;
}
}
+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_);
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)
return result;
}
+
+
+QGraphicsItem* TextElement::getElement() const
+{
+ return element_;
+}