From 5e4fc4b97aa638dc94ae947476684eb4a09ef9d0 Mon Sep 17 00:00:00 2001 From: Shawn Rutledge Date: Wed, 23 Oct 2013 15:45:26 +0200 Subject: 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 --- src/imports/dialogs/DefaultColorDialog.qml | 29 ++++++++++ src/imports/dialogs/DefaultFileDialog.qml | 79 +++++++++++++++++----------- src/imports/dialogs/DefaultFontDialog.qml | 21 ++++++++ src/imports/dialogs/DefaultMessageDialog.qml | 33 +++++++----- src/imports/dialogs/qml/TextField.qml | 9 ++++ 5 files changed, 129 insertions(+), 42 deletions(-) (limited to 'src/imports') 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() } } -- cgit v1.2.3