mirror of
https://github.com/JupiterBroadcasting/CasterSoundboard.git
synced 2025-10-29 11:36:26 +00:00
Caster Player Modifications
This commit is contained in:
parent
a4a15b15cf
commit
9e1eb34f7f
@ -26,7 +26,8 @@ public:
|
||||
enum TriggerStyle {
|
||||
PlayPauseTriggerStyle = 0,
|
||||
PlayStopTriggerStyle,
|
||||
PlayAgainTriggerStyle
|
||||
PlayAgainTriggerStyle,
|
||||
SoundEffectTriggerStyle
|
||||
};
|
||||
Q_ENUM(TriggerStyle)
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -6,7 +6,7 @@ Slider {
|
||||
orientation: Qt.Vertical
|
||||
|
||||
implicitWidth: 50
|
||||
implicitHeight: 145
|
||||
implicitHeight: 120
|
||||
|
||||
handle: Rectangle {
|
||||
y: root.visualPosition * (root.height - height)
|
||||
|
||||
@ -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: {
|
||||
|
||||
@ -76,7 +76,7 @@ Item {
|
||||
Column {
|
||||
id: gridContainer
|
||||
width: root.width
|
||||
height: root.height
|
||||
height: 0.8 * root.height
|
||||
spacing: 8
|
||||
|
||||
Item {
|
||||
|
||||
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user