X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Ftextelement.cpp;h=4f4fab702832a6ad9238a2f670e17ccf557f5e37;hb=37a85d24acdd9a5fd6fbe941cec951c8b86f2345;hp=92bf7fa14b7f1bec472d2b01ac4b4a6c6fa6335d;hpb=64f0d552c4c5235f19988138edeb3048ac7ec151;p=jspeed diff --git a/src/textelement.cpp b/src/textelement.cpp index 92bf7fa..4f4fab7 100644 --- a/src/textelement.cpp +++ b/src/textelement.cpp @@ -18,13 +18,14 @@ #include #include +#include #include #include -#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(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("
"+data+"
"); -} - -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("
"+data+"
"); +} - 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_; +}