summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.qmake.conf2
-rw-r--r--src/controls/TreeView.qml34
-rw-r--r--src/controls/doc/src/qtquickcontrols-tableview.qdoc1
-rw-r--r--src/controls/doc/src/qtquickcontrols-treeview.qdoc1
-rw-r--r--src/dialogs/plugins.qmltypes294
-rw-r--r--tests/auto/controls/data/tst_menubar.qml100
6 files changed, 420 insertions, 12 deletions
diff --git a/.qmake.conf b/.qmake.conf
index 235e52161..4e06e0277 100644
--- a/.qmake.conf
+++ b/.qmake.conf
@@ -2,4 +2,4 @@ load(qt_build_config)
CONFIG += warning_clean
android|ios|qnx|winrt|isEmpty(QT.widgets.name): CONFIG += no_desktop
-MODULE_VERSION = 5.6.0
+MODULE_VERSION = 5.6.1
diff --git a/src/controls/TreeView.qml b/src/controls/TreeView.qml
index 637c46c3c..e152e8103 100644
--- a/src/controls/TreeView.qml
+++ b/src/controls/TreeView.qml
@@ -121,6 +121,7 @@ BasicTableView {
property var clickedIndex: undefined
property var pressedIndex: undefined
+ property bool selectOnRelease: false
property int pressedColumn: -1
readonly property alias currentRow: root.__currentRow
readonly property alias currentIndex: root.currentIndex
@@ -237,22 +238,37 @@ BasicTableView {
var pressedRow = __listView.indexAt(0, mouseY + __listView.contentY)
pressedIndex = modelAdaptor.mapRowToModelIndex(pressedRow)
pressedColumn = __listView.columnAt(mouseX)
+ selectOnRelease = false
__listView.forceActiveFocus()
- if (pressedRow > -1 && !Settings.hasTouchScreen
- && !branchDecorationContains(mouse.x, mouse.y)) {
- __listView.currentIndex = pressedRow
- if (!clickedIndex)
- clickedIndex = pressedIndex
- mouseSelect(pressedIndex, mouse.modifiers, false)
- if (!mouse.modifiers)
- clickedIndex = pressedIndex
+ if (pressedRow === -1
+ || Settings.hasTouchScreen
+ || branchDecorationContains(mouse.x, mouse.y)) {
+ return
+ }
+ if (selectionMode === SelectionMode.ExtendedSelection
+ && selection.isSelected(pressedIndex)) {
+ selectOnRelease = true
+ return
}
+ __listView.currentIndex = pressedRow
+ if (!clickedIndex)
+ clickedIndex = pressedIndex
+ mouseSelect(pressedIndex, mouse.modifiers, false)
+ if (!mouse.modifiers)
+ clickedIndex = pressedIndex
}
onReleased: {
+ if (selectOnRelease) {
+ var releasedRow = __listView.indexAt(0, mouseY + __listView.contentY)
+ var releasedIndex = modelAdaptor.mapRowToModelIndex(releasedRow)
+ if (releasedRow >= 0 && releasedIndex === pressedIndex)
+ mouseSelect(pressedIndex, mouse.modifiers, false)
+ }
pressedIndex = undefined
pressedColumn = -1
autoScroll = 0
+ selectOnRelease = false
}
onPositionChanged: {
@@ -283,12 +299,14 @@ BasicTableView {
onExited: {
pressedIndex = undefined
pressedColumn = -1
+ selectOnRelease = false
}
onCanceled: {
pressedIndex = undefined
pressedColumn = -1
autoScroll = 0
+ selectOnRelease = false
}
onClicked: {
diff --git a/src/controls/doc/src/qtquickcontrols-tableview.qdoc b/src/controls/doc/src/qtquickcontrols-tableview.qdoc
index fa3b103c8..48546e5bb 100644
--- a/src/controls/doc/src/qtquickcontrols-tableview.qdoc
+++ b/src/controls/doc/src/qtquickcontrols-tableview.qdoc
@@ -288,6 +288,7 @@
*/
/*!
+ \qmlpropertygroup TableView::section
\qmlproperty string TableView::section.property
\qmlproperty enumeration TableView::section.criteria
\qmlproperty Component TableView::section.delegate
diff --git a/src/controls/doc/src/qtquickcontrols-treeview.qdoc b/src/controls/doc/src/qtquickcontrols-treeview.qdoc
index 321f19343..bcfbad7bf 100644
--- a/src/controls/doc/src/qtquickcontrols-treeview.qdoc
+++ b/src/controls/doc/src/qtquickcontrols-treeview.qdoc
@@ -125,6 +125,7 @@
*/
/*!
+ \qmlpropertygroup TreeView::section
\qmlproperty string TreeView::section.property
\qmlproperty enumeration TreeView::section.criteria
\qmlproperty Component TreeView::section.delegate
diff --git a/src/dialogs/plugins.qmltypes b/src/dialogs/plugins.qmltypes
index c59933047..6e21c16f5 100644
--- a/src/dialogs/plugins.qmltypes
+++ b/src/dialogs/plugins.qmltypes
@@ -22,6 +22,300 @@ Module {
"QtQuick.PrivateWidgets 1.1",
"QtQuick.Window 2.2"
]
+
+ Component {
+ name: "QQuickAbstractColorDialog"
+ prototype: "QQuickAbstractDialog"
+ Property { name: "showAlphaChannel"; type: "bool" }
+ Property { name: "color"; type: "QColor" }
+ Property { name: "currentColor"; type: "QColor" }
+ Property { name: "currentHue"; type: "double"; isReadonly: true }
+ Property { name: "currentSaturation"; type: "double"; isReadonly: true }
+ Property { name: "currentLightness"; type: "double"; isReadonly: true }
+ Property { name: "currentAlpha"; type: "double"; isReadonly: true }
+ Signal { name: "selectionAccepted" }
+ Method {
+ name: "setVisible"
+ Parameter { name: "v"; type: "bool" }
+ }
+ Method {
+ name: "setModality"
+ Parameter { name: "m"; type: "Qt::WindowModality" }
+ }
+ Method {
+ name: "setTitle"
+ Parameter { name: "t"; type: "string" }
+ }
+ Method {
+ name: "setColor"
+ Parameter { name: "arg"; type: "QColor" }
+ }
+ Method {
+ name: "setCurrentColor"
+ Parameter { name: "currentColor"; type: "QColor" }
+ }
+ Method {
+ name: "setShowAlphaChannel"
+ Parameter { name: "arg"; type: "bool" }
+ }
+ }
+ Component {
+ name: "QQuickAbstractDialog"
+ prototype: "QObject"
+ Enum {
+ name: "StandardButton"
+ values: {
+ "NoButton": 0,
+ "Ok": 1024,
+ "Save": 2048,
+ "SaveAll": 4096,
+ "Open": 8192,
+ "Yes": 16384,
+ "YesToAll": 32768,
+ "No": 65536,
+ "NoToAll": 131072,
+ "Abort": 262144,
+ "Retry": 524288,
+ "Ignore": 1048576,
+ "Close": 2097152,
+ "Cancel": 4194304,
+ "Discard": 8388608,
+ "Help": 16777216,
+ "Apply": 33554432,
+ "Reset": 67108864,
+ "RestoreDefaults": 134217728,
+ "NButtons": 134217729
+ }
+ }
+ Enum {
+ name: "StandardButtons"
+ values: {
+ "NoButton": 0,
+ "Ok": 1024,
+ "Save": 2048,
+ "SaveAll": 4096,
+ "Open": 8192,
+ "Yes": 16384,
+ "YesToAll": 32768,
+ "No": 65536,
+ "NoToAll": 131072,
+ "Abort": 262144,
+ "Retry": 524288,
+ "Ignore": 1048576,
+ "Close": 2097152,
+ "Cancel": 4194304,
+ "Discard": 8388608,
+ "Help": 16777216,
+ "Apply": 33554432,
+ "Reset": 67108864,
+ "RestoreDefaults": 134217728,
+ "NButtons": 134217729
+ }
+ }
+ Property { name: "visible"; type: "bool" }
+ Property { name: "modality"; type: "Qt::WindowModality" }
+ Property { name: "title"; type: "string" }
+ Property { name: "isWindow"; type: "bool"; isReadonly: true }
+ Property { name: "x"; type: "int" }
+ Property { name: "y"; type: "int" }
+ Property { name: "width"; type: "int" }
+ Property { name: "height"; type: "int" }
+ Property { name: "__maximumDimension"; type: "int"; isReadonly: true }
+ Signal { name: "visibilityChanged" }
+ Signal { name: "geometryChanged" }
+ Signal { name: "accepted" }
+ Signal { name: "rejected" }
+ Method { name: "open" }
+ Method { name: "close" }
+ Method {
+ name: "setX"
+ Parameter { name: "arg"; type: "int" }
+ }
+ Method {
+ name: "setY"
+ Parameter { name: "arg"; type: "int" }
+ }
+ Method {
+ name: "setWidth"
+ Parameter { name: "arg"; type: "int" }
+ }
+ Method {
+ name: "setHeight"
+ Parameter { name: "arg"; type: "int" }
+ }
+ }
+ Component {
+ name: "QQuickAbstractFileDialog"
+ prototype: "QQuickAbstractDialog"
+ Property { name: "selectExisting"; type: "bool" }
+ Property { name: "selectMultiple"; type: "bool" }
+ Property { name: "selectFolder"; type: "bool" }
+ Property { name: "folder"; type: "QUrl" }
+ Property { name: "nameFilters"; type: "QStringList" }
+ Property { name: "selectedNameFilter"; type: "string" }
+ Property { name: "selectedNameFilterExtensions"; type: "QStringList"; isReadonly: true }
+ Property { name: "selectedNameFilterIndex"; type: "int" }
+ Property { name: "fileUrl"; type: "QUrl"; isReadonly: true }
+ Property { name: "fileUrls"; type: "QList<QUrl>"; isReadonly: true }
+ Property { name: "sidebarVisible"; type: "bool" }
+ Signal { name: "filterSelected" }
+ Signal { name: "fileModeChanged" }
+ Signal { name: "selectionAccepted" }
+ Method {
+ name: "setVisible"
+ Parameter { name: "v"; type: "bool" }
+ }
+ Method {
+ name: "setTitle"
+ Parameter { name: "t"; type: "string" }
+ }
+ Method {
+ name: "setSelectExisting"
+ Parameter { name: "s"; type: "bool" }
+ }
+ Method {
+ name: "setSelectMultiple"
+ Parameter { name: "s"; type: "bool" }
+ }
+ Method {
+ name: "setSelectFolder"
+ Parameter { name: "s"; type: "bool" }
+ }
+ Method {
+ name: "setFolder"
+ Parameter { name: "f"; type: "QUrl" }
+ }
+ Method {
+ name: "setNameFilters"
+ Parameter { name: "f"; type: "QStringList" }
+ }
+ Method {
+ name: "selectNameFilter"
+ Parameter { name: "f"; type: "string" }
+ }
+ Method {
+ name: "setSelectedNameFilterIndex"
+ Parameter { name: "idx"; type: "int" }
+ }
+ Method {
+ name: "setSidebarVisible"
+ Parameter { name: "s"; type: "bool" }
+ }
+ }
+ Component {
+ name: "QQuickAbstractFontDialog"
+ prototype: "QQuickAbstractDialog"
+ Property { name: "scalableFonts"; type: "bool" }
+ Property { name: "nonScalableFonts"; type: "bool" }
+ Property { name: "monospacedFonts"; type: "bool" }
+ Property { name: "proportionalFonts"; type: "bool" }
+ Property { name: "font"; type: "QFont" }
+ Property { name: "currentFont"; type: "QFont" }
+ Signal { name: "selectionAccepted" }
+ Method {
+ name: "setVisible"
+ Parameter { name: "v"; type: "bool" }
+ }
+ Method {
+ name: "setModality"
+ Parameter { name: "m"; type: "Qt::WindowModality" }
+ }
+ Method {
+ name: "setTitle"
+ Parameter { name: "t"; type: "string" }
+ }
+ Method {
+ name: "setFont"
+ Parameter { name: "arg"; type: "QFont" }
+ }
+ Method {
+ name: "setCurrentFont"
+ Parameter { name: "arg"; type: "QFont" }
+ }
+ Method {
+ name: "setScalableFonts"
+ Parameter { name: "arg"; type: "bool" }
+ }
+ Method {
+ name: "setNonScalableFonts"
+ Parameter { name: "arg"; type: "bool" }
+ }
+ Method {
+ name: "setMonospacedFonts"
+ Parameter { name: "arg"; type: "bool" }
+ }
+ Method {
+ name: "setProportionalFonts"
+ Parameter { name: "arg"; type: "bool" }
+ }
+ }
+ Component {
+ name: "QQuickAbstractMessageDialog"
+ prototype: "QQuickAbstractDialog"
+ exports: ["QtQuick.PrivateWidgets/QtMessageDialog 1.1"]
+ exportMetaObjectRevisions: [0]
+ Enum {
+ name: "Icon"
+ values: {
+ "NoIcon": 0,
+ "Information": 1,
+ "Warning": 2,
+ "Critical": 3,
+ "Question": 4
+ }
+ }
+ Property { name: "text"; type: "string" }
+ Property { name: "informativeText"; type: "string" }
+ Property { name: "detailedText"; type: "string" }
+ Property { name: "icon"; type: "Icon" }
+ Property { name: "standardIconSource"; type: "QUrl"; isReadonly: true }
+ Property { name: "standardButtons"; type: "QQuickAbstractDialog::StandardButtons" }
+ Property {
+ name: "clickedButton"
+ type: "QQuickAbstractDialog::StandardButton"
+ isReadonly: true
+ }
+ Signal { name: "buttonClicked" }
+ Signal { name: "discard" }
+ Signal { name: "help" }
+ Signal { name: "yes" }
+ Signal { name: "no" }
+ Signal { name: "apply" }
+ Signal { name: "reset" }
+ Method {
+ name: "setVisible"
+ Parameter { name: "v"; type: "bool" }
+ }
+ Method {
+ name: "setTitle"
+ Parameter { name: "arg"; type: "string" }
+ }
+ Method {
+ name: "setText"
+ Parameter { name: "arg"; type: "string" }
+ }
+ Method {
+ name: "setInformativeText"
+ Parameter { name: "arg"; type: "string" }
+ }
+ Method {
+ name: "setDetailedText"
+ Parameter { name: "arg"; type: "string" }
+ }
+ Method {
+ name: "setIcon"
+ Parameter { name: "icon"; type: "Icon" }
+ }
+ Method {
+ name: "setStandardButtons"
+ Parameter { name: "buttons"; type: "StandardButtons" }
+ }
+ Method {
+ name: "click"
+ Parameter { name: "button"; type: "QQuickAbstractDialog::StandardButton" }
+ }
+ }
+
Component {
name: "QQuickColorDialog"
defaultProperty: "contentItem"
diff --git a/tests/auto/controls/data/tst_menubar.qml b/tests/auto/controls/data/tst_menubar.qml
index 44238e211..d2077934a 100644
--- a/tests/auto/controls/data/tst_menubar.qml
+++ b/tests/auto/controls/data/tst_menubar.qml
@@ -49,6 +49,8 @@ TestCase {
width:400
height:400
+ readonly property int waitTime: 200
+
Component {
id: windowComponent
ApplicationWindow {
@@ -95,12 +97,104 @@ TestCase {
verify(fileMenu)
tryCompare(fileMenu, "__popupVisible", false)
mousePress(fileMenu.__visualItem)
- wait(200);
+ wait(waitTime);
tryCompare(fileMenu, "__popupVisible", true)
mouseMove(fileMenu.__contentItem, 0, -10)
- wait(200)
+ wait(waitTime)
mouseRelease(fileMenu.__contentItem, 0, -10)
tryCompare(fileMenu, "__popupVisible", true)
- wait(200)
+ wait(waitTime)
+
+ window.destroy();
+ }
+
+ function test_keyNavigation() {
+ if (Qt.platform.os === "osx")
+ skip("MenuBar cannot be reliably tested on OS X")
+
+ var window = windowComponent.createObject()
+ waitForRendering(window.contentItem)
+ var fileMenu = findChild(window, "fileMenu")
+ verify(fileMenu)
+ var editMenu = findChild(window, "editMenu")
+ verify(editMenu)
+
+ // Click menu should open
+ tryCompare(fileMenu, "__popupVisible", false)
+ mouseClick(fileMenu.__visualItem)
+ wait(waitTime)
+ tryCompare(fileMenu, "__popupVisible", true)
+ tryCompare(fileMenu, "__currentIndex", -1)
+ tryCompare(fileMenu.__contentItem, "status", Loader.Ready)
+
+ // Move right
+ tryCompare(editMenu, "__popupVisible", false)
+ keyPress(Qt.Key_Right, Qt.NoModifier, waitTime)
+ keyRelease(Qt.Key_Right, Qt.NoModifier, waitTime)
+ tryCompare(editMenu, "__popupVisible", true)
+ tryCompare(editMenu.__contentItem, "status", Loader.Ready)
+
+ // Move left
+ tryCompare(fileMenu, "__popupVisible", false)
+ keyPress(Qt.Key_Left, Qt.NoModifier, waitTime)
+ keyRelease(Qt.Key_Left, Qt.NoModifier, waitTime)
+ tryCompare(fileMenu, "__popupVisible", true)
+ tryCompare(fileMenu, "__currentIndex", 0)
+ tryCompare(fileMenu.__contentItem, "status", Loader.Ready)
+
+ // Move down
+ var saveMenuItem = findChild(window, "saveMenuItem")
+ verify(saveMenuItem)
+ tryCompare(saveMenuItem.__visualItem.styleData, "selected", false)
+ keyPress(Qt.Key_Down, Qt.NoModifier, waitTime)
+ keyRelease(Qt.Key_Down, Qt.NoModifier, waitTime)
+ tryCompare(fileMenu, "__currentIndex", 1)
+ tryCompare(saveMenuItem.__visualItem.styleData, "selected", true)
+
+ // Move up
+ var recentFilesSubMenu = findChild(window, "recentFilesSubMenu")
+ verify(recentFilesSubMenu)
+ tryCompare(recentFilesSubMenu.__visualItem.styleData, "selected", false)
+ keyPress(Qt.Key_Up, Qt.NoModifier, waitTime)
+ keyRelease(Qt.Key_Up, Qt.NoModifier, waitTime)
+ tryCompare(fileMenu, "__currentIndex", 0)
+ tryCompare(recentFilesSubMenu.__visualItem.styleData, "selected", true)
+
+ // Move right inside sub menu
+ tryCompare(recentFilesSubMenu, "__popupVisible", false)
+ tryCompare(recentFilesSubMenu, "__currentIndex", -1)
+ keyPress(Qt.Key_Right, Qt.NoModifier, waitTime)
+ keyRelease(Qt.Key_Right, Qt.NoModifier, waitTime)
+ tryCompare(recentFilesSubMenu, "__popupVisible", true)
+ tryCompare(recentFilesSubMenu, "__currentIndex", 0)
+ tryCompare(recentFilesSubMenu.__contentItem, "status", Loader.Ready)
+
+ // Move down inside sub menu
+ var recentFile2MenuItem = findChild(window, "recentFile2MenuItem")
+ verify(recentFile2MenuItem)
+ tryCompare(recentFile2MenuItem.__visualItem.styleData, "selected", false)
+ tryCompare(recentFilesSubMenu, "__currentIndex", 0)
+ keyPress(Qt.Key_Down, Qt.NoModifier, waitTime)
+ keyRelease(Qt.Key_Down, Qt.NoModifier, waitTime)
+ tryCompare(recentFilesSubMenu, "__currentIndex", 1)
+ tryCompare(recentFile2MenuItem.__visualItem.styleData, "selected", true)
+
+ // Move up inside sub menu
+ var recentFile1MenuItem = findChild(window, "recentFile1MenuItem")
+ verify(recentFile1MenuItem)
+ tryCompare(recentFile1MenuItem.__visualItem.styleData, "selected", false)
+ tryCompare(recentFilesSubMenu, "__currentIndex", 1)
+ keyPress(Qt.Key_Up, Qt.NoModifier, waitTime)
+ keyRelease(Qt.Key_Up, Qt.NoModifier, waitTime)
+ tryCompare(recentFilesSubMenu, "__currentIndex", 0)
+ tryCompare(recentFile1MenuItem.__visualItem.styleData, "selected", true)
+
+ // Move left out of sub menu
+ keyPress(Qt.Key_Left, Qt.NoModifier, waitTime)
+ keyRelease(Qt.Key_Left, Qt.NoModifier, waitTime)
+ tryCompare(recentFilesSubMenu, "__popupVisible", false)
+ tryCompare(recentFilesSubMenu, "__currentIndex", -1)
+
+ window.destroy()
}
}