6gMjf!^llfuS**wnsBxVz-?f0oLYqeDGHL
z!OLyDl(jo**_w?m
zq`wjsHYnp*K|wk_yAwy?x4k^j^2Yr;M=6WJHzU!4C$7?1PU1Bgg;LCI~z}
zu0CNUHyw>%15sUv3_a0L-si%b{Eo&_5)4)lsBRZYVF)KI86CJlLXkDzA9lDHH&tL8
zMRUtzHtEqym%uBD%7v7s*Nj7$CwRJeg*#%KOowF^kiL=R9`?+Y^P3idcS7rN_z<5F
zRl!{dA$=*0eG=+L&&mR#1*4#}9;V|XimwD(AYW1>&=59l!r=OUTxuWk!ONlK7I1E%
z{kbMnm0zusIKWFJvq9wJ79Us2i@!)dHFt6wKHQ9-(*MQ;vZG4UV!h73(ggXYkkFs2
zB*e@o4&)D-o#EFvd#8lBFQ&OKol(&CT5YfmSdXX$w@w3xBza)T1@F?2-NtL|C|X;1
zYOZ?Upr50GgR)q!F|)7T9$$39S+wJ_RF@J8WJ@O709dxEq`>gcV2Q1d&uEfFUPBqu
zUkT86|AWR-7R)BoiQvL?d(;qdZ**(t-End`7e7ec7(Y`)pFn-?RM>|Wo=~D^)!*BI
zUn+ZH#G~W=W|W5URu|D%2E+9JvFLtCIqRGp=i;&!cOExL6eJiPEt@WPZtR%L!AdP9
z)tzGh4HSm_#e-3Xmyu^d{Sce3iEV~X1l7e<%f3svAT$RW@t|GK`*vV9Kv7`*7wSxO
zm+9Btm?e6xS7^DFW#VHkJY$+qAom7>55kF|3rZy06x;vV=5Vp~y0e6;Cv!$EYNLIC
z09tD-{2dJUJtg0K8eJ4O<5JGkI0^EV;lcQJOMS>zcU
zq2=DM2E7OKX0ed#FG~xW&w?>9&x-h;BdkcqQhqJJzb|)?96CC02rblemooQI`yYId
zve`t?TPVAe=)8{FX+n^G4=yz@?nNua8wzaW!}U7Y!Ugk-_%>Dj98i4>@SwQ)y(iPj1`rWHnK7HNITVm-d%E2R+{P;
zMm+R6NjM6z_%Kt>;|vaw4ik^6@vibq2Y@s~lNtINM8QF7Ri@0DJ@SG`v`!jrmI{`y
zjuo5)Z}7t?pNHz;oEU*QJz;OZ=rrsJF3l@b?(A?G>~pef?9$upVIIyZ#)Y-LdPJbH
zf+37P(V+LNpiPQ)o$f1t*pHeWTq+N=QJ><2n{w(7v7!-akHb>$fGg#cs;tDyBuEDs
z;s8PWH^K;8ELa|d@`>3su%r|X1&b&^;8N&?mzA{}DfY{K@+MBxY0>wkWPUzv--N{W
zK*Q2)?pSsfFMAEN1#)TZ3sI7OnY*c!$WLQm)DHAbJzA1ul-&ex-*jz(y+S?#>Fe`kFG6RR8-xpkw6&p0Ga&v#93vSc$U
zBhEVp`N>$5+J$6{+s?E_6wt#&+)w`5@%Z#E6iW#?16{LuH-o(RCs%gRbh(xPkRO&W5){
zaM_y{txv+H3MmM7%Vvk%~po`vK91yXfQCS{6&x%R3SNuZ?!TH0Gt
zhCmbTOzYOJ6MHxcL8_7_mWi(`xeDdl^EOgub5pQ8DfXuJwuM8Eqwn0YluKSh5fWk?
z$5+9?6bH4#yg-YBqaI&;&_wxu%Ip~%i|1!|m+WHY$&j@Lqg^?{P!=7#nfeEhvvW*j&XIILXmm^I-x5}#>S-6VdalL%6>b=e$tuKtz7u+h8D=3pjz`H_Ly5UQNIT<#HK
zb`8;AeNTghy)RwcXI3)2-rRDvjx*nNN`mh8N~sZLX^OBwp1po~&hq-Va$HACPE1
-
+
+ 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
Button.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
Button.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
Button.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
Button.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
Button.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
Button.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
-
Button
Button
- 420
- 900
- 225
- 75
+ 990
+ 750
+ 510
+ 110
0
- 112.5
- 18
+ 255
+ 26
0
- 40.5
- 213
+ 58
+ 490
Center
@@ -140,20 +132,12 @@
Outline
TR_SCREENMAIN_BUTTON_PARTY
-
- 39
- 15
-
-
- 39
- 15
-
Button
Button
- 705
+ 420
900
225
75
@@ -223,7 +207,7 @@
Button
Button
- 1275
+ 705
900
225
75
@@ -258,7 +242,7 @@
Button
Button
- 1560
+ 1275
900
225
75
diff --git a/Output/Themes/Vocaluxe 2024/Screens/ScreenParty.xml b/Output/Themes/Vocaluxe 2024/Screens/ScreenParty.xml
index 6917d9b3..e50f4ae8 100644
--- a/Output/Themes/Vocaluxe 2024/Screens/ScreenParty.xml
+++ b/Output/Themes/Vocaluxe 2024/Screens/ScreenParty.xml
@@ -2,7 +2,7 @@
ScreenParty
- 1
+ 2
@@ -25,6 +25,61 @@
1
+
+ ButtonTile
+
+
+ 170
+ 160
+ 500
+ 250
+ 0.5
+
+
+
+ ButtonTile
+
+
+ 0
+ 0
+ 500
+ 250
+ 0.5
+
+
+
+
+
+
+ 345
+ 182
+ 150
+ 150
+ 0.4
+
+
+
+
+
+
+ 0
+ 0
+ 150
+ 150
+ 0.4
+
+
+
+ SongMenu
+
+
+ 170
+ 720
+ 1580
+ 190
+ 0.8
+
+
@@ -41,111 +96,46 @@
Outline
TR_SCREENPARTY_TITLE
-
- 112.5
- 160.5
+
+ 420
+ 345
0
- 0
- 0
-
-
- Left
+ 40
+ 470
+
+
+ Center
Center
Outline
- TR_SCREENPARTY_MODES
+
-
- 112.5
- 250.5
+
+ 0
+ 0
0
- 0
- 0
-
-
- Left
+ 40
+ 470
+
+
+ Center
Center
Outline
- TR_SCREENPARTY_DESCRIPTION
+
-
- 112.5
- 340.5
+
+ 960
+ 691
0
- 0
+ 24
0
-
-
- Left
- Center
-
- Outline
- TR_SCREENPARTY_TARGETAUDIENCE
-
-
- 742.5
- 580.5
- 0
- 40.5
- 0
-
-
- Left
- Center
-
- Outline
- TR_SCREENPARTY_NUMTEAMS
-
-
- 742.5
- 670.5
- 0
- 40.5
- 0
-
-
- Left
- Center
-
- Outline
- TR_SCREENPARTY_NUMPLAYERS
-
-
- 112.5
- 610.5
- 0
- 0
- 0
-
-
- Left
- Center
-
- Outline
- TR_SCREENPARTY_AUTHOR
-
-
- 112.5
- 700.5
- 0
- 0
- 0
-
-
- Left
- Center
-
- Outline
- TR_SCREENPARTY_VERSION
-
-
- 975
- 400.5
- 0
- 40.5
- 900
-
+
+ 0.75
+ 0.78
+ 0.85
+ 1
+
Center
Center
@@ -153,98 +143,212 @@
Outline
+
+ 200
+ 742
+ 0
+ 40
+ 1000
+
+
+ Left
+ Center
+
+ Outline
+
+
+
+ 200
+ 790
+ 0
+ 30
+ 1000
+
+
+ Left
+ Center
+
+ Outline
+
+
- 975
- 490.5
+ 200
+ 832
0
- 40.5
- 900
-
+ 28
+ 1000
+
+ 0.75
+ 0.78
+ 0.85
+ 1
+
- Center
+ Left
Center
-
- Outline
-
-
-
- 1155
- 580.5
- 0
- 40.5
- 900
-
-
- Center
- Center
-
- Outline
-
-
-
- 1155
- 670.5
- 0
- 40.5
- 900
-
-
- Center
- Center
-
- Outline
-
-
-
- 1275
- 610.5
- 0
- 0
- 900
-
-
- Center
- Center
-
- Outline
-
-
-
- 1275
- 700.5
- 0
- 0
- 900
-
-
- Center
- Center
-
+
Outline
- 1275
- 790.5
+ 200
+ 868
0
- 40.5
- 900
-
+ 28
+ 1000
+
+ 1
+ 0.45
+ 0.45
+ 1
+
- Center
+ Left
Center
Outline
TR_SCREENPARTY_ERROR
+
+ 1480
+ 742
+ 0
+ 28
+ 280
+
+ 0.75
+ 0.78
+ 0.85
+ 1
+
+
+ Right
+ Center
+
+ Outline
+ TR_SCREENPARTY_NUMPLAYERS
+
+
+ 1500
+ 742
+ 0
+ 28
+ 235
+
+
+ Left
+ Center
+
+ Outline
+
+
+
+ 1480
+ 780
+ 0
+ 28
+ 280
+
+ 0.75
+ 0.78
+ 0.85
+ 1
+
+
+ Right
+ Center
+
+ Outline
+ TR_SCREENPARTY_NUMTEAMS
+
+
+ 1500
+ 780
+ 0
+ 28
+ 235
+
+
+ Left
+ Center
+
+ Outline
+
+
+
+ 1480
+ 818
+ 0
+ 28
+ 280
+
+ 0.75
+ 0.78
+ 0.85
+ 1
+
+
+ Right
+ Center
+
+ Outline
+ TR_SCREENPARTY_NUMMICS
+
+
+ 1500
+ 818
+ 0
+ 28
+ 235
+
+
+ Left
+ Center
+
+ Outline
+
+
+
+ 1480
+ 856
+ 0
+ 28
+ 280
+
+ 0.75
+ 0.78
+ 0.85
+ 1
+
+
+ Right
+ Center
+
+ Outline
+ TR_SCREENPARTY_AUTHOR
+
+
+ 1500
+ 856
+ 0
+ 28
+ 235
+
+
+ Left
+ Center
+
+ Outline
+
+
Button
Button
- 1477.5
- 900
+ 1545
+ 945
225
75
0
@@ -278,8 +382,8 @@
Button
Button
- 217.5
- 900
+ 150
+ 945
225
75
0
@@ -309,53 +413,64 @@
15
+
+ ScrollUp
+ ScrollUp
+
+ 1775
+ 170
+ 60
+ 32
+ 0
+
+
+
+
+ 112.5
+ 18
+ 0
+ 40.5
+ 213
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+
+ ScrollDown
+ ScrollDown
+
+ 1775
+ 648
+ 60
+ 32
+ 0
+
+
+
+
+ 112.5
+ 18
+ 0
+ 40.5
+ 213
+
+
+ Center
+ Center
+
+ Outline
+
+
+
-
-
-
- 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
+}