Merge branch 'release-0.3' into develop

Conflicts:
	Vocaluxe/Base/CConfig.cs
	Vocaluxe/Lib/Playlist/CPlaylistFile.cs
	Vocaluxe/Screens/CScreenSong.cs
	VocaluxeLib/CHelper.cs
	VocaluxeLib/Menu/CMenu.cs
	VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs
	VocaluxeLib/Menu/SongMenu/CSongMenuTileBoard.cs
This commit is contained in:
Flamefire committed 2013-10-19 00:42:56 +02:00
commit 73e4a9fa74
15 files changed
+240 -272

No files matched your search

+2
View File
@@ -140,6 +140,8 @@ namespace VocaluxeLib
{
var files = new List<string>();
var dir = new DirectoryInfo(path);
if (!dir.Exists)
return files;
try
{
+8 -1
View File
@@ -19,6 +19,7 @@ using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Drawing;
using System.Xml;
using VocaluxeLib.Draw;
using VocaluxeLib.Game;
using VocaluxeLib.Menu;
@@ -54,6 +55,11 @@ namespace VocaluxeLib
bool IsMicConfigured(int playerNr);
int GetMaxNumMics();
/// <summary>
/// Get the uniform settings for writing XML files. ALWAYS use this!
/// </summary>
XmlWriterSettings GetXMLSettings();
}
public interface ISettings
@@ -207,7 +213,8 @@ namespace VocaluxeLib
int GetNumSongs();
int GetNumSongsVisible();
int GetNumCategories();
int NumSongsInCategory(int categoryIndex);
int GetNumSongsInCategory(int categoryIndex);
int GetNumSongsNotSungInCategory(int categoryIndex);
bool IsInCategory();
int GetCurrentCategoryIndex();
+1 -2
View File
@@ -196,10 +196,9 @@ namespace VocaluxeLib.Menu
if (_ThemePath == "")
return;
var settings = new XmlWriterSettings {Indent = true, Encoding = Encoding.UTF8, ConformanceLevel = ConformanceLevel.Document};
string file = Path.Combine(_ThemePath, ThemeName + ".xml");
using (XmlWriter writer = XmlWriter.Create(file, settings))
using (XmlWriter writer = XmlWriter.Create(file, CBase.Config.GetXMLSettings()))
{
writer.WriteStartDocument();
writer.WriteStartElement("root");
@@ -99,7 +99,6 @@ namespace VocaluxeLib.Menu.SongMenu
protected SThemeSongMenu _Theme;
private bool _ThemeLoaded;
private readonly Stopwatch _Timer = new Stopwatch();
private readonly Stopwatch _VideoFadeTimer = new Stopwatch();
private readonly List<int> _Streams = new List<int>();
private int _ActSongId = -1;
@@ -113,64 +112,13 @@ namespace VocaluxeLib.Menu.SongMenu
protected SRectF _Rect;
protected SColorF _Color;
private int _SelectedInternal = -1;
private int _SelectedPending = -1;
protected long _PendingTime = 500L;
private int _LockedInternal = -1;
protected bool _Active;
protected float _MaxVolume = 100f;
protected int _PreviewSelected
{
//for preview only
get
{
if ((_SelectedInternal != _SelectedPending) && (_Timer.ElapsedMilliseconds >= _PendingTime))
{
_Timer.Stop();
_Timer.Reset();
_SelectedInternal = _SelectedPending;
}
return _SelectedInternal;
}
set
{
if (value == -1)
{
_Timer.Stop();
_Timer.Reset();
_SelectedInternal = -1;
_SelectedPending = -1;
return;
}
if ((value != _SelectedInternal) && (value != _SelectedPending))
{
_Timer.Reset();
_Timer.Start();
_SelectedPending = value;
}
if ((value == _SelectedPending) && ((_Timer.ElapsedMilliseconds >= _PendingTime) || (_SelectedInternal == -1)))
{
_Timer.Stop();
_Timer.Reset();
_SelectedInternal = _SelectedPending;
}
}
}
protected void _SetSelectedNow()
{
_Timer.Stop();
_Timer.Reset();
_SelectedInternal = _SelectedPending;
}
protected virtual int _PreviewId { get; set; }
private int _LockedInternal = -1;
protected int _Locked
{
//the real selected song for singing
@@ -435,8 +383,8 @@ namespace VocaluxeLib.Menu.SongMenu
if (!_Initialized)
return;
if (_ActSongId != _PreviewSelected)
_SelectSong(_PreviewSelected);
if (_ActSongId != _PreviewId)
_SelectSong(_PreviewId);
if (_Streams.Count <= 0 || _Video == -1)
return;
@@ -475,18 +423,7 @@ namespace VocaluxeLib.Menu.SongMenu
public virtual void OnHide()
{
foreach (int stream in _Streams)
CBase.Sound.FadeAndStop(stream, 0f, 0.75f);
_Streams.Clear();
CBase.Video.Close(_Video);
_Video = -1;
CBase.Drawing.RemoveTexture(ref _Vidtex);
_Timer.Stop();
_Timer.Reset();
_SelectedInternal = _SelectedPending;
_Reset();
}
public virtual void HandleInput(ref SKeyEvent keyEvent, SScreenSongOptions songOptions) {}
@@ -571,9 +508,9 @@ namespace VocaluxeLib.Menu.SongMenu
{
if (!_Initialized)
return false;
if (CBase.Songs.IsInCategory() || _PreviewSelected < 0 || _PreviewSelected >= CBase.Songs.GetNumCategories())
if (CBase.Songs.IsInCategory() || _PreviewId < 0 || _PreviewId >= CBase.Songs.GetNumCategories())
return false;
_EnterCategory(_PreviewSelected);
_EnterCategory(_PreviewId);
return true;
}
@@ -665,10 +602,6 @@ namespace VocaluxeLib.Menu.SongMenu
_Video = -1;
CBase.Drawing.RemoveTexture(ref _Vidtex);
_Timer.Stop();
_Timer.Reset();
_SelectedInternal = _SelectedPending;
}
#region ThemeEdit
+108 -107
View File
@@ -61,6 +61,15 @@ namespace VocaluxeLib.Menu.SongMenu
public CSongMenuTileBoard(int partyModeID)
: base(partyModeID) {}
protected override int _PreviewId
{
set
{
base._PreviewId = value;
_UpdatePreview();
}
}
public override int GetActualSelection()
{
return _ActualSelection;
@@ -77,8 +86,6 @@ namespace VocaluxeLib.Menu.SongMenu
_SpaceW = _Theme.SongMenuTileBoard.SpaceW;
_SpaceH = _Theme.SongMenuTileBoard.SpaceH;
_PendingTime = 100L;
_TileW = (int)((_Theme.SongMenuTileBoard.TileRect.W - _SpaceW * (_NumW - 1)) / _NumW);
_TileH = (int)((_Theme.SongMenuTileBoard.TileRect.H - _SpaceH * (_NumH - 1)) / _NumH);
@@ -99,9 +106,6 @@ namespace VocaluxeLib.Menu.SongMenu
_ScrollRect = new SRectF(0, 0, CBase.Settings.GetRenderW(), CBase.Settings.GetRenderH(), _Theme.SongMenuTileBoard.TileRect.Z);
_PreviewSelected = -1;
_Offset = 0;
_CoverBig = _Theme.SongMenuTileBoard.StaticCoverBig;
_TextBG = _Theme.SongMenuTileBoard.StaticTextBG;
_DuetIcon = _Theme.SongMenuTileBoard.StaticDuetIcon;
@@ -112,6 +116,9 @@ namespace VocaluxeLib.Menu.SongMenu
_Artist = _Theme.SongMenuTileBoard.TextArtist;
_Title = _Theme.SongMenuTileBoard.TextTitle;
_SongLength = _Theme.SongMenuTileBoard.TextSongLength;
_PreviewId = -1;
_Offset = 0;
}
public override void Update(SScreenSongOptions songOptions)
@@ -120,52 +127,102 @@ namespace VocaluxeLib.Menu.SongMenu
if (songOptions.Selection.RandomOnly)
{
_Locked = _PreviewSelected;
_ActualSelection = _PreviewSelected;
_Locked = _PreviewId;
_ActualSelection = _PreviewId;
for (int i = 0; i < _Tiles.Count; i++)
_Tiles[i].Selected = _Locked == i + _Offset;
}
}
private void _UpdatePreview()
{
//First hide everything so we just have to set what we actually want
_CoverBig.Texture = _CoverBigTexture;
_Artist.Text = String.Empty;
_Title.Text = String.Empty;
_SongLength.Text = String.Empty;
_DuetIcon.Visible = false;
_VideoIcon.Visible = false;
_MedleyCalcIcon.Visible = false;
_MedleyTagIcon.Visible = false;
//Check if nothing is selected (for preview)
if (_PreviewId < 0)
return;
if (CBase.Songs.IsInCategory())
{
CSong song = CBase.Songs.GetVisibleSong(_PreviewId);
//Check if we have a valid song (song still visible, index >=0 etc is checked by framework)
if (song == null)
{
//Display at least the category
CCategory category = CBase.Songs.GetCategory(CBase.Songs.GetCurrentCategoryIndex());
//Check if we have a valid category
if (category == null)
return;
_CoverBig.Texture = category.CoverTextureBig;
_Artist.Text = category.Name;
return;
}
_CoverBig.Texture = song.CoverTextureBig;
_Artist.Text = song.Artist;
_Title.Text = song.Title;
_DuetIcon.Visible = song.IsDuet;
_VideoIcon.Visible = song.VideoFileName != "";
_MedleyCalcIcon.Visible = song.Medley.Source == EDataSource.Calculated;
_MedleyTagIcon.Visible = song.Medley.Source == EDataSource.Tag;
float time = CBase.Sound.GetLength(_SongStream);
if (Math.Abs(song.Finish) > 0.001)
time = song.Finish;
time -= song.Start;
var min = (int)Math.Floor(time / 60f);
var sec = (int)(time - min * 60f);
_SongLength.Text = min.ToString("00") + ":" + sec.ToString("00");
}
else
{
CCategory category = CBase.Songs.GetCategory(_PreviewId);
//Check if we have a valid category
if (category == null)
return;
_CoverBig.Texture = category.CoverTextureBig;
_Artist.Text = category.Name;
int num = category.GetNumSongsNotSung();
// ReSharper disable ConvertIfStatementToConditionalTernaryExpression
if (num != 1)
// ReSharper restore ConvertIfStatementToConditionalTernaryExpression
_Title.Text = CBase.Language.Translate("TR_SCREENSONG_NUMSONGS").Replace("%v", num.ToString());
else
_Title.Text = CBase.Language.Translate("TR_SCREENSONG_NUMSONG").Replace("%v", num.ToString());
}
}
public override void OnShow()
{
if (CBase.Songs.GetTabs() == EOffOn.TR_CONFIG_OFF && CBase.Songs.GetNumCategories() > 0 && !CBase.Songs.IsInCategory())
_EnterCategory(0);
_ActualSelection = -1;
_Locked = -1;
_PreviewSelected = -1;
_PreviewId = -1;
_UpdateList(0, true);
//AfterCategoryChange();
SetSelectedSong(_ActSong);
_AfterCategoryChange();
int actcat = _PreviewSelected;
if ((CBase.Songs.GetNumCategories() > 0) && (actcat < 0))
if (_PreviewId < 0)
{
_CoverBig.Texture = CBase.Songs.GetCategory(0).CoverTextureBig;
_Artist.Text = CBase.Songs.GetCategory(0).Name;
_Title.Text = String.Empty;
_SongLength.Text = String.Empty;
_PreviewSelected = 0;
_PreviewId = 0;
_Locked = 0;
_DuetIcon.Visible = false;
_VideoIcon.Visible = false;
_MedleyCalcIcon.Visible = false;
_MedleyTagIcon.Visible = false;
}
if (CBase.Songs.GetNumSongsVisible() == 0 && CBase.Songs.GetSearchFilter() != "")
{
_CoverBig.Texture = _CoverBigTexture;
_Artist.Text = String.Empty;
_Title.Text = String.Empty;
_SongLength.Text = String.Empty;
_PreviewSelected = -1;
_PreviewId = -1;
_Locked = -1;
_DuetIcon.Visible = false;
_VideoIcon.Visible = false;
_MedleyCalcIcon.Visible = false;
_MedleyTagIcon.Visible = false;
}
}
@@ -185,14 +242,13 @@ namespace VocaluxeLib.Menu.SongMenu
if ((_Locked == -1 || !sel) &&
(keyEvent.Key != Keys.Escape && keyEvent.Key != Keys.Back && keyEvent.Key != Keys.PageUp && keyEvent.Key != Keys.PageDown))
{
if (_PreviewSelected > -1)
_Locked = _PreviewSelected;
if (_PreviewId > -1)
_Locked = _PreviewId;
else
{
_Locked = 0;
_ActualSelection = 0;
_PreviewSelected = 0;
_SetSelectedNow();
_PreviewId = 0;
_UpdateList(0, true);
}
}
@@ -203,10 +259,10 @@ namespace VocaluxeLib.Menu.SongMenu
case Keys.Enter:
if (!CBase.Songs.IsInCategory())
{
_EnterCategory(_PreviewSelected);
_EnterCategory(_PreviewId);
keyEvent.Handled = true;
}
else if (_ActualSelection > -1 && _PreviewSelected >= 0)
else if (_ActualSelection > -1 && _PreviewId >= 0)
_Locked = _ActualSelection;
break;
@@ -301,7 +357,7 @@ namespace VocaluxeLib.Menu.SongMenu
if (!keyEvent.Handled)
{
_PreviewSelected = _Locked;
_PreviewId = _Locked;
_ActualSelection = _Locked;
for (int i = 0; i < _Tiles.Count; i++)
@@ -326,11 +382,11 @@ namespace VocaluxeLib.Menu.SongMenu
{
if (mouseEvent.LB || !CBase.Songs.IsInCategory())
{
if (_PreviewSelected == i + _Offset)
_Locked = _PreviewSelected;
if (_PreviewId == i + _Offset)
_Locked = _PreviewId;
else
{
_PreviewSelected = i + _Offset;
_PreviewId = i + _Offset;
_Locked = -1;
}
}
@@ -361,10 +417,10 @@ namespace VocaluxeLib.Menu.SongMenu
}
if (mouseEvent.RB && CBase.Songs.GetTabs() == EOffOn.TR_CONFIG_OFF && !songOptions.Selection.PartyMode)
CBase.Graphics.FadeTo(EScreens.ScreenMain);
else if (_PreviewSelected != -1 && mouseEvent.LB && CBase.Songs.GetCurrentCategoryIndex() != -1 && !songOptions.Selection.PartyMode)
else if (_PreviewId != -1 && mouseEvent.LB && CBase.Songs.GetCurrentCategoryIndex() != -1 && !songOptions.Selection.PartyMode)
{
if (CHelper.IsInBounds(_CoverBig.Rect, mouseEvent) || CHelper.IsInBounds(_TextBG.Rect, mouseEvent))
_Locked = _PreviewSelected;
_Locked = _PreviewId;
}
else if (mouseEvent.LB && (!CBase.Songs.IsInCategory()))
{
@@ -372,7 +428,7 @@ namespace VocaluxeLib.Menu.SongMenu
{
if (tile.Texture != _CoverTexture && CHelper.IsInBounds(tile.Rect, mouseEvent))
{
_EnterCategory(_PreviewSelected);
_EnterCategory(_PreviewId);
mouseEvent.Handled = true;
return;
}
@@ -392,61 +448,8 @@ namespace VocaluxeLib.Menu.SongMenu
tile.Draw(1.2f, tile.Rect.Z - 0.1f, EAspect.Crop);
else
{
// ReSharper disable ConvertIfStatementToConditionalTernaryExpression
if (tile.Texture != _CoverTexture)
// ReSharper restore ConvertIfStatementToConditionalTernaryExpression
tile.Draw(1f, tile.Rect.Z, EAspect.Crop);
else
tile.Draw(1f, tile.Rect.Z, EAspect.Stretch);
}
}
if (CBase.Songs.IsInCategory())
{
int actsong = _PreviewSelected;
if ((CBase.Songs.GetNumSongsVisible() > actsong) && (actsong >= 0))
{
CSong song = CBase.Songs.GetVisibleSong(actsong);
_CoverBig.Texture = song.CoverTextureBig;
_Artist.Text = song.Artist;
_Title.Text = song.Title;
_DuetIcon.Visible = song.IsDuet;
_VideoIcon.Visible = song.VideoFileName != "";
_MedleyCalcIcon.Visible = song.Medley.Source == EDataSource.Calculated;
_MedleyTagIcon.Visible = song.Medley.Source == EDataSource.Tag;
float time = CBase.Sound.GetLength(_SongStream);
if (Math.Abs(song.Finish) > 0.001)
time = song.Finish;
time -= song.Start;
var min = (int)Math.Floor(time / 60f);
var sec = (int)(time - min * 60f);
_SongLength.Text = min.ToString("00") + ":" + sec.ToString("00");
}
}
else
{
int actcat = _PreviewSelected;
if ((CBase.Songs.GetNumCategories() > actcat) && (actcat >= 0))
{
_CoverBig.Texture = CBase.Songs.GetCategory(actcat).CoverTextureBig;
_Artist.Text = CBase.Songs.GetCategory(actcat).Name;
int num = CBase.Songs.NumSongsInCategory(actcat);
// ReSharper disable ConvertIfStatementToConditionalTernaryExpression
if (num != 1)
// ReSharper restore ConvertIfStatementToConditionalTernaryExpression
_Title.Text = CBase.Language.Translate("TR_SCREENSONG_NUMSONGS").Replace("%v", num.ToString());
else
_Title.Text = CBase.Language.Translate("TR_SCREENSONG_NUMSONG").Replace("%v", num.ToString());
_SongLength.Text = String.Empty;
_DuetIcon.Visible = false;
_VideoIcon.Visible = false;
_MedleyCalcIcon.Visible = false;
_MedleyTagIcon.Visible = false;
EAspect aspect = (tile.Texture != _CoverTexture) ? EAspect.Crop : EAspect.Stretch;
tile.Draw(1f, tile.Rect.Z, aspect);
}
}
@@ -508,14 +511,13 @@ namespace VocaluxeLib.Menu.SongMenu
if (_Locked == -1 || !sel)
{
if (_PreviewSelected > -1)
_Locked = _PreviewSelected;
if (_PreviewId > -1)
_Locked = _PreviewId;
else
{
_Locked = 0;
_ActualSelection = 0;
_PreviewSelected = 0;
_SetSelectedNow();
_PreviewId = 0;
_UpdateList(0, true);
}
}
@@ -523,13 +525,12 @@ namespace VocaluxeLib.Menu.SongMenu
foreach (CStatic tile in _Tiles)
tile.Selected = false;
_PreviewSelected = itemNr;
_SetSelectedNow();
_PreviewId = itemNr;
_Locked = itemNr;
_UpdateList(true);
_PreviewSelected = _Locked;
_PreviewId = _Locked;
_ActualSelection = _Locked;
if (_Locked - _Offset >= 0)
@@ -556,7 +557,7 @@ namespace VocaluxeLib.Menu.SongMenu
{
base._EnterCategory(cat);
_PreviewSelected = 0;
_PreviewId = 0;
_Locked = -1;
_ActualSelection = 0;
_AfterCategoryChange();
@@ -567,7 +568,7 @@ namespace VocaluxeLib.Menu.SongMenu
{
base._ShowCategories();
_PreviewSelected = 0;
_PreviewId = 0;
_Locked = -1;
_ActualSelection = 0;
_AfterCategoryChange();
@@ -594,8 +595,8 @@ namespace VocaluxeLib.Menu.SongMenu
private void _AfterCategoryChange()
{
_SetSelectedNow();
_SelectSong(_PreviewSelected);
_SelectSong(_PreviewId);
_UpdatePreview();
foreach (CStatic tile in _Tiles)
tile.Selected = false;
+1 -8
View File
@@ -24,13 +24,6 @@ namespace VocaluxeLib.Profile
{
public class CProfile
{
private static readonly XmlWriterSettings _Settings = new XmlWriterSettings
{
Indent = true,
Encoding = Encoding.UTF8,
ConformanceLevel = ConformanceLevel.Document
};
public int ID;
public string PlayerName;
@@ -137,7 +130,7 @@ namespace VocaluxeLib.Profile
XmlWriter writer;
try
{
writer = XmlWriter.Create(Path.Combine(FilePath, FileName), _Settings);
writer = XmlWriter.Create(Path.Combine(FilePath, FileName), CBase.Config.GetXMLSettings());
}
catch (Exception e)
{
+6
View File
@@ -17,6 +17,7 @@
using System.Collections.Generic;
using VocaluxeLib.Draw;
using System.Linq;
namespace VocaluxeLib.Songs
{
@@ -50,6 +51,11 @@ namespace VocaluxeLib.Songs
}
}
public int GetNumSongsNotSung()
{
return Songs.Count(sp => !sp.IsSung);
}
public CCategory(string name, CTexture coverSmall, CTexture coverBig)
{
Name = name;