Caster Player Modifications

This commit is contained in:
Oscar Cerna-Mandujano 2019-05-20 11:01:38 -07:00
parent a4a15b15cf
commit 9e1eb34f7f
9 changed files with 361 additions and 132 deletions

View File

@ -26,7 +26,8 @@ public:
enum TriggerStyle {
PlayPauseTriggerStyle = 0,
PlayStopTriggerStyle,
PlayAgainTriggerStyle
PlayAgainTriggerStyle,
SoundEffectTriggerStyle
};
Q_ENUM(TriggerStyle)

View File

@ -15,6 +15,10 @@ Rectangle {
width: root.size; height: root.size
color: "transparent"
property bool shouldKeepPlayingLoop: false
property int seekEventTriggerCount: 0 //Needed to prevent irratic loop behavior and crashing (hacky solution, sigh)
property int seekOffset: 2000 //Needed to prevent irratic loop behavior and crashing (hacky solution, sigh)
property string normalTrackTitleBuffer: '<DROP FILE>'
property string soundEffectTrackTitleBuffer: '<DROP WAV FILE>'
property int duration: player.duration
//Player properties, functions & events
@ -44,8 +48,50 @@ Rectangle {
return filename;
}
onTriggerStyleChanged: {
// Player Mode Changed
switch (root.triggerStyle){
case CasterPlayerModel.SoundEffectTriggerStyle:
//SFX MODE
root.normalTrackTitleBuffer = trackTitle.trackTitleString;
trackTitle.trackTitleString = root.soundEffectTrackTitleBuffer;
progressBar.visible = false;
progressBar.enabled = false;
playerStateOverlay.visible = false;
playerStateColorOverlay.visible = false;
soundEffectIconColorOverlay.visible = true;
break;
default:
//NORMAL MODE
root.soundEffectTrackTitleBuffer = trackTitle.trackTitleString;
trackTitle.trackTitleString = root.normalTrackTitleBuffer;
progressBar.visible = true;
progressBar.enabled = true;
playerStateOverlay.visible = true;
playerStateColorOverlay.visible = true;
soundEffectIconColorOverlay.visible = false;
break;
}
}
//Player Subcomponents
SoundEffect {
id: sfx
onStatusChanged: {
switch(sfx.status){
case SoundEffect.Error:
trackTitle.trackTitleString = "<ERROR>";
break;
case SoundEffect.Ready:
trackTitle.trackTitleString = root.baseName(source.toString());
root.soundEffectTrackTitleBuffer = trackTitle.trackTitleString;
break;
}
}
}
MediaPlayer {
id: player
volume: volumeBar.value
@ -95,21 +141,31 @@ Rectangle {
}
onPositionChanged: {
//Update ProgressBar
progressBar.elapsedTime = player.position;
// true position buffer
var truePosition = player.position;
//Enforce play region and looping
if(root.isPlayRegionEnabled)
if(0 < root.playRegionEnd && root.playRegionEnd <= player.position){
if(root.isLooped)
player.seek(root.playRegionBegin);
else {
if(root.isPlayRegionEnabled){
if( root.seekEventTriggerCount < 1 && truePosition < root.playRegionBegin - root.seekOffset){
root.seekEventTriggerCount += 1;
truePosition = root.playRegionBegin;
player.seek(truePosition);
} else if(root.seekEventTriggerCount < 1 && root.playRegionEnd < truePosition){
root.seekEventTriggerCount += 1;
if(root.isLooped === false)
player.stop();
player.seek(root.playRegionBegin);
}
} else if (player.position < root.playRegionBegin && 0 < root.playRegionBegin && root.playRegionBegin < root.playRegionEnd) {
player.seek(root.playRegionBegin);
var tempTruePostition = truePosition;
truePosition = root.playRegionBegin;
player.seek(truePosition);
} else {
if(root.seekEventTriggerCount < 0)
root.seekEventTriggerCount = 0;
else
root.seekEventTriggerCount -= 1;
}
}
//Update ProgressBar
progressBar.elapsedTime = truePosition;
}
}
@ -165,69 +221,95 @@ Rectangle {
color: "#ffffff"
}
Image {
id: soundEffectIconOverlay
visible: false
width: Math.floor(0.35 * root.size); height: Math.floor(0.35 * root.size)
fillMode: Image.PreserveAspectFit
anchors.centerIn: parent
source: '/qml/icons/soundboard_tab.png'
}
ColorOverlay {
id: soundEffectIconColorOverlay
visible: false
anchors.fill: soundEffectIconOverlay; source: soundEffectIconOverlay
color: mouseArea.pressed ? 'grey' : "#ffffff"
}
MouseArea {
id: mouseArea
visible: root.isInPlayerMode
enabled: root.isInPlayerMode
anchors.fill: parent
onClicked: {
switch (player.playbackState) {
case MediaPlayer.StoppedState:
switch(root.triggerStyle){
default:
case CasterPlayerModel.PlayPauseTriggerStyle:
player.play();
break;
case CasterPlayerModel.PlayStopTriggerStyle:
player.play();
break;
case CasterPlayerModel.PlayAgainTriggerStyle:
if(root.isPlayRegionEnabled)
player.seek(root.playRegionBegin);
else
player.seek(0);
player.play();
break;
}
break;
case MediaPlayer.PausedState:
switch(root.triggerStyle){
default:
case CasterPlayerModel.PlayPauseTriggerStyle:
player.play();
break;
case CasterPlayerModel.PlayStopTriggerStyle:
player.play();
break;
case CasterPlayerModel.PlayAgainTriggerStyle:
if(root.isPlayRegionEnabled)
player.seek(root.playRegionBegin);
else
player.seek(0);
player.play();
break;
}
switch (root.triggerStyle){
case CasterPlayerModel.SoundEffectTriggerStyle:
// Sound Effect Mode
sfx.play();
break;
default:
case MediaPlayer.PlayingState:
switch(root.triggerStyle){
// Normal Mode
switch (player.playbackState) {
case MediaPlayer.StoppedState:
switch(root.triggerStyle){
default:
case CasterPlayerModel.PlayPauseTriggerStyle:
player.play();
break;
case CasterPlayerModel.PlayStopTriggerStyle:
player.play();
break;
case CasterPlayerModel.PlayAgainTriggerStyle:
if(root.isPlayRegionEnabled)
player.seek(root.playRegionBegin);
else
player.seek(0);
player.play();
break;
}
break;
case MediaPlayer.PausedState:
switch(root.triggerStyle){
default:
case CasterPlayerModel.PlayPauseTriggerStyle:
player.play();
break;
case CasterPlayerModel.PlayStopTriggerStyle:
player.play();
break;
case CasterPlayerModel.PlayAgainTriggerStyle:
if(root.isPlayRegionEnabled)
player.seek(root.playRegionBegin);
else
player.seek(0);
player.play();
break;
}
break;
default:
case CasterPlayerModel.PlayPauseTriggerStyle:
player.pause();
break;
case CasterPlayerModel.PlayStopTriggerStyle:
player.stop();
break;
case CasterPlayerModel.PlayAgainTriggerStyle:
if(root.isPlayRegionEnabled)
player.seek(root.playRegionBegin);
else
player.seek(0);
case MediaPlayer.PlayingState:
switch(root.triggerStyle){
default:
case CasterPlayerModel.PlayPauseTriggerStyle:
player.pause();
break;
case CasterPlayerModel.PlayStopTriggerStyle:
root.shouldKeepPlayingLoop = false;
player.stop();
break;
case CasterPlayerModel.PlayAgainTriggerStyle:
if(root.isPlayRegionEnabled)
player.seek(root.playRegionBegin);
else
player.seek(0);
break;
}
break;
}
break;
}
}
}
DropArea {
@ -236,7 +318,14 @@ Rectangle {
enabled: root.isInPlayerMode
anchors.fill: parent
onDropped: {
player.source = drop.urls[0];
switch (root.triggerStyle){
case CasterPlayerModel.SoundEffectTriggerStyle:
sfx.source = drop.urls[0];
break;
default:
player.source = drop.urls[0];
break;
}
}
}

View File

@ -6,7 +6,7 @@ Slider {
id: root
// Component properties
implicitWidth: 200
implicitWidth: parent.width - 10
implicitHeight: 40
from: 0
to: 0
@ -27,13 +27,10 @@ Slider {
PropertyChanges { target: sliderHandle; color: "#6AFF0000" }
PropertyChanges { target: repeatIcon; color: "#000000" }
PropertyChanges { target: foregroundBar; color: "red" }
PropertyChanges {
target: trackTimeElapsed
color: (sliderHandle.x >= sliderHandle.width + 8 ? "white" : "black")
}
PropertyChanges { target: trackTimeElapsed; color: "white" }
PropertyChanges {
target: trackTimeRemaining
color: (sliderHandle.x + sliderHandle.width >= parent.width - this.width - 5 ? "white" : "black")
color: (remainingTimeRect.x < sliderHandle.x + sliderHandle.width + 5 ? "white" : "black")
}
},
State {
@ -41,21 +38,24 @@ Slider {
PropertyChanges { target: sliderHandle; color: "#80FFFF00" }
PropertyChanges { target: repeatIcon; color: "#000000" }
PropertyChanges { target: foregroundBar; color: "yellow" }
PropertyChanges { target: trackTimeElapsed; color: "black" }
PropertyChanges { target: trackTimeRemaining; color: "black" }
PropertyChanges {
target: trackTimeElapsed
color: (elapsedTimeRect.width + 5 <= sliderHandle.x ? "black" : "white")
}
PropertyChanges {
target: trackTimeRemaining
color: (remainingTimeRect.x < sliderHandle.x + sliderHandle.width + 5 ? "white" : "black")
}
},
State {
name: "playing"
PropertyChanges { target: sliderHandle; color: "#6A00FF00" }
PropertyChanges { target: repeatIcon; color: "#000000" }
PropertyChanges { target: foregroundBar; color: "green" }
PropertyChanges {
target: trackTimeElapsed
color: (sliderHandle.x >= sliderHandle.width + 8 ? "white" : "black")
}
PropertyChanges { target: trackTimeElapsed; color: "white" }
PropertyChanges {
target: trackTimeRemaining
color: (sliderHandle.x + sliderHandle.width >= parent.width - this.width - 5 ? "white" : "black")
color: (remainingTimeRect.x < sliderHandle.x + sliderHandle.width + 5 ? "white" : "black")
}
}
]
@ -125,30 +125,44 @@ Slider {
root.to = root.duration;
}
function timeElapsed(msTime){
var ms = (msTime % 1000) / 1000;
var secs = (msTime / 1000 - (msTime % 1000) / 1000) % 60;
var mins = ((msTime / 1000 - (msTime % 1000) / 1000) - secs) / 60;
var msStr = ("000" + ms).slice(-3);
if(msStr.startsWith('.')){
msStr = msStr.replace('.', '');
if(msStr.length === 2){
msStr = msStr + "0";
}
} else if(msStr.startsWith('0.')){
msStr = msStr.replace('0.', '');
msStr = (msStr + "00").substring(0, 3);
}
function timeElapsed(elapsedMs){
if (elapsedMs <= 0)
return "+00:00";
var elapsed = elapsedMs
var ms = elapsed % 1000;
elapsed = (elapsed - ms) / 1000;
var secs = elapsed % 60;
var mins = (elapsed - secs) / 60;
return "+" + ("00" + mins).slice(-2) + ':' + ("00" + secs).slice(-2);
return '+' + ("00" + mins).slice(-2) + ':' + ("00" + secs).slice(-2) + "." + msStr;
}
function timeRemaining(elapsedMs, durationMs) {
function timeRemaining(elapsedMs, durationMs){
if(durationMs <= 0)
return "-00:00";
var remaining = durationMs - elapsedMs;
return "-00:00.000";
var msTime = durationMs - elapsedMs;
var ms = remaining % 1000;
remaining = (remaining - ms) / 1000;
var secs = remaining % 60;
var mins = (remaining - secs) / 60;
var ms = (msTime % 1000) / 1000;
var secs = (msTime / 1000 - (msTime % 1000) / 1000) % 60;
var mins = ((msTime / 1000 - (msTime % 1000) / 1000) - secs) / 60;
var msStr = ("000" + ms).slice(-3);
if(msStr.startsWith('.')){
msStr = msStr.replace('.', '');
if(msStr.length === 2){
msStr = msStr + "0";
}
} else if(msStr.startsWith('0.')){
msStr = msStr.replace('0.', '');
msStr = (msStr + "00").substring(0, 3);
}
return "-" + ("00" + mins).slice(-2) + ':' + ("00" + secs).slice(-2);
return '-' + ("00" + mins).slice(-2) + ':' + ("00" + secs).slice(-2) + "." + msStr;
}
// Component UI
@ -200,6 +214,32 @@ Slider {
visible: root.isPlayRegionEnabled
}
Rectangle {
id: elapsedTimeRect
x: 0
y: (this.width + 5 <= sliderHandle.x ? Math.floor((parent.height - this.height) / 2) : -this.height -(sliderHandle.height - parent.height)/2 - 5 )
width: trackTimeElapsed.width + 10
height: parent.height
border.color: "white"
border.width: 2
color: "#90000000"
Behavior on y { NumberAnimation { duration: 200; easing.type: Easing.InOutQuad } }
}
Rectangle {
id: remainingTimeRect
x: parent.width - this.width
y: (remainingTimeRect.x < sliderHandle.x + sliderHandle.width + 5 ? -this.height -(sliderHandle.height - parent.height)/2 - 5 : Math.floor((parent.height - this.height) / 2) )
width: trackTimeRemaining.width + 10
height: parent.height
border.color: "white"
border.width: 2
color: "#90000000"
Behavior on y { NumberAnimation { duration: 200; easing.type: Easing.InOutQuad } }
}
Rectangle {
id: backgroundBar
width: root.width; height: 20
@ -230,21 +270,23 @@ Slider {
Text {
id: trackTimeElapsed
x: (sliderHandle.x >= sliderHandle.width + 8 ? 5 : sliderHandle.x + sliderHandle.width + 5)
y: Math.floor((parent.height - this.height) / 2)
color: (sliderHandle.x >= sliderHandle.width + 8 ? "white" : "black")
x: 5
y: (elapsedTimeRect.width + 5 <= sliderHandle.x ? Math.floor((parent.height - this.height) / 2) : elapsedTimeRect.y + (elapsedTimeRect.height - this.height)/2 )
color: "white"
font.family: "Helvetica"
font.bold: true
font.pointSize: 14
text: timeElapsed(root.elapsedTime)
text: root.timeElapsed(root.elapsedTime)
Behavior on y { NumberAnimation { duration: 200; easing.type: Easing.InOutQuad } }
}
Text {
id: trackTimeRemaining
x: (sliderHandle.x + sliderHandle.width >= parent.width - this.width - 5 ? sliderHandle.x - this.width - 5 : parent.width - this.width - 5)
y: Math.floor((parent.height - this.height) / 2)
color: (sliderHandle.x + sliderHandle.width >= parent.width - this.width - 5 ? "white" : "black")
x: parent.width - this.width - 5
y: (remainingTimeRect.x < sliderHandle.x + sliderHandle.width + 5 ? remainingTimeRect.y + (remainingTimeRect.height - this.height)/2 : Math.floor((parent.height - this.height) / 2) )
color: "black"
font.family: "Helvetica"
font.bold: true
font.pointSize: 14

View File

@ -6,7 +6,7 @@ Slider {
orientation: Qt.Vertical
implicitWidth: 50
implicitHeight: 145
implicitHeight: 120
handle: Rectangle {
y: root.visualPosition * (root.height - height)

View File

@ -19,6 +19,8 @@ Drawer {
//Settings properties & functions
property int playerIndex: 0
function openSettings(player_index){
// interaction
root.interactive = true;
//Set active player
root.playerIndex = player_index;
//Update setting components
@ -27,6 +29,7 @@ Drawer {
settingPlayRegionRange.regionBegin = soundboard1.soundboardPlayers.itemAt(playerIndex).playRegionBegin;
settingPlayRegionRange.regionEnd = soundboard1.soundboardPlayers.itemAt(playerIndex).playRegionEnd;
settingPlayRegionRange.duration = soundboard1.soundboardPlayers.itemAt(playerIndex).duration;
settingTriggerStyle.selectedIndex = soundboard1.soundboardPlayers.itemAt(playerIndex).triggerStyle;
//open settings drawer
root.open();
}
@ -39,18 +42,20 @@ Drawer {
case CasterPlayerModel.IsPlayingRegionEnabledRole:
soundboard1.soundboardPlayers.itemAt(playerIndex).isPlayRegionEnabled = settingValue;
break;
case CasterPlayerModel.TriggerStyleRole:
soundboard1.soundboardPlayers.itemAt(playerIndex).triggerStyle = settingValue;
break;
case CasterPlayerModel.PlayRegionBeginRole:
soundboard1.soundboardPlayers.itemAt(playerIndex).playRegionBegin = settingValue;
break;
case CasterPlayerModel.PlayRegionEndRole:
soundboard1.soundboardPlayers.itemAt(playerIndex).playRegionEnd = settingValue;
break;
case CasterPlayerModel.TriggerStyleRole:
soundboard1.soundboardPlayers.itemAt(playerIndex).triggerStyle = settingValue;
break;
}
}
onClosed: root.interactive = false;
// Settings subcomponents
Pane {
id: header
@ -82,7 +87,7 @@ Drawer {
Flickable {
anchors.fill: parent
contentHeight: columnView.height
contentHeight: columnView.height + 200
clip: true
anchors.margins: 8
flickableDirection: Flickable.VerticalFlick
@ -106,7 +111,7 @@ Drawer {
}
Item {//Setting: isLooped
width: parent.width; height:100
width: parent.width; height:120
Subcomponent.FlatSwitch {
id: settingLoopSwitch
@ -121,7 +126,7 @@ Drawer {
}
Item {//Setting: isPlayRegionEnabled
width: parent.width; height:100
width: parent.width; height:120
Subcomponent.FlatSwitch {
id: settingPlayRegionEnabledSwitch
@ -134,7 +139,7 @@ Drawer {
}
Item {//Setting: play region time range
width: parent.width; height:100
width: parent.width; height: 180
Subcomponent.TimeRangeSelector {
id: settingPlayRegionRange
@ -151,13 +156,13 @@ Drawer {
}
Item {//Setting: Trigger Style
width: parent.width; height: 100
width: parent.width; height: 150
Subcomponent.StateSelector {
id: settingTriggerStyle
anchors.centerIn: parent
label: "Test label"
label: "Select Trigger Style:"
list: ListModel {
ListElement {
name: "Play/Pause"
@ -168,6 +173,9 @@ Drawer {
ListElement {
name: "Play Again"
}
ListElement {
name: "Sound Effect"
}
}
onSelectedIndexChanged: {

View File

@ -76,7 +76,7 @@ Item {
Column {
id: gridContainer
width: root.width
height: root.height
height: 0.8 * root.height
spacing: 8
Item {

View File

@ -16,13 +16,12 @@ Item {
Rectangle {
anchors { left: parent.left; right: parent.right; bottom: parent.bottom; }
height: labelText.implicitHeight + 4 + (expanded ? 20 * view.count : 20)
Behavior on height { NumberAnimation { duration: 300 } }
height: parent.height
radius: 2
border.width: 1
border.color: "yellow"
color: "yellow"
border.color: "#4e4e4e"
color: "#4e4e4e"
MouseArea {
anchors.fill: parent
@ -31,6 +30,9 @@ Item {
Text {
id: labelText
font.pointSize: 24
font.bold: true
color: "white"
anchors { left: parent.left; top: parent.top; margins: 2 }
}
@ -43,7 +45,7 @@ Item {
}
radius: 2
color: "white"
color: "grey"
ListView {
id: view
@ -54,10 +56,13 @@ Item {
delegate: Text {
anchors { left: parent.left; right: parent.right }
height: 20
height: 35
verticalAlignment: Text.AlignVCenter
font.pointSize: 30
font.bold: true
color: "white"
text: modelData
MouseArea {
@ -69,12 +74,13 @@ Item {
}
}
}
highlight: Rectangle {
anchors { left: parent.left; right: parent.right }
height: 20
height: 35
radius: 2
color: "yellow"
color: "#2f2f2f"
}
}
}

View File

@ -9,6 +9,7 @@ Item {
id: root
// Component properties
width: parent.width; height: parent.height
clip: true
// Properties, functions & events
property int regionBegin: 0
@ -19,17 +20,37 @@ Item {
property string labelText: "Set play region range:"
function msToProperTime(msTime){
var ms = (msTime % 1000) / 1000;
var secs = (msTime / 1000 - (msTime % 1000) / 1000) % 60;
var mins = ((msTime / 1000 - (msTime % 1000) / 1000) - secs) / 60;
return ("00" + mins).slice(-2) + ':' + ("00" + secs).slice(-2);
var msStr = ("000" + ms).slice(-3);
if(msStr.startsWith('.')){
msStr = msStr.replace('.', '');
if(msStr.length === 2){
msStr = msStr + "0";
}
} else if(msStr.startsWith('0.')){
msStr = msStr.replace('0.', '');
msStr = (msStr + "00").substring(0, 3);
}
return ("00" + mins).slice(-2) + ':' + ("00" + secs).slice(-2) + "." + msStr;
}
function properTimeToMs(properTime){
var ms = 0;
var time = properTime.split(':');
if(time.length === 2){
ms = parseInt(time[0], 10) * 60 * 1000 + parseInt(time[1], 10) * 1000;
var time1 = properTime.split(':');
if(time1.length === 2){
var time2 = time1[1].split('.');
if(time2.length === 2 && 0 < time2[1].length && time2[1].length <= 3){
ms = parseInt(time1[0], 10) * 60 * 1000 + parseInt(time2[0], 10) * 1000 + parseFloat("0." + time2[1]) * 1000;
} else if(time2.length === 1) {
ms = parseInt(time1[0], 10) * 60 * 1000 + parseInt(time1[1], 10) * 1000;
}
} else if(time1.length === 1){
ms = parseInt(properTime, 10) * 1000;
}
return ms;
}
@ -38,13 +59,13 @@ Item {
Column {
id: columnContainer
width: root.width
height: root.height
height: 0.8 * root.height
spacing: 8
Item {
id: labelContainer
x: (parent.width - this.width)/2
width: label.width; height: 0.33 * parent.height
width: label.width; height: (1/4) * parent.height
Text {
id: label
@ -57,8 +78,8 @@ Item {
}
Item {
id: rangeContainer
width: parent.width; height: 0.33 * parent.height
id: rangeContainer1
width: parent.width; height: (1/4) * parent.height
Row {
anchors.centerIn: parent
@ -72,7 +93,7 @@ Item {
}
Item {
width: 80; height: parent.height
width: 130; height: parent.height
clip: true
Rectangle {
@ -88,9 +109,42 @@ Item {
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
text: root.msToProperTime(root.regionBegin)
property string buffer: ''
onFocusChanged: {
if(beginInput.focus === true){
beginInput.buffer = beginInput.text;
beginInput.text = '';
} else {
if(beginInput.text === ''){
beginInput.text = beginInput.buffer;
}
beginInput.buffer = '';
}
}
onAccepted: setRangeButton.submit()
Text {
anchors.centerIn: parent
color: '#804e4e4e'
font.bold: true
font.pointSize: 20
text: beginInput.buffer
}
}
}
}
}
Item {
id: rangeContainer2
width: parent.width; height: (1/4) * parent.height
Row {
anchors.centerIn: parent
Text {
id: endLabel
color: "white"
@ -100,7 +154,7 @@ Item {
}
Item {
width: 80; height: parent.height
width: 130; height: parent.height
clip: true
Rectangle {
@ -116,19 +170,43 @@ Item {
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
text: root.msToProperTime(root.regionEnd)
property string buffer: ''
onFocusChanged: {
if(endInput.focus === true){
endInput.buffer = endInput.text;
endInput.text = '';
} else {
if(endInput.text === ''){
endInput.text = endInput.buffer;
}
endInput.buffer = '';
}
}
onAccepted: setRangeButton.submit()
Text {
anchors.centerIn: parent
color: '#804e4e4e'
font.bold: true
font.pointSize: 20
text: endInput.buffer
}
}
}
}
}
Item {
width: parent.width; height: 0.33 * parent.height
width: parent.width; height: (1/4) * parent.height
Subcomponent.BootstrapButton {
id: setRangeButton
width: 100; height: parent.height
anchors.centerIn: parent
text: 'Set Range'; type: 'info'
onClicked: {
function submit(){
var beginTemp = root.properTimeToMs(beginInput.text);
var endTemp = root.properTimeToMs(endInput.text);
if(0 <= beginTemp && beginTemp < root.duration && beginTemp < endTemp){
@ -142,6 +220,8 @@ Item {
beginInput.text = root.msToProperTime(root.regionBegin);
endInput.text = root.msToProperTime(root.regionEnd);
}
onClicked: setRangeButton.submit()
}
}

View File

@ -24,8 +24,10 @@ ApplicationWindow {
height: 600
color: "#4D4D4D"
// Application overlay that shows individual player settings
CasterPlayerSettingsDrawer.Component { id: casterPlayerSettingsDrawer }
// Main Application UI
Rectangle {
id: mainSideNav
height: parent.height
@ -155,6 +157,7 @@ ApplicationWindow {
source: '/qml/icons/newTab.png'
size: mainSoundboardsContainer_menubar.height
//onClicked: mainSideNav.index = 0
onClicked: console.log("New Tab")
}
Button_SoundboardsContainer_MenuBar {