overte-JulianGro/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/InputDeviceButton.qml

198 lines
5.8 KiB
QML

//
// InputDeviceButton.qml
//
// Created by Zach Fox on 2019-05-02
// Based off of MicBarApplication.qml by Zach Pomerantz and Wayne Chen
// Copyright 2019 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.10
import QtGraphicalEffects 1.0
import stylesUit 1.0
import TabletScriptingInterface 1.0
import "../simplifiedConstants" as SimplifiedConstants
Rectangle {
id: micBar
SimplifiedConstants.SimplifiedConstants {
id: simplifiedUI
}
readonly property var level: AudioScriptingInterface.inputLevel
readonly property var clipping: AudioScriptingInterface.clipping
property var muted: AudioScriptingInterface.muted
property var pushToTalk: AudioScriptingInterface.pushToTalk
property var pushingToTalk: AudioScriptingInterface.pushingToTalk
readonly property var userSpeakingLevel: 0.4
property bool gated: false
readonly property string unmutedIcon: "images/mic-unmute-i.svg"
readonly property string mutedIcon: "images/mic-mute-i.svg"
readonly property string pushToTalkIcon: "images/mic-ptt-i.svg"
readonly property string clippingIcon: "images/mic-clip-i.svg"
readonly property string gatedIcon: "images/mic-gate-i.svg"
Connections {
target: AudioScriptingInterface
onNoiseGateOpened: {
gated = false;
}
onNoiseGateClosed: {
gated = false;
}
}
opacity: 0.7
onLevelChanged: {
var rectOpacity = (muted && (level >= userSpeakingLevel)) ? 1.0 : 0.7;
if (pushToTalk && !pushingToTalk) {
rectOpacity = (mouseArea.containsMouse) ? 1.0 : 0.7;
} else if (mouseArea.containsMouse && rectOpacity != 1.0) {
rectOpacity = 1.0;
}
micBar.opacity = rectOpacity;
}
color: "#00000000"
MouseArea {
id: mouseArea
anchors.fill: parent
hoverEnabled: true
scrollGestureEnabled: false
onClicked: {
if (pushToTalk) {
return;
}
AudioScriptingInterface.muted = !muted;
Tablet.playSound(TabletEnums.ButtonClick);
muted = Qt.binding(function() { return AudioScriptingInterface.muted; }); // restore binding
}
onPressed: {
if (pushToTalk) {
AudioScriptingInterface.pushingToTalk = true;
Tablet.playSound(TabletEnums.ButtonClick);
}
}
onReleased: {
if (pushToTalk) {
AudioScriptingInterface.pushingToTalk = false;
Tablet.playSound(TabletEnums.ButtonClick);
}
}
onContainsMouseChanged: {
if (containsMouse) {
Tablet.playSound(TabletEnums.ButtonHover);
}
}
}
QtObject {
id: colors
readonly property string unmutedColor: simplifiedUI.colors.controls.inputVolumeButton.text.noisy
readonly property string gatedColor: "#00BDFF"
readonly property string mutedColor: simplifiedUI.colors.controls.inputVolumeButton.text.muted
readonly property string gutter: "#575757"
readonly property string greenStart: "#39A38F"
readonly property string greenEnd: "#1FC6A6"
readonly property string yellow: "#C0C000"
readonly property string fill: "#55000000"
readonly property string icon: (muted || clipping) ? mutedColor : gated ? gatedColor : unmutedColor
}
Item {
id: icon
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.horizontalCenter
anchors.rightMargin: 2
width: 13
height: 21
Item {
anchors.fill: parent
opacity: mouseArea.containsMouse ? 1.0 : 0.7
Image {
id: image
source: (pushToTalk) ? pushToTalkIcon : muted ? mutedIcon :
clipping ? clippingIcon : gated ? gatedIcon : unmutedIcon
anchors.fill: parent
fillMode: Image.PreserveAspectFit
}
ColorOverlay {
id: imageOverlay
anchors { fill: image }
source: image
color: pushToTalk ? (pushingToTalk ? colors.unmutedColor : colors.mutedColor) : colors.icon
}
}
}
Item {
id: bar
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.horizontalCenter
anchors.leftMargin: 2
width: 4
height: 21
Rectangle { // base
id: baseBar
radius: 4
anchors { fill: parent }
color: colors.gutter
}
Rectangle { // mask
id: mask
height: micBar.muted ? parent.height : parent.height * level
color: micBar.muted ? colors.mutedColor : "white"
width: parent.width
radius: 5
anchors {
bottom: parent.bottom
bottomMargin: 0
left: parent.left
leftMargin: 0
}
}
LinearGradient {
anchors { fill: mask }
visible: mask.visible && !micBar.muted
source: mask
start: Qt.point(0, 0)
end: Qt.point(0, bar.height)
rotation: 180
gradient: Gradient {
GradientStop {
position: 0.0
color: colors.greenStart
}
GradientStop {
position: 0.5
color: colors.greenEnd
}
GradientStop {
position: 1.0
color: colors.yellow
}
}
}
}
}