Refactor common new dialog functionality into new Dialog.qml

This commit is contained in:
David Rowe 2015-06-03 13:01:47 -07:00
parent 2c17274f49
commit d33a249b3e
3 changed files with 82 additions and 95 deletions

View file

@ -9,18 +9,16 @@
// //
import Hifi 1.0 import Hifi 1.0
import QtQuick 2.3 import QtQuick 2.4
import QtQuick.Controls 1.2
import "controls" import "controls"
import "styles" import "styles"
Item { Dialog {
id: root id: root
HifiConstants { id: hifi } HifiConstants { id: hifi }
objectName: "AddressBarDialog" objectName: "AddressBarDialog"
property int animationDuration: hifi.effects.fadeInDuration
property bool destroyOnInvisible: false property bool destroyOnInvisible: false
property real scale: 1.25 // Make this dialog a little larger than normal property real scale: 1.25 // Make this dialog a little larger than normal
@ -101,47 +99,16 @@ Item {
} }
} }
// The UI enables an object, rather than manipulating its visibility, so that we can do animations in both directions.
// Because visibility and enabled are booleans, they cannot be animated. So when enabled is changed, we modify a property
// that can be animated, like scale or opacity, and then when the target animation value is reached, we can modify the
// visibility.
enabled: false
opacity: 0.0
onEnabledChanged: { onEnabledChanged: {
opacity = enabled ? 1.0 : 0.0
if (enabled) { if (enabled) {
addressLine.forceActiveFocus(); addressLine.forceActiveFocus();
} }
} }
Behavior on opacity {
// Animate opacity.
NumberAnimation {
duration: animationDuration
easing.type: Easing.OutCubic
}
}
onOpacityChanged: {
// Once we're transparent, disable the dialog's visibility.
visible = (opacity != 0.0)
}
onVisibleChanged: { onVisibleChanged: {
if (!visible) { if (!visible) {
reset() addressLine.text = ""
// Some dialogs should be destroyed when they become invisible.
if (destroyOnInvisible) {
destroy()
}
} }
}
function reset() {
addressLine.text = ""
} }
function toggleOrGo() { function toggleOrGo() {
@ -152,21 +119,18 @@ Item {
} }
} }
Keys.onEscapePressed: {
enabled = false
}
Keys.onPressed: { Keys.onPressed: {
switch(event.key) { switch (event.key) {
case Qt.Key_W: case Qt.Key_Escape:
if (event.modifiers == Qt.ControlModifier) { case Qt.Key_Back:
event.accepted = true enabled = false;
enabled = false event.accepted = true
} break
case Qt.Key_Enter:
case Qt.Key_Return:
toggleOrGo()
event.accepted = true
break break
} }
} }
Keys.onReturnPressed: toggleOrGo()
Keys.onEnterPressed: toggleOrGo()
} }

View file

@ -9,17 +9,14 @@
// //
import Hifi 1.0 as Hifi import Hifi 1.0 as Hifi
import QtQuick 2.3 import QtQuick 2.4
import QtQuick.Controls 1.2
import QtQuick.Dialogs 1.2
import "controls" import "controls"
import "styles" import "styles"
Item { Dialog {
id: root id: root
HifiConstants { id: hifi } HifiConstants { id: hifi }
property int animationDuration: hifi.effects.fadeInDuration
property bool destroyOnInvisible: true property bool destroyOnInvisible: true
Component.onCompleted: { Component.onCompleted: {
@ -69,7 +66,7 @@ Item {
Text { Text {
id: messageText id: messageText
font.pointSize: 10 font.pixelSize: hifi.fonts.pixelSize * 0.6
font.weight: Font.Bold font.weight: Font.Bold
anchors { anchors {
@ -99,47 +96,8 @@ Item {
} }
} }
// The UI enables an object, rather than manipulating its visibility, so that we can do animations in both directions.
// Because visibility and enabled are booleans, they cannot be animated. So when enabled is changed, we modify a property
// that can be animated, like scale or opacity, and then when the target animation value is reached, we can modify the
// visibility.
enabled: false
opacity: 0.0
onEnabledChanged: {
opacity = enabled ? 1.0 : 0.0
}
Behavior on opacity {
// Animate opacity.
NumberAnimation {
duration: animationDuration
easing.type: Easing.OutCubic
}
}
onOpacityChanged: {
// Once we're transparent, disable the dialog's visibility.
visible = (opacity != 0.0)
}
onVisibleChanged: {
if (!visible) {
// Some dialogs should be destroyed when they become invisible.
if (destroyOnInvisible) {
destroy()
}
}
}
Keys.onPressed: { Keys.onPressed: {
if (event.modifiers === Qt.ControlModifier) switch (event.key) {
switch (event.key) {
case Qt.Key_W:
event.accepted = true
content.accept()
break
} else switch (event.key) {
case Qt.Key_Escape: case Qt.Key_Escape:
case Qt.Key_Back: case Qt.Key_Back:
case Qt.Key_Enter: case Qt.Key_Enter:

View file

@ -0,0 +1,65 @@
//
// Dialog.qml
//
// Created by David Rowe on 3 Jun 2015
// 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 Hifi 1.0
import QtQuick 2.4
import "../styles"
Item {
id: root
property int animationDuration: hifi.effects.fadeInDuration
// The UI enables an object, rather than manipulating its visibility, so that we can do animations in both directions.
// Because visibility and enabled are booleans, they cannot be animated. So when enabled is changed, we modify a property
// that can be animated, like scale or opacity, and then when the target animation value is reached, we can modify the
// visibility.
enabled: false
opacity: 0.0
onEnabledChanged: {
opacity = enabled ? 1.0 : 0.0
}
Behavior on opacity {
// Animate opacity.
NumberAnimation {
duration: animationDuration
easing.type: Easing.OutCubic
}
}
onOpacityChanged: {
// Once we're transparent, disable the dialog's visibility.
visible = (opacity != 0.0)
}
onVisibleChanged: {
if (!visible) {
// Some dialogs should be destroyed when they become invisible.
if (destroyOnInvisible) {
destroy()
}
}
}
Keys.onPressed: {
switch(event.key) {
case Qt.Key_W:
if (event.modifiers == Qt.ControlModifier) {
enabled = false
event.accepted = true
}
break
}
}
}