diff options
-rw-r--r-- | .qmake.conf | 2 | ||||
-rw-r--r-- | src/controls/TreeView.qml | 34 | ||||
-rw-r--r-- | src/controls/doc/src/qtquickcontrols-tableview.qdoc | 1 | ||||
-rw-r--r-- | src/controls/doc/src/qtquickcontrols-treeview.qdoc | 1 | ||||
-rw-r--r-- | src/dialogs/plugins.qmltypes | 294 | ||||
-rw-r--r-- | tests/auto/controls/data/tst_menubar.qml | 100 |
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() } } |