diff --git a/res/skins/LateNight/controls/button_4state_display.xml b/res/skins/LateNight/controls/button_4state_display.xml
new file mode 100644
index 00000000000..55c2513ab01
--- /dev/null
+++ b/res/skins/LateNight/controls/button_4state_display.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+ 4
+
+ 0
+
+
+ skin://buttons/btn__.svg
+ skin://buttons/btn___active.svg
+
+
+ 1
+
+
+ skin://buttons/btn___active.svg
+ skin://buttons/btn___active.svg
+
+
+ 2
+
+
+ skin://buttons/btn___active.svg
+ skin://buttons/btn___active.svg
+
+
+ 4
+
+
+ skin://buttons/btn___active.svg
+ skin://buttons/btn___active.svg
+
+
+
+ true
+ LeftButton
+
+
+
+ false
+
+
+
diff --git a/res/skins/LateNight/decks/vinyl_controls.xml b/res/skins/LateNight/decks/vinyl_controls.xml
index 7922930304c..88e5e93bf42 100644
--- a/res/skins/LateNight/decks/vinyl_controls.xml
+++ b/res/skins/LateNight/decks/vinyl_controls.xml
@@ -9,27 +9,6 @@
horizontal
f,f
-
- 2f,0min
-
-
- VinylStatus
- 18f,18f
- vinylcontrol_status
-
-
- skins:LateNight//style/vinyl_control_0.svg
-
- skins:LateNight//style/vinyl_control_1.svg
-
- skins:LateNight//style/vinyl_control_2.svg
-
- skins:LateNight//style/vinyl_control_3.svg
-
- ,vinylcontrol_status
-
-
-
3f,0min
@@ -38,17 +17,32 @@
horizontal
min,f
-
-
- vinylcontrol_enabled
- VinylButton
- 40f,20f
- VINYL
- VINYL
- ,vinylcontrol_enabled
-
+
+
+ stacked
+ 40f,20f
+
+
+ vinylcontrol_enabled_status
+ Blank
+ 40f,20f
+ ,vinylcontrol_enabled
+
+
+
+ VinylStatus
+ 40f,20f
+ VINYL
+ VINYL
+ VINYL
+ VINYL
+ ,vinylcontrol_status
+
+
+
+
vinylcontrol_mode
diff --git a/res/skins/LateNight/style_classic.qss b/res/skins/LateNight/style_classic.qss
index 407877bd035..7b5fc9293f9 100644
--- a/res/skins/LateNight/style_classic.qss
+++ b/res/skins/LateNight/style_classic.qss
@@ -1202,7 +1202,8 @@ WBeatSpinBox, #spinBoxTransition,
#MainMenu::item,
#MainMenu QMenu::item,
#MainMenu QMenu QCheckBox,
-#VinylButton[displayValue="0"],
+WPushButton#VinylStatus[displayValue="0"], /* off */
+#VinylCueButton[displayValue="0"],
#VinylModeButton,
#PassthroughButton[displayValue="0"],
#FxAssignButtons WPushButton[displayValue="0"],
@@ -1213,7 +1214,9 @@ WBeatSpinBox, #spinBoxTransition,
color: #d2d2d1;
}
-#VinylButton[displayValue="1"],
+WPushButton#VinylStatus[displayValue="1"], /* enabled (green bg) */
+WPushButton#VinylStatus[displayValue="2"], /* end of record (blinking yellow bg) */
+WPushButton#VinylStatus[displayValue="3"], /* needle skip detected (pink bg) */
#PassthroughButton[displayValue="1"],
#VinylCueButton[displayValue="1"],
#VinylCueButton[displayValue="2"],
@@ -1294,7 +1297,7 @@ QPushButton#pushButtonRecording:checked {
border-image: url(skins:LateNight/classic/buttons/btn_embedded_grid_active.svg) 2 2 2 1;
}
WPushButton#FxAssignButton1[displayValue="0"],
-#VinylButton[displayValue="0"],
+WPushButton#VinylStatus[displayValue="0"],
#KeyMatchReset[displayValue="0"],
#GuiToggleButton[displayValue="0"],
#SyncDeck[displayValue="0"],
@@ -1307,7 +1310,9 @@ WEffectSelector:!editable,
border-width: 2px;
border-image: url(skins:LateNight/classic/buttons/btn_embedded_library.svg) 2 2 2 2;
}
-WPushButton#VinylButton[displayValue="1"],
+WPushButton#VinylStatus[displayValue="1"],
+WPushButton#VinylStatus[displayValue="2"],
+WPushButton#VinylStatus[displayValue="3"],
WPushButton#FxAssignButton1[displayValue="1"],
#KeyMatchReset[pressed="true"],
#GuiToggleButton[displayValue="1"],
@@ -1468,6 +1473,7 @@ QPushButton#pushButtonRecording:checked {
WPushButton#QuickEffectButton[displayValue="1"],
#FxAssignButton1[displayValue="1"],
#FxAssignButton2[displayValue="1"],
+WPushButton#VinylStatus[displayValue="1"], /* enabled, OK */
#BroadcastButton[displayValue="2"] {
background-color: #659f08;
}
@@ -1494,14 +1500,15 @@ QPushButton#pushButtonRepeatPlaylist:checked {
background-color: #888;
}
+/* pink for error / warning*/
#BroadcastButton[displayValue="3"],
-#BroadcastButton[displayValue="4"] {
- /* pink */
+#BroadcastButton[displayValue="4"],
+WPushButton#VinylStatus[displayValue="3"] { /* needle skip detected */
background-color: #f856e7;
}
/* Golden */
-#VinylButton[displayValue="1"],
+WPushButton#VinylStatus[displayValue="2"], /* blinks when the needle reaches the end of the record */
#PassthroughButton[displayValue="1"],
#GuiToggleButton[displayValue="1"],
#GuiToggleButton[displayValue="2"],
@@ -1604,7 +1611,14 @@ WPushButton#FxExpandOverlay[displayValue="0"],
WPushButton#SamplerExpand[displayValue="0"],
#BeatgridControlsToggle,
#SamplerControlsMini WPushButton,
-#RecDot {
+#RecDot,
+/* transparent buttons, 0-4 (max button state we have currently) */
+/* currently used for VINYL overlay */
+WPushButton#Blank[value="0"],
+WPushButton#Blank[value="1"],
+WPushButton#Blank[value="2"],
+WPushButton#Blank[value="3"],
+WPushButton#Blank[value="4"] {
background-color: transparent;
}
diff --git a/res/skins/LateNight/style_palemoon.qss b/res/skins/LateNight/style_palemoon.qss
index dc1df82d011..8aafa1b6bbe 100644
--- a/res/skins/LateNight/style_palemoon.qss
+++ b/res/skins/LateNight/style_palemoon.qss
@@ -1360,7 +1360,7 @@ WEffectChainPresetSelector QAbstractScrollArea,
#KnobLabel,
#FxKnobLabel,
#FxButtonLabel,
-#VinylButton[displayValue="0"],
+WPushButton#VinylStatus[displayValue="0"],
#VinylCueButton[displayValue="0"],
#VinylModeButton,
#PassthroughButton[displayValue="0"],
@@ -1378,7 +1378,9 @@ WEffectChainPresetSelector QAbstractScrollArea,
color: #444;
}
-#VinylButton[displayValue="1"],
+WPushButton#VinylStatus[displayValue="1"], /* enabled (green bg) */
+WPushButton#VinylStatus[displayValue="2"], /* end of record (blinking yellow bg) */
+WPushButton#VinylStatus[displayValue="3"], /* needle skip detected (pink bg) */
#VinylCueButton[displayValue="1"],
#VinylCueButton[displayValue="2"],
#PassthroughButton[displayValue="1"],
@@ -1451,7 +1453,7 @@ QPushButton#pushButtonRecording:checked {
#BroadcastButton[displayValue="0"],
#SkinSettingsToggle[displayValue="0"],
#KeyMatchReset[displayValue="0"],
-WPushButton#VinylButton[displayValue="0"],
+WPushButton#VinylStatus[displayValue="0"],
#SyncDeck[displayValue="0"],
WPushButton#FxAssignButton1[displayValue="0"],
WEffectSelector:!editable,
@@ -1464,7 +1466,9 @@ WEffectSelector:!editable,
}
/*
WPushButton#BpmTap[displayValue="1"], */
- WPushButton#VinylButton[displayValue="1"],
+ WPushButton#VinylStatus[displayValue="1"],
+ WPushButton#VinylStatus[displayValue="2"],
+ WPushButton#VinylStatus[displayValue="3"],
#SyncDeck[displayValue="1"],
WPushButton#FxAssignButton1[displayValue="1"],
#KeyMatchReset[pressed="true"],
@@ -1664,7 +1668,6 @@ WPushButton#Reverse[pressed="true"],
#MicTalk[value="1"], #AuxPlay[value="1"],
#MicDucking[value="1"],
#MicDucking[value="2"],
-#VinylButton[displayValue="1"],
#PassthroughButton[displayValue="1"],
#BroadcastButton[displayValue="4"], /* warning */
QPushButton#pushButtonAutoDJ:checked,
@@ -1700,6 +1703,7 @@ QPushButton#pushButtonRecording:checked,
/* Green for Fx toggles, QuickEffect + Fx12 */
#FxUnit1 #FxToggleButton[displayValue="1"],
#FxUnit2 #FxToggleButton[displayValue="1"],
+WPushButton#VinylStatus[displayValue="1"], /* enabled, OK */
#BroadcastButton[displayValue="2"] {
background-color: #438225;
}
@@ -1711,7 +1715,7 @@ QPushButton#pushButtonRecording:checked,
}
/* Blue for Fx buttons 3/4 */
#FxUnit3 #FxToggleButton[displayValue="1"],
-#FxUnit4 #FxToggleButton[displayValue="1"],
+#FxUnit4 #FxToggleButton[displayValue="1"]
WBeatSpinBox::up-button:pressed,
WBeatSpinBox::down-button:pressed,
#spinBoxTransition::up-button:pressed,
@@ -1800,7 +1804,8 @@ WPushButton#FxSuperLinkInvertButton[displayValue="0"] {
/* Yellow */
#RecFeedback[displayValue="1"], /* initialize recording */
-#BroadcastButton[displayValue="1"] { /* connecting */
+#BroadcastButton[displayValue="1"], /* connecting */
+WPushButton#VinylStatus[displayValue="2"] { /* blinks when the needle reaches the end of the record */
background-color: #d09300;
}
@@ -1808,9 +1813,10 @@ WPushButton#FxSuperLinkInvertButton[displayValue="0"] {
background-color: #395579;
}
-/* pink */
-#BroadcastButton[displayValue="3"], /* failure */
-#RecFeedback[displayValue="3"] {
+/* pink for error / failure / warning */
+#BroadcastButton[displayValue="3"],
+#RecFeedback[displayValue="3"],
+WPushButton#VinylStatus[displayValue="3"] { /* needle skip detected */
background-color: #f856e7;
}
@@ -1850,7 +1856,14 @@ WPushButton#CrossfaderButton[displayValue="0"],
WPushButton#CrossfaderButton[displayValue="1"],
WPushButton#RecButton[displayValue="0"],
WPushButton#RecButton[displayValue="1"],
-#RecDot {
+#RecDot,
+/* transparent buttons, 0-4 (max button state we have currently) */
+/* currently used for VINYL overlay */
+WPushButton#Blank[value="0"],
+WPushButton#Blank[value="1"],
+WPushButton#Blank[value="2"],
+WPushButton#Blank[value="3"],
+WPushButton#Blank[value="4"] {
background-color: transparent;
}
diff --git a/res/skins/LateNight/toolbar.xml b/res/skins/LateNight/toolbar.xml
index c6582ff2139..c1d84b372ed 100644
--- a/res/skins/LateNight/toolbar.xml
+++ b/res/skins/LateNight/toolbar.xml
@@ -270,35 +270,17 @@
-
- 72f,20f
- broadcast_enabled
- BroadcastButton
- 4
-
- 0
- ON AIR
-
-
- 1
- ...
-
-
- 2
- ON AIR
-
-
- 3
- ---
-
-
- [Shoutcast],enabled
- LeftButton
-
-
- [Shoutcast],status
-
-
+
+ BroadcastButton
+ broadcast_enabled
+ 72f,20f
+ ON AIR
+ ...
+ ON AIR
+ ---
+ [Shoutcast],enabled
+ [Shoutcast],status
+
ToolbarSeparator
diff --git a/src/skin/legacy/tooltips.cpp b/src/skin/legacy/tooltips.cpp
index 4d328745a5d..f74fcecdbbd 100644
--- a/src/skin/legacy/tooltips.cpp
+++ b/src/skin/legacy/tooltips.cpp
@@ -696,17 +696,28 @@ void Tooltips::addStandardTooltips() {
<< tr("Enable Passthrough")
<< tr("When enabled, the deck directly plays the audio arriving on the vinyl input.");
- add("vinylcontrol_enabled")
- << tr("Enable Vinyl Control")
- << tr("When disabled, the track is controlled by Mixxx playback controls.")
- << tr("When enabled, the track responds to external vinyl control.");
+ QStringList vcStatus;
+ vcStatus << tr("Provides visual feedback for vinyl control status:")
+ << tr("Green for control enabled.")
+ << tr("Blinking yellow for when the needle reaches the end of the "
+ "record.")
+ << tr("Red for when needle skip has been detected.");
+ QStringList vcEnabled;
+ vcEnabled << tr("Enable Vinyl Control")
+ << tr("When disabled, the track is controlled by Mixxx playback "
+ "controls.")
+ << tr("When enabled, the track responds to external vinyl "
+ "control.");
+
+ add("vinylcontrol_enabled") << vcEnabled;
add("vinylcontrol_status")
- << tr("Vinyl Status")
- << tr("Provides visual feedback for vinyl control status:")
- << tr("Green for control enabled.")
- << tr("Blinking yellow for when the needle reaches the end of the record.")
- << tr("Blue for passthrough enabled.");
+ << tr("Vinyl Status") << vcStatus;
+
+ add("vinylcontrol_enabled_status")
+ << vcEnabled
+ << " " // generates a linebreak. \n would result in two linebrekas.
+ << vcStatus;
add("vinylcontrol_mode")
<< tr("Vinyl Control Mode")