aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2018-02-12 13:07:06 +0100
committerLiang Qi <liang.qi@qt.io>2018-02-12 13:07:06 +0100
commit675c150a28ae9f1ca5f4960caeed522da534f6fc (patch)
treef29de6db23985893ed21c8caaf2fbc1e10aa063b /src
parente052684db6e0814a6a3397eb21e3ce9f922563da (diff)
parent95b4996a04989aa26c8fba8aaa90b76b7166c2c1 (diff)
Merge remote-tracking branch 'origin/5.10' into 5.11
Diffstat (limited to 'src')
-rw-r--r--src/imports/controls/TextArea.qml2
-rw-r--r--src/imports/controls/TextField.qml2
-rw-r--r--src/imports/controls/fusion/TextArea.qml2
-rw-r--r--src/imports/controls/fusion/TextField.qml2
-rw-r--r--src/imports/controls/imagine/TextArea.qml2
-rw-r--r--src/imports/controls/imagine/TextField.qml2
-rw-r--r--src/imports/platform/qquickplatformmenu.cpp6
-rw-r--r--src/imports/templates/qtquicktemplates2plugin.cpp3
-rw-r--r--src/quicktemplates2/qquickabstractbutton.cpp50
-rw-r--r--src/quicktemplates2/qquickabstractbutton_p_p.h3
-rw-r--r--src/quicktemplates2/qquickcontrol.cpp14
-rw-r--r--src/quicktemplates2/qquickicon.cpp82
-rw-r--r--src/quicktemplates2/qquickicon_p.h14
-rw-r--r--src/quicktemplates2/qquickpopup.cpp9
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();