diff options
author | Liang Qi <liang.qi@qt.io> | 2018-02-12 13:07:06 +0100 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2018-02-12 13:07:06 +0100 |
commit | 675c150a28ae9f1ca5f4960caeed522da534f6fc (patch) | |
tree | f29de6db23985893ed21c8caaf2fbc1e10aa063b /src | |
parent | e052684db6e0814a6a3397eb21e3ce9f922563da (diff) | |
parent | 95b4996a04989aa26c8fba8aaa90b76b7166c2c1 (diff) |
Merge remote-tracking branch 'origin/5.10' into 5.11
Change-Id: I2934d3f51fea9626fd2d2512786eb297d9f7fe6c
Diffstat (limited to 'src')
-rw-r--r-- | src/imports/controls/TextArea.qml | 2 | ||||
-rw-r--r-- | src/imports/controls/TextField.qml | 2 | ||||
-rw-r--r-- | src/imports/controls/fusion/TextArea.qml | 2 | ||||
-rw-r--r-- | src/imports/controls/fusion/TextField.qml | 2 | ||||
-rw-r--r-- | src/imports/controls/imagine/TextArea.qml | 2 | ||||
-rw-r--r-- | src/imports/controls/imagine/TextField.qml | 2 | ||||
-rw-r--r-- | src/imports/platform/qquickplatformmenu.cpp | 6 | ||||
-rw-r--r-- | src/imports/templates/qtquicktemplates2plugin.cpp | 3 | ||||
-rw-r--r-- | src/quicktemplates2/qquickabstractbutton.cpp | 50 | ||||
-rw-r--r-- | src/quicktemplates2/qquickabstractbutton_p_p.h | 3 | ||||
-rw-r--r-- | src/quicktemplates2/qquickcontrol.cpp | 14 | ||||
-rw-r--r-- | src/quicktemplates2/qquickicon.cpp | 82 | ||||
-rw-r--r-- | src/quicktemplates2/qquickicon_p.h | 14 | ||||
-rw-r--r-- | src/quicktemplates2/qquickpopup.cpp | 9 |
14 files changed, 143 insertions, 50 deletions
diff --git a/src/imports/controls/TextArea.qml b/src/imports/controls/TextArea.qml index 00a97957..04a44eae 100644 --- a/src/imports/controls/TextArea.qml +++ b/src/imports/controls/TextArea.qml @@ -66,7 +66,7 @@ T.TextArea { text: control.placeholderText font: control.font opacity: 0.5 - color: control.palette.text + color: control.color verticalAlignment: control.verticalAlignment visible: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter) elide: Text.ElideRight diff --git a/src/imports/controls/TextField.qml b/src/imports/controls/TextField.qml index 333c5bba..4b80d8be 100644 --- a/src/imports/controls/TextField.qml +++ b/src/imports/controls/TextField.qml @@ -67,7 +67,7 @@ T.TextField { text: control.placeholderText font: control.font opacity: 0.5 - color: control.palette.text + color: control.color verticalAlignment: control.verticalAlignment visible: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter) elide: Text.ElideRight diff --git a/src/imports/controls/fusion/TextArea.qml b/src/imports/controls/fusion/TextArea.qml index 56541d89..36d9db04 100644 --- a/src/imports/controls/fusion/TextArea.qml +++ b/src/imports/controls/fusion/TextArea.qml @@ -68,7 +68,7 @@ T.TextArea { opacity: 0.5 text: control.placeholderText font: control.font - color: control.palette.text + color: control.color verticalAlignment: control.verticalAlignment visible: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter) elide: Text.ElideRight diff --git a/src/imports/controls/fusion/TextField.qml b/src/imports/controls/fusion/TextField.qml index e66857cd..2ea5c967 100644 --- a/src/imports/controls/fusion/TextField.qml +++ b/src/imports/controls/fusion/TextField.qml @@ -68,7 +68,7 @@ T.TextField { opacity: 0.5 text: control.placeholderText font: control.font - color: control.palette.text + color: control.color verticalAlignment: control.verticalAlignment visible: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter) elide: Text.ElideRight diff --git a/src/imports/controls/imagine/TextArea.qml b/src/imports/controls/imagine/TextArea.qml index 49153b5d..9867a0bd 100644 --- a/src/imports/controls/imagine/TextArea.qml +++ b/src/imports/controls/imagine/TextArea.qml @@ -70,7 +70,7 @@ T.TextArea { text: control.placeholderText font: control.font - color: control.palette.text + color: control.color verticalAlignment: control.verticalAlignment visible: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter) elide: Text.ElideRight diff --git a/src/imports/controls/imagine/TextField.qml b/src/imports/controls/imagine/TextField.qml index 09ef5bcb..17827b95 100644 --- a/src/imports/controls/imagine/TextField.qml +++ b/src/imports/controls/imagine/TextField.qml @@ -70,7 +70,7 @@ T.TextField { text: control.placeholderText font: control.font - color: control.palette.text + color: control.color verticalAlignment: control.verticalAlignment visible: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter) elide: Text.ElideRight diff --git a/src/imports/platform/qquickplatformmenu.cpp b/src/imports/platform/qquickplatformmenu.cpp index 82adb6c3..ec5c4804 100644 --- a/src/imports/platform/qquickplatformmenu.cpp +++ b/src/imports/platform/qquickplatformmenu.cpp @@ -44,6 +44,7 @@ #include <QtGui/qcursor.h> #include <QtGui/qpa/qplatformtheme.h> #include <QtGui/private/qguiapplication_p.h> +#include <QtGui/private/qhighdpiscaling_p.h> #include <QtQml/private/qqmlengine_p.h> #include <QtQml/private/qv4scopedvalue_p.h> #include <QtQml/private/qv4qobjectwrapper_p.h> @@ -705,8 +706,9 @@ void QQuickPlatformMenu::open(QQmlV4Function *args) targetRect.moveTo(pos); #endif } - - m_handle->showPopup(window, targetRect, menuItem ? menuItem->handle() : nullptr); + m_handle->showPopup(window, + QHighDpi::toNativePixels(targetRect, window), + menuItem ? menuItem->handle() : nullptr); } /*! diff --git a/src/imports/templates/qtquicktemplates2plugin.cpp b/src/imports/templates/qtquicktemplates2plugin.cpp index d8df7d98..72e84c3a 100644 --- a/src/imports/templates/qtquicktemplates2plugin.cpp +++ b/src/imports/templates/qtquicktemplates2plugin.cpp @@ -299,6 +299,7 @@ void QtQuickTemplates2Plugin::registerTypes(const char *uri) qmlRegisterType<QQuickDialog, 3>(uri, 2, 3, "Dialog"); qmlRegisterType<QQuickDialogButtonBox, 3>(uri, 2, 3, "DialogButtonBox"); qRegisterMetaType<QQuickIcon>(); + qmlRegisterType<QQuickLabel, 3>(uri, 2, 3, "Label"); qmlRegisterType<QQuickMenu, 3>(uri, 2, 3, "Menu"); qmlRegisterType<QQuickMenuBar>(uri, 2, 3, "MenuBar"); qmlRegisterType<QQuickMenuBarItem>(uri, 2, 3, "MenuBarItem"); @@ -311,6 +312,8 @@ void QtQuickTemplates2Plugin::registerTypes(const char *uri) qmlRegisterType<QQuickScrollIndicator, 3>(uri, 2, 3, "ScrollIndicator"); qmlRegisterType<QQuickSlider, 3>(uri, 2, 3, "Slider"); qmlRegisterType<QQuickSpinBox, 3>(uri, 2, 3, "SpinBox"); + qmlRegisterType<QQuickTextArea, 3>(uri, 2, 3, "TextArea"); + qmlRegisterType<QQuickTextField, 3>(uri, 2, 3, "TextField"); // NOTE: register the latest revisions of all template/control base classes to // make revisioned properties available to their subclasses (synced with Qt 5.10) diff --git a/src/quicktemplates2/qquickabstractbutton.cpp b/src/quicktemplates2/qquickabstractbutton.cpp index 238669c6..0a8b8ddf 100644 --- a/src/quicktemplates2/qquickabstractbutton.cpp +++ b/src/quicktemplates2/qquickabstractbutton.cpp @@ -328,6 +328,21 @@ void QQuickAbstractButtonPrivate::setText(const QString &newText, bool isExplici q->buttonChange(QQuickAbstractButton::ButtonTextChange); } +void QQuickAbstractButtonPrivate::updateEffectiveIcon() +{ + Q_Q(QQuickAbstractButton); + // We store effectiveIcon because we need to be able to tell if the icon has actually changed. + // If we only stored our icon and the action's icon, and resolved in the getter, we'd have + // no way of knowing what the old value was here. As an added benefit, we only resolve when + // something has changed, as opposed to doing it unconditionally in the icon() getter. + const QQuickIcon newEffectiveIcon = action ? icon.resolve(action->icon()) : icon; + if (newEffectiveIcon == effectiveIcon) + return; + + effectiveIcon = newEffectiveIcon; + emit q->iconChanged(); +} + void QQuickAbstractButtonPrivate::click() { Q_Q(QQuickAbstractButton); @@ -720,17 +735,14 @@ void QQuickAbstractButton::setIndicator(QQuickItem *indicator) QQuickIcon QQuickAbstractButton::icon() const { Q_D(const QQuickAbstractButton); - return d->icon; + return d->effectiveIcon; } void QQuickAbstractButton::setIcon(const QQuickIcon &icon) { Q_D(QQuickAbstractButton); - if (d->icon == icon) - return; - d->icon = icon; - emit iconChanged(); + d->updateEffectiveIcon(); } /*! @@ -792,7 +804,7 @@ void QQuickAbstractButton::setAction(QQuickAction *action) QObjectPrivate::disconnect(oldAction, &QQuickAction::triggered, d, &QQuickAbstractButtonPrivate::click); QObjectPrivate::disconnect(oldAction, &QQuickAction::textChanged, d, &QQuickAbstractButtonPrivate::actionTextChange); - disconnect(oldAction, &QQuickAction::iconChanged, this, &QQuickAbstractButton::setIcon); + QObjectPrivate::disconnect(oldAction, &QQuickAction::iconChanged, d, &QQuickAbstractButtonPrivate::updateEffectiveIcon); disconnect(oldAction, &QQuickAction::checkedChanged, this, &QQuickAbstractButton::setChecked); disconnect(oldAction, &QQuickAction::checkableChanged, this, &QQuickAbstractButton::setCheckable); disconnect(oldAction, &QQuickAction::enabledChanged, this, &QQuickItem::setEnabled); @@ -803,33 +815,11 @@ void QQuickAbstractButton::setAction(QQuickAction *action) QObjectPrivate::connect(action, &QQuickAction::triggered, d, &QQuickAbstractButtonPrivate::click); QObjectPrivate::connect(action, &QQuickAction::textChanged, d, &QQuickAbstractButtonPrivate::actionTextChange); - connect(action, &QQuickAction::iconChanged, this, &QQuickAbstractButton::setIcon); + QObjectPrivate::connect(action, &QQuickAction::iconChanged, d, &QQuickAbstractButtonPrivate::updateEffectiveIcon); connect(action, &QQuickAction::checkedChanged, this, &QQuickAbstractButton::setChecked); connect(action, &QQuickAction::checkableChanged, this, &QQuickAbstractButton::setCheckable); connect(action, &QQuickAction::enabledChanged, this, &QQuickItem::setEnabled); - QQuickIcon actionIcon = action->icon(); - - QString name = actionIcon.name(); - if (!name.isEmpty()) - d->icon.setName(name); - - QUrl source = actionIcon.source(); - if (!source.isEmpty()) - d->icon.setSource(source); - - int width = actionIcon.width(); - if (width > 0) - d->icon.setWidth(width); - - int height = actionIcon.height(); - if (height) - d->icon.setHeight(height); - - QColor color = actionIcon.color(); - if (color != Qt::transparent) - d->icon.setColor(color); - setChecked(action->isChecked()); setCheckable(action->isCheckable()); setEnabled(action->isEnabled()); @@ -840,6 +830,8 @@ void QQuickAbstractButton::setAction(QQuickAction *action) if (oldText != text()) buttonChange(ButtonTextChange); + d->updateEffectiveIcon(); + emit actionChanged(); } diff --git a/src/quicktemplates2/qquickabstractbutton_p_p.h b/src/quicktemplates2/qquickabstractbutton_p_p.h index 1c493cd8..bb74e143 100644 --- a/src/quicktemplates2/qquickabstractbutton_p_p.h +++ b/src/quicktemplates2/qquickabstractbutton_p_p.h @@ -96,6 +96,8 @@ public: void actionTextChange(); void setText(const QString &text, bool isExplicit); + void updateEffectiveIcon(); + void click(); void trigger(); void toggle(bool value); @@ -124,6 +126,7 @@ public: QKeySequence shortcut; #endif QQuickIcon icon; + QQuickIcon effectiveIcon; QPointF pressPoint; QPointF movePoint; Qt::MouseButtons pressButtons; diff --git a/src/quicktemplates2/qquickcontrol.cpp b/src/quicktemplates2/qquickcontrol.cpp index bb5bf668..9f796a70 100644 --- a/src/quicktemplates2/qquickcontrol.cpp +++ b/src/quicktemplates2/qquickcontrol.cpp @@ -159,11 +159,19 @@ bool QQuickControlPrivate::acceptTouch(const QTouchEvent::TouchPoint &point) } #endif +static void setActiveFocus(QQuickControl *control, Qt::FocusReason reason) +{ + QQuickControlPrivate *d = QQuickControlPrivate::get(control); + if (d->subFocusItem && d->window && d->flags & QQuickItem::ItemIsFocusScope) + QQuickWindowPrivate::get(d->window)->clearFocusInScope(control, d->subFocusItem, reason); + control->forceActiveFocus(reason); +} + void QQuickControlPrivate::handlePress(const QPointF &) { Q_Q(QQuickControl); if ((focusPolicy & Qt::ClickFocus) == Qt::ClickFocus && !QGuiApplication::styleHints()->setFocusOnTouchRelease()) - q->forceActiveFocus(Qt::MouseFocusReason); + setActiveFocus(q, Qt::MouseFocusReason); } void QQuickControlPrivate::handleMove(const QPointF &point) @@ -180,7 +188,7 @@ void QQuickControlPrivate::handleRelease(const QPointF &) { Q_Q(QQuickControl); if ((focusPolicy & Qt::ClickFocus) == Qt::ClickFocus && QGuiApplication::styleHints()->setFocusOnTouchRelease()) - q->forceActiveFocus(Qt::MouseFocusReason); + setActiveFocus(q, Qt::MouseFocusReason); touchId = -1; } @@ -1582,7 +1590,7 @@ void QQuickControl::wheelEvent(QWheelEvent *event) { Q_D(QQuickControl); if ((d->focusPolicy & Qt::WheelFocus) == Qt::WheelFocus) - forceActiveFocus(Qt::MouseFocusReason); + setActiveFocus(this, Qt::MouseFocusReason); event->setAccepted(d->wheelEnabled); } diff --git a/src/quicktemplates2/qquickicon.cpp b/src/quicktemplates2/qquickicon.cpp index 0b0127d3..79af62b1 100644 --- a/src/quicktemplates2/qquickicon.cpp +++ b/src/quicktemplates2/qquickicon.cpp @@ -44,7 +44,8 @@ public: QQuickIconPrivate() : width(0), height(0), - color(Qt::transparent) + color(Qt::transparent), + resolveMask(0) { } @@ -53,6 +54,18 @@ public: int width; int height; QColor color; + + enum ResolveProperties { + NameResolved = 0x0001, + SourceResolved = 0x0002, + WidthResolved = 0x0004, + HeightResolved = 0x0008, + ColorResolved = 0x0010, + AllPropertiesResolved = 0x1ffff + }; + + // This is based on QFont's resolve_mask. + int resolveMask; }; QQuickIcon::QQuickIcon() @@ -101,7 +114,17 @@ QString QQuickIcon::name() const void QQuickIcon::setName(const QString &name) { + if ((d->resolveMask & QQuickIconPrivate::NameResolved) && d->name == name) + return; + d->name = name; + d->resolveMask |= QQuickIconPrivate::NameResolved; +} + +void QQuickIcon::resetName() +{ + d->name = QString(); + d->resolveMask &= ~QQuickIconPrivate::NameResolved; } QUrl QQuickIcon::source() const @@ -111,7 +134,17 @@ QUrl QQuickIcon::source() const void QQuickIcon::setSource(const QUrl &source) { + if ((d->resolveMask & QQuickIconPrivate::SourceResolved) && d->source == source) + return; + d->source = source; + d->resolveMask |= QQuickIconPrivate::SourceResolved; +} + +void QQuickIcon::resetSource() +{ + d->source = QString(); + d->resolveMask &= ~QQuickIconPrivate::SourceResolved; } int QQuickIcon::width() const @@ -121,7 +154,17 @@ int QQuickIcon::width() const void QQuickIcon::setWidth(int width) { + if ((d->resolveMask & QQuickIconPrivate::WidthResolved) && d->width == width) + return; + d->width = width; + d->resolveMask |= QQuickIconPrivate::WidthResolved; +} + +void QQuickIcon::resetWidth() +{ + d->width = 0; + d->resolveMask &= ~QQuickIconPrivate::WidthResolved; } int QQuickIcon::height() const @@ -131,7 +174,17 @@ int QQuickIcon::height() const void QQuickIcon::setHeight(int height) { + if ((d->resolveMask & QQuickIconPrivate::HeightResolved) && d->height == height) + return; + d->height = height; + d->resolveMask |= QQuickIconPrivate::HeightResolved; +} + +void QQuickIcon::resetHeight() +{ + d->height = 0; + d->resolveMask &= ~QQuickIconPrivate::HeightResolved; } QColor QQuickIcon::color() const @@ -141,12 +194,39 @@ QColor QQuickIcon::color() const void QQuickIcon::setColor(const QColor &color) { + if ((d->resolveMask & QQuickIconPrivate::ColorResolved) && d->color == color) + return; + d->color = color; + d->resolveMask |= QQuickIconPrivate::ColorResolved; } void QQuickIcon::resetColor() { d->color = Qt::transparent; + d->resolveMask &= ~QQuickIconPrivate::ColorResolved; +} + +QQuickIcon QQuickIcon::resolve(const QQuickIcon &other) const +{ + QQuickIcon resolved = *this; + + if (!(d->resolveMask & QQuickIconPrivate::NameResolved)) + resolved.setName(other.name()); + + if (!(d->resolveMask & QQuickIconPrivate::SourceResolved)) + resolved.setSource(other.source()); + + if (!(d->resolveMask & QQuickIconPrivate::WidthResolved)) + resolved.setWidth(other.width()); + + if (!(d->resolveMask & QQuickIconPrivate::HeightResolved)) + resolved.setHeight(other.height()); + + if (!(d->resolveMask & QQuickIconPrivate::ColorResolved)) + resolved.setColor(other.color()); + + return resolved; } QT_END_NAMESPACE diff --git a/src/quicktemplates2/qquickicon_p.h b/src/quicktemplates2/qquickicon_p.h index 6e28f2a9..2c95bc9d 100644 --- a/src/quicktemplates2/qquickicon_p.h +++ b/src/quicktemplates2/qquickicon_p.h @@ -62,10 +62,10 @@ class QQuickIconPrivate; class Q_QUICKTEMPLATES2_PRIVATE_EXPORT QQuickIcon { Q_GADGET - Q_PROPERTY(QString name READ name WRITE setName FINAL) - Q_PROPERTY(QUrl source READ source WRITE setSource FINAL) - Q_PROPERTY(int width READ width WRITE setWidth FINAL) - Q_PROPERTY(int height READ height WRITE setHeight FINAL) + Q_PROPERTY(QString name READ name WRITE setName RESET resetName FINAL) + Q_PROPERTY(QUrl source READ source WRITE setSource RESET resetSource FINAL) + Q_PROPERTY(int width READ width WRITE setWidth RESET resetWidth FINAL) + Q_PROPERTY(int height READ height WRITE setHeight RESET resetHeight FINAL) Q_PROPERTY(QColor color READ color WRITE setColor RESET resetColor FINAL) public: @@ -81,20 +81,26 @@ public: QString name() const; void setName(const QString &name); + void resetName(); QUrl source() const; void setSource(const QUrl &source); + void resetSource(); int width() const; void setWidth(int width); + void resetWidth(); int height() const; void setHeight(int height); + void resetHeight(); QColor color() const; void setColor(const QColor &color); void resetColor(); + QQuickIcon resolve(const QQuickIcon &other) const; + private: QSharedDataPointer<QQuickIconPrivate> d; }; diff --git a/src/quicktemplates2/qquickpopup.cpp b/src/quicktemplates2/qquickpopup.cpp index 1a4c90a4..207a886b 100644 --- a/src/quicktemplates2/qquickpopup.cpp +++ b/src/quicktemplates2/qquickpopup.cpp @@ -450,12 +450,11 @@ bool QQuickPopupPrivate::prepareExitTransition() return false; if (transitionState != ExitTransition) { - if (focus) { - // The setFocus(false) call below removes any active focus before we're - // able to check it in finalizeExitTransition. - hadActiveFocusBeforeExitTransition = popupItem->hasActiveFocus(); + // The setFocus(false) call below removes any active focus before we're + // able to check it in finalizeExitTransition. + hadActiveFocusBeforeExitTransition = popupItem->hasActiveFocus(); + if (focus) popupItem->setFocus(false); - } transitionState = ExitTransition; hideOverlay(); emit q->aboutToHide(); |