summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/controls/Private/qquickspinboxvalidator.cpp4
-rw-r--r--src/controls/TableView.qml49
-rw-r--r--src/controls/qquickpopupwindow.cpp3
-rw-r--r--src/dialogs/DefaultFontDialog.qml52
-rw-r--r--src/dialogs/plugin.cpp32
-rw-r--r--src/dialogs/qquickabstractdialog.cpp31
-rw-r--r--tests/auto/controls/data/tst_spinbox.qml6
7 files changed, 105 insertions, 72 deletions
diff --git a/src/controls/Private/qquickspinboxvalidator.cpp b/src/controls/Private/qquickspinboxvalidator.cpp
index afbc866c..2fec79e8 100644
--- a/src/controls/Private/qquickspinboxvalidator.cpp
+++ b/src/controls/Private/qquickspinboxvalidator.cpp
@@ -200,7 +200,9 @@ QValidator::State QQuickSpinBoxValidator::validate(QString &input, int &pos) con
bool ok = false;
qreal val = locale().toDouble(value, &ok);
if (ok) {
- if (state == QValidator::Acceptable) {
+ if (state == QValidator::Acceptable ||
+ (state == QValidator::Intermediate && val >= 0 && val <= m_validator.top()) ||
+ (state == QValidator::Intermediate && val < 0 && val >= m_validator.bottom())) {
const_cast<QQuickSpinBoxValidator *>(this)->setValue(val);
if (input != textFromValue(val))
state = QValidator::Intermediate;
diff --git a/src/controls/TableView.qml b/src/controls/TableView.qml
index df4c941f..fb940c44 100644
--- a/src/controls/TableView.qml
+++ b/src/controls/TableView.qml
@@ -56,25 +56,42 @@ import QtQuick.Window 2.1
A TableView is similar to \l ListView, and adds scroll bars, selection, and
resizable header sections. As with \l ListView, data for each row is provided through a \l model:
- \code
- ListModel {
- id: libraryModel
- ListElement{ title: "A Masterpiece" ; author: "Gabriel" }
- ListElement{ title: "Brilliance" ; author: "Jens" }
- ListElement{ title: "Outstanding" ; author: "Frederik" }
- }
- \endcode
+ \code
+ ListModel {
+ id: libraryModel
+ ListElement {
+ title: "A Masterpiece"
+ author: "Gabriel"
+ }
+ ListElement {
+ title: "Brilliance"
+ author: "Jens"
+ }
+ ListElement {
+ title: "Outstanding"
+ author: "Frederik"
+ }
+ }
+ \endcode
You provide title and size of a column header
by adding a \l TableViewColumn as demonstrated below.
- \code
-
- TableView {
- TableViewColumn{ role: "title" ; title: "Title" ; width: 100 }
- TableViewColumn{ role: "author" ; title: "Author" ; width: 200 }
- model: libraryModel
- }
- \endcode
+
+ \code
+ TableView {
+ TableViewColumn {
+ role: "title"
+ title: "Title"
+ width: 100
+ }
+ TableViewColumn {
+ role: "author"
+ title: "Author"
+ width: 200
+ }
+ model: libraryModel
+ }
+ \endcode
The header sections are attached to values in the \l model by defining
the model role they attach to. Each property in the model will
diff --git a/src/controls/qquickpopupwindow.cpp b/src/controls/qquickpopupwindow.cpp
index 70b27758..fa7ebee1 100644
--- a/src/controls/qquickpopupwindow.cpp
+++ b/src/controls/qquickpopupwindow.cpp
@@ -180,7 +180,8 @@ void QQuickPopupWindow::forwardEventToTransientParent(QMouseEvent *e)
|| e->type() == QEvent::MouseButtonPress)) {
// Clicked outside any popup
dismissPopup();
- } else if (transientParent()) {
+ }
+ if (transientParent()) {
QPoint parentPos = transientParent()->mapFromGlobal(mapToGlobal(e->pos()));
QMouseEvent pe = QMouseEvent(e->type(), parentPos, e->button(), e->buttons(), e->modifiers());
QGuiApplication::sendEvent(transientParent(), &pe);
diff --git a/src/dialogs/DefaultFontDialog.qml b/src/dialogs/DefaultFontDialog.qml
index 26f92466..d5c4570a 100644
--- a/src/dialogs/DefaultFontDialog.qml
+++ b/src/dialogs/DefaultFontDialog.qml
@@ -58,8 +58,8 @@ AbstractFontDialog {
id: content
SystemPalette { id: palette }
- implicitWidth: Math.min(root.__maximumDimension, Math.max(Screen.pixelDensity * 60, mainLayout.implicitWidth + outerSpacing * 2))
- implicitHeight: Math.min(root.__maximumDimension, Math.max(Screen.pixelDensity * 40, mainLayout.implicitHeight + outerSpacing * 2))
+ implicitWidth: Math.min(root.__maximumDimension, Math.max(Screen.pixelDensity * 100, mainLayout.implicitWidth + outerSpacing * 2))
+ implicitHeight: Math.min(root.__maximumDimension, Math.max(Screen.pixelDensity * 60, mainLayout.implicitHeight + outerSpacing * 2))
property real spacing: 6
property real outerSpacing: 12
color: palette.window
@@ -126,7 +126,7 @@ AbstractFontDialog {
focus: true
Layout.fillWidth: true
Layout.fillHeight: true
- Layout.minimumWidth: fontColumn.width
+ Layout.preferredWidth: fontColumn.width
headerVisible: false
function reset() {
fontModel.findIndex()
@@ -200,7 +200,7 @@ AbstractFontDialog {
function reset() {
weightModel.findIndex()
}
- TableViewColumn{ id: weightColumn; role: "name"; title: qsTr("Weight") }
+ TableViewColumn { id: weightColumn; role: "name"; title: qsTr("Weight") }
model: ListModel {
id: weightModel
ListElement {
@@ -339,28 +339,6 @@ AbstractFontDialog {
}
Item { Layout.fillHeight: true; } //spacer
Label { id: writingSystemLabel; text: qsTr("Writing System"); font.bold: true }
- ComboBox {
- id: wsComboBox
- function reset() {
- if (wsModel.count > 0) {
- currentIndex = 0
- }
- }
- textRole: "name"
- model: WritingSystemListModel {
- id: wsModel
- Component.onCompleted: wsComboBox.reset()
- }
- onCurrentIndexChanged: {
- if (currentIndex == -1)
- return
-
- content.writingSystem = wsModel.get(currentIndex).name
- fontModel.writingSystem = content.writingSystem
- content.writingSystemSample = wsModel.get(currentIndex).sample
- fontListView.reset()
- }
- }
}
ColumnLayout {
@@ -397,6 +375,28 @@ AbstractFontDialog {
id: buttonRow
Layout.columnSpan: 3
spacing: content.spacing
+ ComboBox {
+ id: wsComboBox
+ function reset() {
+ if (wsModel.count > 0) {
+ currentIndex = 0
+ }
+ }
+ textRole: "name"
+ model: WritingSystemListModel {
+ id: wsModel
+ Component.onCompleted: wsComboBox.reset()
+ }
+ onCurrentIndexChanged: {
+ if (currentIndex == -1)
+ return
+
+ content.writingSystem = wsModel.get(currentIndex).name
+ fontModel.writingSystem = content.writingSystem
+ content.writingSystemSample = wsModel.get(currentIndex).sample
+ fontListView.reset()
+ }
+ }
Item { Layout.fillWidth: true; } //spacer
Button {
text: qsTr("Cancel")
diff --git a/src/dialogs/plugin.cpp b/src/dialogs/plugin.cpp
index 1d701cbe..be71ffe8 100644
--- a/src/dialogs/plugin.cpp
+++ b/src/dialogs/plugin.cpp
@@ -53,7 +53,8 @@
#include <QTouchDevice>
//#define PURE_QML_ONLY
-//#define DEBUG_REGISTRATION
+
+Q_LOGGING_CATEGORY(lcRegistration, "qt.quick.dialogs.registration")
static void initResources()
{
@@ -86,11 +87,7 @@ public:
QtQuick2DialogsPlugin() : QQmlExtensionPlugin(), m_useResources(true) { }
virtual void initializeEngine(QQmlEngine *engine, const char * uri) {
-#ifdef DEBUG_REGISTRATION
- qDebug() << Q_FUNC_INFO << uri << m_decorationComponentUrl;
-#else
- Q_UNUSED(uri)
-#endif
+ qCDebug(lcRegistration) << uri << m_decorationComponentUrl;
QQuickAbstractDialog::m_decorationComponent =
new QQmlComponent(engine, m_decorationComponentUrl, QQmlComponent::Asynchronous);
}
@@ -98,12 +95,10 @@ public:
virtual void registerTypes(const char *uri) {
initResources();
-#ifdef DEBUG_REGISTRATION
- qDebug() << Q_FUNC_INFO << uri;
-#endif
Q_ASSERT(QLatin1String(uri) == QLatin1String("QtQuick.Dialogs"));
bool hasTopLevelWindows = QGuiApplicationPrivate::platformIntegration()->
hasCapability(QPlatformIntegration::MultipleWindows);
+ qCDebug(lcRegistration) << uri << "can use top-level windows?" << hasTopLevelWindows;
QDir qmlDir(baseUrl().toLocalFile());
QDir widgetsDir(baseUrl().toLocalFile());
widgetsDir.cd("../PrivateWidgets");
@@ -165,9 +160,7 @@ public:
QUrl dialogQmlPath = m_useResources ?
QUrl("qrc:/QtQuick/Dialogs/DefaultDialogWrapper.qml") :
QUrl::fromLocalFile(qmlDir.filePath("DefaultDialogWrapper.qml"));
-#ifdef DEBUG_REGISTRATION
- qDebug() << " registering DefaultDialogWrapper.qml as Dialog; success?" <<
-#endif
+ qCDebug(lcRegistration) << " registering" << dialogQmlPath << "as Dialog";
qmlRegisterType(dialogQmlPath, uri, 1, 2, "Dialog");
}
}
@@ -176,11 +169,8 @@ protected:
template <class WrapperType>
void registerWidgetOrQmlImplementation(QDir widgetsDir, QDir qmlDir,
const char *qmlName, const char *uri, bool hasTopLevelWindows, int versionMajor, int versionMinor) {
- // qDebug() << "QtQuick2DialogsPlugin::registerWidgetOrQmlImplementation" << uri << qmlName << ": QML in" << qmlDir.absolutePath()
- // << "using resources?" << m_useResources << "; widgets in" << widgetsDir.absolutePath();
-#ifdef DEBUG_REGISTRATION
- qDebug() << Q_FUNC_INFO << qmlDir << qmlName << uri;
-#endif
+ qCDebug(lcRegistration) << qmlName << uri << ": QML in" << qmlDir.absolutePath()
+ << "using resources?" << m_useResources << "; widgets in" << widgetsDir.absolutePath();
bool needQmlImplementation = true;
#ifdef PURE_QML_ONLY
@@ -207,9 +197,7 @@ protected:
QUrl::fromLocalFile(qmlDir.filePath(QString("Widget%1.qml").arg(qmlName)));
if (qmlRegisterType(dialogQmlPath, uri, versionMajor, versionMinor, qmlName) >= 0) {
needQmlImplementation = false;
-#ifdef DEBUG_REGISTRATION
- qDebug() << " registering" << qmlName << " as " << dialogQmlPath << "success?" << !needQmlImplementation;
-#endif
+ qCDebug(lcRegistration) << " registering" << qmlName << " as " << dialogQmlPath << "success?" << !needQmlImplementation;
}
}
#endif
@@ -219,9 +207,7 @@ protected:
QUrl dialogQmlPath = m_useResources ?
QUrl(QString("qrc:/QtQuick/Dialogs/Default%1.qml").arg(qmlName)) :
QUrl::fromLocalFile(qmlDir.filePath(QString("Default%1.qml").arg(qmlName)));
-#ifdef DEBUG_REGISTRATION
- qDebug() << " registering" << qmlName << " as " << dialogQmlPath << "success?" <<
-#endif
+ qCDebug(lcRegistration) << " registering" << qmlName << " as " << dialogQmlPath;
qmlRegisterType(dialogQmlPath, uri, versionMajor, versionMinor, qmlName);
}
}
diff --git a/src/dialogs/qquickabstractdialog.cpp b/src/dialogs/qquickabstractdialog.cpp
index 6cad340f..92fd04f4 100644
--- a/src/dialogs/qquickabstractdialog.cpp
+++ b/src/dialogs/qquickabstractdialog.cpp
@@ -36,6 +36,7 @@
#include <private/qguiapplication_p.h>
#include <private/qqmlglobal_p.h>
+#include <QLoggingCategory>
#include <QWindow>
#include <QQmlComponent>
#include <QQuickWindow>
@@ -43,6 +44,8 @@
QT_BEGIN_NAMESPACE
+Q_LOGGING_CATEGORY(lcWindow, "qt.quick.dialogs.window")
+
QQmlComponent *QQuickAbstractDialog::m_decorationComponent(0);
QQuickAbstractDialog::QQuickAbstractDialog(QObject *parent)
@@ -71,6 +74,7 @@ void QQuickAbstractDialog::setVisible(bool v)
if (m_visible == v) return;
m_visible = v;
if (helper()) {
+ qCDebug(lcWindow) << "via helper" << helper();
if (v) {
Qt::WindowFlags flags = Qt::Dialog;
if (!title().isEmpty())
@@ -108,6 +112,7 @@ void QQuickAbstractDialog::setVisible(bool v)
m_dialogWindow->setMinimumSize(minSize);
connect(win, SIGNAL(widthChanged(int)), this, SLOT(windowGeometryChanged()));
connect(win, SIGNAL(heightChanged(int)), this, SLOT(windowGeometryChanged()));
+ qCDebug(lcWindow) << "created window" << win;
}
if (!m_dialogWindow) {
@@ -129,6 +134,7 @@ void QQuickAbstractDialog::setVisible(bool v)
}
// Window decoration wasn't possible, so just reparent it into the scene
else {
+ qCDebug(lcWindow) << "no window and no decoration";
m_contentItem->setParentItem(parentWindow()->contentItem());
m_contentItem->setZ(10000);
}
@@ -138,9 +144,11 @@ void QQuickAbstractDialog::setVisible(bool v)
if (m_dialogWindow) {
// "grow up" to the size and position expected to achieve
if (!m_sizeAspiration.isNull()) {
- if (m_hasAspiredPosition)
+ if (m_hasAspiredPosition) {
+ qCDebug(lcWindow) << "geometry aspiration" << m_sizeAspiration;
m_dialogWindow->setGeometry(m_sizeAspiration);
- else {
+ } else {
+ qCDebug(lcWindow) << "size aspiration" << m_sizeAspiration.size();
if (m_sizeAspiration.width() > 0)
m_dialogWindow->setWidth(m_sizeAspiration.width());
if (m_sizeAspiration.height() > 0)
@@ -191,6 +199,7 @@ void QQuickAbstractDialog::decorationLoaded()
m_windowDecoration->setProperty("content", contentVariant);
connect(m_windowDecoration, SIGNAL(dismissed()), this, SLOT(reject()));
ok = true;
+ qCDebug(lcWindow) << "using synthetic window decoration" << m_windowDecoration;
} else {
qWarning() << m_decorationComponent->url() <<
"cannot be used as a window decoration because it's not an Item";
@@ -203,12 +212,14 @@ void QQuickAbstractDialog::decorationLoaded()
if (!ok) {
m_contentItem->setParentItem(parentItem);
m_contentItem->setZ(10000);
+ qCDebug(lcWindow) << "no decoration";
}
}
void QQuickAbstractDialog::setModality(Qt::WindowModality m)
{
if (m_modality == m) return;
+ qCDebug(lcWindow) << "modality" << m;
m_modality = m;
emit modalityChanged();
}
@@ -228,12 +239,14 @@ void QQuickAbstractDialog::reject()
void QQuickAbstractDialog::visibleChanged(bool v)
{
m_visible = v;
+ qCDebug(lcWindow) << "visible" << v;
emit visibilityChanged();
}
void QQuickAbstractDialog::windowGeometryChanged()
{
if (m_dialogWindow && m_contentItem) {
+ qCDebug(lcWindow) << m_dialogWindow->geometry();
m_contentItem->setWidth(m_dialogWindow->width());
m_contentItem->setHeight(m_dialogWindow->height());
}
@@ -241,18 +254,23 @@ void QQuickAbstractDialog::windowGeometryChanged()
void QQuickAbstractDialog::minimumWidthChanged()
{
- m_dialogWindow->setMinimumWidth(qMax(m_contentItem->implicitWidth(),
- m_contentItem->property("minimumWidth").toReal()));
+ qreal min = m_contentItem->property("minimumWidth").toReal();
+ qCDebug(lcWindow) << "content implicitWidth" << m_contentItem->implicitWidth() << "minimumWidth" << min;
+ m_dialogWindow->setMinimumWidth(qMax(m_contentItem->implicitWidth(), min));
}
void QQuickAbstractDialog::minimumHeightChanged()
{
+ qreal min = m_contentItem->property("minimumHeight").toReal();
+ qCDebug(lcWindow) << "content implicitHeight" << m_contentItem->implicitHeight() << "minimumHeight" << min;
m_dialogWindow->setMinimumHeight(qMax(m_contentItem->implicitHeight(),
m_contentItem->property("minimumHeight").toReal()));
}
void QQuickAbstractDialog::implicitHeightChanged()
{
+ qCDebug(lcWindow) << "content implicitHeight" << m_contentItem->implicitHeight()
+ << "window minimumHeight" << m_dialogWindow->minimumHeight();
if (m_contentItem->implicitHeight() < m_dialogWindow->minimumHeight())
m_dialogWindow->setMinimumHeight(m_contentItem->implicitHeight());
}
@@ -271,6 +289,7 @@ QQuickWindow *QQuickAbstractDialog::parentWindow()
void QQuickAbstractDialog::setContentItem(QQuickItem *obj)
{
m_contentItem = obj;
+ qCDebug(lcWindow) << obj;
if (m_dialogWindow) {
disconnect(this, SLOT(visibleChanged(bool)));
// Can't necessarily delete because m_dialogWindow might have been provided by the QML.
@@ -337,6 +356,7 @@ void QQuickAbstractDialog::setX(int arg)
} else if (m_contentItem) {
m_contentItem->setX(arg);
}
+ qCDebug(lcWindow) << arg;
emit geometryChanged();
}
@@ -352,6 +372,7 @@ void QQuickAbstractDialog::setY(int arg)
} else if (m_contentItem) {
m_contentItem->setY(arg);
}
+ qCDebug(lcWindow) << arg;
emit geometryChanged();
}
@@ -366,6 +387,7 @@ void QQuickAbstractDialog::setWidth(int arg)
} else if (m_contentItem) {
m_contentItem->setWidth(arg);
}
+ qCDebug(lcWindow) << arg;
emit geometryChanged();
}
@@ -380,6 +402,7 @@ void QQuickAbstractDialog::setHeight(int arg)
} else if (m_contentItem) {
m_contentItem->setHeight(arg);
}
+ qCDebug(lcWindow) << arg;
emit geometryChanged();
}
diff --git a/tests/auto/controls/data/tst_spinbox.qml b/tests/auto/controls/data/tst_spinbox.qml
index b22b5a0c..71132ca9 100644
--- a/tests/auto/controls/data/tst_spinbox.qml
+++ b/tests/auto/controls/data/tst_spinbox.qml
@@ -132,7 +132,10 @@ Item {
{tag: "-20", input: [Qt.Key_Minus, Qt.Key_2, Qt.Key_0, Qt.Key_Return], value: -2, minimumValue: -10},
{tag: "-200", input: [Qt.Key_Minus, Qt.Key_2, Qt.Key_0, Qt.Key_0, Qt.Key_Return], value: -20, minimumValue: -100},
{tag: "-2000", input: [Qt.Key_Minus, Qt.Key_2, Qt.Key_0, Qt.Key_0, Qt.Key_0, Qt.Key_Return], value: -200, minimumValue: -1000},
- {tag: "-0123", input: [Qt.Key_Minus, Qt.Key_0, Qt.Key_1, Qt.Key_2, Qt.Key_3, Qt.Key_Return], value: -123, minimumValue: -150}
+ {tag: "-0123", input: [Qt.Key_Minus, Qt.Key_0, Qt.Key_1, Qt.Key_2, Qt.Key_3, Qt.Key_Return], value: -123, minimumValue: -150},
+
+ {tag: "5", input: [Qt.Key_2, Qt.Key_0, Qt.Key_Return], value: 20, minimumValue: 10, maximumValue: 99},
+ {tag: "-5", input: [Qt.Key_Minus, Qt.Key_2, Qt.Key_0, Qt.Key_Return], value: -20, minimumValue: -99, maximumValue: -10},
]
}
@@ -157,6 +160,7 @@ Item {
keyClick(data.input[i])
compare(spinbox.value, data.value)
+ spinbox.destroy()
}
function test_increment_mouse() {