From 5bf83671263fae9b98bab3283f797e38e594ac2c Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 22 Nov 2017 18:17:50 -0700 Subject: [PATCH] add resources --- interface/resources/qml/AudioScope.qml | 268 ++++++++++++++++++ .../developer/utilities/audio/audioScope.js | 10 + 2 files changed, 278 insertions(+) create mode 100644 interface/resources/qml/AudioScope.qml create mode 100644 scripts/developer/utilities/audio/audioScope.js diff --git a/interface/resources/qml/AudioScope.qml b/interface/resources/qml/AudioScope.qml new file mode 100644 index 0000000000..8956a20643 --- /dev/null +++ b/interface/resources/qml/AudioScope.qml @@ -0,0 +1,268 @@ +// +// AudioScope.qml +// +// Created by Luis Cuenca on 11/22/2017 +// Copyright 2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html +// +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import "styles-uit" +import "controls-uit" as HifiControlsUit + +Item { + id: root + width: parent.width + height: parent.height + + property var _scopedata + property var _triggerdata + property var _triggerValues + property var _triggered + property var _steps + + Component.onCompleted: { + // createValues(); + _triggerValues = { x: width/2, y: height/3 } + _triggered = false + _steps = 5 + } + + + function pullFreshValues() { + if (!AudioScope.getPause()){ + _scopedata = AudioScope.scopeInput + if (AudioScope.getTriggered()) { + _triggered = true + _triggerdata = AudioScope.triggerInput + } + } + mycanvas.requestPaint() + } + + Timer { + interval: 10; running: true; repeat: true + onTriggered: pullFreshValues() + } + + Canvas { + id: mycanvas + anchors.fill:parent + + onPaint: { + var lineHeight = 12; + + function displayTrigger(ctx) { + var size = 3; + ctx.lineWidth="3"; + ctx.strokeStyle="#EFB400"; + ctx.beginPath(); + ctx.moveTo(_triggerValues.x - (size + 2), _triggerValues.y); + ctx.lineTo(_triggerValues.x - 2, _triggerValues.y); + ctx.moveTo(_triggerValues.x + 2, _triggerValues.y); + ctx.lineTo(_triggerValues.x + (size + 2), _triggerValues.y); + + ctx.moveTo(_triggerValues.x, _triggerValues.y - (size + 2)); + ctx.lineTo(_triggerValues.x, _triggerValues.y - 2); + ctx.moveTo(_triggerValues.x, _triggerValues.y + 2); + ctx.lineTo(_triggerValues.x, _triggerValues.y + (size + 2)); + + ctx.stroke(); + } + + function displayBackground(ctx, datawidth, steps, color) { + ctx.fillStyle = Qt.rgba(0, 0, 0, 1); + ctx.fillRect(0, 0, width, height); + + ctx.strokeStyle= color; + ctx.lineWidth="1"; + + ctx.moveTo(0, height/2); + ctx.lineTo(datawidth, height/2); + + var gap = datawidth/steps; + for (var i = 0; i < steps; i++) { + ctx.moveTo(i*gap + 1, 100); + ctx.lineTo(i*gap + 1, height-100); + } + ctx.moveTo(datawidth-1, 100); + ctx.lineTo(datawidth-1, height-100); + ctx.stroke(); + + } + + function drawScope(ctx, data, width, color) { + ctx.beginPath(); + ctx.strokeStyle = color; // Green path + ctx.lineWidth=width; + var x = 0; + for (var i = 0; i < data.length-1; i++) { + ctx.moveTo(x, data[i] + height/2); + ctx.lineTo(++x, data[i+1] + height/2); + } + ctx.stroke(); + } + + + + var ctx = getContext("2d"); + + displayBackground(ctx, _scopedata.length, _steps, "#555555"); + + drawScope(ctx, _scopedata, "2", "#00B4EF"); + if (_triggered) { + drawScope(ctx, _triggerdata, "1", "#EF0000"); + } + if (AudioScope.getAutoTrigger()) { + displayTrigger(ctx); + } + } + } + + MouseArea { + id: hitbox + anchors.fill: mycanvas + hoverEnabled: true + onClicked: { + _triggerValues.x = mouseX + _triggerValues.y = mouseY + AudioScope.setTriggerValues(mouseX, mouseY-height/2); + } + } + + HifiControlsUit.CheckBox { + id: activated + boxSize: 20 + anchors.top: parent.top; + anchors.left: parent.left; + anchors.topMargin: 20; + anchors.leftMargin: 20; + checked: AudioScope.getEnabled(); + onCheckedChanged: { + AudioScope.setEnabled(checked); + activelabel.text = AudioScope.getEnabled() ? "On" : "Off" + } + } + + HifiControlsUit.Label { + id: activelabel + text: AudioScope.getEnabled() ? "On" : "Off" + anchors.top: activated.top; + anchors.left: activated.right; + } + + HifiControlsUit.Button { + id: pauseButton; + color: hifi.buttons.black; + colorScheme: hifi.colorSchemes.dark; + anchors.right: parent.right; + anchors.bottom: parent.bottom; + anchors.rightMargin: 30; + anchors.bottomMargin: 8; + height: 26; + text: "Pause Scope"; + onClicked: { + AudioScope.togglePause(); + pauseButton.text = AudioScope.getPause() ? "Continue Scope" : "Pause Scope"; + } + } + + + + HifiControlsUit.CheckBox { + id: twentyFrames + boxSize: 20 + anchors.horizontalCenter: parent.horizontalCenter; + anchors.bottom: parent.bottom; + anchors.bottomMargin: 8; + onCheckedChanged: { + if (checked){ + fiftyFrames.checked = false; + fiveFrames.checked = false; + AudioScope.selectAudioScopeTwentyFrames(); + _steps = 20; + _triggered = false; + AudioScope.setTriggered(false); + } + } + } + HifiControlsUit.Label { + text: "20 Frames"; + anchors.horizontalCenter: twentyFrames.horizontalCenter; + anchors.bottom: twentyFrames.top; + } + + HifiControlsUit.CheckBox { + id: fiveFrames + boxSize: 20 + anchors.bottom: twentyFrames.bottom; + anchors.right: twentyFrames.left; + anchors.rightMargin: 80; + checked: true; + onCheckedChanged: { + if (checked) { + fiftyFrames.checked = false; + twentyFrames.checked = false; + AudioScope.selectAudioScopeFiveFrames(); + _steps = 5; + _triggered = false; + AudioScope.setTriggered(false); + } + } + } + + HifiControlsUit.Label { + text: "5 Frames"; + anchors.horizontalCenter: fiveFrames.horizontalCenter; + anchors.bottom: fiveFrames.top; + } + + HifiControlsUit.CheckBox { + id: fiftyFrames + boxSize: 20 + anchors.bottom: twentyFrames.bottom; + anchors.left: twentyFrames.right; + anchors.leftMargin: 80; + onCheckedChanged: { + if (checked) { + twentyFrames.checked = false; + fiveFrames.checked = false; + AudioScope.selectAudioScopeFiftyFrames(); + _steps = 50; + _triggered = false; + AudioScope.setTriggered(false); + } + } + } + + HifiControlsUit.Label { + text: "50 Frames"; + anchors.horizontalCenter: fiftyFrames.horizontalCenter; + anchors.bottom: fiftyFrames.top; + } + + HifiControlsUit.Switch { + id: triggerSwitch; + height: 26; + anchors.left: parent.left; + anchors.bottom: parent.bottom; + anchors.leftMargin: 75; + anchors.bottomMargin: 8; + labelTextOff: "Off"; + labelTextOn: "On"; + onCheckedChanged: { + if (!checked) AudioScope.setPause(false); + _triggered = false; + AudioScope.setTriggered(false); + AudioScope.setAutoTrigger(checked); + } + } + HifiControlsUit.Label { + text: "Trigger"; + anchors.left: triggerSwitch.left; + anchors.leftMargin: -15; + anchors.bottom: triggerSwitch.top; + } +} diff --git a/scripts/developer/utilities/audio/audioScope.js b/scripts/developer/utilities/audio/audioScope.js new file mode 100644 index 0000000000..3331482fbd --- /dev/null +++ b/scripts/developer/utilities/audio/audioScope.js @@ -0,0 +1,10 @@ +var qml = Script.resourcesPath() + '/qml/AudioScope.qml'; +var viewdim = Controller.getViewportDimensions(); +var window = new OverlayWindow({ + title: 'Audio Scope', + source: qml, + width: 1200, + height: 500 +}); +//window.setPosition(0.1*viewdim, 0.2*viewdim); +window.closed.connect(function () { Script.stop(); }); \ No newline at end of file