rewrite of CProfiles.cs, some optimizations in CScreenProfiles.cs, added IsCapturing() to Webcam/IWebcam.cs

This commit is contained in:
Alexander Eckart committed 2013-05-09 22:01:29 +02:00
1 parent 8ab93db26f
commit e70ce5ad68
11 files changed
+590 -337

No files matched your search

+4 -2
View File
@@ -806,12 +806,14 @@ namespace Vocaluxe.Base
/// </summary>
public static void UsePlayers()
{
CProfile[] profiles = CProfiles.GetProfiles();
for (int j = 0; j < CSettings.MaxNumPlayer; j++)
{
CGame.Players[j].ProfileID = -1;
if (Players[j] == "")
if (Players[j] == "" || profiles == null)
continue;
CProfile[] profiles = CProfiles.GetProfiles();
for (int i = 0; i < profiles.Length; i++)
{
if (Path.GetFileName(profiles[i].FileName) == Players[j] && profiles[i].Active == EOffOn.TR_CONFIG_ON)
-2
View File
@@ -68,8 +68,6 @@ namespace Vocaluxe.Base
_SongQueue.Init();
Players = new SPlayer[CSettings.MaxNumPlayer];
ResetPlayer();
CConfig.UsePlayers();
}
public static EGameMode GameMode
+1
View File
@@ -322,6 +322,7 @@ namespace Vocaluxe.Base
CSound.Update();
CBackgroundMusic.Update();
CController.Update();
CProfiles.Update();
if (CConfig.CoverLoading == ECoverLoading.TR_CONFIG_COVERLOADING_DYNAMIC && _CurrentScreen != EScreens.ScreenSing)
CSongs.LoadCover();
+442 -238
View File
@@ -28,21 +28,55 @@ using VocaluxeLib.Profile;
namespace Vocaluxe.Base
{
[Flags]
public enum EProfileChangedFlags
{
None = 1,
Avatar = 2,
Profile = 4
}
public delegate void ProfileChangedCallback(EProfileChangedFlags TypeChanged);
static class CProfiles
{
#region enums and structs
enum EAction
{
LoadProfiles,
LoadAvatars,
AddProfile,
EditProfile,
DeleteProfile,
AddAvatar,
EditAvatar
}
struct SChange
{
public CProfile Profile;
public CAvatar Avatar;
public EAction Action;
public int ProfileID;
}
#endregion enums and structs
#region private vars
private static Dictionary<int, CProfile> _Profiles;
private static Queue<int> _ProfileIDs;
private static Object _ProfileMutex = new Object();
private static Dictionary<int, CAvatar> _Avatars;
private static Queue<int> _AvatarIDs;
private static Object _AvatarMutex = new Object();
public delegate void ProfilesChangedNotification();
private static List<ProfilesChangedNotification> _Callbacks;
private static Queue<SChange> _Queue = new Queue<SChange>();
private static Object _QueueMutex = new Object();
private static List<ProfileChangedCallback> _ProfileChangedCallbacks = new List<ProfileChangedCallback>();
private static bool _ProfilesChanged = false;
private static bool _AvatarsChanged = false;
#endregion private vars
#region properties
public static int NumProfiles
{
get { return _Profiles.Count; }
@@ -52,7 +86,9 @@ namespace Vocaluxe.Base
{
get { return _Avatars.Count; }
}
#endregion properties
#region public methods
public static void Init()
{
_Avatars = new Dictionary<int, CAvatar>();
@@ -69,56 +105,293 @@ namespace Vocaluxe.Base
_ProfileIDs.Enqueue(i);
}
_Callbacks = new List<ProfilesChangedNotification>();
LoadProfiles();
}
public static void AddNotificationCallback(ProfilesChangedNotification Callback)
public static void Update()
{
if (Callback == null)
lock (_QueueMutex)
{
while (_Queue.Count > 0)
{
SChange change = _Queue.Dequeue();
switch (change.Action)
{
case EAction.LoadProfiles:
_LoadProfiles();
_ProfilesChanged = true;
_AvatarsChanged = true;
break;
case EAction.LoadAvatars:
_LoadAvatars();
_AvatarsChanged = true;
break;
case EAction.AddProfile:
if (change.Profile == null)
break;
change.Profile.ID = _ProfileIDs.Dequeue();
_Profiles.Add(change.Profile.ID, change.Profile);
_ProfilesChanged = true;
break;
case EAction.EditProfile:
if (change.Profile == null)
break;
if (!ICProfileIDValid(change.Profile.ID))
return;
_Profiles[change.Profile.ID] = change.Profile;
_ProfilesChanged = true;
break;
case EAction.DeleteProfile:
if (!ICProfileIDValid(change.ProfileID))
break;
_DeleteProfile(change.ProfileID);
_ProfilesChanged = true;
break;
case EAction.AddAvatar:
if (change.Avatar == null)
break;
change.Avatar.ID = _AvatarIDs.Dequeue();
_Avatars.Add(change.Avatar.ID, change.Avatar);
_AvatarsChanged = true;
break;
case EAction.EditAvatar:
if (change.Avatar == null)
break;
if (!ICAvatarIDValid(change.Avatar.ID))
return;
_Avatars[change.Avatar.ID] = change.Avatar;
_AvatarsChanged = true;
break;
default:
break;
}
}
}
if (_ProfileChangedCallbacks.Count == 0)
return;
lock (_Callbacks)
EProfileChangedFlags flags = EProfileChangedFlags.None;
if (_AvatarsChanged)
flags = EProfileChangedFlags.Avatar;
if (_ProfilesChanged)
flags |= EProfileChangedFlags.Profile;
if (flags != EProfileChangedFlags.None)
{
_Callbacks.Add(Callback);
int index = 0;
while (index < _ProfileChangedCallbacks.Count)
{
try
{
_ProfileChangedCallbacks[index](flags);
}
catch (Exception)
{
_ProfileChangedCallbacks.RemoveAt(index);
}
index++;
}
}
_AvatarsChanged = false;
_ProfilesChanged = false;
}
public static void AddProfileChangedCallback(ProfileChangedCallback Notification)
{
_ProfileChangedCallbacks.Add(Notification);
}
public static void LoadProfiles()
{
SChange change = new SChange();
change.Action = EAction.LoadProfiles;
lock (_QueueMutex)
{
_Queue.Enqueue(change);
}
}
public static void LoadAvatars()
{
SChange change = new SChange();
change.Action = EAction.LoadAvatars;
lock (_QueueMutex)
{
_Queue.Enqueue(change);
}
}
public static void AddProfile(CProfile NewProfile)
{
if (NewProfile == null)
return;
SChange change = new SChange();
change.Action = EAction.AddProfile;
change.Profile = NewProfile;
lock (_QueueMutex)
{
_Queue.Enqueue(change);
}
}
public static void EditProfile(CProfile EditProfile)
{
if (EditProfile == null)
return;
SChange change = new SChange();
change.Action = EAction.EditProfile;
change.Profile = EditProfile;
lock (_QueueMutex)
{
_Queue.Enqueue(change);
}
}
public static void DeleteProfile(int profileID)
{
if (!ICProfileIDValid(profileID))
return;
SChange change = new SChange();
change.Action = EAction.DeleteProfile;
change.ProfileID = profileID;
lock (_QueueMutex)
{
_Queue.Enqueue(change);
}
}
public static void AddAvatar(CAvatar NewAvatar)
{
if (NewAvatar == null)
return;
SChange change = new SChange();
change.Action = EAction.AddAvatar;
change.Avatar = NewAvatar;
lock (_QueueMutex)
{
_Queue.Enqueue(change);
}
}
public static void EditAvatar(CAvatar EditAvatar)
{
if (EditAvatar == null)
return;
SChange change = new SChange();
change.Action = EAction.EditAvatar;
change.Avatar = EditAvatar;
lock (_QueueMutex)
{
_Queue.Enqueue(change);
}
}
public static CProfile[] GetProfiles()
{
List<CProfile> list = new List<CProfile>();
lock (_ProfileMutex)
{
if (_Profiles.Count == 0)
return null;
if (_Profiles.Count == 0)
return null;
CProfile[] result = new CProfile[_Profiles.Count];
_Profiles.Values.CopyTo(result, 0);
for (int i = 0; i < result.Length; i++)
{
list.Add(result[i]);
}
list.Sort(_CompareByPlayerName);
CProfile[] result = new CProfile[_Profiles.Count];
_Profiles.Values.CopyTo(result, 0);
for (int i = 0; i < result.Length; i++)
{
list.Add(result[i]);
}
list.Sort(_CompareByPlayerName);
return list.ToArray();
}
public static CAvatar[] GetAvatars()
{
CAvatar[] result = null;
lock (_AvatarMutex)
{
if (_Avatars.Count == 0)
return null;
if (_Avatars.Count == 0)
return null;
result = new CAvatar[_Avatars.Count];
_Avatars.Values.CopyTo(result, 0);
}
result = new CAvatar[_Avatars.Count];
_Avatars.Values.CopyTo(result, 0);
return result;
}
public static int NewProfile(string fileName = "")
{
CProfile profile = new CProfile
{
FileName = fileName != "" ? Path.Combine(CSettings.FolderProfiles, fileName) : String.Empty
};
if (File.Exists(profile.FileName))
return -1;
profile.ID = _ProfileIDs.Dequeue();
_Profiles.Add(profile.ID, profile);
_ProfilesChanged = true;
return profile.ID;
}
public static int NewAvatar(string fileName)
{
CAvatar avatar = new CAvatar(-1);
if (!avatar.LoadFromFile(fileName))
return -1;
avatar.ID = _AvatarIDs.Dequeue();
_Avatars.Add(avatar.ID, avatar);
_AvatarsChanged = true;
return avatar.ID;
}
public static void SaveProfiles()
{
foreach (int id in _Profiles.Keys)
{
_Profiles[id].SaveProfile();
}
}
public static bool ICProfileIDValid(int profileID)
{
return _Profiles.ContainsKey(profileID);
}
public static bool ICAvatarIDValid(int avatarID)
{
return _Avatars.ContainsKey(avatarID);
}
#endregion public methods
#region profile properties
public static string GetPlayerName(int profileID, int playerNum = 0)
{
if (ICProfileIDValid(profileID))
@@ -130,134 +403,6 @@ namespace Vocaluxe.Base
return playerName;
}
public static string GetProfileFileName(int profileID)
{
if (!ICProfileIDValid(profileID))
return String.Empty;
return Path.GetFileName(_Profiles[profileID].FileName);
}
public static int NewProfile(string fileName = "")
{
CProfile profile = new CProfile
{
FileName = fileName != "" ? Path.Combine(CSettings.FolderProfiles, fileName) : String.Empty
};
if (File.Exists(profile.FileName))
return -1;
lock (_ProfileMutex)
{
profile.ID = _ProfileIDs.Dequeue();
_Profiles.Add(profile.ID, profile);
}
_Notification();
return profile.ID;
}
public static void SaveProfiles()
{
foreach (int id in _Profiles.Keys)
{
_Profiles[id].SaveProfile();
}
LoadProfiles();
}
public static void LoadProfiles()
{
LoadAvatars();
lock (_ProfileMutex)
{
List<string> knownFiles = new List<string>();
if (_Profiles.Count > 0)
{
int[] ids = new int[_Profiles.Keys.Count];
_Profiles.Keys.CopyTo(ids, 0);
for (int i = 0; i < ids.Length; i++)
{
if (_Profiles[ids[i]].LoadProfile())
{
_Profiles[ids[i]].Avatar = _GetAvatar(_Profiles[ids[i]].AvatarFileName);
knownFiles.Add(_Profiles[ids[i]].FileName);
}
else
_Profiles.Remove(ids[i]);
}
}
List<string> files = new List<string>();
files.AddRange(CHelper.ListFiles(CSettings.FolderProfiles, "*.xml", true, true));
foreach (string file in knownFiles)
{
files.Remove(file);
}
foreach (string file in files)
{
CProfile profile = new CProfile
{
FileName = Path.Combine(CSettings.FolderProfiles, file)
};
if (profile.LoadProfile())
{
profile.Avatar = _GetAvatar(profile.AvatarFileName);
profile.ID = _ProfileIDs.Dequeue();
_Profiles.Add(profile.ID, profile);
}
}
}
_Notification();
}
public static void LoadAvatars()
{
lock (_AvatarMutex)
{
List<string> knownFiles = new List<string>();
if (_Avatars.Count > 0)
{
int[] ids = new int[_Avatars.Keys.Count];
_Avatars.Keys.CopyTo(ids, 0);
for (int i = 0; i < ids.Length; i++)
{
if (_Avatars[ids[i]].Reload())
knownFiles.Add(_Avatars[ids[i]].FileName);
else
_Avatars.Remove(ids[i]);
}
}
List<string> files = new List<string>();
files.AddRange(CHelper.ListFiles(CSettings.FolderProfiles, "*.png", true, true));
files.AddRange(CHelper.ListFiles(CSettings.FolderProfiles, "*.jpg", true, true));
files.AddRange(CHelper.ListFiles(CSettings.FolderProfiles, "*.jpeg", true, true));
files.AddRange(CHelper.ListFiles(CSettings.FolderProfiles, "*.bmp", true, true));
foreach (string file in knownFiles)
{
files.Remove(file);
}
foreach (string file in files)
{
CAvatar avatar = new CAvatar(-1);
if (avatar.LoadFromFile(file))
{
avatar.ID = _AvatarIDs.Dequeue();
_Avatars.Add(avatar.ID, avatar);
}
}
}
_Notification();
}
public static void SetPlayerName(int profileID, string PlayerName)
{
if (!ICProfileIDValid(profileID))
@@ -266,6 +411,14 @@ namespace Vocaluxe.Base
_Profiles[profileID].PlayerName = PlayerName;
}
public static string GetProfileFileName(int profileID)
{
if (!ICProfileIDValid(profileID))
return String.Empty;
return Path.GetFileName(_Profiles[profileID].FileName);
}
public static string AddGetPlayerName(int profileID, char chr)
{
if (!ICProfileIDValid(profileID))
@@ -287,16 +440,6 @@ namespace Vocaluxe.Base
return profile.PlayerName;
}
public static bool ICProfileIDValid(int profileID)
{
return _Profiles.ContainsKey(profileID);
}
public static bool ICAvatarIDValid(int avatarID)
{
return _Avatars.ContainsKey(avatarID);
}
public static EGameDifficulty GetDifficulty(int profileID)
{
return ICProfileIDValid(profileID) ? _Profiles[profileID].Difficulty : EGameDifficulty.TR_CONFIG_NORMAL;
@@ -315,11 +458,6 @@ namespace Vocaluxe.Base
return ICProfileIDValid(profileID) ? _Profiles[profileID].GuestProfile : EOffOn.TR_CONFIG_OFF;
}
public static EOffOn GetActive(int profileID)
{
return ICProfileIDValid(profileID) ? _Profiles[profileID].Active : EOffOn.TR_CONFIG_OFF;
}
public static void SetGuestProfile(int profileID, EOffOn option)
{
if (!ICProfileIDValid(profileID))
@@ -328,10 +466,16 @@ namespace Vocaluxe.Base
_Profiles[profileID].GuestProfile = option;
}
public static EOffOn GetActive(int profileID)
{
return ICProfileIDValid(profileID) ? _Profiles[profileID].Active : EOffOn.TR_CONFIG_OFF;
}
public static void SetActive(int profileID, EOffOn option)
{
if (!ICProfileIDValid(profileID))
return;
_Profiles[profileID].Active = option;
}
@@ -365,7 +509,9 @@ namespace Vocaluxe.Base
return _Profiles[profileID].Avatar.ID;
}
#endregion profile properties
#region avatar texture
public static STexture GetAvatarTexture(int avatarID)
{
if (!ICAvatarIDValid(avatarID))
@@ -381,68 +527,138 @@ namespace Vocaluxe.Base
return _Profiles[profileID].Avatar.Texture;
}
public static void DeleteProfile(int profileID)
{
lock (_ProfileMutex)
{
if (!ICProfileIDValid(profileID))
return;
if (_Profiles[profileID].FileName == "")
{
_RemoveProfile(profileID);
return;
}
try
{
//Check if profile saved in config
for (int i = 0; i < CConfig.Players.Length; i++)
{
if (CConfig.Players[i] == _Profiles[profileID].FileName)
{
CConfig.Players[i] = string.Empty;
CConfig.SaveConfig();
}
}
File.Delete(_Profiles[profileID].FileName);
_RemoveProfile(profileID);
//Check if profile is selected in game
for (int i = 0; i < CGame.Players.Length; i++)
{
if (CGame.Players[i].ProfileID > profileID)
CGame.Players[i].ProfileID--;
else if (CGame.Players[i].ProfileID == profileID)
CGame.Players[i].ProfileID = -1;
}
}
catch (Exception)
{
CLog.LogError("Can't delete Profile File " + _Profiles[profileID].FileName + ".xml");
}
}
}
#endregion avatar texture
#region private methods
private static void _Notification()
private static void _LoadProfiles()
{
lock (_Callbacks)
_LoadAvatars();
List<string> knownFiles = new List<string>();
if (_Profiles.Count > 0)
{
for (int i = 0; i < _Callbacks.Count; i++)
int[] ids = new int[_Profiles.Keys.Count];
_Profiles.Keys.CopyTo(ids, 0);
for (int i = 0; i < ids.Length; i++)
{
try
if (_Profiles[ids[i]].LoadProfile())
{
_Callbacks[i]();
_Profiles[ids[i]].Avatar = _GetAvatar(_Profiles[ids[i]].AvatarFileName);
knownFiles.Add(Path.GetFileName(_Profiles[ids[i]].FileName));
}
catch (Exception)
else
_Profiles.Remove(ids[i]);
}
}
List<string> files = new List<string>();
files.AddRange(CHelper.ListFiles(CSettings.FolderProfiles, "*.xml", true, true));
foreach (string file in files)
{
if (knownFiles.Contains(Path.GetFileName(file)))
continue;
CProfile profile = new CProfile
{
FileName = Path.Combine(CSettings.FolderProfiles, file)
};
if (profile.LoadProfile())
{
profile.Avatar = _GetAvatar(profile.AvatarFileName);
profile.ID = _ProfileIDs.Dequeue();
_Profiles.Add(profile.ID, profile);
}
}
_ProfilesChanged = true;
}
private static void _LoadAvatars()
{
List<string> knownFiles = new List<string>();
if (_Avatars.Count > 0)
{
int[] ids = new int[_Avatars.Keys.Count];
_Avatars.Keys.CopyTo(ids, 0);
for (int i = 0; i < ids.Length; i++)
{
if (_Avatars[ids[i]].Reload())
knownFiles.Add(Path.GetFileName(_Avatars[ids[i]].FileName));
else
_Avatars.Remove(ids[i]);
}
}
List<string> files = new List<string>();
files.AddRange(CHelper.ListFiles(CSettings.FolderProfiles, "*.png", true, true));
files.AddRange(CHelper.ListFiles(CSettings.FolderProfiles, "*.jpg", true, true));
files.AddRange(CHelper.ListFiles(CSettings.FolderProfiles, "*.jpeg", true, true));
files.AddRange(CHelper.ListFiles(CSettings.FolderProfiles, "*.bmp", true, true));
foreach (string file in files)
{
if (knownFiles.Contains(Path.GetFileName(file)))
continue;
CAvatar avatar = new CAvatar(-1);
if (avatar.LoadFromFile(file))
{
avatar.ID = _AvatarIDs.Dequeue();
_Avatars.Add(avatar.ID, avatar);
}
}
_ProfilesChanged = true;
}
private static void _DeleteProfile(int profileID)
{
if (!ICProfileIDValid(profileID))
return;
if (_Profiles[profileID].FileName == "")
{
_RemoveProfile(profileID);
return;
}
try
{
//Check if profile saved in config
for (int i = 0; i < CConfig.Players.Length; i++)
{
if (CConfig.Players[i] == _Profiles[profileID].FileName)
{
_Callbacks.RemoveAt(i);
CConfig.Players[i] = string.Empty;
CConfig.SaveConfig();
}
}
File.Delete(_Profiles[profileID].FileName);
_RemoveProfile(profileID);
//Check if profile is selected in game
for (int i = 0; i < CGame.Players.Length; i++)
{
if (CGame.Players[i].ProfileID > profileID)
CGame.Players[i].ProfileID--;
else if (CGame.Players[i].ProfileID == profileID)
CGame.Players[i].ProfileID = -1;
}
}
catch (Exception)
{
CLog.LogError("Can't delete Profile File " + _Profiles[profileID].FileName + ".xml");
}
_ProfilesChanged = true;
}
private static void _RemoveProfile(int profileID)
{
if (!ICProfileIDValid(profileID))
return;
_Profiles.Remove(profileID);
_ProfilesChanged = true;
}
private static int _CompareByPlayerName(CProfile a, CProfile b)
@@ -452,25 +668,13 @@ namespace Vocaluxe.Base
private static CAvatar _GetAvatar(string fileName)
{
lock (_AvatarMutex)
foreach (int id in _Avatars.Keys)
{
foreach (int id in _Avatars.Keys)
{
if (Path.GetFileName(_Avatars[id].FileName) == fileName)
return _Avatars[id];
}
if (Path.GetFileName(_Avatars[id].FileName) == fileName)
return _Avatars[id];
}
return new CAvatar(-1);
}
private static void _RemoveProfile(int profileID)
{
if (!ICProfileIDValid(profileID))
return;
_Profiles.Remove(profileID);
_Notification();
}
#endregion private methods
}
}
+5
View File
@@ -91,5 +91,10 @@ namespace Vocaluxe.Base
{
return _Webcam.IsDeviceAvailable();
}
public static bool IsCapturing()
{
return _Webcam.IsCapturing();
}
}
}
+12 -3
View File
@@ -12,6 +12,7 @@ using ClientServerLib;
using Vocaluxe.Base;
using Vocaluxe.Lib.Input;
using VocaluxeLib;
using VocaluxeLib.Profile;
namespace Vocaluxe.Base.Server
{
@@ -156,12 +157,20 @@ namespace Vocaluxe.Base.Server
while (File.Exists(filename + i + ".jpg"))
i++;
FileStream fs = File.Create(filename + i + ".jpg");
filename = filename + i + ".jpg";
FileStream fs = File.Create(filename);
fs.Write(avatarPictureJpg.data, 0, avatarPictureJpg.data.Length);
fs.Flush();
fs.Close();
success = true;
CProfiles.LoadProfiles();
CAvatar avatar = new CAvatar(-1);
success = avatar.LoadFromFile(filename);
if (success)
{
CProfiles.AddAvatar(avatar);
}
}
catch {}
+5
View File
@@ -164,6 +164,11 @@ namespace Vocaluxe.Lib.Webcam
return _Devices.Count > 0;
}
public bool IsCapturing()
{
return _Webcam.IsRunning;
}
public bool Select(SWebcamConfig config)
{
//Close old camera connection
+1
View File
@@ -59,6 +59,7 @@ namespace Vocaluxe.Lib.Webcam
SWebcamConfig GetConfig();
SWebcamDevice[] GetDevices();
bool IsDeviceAvailable();
bool IsCapturing();
bool Select(SWebcamConfig webcamConfig);
}
+8
View File
@@ -197,15 +197,23 @@ namespace Vocaluxe
CController.Connect();
CLog.StopBenchmark(0, "Init Input");
Application.DoEvents();
// Init Game;
CLog.StartBenchmark(0, "Init Game");
CGame.Init();
CProfiles.Update();
CConfig.UsePlayers();
CLog.StopBenchmark(0, "Init Game");
Application.DoEvents();
// Init Party Modes;
CLog.StartBenchmark(0, "Init Party Modes");
CParty.Init();
CLog.StopBenchmark(0, "Init Party Modes");
Application.DoEvents();
}
catch (Exception e)
{
+101 -91
View File
@@ -60,9 +60,10 @@ namespace Vocaluxe.Screens
private const string _ButtonTakeSnapshot = "ButtonTakeSnapshot";
private const string _StaticAvatar = "StaticAvatar";
private bool _ProfilesChanged;
private bool _AvatarsChanged;
private EEditMode _EditMode;
private bool _ProfilesChanged;
private STexture _WebcamTexture = new STexture(-1);
private Bitmap _Snapshot;
@@ -77,7 +78,9 @@ namespace Vocaluxe.Screens
_ThemeStatics = new string[] {_StaticAvatar};
_EditMode = EEditMode.None;
CProfiles.AddNotificationCallback(_OnProfilesChanged);
_ProfilesChanged = false;
_AvatarsChanged = false;
CProfiles.AddProfileChangedCallback(new ProfileChangedCallback(_OnProfileChanged));
}
public override void LoadTheme(string xmlPath)
@@ -108,6 +111,7 @@ namespace Vocaluxe.Screens
case EEditMode.PlayerName:
_SelectSlides[_SelectSlideProfiles].RenameValue(
CProfiles.AddGetPlayerName(_SelectSlides[_SelectSlideProfiles].ValueIndex, keyEvent.Unicode));
_ProfilesChanged = true;
break;
}
}
@@ -116,7 +120,10 @@ namespace Vocaluxe.Screens
switch (keyEvent.Key)
{
case Keys.Escape:
CGraphics.FadeTo(EScreens.ScreenMain);
if (_EditMode == EEditMode.PlayerName)
_EditMode = EEditMode.None;
else
CGraphics.FadeTo(EScreens.ScreenMain);
break;
case Keys.Enter:
@@ -150,6 +157,7 @@ namespace Vocaluxe.Screens
{
_SelectSlides[_SelectSlideProfiles].RenameValue(
CProfiles.GetDeleteCharInPlayerName(_SelectSlides[_SelectSlideProfiles].ValueIndex));
_ProfilesChanged = true;
}
else
CGraphics.FadeTo(EScreens.ScreenMain);
@@ -243,6 +251,64 @@ namespace Vocaluxe.Screens
return true;
}
public override bool UpdateGame()
{
if (_AvatarsChanged)
_LoadAvatars(true);
if (_ProfilesChanged)
_LoadProfiles(true);
if (_SelectSlides[_SelectSlideProfiles].Selection > -1)
{
_Buttons[_ButtonPlayerName].Text.Text = CProfiles.GetPlayerName(_SelectSlides[_SelectSlideProfiles].ValueIndex);
if (_EditMode == EEditMode.PlayerName)
_Buttons[_ButtonPlayerName].Text.Text += "|";
_SelectSlides[_SelectSlideDifficulty].Selection = (int)CProfiles.GetDifficulty(_SelectSlides[_SelectSlideProfiles].ValueIndex);
_SelectSlides[_SelectSlideGuestProfile].Selection = (int)CProfiles.GetGuestProfile(_SelectSlides[_SelectSlideProfiles].ValueIndex);
_SelectSlides[_SelectSlideActive].Selection = (int)CProfiles.GetActive(_SelectSlides[_SelectSlideProfiles].ValueIndex);
int avatarID = CProfiles.GetAvatarID(_SelectSlides[_SelectSlideProfiles].ValueIndex);
_SelectSlides[_SelectSlideAvatars].SetSelectionByValueIndex(avatarID);
if (CWebcam.IsDeviceAvailable() && CWebcam.IsCapturing())
{
if (_Snapshot == null)
CWebcam.GetFrame(ref _WebcamTexture);
_Statics[_StaticAvatar].Texture = _WebcamTexture;
}
else
_Statics[_StaticAvatar].Texture = CProfiles.GetAvatarTexture(avatarID);
}
return true;
}
public override void OnShow()
{
base.OnShow();
_LoadAvatars(false);
_LoadProfiles(false);
UpdateGame();
}
public override void OnClose()
{
base.OnClose();
_EditMode = EEditMode.None;
_OnDiscardSnapshot();
}
private void _OnProfileChanged(EProfileChangedFlags Flags)
{
if (EProfileChangedFlags.Avatar == (EProfileChangedFlags.Avatar & Flags))
_AvatarsChanged = true;
if (EProfileChangedFlags.Profile == (EProfileChangedFlags.Profile & Flags))
_ProfilesChanged = true;
}
private void _OnTakeSnapshot()
{
_Buttons[_ButtonSaveSnapshot].Visible = true;
@@ -265,31 +331,26 @@ namespace Vocaluxe.Screens
private void _OnSaveSnapshot()
{
const string filename = "snapshot";
string filename = Path.Combine(CSettings.FolderProfiles, "snapshot");
int i = 0;
while (File.Exists(Path.Combine(CSettings.FolderProfiles, filename + i + ".png")))
while (File.Exists(filename + i + ".png"))
i++;
_Snapshot.Save(Path.Combine(CSettings.FolderProfiles, filename + i + ".png"), ImageFormat.Png);
CProfiles.LoadAvatars();
_LoadAvatars(false);
filename = filename + i + ".png";
_Snapshot.Save(filename, ImageFormat.Png);
_Snapshot = null;
CWebcam.Stop();
CDraw.RemoveTexture(ref _WebcamTexture);
CAvatar[] avatars = CProfiles.GetAvatars();
for (int j = 0; j < avatars.Length; j++)
{
if (Path.GetFileName(avatars[j].FileName) == (filename + i + ".png"))
{
CProfiles.SetAvatar(_SelectSlides[_SelectSlideProfiles].ValueIndex, avatars[j].ID);
break;
}
}
_Buttons[_ButtonSaveSnapshot].Visible = false;
_Buttons[_ButtonDiscardSnapshot].Visible = false;
_Buttons[_ButtonTakeSnapshot].Visible = false;
_Buttons[_ButtonWebcam].Visible = true;
int id = CProfiles.NewAvatar(filename);
CProfiles.SetAvatar(_SelectSlides[_SelectSlideProfiles].ValueIndex, id);
_LoadAvatars(false);
}
private void _OnWebcam()
@@ -303,83 +364,37 @@ namespace Vocaluxe.Screens
_Buttons[_ButtonWebcam].Visible = false;
}
public override bool UpdateGame()
private void _NewProfile()
{
if (_ProfilesChanged)
{
_LoadAvatars(true);
_LoadProfiles(true);
_ProfilesChanged = false;
}
if (_SelectSlides[_SelectSlideProfiles].Selection > -1)
{
_Buttons[_ButtonPlayerName].Text.Text = CProfiles.GetPlayerName(_SelectSlides[_SelectSlideProfiles].ValueIndex);
if (_EditMode == EEditMode.PlayerName)
_Buttons[_ButtonPlayerName].Text.Text += "|";
_SelectSlides[_SelectSlideDifficulty].Selection = (int)CProfiles.GetDifficulty(_SelectSlides[_SelectSlideProfiles].ValueIndex);
_SelectSlides[_SelectSlideGuestProfile].Selection = (int)CProfiles.GetGuestProfile(_SelectSlides[_SelectSlideProfiles].ValueIndex);
_SelectSlides[_SelectSlideActive].Selection = (int)CProfiles.GetActive(_SelectSlides[_SelectSlideProfiles].ValueIndex);
int avatarID = CProfiles.GetAvatarID(_SelectSlides[_SelectSlideProfiles].ValueIndex);
_SelectSlides[_SelectSlideAvatars].SetSelectionByValueIndex(avatarID);
if (CWebcam.IsDeviceAvailable() && _WebcamTexture.Index != -1)
{
if (_Snapshot == null)
CWebcam.GetFrame(ref _WebcamTexture);
_Statics[_StaticAvatar].Texture = _WebcamTexture;
}
else
_Statics[_StaticAvatar].Texture = CProfiles.GetAvatarTexture(avatarID);
}
return true;
}
public override void OnShow()
{
base.OnShow();
CProfiles.LoadProfiles();
_LoadAvatars(false);
_EditMode = EEditMode.None;
int id = CProfiles.NewProfile();
_LoadProfiles(false);
UpdateGame();
}
_SelectSlides[_SelectSlideProfiles].SetSelectionByValueIndex(id);
public override void OnClose()
{
base.OnClose();
CProfiles.SetAvatar(_SelectSlides[_SelectSlideProfiles].ValueIndex,
_SelectSlides[_SelectSlideAvatars].ValueIndex);
_OnDiscardSnapshot();
}
private void _OnProfilesChanged()
{
_ProfilesChanged = true;
_SetInteractionToButton(_Buttons[_ButtonPlayerName]);
_EditMode = EEditMode.PlayerName;
}
private void _SaveProfiles()
{
_EditMode = EEditMode.None;
CProfiles.SaveProfiles();
_LoadProfiles(true);
UpdateGame();
}
private void _DeleteProfile()
{
_EditMode = EEditMode.None;
int selection = _SelectSlides[_SelectSlideProfiles].Selection;
CProfiles.DeleteProfile(_SelectSlides[_SelectSlideProfiles].ValueIndex);
_LoadProfiles(false);
if (_SelectSlides[_SelectSlideProfiles].NumValues > selection)
_SelectSlides[_SelectSlideProfiles].Selection = selection;
int selection = _SelectSlides[_SelectSlideProfiles].Selection;
if (_SelectSlides[_SelectSlideProfiles].NumValues - 1 > selection)
_SelectSlides[_SelectSlideProfiles].Selection = selection + 1;
else
_SelectSlides[_SelectSlideProfiles].Selection = selection - 1;
UpdateGame();
}
private void _LoadProfiles(bool Keep)
@@ -401,7 +416,13 @@ namespace Vocaluxe.Screens
if (CProfiles.NumProfiles > 0 && CProfiles.NumAvatars > 0)
{
_SelectSlides[_SelectSlideProfiles].SetSelectionByValueIndex(selectedProfileID);
if (selectedProfileID != -1)
_SelectSlides[_SelectSlideProfiles].SetSelectionByValueIndex(selectedProfileID);
else
{
_SelectSlides[_SelectSlideProfiles].Selection = 0;
selectedProfileID = _SelectSlides[_SelectSlideProfiles].ValueIndex;
}
if (!Keep)
{
@@ -414,6 +435,7 @@ namespace Vocaluxe.Screens
if (_EditMode == EEditMode.PlayerName)
CProfiles.SetPlayerName(_SelectSlides[_SelectSlideProfiles].ValueIndex, name);
}
_ProfilesChanged = false;
}
private void _LoadAvatars(bool Keep)
@@ -435,20 +457,8 @@ namespace Vocaluxe.Screens
}
else
_SelectSlides[_SelectSlideAvatars].SetSelectionByValueIndex(CProfiles.GetAvatarID(_SelectSlides[_SelectSlideProfiles].ValueIndex));
}
private void _NewProfile()
{
_EditMode = EEditMode.None;
int id = CProfiles.NewProfile();
_LoadProfiles(false);
_SelectSlides[_SelectSlideProfiles].SetSelectionByValueIndex(id);
CProfiles.SetAvatar(_SelectSlides[_SelectSlideProfiles].ValueIndex,
_SelectSlides[_SelectSlideAvatars].ValueIndex);
_SetInteractionToButton(_Buttons[_ButtonPlayerName]);
_EditMode = EEditMode.PlayerName;
}
_AvatarsChanged = false;
}
}
}
+11 -1
View File
@@ -23,7 +23,17 @@ namespace VocaluxeLib.Profile
public string AvatarFileName;
public EGameDifficulty Difficulty;
public CAvatar Avatar;
private CAvatar _Avatar;
public CAvatar Avatar
{
get { return _Avatar; }
set
{
_Avatar = value;
AvatarFileName = _Avatar.FileName;
}
}
public EOffOn GuestProfile;
public EOffOn Active;