diff --git a/Output/PartyModes/Challenge/Code/PartyModeChallenge.cs b/Output/PartyModes/Challenge/Code/PartyModeChallenge.cs index 39bcab12..7b0d4a31 100644 --- a/Output/PartyModes/Challenge/Code/PartyModeChallenge.cs +++ b/Output/PartyModes/Challenge/Code/PartyModeChallenge.cs @@ -6,6 +6,36 @@ using Vocaluxe.Menu; namespace Vocaluxe.PartyModes { + public struct DataToScreen + { + + } + + public struct DataFromScreen + { + public FromScreenConfig ScreenConfig; + public FromScreenNames ScreenNames; + public FromScreenMain ScreenMain; + } + + public struct FromScreenConfig + { + public int NumPlayers; + public int NumPlayersAtOnce; + public int NumRounds; + } + + public struct FromScreenNames + { + public bool FadeToConfig; + public bool FadeToMain; + public List ProfileIDs; + } + + public struct FromScreenMain + { + } + public class PartyModeChallenge : CPartyMode { private const int MaxPlayer = 10; @@ -13,6 +43,16 @@ namespace Vocaluxe.PartyModes private const int MaxTeams = 0; private const int MinTeams = 0; + enum EStage + { + NotStarted, + Config, + Names, + Main, + Singing + } + + private EStage _Stage; public PartyModeChallenge() { @@ -23,15 +63,102 @@ namespace Vocaluxe.PartyModes _ScreenSongOptions.Sorting.SearchString = String.Empty; _ScreenSongOptions.Sorting.SearchStringVisible = false; + + _Stage = EStage.NotStarted; } - public override CMenuParty GetNextPartyScreen() + public override bool Init() + { + _Stage = EStage.NotStarted; + return true; + } + + public override void DataFromScreen(string ScreenName, Object Data) + { + DataFromScreen data = new DataFromScreen(); + switch (ScreenName) + { + case "PartyScreenChallengeConfig": + + try + { + data = (DataFromScreen)Data; + _Stage = EStage.Config; + _Base.Graphics.FadeTo(EScreens.ScreenPartyDummy); + } + catch (Exception e) + { + _Base.Log.LogError("Error in party mode challenge. Can't cast received data from screen " + ScreenName + ". " + e.Message); + } + break; + + case "PartyScreenChallengeNames": + try + { + data = (DataFromScreen)Data; + if (data.ScreenNames.FadeToConfig) + _Stage = EStage.NotStarted; + else + _Stage = EStage.Names; + + _Base.Graphics.FadeTo(EScreens.ScreenPartyDummy); + } + catch (Exception e) + { + _Base.Log.LogError("Error in party mode challenge. Can't cast received data from screen " + ScreenName + ". " + e.Message); + } + break; + + case "PartyScreenChallengeMain": + _Stage = EStage.Singing; + _Base.Graphics.FadeTo(EScreens.ScreenPartyDummy); + break; + + default: + _Base.Log.LogError("Error in party mode challenge. Wrong screen is sending: " + ScreenName); + break; + } + } + + public override CMenuParty GetNextPartyScreen(out EScreens AlternativeScreen) { CMenuParty Screen = null; - _Screens.TryGetValue("PartyScreenChallengeConfig", out Screen); + AlternativeScreen = EScreens.ScreenSong; + + switch (_Stage) + { + case EStage.NotStarted: + _Screens.TryGetValue("PartyScreenChallengeConfig", out Screen); + break; + case EStage.Config: + _Screens.TryGetValue("PartyScreenChallengeNames", out Screen); + break; + case EStage.Names: + _Screens.TryGetValue("PartyScreenChallengeMain", out Screen); + break; + case EStage.Main: + AlternativeScreen = EScreens.ScreenSong; + break; + case EStage.Singing: + _Screens.TryGetValue("PartyScreenChallengeMain", out Screen); + break; + default: + break; + } + return Screen; } + public override EScreens GetStartScreen() + { + return EScreens.ScreenPartyDummy; + } + + public override EScreens GetMainScreen() + { + return EScreens.ScreenPartyDummy; + } + public override ScreenSongOptions GetScreenSongOptions() { _ScreenSongOptions.Sorting.SongSorting = _Base.Config.GetSongSorting(); diff --git a/Output/PartyModes/Challenge/Code/PartyScreenChallengeConfig.cs b/Output/PartyModes/Challenge/Code/PartyScreenChallengeConfig.cs index c988c88f..d04a0e3f 100644 --- a/Output/PartyModes/Challenge/Code/PartyScreenChallengeConfig.cs +++ b/Output/PartyModes/Challenge/Code/PartyScreenChallengeConfig.cs @@ -15,6 +15,8 @@ namespace Vocaluxe.PartyModes const string ButtonNext = "ButtonNext"; const string ButtonBack = "ButtonBack"; + DataFromScreen Data; + public PartyScreenChallengeConfig() { } @@ -26,6 +28,13 @@ namespace Vocaluxe.PartyModes _ThemeName = "PartyScreenChallengeConfig"; _ThemeButtons = new string[] { ButtonNext, ButtonBack }; _ScreenVersion = ScreenVersion; + + Data = new DataFromScreen(); + FromScreenConfig config = new FromScreenConfig(); + config.NumPlayers = 0; + config.NumPlayersAtOnce = 0; + config.NumRounds = 0; + Data.ScreenConfig = config; } public override void LoadTheme(string XmlPath) @@ -39,7 +48,7 @@ namespace Vocaluxe.PartyModes if (KeyEvent.KeyPressed) { - + } else { @@ -47,7 +56,15 @@ namespace Vocaluxe.PartyModes { case Keys.Back: case Keys.Escape: - FadeTo(EScreens.ScreenParty); + Back(); + break; + + case Keys.Enter: + if (Buttons[htButtons(ButtonBack)].Selected) + Back(); + + if (Buttons[htButtons(ButtonNext)].Selected) + Next(); break; } } @@ -60,12 +77,16 @@ namespace Vocaluxe.PartyModes if (MouseEvent.LB && IsMouseOver(MouseEvent)) { + if (Buttons[htButtons(ButtonBack)].Selected) + Back(); + if (Buttons[htButtons(ButtonNext)].Selected) + Next(); } if (MouseEvent.RB) { - FadeTo(EScreens.ScreenParty); + Back(); } return true; @@ -91,5 +112,19 @@ namespace Vocaluxe.PartyModes { base.OnClose(); } + + private void Back() + { + FadeTo(EScreens.ScreenParty); + } + + private void Next() + { + Data.ScreenConfig.NumPlayers = 4; + Data.ScreenConfig.NumPlayersAtOnce = 2; + Data.ScreenConfig.NumRounds = 8; + + _PartyMode.DataFromScreen(_ThemeName, Data); + } } } diff --git a/Output/PartyModes/Challenge/Code/PartyScreenChallengeNames.cs b/Output/PartyModes/Challenge/Code/PartyScreenChallengeNames.cs index 908f4c0e..af961585 100644 --- a/Output/PartyModes/Challenge/Code/PartyScreenChallengeNames.cs +++ b/Output/PartyModes/Challenge/Code/PartyScreenChallengeNames.cs @@ -12,6 +12,11 @@ namespace Vocaluxe.PartyModes // Version number for theme files. Increment it, if you've changed something on the theme files! const int ScreenVersion = 1; + const string ButtonNext = "ButtonNext"; + const string ButtonBack = "ButtonBack"; + + private DataFromScreen Data; + public PartyScreenChallengeNames() { } @@ -21,7 +26,15 @@ namespace Vocaluxe.PartyModes base.Init(); _ThemeName = "PartyScreenChallengeNames"; + _ThemeButtons = new string[] { ButtonNext, ButtonBack }; _ScreenVersion = ScreenVersion; + + Data = new DataFromScreen(); + FromScreenNames names = new FromScreenNames(); + names.FadeToConfig = false; + names.FadeToMain = false; + names.ProfileIDs = new List(); + Data.ScreenNames = names; } public override void LoadTheme(string XmlPath) @@ -43,7 +56,16 @@ namespace Vocaluxe.PartyModes { case Keys.Back: case Keys.Escape: - FadeTo(EScreens.ScreenParty); + Back(); + break; + + case Keys.Enter: + if (Buttons[htButtons(ButtonBack)].Selected) + Back(); + + if (Buttons[htButtons(ButtonNext)].Selected) + Next(); + break; } } @@ -56,7 +78,11 @@ namespace Vocaluxe.PartyModes if (MouseEvent.LB && IsMouseOver(MouseEvent)) { + if (Buttons[htButtons(ButtonBack)].Selected) + Back(); + if (Buttons[htButtons(ButtonNext)].Selected) + Next(); } if (MouseEvent.RB) @@ -87,5 +113,19 @@ namespace Vocaluxe.PartyModes { base.OnClose(); } + + private void Back() + { + Data.ScreenNames.FadeToConfig = true; + Data.ScreenNames.FadeToMain = false; + _PartyMode.DataFromScreen(_ThemeName, Data); + } + + private void Next() + { + Data.ScreenNames.FadeToConfig = false; + Data.ScreenNames.FadeToMain = true; + _PartyMode.DataFromScreen(_ThemeName, Data); + } } } diff --git a/Output/PartyModes/Challenge/Screens/PartyScreenChallengeNames.xml b/Output/PartyModes/Challenge/Screens/PartyScreenChallengeNames.xml index ce89be83..3587a6fc 100644 --- a/Output/PartyModes/Challenge/Screens/PartyScreenChallengeNames.xml +++ b/Output/PartyModes/Challenge/Screens/PartyScreenChallengeNames.xml @@ -115,7 +115,7 @@ 26 - + Button @@ -171,7 +171,7 @@ 10 26 - + 172 diff --git a/PartyModeChallenge/PartyModeChallenge.cs b/PartyModeChallenge/PartyModeChallenge.cs index 39bcab12..7b0d4a31 100644 --- a/PartyModeChallenge/PartyModeChallenge.cs +++ b/PartyModeChallenge/PartyModeChallenge.cs @@ -6,6 +6,36 @@ using Vocaluxe.Menu; namespace Vocaluxe.PartyModes { + public struct DataToScreen + { + + } + + public struct DataFromScreen + { + public FromScreenConfig ScreenConfig; + public FromScreenNames ScreenNames; + public FromScreenMain ScreenMain; + } + + public struct FromScreenConfig + { + public int NumPlayers; + public int NumPlayersAtOnce; + public int NumRounds; + } + + public struct FromScreenNames + { + public bool FadeToConfig; + public bool FadeToMain; + public List ProfileIDs; + } + + public struct FromScreenMain + { + } + public class PartyModeChallenge : CPartyMode { private const int MaxPlayer = 10; @@ -13,6 +43,16 @@ namespace Vocaluxe.PartyModes private const int MaxTeams = 0; private const int MinTeams = 0; + enum EStage + { + NotStarted, + Config, + Names, + Main, + Singing + } + + private EStage _Stage; public PartyModeChallenge() { @@ -23,15 +63,102 @@ namespace Vocaluxe.PartyModes _ScreenSongOptions.Sorting.SearchString = String.Empty; _ScreenSongOptions.Sorting.SearchStringVisible = false; + + _Stage = EStage.NotStarted; } - public override CMenuParty GetNextPartyScreen() + public override bool Init() + { + _Stage = EStage.NotStarted; + return true; + } + + public override void DataFromScreen(string ScreenName, Object Data) + { + DataFromScreen data = new DataFromScreen(); + switch (ScreenName) + { + case "PartyScreenChallengeConfig": + + try + { + data = (DataFromScreen)Data; + _Stage = EStage.Config; + _Base.Graphics.FadeTo(EScreens.ScreenPartyDummy); + } + catch (Exception e) + { + _Base.Log.LogError("Error in party mode challenge. Can't cast received data from screen " + ScreenName + ". " + e.Message); + } + break; + + case "PartyScreenChallengeNames": + try + { + data = (DataFromScreen)Data; + if (data.ScreenNames.FadeToConfig) + _Stage = EStage.NotStarted; + else + _Stage = EStage.Names; + + _Base.Graphics.FadeTo(EScreens.ScreenPartyDummy); + } + catch (Exception e) + { + _Base.Log.LogError("Error in party mode challenge. Can't cast received data from screen " + ScreenName + ". " + e.Message); + } + break; + + case "PartyScreenChallengeMain": + _Stage = EStage.Singing; + _Base.Graphics.FadeTo(EScreens.ScreenPartyDummy); + break; + + default: + _Base.Log.LogError("Error in party mode challenge. Wrong screen is sending: " + ScreenName); + break; + } + } + + public override CMenuParty GetNextPartyScreen(out EScreens AlternativeScreen) { CMenuParty Screen = null; - _Screens.TryGetValue("PartyScreenChallengeConfig", out Screen); + AlternativeScreen = EScreens.ScreenSong; + + switch (_Stage) + { + case EStage.NotStarted: + _Screens.TryGetValue("PartyScreenChallengeConfig", out Screen); + break; + case EStage.Config: + _Screens.TryGetValue("PartyScreenChallengeNames", out Screen); + break; + case EStage.Names: + _Screens.TryGetValue("PartyScreenChallengeMain", out Screen); + break; + case EStage.Main: + AlternativeScreen = EScreens.ScreenSong; + break; + case EStage.Singing: + _Screens.TryGetValue("PartyScreenChallengeMain", out Screen); + break; + default: + break; + } + return Screen; } + public override EScreens GetStartScreen() + { + return EScreens.ScreenPartyDummy; + } + + public override EScreens GetMainScreen() + { + return EScreens.ScreenPartyDummy; + } + public override ScreenSongOptions GetScreenSongOptions() { _ScreenSongOptions.Sorting.SongSorting = _Base.Config.GetSongSorting(); diff --git a/PartyModeChallenge/PartyScreenChallengeConfig.cs b/PartyModeChallenge/PartyScreenChallengeConfig.cs index c988c88f..d04a0e3f 100644 --- a/PartyModeChallenge/PartyScreenChallengeConfig.cs +++ b/PartyModeChallenge/PartyScreenChallengeConfig.cs @@ -15,6 +15,8 @@ namespace Vocaluxe.PartyModes const string ButtonNext = "ButtonNext"; const string ButtonBack = "ButtonBack"; + DataFromScreen Data; + public PartyScreenChallengeConfig() { } @@ -26,6 +28,13 @@ namespace Vocaluxe.PartyModes _ThemeName = "PartyScreenChallengeConfig"; _ThemeButtons = new string[] { ButtonNext, ButtonBack }; _ScreenVersion = ScreenVersion; + + Data = new DataFromScreen(); + FromScreenConfig config = new FromScreenConfig(); + config.NumPlayers = 0; + config.NumPlayersAtOnce = 0; + config.NumRounds = 0; + Data.ScreenConfig = config; } public override void LoadTheme(string XmlPath) @@ -39,7 +48,7 @@ namespace Vocaluxe.PartyModes if (KeyEvent.KeyPressed) { - + } else { @@ -47,7 +56,15 @@ namespace Vocaluxe.PartyModes { case Keys.Back: case Keys.Escape: - FadeTo(EScreens.ScreenParty); + Back(); + break; + + case Keys.Enter: + if (Buttons[htButtons(ButtonBack)].Selected) + Back(); + + if (Buttons[htButtons(ButtonNext)].Selected) + Next(); break; } } @@ -60,12 +77,16 @@ namespace Vocaluxe.PartyModes if (MouseEvent.LB && IsMouseOver(MouseEvent)) { + if (Buttons[htButtons(ButtonBack)].Selected) + Back(); + if (Buttons[htButtons(ButtonNext)].Selected) + Next(); } if (MouseEvent.RB) { - FadeTo(EScreens.ScreenParty); + Back(); } return true; @@ -91,5 +112,19 @@ namespace Vocaluxe.PartyModes { base.OnClose(); } + + private void Back() + { + FadeTo(EScreens.ScreenParty); + } + + private void Next() + { + Data.ScreenConfig.NumPlayers = 4; + Data.ScreenConfig.NumPlayersAtOnce = 2; + Data.ScreenConfig.NumRounds = 8; + + _PartyMode.DataFromScreen(_ThemeName, Data); + } } } diff --git a/PartyModeChallenge/PartyScreenChallengeNames.cs b/PartyModeChallenge/PartyScreenChallengeNames.cs index 908f4c0e..af961585 100644 --- a/PartyModeChallenge/PartyScreenChallengeNames.cs +++ b/PartyModeChallenge/PartyScreenChallengeNames.cs @@ -12,6 +12,11 @@ namespace Vocaluxe.PartyModes // Version number for theme files. Increment it, if you've changed something on the theme files! const int ScreenVersion = 1; + const string ButtonNext = "ButtonNext"; + const string ButtonBack = "ButtonBack"; + + private DataFromScreen Data; + public PartyScreenChallengeNames() { } @@ -21,7 +26,15 @@ namespace Vocaluxe.PartyModes base.Init(); _ThemeName = "PartyScreenChallengeNames"; + _ThemeButtons = new string[] { ButtonNext, ButtonBack }; _ScreenVersion = ScreenVersion; + + Data = new DataFromScreen(); + FromScreenNames names = new FromScreenNames(); + names.FadeToConfig = false; + names.FadeToMain = false; + names.ProfileIDs = new List(); + Data.ScreenNames = names; } public override void LoadTheme(string XmlPath) @@ -43,7 +56,16 @@ namespace Vocaluxe.PartyModes { case Keys.Back: case Keys.Escape: - FadeTo(EScreens.ScreenParty); + Back(); + break; + + case Keys.Enter: + if (Buttons[htButtons(ButtonBack)].Selected) + Back(); + + if (Buttons[htButtons(ButtonNext)].Selected) + Next(); + break; } } @@ -56,7 +78,11 @@ namespace Vocaluxe.PartyModes if (MouseEvent.LB && IsMouseOver(MouseEvent)) { + if (Buttons[htButtons(ButtonBack)].Selected) + Back(); + if (Buttons[htButtons(ButtonNext)].Selected) + Next(); } if (MouseEvent.RB) @@ -87,5 +113,19 @@ namespace Vocaluxe.PartyModes { base.OnClose(); } + + private void Back() + { + Data.ScreenNames.FadeToConfig = true; + Data.ScreenNames.FadeToMain = false; + _PartyMode.DataFromScreen(_ThemeName, Data); + } + + private void Next() + { + Data.ScreenNames.FadeToConfig = false; + Data.ScreenNames.FadeToMain = true; + _PartyMode.DataFromScreen(_ThemeName, Data); + } } } diff --git a/Vocaluxe/Base/CGraphics.cs b/Vocaluxe/Base/CGraphics.cs index b618da23..522e4407 100644 --- a/Vocaluxe/Base/CGraphics.cs +++ b/Vocaluxe/Base/CGraphics.cs @@ -453,7 +453,16 @@ namespace Vocaluxe.Base public static void FadeTo(EScreens Screen) { if (Screen == EScreens.ScreenPartyDummy) - _Screens[(int)EScreens.ScreenPartyDummy] = CParty.GetNextPartyScreen(); + { + EScreens alt; + CMenu scr = CParty.GetNextPartyScreen(out alt); + if (scr == null) + { + _NextScreen = alt; + return; + } + _Screens[(int)EScreens.ScreenPartyDummy] = scr; + } _NextScreen = Screen; } diff --git a/Vocaluxe/Base/CParty.cs b/Vocaluxe/Base/CParty.cs index ca16a6d9..35753bbc 100644 --- a/Vocaluxe/Base/CParty.cs +++ b/Vocaluxe/Base/CParty.cs @@ -131,18 +131,13 @@ namespace Vocaluxe.Base { if (!_PartyModes.TryGetValue(PartyModeID, out _CurrentPartyMode)) CLog.LogError("CParty: Can't find party mode ID: " + PartyModeID.ToString()); + + _CurrentPartyMode.PartyMode.Init(); } - public static CMenu GetNextPartyScreen() + public static CMenu GetNextPartyScreen(out EScreens AlternativeScreen) { - CMenu NextScreen = _CurrentPartyMode.PartyMode.GetNextPartyScreen(); - if (NextScreen != null) - return NextScreen; - - NextScreen = new CScreenPartyDummy(); - NextScreen.Initialize(CMain.Base); - NextScreen.LoadTheme(String.Empty); - return NextScreen; + return _CurrentPartyMode.PartyMode.GetNextPartyScreen(out AlternativeScreen); } #endregion public stuff @@ -290,7 +285,7 @@ namespace Vocaluxe.Base if (Screen != null) { - Screen.AssignPartyMode(pm.PartyMode); + Screen.AssingPartyMode(pm.PartyMode); pm.PartyMode.AddScreen(Screen, screenfile); } else diff --git a/VocaluxeLib/Menu/CMenuParty.cs b/VocaluxeLib/Menu/CMenuParty.cs index ac967eb3..859fc1b1 100644 --- a/VocaluxeLib/Menu/CMenuParty.cs +++ b/VocaluxeLib/Menu/CMenuParty.cs @@ -25,11 +25,15 @@ namespace Vocaluxe.Menu return _PartyModeID; } - public void AssignPartyMode(IPartyMode PartyMode) + public void AssingPartyMode(IPartyMode PartyMode) { _PartyMode = PartyMode; } + public virtual void DataToScreen(Object Data) + { + } + /* public sealed override void LoadTheme() { diff --git a/VocaluxeLib/Menu/IMenu.cs b/VocaluxeLib/Menu/IMenu.cs index 833881ca..ba01177d 100644 --- a/VocaluxeLib/Menu/IMenu.cs +++ b/VocaluxeLib/Menu/IMenu.cs @@ -49,7 +49,8 @@ namespace Vocaluxe.Menu void SetPartyModeID(int PartyModeID); int GetPartyModeID(); - void AssignPartyMode(IPartyMode PartyMode); + void AssingPartyMode(IPartyMode PartyMode); + void DataToScreen(Object Data); } public interface IConfig diff --git a/VocaluxeLib/PartyModes/CPartyMode.cs b/VocaluxeLib/PartyModes/CPartyMode.cs index 618a191b..a35504a3 100644 --- a/VocaluxeLib/PartyModes/CPartyMode.cs +++ b/VocaluxeLib/PartyModes/CPartyMode.cs @@ -12,7 +12,6 @@ namespace Vocaluxe.PartyModes protected ScreenSongOptions _ScreenSongOptions; protected Dictionary _Screens; protected string _Folder; - protected Delegate _Callback; public CPartyMode() { @@ -24,7 +23,7 @@ namespace Vocaluxe.PartyModes } #region Implementation - public virtual bool Init(string Folder) + public virtual bool Init() { return false; } @@ -39,13 +38,13 @@ namespace Vocaluxe.PartyModes _Screens.Add(ScreenName, Screen); } - public void SetPartyModeCallback(Delegate Callback) + public virtual void DataFromScreen(string ScreenName, Object Data) { - _Callback = Callback; } - public virtual CMenuParty GetNextPartyScreen() + public virtual CMenuParty GetNextPartyScreen(out EScreens AlternativeScreen) { + AlternativeScreen = EScreens.ScreenMain; return null; } diff --git a/VocaluxeLib/PartyModes/IPartyMode.cs b/VocaluxeLib/PartyModes/IPartyMode.cs index e2b427c8..58019494 100644 --- a/VocaluxeLib/PartyModes/IPartyMode.cs +++ b/VocaluxeLib/PartyModes/IPartyMode.cs @@ -51,12 +51,12 @@ namespace Vocaluxe.PartyModes public interface IPartyMode { - bool Init(string Folder); + bool Init(); void Initialize(Basic Base); void AddScreen(CMenuParty Screen, string ScreenName); - void SetPartyModeCallback(Delegate Callback); + void DataFromScreen(string ScreenName, Object Data); - CMenuParty GetNextPartyScreen(); + CMenuParty GetNextPartyScreen(out EScreens AlternativeScreen); EScreens GetStartScreen(); EScreens GetMainScreen(); ScreenSongOptions GetScreenSongOptions();