aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJanne Heikkilä <janne.heikkila@symbio.com>2011-01-18 10:10:33 +0200
committerHolger Schröder <holger.schroeder.ext@basyskom.de>2011-01-25 12:31:15 +0100
commit0804477bda6bfdc3eb1ee154999ed9d23f3cfc49 (patch)
tree372bfb5bb5ff8eea3d1c20d28cdfe226c4567f5b
parente1c10c97d864b8fcce83305435a3e2c3d6d0d87d (diff)
Fixes: NB#216969 - [TASK] MLabelView rendering speed is too slow
RevBy: Peter Penz Details: Added data caching and precalculation based on the performance graphs in the bug report.
-rw-r--r--src/views/mlabelview.cpp20
-rw-r--r--src/views/mlabelview_p.h8
-rw-r--r--src/views/mlabelview_simple.cpp33
3 files changed, 35 insertions, 26 deletions
diff --git a/src/views/mlabelview.cpp b/src/views/mlabelview.cpp
index cac920e6..885c9bf8 100644
--- a/src/views/mlabelview.cpp
+++ b/src/views/mlabelview.cpp
@@ -88,6 +88,8 @@ void MLabelView::applyStyle()
Q_D(MLabelView);
d->impl->markDirty();
d->impl->applyStyle();
+ const MLabelStyle* labelStyle = d->style();
+ d->paddedSize = size() - QSizeF(labelStyle->paddingLeft() + labelStyle->paddingRight(), labelStyle->paddingTop() + labelStyle->paddingBottom());
updateGeometry();
}
@@ -98,13 +100,12 @@ void MLabelView::drawContents(QPainter *painter, const QStyleOptionGraphicsItem
//Opacity for the label
qreal oldOpacity = painter->opacity();
- if (style()->textOpacity() >= 0.0)
- painter->setOpacity(d->controller->effectiveOpacity() * style()->textOpacity());
+ const MLabelStyle* labelStyle = d->style();
+ if (labelStyle->textOpacity() >= 0.0)
+ painter->setOpacity(d->controller->effectiveOpacity() * labelStyle->textOpacity());
//give size adjusted with padding to the actual implementation class
- QSizeF padding(style()->paddingLeft() + style()->paddingRight(),
- style()->paddingTop() + style()->paddingBottom());
- d->impl->drawContents(painter, size() - padding);
+ d->impl->drawContents(painter, d->paddedSize);
painter->setOpacity(oldOpacity);
}
@@ -115,12 +116,13 @@ void MLabelView::resizeEvent(QGraphicsSceneResizeEvent *event)
Q_D(MLabelView);
d->impl->markDirty();
-
- QSizeF padding(style()->paddingLeft() + style()->paddingRight(),
- style()->paddingTop() + style()->paddingBottom());
+ const MLabelStyle* labelStyle = d->style();
+ QSizeF padding(labelStyle->paddingLeft() + labelStyle->paddingRight(),
+ labelStyle->paddingTop() + labelStyle->paddingBottom());
+ d->paddedSize = event->newSize() - QSizeF(labelStyle->paddingLeft() + labelStyle->paddingRight(), labelStyle->paddingTop() + labelStyle->paddingBottom());
event->setOldSize(event->oldSize() - padding);
- event->setNewSize(event->newSize() - padding);
+ event->setNewSize(d->paddedSize);
if (d->impl->resizeEvent(event)) {
updateGeometry();
diff --git a/src/views/mlabelview_p.h b/src/views/mlabelview_p.h
index 9e6fb4d7..a67e1561 100644
--- a/src/views/mlabelview_p.h
+++ b/src/views/mlabelview_p.h
@@ -49,7 +49,7 @@ public:
virtual void longPressEvent(QGestureEvent *event, QTapAndHoldGesture* gesture);
virtual void orientationChangeEvent(MOrientationChangeEvent *event);
virtual void applyStyle();
- void initializeStaticText();
+ void initializeTextProperties();
/**
* \param width Available width in pixels for the text.
@@ -107,6 +107,10 @@ public:
bool dirty;
QStaticText staticText;
QString unconstraintText;
+
+ bool clip;
+ QPen pen;
+ QFont font;
};
class MLabelViewRich : public MLabelViewSimple
@@ -229,6 +233,8 @@ public:
MLabelViewSimple *impl;
QTextOption textOptions;
+
+ QSizeF paddedSize;
};
#endif
diff --git a/src/views/mlabelview_simple.cpp b/src/views/mlabelview_simple.cpp
index 85c10b5c..dc4a1311 100644
--- a/src/views/mlabelview_simple.cpp
+++ b/src/views/mlabelview_simple.cpp
@@ -37,7 +37,7 @@
MLabelViewSimple::MLabelViewSimple(MLabelViewPrivate *viewPrivate) :
- viewPrivate(viewPrivate), preferredSize(-1, -1), textOffset(), paintingRect(), dirty(true), staticText()
+ viewPrivate(viewPrivate), preferredSize(-1, -1), textOffset(), paintingRect(), dirty(true), staticText(), clip(false)
{
staticText.setTextFormat(Qt::PlainText);
}
@@ -50,23 +50,15 @@ void MLabelViewSimple::drawContents(QPainter *painter, const QSizeF &size)
{
Q_UNUSED(size);
- initializeStaticText();
+ initializeTextProperties();
if (staticText.text().isEmpty() || paintingRect.isEmpty()) {
return;
}
- const MLabelModel *model = viewPrivate->model();
- const MLabelStyle *style = viewPrivate->style();
-
- painter->setPen(model->color().isValid() ? model->color() : style->color());
- painter->setFont(viewPrivate->controller->font());
+ painter->setPen(pen);
+ painter->setFont(font);
painter->setRenderHint(QPainter::TextAntialiasing);
- painter->setLayoutDirection(model->textDirection());
-
- const bool clip = textOffset.x() < paintingRect.x()
- || textOffset.y() < paintingRect.y()
- || textOffset.x() + staticText.size().width() > paintingRect.right()
- || textOffset.y() + staticText.size().height() > paintingRect.bottom();
+ painter->setLayoutDirection(viewPrivate->model()->textDirection());
if (clip) {
painter->save();
@@ -223,7 +215,7 @@ void MLabelViewSimple::applyStyle()
const_cast<MLabelModel*>(viewPrivate->model())->setAlignment(viewPrivate->style()->horizontalAlignment() | viewPrivate->style()->verticalAlignment());
}
-void MLabelViewSimple::initializeStaticText()
+void MLabelViewSimple::initializeTextProperties()
{
if (!dirty) {
return;
@@ -247,6 +239,15 @@ void MLabelViewSimple::initializeStaticText()
staticText.prepare(QTransform(), viewPrivate->controller->font());
adjustTextOffset();
+
+ clip = textOffset.x() < paintingRect.x()
+ || textOffset.y() < paintingRect.y()
+ || textOffset.x() + staticText.size().width() > paintingRect.right()
+ || textOffset.y() + staticText.size().height() > paintingRect.bottom();
+
+ const QColor& color = viewPrivate->model()->color();
+ pen = QPen(color.isValid() ? color : style->color());
+ font = QFont(viewPrivate->controller->font());
}
QString MLabelViewSimple::textToRender(qreal width) const
@@ -360,7 +361,7 @@ QSizeF MLabelViewSimple::sizeForWidth(qreal width) const
width = -1.0;
}
- const_cast<MLabelViewSimple*>(this)->initializeStaticText();
+ const_cast<MLabelViewSimple*>(this)->initializeTextProperties();
const bool equalWidth = (width < 0.0 && staticText.textWidth() < 0.0) || width == staticText.textWidth();
if (equalWidth && staticText.text() == unconstraintText) {
@@ -373,7 +374,7 @@ QSizeF MLabelViewSimple::sizeForWidth(qreal width) const
if (staticText2.text() != unconstraintText) {
staticText2.setText(unconstraintText);
}
- staticText2.prepare(QTransform(), viewPrivate->controller->font());
+ staticText2.prepare(QTransform(), font);
return staticText2.size();
}