summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/declarative/fx/qfxflickable.cpp18
-rw-r--r--src/declarative/fx/qfxlistview.cpp10
-rw-r--r--src/declarative/fx/qfxlistview.h1
-rw-r--r--src/declarative/fx/qfxtextedit.cpp1
-rw-r--r--src/declarative/fx/qfxtextinput.cpp27
-rw-r--r--src/gui/widgets/qlinecontrol_p.h13
-rw-r--r--src/gui/widgets/qlineedit.cpp7
-rw-r--r--src/opengl/qglpixmapfilter.cpp38
8 files changed, 84 insertions, 31 deletions
diff --git a/src/declarative/fx/qfxflickable.cpp b/src/declarative/fx/qfxflickable.cpp
index 1e6ad5a..c4d593c 100644
--- a/src/declarative/fx/qfxflickable.cpp
+++ b/src/declarative/fx/qfxflickable.cpp
@@ -587,8 +587,8 @@ void QFxFlickablePrivate::handleMousePressEvent(QGraphicsSceneMouseEvent *event)
stealMouse = false;
pressed = true;
timeline.clear();
- velocityX = -1;
- velocityY = -1;
+ velocityX = 0;
+ velocityY = 0;
lastPos = QPoint();
lastPosTime.start();
pressPos = event->pos();
@@ -654,12 +654,16 @@ void QFxFlickablePrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent *event)
elapsed = 1;
if (q->yflick()) {
qreal diff = event->pos().y() - lastPos.y();
- velocityY = diff / elapsed;
+ // average to reduce the effect of spurious moves
+ velocityY += diff / elapsed;
+ velocityY /= 2;
}
if (q->xflick()) {
qreal diff = event->pos().x() - lastPos.x();
- velocityX = diff / elapsed;
+ // average to reduce the effect of spurious moves
+ velocityX += diff / elapsed;
+ velocityX /= 2;
}
}
@@ -681,6 +685,12 @@ void QFxFlickablePrivate::handleMouseReleaseEvent(QGraphicsSceneMouseEvent *even
if (lastPosTime.isNull())
return;
+ if (lastPosTime.elapsed() > 100) {
+ // if we drag then pause before release we should not cause a flick.
+ velocityX = 0.0;
+ velocityY = 0.0;
+ }
+
vTime = timeline.time();
if (qAbs(velocityY) > 10 && qAbs(event->pos().y() - pressPos.y()) > FlickThreshold)
flickY(velocityY);
diff --git a/src/declarative/fx/qfxlistview.cpp b/src/declarative/fx/qfxlistview.cpp
index 168e4c4..015eacf 100644
--- a/src/declarative/fx/qfxlistview.cpp
+++ b/src/declarative/fx/qfxlistview.cpp
@@ -570,13 +570,7 @@ void QFxListViewPrivate::layout()
return;
q->refill();
updateHighlight();
- if (orient == Qt::Vertical) {
- fixupY();
- q->setViewportHeight(endPosition() - startPosition());
- } else {
- fixupX();
- q->setViewportWidth(endPosition() - startPosition());
- }
+ fixupPosition();
updateUnrequestedPositions();
}
@@ -1131,7 +1125,7 @@ void QFxListView::setStrictlyEnforceHighlightRange(bool strict)
}
/*!
- \qmlproperty int ListView::spacing
+ \qmlproperty real ListView::spacing
This property holds the spacing to leave between items.
*/
diff --git a/src/declarative/fx/qfxlistview.h b/src/declarative/fx/qfxlistview.h
index e5c3138..cc3d910 100644
--- a/src/declarative/fx/qfxlistview.h
+++ b/src/declarative/fx/qfxlistview.h
@@ -62,7 +62,6 @@ class Q_DECLARATIVE_EXPORT QFxListView : public QFxFlickable
Q_OBJECT
Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QFxListView)
- Q_ENUMS(CurrentItemPositioning)
Q_PROPERTY(QVariant model READ model WRITE setModel)
Q_PROPERTY(QmlComponent *delegate READ delegate WRITE setDelegate)
Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged)
diff --git a/src/declarative/fx/qfxtextedit.cpp b/src/declarative/fx/qfxtextedit.cpp
index 0185ce0..d1bafd6 100644
--- a/src/declarative/fx/qfxtextedit.cpp
+++ b/src/declarative/fx/qfxtextedit.cpp
@@ -455,7 +455,6 @@ void QFxTextEdit::setCursorDelegate(QmlComponent* c)
{
Q_D(QFxTextEdit);
if(d->cursorComponent){
- delete d->cursorComponent;
if(d->cursor){
disconnect(d->control, SIGNAL(cursorPositionChanged()),
this, SLOT(moveCursorDelegate()));
diff --git a/src/declarative/fx/qfxtextinput.cpp b/src/declarative/fx/qfxtextinput.cpp
index d9da308..8a09ebc 100644
--- a/src/declarative/fx/qfxtextinput.cpp
+++ b/src/declarative/fx/qfxtextinput.cpp
@@ -41,6 +41,7 @@
#include "qfxtextinput.h"
#include "qfxtextinput_p.h"
+#include "qmlinfo.h"
#include <QValidator>
#include <QApplication>
#include <QFontMetrics>
@@ -171,7 +172,9 @@ void QFxTextInput::setSelectionColor(const QColor &color)
return;
d->selectionColor = color;
- //TODO: implement
+ QPalette p = d->control->palette();
+ p.setColor(QPalette::Highlight, d->selectionColor);
+ d->control->setPalette(p);
}
/*!
@@ -192,7 +195,9 @@ void QFxTextInput::setSelectedTextColor(const QColor &color)
return;
d->selectedTextColor = color;
- //TODO: implement
+ QPalette p = d->control->palette();
+ p.setColor(QPalette::HighlightedText, d->selectedTextColor);
+ d->control->setPalette(p);
}
/*!
@@ -485,8 +490,6 @@ QmlComponent* QFxTextInput::cursorDelegate() const
void QFxTextInput::setCursorDelegate(QmlComponent* c)
{
Q_D(QFxTextInput);
- if(d->cursorComponent)
- delete d->cursorComponent;
d->cursorComponent = c;
d->startCreatingCursor();
}
@@ -507,14 +510,20 @@ void QFxTextInputPrivate::startCreatingCursor()
q->connect(cursorComponent, SIGNAL(statusChanged(int)),
q, SLOT(createCursor()));
}else{//isError
- qWarning() << "You could really use the error checking for QFxTextInput. We'll implement it soon.";//TODO:better error handling
+ qmlInfo(q) << "Could not load cursor delegate";
+ qWarning() << cursorComponent->errors();
}
}
void QFxTextInput::createCursor()
{
Q_D(QFxTextInput);
- //Handle isError too
+ if(d->cursorComponent->isError()){
+ qmlInfo(this) << "Could not load cursor delegate";
+ qWarning() << d->cursorComponent->errors();
+ return;
+ }
+
if(!d->cursorComponent->isReady())
return;
@@ -522,7 +531,8 @@ void QFxTextInput::createCursor()
delete d->cursorItem;
d->cursorItem = qobject_cast<QFxItem*>(d->cursorComponent->create());
if(!d->cursorItem){
- qWarning() << "You could really use the error reporting for QFxTextInput. We'll implement it soon.";//TODO:better error handling
+ qmlInfo(this) << "Could not instantiate cursor delegate";
+ //The failed instantiation should print its own error messages
return;
}
@@ -610,8 +620,9 @@ void QFxTextInput::drawContents(QPainter *p, const QRect &r)
int flags = QLineControl::DrawText;
if(!isReadOnly() && d->cursorVisible && !d->cursorItem)
flags |= QLineControl::DrawCursor;
- if (d->control->hasSelectedText())
+ if (d->control->hasSelectedText()){
flags |= QLineControl::DrawSelections;
+ }
d->control->draw(p, QPoint(0,0), r, flags);
diff --git a/src/gui/widgets/qlinecontrol_p.h b/src/gui/widgets/qlinecontrol_p.h
index 8ad0452..68898b6 100644
--- a/src/gui/widgets/qlinecontrol_p.h
+++ b/src/gui/widgets/qlinecontrol_p.h
@@ -220,6 +220,9 @@ public:
QString cancelText() const;
void setCancelText(const QString &text);
+ const QPalette &palette() const;
+ void setPalette(const QPalette &);
+
enum DrawFlags {
DrawText = 0x01,
DrawSelections = 0x02,
@@ -741,6 +744,16 @@ inline void QLineControl::setCancelText(const QString &text)
m_cancelText = text;
}
+inline const QPalette & QLineControl::palette() const
+{
+ return m_palette;
+}
+
+inline void QLineControl::setPalette(const QPalette &p)
+{
+ m_palette = p;
+}
+
QT_END_NAMESPACE
QT_END_HEADER
diff --git a/src/gui/widgets/qlineedit.cpp b/src/gui/widgets/qlineedit.cpp
index 37e57cf..629e839 100644
--- a/src/gui/widgets/qlineedit.cpp
+++ b/src/gui/widgets/qlineedit.cpp
@@ -1434,7 +1434,6 @@ void QLineEdit::mousePressEvent(QMouseEvent* e)
#ifndef QT_NO_DRAGANDDROP
if (!mark && d->dragEnabled && d->control->echoMode() == Normal &&
e->button() == Qt::LeftButton && d->control->inSelection(e->pos().x())) {
- d->control->moveCursor(cursor);
d->dndPos = e->pos();
if (!d->dndTimer.isActive())
d->dndTimer.start(QApplication::startDragTime(), this);
@@ -1851,8 +1850,12 @@ void QLineEdit::paintEvent(QPaintEvent *)
#ifdef QT_KEYPAD_NAVIGATION
if (!QApplication::keypadNavigationEnabled() || hasEditFocus())
#endif
- if (d->control->hasSelectedText() || (d->cursorVisible && !d->control->inputMask().isEmpty() && !d->control->isReadOnly()))
+ if (d->control->hasSelectedText() || (d->cursorVisible && !d->control->inputMask().isEmpty() && !d->control->isReadOnly())){
flags |= QLineControl::DrawSelections;
+ // Palette only used for selections/mask and may not be in sync
+ if(d->control->palette() != pal)
+ d->control->setPalette(pal);
+ }
// Asian users see an IM selection text as cursor on candidate
// selection phase of input method, so the ordinary cursor should be
diff --git a/src/opengl/qglpixmapfilter.cpp b/src/opengl/qglpixmapfilter.cpp
index 7876661..43f1990 100644
--- a/src/opengl/qglpixmapfilter.cpp
+++ b/src/opengl/qglpixmapfilter.cpp
@@ -71,13 +71,12 @@ void QGLPixmapFilterBase::drawImpl(QPainter *painter, const QPointF &pos, const
class QGLPixmapColorizeFilter: public QGLCustomShaderStage, public QGLPixmapFilter<QPixmapColorizeFilter>
{
public:
+ QGLPixmapColorizeFilter();
+
void setUniforms(QGLShaderProgram *program);
protected:
bool processGL(QPainter *painter, const QPointF &pos, const QPixmap &pixmap, const QRectF &srcRect) const;
-
-private:
- mutable QGLShader *m_shader;
};
class QGLPixmapConvolutionFilter: public QGLPixmapFilter<QPixmapConvolutionFilter>
@@ -103,6 +102,8 @@ private:
class QGLPixmapBlurFilter : public QGLCustomShaderStage, public QGLPixmapFilter<QPixmapBlurFilter>
{
public:
+ QGLPixmapBlurFilter();
+
void setUniforms(QGLShaderProgram *program);
protected:
@@ -111,11 +112,13 @@ protected:
private:
static QByteArray generateBlurShader(int radius, bool gaussianBlur);
- mutable QGLShader *m_shader;
-
mutable QSize m_textureSize;
mutable bool m_horizontalBlur;
+
+ mutable bool m_haveCached;
+ mutable int m_cachedRadius;
+ mutable Qt::TransformationMode m_cachedQuality;
};
extern QGLWidget *qt_gl_share_widget();
@@ -187,10 +190,14 @@ static const char *qt_gl_colorize_filter =
" return vec4(mix(srcPixel.rgb, colorized * srcPixel.a, colorizeStrength), srcPixel.a);"
"}";
+QGLPixmapColorizeFilter::QGLPixmapColorizeFilter()
+{
+ setSource(qt_gl_colorize_filter);
+}
+
bool QGLPixmapColorizeFilter::processGL(QPainter *painter, const QPointF &pos, const QPixmap &src, const QRectF &) const
{
QGLPixmapColorizeFilter *filter = const_cast<QGLPixmapColorizeFilter *>(this);
- filter->setSource(qt_gl_colorize_filter);
filter->setOnPainter(painter);
painter->drawPixmap(pos, src);
@@ -297,10 +304,27 @@ bool QGLPixmapConvolutionFilter::processGL(QPainter *, const QPointF &pos, const
return true;
}
+QGLPixmapBlurFilter::QGLPixmapBlurFilter()
+ : m_haveCached(false), m_cachedRadius(5),
+ m_cachedQuality(Qt::FastTransformation)
+{
+}
+
bool QGLPixmapBlurFilter::processGL(QPainter *painter, const QPointF &pos, const QPixmap &src, const QRectF &) const
{
QGLPixmapBlurFilter *filter = const_cast<QGLPixmapBlurFilter *>(this);
- filter->setSource(generateBlurShader(radius(), quality() == Qt::SmoothTransformation));
+
+ int radius = this->radius();
+ Qt::TransformationMode quality = this->quality();
+
+ if (!m_haveCached || radius != m_cachedRadius ||
+ quality != m_cachedQuality) {
+ // Only regenerate the shader from source if parameters have changed.
+ m_haveCached = true;
+ m_cachedRadius = radius;
+ m_cachedQuality = quality;
+ filter->setSource(generateBlurShader(radius, quality == Qt::SmoothTransformation));
+ }
QGLFramebufferObjectFormat format;
format.setInternalTextureFormat(GLenum(src.hasAlphaChannel() ? GL_RGBA : GL_RGB));