summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Alpert <alan.alpert@nokia.com>2009-09-23 00:57:49 (GMT)
committerAlan Alpert <alan.alpert@nokia.com>2009-09-23 00:57:49 (GMT)
commit1c011c7f70791e0a4a38bd9f8bb1988cd604305c (patch)
treedbc6e39d62f6ad2385db0363a92bee5d86f3eacd
parent72a3f170fbb1eaab9b293a54224e60f861ad5be3 (diff)
downloadQt-1c011c7f70791e0a4a38bd9f8bb1988cd604305c.zip
Qt-1c011c7f70791e0a4a38bd9f8bb1988cd604305c.tar.gz
Qt-1c011c7f70791e0a4a38bd9f8bb1988cd604305c.tar.bz2
Fix cursor drawing in QFxTextInput and QFxTextEdit
Fixes a bug in QFxPaintedItem that was plaguing them both. Optimizes the painting of he blinking cursor in QFxTextInput (don't redraw whole thing each blink) Fixes cursor drawing and lack thereof bugs with QFxTextEdit. Task-number: QT-669
-rw-r--r--src/declarative/fx/qfxpainteditem.cpp3
-rw-r--r--src/declarative/fx/qfxtextedit.cpp5
-rw-r--r--src/declarative/fx/qfxtextinput.cpp17
3 files changed, 16 insertions, 9 deletions
diff --git a/src/declarative/fx/qfxpainteditem.cpp b/src/declarative/fx/qfxpainteditem.cpp
index 5471e1b..85924e0 100644
--- a/src/declarative/fx/qfxpainteditem.cpp
+++ b/src/declarative/fx/qfxpainteditem.cpp
@@ -101,7 +101,7 @@ void QFxPaintedItem::dirtyCache(const QRect& rect)
QFxPaintedItemPrivate::ImageCacheItem *c = d->imagecache[i];
QRect isect = (c->area & rect) | c->dirty;
if (isect == c->area && !inpaint) {
- d->imagecache.removeAt(i);
+ delete d->imagecache.takeAt(i);
} else {
c->dirty = isect;
++i;
@@ -231,6 +231,7 @@ void QFxPaintedItem::paint(QPainter *p, const QStyleOptionGraphicsItem *, QWidge
QPainter qp(&d->imagecache[i]->image);
qp.setRenderHints(QPainter::HighQualityAntialiasing | QPainter::Antialiasing | QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform, d->smooth);
qp.translate(-area.x(), -area.y());
+ qp.eraseRect(d->imagecache[i]->dirty);
if (d->fillColor.isValid())
qp.fillRect(d->imagecache[i]->dirty,d->fillColor);
qp.setClipRect(d->imagecache[i]->dirty);
diff --git a/src/declarative/fx/qfxtextedit.cpp b/src/declarative/fx/qfxtextedit.cpp
index d1bafd6..58b5c8e 100644
--- a/src/declarative/fx/qfxtextedit.cpp
+++ b/src/declarative/fx/qfxtextedit.cpp
@@ -1047,6 +1047,11 @@ void QFxTextEdit::updateSize()
//### need to comfirm cost of always setting these
int newWidth = (int)d->document->idealWidth();
d->document->setTextWidth(newWidth); // ### QTextDoc> Alignment will not work unless textWidth is set. Does Text need this line as well?
+ int cursorWidth = 1;
+ if(d->cursor)
+ cursorWidth = d->cursor->width();
+ newWidth += cursorWidth;
+ newWidth += 3;// ### Need a better way of ensuring cursor is in width
setImplicitWidth(newWidth);
setImplicitHeight(d->text.isEmpty() ? fm.height() : (int)d->document->size().height());
diff --git a/src/declarative/fx/qfxtextinput.cpp b/src/declarative/fx/qfxtextinput.cpp
index 16ad185..b7b155a 100644
--- a/src/declarative/fx/qfxtextinput.cpp
+++ b/src/declarative/fx/qfxtextinput.cpp
@@ -625,7 +625,9 @@ void QFxTextInput::drawContents(QPainter *p, const QRect &r)
flags |= QLineControl::DrawSelections;
}
- d->control->draw(p, QPoint(0,0), r, flags);
+ QPoint offset = QPoint(0,0);
+ QRect clipRect = r;
+ d->control->draw(p, offset, clipRect, flags);
p->restore();
}
@@ -674,7 +676,7 @@ void QFxTextInputPrivate::init()
q, SLOT(updateRect()));//TODO: Only update rect between pos's
q->connect(control, SIGNAL(selectionChanged()),
q, SLOT(updateRect()));//TODO: Only update rect in selection
- //Note that above TODOs are waiting, pending getting the updateRect working right
+ //Note that above TODOs probably aren't that big a savings
q->updateSize();
oldValidity = control->hasAcceptableInput();
lastSelectionStart = 0;
@@ -730,11 +732,10 @@ void QFxTextInput::q_textChanged()
void QFxTextInput::updateRect(const QRect &r)
{
- //### Only update that rect.
if(r == QRect())
clearCache();
- //else
- //dirtyCache(r);//Not working yet
+ else
+ dirtyCache(r);
update();
}
@@ -744,12 +745,12 @@ void QFxTextInput::updateSize(bool needsRedraw)
int w = width();
int h = height();
setImplicitHeight(d->control->height());
- //d->control->width() is width of the line, not of the text
- //And naturalTextWidth() is the text, not including the cursor
int cursorWidth = d->control->cursorWidth();
if(d->cursorItem)
cursorWidth = d->cursorItem->width();
- setImplicitWidth(d->control->naturalTextWidth()+2+cursorWidth);
+ //### Is QFontMetrics too slow?
+ QFontMetricsF fm(d->font);
+ setImplicitWidth(fm.width(d->control->displayText())+cursorWidth);
setContentsSize(QSize(width(), height()));//Repaints if changed
if(w==width() && h==height() && needsRedraw){
clearCache();