diff options
author | Shawn Rutledge <shawn.rutledge@digia.com> | 2013-10-23 15:45:26 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-10-30 15:29:18 +0100 |
commit | 5e4fc4b97aa638dc94ae947476684eb4a09ef9d0 (patch) | |
tree | 733193b43ed8918e78bfa6177e35de1ea6d2be14 /src/imports | |
parent | 4a7f1326e3d342148a4a9147505a4d8d531b4a06 (diff) |
QtQuick.Dialogs: handle more keyboard shortcuts
The Back button on Android should close the dialog, but there is a bug
that Qt only receives the release, not the press. Otherwise Esc should
do the same, Enter should accept, it should be possible to copy the
text from the MessageDialog, copy colors to and from the ColorDialog,
etc.
Change-Id: Ib4d4c58cde9f4bb00ce3d46e2f9ea1aad9d52bb0
Reviewed-by: Liang Qi <liang.qi@digia.com>
Diffstat (limited to 'src/imports')
-rw-r--r-- | src/imports/dialogs/DefaultColorDialog.qml | 29 | ||||
-rw-r--r-- | src/imports/dialogs/DefaultFileDialog.qml | 79 | ||||
-rw-r--r-- | src/imports/dialogs/DefaultFontDialog.qml | 21 | ||||
-rw-r--r-- | src/imports/dialogs/DefaultMessageDialog.qml | 33 | ||||
-rw-r--r-- | src/imports/dialogs/qml/TextField.qml | 9 |
5 files changed, 129 insertions, 42 deletions
diff --git a/src/imports/dialogs/DefaultColorDialog.qml b/src/imports/dialogs/DefaultColorDialog.qml index 2449d5b01b..a0efb6ccf1 100644 --- a/src/imports/dialogs/DefaultColorDialog.qml +++ b/src/imports/dialogs/DefaultColorDialog.qml @@ -65,11 +65,40 @@ AbstractColorDialog { implicitHeight: Math.min(maxSize, Screen.pixelDensity * (usePaletteMap ? 100 : 50)) implicitWidth: usePaletteMap ? implicitHeight - bottomMinHeight : implicitHeight * 1.5 color: palette.window + focus: root.visible property real bottomMinHeight: sliders.height + buttonRow.height + outerSpacing * 3 property real spacing: 8 property real outerSpacing: 12 property bool usePaletteMap: true + Keys.onPressed: { + event.accepted = true + switch (event.key) { + case Qt.Key_Return: + case Qt.Key_Select: + accept() + break + case Qt.Key_Escape: + case Qt.Key_Back: + reject() + break + case Qt.Key_C: + if (event.modifiers & Qt.ControlModifier) + colorField.copyAll() + break + case Qt.Key_V: + if (event.modifiers & Qt.ControlModifier) { + colorField.paste() + root.currentColor = colorField.text + } + break + default: + // do nothing + event.accepted = false + break + } + } + // set the preferred width based on height, to avoid "letterboxing" the paletteMap onHeightChanged: implicitHeight = Math.max((usePaletteMap ? 480 : bottomMinHeight), height) diff --git a/src/imports/dialogs/DefaultFileDialog.qml b/src/imports/dialogs/DefaultFileDialog.qml index 60928934d8..6ed6697f5a 100644 --- a/src/imports/dialogs/DefaultFileDialog.qml +++ b/src/imports/dialogs/DefaultFileDialog.qml @@ -103,7 +103,7 @@ AbstractFileDialog { clearSelection() if (selectFolder && selectedIndices.length == 0) addSelection(folder) - else { + else if (selectedIndices.length > 0) { selectedIndices.map(function(idx) { if (view.model.isFolder(idx)) { if (selectFolder) @@ -113,17 +113,20 @@ AbstractFileDialog { addSelection(view.model.get(idx, "fileURL")) } }) + } else { + addSelection(pathToUrl(currentPathField.text)) } accept() } Rectangle { + id: content property int maxSize: Math.min(Screen.desktopAvailableWidth, Screen.desktopAvailableHeight) // TODO: QTBUG-29817 geometry from AbstractFileDialog - id: window implicitWidth: Math.min(maxSize, Screen.pixelDensity * 100) implicitHeight: Math.min(maxSize, Screen.pixelDensity * 80) color: palette.window + focus: root.visible && !currentPathField.visible SystemPalette { id: palette } @@ -138,7 +141,7 @@ AbstractFileDialog { root.acceptSelection() } } - width: window.width + width: content.width height: nameText.implicitHeight * 1.5 color: "transparent" Rectangle { @@ -204,6 +207,47 @@ AbstractFileDialog { } } + Keys.onPressed: { + event.accepted = true + switch (event.key) { + case Qt.Key_Up: + root.up(event.modifiers & Qt.ShiftModifier && root.selectMultiple) + break + case Qt.Key_Down: + root.down(event.modifiers & Qt.ShiftModifier && root.selectMultiple) + break + case Qt.Key_Left: + root.dirUp() + break + case Qt.Key_Return: + case Qt.Key_Select: + case Qt.Key_Right: + if (view.currentItem) + view.currentItem.launch() + else + root.acceptSelection() + break + case Qt.Key_Back: + case Qt.Key_Escape: + reject() + break + case Qt.Key_C: + if (event.modifiers & Qt.ControlModifier) + currentPathField.copyAll() + break + case Qt.Key_V: + if (event.modifiers & Qt.ControlModifier) { + currentPathField.visible = true + currentPathField.paste() + } + break + default: + // do nothing + event.accepted = false + break + } + } + ListView { id: view anchors.top: titleBar.bottom @@ -224,33 +268,6 @@ AbstractFileDialog { } highlightMoveDuration: 0 highlightMoveVelocity: -1 - focus: !currentPathField.visible - Keys.onPressed: { - event.accepted = true - switch (event.key) { - case Qt.Key_Up: - root.up(event.modifiers & Qt.ShiftModifier && root.selectMultiple) - break - case Qt.Key_Down: - root.down(event.modifiers & Qt.ShiftModifier && root.selectMultiple) - break - case Qt.Key_Left: - root.dirUp() - break - case Qt.Key_Return: - case Qt.Key_Select: - case Qt.Key_Right: - if (view.currentItem) - view.currentItem.launch() - else - root.acceptSelection() - break - default: - // do nothing - event.accepted = false - break - } - } } MouseArea { @@ -318,6 +335,8 @@ AbstractFileDialog { view.model.folder = root.pathFolder(text) } onDownPressed: currentPathField.visible = false + onBackPressed: reject() + onEscapePressed: reject() } } Rectangle { diff --git a/src/imports/dialogs/DefaultFontDialog.qml b/src/imports/dialogs/DefaultFontDialog.qml index 87bb812c42..0ad476232c 100644 --- a/src/imports/dialogs/DefaultFontDialog.qml +++ b/src/imports/dialogs/DefaultFontDialog.qml @@ -55,6 +55,7 @@ AbstractFontDialog { implicitWidth: settings.implicitWidth + changeableWidth + outerSpacing * 2 implicitHeight: writingSystemLabel.implicitHeight + changeableHeight + buttonRow.height + outerSpacing * 2 color: palette.window + focus: root.visible property real spacing: 8 property real outerSpacing: 12 property real listMargins: 4 @@ -69,6 +70,7 @@ AbstractFontDialog { property real changeableWidth: 160 property real changeableHeight: 120 + onFontChanged: externalFont = font onExternalFontChanged: { @@ -80,6 +82,25 @@ AbstractFontDialog { } } + Keys.onPressed: { + event.accepted = true + switch (event.key) { + case Qt.Key_Return: + case Qt.Key_Select: + root.font = content.font + root.accept() + break + case Qt.Key_Escape: + case Qt.Key_Back: + reject() + break + default: + // do nothing + event.accepted = false + break + } + } + SystemPalette { id: palette } Grid { diff --git a/src/imports/dialogs/DefaultMessageDialog.qml b/src/imports/dialogs/DefaultMessageDialog.qml index 5dbe727f68..2f1aa8612a 100644 --- a/src/imports/dialogs/DefaultMessageDialog.qml +++ b/src/imports/dialogs/DefaultMessageDialog.qml @@ -57,19 +57,28 @@ AbstractMessageDialog { mainText.implicitWidth, buttons.implicitWidth) + outerSpacing * 2); onImplicitWidthChanged: if (implicitWidth > root.width) root.width = implicitWidth color: palette.window - focus: true - Keys.onEscapePressed: root.reject() - Keys.onEnterPressed: root.accept() - Keys.onReturnPressed: root.accept() - Keys.onPressed: if (event.modifiers === Qt.ControlModifier) - switch (event.key) { - case Qt.Key_A: - detailedText.selectAll(); - break; - case Qt.Key_C: - detailedText.copy(); - break; + focus: root.visible + Keys.onPressed: { + event.accepted = true + if (event.modifiers === Qt.ControlModifier) + switch (event.key) { + case Qt.Key_A: + detailedText.selectAll() + break + case Qt.Key_C: + detailedText.copy() + break + } else switch (event.key) { + case Qt.Key_Escape: + case Qt.Key_Back: + reject() + break + case Qt.Key_Enter: + case Qt.Key_Return: + accept() + break } + } Column { id: contentColumn diff --git a/src/imports/dialogs/qml/TextField.qml b/src/imports/dialogs/qml/TextField.qml index 9a6427a105..e67155086c 100644 --- a/src/imports/dialogs/qml/TextField.qml +++ b/src/imports/dialogs/qml/TextField.qml @@ -47,6 +47,8 @@ Item { property alias text: textInput.text signal accepted signal downPressed + signal backPressed + signal escapePressed implicitWidth: textInput.implicitWidth + rect.radius * 2 implicitHeight: textInput.implicitHeight @@ -55,6 +57,11 @@ Item { textInput.copy() } + function paste() { + textInput.selectAll() + textInput.paste() + } + SystemPalette { id: palette } height: textInput.implicitHeight + 8 clip: true @@ -76,5 +83,7 @@ Item { verticalAlignment: Text.AlignVCenter onAccepted: root.accepted() Keys.onDownPressed: root.downPressed() + Keys.onBackPressed: root.backPressed() + Keys.onEscapePressed: root.escapePressed() } } |