//// QueryDialog.qml//// Created by Bradley Austin Davis on 22 Jan 2016// Copyright 2015 High Fidelity, Inc.//// Distributed under the Apache License, Version 2.0.// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html// import QtQuick 2.7import QtQuick.Controls 2.3 import controlsUit 1.0import stylesUit 1.0import "../windows" ModalWindow { id: root HifiConstants { id: hifi } implicitWidth: 640 implicitHeight: 320 visible: true keyboardOverride: true // Disable ModalWindow's keyboard. signal selected(var result); signal canceled(); property int icon: hifi.icons.none property string iconText: "" property int iconSize: 35 onIconChanged: updateIcon(); property var items; property string label property var result; property alias current: textResult.text // For text boxes property alias placeholderText: textResult.placeholderText // For combo boxes property bool editable: true; property int titleWidth: 0 onTitleWidthChanged: d.resize(); property bool keyboardEnabled: false property bool keyboardRaised: false property bool punctuationMode: false onKeyboardRaisedChanged: d.resize(); function updateIcon() { if (!root) { return; } iconText = hifi.glyphForIcon(root.icon); } Item { id: modalWindowItem clip: true width: pane.width height: pane.height anchors.margins: 0 QtObject { id: d readonly property int minWidth: 480 readonly property int maxWdith: 1280 readonly property int minHeight: 120 readonly property int maxHeight: 720 function resize() { var targetWidth = Math.max(titleWidth, pane.width) var targetHeight = (items ? comboBox.controlHeight : textResult.controlHeight) + 5 * hifi.dimensions.contentSpacing.y + buttons.height root.width = (targetWidth < d.minWidth) ? d.minWidth : ((targetWidth > d.maxWdith) ? d.maxWidth : targetWidth); root.height = ((targetHeight < d.minHeight) ? d.minHeight : ((targetHeight > d.maxHeight) ? d.maxHeight : targetHeight)) + ((keyboardEnabled && keyboardRaised) ? (keyboard.raisedHeight + 2 * hifi.dimensions.contentSpacing.y) : 0) } } Item { anchors { top: parent.top bottom: keyboard.top; left: parent.left; right: parent.right; margins: 0 bottomMargin: 2 * hifi.dimensions.contentSpacing.y } // FIXME make a text field type that can be bound to a history for autocompletion TextField { id: textResult label: root.label visible: items ? false : true anchors { left: parent.left; right: parent.right; bottom: parent.bottom } KeyNavigation.down: acceptButton KeyNavigation.tab: acceptButton } ComboBox { id: comboBox label: root.label visible: items ? true : false anchors { left: parent.left right: parent.right bottom: parent.bottom } model: items ? items : [] KeyNavigation.down: acceptButton KeyNavigation.tab: acceptButton } } property alias keyboardOverride: root.keyboardOverride property alias keyboardRaised: root.keyboardRaised property alias punctuationMode: root.punctuationMode Keyboard { id: keyboard raised: keyboardEnabled && keyboardRaised numeric: punctuationMode anchors { left: parent.left right: parent.right bottom: buttons.top bottomMargin: raised ? 2 * hifi.dimensions.contentSpacing.y : 0 } } Flow { id: buttons spacing: hifi.dimensions.contentSpacing.x onHeightChanged: d.resize(); onWidthChanged: d.resize(); layoutDirection: Qt.RightToLeft anchors { bottom: parent.bottom right: parent.right margins: 0 bottomMargin: hifi.dimensions.contentSpacing.y } Button { id: cancelButton action: cancelAction KeyNavigation.left: acceptButton KeyNavigation.up: items ? comboBox : textResult KeyNavigation.backtab: acceptButton } Button { id: acceptButton action: acceptAction KeyNavigation.right: cancelButton KeyNavigation.up: items ? comboBox : textResult KeyNavigation.tab: cancelButton KeyNavigation.backtab: items ? comboBox : textResult } } Action { id: cancelAction text: qsTr("Cancel"); shortcut: "Esc" onTriggered: { root.canceled(); root.destroy(); } } Action { id: acceptAction text: qsTr("OK"); shortcut: "Return" onTriggered: { root.result = items ? comboBox.currentText : textResult.text root.selected(root.result); root.destroy(); } } } Keys.onPressed: { if (!visible) { return } switch (event.key) { case Qt.Key_Escape: case Qt.Key_Back: cancelAction.trigger() event.accepted = true; break; case Qt.Key_Return: case Qt.Key_Enter: if (acceptButton.focus) { acceptAction.trigger() } else if (cancelButton.focus) { cancelAction.trigger() } else if (comboBox.focus || comboBox.popup.focus) { comboBox.showList() } event.accepted = true; break; } } Component.onCompleted: { keyboardEnabled = HMD.active; updateIcon(); d.resize(); if (items) { comboBox.forceActiveFocus() } else { textResult.forceActiveFocus() } }}
//
// QueryDialog.qml
//
// Created by Bradley Austin Davis on 22 Jan 2016
// Copyright 2015 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
import QtQuick 2.7
import QtQuick.Controls 2.3
import controlsUit 1.0
import stylesUit 1.0
import "../windows"
ModalWindow {
id: root
HifiConstants { id: hifi }
implicitWidth: 640
implicitHeight: 320
visible: true
keyboardOverride: true // Disable ModalWindow's keyboard.
signal selected(var result);
signal canceled();
property int icon: hifi.icons.none
property string iconText: ""
property int iconSize: 35
onIconChanged: updateIcon();
property var items;
property string label
property var result;
property alias current: textResult.text
// For text boxes
property alias placeholderText: textResult.placeholderText
// For combo boxes
property bool editable: true;
property int titleWidth: 0
onTitleWidthChanged: d.resize();
property bool keyboardEnabled: false
property bool keyboardRaised: false
property bool punctuationMode: false
onKeyboardRaisedChanged: d.resize();
function updateIcon() {
if (!root) {
return;
}
iconText = hifi.glyphForIcon(root.icon);
}
Item {
id: modalWindowItem
clip: true
width: pane.width
height: pane.height
anchors.margins: 0
QtObject {
id: d
readonly property int minWidth: 480
readonly property int maxWdith: 1280
readonly property int minHeight: 120
readonly property int maxHeight: 720
function resize() {
var targetWidth = Math.max(titleWidth, pane.width)
var targetHeight = (items ? comboBox.controlHeight : textResult.controlHeight) + 5 * hifi.dimensions.contentSpacing.y + buttons.height
root.width = (targetWidth < d.minWidth) ? d.minWidth : ((targetWidth > d.maxWdith) ? d.maxWidth : targetWidth);
root.height = ((targetHeight < d.minHeight) ? d.minHeight : ((targetHeight > d.maxHeight) ? d.maxHeight : targetHeight)) + ((keyboardEnabled && keyboardRaised) ? (keyboard.raisedHeight + 2 * hifi.dimensions.contentSpacing.y) : 0)
}
}
Item {
anchors {
top: parent.top
bottom: keyboard.top;
left: parent.left;
right: parent.right;
margins: 0
bottomMargin: 2 * hifi.dimensions.contentSpacing.y
}
// FIXME make a text field type that can be bound to a history for autocompletion
TextField {
id: textResult
label: root.label
visible: items ? false : true
anchors {
left: parent.left;
right: parent.right;
bottom: parent.bottom
}
KeyNavigation.down: acceptButton
KeyNavigation.tab: acceptButton
}
ComboBox {
id: comboBox
label: root.label
visible: items ? true : false
anchors {
left: parent.left
right: parent.right
bottom: parent.bottom
}
model: items ? items : []
KeyNavigation.down: acceptButton
KeyNavigation.tab: acceptButton
}
}
property alias keyboardOverride: root.keyboardOverride
property alias keyboardRaised: root.keyboardRaised
property alias punctuationMode: root.punctuationMode
Keyboard {
id: keyboard
raised: keyboardEnabled && keyboardRaised
numeric: punctuationMode
anchors {
left: parent.left
right: parent.right
bottom: buttons.top
bottomMargin: raised ? 2 * hifi.dimensions.contentSpacing.y : 0
}
}
Flow {
id: buttons
spacing: hifi.dimensions.contentSpacing.x
onHeightChanged: d.resize(); onWidthChanged: d.resize();
layoutDirection: Qt.RightToLeft
anchors {
bottom: parent.bottom
right: parent.right
margins: 0
bottomMargin: hifi.dimensions.contentSpacing.y
}
Button {
id: cancelButton
action: cancelAction
KeyNavigation.left: acceptButton
KeyNavigation.up: items ? comboBox : textResult
KeyNavigation.backtab: acceptButton
}
Button {
id: acceptButton
action: acceptAction
KeyNavigation.right: cancelButton
KeyNavigation.up: items ? comboBox : textResult
KeyNavigation.tab: cancelButton
KeyNavigation.backtab: items ? comboBox : textResult
}
}
Action {
id: cancelAction
text: qsTr("Cancel");
shortcut: "Esc"
onTriggered: {
root.canceled();
root.destroy();
}
}
Action {
id: acceptAction
text: qsTr("OK");
shortcut: "Return"
onTriggered: {
root.result = items ? comboBox.currentText : textResult.text
root.selected(root.result);
root.destroy();
}
}
}
Keys.onPressed: {
if (!visible) {
return
}
switch (event.key) {
case Qt.Key_Escape:
case Qt.Key_Back:
cancelAction.trigger()
event.accepted = true;
break;
case Qt.Key_Return:
case Qt.Key_Enter:
if (acceptButton.focus) {
acceptAction.trigger()
} else if (cancelButton.focus) {
cancelAction.trigger()
} else if (comboBox.focus || comboBox.popup.focus) {
comboBox.showList()
}
event.accepted = true;
break;
}
}
Component.onCompleted: {
keyboardEnabled = HMD.active;
updateIcon();
d.resize();
if (items) {
comboBox.forceActiveFocus()
} else {
textResult.forceActiveFocus()
}
}
}