diff --git a/PartyModes/PartyModeChallenge/CPartyModeChallenge.cs b/PartyModes/PartyModeChallenge/CPartyModeChallenge.cs
index 4635d741..5d76b077 100644
--- a/PartyModes/PartyModeChallenge/CPartyModeChallenge.cs
+++ b/PartyModes/PartyModeChallenge/CPartyModeChallenge.cs
@@ -108,8 +108,7 @@ namespace VocaluxeLib.PartyModes.Challenge
public SData GameData;
private EStage _Stage;
- public CPartyModeChallenge(int id, string folder)
- : base(id, folder)
+ public CPartyModeChallenge(int id, string folder) : base(id, folder)
{
_ScreenSongOptions.Selection.RandomOnly = false;
_ScreenSongOptions.Selection.PartyMode = true;
diff --git a/PartyModes/PartyModeChallengeMedley/CPartyModeChallengeMedley.cs b/PartyModes/PartyModeChallengeMedley/CPartyModeChallengeMedley.cs
index 2cb2a866..78dacac6 100644
--- a/PartyModes/PartyModeChallengeMedley/CPartyModeChallengeMedley.cs
+++ b/PartyModes/PartyModeChallengeMedley/CPartyModeChallengeMedley.cs
@@ -18,6 +18,7 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
+using System.Linq;
using System.Runtime.InteropServices;
using VocaluxeLib.Game;
using VocaluxeLib.Menu;
@@ -113,8 +114,7 @@ namespace VocaluxeLib.PartyModes.ChallengeMedley
public SData GameData;
private EStage _Stage;
- public CPartyModeChallengeMedley(int id, string folder)
- : base(id, folder)
+ public CPartyModeChallengeMedley(int id, string folder) : base(id, folder)
{
_ScreenSongOptions.Selection.RandomOnly = false;
_ScreenSongOptions.Selection.PartyMode = true;
@@ -387,9 +387,7 @@ namespace VocaluxeLib.PartyModes.ChallengeMedley
}
//Calc avarage sing-count
- int totalCounts = 0;
- foreach (CSong song in visibleSongs)
- totalCounts += song.NumPlayedSession;
+ int totalCounts = visibleSongs.Sum(song => song.NumPlayedSession);
int averageCount = totalCounts / visibleSongs.Count;
// ReSharper disable LoopCanBeConvertedToQuery
diff --git a/PartyModes/PartyModeTicTacToe/CPartyModeTicTacToe.cs b/PartyModes/PartyModeTicTacToe/CPartyModeTicTacToe.cs
index b918a0fa..bfbde42a 100644
--- a/PartyModes/PartyModeTicTacToe/CPartyModeTicTacToe.cs
+++ b/PartyModes/PartyModeTicTacToe/CPartyModeTicTacToe.cs
@@ -114,8 +114,7 @@ namespace VocaluxeLib.PartyModes.TicTacToe
public SData GameData;
private EStage _Stage;
- public CPartyModeTicTacToe(int id, string folder)
- : base(id, folder)
+ public CPartyModeTicTacToe(int id, string folder) : base(id, folder)
{
_ScreenSongOptions.Selection.RandomOnly = false;
_ScreenSongOptions.Selection.PartyMode = true;
diff --git a/ServerLib/CDiscover.cs b/ServerLib/CDiscover.cs
index d78bc19b..1fef7ac1 100644
--- a/ServerLib/CDiscover.cs
+++ b/ServerLib/CDiscover.cs
@@ -104,8 +104,9 @@ namespace ServerLib
IPEndPoint groupEp = new IPEndPoint(IPAddress.Any, _Port);
listener.Client.ReceiveTimeout = timeout;
- byte[] bytes = listener.Receive(ref groupEp);
- string message = Encoding.UTF8.GetString(bytes, 0, bytes.Length);
+ //byte[] bytes =
+ listener.Receive(ref groupEp);
+ //string message = Encoding.UTF8.GetString(bytes, 0, bytes.Length);
foundSomething = true;
if (!knownServer.Contains(groupEp.Address.ToString()))
diff --git a/ServerLib/CWebservice.cs b/ServerLib/CWebservice.cs
index 0e97c20a..fc385e89 100644
--- a/ServerLib/CWebservice.cs
+++ b/ServerLib/CWebservice.cs
@@ -138,8 +138,7 @@ namespace ServerLib
return CServer.GetProfileData(profileId, isReadonly);
}
- else
- return new SProfileData();
+ return new SProfileData();
}
public SProfileData[] GetProfileList()
diff --git a/ServerLib/DataStructs.cs b/ServerLib/DataStructs.cs
index d0541f67..11942ac9 100644
--- a/ServerLib/DataStructs.cs
+++ b/ServerLib/DataStructs.cs
@@ -69,9 +69,10 @@ namespace ServerLib
[DataContract]
public class CBase64Image
{
+ // ReSharper disable InconsistentNaming
[DataMember] private string base64Data = "";
-
[DataMember] private string imageId = "";
+ // ReSharper restore InconsistentNaming
public CBase64Image(Image img, ImageFormat format)
{
diff --git a/ServerLib/UserRoles.cs b/ServerLib/UserRoles.cs
index 860b9d7f..bc3c9d37 100644
--- a/ServerLib/UserRoles.cs
+++ b/ServerLib/UserRoles.cs
@@ -22,6 +22,7 @@ namespace ServerLib
[Flags]
enum EUserRoles
{
+ // ReSharper disable InconsistentNaming
TR_USERROLE_GUEST = 0,
TR_USERROLE_NORMAL = 1,
TR_USERROLE_ADMIN = 2,
@@ -29,5 +30,6 @@ namespace ServerLib
TR_USERROLE_ADDSONGSUSER = 8,
TR_USERROLE_PLAYLISTEDITOR = 16,
TR_USERROLE_PROFILEEDITOR = 32
+ // ReSharper restore InconsistentNaming
}
}
\ No newline at end of file
diff --git a/Vocaluxe.sln.DotSettings b/Vocaluxe.sln.DotSettings
index 9330a5ef..a260a4fb 100644
--- a/Vocaluxe.sln.DotSettings
+++ b/Vocaluxe.sln.DotSettings
@@ -3,6 +3,7 @@
NotCompiledCode
True
True
+ True
SOLUTION
DO_NOT_SHOW
DO_NOT_SHOW
diff --git a/Vocaluxe/Base/CBackgroundMusic.cs b/Vocaluxe/Base/CBackgroundMusic.cs
index 119d73e8..1e38e42b 100644
--- a/Vocaluxe/Base/CBackgroundMusic.cs
+++ b/Vocaluxe/Base/CBackgroundMusic.cs
@@ -162,8 +162,7 @@ namespace Vocaluxe.Base
_SongPlayer = new CSongPlayer();
- _PreviewPlayer = new CSongPlayer();
- _PreviewPlayer.RepeatSong = true;
+ _PreviewPlayer = new CSongPlayer {RepeatSong = true};
_VideoEnabled = (CConfig.Config.Video.VideoBackgrounds == EOffOn.TR_CONFIG_ON && CConfig.Config.Video.VideosToBackground == EOffOn.TR_CONFIG_ON);
SetMusicSource(CConfig.Config.Sound.BackgroundMusicSource);
@@ -339,8 +338,10 @@ namespace Vocaluxe.Base
if (song == null)
return;
+ // ReSharper disable CompareOfFloatsByEqualityOperator
if (start == 0f)
start = song.Preview.StartTime;
+ // ReSharper restore CompareOfFloatsByEqualityOperator
_PlaysPreview = true;
CSound.SetGlobalVolume(CConfig.PreviewMusicVolume);
diff --git a/Vocaluxe/Base/CConfig.cs b/Vocaluxe/Base/CConfig.cs
index 2e801f92..2c8cbd51 100644
--- a/Vocaluxe/Base/CConfig.cs
+++ b/Vocaluxe/Base/CConfig.cs
@@ -19,7 +19,6 @@ using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
-using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
diff --git a/Vocaluxe/Base/CGame.cs b/Vocaluxe/Base/CGame.cs
index 24f58688..187ac2bf 100644
--- a/Vocaluxe/Base/CGame.cs
+++ b/Vocaluxe/Base/CGame.cs
@@ -20,7 +20,6 @@
using System;
using System.Collections.Generic;
-using Vocaluxe.Screens;
using Vocaluxe.SongQueue;
using VocaluxeLib;
using VocaluxeLib.Game;
diff --git a/Vocaluxe/Base/CGraphics.cs b/Vocaluxe/Base/CGraphics.cs
index 4494d790..5d4ea1c6 100644
--- a/Vocaluxe/Base/CGraphics.cs
+++ b/Vocaluxe/Base/CGraphics.cs
@@ -220,6 +220,8 @@ namespace Vocaluxe.Base
}
else
NextScreen.OnShow();
+ if (_Cursor.IsActive)
+ NextScreen.ProcessMouseMove(_Cursor.X, _Cursor.Y);
HidePopup(EPopupScreens.PopupPlayerControl);
}
diff --git a/Vocaluxe/Base/CSongs.cs b/Vocaluxe/Base/CSongs.cs
index e0495076..3216d620 100644
--- a/Vocaluxe/Base/CSongs.cs
+++ b/Vocaluxe/Base/CSongs.cs
@@ -92,7 +92,8 @@ namespace Vocaluxe.Base
if (value == -1 || _IsCatIndexValid(value))
{
_CatIndex = value;
- OnCategoryChanged();
+ if (OnCategoryChanged != null)
+ OnCategoryChanged();
}
}
}
diff --git a/Vocaluxe/Base/CWebcam.cs b/Vocaluxe/Base/CWebcam.cs
index 689cca3e..a73e1fd0 100644
--- a/Vocaluxe/Base/CWebcam.cs
+++ b/Vocaluxe/Base/CWebcam.cs
@@ -69,23 +69,20 @@ namespace Vocaluxe.Base
public static void Pause()
{
- if (_Webcam == null)
- return;
- _Webcam.Pause();
+ if (_Webcam != null)
+ _Webcam.Pause();
}
public static void Start()
{
- if (_Webcam == null)
- return;
- _Webcam.Start();
+ if (_Webcam != null)
+ _Webcam.Start();
}
public static void Stop()
{
- if (_Webcam == null)
- return;
- _Webcam.Stop();
+ if (_Webcam != null)
+ _Webcam.Stop();
}
public static bool Select(SWebcamConfig c)
@@ -95,9 +92,8 @@ namespace Vocaluxe.Base
public static void DeSelect()
{
- if (_Webcam == null)
- return;
- _Webcam.DeSelect();
+ if (_Webcam != null)
+ _Webcam.DeSelect();
}
public static SWebcamDevice[] GetDevices()
diff --git a/Vocaluxe/Base/Server/CVocaluxeServer.cs b/Vocaluxe/Base/Server/CVocaluxeServer.cs
index d989aa51..878bbc37 100644
--- a/Vocaluxe/Base/Server/CVocaluxeServer.cs
+++ b/Vocaluxe/Base/Server/CVocaluxeServer.cs
@@ -192,7 +192,7 @@ namespace Vocaluxe.Base.Server
{
bool result = false;
- foreach (char key in keyString.ToCharArray())
+ foreach (char key in keyString)
{
Controller.AddKeyEvent(new SKeyEvent(ESender.Keyboard, isAltPressed,
Char.IsUpper(key) || isShiftPressed,
@@ -697,10 +697,14 @@ namespace Vocaluxe.Base.Server
IEnumerable playerIds = (from p in CProfiles.GetProfiles()
where String.Equals(p.PlayerName, username, StringComparison.OrdinalIgnoreCase)
select p.ID);
- if (!playerIds.Any())
+ try
+ {
+ return playerIds.First();
+ }
+ catch (InvalidOperationException)
+ {
throw new ArgumentException("Invalid playername");
-
- return playerIds.First();
+ }
}
private static byte[] _Hash(byte[] password, byte[] salt)
diff --git a/Vocaluxe/Base/ThemeSystem/CThemes.cs b/Vocaluxe/Base/ThemeSystem/CThemes.cs
index 665a9e32..fabfa85f 100644
--- a/Vocaluxe/Base/ThemeSystem/CThemes.cs
+++ b/Vocaluxe/Base/ThemeSystem/CThemes.cs
@@ -30,7 +30,7 @@ namespace Vocaluxe.Base.ThemeSystem
private static readonly List _Themes = new List();
public static string[] ThemeNames
{
- get { return _Themes.Select(th => th.Name).ToArray(); }
+ get { return _Themes.Where(th=>th is CBaseTheme).Select(th => th.Name).Distinct().ToArray(); }
}
public static string[] SkinNames
@@ -164,7 +164,8 @@ namespace Vocaluxe.Base.ThemeSystem
public static string GetThemeScreensPath(int partyModeID)
{
- return CurrentThemes[partyModeID].GetScreenPath();
+ CTheme theme;
+ return CurrentThemes.TryGetValue(partyModeID, out theme) ? theme.GetScreenPath() : null;
}
private static void _LogMissingElement(int partyModeID, string elType, string elName)
diff --git a/Vocaluxe/COSFunctions.cs b/Vocaluxe/COSFunctions.cs
index 33faab37..91f451a9 100644
--- a/Vocaluxe/COSFunctions.cs
+++ b/Vocaluxe/COSFunctions.cs
@@ -16,7 +16,6 @@
#endregion
using System;
-using System.Drawing;
using System.Runtime.InteropServices;
namespace Vocaluxe
@@ -24,29 +23,14 @@ namespace Vocaluxe
static class COSFunctions
{
#if WIN
- private static bool _DefaultDllDirSet;
- private static bool _UsePath;
- private static bool _UseSetDllDir;
-
private static class CWindowsFunctions
{
- [DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
- public static extern void AddDllDirectory(string lpPathName);
-
- [DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
- public static extern void SetDllDirectory(string lpPathName);
-
+ // ReSharper disable MemberHidesStaticFromOuterClass
[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetForegroundWindow(IntPtr hWnd);
- [DllImport("kernel32.dll", CallingConvention = CallingConvention.StdCall)]
- [return: MarshalAs(UnmanagedType.Bool)]
- public static extern bool SetDefaultDllDirectories(int directoryFlags);
-
- // ReSharper disable InconsistentNaming
- public const int LOAD_LIBRARY_SEARCH_DEFAULT_DIRS = 0x00001000;
- // ReSharper restore InconsistentNaming
+ // ReSharper restore MemberHidesStaticFromOuterClass
}
#endif
diff --git a/Vocaluxe/Lib/Sound/Playback/PortAudio/CPortAudioStream.cs b/Vocaluxe/Lib/Sound/Playback/PortAudio/CPortAudioStream.cs
index b03283e1..34421547 100644
--- a/Vocaluxe/Lib/Sound/Playback/PortAudio/CPortAudioStream.cs
+++ b/Vocaluxe/Lib/Sound/Playback/PortAudio/CPortAudioStream.cs
@@ -240,15 +240,13 @@ namespace Vocaluxe.Lib.Sound.Playback.PortAudio
if (!_FileOpened || _Terminated || !IsPaused)
return;
IsPaused = false;
- _PaHandle.CheckError("StartStream", PortAudioSharp.PortAudio.Pa_StartStream(_Stream));
}
public override void Stop()
{
if (!_FileOpened || _Terminated)
return;
- _Paused = true;
- _PaHandle.CheckError("StopStream (playback)", PortAudioSharp.PortAudio.Pa_StopStream(_Stream));
+ IsPaused = true;
Position = 0f;
}
diff --git a/Vocaluxe/Lib/Sound/Record/PitchTracker/CPtSharp.cs b/Vocaluxe/Lib/Sound/Record/PitchTracker/CPtSharp.cs
deleted file mode 100644
index 53e7a26c..00000000
--- a/Vocaluxe/Lib/Sound/Record/PitchTracker/CPtSharp.cs
+++ /dev/null
@@ -1,71 +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;
-
-namespace Vocaluxe.Lib.Sound.Record.PitchTracker
-{
- ///
- /// Pitchtracker (Pt) in C# that uses IIR filters for smoothing and an intelligent detection algorithm to reduce calculations
- /// DO NOT USE in 32 Bit! Due to floating point errors the filter will raise all values to NAN (TODO: FIX it!)
- ///
- class CPtSharp : CPitchTracker
- {
- private Pitch.PitchTracker _Instance;
-
- public CPtSharp()
- {
- _Instance = new Pitch.PitchTracker {SampleRate = 44100, DetectLevelThreshold = 0.01f, PitchRecordHistorySize = 1};
- }
-
- public override void Input(byte[] data)
- {
- short[] samplesShort = new short[data.Length / 2];
- Buffer.BlockCopy(data, 0, samplesShort, 0, data.Length);
- float[] samplesFloat = new float[samplesShort.Length];
- for (int i = 0; i < samplesShort.Length; i++)
- samplesFloat[i] = (float)samplesShort[i] / short.MaxValue;
- _Instance.ProcessBuffer(samplesFloat);
- }
-
- public override int GetNote(out float maxVolume, float[] weights)
- {
- int note = _Instance.CurrentPitchRecord.MidiNote - 15 - 21;
- maxVolume = _Instance.LastMaxVol;
- _SetWeights(note, weights);
- return note;
- }
-
- public override int GetNumHalfTones()
- {
- return NumHalfTonesDef;
- }
-
- public override float VolumeTreshold
- {
- get { return _Instance.DetectLevelThreshold; }
- set { _Instance.DetectLevelThreshold = value; }
- }
-
- protected override void _Dispose(bool disposing)
- {
- if (_Instance == null)
- throw new ObjectDisposedException(GetType().Name);
- _Instance = null;
- }
- }
-}
\ No newline at end of file
diff --git a/Vocaluxe/Lib/Sound/Record/PitchTracker/Pitch/CircularBuffer.cs b/Vocaluxe/Lib/Sound/Record/PitchTracker/Pitch/CircularBuffer.cs
deleted file mode 100644
index 07b6836b..00000000
--- a/Vocaluxe/Lib/Sound/Record/PitchTracker/Pitch/CircularBuffer.cs
+++ /dev/null
@@ -1,173 +0,0 @@
-using System;
-
-namespace Vocaluxe.Lib.Sound.Record.PitchTracker.Pitch
-{
- public class CircularBuffer : IDisposable
- {
- int m_bufSize;
- int m_begBufOffset;
- int m_availBuf;
- long m_startPos; // total circular buffer position
- T[] m_buffer;
-
- ///
- /// Constructor
- ///
- public CircularBuffer()
- {
- }
-
- ///
- /// Constructor
- ///
- ///
- public CircularBuffer(int bufCount)
- {
- SetSize(bufCount);
- }
-
- ///
- /// Dispose
- ///
- public void Dispose()
- {
- SetSize(0);
- }
-
- ///
- /// Reset to the beginning of the buffer
- ///
- public void Reset()
- {
- m_begBufOffset = 0;
- m_availBuf = 0;
- m_startPos = 0;
- }
-
- ///
- /// Set the buffer to the specified size
- ///
- ///
- public void SetSize(int newSize)
- {
- Reset();
-
- if (m_bufSize == newSize)
- return;
-
- if (m_buffer != null)
- m_buffer = null;
-
- m_bufSize = newSize;
-
- if (m_bufSize > 0)
- m_buffer = new T[m_bufSize];
- }
-
- ///
- /// Clear the buffer
- ///
- public void Clear()
- {
- Array.Clear(m_buffer, 0, m_buffer.Length);
- }
-
- ///
- /// Get or set the start position
- ///
- public long StartPosition
- {
- get { return m_startPos; }
- set { m_startPos = value; }
- }
-
- ///
- /// Get the end position
- ///
- public long EndPosition
- {
- get { return m_startPos + m_availBuf; }
- }
-
- ///
- /// Get or set the amount of avaliable space
- ///
- public int Available
- {
- get { return m_availBuf; }
- set { m_availBuf = Math.Min(value, m_bufSize); }
- }
-
- ///
- /// Write data into the buffer
- ///
- ///
- ///
- ///
- public int WriteBuffer(T[] m_pInBuffer, int count)
- {
- count = Math.Min(count, m_bufSize);
-
- var startPos = m_availBuf != m_bufSize ? m_availBuf : m_begBufOffset;
- var pass1Count = Math.Min(count, m_bufSize - startPos);
- var pass2Count = count - pass1Count;
-
- PitchDsp.CopyBuffer(m_pInBuffer, 0, m_buffer, startPos, pass1Count);
-
- if (pass2Count > 0)
- PitchDsp.CopyBuffer(m_pInBuffer, pass1Count, m_buffer, 0, pass2Count);
-
- if (pass2Count == 0)
- {
- // did not wrap around
- if (m_availBuf != m_bufSize)
- m_availBuf += count; // have never wrapped around
- else
- {
- m_begBufOffset += count;
- m_startPos += count;
- }
- }
- else
- {
- // wrapped around
- if (m_availBuf != m_bufSize)
- m_startPos += pass2Count; // first time wrap-around
- else
- m_startPos += count;
-
- m_begBufOffset = pass2Count;
- m_availBuf = m_bufSize;
- }
-
- return count;
- }
-
- ///
- /// Read from the buffer
- ///
- ///
- ///
- ///
- ///
- public bool ReadBuffer(T[] outBuffer, long startRead, int readCount)
- {
- var endRead = (int)(startRead + readCount);
- var endAvail = (int)(m_startPos + m_availBuf);
-
- if (startRead < m_startPos || endRead > endAvail)
- return false;
-
- var startReadPos = (int)(((startRead - m_startPos) + m_begBufOffset) % m_bufSize);
- var block1Samples = Math.Min(readCount, m_bufSize - startReadPos);
- var block2Samples = readCount - block1Samples;
-
- PitchDsp.CopyBuffer(m_buffer, startReadPos, outBuffer, 0, block1Samples);
-
- if (block2Samples > 0)
- PitchDsp.CopyBuffer(m_buffer, 0, outBuffer, block1Samples, block2Samples);
-
- return true;
- }
- }
-}
diff --git a/Vocaluxe/Lib/Sound/Record/PitchTracker/Pitch/Extensions.cs b/Vocaluxe/Lib/Sound/Record/PitchTracker/Pitch/Extensions.cs
deleted file mode 100644
index 4cbd7c81..00000000
--- a/Vocaluxe/Lib/Sound/Record/PitchTracker/Pitch/Extensions.cs
+++ /dev/null
@@ -1,105 +0,0 @@
-using System;
-
-namespace Vocaluxe.Lib.Sound.Record.PitchTracker.Pitch
-{
- public static class Extensions
- {
- ///
- /// Clear the buffer
- ///
- ///
- ///
- public static void Clear(this float[] buffer)
- {
- Array.Clear(buffer, 0, buffer.Length);
- }
-
- ///
- /// Clear the buffer
- ///
- ///
- ///
- public static void Clear(this double[] buffer)
- {
- Array.Clear(buffer, 0, buffer.Length);
- }
-
- ///
- /// Copy the values from one buffer to a different or the same buffer.
- /// It is safe to copy to the same buffer, even if the areas overlap
- ///
- ///
- ///
- ///
- ///
- public static void Copy(this float[] fromBuffer, float[] toBuffer, int fromStart, int toStart, int length)
- {
- if (toBuffer == null || fromBuffer.Length == 0 || toBuffer.Length == 0)
- return;
-
- int fromBegIdx = fromStart;
- int fromEndIdx = fromStart + length;
- int toBegIdx = toStart;
- int toEndIdx = toStart + length;
-
- if (fromBegIdx < 0)
- {
- toBegIdx -= fromBegIdx;
- fromBegIdx = 0;
- }
-
- if (toBegIdx < 0)
- {
- fromBegIdx -= toBegIdx;
- toBegIdx = 0;
- }
-
- if (fromEndIdx >= fromBuffer.Length)
- {
- toEndIdx -= fromEndIdx - fromBuffer.Length + 1;
- fromEndIdx = fromBuffer.Length - 1;
- }
-
- if (toEndIdx >= toBuffer.Length)
- {
- fromEndIdx -= toEndIdx - toBuffer.Length + 1;
- toEndIdx = fromBuffer.Length - 1;
- }
-
- if (fromBegIdx < toBegIdx)
- {
- // Shift right, so start at the right
- for (int fromIdx = fromEndIdx, toIdx = toEndIdx; fromIdx >= fromBegIdx; fromIdx--, toIdx--)
- toBuffer[toIdx] = fromBuffer[fromIdx];
- }
- else
- {
- // Shift left, so start at the left
- for (int fromIdx = fromBegIdx, toIdx = toBegIdx; fromIdx <= fromEndIdx; fromIdx++, toIdx++)
- toBuffer[toIdx] = fromBuffer[fromIdx];
- }
- }
-
- ///
- ///
- ///
- ///
- ///
- public static void Clear(this float[] buffer, int startIdx, int endIdx)
- {
- Array.Clear(buffer, startIdx, endIdx - startIdx + 1);
- }
-
- ///
- /// Fill the buffer with the specified value
- ///
- ///
- ///
- ///
- public static void Fill(this double[] buffer, double value)
- {
- for (int idx = 0; idx < buffer.Length; idx++)
- buffer[idx] = value;
- }
- }
-}
\ No newline at end of file
diff --git a/Vocaluxe/Lib/Sound/Record/PitchTracker/Pitch/IIRFilter.cs b/Vocaluxe/Lib/Sound/Record/PitchTracker/Pitch/IIRFilter.cs
deleted file mode 100644
index e180ff72..00000000
--- a/Vocaluxe/Lib/Sound/Record/PitchTracker/Pitch/IIRFilter.cs
+++ /dev/null
@@ -1,613 +0,0 @@
-using System;
-
-namespace Vocaluxe.Lib.Sound.Record.PitchTracker.Pitch
-{
- ///
- /// Infinite impulse response filter (old style analog filters)
- ///
- class IIRFilter
- {
- ///
- /// The type of filter
- ///
- public enum FilterType
- {
- None = 0,
- LP,
- HP,
- BP
- }
-
- ///
- /// The filter prototype
- ///
- public enum ProtoType
- {
- None = 0,
- Butterworth,
- Chebyshev,
- }
-
- const int kHistMask = 31;
- const int kHistSize = 32;
-
- private int m_order;
- private ProtoType m_protoType;
- private FilterType m_filterType;
-
- private float m_fp1;
- private float m_fp2;
- private float m_fN;
- private float m_ripple;
- private float m_sampleRate;
- private double[] m_real;
- private double[] m_imag;
- private double[] m_z;
- private double[] m_aCoeff;
- private double[] m_bCoeff;
- private double[] m_inHistory;
- private double[] m_outHistory;
- private int m_histIdx;
- private bool m_invertDenormal;
-
- public IIRFilter()
- {
- }
-
- ///
- /// Returns true if all the filter parameters are valid
- ///
- public bool FilterValid
- {
- get
- {
- if (m_order < 1 || m_order > 16 ||
- m_protoType == ProtoType.None ||
- m_filterType == FilterType.None ||
- m_sampleRate <= 0.0f ||
- m_fN <= 0.0f)
- return false;
-
- switch (m_filterType)
- {
- case FilterType.LP:
- if (m_fp2 <= 0.0f)
- return false;
- break;
-
- case FilterType.BP:
- if (m_fp1 <= 0.0f || m_fp2 <= 0.0f || m_fp1 >= m_fp2)
- return false;
- break;
-
- case FilterType.HP:
- if (m_fp1 <= 0.0f)
- return false;
- break;
- }
-
- // For bandpass, the order must be even
- if (m_filterType == FilterType.BP && (m_order & 1) != 0)
- return false;
-
- return true;
- }
- }
-
- ///
- /// Set the filter prototype
- ///
- public ProtoType Proto
- {
- get { return m_protoType; }
-
- set
- {
- m_protoType = value;
- Design();
- }
- }
-
- ///
- /// Set the filter type
- ///
- public FilterType Type
- {
- get { return m_filterType; }
-
- set
- {
- m_filterType = value;
- Design();
- }
- }
-
- public int Order
- {
- get { return m_order; }
-
- set
- {
- m_order = Math.Min(16, Math.Max(1, Math.Abs(value)));
-
- if (m_filterType == FilterType.BP && Odd(m_order))
- m_order++;
-
- Design();
- }
- }
-
- public float SampleRate
- {
- get { return m_sampleRate; }
-
- set
- {
- m_sampleRate = value;
- m_fN = 0.5f * m_sampleRate;
- Design();
- }
- }
-
- public float FreqLow
- {
- get { return m_fp1; }
-
- set
- {
- m_fp1 = value;
- Design();
- }
- }
-
- public float FreqHigh
- {
- get { return m_fp2; }
-
- set
- {
- m_fp2 = value;
- Design();
- }
- }
-
- public float Ripple
- {
- get { return m_ripple; }
-
- set
- {
- m_ripple = value;
- Design();
- }
- }
-
- ///
- /// Returns true if n is odd
- ///
- ///
- ///
- private bool Odd(int n)
- {
- return (n & 1) == 1;
- }
-
- ///
- /// Square
- ///
- ///
- ///
- private float Sqr(float value)
- {
- return value * value;
- }
-
- ///
- /// Square
- ///
- ///
- ///
- private double Sqr(double value)
- {
- return value * value;
- }
-
- ///
- /// Determines poles and zeros of IIR filter
- /// based on bilinear transform method
- ///
- private void LocatePolesAndZeros()
- {
- m_real = new double[m_order + 1];
- m_imag = new double[m_order + 1];
- m_z = new double[m_order + 1];
- double ln10 = Math.Log(10.0);
-
- // Butterworth, Chebyshev parameters
- int n = m_order;
-
- if (m_filterType == FilterType.BP)
- n = n / 2;
-
- int ir = n % 2;
- int n1 = n + ir;
- int n2 = (3 * n + ir) / 2 - 1;
- double f1;
-
- switch (m_filterType)
- {
- case FilterType.LP:
- f1 = m_fp2;
- break;
-
- case FilterType.HP:
- f1 = m_fN - m_fp1;
- break;
-
- case FilterType.BP:
- f1 = m_fp2 - m_fp1;
- break;
-
- default:
- f1 = 0.0;
- break;
- }
-
- double tanw1 = Math.Tan(0.5 * Math.PI * f1 / m_fN);
- double tansqw1 = Sqr(tanw1);
-
- // Real and Imaginary parts of low-pass poles
- double t, a = 1.0, r = 1.0, i = 1.0;
-
- for (int k = n1; k <= n2; k++)
- {
- t = 0.5 * (2 * k + 1 - ir) * Math.PI / (double)n;
-
- switch (m_protoType)
- {
- case ProtoType.Butterworth:
- double b3 = 1.0 - 2.0 * tanw1 * Math.Cos(t) + tansqw1;
- r = (1.0 - tansqw1) / b3;
- i = 2.0 * tanw1 * Math.Sin(t) / b3;
- break;
-
- case ProtoType.Chebyshev:
- double d = 1.0 - Math.Exp(-0.05 * m_ripple * ln10);
- double e = 1.0 / Math.Sqrt(1.0 / Sqr(1.0 - d) - 1.0);
- double x = Math.Pow(Math.Sqrt(e * e + 1.0) + e, 1.0 / (double)n);
- a = 0.5 * (x - 1.0 / x);
- double b = 0.5 * (x + 1.0 / x);
- double c3 = a * tanw1 * Math.Cos(t);
- double c4 = b * tanw1 * Math.Sin(t);
- double c5 = Sqr(1.0 - c3) + Sqr(c4);
- r = 2.0 * (1.0 - c3) / c5 - 1.0;
- i = 2.0 * c4 / c5;
- break;
- }
-
- int m = 2 * (n2 - k) + 1;
- m_real[m + ir] = r;
- m_imag[m + ir] = Math.Abs(i);
- m_real[m + ir + 1] = r;
- m_imag[m + ir + 1] = -Math.Abs(i);
- }
-
- if (Odd(n))
- {
- if (m_protoType == ProtoType.Butterworth)
- r = (1.0 - tansqw1) / (1.0 + 2.0 * tanw1 + tansqw1);
-
- if (m_protoType == ProtoType.Chebyshev)
- r = 2.0 / (1.0 + a * tanw1) - 1.0;
-
- m_real[1] = r;
- m_imag[1] = 0.0;
- }
-
- switch (m_filterType)
- {
- case FilterType.LP:
- for (int m = 1; m <= n; m++)
- m_z[m] = -1.0;
- break;
-
- case FilterType.HP:
- // Low-pass to high-pass transformation
- for (int m = 1; m <= n; m++)
- {
- m_real[m] = -m_real[m];
- m_z[m] = 1.0;
- }
- break;
-
- case FilterType.BP:
- // Low-pass to bandpass transformation
- for (int m = 1; m <= n; m++)
- {
- m_z[m] = 1.0;
- m_z[m + n] = -1.0;
- }
-
- double f4 = 0.5 * Math.PI * m_fp1 / m_fN;
- double f5 = 0.5 * Math.PI * m_fp2 / m_fN;
- double aa = Math.Cos(f4 + f5) / Math.Cos(f5 - f4);
- double aR, aI, h1, h2, p1R, p2R, p1I, p2I;
-
- for (int m1 = 0; m1 <= (m_order - 1) / 2; m1++)
- {
- int m = 1 + 2 * m1;
- aR = m_real[m];
- aI = m_imag[m];
-
- if (Math.Abs(aI) < 0.0001)
- {
- h1 = 0.5 * aa * (1.0 + aR);
- h2 = Sqr(h1) - aR;
- if (h2 > 0.0)
- {
- p1R = h1 + Math.Sqrt(h2);
- p2R = h1 - Math.Sqrt(h2);
- p1I = 0.0;
- p2I = 0.0;
- }
- else
- {
- p1R = h1;
- p2R = h1;
- p1I = Math.Sqrt(Math.Abs(h2));
- p2I = -p1I;
- }
- }
- else
- {
- double fR = aa * 0.5 * (1.0 + aR);
- double fI = aa * 0.5 * aI;
- double gR = Sqr(fR) - Sqr(fI) - aR;
- double gI = 2 * fR * fI - aI;
- double sR = Math.Sqrt(0.5 * Math.Abs(gR + Math.Sqrt(Sqr(gR) + Sqr(gI))));
- double sI = gI / (2.0 * sR);
- p1R = fR + sR;
- p1I = fI + sI;
- p2R = fR - sR;
- p2I = fI - sI;
- }
-
- m_real[m] = p1R;
- m_real[m + 1] = p2R;
- m_imag[m] = p1I;
- m_imag[m + 1] = p2I;
- }
-
- if (Odd(n))
- {
- m_real[2] = m_real[n + 1];
- m_imag[2] = m_imag[n + 1];
- }
-
- for (int k = n; k >= 1; k--)
- {
- int m = 2 * k - 1;
- m_real[m] = m_real[k];
- m_real[m + 1] = m_real[k];
- m_imag[m] = Math.Abs(m_imag[k]);
- m_imag[m + 1] = -Math.Abs(m_imag[k]);
- }
-
- break;
- }
- }
-
- ///
- /// Calculate all the values
- ///
- public void Design()
- {
- if (!this.FilterValid)
- return;
-
- m_aCoeff = new double[m_order + 1];
- m_bCoeff = new double[m_order + 1];
- m_inHistory = new double[kHistSize];
- m_outHistory = new double[kHistSize];
-
- double[] newA = new double[m_order + 1];
- double[] newB = new double[m_order + 1];
-
- // Find filter poles and zeros
- LocatePolesAndZeros();
-
- // Compute filter coefficients from pole/zero values
- m_aCoeff[0] = 1.0;
- m_bCoeff[0] = 1.0;
-
- for (int i = 1; i <= m_order; i++)
- {
- m_aCoeff[i] = 0.0;
- m_bCoeff[i] = 0.0;
- }
-
- int k = 0;
- int n = m_order;
- int pairs = n / 2;
-
- if (Odd(m_order))
- {
- // First subfilter is first order
- m_aCoeff[1] = -m_z[1];
- m_bCoeff[1] = -m_real[1];
- k = 1;
- }
-
- for (int p = 1; p <= pairs; p++)
- {
- int m = 2 * p - 1 + k;
- double alpha1 = -(m_z[m] + m_z[m + 1]);
- double alpha2 = m_z[m] * m_z[m + 1];
- double beta1 = -2.0 * m_real[m];
- double beta2 = Sqr(m_real[m]) + Sqr(m_imag[m]);
-
- newA[1] = m_aCoeff[1] + alpha1 * m_aCoeff[0];
- newB[1] = m_bCoeff[1] + beta1 * m_bCoeff[0];
-
- for (int i = 2; i <= n; i++)
- {
- newA[i] = m_aCoeff[i] + alpha1 * m_aCoeff[i - 1] + alpha2 * m_aCoeff[i - 2];
- newB[i] = m_bCoeff[i] + beta1 * m_bCoeff[i - 1] + beta2 * m_bCoeff[i - 2];
- }
-
- for (int i = 1; i <= n; i++)
- {
- m_aCoeff[i] = newA[i];
- m_bCoeff[i] = newB[i];
- }
- }
-
- // Ensure the filter is normalized
- FilterGain(1000);
- }
-
- ///
- /// Reset the history buffers
- ///
- public void Reset()
- {
- if (m_inHistory != null)
- m_inHistory.Clear();
-
- if (m_outHistory != null)
- m_outHistory.Clear();
-
- m_histIdx = 0;
- }
-
- ///
- /// Reset the filter, and fill the appropriate history buffers with the specified value
- ///
- ///
- public void Reset(double startValue)
- {
- m_histIdx = 0;
-
- if (m_inHistory == null || m_outHistory == null)
- return;
-
- m_inHistory.Fill(startValue);
-
- if (m_inHistory != null)
- {
- switch (m_filterType)
- {
- case FilterType.LP:
- m_outHistory.Fill(startValue);
- break;
-
- default:
- m_outHistory.Clear();
- break;
- }
- }
- }
-
- ///
- /// Apply the filter to the buffer
- ///
- ///
- public void FilterBuffer(float[] srcBuf, long srcPos, float[] dstBuf, long dstPos, long nLen)
- {
- const double kDenormal = 0.000000000000001;
- double denormal = m_invertDenormal ? -kDenormal : kDenormal;
- m_invertDenormal = !m_invertDenormal;
-
- for (int sampleIdx = 0; sampleIdx < nLen; sampleIdx++)
- {
- double sum = 0.0f;
-
- m_inHistory[m_histIdx] = srcBuf[srcPos + sampleIdx] + denormal;
-
- for (int idx = 0; idx < m_aCoeff.Length; idx++)
- sum += m_aCoeff[idx] * m_inHistory[(m_histIdx - idx) & kHistMask];
-
- for (int idx = 1; idx < m_bCoeff.Length; idx++)
- sum -= m_bCoeff[idx] * m_outHistory[(m_histIdx - idx) & kHistMask];
-
- m_outHistory[m_histIdx] = sum;
- m_histIdx = (m_histIdx + 1) & kHistMask;
- dstBuf[dstPos + sampleIdx] = (float)sum;
- }
- }
-
- public float FilterSample(float inVal)
- {
- double sum = 0.0f;
-
- m_inHistory[m_histIdx] = inVal;
-
- for (int idx = 0; idx < m_aCoeff.Length; idx++)
- sum += m_aCoeff[idx] * m_inHistory[(m_histIdx - idx) & kHistMask];
-
- for (int idx = 1; idx < m_bCoeff.Length; idx++)
- sum -= m_bCoeff[idx] * m_outHistory[(m_histIdx - idx) & kHistMask];
-
- m_outHistory[m_histIdx] = sum;
- m_histIdx = (m_histIdx + 1) & kHistMask;
-
- return (float)sum;
- }
-
- ///
- /// Get the gain at the specified number of frequency points
- ///
- ///
- ///
- public float[] FilterGain(int freqPoints)
- {
- // Filter gain at uniform frequency intervals
- float[] g = new float[freqPoints];
- double theta, s, c, sac, sas, sbc, sbs;
- float gMax = -100.0f;
- float sc = 10.0f / (float)Math.Log(10.0f);
- double t = Math.PI / (freqPoints - 1);
-
- for (int i = 0; i < freqPoints; i++)
- {
- theta = i * t;
-
- if (i == 0)
- theta = Math.PI * 0.0001;
-
- if (i == freqPoints - 1)
- theta = Math.PI * 0.9999;
-
- sac = 0.0f;
- sas = 0.0f;
- sbc = 0.0f;
- sbs = 0.0f;
-
- for (int k = 0; k <= m_order; k++)
- {
- c = Math.Cos(k * theta);
- s = Math.Sin(k * theta);
- sac += c * m_aCoeff[k];
- sas += s * m_aCoeff[k];
- sbc += c * m_bCoeff[k];
- sbs += s * m_bCoeff[k];
- }
-
- g[i] = sc * (float)Math.Log((Sqr(sac) + Sqr(sas)) / (Sqr(sbc) + Sqr(sbs)));
- gMax = Math.Max(gMax, g[i]);
- }
-
- // Normalize to 0 dB maximum gain
- for (int i = 0; i < freqPoints; i++)
- g[i] -= gMax;
-
- // Normalize numerator (a) coefficients
- float normFactor = (float)Math.Pow(10.0, -0.05 * gMax);
-
- for (int i = 0; i <= m_order; i++)
- m_aCoeff[i] *= normFactor;
-
- return g;
- }
- }
-}
diff --git a/Vocaluxe/Lib/Sound/Record/PitchTracker/Pitch/PitchDsp.cs b/Vocaluxe/Lib/Sound/Record/PitchTracker/Pitch/PitchDsp.cs
deleted file mode 100644
index 3fc22ee6..00000000
--- a/Vocaluxe/Lib/Sound/Record/PitchTracker/Pitch/PitchDsp.cs
+++ /dev/null
@@ -1,561 +0,0 @@
-using System;
-
-namespace Vocaluxe.Lib.Sound.Record.PitchTracker.Pitch
-{
- ///
- /// Pitch related DSP
- ///
- public class PitchDsp
- {
- public static readonly double InverseLog2 = 1.0 / Math.Log10(2.0);
-
- private const int kCourseOctaveSteps = 96;
- private const int kScanHiSize = 31;
- private const float kScanHiFreqStep = 1.005f;
- private const int kMinMidiNote = 21; // A0
- private const int kMaxMidiNote = 108; // C8
-
- private float m_minPitch;
- private float m_maxPitch;
- private int m_minNote;
- private int m_maxNote;
- private int m_blockLen14; // 1/4 block len
- private int m_blockLen24; // 2/4 block len
- private int m_blockLen34; // 3/4 block len
- private int m_blockLen44; // 4/4 block len
- private double m_sampleRate;
-
- private int m_numCourseSteps;
- private float[] m_pCourseFreqOffset;
- private float[] m_pCourseFreq;
- private float[] m_scanHiOffset = new float[kScanHiSize];
- private float[] m_peakBuf = new float[kScanHiSize];
- private int m_prevPitchIdx;
- private float[] m_detectCurve;
-
- ///
- /// Constructor
- ///
- ///
- ///
- ///
- ///
- public PitchDsp(double sampleRate, float minPitch, float maxPitch)
- {
- m_sampleRate = sampleRate;
- m_minPitch = minPitch;
- m_maxPitch = maxPitch;
-
- m_minNote = (int)(PitchToMidiNote(m_minPitch) + 0.5f) + 2;
- m_maxNote = (int)(PitchToMidiNote(m_maxPitch) + 0.5f) - 2;
-
- m_blockLen44 = (int)(m_sampleRate / m_minPitch + 0.5f);
- m_blockLen34 = (m_blockLen44 * 3) / 4;
- m_blockLen24 = m_blockLen44 / 2;
- m_blockLen14 = m_blockLen44 / 4;
-
- m_numCourseSteps = (int)((Math.Log((double)m_maxPitch / (double)m_minPitch) / Math.Log(2.0)) * kCourseOctaveSteps + 0.5) + 3;
-
- m_pCourseFreqOffset = new float[m_numCourseSteps + 10000];
- m_pCourseFreq = new float[m_numCourseSteps + 10000];
-
- m_detectCurve = new float[m_numCourseSteps];
-
- double freqStep = 1.0 / Math.Pow(2.0, 1.0 / kCourseOctaveSteps);
- double curFreq = m_maxPitch / freqStep;
-
- // frequency is stored from high to low
- for (int idx = 0; idx < m_numCourseSteps; idx++)
- {
- m_pCourseFreq[idx] = (float)curFreq;
- m_pCourseFreqOffset[idx] = (float)(m_sampleRate / curFreq);
- curFreq *= freqStep;
- }
-
- for (int idx = 0; idx < kScanHiSize; idx++)
- m_scanHiOffset[idx] = (float)Math.Pow(kScanHiFreqStep, (kScanHiSize / 2) - idx);
- }
-
- ///
- /// Get the max detected pitch
- ///
- public float MaxPitch
- {
- get { return m_maxPitch; }
- }
-
- ///
- /// Get the min detected pitch
- ///
- public float MinPitch
- {
- get { return m_minPitch; }
- }
-
- ///
- /// Get the max note
- ///
- public int MaxNote
- {
- get { return m_maxNote; }
- }
-
- ///
- /// Get the min note
- ///
- public int MinNote
- {
- get { return m_minNote; }
- }
-
- ///
- /// Detect the pitch
- ///
- public float DetectPitch(float[] samplesLo, float[] samplesHi)
- {
- return DetectPitchLo(samplesLo, samplesHi);
- }
-
- ///
- /// Low resolution pitch detection
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- private float DetectPitchLo(float[] samplesLo, float[] samplesHi)
- {
- m_detectCurve.Clear();
-
- const int skipSize = 8;
- const int peakScanSize = 23;
- const int peakScanSizeHalf = peakScanSize / 2;
-
- float peakThresh1 = 200.0f;
- float peakThresh2 = 600.0f;
- bool bufferSwitched = false;
-
- for (int idx = 0; idx < m_numCourseSteps; idx += skipSize)
- {
- int blockLen = Math.Min(m_blockLen44, (int)m_pCourseFreqOffset[idx] * 2);
- float[] curSamples = null;
-
- // 258 is at 250 Hz, which is the switchover frequency for the two filters
- bool loBuffer = idx >= 258;
-
- if (loBuffer)
- {
- if (!bufferSwitched)
- {
- m_detectCurve.Clear(258 - peakScanSizeHalf, 258 + peakScanSizeHalf);
- bufferSwitched = true;
- }
-
- curSamples = samplesLo;
- }
- else
- curSamples = samplesHi;
-
- int stepSizeLoRes = blockLen / 10;
- int stepSizeHiRes = Math.Max(1, Math.Min(5, idx * 5 / m_numCourseSteps));
-
- float fValue = RatioAbsDiffLinear(curSamples, idx, blockLen, stepSizeLoRes, false);
-
- if (fValue > peakThresh1)
- {
- // Do a closer search for the peak
- int peakIdx = -1;
- float peakVal = 0.0f;
- float prevVal = 0.0f;
- int dir = 4; // start going forward
- int curPos = idx; // start at center of the scan range
- int begSearch = Math.Max(idx - peakScanSizeHalf, 0);
- int endSearch = Math.Min(idx + peakScanSizeHalf, m_numCourseSteps - 1);
-
- while (curPos >= begSearch && curPos < endSearch)
- {
- float curVal = RatioAbsDiffLinear(curSamples, curPos, blockLen, stepSizeHiRes, true);
-
- if (peakVal < curVal)
- {
- peakVal = curVal;
- peakIdx = curPos;
- }
-
- if (prevVal > curVal)
- {
- dir = -dir >> 1;
-
- if (dir == 0)
- {
- if (peakVal > peakThresh2 && peakIdx >= 6 && peakIdx <= m_numCourseSteps - 7)
- {
- float fValL = RatioAbsDiffLinear(curSamples, peakIdx - 5, blockLen, stepSizeHiRes, true);
- float fValR = RatioAbsDiffLinear(curSamples, peakIdx + 5, blockLen, stepSizeHiRes, true);
- float fPointy = peakVal / (fValL + fValR) * 2.0f;
-
- float minPointy = (m_prevPitchIdx > 0 && Math.Abs(m_prevPitchIdx - peakIdx) < 10) ? 1.2f : 1.5f;
-
- if (fPointy > minPointy)
- {
- float pitchHi = DetectPitchHi(curSamples, peakIdx);
-
- if (pitchHi > 1.0f)
- {
- m_prevPitchIdx = peakIdx;
- return pitchHi;
- }
- }
- }
-
- break;
- }
- }
-
- prevVal = curVal;
- curPos += dir;
- }
- }
- }
-
- m_prevPitchIdx = 0;
- return 0.0f;
- }
-
- ///
- /// High resolution pitch detection
- ///
- ///
- ///
- ///
- private float DetectPitchHi(float[] samples, int lowFreqIdx)
- {
- int peakIdx = -1;
- float prevVal = 0.0f;
- int dir = 4; // start going forward
- int curPos = kScanHiSize >> 1; // start at center of the scan range
-
- m_peakBuf.Clear();
-
- float offset = m_pCourseFreqOffset[lowFreqIdx];
-
- while (curPos >= 0 && curPos < kScanHiSize)
- {
- if (m_peakBuf[curPos] == 0.0f)
- m_peakBuf[curPos] = SumAbsDiffHermite(samples, offset * m_scanHiOffset[curPos], m_blockLen44, 1);
-
- if (peakIdx < 0 || m_peakBuf[peakIdx] < m_peakBuf[curPos])
- peakIdx = curPos;
-
- if (prevVal > m_peakBuf[curPos])
- {
- dir = -dir >> 1;
-
- if (dir == 0)
- {
- // found the peak
- float minVal = Math.Min(m_peakBuf[peakIdx - 1], m_peakBuf[peakIdx + 1]);
-
- minVal -= minVal * (1.0f / 32.0f);
-
- var y1 = (float)Math.Log10(m_peakBuf[peakIdx - 1] - minVal);
- var y2 = (float)Math.Log10(m_peakBuf[peakIdx] - minVal);
- var y3 = (float)Math.Log10(m_peakBuf[peakIdx + 1] - minVal);
-
- float fIdx = (float)peakIdx + (y3 - y1) / (2.0f * (2.0f * y2 - y1 - y3));
-
- return (float)Math.Pow(kScanHiFreqStep, fIdx - (kScanHiSize / 2)) * m_pCourseFreq[lowFreqIdx];
- }
- }
-
- prevVal = m_peakBuf[curPos];
- curPos += dir;
- }
-
- return 0.0f;
- }
-
- ///
- /// Create a sine wave with the specified frequency, amplitude and starting angle.
- /// Returns the updated angle.
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- public static double CreateSineWave(float[] buffer, int numSamples, float sampleRate,
- float freq, float amplitude, double startAngle)
- {
- double angleStep = freq / sampleRate * Math.PI * 2.0;
- double curAngle = startAngle;
-
- for (int idx = 0; idx < numSamples; idx++)
- {
- buffer[idx] = (float)Math.Sin(curAngle) * amplitude;
-
- curAngle += angleStep;
-
- while (curAngle > Math.PI)
- curAngle -= Math.PI * 2.0;
- }
-
- return curAngle;
- }
-
- ///
- /// Returns true if the level is above the specified value
- ///
- ///
- ///
- ///
- ///
- ///
- public bool LevelIsAbove(float[] buffer, int len, float level)
- {
- if (buffer == null || buffer.Length == 0)
- return false;
-
- int endIdx = Math.Min(buffer.Length, len);
-
- for (int idx = 0; idx < endIdx; idx++)
- {
- if (Math.Abs(buffer[idx]) >= level)
- return true;
- }
-
- return false;
- }
-
- ///
- /// Copy the data from the source to the destination buffer
- ///
- ///
- ///
- ///
- ///
- public static void CopyBuffer(T[] source, int srcStart, T[] destination, int dstStart, int length)
- {
- if (length < 0)
- throw new ArgumentOutOfRangeException("length");
-
- if (source == null || source.Length < srcStart + length)
- throw new Exception("Source buffer is null or not large enough");
-
- if (destination == null || destination.Length < dstStart + length)
- throw new Exception("Destination buffer is null or not large enough");
-
- int srcIdx = srcStart;
- int dstIdx = dstStart;
-
- for (int idx = 0; idx < length; idx++)
- destination[dstIdx++] = source[srcIdx++];
- }
-
- ///
- /// // 4-point, 3rd-order Hermite (x-form)
- ///
- private float InterpolateHermite(float fY0, float fY1, float fY2, float fY3, float frac)
- {
- float c1 = 0.5f * (fY2 - fY0);
- float c3 = 1.5f * (fY1 - fY2) + 0.5f * (fY3 - fY0);
- float c2 = fY0 - fY1 + c1 - c3;
-
- return ((c3 * frac + c2) * frac + c1) * frac + fY1;
- }
-
- ///
- /// Linear interpolation
- /// nFrac is based on 1.0 = 256
- ///
- private float InterpolateLinear(float y0, float y1, float frac)
- {
- return y0 * (1.0f - frac) + y1 * frac;
- }
-
- ///
- /// Medium Low res SumAbsDiff
- ///
- private float RatioAbsDiffLinear(float[] samples, int freqIdx, int blockLen, int stepSize, bool hiRes)
- {
- if (hiRes && m_detectCurve[freqIdx] > 0.0f)
- return m_detectCurve[freqIdx];
-
- var offsetInt = (int)m_pCourseFreqOffset[freqIdx];
- float offsetFrac = m_pCourseFreqOffset[freqIdx] - offsetInt;
- float rect = 0.0f;
- float absDiff = 0.01f; // prevent divide by zero
- int count = 0;
- float interp;
- float sample;
-
- // Do a scan using linear interpolation and the specified step size
- for (int idx = 0; idx < blockLen; idx += stepSize, count++)
- {
- sample = samples[idx];
- interp = InterpolateLinear(samples[offsetInt + idx], samples[offsetInt + idx + 1], offsetFrac);
- absDiff += Math.Abs(sample - interp);
- rect += Math.Abs(sample) + Math.Abs(interp);
- }
-
- float finalVal = rect / absDiff * 100.0f;
-
- if (hiRes)
- m_detectCurve[freqIdx] = finalVal;
-
- return finalVal;
- }
-
- ///
- /// Medium High res SumAbsDiff
- ///
- private float SumAbsDiffHermite(float[] samples, float fOffset, int blockLen, int stepSize)
- {
- var offsetInt = (int)fOffset;
- float offsetFrac = fOffset - offsetInt;
- float value = 0.001f; // prevent divide by zero
- int count = 0;
-
- // do a scan using linear interpolation and the specified step size
- for (int idx = 0; idx < blockLen; idx += stepSize, count++)
- {
- int offsetIdx = offsetInt + idx;
-
- value += Math.Abs(samples[idx] - InterpolateHermite(samples[offsetIdx - 1],
- samples[offsetIdx],
- samples[offsetIdx + 1],
- samples[offsetIdx + 2],
- offsetFrac));
- }
-
- return count / value;
- }
-
- ///
- /// Get the MIDI note and cents of the pitch
- ///
- ///
- ///
- ///
- ///
- public static bool PitchToMidiNote(float pitch, out int note, out int cents)
- {
- if (pitch < 20.0f)
- {
- note = 0;
- cents = 0;
- return false;
- }
-
- float fNote = (float)((12.0 * Math.Log10(pitch / 55.0) * InverseLog2)) + 33.0f;
- note = (int)(fNote + 0.5f);
- cents = (int)((note - fNote) * 100);
- return true;
- }
-
- ///
- /// Get the pitch from the MIDI note
- ///
- ///
- ///
- public static float PitchToMidiNote(float pitch)
- {
- if (pitch < 20.0f)
- return 0.0f;
-
- return (float)(12.0 * Math.Log10(pitch / 55.0) * InverseLog2) + 33.0f;
- }
-
- ///
- /// Get the pitch from the MIDI note
- ///
- ///
- ///
- public float MidiNoteToPitch(float note)
- {
- if (note < 33.0f)
- return 0.0f;
-
- float pitch = (float)Math.Pow(10.0, (note - 33.0f) / InverseLog2 / 12.0f) * 55.0f;
- return pitch <= m_maxPitch ? pitch : 0.0f;
- }
-
- ///
- /// Format a midi note to text
- ///
- ///
- ///
- ///
- ///
- public static string GetNoteName(int note, bool sharps, bool showOctave)
- {
- if (note < kMinMidiNote || note > kMaxMidiNote)
- return null;
-
- note -= kMinMidiNote;
-
- int octave = (note + 9) / 12;
- note = note % 12;
- string noteText = null;
-
- switch (note)
- {
- case 0:
- noteText = "A";
- break;
-
- case 1:
- noteText = sharps ? "A#" : "Bb";
- break;
-
- case 2:
- noteText = "B";
- break;
-
- case 3:
- noteText = "C";
- break;
-
- case 4:
- noteText = sharps ? "C#" : "Db";
- break;
-
- case 5:
- noteText = "D";
- break;
-
- case 6:
- noteText = sharps ? "D#" : "Eb";
- break;
-
- case 7:
- noteText = "E";
- break;
-
- case 8:
- noteText = "F";
- break;
-
- case 9:
- noteText = sharps ? "F#" : "Gb";
- break;
-
- case 10:
- noteText = "G";
- break;
-
- case 11:
- noteText = sharps ? "G#" : "Ab";
- break;
- }
-
- if (showOctave)
- noteText += " " + octave.ToString();
-
- return noteText;
- }
- }
-}
\ No newline at end of file
diff --git a/Vocaluxe/Lib/Sound/Record/PitchTracker/Pitch/PitchTracker.cs b/Vocaluxe/Lib/Sound/Record/PitchTracker/Pitch/PitchTracker.cs
deleted file mode 100644
index 59522197..00000000
--- a/Vocaluxe/Lib/Sound/Record/PitchTracker/Pitch/PitchTracker.cs
+++ /dev/null
@@ -1,431 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Collections;
-
-namespace Vocaluxe.Lib.Sound.Record.PitchTracker.Pitch
-{
- ///
- /// Tracks pitch
- ///
- // ReSharper disable InconsistentNaming
- public class PitchTracker
- {
- private const int kOctaveSteps = 96;
- private const int kStepOverlap = 4;
- private const float kMinFreq = 50.0f; // A1, Midi note 33, 55.0Hz
- private const float kMaxFreq = 1800.0f; // A#6. Midi note 92
- private const int kStartCircular = 40; // how far into the sample buffer do we start checking (allow for filter settling)
- private const float kDetectOverlapSec = 0.005f;
- private const float kMaxOctaveSecRate = 10.0f;
-
- private const float kAvgOffset = 0.005f; // time offset between pitch averaging values
- private const int kAvgCount = 1; // number of average pitch samples to take
- private const float kCircularBufSaveTime = 1.0f; // Amount of samples to store in the history buffer
-
- private PitchDsp m_dsp;
- private CircularBuffer m_circularBufferLo;
- private CircularBuffer m_circularBufferHi;
- private double m_sampleRate;
- private float m_detectLevelThreshold = 0.01f; // -40dB
- private int m_pitchRecordsPerSecond = 50; // default is 50, or one record every 20ms
-
- private float[] m_pitchBufLo;
- private float[] m_pitchBufHi;
- private int m_pitchBufSize;
- private int m_samplesPerPitchBlock;
- private int m_curPitchIndex;
- private long m_curPitchSamplePos;
-
- private int m_detectOverlapSamples;
- private float m_maxOverlapDiff;
-
- private bool m_recordPitchRecords;
- private int m_pitchRecordHistorySize;
- private List m_pitchRecords = new List();
- private PitchRecord m_curPitchRecord = new PitchRecord();
-
- private IIRFilter m_iirFilterLoLo;
- private IIRFilter m_iirFilterLoHi;
- private IIRFilter m_iirFilterHiLo;
- private IIRFilter m_iirFilterHiHi;
-
- public float LastMaxVol = 0;
-
- public delegate void PitchDetectedHandler(PitchTracker sender, PitchRecord pitchRecord);
-
- public event PitchDetectedHandler PitchDetected;
-
- ///
- /// Constructor
- ///
- public PitchTracker() {}
-
- ///
- /// Set the sample rate
- ///
- public double SampleRate
- {
- set
- {
- if (m_sampleRate == value)
- return;
-
- m_sampleRate = value;
- Setup();
- }
- }
-
- ///
- /// Set the detect level threshold, The value must be between 0.0001f and 1.0f (-80 dB to 0 dB)
- ///
- public float DetectLevelThreshold
- {
- set
- {
- float newValue = Math.Max(0.0001f, Math.Min(1.0f, value));
-
- if (m_detectLevelThreshold == newValue)
- return;
-
- m_detectLevelThreshold = newValue;
- //Setup();
- }
- get { return m_detectLevelThreshold; }
- }
-
- ///
- /// Return the samples per pitch block
- ///
- public int SamplesPerPitchBlock
- {
- get { return m_samplesPerPitchBlock; }
- }
-
- ///
- /// Get or set the number of pitch records per second (default is 50, or one record every 20ms)
- ///
- public int PitchRecordsPerSecond
- {
- get { return m_pitchRecordsPerSecond; }
- set
- {
- m_pitchRecordsPerSecond = Math.Max(1, Math.Min(100, value));
- Setup();
- }
- }
-
- ///
- /// Get or set whether pitch records should be recorded into a history buffer
- ///
- public bool RecordPitchRecords
- {
- get { return m_recordPitchRecords; }
- set
- {
- if (m_recordPitchRecords == value)
- return;
-
- m_recordPitchRecords = value;
-
- if (!m_recordPitchRecords)
- m_pitchRecords = new List();
- }
- }
-
- ///
- /// Get or set the max number of pitch records to keep. A value of 0 means no limit.
- /// Don't leave this at 0 when RecordPitchRecords is true and this is used in a realtime
- /// application since the buffer will grow indefinately!
- ///
- public int PitchRecordHistorySize
- {
- get { return m_pitchRecordHistorySize; }
- set
- {
- m_pitchRecordHistorySize = value;
-
- m_pitchRecords.Capacity = m_pitchRecordHistorySize;
- }
- }
-
- ///
- /// Get the current pitch records
- ///
- public IList PitchRecords
- {
- get { return m_pitchRecords.AsReadOnly(); }
- }
-
- ///
- /// Get the latest pitch record
- ///
- public PitchRecord CurrentPitchRecord
- {
- get { return m_curPitchRecord; }
- }
-
- ///
- /// Get the current pitch position
- ///
- public long CurrentPitchSamplePosition
- {
- get { return m_curPitchSamplePos; }
- }
-
- ///
- /// Get the minimum frequency that can be detected
- ///
- public static float MinDetectFrequency
- {
- get { return kMinFreq; }
- }
-
- ///
- /// Get the maximum frequency that can be detected
- ///
- public static float MaxDetectFrequency
- {
- get { return kMaxFreq; }
- }
-
- ///
- /// Get the frequency step
- ///
- public static double FrequencyStep
- {
- get { return Math.Pow(2.0, 1.0 / kOctaveSteps); }
- }
-
- ///
- /// Get the number of samples that the detected pitch is offset from the input buffer.
- /// This is just an estimate to sync up the samples and detected pitch
- ///
- public int DetectSampleOffset
- {
- get { return (m_pitchBufSize + m_detectOverlapSamples) / 2; }
- }
-
- ///
- /// Reset the pitch tracker. Call this when the sample position is
- /// not consecutive from the previous position
- ///
- public void Reset()
- {
- m_curPitchIndex = 0;
- m_curPitchSamplePos = 0;
- m_pitchRecords.Clear();
- m_iirFilterLoLo.Reset();
- m_iirFilterLoHi.Reset();
- m_iirFilterHiLo.Reset();
- m_iirFilterHiHi.Reset();
- m_circularBufferLo.Reset();
- m_circularBufferLo.Clear();
- m_circularBufferHi.Reset();
- m_circularBufferHi.Clear();
- m_pitchBufLo.Clear();
- m_pitchBufHi.Clear();
-
- m_circularBufferLo.StartPosition = -m_detectOverlapSamples;
- m_circularBufferLo.Available = m_detectOverlapSamples;
- m_circularBufferHi.StartPosition = -m_detectOverlapSamples;
- m_circularBufferHi.Available = m_detectOverlapSamples;
- }
-
- ///
- /// Process the passed in buffer of data. During this call, the PitchDetected event will
- /// be fired zero or more times, depending how many pitch records will fit in the new
- /// and previously cached buffer.
- ///
- /// This means that there is no size restriction on the buffer that is passed into ProcessBuffer.
- /// For instance, ProcessBuffer can be called with one very large buffer that contains all of the
- /// audio to be processed (many PitchDetected events will be fired), or just a small buffer at
- /// a time which is more typical for realtime applications. In the latter case, the PitchDetected
- /// event might not be fired at all since additional calls must first be made to accumulate enough
- /// data do another pitch detect operation.
- ///
- /// Input buffer. Samples must be in the range -1.0 to 1.0
- ///
- /// Number of samples to process. Zero means all samples in the buffer
- public void ProcessBuffer(float[] inBuffer, int sampleCount = 0)
- {
- if (inBuffer == null)
- throw new ArgumentNullException("inBuffer", "Input buffer cannot be null");
-
- int samplesProcessed = 0;
- int srcLength = sampleCount == 0 ? inBuffer.Length : Math.Min(sampleCount, inBuffer.Length);
-
- float maxVolume = LastMaxVol * 0.85f;
-
- while (samplesProcessed < srcLength)
- {
- int frameCount = Math.Min(srcLength - samplesProcessed, m_pitchBufSize + m_detectOverlapSamples);
-
- m_iirFilterLoLo.FilterBuffer(inBuffer, samplesProcessed, m_pitchBufLo, 0, frameCount);
- m_iirFilterLoHi.FilterBuffer(m_pitchBufLo, 0, m_pitchBufLo, 0, frameCount);
-
- m_iirFilterHiLo.FilterBuffer(inBuffer, samplesProcessed, m_pitchBufHi, 0, frameCount);
- m_iirFilterHiHi.FilterBuffer(m_pitchBufHi, 0, m_pitchBufHi, 0, frameCount);
-
- m_circularBufferLo.WriteBuffer(m_pitchBufLo, frameCount);
- m_circularBufferHi.WriteBuffer(m_pitchBufHi, frameCount);
-
- // Loop while there is enough samples in the circular buffer
- while (m_circularBufferLo.ReadBuffer(m_pitchBufLo, m_curPitchSamplePos, m_pitchBufSize + m_detectOverlapSamples))
- {
- float pitch1;
- float pitch2;
- float detectedPitch = 0.0f;
-
- m_circularBufferHi.ReadBuffer(m_pitchBufHi, m_curPitchSamplePos, m_pitchBufSize + m_detectOverlapSamples);
-
- maxVolume = 0f;
- for (int i = 0; i < (m_pitchBufSize + m_detectOverlapSamples) / 2; i++)
- {
- if (maxVolume < m_pitchBufHi[i])
- maxVolume = m_pitchBufHi[i];
- if (maxVolume < m_pitchBufLo[i])
- maxVolume = m_pitchBufLo[i];
- }
-
- pitch1 = (maxVolume >= m_detectLevelThreshold) ? m_dsp.DetectPitch(m_pitchBufLo, m_pitchBufHi) : 0f;
-
- if (pitch1 > 0.0f)
- {
- // Shift the buffers left by the overlapping amount
- m_pitchBufLo.Copy(m_pitchBufLo, m_detectOverlapSamples - 1, 0, m_pitchBufSize);
- m_pitchBufHi.Copy(m_pitchBufHi, m_detectOverlapSamples - 1, 0, m_pitchBufSize);
-
- pitch2 = m_dsp.DetectPitch(m_pitchBufLo, m_pitchBufHi);
-
- if (pitch2 > 0.0f)
- {
- float fDiff = Math.Max(pitch1, pitch2) / Math.Min(pitch1, pitch2) - 1.0f;
-
- if (fDiff < m_maxOverlapDiff)
- detectedPitch = (pitch1 + pitch2) * 0.5f;
- }
- }
-
- // Log the pitch record
- AddPitchRecord(detectedPitch);
-
- m_curPitchSamplePos += m_samplesPerPitchBlock;
- m_curPitchIndex++;
- }
-
- samplesProcessed += frameCount;
- }
- LastMaxVol = maxVolume;
- }
-
- ///
- /// Setup
- ///
- private void Setup()
- {
- if (m_sampleRate < 1.0f)
- return;
-
- m_dsp = new PitchDsp(m_sampleRate, kMinFreq, kMaxFreq);
-
- m_iirFilterLoLo = new IIRFilter();
- m_iirFilterLoLo.Proto = IIRFilter.ProtoType.Butterworth;
- m_iirFilterLoLo.Type = IIRFilter.FilterType.HP;
- m_iirFilterLoLo.Order = 5;
- m_iirFilterLoLo.FreqLow = 45.0f;
- m_iirFilterLoLo.SampleRate = (float)m_sampleRate;
-
- m_iirFilterLoHi = new IIRFilter();
- m_iirFilterLoHi.Proto = IIRFilter.ProtoType.Butterworth;
- m_iirFilterLoHi.Type = IIRFilter.FilterType.LP;
- m_iirFilterLoHi.Order = 5;
- m_iirFilterLoHi.FreqHigh = 280.0f;
- m_iirFilterLoHi.SampleRate = (float)m_sampleRate;
-
- m_iirFilterHiLo = new IIRFilter();
- m_iirFilterHiLo.Proto = IIRFilter.ProtoType.Butterworth;
- m_iirFilterHiLo.Type = IIRFilter.FilterType.HP;
- m_iirFilterHiLo.Order = 5;
- m_iirFilterHiLo.FreqLow = 45.0f;
- m_iirFilterHiLo.SampleRate = (float)m_sampleRate;
-
- m_iirFilterHiHi = new IIRFilter();
- m_iirFilterHiHi.Proto = IIRFilter.ProtoType.Butterworth;
- m_iirFilterHiHi.Type = IIRFilter.FilterType.LP;
- m_iirFilterHiHi.Order = 5;
- m_iirFilterHiHi.FreqHigh = 2000.0f;
- m_iirFilterHiHi.SampleRate = (float)m_sampleRate;
-
- m_detectOverlapSamples = (int)(kDetectOverlapSec * m_sampleRate);
- m_maxOverlapDiff = kMaxOctaveSecRate * kDetectOverlapSec;
-
- m_pitchBufSize = (int)(((1.0f / (float)kMinFreq) * 2.0f + ((kAvgCount - 1) * kAvgOffset)) * m_sampleRate) + 16;
- m_pitchBufLo = new float[m_pitchBufSize + m_detectOverlapSamples];
- m_pitchBufHi = new float[m_pitchBufSize + m_detectOverlapSamples];
- m_samplesPerPitchBlock = (int)Math.Round(m_sampleRate / m_pitchRecordsPerSecond);
-
- m_circularBufferLo = new CircularBuffer((int)(kCircularBufSaveTime * m_sampleRate + 0.5f) + 10000);
- m_circularBufferHi = new CircularBuffer((int)(kCircularBufSaveTime * m_sampleRate + 0.5f) + 10000);
- }
-
- ///
- /// The pitch was detected - add the record
- ///
- ///
- private void AddPitchRecord(float pitch)
- {
- int midiNote = 0;
- int midiCents = 0;
-
- PitchDsp.PitchToMidiNote(pitch, out midiNote, out midiCents);
-
- var record = new PitchRecord();
-
- record.RecordIndex = m_curPitchIndex;
- record.Pitch = pitch;
- record.MidiNote = midiNote;
- record.MidiCents = midiCents;
-
- m_curPitchRecord = record;
-
- if (m_recordPitchRecords)
- {
- if (m_pitchRecordHistorySize > 0 && m_pitchRecords.Count >= m_pitchRecordHistorySize)
- m_pitchRecords.RemoveAt(0);
-
- m_pitchRecords.Add(record);
- }
-
- if (this.PitchDetected != null)
- this.PitchDetected(this, record);
- }
-
- ///
- /// Stores one record
- ///
- public struct PitchRecord
- {
- ///
- /// The index of the pitch record since the last Reset call
- ///
- public int RecordIndex { get; set; }
-
- ///
- /// The detected pitch
- ///
- public float Pitch { get; set; }
-
- ///
- /// The detected MIDI note, or 0 for no pitch
- ///
- public int MidiNote { get; set; }
-
- ///
- /// The offset from the detected MIDI note in cents, from -50 to +50.
- ///
- public int MidiCents { get; set; }
- }
- }
-
- // ReSharper restore InconsistentNaming
-}
\ No newline at end of file
diff --git a/Vocaluxe/Lib/Webcam/IWebcam.cs b/Vocaluxe/Lib/Webcam/IWebcam.cs
index 9960b979..289b51f5 100644
--- a/Vocaluxe/Lib/Webcam/IWebcam.cs
+++ b/Vocaluxe/Lib/Webcam/IWebcam.cs
@@ -63,7 +63,6 @@ namespace Vocaluxe.Lib.Webcam
///
/// Gets the last captured frame as a bitma
///
- ///
/// Null if no frame was captured, the bitmap otherwise
Bitmap GetBitmap();
diff --git a/Vocaluxe/Screens/CScreenOptionsVideo.cs b/Vocaluxe/Screens/CScreenOptionsVideo.cs
index 754e88e2..d8ff7710 100644
--- a/Vocaluxe/Screens/CScreenOptionsVideo.cs
+++ b/Vocaluxe/Screens/CScreenOptionsVideo.cs
@@ -257,8 +257,8 @@ namespace Vocaluxe.Screens
_Config.Height = d.Capabilities[_CapabilityNr].Height;
_Config.Framerate = d.Capabilities[_CapabilityNr].Framerate;
- CWebcam.Select(_Config);
- CWebcam.Start();
+ if (CWebcam.Select(_Config))
+ CWebcam.Start();
}
}
diff --git a/Vocaluxe/Screens/CScreenSing.cs b/Vocaluxe/Screens/CScreenSing.cs
index 1b1eec3a..765ccb93 100644
--- a/Vocaluxe/Screens/CScreenSing.cs
+++ b/Vocaluxe/Screens/CScreenSing.cs
@@ -298,7 +298,7 @@ namespace Vocaluxe.Screens
else
finish = true;
- if (finish)
+ if (finish && !_FadeOut)
_LoadNextSong();
_UpdateSongText();
diff --git a/Vocaluxe/Vocaluxe.csproj b/Vocaluxe/Vocaluxe.csproj
index 02af3467..0c0d6aac 100644
--- a/Vocaluxe/Vocaluxe.csproj
+++ b/Vocaluxe/Vocaluxe.csproj
@@ -292,13 +292,7 @@
-
-
-
-
-
-
diff --git a/VocaluxeLib/CFont.cs b/VocaluxeLib/CFont.cs
index 88982ee5..15df7ee1 100644
--- a/VocaluxeLib/CFont.cs
+++ b/VocaluxeLib/CFont.cs
@@ -27,9 +27,11 @@ namespace VocaluxeLib
public struct SThemeFont
{
+ // ReSharper disable UnassignedField.Global
public string Name;
public EStyle Style;
public float Size;
+ // ReSharper restore UnassignedField.Global
}
public class CFont
diff --git a/VocaluxeLib/Menu/CBackground.cs b/VocaluxeLib/Menu/CBackground.cs
index 90fab98c..efbbccd9 100644
--- a/VocaluxeLib/Menu/CBackground.cs
+++ b/VocaluxeLib/Menu/CBackground.cs
@@ -48,7 +48,6 @@ namespace VocaluxeLib.Menu
{
private readonly int _PartyModeID;
private SThemeBackground _Theme;
- private bool _ThemeLoaded;
private int _SlideShowCurrent;
private readonly Stopwatch _SlideShowTimer = new Stopwatch();
@@ -62,10 +61,7 @@ namespace VocaluxeLib.Menu
}
public SColorF Color;
- public bool ThemeLoaded
- {
- get { return _ThemeLoaded; }
- }
+ public bool ThemeLoaded { get; private set; }
public string GetThemeName()
{
@@ -76,7 +72,7 @@ namespace VocaluxeLib.Menu
public CBackground(int partyModeID)
{
_PartyModeID = partyModeID;
- _ThemeLoaded = false;
+ ThemeLoaded = false;
_Theme = new SThemeBackground {SlideShowTextures = new List()};
Color = new SColorF(0f, 0f, 0f, 1f);
@@ -87,7 +83,7 @@ namespace VocaluxeLib.Menu
_Theme = theme;
_PartyModeID = partyModeID;
- LoadSkin();
+ ThemeLoaded = true;
}
#endregion Constructors
@@ -95,16 +91,16 @@ namespace VocaluxeLib.Menu
public bool LoadTheme(string xmlPath, string elementName, CXmlReader xmlReader)
{
string item = xmlPath + "/" + elementName;
- _ThemeLoaded = true;
+ ThemeLoaded = true;
- _ThemeLoaded &= xmlReader.TryGetEnumValue(item + "/Type", ref _Theme.Type);
+ ThemeLoaded &= xmlReader.TryGetEnumValue(item + "/Type", ref _Theme.Type);
bool vid = xmlReader.GetValue(item + "/Video", out _Theme.VideoName, String.Empty);
bool tex = xmlReader.GetValue(item + "/Skin", out _Theme.Skin, String.Empty);
- _ThemeLoaded &= vid || tex || _Theme.Type == EBackgroundTypes.None;
+ ThemeLoaded &= vid || tex || _Theme.Type == EBackgroundTypes.None;
if (xmlReader.GetValue(item + "/Color", out _Theme.Color.Name, String.Empty))
- _ThemeLoaded &= _Theme.Color.Get(_PartyModeID, out Color);
+ ThemeLoaded &= _Theme.Color.Get(_PartyModeID, out Color);
else
{
bool success = true;
@@ -114,7 +110,7 @@ namespace VocaluxeLib.Menu
success &= xmlReader.TryGetFloatValue(item + "/A", ref Color.A);
if (_Theme.Type != EBackgroundTypes.None)
- _ThemeLoaded &= success;
+ ThemeLoaded &= success;
}
_Theme.Color.Color = Color;
@@ -130,12 +126,12 @@ namespace VocaluxeLib.Menu
i++;
}
- if (_ThemeLoaded)
+ if (ThemeLoaded)
{
_Theme.Name = elementName;
LoadSkin();
}
- return _ThemeLoaded;
+ return ThemeLoaded;
}
public void Resume()
@@ -179,12 +175,16 @@ namespace VocaluxeLib.Menu
public void UnloadSkin()
{
+ if (!ThemeLoaded)
+ return;
_SlideShowTextures.Clear();
CBase.Video.Close(ref _VideoStream);
}
public void LoadSkin()
{
+ if (!ThemeLoaded)
+ return;
_Theme.Color.Get(_PartyModeID, out Color);
if (_Theme.Type == EBackgroundTypes.SlideShow)
@@ -224,7 +224,7 @@ namespace VocaluxeLib.Menu
LoadSkin();
}
- public SThemeBackground GetTheme()
+ public object GetTheme()
{
return _Theme;
}
diff --git a/VocaluxeLib/Menu/CButton.cs b/VocaluxeLib/Menu/CButton.cs
index 8e0ff6b9..fad72b20 100644
--- a/VocaluxeLib/Menu/CButton.cs
+++ b/VocaluxeLib/Menu/CButton.cs
@@ -42,7 +42,6 @@ namespace VocaluxeLib.Menu
public sealed class CButton : CMenuElementBase, IMenuElement, IThemeable
{
private SThemeButton _Theme;
- private bool _ThemeLoaded;
private readonly int _PartyModeID;
public CTextureRef Texture;
@@ -100,10 +99,7 @@ namespace VocaluxeLib.Menu
return _Theme.Name;
}
- public bool ThemeLoaded
- {
- get { return _ThemeLoaded; }
- }
+ public bool ThemeLoaded { get; private set; }
public CButton(int partyModeID)
{
@@ -125,7 +121,7 @@ namespace VocaluxeLib.Menu
Selected = false;
EditMode = false;
- LoadSkin();
+ ThemeLoaded = true;
}
public CButton(CButton button)
@@ -161,42 +157,42 @@ namespace VocaluxeLib.Menu
public bool LoadTheme(string xmlPath, string elementName, CXmlReader xmlReader)
{
string item = xmlPath + "/" + elementName;
- _ThemeLoaded = true;
+ ThemeLoaded = true;
- _ThemeLoaded &= xmlReader.GetValue(item + "/Skin", out _Theme.Skin, String.Empty);
- _ThemeLoaded &= xmlReader.GetValue(item + "/SkinSelected", out _Theme.SkinSelected, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/Skin", out _Theme.Skin, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/SkinSelected", out _Theme.SkinSelected, String.Empty);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/X", ref _Theme.Rect.X);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Y", ref _Theme.Rect.Y);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Z", ref _Theme.Rect.Z);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/W", ref _Theme.Rect.W);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/H", ref _Theme.Rect.H);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/X", ref _Theme.Rect.X);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Y", ref _Theme.Rect.Y);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Z", ref _Theme.Rect.Z);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/W", ref _Theme.Rect.W);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/H", ref _Theme.Rect.H);
if (xmlReader.GetValue(item + "/Color", out _Theme.Color.Name, String.Empty))
- _ThemeLoaded &= _Theme.Color.Get(_PartyModeID, out Color);
+ ThemeLoaded &= _Theme.Color.Get(_PartyModeID, out Color);
else
{
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/R", ref Color.R);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/G", ref Color.G);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/B", ref Color.B);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/A", ref Color.A);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/R", ref Color.R);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/G", ref Color.G);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/B", ref Color.B);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/A", ref Color.A);
}
if (xmlReader.GetValue(item + "/SColor", out _Theme.SelColor.Name, String.Empty))
- _ThemeLoaded &= _Theme.SelColor.Get(_PartyModeID, out SelColor);
+ ThemeLoaded &= _Theme.SelColor.Get(_PartyModeID, out SelColor);
else
{
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SR", ref SelColor.R);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SG", ref SelColor.G);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SB", ref SelColor.B);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SA", ref SelColor.A);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SR", ref SelColor.R);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SG", ref SelColor.G);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SB", ref SelColor.B);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SA", ref SelColor.A);
}
- _ThemeLoaded &= Text.LoadTheme(item, "Text", xmlReader, true);
+ ThemeLoaded &= Text.LoadTheme(item, "Text", xmlReader, true);
Text.Z = Rect.Z;
if (xmlReader.ItemExists(item + "/SText"))
{
- _ThemeLoaded &= _SelText.LoadTheme(item, "SText", xmlReader, true);
+ ThemeLoaded &= _SelText.LoadTheme(item, "SText", xmlReader, true);
_SelText.Z = Rect.Z;
}
else
@@ -207,8 +203,8 @@ namespace VocaluxeLib.Menu
if (xmlReader.ItemExists(item + "/Reflection"))
{
_Reflection = true;
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Reflection/Space", ref _ReflectionSpace);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Reflection/Height", ref _ReflectionHeight);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Reflection/Space", ref _ReflectionSpace);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Reflection/Height", ref _ReflectionHeight);
_Theme.Reflection = new SReflection(_ReflectionHeight, _ReflectionSpace);
}
@@ -221,8 +217,8 @@ namespace VocaluxeLib.Menu
if (xmlReader.ItemExists(item + "/SReflection"))
{
_SelReflection = true;
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SReflection/Space", ref _SelReflectionSpace);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SReflection/Height", ref _SelReflectionHeight);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SReflection/Space", ref _SelReflectionSpace);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SReflection/Height", ref _SelReflectionHeight);
_Theme.SelReflection = new SReflection(_SelReflectionHeight, _SelReflectionSpace);
}
@@ -232,20 +228,25 @@ namespace VocaluxeLib.Menu
_Theme.SelReflection = null;
}
- if (_ThemeLoaded)
+ if (ThemeLoaded)
{
_Theme.Name = elementName;
_Theme.Color.Color = Color;
_Theme.SelColor.Color = SelColor;
- _Theme.Text = Text.GetTheme();
- if (_SelText == null)
- _Theme.SelText = null;
- else
- _Theme.SelText = _SelText.GetTheme();
+ _ReadSubThemeElements();
LoadSkin();
}
- return _ThemeLoaded;
+ return ThemeLoaded;
+ }
+
+ private void _ReadSubThemeElements()
+ {
+ _Theme.Text = (SThemeText)Text.GetTheme();
+ if (_SelText == null)
+ _Theme.SelText = null;
+ else
+ _Theme.SelText = (SThemeText)_SelText.GetTheme();
}
public void Draw()
@@ -306,11 +307,15 @@ namespace VocaluxeLib.Menu
public void UnloadSkin()
{
+ if (!ThemeLoaded)
+ return;
Text.UnloadSkin();
}
public void LoadSkin()
{
+ if (!ThemeLoaded)
+ return;
Text = new CText(_Theme.Text, _PartyModeID);
Text.LoadSkin();
@@ -351,8 +356,9 @@ namespace VocaluxeLib.Menu
LoadSkin();
}
- public SThemeButton GetTheme()
+ public object GetTheme()
{
+ _ReadSubThemeElements();
return _Theme;
}
diff --git a/VocaluxeLib/Menu/CEqualizer.cs b/VocaluxeLib/Menu/CEqualizer.cs
index 55ef5a61..6b14778d 100644
--- a/VocaluxeLib/Menu/CEqualizer.cs
+++ b/VocaluxeLib/Menu/CEqualizer.cs
@@ -50,7 +50,6 @@ namespace VocaluxeLib.Menu
{
private readonly int _PartyModeID;
private SThemeEqualizer _Theme;
- private bool _ThemeLoaded;
public SColorF Color;
public SColorF MaxColor;
@@ -65,10 +64,7 @@ namespace VocaluxeLib.Menu
return _Theme.Name;
}
- public bool ThemeLoaded
- {
- get { return _ThemeLoaded; }
- }
+ public bool ThemeLoaded { get; private set; }
private float[] _Bars;
private int _MaxBar;
@@ -83,7 +79,7 @@ namespace VocaluxeLib.Menu
{
_PartyModeID = partyModeID;
_Theme = new SThemeEqualizer();
- _ThemeLoaded = false;
+ ThemeLoaded = false;
Color = new SColorF();
MaxColor = new SColorF();
@@ -98,56 +94,56 @@ namespace VocaluxeLib.Menu
_PartyModeID = partyModeID;
_Theme = theme;
- LoadSkin();
+ ThemeLoaded = true;
}
public bool LoadTheme(string xmlPath, string elementName, CXmlReader xmlReader)
{
string item = xmlPath + "/" + elementName;
- _ThemeLoaded = true;
+ ThemeLoaded = true;
- _ThemeLoaded &= xmlReader.GetValue(item + "/Skin", out _Theme.Skin, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/Skin", out _Theme.Skin, String.Empty);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/X", ref _Theme.Rect.X);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Y", ref _Theme.Rect.Y);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Z", ref _Theme.Rect.Z);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/W", ref _Theme.Rect.W);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/H", ref _Theme.Rect.H);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/X", ref _Theme.Rect.X);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Y", ref _Theme.Rect.Y);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Z", ref _Theme.Rect.Z);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/W", ref _Theme.Rect.W);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/H", ref _Theme.Rect.H);
- _ThemeLoaded &= xmlReader.TryGetIntValue(item + "/NumBars", ref _Theme.NumBars);
+ ThemeLoaded &= xmlReader.TryGetIntValue(item + "/NumBars", ref _Theme.NumBars);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Space", ref _Theme.Space);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Space", ref _Theme.Space);
- _ThemeLoaded &= xmlReader.TryGetEnumValue(item + "/Style", ref _Theme.Style);
+ ThemeLoaded &= xmlReader.TryGetEnumValue(item + "/Style", ref _Theme.Style);
- _ThemeLoaded &= xmlReader.TryGetEnumValue(item + "/DrawNegative", ref _Theme.DrawNegative);
+ ThemeLoaded &= xmlReader.TryGetEnumValue(item + "/DrawNegative", ref _Theme.DrawNegative);
if (xmlReader.GetValue(item + "/Color", out _Theme.Color.Name, String.Empty))
- _ThemeLoaded &= _Theme.Color.Get(_PartyModeID, out Color);
+ ThemeLoaded &= _Theme.Color.Get(_PartyModeID, out Color);
else
{
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/R", ref Color.R);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/G", ref Color.G);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/B", ref Color.B);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/A", ref Color.A);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/R", ref Color.R);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/G", ref Color.G);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/B", ref Color.B);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/A", ref Color.A);
}
if (xmlReader.GetValue(item + "/MaxColor", out _Theme.MaxColor.Name, String.Empty))
- _ThemeLoaded &= _Theme.MaxColor.Get(_PartyModeID, out MaxColor);
+ ThemeLoaded &= _Theme.MaxColor.Get(_PartyModeID, out MaxColor);
else
{
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/MaxR", ref MaxColor.R);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/MaxG", ref MaxColor.G);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/MaxB", ref MaxColor.B);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/MaxA", ref MaxColor.A);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/MaxR", ref MaxColor.R);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/MaxG", ref MaxColor.G);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/MaxB", ref MaxColor.B);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/MaxA", ref MaxColor.A);
}
//Reflection
if (xmlReader.ItemExists(item + "/Reflection"))
{
Reflection = true;
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Reflection/Space", ref ReflectionSpace);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Reflection/Height", ref ReflectionHeight);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Reflection/Space", ref ReflectionSpace);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Reflection/Height", ref ReflectionHeight);
_Theme.Reflection = new SReflection(ReflectionHeight, ReflectionSpace);
}
@@ -157,14 +153,14 @@ namespace VocaluxeLib.Menu
_Theme.Reflection = null;
}
- if (_ThemeLoaded)
+ if (ThemeLoaded)
{
_Theme.Name = elementName;
_Theme.Color.Color = Color;
_Theme.MaxColor.Color = MaxColor;
LoadSkin();
}
- return _ThemeLoaded;
+ return ThemeLoaded;
}
public void Update(float[] weights, float volume)
@@ -264,7 +260,7 @@ namespace VocaluxeLib.Menu
LoadSkin();
}
- public SThemeEqualizer GetTheme()
+ public object GetTheme()
{
return _Theme;
}
diff --git a/VocaluxeLib/Menu/CInteraction.cs b/VocaluxeLib/Menu/CInteraction.cs
index 6b9414d0..b2214075 100644
--- a/VocaluxeLib/Menu/CInteraction.cs
+++ b/VocaluxeLib/Menu/CInteraction.cs
@@ -33,7 +33,7 @@ namespace VocaluxeLib.Menu
ParticleEffect
}
- class CInteraction
+ public class CInteraction
{
public readonly int Num;
public readonly EType Type;
diff --git a/VocaluxeLib/Menu/CLyric.cs b/VocaluxeLib/Menu/CLyric.cs
index 48e74062..7ada94b3 100644
--- a/VocaluxeLib/Menu/CLyric.cs
+++ b/VocaluxeLib/Menu/CLyric.cs
@@ -37,7 +37,6 @@ namespace VocaluxeLib.Menu
{
private readonly int _PartyModeID;
private SThemeLyrics _Theme;
- private bool _ThemeLoaded;
///
/// Holds a reference to Songline. DO NOT MODIFY
@@ -61,10 +60,7 @@ namespace VocaluxeLib.Menu
return _Theme.Name;
}
- public bool ThemeLoaded
- {
- get { return _ThemeLoaded; }
- }
+ public bool ThemeLoaded { get; private set; }
private SColorF _Color;
private SColorF _ColorProcessed;
@@ -85,7 +81,7 @@ namespace VocaluxeLib.Menu
{
_PartyModeID = partyModeID;
_Theme = new SThemeLyrics();
- _ThemeLoaded = false;
+ ThemeLoaded = false;
_Color = new SColorF();
_ColorProcessed = new SColorF();
@@ -106,48 +102,48 @@ namespace VocaluxeLib.Menu
LyricStyle = ELyricStyle.Fill;
- LoadSkin();
+ ThemeLoaded = true;
}
public bool LoadTheme(string xmlPath, string elementName, CXmlReader xmlReader)
{
string item = xmlPath + "/" + elementName;
- _ThemeLoaded = true;
+ ThemeLoaded = true;
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/X", ref _Theme.Rect.X);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Y", ref _Theme.Rect.Y);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Z", ref _Theme.Rect.Z);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/W", ref _Theme.Rect.W);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/H", ref _Theme.Rect.H);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/X", ref _Theme.Rect.X);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Y", ref _Theme.Rect.Y);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Z", ref _Theme.Rect.Z);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/W", ref _Theme.Rect.W);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/H", ref _Theme.Rect.H);
if (xmlReader.GetValue(item + "/Color", out _Theme.Color.Name, String.Empty))
- _ThemeLoaded &= _Theme.Color.Get(_PartyModeID, out _Color);
+ ThemeLoaded &= _Theme.Color.Get(_PartyModeID, out _Color);
else
{
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/R", ref _Color.R);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/G", ref _Color.G);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/B", ref _Color.B);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/A", ref _Color.A);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/R", ref _Color.R);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/G", ref _Color.G);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/B", ref _Color.B);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/A", ref _Color.A);
}
if (xmlReader.GetValue(item + "/SColor", out _Theme.ProcessedColor.Name, String.Empty))
- _ThemeLoaded &= _Theme.ProcessedColor.Get(_PartyModeID, out _ColorProcessed);
+ ThemeLoaded &= _Theme.ProcessedColor.Get(_PartyModeID, out _ColorProcessed);
else
{
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SR", ref _ColorProcessed.R);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SG", ref _ColorProcessed.G);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SB", ref _ColorProcessed.B);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SA", ref _ColorProcessed.A);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SR", ref _ColorProcessed.R);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SG", ref _ColorProcessed.G);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SB", ref _ColorProcessed.B);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SA", ref _ColorProcessed.A);
}
- if (_ThemeLoaded)
+ if (ThemeLoaded)
{
_Theme.Name = elementName;
_Theme.Color.Color = _Color;
_Theme.ProcessedColor.Color = _ColorProcessed;
LoadSkin();
}
- return _ThemeLoaded;
+ return ThemeLoaded;
}
public void SetLine(CSongLine line)
@@ -441,7 +437,7 @@ namespace VocaluxeLib.Menu
LoadSkin();
}
- public SThemeLyrics GetTheme()
+ public object GetTheme()
{
return _Theme;
}
diff --git a/VocaluxeLib/Menu/CMenu.cs b/VocaluxeLib/Menu/CMenu.cs
index 9ce8c465..dfc66cce 100644
--- a/VocaluxeLib/Menu/CMenu.cs
+++ b/VocaluxeLib/Menu/CMenu.cs
@@ -18,6 +18,7 @@
using System;
using System.Collections.Generic;
using System.IO;
+using System.Linq;
using System.Windows.Forms;
using System.Xml.Serialization;
using VocaluxeLib.Draw;
@@ -49,7 +50,7 @@ namespace VocaluxeLib.Menu
[XmlArray("Equalizers")] public List Equalizers;
[XmlArray("Playlists")] public List Playlists;
[XmlArray("ParticleEffects")] public List ParticleEffects;
- [XmlArray("ScreenSettings")] public List ScreenSettings;
+ [XmlArray("ScreenSettings")] public List ScreenSettings;
}
struct SZSort
@@ -64,7 +65,7 @@ namespace VocaluxeLib.Menu
protected abstract int _ScreenVersion { get; }
public int PartyModeID { get; protected set; }
- public string ThemeName { get; set; }
+ public string ThemeName { get; private set; }
public SThemeScreen Theme;
// ReSharper disable MemberCanBePrivate.Global
@@ -161,7 +162,7 @@ namespace VocaluxeLib.Menu
Theme.Equalizers = new List();
Theme.Playlists = new List();
Theme.ParticleEffects = new List();
- Theme.ScreenSettings = new List();
+ Theme.ScreenSettings = new List();
try
{
@@ -190,7 +191,7 @@ namespace VocaluxeLib.Menu
foreach (SThemePlaylist pl in Theme.Playlists)
_AddPlaylist(new CPlaylist(pl, PartyModeID), pl.Name);
- foreach (SScreenSetting ss in Theme.ScreenSettings)
+ foreach (SThemeScreenSetting ss in Theme.ScreenSettings)
_AddScreenSetting(new CScreenSetting(ss, PartyModeID), ss.Name);
foreach (SThemeSelectSlide sl in Theme.SelectSlides)
@@ -200,13 +201,27 @@ namespace VocaluxeLib.Menu
_AddSingNote(new CSingNotes(sb, PartyModeID), sb.Name);
foreach (SThemeSongMenu sm in Theme.SongMenus)
- _AddSongMenu(CSongMenuFactory.GetSongMenu(sm, PartyModeID), sm.Name);
+ _AddSongMenu(CSongMenuFactory.CreateSongMenu(sm, PartyModeID), sm.Name);
foreach (SThemeStatic st in Theme.Statics)
_AddStatic(new CStatic(st, PartyModeID), st.Name);
foreach (SThemeText te in Theme.Texts)
_AddText(new CText(te, PartyModeID), te.Name);
+
+ if (_ScreenVersion != Theme.Informations.ScreenVersion)
+ {
+ string msg = "Can't load screen file of screen \"" + ThemeName + "\", ";
+ if (Theme.Informations.ScreenVersion < _ScreenVersion)
+ msg += "the file ist outdated! ";
+ else
+ msg += "the file is for newer program versions! ";
+
+ msg += "Current screen version is " + _ScreenVersion;
+ CBase.Log.LogError(msg);
+ }
+ foreach (IThemeable el in _Elements.Select(_GetElement).OfType())
+ el.LoadSkin();
}
catch (InvalidOperationException)
{
@@ -216,17 +231,6 @@ namespace VocaluxeLib.Menu
{
CBase.Log.LogError(e.Message + e.StackTrace, true, true);
}
- if (_ScreenVersion != Theme.Informations.ScreenVersion)
- {
- string msg = "Can't load screen file of screen \"" + ThemeName + "\", ";
- if (Theme.Informations.ScreenVersion < _ScreenVersion)
- msg += "the file ist outdated! ";
- else
- msg += "the file is for newer program versions! ";
-
- msg += "Current screen version is " + _ScreenVersion;
- CBase.Log.LogError(msg);
- }
}
private void _AddScreenSetting(CScreenSetting screenSetting, string name)
@@ -234,7 +238,7 @@ namespace VocaluxeLib.Menu
_ScreenSettings.Add(name, screenSetting);
}
- public virtual void LoadThemeOld(string xmlPath)
+ public void LoadThemeOld(string xmlPath)
{
string file = Path.Combine(xmlPath, ThemeName + ".xml");
@@ -256,7 +260,7 @@ namespace VocaluxeLib.Menu
_LoadThemeElement(_ThemeSelectSlides, _AddSelectSlide, xmlReader);
foreach (string elName in _ThemeSongMenus)
{
- ISongMenu element = CSongMenuFactory.GetSongMenu(PartyModeID);
+ ISongMenu element = CSongMenuFactory.CreateSongMenu(PartyModeID);
if (element.LoadTheme("//root/" + ThemeName, elName, xmlReader))
_AddSongMenu(element, elName);
else
@@ -286,44 +290,21 @@ namespace VocaluxeLib.Menu
Theme.Equalizers = new List();
Theme.Playlists = new List();
Theme.ParticleEffects = new List();
- Theme.ScreenSettings = new List();
+ Theme.ScreenSettings = new List();
+ }
+
+ private static void _AddThemeablesToList(ICollection themeList, IEnumerable objects) where T : IThemeable
+ {
+ themeList.Clear();
+ foreach (T el in objects.Where(el => el.ThemeLoaded))
+ themeList.Add((TT)el.GetTheme());
}
public virtual void SaveTheme()
{
- if (CBase.Config.GetLoadOldThemeFiles())
- {
- //Have to add theme-stuff manually, later it will be done while de-serialization
- foreach (CBackground el in _Backgrounds)
- Theme.Backgrounds.Add(el.GetTheme());
- foreach (CButton el in _Buttons)
- Theme.Buttons.Add(el.GetTheme());
- foreach (CEqualizer el in _Equalizers)
- Theme.Equalizers.Add(el.GetTheme());
- foreach (CLyric el in _Lyrics)
- Theme.Lyrics.Add(el.GetTheme());
- foreach (CNameSelection el in _NameSelections)
- Theme.NameSelections.Add(el.GetTheme());
- foreach (CParticleEffect el in _ParticleEffects)
- Theme.ParticleEffects.Add(el.GetTheme());
- foreach (CPlaylist el in _Playlists)
- Theme.Playlists.Add(el.GetTheme());
- foreach (CScreenSetting el in _ScreenSettings.Values)
- Theme.ScreenSettings.Add(el.GetTheme());
- foreach (CSelectSlide el in _SelectSlides)
- Theme.SelectSlides.Add(el.GetTheme());
- foreach (CStatic el in _Statics)
- Theme.Statics.Add(el.GetTheme());
- foreach (CText el in _Texts)
- Theme.Texts.Add(el.GetTheme());
- foreach (CSongMenuFramework el in _SongMenus)
- Theme.SongMenus.Add(el.GetTheme());
- foreach (CSingNotes el in _SingNotes)
- Theme.SingNotes.Add(el.GetTheme());
- }
-
if (string.IsNullOrEmpty(ThemePath))
return;
+ _ReadThemeSubElements();
try
{
@@ -340,82 +321,34 @@ namespace VocaluxeLib.Menu
}
}
+ private void _ReadThemeSubElements()
+ {
+ // Load changed/added theme elements into theme struct
+ _AddThemeablesToList(Theme.Backgrounds, _Backgrounds);
+ _AddThemeablesToList(Theme.Buttons, _Buttons);
+ _AddThemeablesToList(Theme.Equalizers, _Equalizers);
+ _AddThemeablesToList(Theme.Lyrics, _Lyrics);
+ _AddThemeablesToList(Theme.NameSelections, _NameSelections);
+ _AddThemeablesToList(Theme.ParticleEffects, _ParticleEffects);
+ _AddThemeablesToList(Theme.Playlists, _Playlists);
+ _AddThemeablesToList(Theme.ScreenSettings, _ScreenSettings.Values);
+ _AddThemeablesToList(Theme.SelectSlides, _SelectSlides);
+ _AddThemeablesToList(Theme.Statics, _Statics);
+ _AddThemeablesToList(Theme.Texts, _Texts);
+ _AddThemeablesToList(Theme.SongMenus, _SongMenus);
+ _AddThemeablesToList(Theme.SingNotes, _SingNotes);
+ }
+
public virtual void ReloadSkin()
{
- foreach (CBackground background in _Backgrounds)
- background.ReloadSkin();
-
- foreach (CButton button in _Buttons)
- button.ReloadSkin();
-
- foreach (CText text in _Texts)
- text.ReloadSkin();
-
- foreach (CStatic stat in _Statics)
- stat.ReloadSkin();
-
- foreach (CSelectSlide slide in _SelectSlides)
- slide.ReloadSkin();
-
- foreach (CSongMenuFramework sm in _SongMenus)
- sm.ReloadSkin();
-
- foreach (CLyric lyric in _Lyrics)
- lyric.ReloadSkin();
-
- foreach (CSingNotes sn in _SingNotes)
- sn.ReloadSkin();
-
- foreach (CNameSelection ns in _NameSelections)
- ns.ReloadSkin();
-
- foreach (CEqualizer eq in _Equalizers)
- eq.ReloadSkin();
-
- foreach (CPlaylist pls in _Playlists)
- pls.ReloadSkin();
-
- foreach (CParticleEffect pe in _ParticleEffects)
- pe.ReloadSkin();
+ foreach (IThemeable el in _Elements.Select(_GetElement).OfType())
+ el.ReloadSkin();
}
public virtual void UnloadSkin()
{
- foreach (CBackground background in _Backgrounds)
- background.UnloadSkin();
-
- foreach (CButton button in _Buttons)
- button.UnloadSkin();
-
- foreach (CText text in _Texts)
- text.UnloadSkin();
-
- foreach (CStatic stat in _Statics)
- stat.UnloadSkin();
-
- foreach (CSelectSlide slide in _SelectSlides)
- slide.UnloadSkin();
-
- foreach (CSongMenuFramework sm in _SongMenus)
- sm.UnloadSkin();
-
- foreach (CLyric lyric in _Lyrics)
- lyric.UnloadSkin();
-
- foreach (CSingNotes sn in _SingNotes)
- sn.UnloadSkin();
-
- foreach (CNameSelection ns in _NameSelections)
- ns.UnloadSkin();
-
- foreach (CPlaylist pls in _Playlists)
- pls.UnloadSkin();
-
- foreach (CEqualizer eq in _Equalizers)
- eq.UnloadSkin();
-
- foreach (CParticleEffect pe in _ParticleEffects)
- pe.UnloadSkin();
+ foreach (IThemeable el in _Elements.Select(_GetElement).OfType())
+ el.UnloadSkin();
}
public virtual void ReloadTheme(string xmlPath)
@@ -423,6 +356,7 @@ namespace VocaluxeLib.Menu
if (ThemePath == "")
return;
+ _ReadThemeSubElements();
UnloadSkin();
_ClearElements();
LoadTheme(xmlPath);
diff --git a/VocaluxeLib/Menu/CMenuParty.cs b/VocaluxeLib/Menu/CMenuParty.cs
index 4a5aeae6..1e65a45b 100644
--- a/VocaluxeLib/Menu/CMenuParty.cs
+++ b/VocaluxeLib/Menu/CMenuParty.cs
@@ -15,7 +15,6 @@
// along with Vocaluxe. If not, see .
#endregion
-using System;
using VocaluxeLib.PartyModes;
namespace VocaluxeLib.Menu
diff --git a/VocaluxeLib/Menu/CNameSelection.cs b/VocaluxeLib/Menu/CNameSelection.cs
index dd2c2e7b..37806b5f 100644
--- a/VocaluxeLib/Menu/CNameSelection.cs
+++ b/VocaluxeLib/Menu/CNameSelection.cs
@@ -74,17 +74,13 @@ namespace VocaluxeLib.Menu
private readonly int _PartyModeID;
private SThemeNameSelection _Theme;
- private bool _ThemeLoaded;
public string GetThemeName()
{
return _Theme.Name;
}
- public bool ThemeLoaded
- {
- get { return _ThemeLoaded; }
- }
+ public bool ThemeLoaded { get; private set; }
private readonly List _Tiles;
@@ -139,7 +135,7 @@ namespace VocaluxeLib.Menu
_VisibleProfiles = new List();
_UsedProfiles = new List();
- LoadSkin();
+ ThemeLoaded = true;
}
public void Init()
@@ -159,59 +155,59 @@ namespace VocaluxeLib.Menu
public bool LoadTheme(string xmlPath, string elementName, CXmlReader xmlReader)
{
string item = xmlPath + "/" + elementName;
- _ThemeLoaded = true;
+ ThemeLoaded = true;
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/X", ref _Theme.Rect.X);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Y", ref _Theme.Rect.Y);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Z", ref _Theme.Rect.Z);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/W", ref _Theme.Rect.W);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/H", ref _Theme.Rect.H);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/X", ref _Theme.Rect.X);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Y", ref _Theme.Rect.Y);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Z", ref _Theme.Rect.Z);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/W", ref _Theme.Rect.W);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/H", ref _Theme.Rect.H);
- _ThemeLoaded &= xmlReader.GetValue(item + "/SkinEmptyTile", out _Theme.SkinEmptyTile, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/SkinEmptyTile", out _Theme.SkinEmptyTile, String.Empty);
if (xmlReader.GetValue(item + "/ColorEmptyTile", out _Theme.ColorEmptyTile.Name, String.Empty))
- _ThemeLoaded &= _Theme.ColorEmptyTile.Get(_PartyModeID, out _ColorEmptyTile);
+ ThemeLoaded &= _Theme.ColorEmptyTile.Get(_PartyModeID, out _ColorEmptyTile);
else
{
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/R", ref _ColorEmptyTile.R);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/G", ref _ColorEmptyTile.G);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/B", ref _ColorEmptyTile.B);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/A", ref _ColorEmptyTile.A);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/R", ref _ColorEmptyTile.R);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/G", ref _ColorEmptyTile.G);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/B", ref _ColorEmptyTile.B);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/A", ref _ColorEmptyTile.A);
}
- _ThemeLoaded &= xmlReader.GetValue(item + "/SkinTileSelected", out _Theme.SkinTileSelected, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/SkinTileSelected", out _Theme.SkinTileSelected, String.Empty);
- _ThemeLoaded &= xmlReader.TryGetIntValue(item + "/Tiles/W", ref _Theme.Tiles.W);
- _ThemeLoaded &= xmlReader.TryGetIntValue(item + "/Tiles/H", ref _Theme.Tiles.H);
- _ThemeLoaded &= xmlReader.TryGetIntValue(item + "/Tiles/NumW", ref _Theme.Tiles.NumW);
- _ThemeLoaded &= xmlReader.TryGetIntValue(item + "/Tiles/NumH", ref _Theme.Tiles.NumH);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Tiles/SpaceW", ref _Theme.Tiles.SpaceW);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Tiles/SpaceH", ref _Theme.Tiles.SpaceH);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Tiles/Name/Space", ref _Theme.Tiles.Name.Space);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Tiles/Name/H", ref _Theme.Tiles.Name.Height);
- _ThemeLoaded &= xmlReader.GetValue(item + "/Tiles/Name/Font", out _Theme.Tiles.Name.Font, "Normal");
- _ThemeLoaded &= xmlReader.TryGetEnumValue(item + "/Tiles/Name/Style", ref _Theme.Tiles.Name.Style);
+ ThemeLoaded &= xmlReader.TryGetIntValue(item + "/Tiles/W", ref _Theme.Tiles.W);
+ ThemeLoaded &= xmlReader.TryGetIntValue(item + "/Tiles/H", ref _Theme.Tiles.H);
+ ThemeLoaded &= xmlReader.TryGetIntValue(item + "/Tiles/NumW", ref _Theme.Tiles.NumW);
+ ThemeLoaded &= xmlReader.TryGetIntValue(item + "/Tiles/NumH", ref _Theme.Tiles.NumH);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Tiles/SpaceW", ref _Theme.Tiles.SpaceW);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Tiles/SpaceH", ref _Theme.Tiles.SpaceH);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Tiles/Name/Space", ref _Theme.Tiles.Name.Space);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Tiles/Name/H", ref _Theme.Tiles.Name.Height);
+ ThemeLoaded &= xmlReader.GetValue(item + "/Tiles/Name/Font", out _Theme.Tiles.Name.Font, "Normal");
+ ThemeLoaded &= xmlReader.TryGetEnumValue(item + "/Tiles/Name/Style", ref _Theme.Tiles.Name.Style);
if (xmlReader.GetValue(item + "/Tiles/Name/Color", out _Theme.Tiles.Name.Color.Name, String.Empty))
- _ThemeLoaded &= _Theme.Tiles.Name.Color.Get(_PartyModeID, out _ColorNameTile);
+ ThemeLoaded &= _Theme.Tiles.Name.Color.Get(_PartyModeID, out _ColorNameTile);
else
{
if (xmlReader.TryGetFloatValue(item + "/Tiles/Name/R", ref _ColorNameTile.R))
{
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Tiles/Name/G", ref _ColorNameTile.G);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Tiles/Name/B", ref _ColorNameTile.B);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Tiles/Name/A", ref _ColorNameTile.A);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Tiles/Name/G", ref _ColorNameTile.G);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Tiles/Name/B", ref _ColorNameTile.B);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Tiles/Name/A", ref _ColorNameTile.A);
}
}
- if (_ThemeLoaded)
+ if (ThemeLoaded)
{
_Theme.Name = elementName;
_Theme.Tiles.Name.Color.Color = _ColorNameTile;
_Theme.ColorEmptyTile.Color = _ColorEmptyTile;
LoadSkin();
}
- return _ThemeLoaded;
+ return ThemeLoaded;
}
public void Draw()
@@ -528,7 +524,7 @@ namespace VocaluxeLib.Menu
}
}
- public SThemeNameSelection GetTheme()
+ public object GetTheme()
{
return _Theme;
}
diff --git a/VocaluxeLib/Menu/CObjectInteractions.cs b/VocaluxeLib/Menu/CObjectInteractions.cs
index f46a2d00..0520e451 100644
--- a/VocaluxeLib/Menu/CObjectInteractions.cs
+++ b/VocaluxeLib/Menu/CObjectInteractions.cs
@@ -27,7 +27,7 @@ namespace VocaluxeLib.Menu
{
public abstract class CObjectInteractions
{
- private readonly List _Elements = new List();
+ protected readonly List _Elements = new List();
private int _Selection;
private Point _PrevMouse;
@@ -245,7 +245,7 @@ namespace VocaluxeLib.Menu
return _Selection >= 0 && _Selection < _Elements.Count;
}
- private IMenuElement _GetElement(CInteraction element)
+ protected IMenuElement _GetElement(CInteraction element)
{
switch (element.Type)
{
diff --git a/VocaluxeLib/Menu/CParticleEffect.cs b/VocaluxeLib/Menu/CParticleEffect.cs
index 0db8fa9c..0638db52 100644
--- a/VocaluxeLib/Menu/CParticleEffect.cs
+++ b/VocaluxeLib/Menu/CParticleEffect.cs
@@ -50,7 +50,6 @@ namespace VocaluxeLib.Menu
{
private readonly int _PartyModeID;
private SThemeParticleEffect _Theme;
- private bool _ThemeLoaded;
public CTextureRef Texture;
public SColorF Color;
@@ -66,10 +65,7 @@ namespace VocaluxeLib.Menu
return _Theme.Name;
}
- public bool ThemeLoaded
- {
- get { return _ThemeLoaded; }
- }
+ public bool ThemeLoaded { get; private set; }
public bool IsAlive
{
@@ -128,43 +124,43 @@ namespace VocaluxeLib.Menu
_NextSpawnTime = 0f;
Visible = true;
- LoadSkin();
+ ThemeLoaded = true;
}
public bool LoadTheme(string xmlPath, string elementName, CXmlReader xmlReader)
{
string item = xmlPath + "/" + elementName;
- _ThemeLoaded = true;
+ ThemeLoaded = true;
- _ThemeLoaded &= xmlReader.GetValue(item + "/Skin", out _Theme.Skin, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/Skin", out _Theme.Skin, String.Empty);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/X", ref _Theme.Rect.X);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Y", ref _Theme.Rect.Y);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Z", ref _Theme.Rect.Z);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/W", ref _Theme.Rect.W);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/H", ref _Theme.Rect.H);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/X", ref _Theme.Rect.X);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Y", ref _Theme.Rect.Y);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Z", ref _Theme.Rect.Z);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/W", ref _Theme.Rect.W);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/H", ref _Theme.Rect.H);
if (xmlReader.GetValue(item + "/Color", out _Theme.Color.Name, String.Empty))
- _ThemeLoaded &= _Theme.Color.Get(_PartyModeID, out Color);
+ ThemeLoaded &= _Theme.Color.Get(_PartyModeID, out Color);
else
{
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/R", ref Color.R);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/G", ref Color.G);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/B", ref Color.B);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/A", ref Color.A);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/R", ref Color.R);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/G", ref Color.G);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/B", ref Color.B);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/A", ref Color.A);
}
- _ThemeLoaded &= xmlReader.TryGetEnumValue(item + "/Type", ref _Theme.Type);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Size", ref _Theme.Size);
- _ThemeLoaded &= xmlReader.TryGetIntValue(item + "/MaxNumber", ref _Theme.MaxNumber);
+ ThemeLoaded &= xmlReader.TryGetEnumValue(item + "/Type", ref _Theme.Type);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Size", ref _Theme.Size);
+ ThemeLoaded &= xmlReader.TryGetIntValue(item + "/MaxNumber", ref _Theme.MaxNumber);
- if (_ThemeLoaded)
+ if (ThemeLoaded)
{
_Theme.Name = elementName;
_Theme.Color.Color = Color;
LoadSkin();
}
- return _ThemeLoaded;
+ return ThemeLoaded;
}
public void Update()
@@ -330,7 +326,7 @@ namespace VocaluxeLib.Menu
LoadSkin();
}
- public SThemeParticleEffect GetTheme()
+ public object GetTheme()
{
return _Theme;
}
diff --git a/VocaluxeLib/Menu/CPlaylist.cs b/VocaluxeLib/Menu/CPlaylist.cs
index 6e019cb3..1280c513 100644
--- a/VocaluxeLib/Menu/CPlaylist.cs
+++ b/VocaluxeLib/Menu/CPlaylist.cs
@@ -144,17 +144,13 @@ namespace VocaluxeLib.Menu
private readonly int _PartyModeID;
private SThemePlaylist _Theme;
- private bool _ThemeLoaded;
public string GetThemeName()
{
return _Theme.Name;
}
- public bool ThemeLoaded
- {
- get { return _ThemeLoaded; }
- }
+ public bool ThemeLoaded { get; private set; }
private readonly List _PlaylistElements = new List();
private readonly List _PlaylistElementContents = new List();
@@ -257,13 +253,6 @@ namespace VocaluxeLib.Menu
_ButtonPlaylistSing = new CButton(_Theme.ButtonPlaylistSing, _PartyModeID);
_SelectSlideGameMode = new CSelectSlide(_Theme.SelectSlideGameMode, _PartyModeID);
- Visible = false;
- Selected = false;
- }
-
- public override void Init()
- {
- base.Init();
_AddStatic(_StaticPlaylistFooter);
_AddStatic(_StaticPlaylistHeader);
_AddButton(_ButtonPlaylistName);
@@ -271,75 +260,83 @@ namespace VocaluxeLib.Menu
_AddButton(_ButtonPlaylistDelete);
_AddButton(_ButtonPlaylistSave);
_AddButton(_ButtonPlaylistSing);
- LoadSkin();
+
+ Visible = false;
+ Selected = false;
+ ThemeLoaded = true;
}
public bool LoadTheme(string xmlPath, string elementName, CXmlReader xmlReader)
{
string item = xmlPath + "/" + elementName;
- _ThemeLoaded = true;
+ ThemeLoaded = true;
- _ThemeLoaded &= xmlReader.GetValue(item + "/SkinBackground", out _Theme.SkinBackground, String.Empty);
- _ThemeLoaded &= xmlReader.GetValue(item + "/SkinBackgroundSelected", out _Theme.SkinBackgroundSelected, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/SkinBackground", out _Theme.SkinBackground, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/SkinBackgroundSelected", out _Theme.SkinBackgroundSelected, String.Empty);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/X", ref _Theme.Rect.X);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Y", ref _Theme.Rect.Y);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Z", ref _Theme.Rect.Z);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/W", ref _Theme.Rect.W);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/H", ref _Theme.Rect.H);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/X", ref _Theme.Rect.X);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Y", ref _Theme.Rect.Y);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Z", ref _Theme.Rect.Z);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/W", ref _Theme.Rect.W);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/H", ref _Theme.Rect.H);
if (xmlReader.GetValue(item + "/ColorBackground", out _Theme.ColorBackground.Name, String.Empty))
- _ThemeLoaded &= _Theme.ColorBackground.Get(_PartyModeID, out _BackgroundColor);
+ ThemeLoaded &= _Theme.ColorBackground.Get(_PartyModeID, out _BackgroundColor);
else
{
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/BackgroundR", ref _BackgroundColor.R);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/BackgroundG", ref _BackgroundColor.G);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/BackgroundB", ref _BackgroundColor.B);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/BackgroundA", ref _BackgroundColor.A);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/BackgroundR", ref _BackgroundColor.R);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/BackgroundG", ref _BackgroundColor.G);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/BackgroundB", ref _BackgroundColor.B);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/BackgroundA", ref _BackgroundColor.A);
}
if (xmlReader.GetValue(item + "/SColorBackground", out _Theme.SelColorBackground.Name, String.Empty))
- _ThemeLoaded &= _Theme.SelColorBackground.Get(_PartyModeID, out _BackgroundSelColor);
+ ThemeLoaded &= _Theme.SelColorBackground.Get(_PartyModeID, out _BackgroundSelColor);
else
{
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SBackgroundR", ref _BackgroundSelColor.R);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SBackgroundG", ref _BackgroundSelColor.G);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SBackgroundB", ref _BackgroundSelColor.B);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SBackgroundA", ref _BackgroundSelColor.A);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SBackgroundR", ref _BackgroundSelColor.R);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SBackgroundG", ref _BackgroundSelColor.G);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SBackgroundB", ref _BackgroundSelColor.B);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SBackgroundA", ref _BackgroundSelColor.A);
}
- _ThemeLoaded &= _Text1.LoadTheme(item, "TextPart1", xmlReader);
+ ThemeLoaded &= _Text1.LoadTheme(item, "TextPart1", xmlReader);
CStatic tmpStatic = new CStatic(_PartyModeID);
- _ThemeLoaded &= tmpStatic.LoadTheme(item, "StaticCover", xmlReader);
- _ThemeLoaded &= _StaticPlaylistHeader.LoadTheme(item, "StaticPlaylistHeader", xmlReader);
- _ThemeLoaded &= _StaticPlaylistFooter.LoadTheme(item, "StaticPlaylistFooter", xmlReader);
+ ThemeLoaded &= tmpStatic.LoadTheme(item, "StaticCover", xmlReader);
+ ThemeLoaded &= _StaticPlaylistHeader.LoadTheme(item, "StaticPlaylistHeader", xmlReader);
+ ThemeLoaded &= _StaticPlaylistFooter.LoadTheme(item, "StaticPlaylistFooter", xmlReader);
- _ThemeLoaded &= _ButtonPlaylistName.LoadTheme(item, "ButtonPlaylistName", xmlReader);
- _ThemeLoaded &= _ButtonPlaylistSing.LoadTheme(item, "ButtonPlaylistSing", xmlReader);
- _ThemeLoaded &= _ButtonPlaylistClose.LoadTheme(item, "ButtonPlaylistClose", xmlReader);
- _ThemeLoaded &= _ButtonPlaylistSave.LoadTheme(item, "ButtonPlaylistSave", xmlReader);
- _ThemeLoaded &= _ButtonPlaylistDelete.LoadTheme(item, "ButtonPlaylistDelete", xmlReader);
+ ThemeLoaded &= _ButtonPlaylistName.LoadTheme(item, "ButtonPlaylistName", xmlReader);
+ ThemeLoaded &= _ButtonPlaylistSing.LoadTheme(item, "ButtonPlaylistSing", xmlReader);
+ ThemeLoaded &= _ButtonPlaylistClose.LoadTheme(item, "ButtonPlaylistClose", xmlReader);
+ ThemeLoaded &= _ButtonPlaylistSave.LoadTheme(item, "ButtonPlaylistSave", xmlReader);
+ ThemeLoaded &= _ButtonPlaylistDelete.LoadTheme(item, "ButtonPlaylistDelete", xmlReader);
- _ThemeLoaded &= _SelectSlideGameMode.LoadTheme(item, "SelectSlideGameMode", xmlReader);
+ ThemeLoaded &= _SelectSlideGameMode.LoadTheme(item, "SelectSlideGameMode", xmlReader);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/EntryHeight", ref _Theme.EntryHeight);
- if (_ThemeLoaded)
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/EntryHeight", ref _Theme.EntryHeight);
+ if (ThemeLoaded)
{
_Theme.Name = elementName;
_Theme.ColorBackground.Color = _BackgroundColor;
_Theme.SelColorBackground.Color = _BackgroundSelColor;
- _Theme.Text1 = _Text1.GetTheme();
- _Theme.StaticCover = tmpStatic.GetTheme();
- _Theme.StaticPlaylistFooter = _StaticPlaylistFooter.GetTheme();
- _Theme.StaticPlaylistHeader = _StaticPlaylistHeader.GetTheme();
- _Theme.ButtonPlaylistName = _ButtonPlaylistName.GetTheme();
- _Theme.ButtonPlaylistSing = _ButtonPlaylistSing.GetTheme();
- _Theme.ButtonPlaylistClose = _ButtonPlaylistClose.GetTheme();
- _Theme.ButtonPlaylistSave = _ButtonPlaylistSave.GetTheme();
- _Theme.ButtonPlaylistDelete = _ButtonPlaylistDelete.GetTheme();
+ _Theme.StaticCover = (SThemeStatic)tmpStatic.GetTheme();
+ _ReadSubThemeElements();
LoadSkin();
}
- return _ThemeLoaded;
+ return ThemeLoaded;
+ }
+
+ private void _ReadSubThemeElements()
+ {
+ _Theme.Text1 = (SThemeText)_Text1.GetTheme();
+ _Theme.StaticPlaylistFooter = (SThemeStatic)_StaticPlaylistFooter.GetTheme();
+ _Theme.StaticPlaylistHeader = (SThemeStatic)_StaticPlaylistHeader.GetTheme();
+ _Theme.ButtonPlaylistName = (SThemeButton)_ButtonPlaylistName.GetTheme();
+ _Theme.ButtonPlaylistSing = (SThemeButton)_ButtonPlaylistSing.GetTheme();
+ _Theme.ButtonPlaylistClose = (SThemeButton)_ButtonPlaylistClose.GetTheme();
+ _Theme.ButtonPlaylistSave = (SThemeButton)_ButtonPlaylistSave.GetTheme();
+ _Theme.ButtonPlaylistDelete = (SThemeButton)_ButtonPlaylistDelete.GetTheme();
}
public void UpdateGame()
@@ -884,11 +881,13 @@ namespace VocaluxeLib.Menu
if (_ChangeOrderSource >= _PlaylistElementContents.Count)
return true;
- _ChangeOrderElement = new CPlaylistElement(_PlaylistElements[_CurrentPlaylistElement]);
- _ChangeOrderElement.Background.Z = CBase.Settings.GetZNear();
- _ChangeOrderElement.Cover.Z = CBase.Settings.GetZNear();
- _ChangeOrderElement.SelectSlide.Z = CBase.Settings.GetZNear();
- _ChangeOrderElement.Text1.Z = CBase.Settings.GetZNear();
+ _ChangeOrderElement = new CPlaylistElement(_PlaylistElements[_CurrentPlaylistElement])
+ {
+ Background = {Z = CBase.Settings.GetZNear()},
+ Cover = {Z = CBase.Settings.GetZNear()},
+ SelectSlide = {Z = CBase.Settings.GetZNear()},
+ Text1 = {Z = CBase.Settings.GetZNear()}
+ };
_ChangeOrderElement.Background.Texture = CBase.Themes.GetSkinTexture(_Theme.SkinBackground, _PartyModeID);
_ChangeOrderElement.Background.Color = _BackgroundColor;
@@ -1164,8 +1163,9 @@ namespace VocaluxeLib.Menu
}
}
- public SThemePlaylist GetTheme()
+ public object GetTheme()
{
+ _ReadSubThemeElements();
return _Theme;
}
diff --git a/VocaluxeLib/Menu/CScreenSetting.cs b/VocaluxeLib/Menu/CScreenSetting.cs
index 863fccdc..35148cf7 100644
--- a/VocaluxeLib/Menu/CScreenSetting.cs
+++ b/VocaluxeLib/Menu/CScreenSetting.cs
@@ -31,7 +31,7 @@ namespace VocaluxeLib.Menu
}
[XmlType("ScreenSetting")]
- public struct SScreenSetting
+ public struct SThemeScreenSetting
{
[XmlAttribute(AttributeName = "Name")] public string Name;
public string Value;
@@ -45,7 +45,7 @@ namespace VocaluxeLib.Menu
{
private readonly int _PartyModeID;
- private SScreenSetting _Theme;
+ private SThemeScreenSetting _Theme;
private bool _ThemeLoaded;
public string GetThemeName()
@@ -61,11 +61,11 @@ namespace VocaluxeLib.Menu
public CScreenSetting(int partyModeID)
{
_PartyModeID = partyModeID;
- _Theme = new SScreenSetting();
+ _Theme = new SThemeScreenSetting();
_ThemeLoaded = false;
}
- public CScreenSetting(SScreenSetting theme, int partyModeID)
+ public CScreenSetting(SThemeScreenSetting theme, int partyModeID)
{
_PartyModeID = partyModeID;
_Theme = theme;
@@ -104,7 +104,7 @@ namespace VocaluxeLib.Menu
return null;
}
- public SScreenSetting GetTheme()
+ public object GetTheme()
{
return _Theme;
}
diff --git a/VocaluxeLib/Menu/CSelectSlide.cs b/VocaluxeLib/Menu/CSelectSlide.cs
index 55ae44f1..f5a876b0 100644
--- a/VocaluxeLib/Menu/CSelectSlide.cs
+++ b/VocaluxeLib/Menu/CSelectSlide.cs
@@ -65,17 +65,13 @@ namespace VocaluxeLib.Menu
{
private readonly int _PartyModeID;
private SThemeSelectSlide _Theme;
- private bool _ThemeLoaded;
public string GetThemeName()
{
return _Theme.Name;
}
- public bool ThemeLoaded
- {
- get { return _ThemeLoaded; }
- }
+ public bool ThemeLoaded { get; private set; }
public SRectF RectArrowLeft;
public SRectF RectArrowRight;
@@ -211,7 +207,7 @@ namespace VocaluxeLib.Menu
public CSelectSlide(int partyModeID)
{
_PartyModeID = partyModeID;
- _ThemeLoaded = false;
+ ThemeLoaded = false;
_TextH = 1f;
_MaxW = 0f;
@@ -226,7 +222,7 @@ namespace VocaluxeLib.Menu
_PartyModeID = slide._PartyModeID;
_Theme = slide._Theme;
- _ThemeLoaded = false;
+ ThemeLoaded = false;
MaxRect = slide.MaxRect;
RectArrowLeft = slide.RectArrowLeft;
@@ -267,110 +263,110 @@ namespace VocaluxeLib.Menu
_ValueNames = new List();
_ValuePartyModeIDs = new List();
- LoadSkin();
+ ThemeLoaded = true;
}
public bool LoadTheme(string xmlPath, string elementName, CXmlReader xmlReader)
{
string item = xmlPath + "/" + elementName;
- _ThemeLoaded = true;
+ ThemeLoaded = true;
- _ThemeLoaded &= xmlReader.GetValue(item + "/Skin", out _Theme.Skin, String.Empty);
- _ThemeLoaded &= xmlReader.GetValue(item + "/SkinArrowLeft", out _Theme.SkinArrowLeft, String.Empty);
- _ThemeLoaded &= xmlReader.GetValue(item + "/SkinArrowRight", out _Theme.SkinArrowRight, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/Skin", out _Theme.Skin, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/SkinArrowLeft", out _Theme.SkinArrowLeft, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/SkinArrowRight", out _Theme.SkinArrowRight, String.Empty);
- _ThemeLoaded &= xmlReader.GetValue(item + "/SkinSelected", out _Theme.SkinSelected, String.Empty);
- _ThemeLoaded &= xmlReader.GetValue(item + "/SkinArrowLeftSelected", out _Theme.SkinArrowLeftSelected, String.Empty);
- _ThemeLoaded &= xmlReader.GetValue(item + "/SkinArrowRightSelected", out _Theme.SkinArrowRightSelected, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/SkinSelected", out _Theme.SkinSelected, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/SkinArrowLeftSelected", out _Theme.SkinArrowLeftSelected, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/SkinArrowRightSelected", out _Theme.SkinArrowRightSelected, String.Empty);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/X", ref _Theme.Rect.X);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Y", ref _Theme.Rect.Y);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Z", ref _Theme.Rect.Z);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/W", ref _Theme.Rect.W);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/H", ref _Theme.Rect.H);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/X", ref _Theme.Rect.X);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Y", ref _Theme.Rect.Y);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Z", ref _Theme.Rect.Z);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/W", ref _Theme.Rect.W);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/H", ref _Theme.Rect.H);
if (xmlReader.GetValue(item + "/Color", out _Theme.Color.Name, String.Empty))
- _ThemeLoaded &= _Theme.Color.Get(_PartyModeID, out _Color);
+ ThemeLoaded &= _Theme.Color.Get(_PartyModeID, out _Color);
else
{
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/R", ref _Color.R);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/G", ref _Color.G);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/B", ref _Color.B);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/A", ref _Color.A);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/R", ref _Color.R);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/G", ref _Color.G);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/B", ref _Color.B);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/A", ref _Color.A);
}
if (xmlReader.GetValue(item + "/SColor", out _Theme.SelColor.Name, String.Empty))
- _ThemeLoaded &= _Theme.SelColor.Get(_PartyModeID, out _SelColor);
+ ThemeLoaded &= _Theme.SelColor.Get(_PartyModeID, out _SelColor);
else
{
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SR", ref _SelColor.R);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SG", ref _SelColor.G);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SB", ref _SelColor.B);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SA", ref _SelColor.A);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SR", ref _SelColor.R);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SG", ref _SelColor.G);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SB", ref _SelColor.B);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SA", ref _SelColor.A);
}
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowLeftX", ref RectArrowLeft.X);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowLeftY", ref RectArrowLeft.Y);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowLeftZ", ref RectArrowLeft.Z);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowLeftW", ref RectArrowLeft.W);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowLeftH", ref RectArrowLeft.H);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowLeftX", ref RectArrowLeft.X);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowLeftY", ref RectArrowLeft.Y);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowLeftZ", ref RectArrowLeft.Z);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowLeftW", ref RectArrowLeft.W);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowLeftH", ref RectArrowLeft.H);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowRightX", ref RectArrowRight.X);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowRightY", ref RectArrowRight.Y);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowRightZ", ref RectArrowRight.Z);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowRightW", ref RectArrowRight.W);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowRightH", ref RectArrowRight.H);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowRightX", ref RectArrowRight.X);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowRightY", ref RectArrowRight.Y);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowRightZ", ref RectArrowRight.Z);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowRightW", ref RectArrowRight.W);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowRightH", ref RectArrowRight.H);
if (xmlReader.GetValue(item + "/ArrowColor", out _Theme.ArrowColor.Name, String.Empty))
- _ThemeLoaded &= _Theme.ArrowColor.Get(_PartyModeID, out _ColorArrow);
+ ThemeLoaded &= _Theme.ArrowColor.Get(_PartyModeID, out _ColorArrow);
else
{
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowR", ref _ColorArrow.R);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowG", ref _ColorArrow.G);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowB", ref _ColorArrow.B);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowA", ref _ColorArrow.A);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowR", ref _ColorArrow.R);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowG", ref _ColorArrow.G);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowB", ref _ColorArrow.B);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowA", ref _ColorArrow.A);
}
if (xmlReader.GetValue(item + "/ArrowSColor", out _Theme.ArrowSelColor.Name, String.Empty))
- _ThemeLoaded &= _Theme.ArrowSelColor.Get(_PartyModeID, out _SelColorArrow);
+ ThemeLoaded &= _Theme.ArrowSelColor.Get(_PartyModeID, out _SelColorArrow);
else
{
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowSR", ref _SelColorArrow.R);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowSG", ref _SelColorArrow.G);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowSB", ref _SelColorArrow.B);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowSA", ref _SelColorArrow.A);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowSR", ref _SelColorArrow.R);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowSG", ref _SelColorArrow.G);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowSB", ref _SelColorArrow.B);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/ArrowSA", ref _SelColorArrow.A);
}
if (xmlReader.GetValue(item + "/TextColor", out _Theme.TextColor.Name, String.Empty))
- _ThemeLoaded &= _Theme.TextColor.Get(_PartyModeID, out _TextColor);
+ ThemeLoaded &= _Theme.TextColor.Get(_PartyModeID, out _TextColor);
else
{
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/TextR", ref _TextColor.R);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/TextG", ref _TextColor.G);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/TextB", ref _TextColor.B);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/TextA", ref _TextColor.A);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/TextR", ref _TextColor.R);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/TextG", ref _TextColor.G);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/TextB", ref _TextColor.B);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/TextA", ref _TextColor.A);
}
if (xmlReader.GetValue(item + "/TextSColor", out _Theme.TextSelColor.Name, String.Empty))
- _ThemeLoaded &= _Theme.TextSelColor.Get(_PartyModeID, out _SelTextColor);
+ ThemeLoaded &= _Theme.TextSelColor.Get(_PartyModeID, out _SelTextColor);
else
{
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/TextSR", ref _SelTextColor.R);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/TextSG", ref _SelTextColor.G);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/TextSB", ref _SelTextColor.B);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/TextSA", ref _SelTextColor.A);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/TextSR", ref _SelTextColor.R);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/TextSG", ref _SelTextColor.G);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/TextSB", ref _SelTextColor.B);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/TextSA", ref _SelTextColor.A);
}
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/TextH", ref _Theme.TextH);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/TextH", ref _Theme.TextH);
xmlReader.TryGetFloatValue(item + "/TextRelativeX", ref _Theme.TextRelativeX);
xmlReader.TryGetFloatValue(item + "/TextRelativeY", ref _Theme.TextRelativeY);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/TextMaxW", ref _Theme.TextMaxW);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/TextMaxW", ref _Theme.TextMaxW);
- _ThemeLoaded &= xmlReader.GetValue(item + "/TextFont", out _Theme.TextFont, "Normal");
- _ThemeLoaded &= xmlReader.TryGetEnumValue(item + "/TextStyle", ref _Theme.TextStyle);
+ ThemeLoaded &= xmlReader.GetValue(item + "/TextFont", out _Theme.TextFont, "Normal");
+ ThemeLoaded &= xmlReader.TryGetEnumValue(item + "/TextStyle", ref _Theme.TextStyle);
- _ThemeLoaded &= xmlReader.TryGetIntValue(item + "/NumVisible", ref _Theme.NumVisible);
+ ThemeLoaded &= xmlReader.TryGetIntValue(item + "/NumVisible", ref _Theme.NumVisible);
- if (_ThemeLoaded)
+ if (ThemeLoaded)
{
_Theme.Name = elementName;
_Theme.ArrowColor.Color = _ColorArrow;
@@ -383,7 +379,7 @@ namespace VocaluxeLib.Menu
_Theme.TextSelColor.Color = _SelTextColor;
LoadSkin();
}
- return _ThemeLoaded;
+ return ThemeLoaded;
}
public void AddValue(string value)
@@ -656,7 +652,7 @@ namespace VocaluxeLib.Menu
}
}
- public SThemeSelectSlide GetTheme()
+ public object GetTheme()
{
return _Theme;
}
diff --git a/VocaluxeLib/Menu/CStatic.cs b/VocaluxeLib/Menu/CStatic.cs
index b1774f5f..c655ddab 100644
--- a/VocaluxeLib/Menu/CStatic.cs
+++ b/VocaluxeLib/Menu/CStatic.cs
@@ -38,17 +38,13 @@ namespace VocaluxeLib.Menu
private readonly int _PartyModeID;
private SThemeStatic _Theme;
- private bool _ThemeLoaded;
public string GetThemeName()
{
return _Theme.Name;
}
- public bool ThemeLoaded
- {
- get { return _ThemeLoaded; }
- }
+ public bool ThemeLoaded { get; private set; }
public bool Selectable
{
@@ -114,31 +110,30 @@ namespace VocaluxeLib.Menu
{
_PartyModeID = partyModeID;
_Theme = theme;
-
- LoadSkin();
+ ThemeLoaded = true;
}
public bool LoadTheme(string xmlPath, string elementName, CXmlReader xmlReader)
{
string item = xmlPath + "/" + elementName;
- _ThemeLoaded = true;
+ ThemeLoaded = true;
- _ThemeLoaded &= xmlReader.GetValue(item + "/Skin", out _Theme.Skin, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/Skin", out _Theme.Skin, String.Empty);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/X", ref _Theme.Rect.X);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Y", ref _Theme.Rect.Y);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Z", ref _Theme.Rect.Z);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/W", ref _Theme.Rect.W);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/H", ref _Theme.Rect.H);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/X", ref _Theme.Rect.X);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Y", ref _Theme.Rect.Y);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Z", ref _Theme.Rect.Z);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/W", ref _Theme.Rect.W);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/H", ref _Theme.Rect.H);
if (xmlReader.GetValue(item + "/Color", out _Theme.Color.Name, String.Empty))
- _ThemeLoaded &= _Theme.Color.Get(_PartyModeID, out Color);
+ ThemeLoaded &= _Theme.Color.Get(_PartyModeID, out Color);
else
{
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/R", ref Color.R);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/G", ref Color.G);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/B", ref Color.B);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/A", ref Color.A);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/R", ref Color.R);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/G", ref Color.G);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/B", ref Color.B);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/A", ref Color.A);
}
_Theme.Color.Color = Color;
@@ -146,8 +141,8 @@ namespace VocaluxeLib.Menu
if (xmlReader.ItemExists(item + "/Reflection"))
{
Reflection = true;
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Reflection/Space", ref ReflectionSpace);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Reflection/Height", ref ReflectionHeight);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Reflection/Space", ref ReflectionSpace);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Reflection/Height", ref ReflectionHeight);
_Theme.Reflection = new SReflection(ReflectionHeight, ReflectionSpace);
}
else
@@ -156,12 +151,12 @@ namespace VocaluxeLib.Menu
_Theme.Reflection = null;
}
- if (_ThemeLoaded)
+ if (ThemeLoaded)
{
_Theme.Name = elementName;
LoadSkin();
}
- return _ThemeLoaded;
+ return ThemeLoaded;
}
public void Draw()
@@ -196,6 +191,8 @@ namespace VocaluxeLib.Menu
public void LoadSkin()
{
+ if (!ThemeLoaded)
+ return;
_Theme.Color.Get(_PartyModeID, out Color);
MaxRect = _Theme.Rect;
@@ -214,7 +211,7 @@ namespace VocaluxeLib.Menu
LoadSkin();
}
- public SThemeStatic GetTheme()
+ public object GetTheme()
{
return _Theme;
}
diff --git a/VocaluxeLib/Menu/CText.cs b/VocaluxeLib/Menu/CText.cs
index 6523d964..4f63e1e6 100644
--- a/VocaluxeLib/Menu/CText.cs
+++ b/VocaluxeLib/Menu/CText.cs
@@ -45,7 +45,6 @@ namespace VocaluxeLib.Menu
public sealed class CText : CMenuElementBase, IMenuElement, IThemeable, IFontObserver
{
private SThemeText _Theme;
- private bool _ThemeLoaded;
private readonly int _PartyModeID = -1;
private int _TranslationID = -1;
@@ -54,10 +53,7 @@ namespace VocaluxeLib.Menu
return _Theme.Name;
}
- public bool ThemeLoaded
- {
- get { return _ThemeLoaded; }
- }
+ public bool ThemeLoaded { get; private set; }
private bool _ButtonText;
private bool _PositionNeedsUpdate = true;
@@ -266,7 +262,7 @@ namespace VocaluxeLib.Menu
float rspace = 0) : this(partyModeID)
{
_Theme = new SThemeText {FontFamily = fontFamily, FontStyle = style, FontHeight = h, Text = text};
- _ThemeLoaded = false;
+ ThemeLoaded = false;
_ButtonText = false;
MaxRect = new SRectF(x, y, mw, h, z);
@@ -295,7 +291,7 @@ namespace VocaluxeLib.Menu
_ButtonText = buttonText;
- LoadSkin();
+ ThemeLoaded = true;
}
public bool LoadTheme(string xmlPath, string elementName, CXmlReader xmlReader)
@@ -306,50 +302,50 @@ namespace VocaluxeLib.Menu
public bool LoadTheme(string xmlPath, string elementName, CXmlReader xmlReader, bool buttonText)
{
string item = xmlPath + "/" + elementName;
- _ThemeLoaded = true;
+ ThemeLoaded = true;
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/X", ref _Theme.X);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Y", ref _Theme.Y);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/X", ref _Theme.X);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Y", ref _Theme.Y);
if (!buttonText)
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Z", ref _Theme.Z);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Z", ref _Theme.Z);
xmlReader.TryGetFloatValue(item + "/MaxW", ref _Theme.MaxWidth);
if (xmlReader.GetValue(item + "/Color", out _Theme.Color.Name, String.Empty))
- _ThemeLoaded &= _Theme.Color.Get(_PartyModeID, out Color);
+ ThemeLoaded &= _Theme.Color.Get(_PartyModeID, out Color);
else
{
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/R", ref Color.R);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/G", ref Color.G);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/B", ref Color.B);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/A", ref Color.A);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/R", ref Color.R);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/G", ref Color.G);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/B", ref Color.B);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/A", ref Color.A);
}
if (xmlReader.GetValue(item + "/SColor", out _Theme.SelColor.Name, String.Empty))
- _ThemeLoaded &= _Theme.SelColor.Get(_PartyModeID, out SelColor);
+ ThemeLoaded &= _Theme.SelColor.Get(_PartyModeID, out SelColor);
else
{
if (xmlReader.TryGetFloatValue(item + "/SR", ref SelColor.R))
{
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SG", ref SelColor.G);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SB", ref SelColor.B);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SA", ref SelColor.A);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SG", ref SelColor.G);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SB", ref SelColor.B);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SA", ref SelColor.A);
}
}
- _ThemeLoaded &= xmlReader.TryGetEnumValue(item + "/Align", ref _Align);
+ ThemeLoaded &= xmlReader.TryGetEnumValue(item + "/Align", ref _Align);
xmlReader.TryGetEnumValue(item + "/ResizeAlign", ref _ResizeAlign);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/H", ref _Theme.FontHeight);
- _ThemeLoaded &= xmlReader.TryGetEnumValue(item + "/Style", ref _Theme.FontStyle);
- _ThemeLoaded &= xmlReader.GetValue(item + "/Font", out _Theme.FontFamily);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/H", ref _Theme.FontHeight);
+ ThemeLoaded &= xmlReader.TryGetEnumValue(item + "/Style", ref _Theme.FontStyle);
+ ThemeLoaded &= xmlReader.GetValue(item + "/Font", out _Theme.FontFamily);
- _ThemeLoaded &= xmlReader.GetValue(item + "/Text", out _Theme.Text);
+ ThemeLoaded &= xmlReader.GetValue(item + "/Text", out _Theme.Text);
if (xmlReader.ItemExists(item + "/Reflection") && !buttonText)
{
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Reflection/Space", ref _ReflectionSpace);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Reflection/Height", ref _ReflectionHeight);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Reflection/Space", ref _ReflectionSpace);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/Reflection/Height", ref _ReflectionHeight);
_Theme.Reflection = new SReflection(_ReflectionHeight, _ReflectionSpace);
}
else
@@ -366,9 +362,9 @@ namespace VocaluxeLib.Menu
_ButtonText = buttonText;
_PositionNeedsUpdate = true;
- if (_ThemeLoaded)
+ if (ThemeLoaded)
LoadSkin();
- return _ThemeLoaded;
+ return ThemeLoaded;
}
public void Draw()
@@ -436,6 +432,8 @@ namespace VocaluxeLib.Menu
public void LoadSkin()
{
+ if (!ThemeLoaded)
+ return;
_Theme.Color.Get(_PartyModeID, out Color);
_Theme.SelColor.Get(_PartyModeID, out SelColor);
@@ -457,8 +455,6 @@ namespace VocaluxeLib.Menu
Text = _Theme.Text;
Selected = false;
-
- _ThemeLoaded = true;
}
public void ReloadSkin()
@@ -467,7 +463,7 @@ namespace VocaluxeLib.Menu
LoadSkin();
}
- public SThemeText GetTheme()
+ public object GetTheme()
{
return _Theme;
}
diff --git a/VocaluxeLib/Menu/IThemeable.cs b/VocaluxeLib/Menu/IThemeable.cs
index 2de6599a..8576904d 100644
--- a/VocaluxeLib/Menu/IThemeable.cs
+++ b/VocaluxeLib/Menu/IThemeable.cs
@@ -22,6 +22,8 @@ namespace VocaluxeLib.Menu
public interface IThemeable
{
string GetThemeName();
+ object GetTheme();
+ bool ThemeLoaded { get; }
bool LoadTheme(string xmlPath, string elementName, CXmlReader xmlReader);
diff --git a/VocaluxeLib/Menu/SingNotes/CSingNotes.cs b/VocaluxeLib/Menu/SingNotes/CSingNotes.cs
index 0b6555b3..4d072af0 100644
--- a/VocaluxeLib/Menu/SingNotes/CSingNotes.cs
+++ b/VocaluxeLib/Menu/SingNotes/CSingNotes.cs
@@ -53,7 +53,6 @@ namespace VocaluxeLib.Menu.SingNotes
{
private readonly int _PartyModeID;
private SThemeSingBar _Theme;
- private bool _ThemeLoaded;
public readonly List PlayerNotes = new List();
@@ -74,7 +73,7 @@ namespace VocaluxeLib.Menu.SingNotes
{
_PartyModeID = partyModeID;
_Theme = new SThemeSingBar {BarPos = new SBarPosition[CHelper.Sum(CBase.Settings.GetMaxNumPlayer())]};
- _ThemeLoaded = false;
+ ThemeLoaded = false;
}
public CSingNotes(SThemeSingBar theme, int partyModeID)
@@ -84,7 +83,7 @@ namespace VocaluxeLib.Menu.SingNotes
_BarPos = new SRectF[CBase.Settings.GetMaxNumPlayer(),CBase.Settings.GetMaxNumPlayer()];
- LoadSkin();
+ ThemeLoaded = true;
}
public string GetThemeName()
@@ -92,27 +91,24 @@ namespace VocaluxeLib.Menu.SingNotes
return _Theme.Name;
}
- public bool ThemeLoaded
- {
- get { return _ThemeLoaded; }
- }
+ public bool ThemeLoaded { get; private set; }
public bool LoadTheme(string xmlPath, string elementName, CXmlReader xmlReader)
{
string item = xmlPath + "/" + elementName;
- _ThemeLoaded = true;
+ ThemeLoaded = true;
- _ThemeLoaded &= xmlReader.GetValue(item + "/SkinLeft", out _Theme.SkinLeft, String.Empty);
- _ThemeLoaded &= xmlReader.GetValue(item + "/SkinMiddle", out _Theme.SkinMiddle, String.Empty);
- _ThemeLoaded &= xmlReader.GetValue(item + "/SkinRight", out _Theme.SkinRight, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/SkinLeft", out _Theme.SkinLeft, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/SkinMiddle", out _Theme.SkinMiddle, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/SkinRight", out _Theme.SkinRight, String.Empty);
- _ThemeLoaded &= xmlReader.GetValue(item + "/SkinBackgroundLeft", out _Theme.SkinBackgroundLeft, String.Empty);
- _ThemeLoaded &= xmlReader.GetValue(item + "/SkinBackgroundMiddle", out _Theme.SkinBackgroundMiddle, String.Empty);
- _ThemeLoaded &= xmlReader.GetValue(item + "/SkinBackgroundRight", out _Theme.SkinBackgroundRight, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/SkinBackgroundLeft", out _Theme.SkinBackgroundLeft, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/SkinBackgroundMiddle", out _Theme.SkinBackgroundMiddle, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/SkinBackgroundRight", out _Theme.SkinBackgroundRight, String.Empty);
- _ThemeLoaded &= xmlReader.GetValue(item + "/SkinGoldenStar", out _Theme.SkinGoldenStar, String.Empty);
- _ThemeLoaded &= xmlReader.GetValue(item + "/SkinToneHelper", out _Theme.SkinToneHelper, String.Empty);
- _ThemeLoaded &= xmlReader.GetValue(item + "/SkinPerfectNoteStar", out _Theme.SkinPerfectNoteStart, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/SkinGoldenStar", out _Theme.SkinGoldenStar, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/SkinToneHelper", out _Theme.SkinToneHelper, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/SkinPerfectNoteStar", out _Theme.SkinPerfectNoteStart, String.Empty);
int i = 0;
_BarPos = new SRectF[CBase.Settings.GetMaxNumPlayer(),CBase.Settings.GetMaxNumPlayer()];
@@ -122,24 +118,24 @@ namespace VocaluxeLib.Menu.SingNotes
{
_BarPos[player, numplayer] = new SRectF();
string target = "/BarPositions/P" + (player + 1) + "N" + (numplayer + 1);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + target + "X", ref _BarPos[player, numplayer].X);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + target + "Y", ref _BarPos[player, numplayer].Y);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + target + "Z", ref _BarPos[player, numplayer].Z);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + target + "W", ref _BarPos[player, numplayer].W);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + target + "H", ref _BarPos[player, numplayer].H);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + target + "X", ref _BarPos[player, numplayer].X);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + target + "Y", ref _BarPos[player, numplayer].Y);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + target + "Z", ref _BarPos[player, numplayer].Z);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + target + "W", ref _BarPos[player, numplayer].W);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + target + "H", ref _BarPos[player, numplayer].H);
_Theme.BarPos[i].Name = "P" + (player + 1) + "N" + (numplayer + 1);
_Theme.BarPos[i].Rect = _BarPos[player, numplayer];
i++;
}
}
- if (_ThemeLoaded)
+ if (ThemeLoaded)
{
_Theme.Name = elementName;
LoadSkin();
}
- return _ThemeLoaded;
+ return ThemeLoaded;
}
public void Init(int numPlayers)
@@ -174,7 +170,7 @@ namespace VocaluxeLib.Menu.SingNotes
LoadSkin();
}
- public SThemeSingBar GetTheme()
+ public object GetTheme()
{
return _Theme;
}
diff --git a/VocaluxeLib/Menu/SongMenu/CSongMenuFactory.cs b/VocaluxeLib/Menu/SongMenu/CSongMenuFactory.cs
index faa523a5..e512721d 100644
--- a/VocaluxeLib/Menu/SongMenu/CSongMenuFactory.cs
+++ b/VocaluxeLib/Menu/SongMenu/CSongMenuFactory.cs
@@ -21,7 +21,7 @@ namespace VocaluxeLib.Menu.SongMenu
{
public static class CSongMenuFactory
{
- public static ISongMenu GetSongMenu(SThemeSongMenu theme, int partyModeID)
+ public static ISongMenu CreateSongMenu(SThemeSongMenu theme, int partyModeID)
{
switch (CBase.Config.GetSongMenuType())
{
@@ -47,7 +47,7 @@ namespace VocaluxeLib.Menu.SongMenu
///
///
///
- public static ISongMenu GetSongMenu(int partyModeID)
+ public static ISongMenu CreateSongMenu(int partyModeID)
{
switch (CBase.Config.GetSongMenuType())
{
diff --git a/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs b/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs
index 9ad43614..d3668346 100644
--- a/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs
+++ b/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs
@@ -94,12 +94,8 @@ namespace VocaluxeLib.Menu.SongMenu
{
protected readonly int _PartyModeID;
protected SThemeSongMenu _Theme;
- private bool _ThemeLoaded;
- public bool ThemeLoaded
- {
- get { return _ThemeLoaded; }
- }
+ public bool ThemeLoaded { get; private set; }
public bool Selectable
{
@@ -160,7 +156,7 @@ namespace VocaluxeLib.Menu.SongMenu
_PartyModeID = partyModeID;
_Theme = theme;
- LoadSkin();
+ ThemeLoaded = true;
}
#region Theme
@@ -169,7 +165,7 @@ namespace VocaluxeLib.Menu.SongMenu
return _Theme.Name;
}
- public SThemeSongMenu GetTheme()
+ public virtual object GetTheme()
{
return _Theme;
}
@@ -177,49 +173,49 @@ namespace VocaluxeLib.Menu.SongMenu
public virtual bool LoadTheme(string xmlPath, string elementName, CXmlReader xmlReader)
{
string item = xmlPath + "/" + elementName;
- _ThemeLoaded = true;
+ ThemeLoaded = true;
- _ThemeLoaded &= xmlReader.GetValue(item + "/CoverBackground", out _Theme.CoverBackground, String.Empty);
- _ThemeLoaded &= xmlReader.GetValue(item + "/CoverBigBackground", out _Theme.CoverBigBackground, String.Empty);
- _ThemeLoaded &= xmlReader.GetValue(item + "/DuetIcon", out _Theme.DuetIcon, String.Empty);
- _ThemeLoaded &= xmlReader.GetValue(item + "/VideoIcon", out _Theme.VideoIcon, String.Empty);
- _ThemeLoaded &= xmlReader.GetValue(item + "/MedleyCalcIcon", out _Theme.MedleyCalcIcon, String.Empty);
- _ThemeLoaded &= xmlReader.GetValue(item + "/MedleyTagIcon", out _Theme.MedleyTagIcon, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/CoverBackground", out _Theme.CoverBackground, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/CoverBigBackground", out _Theme.CoverBigBackground, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/DuetIcon", out _Theme.DuetIcon, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/VideoIcon", out _Theme.VideoIcon, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/MedleyCalcIcon", out _Theme.MedleyCalcIcon, String.Empty);
+ ThemeLoaded &= xmlReader.GetValue(item + "/MedleyTagIcon", out _Theme.MedleyTagIcon, String.Empty);
if (xmlReader.GetValue(item + "/Color", out _Theme.Color.Name, String.Empty))
- _ThemeLoaded &= _Theme.Color.Get(_PartyModeID, out _ColorInternal);
+ ThemeLoaded &= _Theme.Color.Get(_PartyModeID, out _ColorInternal);
else
{
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/R", ref _ColorInternal.R);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/G", ref _ColorInternal.G);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/B", ref _ColorInternal.B);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/A", ref _ColorInternal.A);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/R", ref _ColorInternal.R);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/G", ref _ColorInternal.G);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/B", ref _ColorInternal.B);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/A", ref _ColorInternal.A);
}
_Theme.Color.Color = _ColorInternal;
#region SongMenuTileBoard
- _ThemeLoaded &= xmlReader.TryGetIntValue(item + "/SongMenuTileBoard/NumW", ref _Theme.SongMenuTileBoard.NumW);
- _ThemeLoaded &= xmlReader.TryGetIntValue(item + "/SongMenuTileBoard/NumH", ref _Theme.SongMenuTileBoard.NumH);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SongMenuTileBoard/SpaceW", ref _Theme.SongMenuTileBoard.SpaceW);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SongMenuTileBoard/SpaceH", ref _Theme.SongMenuTileBoard.SpaceH);
+ ThemeLoaded &= xmlReader.TryGetIntValue(item + "/SongMenuTileBoard/NumW", ref _Theme.SongMenuTileBoard.NumW);
+ ThemeLoaded &= xmlReader.TryGetIntValue(item + "/SongMenuTileBoard/NumH", ref _Theme.SongMenuTileBoard.NumH);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SongMenuTileBoard/SpaceW", ref _Theme.SongMenuTileBoard.SpaceW);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SongMenuTileBoard/SpaceH", ref _Theme.SongMenuTileBoard.SpaceH);
- _ThemeLoaded &= xmlReader.TryGetIntValue(item + "/SongMenuTileBoard/NumWsmall", ref _Theme.SongMenuTileBoard.NumWsmall);
- _ThemeLoaded &= xmlReader.TryGetIntValue(item + "/SongMenuTileBoard/NumHsmall", ref _Theme.SongMenuTileBoard.NumHsmall);
+ ThemeLoaded &= xmlReader.TryGetIntValue(item + "/SongMenuTileBoard/NumWsmall", ref _Theme.SongMenuTileBoard.NumWsmall);
+ ThemeLoaded &= xmlReader.TryGetIntValue(item + "/SongMenuTileBoard/NumHsmall", ref _Theme.SongMenuTileBoard.NumHsmall);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SongMenuTileBoard/TileRectX", ref _Theme.SongMenuTileBoard.TileRect.X);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SongMenuTileBoard/TileRectY", ref _Theme.SongMenuTileBoard.TileRect.Y);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SongMenuTileBoard/TileRectZ", ref _Theme.SongMenuTileBoard.TileRect.Z);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SongMenuTileBoard/TileRectW", ref _Theme.SongMenuTileBoard.TileRect.W);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SongMenuTileBoard/TileRectH", ref _Theme.SongMenuTileBoard.TileRect.H);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SongMenuTileBoard/TileRectX", ref _Theme.SongMenuTileBoard.TileRect.X);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SongMenuTileBoard/TileRectY", ref _Theme.SongMenuTileBoard.TileRect.Y);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SongMenuTileBoard/TileRectZ", ref _Theme.SongMenuTileBoard.TileRect.Z);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SongMenuTileBoard/TileRectW", ref _Theme.SongMenuTileBoard.TileRect.W);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SongMenuTileBoard/TileRectH", ref _Theme.SongMenuTileBoard.TileRect.H);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SongMenuTileBoard/TileRectSmallX", ref _Theme.SongMenuTileBoard.TileRectSmall.X);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SongMenuTileBoard/TileRectSmallY", ref _Theme.SongMenuTileBoard.TileRectSmall.Y);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SongMenuTileBoard/TileRectSmallZ", ref _Theme.SongMenuTileBoard.TileRectSmall.Z);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SongMenuTileBoard/TileRectSmallW", ref _Theme.SongMenuTileBoard.TileRectSmall.W);
- _ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SongMenuTileBoard/TileRectSmallH", ref _Theme.SongMenuTileBoard.TileRectSmall.H);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SongMenuTileBoard/TileRectSmallX", ref _Theme.SongMenuTileBoard.TileRectSmall.X);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SongMenuTileBoard/TileRectSmallY", ref _Theme.SongMenuTileBoard.TileRectSmall.Y);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SongMenuTileBoard/TileRectSmallZ", ref _Theme.SongMenuTileBoard.TileRectSmall.Z);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SongMenuTileBoard/TileRectSmallW", ref _Theme.SongMenuTileBoard.TileRectSmall.W);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + "/SongMenuTileBoard/TileRectSmallH", ref _Theme.SongMenuTileBoard.TileRectSmall.H);
#endregion SongMenuTileBoard
- if (_ThemeLoaded)
+ if (ThemeLoaded)
{
_Theme.Name = elementName;
@@ -227,7 +223,7 @@ namespace VocaluxeLib.Menu.SongMenu
Init();
}
- return _ThemeLoaded;
+ return ThemeLoaded;
}
#endregion Theme
diff --git a/VocaluxeLib/Menu/SongMenu/CSongMenuTileBoard.cs b/VocaluxeLib/Menu/SongMenu/CSongMenuTileBoard.cs
index eabca5e4..99469947 100644
--- a/VocaluxeLib/Menu/SongMenu/CSongMenuTileBoard.cs
+++ b/VocaluxeLib/Menu/SongMenu/CSongMenuTileBoard.cs
@@ -59,6 +59,8 @@ namespace VocaluxeLib.Menu.SongMenu
private bool _MouseWasInRect;
+ private readonly List _SubElements = new List();
+
public override float SelectedTileZoomFactor
{
get { return 1.2f; }
@@ -77,15 +79,6 @@ namespace VocaluxeLib.Menu.SongMenu
}
}
- private void _UpdateTileSelection()
- {
- foreach (CStatic tile in _Tiles)
- tile.Selected = false;
- int tileNr = _SelectionNr - _Offset;
- if (tileNr >= 0 && tileNr < _Tiles.Count)
- _Tiles[tileNr].Selected = true;
- }
-
public override bool SmallView
{
set
@@ -99,12 +92,6 @@ namespace VocaluxeLib.Menu.SongMenu
}
}
- public CSongMenuTileBoard(int partyModeID)
- : base(partyModeID) {}
-
- public CSongMenuTileBoard(SThemeSongMenu theme, int partyModeID)
- : base(theme, partyModeID) {}
-
protected override int _PreviewNr
{
set
@@ -120,6 +107,31 @@ namespace VocaluxeLib.Menu.SongMenu
}
}
+ public CSongMenuTileBoard(int partyModeID) : base(partyModeID) {}
+
+ public CSongMenuTileBoard(SThemeSongMenu theme, int partyModeID) : base(theme, partyModeID)
+ {
+ _Artist = new CText(_Theme.SongMenuTileBoard.TextArtist, _PartyModeID);
+ _Title = new CText(_Theme.SongMenuTileBoard.TextTitle, _PartyModeID);
+ _SongLength = new CText(_Theme.SongMenuTileBoard.TextSongLength, _PartyModeID);
+ _CoverBig = new CStatic(_Theme.SongMenuTileBoard.StaticCoverBig, _PartyModeID);
+ _TextBG = new CStatic(_Theme.SongMenuTileBoard.StaticTextBG, _PartyModeID);
+ _DuetIcon = new CStatic(_Theme.SongMenuTileBoard.StaticDuetIcon, _PartyModeID);
+ _VideoIcon = new CStatic(_Theme.SongMenuTileBoard.StaticVideoIcon, _PartyModeID);
+ _MedleyCalcIcon = new CStatic(_Theme.SongMenuTileBoard.StaticMedleyCalcIcon, _PartyModeID);
+ _MedleyTagIcon = new CStatic(_Theme.SongMenuTileBoard.StaticMedleyTagIcon, _PartyModeID);
+ _SubElements.AddRange(new IMenuElement[] {_Artist, _Title, _SongLength, _DuetIcon, _VideoIcon, _MedleyCalcIcon, _MedleyTagIcon});
+ }
+
+ private void _UpdateTileSelection()
+ {
+ foreach (CStatic tile in _Tiles)
+ tile.Selected = false;
+ int tileNr = _SelectionNr - _Offset;
+ if (tileNr >= 0 && tileNr < _Tiles.Count)
+ _Tiles[tileNr].Selected = true;
+ }
+
public override bool LoadTheme(string xmlPath, string elementName, CXmlReader xmlReader)
{
string item = xmlPath + "/" + elementName;
@@ -143,16 +155,9 @@ namespace VocaluxeLib.Menu.SongMenu
{
_Theme.Name = elementName;
- _Theme.SongMenuTileBoard.TextArtist = _Artist.GetTheme();
- _Theme.SongMenuTileBoard.TextSongLength = _SongLength.GetTheme();
- _Theme.SongMenuTileBoard.TextTitle = _Title.GetTheme();
- _Theme.SongMenuTileBoard.StaticCoverBig = _CoverBig.GetTheme();
- _Theme.SongMenuTileBoard.StaticDuetIcon = _DuetIcon.GetTheme();
- _Theme.SongMenuTileBoard.StaticMedleyCalcIcon = _MedleyCalcIcon.GetTheme();
- _Theme.SongMenuTileBoard.StaticMedleyTagIcon = _MedleyTagIcon.GetTheme();
- _Theme.SongMenuTileBoard.StaticTextBG = _TextBG.GetTheme();
- _Theme.SongMenuTileBoard.StaticVideoIcon = _VideoIcon.GetTheme();
-
+ _ReadSubTheme();
+ _SubElements.Clear();
+ _SubElements.AddRange(new IMenuElement[] {_Artist, _Title, _SongLength, _DuetIcon, _VideoIcon, _MedleyCalcIcon, _MedleyTagIcon});
LoadSkin();
Init();
}
@@ -160,6 +165,25 @@ namespace VocaluxeLib.Menu.SongMenu
return themeLoaded;
}
+ private void _ReadSubTheme()
+ {
+ _Theme.SongMenuTileBoard.TextArtist = (SThemeText)_Artist.GetTheme();
+ _Theme.SongMenuTileBoard.TextSongLength = (SThemeText)_SongLength.GetTheme();
+ _Theme.SongMenuTileBoard.TextTitle = (SThemeText)_Title.GetTheme();
+ _Theme.SongMenuTileBoard.StaticCoverBig = (SThemeStatic)_CoverBig.GetTheme();
+ _Theme.SongMenuTileBoard.StaticDuetIcon = (SThemeStatic)_DuetIcon.GetTheme();
+ _Theme.SongMenuTileBoard.StaticMedleyCalcIcon = (SThemeStatic)_MedleyCalcIcon.GetTheme();
+ _Theme.SongMenuTileBoard.StaticMedleyTagIcon = (SThemeStatic)_MedleyTagIcon.GetTheme();
+ _Theme.SongMenuTileBoard.StaticTextBG = (SThemeStatic)_TextBG.GetTheme();
+ _Theme.SongMenuTileBoard.StaticVideoIcon = (SThemeStatic)_VideoIcon.GetTheme();
+ }
+
+ public override object GetTheme()
+ {
+ _ReadSubTheme();
+ return base.GetTheme();
+ }
+
public override void Init()
{
base.Init();
@@ -504,14 +528,8 @@ namespace VocaluxeLib.Menu.SongMenu
else
_CoverBig.Draw(EAspect.Crop);
-
- _Artist.Draw();
- _Title.Draw();
- _SongLength.Draw();
- _DuetIcon.Draw();
- _VideoIcon.Draw();
- _MedleyCalcIcon.Draw();
- _MedleyTagIcon.Draw();
+ foreach (IMenuElement element in _SubElements)
+ element.Draw();
}
public override CStatic GetSelectedSongCover()
@@ -611,16 +629,11 @@ namespace VocaluxeLib.Menu.SongMenu
public override void LoadSkin()
{
base.LoadSkin();
-
- _Artist = new CText(_Theme.SongMenuTileBoard.TextArtist, _PartyModeID);
- _Title = new CText(_Theme.SongMenuTileBoard.TextTitle, _PartyModeID);
- _SongLength = new CText(_Theme.SongMenuTileBoard.TextSongLength, _PartyModeID);
- _CoverBig = new CStatic(_Theme.SongMenuTileBoard.StaticCoverBig, _PartyModeID);
- _TextBG = new CStatic(_Theme.SongMenuTileBoard.StaticTextBG, _PartyModeID);
- _DuetIcon = new CStatic(_Theme.SongMenuTileBoard.StaticDuetIcon, _PartyModeID);
- _VideoIcon = new CStatic(_Theme.SongMenuTileBoard.StaticVideoIcon, _PartyModeID);
- _MedleyCalcIcon = new CStatic(_Theme.SongMenuTileBoard.StaticMedleyCalcIcon, _PartyModeID);
- _MedleyTagIcon = new CStatic(_Theme.SongMenuTileBoard.StaticMedleyTagIcon, _PartyModeID);
+ foreach (IThemeable themeable in _SubElements.OfType())
+ themeable.LoadSkin();
+ // Those are drawn seperately so they are not in the above list
+ _CoverBig.LoadSkin();
+ _TextBG.LoadSkin();
Init();
}
diff --git a/VocaluxeLib/Menu/SongMenu/ISongMenu.cs b/VocaluxeLib/Menu/SongMenu/ISongMenu.cs
index 7c688afc..5d15a6a4 100644
--- a/VocaluxeLib/Menu/SongMenu/ISongMenu.cs
+++ b/VocaluxeLib/Menu/SongMenu/ISongMenu.cs
@@ -45,8 +45,5 @@ namespace VocaluxeLib.Menu.SongMenu
int GetPreviewSong();
bool SmallView { get; set; }
-
- bool ThemeLoaded { get; }
- SThemeSongMenu GetTheme();
}
}
\ No newline at end of file
diff --git a/VocaluxeLib/PartyModes/CPartyMode.cs b/VocaluxeLib/PartyModes/CPartyMode.cs
index 139dce23..14192af7 100644
--- a/VocaluxeLib/PartyModes/CPartyMode.cs
+++ b/VocaluxeLib/PartyModes/CPartyMode.cs
@@ -23,17 +23,22 @@ namespace VocaluxeLib.PartyModes
public abstract class CPartyMode : IPartyMode
{
private readonly string _Folder;
- public int ID { get; private set; }
+ private readonly int _ID;
protected SScreenSongOptions _ScreenSongOptions = new SScreenSongOptions {Selection = new SSelectionOptions(), Sorting = new SSortingOptions()};
protected readonly Dictionary _Screens = new Dictionary();
protected CPartyMode(int id, string folder)
{
- ID = id;
+ _ID = id;
_Folder = folder;
}
#region Implementation
+ public int ID
+ {
+ get { return _ID; }
+ }
+
public abstract bool Init();
public void LoadTheme()
diff --git a/VocaluxeLib/PartyModes/CPartyModeNone.cs b/VocaluxeLib/PartyModes/CPartyModeNone.cs
index 28a6082c..c3e3ea6a 100644
--- a/VocaluxeLib/PartyModes/CPartyModeNone.cs
+++ b/VocaluxeLib/PartyModes/CPartyModeNone.cs
@@ -23,8 +23,7 @@ namespace VocaluxeLib.PartyModes
public class CPartyModeNone : CPartyMode
{
//just a dummy for normal game mode
- public CPartyModeNone(int id, string folder)
- : base(id, folder)
+ public CPartyModeNone(int id, string folder) : base(id, folder)
{
_ScreenSongOptions.Selection.RandomOnly = false;
_ScreenSongOptions.Selection.PartyMode = false;
diff --git a/VocaluxeLib/Songs/CSongLoader.cs b/VocaluxeLib/Songs/CSongLoader.cs
index 14793541..0539a00e 100644
--- a/VocaluxeLib/Songs/CSongLoader.cs
+++ b/VocaluxeLib/Songs/CSongLoader.cs
@@ -416,7 +416,9 @@ namespace VocaluxeLib.Songs
{
//PreviewStart is not set or <=0
_Song.Preview.StartTime = (headerFlags & EHeaderFlags.MedleyStartBeat) != 0 ? CBase.Game.GetTimeFromBeats(_Song.Medley.StartBeat, _Song.BPM) : 0f;
+ // ReSharper disable CompareOfFloatsByEqualityOperator
_Song.Preview.Source = _Song.Preview.StartTime == 0 ? EDataSource.None : EDataSource.Calculated;
+ // ReSharper restore CompareOfFloatsByEqualityOperator
}
if ((headerFlags & EHeaderFlags.MedleyStartBeat) != 0 && (headerFlags & EHeaderFlags.MedleyEndBeat) != 0)
diff --git a/VocaluxeTests/Properties/AssemblyInfo.cs b/VocaluxeTests/Properties/AssemblyInfo.cs
index 5f2bcc95..6001c0da 100644
--- a/VocaluxeTests/Properties/AssemblyInfo.cs
+++ b/VocaluxeTests/Properties/AssemblyInfo.cs
@@ -1,10 +1,10 @@
using System.Reflection;
-using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// Allgemeine Informationen über eine Assembly werden über folgende
// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
// die einer Assembly zugeordnet sind.
+
[assembly: AssemblyTitle("VocaluxeTests")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
@@ -17,9 +17,11 @@ using System.Runtime.InteropServices;
// Wenn ComVisible auf "false" festgelegt wird, sind die Typen innerhalb dieser Assembly
// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von
// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen.
+
[assembly: ComVisible(false)]
// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
+
[assembly: Guid("3bdc6da5-a651-452e-903c-deec310288ad")]
// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
@@ -32,5 +34,6 @@ using System.Runtime.InteropServices;
// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
// durch Einsatz von '*', wie in nachfolgendem Beispiel:
// [Assembly: AssemblyVersion("1.0.*")]
+
[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
\ No newline at end of file
diff --git a/WebserverInitalConfig/HttpApi.cs b/WebserverInitalConfig/HttpApi.cs
index 6473afea..5d62b305 100644
--- a/WebserverInitalConfig/HttpApi.cs
+++ b/WebserverInitalConfig/HttpApi.cs
@@ -498,8 +498,7 @@ namespace WebserverInitalConfig
{
if (String.IsNullOrEmpty(networkURL))
throw new ArgumentNullException("networkURL");
- HTTP_SERVICE_CONFIG_URLACL_SET res = new HTTP_SERVICE_CONFIG_URLACL_SET();
- res.KeyDesc = new HTTP_SERVICE_CONFIG_URLACL_KEY("");
+ HTTP_SERVICE_CONFIG_URLACL_SET res = new HTTP_SERVICE_CONFIG_URLACL_SET {KeyDesc = new HTTP_SERVICE_CONFIG_URLACL_KEY("")};
CallHttpApi(
delegate
{
@@ -539,9 +538,7 @@ namespace WebserverInitalConfig
ThrowWin32ExceptionIfError(retVal);
res = (HTTP_SERVICE_CONFIG_URLACL_SET)Marshal.PtrToStructure(pOutputConfigInfo, typeof(HTTP_SERVICE_CONFIG_URLACL_SET));
}
- else if (ERROR_FILE_NOT_FOUND == retVal)
- return;
- else
+ else if (ERROR_FILE_NOT_FOUND != retVal)
ThrowWin32ExceptionIfError(retVal);
}
finally
@@ -604,9 +601,7 @@ namespace WebserverInitalConfig
HTTP_SERVICE_CONFIG_URLACL_KEY keyDesc = new HTTP_SERVICE_CONFIG_URLACL_KEY(networkURL);
HTTP_SERVICE_CONFIG_URLACL_PARAM paramDesc = new HTTP_SERVICE_CONFIG_URLACL_PARAM(securityDescriptor);
- HTTP_SERVICE_CONFIG_URLACL_SET inputConfigInfoSet = new HTTP_SERVICE_CONFIG_URLACL_SET();
- inputConfigInfoSet.KeyDesc = keyDesc;
- inputConfigInfoSet.ParamDesc = paramDesc;
+ HTTP_SERVICE_CONFIG_URLACL_SET inputConfigInfoSet = new HTTP_SERVICE_CONFIG_URLACL_SET {KeyDesc = keyDesc, ParamDesc = paramDesc};
IntPtr pInputConfigInfo = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(HTTP_SERVICE_CONFIG_URLACL_SET)));
Marshal.StructureToPtr(inputConfigInfoSet, pInputConfigInfo, false);