Add Jukebox Mode (#930)

* Add jukebox mode

Songs can now be played without singing, e.g. as a break filler at parties.

- New Jukebox button in the main menu next to Sing and Party, locked without a profile like both of them
- Choose all songs, a category or a playlist, random or in order, and optionally only a part of each song (medley part, 30, 60 or 90 seconds)
- Video in full screen, lyrics without notes and a short song info whenever a new song starts
- Control bar with previous, pause, next, skip intro, audio mode (normal or instrumental), shuffle, repeat, lyrics on/off, queue and "Sing now"
- Queue with search: Enter puts a song next, Enter again plays it right away, songs can also be removed and reordered
- The queue adapts its size to the free space above the lyrics or the control bar
- Control bar and queue fade out after a few seconds without input and come back with the next key press or mouse move
- Works with keyboard, mouse and gamepad
- Smooth transition between songs, the next song is loaded in advance
- "Sing now" starts the current song with the player selection and returns to the jukebox afterwards
- The logo in the main menu is now centered
- New LyricsIcon and QueueRow textures in all Vocaluxe 2024 skins

* Fix SonarCloud issues
This commit is contained in:
McSchneidar authored and GitHub committed 2026-10-21 08:49:50 +02:00
1 parent bc4d2cf169
commit 522003a25f
27 files changed
+3612 -19

No files matched your search

+27
View File
@@ -112,6 +112,7 @@
<string name="TR_SCREENMAIN_BUTTON_PROFILES">Profiles</string>
<string name="TR_SCREENMAIN_TEXT_NOPROFILES">No profiles found!</string>
<string name="TR_SCREENMAIN_BUTTON_STATISTICS">Statistics</string>
<string name="TR_SCREENMAIN_BUTTON_JUKEBOX">Jukebox</string>
<string name="TR_SCREENSTATISTICS_TITLE">Statistics</string>
<string name="TR_SCREENSTATISTICS_HINT">Navigate = Select a tile • Enter = Open details • ESC = Back to main menu</string>
<string name="TR_SCREENSTATISTICS_DETAILHINT">Left/Right = Change view • Up/Down = Scroll • ESC = Back to statistics</string>
@@ -150,6 +151,32 @@
<string name="TR_SCREENSTATISTICS_COL_SCORE">Score</string>
<string name="TR_SCREENSTATISTICS_COL_SONGS">Songs</string>
<string name="TR_SCREENSTATISTICS_COL_AVERAGE">Average</string>
<string name="TR_SCREENJUKEBOX_TITLE">Jukebox</string>
<string name="TR_SCREENJUKEBOX_SOURCE">Source</string>
<string name="TR_SCREENJUKEBOX_PLAYLIST">Playlist</string>
<string name="TR_SCREENJUKEBOX_SORTING">Sorting</string>
<string name="TR_SCREENJUKEBOX_CATEGORY">Category</string>
<string name="TR_SCREENJUKEBOX_ORDER">Order</string>
<string name="TR_SCREENJUKEBOX_SECTION">Section</string>
<string name="TR_SCREENJUKEBOX_LYRICS">Lyrics</string>
<string name="TR_SCREENJUKEBOX_AUDIOMODE">Audio mode</string>
<string name="TR_SCREENJUKEBOX_VIDEO">Video</string>
<string name="TR_SCREENJUKEBOX_NUMSONGS">%d songs</string>
<string name="TR_SCREENJUKEBOX_NOSONGS">No songs found</string>
<string name="TR_JUKEBOX_ORDER_RANDOM">Random</string>
<string name="TR_JUKEBOX_ORDER_SORTED">In order</string>
<string name="TR_JUKEBOX_SECTION_FULL">Full song</string>
<string name="TR_JUKEBOX_SECTION_MEDLEY">Medley part</string>
<string name="TR_JUKEBOX_SECTION_30">30 seconds</string>
<string name="TR_JUKEBOX_SECTION_60">60 seconds</string>
<string name="TR_JUKEBOX_SECTION_90">90 seconds</string>
<string name="TR_SCREENJUKEBOXPLAYER_SKIPINTRO">Skip intro</string>
<string name="TR_SCREENJUKEBOXPLAYER_SING">Sing now</string>
<string name="TR_SCREENJUKEBOXPLAYER_QUEUE">Queue</string>
<string name="TR_SCREENJUKEBOXPLAYER_SEARCH">Type to search</string>
<string name="TR_SCREENJUKEBOXPLAYER_QUEUEHELP">Enter: Play next, Enter again: Play now</string>
<string name="TR_SCREENJUKEBOXPLAYER_QUEUEHELP2">Del: Remove | Shift+Up/Down: Move</string>
<string name="TR_SCREENJUKEBOXPLAYER_NUMSONGS">%d songs</string>
<string name="TR_SCREENPARTY_TITLE">Party-Mode Selection</string>
<string name="TR_SCREENPARTY_MODES">Party-mode</string>
<string name="TR_SCREENPARTY_DESCRIPTION">Description</string>
@@ -0,0 +1,6 @@
ScreenJukebox
++++++++++
Version 1:
New screen: jukebox settings (source, order, section, lyrics, audio mode and video) before the playback starts
@@ -0,0 +1,7 @@
ScreenJukeboxPlayer
++++++++++
Version 1:
New screen: jukebox playback with video, lyrics, song info, control bar and queue
New texture QueueRow for <StaticQueueRow> and <StaticQueueRowPlaying> (rounded row in the size ratio of the queue rows)
@@ -1,5 +1,17 @@
ScreenMain
++++++++++
Version 6:
(2026 Oct 22)
Add:
<ButtonJukebox>
Change:
ButtonSing, ButtonParty and ButtonJukebox share the upper row
LogoMain is centered horizontally
ButtonJukebox is locked without a profile like ButtonSing and ButtonParty, the warning covers the whole upper row
++++++++++
Version 5:
(2026 Oct 17)
@@ -397,6 +397,8 @@
<SaveIcon>SaveIcon.png</SaveIcon>
<SingIcon>SingIcon.png</SingIcon>
<ListIcon>ListIcon.png</ListIcon>
<LyricsIcon>LyricsIcon.png</LyricsIcon>
<QueueRow>QueueRow.png</QueueRow>
<Minus>MinusIcon.png</Minus>
<Plus>PlusIcon.png</Plus>
<VolUp>VolUp.png</VolUp>
+2
View File
@@ -397,6 +397,8 @@
<SaveIcon>SaveIcon.png</SaveIcon>
<SingIcon>SingIcon.png</SingIcon>
<ListIcon>ListIcon.png</ListIcon>
<LyricsIcon>LyricsIcon.png</LyricsIcon>
<QueueRow>QueueRow.png</QueueRow>
<Minus>MinusIcon.png</Minus>
<Plus>PlusIcon.png</Plus>
<VolUp>VolUp.png</VolUp>
+2
View File
@@ -397,6 +397,8 @@
<SaveIcon>SaveIcon.png</SaveIcon>
<SingIcon>SingIcon.png</SingIcon>
<ListIcon>ListIcon.png</ListIcon>
<LyricsIcon>LyricsIcon.png</LyricsIcon>
<QueueRow>QueueRow.png</QueueRow>
<Minus>MinusIcon.png</Minus>
<Plus>PlusIcon.png</Plus>
<VolUp>VolUp.png</VolUp>
+2
View File
@@ -397,6 +397,8 @@
<SaveIcon>SaveIcon.png</SaveIcon>
<SingIcon>SingIcon.png</SingIcon>
<ListIcon>ListIcon.png</ListIcon>
<LyricsIcon>LyricsIcon.png</LyricsIcon>
<QueueRow>QueueRow.png</QueueRow>
<Minus>MinusIcon.png</Minus>
<Plus>PlusIcon.png</Plus>
<VolUp>VolUp.png</VolUp>
+2
View File
@@ -397,6 +397,8 @@
<SaveIcon>SaveIcon.png</SaveIcon>
<SingIcon>SingIcon.png</SingIcon>
<ListIcon>ListIcon.png</ListIcon>
<LyricsIcon>LyricsIcon.png</LyricsIcon>
<QueueRow>QueueRow.png</QueueRow>
<Minus>MinusIcon.png</Minus>
<Plus>PlusIcon.png</Plus>
<VolUp>VolUp.png</VolUp>
+2
View File
@@ -397,6 +397,8 @@
<SaveIcon>SaveIcon.png</SaveIcon>
<SingIcon>SingIcon.png</SingIcon>
<ListIcon>ListIcon.png</ListIcon>
<LyricsIcon>LyricsIcon.png</LyricsIcon>
<QueueRow>QueueRow.png</QueueRow>
<Minus>MinusIcon.png</Minus>
<Plus>PlusIcon.png</Plus>
<VolUp>VolUp.png</VolUp>
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

@@ -0,0 +1,645 @@
<?xml version='1.0' encoding='utf-8'?>
<Screen xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Informations>
<ScreenName>ScreenJukebox</ScreenName>
<ScreenVersion>1</ScreenVersion>
</Informations>
<Backgrounds>
<Background Name="Background1">
<Type>Video</Type>
<SlideShowTextures />
<Video>BG_Video</Video>
<Skin>BG_Options</Skin>
<Color Name="BackgroundColor" />
</Background>
</Backgrounds>
<Statics>
<Static Name="StaticMenuBar">
<Skin />
<Color Name="BackgroundColorAlpha" />
<Rect>
<X>0</X>
<Y>60</Y>
<W>1920</W>
<H>67.5</H>
<Z>1</Z>
</Rect>
</Static>
</Statics>
<Texts>
<Text Name="TextTitle">
<X>960</X>
<Y>75</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>0</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENJUKEBOX_TITLE</Text>
</Text>
<Text Name="TextSource">
<X>112.5</X>
<Y>160.5</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>0</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENJUKEBOX_SOURCE</Text>
</Text>
<Text Name="TextPlaylist">
<X>112.5</X>
<Y>250.5</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>0</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENJUKEBOX_PLAYLIST</Text>
</Text>
<Text Name="TextSorting">
<X>112.5</X>
<Y>250.5</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>0</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENJUKEBOX_SORTING</Text>
</Text>
<Text Name="TextCategory">
<X>112.5</X>
<Y>340.5</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>0</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENJUKEBOX_CATEGORY</Text>
</Text>
<Text Name="TextOrder">
<X>112.5</X>
<Y>430.5</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>0</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENJUKEBOX_ORDER</Text>
</Text>
<Text Name="TextSection">
<X>112.5</X>
<Y>520.5</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>0</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENJUKEBOX_SECTION</Text>
</Text>
<Text Name="TextLyrics">
<X>112.5</X>
<Y>610.5</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>0</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENJUKEBOX_LYRICS</Text>
</Text>
<Text Name="TextAudioMode">
<X>112.5</X>
<Y>700.5</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>0</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENJUKEBOX_AUDIOMODE</Text>
</Text>
<Text Name="TextVideo">
<X>112.5</X>
<Y>790.5</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>0</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENJUKEBOX_VIDEO</Text>
</Text>
<Text Name="TextInfo">
<X>960</X>
<Y>918</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>0</MaxW>
<Color Name="TextColorAlpha" />
<SelColor Name="TextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
</Texts>
<Buttons>
<Button Name="ButtonBack">
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
<Rect>
<X>82.5</X>
<Y>900</Y>
<W>225</W>
<H>75</H>
<Z>0</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>112.5</X>
<Y>18</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>213</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_BUTTON_BACK</Text>
</Text>
<Reflection>
<Height>39</Height>
<Space>15</Space>
</Reflection>
<SelReflection>
<Height>39</Height>
<Space>15</Space>
</SelReflection>
</Button>
<Button Name="ButtonStart">
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
<Rect>
<X>1612.5</X>
<Y>900</Y>
<W>225</W>
<H>75</H>
<Z>0</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>112.5</X>
<Y>18</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>213</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_BUTTON_START</Text>
</Text>
<Reflection>
<Height>39</Height>
<Space>15</Space>
</Reflection>
<SelReflection>
<Height>39</Height>
<Space>15</Space>
</SelReflection>
</Button>
</Buttons>
<SongMenus />
<Lyrics />
<SelectSlides>
<SelectSlide Name="SelectSlideSource">
<Skin />
<SkinArrowLeft>SelectSlideArrowLeft</SkinArrowLeft>
<SkinArrowRight>SelectSlideArrowRight</SkinArrowRight>
<SkinSelected>SelectSlide</SkinSelected>
<SkinArrowLeftSelected>SelectSlideArrowLeft</SkinArrowLeftSelected>
<SkinArrowRightSelected>SelectSlideArrowRight</SkinArrowRightSelected>
<Rect>
<X>750</X>
<Y>150</Y>
<W>1072.5</W>
<H>75</H>
<Z>0</Z>
</Rect>
<RectArrowLeft>
<X>757.5</X>
<Y>157.5</Y>
<W>60</W>
<H>60</H>
<Z>0</Z>
</RectArrowLeft>
<RectArrowRight>
<X>1755</X>
<Y>157.5</Y>
<W>60</W>
<H>60</H>
<Z>0</Z>
</RectArrowRight>
<Color Name="SelectSlideColor" />
<SelColor Name="SelectSlideSelColor" />
<ArrowColor Name="ArrowColor" />
<ArrowSelColor Name="ArrowSelColor" />
<TextColor Name="TextColorAlpha" />
<TextSelColor Name="TextSelColor" />
<TextH>40.5</TextH>
<TextRelativeX>75</TextRelativeX>
<TextRelativeY>0</TextRelativeY>
<TextMaxW>300</TextMaxW>
<TextFont>Outline</TextFont>
<TextStyle>Bold</TextStyle>
<NumVisible>3</NumVisible>
</SelectSlide>
<SelectSlide Name="SelectSlidePlaylist">
<Skin />
<SkinArrowLeft>SelectSlideArrowLeft</SkinArrowLeft>
<SkinArrowRight>SelectSlideArrowRight</SkinArrowRight>
<SkinSelected>SelectSlide</SkinSelected>
<SkinArrowLeftSelected>SelectSlideArrowLeft</SkinArrowLeftSelected>
<SkinArrowRightSelected>SelectSlideArrowRight</SkinArrowRightSelected>
<Rect>
<X>750</X>
<Y>240</Y>
<W>1072.5</W>
<H>75</H>
<Z>0</Z>
</Rect>
<RectArrowLeft>
<X>757.5</X>
<Y>247.5</Y>
<W>60</W>
<H>60</H>
<Z>0</Z>
</RectArrowLeft>
<RectArrowRight>
<X>1755</X>
<Y>247.5</Y>
<W>60</W>
<H>60</H>
<Z>0</Z>
</RectArrowRight>
<Color Name="SelectSlideColor" />
<SelColor Name="SelectSlideSelColor" />
<ArrowColor Name="ArrowColor" />
<ArrowSelColor Name="ArrowSelColor" />
<TextColor Name="TextColorAlpha" />
<TextSelColor Name="TextSelColor" />
<TextH>40.5</TextH>
<TextRelativeX>75</TextRelativeX>
<TextRelativeY>0</TextRelativeY>
<TextMaxW>900</TextMaxW>
<TextFont>Outline</TextFont>
<TextStyle>Bold</TextStyle>
<NumVisible>1</NumVisible>
</SelectSlide>
<SelectSlide Name="SelectSlideSorting">
<Skin />
<SkinArrowLeft>SelectSlideArrowLeft</SkinArrowLeft>
<SkinArrowRight>SelectSlideArrowRight</SkinArrowRight>
<SkinSelected>SelectSlide</SkinSelected>
<SkinArrowLeftSelected>SelectSlideArrowLeft</SkinArrowLeftSelected>
<SkinArrowRightSelected>SelectSlideArrowRight</SkinArrowRightSelected>
<Rect>
<X>750</X>
<Y>240</Y>
<W>1072.5</W>
<H>75</H>
<Z>0</Z>
</Rect>
<RectArrowLeft>
<X>757.5</X>
<Y>247.5</Y>
<W>60</W>
<H>60</H>
<Z>0</Z>
</RectArrowLeft>
<RectArrowRight>
<X>1755</X>
<Y>247.5</Y>
<W>60</W>
<H>60</H>
<Z>0</Z>
</RectArrowRight>
<Color Name="SelectSlideColor" />
<SelColor Name="SelectSlideSelColor" />
<ArrowColor Name="ArrowColor" />
<ArrowSelColor Name="ArrowSelColor" />
<TextColor Name="TextColorAlpha" />
<TextSelColor Name="TextSelColor" />
<TextH>40.5</TextH>
<TextRelativeX>75</TextRelativeX>
<TextRelativeY>0</TextRelativeY>
<TextMaxW>900</TextMaxW>
<TextFont>Outline</TextFont>
<TextStyle>Bold</TextStyle>
<NumVisible>1</NumVisible>
</SelectSlide>
<SelectSlide Name="SelectSlideCategory">
<Skin />
<SkinArrowLeft>SelectSlideArrowLeft</SkinArrowLeft>
<SkinArrowRight>SelectSlideArrowRight</SkinArrowRight>
<SkinSelected>SelectSlide</SkinSelected>
<SkinArrowLeftSelected>SelectSlideArrowLeft</SkinArrowLeftSelected>
<SkinArrowRightSelected>SelectSlideArrowRight</SkinArrowRightSelected>
<Rect>
<X>750</X>
<Y>330</Y>
<W>1072.5</W>
<H>75</H>
<Z>0</Z>
</Rect>
<RectArrowLeft>
<X>757.5</X>
<Y>337.5</Y>
<W>60</W>
<H>60</H>
<Z>0</Z>
</RectArrowLeft>
<RectArrowRight>
<X>1755</X>
<Y>337.5</Y>
<W>60</W>
<H>60</H>
<Z>0</Z>
</RectArrowRight>
<Color Name="SelectSlideColor" />
<SelColor Name="SelectSlideSelColor" />
<ArrowColor Name="ArrowColor" />
<ArrowSelColor Name="ArrowSelColor" />
<TextColor Name="TextColorAlpha" />
<TextSelColor Name="TextSelColor" />
<TextH>40.5</TextH>
<TextRelativeX>75</TextRelativeX>
<TextRelativeY>0</TextRelativeY>
<TextMaxW>900</TextMaxW>
<TextFont>Outline</TextFont>
<TextStyle>Bold</TextStyle>
<NumVisible>1</NumVisible>
</SelectSlide>
<SelectSlide Name="SelectSlideOrder">
<Skin />
<SkinArrowLeft>SelectSlideArrowLeft</SkinArrowLeft>
<SkinArrowRight>SelectSlideArrowRight</SkinArrowRight>
<SkinSelected>SelectSlide</SkinSelected>
<SkinArrowLeftSelected>SelectSlideArrowLeft</SkinArrowLeftSelected>
<SkinArrowRightSelected>SelectSlideArrowRight</SkinArrowRightSelected>
<Rect>
<X>750</X>
<Y>420</Y>
<W>1072.5</W>
<H>75</H>
<Z>0</Z>
</Rect>
<RectArrowLeft>
<X>757.5</X>
<Y>427.5</Y>
<W>60</W>
<H>60</H>
<Z>0</Z>
</RectArrowLeft>
<RectArrowRight>
<X>1755</X>
<Y>427.5</Y>
<W>60</W>
<H>60</H>
<Z>0</Z>
</RectArrowRight>
<Color Name="SelectSlideColor" />
<SelColor Name="SelectSlideSelColor" />
<ArrowColor Name="ArrowColor" />
<ArrowSelColor Name="ArrowSelColor" />
<TextColor Name="TextColorAlpha" />
<TextSelColor Name="TextSelColor" />
<TextH>40.5</TextH>
<TextRelativeX>75</TextRelativeX>
<TextRelativeY>0</TextRelativeY>
<TextMaxW>300</TextMaxW>
<TextFont>Outline</TextFont>
<TextStyle>Bold</TextStyle>
<NumVisible>3</NumVisible>
</SelectSlide>
<SelectSlide Name="SelectSlideSection">
<Skin />
<SkinArrowLeft>SelectSlideArrowLeft</SkinArrowLeft>
<SkinArrowRight>SelectSlideArrowRight</SkinArrowRight>
<SkinSelected>SelectSlide</SkinSelected>
<SkinArrowLeftSelected>SelectSlideArrowLeft</SkinArrowLeftSelected>
<SkinArrowRightSelected>SelectSlideArrowRight</SkinArrowRightSelected>
<Rect>
<X>750</X>
<Y>510</Y>
<W>1072.5</W>
<H>75</H>
<Z>0</Z>
</Rect>
<RectArrowLeft>
<X>757.5</X>
<Y>517.5</Y>
<W>60</W>
<H>60</H>
<Z>0</Z>
</RectArrowLeft>
<RectArrowRight>
<X>1755</X>
<Y>517.5</Y>
<W>60</W>
<H>60</H>
<Z>0</Z>
</RectArrowRight>
<Color Name="SelectSlideColor" />
<SelColor Name="SelectSlideSelColor" />
<ArrowColor Name="ArrowColor" />
<ArrowSelColor Name="ArrowSelColor" />
<TextColor Name="TextColorAlpha" />
<TextSelColor Name="TextSelColor" />
<TextH>40.5</TextH>
<TextRelativeX>75</TextRelativeX>
<TextRelativeY>0</TextRelativeY>
<TextMaxW>300</TextMaxW>
<TextFont>Outline</TextFont>
<TextStyle>Bold</TextStyle>
<NumVisible>3</NumVisible>
</SelectSlide>
<SelectSlide Name="SelectSlideLyrics">
<Skin />
<SkinArrowLeft>SelectSlideArrowLeft</SkinArrowLeft>
<SkinArrowRight>SelectSlideArrowRight</SkinArrowRight>
<SkinSelected>SelectSlide</SkinSelected>
<SkinArrowLeftSelected>SelectSlideArrowLeft</SkinArrowLeftSelected>
<SkinArrowRightSelected>SelectSlideArrowRight</SkinArrowRightSelected>
<Rect>
<X>750</X>
<Y>600</Y>
<W>1072.5</W>
<H>75</H>
<Z>0</Z>
</Rect>
<RectArrowLeft>
<X>757.5</X>
<Y>607.5</Y>
<W>60</W>
<H>60</H>
<Z>0</Z>
</RectArrowLeft>
<RectArrowRight>
<X>1755</X>
<Y>607.5</Y>
<W>60</W>
<H>60</H>
<Z>0</Z>
</RectArrowRight>
<Color Name="SelectSlideColor" />
<SelColor Name="SelectSlideSelColor" />
<ArrowColor Name="ArrowColor" />
<ArrowSelColor Name="ArrowSelColor" />
<TextColor Name="TextColorAlpha" />
<TextSelColor Name="TextSelColor" />
<TextH>40.5</TextH>
<TextRelativeX>75</TextRelativeX>
<TextRelativeY>0</TextRelativeY>
<TextMaxW>300</TextMaxW>
<TextFont>Outline</TextFont>
<TextStyle>Bold</TextStyle>
<NumVisible>3</NumVisible>
</SelectSlide>
<SelectSlide Name="SelectSlideAudioMode">
<Skin />
<SkinArrowLeft>SelectSlideArrowLeft</SkinArrowLeft>
<SkinArrowRight>SelectSlideArrowRight</SkinArrowRight>
<SkinSelected>SelectSlide</SkinSelected>
<SkinArrowLeftSelected>SelectSlideArrowLeft</SkinArrowLeftSelected>
<SkinArrowRightSelected>SelectSlideArrowRight</SkinArrowRightSelected>
<Rect>
<X>750</X>
<Y>690</Y>
<W>1072.5</W>
<H>75</H>
<Z>0</Z>
</Rect>
<RectArrowLeft>
<X>757.5</X>
<Y>697.5</Y>
<W>60</W>
<H>60</H>
<Z>0</Z>
</RectArrowLeft>
<RectArrowRight>
<X>1755</X>
<Y>697.5</Y>
<W>60</W>
<H>60</H>
<Z>0</Z>
</RectArrowRight>
<Color Name="SelectSlideColor" />
<SelColor Name="SelectSlideSelColor" />
<ArrowColor Name="ArrowColor" />
<ArrowSelColor Name="ArrowSelColor" />
<TextColor Name="TextColorAlpha" />
<TextSelColor Name="TextSelColor" />
<TextH>40.5</TextH>
<TextRelativeX>75</TextRelativeX>
<TextRelativeY>0</TextRelativeY>
<TextMaxW>300</TextMaxW>
<TextFont>Outline</TextFont>
<TextStyle>Bold</TextStyle>
<NumVisible>3</NumVisible>
</SelectSlide>
<SelectSlide Name="SelectSlideVideo">
<Skin />
<SkinArrowLeft>SelectSlideArrowLeft</SkinArrowLeft>
<SkinArrowRight>SelectSlideArrowRight</SkinArrowRight>
<SkinSelected>SelectSlide</SkinSelected>
<SkinArrowLeftSelected>SelectSlideArrowLeft</SkinArrowLeftSelected>
<SkinArrowRightSelected>SelectSlideArrowRight</SkinArrowRightSelected>
<Rect>
<X>750</X>
<Y>780</Y>
<W>1072.5</W>
<H>75</H>
<Z>0</Z>
</Rect>
<RectArrowLeft>
<X>757.5</X>
<Y>787.5</Y>
<W>60</W>
<H>60</H>
<Z>0</Z>
</RectArrowLeft>
<RectArrowRight>
<X>1755</X>
<Y>787.5</Y>
<W>60</W>
<H>60</H>
<Z>0</Z>
</RectArrowRight>
<Color Name="SelectSlideColor" />
<SelColor Name="SelectSlideSelColor" />
<ArrowColor Name="ArrowColor" />
<ArrowSelColor Name="ArrowSelColor" />
<TextColor Name="TextColorAlpha" />
<TextSelColor Name="TextSelColor" />
<TextH>40.5</TextH>
<TextRelativeX>75</TextRelativeX>
<TextRelativeY>0</TextRelativeY>
<TextMaxW>300</TextMaxW>
<TextFont>Outline</TextFont>
<TextStyle>Bold</TextStyle>
<NumVisible>3</NumVisible>
</SelectSlide>
</SelectSlides>
<SingNotes />
<NameSelections />
<Equalizers />
<Playlists />
<ParticleEffects />
<ScreenSettings />
</Screen>
@@ -0,0 +1,695 @@
<?xml version='1.0' encoding='utf-8'?>
<Screen xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Informations>
<ScreenName>ScreenJukeboxPlayer</ScreenName>
<ScreenVersion>1</ScreenVersion>
</Informations>
<Backgrounds>
<Background Name="Background1">
<Type>Video</Type>
<SlideShowTextures />
<Video>BG_Video</Video>
<Skin>BG_Default</Skin>
<Color Name="BackgroundColor" />
</Background>
</Backgrounds>
<Statics>
<Static Name="StaticInfoBG">
<Skin>CoverTextBackground</Skin>
<Color Name="StaticColorAlpha" />
<Rect>
<X>60</X>
<Y>60</Y>
<W>760</W>
<H>190</H>
<Z>-0.5</Z>
</Rect>
</Static>
<Static Name="StaticInfoCover">
<Skin />
<Color Name="White" />
<Rect>
<X>80</X>
<Y>80</Y>
<W>150</W>
<H>150</H>
<Z>-0.6</Z>
</Rect>
</Static>
<Static Name="StaticLyrics">
<Skin />
<Color Name="BackgroundColorAlpha" />
<Rect>
<X>0</X>
<Y>915</Y>
<W>1920</W>
<H>135</H>
<Z>-0.75</Z>
</Rect>
</Static>
<Static Name="StaticBarBG">
<Skin>SongMenu</Skin>
<Color Name="StaticColorAlpha" />
<Rect>
<X>60</X>
<Y>900</Y>
<W>1800</W>
<H>150</H>
<Z>-0.5</Z>
</Rect>
</Static>
<Static Name="StaticTimeBarBG">
<Skin />
<Color Name="ArrowColor" />
<Rect>
<X>190</X>
<Y>930</Y>
<W>1540</W>
<H>10</H>
<Z>-0.6</Z>
</Rect>
</Static>
<Static Name="StaticTimeBarFill">
<Skin />
<Color Name="ButtonSelColor" />
<Rect>
<X>190</X>
<Y>930</Y>
<W>1540</W>
<H>10</H>
<Z>-0.65</Z>
</Rect>
</Static>
<Static Name="StaticQueueBG">
<Skin>CoverTextBackground</Skin>
<Color Name="StaticColorAlpha" />
<Rect>
<X>1180</X>
<Y>60</Y>
<W>680</W>
<H>688</H>
<Z>-0.5</Z>
</Rect>
</Static>
<Static Name="StaticQueueSearch">
<Skin>SearchBar</Skin>
<Color Name="White" />
<Rect>
<X>1210</X>
<Y>140</Y>
<W>504</W>
<H>70</H>
<Z>-0.6</Z>
</Rect>
</Static>
<Static Name="StaticQueueRow">
<Skin>QueueRow</Skin>
<Color Name="ButtonSelColor" />
<Rect>
<X>1205</X>
<Y>232</Y>
<W>630</W>
<H>60</H>
<Z>-0.6</Z>
</Rect>
</Static>
<Static Name="StaticQueueRowPlaying">
<Skin>QueueRow</Skin>
<Color Name="ButtonColor" />
<Rect>
<X>1205</X>
<Y>232</Y>
<W>630</W>
<H>60</H>
<Z>-0.55</Z>
</Rect>
</Static>
<Static Name="StaticQueuePlaying">
<Skin>PlayIcon</Skin>
<Color Name="ButtonSelColor" />
<Rect>
<X>1212</X>
<Y>250</Y>
<W>24</W>
<H>24</H>
<Z>-0.7</Z>
</Rect>
</Static>
<Static Name="StaticQueueCover">
<Skin />
<Color Name="White" />
<Rect>
<X>1245</X>
<Y>237</Y>
<W>50</W>
<H>50</H>
<Z>-0.7</Z>
</Rect>
</Static>
<Static Name="StaticAudioModeNormal">
<Skin>VocalsIcon</Skin>
<Color Name="TextColor" />
<Rect>
<X>0</X>
<Y>0</Y>
<W>54</W>
<H>54</H>
<Z>-0.7</Z>
</Rect>
</Static>
<Static Name="StaticAudioModeInstrumental">
<Skin>InstrumentalIcon</Skin>
<Color Name="TextColor" />
<Rect>
<X>0</X>
<Y>0</Y>
<W>54</W>
<H>54</H>
<Z>-0.7</Z>
</Rect>
</Static>
<Static Name="StaticAudioModeIcon">
<Skin>VocalsIcon</Skin>
<Color Name="ButtonTextColor" />
<Rect>
<X>710</X>
<Y>970</Y>
<W>54</W>
<H>54</H>
<Z>-0.75</Z>
</Rect>
</Static>
</Statics>
<Texts>
<Text Name="TextInfoTitle">
<X>260</X>
<Y>92</Y>
<Z>-0.8</Z>
<H>52</H>
<MaxW>540</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextInfoArtist">
<X>260</X>
<Y>150</Y>
<Z>-0.8</Z>
<H>40</H>
<MaxW>540</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Normal</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextInfoPosition">
<X>260</X>
<Y>200</Y>
<Z>-0.8</Z>
<H>30</H>
<MaxW>540</MaxW>
<Color Name="TextColorAlpha" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Normal</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextTimeElapsed">
<X>100</X>
<Y>918</Y>
<Z>-0.8</Z>
<H>32</H>
<MaxW>0</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextTimeTotal">
<X>1820</X>
<Y>918</Y>
<Z>-0.8</Z>
<H>32</H>
<MaxW>0</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Right</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextQueueTitle">
<X>1215</X>
<Y>82</Y>
<Z>-0.8</Z>
<H>44</H>
<MaxW>420</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextQueueCount">
<X>1825</X>
<Y>90</Y>
<Z>-0.8</Z>
<H>32</H>
<MaxW>200</MaxW>
<Color Name="TextColorAlpha" />
<SelColor Name="TextSelColor" />
<Align>Right</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Normal</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextQueueSearch">
<X>1290</X>
<Y>158</Y>
<Z>-0.8</Z>
<H>34</H>
<MaxW>520</MaxW>
<Color Name="TextColorAlpha" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Normal</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextQueueHelp">
<X>1520</X>
<Y>690</Y>
<Z>-0.8</Z>
<H>22</H>
<MaxW>640</MaxW>
<Color Name="TextColorAlpha" />
<SelColor Name="TextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Normal</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextQueueHelp2">
<X>1520</X>
<Y>716</Y>
<Z>-0.8</Z>
<H>22</H>
<MaxW>640</MaxW>
<Color Name="TextColorAlpha" />
<SelColor Name="TextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Normal</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextQueueEntryTitle">
<X>1315</X>
<Y>236</Y>
<Z>-0.8</Z>
<H>28</H>
<MaxW>500</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextQueueEntryArtist">
<X>1315</X>
<Y>264</Y>
<Z>-0.8</Z>
<H>22</H>
<MaxW>500</MaxW>
<Color Name="TextColorAlpha" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Normal</Style>
<Font>Outline</Font>
<Text />
</Text>
</Texts>
<Buttons>
<Button Name="ButtonPrevious">
<Skin>PreviousIcon</Skin>
<SkinSelected>PreviousIcon</SkinSelected>
<Rect>
<X>110</X>
<Y>970</Y>
<W>54</W>
<H>54</H>
<Z>-0.7</Z>
</Rect>
<Color Name="TextColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>0</X>
<Y>0</Y>
<Z>-0.7</Z>
<H>30</H>
<MaxW>0</MaxW>
<Color Name="TextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
</Button>
<Button Name="ButtonPlay">
<Skin>PlayIcon</Skin>
<SkinSelected>PlayIcon</SkinSelected>
<Rect>
<X>201</X>
<Y>966</Y>
<W>62</W>
<H>62</H>
<Z>-0.7</Z>
</Rect>
<Color Name="TextColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>0</X>
<Y>0</Y>
<Z>-0.7</Z>
<H>30</H>
<MaxW>0</MaxW>
<Color Name="TextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
</Button>
<Button Name="ButtonPause">
<Skin>PauseIcon</Skin>
<SkinSelected>PauseIcon</SkinSelected>
<Rect>
<X>201</X>
<Y>966</Y>
<W>62</W>
<H>62</H>
<Z>-0.7</Z>
</Rect>
<Color Name="TextColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>0</X>
<Y>0</Y>
<Z>-0.7</Z>
<H>30</H>
<MaxW>0</MaxW>
<Color Name="TextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
</Button>
<Button Name="ButtonNext">
<Skin>NextIcon</Skin>
<SkinSelected>NextIcon</SkinSelected>
<Rect>
<X>300</X>
<Y>970</Y>
<W>54</W>
<H>54</H>
<Z>-0.7</Z>
</Rect>
<Color Name="TextColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>0</X>
<Y>0</Y>
<Z>-0.7</Z>
<H>30</H>
<MaxW>0</MaxW>
<Color Name="TextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
</Button>
<Button Name="ButtonSkipIntro">
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
<Rect>
<X>420</X>
<Y>966</Y>
<W>260</W>
<H>62</H>
<Z>-0.7</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>130</X>
<Y>14</Y>
<Z>-0.7</Z>
<H>34</H>
<MaxW>240</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENJUKEBOXPLAYER_SKIPINTRO</Text>
</Text>
</Button>
<Button Name="ButtonShuffle">
<Skin>Random</Skin>
<SkinSelected>Random</SkinSelected>
<Rect>
<X>1100.5</X>
<Y>970</Y>
<W>54</W>
<H>54</H>
<Z>-0.7</Z>
</Rect>
<Color Name="TextColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>0</X>
<Y>0</Y>
<Z>-0.7</Z>
<H>30</H>
<MaxW>0</MaxW>
<Color Name="TextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
</Button>
<Button Name="ButtonRepeat">
<Skin>RepeatIcon</Skin>
<SkinSelected>RepeatIcon</SkinSelected>
<Rect>
<X>1195.5</X>
<Y>970</Y>
<W>54</W>
<H>54</H>
<Z>-0.7</Z>
</Rect>
<Color Name="TextColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>0</X>
<Y>0</Y>
<Z>-0.7</Z>
<H>30</H>
<MaxW>0</MaxW>
<Color Name="TextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
</Button>
<Button Name="ButtonLyrics">
<Skin>LyricsIcon</Skin>
<SkinSelected>LyricsIcon</SkinSelected>
<Rect>
<X>1290.5</X>
<Y>970</Y>
<W>54</W>
<H>54</H>
<Z>-0.7</Z>
</Rect>
<Color Name="TextColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>0</X>
<Y>0</Y>
<Z>-0.7</Z>
<H>30</H>
<MaxW>0</MaxW>
<Color Name="TextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
</Button>
<Button Name="ButtonAudioMode">
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
<Rect>
<X>700</X>
<Y>966</Y>
<W>260</W>
<H>62</H>
<Z>-0.7</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>157</X>
<Y>14</Y>
<Z>-0.7</Z>
<H>34</H>
<MaxW>176</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_AUDIOMODE_NORMAL</Text>
</Text>
</Button>
<Button Name="ButtonQueue">
<Skin>ListIcon</Skin>
<SkinSelected>ListIcon</SkinSelected>
<Rect>
<X>1385.5</X>
<Y>970</Y>
<W>54</W>
<H>54</H>
<Z>-0.7</Z>
</Rect>
<Color Name="TextColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>0</X>
<Y>0</Y>
<Z>-0.7</Z>
<H>30</H>
<MaxW>0</MaxW>
<Color Name="TextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
</Button>
<Button Name="ButtonSing">
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
<Rect>
<X>1580</X>
<Y>966</Y>
<W>260</W>
<H>62</H>
<Z>-0.7</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>130</X>
<Y>14</Y>
<Z>-0.7</Z>
<H>34</H>
<MaxW>240</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENJUKEBOXPLAYER_SING</Text>
</Text>
</Button>
</Buttons>
<SongMenus />
<Lyrics>
<Lyric Name="LyricMain">
<Rect>
<X>955.5</X>
<Y>930</Y>
<W>1800</W>
<H>63</H>
<Z>-1</Z>
</Rect>
<Color Name="LyricMainColor" />
<ProcessedColor Name="LyricProcessedColor" />
</Lyric>
<Lyric Name="LyricSub">
<Rect>
<X>955.5</X>
<Y>993</Y>
<W>1800</W>
<H>52.5</H>
<Z>-1</Z>
</Rect>
<Color Name="LyricSubColor" />
<ProcessedColor Name="LyricProcessedColor" />
</Lyric>
<Lyric Name="LyricMainBar">
<Rect>
<X>955.5</X>
<Y>780</Y>
<W>1800</W>
<H>63</H>
<Z>-1</Z>
</Rect>
<Color Name="LyricMainColor" />
<ProcessedColor Name="LyricProcessedColor" />
</Lyric>
</Lyrics>
<SelectSlides />
<SingNotes />
<NameSelections />
<Equalizers />
<Playlists />
<ParticleEffects />
<ScreenSettings />
</Screen>
@@ -2,7 +2,7 @@
<Screen xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Informations>
<ScreenName>ScreenMain</ScreenName>
<ScreenVersion>5</ScreenVersion>
<ScreenVersion>6</ScreenVersion>
</Informations>
<Backgrounds>
<Background Name="Background1">
@@ -18,7 +18,7 @@
<Skin>LogoMain</Skin>
<Color Name="White" />
<Rect>
<X>435</X>
<X>405</X>
<Y>265.5</Y>
<W>1110</W>
<H>202.5</H>
@@ -85,18 +85,18 @@
<Rect>
<X>420</X>
<Y>750</Y>
<W>510</W>
<W>320</W>
<H>110</H>
<Z>0</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>255</X>
<X>160</X>
<Y>26</Y>
<Z>0</Z>
<H>58</H>
<MaxW>490</MaxW>
<MaxW>300</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
@@ -110,20 +110,20 @@
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
<Rect>
<X>990</X>
<X>800</X>
<Y>750</Y>
<W>510</W>
<W>320</W>
<H>110</H>
<Z>0</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>255</X>
<X>160</X>
<Y>26</Y>
<Z>0</Z>
<H>58</H>
<MaxW>490</MaxW>
<MaxW>300</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
@@ -133,6 +133,33 @@
<Text>TR_SCREENMAIN_BUTTON_PARTY</Text>
</Text>
</Button>
<Button Name="ButtonJukebox">
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
<Rect>
<X>1180</X>
<Y>750</Y>
<W>320</W>
<H>110</H>
<Z>0</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>160</X>
<Y>26</Y>
<Z>0</Z>
<H>58</H>
<MaxW>300</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENMAIN_BUTTON_JUKEBOX</Text>
</Text>
</Button>
<Button Name="ButtonStatistics">
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
+2
View File
@@ -87,6 +87,8 @@ namespace Vocaluxe.Base
_Screens.Add(new CScreenParty());
_Screens.Add(new CScreenStatistics());
_Screens.Add(new CScreenStatisticsDetail());
_Screens.Add(new CScreenJukebox());
_Screens.Add(new CScreenJukeboxPlayer());
Debug.Assert(_Screens.Count == (int)EScreen.CountEntry, "Screen list and screens enum do not match");
+404
View File
@@ -0,0 +1,404 @@
#region license
// This file is part of Vocaluxe.
//
// Vocaluxe is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Vocaluxe is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Vocaluxe. If not, see <http://www.gnu.org/licenses/>.
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using VocaluxeLib;
using VocaluxeLib.Songs;
namespace Vocaluxe.Base
{
public enum EJukeboxOrder
{
TR_JUKEBOX_ORDER_RANDOM,
TR_JUKEBOX_ORDER_SORTED
}
public enum EJukeboxSection
{
TR_JUKEBOX_SECTION_FULL,
TR_JUKEBOX_SECTION_MEDLEY,
TR_JUKEBOX_SECTION_30,
TR_JUKEBOX_SECTION_60,
TR_JUKEBOX_SECTION_90
}
public class CJukeboxEntry
{
public readonly int SongId;
public readonly int OriginalIndex;
public CJukeboxEntry(int songId, int originalIndex)
{
SongId = songId;
OriginalIndex = originalIndex;
}
public CSong Song
{
get { return CSongs.GetSong(SongId); }
}
}
static class CJukebox
{
private static readonly List<CJukeboxEntry> _Queue = new List<CJukeboxEntry>();
public static ESongSource Source { get; set; } = ESongSource.TR_SONGSOURCE_ALLSONGS;
public static int PlaylistId { get; set; } = -1;
public static ESongSorting Sorting { get; set; } = ESongSorting.TR_CONFIG_GENRE;
public static int Category { get; set; }
public static EJukeboxOrder Order { get; set; } = EJukeboxOrder.TR_JUKEBOX_ORDER_RANDOM;
public static EJukeboxSection Section { get; set; } = EJukeboxSection.TR_JUKEBOX_SECTION_FULL;
public static bool ShowLyrics { get; set; } = true;
public static bool ShowVideo { get; set; } = true;
public static EAudioMode AudioMode { get; set; } = EAudioMode.TR_AUDIOMODE_NORMAL;
public static bool Shuffle { get; private set; }
public static bool Repeat { get; set; }
public static int Current { get; private set; }
public static bool SingRequested { get; private set; }
public static bool ResumeAfterSinging { get; private set; }
public static IList<CJukeboxEntry> Queue
{
get { return _Queue.AsReadOnly(); }
}
public static CJukeboxEntry CurrentEntry
{
get { return Current >= 0 && Current < _Queue.Count ? _Queue[Current] : null; }
}
public static CJukeboxEntry NextEntry
{
get
{
var next = _GetNextIndex();
return next >= 0 ? _Queue[next] : null;
}
}
public static List<int> GetSongIds()
{
var ids = new List<int>();
switch (Source)
{
case ESongSource.TR_SONGSOURCE_PLAYLIST:
if (PlaylistId >= 0)
{
for (var i = 0; i < CPlaylists.GetSongCount(PlaylistId); i++)
{
ids.Add(CPlaylists.GetSong(PlaylistId, i).SongId);
}
}
break;
case ESongSource.TR_SONGSOURCE_CATEGORY:
if (Category >= 0 && Category < CSongs.NumCategories)
{
ids.AddRange(CSongs.GetCategoryByIndex(Category).Songs.Select(pointer => pointer.SongId));
}
break;
default:
ids.AddRange(CSongs.AllSongs.OrderBy(song => song.Artist, StringComparer.CurrentCultureIgnoreCase)
.ThenBy(song => song.Title, StringComparer.CurrentCultureIgnoreCase)
.Select(song => song.Id));
break;
}
return ids.Where(id => CSongs.GetSong(id) != null).ToList();
}
public static bool Start()
{
_Queue.Clear();
var ids = GetSongIds();
for (var i = 0; i < ids.Count; i++)
{
_Queue.Add(new CJukeboxEntry(ids[i], i));
}
Shuffle = Order == EJukeboxOrder.TR_JUKEBOX_ORDER_RANDOM;
if (Shuffle)
{
_ShuffleRange(0);
}
Current = 0;
Repeat = false;
SingRequested = false;
ResumeAfterSinging = false;
return _Queue.Count > 0;
}
public static void SetShuffle(bool shuffle)
{
if (Shuffle == shuffle)
{
return;
}
Shuffle = shuffle;
if (shuffle)
{
_ShuffleRange(Current + 1);
}
else
{
var upcoming = _Queue.Skip(Current + 1).OrderBy(entry => entry.OriginalIndex).ToList();
_Queue.RemoveRange(Current + 1, upcoming.Count);
_Queue.AddRange(upcoming);
}
}
public static bool Next()
{
var next = _GetNextIndex();
if (next < 0)
{
return false;
}
if (next <= Current && Shuffle)
{
var current = _Queue[Current];
_ShuffleRange(0);
if (_Queue.Count > 1 && _Queue[0] == current)
{
_Queue.RemoveAt(0);
_Queue.Add(current);
}
next = 0;
}
Current = next;
return true;
}
public static bool Previous()
{
if (Current <= 0)
{
return false;
}
Current--;
return true;
}
public static void Play(int index)
{
if (index >= 0 && index < _Queue.Count)
{
Current = index;
}
}
public static void PlayNext(int index)
{
if (index < 0 || index >= _Queue.Count || index == Current)
{
return;
}
var entry = _Queue[index];
_Queue.RemoveAt(index);
if (index < Current)
{
Current--;
}
_Queue.Insert(Current + 1, entry);
}
public static void Remove(int index)
{
if (index < 0 || index >= _Queue.Count || index == Current)
{
return;
}
_Queue.RemoveAt(index);
if (index < Current)
{
Current--;
}
}
public static bool Move(int index, int direction)
{
var target = index + direction;
if (index < 0 || index >= _Queue.Count || target < 0 || target >= _Queue.Count)
{
return false;
}
var entry = _Queue[index];
_Queue[index] = _Queue[target];
_Queue[target] = entry;
if (Current == index)
{
Current = target;
}
else if (Current == target)
{
Current = index;
}
return true;
}
public static void RequestSinging()
{
SingRequested = true;
ResumeAfterSinging = true;
}
public static bool ReturnAfterSinging()
{
if (!SingRequested)
{
return false;
}
SingRequested = false;
CGraphics.FadeTo(EScreen.JukeboxPlayer);
return true;
}
public static bool TakeResume()
{
var resume = ResumeAfterSinging;
ResumeAfterSinging = false;
return resume;
}
public static EAudioMode GetAudioMode(CJukeboxEntry entry)
{
var song = entry == null ? null : entry.Song;
return song != null && song.HasInstrumental() && AudioMode == EAudioMode.TR_AUDIOMODE_INSTRUMENTAL
? EAudioMode.TR_AUDIOMODE_INSTRUMENTAL
: EAudioMode.TR_AUDIOMODE_NORMAL;
}
public static void GetSection(CSong song, float length, out float start, out float end)
{
start = 0f;
end = length;
if (song == null)
{
return;
}
switch (Section)
{
case EJukeboxSection.TR_JUKEBOX_SECTION_MEDLEY:
if (song.Medley.Source != EDataSource.None)
{
start = Math.Max(0f, CGame.GetTimeFromBeats(song.Medley.StartBeat, song.Bpm) + song.Gap - song.Medley.FadeInTime);
end = Math.Min(length, CGame.GetTimeFromBeats(song.Medley.EndBeat, song.Bpm) + song.Gap + song.Medley.FadeOutTime);
}
break;
case EJukeboxSection.TR_JUKEBOX_SECTION_30:
case EJukeboxSection.TR_JUKEBOX_SECTION_60:
case EJukeboxSection.TR_JUKEBOX_SECTION_90:
var duration = _GetSectionDuration();
start = song.Preview.Source != EDataSource.None ? song.Preview.StartTime : Math.Max(0f, GetFirstNoteTime(song) - 5f);
if (length > 0f && start + duration > length)
{
start = Math.Max(0f, length - duration);
}
end = length > 0f ? Math.Min(length, start + duration) : start + duration;
break;
}
if (end <= start)
{
start = 0f;
end = length;
}
}
public static float GetFirstNoteTime(CSong song)
{
if (song == null)
{
return 0f;
}
var firstBeat = int.MaxValue;
for (var voice = 0; voice < song.Notes.VoiceCount; voice++)
{
var lines = song.Notes.GetVoice(voice).Lines;
if (lines.Length > 0)
{
firstBeat = Math.Min(firstBeat, lines[0].FirstNoteBeat);
}
}
return firstBeat == int.MaxValue ? 0f : CGame.GetTimeFromBeats(firstBeat, song.Bpm) + song.Gap;
}
private static float _GetSectionDuration()
{
switch (Section)
{
case EJukeboxSection.TR_JUKEBOX_SECTION_30:
return 30f;
case EJukeboxSection.TR_JUKEBOX_SECTION_60:
return 60f;
default:
return 90f;
}
}
private static int _GetNextIndex()
{
if (_Queue.Count == 0)
{
return -1;
}
if (Current + 1 < _Queue.Count)
{
return Current + 1;
}
return Repeat ? 0 : -1;
}
private static void _ShuffleRange(int start)
{
for (var n = _Queue.Count - 1; n > start; n--)
{
var k = CGame.Rand.Next(start, n + 1);
var entry = _Queue[k];
_Queue[k] = _Queue[n];
_Queue[n] = entry;
}
}
}
}
+4 -1
View File
@@ -510,7 +510,10 @@ namespace Vocaluxe.Screens
_HighscoreStream = -1;
}
CParty.LeavingHighscore();
if (!CJukebox.ReturnAfterSinging())
{
CParty.LeavingHighscore();
}
}
}
}
+320
View File
@@ -0,0 +1,320 @@
#region license
// This file is part of Vocaluxe.
//
// Vocaluxe is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Vocaluxe is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Vocaluxe. If not, see <http://www.gnu.org/licenses/>.
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using Vocaluxe.Base;
using VocaluxeLib;
using VocaluxeLib.Menu;
namespace Vocaluxe.Screens
{
public class CScreenJukebox : CMenu
{
protected override int _ScreenVersion
{
get { return 1; }
}
private const string _SelectSlideSource = "SelectSlideSource";
private const string _SelectSlidePlaylist = "SelectSlidePlaylist";
private const string _SelectSlideSorting = "SelectSlideSorting";
private const string _SelectSlideCategory = "SelectSlideCategory";
private const string _SelectSlideOrder = "SelectSlideOrder";
private const string _SelectSlideSection = "SelectSlideSection";
private const string _SelectSlideLyrics = "SelectSlideLyrics";
private const string _SelectSlideAudioMode = "SelectSlideAudioMode";
private const string _SelectSlideVideo = "SelectSlideVideo";
private const string _TextSource = "TextSource";
private const string _TextPlaylist = "TextPlaylist";
private const string _TextSorting = "TextSorting";
private const string _TextCategory = "TextCategory";
private const string _TextOrder = "TextOrder";
private const string _TextSection = "TextSection";
private const string _TextLyrics = "TextLyrics";
private const string _TextAudioMode = "TextAudioMode";
private const string _TextVideo = "TextVideo";
private const string _TextInfo = "TextInfo";
private const string _ButtonBack = "ButtonBack";
private const string _ButtonStart = "ButtonStart";
private static readonly ESongSource[] _Sources = { ESongSource.TR_SONGSOURCE_ALLSONGS, ESongSource.TR_SONGSOURCE_CATEGORY, ESongSource.TR_SONGSOURCE_PLAYLIST };
private static readonly EAudioMode[] _AudioModes = { EAudioMode.TR_AUDIOMODE_NORMAL, EAudioMode.TR_AUDIOMODE_INSTRUMENTAL };
private readonly string[,] _Rows =
{
{ _TextSource, _SelectSlideSource }, { _TextPlaylist, _SelectSlidePlaylist }, { _TextSorting, _SelectSlideSorting },
{ _TextCategory, _SelectSlideCategory }, { _TextOrder, _SelectSlideOrder }, { _TextSection, _SelectSlideSection },
{ _TextLyrics, _SelectSlideLyrics }, { _TextAudioMode, _SelectSlideAudioMode }, { _TextVideo, _SelectSlideVideo }
};
private readonly List<float> _RowSlots = new List<float>();
private float _TextOffsetY;
private List<int> _PlaylistIds = new List<int>();
private ESongSorting[] _Sortings;
public override void Init()
{
base.Init();
_ThemeSelectSlides = new string[]
{
_SelectSlideSource, _SelectSlidePlaylist, _SelectSlideSorting, _SelectSlideCategory, _SelectSlideOrder, _SelectSlideSection, _SelectSlideLyrics,
_SelectSlideAudioMode, _SelectSlideVideo
};
_ThemeTexts = new string[]
{ _TextSource, _TextPlaylist, _TextSorting, _TextCategory, _TextOrder, _TextSection, _TextLyrics, _TextAudioMode, _TextVideo, _TextInfo };
_ThemeButtons = new string[] { _ButtonBack, _ButtonStart };
_Sortings = ((ESongSorting[])Enum.GetValues(typeof(ESongSorting))).Where(sorting => sorting != ESongSorting.TR_CONFIG_NONE).ToArray();
}
public override void LoadTheme(string xmlPath)
{
base.LoadTheme(xmlPath);
_RowSlots.Clear();
for (var i = 0; i < _Rows.GetLength(0); i++)
{
var y = _SelectSlides[_Rows[i, 1]].Y;
if (!_RowSlots.Contains(y))
{
_RowSlots.Add(y);
}
}
_RowSlots.Sort();
_TextOffsetY = _Texts[_TextSource].Y - _SelectSlides[_SelectSlideSource].Y;
_SelectSlides[_SelectSlideSource].Clear();
foreach (var source in _Sources)
{
_SelectSlides[_SelectSlideSource].AddValue(source.ToString());
}
_SelectSlides[_SelectSlideSorting].Clear();
foreach (var sorting in _Sortings)
{
_SelectSlides[_SelectSlideSorting].AddValue(sorting.ToString());
}
_SelectSlides[_SelectSlideOrder].SetValues<EJukeboxOrder>((int)CJukebox.Order);
_SelectSlides[_SelectSlideSection].SetValues<EJukeboxSection>((int)CJukebox.Section);
_SelectSlides[_SelectSlideLyrics].SetValues<EOffOn>(CJukebox.ShowLyrics ? (int)EOffOn.TR_CONFIG_ON : (int)EOffOn.TR_CONFIG_OFF);
_SelectSlides[_SelectSlideVideo].SetValues<EOffOn>(CJukebox.ShowVideo ? (int)EOffOn.TR_CONFIG_ON : (int)EOffOn.TR_CONFIG_OFF);
_SelectSlides[_SelectSlideAudioMode].Clear();
foreach (var audioMode in _AudioModes)
{
_SelectSlides[_SelectSlideAudioMode].AddValue(audioMode.ToString());
}
}
public override void OnShow()
{
base.OnShow();
CSongs.Sort(CJukebox.Sorting, EOffOn.TR_CONFIG_ON, CConfig.Config.Game.IgnoreArticles, string.Empty, EDuetOptions.All, -1);
_FillPlaylists();
_FillCategories();
_SelectSlides[_SelectSlideSource].Selection = Math.Max(0, Array.IndexOf(_Sources, CJukebox.Source));
_SelectSlides[_SelectSlideSorting].Selection = Math.Max(0, Array.IndexOf(_Sortings, CJukebox.Sorting));
_SelectSlides[_SelectSlideAudioMode].Selection = Math.Max(0, Array.IndexOf(_AudioModes, CJukebox.AudioMode));
_SelectSlides[_SelectSlideOrder].Selection = (int)CJukebox.Order;
_SelectSlides[_SelectSlideSection].Selection = (int)CJukebox.Section;
_SelectSlides[_SelectSlideLyrics].Selection = CJukebox.ShowLyrics ? (int)EOffOn.TR_CONFIG_ON : (int)EOffOn.TR_CONFIG_OFF;
_SelectSlides[_SelectSlideVideo].Selection = CJukebox.ShowVideo ? (int)EOffOn.TR_CONFIG_ON : (int)EOffOn.TR_CONFIG_OFF;
_UpdateLayout();
_SelectElement(_Buttons[_ButtonStart].Visible ? _Buttons[_ButtonStart] : _Buttons[_ButtonBack]);
}
public override bool HandleInput(SKeyEvent keyEvent)
{
base.HandleInput(keyEvent);
if (keyEvent.KeyPressed)
{
return true;
}
switch (keyEvent.Key)
{
case Keys.Escape:
case Keys.Back:
CGraphics.FadeTo(EScreen.Main);
break;
case Keys.Enter:
if (_Buttons[_ButtonBack].Selected)
{
CGraphics.FadeTo(EScreen.Main);
}
else if (_Buttons[_ButtonStart].Selected)
{
_Start();
}
break;
case Keys.Left:
case Keys.Right:
_ReadSelection();
break;
}
return true;
}
public override bool HandleMouse(SMouseEvent mouseEvent)
{
base.HandleMouse(mouseEvent);
if (mouseEvent.LB && _IsMouseOverCurSelection(mouseEvent))
{
if (_Buttons[_ButtonBack].Selected)
{
CGraphics.FadeTo(EScreen.Main);
}
else if (_Buttons[_ButtonStart].Selected)
{
_Start();
}
else
{
_ReadSelection();
}
}
else if (mouseEvent.RB)
{
CGraphics.FadeTo(EScreen.Main);
}
return true;
}
public override bool UpdateGame()
{
return true;
}
private void _Start()
{
_ReadSelection();
if (CJukebox.Start())
{
CGraphics.FadeTo(EScreen.JukeboxPlayer);
}
}
private void _ReadSelection()
{
CJukebox.Source = _Sources[Math.Max(0, _SelectSlides[_SelectSlideSource].Selection)];
var playlist = _SelectSlides[_SelectSlidePlaylist].Selection;
CJukebox.PlaylistId = playlist >= 0 && playlist < _PlaylistIds.Count ? _PlaylistIds[playlist] : -1;
var sorting = _Sortings[Math.Max(0, _SelectSlides[_SelectSlideSorting].Selection)];
if (sorting != CJukebox.Sorting)
{
CJukebox.Sorting = sorting;
CJukebox.Category = 0;
CSongs.Sort(CJukebox.Sorting, EOffOn.TR_CONFIG_ON, CConfig.Config.Game.IgnoreArticles, string.Empty, EDuetOptions.All, -1);
_FillCategories();
}
else
{
CJukebox.Category = Math.Max(0, _SelectSlides[_SelectSlideCategory].Selection);
}
CJukebox.Order = (EJukeboxOrder)_SelectSlides[_SelectSlideOrder].Selection;
CJukebox.Section = (EJukeboxSection)_SelectSlides[_SelectSlideSection].Selection;
CJukebox.ShowLyrics = _SelectSlides[_SelectSlideLyrics].Selection == (int)EOffOn.TR_CONFIG_ON;
CJukebox.ShowVideo = _SelectSlides[_SelectSlideVideo].Selection == (int)EOffOn.TR_CONFIG_ON;
CJukebox.AudioMode = _AudioModes[Math.Max(0, _SelectSlides[_SelectSlideAudioMode].Selection)];
_UpdateLayout();
}
private void _FillPlaylists()
{
_SelectSlides[_SelectSlidePlaylist].Clear();
_PlaylistIds = CPlaylists.Ids;
var names = CPlaylists.Names;
for (var i = 0; i < _PlaylistIds.Count; i++)
{
_SelectSlides[_SelectSlidePlaylist].AddValue(names[i] + " (" + CPlaylists.GetSongCount(_PlaylistIds[i]) + ")", null, i);
}
var selection = _PlaylistIds.IndexOf(CJukebox.PlaylistId);
_SelectSlides[_SelectSlidePlaylist].Selection = Math.Max(0, selection);
CJukebox.PlaylistId = _PlaylistIds.Count > 0 ? _PlaylistIds[Math.Max(0, selection)] : -1;
}
private void _FillCategories()
{
_SelectSlides[_SelectSlideCategory].Clear();
for (var i = 0; i < CSongs.NumCategories; i++)
{
var category = CSongs.GetCategoryByIndex(i);
_SelectSlides[_SelectSlideCategory].AddValue(category.Name + " (" + category.Songs.Count + ")", null, i);
}
if (CJukebox.Category >= CSongs.NumCategories)
{
CJukebox.Category = 0;
}
_SelectSlides[_SelectSlideCategory].Selection = CJukebox.Category;
}
private void _UpdateLayout()
{
_SelectSlides[_SelectSlidePlaylist].Visible = CJukebox.Source == ESongSource.TR_SONGSOURCE_PLAYLIST;
_SelectSlides[_SelectSlideSorting].Visible = CJukebox.Source == ESongSource.TR_SONGSOURCE_CATEGORY;
_SelectSlides[_SelectSlideCategory].Visible = CJukebox.Source == ESongSource.TR_SONGSOURCE_CATEGORY;
var slot = 0;
for (var i = 0; i < _Rows.GetLength(0); i++)
{
var slide = _SelectSlides[_Rows[i, 1]];
var text = _Texts[_Rows[i, 0]];
text.Visible = slide.Visible;
if (!slide.Visible || slot >= _RowSlots.Count)
{
continue;
}
slide.Y = _RowSlots[slot];
text.Y = _RowSlots[slot] + _TextOffsetY;
slot++;
}
var numSongs = CJukebox.GetSongIds().Count;
_Texts[_TextInfo].Text = numSongs > 0
? CLanguage.Translate("TR_SCREENJUKEBOX_NUMSONGS").Replace("%d", numSongs.ToString())
: CLanguage.Translate("TR_SCREENJUKEBOX_NOSONGS");
_Buttons[_ButtonStart].Visible = numSongs > 0;
}
}
}
File diff suppressed because it is too large. Load diff
+17 -2
View File
@@ -27,11 +27,12 @@ namespace Vocaluxe.Screens
// Version number for theme files. Increment it, if you've changed something on the theme files!
protected override int _ScreenVersion
{
get { return 5; }
get { return 6; }
}
private const string _ButtonSing = "ButtonSing";
private const string _ButtonParty = "ButtonParty";
private const string _ButtonJukebox = "ButtonJukebox";
private const string _ButtonStatistics = "ButtonStatistics";
private const string _ButtonOptions = "ButtonOptions";
private const string _ButtonProfiles = "ButtonProfiles";
@@ -57,7 +58,7 @@ namespace Vocaluxe.Screens
base.Init();
_ThemeStatics = new string[] { "StaticMenuBar", _StaticWarningProfiles };
_ThemeButtons = new string[] { _ButtonSing, _ButtonParty, _ButtonStatistics, _ButtonOptions, _ButtonProfiles, _ButtonExit };
_ThemeButtons = new string[] { _ButtonSing, _ButtonParty, _ButtonJukebox, _ButtonStatistics, _ButtonOptions, _ButtonProfiles, _ButtonExit };
_ThemeTexts = new string[] { _TextRelease, _TextWarningProfiles };
}
@@ -119,6 +120,12 @@ namespace Vocaluxe.Screens
_LeaveScreen();
}
if (_Buttons[_ButtonJukebox].Selected)
{
CGraphics.FadeTo(EScreen.Jukebox);
_LeaveScreen();
}
if (_Buttons[_ButtonStatistics].Selected)
{
CGraphics.FadeTo(EScreen.Statistics);
@@ -172,6 +179,12 @@ namespace Vocaluxe.Screens
_LeaveScreen();
}
if (_Buttons[_ButtonJukebox].Selected)
{
CGraphics.FadeTo(EScreen.Jukebox);
_LeaveScreen();
}
if (_Buttons[_ButtonStatistics].Selected)
{
CGraphics.FadeTo(EScreen.Statistics);
@@ -208,6 +221,8 @@ namespace Vocaluxe.Screens
_Buttons[_ButtonParty].Selectable = profileOK;
_Buttons[_ButtonSing].Visible = profileOK;
_Buttons[_ButtonParty].Visible = profileOK;
_Buttons[_ButtonJukebox].Selectable = profileOK;
_Buttons[_ButtonJukebox].Visible = profileOK;
if (_Texts[_TextWarningProfiles].Visible && !_HasPlayedWarningSound)
{
+12 -4
View File
@@ -314,7 +314,7 @@ namespace Vocaluxe.Screens
{
case Keys.Escape:
case Keys.Back:
CGraphics.FadeTo(EScreen.Song);
_FadeBack();
_LeaveScreen();
break;
@@ -322,7 +322,7 @@ namespace Vocaluxe.Screens
if (_Buttons[_ButtonBack].Selected)
{
CGraphics.FadeTo(EScreen.Song);
_FadeBack();
_LeaveScreen();
}
else if (_Buttons[_ButtonStart].Selected)
@@ -532,7 +532,7 @@ namespace Vocaluxe.Screens
{
if (_Buttons[_ButtonBack].Selected)
{
CGraphics.FadeTo(EScreen.Song);
_FadeBack();
_LeaveScreen();
}
else if (_Buttons[_ButtonStart].Selected)
@@ -589,7 +589,7 @@ namespace Vocaluxe.Screens
if (exit)
{
CGraphics.FadeTo(EScreen.Song);
_FadeBack();
_LeaveScreen();
}
}
@@ -941,6 +941,14 @@ namespace Vocaluxe.Screens
}
}
private static void _FadeBack()
{
if (!CJukebox.ReturnAfterSinging())
{
CGraphics.FadeTo(EScreen.Song);
}
}
private void _LeaveScreen()
{
if (_WarningStream != -1)
+4 -1
View File
@@ -589,7 +589,10 @@ namespace Vocaluxe.Screens
if (_IsKaraokeMode(-1))
{
CGraphics.FadeTo(EScreen.Song);
if (!CJukebox.ReturnAfterSinging())
{
CGraphics.FadeTo(EScreen.Song);
}
}
else
{
+3
View File
@@ -245,6 +245,7 @@
<Compile Include="Base\CCursor.cs" />
<Compile Include="Base\CDataBase.cs" />
<Compile Include="Base\CStatistics.cs" />
<Compile Include="Base\CJukebox.cs" />
<Compile Include="Base\CDraw.cs" />
<Compile Include="Lib\Sound\Playback\PortAudio\CPt1.cs" />
<Compile Include="Lib\Sound\Playback\PortAudio\CSyncTimer.cs" />
@@ -346,6 +347,8 @@
<Compile Include="Screens\CScreenParty.cs" />
<Compile Include="Screens\CScreenStatistics.cs" />
<Compile Include="Screens\CScreenStatisticsDetail.cs" />
<Compile Include="Screens\CScreenJukebox.cs" />
<Compile Include="Screens\CScreenJukeboxPlayer.cs" />
<Compile Include="Screens\CScreenProfiles.cs" />
<Compile Include="Screens\CScreenScore.cs" />
<Compile Include="Screens\CScreenSing.cs" />
+2
View File
@@ -432,6 +432,8 @@ namespace VocaluxeLib
Party,
Statistics,
StatisticsDetail,
Jukebox,
JukeboxPlayer,
CountEntry //Leave this as last entry and never use it!
}
+2
View File
@@ -121,6 +121,7 @@ namespace VocaluxeLib.Menu
RectArrowLeft.X += delta;
RectArrowRight.X += delta;
base.X = value;
_NeedsRevalidate = true;
}
}
public override float Y
@@ -131,6 +132,7 @@ namespace VocaluxeLib.Menu
RectArrowLeft.Y += delta;
RectArrowRight.Y += delta;
base.Y = value;
_NeedsRevalidate = true;
}
}
public override float Z
+29 -2
View File
@@ -141,11 +141,38 @@ namespace VocaluxeLib.Utils.Player
throw new ArgumentNullException("song");
}
Load(song, song.GetMP3(), true, position, autoplay);
}
public void Load(CSong song, string audioFile, bool loadVideo, float position = 0f, bool autoplay = false)
{
if (song == null)
{
throw new ArgumentNullException("song");
}
lock (_lock)
{
Load(song.GetMP3(), position, autoplay);
Load(audioFile, position, autoplay);
_Song = song;
_LoadVideo();
if (loadVideo)
{
_LoadVideo();
}
}
}
public void SetPosition(float position)
{
lock (_lock)
{
Position = position;
var video = _Video;
var song = _Song;
if (video != null && !video.IsClosed() && song != null)
{
CBase.Video?.Skip(video, position, song.VideoGap);
}
}
}