aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/imports/controls/material/TabBar.qml8
-rw-r--r--src/imports/controls/material/TabButton.qml5
-rw-r--r--src/imports/controls/material/qquickmaterialtheme.cpp14
-rw-r--r--src/imports/controls/material/qtlabsmaterialstyleplugin.cpp10
-rw-r--r--src/imports/controls/plugins.qmltypes1
-rw-r--r--src/imports/controls/universal/qquickuniversaltheme.cpp13
-rw-r--r--src/imports/controls/universal/qtlabsuniversalstyleplugin.cpp10
-rw-r--r--src/imports/templates/plugins.qmltypes1
-rw-r--r--src/templates/qquickabstractbutton.cpp50
-rw-r--r--src/templates/qquickabstractbutton_p.h1
-rw-r--r--src/templates/qquickabstractbutton_p_p.h6
-rw-r--r--src/templates/qquickrangeslider.cpp42
-rw-r--r--src/templates/qquickslider.cpp16
13 files changed, 143 insertions, 34 deletions
diff --git a/src/imports/controls/material/TabBar.qml b/src/imports/controls/material/TabBar.qml
index 4aaef818..dbc62512 100644
--- a/src/imports/controls/material/TabBar.qml
+++ b/src/imports/controls/material/TabBar.qml
@@ -41,15 +41,17 @@ import Qt.labs.controls.material 1.0
T.TabBar {
id: control
- implicitWidth: Math.max(26, contentItem.implicitWidth + leftPadding + rightPadding)
- implicitHeight: Math.max(26, contentItem.implicitHeight + topPadding + bottomPadding)
+ implicitWidth: Math.max(background ? background.implicitWidth : 0,
+ contentItem.implicitWidth + leftPadding + rightPadding)
+ implicitHeight: Math.max(background ? background.implicitHeight : 0,
+ contentItem.implicitHeight + topPadding + bottomPadding)
spacing: 1
//! [contentItem]
contentItem: ListView {
implicitWidth: contentWidth
- implicitHeight: contentHeight
+ implicitHeight: 48
model: control.contentModel
currentIndex: control.currentIndex
diff --git a/src/imports/controls/material/TabButton.qml b/src/imports/controls/material/TabButton.qml
index 5b7510b4..496513dd 100644
--- a/src/imports/controls/material/TabButton.qml
+++ b/src/imports/controls/material/TabButton.qml
@@ -47,7 +47,7 @@ T.TabButton {
contentItem.contentHeight + topPadding + bottomPadding)
baselineOffset: contentItem.y + contentItem.baselineOffset
- padding: 6
+ padding: 12
//! [contentItem]
contentItem: Text {
@@ -62,8 +62,7 @@ T.TabButton {
//! [background]
background: Item {
- height: parent.height - 1
- implicitHeight: 26
+ implicitHeight: 48
}
//! [background]
}
diff --git a/src/imports/controls/material/qquickmaterialtheme.cpp b/src/imports/controls/material/qquickmaterialtheme.cpp
index 75ca1b8f..4124735a 100644
--- a/src/imports/controls/material/qquickmaterialtheme.cpp
+++ b/src/imports/controls/material/qquickmaterialtheme.cpp
@@ -43,8 +43,18 @@ QT_BEGIN_NAMESPACE
QQuickMaterialTheme::QQuickMaterialTheme(QPlatformTheme *theme)
: QQuickProxyTheme(theme)
{
- systemFont = QFont(QStringLiteral("Roboto"));
- tabButtonFont = QFont(QStringLiteral("Roboto"), 10);
+ QFont font;
+ font.setFamily(QStringLiteral("Roboto"));
+ if (!font.exactMatch())
+ font.setFamily(QStringLiteral("Noto"));
+
+ if (font.exactMatch()) {
+ systemFont.setFamily(font.family());
+ tabButtonFont.setFamily(font.family());
+ }
+
+ tabButtonFont.setPixelSize(14);
+ tabButtonFont.setCapitalization(QFont::AllUppercase);
}
QQuickMaterialTheme::~QQuickMaterialTheme()
diff --git a/src/imports/controls/material/qtlabsmaterialstyleplugin.cpp b/src/imports/controls/material/qtlabsmaterialstyleplugin.cpp
index 6370f78d..e4b44890 100644
--- a/src/imports/controls/material/qtlabsmaterialstyleplugin.cpp
+++ b/src/imports/controls/material/qtlabsmaterialstyleplugin.cpp
@@ -94,12 +94,10 @@ void QtLabsMaterialStylePlugin::initializeEngine(QQmlEngine *engine, const char
QQuickStyleSelector selector;
if (selector.style() == QLatin1String("material")) {
- if (QFont(QStringLiteral("Roboto")).exactMatch()) {
- QPlatformTheme *old = QGuiApplicationPrivate::platform_theme;
- if (old) {
- QQuickProxyTheme *theme = new QQuickMaterialTheme(old);
- QGuiApplicationPrivate::platform_theme = theme;
- }
+ QPlatformTheme *old = QGuiApplicationPrivate::platform_theme;
+ if (old) {
+ QQuickProxyTheme *theme = new QQuickMaterialTheme(old);
+ QGuiApplicationPrivate::platform_theme = theme;
}
}
diff --git a/src/imports/controls/plugins.qmltypes b/src/imports/controls/plugins.qmltypes
index 73f905f2..91553625 100644
--- a/src/imports/controls/plugins.qmltypes
+++ b/src/imports/controls/plugins.qmltypes
@@ -32,6 +32,7 @@ Module {
Signal { name: "released" }
Signal { name: "canceled" }
Signal { name: "clicked" }
+ Signal { name: "pressAndHold" }
Signal { name: "doubleClicked" }
Method { name: "toggle" }
}
diff --git a/src/imports/controls/universal/qquickuniversaltheme.cpp b/src/imports/controls/universal/qquickuniversaltheme.cpp
index e3899d53..290faa5d 100644
--- a/src/imports/controls/universal/qquickuniversaltheme.cpp
+++ b/src/imports/controls/universal/qquickuniversaltheme.cpp
@@ -43,11 +43,18 @@ QT_BEGIN_NAMESPACE
QQuickUniversalTheme::QQuickUniversalTheme(QPlatformTheme *theme)
: QQuickProxyTheme(theme)
{
- systemFont = QFont(QStringLiteral("Segoe UI"));
+ const QFont font(QStringLiteral("Segoe UI"));
+ if (font.exactMatch()) {
+ systemFont.setFamily(font.family());
+ groupBoxTitleFont.setFamily(font.family());
+ tabButtonFont.setFamily(font.family());
+ }
+
systemFont.setPixelSize(15);
- groupBoxTitleFont = systemFont;
+
+ groupBoxTitleFont.setPixelSize(15);
groupBoxTitleFont.setWeight(QFont::DemiBold);
- tabButtonFont = QFont(QStringLiteral("Segoe UI"));
+
tabButtonFont.setPixelSize(24);
tabButtonFont.setWeight(QFont::Light);
}
diff --git a/src/imports/controls/universal/qtlabsuniversalstyleplugin.cpp b/src/imports/controls/universal/qtlabsuniversalstyleplugin.cpp
index 6d9d8c8a..51a71ea1 100644
--- a/src/imports/controls/universal/qtlabsuniversalstyleplugin.cpp
+++ b/src/imports/controls/universal/qtlabsuniversalstyleplugin.cpp
@@ -93,12 +93,10 @@ void QtLabsUniversalStylePlugin::initializeEngine(QQmlEngine *engine, const char
{
QQuickStyleSelector selector;
if (selector.style() == QLatin1String("universal")) {
- if (QFont(QStringLiteral("Segoe UI")).exactMatch()) {
- QPlatformTheme *old = QGuiApplicationPrivate::platform_theme;
- if (old) {
- QQuickProxyTheme *theme = new QQuickUniversalTheme(old);
- QGuiApplicationPrivate::platform_theme = theme;
- }
+ QPlatformTheme *old = QGuiApplicationPrivate::platform_theme;
+ if (old) {
+ QQuickProxyTheme *theme = new QQuickUniversalTheme(old);
+ QGuiApplicationPrivate::platform_theme = theme;
}
}
diff --git a/src/imports/templates/plugins.qmltypes b/src/imports/templates/plugins.qmltypes
index 792d4e95..1879dc6c 100644
--- a/src/imports/templates/plugins.qmltypes
+++ b/src/imports/templates/plugins.qmltypes
@@ -26,6 +26,7 @@ Module {
Signal { name: "released" }
Signal { name: "canceled" }
Signal { name: "clicked" }
+ Signal { name: "pressAndHold" }
Signal { name: "doubleClicked" }
Method { name: "toggle" }
}
diff --git a/src/templates/qquickabstractbutton.cpp b/src/templates/qquickabstractbutton.cpp
index 9f1667fe..aed7ed5d 100644
--- a/src/templates/qquickabstractbutton.cpp
+++ b/src/templates/qquickabstractbutton.cpp
@@ -38,6 +38,7 @@
#include "qquickabstractbutton_p_p.h"
#include "qquickbuttongroup_p.h"
+#include <QtGui/qstylehints.h>
#include <QtGui/qguiapplication.h>
#include <QtQuick/private/qquickevents_p_p.h>
#include <QtQml/qqmllist.h>
@@ -93,15 +94,44 @@ static const int AUTO_REPEAT_INTERVAL = 100;
*/
/*!
+ \qmlsignal Qt.labs.controls::AbstractButton::pressAndHold()
+
+ This signal is emitted when the button is interactively perssed and held down by the user.
+*/
+
+/*!
\qmlsignal Qt.labs.controls::AbstractButton::doubleClicked()
This signal is emitted when the button is interactively double clicked by the user.
*/
QQuickAbstractButtonPrivate::QQuickAbstractButtonPrivate() :
- pressed(false), checked(false), checkable(false), highlighted(false), autoExclusive(false), autoRepeat(false),
- delayTimer(0), repeatTimer(0), repeatButton(Qt::NoButton), indicator(nullptr), group(nullptr)
+ pressed(false), checked(false), checkable(false), highlighted(false), autoExclusive(false), autoRepeat(false), wasHeld(false),
+ holdTimer(0), delayTimer(0), repeatTimer(0), repeatButton(Qt::NoButton), indicator(nullptr), group(nullptr)
+{
+}
+
+bool QQuickAbstractButtonPrivate::isPressAndHoldConnected()
{
+ Q_Q(QQuickAbstractButton);
+ IS_SIGNAL_CONNECTED(q, QQuickAbstractButton, pressAndHold, ());
+}
+
+void QQuickAbstractButtonPrivate::startPressAndHold()
+{
+ Q_Q(QQuickAbstractButton);
+ wasHeld = false;
+ if (isPressAndHoldConnected())
+ holdTimer = q->startTimer(QGuiApplication::styleHints()->mousePressAndHoldInterval());
+}
+
+void QQuickAbstractButtonPrivate::stopPressAndHold()
+{
+ Q_Q(QQuickAbstractButton);
+ if (holdTimer > 0) {
+ q->killTimer(holdTimer);
+ holdTimer = 0;
+ }
}
void QQuickAbstractButtonPrivate::startRepeatDelay()
@@ -460,6 +490,8 @@ void QQuickAbstractButton::mousePressEvent(QMouseEvent *event)
if (d->autoRepeat) {
d->startRepeatDelay();
d->repeatButton = event->button();
+ } else {
+ d->startPressAndHold();
}
}
@@ -471,6 +503,8 @@ void QQuickAbstractButton::mouseMoveEvent(QMouseEvent *event)
if (d->autoRepeat)
d->stopPressRepeat();
+ else if (!d->pressed)
+ d->stopPressAndHold();
}
void QQuickAbstractButton::mouseReleaseEvent(QMouseEvent *event)
@@ -482,7 +516,8 @@ void QQuickAbstractButton::mouseReleaseEvent(QMouseEvent *event)
if (wasPressed) {
emit released();
- emit clicked();
+ if (!d->wasHeld)
+ emit clicked();
} else {
emit canceled();
}
@@ -492,6 +527,8 @@ void QQuickAbstractButton::mouseReleaseEvent(QMouseEvent *event)
if (d->autoRepeat)
d->stopPressRepeat();
+ else
+ d->stopPressAndHold();
}
void QQuickAbstractButton::mouseDoubleClickEvent(QMouseEvent *event)
@@ -507,6 +544,7 @@ void QQuickAbstractButton::mouseUngrabEvent()
if (d->pressed) {
setPressed(false);
d->stopPressRepeat();
+ d->stopPressAndHold();
emit canceled();
}
}
@@ -515,7 +553,11 @@ void QQuickAbstractButton::timerEvent(QTimerEvent *event)
{
Q_D(QQuickAbstractButton);
QQuickControl::timerEvent(event);
- if (event->timerId() == d->delayTimer) {
+ if (event->timerId() == d->holdTimer) {
+ d->stopPressAndHold();
+ d->wasHeld = true;
+ emit pressAndHold();
+ } else if (event->timerId() == d->delayTimer) {
d->startPressRepeat();
} else if (event->timerId() == d->repeatTimer) {
emit released();
diff --git a/src/templates/qquickabstractbutton_p.h b/src/templates/qquickabstractbutton_p.h
index 7ff98f66..9469e706 100644
--- a/src/templates/qquickabstractbutton_p.h
+++ b/src/templates/qquickabstractbutton_p.h
@@ -102,6 +102,7 @@ Q_SIGNALS:
void released();
void canceled();
void clicked();
+ void pressAndHold();
void doubleClicked();
void textChanged();
void pressedChanged();
diff --git a/src/templates/qquickabstractbutton_p_p.h b/src/templates/qquickabstractbutton_p_p.h
index be53946a..409fd52e 100644
--- a/src/templates/qquickabstractbutton_p_p.h
+++ b/src/templates/qquickabstractbutton_p_p.h
@@ -67,6 +67,10 @@ public:
return button->d_func();
}
+ bool isPressAndHoldConnected();
+ void startPressAndHold();
+ void stopPressAndHold();
+
void startRepeatDelay();
void startPressRepeat();
void stopPressRepeat();
@@ -81,6 +85,8 @@ public:
bool highlighted;
bool autoExclusive;
bool autoRepeat;
+ bool wasHeld;
+ int holdTimer;
int delayTimer;
int repeatTimer;
QPointF pressPoint;
diff --git a/src/templates/qquickrangeslider.cpp b/src/templates/qquickrangeslider.cpp
index 0dec63cb..11069757 100644
--- a/src/templates/qquickrangeslider.cpp
+++ b/src/templates/qquickrangeslider.cpp
@@ -323,10 +323,15 @@ static qreal valueAt(const QQuickRangeSlider *slider, qreal position)
static qreal snapPosition(const QQuickRangeSlider *slider, qreal position)
{
- const qreal stepSize = slider->stepSize();
- if (qFuzzyIsNull(stepSize))
+ const qreal range = slider->from() + (slider->to() - slider->from());
+ if (qFuzzyIsNull(range))
return position;
- return qRound(position / stepSize) * stepSize;
+
+ const qreal effectiveStep = slider->stepSize() / range;
+ if (qFuzzyIsNull(effectiveStep))
+ return position;
+
+ return qRound(position / effectiveStep) * effectiveStep;
}
static qreal positionAt(const QQuickRangeSlider *slider, QQuickItem *handle, const QPoint &point)
@@ -756,6 +761,31 @@ void QQuickRangeSlider::mousePressEvent(QMouseEvent *event)
} else if (secondHit) {
hitNode = d->second;
otherNode = d->first;
+ } else {
+ // find the nearest
+ const qreal firstDistance = QLineF(firstHandle->boundingRect().center(),
+ mapToItem(firstHandle, event->pos())).length();
+ const qreal secondDistance = QLineF(secondHandle->boundingRect().center(),
+ mapToItem(secondHandle, event->pos())).length();
+
+ if (qFuzzyCompare(firstDistance, secondDistance)) {
+ // same distance => choose the one that can be moved towards the press position
+ const bool inverted = d->from > d->to;
+ const qreal pos = positionAt(this, firstHandle, event->pos());
+ if ((!inverted && pos < d->first->position()) || (inverted && pos > d->first->position())) {
+ hitNode = d->first;
+ otherNode = d->second;
+ } else {
+ hitNode = d->second;
+ otherNode = d->first;
+ }
+ } else if (firstDistance < secondDistance) {
+ hitNode = d->first;
+ otherNode = d->second;
+ } else {
+ hitNode = d->second;
+ otherNode = d->first;
+ }
}
if (hitNode) {
@@ -803,7 +833,11 @@ void QQuickRangeSlider::mouseReleaseEvent(QMouseEvent *event)
qreal pos = positionAt(this, pressedNode->handle(), event->pos());
if (d->snapMode != NoSnap)
pos = snapPosition(this, pos);
- pressedNode->setValue(valueAt(this, pos));
+ qreal val = valueAt(this, pos);
+ if (!qFuzzyCompare(val, pressedNode->value()))
+ pressedNode->setValue(val);
+ else if (d->snapMode != NoSnap)
+ QQuickRangeSliderNodePrivate::get(pressedNode)->setPosition(pos);
setKeepMouseGrab(false);
pressedNode->setPressed(false);
}
diff --git a/src/templates/qquickslider.cpp b/src/templates/qquickslider.cpp
index ae7d3508..e6163e0c 100644
--- a/src/templates/qquickslider.cpp
+++ b/src/templates/qquickslider.cpp
@@ -110,9 +110,15 @@ qreal QQuickSliderPrivate::valueAt(qreal position) const
qreal QQuickSliderPrivate::snapPosition(qreal position) const
{
- if (qFuzzyIsNull(stepSize))
+ const qreal range = from + (to - from);
+ if (qFuzzyIsNull(range))
return position;
- return qRound(position / stepSize) * stepSize;
+
+ const qreal effectiveStep = stepSize / range;
+ if (qFuzzyIsNull(effectiveStep))
+ return position;
+
+ return qRound(position / effectiveStep) * effectiveStep;
}
qreal QQuickSliderPrivate::positionAt(const QPoint &point) const
@@ -531,7 +537,11 @@ void QQuickSlider::mouseReleaseEvent(QMouseEvent *event)
qreal pos = d->positionAt(event->pos());
if (d->snapMode != NoSnap)
pos = d->snapPosition(pos);
- setValue(d->valueAt(pos));
+ qreal val = d->valueAt(pos);
+ if (!qFuzzyCompare(val, d->value))
+ setValue(val);
+ else if (d->snapMode != NoSnap)
+ d->setPosition(pos);
setKeepMouseGrab(false);
}
setPressed(false);