From 6601f41aaca21ea682b4c1daba16138c2d58ede5 Mon Sep 17 00:00:00 2001 From: McSchneidar <262792195+McSchneidar@users.noreply.github.com> Date: Wed, 21 Oct 2026 09:12:04 +0200 Subject: [PATCH] Redesign option screens (#931) * Redesign and improve option screens - Open the options directly from the main menu with the focus on the navigation, all option screens share a navigation with all categories, song folders and credits - Navigation and settings use rounded backgrounds like the party mode selection, the current category and setting are highlighted with the selection color of the skin - Categories can be clicked or switched with Tab, Escape moves the focus to the navigation and leaves the options from there, choosing a category moves the focus to its first setting - Place the action buttons (delay test, adjust screen, server address, add folder) and the webcam preview inside the settings background - Center the restart and microphone warnings below the settings background - Move song folder management to its own screen with a list of all folders, add and remove buttons, a scrollbar and a restart warning - Add the tile caption option to the game options (only selectable when the song menu is set to tiles) - Remove the old options selection screen (ScreenOptions) - Fix configured song folders being ignored when the first entry of the config is empty - Show the folder dialog in front of the game window - Fix background music source being overwritten by the karaoke effect setting - Keep the webcam configuration when no webcam is connected - Warn when several players are assigned to the same record channel - Show a warning when no microphone is found - Remove cover sizes 32 and 64 and keep unknown cover sizes until changed - Play warning sounds again each time an option screen is shown - Ignore key pressed events in graphics and server options - Keep the background music volume in sync in the sound options * Fix SonarCloud issues --------- Co-authored-by: Florian Ostertag --- Output/Languages/en.xml | 6 + .../Changelog/Changelog_ScreenOptions.txt | 31 - .../Changelog/Changelog_ScreenOptionsGame.txt | 19 + .../Changelog_ScreenOptionsGraphics.txt | 15 + .../Changelog_ScreenOptionsLyrics.txt | 14 + .../Changelog_ScreenOptionsRecord.txt | 16 + .../Changelog_ScreenOptionsServer.txt | 16 + .../Changelog_ScreenOptionsSongFolders.txt | 36 + .../Changelog_ScreenOptionsSound.txt | 14 + .../Changelog_ScreenOptionsTheme.txt | 14 + .../Changelog_ScreenOptionsVideo.txt | 16 + .../Themes/Changelog/Changelog_SkinSystem.txt | 1 + Output/Themes/Vocaluxe 2024/01_Standard.xml | 10 + Output/Themes/Vocaluxe 2024/02.xml | 10 + Output/Themes/Vocaluxe 2024/03.xml | 10 + Output/Themes/Vocaluxe 2024/04.xml | 10 + Output/Themes/Vocaluxe 2024/05.xml | 10 + Output/Themes/Vocaluxe 2024/06.xml | 10 + .../Themes/Vocaluxe 2024/OptionsIconGame.png | Bin 0 -> 4426 bytes .../Vocaluxe 2024/OptionsIconGraphics.png | Bin 0 -> 2450 bytes .../Vocaluxe 2024/OptionsIconLyrics.png | Bin 0 -> 2737 bytes .../Vocaluxe 2024/OptionsIconServer.png | Bin 0 -> 8989 bytes .../Vocaluxe 2024/OptionsIconSongFolders.png | Bin 0 -> 2630 bytes .../Themes/Vocaluxe 2024/OptionsIconSound.png | Bin 0 -> 4269 bytes .../Themes/Vocaluxe 2024/OptionsIconTheme.png | Bin 0 -> 6967 bytes .../Vocaluxe 2024/OptionsNavBackground.png | Bin 0 -> 11057 bytes .../Vocaluxe 2024/OptionsNavSelected.png | Bin 0 -> 1589 bytes .../Vocaluxe 2024/OptionsSlideSelected.png | Bin 0 -> 2085 bytes .../Vocaluxe 2024/Screens/ScreenOptions.xml | 412 ------- .../Screens/ScreenOptionsGame.xml | 782 ++++++++++--- .../Screens/ScreenOptionsGraphics.xml | 576 ++++++++-- .../Screens/ScreenOptionsLyrics.xml | 496 +++++++- .../Screens/ScreenOptionsRecord.xml | 908 +++++++++++---- .../Screens/ScreenOptionsServer.xml | 512 ++++++++- .../Screens/ScreenOptionsSongFolders.xml | 1023 +++++++++++++++++ .../Screens/ScreenOptionsSound.xml | 686 ++++++++--- .../Screens/ScreenOptionsTheme.xml | 724 +++++++++--- .../Screens/ScreenOptionsVideo.xml | 668 ++++++++--- Vocaluxe/Base/CConfig.cs | 10 +- Vocaluxe/Base/CGraphics.cs | 2 +- Vocaluxe/Base/CMain.cs | 5 + Vocaluxe/Screens/CScreenCredits.cs | 2 +- Vocaluxe/Screens/CScreenMain.cs | 6 +- Vocaluxe/Screens/CScreenOptions.cs | 303 ----- Vocaluxe/Screens/CScreenOptionsBase.cs | 310 +++++ Vocaluxe/Screens/CScreenOptionsGame.cs | 51 +- Vocaluxe/Screens/CScreenOptionsGraphics.cs | 107 +- Vocaluxe/Screens/CScreenOptionsLyrics.cs | 32 +- Vocaluxe/Screens/CScreenOptionsRecord.cs | 70 +- Vocaluxe/Screens/CScreenOptionsServer.cs | 100 +- Vocaluxe/Screens/CScreenOptionsSongFolders.cs | 375 ++++++ Vocaluxe/Screens/CScreenOptionsSound.cs | 37 +- Vocaluxe/Screens/CScreenOptionsTheme.cs | 26 +- Vocaluxe/Screens/CScreenOptionsVideo.cs | 38 +- Vocaluxe/Vocaluxe.csproj | 3 +- VocaluxeLib/Enums.cs | 2 +- VocaluxeLib/IBasic.cs | 1 + VocaluxeLib/Menu/COrderedDictionaryLite.cs | 5 + VocaluxeLib/Menu/CSelectSlide.cs | 14 +- 59 files changed, 6694 insertions(+), 1850 deletions(-) delete mode 100644 Output/Themes/Changelog/Changelog_ScreenOptions.txt create mode 100644 Output/Themes/Changelog/Changelog_ScreenOptionsSongFolders.txt create mode 100644 Output/Themes/Vocaluxe 2024/OptionsIconGame.png create mode 100644 Output/Themes/Vocaluxe 2024/OptionsIconGraphics.png create mode 100644 Output/Themes/Vocaluxe 2024/OptionsIconLyrics.png create mode 100644 Output/Themes/Vocaluxe 2024/OptionsIconServer.png create mode 100644 Output/Themes/Vocaluxe 2024/OptionsIconSongFolders.png create mode 100644 Output/Themes/Vocaluxe 2024/OptionsIconSound.png create mode 100644 Output/Themes/Vocaluxe 2024/OptionsIconTheme.png create mode 100644 Output/Themes/Vocaluxe 2024/OptionsNavBackground.png create mode 100644 Output/Themes/Vocaluxe 2024/OptionsNavSelected.png create mode 100644 Output/Themes/Vocaluxe 2024/OptionsSlideSelected.png delete mode 100644 Output/Themes/Vocaluxe 2024/Screens/ScreenOptions.xml create mode 100644 Output/Themes/Vocaluxe 2024/Screens/ScreenOptionsSongFolders.xml delete mode 100644 Vocaluxe/Screens/CScreenOptions.cs create mode 100644 Vocaluxe/Screens/CScreenOptionsBase.cs create mode 100644 Vocaluxe/Screens/CScreenOptionsSongFolders.cs diff --git a/Output/Languages/en.xml b/Output/Languages/en.xml index 843c0905..6bd3e7ed 100644 --- a/Output/Languages/en.xml +++ b/Output/Languages/en.xml @@ -294,6 +294,7 @@ Song-menu style Song sorting Tabs + Tile caption Autoplay song previews Game difficulty Timer mode @@ -309,6 +310,8 @@ Player 6 Mic delay Warning: At least one player is assigned to two mics. + Warning: Several players are assigned to the same channel, only one of them will be used. + Warning: No microphone found. Delay test Sound Options Background music @@ -336,6 +339,9 @@ Fullscreen Stretched Server Options + Song Folders + Add folder + No song folders configured. The Songs folder of the program is used. Server active Server encryption Server address diff --git a/Output/Themes/Changelog/Changelog_ScreenOptions.txt b/Output/Themes/Changelog/Changelog_ScreenOptions.txt deleted file mode 100644 index 5ec52d6a..00000000 --- a/Output/Themes/Changelog/Changelog_ScreenOptions.txt +++ /dev/null @@ -1,31 +0,0 @@ -ScreenOptions - -++++++++++ -Version 4: -(2026 Mar 28) - -Add: -Grahpics Button -Server Button -Song Folder Button - -++++++++++ -Version 3: -(2025 Jan 13) - -Add: -Back Button - -++++++++++ -Version 2: -(2024 Nov 24) - -Add: -Credits Button - -++++++++++ -Version 1: -(2023 Dec 31) - -Add: - diff --git a/Output/Themes/Changelog/Changelog_ScreenOptionsGame.txt b/Output/Themes/Changelog/Changelog_ScreenOptionsGame.txt index 782fc40a..6b9c4fe8 100644 --- a/Output/Themes/Changelog/Changelog_ScreenOptionsGame.txt +++ b/Output/Themes/Changelog/Changelog_ScreenOptionsGame.txt @@ -1,5 +1,24 @@ ScreenOptionsGame +++++++++++ +Version 7: +(2026 Oct 18) + +Add: + + (only selectable when the song menu is set to tiles) + +Add (optional, the screen works without them): + background of the navigation +, , for Game, Sound, Record, Video, Lyrics, Theme, Graphics, Server, SongFolders and Credits (navigation tiles, can be clicked, Tab switches to the next category, Escape moves the focus to the navigation and leaves the screen from there, the navigation is focused when the options are opened from the main menu) +, , templates for the tile of the current category (only skin and colors are used, like the tiles in ScreenParty) + background of the settings + +Change: +Positions and sizes of all texts and select slides + of the select slides is OptionsSlideSelected (selection color instead of dark background) + +++++++++++ Version 6: Remove: diff --git a/Output/Themes/Changelog/Changelog_ScreenOptionsGraphics.txt b/Output/Themes/Changelog/Changelog_ScreenOptionsGraphics.txt index f0f45f08..019e4849 100644 --- a/Output/Themes/Changelog/Changelog_ScreenOptionsGraphics.txt +++ b/Output/Themes/Changelog/Changelog_ScreenOptionsGraphics.txt @@ -1,5 +1,20 @@ ScreenOptionsGraphics +++++++++++ +Version 2: +(2026 Oct 18) + +Add (optional, the screen works without them): + background of the navigation +, , for Game, Sound, Record, Video, Lyrics, Theme, Graphics, Server, SongFolders and Credits (navigation tiles, can be clicked, Tab switches to the next category, Escape moves the focus to the navigation and leaves the screen from there, the navigation is focused when the options are opened from the main menu) +, , templates for the tile of the current category (only skin and colors are used, like the tiles in ScreenParty) + background of the settings + +Change: +Positions and sizes of all texts and select slides + of the select slides is OptionsSlideSelected (selection color instead of dark background) +The warning is centered below the settings background + ++++++++++ Version 1: diff --git a/Output/Themes/Changelog/Changelog_ScreenOptionsLyrics.txt b/Output/Themes/Changelog/Changelog_ScreenOptionsLyrics.txt index 70269b7c..49875bde 100644 --- a/Output/Themes/Changelog/Changelog_ScreenOptionsLyrics.txt +++ b/Output/Themes/Changelog/Changelog_ScreenOptionsLyrics.txt @@ -1,5 +1,19 @@ ScreenOptionsLyrics +++++++++++ +Version 5: +(2026 Oct 18) + +Add (optional, the screen works without them): + background of the navigation +, , for Game, Sound, Record, Video, Lyrics, Theme, Graphics, Server, SongFolders and Credits (navigation tiles, can be clicked, Tab switches to the next category, Escape moves the focus to the navigation and leaves the screen from there, the navigation is focused when the options are opened from the main menu) +, , templates for the tile of the current category (only skin and colors are used, like the tiles in ScreenParty) + background of the settings + +Change: +Positions and sizes of all texts and select slides + of the select slides is OptionsSlideSelected (selection color instead of dark background) + ++++++++++ Version 4: Remove Graphics Options diff --git a/Output/Themes/Changelog/Changelog_ScreenOptionsRecord.txt b/Output/Themes/Changelog/Changelog_ScreenOptionsRecord.txt index b41f8990..a936a01d 100644 --- a/Output/Themes/Changelog/Changelog_ScreenOptionsRecord.txt +++ b/Output/Themes/Changelog/Changelog_ScreenOptionsRecord.txt @@ -1,5 +1,21 @@ ScreenOptionsRecord +++++++++++ +Version 6: +(2026 Oct 18) + +Add (optional, the screen works without them): + background of the navigation +, , for Game, Sound, Record, Video, Lyrics, Theme, Graphics, Server, SongFolders and Credits (navigation tiles, can be clicked, Tab switches to the next category, Escape moves the focus to the navigation and leaves the screen from there, the navigation is focused when the options are opened from the main menu) +, , templates for the tile of the current category (only skin and colors are used, like the tiles in ScreenParty) + background of the settings + +Change: +Positions and sizes of all texts and select slides + of the select slides is OptionsSlideSelected (selection color instead of dark background) +The action button is placed at the bottom right of the settings background +The warning is centered below the settings background + ++++++++++ Version 2: diff --git a/Output/Themes/Changelog/Changelog_ScreenOptionsServer.txt b/Output/Themes/Changelog/Changelog_ScreenOptionsServer.txt index 8b3adb58..51046552 100644 --- a/Output/Themes/Changelog/Changelog_ScreenOptionsServer.txt +++ b/Output/Themes/Changelog/Changelog_ScreenOptionsServer.txt @@ -1,5 +1,21 @@ ScreenOptionsServer +++++++++++ +Version 2: +(2026 Oct 18) + +Add (optional, the screen works without them): + background of the navigation +, , for Game, Sound, Record, Video, Lyrics, Theme, Graphics, Server, SongFolders and Credits (navigation tiles, can be clicked, Tab switches to the next category, Escape moves the focus to the navigation and leaves the screen from there, the navigation is focused when the options are opened from the main menu) +, , templates for the tile of the current category (only skin and colors are used, like the tiles in ScreenParty) + background of the settings + +Change: +Positions and sizes of all texts and select slides + of the select slides is OptionsSlideSelected (selection color instead of dark background) +The action button is placed at the bottom right of the settings background +The warning is centered below the settings background + ++++++++++ Version 1: diff --git a/Output/Themes/Changelog/Changelog_ScreenOptionsSongFolders.txt b/Output/Themes/Changelog/Changelog_ScreenOptionsSongFolders.txt new file mode 100644 index 00000000..f490bf8d --- /dev/null +++ b/Output/Themes/Changelog/Changelog_ScreenOptionsSongFolders.txt @@ -0,0 +1,36 @@ +ScreenOptionsSongFolders + +++++++++++ +Version 3: +(2026 Oct 18) + +Add: + and (only visible with more than 8 folders, the thumb uses X, W and Z of its rect, Y and H follow the scroll position, click or drag on the bar to scroll) + +Remove: +, + +++++++++++ +Version 2: +(2026 Oct 18) + +Add (optional, the screen works without them): + background of the navigation +, , for Game, Sound, Record, Video, Lyrics, Theme, Graphics, Server, SongFolders and Credits (navigation tiles, can be clicked, Tab switches to the next category, Escape moves the focus to the navigation and leaves the screen from there, the navigation is focused when the options are opened from the main menu) +, , templates for the tile of the current category (only skin and colors are used, like the tiles in ScreenParty) + background of the settings + +Change: +Positions and sizes of all folder rows, buttons and texts + without background +The add button is placed at the bottom right of the settings background +The warning is centered below the settings background + +++++++++++ +Version 1: +(2026 Oct 18) + +New screen to manage the song folders, opened with in ScreenOptions: + to , to , to (one row per folder) +, (only visible with more than 8 folders) +, , , , diff --git a/Output/Themes/Changelog/Changelog_ScreenOptionsSound.txt b/Output/Themes/Changelog/Changelog_ScreenOptionsSound.txt index dbbb1efc..3604512c 100644 --- a/Output/Themes/Changelog/Changelog_ScreenOptionsSound.txt +++ b/Output/Themes/Changelog/Changelog_ScreenOptionsSound.txt @@ -1,5 +1,19 @@ ScreenOptionsSound +++++++++++ +Version 6: +(2026 Oct 18) + +Add (optional, the screen works without them): + background of the navigation +, , for Game, Sound, Record, Video, Lyrics, Theme, Graphics, Server, SongFolders and Credits (navigation tiles, can be clicked, Tab switches to the next category, Escape moves the focus to the navigation and leaves the screen from there, the navigation is focused when the options are opened from the main menu) +, , templates for the tile of the current category (only skin and colors are used, like the tiles in ScreenParty) + background of the settings + +Change: +Positions and sizes of all texts and select slides + of the select slides is OptionsSlideSelected (selection color instead of dark background) + ++++++++++ Version 5: diff --git a/Output/Themes/Changelog/Changelog_ScreenOptionsTheme.txt b/Output/Themes/Changelog/Changelog_ScreenOptionsTheme.txt index a8c28341..d47469f9 100644 --- a/Output/Themes/Changelog/Changelog_ScreenOptionsTheme.txt +++ b/Output/Themes/Changelog/Changelog_ScreenOptionsTheme.txt @@ -1,5 +1,19 @@ ScreenOptionsTheme +++++++++++ +Version 4: +(2026 Oct 18) + +Add (optional, the screen works without them): + background of the navigation +, , for Game, Sound, Record, Video, Lyrics, Theme, Graphics, Server, SongFolders and Credits (navigation tiles, can be clicked, Tab switches to the next category, Escape moves the focus to the navigation and leaves the screen from there, the navigation is focused when the options are opened from the main menu) +, , templates for the tile of the current category (only skin and colors are used, like the tiles in ScreenParty) + background of the settings + +Change: +Positions and sizes of all texts and select slides + of the select slides is OptionsSlideSelected (selection color instead of dark background) + ++++++++++ Version 3: diff --git a/Output/Themes/Changelog/Changelog_ScreenOptionsVideo.txt b/Output/Themes/Changelog/Changelog_ScreenOptionsVideo.txt index 9e8d37df..4d6a68e1 100644 --- a/Output/Themes/Changelog/Changelog_ScreenOptionsVideo.txt +++ b/Output/Themes/Changelog/Changelog_ScreenOptionsVideo.txt @@ -1,3 +1,19 @@ +++++++++++ +Version 6: +(2026 Oct 18) + +Add (optional, the screen works without them): + background of the navigation +, , for Game, Sound, Record, Video, Lyrics, Theme, Graphics, Server, SongFolders and Credits (navigation tiles, can be clicked, Tab switches to the next category, Escape moves the focus to the navigation and leaves the screen from there, the navigation is focused when the options are opened from the main menu) +, , templates for the tile of the current category (only skin and colors are used, like the tiles in ScreenParty) + background of the settings + +Change: +Positions and sizes of all texts and select slides + of the select slides is OptionsSlideSelected (selection color instead of dark background) +The action button is placed at the bottom right of the settings background + is centered at the bottom of the settings background + ++++++++++ Version 5: diff --git a/Output/Themes/Changelog/Changelog_SkinSystem.txt b/Output/Themes/Changelog/Changelog_SkinSystem.txt index 41b5d672..e6d22094 100644 --- a/Output/Themes/Changelog/Changelog_SkinSystem.txt +++ b/Output/Themes/Changelog/Changelog_SkinSystem.txt @@ -3,6 +3,7 @@ Skin System ++++++++++ Version 4: All Colors in (Playercolors and ColorSchemes) +Optional textures for the options screens: OptionsIconGame, OptionsIconSound, OptionsIconLyrics, OptionsIconTheme, OptionsIconGraphics, OptionsIconServer, OptionsIconSongFolders, OptionsNavBackground, OptionsSlideSelected, OptionsNavSelected ++++++++++ Version 3: diff --git a/Output/Themes/Vocaluxe 2024/01_Standard.xml b/Output/Themes/Vocaluxe 2024/01_Standard.xml index 270ff459..97701e06 100644 --- a/Output/Themes/Vocaluxe 2024/01_Standard.xml +++ b/Output/Themes/Vocaluxe 2024/01_Standard.xml @@ -419,6 +419,16 @@ Warning.png PlayerSelBG.png CalibrationBG.png + OptionsIconGame.png + OptionsIconSound.png + OptionsIconLyrics.png + OptionsIconTheme.png + OptionsIconGraphics.png + OptionsIconServer.png + OptionsIconSongFolders.png + OptionsNavBackground.png + OptionsSlideSelected.png + OptionsNavSelected.png BG_Video.mp4 diff --git a/Output/Themes/Vocaluxe 2024/02.xml b/Output/Themes/Vocaluxe 2024/02.xml index 0808a147..55d6f8b4 100644 --- a/Output/Themes/Vocaluxe 2024/02.xml +++ b/Output/Themes/Vocaluxe 2024/02.xml @@ -418,6 +418,16 @@ Warning.png PlayerSelBG.png CalibrationBG.png + OptionsIconGame.png + OptionsIconSound.png + OptionsIconLyrics.png + OptionsIconTheme.png + OptionsIconGraphics.png + OptionsIconServer.png + OptionsIconSongFolders.png + OptionsNavBackground.png + OptionsSlideSelected.png + OptionsNavSelected.png BG_Video_2.mp4 diff --git a/Output/Themes/Vocaluxe 2024/03.xml b/Output/Themes/Vocaluxe 2024/03.xml index f11d5049..31a8fcaf 100644 --- a/Output/Themes/Vocaluxe 2024/03.xml +++ b/Output/Themes/Vocaluxe 2024/03.xml @@ -418,6 +418,16 @@ Warning.png PlayerSelBG.png CalibrationBG.png + OptionsIconGame.png + OptionsIconSound.png + OptionsIconLyrics.png + OptionsIconTheme.png + OptionsIconGraphics.png + OptionsIconServer.png + OptionsIconSongFolders.png + OptionsNavBackground.png + OptionsSlideSelected.png + OptionsNavSelected.png BG_Video_3.mp4 diff --git a/Output/Themes/Vocaluxe 2024/04.xml b/Output/Themes/Vocaluxe 2024/04.xml index 485c1996..b5d1cef8 100644 --- a/Output/Themes/Vocaluxe 2024/04.xml +++ b/Output/Themes/Vocaluxe 2024/04.xml @@ -418,6 +418,16 @@ Warning.png PlayerSelBG.png CalibrationBG.png + OptionsIconGame.png + OptionsIconSound.png + OptionsIconLyrics.png + OptionsIconTheme.png + OptionsIconGraphics.png + OptionsIconServer.png + OptionsIconSongFolders.png + OptionsNavBackground.png + OptionsSlideSelected.png + OptionsNavSelected.png BG_Video_4.mp4 diff --git a/Output/Themes/Vocaluxe 2024/05.xml b/Output/Themes/Vocaluxe 2024/05.xml index 33561669..27fd4ca8 100644 --- a/Output/Themes/Vocaluxe 2024/05.xml +++ b/Output/Themes/Vocaluxe 2024/05.xml @@ -418,6 +418,16 @@ Warning.png PlayerSelBG.png CalibrationBG.png + OptionsIconGame.png + OptionsIconSound.png + OptionsIconLyrics.png + OptionsIconTheme.png + OptionsIconGraphics.png + OptionsIconServer.png + OptionsIconSongFolders.png + OptionsNavBackground.png + OptionsSlideSelected.png + OptionsNavSelected.png BG_Video_5.mp4 diff --git a/Output/Themes/Vocaluxe 2024/06.xml b/Output/Themes/Vocaluxe 2024/06.xml index 7dae9e6a..93f06dfe 100644 --- a/Output/Themes/Vocaluxe 2024/06.xml +++ b/Output/Themes/Vocaluxe 2024/06.xml @@ -418,6 +418,16 @@ Warning.png PlayerSelBG.png CalibrationBG.png + OptionsIconGame.png + OptionsIconSound.png + OptionsIconLyrics.png + OptionsIconTheme.png + OptionsIconGraphics.png + OptionsIconServer.png + OptionsIconSongFolders.png + OptionsNavBackground.png + OptionsSlideSelected.png + OptionsNavSelected.png BG_Video_6.mp4 diff --git a/Output/Themes/Vocaluxe 2024/OptionsIconGame.png b/Output/Themes/Vocaluxe 2024/OptionsIconGame.png new file mode 100644 index 0000000000000000000000000000000000000000..c9ae011861e318d316a9fabc5fdd209e5de8b2df GIT binary patch literal 4426 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 RKKw`knrgb>Iu)D9{{cvOcI*HE literal 0 HcmV?d00001 diff --git a/Output/Themes/Vocaluxe 2024/OptionsIconGraphics.png b/Output/Themes/Vocaluxe 2024/OptionsIconGraphics.png new file mode 100644 index 0000000000000000000000000000000000000000..ff5d24e2dc1cb549ca3702f985a830f997ab2912 GIT binary patch literal 2450 zcmds3`8N~{7dCdXREjrC*+wLUELoGK8M1~@#!?O0!eAz%N!Bl0V;vgGjAb&&&RCK} zVG@Qhsi9u;YOG-}X2_>M;QP+^^LNj=_c`~R`@?hYeV%h}x|73IQDJFeE-o%nFv!Z~ z5I_7$LH@&9>rq$A#U1ZUxK7gYbBce^q4&plC;5IxTP^8~T2j%b-k7z>BGjmqEv6UU|CNKFG##fO6?_TXOuBjVG0E zLMk0aP9B%>Z70d)GdYMYx$>#rbIT$en_W&ddcXZXDCEVLzX7ufL1Ki*E2@-7Pn{MhD2&}9y4aqx-eK52YQvd@_g+Q{!k z%0dC&S~5OJ96Sh=TWaPYqkSX#Xj+Vkb(#wuHrDh{2Tq$2S|Av;$_`u8lOw!7WAOLLi4*X|wQ zaKW)DcNpQd>^>SCxbHCjoy8ppv5077LZ_~ydej(qzFsA_sZb>V)U53a1N`Z%@Njia zNUdiS8W*6v?=)UpBM6!ut1`nL5r2w(Kr0@DXK0vN_EI#6Mzp$76-**aZ<{m1Yh&lv~94_ znfkV6c!unIL zwHl|Hxx0-T&ntvmtF(W&o7b8*!7k$?`vb=5v@Fap=jZL8cY~sx( z7$>xkC%e7c&(yLq+}4m0+gj0OrQ8-s05Y;zCbOrCZx(rVYr@lU6VMpPJp22T=WF3r zU*IqD8vUSEKuj7_Q}H8NrRa*Nh3H^Jg0IA3wt=>bzz9L7?~6mLru|W^(9Dy_B)x7RuvX-?O}pi#oETvgKQFhH8VV74U8TZ4Q~qnzY4KA?uXP2sXs~QhgIgsnVnsK+ArnAvN zF&6Ir4AI_beMlv4N|;PGf?{39wSe)arSgqr6n9)YNm9%f%Ib@#_=1v~_WU^AV%S}RPh|6gP6VRD zNOdlLS{zLs^%4cwP%OH>?D+ifM%DRyro8p6QZaKYgI4pmNFQB;v#2W)5}EF#F~y#l zzfpDRJrEcj-@&t(L16tHi^ep`rQAK1v)_PliLY0CiY8o4iU`F!YY5;Vmj+q-L;6@2jyBNb#d2zB?53axi8) z0v6DAawa2p^cys$XR?tzZxJmi6+d#rI8(o|?3;&hSkdEb7z(1q;PfEvYovrqR&Tw( zm}^alS!@b&jQ&mRsO+_pbPh%s_MBzFYIoL)W!fAH6j`rvTHx3+9HlPy&31UxqBD4> zh#KEnXRL?cMRpAl(nAmgl%6JL>-ofvp{^>aO@E{u^)ecrO3| literal 0 HcmV?d00001 diff --git a/Output/Themes/Vocaluxe 2024/OptionsIconLyrics.png b/Output/Themes/Vocaluxe 2024/OptionsIconLyrics.png new file mode 100644 index 0000000000000000000000000000000000000000..8a1d3890278c6cb758ad543c0f0397cd10d6d935 GIT binary patch literal 2737 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 literal 0 HcmV?d00001 diff --git a/Output/Themes/Vocaluxe 2024/OptionsIconServer.png b/Output/Themes/Vocaluxe 2024/OptionsIconServer.png new file mode 100644 index 0000000000000000000000000000000000000000..78c5d270ccc2ba92d62bcfce7c3b5d3b3198b6c5 GIT binary patch literal 8989 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 literal 0 HcmV?d00001 diff --git a/Output/Themes/Vocaluxe 2024/OptionsIconSongFolders.png b/Output/Themes/Vocaluxe 2024/OptionsIconSongFolders.png new file mode 100644 index 0000000000000000000000000000000000000000..459e934a85fd96134320ba5a73ff13c6fb13a74d GIT binary patch literal 2630 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 Ay8r+H literal 0 HcmV?d00001 diff --git a/Output/Themes/Vocaluxe 2024/OptionsIconSound.png b/Output/Themes/Vocaluxe 2024/OptionsIconSound.png new file mode 100644 index 0000000000000000000000000000000000000000..3f44695b0f720360f39c33bc8eacf278c4449deb GIT binary patch literal 4269 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 B@4^58 literal 0 HcmV?d00001 diff --git a/Output/Themes/Vocaluxe 2024/OptionsIconTheme.png b/Output/Themes/Vocaluxe 2024/OptionsIconTheme.png new file mode 100644 index 0000000000000000000000000000000000000000..2916aff947f8fc26b8cda186a27c21a63432704e GIT binary patch literal 6967 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 literal 0 HcmV?d00001 diff --git a/Output/Themes/Vocaluxe 2024/OptionsNavBackground.png b/Output/Themes/Vocaluxe 2024/OptionsNavBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..ef28b6e3c61d59413f30c3c4a8adb515c377e4f2 GIT binary patch literal 11057 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 literal 0 HcmV?d00001 diff --git a/Output/Themes/Vocaluxe 2024/OptionsNavSelected.png b/Output/Themes/Vocaluxe 2024/OptionsNavSelected.png new file mode 100644 index 0000000000000000000000000000000000000000..956340699b228846c3275447459e094e4a1add4a GIT binary patch literal 1589 zcmeH|{WsKE9LGPN)^3t5OV*LuG@4yQRvsftsrH*ZMKPuk;~|+m*T^t9WF^FomS!?( zSKBBL9mZh7pfs9|racx7q1{X^GahPUHJj_rCAv^SbYw>+N|+ zd!6Ar0MJIhb2|#4T93|CKm7z9e^mF42GCeS++6+6mrad`^G<~8cmFX%oN(~bMBLoE ztIuxE%-Z(n!Bu7R#`t~M=DuS_2fEZlgh$Ae8*r`mS3K^t=vt9-l8wLq%Wtxql;%KJ z3bvhUFn=78U&r24h>hKzj2Af}J52eEo7XiVgIr}oQ>I1EfrX3PYR(%I;XiOSc;kufpO>(t<|+0A2w(bR3iNa zJ0reGk4_75rtW!eqYoKehtZ-#iZ|{L&oJ%^4Rk!OJ((^L^D;}r`K<9`Y%DhUTQ#ah zB)~$&z}T#R&j8GEu;m3-(`7cyEgUy_4&uV{^6!dSnGIKkjmpGdB9999yiLfTl z(RdVFxnYegmvot_0WZ9rS-rGql0_vqX6zb{$`qHw$wrj*odc|SX}1K`EeV=X~7MQzwH6^Oh!Ga_LJ=moRPZ>oTaKm(~7VLH3hhDwpf;oW2X9R%2O(=H_A2vZA{lD
().LastOrDefault(form => form.Visible); + if (dialog.ShowDialog(owner) == DialogResult.OK) + { + return dialog.SelectedPath; // Folder was selected + } + } + + return null; // Dialog was cancelled + } + } +} diff --git a/Vocaluxe/Screens/CScreenOptionsSound.cs b/Vocaluxe/Screens/CScreenOptionsSound.cs index 53a6fb96..eb99f1be 100644 --- a/Vocaluxe/Screens/CScreenOptionsSound.cs +++ b/Vocaluxe/Screens/CScreenOptionsSound.cs @@ -22,12 +22,17 @@ using VocaluxeLib.Menu; namespace Vocaluxe.Screens { - public class CScreenOptionsSound : CMenu + public class CScreenOptionsSound : CScreenOptionsBase { // Version number for theme files. Increment it, if you've changed something on the theme files! protected override int _ScreenVersion { - get { return 5; } + get { return 6; } + } + + protected override EScreen _OptionsScreen + { + get { return EScreen.OptionsSound; } } private const string _SelectSlideBackgroundMusic = "SelectSlideBackgroundMusic"; @@ -75,12 +80,17 @@ namespace Vocaluxe.Screens if (CConfig.Config.Sound.PlayBackLib == EPlaybackLib.GstreamerSharp) { _SelectSlides[_SelectSlideKaraokeEffect].SetValues((int)CConfig.Config.Sound.KaraokeEffect); - _SelectSlides[_SelectSlideBackgroundMusicSource].Selection = (int)CConfig.Config.Sound.KaraokeEffect; + _SelectSlides[_SelectSlideKaraokeEffect].Selection = (int)CConfig.Config.Sound.KaraokeEffect; } } public override bool HandleInput(SKeyEvent keyEvent) { + if (_HandleNavigationInput(keyEvent)) + { + return true; + } + base.HandleInput(keyEvent); if (keyEvent.KeyPressed) { } @@ -91,7 +101,7 @@ namespace Vocaluxe.Screens case Keys.Escape: case Keys.Back: _SaveConfig(); - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.Main); break; case Keys.S: @@ -104,7 +114,7 @@ namespace Vocaluxe.Screens if (_Buttons[_ButtonExit].Selected) { _SaveConfig(); - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.Main); } break; @@ -124,12 +134,17 @@ namespace Vocaluxe.Screens public override bool HandleMouse(SMouseEvent mouseEvent) { + if (_HandleNavigationMouse(mouseEvent)) + { + return true; + } + base.HandleMouse(mouseEvent); if (mouseEvent.RB) { _SaveConfig(); - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.Main); } if (mouseEvent.LB && _IsMouseOverCurSelection(mouseEvent)) @@ -137,7 +152,7 @@ namespace Vocaluxe.Screens _SaveConfig(); if (_Buttons[_ButtonExit].Selected) { - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.Main); } } @@ -148,7 +163,8 @@ namespace Vocaluxe.Screens { if (_BackgroundMusicVolume != CConfig.BackgroundMusicVolume) { - _SelectSlides[_SelectSlideBackgroundMusicVolume].Selection = CConfig.BackgroundMusicVolume / 5; + _BackgroundMusicVolume = CConfig.BackgroundMusicVolume; + _SelectSlides[_SelectSlideBackgroundMusicVolume].Selection = _BackgroundMusicVolume / 5; } return true; @@ -190,5 +206,10 @@ namespace Vocaluxe.Screens CBackgroundMusic.Stop(); } } + + protected override void _SaveOptions() + { + _SaveConfig(); + } } } \ No newline at end of file diff --git a/Vocaluxe/Screens/CScreenOptionsTheme.cs b/Vocaluxe/Screens/CScreenOptionsTheme.cs index 7c717a41..9d461a73 100644 --- a/Vocaluxe/Screens/CScreenOptionsTheme.cs +++ b/Vocaluxe/Screens/CScreenOptionsTheme.cs @@ -24,12 +24,17 @@ using VocaluxeLib.Menu; namespace Vocaluxe.Screens { - public class CScreenOptionsTheme : CMenu + public class CScreenOptionsTheme : CScreenOptionsBase { // Version number for theme files. Increment it, if you've changed something on the theme files! protected override int _ScreenVersion { - get { return 3; } + get { return 4; } + } + + protected override EScreen _OptionsScreen + { + get { return EScreen.OptionsTheme; } } private const string _SelectSlideTheme = "SelectSlideTheme"; @@ -78,6 +83,11 @@ namespace Vocaluxe.Screens public override bool HandleInput(SKeyEvent keyEvent) { + if (_HandleNavigationInput(keyEvent)) + { + return true; + } + base.HandleInput(keyEvent); if (keyEvent.KeyPressed) { } @@ -119,6 +129,11 @@ namespace Vocaluxe.Screens public override bool HandleMouse(SMouseEvent mouseEvent) { + if (_HandleNavigationMouse(mouseEvent)) + { + return true; + } + base.HandleMouse(mouseEvent); if (mouseEvent.RB) @@ -169,7 +184,7 @@ namespace Vocaluxe.Screens private void _Close() { _SaveConfig(); - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.Main); } private void _SaveConfig() @@ -212,5 +227,10 @@ namespace Vocaluxe.Screens _ResumeBG(); } } + + protected override void _SaveOptions() + { + _SaveConfig(); + } } } \ No newline at end of file diff --git a/Vocaluxe/Screens/CScreenOptionsVideo.cs b/Vocaluxe/Screens/CScreenOptionsVideo.cs index 5f7e9f82..d6bafafd 100644 --- a/Vocaluxe/Screens/CScreenOptionsVideo.cs +++ b/Vocaluxe/Screens/CScreenOptionsVideo.cs @@ -26,12 +26,17 @@ using VocaluxeLib.Menu; namespace Vocaluxe.Screens { - public class CScreenOptionsVideo : CMenu + public class CScreenOptionsVideo : CScreenOptionsBase { // Version number for theme files. Increment it, if you've changed something on the theme files! protected override int _ScreenVersion { - get { return 5; } + get { return 6; } + } + + protected override EScreen _OptionsScreen + { + get { return EScreen.OptionsVideo; } } private const string _SelectSlideVideoBackgrounds = "SelectSlideVideoBackgrounds"; @@ -81,6 +86,11 @@ namespace Vocaluxe.Screens public override bool HandleInput(SKeyEvent keyEvent) { + if (_HandleNavigationInput(keyEvent)) + { + return true; + } + base.HandleInput(keyEvent); if (keyEvent.KeyPressed) { } @@ -91,7 +101,7 @@ namespace Vocaluxe.Screens case Keys.Escape: case Keys.Back: _SaveConfig(); - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.Main); break; case Keys.S: @@ -104,7 +114,7 @@ namespace Vocaluxe.Screens if (_Buttons[_ButtonExit].Selected) { _SaveConfig(); - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.Main); } else if (_Buttons[_ButtonScreenAdjustments].Selected) { @@ -149,12 +159,17 @@ namespace Vocaluxe.Screens public override bool HandleMouse(SMouseEvent mouseEvent) { + if (_HandleNavigationMouse(mouseEvent)) + { + return true; + } + base.HandleMouse(mouseEvent); if (mouseEvent.RB) { _SaveConfig(); - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.Main); } if (mouseEvent.LB && _IsMouseOverCurSelection(mouseEvent)) @@ -172,7 +187,7 @@ namespace Vocaluxe.Screens _SaveConfig(); if (_Buttons[_ButtonExit].Selected) { - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.Main); } if (_Buttons[_ButtonScreenAdjustments].Selected) @@ -254,7 +269,11 @@ namespace Vocaluxe.Screens CConfig.Config.Video.VideosInSongs = (EOffOn)_SelectSlides[_SelectSlideVideosInSongs].Selection; CConfig.Config.Video.VideosToBackground = (EOffOn)_SelectSlides[_SelectSlideVideosToBackground].Selection; - CConfig.Config.Video.WebcamConfig = _Config; + if (_DeviceNr >= 0 && _CapabilityNr >= 0) + { + CConfig.Config.Video.WebcamConfig = _Config; + } + CBackgroundMusic.VideoEnabled = CConfig.Config.Video.VideoBackgrounds == EOffOn.TR_CONFIG_ON && CConfig.Config.Video.VideosToBackground == EOffOn.TR_CONFIG_ON; CConfig.SaveConfig(); @@ -334,5 +353,10 @@ namespace Vocaluxe.Screens capabilities = 0; return true; } + + protected override void _SaveOptions() + { + _SaveConfig(); + } } } \ No newline at end of file diff --git a/Vocaluxe/Vocaluxe.csproj b/Vocaluxe/Vocaluxe.csproj index c2874891..44d84c57 100644 --- a/Vocaluxe/Vocaluxe.csproj +++ b/Vocaluxe/Vocaluxe.csproj @@ -341,7 +341,7 @@ - + @@ -360,6 +360,7 @@ + Designer diff --git a/VocaluxeLib/Enums.cs b/VocaluxeLib/Enums.cs index 1f905231..9f0046ac 100644 --- a/VocaluxeLib/Enums.cs +++ b/VocaluxeLib/Enums.cs @@ -411,7 +411,6 @@ namespace VocaluxeLib Load, Main, Song, - Options, Sing, Profiles, Score, @@ -426,6 +425,7 @@ namespace VocaluxeLib OptionsTheme, OptionsGraphics, OptionsServer, + OptionsSongFolders, Names, Credits, diff --git a/VocaluxeLib/IBasic.cs b/VocaluxeLib/IBasic.cs index dc973273..ba91a727 100644 --- a/VocaluxeLib/IBasic.cs +++ b/VocaluxeLib/IBasic.cs @@ -50,6 +50,7 @@ namespace VocaluxeLib EOffOn GetDrawNoteLines(); EOffOn GetDrawToneHelper(); + EOffOn GetTileCaption(); int GetCoverSize(); diff --git a/VocaluxeLib/Menu/COrderedDictionaryLite.cs b/VocaluxeLib/Menu/COrderedDictionaryLite.cs index 17290fb9..b35808d0 100644 --- a/VocaluxeLib/Menu/COrderedDictionaryLite.cs +++ b/VocaluxeLib/Menu/COrderedDictionaryLite.cs @@ -89,6 +89,11 @@ namespace VocaluxeLib.Menu return _Items.Count - 1; } + public bool ContainsKey(String key) + { + return _HtIndex.ContainsKey(key); + } + public IEnumerator GetEnumerator() { return _Items.GetEnumerator(); diff --git a/VocaluxeLib/Menu/CSelectSlide.cs b/VocaluxeLib/Menu/CSelectSlide.cs index cbd23a08..9bac5a7a 100644 --- a/VocaluxeLib/Menu/CSelectSlide.cs +++ b/VocaluxeLib/Menu/CSelectSlide.cs @@ -111,8 +111,10 @@ namespace VocaluxeLib.Menu public bool Selectable { - get { return Visible; } + get { return Visible && Enabled; } } + + public bool Enabled { get; set; } = true; public override float X { set @@ -629,6 +631,11 @@ namespace VocaluxeLib.Menu return; } + if (!Enabled) + { + CBase.Drawing.PushTransform(1f, 0f, 0f, 0f, 0.4f); + } + if (Selected) { CBase.Drawing.DrawTexture(_SelTexture, Rect, _SelColor); @@ -672,6 +679,11 @@ namespace VocaluxeLib.Menu element.Text.Draw(); element.Img.Draw(); } + + if (!Enabled) + { + CBase.Drawing.PopTransform(); + } } public object GetTheme()

=zrX9G5r8}~#E!zF*gdZQ-EY1fiNW#1%(S3GW$4NAHqum}HgRJMsU*Co zXgPj*OEU*OJBQ3%W4~pHXE-m~$P3NaL}DBoQO?x-3TUBrvSOSWxs*?yy^Af!CHG%K zm1_n&4Zl-F^-HP?n>4Ao`a=KpLW9*K3DzP!8O=*;$M-^s&u3jcs(5i;c+D*=|-rYXbS8I8qMEU@W>E%!`ohzuQ^joZEflc}f zIsc8c&x9KL$T&|@g}5MZh53@PSBvw4%>dU!Ra0!X&3`l;dET=!{fb0pBlVO_ZOkjd zLPW8Skku{zbRSjp(Z%YFsk6sM*ul}i(J={8snf@2>&-32SLya5>HBPo>!42)KwOFL zJ=Dnty^}Yx*qsx( czRyUjYDHBST=*o`+NS`>0Z+HueZiUk01ft!?*IS* literal 0 HcmV?d00001 diff --git a/Output/Themes/Vocaluxe 2024/OptionsSlideSelected.png b/Output/Themes/Vocaluxe 2024/OptionsSlideSelected.png new file mode 100644 index 0000000000000000000000000000000000000000..9dee3dad7a7981d15123d94234786938ef4c9481 GIT binary patch literal 2085 zcmeHH`BM{j6i;==I&`Qqj00jx1Q)bg1knbOg2>S7qC|ldXrdgVAz@8ZLpe;irbCSy zAa(;D5J9nqLrIaa;S%x0q-bfNYz~Oj8t8~gQ3(kc#Rhg~`ag7hKkR(>z0c=;-}hZ7 z_fd8_J9#(}2n1(vS7a=Kump9SbC)i0d>P@rQv||?CNOdbHCJLbsD;$S?hjs$hIFA) zFAwjEq_GRTVq6TyWKNKa&#Bz>gi5cUys1^4nSWK}d{2`Y>Y5qcFw)k5kj!z@`RD%q znY2?p1phM6B7X_dQmn`VVE!{dWn^3NIjuFu6#aRzuI7LX_Kpe*FQOl%wp4%=V84W`k0SB1u3L`tE`}#!Nhw;Cil@M-_&w--3jPOO za2z={7KydK_TUr|CHm;11DovMVycw8doEuIok(SG2kACXY^-h_pYUV%2#~Hj_>f-v zgRVCa(SOz+>wNtM?kc1EieWOMZwx*MkJ$u-i3 z(q?Ol>7)eBufwR#zJp9g_XWd*UsDirf4#C5tp+;KIxU(dzyV&o&0S;+dV(nu>9Z*yxunfLx2r!H zTQ7e`53C({?D0zvyD8t+Sg#1Y=6MQo6X#VJM@~Tfy|(xQH!L)=_Fx1%ClaX<=NV{S zUF#di+P9L4y=YB0>OXT7?gJ^Jc2qPbbYkOAsl6Kw<$NL%k5IUB#Ck~G8-Kv4byw^k zld^c}_Ye^*S^4g}7|X{=8h?D#X_)D(HEARwzuYJw4$+_Dm)jk}@==)KYyj3*| zOs?%XeaK(+O&o+>a!77Tv<9dOU_Mw7^(uwcY*K!T94=gRf>cZf)BLjLQQ()9NLfV6 G5B~yzA(;mN literal 0 HcmV?d00001 diff --git a/Output/Themes/Vocaluxe 2024/Screens/ScreenOptions.xml b/Output/Themes/Vocaluxe 2024/Screens/ScreenOptions.xml deleted file mode 100644 index cbd3c331..00000000 --- a/Output/Themes/Vocaluxe 2024/Screens/ScreenOptions.xml +++ /dev/null @@ -1,412 +0,0 @@ - - - - ScreenOptions - 4 - - - - Video - - - BG_Default - - - - - - LogoMain - - - 435 - 265.5 - 1110 - 202.5 - 0 - - - - Warning - - - 695 - 700 - 1140 - 75 - -1 - - - - - - 1265 - 720 - -1.1 - 37.5 - 960 - - - Center - Center - - Outline - TR_SCREENO_WARNINGRESTART - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Output/Themes/Vocaluxe 2024/Screens/ScreenOptionsGame.xml b/Output/Themes/Vocaluxe 2024/Screens/ScreenOptionsGame.xml index 49bd6726..33083c48 100644 --- a/Output/Themes/Vocaluxe 2024/Screens/ScreenOptionsGame.xml +++ b/Output/Themes/Vocaluxe 2024/Screens/ScreenOptionsGame.xml @@ -2,7 +2,7 @@ ScreenOptionsGame - 6 + 7 @@ -25,6 +25,270 @@ 1 + + OptionsNavBackground + + + 45 + 150 + 375 + 735 + 0.3 + + + + ButtonTile + + + 60 + 162 + 345 + 62 + 0.2 + + + + OptionsIconGame + + + 75 + 171 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 233.5 + 345 + 62 + 0.2 + + + + OptionsIconSound + + + 75 + 242.5 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 305 + 345 + 62 + 0.2 + + + + SingIcon + + + 75 + 314 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 376.5 + 345 + 62 + 0.2 + + + + VideoIcon + + + 75 + 385.5 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 448 + 345 + 62 + 0.2 + + + + OptionsIconLyrics + + + 75 + 457 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 519.5 + 345 + 62 + 0.2 + + + + OptionsIconTheme + + + 75 + 528.5 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 591 + 345 + 62 + 0.2 + + + + OptionsIconGraphics + + + 75 + 600 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 662.5 + 345 + 62 + 0.2 + + + + OptionsIconServer + + + 75 + 671.5 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 734 + 345 + 62 + 0.2 + + + + OptionsIconSongFolders + + + 75 + 743 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 805.5 + 345 + 62 + 0.2 + + + + Star + + + 75 + 814.5 + 44 + 44 + 0.1 + + + + OptionsNavSelected + + + 0 + 0 + 345 + 62 + 0.15 + + + + + + + 0 + 0 + 44 + 44 + 0.1 + + + + CoverTextBackground + + + 435 + 150 + 1440 + 735 + 0.3 + + @@ -42,11 +306,11 @@ TR_SCREENOGAME_OPTIONS - 112.5 - 160.5 + 465 + 181.75 0 40.5 - 0 + 480 Left @@ -56,11 +320,11 @@ TR_SCREENOGAME_LANGUAGE - 112.5 - 250.5 + 465 + 259.31 0 40.5 - 0 + 480 Left @@ -70,11 +334,11 @@ TR_SCREENOGAME_DEBUGLEVEL - 112.5 - 340.5 + 465 + 336.86 0 40.5 - 0 + 480 Left @@ -84,11 +348,11 @@ TR_SCREENOGAME_SONGMENU - 112.5 - 430.5 + 465 + 491.97 0 40.5 - 0 + 480 Left @@ -98,11 +362,11 @@ TR_SCREENOGAME_SONGSORTING - 112.5 - 520.5 + 465 + 569.53 0 40.5 - 0 + 480 Left @@ -111,12 +375,26 @@ Outline TR_SCREENOGAME_TABS - - 112.5 - 610.5 + + 465 + 414.42 0 40.5 - 0 + 480 + + + Left + Center + + Outline + TR_SCREENOGAME_TILECAPTION + + + 465 + 647.08 + 0 + 40.5 + 480 Left @@ -126,11 +404,11 @@ TR_SCREENOGAME_AUTOPLAYPREVIEWS - 112.5 - 700.5 + 465 + 724.64 0 40.5 - 0 + 480 Left @@ -140,11 +418,11 @@ TR_SCREENOGAME_TIMERMODE - 112.5 - 790.5 + 465 + 802.19 0 40.5 - 0 + 480 Left @@ -153,6 +431,160 @@ Outline TR_SCREENOGAME_HIGHSCORESTYLE + + 135 + 173 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_GAME + + + 135 + 244.5 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_SOUND + + + 135 + 316 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_RECORD + + + 135 + 387.5 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_VIDEO + + + 135 + 459 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_LYRICS + + + 135 + 530.5 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_THEME + + + 135 + 602 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_GRAPHICS + + + 135 + 673.5 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_SERVER + + + 135 + 745 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_SONGFOLDER + + + 135 + 816.5 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_CREDITS + + + 0 + 0 + 0 + 40.5 + 255 + + + Left + Center + + Outline + + @@ -476,28 +886,28 @@ SelectSlideArrowLeft SelectSlideArrowRight - SelectSlide + OptionsSlideSelected SelectSlideArrowLeft SelectSlideArrowRight - 750 - 150 - 1072.5 - 75 + 965 + 172 + 890 + 60 0 - 757.5 - 157.5 - 60 - 60 + 971 + 178 + 48 + 48 0 - 1755 - 157.5 - 60 - 60 + 1801 + 178 + 48 + 48 0 @@ -506,10 +916,10 @@ - 40.5 - 75 + 36 + 60 0 - 924 + 760 Outline Bold 1 @@ -518,28 +928,28 @@ SelectSlideArrowLeft SelectSlideArrowRight - SelectSlide + OptionsSlideSelected SelectSlideArrowLeft SelectSlideArrowRight - 750 - 330 - 1072.5 - 75 + 1045 + 322.75 + 810 + 60 0 - 757.5 - 337.5 - 60 - 60 + 1051 + 328.75 + 48 + 48 0 - 1755 - 337.5 - 60 - 60 + 1801 + 328.75 + 48 + 48 0 @@ -548,10 +958,10 @@ - 40.5 - 75 + 36 + 60 0 - 231 + 88.57 Outline Bold 7 @@ -560,28 +970,28 @@ SelectSlideArrowLeft SelectSlideArrowRight - SelectSlide + OptionsSlideSelected SelectSlideArrowLeft SelectSlideArrowRight - 750 - 420 - 1072.5 - 75 + 1045 + 398.12 + 810 + 60 0 - 757.5 - 427.5 - 60 - 60 + 1051 + 404.12 + 48 + 48 0 - 1755 - 427.5 - 60 - 60 + 1801 + 404.12 + 48 + 48 0 @@ -590,10 +1000,10 @@ - 40.5 - 75 + 36 + 60 0 - 231 + 88.57 Outline Bold 7 @@ -602,28 +1012,28 @@ SelectSlideArrowLeft SelectSlideArrowRight - SelectSlide + OptionsSlideSelected SelectSlideArrowLeft SelectSlideArrowRight - 750 - 510 - 1072.5 - 75 + 1045 + 473.5 + 810 + 60 0 - 757.5 - 517.5 - 60 - 60 + 1051 + 479.5 + 48 + 48 0 - 1755 - 517.5 - 60 - 60 + 1801 + 479.5 + 48 + 48 0 @@ -632,10 +1042,10 @@ - 40.5 - 75 + 36 + 60 0 - 231 + 88.57 Outline Bold 7 @@ -644,28 +1054,28 @@ SelectSlideArrowLeft SelectSlideArrowRight - SelectSlide + OptionsSlideSelected SelectSlideArrowLeft SelectSlideArrowRight - 750 - 600 - 1072.5 - 75 + 1045 + 548.88 + 810 + 60 0 - 757.5 - 607.5 - 60 - 60 + 1051 + 554.88 + 48 + 48 0 - 1755 - 607.5 - 60 - 60 + 1801 + 554.88 + 48 + 48 0 @@ -674,10 +1084,10 @@ - 40.5 - 75 + 36 + 60 0 - 231 + 88.57 Outline Bold 7 @@ -686,28 +1096,28 @@ SelectSlideArrowLeft SelectSlideArrowRight - SelectSlide + OptionsSlideSelected SelectSlideArrowLeft SelectSlideArrowRight - 750 - 690 - 1072.5 - 75 + 1045 + 624.25 + 810 + 60 0 - 757.5 - 697.5 - 60 - 60 + 1051 + 630.25 + 48 + 48 0 - 1755 - 697.5 - 60 - 60 + 1801 + 630.25 + 48 + 48 0 @@ -716,10 +1126,10 @@ - 40.5 - 75 + 36 + 60 0 - 231 + 88.57 Outline Bold 7 @@ -728,28 +1138,28 @@ SelectSlideArrowLeft SelectSlideArrowRight - SelectSlide + OptionsSlideSelected SelectSlideArrowLeft SelectSlideArrowRight - 750 - 780 - 1072.5 - 75 + 1045 + 699.62 + 810 + 60 0 - 757.5 - 787.5 - 60 - 60 + 1051 + 705.62 + 48 + 48 0 - 1755 - 787.5 - 60 - 60 + 1801 + 705.62 + 48 + 48 0 @@ -758,10 +1168,10 @@ - 40.5 - 75 + 36 + 60 0 - 231 + 88.57 Outline Bold 7 @@ -770,28 +1180,28 @@ SelectSlideArrowLeft SelectSlideArrowRight - SelectSlide + OptionsSlideSelected SelectSlideArrowLeft SelectSlideArrowRight - 750 - 240 - 1072.5 - 75 + 965 + 247.38 + 890 + 60 0 - 757.5 - 247.5 - 60 - 60 + 971 + 253.38 + 48 + 48 0 - 1755 - 247.5 - 60 - 60 + 1801 + 253.38 + 48 + 48 0 @@ -800,10 +1210,10 @@ - 40.5 - 75 + 36 + 60 0 - 180 + 144 Outline Bold 5 @@ -815,10 +1225,10 @@ - 405 - 330 - 150 - 60 + 680 + 330.75 + 120 + 44 -1 12 @@ -834,10 +1244,10 @@ - 405 - 420 - 150 - 60 + 680 + 406.12 + 120 + 44 -1 12 @@ -853,10 +1263,10 @@ - 405 - 510 - 150 - 60 + 680 + 481.5 + 120 + 44 -1 12 @@ -872,10 +1282,10 @@ - 405 - 600 - 150 - 60 + 680 + 556.88 + 120 + 44 -1 12 @@ -891,10 +1301,10 @@ - 405 - 690 - 150 - 60 + 680 + 632.25 + 120 + 44 -1 12 @@ -910,10 +1320,10 @@ - 405 - 780 - 150 - 60 + 680 + 707.62 + 120 + 44 -1 12 diff --git a/Output/Themes/Vocaluxe 2024/Screens/ScreenOptionsServer.xml b/Output/Themes/Vocaluxe 2024/Screens/ScreenOptionsServer.xml index a5126a1d..fc0691de 100644 --- a/Output/Themes/Vocaluxe 2024/Screens/ScreenOptionsServer.xml +++ b/Output/Themes/Vocaluxe 2024/Screens/ScreenOptionsServer.xml @@ -2,7 +2,7 @@ ScreenOptionsSercer - 1 + 2 @@ -29,13 +29,277 @@ Warning - 390 + 585 900 1140 75 -1 + + OptionsNavBackground + + + 45 + 150 + 375 + 735 + 0.3 + + + + ButtonTile + + + 60 + 162 + 345 + 62 + 0.2 + + + + OptionsIconGame + + + 75 + 171 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 233.5 + 345 + 62 + 0.2 + + + + OptionsIconSound + + + 75 + 242.5 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 305 + 345 + 62 + 0.2 + + + + SingIcon + + + 75 + 314 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 376.5 + 345 + 62 + 0.2 + + + + VideoIcon + + + 75 + 385.5 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 448 + 345 + 62 + 0.2 + + + + OptionsIconLyrics + + + 75 + 457 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 519.5 + 345 + 62 + 0.2 + + + + OptionsIconTheme + + + 75 + 528.5 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 591 + 345 + 62 + 0.2 + + + + OptionsIconGraphics + + + 75 + 600 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 662.5 + 345 + 62 + 0.2 + + + + OptionsIconServer + + + 75 + 671.5 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 734 + 345 + 62 + 0.2 + + + + OptionsIconSongFolders + + + 75 + 743 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 805.5 + 345 + 62 + 0.2 + + + + Star + + + 75 + 814.5 + 44 + 44 + 0.1 + + + + OptionsNavSelected + + + 0 + 0 + 345 + 62 + 0.15 + + + + + + + 0 + 0 + 44 + 44 + 0.1 + + + + CoverTextBackground + + + 435 + 150 + 1440 + 735 + 0.3 + + @@ -53,11 +317,11 @@ TR_SCREENOSERVER_OPTIONS - 112.5 - 160.5 + 465 + 181.75 0 40.5 - 0 + 480 Left @@ -67,11 +331,11 @@ TR_SCREENOSERVER_ACTIVE - 112.5 - 250.5 + 465 + 261.75 0 40.5 - 0 + 480 Left @@ -81,7 +345,7 @@ TR_SCREENOSERVER_ENCRYPTION - 960 + 1155 920 -1.1 37.5 @@ -94,6 +358,160 @@ Outline TR_SCREENO_WARNINGRESTART + + 135 + 173 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_GAME + + + 135 + 244.5 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_SOUND + + + 135 + 316 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_RECORD + + + 135 + 387.5 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_VIDEO + + + 135 + 459 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_LYRICS + + + 135 + 530.5 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_THEME + + + 135 + 602 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_GRAPHICS + + + 135 + 673.5 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_SERVER + + + 135 + 745 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_SONGFOLDER + + + 135 + 816.5 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_CREDITS + + + 0 + 0 + 0 + 40.5 + 255 + + + Left + Center + + Outline + + @@ -174,28 +584,28 @@ SelectSlideArrowLeft SelectSlideArrowRight - SelectSlide + OptionsSlideSelected SelectSlideArrowLeft SelectSlideArrowRight - 750 - 150 - 1072.5 - 75 + 965 + 172 + 890 + 60 0 - 757.5 - 157.5 - 60 - 60 + 971 + 178 + 48 + 48 0 - 1755 - 157.5 - 60 - 60 + 1801 + 178 + 48 + 48 0 @@ -204,10 +614,10 @@ - 40.5 - 75 + 36 + 60 0 - 300 + 246.67 Outline Bold 3 @@ -216,28 +626,28 @@ SelectSlideArrowLeft SelectSlideArrowRight - SelectSlide + OptionsSlideSelected SelectSlideArrowLeft SelectSlideArrowRight - 750 - 240 - 1072.5 - 75 + 965 + 252 + 890 + 60 0 - 757.5 - 247.5 - 60 - 60 + 971 + 258 + 48 + 48 0 - 1755 - 247.5 - 60 - 60 + 1801 + 258 + 48 + 48 0 @@ -246,10 +656,10 @@ - 40.5 - 75 + 36 + 60 0 - 300 + 246.67 Outline Bold 3 diff --git a/Output/Themes/Vocaluxe 2024/Screens/ScreenOptionsSongFolders.xml b/Output/Themes/Vocaluxe 2024/Screens/ScreenOptionsSongFolders.xml new file mode 100644 index 00000000..b7344abc --- /dev/null +++ b/Output/Themes/Vocaluxe 2024/Screens/ScreenOptionsSongFolders.xml @@ -0,0 +1,1023 @@ + + + + ScreenOptionsSongFolders + 3 + + + + Video + + + BG_Options + + + + + + + + + 0 + 60 + 1920 + 67.5 + 1 + + + + Warning + + + 585 + 900 + 1140 + 75 + -1 + + + + SelectSlide + + + 450 + 165 + 1360 + 62 + 0.1 + + + + SelectSlide + + + 450 + 240 + 1360 + 62 + 0.1 + + + + SelectSlide + + + 450 + 315 + 1360 + 62 + 0.1 + + + + SelectSlide + + + 450 + 390 + 1360 + 62 + 0.1 + + + + SelectSlide + + + 450 + 465 + 1360 + 62 + 0.1 + + + + SelectSlide + + + 450 + 540 + 1360 + 62 + 0.1 + + + + SelectSlide + + + 450 + 615 + 1360 + 62 + 0.1 + + + + SelectSlide + + + 450 + 690 + 1360 + 62 + 0.1 + + + + OptionsNavBackground + + + 45 + 150 + 375 + 735 + 0.3 + + + + ButtonTile + + + 60 + 162 + 345 + 62 + 0.2 + + + + OptionsIconGame + + + 75 + 171 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 233.5 + 345 + 62 + 0.2 + + + + OptionsIconSound + + + 75 + 242.5 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 305 + 345 + 62 + 0.2 + + + + SingIcon + + + 75 + 314 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 376.5 + 345 + 62 + 0.2 + + + + VideoIcon + + + 75 + 385.5 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 448 + 345 + 62 + 0.2 + + + + OptionsIconLyrics + + + 75 + 457 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 519.5 + 345 + 62 + 0.2 + + + + OptionsIconTheme + + + 75 + 528.5 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 591 + 345 + 62 + 0.2 + + + + OptionsIconGraphics + + + 75 + 600 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 662.5 + 345 + 62 + 0.2 + + + + OptionsIconServer + + + 75 + 671.5 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 734 + 345 + 62 + 0.2 + + + + OptionsIconSongFolders + + + 75 + 743 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 805.5 + 345 + 62 + 0.2 + + + + Star + + + 75 + 814.5 + 44 + 44 + 0.1 + + + + OptionsNavSelected + + + 0 + 0 + 345 + 62 + 0.15 + + + + + + + 0 + 0 + 44 + 44 + 0.1 + + + + CoverTextBackground + + + 435 + 150 + 1440 + 735 + 0.3 + + + + + + 1 + 1 + 1 + 0.15 + + + 1835 + 165 + 6 + 587 + 0.1 + + + + + + 1 + 1 + 1 + 0.8 + + + 1835 + 165 + 6 + 587 + 0.05 + + + + + + 960 + 75 + 0 + 40.5 + 0 + + + Center + Center + + Outline + TR_SCREENOSONGFOLDERS_TITLE + + + 1155 + 920 + -1.1 + 37.5 + 960 + + + Center + Center + + Outline + TR_SCREENO_WARNINGRESTART + + + 1155 + 450 + 0 + 40.5 + 1300 + + + Center + Center + + Outline + TR_SCREENOSONGFOLDERS_NOFOLDERS + + + 475 + 176 + 0 + 40.5 + 1240 + + + Left + Center + + Outline + + + + 475 + 251 + 0 + 40.5 + 1240 + + + Left + Center + + Outline + + + + 475 + 326 + 0 + 40.5 + 1240 + + + Left + Center + + Outline + + + + 475 + 401 + 0 + 40.5 + 1240 + + + Left + Center + + Outline + + + + 475 + 476 + 0 + 40.5 + 1240 + + + Left + Center + + Outline + + + + 475 + 551 + 0 + 40.5 + 1240 + + + Left + Center + + Outline + + + + 475 + 626 + 0 + 40.5 + 1240 + + + Left + Center + + Outline + + + + 475 + 701 + 0 + 40.5 + 1240 + + + Left + Center + + Outline + + + + 135 + 173 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_GAME + + + 135 + 244.5 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_SOUND + + + 135 + 316 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_RECORD + + + 135 + 387.5 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_VIDEO + + + 135 + 459 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_LYRICS + + + 135 + 530.5 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_THEME + + + 135 + 602 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_GRAPHICS + + + 135 + 673.5 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_SERVER + + + 135 + 745 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_SONGFOLDER + + + 135 + 816.5 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_CREDITS + + + 0 + 0 + 0 + 40.5 + 255 + + + Left + Center + + Outline + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Output/Themes/Vocaluxe 2024/Screens/ScreenOptionsSound.xml b/Output/Themes/Vocaluxe 2024/Screens/ScreenOptionsSound.xml index e57e67e9..bc5a38e2 100644 --- a/Output/Themes/Vocaluxe 2024/Screens/ScreenOptionsSound.xml +++ b/Output/Themes/Vocaluxe 2024/Screens/ScreenOptionsSound.xml @@ -2,7 +2,7 @@ ScreenOptionsSound - 5 + 6 @@ -25,6 +25,270 @@ 1 + + OptionsNavBackground + + + 45 + 150 + 375 + 735 + 0.3 + + + + ButtonTile + + + 60 + 162 + 345 + 62 + 0.2 + + + + OptionsIconGame + + + 75 + 171 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 233.5 + 345 + 62 + 0.2 + + + + OptionsIconSound + + + 75 + 242.5 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 305 + 345 + 62 + 0.2 + + + + SingIcon + + + 75 + 314 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 376.5 + 345 + 62 + 0.2 + + + + VideoIcon + + + 75 + 385.5 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 448 + 345 + 62 + 0.2 + + + + OptionsIconLyrics + + + 75 + 457 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 519.5 + 345 + 62 + 0.2 + + + + OptionsIconTheme + + + 75 + 528.5 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 591 + 345 + 62 + 0.2 + + + + OptionsIconGraphics + + + 75 + 600 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 662.5 + 345 + 62 + 0.2 + + + + OptionsIconServer + + + 75 + 671.5 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 734 + 345 + 62 + 0.2 + + + + OptionsIconSongFolders + + + 75 + 743 + 44 + 44 + 0.1 + + + + ButtonTile + + + 60 + 805.5 + 345 + 62 + 0.2 + + + + Star + + + 75 + 814.5 + 44 + 44 + 0.1 + + + + OptionsNavSelected + + + 0 + 0 + 345 + 62 + 0.15 + + + + + + + 0 + 0 + 44 + 44 + 0.1 + + + + CoverTextBackground + + + 435 + 150 + 1440 + 735 + 0.3 + + @@ -42,11 +306,11 @@ TR_SCREENOSOUND_OPTIONS - 112.5 - 160.5 + 465 + 181.75 0 40.5 - 0 + 480 Left @@ -56,11 +320,11 @@ TR_SCREENOSOUND_BACKGROUNDMUSIC - 112.5 - 250.5 + 465 + 261.75 0 40.5 - 0 + 480 Left @@ -70,11 +334,11 @@ TR_SCREENOSOUND_BACKGROUNDMUSICVOLUME - 112.5 - 340.5 + 465 + 341.75 0 40.5 - 0 + 480 Left @@ -84,11 +348,11 @@ TR_SCREENOSOUND_BACKGROUNDMUSICSOURCE - 112.5 - 430.5 + 465 + 421.75 0 40.5 - 0 + 480 Left @@ -98,11 +362,11 @@ TR_SCREENOSOUND_PREVIEWMUSICVOLUME - 112.5 - 520.5 + 465 + 501.75 0 40.5 - 0 + 480 Left @@ -112,11 +376,11 @@ TR_SCREENOSOUND_GAMEMUSICVOLUME - 112.5 - 610.5 + 465 + 581.75 0 40.5 - 0 + 480 Left @@ -126,11 +390,11 @@ TR_SCREENOSOUND_SOUNDEFFECTVOLUME - 112.5 - 700.5 + 465 + 661.75 0 40.5 - 0 + 480 Left @@ -139,6 +403,160 @@ Outline TR_SCREENOSOUND_KARAOKEEFFECT + + 135 + 173 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_GAME + + + 135 + 244.5 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_SOUND + + + 135 + 316 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_RECORD + + + 135 + 387.5 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_VIDEO + + + 135 + 459 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_LYRICS + + + 135 + 530.5 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_THEME + + + 135 + 602 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_GRAPHICS + + + 135 + 673.5 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_SERVER + + + 135 + 745 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_SONGFOLDER + + + 135 + 816.5 + 0 + 40.5 + 255 + + + Left + Center + + Outline + TR_SCREENO_BUTTON_CREDITS + + + 0 + 0 + 0 + 40.5 + 255 + + + Left + Center + + Outline + + @@ -216,28 +626,28 @@ SelectSlideArrowLeft SelectSlideArrowRight - SelectSlide + OptionsSlideSelected SelectSlideArrowLeft SelectSlideArrowRight - 750 - 150 - 1072.5 - 75 + 965 + 172 + 890 + 60 0 - 757.5 - 157.5 - 60 - 60 + 971 + 178 + 48 + 48 0 - 1755 - 157.5 - 60 - 60 + 1801 + 178 + 48 + 48 0 @@ -246,10 +656,10 @@ - 40.5 - 75 + 36 + 60 0 - 300 + 246.67 Outline Bold 3 @@ -258,28 +668,28 @@ SelectSlideArrowLeft SelectSlideArrowRight - SelectSlide + OptionsSlideSelected SelectSlideArrowLeft SelectSlideArrowRight - 750 - 240 - 1072.5 - 75 + 965 + 243.33 + 890 + 60 0 - 757.5 - 247.5 - 60 - 60 + 971 + 249.33 + 48 + 48 0 - 1755 - 247.5 - 60 - 60 + 1801 + 249.33 + 48 + 48 0 @@ -288,10 +698,10 @@ - 40.5 - 75 + 36 + 60 0 - 300 + 246.67 Outline Bold 3 @@ -300,28 +710,28 @@ SelectSlideArrowLeft SelectSlideArrowRight - SelectSlide + OptionsSlideSelected SelectSlideArrowLeft SelectSlideArrowRight - 750 - 330 - 1072.5 - 75 + 965 + 314.67 + 890 + 60 0 - 757.5 - 337.5 - 60 - 60 + 971 + 320.67 + 48 + 48 0 - 1755 - 337.5 - 60 - 60 + 1801 + 320.67 + 48 + 48 0 @@ -330,10 +740,10 @@ - 40.5 - 75 + 36 + 60 0 - 300 + 246.67 Outline Bold 3 @@ -342,28 +752,28 @@ SelectSlideArrowLeft SelectSlideArrowRight - SelectSlide + OptionsSlideSelected SelectSlideArrowLeft SelectSlideArrowRight - 750 - 420 - 1072.5 - 75 + 965 + 386 + 890 + 60 0 - 757.5 - 427.5 - 60 - 60 + 971 + 392 + 48 + 48 0 - 1755 - 427.5 - 60 - 60 + 1801 + 392 + 48 + 48 0 @@ -372,10 +782,10 @@ - 40.5 - 75 + 36 + 60 0 - 300 + 246.67 Outline Bold 3 @@ -384,28 +794,28 @@ SelectSlideArrowLeft SelectSlideArrowRight - SelectSlide + OptionsSlideSelected SelectSlideArrowLeft SelectSlideArrowRight - 750 - 510 - 1072.5 - 75 + 965 + 457.33 + 890 + 60 0 - 757.5 - 517.5 - 60 - 60 + 971 + 463.33 + 48 + 48 0 - 1755 - 517.5 - 60 - 60 + 1801 + 463.33 + 48 + 48 0 @@ -414,10 +824,10 @@ - 40.5 - 75 + 36 + 60 0 - 300 + 246.67 Outline Bold 3 @@ -426,28 +836,28 @@ SelectSlideArrowLeft SelectSlideArrowRight - SelectSlide + OptionsSlideSelected SelectSlideArrowLeft SelectSlideArrowRight - 750 - 600 - 1072.5 - 75 + 965 + 528.67 + 890 + 60 0 - 757.5 - 607.5 - 60 - 60 + 971 + 534.67 + 48 + 48 0 - 1755 - 607.5 - 60 - 60 + 1801 + 534.67 + 48 + 48 0 @@ -456,10 +866,10 @@ - 27 - 50 + 36 + 60 0 - 150 + 246.67 Outline Bold 3 diff --git a/Vocaluxe/Base/CConfig.cs b/Vocaluxe/Base/CConfig.cs index dae4516a..cb338521 100644 --- a/Vocaluxe/Base/CConfig.cs +++ b/Vocaluxe/Base/CConfig.cs @@ -192,6 +192,8 @@ namespace Vocaluxe.Base public EOffOn Tabs; [DefaultValue(EOffOn.TR_CONFIG_OFF)] public EOffOn AutoplayPreviews; + [DefaultValue(EOffOn.TR_CONFIG_ON)] + public EOffOn TileCaption; [XmlAltName("AutoplayPreviewDelay"), DefaultValue(500)] public int AutoplayPreviewDelay; [DefaultValue(ELyricsPosition.TR_CONFIG_LYRICSPOSITION_BOTTOM)] @@ -509,7 +511,7 @@ namespace Vocaluxe.Base case "TextureQuality": return "TextureQuality: " + CHelper.ListStrings(Enum.GetNames(typeof(ETextureQuality))); case "CoverSize": - return "CoverSize (pixels): 32, 64, 128, 256, 512, 1024 (default: 512)"; + return "CoverSize (pixels): 128, 256, 512, 1024 (default: 512)"; case "NumScreens": return "Number of screens to use. 1 - 6 (default: 1)"; case "ScreenW": @@ -546,6 +548,8 @@ namespace Vocaluxe.Base return "Cover Loading: " + CHelper.ListStrings(Enum.GetNames(typeof(ECoverLoading))); case "LyricStyle": return "Lyric Style: " + CHelper.ListStrings(Enum.GetNames(typeof(ELyricStyle))); + case "TileCaption": + return "Show artist and title on the selected tile of the song selection: " + CHelper.ListStrings(Enum.GetNames(typeof(EOffOn))); case "PlayBackLib": return "PlayBackLib: " + CHelper.ListStrings(Enum.GetNames(typeof(EPlaybackLib))); case "RecordLib": @@ -767,8 +771,10 @@ namespace Vocaluxe.Base /// public static void NormalizeSongPaths() { + Config.Game.SongFolder = Config.Game.SongFolder.Where(folder => !string.IsNullOrEmpty(folder)).ToArray(); + //Check if there are configured songfolders - if (Config.Game.SongFolder.Length > 0 && Config.Game.SongFolder[0] != "") + if (Config.Game.SongFolder.Length > 0) { SongFolders.Clear(); diff --git a/Vocaluxe/Base/CGraphics.cs b/Vocaluxe/Base/CGraphics.cs index 176b3d67..713e36b1 100644 --- a/Vocaluxe/Base/CGraphics.cs +++ b/Vocaluxe/Base/CGraphics.cs @@ -68,7 +68,6 @@ namespace Vocaluxe.Base _Screens.Add(new CScreenLoad()); _Screens.Add(new CScreenMain()); _Screens.Add(new CScreenSong()); - _Screens.Add(new CScreenOptions()); _Screens.Add(new CScreenSing()); _Screens.Add(new CScreenProfiles()); _Screens.Add(new CScreenScore()); @@ -82,6 +81,7 @@ namespace Vocaluxe.Base _Screens.Add(new CScreenOptionsTheme()); _Screens.Add(new CScreenOptionsGraphics()); _Screens.Add(new CScreenOptionsServer()); + _Screens.Add(new CScreenOptionsSongFolders()); _Screens.Add(new CScreenNames()); _Screens.Add(new CScreenCredits()); _Screens.Add(new CScreenParty()); diff --git a/Vocaluxe/Base/CMain.cs b/Vocaluxe/Base/CMain.cs index 64dac969..eba613c8 100644 --- a/Vocaluxe/Base/CMain.cs +++ b/Vocaluxe/Base/CMain.cs @@ -121,6 +121,11 @@ namespace Vocaluxe.Base return CConfig.Config.Theme.DrawToneHelper; } + public EOffOn GetTileCaption() + { + return CConfig.Config.Game.TileCaption; + } + public int GetCoverSize() { return CConfig.Config.Graphics.CoverSize; diff --git a/Vocaluxe/Screens/CScreenCredits.cs b/Vocaluxe/Screens/CScreenCredits.cs index ec6e7c15..088976a3 100644 --- a/Vocaluxe/Screens/CScreenCredits.cs +++ b/Vocaluxe/Screens/CScreenCredits.cs @@ -342,7 +342,7 @@ namespace Vocaluxe.Screens private void _LeaveScreen() { - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.OptionsGame); if (_BackgroundVideo != null) { diff --git a/Vocaluxe/Screens/CScreenMain.cs b/Vocaluxe/Screens/CScreenMain.cs index aad50a60..3eca2386 100644 --- a/Vocaluxe/Screens/CScreenMain.cs +++ b/Vocaluxe/Screens/CScreenMain.cs @@ -83,7 +83,7 @@ namespace Vocaluxe.Screens switch (keyEvent.Key) { case Keys.O: - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.OptionsGame); _LeaveScreen(); break; @@ -134,7 +134,7 @@ namespace Vocaluxe.Screens if (_Buttons[_ButtonOptions].Selected) { - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.OptionsGame); _LeaveScreen(); } @@ -193,7 +193,7 @@ namespace Vocaluxe.Screens if (_Buttons[_ButtonOptions].Selected) { - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.OptionsGame); _LeaveScreen(); } diff --git a/Vocaluxe/Screens/CScreenOptions.cs b/Vocaluxe/Screens/CScreenOptions.cs deleted file mode 100644 index 0fd4de2c..00000000 --- a/Vocaluxe/Screens/CScreenOptions.cs +++ /dev/null @@ -1,303 +0,0 @@ -#region license -// This file is part of Vocaluxe. -// -// Vocaluxe is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Vocaluxe is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Vocaluxe. If not, see . -#endregion - -using System.Collections.Generic; -using System.Linq; -using System.Windows.Forms; -using Vocaluxe.Base; -using VocaluxeLib; -using VocaluxeLib.Menu; - -namespace Vocaluxe.Screens -{ - public class CScreenOptions : CMenu - { - // Version number for theme files. Increment it, if you've changed something on the theme files! - protected override int _ScreenVersion - { - get { return 4; } - } - - private const string _ButtonOptionsBack = "ButtonOptionsBack"; - private const string _ButtonOptionsGame = "ButtonOptionsGame"; - private const string _ButtonOptionsSound = "ButtonOptionsSound"; - private const string _ButtonOptionsRecord = "ButtonOptionsRecord"; - private const string _ButtonOptionsVideo = "ButtonOptionsVideo"; - private const string _ButtonOptionsLyrics = "ButtonOptionsLyrics"; - private const string _ButtonOptionsTheme = "ButtonOptionsTheme"; - private const string _ButtonOptionsCredits = "ButtonOptionsCredits"; - private const string _ButtonOptionsGraphics = "ButtonOptionsGraphics"; - private const string _ButtonOptionsServer = "ButtonOptionsServer"; - private const string _ButtonSelectSongFolder = "ButtonSongFolder"; - - private const string _TextWarningRestart = "TextWarningRestart"; - private const string _StaticWarningRestart = "StaticWarningRestart"; - - private int _WarningStream = -1; - private bool _HasPlayedWarningSound = false; - - private static int PlaySound(ESounds sound, int volume) - { - var streamId = CSound.PlaySound(sound, false); - CSound.SetStreamVolume(streamId, volume); - - return streamId; - } - - public override void Init() - { - base.Init(); - - _ThemeButtons = new string[] - { - _ButtonOptionsBack, _ButtonOptionsGame, _ButtonOptionsSound, _ButtonOptionsRecord, _ButtonOptionsVideo, _ButtonOptionsLyrics, _ButtonOptionsTheme, - _ButtonOptionsCredits, _ButtonOptionsGraphics, _ButtonOptionsServer, _ButtonSelectSongFolder - }; - _ThemeTexts = new string[] { _TextWarningRestart }; - _ThemeStatics = new string[] { _StaticWarningRestart }; - } - - public override void LoadTheme(string xmlPath) - { - base.LoadTheme(xmlPath); - - _Texts[_TextWarningRestart].Visible = false; - _Statics[_StaticWarningRestart].Visible = false; - } - - public override bool HandleInput(SKeyEvent keyEvent) - { - base.HandleInput(keyEvent); - - if (keyEvent.KeyPressed) { } - else - { - switch (keyEvent.Key) - { - case Keys.Escape: - case Keys.Back: - CGraphics.FadeTo(EScreen.Main); - _LeaveScreen(); - break; - - case Keys.S: - CParty.SetNormalGameMode(); - CGraphics.FadeTo(EScreen.Song); - _LeaveScreen(); - break; - - case Keys.Enter: - if (_Buttons[_ButtonOptionsBack].Selected) - { - CGraphics.FadeTo(EScreen.Main); - _LeaveScreen(); - } - - if (_Buttons[_ButtonOptionsGame].Selected) - { - CGraphics.FadeTo(EScreen.OptionsGame); - _LeaveScreen(); - } - - if (_Buttons[_ButtonOptionsSound].Selected) - { - CGraphics.FadeTo(EScreen.OptionsSound); - _LeaveScreen(); - } - - if (_Buttons[_ButtonOptionsRecord].Selected) - { - CGraphics.FadeTo(EScreen.OptionsRecord); - _LeaveScreen(); - } - - if (_Buttons[_ButtonOptionsVideo].Selected) - { - CGraphics.FadeTo(EScreen.OptionsVideo); - _LeaveScreen(); - } - - if (_Buttons[_ButtonOptionsLyrics].Selected) - { - CGraphics.FadeTo(EScreen.OptionsLyrics); - _LeaveScreen(); - } - - if (_Buttons[_ButtonOptionsTheme].Selected) - { - CGraphics.FadeTo(EScreen.OptionsTheme); - _LeaveScreen(); - } - - if (_Buttons[_ButtonOptionsGraphics].Selected) - { - CGraphics.FadeTo(EScreen.OptionsGraphics); - _LeaveScreen(); - } - - if (_Buttons[_ButtonOptionsServer].Selected) - { - CGraphics.FadeTo(EScreen.OptionsServer); - _LeaveScreen(); - } - - if (_Buttons[_ButtonOptionsCredits].Selected) - { - CGraphics.FadeTo(EScreen.Credits); - _LeaveScreen(); - } - - if (_Buttons[_ButtonSelectSongFolder].Selected && CScreenOptions._OpenSongFolderDialog()) - { - _Texts[_TextWarningRestart].Visible = true; - _Statics[_StaticWarningRestart].Visible = true; - } - - break; - } - } - - return true; - } - - public override bool HandleMouse(SMouseEvent mouseEvent) - { - base.HandleMouse(mouseEvent); - - if (mouseEvent.LB && _IsMouseOverCurSelection(mouseEvent)) - { - if (_Buttons[_ButtonOptionsBack].Selected) - { - CGraphics.FadeTo(EScreen.Main); - _LeaveScreen(); - } - - if (_Buttons[_ButtonOptionsGame].Selected) - { - CGraphics.FadeTo(EScreen.OptionsGame); - _LeaveScreen(); - } - - if (_Buttons[_ButtonOptionsSound].Selected) - { - CGraphics.FadeTo(EScreen.OptionsSound); - _LeaveScreen(); - } - - if (_Buttons[_ButtonOptionsRecord].Selected) - { - CGraphics.FadeTo(EScreen.OptionsRecord); - _LeaveScreen(); - } - - if (_Buttons[_ButtonOptionsVideo].Selected) - { - CGraphics.FadeTo(EScreen.OptionsVideo); - _LeaveScreen(); - } - - if (_Buttons[_ButtonOptionsLyrics].Selected) - { - CGraphics.FadeTo(EScreen.OptionsLyrics); - _LeaveScreen(); - } - - if (_Buttons[_ButtonOptionsTheme].Selected) - { - CGraphics.FadeTo(EScreen.OptionsTheme); - _LeaveScreen(); - } - - if (_Buttons[_ButtonOptionsGraphics].Selected) - { - CGraphics.FadeTo(EScreen.OptionsGraphics); - _LeaveScreen(); - } - - if (_Buttons[_ButtonOptionsServer].Selected) - { - CGraphics.FadeTo(EScreen.OptionsServer); - _LeaveScreen(); - } - - if (_Buttons[_ButtonOptionsCredits].Selected) - { - CGraphics.FadeTo(EScreen.Credits); - _LeaveScreen(); - } - - if (_Buttons[_ButtonSelectSongFolder].Selected && CScreenOptions._OpenSongFolderDialog()) - { - _Texts[_TextWarningRestart].Visible = true; - _Statics[_StaticWarningRestart].Visible = true; - } - } - - if (mouseEvent.RB) - { - CGraphics.FadeTo(EScreen.Main); - _LeaveScreen(); - } - - return true; - } - - public override bool UpdateGame() - { - if (_Texts[_TextWarningRestart].Visible && !_HasPlayedWarningSound) - { - _WarningStream = CScreenOptions.PlaySound(ESounds.Warning, CConfig.SoundEffectVolume); - _HasPlayedWarningSound = true; - } - - return true; - } - - private static bool _OpenSongFolderDialog() - { - using (var dialog = new FolderBrowserDialog()) - { - dialog.Description = CLanguage.Translate("TR_SCREENO_SONGFOLDER"); - dialog.ShowNewFolderButton = true; - if (dialog.ShowDialog() == DialogResult.OK) - { - // Update config with new folder - var folders = CConfig.Config.Game.SongFolder?.ToList() ?? new List(); - if (!folders.Contains(dialog.SelectedPath)) - { - folders.Add(dialog.SelectedPath); - CConfig.Config.Game.SongFolder = folders.ToArray(); - CConfig.SaveConfig(); - } - - return true; // Folder was selected - } - } - - return false; // Dialog was cancelled - } - - private void _LeaveScreen() - { - if (_WarningStream != -1) - { - CSound.Close(_WarningStream); - _WarningStream = -1; - } - } - } -} \ No newline at end of file diff --git a/Vocaluxe/Screens/CScreenOptionsBase.cs b/Vocaluxe/Screens/CScreenOptionsBase.cs new file mode 100644 index 00000000..075bef14 --- /dev/null +++ b/Vocaluxe/Screens/CScreenOptionsBase.cs @@ -0,0 +1,310 @@ +#region license +// This file is part of Vocaluxe. +// +// Vocaluxe is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Vocaluxe is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Vocaluxe. If not, see . +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; +using Vocaluxe.Base; +using VocaluxeLib; +using VocaluxeLib.Menu; + +namespace Vocaluxe.Screens +{ + public abstract class CScreenOptionsBase : CMenu + { + private static readonly string[] _NavNames = { "Game", "Sound", "Record", "Video", "Lyrics", "Theme", "Graphics", "Server", "SongFolders", "Credits" }; + private static readonly EScreen[] _NavScreens = + { + EScreen.OptionsGame, EScreen.OptionsSound, EScreen.OptionsRecord, EScreen.OptionsVideo, EScreen.OptionsLyrics, EScreen.OptionsTheme, EScreen.OptionsGraphics, + EScreen.OptionsServer, EScreen.OptionsSongFolders, EScreen.Credits + }; + private const int _NumOptionScreens = 9; + + private const string _StaticNavSelected = "StaticNavSelected"; + private const string _StaticNavIconSelected = "StaticNavIconSelected"; + private const string _TextNavSelected = "TextNavSelected"; + + private readonly Dictionary _NavColors = new Dictionary(); + private bool _NavFocused; + private int _NavCursor; + private IMenuElement _ContentSelection; + private bool _PendingNavFocus; + private bool _PendingContentFocus; + private static bool _SwitchingOptions; + + protected abstract EScreen _OptionsScreen { get; } + + protected abstract void _SaveOptions(); + + private int _CurrentNavIndex + { + get { return Array.IndexOf(_NavScreens, _OptionsScreen); } + } + + private bool _HasNavigation + { + get { return _Statics.ContainsKey(_StaticNavSelected) && _Statics.ContainsKey("StaticNav" + _NavNames[0]); } + } + + public override void LoadTheme(string xmlPath) + { + base.LoadTheme(xmlPath); + + _NavColors.Clear(); + foreach (var name in _NavNames) + { + var icon = "StaticNavIcon" + name; + if (_Statics.ContainsKey(icon)) + { + _NavColors[icon] = _Statics[icon].Color; + } + + var text = "TextNav" + name; + if (_Texts.ContainsKey(text)) + { + _NavColors[text] = _Texts[text].Color; + } + } + + if (_Statics.ContainsKey(_StaticNavIconSelected)) + { + _Statics[_StaticNavIconSelected].Visible = false; + } + + if (_Texts.ContainsKey(_TextNavSelected)) + { + _Texts[_TextNavSelected].Visible = false; + } + + _NavFocused = false; + _UpdateNavHighlight(); + } + + public override void OnShow() + { + base.OnShow(); + + _NavFocused = false; + _ContentSelection = null; + _PendingNavFocus = !_SwitchingOptions; + _PendingContentFocus = _SwitchingOptions; + _SwitchingOptions = false; + _UpdateNavHighlight(); + } + + public override void Draw() + { + if (_PendingNavFocus) + { + _PendingNavFocus = false; + if (_HasNavigation) + { + _SetNavFocus(true); + _ContentSelection = _GetFirstContentElement(); + } + } + else if (_PendingContentFocus) + { + _PendingContentFocus = false; + var first = _GetFirstContentElement(); + if (first != null) + { + _SelectElement(first); + } + } + + base.Draw(); + } + + protected bool _HandleNavigationInput(SKeyEvent keyEvent) + { + if (!_HasNavigation) + { + return false; + } + + if (_NavFocused) + { + if (keyEvent.KeyPressed) + { + return true; + } + + switch (keyEvent.Key) + { + case Keys.Escape: + case Keys.Back: + return false; + + case Keys.Up: + _NavCursor = (_NavCursor - 1 + _NavNames.Length) % _NavNames.Length; + _UpdateNavHighlight(); + break; + + case Keys.Down: + _NavCursor = (_NavCursor + 1) % _NavNames.Length; + _UpdateNavHighlight(); + break; + + case Keys.Enter: + case Keys.Right: + if (_NavCursor == _CurrentNavIndex) + { + _SetNavFocus(false); + } + else + { + _SwitchTo(_NavCursor); + } + + break; + } + + return true; + } + + if (keyEvent.Key == Keys.Escape || keyEvent.Key == Keys.Back) + { + if (!keyEvent.KeyPressed) + { + _SetNavFocus(true); + } + + return true; + } + + if (keyEvent.Key != Keys.Tab) + { + return false; + } + + if (!keyEvent.KeyPressed) + { + var step = keyEvent.Mod == EModifier.Shift ? -1 : 1; + _SwitchTo((_CurrentNavIndex + step + _NumOptionScreens) % _NumOptionScreens); + } + + return true; + } + + protected bool _HandleNavigationMouse(SMouseEvent mouseEvent) + { + for (var i = 0; i < _NavNames.Length; i++) + { + var row = "StaticNav" + _NavNames[i]; + if (!_Statics.ContainsKey(row) || !CHelper.IsInBounds(_Statics[row].Rect, mouseEvent)) + { + continue; + } + + if (!mouseEvent.LB) + { + return false; + } + + _SwitchTo(i); + return true; + } + + if (_NavFocused) + { + _SetNavFocus(false); + } + + return false; + } + + private IMenuElement _GetFirstContentElement() + { + return _SelectSlides.Cast().Concat(_Buttons).Where(element => element.Selectable).OrderBy(element => element.Rect.Y).ThenBy(element => element.Rect.X) + .FirstOrDefault(); + } + + private void _SetNavFocus(bool focused) + { + if (focused) + { + _ContentSelection = _SelectSlides.FirstOrDefault(slide => slide.Selected) ?? (IMenuElement)_Buttons.FirstOrDefault(button => button.Selected); + if (_ContentSelection != null) + { + _ContentSelection.Selected = false; + } + + _NavCursor = _CurrentNavIndex; + } + else if (_ContentSelection != null) + { + _SelectElement(_ContentSelection); + _ContentSelection = null; + } + + _NavFocused = focused; + _UpdateNavHighlight(); + } + + private void _UpdateNavHighlight() + { + if (!_HasNavigation) + { + return; + } + + var highlighted = _NavFocused ? _NavCursor : _CurrentNavIndex; + var selected = _Statics[_StaticNavSelected]; + for (var i = 0; i < _NavNames.Length; i++) + { + var row = "StaticNav" + _NavNames[i]; + var icon = "StaticNavIcon" + _NavNames[i]; + var text = "TextNav" + _NavNames[i]; + var isHighlighted = i == highlighted; + + if (_Statics.ContainsKey(row)) + { + _Statics[row].Visible = !isHighlighted; + if (isHighlighted) + { + var rowRect = _Statics[row].Rect; + selected.MaxRect = new SRectF(rowRect.X, rowRect.Y, rowRect.W, rowRect.H, selected.Rect.Z); + } + } + + if (_Statics.ContainsKey(icon) && _NavColors.ContainsKey(icon)) + { + _Statics[icon].Color = isHighlighted && _Statics.ContainsKey(_StaticNavIconSelected) ? _Statics[_StaticNavIconSelected].Color : _NavColors[icon]; + } + + if (_Texts.ContainsKey(text) && _NavColors.ContainsKey(text)) + { + _Texts[text].Color = isHighlighted && _Texts.ContainsKey(_TextNavSelected) ? _Texts[_TextNavSelected].Color : _NavColors[text]; + } + } + } + + private void _SwitchTo(int index) + { + if (_NavScreens[index] == _OptionsScreen) + { + return; + } + + _SaveOptions(); + _SwitchingOptions = true; + CGraphics.FadeTo(_NavScreens[index]); + } + } +} diff --git a/Vocaluxe/Screens/CScreenOptionsGame.cs b/Vocaluxe/Screens/CScreenOptionsGame.cs index 5ac2a105..8984281d 100644 --- a/Vocaluxe/Screens/CScreenOptionsGame.cs +++ b/Vocaluxe/Screens/CScreenOptionsGame.cs @@ -22,12 +22,17 @@ using VocaluxeLib.Menu; namespace Vocaluxe.Screens { - public class CScreenOptionsGame : CMenu + public class CScreenOptionsGame : CScreenOptionsBase { // Version number for theme files. Increment it, if you've changed something on the theme files! protected override int _ScreenVersion { - get { return 6; } + get { return 7; } + } + + protected override EScreen _OptionsScreen + { + get { return EScreen.OptionsGame; } } private const string _SelectSlideLanguage = "SelectSlideLanguage"; @@ -38,6 +43,9 @@ namespace Vocaluxe.Screens private const string _SelectSlideAutoplayPreviews = "SelectSlideAutoplayPreviews"; private const string _SelectSlideTimerMode = "SelectSlideTimerMode"; private const string _SelectSlideHighscoreStyle = "SelectSlideHighscoreStyle"; + private const string _SelectSlideTileCaption = "SelectSlideTileCaption"; + + private const string _TextTileCaption = "TextTileCaption"; private const string _ButtonExit = "ButtonExit"; @@ -48,8 +56,10 @@ namespace Vocaluxe.Screens _ThemeButtons = new string[] { _ButtonExit }; _ThemeSelectSlides = new string[] { - _SelectSlideLanguage, _SelectSlideDebugLevel, _SelectSlideSongMenu, _SelectSlideSongSorting, _SelectSlideTabs, _SelectSlideTimerMode, _SelectSlideHighscoreStyle + _SelectSlideLanguage, _SelectSlideDebugLevel, _SelectSlideSongMenu, _SelectSlideSongSorting, _SelectSlideTabs, _SelectSlideAutoplayPreviews, _SelectSlideTimerMode, + _SelectSlideHighscoreStyle, _SelectSlideTileCaption }; + _ThemeTexts = new string[] { _TextTileCaption }; } public override void LoadTheme(string xmlPath) @@ -66,10 +76,17 @@ namespace Vocaluxe.Screens _SelectSlides[_SelectSlideAutoplayPreviews].SetValues((int)CConfig.Config.Game.AutoplayPreviews); _SelectSlides[_SelectSlideTimerMode].SetValues((int)CConfig.Config.Game.TimerMode); _SelectSlides[_SelectSlideHighscoreStyle].SetValues((int)CConfig.Config.Game.HighscoreStyle); + _SelectSlides[_SelectSlideTileCaption].SetValues((int)CConfig.Config.Game.TileCaption); + _UpdateTileCaptionState(); } public override bool HandleInput(SKeyEvent keyEvent) { + if (_HandleNavigationInput(keyEvent)) + { + return true; + } + base.HandleInput(keyEvent); if (!keyEvent.KeyPressed) @@ -79,7 +96,7 @@ namespace Vocaluxe.Screens case Keys.Escape: case Keys.Back: _SaveConfig(); - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.Main); break; case Keys.S: @@ -92,7 +109,7 @@ namespace Vocaluxe.Screens if (_Buttons[_ButtonExit].Selected) { _SaveConfig(); - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.Main); } break; @@ -107,25 +124,32 @@ namespace Vocaluxe.Screens } } + _UpdateTileCaptionState(); return true; } public override bool HandleMouse(SMouseEvent mouseEvent) { + if (_HandleNavigationMouse(mouseEvent)) + { + return true; + } + base.HandleMouse(mouseEvent); if (mouseEvent.RB) { _SaveConfig(); - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.Main); } if (mouseEvent.LB && _IsMouseOverCurSelection(mouseEvent) && _Buttons[_ButtonExit].Selected) { - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.Main); _SaveConfig(); } + _UpdateTileCaptionState(); return true; } @@ -134,6 +158,13 @@ namespace Vocaluxe.Screens return true; } + private void _UpdateTileCaptionState() + { + var enabled = (ESongMenu)_SelectSlides[_SelectSlideSongMenu].Selection == ESongMenu.TR_CONFIG_TILE_BOARD; + _SelectSlides[_SelectSlideTileCaption].Enabled = enabled; + _Texts[_TextTileCaption].Alpha = enabled ? 1f : 0.4f; + } + private void _SaveConfig() { CLanguage.LanguageId = _SelectSlides[_SelectSlideLanguage].Selection; @@ -145,11 +176,17 @@ namespace Vocaluxe.Screens CConfig.Config.Game.AutoplayPreviews = (EOffOn)_SelectSlides[_SelectSlideAutoplayPreviews].Selection; CConfig.Config.Game.TimerMode = (ETimerMode)_SelectSlides[_SelectSlideTimerMode].Selection; CConfig.Config.Game.HighscoreStyle = (EHighscoreStyle)_SelectSlides[_SelectSlideHighscoreStyle].Selection; + CConfig.Config.Game.TileCaption = (EOffOn)_SelectSlides[_SelectSlideTileCaption].Selection; CConfig.SaveConfig(); CSongs.Sorter.SongSorting = CConfig.Config.Game.SongSorting; CSongs.Categorizer.Tabs = CConfig.Config.Game.Tabs; } + + protected override void _SaveOptions() + { + _SaveConfig(); + } } } \ No newline at end of file diff --git a/Vocaluxe/Screens/CScreenOptionsGraphics.cs b/Vocaluxe/Screens/CScreenOptionsGraphics.cs index 3dab6ada..23750927 100644 --- a/Vocaluxe/Screens/CScreenOptionsGraphics.cs +++ b/Vocaluxe/Screens/CScreenOptionsGraphics.cs @@ -24,12 +24,17 @@ using VocaluxeLib.Menu; namespace Vocaluxe.Screens { - public class CScreenOptionsGraphics : CMenu + public class CScreenOptionsGraphics : CScreenOptionsBase { // 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; } + } + + protected override EScreen _OptionsScreen + { + get { return EScreen.OptionsGraphics; } } private const string _SelectSlideTextureQuality = "SelectSlideTextureQuality"; @@ -39,7 +44,8 @@ namespace Vocaluxe.Screens private const string _TextWarningRestart = "TextWarningRestart"; private const string _StaticWarningRestart = "StaticWarningRestart"; private const string _ButtonExit = "ButtonExit"; - private static readonly string[] CoverSizes = { "32", "64", "128", "256", "512", "1024" }; + private static readonly string[] CoverSizes = { "128", "256", "512", "1024" }; + private int _LoadedCoverSizeIndex; private int _WarningStream = -1; private bool _HasPlayedWarningSound = false; @@ -70,7 +76,17 @@ namespace Vocaluxe.Screens _SelectSlides[_SelectSlideCoverSize].AddValues(CoverSizes); var currentCoverSize = CConfig.Config.Graphics.CoverSize; var index = Array.IndexOf(CoverSizes, currentCoverSize.ToString()); + if (index < 0) + { + index = Array.FindIndex(CoverSizes, size => int.Parse(size) >= currentCoverSize); + if (index < 0) + { + index = CoverSizes.Length - 1; + } + } + _SelectSlides[_SelectSlideCoverSize].Selection = index; + _LoadedCoverSizeIndex = index; _SelectSlides[_SelectSlideFullScreen].SetValues((int)CConfig.Config.Graphics.FullScreen); _SelectSlides[_SelectSlideFullScreen].Selection = (int)CConfig.Config.Graphics.FullScreen; @@ -84,41 +100,49 @@ namespace Vocaluxe.Screens public override bool HandleInput(SKeyEvent keyEvent) { + if (_HandleNavigationInput(keyEvent)) + { + return true; + } + base.HandleInput(keyEvent); - switch (keyEvent.Key) + if (!keyEvent.KeyPressed) { - case Keys.Escape: - case Keys.Back: - _SaveConfig(); - CGraphics.FadeTo(EScreen.Options); - _LeaveScreen(); - break; - - case Keys.S: - CParty.SetNormalGameMode(); - _SaveConfig(); - CGraphics.FadeTo(EScreen.Song); - _LeaveScreen(); - break; - - case Keys.Enter: - if (_Buttons[_ButtonExit].Selected) - { + switch (keyEvent.Key) + { + case Keys.Escape: + case Keys.Back: _SaveConfig(); - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.Main); _LeaveScreen(); - } + break; - break; + case Keys.S: + CParty.SetNormalGameMode(); + _SaveConfig(); + CGraphics.FadeTo(EScreen.Song); + _LeaveScreen(); + break; - case Keys.Left: - _SaveConfig(); - break; + case Keys.Enter: + if (_Buttons[_ButtonExit].Selected) + { + _SaveConfig(); + CGraphics.FadeTo(EScreen.Main); + _LeaveScreen(); + } - case Keys.Right: - _SaveConfig(); - break; + break; + + case Keys.Left: + _SaveConfig(); + break; + + case Keys.Right: + _SaveConfig(); + break; + } } return true; @@ -126,12 +150,17 @@ namespace Vocaluxe.Screens public override bool HandleMouse(SMouseEvent mouseEvent) { + if (_HandleNavigationMouse(mouseEvent)) + { + return true; + } + base.HandleMouse(mouseEvent); if (mouseEvent.RB) { _SaveConfig(); - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.Main); _LeaveScreen(); } @@ -140,7 +169,7 @@ namespace Vocaluxe.Screens _SaveConfig(); if (_Buttons[_ButtonExit].Selected) { - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.Main); _LeaveScreen(); } } @@ -148,6 +177,12 @@ namespace Vocaluxe.Screens return true; } + public override void OnShow() + { + base.OnShow(); + _HasPlayedWarningSound = false; + } + public override bool UpdateGame() { if (_Texts[_TextWarningRestart].Visible && !_HasPlayedWarningSound) @@ -178,7 +213,7 @@ namespace Vocaluxe.Screens // Detect Cover size change var selectedValue = CoverSizes[_SelectSlides[_SelectSlideCoverSize].Selection]; var currentCoverSize = CConfig.Config.Graphics.CoverSize; - var newCoverSize = int.Parse(selectedValue); + var newCoverSize = _SelectSlides[_SelectSlideCoverSize].Selection == _LoadedCoverSizeIndex ? currentCoverSize : int.Parse(selectedValue); if (currentCoverSize != newCoverSize) { _Texts[_TextWarningRestart].Visible = true; @@ -204,5 +239,11 @@ namespace Vocaluxe.Screens _WarningStream = -1; } } + + protected override void _SaveOptions() + { + _SaveConfig(); + _LeaveScreen(); + } } } diff --git a/Vocaluxe/Screens/CScreenOptionsLyrics.cs b/Vocaluxe/Screens/CScreenOptionsLyrics.cs index 377772de..d000dabf 100644 --- a/Vocaluxe/Screens/CScreenOptionsLyrics.cs +++ b/Vocaluxe/Screens/CScreenOptionsLyrics.cs @@ -22,12 +22,17 @@ using VocaluxeLib.Menu; namespace Vocaluxe.Screens { - public class CScreenOptionsLyrics : CMenu + public class CScreenOptionsLyrics : CScreenOptionsBase { // 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; } + } + + protected override EScreen _OptionsScreen + { + get { return EScreen.OptionsLyrics; } } private const string _SelectSlideLyricStyle = "SelectSlideLyricStyle"; @@ -51,6 +56,11 @@ namespace Vocaluxe.Screens public override bool HandleInput(SKeyEvent keyEvent) { + if (_HandleNavigationInput(keyEvent)) + { + return true; + } + base.HandleInput(keyEvent); if (keyEvent.KeyPressed) { } @@ -61,7 +71,7 @@ namespace Vocaluxe.Screens case Keys.Escape: case Keys.Back: _SaveConfig(); - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.Main); break; case Keys.S: @@ -74,7 +84,7 @@ namespace Vocaluxe.Screens if (_Buttons[_ButtonExit].Selected) { _SaveConfig(); - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.Main); } break; @@ -94,12 +104,17 @@ namespace Vocaluxe.Screens public override bool HandleMouse(SMouseEvent mouseEvent) { + if (_HandleNavigationMouse(mouseEvent)) + { + return true; + } + base.HandleMouse(mouseEvent); if (mouseEvent.RB) { _SaveConfig(); - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.Main); } if (mouseEvent.LB && _IsMouseOverCurSelection(mouseEvent)) @@ -107,7 +122,7 @@ namespace Vocaluxe.Screens _SaveConfig(); if (_Buttons[_ButtonExit].Selected) { - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.Main); } } @@ -125,5 +140,10 @@ namespace Vocaluxe.Screens CConfig.Config.Theme.LyricStyle = (ELyricStyle)_SelectSlides[_SelectSlideLyricStyle].Selection; CConfig.SaveConfig(); } + + protected override void _SaveOptions() + { + _SaveConfig(); + } } } \ No newline at end of file diff --git a/Vocaluxe/Screens/CScreenOptionsRecord.cs b/Vocaluxe/Screens/CScreenOptionsRecord.cs index 1a89a1b6..86295231 100644 --- a/Vocaluxe/Screens/CScreenOptionsRecord.cs +++ b/Vocaluxe/Screens/CScreenOptionsRecord.cs @@ -25,12 +25,17 @@ using VocaluxeLib.Menu; namespace Vocaluxe.Screens { - public class CScreenOptionsRecord : CMenu + public class CScreenOptionsRecord : CScreenOptionsBase { // Version number for theme files. Increment it, if you've changed something on the theme files! protected override int _ScreenVersion { - get { return 5; } + get { return 6; } + } + + protected override EScreen _OptionsScreen + { + get { return EScreen.OptionsRecord; } } private const string _SelectSlideRecordDevices = "SelectSlideRecordDevices"; @@ -121,6 +126,11 @@ namespace Vocaluxe.Screens public override bool HandleInput(SKeyEvent keyEvent) { + if (_HandleNavigationInput(keyEvent)) + { + return true; + } + base.HandleInput(keyEvent); if (keyEvent.KeyPressed) { } @@ -131,7 +141,7 @@ namespace Vocaluxe.Screens case Keys.Escape: case Keys.Back: _SaveMicConfig(); - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.Main); _LeaveScreen(); break; @@ -146,7 +156,7 @@ namespace Vocaluxe.Screens if (_Buttons[_ButtonExit].Selected) { _SaveMicConfig(); - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.Main); _LeaveScreen(); } @@ -176,12 +186,17 @@ namespace Vocaluxe.Screens public override bool HandleMouse(SMouseEvent mouseEvent) { + if (_HandleNavigationMouse(mouseEvent)) + { + return true; + } + base.HandleMouse(mouseEvent); if (mouseEvent.RB) { _SaveMicConfig(); - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.Main); _LeaveScreen(); } @@ -192,7 +207,7 @@ namespace Vocaluxe.Screens if (_Buttons[_ButtonExit].Selected) { _SaveMicConfig(); - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.Main); _LeaveScreen(); } @@ -250,9 +265,18 @@ namespace Vocaluxe.Screens } } - var showWarning = !_CheckMicConfig(); + var warning = _GetWarning(); + var showWarning = warning != null; _Statics[_StaticWarning].Visible = showWarning; _Texts[_TextWarning].Visible = showWarning; + if (showWarning) + { + _Texts[_TextWarning].Text = warning; + } + else + { + _HasPlayedWarningSound = false; + } if (_Texts[_TextWarning].Visible && !_HasPlayedWarningSound) { @@ -299,6 +323,7 @@ namespace Vocaluxe.Screens _Statics[_StaticWarning].Visible = false; _Texts[_TextWarning].Visible = false; + _HasPlayedWarningSound = false; _DelayTest.Reset(); @@ -495,6 +520,31 @@ namespace Vocaluxe.Screens return true; } + private string _GetWarning() + { + if (_Devices == null) + { + return "TR_SCREENORECORD_NO_MIC_WARNING"; + } + + if (!_CheckMicConfig()) + { + return "TR_SCREENORECORD_MIC_WARNING"; + } + + var usedChannels = new HashSet(); + foreach (var selectSlide in _SelectSlideRecordPlayer) + { + var channel = _SelectSlides[selectSlide].Selection; + if (channel > 0 && !usedChannels.Add(channel)) + { + return "TR_SCREENORECORD_CHANNEL_WARNING"; + } + } + + return null; + } + private void _TestDelay() { _SaveMicConfig(); @@ -537,5 +587,11 @@ namespace Vocaluxe.Screens _WarningStream = -1; } } + + protected override void _SaveOptions() + { + _SaveMicConfig(); + _LeaveScreen(); + } } } \ No newline at end of file diff --git a/Vocaluxe/Screens/CScreenOptionsServer.cs b/Vocaluxe/Screens/CScreenOptionsServer.cs index 060d5684..78812365 100644 --- a/Vocaluxe/Screens/CScreenOptionsServer.cs +++ b/Vocaluxe/Screens/CScreenOptionsServer.cs @@ -22,12 +22,17 @@ using VocaluxeLib.Menu; namespace Vocaluxe.Screens { - public class CScreenOptionsServer : CMenu + public class CScreenOptionsServer : CScreenOptionsBase { // 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; } + } + + protected override EScreen _OptionsScreen + { + get { return EScreen.OptionsServer; } } private const string _SelectSlideServerActive = "SelectSlideServerActive"; @@ -70,45 +75,53 @@ namespace Vocaluxe.Screens public override bool HandleInput(SKeyEvent keyEvent) { + if (_HandleNavigationInput(keyEvent)) + { + return true; + } + base.HandleInput(keyEvent); - switch (keyEvent.Key) + if (!keyEvent.KeyPressed) { - case Keys.Escape: - case Keys.Back: - _SaveConfig(); - CGraphics.FadeTo(EScreen.Options); - _LeaveScreen(); - break; - - case Keys.S: - CParty.SetNormalGameMode(); - _SaveConfig(); - CGraphics.FadeTo(EScreen.Song); - _LeaveScreen(); - break; - - case Keys.Enter: - if (_Buttons[_ButtonExit].Selected) - { + switch (keyEvent.Key) + { + case Keys.Escape: + case Keys.Back: _SaveConfig(); - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.Main); _LeaveScreen(); - } - else if (_Buttons[_ButtonServer].Selected) - { - CGraphics.ShowPopup(EPopupScreens.PopupServerQR); - } + break; - break; + case Keys.S: + CParty.SetNormalGameMode(); + _SaveConfig(); + CGraphics.FadeTo(EScreen.Song); + _LeaveScreen(); + break; - case Keys.Left: - _SaveConfig(); - break; + case Keys.Enter: + if (_Buttons[_ButtonExit].Selected) + { + _SaveConfig(); + CGraphics.FadeTo(EScreen.Main); + _LeaveScreen(); + } + else if (_Buttons[_ButtonServer].Selected) + { + CGraphics.ShowPopup(EPopupScreens.PopupServerQR); + } - case Keys.Right: - _SaveConfig(); - break; + break; + + case Keys.Left: + _SaveConfig(); + break; + + case Keys.Right: + _SaveConfig(); + break; + } } return true; @@ -116,12 +129,17 @@ namespace Vocaluxe.Screens public override bool HandleMouse(SMouseEvent mouseEvent) { + if (_HandleNavigationMouse(mouseEvent)) + { + return true; + } + base.HandleMouse(mouseEvent); if (mouseEvent.RB) { _SaveConfig(); - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.Main); _LeaveScreen(); } @@ -129,7 +147,7 @@ namespace Vocaluxe.Screens { if (_Buttons[_ButtonExit].Selected) { - CGraphics.FadeTo(EScreen.Options); + CGraphics.FadeTo(EScreen.Main); _SaveConfig(); _LeaveScreen(); } @@ -142,6 +160,12 @@ namespace Vocaluxe.Screens return true; } + public override void OnShow() + { + base.OnShow(); + _HasPlayedWarningSound = false; + } + public override bool UpdateGame() { if (_Texts[_TextWarningRestart].Visible && !_HasPlayedWarningSound) @@ -196,5 +220,11 @@ namespace Vocaluxe.Screens _WarningStream = -1; } } + + protected override void _SaveOptions() + { + _SaveConfig(); + _LeaveScreen(); + } } } \ No newline at end of file diff --git a/Vocaluxe/Screens/CScreenOptionsSongFolders.cs b/Vocaluxe/Screens/CScreenOptionsSongFolders.cs new file mode 100644 index 00000000..e69d6805 --- /dev/null +++ b/Vocaluxe/Screens/CScreenOptionsSongFolders.cs @@ -0,0 +1,375 @@ +#region license +// This file is part of Vocaluxe. +// +// Vocaluxe is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Vocaluxe is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Vocaluxe. If not, see . +#endregion + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Windows.Forms; +using Vocaluxe.Base; +using VocaluxeLib; +using VocaluxeLib.Menu; + +namespace Vocaluxe.Screens +{ + public class CScreenOptionsSongFolders : CScreenOptionsBase + { + protected override int _ScreenVersion + { + get { return 3; } + } + + protected override EScreen _OptionsScreen + { + get { return EScreen.OptionsSongFolders; } + } + + private const int _NumRows = 8; + + private const string _ButtonExit = "ButtonExit"; + private const string _ButtonAddFolder = "ButtonAddFolder"; + private const string _TextNoFolders = "TextNoFolders"; + private const string _TextWarningRestart = "TextWarningRestart"; + private const string _StaticWarningRestart = "StaticWarningRestart"; + private const string _StaticScrollBar = "StaticScrollBar"; + private const string _StaticScrollBarThumb = "StaticScrollBarThumb"; + + private readonly string[] _StaticFolder = new string[_NumRows]; + private readonly string[] _TextFolder = new string[_NumRows]; + private readonly string[] _ButtonRemoveFolder = new string[_NumRows]; + + private int _Offset; + private int _WarningStream = -1; + private bool _HasPlayedWarningSound; + + public override void Init() + { + base.Init(); + + for (var i = 0; i < _NumRows; i++) + { + _StaticFolder[i] = "StaticFolder" + (i + 1); + _TextFolder[i] = "TextFolder" + (i + 1); + _ButtonRemoveFolder[i] = "ButtonRemoveFolder" + (i + 1); + } + + var buttons = new List { _ButtonExit, _ButtonAddFolder }; + buttons.AddRange(_ButtonRemoveFolder); + _ThemeButtons = buttons.ToArray(); + + var texts = new List { _TextNoFolders, _TextWarningRestart }; + texts.AddRange(_TextFolder); + _ThemeTexts = texts.ToArray(); + + var statics = new List { _StaticWarningRestart, _StaticScrollBar, _StaticScrollBarThumb }; + statics.AddRange(_StaticFolder); + _ThemeStatics = statics.ToArray(); + } + + public override void LoadTheme(string xmlPath) + { + base.LoadTheme(xmlPath); + + _Texts[_TextWarningRestart].Visible = false; + _Statics[_StaticWarningRestart].Visible = false; + _UpdateList(); + } + + public override void OnShow() + { + base.OnShow(); + + _Offset = 0; + _HasPlayedWarningSound = false; + _UpdateList(); + } + + public override bool HandleInput(SKeyEvent keyEvent) + { + if (_HandleNavigationInput(keyEvent)) + { + return true; + } + + if (!keyEvent.KeyPressed && _ScrollWithSelection(keyEvent.Key)) + { + return true; + } + + base.HandleInput(keyEvent); + + if (!keyEvent.KeyPressed) + { + switch (keyEvent.Key) + { + case Keys.Escape: + case Keys.Back: + _Leave(EScreen.Main); + break; + + case Keys.S: + CParty.SetNormalGameMode(); + _Leave(EScreen.Song); + break; + + case Keys.PageUp: + _Scroll(-_NumRows); + break; + + case Keys.PageDown: + _Scroll(_NumRows); + break; + + case Keys.Enter: + _OnButtonAction(); + break; + } + } + + return true; + } + + public override bool HandleMouse(SMouseEvent mouseEvent) + { + if (_HandleNavigationMouse(mouseEvent)) + { + return true; + } + + base.HandleMouse(mouseEvent); + + if (mouseEvent.LB && _IsMouseOverCurSelection(mouseEvent)) + { + _OnButtonAction(); + } + + if (mouseEvent.RB) + { + _Leave(EScreen.Main); + } + + if (mouseEvent.Wheel != 0) + { + _Scroll(mouseEvent.Wheel); + } + + if ((mouseEvent.LB || mouseEvent.LBH) && _Statics[_StaticScrollBar].Visible) + { + var bar = _Statics[_StaticScrollBar].Rect; + var area = new SRectF(bar.X - 15, bar.Y, bar.W + 30, bar.H, bar.Z); + if (CHelper.IsInBounds(area, mouseEvent)) + { + _ScrollTo((mouseEvent.Y - bar.Y) / bar.H); + } + } + + return true; + } + + public override bool UpdateGame() + { + if (_Texts[_TextWarningRestart].Visible && !_HasPlayedWarningSound) + { + _WarningStream = CSound.PlaySound(ESounds.Warning, false); + CSound.SetStreamVolume(_WarningStream, CConfig.SoundEffectVolume); + _HasPlayedWarningSound = true; + } + + return true; + } + + private void _OnButtonAction() + { + if (_Buttons[_ButtonExit].Selected) + { + _Leave(EScreen.Main); + return; + } + + if (_Buttons[_ButtonAddFolder].Selected) + { + _AddFolder(); + return; + } + + for (var i = 0; i < _NumRows; i++) + { + if (_Buttons[_ButtonRemoveFolder[i]].Selected) + { + _RemoveFolder(_Offset + i); + return; + } + } + } + + private void _AddFolder() + { + var folder = _OpenSongFolderDialog(); + if (folder == null) + { + return; + } + + // Update config with new folder + var folders = _GetSongFolders().ToList(); + if (!folders.Contains(folder)) + { + folders.Add(folder); + CConfig.Config.Game.SongFolder = folders.ToArray(); + CConfig.SaveConfig(); + _ShowRestartWarning(); + } + + _Offset = Math.Max(0, folders.IndexOf(folder) - _NumRows + 1); + _UpdateList(); + } + + private void _RemoveFolder(int index) + { + var folders = _GetSongFolders().ToList(); + if (index < 0 || index >= folders.Count) + { + return; + } + + folders.RemoveAt(index); + CConfig.Config.Game.SongFolder = folders.ToArray(); + CConfig.SaveConfig(); + _ShowRestartWarning(); + _UpdateList(); + } + + private void _Scroll(int rows) + { + _Offset += rows; + _UpdateList(); + } + + private bool _ScrollWithSelection(Keys key) + { + var numFolders = _GetSongFolders().Length; + if (key == Keys.Down && _Buttons[_ButtonRemoveFolder[_NumRows - 1]].Selected && _Offset + _NumRows < numFolders) + { + _Scroll(1); + return true; + } + + if (key == Keys.Up && _Buttons[_ButtonRemoveFolder[0]].Selected && _Offset > 0) + { + _Scroll(-1); + return true; + } + + return false; + } + + private void _ScrollTo(float position) + { + var maxOffset = Math.Max(0, _GetSongFolders().Length - _NumRows); + _Offset = (int)Math.Round(position.Clamp(0f, 1f) * maxOffset); + _UpdateList(); + } + + private void _UpdateList() + { + var folders = _GetSongFolders(); + _Offset = _Offset.Clamp(0, Math.Max(0, folders.Length - _NumRows)); + + for (var i = 0; i < _NumRows; i++) + { + var index = _Offset + i; + var visible = index < folders.Length; + _Statics[_StaticFolder[i]].Visible = visible; + _Texts[_TextFolder[i]].Visible = visible; + _Buttons[_ButtonRemoveFolder[i]].Visible = visible; + if (visible) + { + _Texts[_TextFolder[i]].Text = folders[index]; + _Texts[_TextFolder[i]].Alpha = Directory.Exists(folders[index]) ? 1f : 0.5f; + } + } + + _Texts[_TextNoFolders].Visible = folders.Length == 0; + _UpdateScrollBar(folders.Length); + + if (!_Buttons.Any(button => button.Selected && button.Visible)) + { + _SelectElement(_Buttons[_ButtonAddFolder]); + } + } + + private void _UpdateScrollBar(int numFolders) + { + var scrollBar = _Statics[_StaticScrollBar]; + var thumb = _Statics[_StaticScrollBarThumb]; + var visible = numFolders > _NumRows; + scrollBar.Visible = visible; + thumb.Visible = visible; + if (!visible) + { + return; + } + + var track = scrollBar.Rect; + var thumbH = Math.Min(track.H, Math.Max(track.H * _NumRows / numFolders, thumb.Rect.W * 3f)); + thumb.Y = track.Y + (track.H - thumbH) * _Offset / (numFolders - _NumRows); + thumb.H = thumbH; + } + + private void _ShowRestartWarning() + { + _Texts[_TextWarningRestart].Visible = true; + _Statics[_StaticWarningRestart].Visible = true; + } + + private void _Leave(EScreen screen) + { + _SaveOptions(); + CGraphics.FadeTo(screen); + } + + protected override void _SaveOptions() + { + if (_WarningStream != -1) + { + CSound.Close(_WarningStream); + _WarningStream = -1; + } + } + + private static string[] _GetSongFolders() + { + return CConfig.Config.Game.SongFolder?.Where(folder => !string.IsNullOrEmpty(folder)).ToArray() ?? new string[0]; + } + + private static string _OpenSongFolderDialog() + { + using (var dialog = new FolderBrowserDialog()) + { + dialog.Description = CLanguage.Translate("TR_SCREENO_SONGFOLDER"); + dialog.ShowNewFolderButton = true; + var owner = Application.OpenForms.Cast