From aac5253862dd2bf02e8b8dd0e8d05f554c9af150 Mon Sep 17 00:00:00 2001 From: McSchneidar <262792195+McSchneidar@users.noreply.github.com> Date: Sat, 17 Oct 2026 20:58:37 +0200 Subject: [PATCH] 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 --- Output/Languages/de.xml | 1 + Output/Languages/en.xml | 1 + .../Challenge/Themes/Default/Default.xml | 4 +- .../Themes/Default/PartyModeIcon.png | Bin 0 -> 5693 bytes .../TicTacToe/Themes/Default/Default.xml | 4 +- .../Themes/Default/PartyModeIcon.png | Bin 0 -> 6972 bytes .../Themes/Changelog/Changelog_ScreenMain.txt | 9 + .../Changelog/Changelog_ScreenParty.txt | 28 + Output/Themes/Vocaluxe 2024/01_Standard.xml | 2 + Output/Themes/Vocaluxe 2024/02.xml | 2 + Output/Themes/Vocaluxe 2024/03.xml | 2 + Output/Themes/Vocaluxe 2024/04.xml | 2 + Output/Themes/Vocaluxe 2024/05.xml | 2 + Output/Themes/Vocaluxe 2024/06.xml | 2 + Output/Themes/Vocaluxe 2024/ButtonTile.png | Bin 0 -> 5259 bytes Output/Themes/Vocaluxe 2024/PartyModeIcon.png | Bin 0 -> 5063 bytes .../Vocaluxe 2024/Screens/ScreenMain.xml | 74 +-- .../Vocaluxe 2024/Screens/ScreenParty.xml | 537 +++++++++++------- Vocaluxe/Screens/CScreenMain.cs | 4 +- Vocaluxe/Screens/CScreenParty.cs | 377 +++++++++--- 20 files changed, 712 insertions(+), 339 deletions(-) create mode 100644 Output/PartyModes/Challenge/Themes/Default/PartyModeIcon.png create mode 100644 Output/PartyModes/TicTacToe/Themes/Default/PartyModeIcon.png create mode 100644 Output/Themes/Vocaluxe 2024/ButtonTile.png create mode 100644 Output/Themes/Vocaluxe 2024/PartyModeIcon.png diff --git a/Output/Languages/de.xml b/Output/Languages/de.xml index 0952ff90..380b82c3 100644 --- a/Output/Languages/de.xml +++ b/Output/Languages/de.xml @@ -162,6 +162,7 @@ Keine Teams Anzahl der Teams Anzahl der Spieler + Mikrofone Spielerauswahl Spieler 1 Spieler diff --git a/Output/Languages/en.xml b/Output/Languages/en.xml index 7f599720..4f77e60c 100644 --- a/Output/Languages/en.xml +++ b/Output/Languages/en.xml @@ -162,6 +162,7 @@ No teams Number of teams Number of players + Microphones Player Selection Player 1 player diff --git a/Output/PartyModes/Challenge/Themes/Default/Default.xml b/Output/PartyModes/Challenge/Themes/Default/Default.xml index 52a8859e..f666504f 100644 --- a/Output/PartyModes/Challenge/Themes/Default/Default.xml +++ b/Output/PartyModes/Challenge/Themes/Default/Default.xml @@ -8,6 +8,8 @@ 1 - + + PartyModeIcon.png + diff --git a/Output/PartyModes/Challenge/Themes/Default/PartyModeIcon.png b/Output/PartyModes/Challenge/Themes/Default/PartyModeIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..3c62441a5d06ffe19aa84489051002014b7d9fb6 GIT binary patch literal 5693 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 - + + PartyModeIcon.png + diff --git a/Output/PartyModes/TicTacToe/Themes/Default/PartyModeIcon.png b/Output/PartyModes/TicTacToe/Themes/Default/PartyModeIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..17d94179ae7e4e1d31e6a855c4387dee664988b5 GIT binary patch literal 6972 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 bq@FPNw0%v9>?l$B`*LM?)eKvzgA4y3{`@a2 literal 0 HcmV?d00001 diff --git a/Output/Themes/Changelog/Changelog_ScreenMain.txt b/Output/Themes/Changelog/Changelog_ScreenMain.txt index 23fb6a71..2aa4d369 100644 --- a/Output/Themes/Changelog/Changelog_ScreenMain.txt +++ b/Output/Themes/Changelog/Changelog_ScreenMain.txt @@ -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) diff --git a/Output/Themes/Changelog/Changelog_ScreenParty.txt b/Output/Themes/Changelog/Changelog_ScreenParty.txt index 99a008af..456c427f 100644 --- a/Output/Themes/Changelog/Changelog_ScreenParty.txt +++ b/Output/Themes/Changelog/Changelog_ScreenParty.txt @@ -1,2 +1,30 @@ ScreenParty +++++++++ +Version 2: +(2026 Oct 17) + +Add: + + + + + + + + + + + + + + +Remove: + + + + + + + +Change: +All party modes are shown as tiles with an icon, the details of the selected mode are shown below diff --git a/Output/Themes/Vocaluxe 2024/01_Standard.xml b/Output/Themes/Vocaluxe 2024/01_Standard.xml index 1abecbef..b87dce56 100644 --- a/Output/Themes/Vocaluxe 2024/01_Standard.xml +++ b/Output/Themes/Vocaluxe 2024/01_Standard.xml @@ -335,6 +335,7 @@ LogoMain.png SongMenu.png + ButtonTile.png CoverTile.png PlayerTile.png CoverTextBackground.png @@ -370,6 +371,7 @@ ToneHelper.png Score.png Star.png + PartyModeIcon.png CountdownDot.png NoAvatar.png SongMenu.png diff --git a/Output/Themes/Vocaluxe 2024/02.xml b/Output/Themes/Vocaluxe 2024/02.xml index 9074d9b9..be678c65 100644 --- a/Output/Themes/Vocaluxe 2024/02.xml +++ b/Output/Themes/Vocaluxe 2024/02.xml @@ -335,6 +335,7 @@ LogoMain.png SongMenu.png + ButtonTile.png CoverTile.png PlayerTile.png CoverTextBackground.png @@ -370,6 +371,7 @@ ToneHelper.png Score.png Star.png + PartyModeIcon.png CountdownDot.png NoAvatar.png SongMenu.png diff --git a/Output/Themes/Vocaluxe 2024/03.xml b/Output/Themes/Vocaluxe 2024/03.xml index 66252f9f..2dc9f158 100644 --- a/Output/Themes/Vocaluxe 2024/03.xml +++ b/Output/Themes/Vocaluxe 2024/03.xml @@ -335,6 +335,7 @@ LogoMain.png SongMenu.png + ButtonTile.png CoverTile.png PlayerTile.png CoverTextBackground.png @@ -370,6 +371,7 @@ ToneHelper.png Score.png Star.png + PartyModeIcon.png CountdownDot.png NoAvatar.png SongMenu.png diff --git a/Output/Themes/Vocaluxe 2024/04.xml b/Output/Themes/Vocaluxe 2024/04.xml index 702b15cd..0cc61b58 100644 --- a/Output/Themes/Vocaluxe 2024/04.xml +++ b/Output/Themes/Vocaluxe 2024/04.xml @@ -335,6 +335,7 @@ LogoMain.png SongMenu.png + ButtonTile.png CoverTile.png PlayerTile.png CoverTextBackground.png @@ -370,6 +371,7 @@ ToneHelper.png Score.png Star.png + PartyModeIcon.png CountdownDot.png NoAvatar.png SongMenu.png diff --git a/Output/Themes/Vocaluxe 2024/05.xml b/Output/Themes/Vocaluxe 2024/05.xml index 3eb48539..715c3b0f 100644 --- a/Output/Themes/Vocaluxe 2024/05.xml +++ b/Output/Themes/Vocaluxe 2024/05.xml @@ -335,6 +335,7 @@ LogoMain.png SongMenu.png + ButtonTile.png CoverTile.png PlayerTile.png CoverTextBackground.png @@ -370,6 +371,7 @@ ToneHelper.png Score.png Star.png + PartyModeIcon.png CountdownDot.png NoAvatar.png SongMenu.png diff --git a/Output/Themes/Vocaluxe 2024/06.xml b/Output/Themes/Vocaluxe 2024/06.xml index 8a170637..aba50e6b 100644 --- a/Output/Themes/Vocaluxe 2024/06.xml +++ b/Output/Themes/Vocaluxe 2024/06.xml @@ -335,6 +335,7 @@ LogoMain.png SongMenu.png + ButtonTile.png CoverTile.png PlayerTile.png CoverTextBackground.png @@ -370,6 +371,7 @@ ToneHelper.png Score.png Star.png + PartyModeIcon.png CountdownDot.png NoAvatar.png SongMenu.png diff --git a/Output/Themes/Vocaluxe 2024/ButtonTile.png b/Output/Themes/Vocaluxe 2024/ButtonTile.png new file mode 100644 index 0000000000000000000000000000000000000000..135fcbf6db38a1a1c8147971891ca669743425f8 GIT binary patch literal 5259 zcmeAS@N?(olHy`uVBq!ia0y~yV4BUq!05}t1{Cp^U2+;oF%}28J29*~C-V}>aY>Ev zO!M_+&;qhK7#Q0#8CXC{fLIEM85o!sFfuR$X-1IP0w$O&)9eMzFgBwvNTF$jYzzZ~ z@K;Y4$B+ufw|DLHua!!-C+0adxp4YuO;p&!KJ&^%i=SC{3sQyRnLVa3_;GX`T^e`) z((Eftp$nd0dF)r`pZ&i^s4wR5%ufunga1F?x_ftZ-M%-cEBDQKKDqMT+0Pek;#fEY z6dW2D7@5?a6VmHu)}Q^HGw=83JGXPp{GY#_xc+S5{JAIo$vYC8S$HI z&Hke=UcWVefArav=f5sL3*RpPWg5Z?c8-|Y`(o->UtIat-)#S{2E+SappXGO;K7Ci zaq;u!y^67a_2qkp+_R7O;jWigD#$E-_Uq)cU(*}+z=D&7LuUJdsiL!A&tLFG2^MGy z1$UUHhv(GQ+*$n%p|IzG>&BOSaK2V!v9{S?)pw%nV_|+jDQ2-b2`MlfloZT_!xqC` z;O&sJiy0meJ`Oo)TiQ6G@yc>!nKUGZfyz&?97%J_o&oa|P#Y|K85&2mfudkENJdi$ zG`oyuoY6u7QmBp=3ZsR>XrVCLz!+^j0h^1X)#7NiI9e^jx^$yGDsUHhv``qDg+f@) zy9D^?fPw(Wn>9CT>GZhnl0$=F7kbCpcJ`&WGjP<8Sj7f@}Mcd-Rz;ijw{F z?&X-BPy3N*kT(f7*6`p7m(7fGHM{CI?ToYETl2UcK0v`C(|zE4cB;PFa;y6J-`~rf zULy!^YE0HENdNWeqSK9kDaCv1v*+1gvqlVAvD^zz`1<74slC@%-Wc zkOq8qbFJyyV;TGN`!{Lx+vVHx%gf94&-^xjwsXhd8QbBbCoKP*ADpbIYkl^(IsSW8 z&N_d;f_Zbz@1H5o{kvTpF+QTq^6t#@JlQ{;&%R~fmzaIq->;<3>V5qD=a;@E-$R7P z4e<(t{CxkEb@n;`j$NO)ap&K@&U2qX|C?H=cYbqS_1`-->CZmGM}#aSnXEsbuCY7+ m%lg*!{SKA+N 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 Mwy;0aVCI+nA6|QDKmY&$ literal 0 HcmV?d00001 diff --git a/Output/Themes/Vocaluxe 2024/Screens/ScreenMain.xml b/Output/Themes/Vocaluxe 2024/Screens/ScreenMain.xml index 850e7ad6..f9852a1b 100644 --- a/Output/Themes/Vocaluxe 2024/Screens/ScreenMain.xml +++ b/Output/Themes/Vocaluxe 2024/Screens/ScreenMain.xml @@ -2,7 +2,7 @@ ScreenMain - 4 + 5 @@ -37,13 +37,13 @@ - TextBG + Warning - 135 - 915 - 510 - 45 + 390 + 767.5 + 1140 + 75 -1.9 @@ -64,11 +64,11 @@ Vocaluxe "Shining Heaven" v0.3 (x64) Beta (0083) - 390 - 918 + 960 + 787.5 -2 - 40.5 - 500 + 37.5 + 960 Center @@ -83,20 +83,20 @@ Button Button - 135 - 900 - 225 - 75 + 420 + 750 + 510 + 110 0 - 112.5 - 18 + 255 + 26 0 - 40.5 - 213 + 58 + 490 Center @@ -105,33 +105,25 @@ Outline TR_SCREENMAIN_BUTTON_SING - - 39 - 15 - - - 39 - 15 - + + - - - - SelectSlideArrowLeft - SelectSlideArrowRight - SelectSlide - SelectSlideArrowLeft - SelectSlideArrowRight - - 450 - 300 - 1072.5 - 75 - 0 - - - 457.5 - 307.5 - 60 - 60 - 0 - - - 1455 - 307.5 - 60 - 60 - 0 - - - - - - - - 81 - 75 - 0 - 900 - Outline - Bold - 1 - - + diff --git a/Vocaluxe/Screens/CScreenMain.cs b/Vocaluxe/Screens/CScreenMain.cs index 65554ac5..c84c46c7 100644 --- a/Vocaluxe/Screens/CScreenMain.cs +++ b/Vocaluxe/Screens/CScreenMain.cs @@ -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) { diff --git a/Vocaluxe/Screens/CScreenParty.cs b/Vocaluxe/Screens/CScreenParty.cs index 8026beae..dc65715d 100644 --- a/Vocaluxe/Screens/CScreenParty.cs +++ b/Vocaluxe/Screens/CScreenParty.cs @@ -15,9 +15,11 @@ // along with Vocaluxe. If not, see . #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 _PartyModeInfos; + private readonly List _Tiles = new List(); + 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()); } } -} \ No newline at end of file +}