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:
1 parent
bc4d2cf169
commit
522003a25f
27 files changed
+3612
-19
No files matched your search
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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");
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -510,7 +510,10 @@ namespace Vocaluxe.Screens
|
||||
_HighscoreStream = -1;
|
||||
}
|
||||
|
||||
CParty.LeavingHighscore();
|
||||
if (!CJukebox.ReturnAfterSinging())
|
||||
{
|
||||
CParty.LeavingHighscore();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -589,7 +589,10 @@ namespace Vocaluxe.Screens
|
||||
|
||||
if (_IsKaraokeMode(-1))
|
||||
{
|
||||
CGraphics.FadeTo(EScreen.Song);
|
||||
if (!CJukebox.ReturnAfterSinging())
|
||||
{
|
||||
CGraphics.FadeTo(EScreen.Song);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -432,6 +432,8 @@ namespace VocaluxeLib
|
||||
Party,
|
||||
Statistics,
|
||||
StatisticsDetail,
|
||||
Jukebox,
|
||||
JukeboxPlayer,
|
||||
|
||||
CountEntry //Leave this as last entry and never use it!
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user