diff options
Diffstat (limited to 'weather/src/painttextitem.cpp')
-rw-r--r-- | weather/src/painttextitem.cpp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/weather/src/painttextitem.cpp b/weather/src/painttextitem.cpp new file mode 100644 index 0000000..7356815 --- /dev/null +++ b/weather/src/painttextitem.cpp @@ -0,0 +1,67 @@ +#include "painttextitem.h" +#include <QPainter> +#include <QDebug> + +TextPainter::TextPainter(int fontSize, QColor color, const QString &text) + : m_pen(color) + , m_brush(color) + , m_text(text) + , m_quoted(false) + , m_maxWidth(-1) +{ + m_font.setFamily("Nokia Sans"); + m_font.setPixelSize(fontSize); + m_font.setStyleStrategy(QFont::PreferAntialias); + m_pen.setJoinStyle(Qt::RoundJoin); +} + +int TextPainter::width() const +{ + QFontMetrics m(m_font); + int result = 0; + if (m_quoted) + result += 2 * m.width('"'); + QString text = m_maxWidth > 0 ? m.elidedText(m_text, Qt::ElideRight, m_maxWidth - result) + : m_text; + return result + m.width(text); +} + +void TextPainter::paint(QPainter *painter) +{ + QFontMetrics m(m_font); + QString text; + if (m_quoted) { + int quote = 2 * m.width('"'); + text = m_maxWidth > 0 ? m.elidedText(m_text, Qt::ElideRight, m_maxWidth - quote) : m_text; + text = '"' + text + '"'; + } else + text = m_maxWidth > 0 ? m.elidedText(m_text, Qt::ElideRight, m_maxWidth) : m_text; + painter->setFont(m_font); + painter->setPen(m_pen); + painter->setBrush(m_brush); + + painter->drawText(QPointF(m_pos.x(), m_pos.y() + m.ascent()), text); +} + +void TextPainter::locateAtCenter(TextPainter *item, qreal left, qreal top, qreal width) +{ + item->setPos(left + (width - item->width()) / 2, top); +} + +void TextPainter::locateAtCenter(QList<TextPainter*> items, qreal left, qreal top, qreal width) +{ + static const int margin = 5; + + if (items.isEmpty()) + return; + + int itemsWidth = (items.count() - 1) * margin; + for (int i = 0; i < items.count(); ++i) + itemsWidth += items[i]->width(); + + left += (width - itemsWidth) / 2; + for (int i = 0; i < items.count(); ++i) { + items[i]->setPos(left, top); + left += items[i]->width() + margin; + } +} |