diff options
-rw-r--r-- | src/declarative/fx/qfxflickable.cpp | 18 | ||||
-rw-r--r-- | src/declarative/fx/qfxlistview.cpp | 10 | ||||
-rw-r--r-- | src/declarative/fx/qfxlistview.h | 1 | ||||
-rw-r--r-- | src/declarative/fx/qfxtextedit.cpp | 1 | ||||
-rw-r--r-- | src/declarative/fx/qfxtextinput.cpp | 27 | ||||
-rw-r--r-- | src/gui/widgets/qlinecontrol_p.h | 13 | ||||
-rw-r--r-- | src/gui/widgets/qlineedit.cpp | 7 | ||||
-rw-r--r-- | src/opengl/qglpixmapfilter.cpp | 38 |
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)); |