aboutsummaryrefslogtreecommitdiffstats
path: root/src/imports
diff options
context:
space:
mode:
authorShawn Rutledge <shawn.rutledge@digia.com>2013-10-23 15:45:26 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-10-30 15:29:18 +0100
commit5e4fc4b97aa638dc94ae947476684eb4a09ef9d0 (patch)
tree733193b43ed8918e78bfa6177e35de1ea6d2be14 /src/imports
parent4a7f1326e3d342148a4a9147505a4d8d531b4a06 (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.qml29
-rw-r--r--src/imports/dialogs/DefaultFileDialog.qml79
-rw-r--r--src/imports/dialogs/DefaultFontDialog.qml21
-rw-r--r--src/imports/dialogs/DefaultMessageDialog.qml33
-rw-r--r--src/imports/dialogs/qml/TextField.qml9
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()
}
}