Redesign Party Mode Selection Screen and Main Screen (#917)

* Redesign party mode selection

- All party modes are shown at a glance as tiles with an icon and their name, sorted by their name
- The tiles look and behave like the theme buttons, the details of the selected mode (description, target audience, players, teams, microphones, author and version) are shown below
- Modes that need more microphones than configured are dimmed and can't be started
- Select with the arrow keys or the mouse, the arrow keys also reach the Start and Back buttons, a click on a tile starts it
- More than six modes are split into pages
- Icons for Challenge and Tic-Tac-Toe and a general icon for modes without their own
- Fixes the number of players shown for modes with a fixed number of players

* Highlight Sing and Party in the main menu

- Sing and Party are shown as two large buttons side by side above the other buttons
- Statistics, Profiles, Options and Exit stay in one row at the bottom
- Without a profile the missing profile warning takes the place of Sing and Party, because both are locked then, and looks like the other warnings
This commit is contained in:
McSchneidar authored and GitHub committed 2026-10-17 20:58:37 +02:00
1 parent e665e31f4a
commit aac5253862
20 files changed
+712 -339

No files matched your search

+1
View File
@@ -162,6 +162,7 @@
<string name="TR_SCREENPARTY_NOTEAMS">Keine Teams</string>
<string name="TR_SCREENPARTY_NUMTEAMS">Anzahl der Teams</string>
<string name="TR_SCREENPARTY_NUMPLAYERS">Anzahl der Spieler</string>
<string name="TR_SCREENPARTY_NUMMICS">Mikrofone</string>
<string name="TR_SCREENNAMES_MENU">Spielerauswahl</string>
<string name="TR_SCREENNAMES_PLAYER">Spieler</string>
<string name="TR_SCREENNAMES_1PLAYER">1 Spieler</string>
+1
View File
@@ -162,6 +162,7 @@
<string name="TR_SCREENPARTY_NOTEAMS">No teams</string>
<string name="TR_SCREENPARTY_NUMTEAMS">Number of teams</string>
<string name="TR_SCREENPARTY_NUMPLAYERS">Number of players</string>
<string name="TR_SCREENPARTY_NUMMICS">Microphones</string>
<string name="TR_SCREENNAMES_MENU">Player Selection</string>
<string name="TR_SCREENNAMES_PLAYER">Player</string>
<string name="TR_SCREENNAMES_1PLAYER">1 player</string>
@@ -8,6 +8,8 @@
<VersionMinor>1</VersionMinor>
</Info>
<Colors />
<Skins />
<Skins>
<PartyModeIcon>PartyModeIcon.png</PartyModeIcon>
</Skins>
<Videos />
</root>
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

@@ -8,6 +8,8 @@
<VersionMinor>1</VersionMinor>
</Info>
<Colors />
<Skins />
<Skins>
<PartyModeIcon>PartyModeIcon.png</PartyModeIcon>
</Skins>
<Videos />
</root>
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

@@ -1,5 +1,14 @@
ScreenMain
++++++++++
Version 5:
(2026 Oct 17)
Change:
ButtonSing and ButtonParty are larger, without reflection and placed side by side above the row of the other buttons
Positions of ButtonStatistics, ButtonProfiles, ButtonOptions and ButtonExit
StaticWarningProfiles and TextWarningProfiles look like the other warnings and take the place of ButtonSing and ButtonParty, because they are locked without a profile
++++++++++
Version 4:
(2026 Oct 16)
@@ -1,2 +1,30 @@
ScreenParty
+++++++++
Version 2:
(2026 Oct 17)
Add:
<StaticTile>
<StaticTileSelected>
<StaticTileIcon>
<StaticTileIconSelected>
<StaticDetailPanel>
<TextTileName>
<TextTileNameSelected>
<TextPage>
<TextDetailName>
<TextNumMics>
<TextPartyNumMics>
<ButtonPageUp>
<ButtonPageDown>
Remove:
<SelectSlideModes>
<TextPartyModes>
<TextPartyDescription>
<TextPartyTargetaudience>
<TextPartyVersion>
<TextVersion>
Change:
All party modes are shown as tiles with an icon, the details of the selected mode are shown below
@@ -335,6 +335,7 @@
<LogoMain>LogoMain.png</LogoMain>
<Menu>SongMenu.png</Menu>
<Button>Button.png</Button>
<ButtonTile>ButtonTile.png</ButtonTile>
<CoverTile>CoverTile.png</CoverTile>
<PlayerTile>PlayerTile.png</PlayerTile>
<CoverTextBackground>CoverTextBackground.png</CoverTextBackground>
@@ -370,6 +371,7 @@
<ToneHelper>ToneHelper.png</ToneHelper>
<Score>Score.png</Score>
<Star>Star.png</Star>
<PartyModeIcon>PartyModeIcon.png</PartyModeIcon>
<CountdownDot>CountdownDot.png</CountdownDot>
<NoAvatar>NoAvatar.png</NoAvatar>
<SongMenu>SongMenu.png</SongMenu>
+2
View File
@@ -335,6 +335,7 @@
<LogoMain>LogoMain.png</LogoMain>
<Menu>SongMenu.png</Menu>
<Button>Button.png</Button>
<ButtonTile>ButtonTile.png</ButtonTile>
<CoverTile>CoverTile.png</CoverTile>
<PlayerTile>PlayerTile.png</PlayerTile>
<CoverTextBackground>CoverTextBackground.png</CoverTextBackground>
@@ -370,6 +371,7 @@
<ToneHelper>ToneHelper.png</ToneHelper>
<Score>Score.png</Score>
<Star>Star.png</Star>
<PartyModeIcon>PartyModeIcon.png</PartyModeIcon>
<CountdownDot>CountdownDot.png</CountdownDot>
<NoAvatar>NoAvatar.png</NoAvatar>
<SongMenu>SongMenu.png</SongMenu>
+2
View File
@@ -335,6 +335,7 @@
<LogoMain>LogoMain.png</LogoMain>
<Menu>SongMenu.png</Menu>
<Button>Button.png</Button>
<ButtonTile>ButtonTile.png</ButtonTile>
<CoverTile>CoverTile.png</CoverTile>
<PlayerTile>PlayerTile.png</PlayerTile>
<CoverTextBackground>CoverTextBackground.png</CoverTextBackground>
@@ -370,6 +371,7 @@
<ToneHelper>ToneHelper.png</ToneHelper>
<Score>Score.png</Score>
<Star>Star.png</Star>
<PartyModeIcon>PartyModeIcon.png</PartyModeIcon>
<CountdownDot>CountdownDot.png</CountdownDot>
<NoAvatar>NoAvatar.png</NoAvatar>
<SongMenu>SongMenu.png</SongMenu>
+2
View File
@@ -335,6 +335,7 @@
<LogoMain>LogoMain.png</LogoMain>
<Menu>SongMenu.png</Menu>
<Button>Button.png</Button>
<ButtonTile>ButtonTile.png</ButtonTile>
<CoverTile>CoverTile.png</CoverTile>
<PlayerTile>PlayerTile.png</PlayerTile>
<CoverTextBackground>CoverTextBackground.png</CoverTextBackground>
@@ -370,6 +371,7 @@
<ToneHelper>ToneHelper.png</ToneHelper>
<Score>Score.png</Score>
<Star>Star.png</Star>
<PartyModeIcon>PartyModeIcon.png</PartyModeIcon>
<CountdownDot>CountdownDot.png</CountdownDot>
<NoAvatar>NoAvatar.png</NoAvatar>
<SongMenu>SongMenu.png</SongMenu>
+2
View File
@@ -335,6 +335,7 @@
<LogoMain>LogoMain.png</LogoMain>
<Menu>SongMenu.png</Menu>
<Button>Button.png</Button>
<ButtonTile>ButtonTile.png</ButtonTile>
<CoverTile>CoverTile.png</CoverTile>
<PlayerTile>PlayerTile.png</PlayerTile>
<CoverTextBackground>CoverTextBackground.png</CoverTextBackground>
@@ -370,6 +371,7 @@
<ToneHelper>ToneHelper.png</ToneHelper>
<Score>Score.png</Score>
<Star>Star.png</Star>
<PartyModeIcon>PartyModeIcon.png</PartyModeIcon>
<CountdownDot>CountdownDot.png</CountdownDot>
<NoAvatar>NoAvatar.png</NoAvatar>
<SongMenu>SongMenu.png</SongMenu>
+2
View File
@@ -335,6 +335,7 @@
<LogoMain>LogoMain.png</LogoMain>
<Menu>SongMenu.png</Menu>
<Button>Button.png</Button>
<ButtonTile>ButtonTile.png</ButtonTile>
<CoverTile>CoverTile.png</CoverTile>
<PlayerTile>PlayerTile.png</PlayerTile>
<CoverTextBackground>CoverTextBackground.png</CoverTextBackground>
@@ -370,6 +371,7 @@
<ToneHelper>ToneHelper.png</ToneHelper>
<Score>Score.png</Score>
<Star>Star.png</Star>
<PartyModeIcon>PartyModeIcon.png</PartyModeIcon>
<CountdownDot>CountdownDot.png</CountdownDot>
<NoAvatar>NoAvatar.png</NoAvatar>
<SongMenu>SongMenu.png</SongMenu>
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

@@ -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>4</ScreenVersion>
<ScreenVersion>5</ScreenVersion>
</Informations>
<Backgrounds>
<Background Name="Background1">
@@ -37,13 +37,13 @@
</Rect>
</Static>
<Static Name="StaticWarningProfiles">
<Skin>TextBG</Skin>
<Skin>Warning</Skin>
<Color Name="StaticWarningColor" />
<Rect>
<X>135</X>
<Y>915</Y>
<W>510</W>
<H>45</H>
<X>390</X>
<Y>767.5</Y>
<W>1140</W>
<H>75</H>
<Z>-1.9</Z>
</Rect>
</Static>
@@ -64,11 +64,11 @@
<Text>Vocaluxe "Shining Heaven" v0.3 (x64) Beta (0083)</Text>
</Text>
<Text Name="TextWarningProfiles">
<X>390</X>
<Y>918</Y>
<X>960</X>
<Y>787.5</Y>
<Z>-2</Z>
<H>40.5</H>
<MaxW>500</MaxW>
<H>37.5</H>
<MaxW>960</MaxW>
<Color Name="TextWarningColor" />
<SelColor Name="TextWarningColor" />
<Align>Center</Align>
@@ -83,20 +83,20 @@
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
<Rect>
<X>135</X>
<Y>900</Y>
<W>225</W>
<H>75</H>
<X>420</X>
<Y>750</Y>
<W>510</W>
<H>110</H>
<Z>0</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>112.5</X>
<Y>18</Y>
<X>255</X>
<Y>26</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>213</MaxW>
<H>58</H>
<MaxW>490</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
@@ -105,33 +105,25 @@
<Font>Outline</Font>
<Text>TR_SCREENMAIN_BUTTON_SING</Text>
</Text>
<Reflection>
<Height>39</Height>
<Space>15</Space>
</Reflection>
<SelReflection>
<Height>39</Height>
<Space>15</Space>
</SelReflection>
</Button>
<Button Name="ButtonParty">
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
<Rect>
<X>420</X>
<Y>900</Y>
<W>225</W>
<H>75</H>
<X>990</X>
<Y>750</Y>
<W>510</W>
<H>110</H>
<Z>0</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>112.5</X>
<Y>18</Y>
<X>255</X>
<Y>26</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>213</MaxW>
<H>58</H>
<MaxW>490</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
@@ -140,20 +132,12 @@
<Font>Outline</Font>
<Text>TR_SCREENMAIN_BUTTON_PARTY</Text>
</Text>
<Reflection>
<Height>39</Height>
<Space>15</Space>
</Reflection>
<SelReflection>
<Height>39</Height>
<Space>15</Space>
</SelReflection>
</Button>
<Button Name="ButtonStatistics">
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
<Rect>
<X>705</X>
<X>420</X>
<Y>900</Y>
<W>225</W>
<H>75</H>
@@ -223,7 +207,7 @@
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
<Rect>
<X>1275</X>
<X>705</X>
<Y>900</Y>
<W>225</W>
<H>75</H>
@@ -258,7 +242,7 @@
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
<Rect>
<X>1560</X>
<X>1275</X>
<Y>900</Y>
<W>225</W>
<H>75</H>
@@ -2,7 +2,7 @@
<Screen xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Informations>
<ScreenName>ScreenParty</ScreenName>
<ScreenVersion>1</ScreenVersion>
<ScreenVersion>2</ScreenVersion>
</Informations>
<Backgrounds>
<Background Name="Background1">
@@ -25,6 +25,61 @@
<Z>1</Z>
</Rect>
</Static>
<Static Name="StaticTile">
<Skin>ButtonTile</Skin>
<Color Name="ButtonMainColor" />
<Rect>
<X>170</X>
<Y>160</Y>
<W>500</W>
<H>250</H>
<Z>0.5</Z>
</Rect>
</Static>
<Static Name="StaticTileSelected">
<Skin>ButtonTile</Skin>
<Color Name="ButtonSelColor" />
<Rect>
<X>0</X>
<Y>0</Y>
<W>500</W>
<H>250</H>
<Z>0.5</Z>
</Rect>
</Static>
<Static Name="StaticTileIcon">
<Skin />
<Color Name="ButtonTextColor" />
<Rect>
<X>345</X>
<Y>182</Y>
<W>150</W>
<H>150</H>
<Z>0.4</Z>
</Rect>
</Static>
<Static Name="StaticTileIconSelected">
<Skin />
<Color Name="ButtonTextSelColor" />
<Rect>
<X>0</X>
<Y>0</Y>
<W>150</W>
<H>150</H>
<Z>0.4</Z>
</Rect>
</Static>
<Static Name="StaticDetailPanel">
<Skin>SongMenu</Skin>
<Color Name="StaticColorAlpha" />
<Rect>
<X>170</X>
<Y>720</Y>
<W>1580</W>
<H>190</H>
<Z>0.8</Z>
</Rect>
</Static>
</Statics>
<Texts>
<Text Name="TextTitle">
@@ -41,111 +96,46 @@
<Font>Outline</Font>
<Text>TR_SCREENPARTY_TITLE</Text>
</Text>
<Text Name="TextPartyModes">
<X>112.5</X>
<Y>160.5</Y>
<Text Name="TextTileName">
<X>420</X>
<Y>345</Y>
<Z>0</Z>
<H>0</H>
<MaxW>0</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<H>40</H>
<MaxW>470</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENPARTY_MODES</Text>
<Text />
</Text>
<Text Name="TextPartyDescription">
<X>112.5</X>
<Y>250.5</Y>
<Text Name="TextTileNameSelected">
<X>0</X>
<Y>0</Y>
<Z>0</Z>
<H>0</H>
<MaxW>0</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<H>40</H>
<MaxW>470</MaxW>
<Color Name="ButtonTextSelColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENPARTY_DESCRIPTION</Text>
<Text />
</Text>
<Text Name="TextPartyTargetaudience">
<X>112.5</X>
<Y>340.5</Y>
<Text Name="TextPage">
<X>960</X>
<Y>691</Y>
<Z>0</Z>
<H>0</H>
<H>24</H>
<MaxW>0</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENPARTY_TARGETAUDIENCE</Text>
</Text>
<Text Name="TextPartyNumTeams">
<X>742.5</X>
<Y>580.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_SCREENPARTY_NUMTEAMS</Text>
</Text>
<Text Name="TextPartyNumPlayers">
<X>742.5</X>
<Y>670.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_SCREENPARTY_NUMPLAYERS</Text>
</Text>
<Text Name="TextPartyAuthor">
<X>112.5</X>
<Y>610.5</Y>
<Z>0</Z>
<H>0</H>
<MaxW>0</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENPARTY_AUTHOR</Text>
</Text>
<Text Name="TextPartyVersion">
<X>112.5</X>
<Y>700.5</Y>
<Z>0</Z>
<H>0</H>
<MaxW>0</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENPARTY_VERSION</Text>
</Text>
<Text Name="TextDescription">
<X>975</X>
<Y>400.5</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>900</MaxW>
<Color Name="TextColor" />
<Color>
<R>0.75</R>
<G>0.78</G>
<B>0.85</B>
<A>1</A>
</Color>
<SelColor Name="TextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
@@ -153,98 +143,212 @@
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextDetailName">
<X>200</X>
<Y>742</Y>
<Z>0</Z>
<H>40</H>
<MaxW>1000</MaxW>
<Color Name="ButtonSelColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextDescription">
<X>200</X>
<Y>790</Y>
<Z>0</Z>
<H>30</H>
<MaxW>1000</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Normal</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextTargetAudience">
<X>975</X>
<Y>490.5</Y>
<X>200</X>
<Y>832</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>900</MaxW>
<Color Name="TextColor" />
<H>28</H>
<MaxW>1000</MaxW>
<Color>
<R>0.75</R>
<G>0.78</G>
<B>0.85</B>
<A>1</A>
</Color>
<SelColor Name="TextSelColor" />
<Align>Center</Align>
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextNumTeams">
<X>1155</X>
<Y>580.5</Y>
<Z>0</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>
<Text Name="TextNumPlayers">
<X>1155</X>
<Y>670.5</Y>
<Z>0</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>
<Text Name="TextAuthor">
<X>1275</X>
<Y>610.5</Y>
<Z>0</Z>
<H>0</H>
<MaxW>900</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextVersion">
<X>1275</X>
<Y>700.5</Y>
<Z>0</Z>
<H>0</H>
<MaxW>900</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Style>Normal</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextError">
<X>1275</X>
<Y>790.5</Y>
<X>200</X>
<Y>868</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>900</MaxW>
<Color Name="TextWarningColor" />
<H>28</H>
<MaxW>1000</MaxW>
<Color>
<R>1</R>
<G>0.45</G>
<B>0.45</B>
<A>1</A>
</Color>
<SelColor Name="TextSelColor" />
<Align>Center</Align>
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENPARTY_ERROR</Text>
</Text>
<Text Name="TextPartyNumPlayers">
<X>1480</X>
<Y>742</Y>
<Z>0</Z>
<H>28</H>
<MaxW>280</MaxW>
<Color>
<R>0.75</R>
<G>0.78</G>
<B>0.85</B>
<A>1</A>
</Color>
<SelColor Name="TextSelColor" />
<Align>Right</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Normal</Style>
<Font>Outline</Font>
<Text>TR_SCREENPARTY_NUMPLAYERS</Text>
</Text>
<Text Name="TextNumPlayers">
<X>1500</X>
<Y>742</Y>
<Z>0</Z>
<H>28</H>
<MaxW>235</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextPartyNumTeams">
<X>1480</X>
<Y>780</Y>
<Z>0</Z>
<H>28</H>
<MaxW>280</MaxW>
<Color>
<R>0.75</R>
<G>0.78</G>
<B>0.85</B>
<A>1</A>
</Color>
<SelColor Name="TextSelColor" />
<Align>Right</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Normal</Style>
<Font>Outline</Font>
<Text>TR_SCREENPARTY_NUMTEAMS</Text>
</Text>
<Text Name="TextNumTeams">
<X>1500</X>
<Y>780</Y>
<Z>0</Z>
<H>28</H>
<MaxW>235</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextPartyNumMics">
<X>1480</X>
<Y>818</Y>
<Z>0</Z>
<H>28</H>
<MaxW>280</MaxW>
<Color>
<R>0.75</R>
<G>0.78</G>
<B>0.85</B>
<A>1</A>
</Color>
<SelColor Name="TextSelColor" />
<Align>Right</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Normal</Style>
<Font>Outline</Font>
<Text>TR_SCREENPARTY_NUMMICS</Text>
</Text>
<Text Name="TextNumMics">
<X>1500</X>
<Y>818</Y>
<Z>0</Z>
<H>28</H>
<MaxW>235</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
<Text Name="TextPartyAuthor">
<X>1480</X>
<Y>856</Y>
<Z>0</Z>
<H>28</H>
<MaxW>280</MaxW>
<Color>
<R>0.75</R>
<G>0.78</G>
<B>0.85</B>
<A>1</A>
</Color>
<SelColor Name="TextSelColor" />
<Align>Right</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Normal</Style>
<Font>Outline</Font>
<Text>TR_SCREENPARTY_AUTHOR</Text>
</Text>
<Text Name="TextAuthor">
<X>1500</X>
<Y>856</Y>
<Z>0</Z>
<H>28</H>
<MaxW>235</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text />
</Text>
</Texts>
<Buttons>
<Button Name="ButtonStart">
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
<Rect>
<X>1477.5</X>
<Y>900</Y>
<X>1545</X>
<Y>945</Y>
<W>225</W>
<H>75</H>
<Z>0</Z>
@@ -278,8 +382,8 @@
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
<Rect>
<X>217.5</X>
<Y>900</Y>
<X>150</X>
<Y>945</Y>
<W>225</W>
<H>75</H>
<Z>0</Z>
@@ -309,53 +413,64 @@
<Space>15</Space>
</SelReflection>
</Button>
<Button Name="ButtonPageUp">
<Skin>ScrollUp</Skin>
<SkinSelected>ScrollUp</SkinSelected>
<Rect>
<X>1775</X>
<Y>170</Y>
<W>60</W>
<H>32</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 />
</Text>
</Button>
<Button Name="ButtonPageDown">
<Skin>ScrollDown</Skin>
<SkinSelected>ScrollDown</SkinSelected>
<Rect>
<X>1775</X>
<Y>648</Y>
<W>60</W>
<H>32</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 />
</Text>
</Button>
</Buttons>
<SongMenus />
<Lyrics />
<SelectSlides>
<SelectSlide Name="SelectSlideModes">
<Skin />
<SkinArrowLeft>SelectSlideArrowLeft</SkinArrowLeft>
<SkinArrowRight>SelectSlideArrowRight</SkinArrowRight>
<SkinSelected>SelectSlide</SkinSelected>
<SkinArrowLeftSelected>SelectSlideArrowLeft</SkinArrowLeftSelected>
<SkinArrowRightSelected>SelectSlideArrowRight</SkinArrowRightSelected>
<Rect>
<X>450</X>
<Y>300</Y>
<W>1072.5</W>
<H>75</H>
<Z>0</Z>
</Rect>
<RectArrowLeft>
<X>457.5</X>
<Y>307.5</Y>
<W>60</W>
<H>60</H>
<Z>0</Z>
</RectArrowLeft>
<RectArrowRight>
<X>1455</X>
<Y>307.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="TextColor" />
<TextSelColor Name="TextColor" />
<TextH>81</TextH>
<TextRelativeX>75</TextRelativeX>
<TextRelativeY>0</TextRelativeY>
<TextMaxW>900</TextMaxW>
<TextFont>Outline</TextFont>
<TextStyle>Bold</TextStyle>
<NumVisible>1</NumVisible>
</SelectSlide>
</SelectSlides>
<SelectSlides />
<SingNotes />
<NameSelections />
<Equalizers />
+3 -1
View File
@@ -27,7 +27,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 4; }
get { return 5; }
}
private const string _ButtonSing = "ButtonSing";
@@ -206,6 +206,8 @@ namespace Vocaluxe.Screens
_Texts[_TextWarningProfiles].Visible = !profileOK;
_Buttons[_ButtonSing].Selectable = profileOK;
_Buttons[_ButtonParty].Selectable = profileOK;
_Buttons[_ButtonSing].Visible = profileOK;
_Buttons[_ButtonParty].Visible = profileOK;
if (_Texts[_TextWarningProfiles].Visible && !_HasPlayedWarningSound)
{
+297 -80
View File
@@ -15,9 +15,11 @@
// along with Vocaluxe. If not, see <http://www.gnu.org/licenses/>.
#endregion
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Vocaluxe.Base;
using Vocaluxe.Base.ThemeSystem;
using VocaluxeLib;
using VocaluxeLib.Menu;
@@ -25,70 +27,182 @@ namespace Vocaluxe.Screens
{
public class CScreenParty : CMenu
{
private class CModeTile
{
public CStatic Box;
public CStatic Icon;
public CText Name;
}
// Version number for theme files. Increment it, if you've changed something on the theme files!
protected override int _ScreenVersion
{
get { return 1; }
get { return 2; }
}
private const string _TextDetailName = "TextDetailName";
private const string _TextDescription = "TextDescription";
private const string _TextTargetAudience = "TextTargetAudience";
private const string _TextNumTeams = "TextNumTeams";
private const string _TextNumPlayers = "TextNumPlayers";
private const string _TextNumMics = "TextNumMics";
private const string _TextAuthor = "TextAuthor";
private const string _TextVersion = "TextVersion";
private const string _TextError = "TextError";
private const string _TextTileName = "TextTileName";
private const string _TextTileNameSelected = "TextTileNameSelected";
private const string _TextPage = "TextPage";
private const string _StaticTile = "StaticTile";
private const string _StaticTileSelected = "StaticTileSelected";
private const string _StaticTileIcon = "StaticTileIcon";
private const string _StaticTileIconSelected = "StaticTileIconSelected";
private const string _ButtonStart = "ButtonStart";
private const string _ButtonExit = "ButtonExit";
private const string _SelectSlideModes = "SelectSlideModes";
private const string _ButtonPageUp = "ButtonPageUp";
private const string _ButtonPageDown = "ButtonPageDown";
private const string _SkinPartyModeIcon = "PartyModeIcon";
private const int _NumColumns = 3;
private const int _NumRows = 2;
private const int _TilesPerPage = _NumColumns * _NumRows;
private const float _TileSpaceX = 40f;
private const float _TileSpaceY = 30f;
private const float _UnavailableAlpha = 0.4f;
private List<SPartyModeInfos> _PartyModeInfos;
private readonly List<CModeTile> _Tiles = new List<CModeTile>();
private int _Selected;
private bool _OnButtons;
public override void Init()
{
base.Init();
_ThemeTexts = new string[] { _TextDescription, _TextTargetAudience, _TextNumTeams, _TextNumPlayers, _TextAuthor, _TextVersion, _TextError };
_ThemeButtons = new string[] { _ButtonStart, _ButtonExit };
_ThemeSelectSlides = new string[] { _SelectSlideModes };
_ThemeTexts = new string[]
{
_TextDetailName, _TextDescription, _TextTargetAudience, _TextNumTeams, _TextNumPlayers, _TextNumMics, _TextAuthor, _TextError, _TextTileName,
_TextTileNameSelected, _TextPage
};
_ThemeStatics = new string[] { _StaticTile, _StaticTileSelected, _StaticTileIcon, _StaticTileIconSelected };
_ThemeButtons = new string[] { _ButtonStart, _ButtonExit, _ButtonPageUp, _ButtonPageDown };
}
public override void LoadTheme(string xmlPath)
{
base.LoadTheme(xmlPath);
_Tiles.Clear();
var box = _Statics[_StaticTile].Rect;
var icon = _Statics[_StaticTileIcon].Rect;
for (var i = 0; i < _TilesPerPage; i++)
{
var x = box.X + (i % _NumColumns) * (box.W + _TileSpaceX);
var y = box.Y + (i / _NumColumns) * (box.H + _TileSpaceY);
var tile = new CModeTile
{
Box = GetNewStatic(_Statics[_StaticTile]),
Icon = GetNewStatic(_Statics[_StaticTileIcon]),
Name = GetNewText(_Texts[_TextTileName])
};
tile.Box.MaxRect = new SRectF(x, y, box.W, box.H, box.Z);
tile.Icon.MaxRect = new SRectF(x + icon.X - box.X, y + icon.Y - box.Y, icon.W, icon.H, icon.Z);
tile.Name.X = x + _Texts[_TextTileName].X - box.X;
tile.Name.Y = y + _Texts[_TextTileName].Y - box.Y;
_AddStatic(tile.Box);
_AddStatic(tile.Icon);
_AddText(tile.Name);
_Tiles.Add(tile);
}
_Statics[_StaticTile].Visible = false;
_Statics[_StaticTileSelected].Visible = false;
_Statics[_StaticTileIcon].Visible = false;
_Statics[_StaticTileIconSelected].Visible = false;
_Texts[_TextTileName].Visible = false;
_Texts[_TextTileNameSelected].Visible = false;
}
public override bool HandleInput(SKeyEvent keyEvent)
{
base.HandleInput(keyEvent);
if (keyEvent.KeyPressed) { }
else
if (keyEvent.Key != Keys.Left && keyEvent.Key != Keys.Right && keyEvent.Key != Keys.Up && keyEvent.Key != Keys.Down && keyEvent.Key != Keys.Tab)
{
switch (keyEvent.Key)
{
case Keys.Back:
case Keys.Escape:
base.HandleInput(keyEvent);
}
if (keyEvent.KeyPressed)
{
return true;
}
switch (keyEvent.Key)
{
case Keys.Back:
case Keys.Escape:
CGraphics.FadeTo(EScreen.Main);
break;
case Keys.Enter:
if (_OnButtons && _Buttons[_ButtonExit].Selected)
{
CGraphics.FadeTo(EScreen.Main);
break;
}
else
{
_StartPartyMode();
}
case Keys.Enter:
if (_Buttons[_ButtonStart].Selected)
break;
case Keys.Left:
case Keys.Right:
if (_OnButtons)
{
_SwitchButton();
}
else
{
_Select(_Selected + (keyEvent.Key == Keys.Left ? -1 : 1));
}
break;
case Keys.Up:
if (_OnButtons)
{
_FocusTiles();
}
else
{
_Select(_Selected - _NumColumns);
}
break;
case Keys.Down:
if (!_OnButtons)
{
if (_Selected + _NumColumns < _PartyModeInfos.Count)
{
_StartPartyMode();
_Select(_Selected + _NumColumns);
}
if (_Buttons[_ButtonExit].Selected)
else
{
CGraphics.FadeTo(EScreen.Main);
_FocusButtons();
}
}
break;
break;
case Keys.Left:
case Keys.Right:
if (_SelectSlides[_SelectSlideModes].Selected)
{
_UpdateSelection();
}
case Keys.Tab:
if (_OnButtons)
{
_SwitchButton();
}
else
{
_FocusButtons();
}
break;
}
break;
}
return true;
@@ -97,22 +211,57 @@ namespace Vocaluxe.Screens
public override bool HandleMouse(SMouseEvent mouseEvent)
{
base.HandleMouse(mouseEvent);
if (mouseEvent.LB && _IsMouseOverCurSelection(mouseEvent))
if (!_OnButtons && (_Buttons[_ButtonStart].Selected || _Buttons[_ButtonExit].Selected))
{
if (_Buttons[_ButtonStart].Selected)
_OnButtons = true;
_UpdateTiles();
}
var first = _GetPage() * _TilesPerPage;
for (var i = 0; i < _Tiles.Count && first + i < _PartyModeInfos.Count; i++)
{
if (!CHelper.IsInBounds(_Tiles[i].Box.Rect, mouseEvent))
{
continue;
}
if (_OnButtons || first + i != _Selected)
{
_FocusTiles();
_Select(first + i);
}
if (mouseEvent.LB)
{
_StartPartyMode();
}
if (_Buttons[_ButtonExit].Selected)
{
CGraphics.FadeTo(EScreen.Main);
}
return true;
}
if (_SelectSlides[_SelectSlideModes].Selected)
if (mouseEvent.LB)
{
if (_IsMouseOverCurSelection(mouseEvent))
{
_UpdateSelection();
if (_Buttons[_ButtonStart].Selected)
{
_StartPartyMode();
}
if (_Buttons[_ButtonExit].Selected)
{
CGraphics.FadeTo(EScreen.Main);
}
if (_Buttons[_ButtonPageUp].Selected)
{
_Select((_GetPage() - 1) * _TilesPerPage);
}
if (_Buttons[_ButtonPageDown].Selected)
{
_Select((_GetPage() + 1) * _TilesPerPage);
}
}
}
@@ -127,19 +276,10 @@ namespace Vocaluxe.Screens
public override void OnShow()
{
base.OnShow();
_PartyModeInfos = CParty.GetPartyModeInfos();
_SelectSlides[_SelectSlideModes].Clear();
foreach (var info in _PartyModeInfos)
{
_SelectSlides[_SelectSlideModes].AddValue(info.Name, info.ExtInfo.Id);
}
_SelectSlides[_SelectSlideModes].Selection = 0;
_UpdateSelection();
_SelectElement(_SelectSlides[_SelectSlideModes]);
_PartyModeInfos.Sort((a, b) => string.Compare(CLanguage.Translate(a.Name, a.ExtInfo.Id), CLanguage.Translate(b.Name, b.ExtInfo.Id), StringComparison.CurrentCultureIgnoreCase));
_Select(Math.Min(_Selected, Math.Max(0, _PartyModeInfos.Count - 1)));
_FocusTiles();
}
public override bool UpdateGame()
@@ -147,25 +287,114 @@ namespace Vocaluxe.Screens
return true;
}
private void _UpdateSelection()
private void _FocusTiles()
{
if (_PartyModeInfos.Count == 0)
_OnButtons = false;
_Buttons[_ButtonStart].Selected = false;
_Buttons[_ButtonExit].Selected = false;
_UpdateTiles();
}
private void _FocusButtons()
{
_OnButtons = true;
_SelectElement(_Buttons[_ButtonStart].Visible ? _Buttons[_ButtonStart] : _Buttons[_ButtonExit]);
_UpdateTiles();
}
private void _SwitchButton()
{
if (_Buttons[_ButtonStart].Selected || !_Buttons[_ButtonStart].Visible)
{
_SelectElement(_Buttons[_ButtonExit]);
}
else
{
_SelectElement(_Buttons[_ButtonStart]);
}
}
private int _GetPage()
{
return _Selected / _TilesPerPage;
}
private int _GetNumPages()
{
return Math.Max(1, (_PartyModeInfos.Count + _TilesPerPage - 1) / _TilesPerPage);
}
private static bool _IsPlayable(SPartyModeInfos info)
{
return CConfig.GetMaxNumMics() >= info.ExtInfo.MinMics;
}
private void _Select(int index)
{
if (_PartyModeInfos == null || _PartyModeInfos.Count == 0)
{
_Selected = 0;
return;
}
var index = _SelectSlides[_SelectSlideModes].Selection;
if (index >= _PartyModeInfos.Count)
_Selected = Math.Max(0, Math.Min(_PartyModeInfos.Count - 1, index));
_UpdateTiles();
_UpdateSelection();
}
private void _UpdateTiles()
{
var page = _GetPage();
var first = page * _TilesPerPage;
for (var i = 0; i < _Tiles.Count; i++)
{
index = 0;
_SelectSlides[_SelectSlideModes].Selection = 0;
var tile = _Tiles[i];
var index = first + i;
var visible = index < _PartyModeInfos.Count;
tile.Box.Visible = visible;
tile.Icon.Visible = visible;
tile.Name.Visible = visible;
if (!visible)
{
continue;
}
var info = _PartyModeInfos[index];
var selected = index == _Selected && !_OnButtons;
var alpha = _IsPlayable(info) ? 1f : _UnavailableAlpha;
tile.Icon.Texture = CThemes.GetSkinTexture(_SkinPartyModeIcon, info.ExtInfo.Id);
tile.Name.TranslationId = info.ExtInfo.Id;
tile.Name.Text = info.Name;
var iconColor = selected ? _Statics[_StaticTileIconSelected].Color : _Statics[_StaticTileIcon].Color;
var nameColor = selected ? _Texts[_TextTileNameSelected].Color : _Texts[_TextTileName].Color;
var boxTheme = selected ? _Statics[_StaticTileSelected] : _Statics[_StaticTile];
var boxColor = boxTheme.Color;
tile.Box.Texture = boxTheme.Texture;
tile.Icon.Color = new SColorF(iconColor.R, iconColor.G, iconColor.B, iconColor.A * alpha);
tile.Name.Color = new SColorF(nameColor.R, nameColor.G, nameColor.B, nameColor.A * alpha);
tile.Box.Color = new SColorF(boxColor.R, boxColor.G, boxColor.B, boxColor.A * alpha);
}
//Description
var infos = _PartyModeInfos[index];
var numPages = _GetNumPages();
_Buttons[_ButtonPageUp].Visible = page > 0;
_Buttons[_ButtonPageDown].Visible = page < numPages - 1;
_Texts[_TextPage].Visible = numPages > 1;
_Texts[_TextPage].Text = (page + 1) + " / " + numPages;
}
private void _UpdateSelection()
{
var infos = _PartyModeInfos[_Selected];
var extInfo = infos.ExtInfo;
_Texts[_TextDescription].Text = infos.Description;
_Texts[_TextDetailName].TranslationId = extInfo.Id;
_Texts[_TextDetailName].Text = infos.Name;
//Description
_Texts[_TextDescription].TranslationId = extInfo.Id;
_Texts[_TextDescription].Text = infos.Description;
//TargetAudience
_Texts[_TextTargetAudience].TranslationId = extInfo.Id;
@@ -188,22 +417,19 @@ namespace Vocaluxe.Screens
//NumPlayers
if (extInfo.MaxPlayers == extInfo.MinPlayers)
{
_Texts[_TextNumPlayers].Text = extInfo.MaxTeams.ToString();
_Texts[_TextNumPlayers].Text = extInfo.MaxPlayers.ToString();
}
else
{
_Texts[_TextNumPlayers].Text = extInfo.MinPlayers + " - " + extInfo.MaxPlayers;
}
_Texts[_TextNumMics].Text = extInfo.MinMics.ToString();
//Author
_Texts[_TextAuthor].Text = infos.Author;
_Texts[_TextAuthor].TranslationId = extInfo.Id;
_Texts[_TextAuthor].Text = CLanguage.Translate(infos.Author, extInfo.Id) + " · " + infos.VersionMajor + "." + infos.VersionMinor;
//Version
_Texts[_TextVersion].Text = infos.VersionMajor + "." + infos.VersionMinor;
_Texts[_TextVersion].TranslationId = extInfo.Id;
if (CConfig.GetMaxNumMics() < extInfo.MinMics)
if (!_IsPlayable(infos))
{
_Buttons[_ButtonStart].Visible = false;
_Texts[_TextError].Text = CConfig.GetMaxNumMics() == 0
@@ -219,22 +445,13 @@ namespace Vocaluxe.Screens
private void _StartPartyMode()
{
if (_PartyModeInfos.Count == 0)
if (_PartyModeInfos.Count == 0 || _Selected >= _PartyModeInfos.Count || !_IsPlayable(_PartyModeInfos[_Selected]))
{
return;
}
var index = _SelectSlides[_SelectSlideModes].Selection;
if (index >= _PartyModeInfos.Count)
{
_Buttons[_ButtonStart].Visible = false;
_Texts[_TextError].Text = "TR_SCREENPARTY_ERROR";
_Texts[_TextError].Visible = true;
return;
}
CParty.SetPartyMode(_PartyModeInfos[index].ExtInfo.Id);
CParty.SetPartyMode(_PartyModeInfos[_Selected].ExtInfo.Id);
CGraphics.FadeTo(CParty.GetStartScreen());
}
}
}
}