Small improvements for 3 screens (#934)

* Improve profile and player selection screens

- Ask before deleting a profile, Delete only removes a character while editing the name
- Ask to save or discard unsaved profile changes when leaving the profile screen
- Restore the previous name with Escape and prevent empty profile names
- Stop the webcam when leaving the profile screen and discard snapshots on avatar change
- Show inactive profiles dimmed in the profile screen
- Play the missing mic/profile warning each time the player selection is shown
- Fix crash when clicking a profile after removing a player with Delete in fast selection
- Keep the duet part selection when profiles are reloaded
- Only save the player number when it has changed

* Use party mode selection look in statistics screens

- Tiles and selection use the ButtonTile skin like the party mode selection, the selected tile uses the selection color of the skin
- The detail list uses the CoverTextBackground skin, inner cards and row stripes the ButtonTile skin
- More space between the title and the columns of the best list
- Show the date in the recently sung list left aligned inside the list

* Changelog

* Improve sing screen and redesign pause menu

- Fix jumping to the old pause position after restarting or skipping a song in vocals mode
- Keep name and avatar hidden for players without a valid profile
- Show the placeholder avatar for profiles without avatar image
- Hide player information and rating popups during the start countdown
- Fix pause select slides not being shown or hidden
- Show "no more songs" only when Ctrl+S is pressed
- Select "Continue" when opening the pause menu with Escape
- Darken the game behind the pause menu
- Pause buttons as vertical list with icons, hidden buttons leave no gaps (visible buttons are placed in the slots of all pause buttons)
- New PauseButton skin with rounded corners for wide buttons, used for the pause buttons and the vocals volume selection
- Larger pause title centered above the pause panels
- Info panel with cover, title, artist, song progress and player scores
- Vocals volume selection with icon and centered caption in the full width of the info panel, showing five values
- Pause panels and icons are animated together with the pause buttons

---------

Co-authored-by: Florian Ostertag <flokuep@users.noreply.github.com>
This commit is contained in:
McSchneidarandFlorian Ostertag authored and GitHub committed 2026-10-21 12:05:18 +02:00
1 parent c8213bdcda
commit 2cdd30c6fc
22 files changed
+1324 -429

No files matched your search

+5
View File
@@ -7,6 +7,9 @@
<string name="TR_BUTTON_SAVE">Save</string>
<string name="TR_BUTTON_BACK">Back</string>
<string name="TR_BUTTON_START">Start</string>
<string name="TR_BUTTON_YES">Yes</string>
<string name="TR_BUTTON_NO">No</string>
<string name="TR_BUTTON_CANCEL">Cancel</string>
<string name="TR_DEBUG_AUDIO_STREAMS">Audio streams</string>
<string name="TR_DEBUG_VIDEO_STREAMS">Video streams</string>
<string name="TR_DEBUG_TEXTURES">Textures</string>
@@ -280,6 +283,8 @@
<string name="TR_SCREENPROFILES_BUTTON_SAVESNAPSHOT">Save snapshot</string>
<string name="TR_SCREENPROFILES_BUTTON_DISCARDSNAPSHOT">Delete snapshot</string>
<string name="TR_SCREENPROFILES_BUTTON_WEBCAM">Webcam</string>
<string name="TR_SCREENPROFILES_POPUP_DELETE">Do you really want to delete the profile %s?</string>
<string name="TR_SCREENPROFILES_POPUP_UNSAVED">Do you want to save your changes?</string>
<string name="TR_SCREENO_OPTIONS">Options</string>
<string name="TR_SCREENO_BUTTON_GAME">Game</string>
<string name="TR_SCREENO_BUTTON_SOUND">Sound</string>
@@ -1,4 +1,8 @@
ScreenProfiles
++++++++++
Version 5:
Add: <StaticPopupBG>, <TextPopup>, <ButtonPopupYes>, <ButtonPopupNo>, <ButtonPopupCancel> (popup to confirm deleting a profile and to save changes before leaving)
++++++++++
Version 4:
Add: <NameSelection>
@@ -1,4 +1,30 @@
ScreenSing
+++++++++
Version 16
Add:
<StaticPauseIconContinue>, <StaticPauseIconSkip>, <StaticPauseIconRestartRound>, <StaticPauseIconRestartGame>, <StaticPauseIconCancel> Icons of the pause buttons, they move with their button and use the text color of their button
<StaticPauseCover> Cover of the current song
<StaticPauseTimeLineProgress> Progress of the current song, the width is scaled by the progress
<StaticPauseVocalsIcon> Only visible in vocals audio mode, keeps its horizontal distance to the left edge of <TextPauseVocalsVolume>
<StaticPauseAvatarP1> - <StaticPauseAvatarP6>
<TextPauseArtist>
<TextPauseTimeCurrent>
<TextPauseTimeRemaining>
<TextPauseNameP1> - <TextPauseNameP6>
<TextPauseScoreP1> - <TextPauseScoreP6>
Change:
Visible pause buttons are placed without gaps in the slots of all pause buttons (sorted by Y, then X) in the order Continue, Skip, RestartRound, RestartGame, Cancel
<TextPauseSongName> Shows only the title of the song
Statics starting with "StaticPause" that do not cover the whole screen are animated together with the pause buttons
+++++++++
Version 15
Add:
<StaticPauseDim> Darkens the game behind the pause menu (all statics starting with "StaticPause" are shown in the pause menu)
+++++++++
Version 14
@@ -1,8 +1,16 @@
ScreenStatistics
++++++++++
Version 2:
Change (same look as the party mode selection):
<StaticTile1> to <StaticTile4> use the skin ButtonTile with ButtonMainColor
<StaticTileSelection> uses the skin ButtonTile with ButtonSelColor and replaces the selected tile (like <StaticTileSelected> in ScreenParty)
<StaticBestColumn1> to <StaticBestColumn3> use the skin ButtonTile with ButtonMainColor
Columns of the best list (<StaticBestColumn$N$>, <StaticBestMedal$N$$M$>, <TextDifficulty$N$>, <TextBestName$N$$M$>, <TextBestScore$N$$M$>) moved 20 pixels down
++++++++++
Version 1:
(2026 Oct 16)
New screen: statistics dashboard with four tiles (overview, recently sung, best list per difficulty, players)
Help text <TextHint> at the bottom of the screen
@@ -1,5 +1,13 @@
ScreenStatisticsDetail
++++++++++
Version 2:
(2026 Oct 18)
Change (same look as the party mode selection):
<StaticList> uses the skin CoverTextBackground with StaticColorAlpha
<StaticRowStripe$N$> use the skin ButtonTile with ButtonMainColor
++++++++++
Version 1:
(2026 Oct 16)
@@ -382,6 +382,7 @@
<NoAvatar>NoAvatar.png</NoAvatar>
<SongMenu>SongMenu.png</SongMenu>
<PauseBG>PauseBG.png</PauseBG>
<PauseButton>PauseButton.png</PauseButton>
<EnergyBeam>EnergyBeam.png</EnergyBeam>
<SearchBar>SearchBar.png</SearchBar>
<PlaylistBG>PlaylistBG.png</PlaylistBG>
+1
View File
@@ -382,6 +382,7 @@
<NoAvatar>NoAvatar.png</NoAvatar>
<SongMenu>SongMenu.png</SongMenu>
<PauseBG>PauseBG.png</PauseBG>
<PauseButton>PauseButton.png</PauseButton>
<EnergyBeam>EnergyBeam.png</EnergyBeam>
<SearchBar>SearchBar.png</SearchBar>
<PlaylistBG>PlaylistBG.png</PlaylistBG>
+1
View File
@@ -382,6 +382,7 @@
<NoAvatar>NoAvatar.png</NoAvatar>
<SongMenu>SongMenu.png</SongMenu>
<PauseBG>PauseBG.png</PauseBG>
<PauseButton>PauseButton.png</PauseButton>
<EnergyBeam>EnergyBeam.png</EnergyBeam>
<SearchBar>SearchBar.png</SearchBar>
<PlaylistBG>PlaylistBG.png</PlaylistBG>
+1
View File
@@ -382,6 +382,7 @@
<NoAvatar>NoAvatar.png</NoAvatar>
<SongMenu>SongMenu.png</SongMenu>
<PauseBG>PauseBG.png</PauseBG>
<PauseButton>PauseButton.png</PauseButton>
<EnergyBeam>EnergyBeam.png</EnergyBeam>
<SearchBar>SearchBar.png</SearchBar>
<PlaylistBG>PlaylistBG.png</PlaylistBG>
+1
View File
@@ -382,6 +382,7 @@
<NoAvatar>NoAvatar.png</NoAvatar>
<SongMenu>SongMenu.png</SongMenu>
<PauseBG>PauseBG.png</PauseBG>
<PauseButton>PauseButton.png</PauseButton>
<EnergyBeam>EnergyBeam.png</EnergyBeam>
<SearchBar>SearchBar.png</SearchBar>
<PlaylistBG>PlaylistBG.png</PlaylistBG>
+1
View File
@@ -382,6 +382,7 @@
<NoAvatar>NoAvatar.png</NoAvatar>
<SongMenu>SongMenu.png</SongMenu>
<PauseBG>PauseBG.png</PauseBG>
<PauseButton>PauseButton.png</PauseButton>
<EnergyBeam>EnergyBeam.png</EnergyBeam>
<SearchBar>SearchBar.png</SearchBar>
<PlaylistBG>PlaylistBG.png</PlaylistBG>
Binary file not shown.

After

Width:  |  Height:  |  Size: 717 B

@@ -2,7 +2,7 @@
<Screen xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Informations>
<ScreenName>ScreenProfiles</ScreenName>
<ScreenVersion>4</ScreenVersion>
<ScreenVersion>5</ScreenVersion>
</Informations>
<Backgrounds>
<Background Name="Background1">
@@ -36,6 +36,17 @@
<Z>-1</Z>
</Rect>
</Static>
<Static Name="StaticPopupBG">
<Skin>PopupBG</Skin>
<Color Name="StaticColor" />
<Rect>
<X>0</X>
<Y>0</Y>
<W>1920</W>
<H>1080</H>
<Z>-10</Z>
</Rect>
</Static>
</Statics>
<Texts>
<Text Name="TextTitle">
@@ -122,6 +133,20 @@
<Font>Outline</Font>
<Text>TR_SCREENPROFILES_ACTIVE</Text>
</Text>
<Text Name="TextPopup">
<X>960</X>
<Y>405</Y>
<Z>-11</Z>
<H>40.5</H>
<MaxW>900</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
</Texts>
<Buttons>
<Button Name="ButtonPlayerName">
@@ -415,6 +440,111 @@
<Space>15</Space>
</SelReflection>
</Button>
<Button Name="ButtonPopupYes">
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
<Rect>
<X>547.5</X>
<Y>540</Y>
<W>225</W>
<H>75</H>
<Z>-11</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_YES</Text>
</Text>
<Reflection>
<Height>39</Height>
<Space>15</Space>
</Reflection>
<SelReflection>
<Height>39</Height>
<Space>15</Space>
</SelReflection>
</Button>
<Button Name="ButtonPopupNo">
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
<Rect>
<X>847.5</X>
<Y>540</Y>
<W>225</W>
<H>75</H>
<Z>-11</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_NO</Text>
</Text>
<Reflection>
<Height>39</Height>
<Space>15</Space>
</Reflection>
<SelReflection>
<Height>39</Height>
<Space>15</Space>
</SelReflection>
</Button>
<Button Name="ButtonPopupCancel">
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
<Rect>
<X>1147.5</X>
<Y>540</Y>
<W>225</W>
<H>75</H>
<Z>-11</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_CANCEL</Text>
</Text>
<Reflection>
<Height>39</Height>
<Space>15</Space>
</Reflection>
<SelReflection>
<Height>39</Height>
<Space>15</Space>
</SelReflection>
</Button>
</Buttons>
<SongMenus />
<Lyrics />
+519 -144
View File
@@ -2,7 +2,7 @@
<Screen xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Informations>
<ScreenName>ScreenSing</ScreenName>
<ScreenVersion>14</ScreenVersion>
<ScreenVersion>16</ScreenVersion>
</Informations>
<Backgrounds>
<Background Name="Background1">
@@ -169,6 +169,22 @@
<Z>0</Z>
</Rect>
</Static>
<Static Name="StaticPauseDim">
<Skin />
<Color>
<R>0</R>
<G>0</G>
<B>0</B>
<A>0.55</A>
</Color>
<Rect>
<X>0</X>
<Y>0</Y>
<W>1920</W>
<H>1080</H>
<Z>-2.05</Z>
</Rect>
</Static>
<Static Name="StaticPauseBG">
<Skin>PauseBG</Skin>
<Color Name="Visible" />
@@ -180,6 +196,195 @@
<Z>-2.1</Z>
</Rect>
</Static>
<Static Name="StaticPauseMenuPanel">
<Skin>CoverTextBackground</Skin>
<Color Name="StaticColorAlpha" />
<Rect>
<X>105</X>
<Y>240</Y>
<W>660</W>
<H>720</H>
<Z>-2.105</Z>
</Rect>
</Static>
<Static Name="StaticPauseInfoPanel">
<Skin>CoverTextBackground</Skin>
<Color Name="StaticColorAlpha" />
<Rect>
<X>855</X>
<Y>240</Y>
<W>960</W>
<H>720</H>
<Z>-2.105</Z>
</Rect>
</Static>
<Static Name="StaticPauseIconContinue">
<Skin>PlayIcon</Skin>
<Color Name="ButtonTextColor" />
<Rect>
<X>157.5</X>
<Y>285.5</Y>
<W>44</W>
<H>44</H>
<Z>-2.13</Z>
</Rect>
</Static>
<Static Name="StaticPauseIconSkip">
<Skin>NextIcon</Skin>
<Color Name="ButtonTextColor" />
<Rect>
<X>157.5</X>
<Y>375.5</Y>
<W>44</W>
<H>44</H>
<Z>-2.13</Z>
</Rect>
</Static>
<Static Name="StaticPauseIconRestartRound">
<Skin>RepeatIcon</Skin>
<Color Name="ButtonTextColor" />
<Rect>
<X>157.5</X>
<Y>465.5</Y>
<W>44</W>
<H>44</H>
<Z>-2.13</Z>
</Rect>
</Static>
<Static Name="StaticPauseIconRestartGame">
<Skin>RepeatIcon</Skin>
<Color Name="ButtonTextColor" />
<Rect>
<X>157.5</X>
<Y>555.5</Y>
<W>44</W>
<H>44</H>
<Z>-2.13</Z>
</Rect>
</Static>
<Static Name="StaticPauseIconCancel">
<Skin>CloseIcon</Skin>
<Color Name="ButtonTextColor" />
<Rect>
<X>157.5</X>
<Y>645.5</Y>
<W>44</W>
<H>44</H>
<Z>-2.13</Z>
</Rect>
</Static>
<Static Name="StaticPauseCover">
<Skin />
<Color Name="Visible" />
<Rect>
<X>900</X>
<Y>285</Y>
<W>180</W>
<H>180</H>
<Z>-2.11</Z>
</Rect>
</Static>
<Static Name="StaticPauseTimeLine">
<Skin>TimeLine</Skin>
<Color Name="TimeBar">
<A>0.2</A>
</Color>
<Rect>
<X>900</X>
<Y>490</Y>
<W>870</W>
<H>6</H>
<Z>-2.11</Z>
</Rect>
</Static>
<Static Name="StaticPauseTimeLineProgress">
<Skin>TimeLine</Skin>
<Color Name="TimeBar" />
<Rect>
<X>900</X>
<Y>490</Y>
<W>870</W>
<H>6</H>
<Z>-2.12</Z>
</Rect>
</Static>
<Static Name="StaticPauseAvatarP1">
<Skin />
<Color Name="StaticAvatarColor" />
<Rect>
<X>900</X>
<Y>560</Y>
<W>60</W>
<H>60</H>
<Z>-2.11</Z>
</Rect>
</Static>
<Static Name="StaticPauseAvatarP2">
<Skin />
<Color Name="StaticAvatarColor" />
<Rect>
<X>1350</X>
<Y>560</Y>
<W>60</W>
<H>60</H>
<Z>-2.11</Z>
</Rect>
</Static>
<Static Name="StaticPauseAvatarP3">
<Skin />
<Color Name="StaticAvatarColor" />
<Rect>
<X>900</X>
<Y>630</Y>
<W>60</W>
<H>60</H>
<Z>-2.11</Z>
</Rect>
</Static>
<Static Name="StaticPauseAvatarP4">
<Skin />
<Color Name="StaticAvatarColor" />
<Rect>
<X>1350</X>
<Y>630</Y>
<W>60</W>
<H>60</H>
<Z>-2.11</Z>
</Rect>
</Static>
<Static Name="StaticPauseAvatarP5">
<Skin />
<Color Name="StaticAvatarColor" />
<Rect>
<X>900</X>
<Y>700</Y>
<W>60</W>
<H>60</H>
<Z>-2.11</Z>
</Rect>
</Static>
<Static Name="StaticPauseAvatarP6">
<Skin />
<Color Name="StaticAvatarColor" />
<Rect>
<X>1350</X>
<Y>700</Y>
<W>60</W>
<H>60</H>
<Z>-2.11</Z>
</Rect>
</Static>
<Static Name="StaticPauseVocalsIcon">
<Skin>VocalsIcon</Skin>
<Color Name="ButtonTextColor" />
<Rect>
<X>1109</X>
<Y>784</Y>
<W>44</W>
<H>44</H>
<Z>-2.11</Z>
</Rect>
</Static>
<Static Name="StaticScoreP1N1">
<Skin />
<Color Name="Invisible" />
@@ -698,9 +903,9 @@
<Text /></Text>
<Text Name="TextPause">
<X>960</X>
<Y>675</Y>
<Y>55</Y>
<Z>-2.11</Z>
<H>150</H>
<H>130</H>
<MaxW>0</MaxW>
<Color Name="TextPauseColor" />
<SelColor Name="TextSelColor" />
@@ -711,31 +916,241 @@
<Text>TR_SCREENSING_PAUSE</Text>
</Text>
<Text Name="TextPauseSongName">
<X>960</X>
<Y>15</Y>
<X>1110</X>
<Y>310</Y>
<Z>-2.11</Z>
<H>60</H>
<MaxW>0</MaxW>
<Color Name="White" />
<SelColor Name="White" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Normal</Font>
<Text />
</Text>
<Text Name="TextPauseVocalsVolume">
<X>217.5</X>
<Y>818</Y>
<Z>-2.11</Z>
<H>40.5</H>
<MaxW>520</MaxW>
<H>48</H>
<MaxW>660</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextPauseArtist">
<X>1110</X>
<Y>370</Y>
<Z>-2.11</Z>
<H>36</H>
<MaxW>660</MaxW>
<Color Name="TextColorAlpha" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Normal</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextPauseTimeCurrent">
<X>900</X>
<Y>508</Y>
<Z>-2.11</Z>
<H>30</H>
<MaxW>300</MaxW>
<Color Name="TextColorAlpha" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Normal</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextPauseTimeRemaining">
<X>1770</X>
<Y>508</Y>
<Z>-2.11</Z>
<H>30</H>
<MaxW>300</MaxW>
<Color Name="TextColorAlpha" />
<SelColor Name="TextSelColor" />
<Align>Right</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Normal</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextPauseNameP1">
<X>975</X>
<Y>572</Y>
<Z>-2.11</Z>
<H>36</H>
<MaxW>240</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextPauseScoreP1">
<X>1320</X>
<Y>572</Y>
<Z>-2.11</Z>
<H>36</H>
<MaxW>0</MaxW>
<Color Name="Player1" />
<SelColor Name="TextSelColor" />
<Align>Right</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextPauseNameP2">
<X>1425</X>
<Y>572</Y>
<Z>-2.11</Z>
<H>36</H>
<MaxW>240</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextPauseScoreP2">
<X>1770</X>
<Y>572</Y>
<Z>-2.11</Z>
<H>36</H>
<MaxW>0</MaxW>
<Color Name="Player2" />
<SelColor Name="TextSelColor" />
<Align>Right</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextPauseNameP3">
<X>975</X>
<Y>642</Y>
<Z>-2.11</Z>
<H>36</H>
<MaxW>240</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextPauseScoreP3">
<X>1320</X>
<Y>642</Y>
<Z>-2.11</Z>
<H>36</H>
<MaxW>0</MaxW>
<Color Name="Player3" />
<SelColor Name="TextSelColor" />
<Align>Right</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextPauseNameP4">
<X>1425</X>
<Y>642</Y>
<Z>-2.11</Z>
<H>36</H>
<MaxW>240</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextPauseScoreP4">
<X>1770</X>
<Y>642</Y>
<Z>-2.11</Z>
<H>36</H>
<MaxW>0</MaxW>
<Color Name="Player4" />
<SelColor Name="TextSelColor" />
<Align>Right</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextPauseNameP5">
<X>975</X>
<Y>712</Y>
<Z>-2.11</Z>
<H>36</H>
<MaxW>240</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextPauseScoreP5">
<X>1320</X>
<Y>712</Y>
<Z>-2.11</Z>
<H>36</H>
<MaxW>0</MaxW>
<Color Name="Player5" />
<SelColor Name="TextSelColor" />
<Align>Right</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextPauseNameP6">
<X>1425</X>
<Y>712</Y>
<Z>-2.11</Z>
<H>36</H>
<MaxW>240</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextPauseScoreP6">
<X>1770</X>
<Y>712</Y>
<Z>-2.11</Z>
<H>36</H>
<MaxW>0</MaxW>
<Color Name="Player6" />
<SelColor Name="TextSelColor" />
<Align>Right</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextPauseVocalsVolume">
<X>1335</X>
<Y>786</Y>
<Z>-2.11</Z>
<H>40.5</H>
<MaxW>810</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENSING_VOCALSVOLUME</Text>
</Text>
<Text Name="TextDuetName1">
@@ -1367,180 +1782,140 @@
<Text /></Text>
</Texts>
<Buttons>
<Button Name="ButtonCancel">
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
<Rect>
<X>1477.5</X>
<Y>900</Y>
<W>225</W>
<H>75</H>
<Z>-2.11</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_SCREENSING_BUTTON_CANCEL</Text>
</Text>
<Reflection>
<Height>39</Height>
<Space>15</Space>
</Reflection>
<SelReflection>
<Height>39</Height>
<Space>15</Space>
</SelReflection>
</Button>
<Button Name="ButtonContinue">
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
<Skin>PauseButton</Skin>
<SkinSelected>PauseButton</SkinSelected>
<Rect>
<X>217.5</X>
<Y>900</Y>
<W>225</W>
<X>135</X>
<Y>270</Y>
<W>600</W>
<H>75</H>
<Z>-2.11</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>112.5</X>
<Y>18</Y>
<X>90</X>
<Y>17</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>213</MaxW>
<MaxW>480</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENSING_BUTTON_CONTINUE</Text>
</Text>
<Reflection>
<Height>39</Height>
<Space>15</Space>
</Reflection>
<SelReflection>
<Height>39</Height>
<Space>15</Space>
</SelReflection>
</Button>
<Button Name="ButtonSkip">
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
<Skin>PauseButton</Skin>
<SkinSelected>PauseButton</SkinSelected>
<Rect>
<X>532.5</X>
<Y>900</Y>
<W>225</W>
<X>135</X>
<Y>360</Y>
<W>600</W>
<H>75</H>
<Z>-2.11</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>112.5</X>
<Y>18</Y>
<X>90</X>
<Y>17</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>213</MaxW>
<MaxW>480</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENSING_BUTTON_SKIP</Text>
</Text>
<Reflection>
<Height>39</Height>
<Space>15</Space>
</Reflection>
<SelReflection>
<Height>39</Height>
<Space>15</Space>
</SelReflection>
</Button>
<Button Name="ButtonRestartRound">
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
<Skin>PauseButton</Skin>
<SkinSelected>PauseButton</SkinSelected>
<Rect>
<X>1162.5</X>
<Y>900</Y>
<W>225</W>
<X>135</X>
<Y>450</Y>
<W>600</W>
<H>75</H>
<Z>-2.11</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>112.5</X>
<Y>18</Y>
<X>90</X>
<Y>17</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>213</MaxW>
<MaxW>480</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENSING_BUTTON_RESTART_ROUND</Text>
</Text>
<Reflection>
<Height>39</Height>
<Space>15</Space>
</Reflection>
<SelReflection>
<Height>39</Height>
<Space>15</Space>
</SelReflection>
</Button>
<Button Name="ButtonRestartGame">
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
<Skin>PauseButton</Skin>
<SkinSelected>PauseButton</SkinSelected>
<Rect>
<X>847.5</X>
<Y>900</Y>
<W>225</W>
<X>135</X>
<Y>540</Y>
<W>600</W>
<H>75</H>
<Z>-2.11</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>112.5</X>
<Y>18</Y>
<X>90</X>
<Y>17</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>213</MaxW>
<MaxW>480</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENSING_BUTTON_RESTART_GAME</Text>
</Text>
<Reflection>
<Height>39</Height>
<Space>15</Space>
</Reflection>
<SelReflection>
<Height>39</Height>
<Space>15</Space>
</SelReflection>
</Button>
<Button Name="ButtonCancel">
<Skin>PauseButton</Skin>
<SkinSelected>PauseButton</SkinSelected>
<Rect>
<X>135</X>
<Y>630</Y>
<W>600</W>
<H>75</H>
<Z>-2.11</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>90</X>
<Y>17</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>480</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENSING_BUTTON_CANCEL</Text>
</Text>
</Button>
</Buttons>
<SongMenus />
@@ -1614,43 +1989,43 @@
</Lyrics>
<SelectSlides>
<SelectSlide Name="SelectSlidePauseVocalsVolume">
<Skin />
<Skin>PauseButton</Skin>
<SkinArrowLeft>SelectSlideArrowLeft</SkinArrowLeft>
<SkinArrowRight>SelectSlideArrowRight</SkinArrowRight>
<SkinSelected>SelectSlide</SkinSelected>
<SkinSelected>PauseButton</SkinSelected>
<SkinArrowLeftSelected>SelectSlideArrowLeft</SkinArrowLeftSelected>
<SkinArrowRightSelected>SelectSlideArrowRight</SkinArrowRightSelected>
<Rect>
<X>752</X>
<Y>820</Y>
<W>958</W>
<H>40</H>
<X>900</X>
<Y>855</Y>
<W>870</W>
<H>75</H>
<Z>-2.11</Z>
</Rect>
<RectArrowLeft>
<X>757.5</X>
<Y>822.5</Y>
<W>35</W>
<H>35</H>
<X>906</X>
<Y>868.5</Y>
<W>48</W>
<H>48</H>
<Z>-2.11</Z>
</RectArrowLeft>
<RectArrowRight>
<X>1667.5</X>
<Y>822.5</Y>
<W>35</W>
<H>35</H>
<X>1716</X>
<Y>868.5</Y>
<W>48</W>
<H>48</H>
<Z>-2.11</Z>
</RectArrowRight>
<Color Name="SelectSlideColor" />
<SelColor Name="SelectSlideSelColor" />
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<ArrowColor Name="ArrowColor" />
<ArrowSelColor Name="ArrowSelColor" />
<TextColor Name="TextColorAlpha" />
<TextSelColor Name="TextSelColor" />
<TextColor Name="ButtonTextColor" />
<TextSelColor Name="ButtonTextSelColor" />
<TextH>40.5</TextH>
<TextRelativeX>75</TextRelativeX>
<TextRelativeX>60</TextRelativeX>
<TextRelativeY>0</TextRelativeY>
<TextMaxW>300</TextMaxW>
<TextMaxW>140</TextMaxW>
<TextFont>Outline</TextFont>
<TextStyle>Bold</TextStyle>
<NumVisible>5</NumVisible>
@@ -2,7 +2,7 @@
<Screen xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Informations>
<ScreenName>ScreenStatistics</ScreenName>
<ScreenVersion>1</ScreenVersion>
<ScreenVersion>2</ScreenVersion>
</Informations>
<Backgrounds>
<Background Name="Background1">
@@ -26,13 +26,8 @@
</Rect>
</Static>
<Static Name="StaticTile1">
<Skin />
<Color>
<R>0</R>
<G>0</G>
<B>0</B>
<A>0.45</A>
</Color>
<Skin>ButtonTile</Skin>
<Color Name="ButtonMainColor" />
<Rect>
<X>90</X>
<Y>165</Y>
@@ -42,13 +37,8 @@
</Rect>
</Static>
<Static Name="StaticTile2">
<Skin />
<Color>
<R>0</R>
<G>0</G>
<B>0</B>
<A>0.45</A>
</Color>
<Skin>ButtonTile</Skin>
<Color Name="ButtonMainColor" />
<Rect>
<X>975</X>
<Y>165</Y>
@@ -58,13 +48,8 @@
</Rect>
</Static>
<Static Name="StaticTile3">
<Skin />
<Color>
<R>0</R>
<G>0</G>
<B>0</B>
<A>0.45</A>
</Color>
<Skin>ButtonTile</Skin>
<Color Name="ButtonMainColor" />
<Rect>
<X>90</X>
<Y>600</Y>
@@ -74,13 +59,8 @@
</Rect>
</Static>
<Static Name="StaticTile4">
<Skin />
<Color>
<R>0</R>
<G>0</G>
<B>0</B>
<A>0.45</A>
</Color>
<Skin>ButtonTile</Skin>
<Color Name="ButtonMainColor" />
<Rect>
<X>975</X>
<Y>600</Y>
@@ -90,13 +70,8 @@
</Rect>
</Static>
<Static Name="StaticTileSelection">
<Skin />
<Color>
<R>0.2</R>
<G>0.8</G>
<B>0.99</B>
<A>0.25</A>
</Color>
<Skin>ButtonTile</Skin>
<Color Name="ButtonSelColor" />
<Rect>
<X>90</X>
<Y>165</Y>
@@ -150,16 +125,11 @@
</Rect>
</Static>
<Static Name="StaticBestColumn1">
<Skin />
<Color>
<R>1</R>
<G>1</G>
<B>1</B>
<A>0.07</A>
</Color>
<Skin>ButtonTile</Skin>
<Color Name="ButtonMainColor" />
<Rect>
<X>119</X>
<Y>658</Y>
<Y>678</Y>
<W>257</W>
<H>300</H>
<Z>0.8</Z>
@@ -170,7 +140,7 @@
<Color Name="Top1Color" />
<Rect>
<X>131</X>
<Y>728</Y>
<Y>748</Y>
<W>26</W>
<H>26</H>
<Z>0</Z>
@@ -181,7 +151,7 @@
<Color Name="Top2Color" />
<Rect>
<X>131</X>
<Y>806</Y>
<Y>826</Y>
<W>26</W>
<H>26</H>
<Z>0</Z>
@@ -192,23 +162,18 @@
<Color Name="Top3Color" />
<Rect>
<X>131</X>
<Y>884</Y>
<Y>904</Y>
<W>26</W>
<H>26</H>
<Z>0</Z>
</Rect>
</Static>
<Static Name="StaticBestColumn2">
<Skin />
<Color>
<R>1</R>
<G>1</G>
<B>1</B>
<A>0.07</A>
</Color>
<Skin>ButtonTile</Skin>
<Color Name="ButtonMainColor" />
<Rect>
<X>389</X>
<Y>658</Y>
<Y>678</Y>
<W>257</W>
<H>300</H>
<Z>0.8</Z>
@@ -219,7 +184,7 @@
<Color Name="Top1Color" />
<Rect>
<X>401</X>
<Y>728</Y>
<Y>748</Y>
<W>26</W>
<H>26</H>
<Z>0</Z>
@@ -230,7 +195,7 @@
<Color Name="Top2Color" />
<Rect>
<X>401</X>
<Y>806</Y>
<Y>826</Y>
<W>26</W>
<H>26</H>
<Z>0</Z>
@@ -241,23 +206,18 @@
<Color Name="Top3Color" />
<Rect>
<X>401</X>
<Y>884</Y>
<Y>904</Y>
<W>26</W>
<H>26</H>
<Z>0</Z>
</Rect>
</Static>
<Static Name="StaticBestColumn3">
<Skin />
<Color>
<R>1</R>
<G>1</G>
<B>1</B>
<A>0.07</A>
</Color>
<Skin>ButtonTile</Skin>
<Color Name="ButtonMainColor" />
<Rect>
<X>659</X>
<Y>658</Y>
<Y>678</Y>
<W>257</W>
<H>300</H>
<Z>0.8</Z>
@@ -268,7 +228,7 @@
<Color Name="Top1Color" />
<Rect>
<X>671</X>
<Y>728</Y>
<Y>748</Y>
<W>26</W>
<H>26</H>
<Z>0</Z>
@@ -279,7 +239,7 @@
<Color Name="Top2Color" />
<Rect>
<X>671</X>
<Y>806</Y>
<Y>826</Y>
<W>26</W>
<H>26</H>
<Z>0</Z>
@@ -290,7 +250,7 @@
<Color Name="Top3Color" />
<Rect>
<X>671</X>
<Y>884</Y>
<Y>904</Y>
<W>26</W>
<H>26</H>
<Z>0</Z>
@@ -734,7 +694,7 @@
</Text>
<Text Name="TextDifficulty1">
<X>249</X>
<Y>668</Y>
<Y>688</Y>
<Z>-1</Z>
<H>32</H>
<MaxW>0</MaxW>
@@ -748,7 +708,7 @@
</Text>
<Text Name="TextBestName11">
<X>167</X>
<Y>722</Y>
<Y>742</Y>
<Z>-1</Z>
<H>36</H>
<MaxW>110</MaxW>
@@ -762,7 +722,7 @@
</Text>
<Text Name="TextBestScore11">
<X>366</X>
<Y>722</Y>
<Y>742</Y>
<Z>-1</Z>
<H>36</H>
<MaxW>0</MaxW>
@@ -776,7 +736,7 @@
</Text>
<Text Name="TextBestName12">
<X>167</X>
<Y>800</Y>
<Y>820</Y>
<Z>-1</Z>
<H>36</H>
<MaxW>110</MaxW>
@@ -790,7 +750,7 @@
</Text>
<Text Name="TextBestScore12">
<X>366</X>
<Y>800</Y>
<Y>820</Y>
<Z>-1</Z>
<H>36</H>
<MaxW>0</MaxW>
@@ -804,7 +764,7 @@
</Text>
<Text Name="TextBestName13">
<X>167</X>
<Y>878</Y>
<Y>898</Y>
<Z>-1</Z>
<H>36</H>
<MaxW>110</MaxW>
@@ -818,7 +778,7 @@
</Text>
<Text Name="TextBestScore13">
<X>366</X>
<Y>878</Y>
<Y>898</Y>
<Z>-1</Z>
<H>36</H>
<MaxW>0</MaxW>
@@ -832,7 +792,7 @@
</Text>
<Text Name="TextDifficulty2">
<X>519</X>
<Y>668</Y>
<Y>688</Y>
<Z>-1</Z>
<H>32</H>
<MaxW>0</MaxW>
@@ -846,7 +806,7 @@
</Text>
<Text Name="TextBestName21">
<X>437</X>
<Y>722</Y>
<Y>742</Y>
<Z>-1</Z>
<H>36</H>
<MaxW>110</MaxW>
@@ -860,7 +820,7 @@
</Text>
<Text Name="TextBestScore21">
<X>636</X>
<Y>722</Y>
<Y>742</Y>
<Z>-1</Z>
<H>36</H>
<MaxW>0</MaxW>
@@ -874,7 +834,7 @@
</Text>
<Text Name="TextBestName22">
<X>437</X>
<Y>800</Y>
<Y>820</Y>
<Z>-1</Z>
<H>36</H>
<MaxW>110</MaxW>
@@ -888,7 +848,7 @@
</Text>
<Text Name="TextBestScore22">
<X>636</X>
<Y>800</Y>
<Y>820</Y>
<Z>-1</Z>
<H>36</H>
<MaxW>0</MaxW>
@@ -902,7 +862,7 @@
</Text>
<Text Name="TextBestName23">
<X>437</X>
<Y>878</Y>
<Y>898</Y>
<Z>-1</Z>
<H>36</H>
<MaxW>110</MaxW>
@@ -916,7 +876,7 @@
</Text>
<Text Name="TextBestScore23">
<X>636</X>
<Y>878</Y>
<Y>898</Y>
<Z>-1</Z>
<H>36</H>
<MaxW>0</MaxW>
@@ -930,7 +890,7 @@
</Text>
<Text Name="TextDifficulty3">
<X>789</X>
<Y>668</Y>
<Y>688</Y>
<Z>-1</Z>
<H>32</H>
<MaxW>0</MaxW>
@@ -944,7 +904,7 @@
</Text>
<Text Name="TextBestName31">
<X>707</X>
<Y>722</Y>
<Y>742</Y>
<Z>-1</Z>
<H>36</H>
<MaxW>110</MaxW>
@@ -958,7 +918,7 @@
</Text>
<Text Name="TextBestScore31">
<X>906</X>
<Y>722</Y>
<Y>742</Y>
<Z>-1</Z>
<H>36</H>
<MaxW>0</MaxW>
@@ -972,7 +932,7 @@
</Text>
<Text Name="TextBestName32">
<X>707</X>
<Y>800</Y>
<Y>820</Y>
<Z>-1</Z>
<H>36</H>
<MaxW>110</MaxW>
@@ -986,7 +946,7 @@
</Text>
<Text Name="TextBestScore32">
<X>906</X>
<Y>800</Y>
<Y>820</Y>
<Z>-1</Z>
<H>36</H>
<MaxW>0</MaxW>
@@ -1000,7 +960,7 @@
</Text>
<Text Name="TextBestName33">
<X>707</X>
<Y>878</Y>
<Y>898</Y>
<Z>-1</Z>
<H>36</H>
<MaxW>110</MaxW>
@@ -1014,7 +974,7 @@
</Text>
<Text Name="TextBestScore33">
<X>906</X>
<Y>878</Y>
<Y>898</Y>
<Z>-1</Z>
<H>36</H>
<MaxW>0</MaxW>
@@ -2,7 +2,7 @@
<Screen xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Informations>
<ScreenName>ScreenStatisticsDetail</ScreenName>
<ScreenVersion>1</ScreenVersion>
<ScreenVersion>2</ScreenVersion>
</Informations>
<Backgrounds>
<Background Name="Background1">
@@ -26,13 +26,8 @@
</Rect>
</Static>
<Static Name="StaticList">
<Skin />
<Color>
<R>0</R>
<G>0</G>
<B>0</B>
<A>0.45</A>
</Color>
<Skin>CoverTextBackground</Skin>
<Color Name="StaticColorAlpha" />
<Rect>
<X>90</X>
<Y>185</Y>
@@ -42,13 +37,8 @@
</Rect>
</Static>
<Static Name="StaticRowStripe1">
<Skin />
<Color>
<R>1</R>
<G>1</G>
<B>1</B>
<A>0.07</A>
</Color>
<Skin>ButtonTile</Skin>
<Color Name="ButtonMainColor" />
<Rect>
<X>100</X>
<Y>241</Y>
@@ -58,13 +48,8 @@
</Rect>
</Static>
<Static Name="StaticRowStripe3">
<Skin />
<Color>
<R>1</R>
<G>1</G>
<B>1</B>
<A>0.07</A>
</Color>
<Skin>ButtonTile</Skin>
<Color Name="ButtonMainColor" />
<Rect>
<X>100</X>
<Y>361</Y>
@@ -74,13 +59,8 @@
</Rect>
</Static>
<Static Name="StaticRowStripe5">
<Skin />
<Color>
<R>1</R>
<G>1</G>
<B>1</B>
<A>0.07</A>
</Color>
<Skin>ButtonTile</Skin>
<Color Name="ButtonMainColor" />
<Rect>
<X>100</X>
<Y>481</Y>
@@ -90,13 +70,8 @@
</Rect>
</Static>
<Static Name="StaticRowStripe7">
<Skin />
<Color>
<R>1</R>
<G>1</G>
<B>1</B>
<A>0.07</A>
</Color>
<Skin>ButtonTile</Skin>
<Color Name="ButtonMainColor" />
<Rect>
<X>100</X>
<Y>601</Y>
@@ -106,13 +81,8 @@
</Rect>
</Static>
<Static Name="StaticRowStripe9">
<Skin />
<Color>
<R>1</R>
<G>1</G>
<B>1</B>
<A>0.07</A>
</Color>
<Skin>ButtonTile</Skin>
<Color Name="ButtonMainColor" />
<Rect>
<X>100</X>
<Y>721</Y>
@@ -122,13 +92,8 @@
</Rect>
</Static>
<Static Name="StaticRowStripe11">
<Skin />
<Color>
<R>1</R>
<G>1</G>
<B>1</B>
<A>0.07</A>
</Color>
<Skin>ButtonTile</Skin>
<Color Name="ButtonMainColor" />
<Rect>
<X>100</X>
<Y>841</Y>
+17 -6
View File
@@ -266,6 +266,7 @@ namespace Vocaluxe.Screens
//Reset all values
_SelectingFastPlayerNr = 0;
_SelectingKeyboardActive = false;
_SelectingFast = false;
_NameSelections[_NameSelection].FastSelection(false, -1);
//Update Tiles-List
_NameSelections[_NameSelection].UpdateList();
@@ -363,7 +364,7 @@ namespace Vocaluxe.Screens
_SelectingFastPlayerNr = 6;
break;
default:
_UpdatePlayerNumber();
_UpdatePlayerNumberIfChanged();
break;
}
@@ -542,7 +543,7 @@ namespace Vocaluxe.Screens
}
else
{
_UpdatePlayerNumber();
_UpdatePlayerNumberIfChanged();
}
//Update Tiles-List
@@ -640,7 +641,7 @@ namespace Vocaluxe.Screens
{
if (_ProfilesChanged || _AvatarsChanged)
{
_LoadProfiles();
_LoadProfiles(false);
}
for (var i = 1; i <= CGame.NumPlayers; i++)
@@ -662,9 +663,10 @@ namespace Vocaluxe.Screens
{
base.OnShow();
CRecord.Start();
_HasPlayedWarningSound = false;
_NameSelections[_NameSelection].Init();
_LoadProfiles();
_LoadProfiles(true);
_SelectElement(_Buttons[_ButtonStart]);
}
@@ -689,7 +691,7 @@ namespace Vocaluxe.Screens
}
}
private void _LoadProfiles()
private void _LoadProfiles(bool initDuetParts)
{
_NameSelections[_NameSelection].UpdateList();
@@ -709,6 +711,7 @@ namespace Vocaluxe.Screens
_Texts[_TextPlayer[i]].Text = CProfiles.GetPlayerName(CGame.Players[i].ProfileId, i + 1);
if (CGame.GetNumSongs() == 1 && firstSong.IsDuet)
{
var duetPart = _SelectSlides[_SelectSlideDuetPlayer[i]].Selection;
_SelectSlides[_SelectSlideDuetPlayer[i]].Clear();
_SelectSlides[_SelectSlideDuetPlayer[i]].Visible = i + 1 <= CGame.NumPlayers;
@@ -717,7 +720,7 @@ namespace Vocaluxe.Screens
_SelectSlides[_SelectSlideDuetPlayer[i]].AddValue(firstSong.Notes.VoiceNames[j]);
}
_SelectSlides[_SelectSlideDuetPlayer[i]].Selection = i % 2;
_SelectSlides[_SelectSlideDuetPlayer[i]].Selection = initDuetParts || duetPart < 0 ? i % 2 : duetPart;
}
else
{
@@ -754,6 +757,14 @@ namespace Vocaluxe.Screens
_SelectSlides[_SelectSlidePlayerNumber].Selection = CConfig.Config.Game.NumPlayers - 1;
}
private void _UpdatePlayerNumberIfChanged()
{
if (_SelectSlides[_SelectSlidePlayerNumber].Selection + 1 != CConfig.Config.Game.NumPlayers)
{
_UpdatePlayerNumber();
}
}
private void _UpdatePlayerNumber()
{
CConfig.Config.Game.NumPlayers = _SelectSlides[_SelectSlidePlayerNumber].Selection + 1;
+327 -78
View File
@@ -36,12 +36,19 @@ namespace Vocaluxe.Screens
PlayerName
}
enum EProfilesPopup
{
None,
Delete,
UnsavedChanges
}
public class CScreenProfiles : CMenu
{
// Version number for theme files. Increment it, if you've changed something on the theme files!
protected override int _ScreenVersion
{
get { return 4; }
get { return 5; }
}
private const string _SelectSlideProfiles = "SelectSlideProfiles";
@@ -60,6 +67,11 @@ namespace Vocaluxe.Screens
private const string _ButtonTakeSnapshot = "ButtonTakeSnapshot";
private const string _NameSelection = "NameSelection";
private const string _StaticAvatar = "StaticAvatar";
private const string _StaticPopupBG = "StaticPopupBG";
private const string _TextPopup = "TextPopup";
private const string _ButtonPopupYes = "ButtonPopupYes";
private const string _ButtonPopupNo = "ButtonPopupNo";
private const string _ButtonPopupCancel = "ButtonPopupCancel";
private bool _ProfilesChanged;
private bool _AvatarsChanged;
private bool _SelectingKeyboardActive;
@@ -67,6 +79,9 @@ namespace Vocaluxe.Screens
private Dictionary<int, Guid> _SelectSlideGuids = new Dictionary<int, Guid>();
private EEditMode _EditMode;
private EProfilesPopup _Popup;
private bool _UnsavedChanges;
private string _NameBeforeEdit = string.Empty;
private CTextureRef _WebcamTexture;
private Bitmap _Snapshot;
@@ -76,9 +91,13 @@ namespace Vocaluxe.Screens
base.Init();
_ThemeButtons = new string[]
{ _ButtonPlayerName, _ButtonExit, _ButtonSave, _ButtonNew, _ButtonDelete, _ButtonWebcam, _ButtonSaveSnapshot, _ButtonDiscardSnapshot, _ButtonTakeSnapshot };
{
_ButtonPlayerName, _ButtonExit, _ButtonSave, _ButtonNew, _ButtonDelete, _ButtonWebcam, _ButtonSaveSnapshot, _ButtonDiscardSnapshot, _ButtonTakeSnapshot,
_ButtonPopupYes, _ButtonPopupNo, _ButtonPopupCancel
};
_ThemeSelectSlides = new string[] { _SelectSlideProfiles, _SelectSlideDifficulty, _SelectSlideAvatars, _SelectSlideUserRole, _SelectSlideActive };
_ThemeStatics = new string[] { _StaticAvatar };
_ThemeStatics = new string[] { _StaticAvatar, _StaticPopupBG };
_ThemeTexts = new string[] { _TextPopup };
_ThemeNameSelections = new string[] { _NameSelection };
_EditMode = EEditMode.None;
@@ -100,10 +119,18 @@ namespace Vocaluxe.Screens
_SelectSlides[_SelectSlideUserRole].SetValues<EUserRole>(0);
_SelectSlides[_SelectSlideActive].SetValues<EOffOn>(0);
_Statics[_StaticAvatar].Aspect = EAspect.Crop;
_NameSelections[_NameSelection].ShowInactive = true;
_ShowPopup(EProfilesPopup.None);
}
public override bool HandleInput(SKeyEvent keyEvent)
{
if (_Popup != EProfilesPopup.None)
{
_HandlePopupInput(keyEvent);
return true;
}
if (_SelectingKeyboardActive)
{
switch (keyEvent.Key)
@@ -163,6 +190,7 @@ namespace Vocaluxe.Screens
_SelectSlides[_SelectSlideProfiles].RenameValue(
CProfiles.AddGetPlayerName(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag), keyEvent.Unicode));
_ProfilesChanged = true;
_UnsavedChanges = true;
break;
}
}
@@ -173,11 +201,11 @@ namespace Vocaluxe.Screens
case Keys.Escape:
if (_EditMode == EEditMode.PlayerName)
{
_EditMode = EEditMode.None;
_EndNameEdit(true);
}
else
{
CGraphics.FadeTo(EScreen.Main);
_Leave();
}
break;
@@ -185,7 +213,7 @@ namespace Vocaluxe.Screens
case Keys.Enter:
if (_Buttons[_ButtonExit].Selected)
{
CGraphics.FadeTo(EScreen.Main);
_Leave();
}
else if (_Buttons[_ButtonSave].Selected)
{
@@ -197,18 +225,11 @@ namespace Vocaluxe.Screens
}
else if (_Buttons[_ButtonPlayerName].Selected)
{
if (CProfiles.NumProfiles > 0 && _EditMode != EEditMode.PlayerName)
{
_EditMode = EEditMode.PlayerName;
}
else
{
_EditMode = EEditMode.None;
}
_ToggleNameEdit();
}
else if (_Buttons[_ButtonDelete].Selected)
{
_DeleteProfile();
_RequestDeleteProfile();
}
else if (_Buttons[_ButtonWebcam].Selected)
{
@@ -230,44 +251,27 @@ namespace Vocaluxe.Screens
break;
case Keys.Back:
case Keys.Delete:
if (_EditMode == EEditMode.PlayerName)
{
_SelectSlides[_SelectSlideProfiles].RenameValue(
CProfiles.GetDeleteCharInPlayerName(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag)));
_ProfilesChanged = true;
_UnsavedChanges = true;
}
else if (keyEvent.Key == Keys.Delete)
{
_RequestDeleteProfile();
}
else
{
CGraphics.FadeTo(EScreen.Main);
_Leave();
}
break;
case Keys.Delete:
_DeleteProfile();
break;
}
if (_SelectSlides[_SelectSlideDifficulty].Selected)
{
CProfiles.SetDifficulty(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag),
(EGameDifficulty)_SelectSlides[_SelectSlideDifficulty].Selection);
}
else if (_SelectSlides[_SelectSlideAvatars].Selected)
{
CProfiles.SetAvatar(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag),
_SelectSlides[_SelectSlideAvatars].SelectedTag);
}
else if (_SelectSlides[_SelectSlideUserRole].Selected)
{
CProfiles.SetUserRoleProfile(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag),
(EUserRole)_SelectSlides[_SelectSlideUserRole].Selection);
}
else if (_SelectSlides[_SelectSlideActive].Selected)
{
CProfiles.SetActive(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag),
(EOffOn)_SelectSlides[_SelectSlideActive].Selection);
}
_ApplySelectSlideValues();
}
return true;
@@ -275,6 +279,12 @@ namespace Vocaluxe.Screens
public override bool HandleMouse(SMouseEvent mouseEvent)
{
if (_Popup != EProfilesPopup.None)
{
_HandlePopupMouse(mouseEvent);
return true;
}
if (_EditMode == EEditMode.None)
{
base.HandleMouse(mouseEvent);
@@ -293,7 +303,7 @@ namespace Vocaluxe.Screens
{
if (_Buttons[_ButtonExit].Selected)
{
CGraphics.FadeTo(EScreen.Main);
_Leave();
}
else if (_Buttons[_ButtonSave].Selected)
{
@@ -305,42 +315,16 @@ namespace Vocaluxe.Screens
}
else if (_Buttons[_ButtonDelete].Selected)
{
_DeleteProfile();
_RequestDeleteProfile();
}
else if (_Buttons[_ButtonPlayerName].Selected)
{
if (CProfiles.NumProfiles > 0 && _EditMode != EEditMode.PlayerName)
{
_EditMode = EEditMode.PlayerName;
}
else
{
_EditMode = EEditMode.None;
}
_ToggleNameEdit();
}
else if (_SelectSlides[_SelectSlideDifficulty].Selected)
else if (_SelectSlides[_SelectSlideDifficulty].Selected || _SelectSlides[_SelectSlideAvatars].Selected ||
_SelectSlides[_SelectSlideUserRole].Selected || _SelectSlides[_SelectSlideActive].Selected)
{
CProfiles.SetDifficulty(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag),
(EGameDifficulty)_SelectSlides[_SelectSlideDifficulty].Selection);
}
else if (_SelectSlides[_SelectSlideAvatars].Selected)
{
CProfiles.SetAvatar(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag),
_SelectSlides[_SelectSlideAvatars].SelectedTag);
if (CWebcam.IsDeviceAvailable() && _WebcamTexture != null)
{
_OnDiscardSnapshot();
}
}
else if (_SelectSlides[_SelectSlideUserRole].Selected)
{
CProfiles.SetUserRoleProfile(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag),
(EUserRole)_SelectSlides[_SelectSlideUserRole].Selection);
}
else if (_SelectSlides[_SelectSlideActive].Selected)
{
CProfiles.SetActive(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag),
(EOffOn)_SelectSlides[_SelectSlideActive].Selection);
_ApplySelectSlideValues();
}
else if (_Buttons[_ButtonWebcam].Selected)
{
@@ -362,7 +346,7 @@ namespace Vocaluxe.Screens
if (mouseEvent.RB)
{
CGraphics.FadeTo(EScreen.Main);
_Leave();
}
if (mouseEvent.Wheel != 0 && CHelper.IsInBounds(_NameSelections[_NameSelection].Rect, mouseEvent))
@@ -435,9 +419,260 @@ namespace Vocaluxe.Screens
base.OnClose();
_EditMode = EEditMode.None;
_SelectingKeyboardActive = false;
_ShowPopup(EProfilesPopup.None);
_OnDiscardSnapshot();
}
private void _Leave()
{
_EndNameEdit(false);
if (_UnsavedChanges)
{
_ShowPopup(EProfilesPopup.UnsavedChanges);
return;
}
CGraphics.FadeTo(EScreen.Main);
}
private void _DiscardChanges()
{
_UnsavedChanges = false;
CProfiles.LoadProfiles();
}
private void _ShowPopup(EProfilesPopup popup)
{
_Popup = popup;
var visible = popup != EProfilesPopup.None;
_Statics[_StaticPopupBG].Visible = visible;
_Texts[_TextPopup].Visible = visible;
_Buttons[_ButtonPopupYes].Visible = visible;
_Buttons[_ButtonPopupNo].Visible = popup == EProfilesPopup.UnsavedChanges;
_Buttons[_ButtonPopupCancel].Visible = visible;
switch (popup)
{
case EProfilesPopup.Delete:
var name = CProfiles.GetPlayerName(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag));
_Texts[_TextPopup].Text = CLanguage.Translate("TR_SCREENPROFILES_POPUP_DELETE").Replace("%s", name);
_SelectElement(_Buttons[_ButtonPopupCancel]);
break;
case EProfilesPopup.UnsavedChanges:
_Texts[_TextPopup].Text = CLanguage.Translate("TR_SCREENPROFILES_POPUP_UNSAVED");
_SelectElement(_Buttons[_ButtonPopupYes]);
break;
}
}
private List<string> _GetPopupButtons()
{
return new[] { _ButtonPopupYes, _ButtonPopupNo, _ButtonPopupCancel }.Where(name => _Buttons[name].Visible).ToList();
}
private void _HandlePopupInput(SKeyEvent keyEvent)
{
if (keyEvent.KeyPressed)
{
return;
}
var buttons = _GetPopupButtons();
var selected = buttons.FindIndex(name => _Buttons[name].Selected);
switch (keyEvent.Key)
{
case Keys.Left:
case Keys.Up:
_SelectElement(_Buttons[buttons[(selected - 1 + buttons.Count) % buttons.Count]]);
break;
case Keys.Right:
case Keys.Down:
case Keys.Tab:
_SelectElement(_Buttons[buttons[(selected + 1) % buttons.Count]]);
break;
case Keys.Escape:
case Keys.Back:
_ExecutePopupButton(_ButtonPopupCancel);
break;
case Keys.Enter:
_ExecutePopupButton(selected >= 0 ? buttons[selected] : _ButtonPopupCancel);
break;
}
}
private void _HandlePopupMouse(SMouseEvent mouseEvent)
{
foreach (var name in _GetPopupButtons())
{
if (!CHelper.IsInBounds(_Buttons[name].Rect, mouseEvent))
{
continue;
}
if (!_Buttons[name].Selected)
{
_SelectElement(_Buttons[name]);
}
if (mouseEvent.LB)
{
_ExecutePopupButton(name);
}
return;
}
if (mouseEvent.RB)
{
_ExecutePopupButton(_ButtonPopupCancel);
}
}
private void _ExecutePopupButton(string button)
{
var popup = _Popup;
_ShowPopup(EProfilesPopup.None);
if (popup == EProfilesPopup.Delete)
{
if (button == _ButtonPopupYes)
{
_DeleteProfile();
}
_SelectElement(_Buttons[_ButtonDelete]);
}
else if (popup == EProfilesPopup.UnsavedChanges)
{
if (button == _ButtonPopupCancel)
{
_SelectElement(_Buttons[_ButtonSave]);
return;
}
if (button == _ButtonPopupYes)
{
_SaveProfiles();
}
else
{
_DiscardChanges();
}
CGraphics.FadeTo(EScreen.Main);
}
}
private void _RequestDeleteProfile()
{
_EndNameEdit(false);
if (!CProfiles.IsProfileIdValid(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag)))
{
return;
}
_ShowPopup(EProfilesPopup.Delete);
}
private void _ToggleNameEdit()
{
if (_EditMode == EEditMode.PlayerName)
{
_EndNameEdit(false);
}
else
{
_StartNameEdit();
}
}
private void _StartNameEdit()
{
var id = _GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag);
if (!CProfiles.IsProfileIdValid(id))
{
return;
}
_NameBeforeEdit = CProfiles.GetPlayerName(id);
_EditMode = EEditMode.PlayerName;
}
private void _EndNameEdit(bool restore)
{
if (_EditMode != EEditMode.PlayerName)
{
return;
}
_EditMode = EEditMode.None;
var id = _GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag);
if (!restore && !string.IsNullOrWhiteSpace(CProfiles.GetPlayerName(id)))
{
return;
}
var name = string.IsNullOrWhiteSpace(_NameBeforeEdit) ? CProfiles.GetPlayerName(Guid.Empty) : _NameBeforeEdit;
CProfiles.SetPlayerName(id, name);
_SelectSlides[_SelectSlideProfiles].RenameValue(name);
_ProfilesChanged = true;
}
private void _ApplySelectSlideValues()
{
var id = _GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag);
if (!CProfiles.IsProfileIdValid(id))
{
return;
}
if (_SelectSlides[_SelectSlideDifficulty].Selected)
{
var difficulty = (EGameDifficulty)_SelectSlides[_SelectSlideDifficulty].Selection;
if (difficulty != CProfiles.GetDifficulty(id))
{
CProfiles.SetDifficulty(id, difficulty);
_UnsavedChanges = true;
}
}
else if (_SelectSlides[_SelectSlideAvatars].Selected)
{
var avatarId = _SelectSlides[_SelectSlideAvatars].SelectedTag;
if (avatarId != CProfiles.GetAvatarId(id))
{
CProfiles.SetAvatar(id, avatarId);
_UnsavedChanges = true;
if (_WebcamTexture != null || CWebcam.IsCapturing())
{
_ResetSnapshot();
}
}
}
else if (_SelectSlides[_SelectSlideUserRole].Selected)
{
var userRole = (EUserRole)_SelectSlides[_SelectSlideUserRole].Selection;
if (userRole != CProfiles.GetUserRoleProfile(id))
{
CProfiles.SetUserRoleProfile(id, userRole);
_UnsavedChanges = true;
}
}
else if (_SelectSlides[_SelectSlideActive].Selected)
{
var active = (EOffOn)_SelectSlides[_SelectSlideActive].Selection;
if (active != CProfiles.GetActive(id))
{
CProfiles.SetActive(id, active);
_UnsavedChanges = true;
_NameSelections[_NameSelection].UpdateList();
}
}
}
private void _OnProfileChanged(EProfileChangedFlags flags)
{
if (EProfileChangedFlags.Avatar == (EProfileChangedFlags.Avatar & flags))
@@ -484,14 +719,23 @@ namespace Vocaluxe.Screens
private void _OnDiscardSnapshot()
{
_ResetSnapshot();
_SelectElement(_Buttons[_ButtonWebcam]);
}
private void _ResetSnapshot()
{
if (CWebcam.IsCapturing())
{
CWebcam.Stop();
}
_Snapshot = null;
CDraw.RemoveTexture(ref _WebcamTexture);
_Buttons[_ButtonSaveSnapshot].Visible = false;
_Buttons[_ButtonDiscardSnapshot].Visible = false;
_Buttons[_ButtonTakeSnapshot].Visible = false;
_Buttons[_ButtonWebcam].Visible = CWebcam.IsDeviceAvailable();
_SelectElement(_Buttons[_ButtonWebcam]);
}
private void _OnSaveSnapshot()
@@ -509,6 +753,7 @@ namespace Vocaluxe.Screens
var id = CProfiles.NewAvatar(file);
CProfiles.SetAvatar(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag), id);
_UnsavedChanges = true;
_LoadAvatars(false);
_NameSelections[_NameSelection].UpdateList();
@@ -535,7 +780,7 @@ namespace Vocaluxe.Screens
private void _NewProfile()
{
_EditMode = EEditMode.None;
_EndNameEdit(false);
var id = CProfiles.NewProfile();
_LoadProfiles(false);
var num = CProfiles.NumProfiles;
@@ -546,20 +791,23 @@ namespace Vocaluxe.Screens
_NameSelections[_NameSelection].UpdateList();
_SelectElement(_Buttons[_ButtonPlayerName]);
_UnsavedChanges = true;
_NameBeforeEdit = string.Empty;
_EditMode = EEditMode.PlayerName;
}
private void _SaveProfiles()
{
_EditMode = EEditMode.None;
_EndNameEdit(false);
CProfiles.SaveProfiles();
_UnsavedChanges = false;
_LoadProfiles(true);
_NameSelections[_NameSelection].UpdateList();
}
private void _DeleteProfile()
{
_EditMode = EEditMode.None;
_EndNameEdit(false);
CProfiles.DeleteProfile(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag));
_SelectSlideGuids.Remove(_SelectSlides[_SelectSlideProfiles].SelectedTag);
@@ -660,6 +908,7 @@ namespace Vocaluxe.Screens
return;
}
_EndNameEdit(false);
var entry = _SelectSlideGuids.FirstOrDefault(x => x.Value.Equals(profileId));
if (_SelectSlideGuids.ContainsKey(entry.Key))
{
+171 -56
View File
@@ -39,7 +39,7 @@ 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 14; }
get { return 16; }
}
private struct STimeRect
@@ -57,6 +57,11 @@ namespace Vocaluxe.Screens
private const string _TextMedleyCountdown = "TextMedleyCountdown";
private const string _TextPauseSongName = "TextPauseSongName";
private const string _TextPauseVocalsVolume = "TextPauseVocalsVolume";
private const string _TextPauseArtist = "TextPauseArtist";
private const string _TextPauseTimeCurrent = "TextPauseTimeCurrent";
private const string _TextPauseTimeRemaining = "TextPauseTimeRemaining";
private const string _TextPauseName = "TextPauseNameP";
private const string _TextPauseScore = "TextPauseScoreP";
private string[,,] _TextScores;
private string[,,] _TextNames;
private List<string> _TextsPause;
@@ -75,6 +80,10 @@ namespace Vocaluxe.Screens
private const string _StaticLyricHelperDuet = "StaticLyricHelperDuet";
private const string _StaticLyricHelperTop = "StaticLyricHelperTop";
private const string _StaticCountdownRing = "StaticCountdownRing";
private const string _StaticPauseCover = "StaticPauseCover";
private const string _StaticPauseTimeLineProgress = "StaticPauseTimeLineProgress";
private const string _StaticPauseVocalsIcon = "StaticPauseVocalsIcon";
private const string _StaticPauseAvatar = "StaticPauseAvatarP";
private List<string> _StaticsPause;
private string[,,] _StaticScores;
@@ -89,6 +98,14 @@ namespace Vocaluxe.Screens
private const string _ButtonRestartGame = "ButtonRestartGame";
private const string _ButtonSkip = "ButtonSkip";
private static readonly string[] _PauseButtons = { _ButtonContinue, _ButtonSkip, _ButtonRestartRound, _ButtonRestartGame, _ButtonCancel };
private static readonly string[] _PauseIcons =
{ "StaticPauseIconContinue", "StaticPauseIconSkip", "StaticPauseIconRestartRound", "StaticPauseIconRestartGame", "StaticPauseIconCancel" };
private SRectF[] _PauseButtonSlots;
private SRectF[] _PauseIconOffsets;
private float _PauseTimeLineW;
private float _PauseVocalsIconOffset;
private const string _SelectSlidePauseVocalsVolume = "SelectSlidePauseVocalsVolume";
private List<string> _SelectSlidesPause;
@@ -261,6 +278,18 @@ namespace Vocaluxe.Screens
_SelectSlides[_SelectSlidePauseVocalsVolume].Selection = CConfig.VocalsVolume / 5;
_Statics[_StaticCountdownRing].Visible = false;
_PauseButtonSlots = _PauseButtons.Select(b => _Buttons[b].Rect).OrderBy(r => r.Y).ThenBy(r => r.X).ToArray();
_PauseIconOffsets = new SRectF[_PauseButtons.Length];
for (var i = 0; i < _PauseButtons.Length; i++)
{
var button = _Buttons[_PauseButtons[i]].Rect;
var icon = _Statics[_PauseIcons[i]].Rect;
_PauseIconOffsets[i] = new SRectF(icon.X - button.X, icon.Y - button.Y, icon.W, icon.H, icon.Z);
}
_PauseTimeLineW = _Statics[_StaticPauseTimeLineProgress].W;
_PauseVocalsIconOffset = _Statics[_StaticPauseVocalsIcon].X - _Texts[_TextPauseVocalsVolume].Rect.X;
//Automatically find statics and texts with pause prefix
foreach (var s in _Statics.Where(s => s.ThemeLoaded && s.GetThemeName().StartsWith("StaticPause")))
{
@@ -272,7 +301,7 @@ namespace Vocaluxe.Screens
_TextsPause.Add(t.GetThemeName());
}
foreach (var t in _Texts.Where(s => s.ThemeLoaded && s.GetThemeName().StartsWith("SelectSlidePause")))
foreach (var t in _SelectSlides.Where(s => s.ThemeLoaded && s.GetThemeName().StartsWith("SelectSlidePause")))
{
_SelectSlidesPause.Add(t.GetThemeName());
}
@@ -290,7 +319,7 @@ namespace Vocaluxe.Screens
_TogglePause();
if (_Pause)
{
_SelectElement(_Buttons[_ButtonCancel]);
_SelectElement(_Buttons[_ButtonContinue]);
}
break;
@@ -332,16 +361,16 @@ namespace Vocaluxe.Screens
break;
case Keys.S:
if (CGame.NumRounds > CGame.RoundNr)
if (keyEvent.ModCtrl)
{
if (keyEvent.ModCtrl)
if (CGame.NumRounds > CGame.RoundNr)
{
_NextSong();
}
}
else
{
_ShowInfoText(CBase.Language.Translate("TR_SCREENSING_NOMORESONGS"));
else
{
_ShowInfoText(CBase.Language.Translate("TR_SCREENSING_NOMORESONGS"));
}
}
break;
@@ -650,6 +679,7 @@ namespace Vocaluxe.Screens
else if (_StartDelayed)
{
_UpdateStartCountdown();
_UpdateRatingPopups();
return true;
}
@@ -1001,7 +1031,7 @@ namespace Vocaluxe.Screens
}
}
private void _UpdateDuetNames(CText textName, Stopwatch timer)
private void _UpdateDuetNames(CText textName, Stopwatch timer, CLyric lyric)
{
if (timer.IsRunning)
{
@@ -1029,7 +1059,7 @@ namespace Vocaluxe.Screens
timer.Stop();
}
}
else if (!timer.IsRunning && timer.ElapsedMilliseconds == 0 && _Lyrics[_LyricMainTop].Alpha > 0 && CGame.GetSong().IsDuet)
else if (!timer.IsRunning && timer.ElapsedMilliseconds == 0 && lyric.Alpha > 0 && CGame.GetSong().IsDuet)
{
timer.Start();
}
@@ -1047,42 +1077,9 @@ namespace Vocaluxe.Screens
}
//Timer for first duet-part
_UpdateDuetNames(_Texts[_TextDuetName1], _TimerDuetText1);
_UpdateDuetNames(_Texts[_TextDuetName1], _TimerDuetText1, _Lyrics[_LyricMainTop]);
//Timer for second duet-part
if (_TimerDuetText2.IsRunning)
{
var t = _TimerDuetText2.ElapsedMilliseconds / 1000f;
if (t < 10f)
{
_Texts[_TextDuetName2].Visible = true;
if (t < 3f)
{
_Texts[_TextDuetName2].Color.A = (3f - (3f - t)) / 3f;
}
else if (t < 7f)
{
_Texts[_TextDuetName2].Color.A = 1f;
}
else
{
_Texts[_TextDuetName2].Color.A = (3f - (t - 7f)) / 3f;
}
}
else
{
_Texts[_TextDuetName2].Visible = false;
_TimerDuetText2.Stop();
}
}
else if (!_TimerDuetText2.IsRunning && _TimerDuetText2.ElapsedMilliseconds == 0 && _Lyrics[_LyricMainDuet].Alpha > 0 && CGame.GetSong().IsDuet)
{
_TimerDuetText2.Start();
}
else
{
_Texts[_TextDuetName2].Visible = false;
}
_UpdateDuetNames(_Texts[_TextDuetName2], _TimerDuetText2, _Lyrics[_LyricMainDuet]);
}
private void _UpdateTimeLine()
@@ -1298,6 +1295,11 @@ namespace Vocaluxe.Screens
}
}
if (_Pause)
{
_UpdatePauseIconColors();
}
var pauseAnimation = _GetPauseAnimation(out var pauseAlpha, out var pauseScale);
if (pauseAnimation)
{
@@ -1457,14 +1459,28 @@ namespace Vocaluxe.Screens
_Texts[_TextMedleyCountdown].Text = string.Empty;
_Texts[_TextMedleyCountdown].Visible = true;
_SetPlayerInfoAlpha(0f);
return;
}
_StartSongNow();
}
private void _SetPlayerInfoAlpha(float alpha)
{
for (var p = 0; p < CGame.NumPlayers; p++)
{
_Statics[_PlayerStaticAvatar[p]].Alpha = alpha;
_Statics[_PlayerStaticScore[p]].Alpha = alpha;
_Texts[_PlayerTextName[p]].Alpha = alpha;
_Texts[_PlayerTextScore[p]].Alpha = alpha;
_ProgressBars[_PlayerProgressBarRating[p]].Alpha = alpha;
}
}
private void _StartSongNow()
{
_SetPlayerInfoAlpha(1f);
_PrepareTimeLine();
CSound.Play(_CurrentStream);
@@ -1625,7 +1641,7 @@ namespace Vocaluxe.Screens
_PauseAnimationBackgrounds.Clear();
_PauseAnimationElements.Clear();
_PauseAnimationBackgrounds.AddRange(_StaticsPause.Select(s => (IMenuElement)_Statics[s]).Where(s => s.Visible));
_PauseAnimationBackgrounds.AddRange(_StaticsPause.Select(s => (IMenuElement)_Statics[s]).Where(s => s.Visible && _IsFullScreen(s)));
var elements = new List<IMenuElement>
{
@@ -1636,9 +1652,89 @@ namespace Vocaluxe.Screens
_Buttons[_ButtonRestartRound],
_SelectSlides[_SelectSlidePauseVocalsVolume]
};
elements.AddRange(_StaticsPause.Select(s => (IMenuElement)_Statics[s]).Where(s => !_IsFullScreen(s)));
elements.AddRange(_SelectSlidesPause.Select(s => (IMenuElement)_SelectSlides[s]));
elements.AddRange(_TextsPause.Select(s => (IMenuElement)_Texts[s]));
_PauseAnimationElements.AddRange(elements.Distinct().Where(e => e.Visible));
_PauseAnimationElements.AddRange(elements.Distinct().Where(e => e.Visible).OrderByDescending(e => e.Rect.Z));
}
private static bool _IsFullScreen(IMenuElement element)
{
return element.Rect.W >= CSettings.RenderW && element.Rect.H >= CSettings.RenderH;
}
private void _ArrangePauseButtons()
{
var slot = 0;
for (var i = 0; i < _PauseButtons.Length; i++)
{
var button = _Buttons[_PauseButtons[i]];
var icon = _Statics[_PauseIcons[i]];
icon.Visible = button.Visible;
if (!button.Visible)
{
continue;
}
var rect = _PauseButtonSlots[slot++];
button.X = rect.X;
button.Y = rect.Y;
icon.X = rect.X + _PauseIconOffsets[i].X;
icon.Y = rect.Y + _PauseIconOffsets[i].Y;
}
}
private void _UpdatePauseIconColors()
{
for (var i = 0; i < _PauseButtons.Length; i++)
{
var text = _Buttons[_PauseButtons[i]].Text;
_Statics[_PauseIcons[i]].Color = text.Selected ? text.SelColor : text.Color;
}
}
private void _UpdatePauseInfo()
{
var song = CGame.GetSong();
if (song != null)
{
var endTime = Math.Abs(song.End) > 0.001 ? song.End : CSound.GetLength(_CurrentStream);
var length = endTime - song.Start;
var currentTime = Math.Max(0f, _CurrentTime - song.Start);
_Texts[_TextPauseTimeCurrent].Text = _FormatPauseTime(currentTime);
_Texts[_TextPauseTimeRemaining].Text = "-" + _FormatPauseTime(Math.Max(0f, endTime - _CurrentTime));
_Statics[_StaticPauseTimeLineProgress].W = length > 0f ? _PauseTimeLineW * Math.Min(1f, currentTime / length) : 0f;
}
for (var i = 0; i < CSettings.MaxNumPlayer; i++)
{
var avatar = _Statics[_StaticPauseAvatar + (i + 1)];
var name = _Texts[_TextPauseName + (i + 1)];
var score = _Texts[_TextPauseScore + (i + 1)];
var visible = i < CGame.NumPlayers && CProfiles.IsProfileIdValid(CGame.Players[i].ProfileId);
avatar.Visible = visible;
name.Visible = visible;
score.Visible = visible;
if (!visible)
{
continue;
}
avatar.Texture = CProfiles.GetAvatarTextureFromProfile(CGame.Players[i].ProfileId) ?? CBase.Themes.GetSkinTexture("NoAvatar", PartyModeId);
avatar.Aspect = EAspect.Crop;
name.Text = CProfiles.GetPlayerName(CGame.Players[i].ProfileId);
score.Text = CGame.Players[i].Points.ToString(CGame.Players[i].Points < 10000 ? "0000" : "00000");
score.Color = new SColorF(CBase.Themes.GetPlayerColor(i + 1), score.Color.A);
}
}
private static string _FormatPauseTime(float time)
{
var min = (int)Math.Floor(time / 60f);
var sec = (int)(time - min * 60f);
return min.ToString("00") + ":" + sec.ToString("00");
}
private void _SetPause(bool paused)
@@ -1676,6 +1772,14 @@ namespace Vocaluxe.Screens
_SelectSlides[_SelectSlidePauseVocalsVolume].Visible = _Pause && CGame.AudioMode == EAudioMode.TR_AUDIOMODE_VOCALS;
_Texts[_TextPauseVocalsVolume].Visible = _Pause && CGame.AudioMode == EAudioMode.TR_AUDIOMODE_VOCALS;
_Statics[_StaticPauseVocalsIcon].Visible = _Pause && CGame.AudioMode == EAudioMode.TR_AUDIOMODE_VOCALS;
if (_Pause)
{
_ArrangePauseButtons();
_UpdatePauseInfo();
_Statics[_StaticPauseVocalsIcon].X = _Texts[_TextPauseVocalsVolume].Rect.X + _PauseVocalsIconOffset;
}
if (pauseChanged && paused)
{
@@ -1731,8 +1835,13 @@ namespace Vocaluxe.Screens
CConfig.VocalsVolume = _SelectSlides[_SelectSlidePauseVocalsVolume].Selection * 5;
CConfig.SaveConfig();
CSound.SetStreamVolume(_CurrentStreamVocals, CConfig.VocalsVolume);
CSound.SetPosition(_CurrentStream, _PausePosition);
CSound.SetPosition(_CurrentStreamVocals, _PausePosition);
if (_PausePosition >= 0f)
{
CSound.SetPosition(_CurrentStream, _PausePosition);
CSound.SetPosition(_CurrentStreamVocals, _PausePosition);
_PausePosition = -1f;
}
// Start both streams simultaneously
CSound.Play(_CurrentStream);
CSound.Play(_CurrentStreamVocals);
@@ -1780,7 +1889,10 @@ namespace Vocaluxe.Screens
}
_Texts[_TextSongName].Text = songname;
_Texts[_TextPauseSongName].Text = songname;
_Texts[_TextPauseSongName].Text = rounds > 1 ? song.Title + " (" + CGame.RoundNr + "/" + rounds + ")" : song.Title;
_Texts[_TextPauseArtist].Text = song.Artist;
_Statics[_StaticPauseCover].Texture = song.CoverTextureSmall;
_Statics[_StaticPauseCover].Aspect = EAspect.Crop;
if (CGame.AudioMode == EAudioMode.TR_AUDIOMODE_INSTRUMENTAL || CGame.AudioMode == EAudioMode.TR_AUDIOMODE_KARAOKE)
{
@@ -1928,6 +2040,7 @@ namespace Vocaluxe.Screens
_CurrentStreamVocals = -1;
}
_PausePosition = -1f;
CRecord.Stop();
if (_CurrentVideo != null)
{
@@ -2091,10 +2204,11 @@ namespace Vocaluxe.Screens
_SingNotes[_SingBars].Visible = true;
}
_Texts[_PlayerTextName[player]].Visible = CConfig.Config.Theme.PlayerInfo == EPlayerInfo.TR_CONFIG_PLAYERINFO_BOTH ||
CConfig.Config.Theme.PlayerInfo == EPlayerInfo.TR_CONFIG_PLAYERINFO_NAME;
_Statics[_PlayerStaticAvatar[player]].Visible = CConfig.Config.Theme.PlayerInfo == EPlayerInfo.TR_CONFIG_PLAYERINFO_BOTH ||
CConfig.Config.Theme.PlayerInfo == EPlayerInfo.TR_CONFIG_PLAYERINFO_AVATAR;
var validProfile = CProfiles.IsProfileIdValid(CGame.Players[player].ProfileId);
_Texts[_PlayerTextName[player]].Visible = validProfile && (CConfig.Config.Theme.PlayerInfo == EPlayerInfo.TR_CONFIG_PLAYERINFO_BOTH ||
CConfig.Config.Theme.PlayerInfo == EPlayerInfo.TR_CONFIG_PLAYERINFO_NAME);
_Statics[_PlayerStaticAvatar[player]].Visible = validProfile && (CConfig.Config.Theme.PlayerInfo == EPlayerInfo.TR_CONFIG_PLAYERINFO_BOTH ||
CConfig.Config.Theme.PlayerInfo == EPlayerInfo.TR_CONFIG_PLAYERINFO_AVATAR);
}
_Lyrics[_LyricMain].Alpha = 0f;
@@ -2643,7 +2757,8 @@ namespace Vocaluxe.Screens
{
if (CProfiles.IsProfileIdValid(CGame.Players[i].ProfileId))
{
_Statics[_PlayerStaticAvatar[i]].Texture = CProfiles.GetAvatarTextureFromProfile(CGame.Players[i].ProfileId);
_Statics[_PlayerStaticAvatar[i]].Texture = CProfiles.GetAvatarTextureFromProfile(CGame.Players[i].ProfileId) ??
CBase.Themes.GetSkinTexture("NoAvatar", PartyModeId);
}
else
{
+6 -1
View File
@@ -28,7 +28,7 @@ namespace Vocaluxe.Screens
{
protected override int _ScreenVersion
{
get { return 1; }
get { return 2; }
}
private const int _NumTiles = 4;
@@ -191,6 +191,11 @@ namespace Vocaluxe.Screens
selection.Y = rect.Y;
selection.W = rect.W;
selection.H = rect.H;
for (var i = 0; i < _StaticTile.Length; i++)
{
_Statics[_StaticTile[i]].Visible = i != tile;
}
}
private void _OpenDetail()
+16 -1
View File
@@ -38,7 +38,7 @@ namespace Vocaluxe.Screens
{
protected override int _ScreenVersion
{
get { return 1; }
get { return 2; }
}
private sealed class CRow
@@ -76,6 +76,9 @@ namespace Vocaluxe.Screens
private float _MainColumnX;
private float _MainColumnW;
private float _ListLeft;
private float _FirstColumnX;
private float _FirstColumnW;
private EAlignment _FirstColumnAlign;
private readonly List<CRow> _Rows = new List<CRow>();
private string[] _Headers = new string[_NumColumns];
@@ -126,6 +129,9 @@ namespace Vocaluxe.Screens
_MainColumnX = _Texts[_TextCell[0, 1]].X;
_MainColumnW = _Texts[_TextCell[0, 1]].W;
_ListLeft = _Statics[_StaticRank[0]].X;
_FirstColumnX = _Texts[_TextCell[0, 0]].X;
_FirstColumnW = _Texts[_TextCell[0, 0]].W;
_FirstColumnAlign = _Texts[_TextCell[0, 0]].Align;
}
public override void OnShow()
@@ -405,6 +411,15 @@ namespace Vocaluxe.Screens
var mainX = string.IsNullOrEmpty(_Headers[0]) ? _ListLeft : _MainColumnX;
_Texts[_TextHeader[1]].X = mainX;
var dateColumn = Page == EStatisticsPage.Recent;
foreach (var text in Enumerable.Range(0, _NumRows).Select(r => _Texts[_TextCell[r, 0]]).Concat(new[] { _Texts[_TextHeader[0]] }))
{
text.Align = dateColumn ? EAlignment.Left : _FirstColumnAlign;
text.X = dateColumn ? _ListLeft : _FirstColumnX;
text.W = dateColumn ? _AvatarMainX - _ListLeft - 10 : _FirstColumnW;
}
for (var r = 0; r < _NumRows; r++)
{
_Texts[_TextCell[r, 1]].X = mainX;
+14 -1
View File
@@ -99,6 +99,9 @@ namespace VocaluxeLib.Menu
private readonly List<Guid> _VisibleProfiles;
private readonly List<Guid> _UsedProfiles;
private readonly HashSet<Guid> _InactiveProfiles = new HashSet<Guid>();
public bool ShowInactive;
private CStatic _PlayerSelector;
@@ -378,8 +381,10 @@ namespace VocaluxeLib.Menu
{
if (i + offset * _Theme.Tiles.NumW < _VisibleProfiles.Count)
{
var alpha = _InactiveProfiles.Contains(_VisibleProfiles[i + offset * _Theme.Tiles.NumW]) ? 0.4f : 1f;
_Tiles[i].Avatar.Texture = CBase.Profiles.GetAvatar(_VisibleProfiles[i + offset * _Theme.Tiles.NumW]);
_Tiles[i].Avatar.Color = new SColorF(1, 1, 1, 1);
_Tiles[i].Avatar.Color = new SColorF(1, 1, 1, alpha);
_Tiles[i].Name.Alpha = alpha;
_Tiles[i].Name.Text = CBase.Profiles.GetPlayerName(_VisibleProfiles[i + offset * _Theme.Tiles.NumW]);
_Tiles[i].ProfileId = _VisibleProfiles.ElementAt(i + offset * _Theme.Tiles.NumW);
}
@@ -387,6 +392,7 @@ namespace VocaluxeLib.Menu
{
_Tiles[i].Avatar.Texture = TextureEmptyTile;
_Tiles[i].Avatar.Color = _ColorEmptyTile;
_Tiles[i].Name.Alpha = 1f;
_Tiles[i].Name.Text = "";
_Tiles[i].ProfileId = Guid.Empty;
}
@@ -514,11 +520,18 @@ namespace VocaluxeLib.Menu
private void _UpdateVisibleProfiles()
{
_VisibleProfiles.Clear();
_InactiveProfiles.Clear();
var profiles = CBase.Profiles.GetProfiles();
foreach (var profile in profiles)
{
var visible = profile.Active == EOffOn.TR_CONFIG_ON;
if (!visible && ShowInactive)
{
visible = true;
_InactiveProfiles.Add(profile.Id);
}
if (visible)
{
if (_UsedProfiles.Contains(profile.Id) && (int)profile.UserRole >= (int)EUserRole.TR_USERROLE_NORMAL)