diff --git a/Output/Languages/English.xml b/Output/Languages/English.xml
index a67b1462..fc7a4ca2 100644
--- a/Output/Languages/English.xml
+++ b/Output/Languages/English.xml
@@ -152,9 +152,10 @@
(%v songs)
(%v song)
%a - %t
- A-Z = Jump to the letter • F3 = Search • CTRL+R = Random selection • CTRL+S = Start medley • CTRL+A = Start all random • CTRL+V = Start visible random • Space = Open song options • ESC = Back to main menu
+ A-Z = Jump to the letter • F3 = Search • CTRL+R = Random selection • CTRL+S = Start medley • CTRL+# = Change song sorting • CTRL+T = Enable/Disable category view • Space = Open song options • ESC = Back to main menu
A-Z = Search artist and title, prefixes for the search → a: = artist • t: = title • c: = creator • e: = edition • g: = genre • y: = year (e.g. 1999 or 1980-1989) • l: = language • al: = album • fi: = file name • fo: = folder name
1-6 = Press your team number to use a random song joker
+ Sorting: %s
Pause
Stop singing
Continue
diff --git a/Output/Languages/German.xml b/Output/Languages/German.xml
index c630ba1b..dc0fc2d1 100644
--- a/Output/Languages/German.xml
+++ b/Output/Languages/German.xml
@@ -147,9 +147,10 @@
(%v Lieder)
(%v Lied)
%a -%t
- A-Z = Zum Buchstaben springen • F3 = Suchen • STRG+R = Zufällige Auswahl • STRG+S = Starte Medley • STRG+A = Alle zufällig starten • STRG+V = Sichtbare zufällig starten • Leertaste = Lied-Optionen öffnen • ESC = Zurück zum Hauptmenü
+ A-Z = Zum Buchstaben springen • F3 = Suchen • STRG+R = Zufällige Auswahl • STRG+S = Starte Medley • STRG+# = Song Sortierung ändern • STRG+T = Kategorieansicht ein-/ausschalten • Leertaste = Lied-Optionen öffnen • ESC = Zurück zum Hauptmenü
A-Z = Interpreten und Titel durchsuchen, Präfixe für die Suche → a: = Interpret • t: = Titel • c: = Ersteller • e: = Edition • g: = Genre • y: = Jahr (z.B. 1999 oder 1980-1989) • l: = Sprache • al: = Album • fi: = Dateiname • fo: = Ordnername
1-6 = Drücke die Teamnummer um einen Zufallssong Joker zu verwenden
+ Sortierung: %s
Pause
Lied beenden
Fortfahren
diff --git a/Output/Readme.txt b/Output/Readme.txt
index 13d36037..23859153 100644
--- a/Output/Readme.txt
+++ b/Output/Readme.txt
@@ -132,12 +132,20 @@ Song screen
[F3] to open/close the song search menu
[SPACE] to open/close the song menu
[TAB] to switch selection of song menu and playlist (if opened)
+[CTRL] + [H] to show the highscore of the selected song
+[CTRL] + [T] to toggle category / tabs view
+[CTRL] + [1]..[0] to change the song sorting (just changed for runtime, not saved!), in order from keys 1 to 0:
+ folder, artist, artist by letter, title by letter, edition, genre, language, year, decade, date added
[CTRL] + [R] to select a random song
[CTRL] + [A] to sing all songs
[CTRL] + [S] to sing current song in medley version
[CTRL] + [V] to sing all songs from a category
+[CTRL] + [L] to filter the song list to the current displayed playlist. Press again to remove this filter.
[NUM_1]..[NUM_6] to use a Joker for team 1..6
-[A]..[Z] to jump to category/song title starting with that letter
+[A]..[Z] to jump to category/song title starting with that letters (multiple letters possible)
+[PAGE UP] or [PAGE DOWN] to scroll one page up/down
+[CTRL] + [PAGE UP or DOWN] to go inside next or previous category while being in a category
+[HOME] or [END] to scroll up to first song or down to last song
Name selection screen
[1]..[6] to activate player selection.
@@ -149,6 +157,7 @@ Name selection screen
Sing screen
[P] to toggle pause.
[CTRL] + [S] to skip a song if there is another one in the playlist.
+[CTRL] + [RIGHT] to skip 30 seconds within the playing song (not in party modes).
[T] to change the time format of the timer.
[I] to change view of player information.
[W] to activate the configured webcam.
@@ -156,6 +165,7 @@ Sing screen
Score and highscore screen
[LEFT] or [RIGHT] to show (high)scores of another round (if there is more than one)
+ if opened from song list screen: Switch between game modes (Normal, Medley, Duet, Short)
=================================
diff --git a/Output/Themes/Changelog/Changelog_ScreenSong.txt b/Output/Themes/Changelog/Changelog_ScreenSong.txt
index 89d4820b..563bd3ab 100644
--- a/Output/Themes/Changelog/Changelog_ScreenSong.txt
+++ b/Output/Themes/Changelog/Changelog_ScreenSong.txt
@@ -1,5 +1,22 @@
ScreenSong
+++++++++++
+Version 9:
+
+Add:
+
+
+Changed values at:
+
+
+++++++++++
+Version 8:
+
+Add:
+ to SongMenu
+
+
+
++++++++++
Version 7:
diff --git a/Output/Themes/Genius/Screens/ScreenSing.xml b/Output/Themes/Genius/Screens/ScreenSing.xml
index 821093fb..36cebdac 100644
--- a/Output/Themes/Genius/Screens/ScreenSing.xml
+++ b/Output/Themes/Genius/Screens/ScreenSing.xml
@@ -46,7 +46,7 @@
0
- 0
+ 610
1280
90
-0.75
@@ -136,7 +136,7 @@
40
- 10
+ 623
45
36
-1
@@ -1501,7 +1501,7 @@
637
- 7
+ 620
1200
42
-1
@@ -1512,7 +1512,7 @@
637
- 48
+ 662
1200
35
-1
diff --git a/Output/Themes/Genius/Screens/ScreenSong.xml b/Output/Themes/Genius/Screens/ScreenSong.xml
index f7d55aaf..4d69765a 100644
--- a/Output/Themes/Genius/Screens/ScreenSong.xml
+++ b/Output/Themes/Genius/Screens/ScreenSong.xml
@@ -2,7 +2,7 @@
ScreenSong
- 7
+ 9
@@ -70,8 +70,33 @@
-2.1
+
+
+
+
+ 490
+ 0
+ 300
+ 30
+ -0.75
+
+
+
+ 640
+ 2
+ -1
+ 25
+ 280
+
+
+ Center
+ Center
+
+ Outline
+ TR_SCREENSONG_SORTING
+
950
65
@@ -788,6 +813,33 @@
TR_SCREENSONG_BUTTON_STARTMEDLEY
+
@@ -853,19 +905,33 @@
- 222
+ 391
490
-1.01
28
- 340
+ 100
- Center
+ Right
Top
Outline
+
+ 52
+ 490
+ -1.01
+ 28
+ 100
+
+
+ Left
+ Top
+
+ Outline
+
+
@@ -980,19 +1046,33 @@
- 222
+ 391
490
-1.01
28
- 340
+ 100
- Center
+ Right
Top
Outline
+
+ 52
+ 490
+ -1.01
+ 28
+ 100
+
+
+ Left
+ Top
+
+ Outline
+
+
diff --git a/Vocaluxe/Base/CBackgroundMusic.cs b/Vocaluxe/Base/CBackgroundMusic.cs
index 5050b408..44295ce2 100644
--- a/Vocaluxe/Base/CBackgroundMusic.cs
+++ b/Vocaluxe/Base/CBackgroundMusic.cs
@@ -316,56 +316,33 @@ namespace Vocaluxe.Base
CSound.SetGlobalVolume(CConfig.PreviewMusicVolume);
}
+ //Change song position only if song is changed or near to end
bool songChanged = _CurPlayer.SongID != song.ID;
+ if (!songChanged && _CurPlayer.Position + 30 < _CurPlayer.Length)
+ return;
_PreviewPlayer.Load(song);
-
- //Change song position only if song is changed or near to end
- if (songChanged || _CurPlayer.Position + 30 < _CurPlayer.Length || _PreviewStartHelperTask == null)
+ lock (_PreviewStartHelperTaskLock)
{
- lock (_PreviewStartHelperTaskLock)
+ _PreviewStartHelperTask = new Task(() =>
{
- _PreviewStartHelperTask = new Task(() =>
- {
- float length = _PreviewPlayer.Length;
- if (length < 1)
- length = 30; // If length is unknow or invalid assume a length of 30s
+ float length = _PreviewPlayer.Length;
+ if (length < 1)
+ length = 30; // If length is unknow or invalid assume a length of 30s
- if (start < 0)
- start = (song.Preview.Source == EDataSource.None) ? length / 4f : song.Preview.StartTime;
- if (start > length - 5f)
- start = Math.Max(0f, Math.Min(length / 4f, length - 5f));
- if (start >= 0.5f)
- start -= 0.5f;
+ if (start < 0)
+ start = (song.Preview.Source == EDataSource.None) ? length / 4f : song.Preview.StartTime;
+ if (start > length - 5f)
+ start = Math.Max(0f, Math.Min(length / 4f, length - 5f));
+ if (start >= 0.5f)
+ start -= 0.5f;
- _PreviewPlayer.Position = start;
- Play();
- });
- }
- _CurPlayer = _PreviewPlayer;
+ _PreviewPlayer.Position = start;
+ Play();
+ });
}
- else
- {
- if (_PreviewStartHelperTask != null)
- {
- lock (_PreviewStartHelperTaskLock)
- {
- // Recheck the condition as it cloud have change before we got the lock
- if (_PreviewStartHelperTask != null)
- {
- _PreviewStartHelperTask = null;
- }
- }
- }
- _PreviewPlayer.Position = _CurPlayer.Position;
- _CurPlayer = _PreviewPlayer;
- Play();
- }
-
-
-
-
+ _CurPlayer = _PreviewPlayer;
}
public static void StopPreview()
@@ -460,4 +437,4 @@ namespace Vocaluxe.Base
return _BGMusicFiles.Contains(element);
}
}
-}
\ No newline at end of file
+}
diff --git a/Vocaluxe/Base/CConfig.cs b/Vocaluxe/Base/CConfig.cs
index 5d4fb05a..33ce96e2 100644
--- a/Vocaluxe/Base/CConfig.cs
+++ b/Vocaluxe/Base/CConfig.cs
@@ -688,7 +688,7 @@ namespace Vocaluxe.Base
{
//Check if folder exists
if (Directory.Exists(folder))
- SongFolders.Add(folder);
+ SongFolders.Add(Path.GetFullPath(folder));
}
}
@@ -853,4 +853,4 @@ namespace Vocaluxe.Base
}
}
}
-}
\ No newline at end of file
+}
diff --git a/Vocaluxe/Base/CSongSorter.cs b/Vocaluxe/Base/CSongSorter.cs
index 8a956107..318ba811 100644
--- a/Vocaluxe/Base/CSongSorter.cs
+++ b/Vocaluxe/Base/CSongSorter.cs
@@ -181,8 +181,12 @@ namespace Vocaluxe.Base
sortList.Sort(_SortByFieldArtistTitle);
break;
}
+
+ if (_SongSorting == ESongSorting.TR_CONFIG_DATEADDED)
+ sortList.Reverse();
+
_SortedSongs = sortList.ToArray();
_Changed = false;
}
}
-}
\ No newline at end of file
+}
diff --git a/Vocaluxe/Screens/CScreenHighscore.cs b/Vocaluxe/Screens/CScreenHighscore.cs
index 0e6a746f..19769991 100644
--- a/Vocaluxe/Screens/CScreenHighscore.cs
+++ b/Vocaluxe/Screens/CScreenHighscore.cs
@@ -49,6 +49,7 @@ namespace Vocaluxe.Screens
private int _Round;
private int _Pos;
private bool _IsDuet;
+ private bool _FromScreenSong = false;
public override EMusicType CurrentMusicType
{
@@ -113,11 +114,13 @@ namespace Vocaluxe.Screens
break;
case Keys.Down:
- _ChangePos(1);
+ if (!_FromScreenSong)
+ _ChangePos(1);
break;
case Keys.Up:
- _ChangePos(-1);
+ if (!_FromScreenSong)
+ _ChangePos(-1);
break;
case Keys.Left:
@@ -234,13 +237,37 @@ namespace Vocaluxe.Screens
{
_Pos = 0;
int rounds = CGame.NumRounds;
- _Scores = new List[rounds];
- for (int round = 0; round < rounds; round++)
+
+ if (rounds == 0)
{
- int songID = CGame.GetSong(round).ID;
- EGameMode gameMode = CGame.GetGameMode(round);
+ _FromScreenSong = true;
+ _Round = (int)EGameMode.TR_GAMEMODE_NORMAL;
+ _Scores = new List[4];
+ int songID = CScreenSong.getSelectedSongID();
EHighscoreStyle style = CBase.Config.GetHighscoreStyle();
- _Scores[round] = CDataBase.LoadScore(songID, gameMode, style);
+ bool foundHighscoreEntries = false;
+
+ for (int gameModeNum = 0; gameModeNum < 4; gameModeNum++)
+ {
+ _Scores[gameModeNum] = CDataBase.LoadScore(songID, (EGameMode)gameModeNum, style);
+ if (!foundHighscoreEntries && _Scores[gameModeNum].Count > 0)
+ {
+ _Round = gameModeNum;
+ foundHighscoreEntries = true;
+ }
+ }
+ }
+ else
+ {
+ _FromScreenSong = false;
+ _Scores = new List[rounds];
+ for (int round = 0; round < rounds; round++)
+ {
+ int songID = CGame.GetSong(round).ID;
+ EGameMode gameMode = CGame.GetGameMode(round);
+ EHighscoreStyle style = CBase.Config.GetHighscoreStyle();
+ _Scores[round] = CDataBase.LoadScore(songID, gameMode, style);
+ }
}
}
@@ -248,15 +275,21 @@ namespace Vocaluxe.Screens
{
_IsDuet = false;
CPoints points = CGame.GetPoints();
- CSong song = CGame.GetSong(_Round);
+
+ CSong song;
+ if (_FromScreenSong)
+ song = CSongs.GetSong(CScreenSong.getSelectedSongID());
+ else
+ song = CGame.GetSong(_Round);
+
if (song == null)
return;
_Texts[_TextSongName].Text = song.Artist + " - " + song.Title;
- if (points.NumRounds > 1)
+ if (points != null && !_FromScreenSong && points.NumRounds > 1)
_Texts[_TextSongName].Text += " (" + (_Round + 1) + "/" + points.NumRounds + ")";
- switch (CGame.GetGameMode(_Round))
+ switch ((_FromScreenSong ? (EGameMode)_Round : CGame.GetGameMode(_Round)))
{
case EGameMode.TR_GAMEMODE_NORMAL:
_Texts[_TextSongMode].Text = "TR_GAMEMODE_NORMAL";
@@ -296,9 +329,20 @@ namespace Vocaluxe.Screens
private void _ChangeRound(int num)
{
- CPoints points = CGame.GetPoints();
- _Round += num;
- _Round = _Round.Clamp(0, points.NumRounds - 1);
+ if (_FromScreenSong)
+ {
+ if (_Round == (int)EGameMode.TR_GAMEMODE_SHORTSONG)
+ _Round = (int)EGameMode.TR_GAMEMODE_NORMAL;
+ else
+ ++_Round;
+ }
+ else
+ {
+ CPoints points = CGame.GetPoints();
+ _Round += num;
+ _Round = _Round.Clamp(0, points.NumRounds - 1);
+ }
+
_UpdateRound();
}
@@ -307,4 +351,4 @@ namespace Vocaluxe.Screens
CParty.LeavingHighscore();
}
}
-}
\ No newline at end of file
+}
diff --git a/Vocaluxe/Screens/CScreenSing.cs b/Vocaluxe/Screens/CScreenSing.cs
index df0648d2..5ab5f59d 100644
--- a/Vocaluxe/Screens/CScreenSing.cs
+++ b/Vocaluxe/Screens/CScreenSing.cs
@@ -30,6 +30,7 @@ using VocaluxeLib.Draw;
using VocaluxeLib.Log;
using VocaluxeLib.Menu;
using VocaluxeLib.Menu.SingNotes;
+using VocaluxeLib.PartyModes;
using VocaluxeLib.Songs;
namespace Vocaluxe.Screens
@@ -123,6 +124,7 @@ namespace Vocaluxe.Screens
private float _RemainingTimeToFirstNote;
private float _TimeToFirstNoteDuet;
private float _RemainingTimeToFirstNoteDuet;
+ private float _TimeShowSongTextTotal;
private Stopwatch _TimerSongText;
private Stopwatch _TimerDuetText1;
@@ -132,6 +134,7 @@ namespace Vocaluxe.Screens
private bool _Webcam;
private CBackground _SlideShow;
+ private SScreenSongOptions _Sso;
public override EMusicType CurrentMusicType
{
@@ -264,9 +267,15 @@ namespace Vocaluxe.Screens
if (_Buttons[_ButtonCancel].Selected)
_Stop();
if (_Buttons[_ButtonRestartGame].Selected)
+ {
_RestartGame();
+ _SetPause(false);
+ }
if (_Buttons[_ButtonRestartRound].Selected)
+ {
_RestartRound();
+ _SetPause(false);
+ }
if (_Buttons[_ButtonSkip].Selected)
{
_NextSong();
@@ -287,6 +296,38 @@ namespace Vocaluxe.Screens
if (CConfig.Config.Debug.SaveModifiedSongs == EOffOn.TR_CONFIG_ON)
song.Save();
break;
+
+ // Restart Round and reload song file header
+ case Keys.R:
+ if (keyEvent.Mod == EModifier.Ctrl && _Pause)
+ {
+ _SetPause(false);
+ _RestartRound();
+ }
+ break;
+
+ // Restart Round and reload song file header
+ case Keys.F5:
+ if (_Pause)
+ {
+ _SetPause(false);
+ _RestartRound();
+ }
+ break;
+
+ // Skip 30 seconds
+ case Keys.Right:
+ if (keyEvent.Mod == EModifier.Ctrl && !_Pause && !_Sso.Selection.PartyMode)
+ {
+ if (_TimerSongText.IsRunning)
+ _TimerSongText.Stop();
+
+ float newTime = _CurrentTime + 30f;
+ if (CSound.GetLength(_CurrentStream) < (_CurrentTime + 30f))
+ newTime = CSound.GetLength(_CurrentStream) - 1f;
+ CSound.SetPosition(_CurrentStream, newTime);
+ }
+ break;
}
}
@@ -356,6 +397,7 @@ namespace Vocaluxe.Screens
_SetPause(false);
_TimeRects.Clear();
+ _Sso = CParty.GetSongSelectionOptions();
_SingNotes[_SingBars].Init(0);
_AssignPlayerElements();
@@ -463,17 +505,11 @@ namespace Vocaluxe.Screens
if (alpha.Length > 2)
{
- _Lyrics[_LyricMainDuet].Alpha = alpha[0];
- _Lyrics[_LyricSubDuet].Alpha = alpha[1];
+ _Lyrics[_LyricMainDuet].Alpha = alpha[2];
+ _Lyrics[_LyricSubDuet].Alpha = alpha[3];
- _Statics[_StaticLyricsDuet].Alpha = alpha[0];
- _Statics[_StaticLyricHelperDuet].Alpha = alpha[0];
-
- _Lyrics[_LyricMain].Alpha = alpha[2];
- _Lyrics[_LyricSub].Alpha = alpha[3];
-
- _Statics[_StaticLyrics].Alpha = alpha[2];
- _Statics[_StaticLyricHelper].Alpha = alpha[2];
+ _Statics[_StaticLyricsDuet].Alpha = alpha[2];
+ _Statics[_StaticLyricHelperDuet].Alpha = alpha[2];
}
}
@@ -532,7 +568,7 @@ namespace Vocaluxe.Screens
_SingNotes[_SingBars].PlayerNotes[j].SetLine(nr);
}
- if (i == 0 && !song.IsDuet || i == 1 && song.IsDuet)
+ if (i == 0)
{
_Lyrics[_LyricMain].SetLine(lines[nr]);
_Lyrics[_LyricMainTop].SetLine(lines[nr]);
@@ -550,7 +586,7 @@ namespace Vocaluxe.Screens
_Lyrics[_LyricSubTop].Clear();
}
}
- if (i == 0 && song.IsDuet)
+ if (i == 1 && song.IsDuet)
{
_Lyrics[_LyricMainDuet].SetLine(lines[nr]);
_TimeToFirstNoteDuet = CGame.GetTimeFromBeats(lines[nr].FirstNoteBeat - lines[nr].StartBeat, song.BPM);
@@ -564,7 +600,7 @@ namespace Vocaluxe.Screens
}
else
{
- if (i == 0 && !song.IsDuet || i == 1 && song.IsDuet)
+ if (i == 0)
{
_Lyrics[_LyricMain].Clear();
_Lyrics[_LyricSub].Clear();
@@ -573,7 +609,7 @@ namespace Vocaluxe.Screens
_TimeToFirstNote = 0f;
}
- if (i == 0 && song.IsDuet)
+ if (i == 1 && song.IsDuet)
{
_Lyrics[_LyricMainDuet].Clear();
_Lyrics[_LyricSubDuet].Clear();
@@ -610,23 +646,23 @@ namespace Vocaluxe.Screens
private void _UpdateSongText()
{
- if (_TimerSongText.IsRunning && !_Lyrics[_LyricMainDuet].Visible && !_Lyrics[_LyricMainTop].Visible)
+ if (_TimerSongText.IsRunning)
{
float t = _TimerSongText.ElapsedMilliseconds / 1000f;
- if (t < 10f)
+ if (t < _TimeShowSongTextTotal)
{
_Statics[_StaticSongText].Visible = true;
_Texts[_TextSongName].Visible = true;
- if (t < 7f)
+ if (t < (_TimeShowSongTextTotal - 3f))
{
_Statics[_StaticSongText].Color.A = 1f;
_Texts[_TextSongName].Color.A = 1f;
}
else
{
- _Statics[_StaticSongText].Color.A = (10f - t) / 3f;
- _Texts[_TextSongName].Color.A = (10f - t) / 3f;
+ _Statics[_StaticSongText].Color.A = (_TimeShowSongTextTotal - t) / 3f;
+ _Texts[_TextSongName].Color.A = (_TimeShowSongTextTotal - t) / 3f;
}
}
else
@@ -665,7 +701,7 @@ namespace Vocaluxe.Screens
timer.Stop();
}
}
- else if (!timer.IsRunning && timer.ElapsedMilliseconds == 0 && _Lyrics[_LyricMainDuet].Alpha > 0 && CGame.GetSong().IsDuet)
+ else if (!timer.IsRunning && timer.ElapsedMilliseconds == 0 && _Lyrics[_LyricMainTop].Alpha > 0 && CGame.GetSong().IsDuet)
timer.Start();
else
textName.Visible = false;
@@ -698,7 +734,7 @@ namespace Vocaluxe.Screens
_TimerDuetText2.Stop();
}
}
- else if (!_TimerDuetText2.IsRunning && _TimerDuetText2.ElapsedMilliseconds == 0 && _Lyrics[_LyricMain].Alpha > 0 && CGame.GetSong().IsDuet)
+ else if (!_TimerDuetText2.IsRunning && _TimerDuetText2.ElapsedMilliseconds == 0 && _Lyrics[_LyricMainDuet].Alpha > 0 && CGame.GetSong().IsDuet)
_TimerDuetText2.Start();
else
_Texts[_TextDuetName2].Visible = false;
@@ -879,7 +915,7 @@ namespace Vocaluxe.Screens
_Statics[_StaticLyricHelperTop].Color.R,
_Statics[_StaticLyricHelperTop].Color.G,
_Statics[_StaticLyricHelperTop].Color.B,
- _Statics[_StaticLyricHelperTop].Color.A * _Statics[_StaticLyricHelper].Alpha * alpha);
+ _Statics[_StaticLyricHelperTop].Color.A * _Statics[_StaticLyricHelperTop].Alpha * alpha);
float distance = _Lyrics[_LyricMainTop].GetCurrentLyricPosX() - rect.X - rect.W;
CDraw.DrawTexture(_Statics[_StaticLyricHelperTop].Texture,
@@ -968,7 +1004,7 @@ namespace Vocaluxe.Screens
_CloseSong();
CGame.ResetPlayer();
- _LoadCurrentSong();
+ _LoadCurrentSong(false);
_StartSong();
}
@@ -1048,7 +1084,7 @@ namespace Vocaluxe.Screens
///
/// Prepare streams and screen for current song.
///
- private void _LoadCurrentSong()
+ private void _LoadCurrentSong(bool reloadNotes = true)
{
if (CGame.IsFinished())
{
@@ -1064,6 +1100,9 @@ namespace Vocaluxe.Screens
return;
}
+ if (!_Sso.Selection.PartyMode && (CGame.GameMode == EGameMode.TR_GAMEMODE_NORMAL || CGame.GameMode == EGameMode.TR_GAMEMODE_DUET))
+ song.ReloadSong(reloadNotes);
+
string songname = song.Artist + " - " + song.Title;
int rounds = CGame.GetNumSongs();
if (rounds > 1)
@@ -1086,11 +1125,11 @@ namespace Vocaluxe.Screens
voiceAssignments[i] = CGame.Players[i].VoiceNr;
}
+ _VideoAspect = EAspect.Automatic;
if (!String.IsNullOrEmpty(song.VideoFileName))
{
_CurrentVideo = CVideo.Load(Path.Combine(song.Folder, song.VideoFileName));
CVideo.Skip(_CurrentVideo, song.Start, song.VideoGap);
- _VideoAspect = EAspect.Automatic;
}
CDraw.RemoveTexture(ref _Background);
@@ -1148,7 +1187,21 @@ namespace Vocaluxe.Screens
_TimerDuetText1.Reset();
_TimerDuetText2.Reset();
- if (!song.IsDuet)
+ float realGap = song.Gap - song.Start;
+ _TimeShowSongTextTotal = 10f;
+ if (_Lyrics[_LyricMainDuet].Visible || _Lyrics[_LyricMainTop].Visible)
+ {
+ if (realGap < 11f)
+ {
+ _TimeShowSongTextTotal = 0;
+ }
+ else if (realGap < 17f)
+ {
+ _TimeShowSongTextTotal = realGap - 7f;
+ }
+ }
+
+ if (_TimeShowSongTextTotal > 0)
_TimerSongText.Start();
}
@@ -1199,8 +1252,8 @@ namespace Vocaluxe.Screens
if (CGame.GetSong() != null && CGame.GetSong().IsDuet)
{
- bottomLyricsVisible = true;
- topLyricsVisible = false;
+ bottomLyricsVisible = false;
+ topLyricsVisible = true;
duetLyricsVisible = true;
}
diff --git a/Vocaluxe/Screens/CScreenSong.cs b/Vocaluxe/Screens/CScreenSong.cs
index cf0e1183..3f851153 100644
--- a/Vocaluxe/Screens/CScreenSong.cs
+++ b/Vocaluxe/Screens/CScreenSong.cs
@@ -19,6 +19,7 @@ using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
+using System.Timers;
using System.Windows.Forms;
using Vocaluxe.Base;
using VocaluxeLib;
@@ -42,7 +43,7 @@ namespace Vocaluxe.Screens
// Version number for theme files. Increment it, if you've changed something on the theme files!
protected override int _ScreenVersion
{
- get { return 7; }
+ get { return 9; }
}
private const string _TextCategory = "TextCategory";
@@ -53,6 +54,7 @@ namespace Vocaluxe.Screens
private const string _TextHelpBarSearch = "TextHelpBarSearch";
private const string _TextHelpBarParty = "TextHelpBarParty";
private const string _TextOptionsTitle = "TextOptionsTitle";
+ private const string _TextShortInfoTop = "TextShortInfoTop";
private const string _ButtonOpenOptions = "ButtonOpenOptions";
private const string _ButtonOptionsSing = "ButtonOptionsSing";
@@ -66,6 +68,7 @@ namespace Vocaluxe.Screens
private const string _ButtonOptionsRandomMedley = "ButtonOptionsRandomMedley";
private const string _ButtonOptionsStartMedley = "ButtonOptionsStartMedley";
private const string _ButtonStart = "ButtonStart";
+ private const string _ButtonOptionsHighscore = "ButtonOptionsHighscore";
private const string _SelectSlideOptionsMode = "SelectSlideOptionsMode";
private const string _SelectSlideOptionsPlaylistAdd = "SelectSlideOptionsPlaylistAdd";
@@ -74,6 +77,7 @@ namespace Vocaluxe.Screens
private const string _StaticSearchBar = "StaticSearchBar";
private const string _StaticOptionsBG = "StaticOptionsBG";
+ private const string _StaticShortInfoTop = "StaticShortInfoTop";
private const string _SongMenuName = "SongMenu";
private const string _PlaylistName = "Playlist";
@@ -99,6 +103,20 @@ namespace Vocaluxe.Screens
private ISongMenu _SongMenu;
private CPlaylist _Playlist;
+ private System.Timers.Timer _TimerShortInfoText;
+
+ private static int _StaticSelectedSongID;
+
+ private static void setStaticSelectedSongID(int songID)
+ {
+ _StaticSelectedSongID = songID;
+ }
+
+ public static int getSelectedSongID()
+ {
+ return _StaticSelectedSongID;
+ }
+
public override EMusicType CurrentMusicType
{
get { return CSongs.IsInCategory ? EMusicType.Preview : EMusicType.Background; }
@@ -130,6 +148,7 @@ namespace Vocaluxe.Screens
blist.Add(_ButtonStart);
blist.Add(_ButtonOptionsRandomMedley);
blist.Add(_ButtonOptionsStartMedley);
+ blist.Add(_ButtonOptionsHighscore);
_TextsPlayer.Clear();
for (int i = 0; i < CSettings.MaxNumPlayer; i++)
@@ -144,8 +163,9 @@ namespace Vocaluxe.Screens
tlist.Add(_TextHelpBarSearch);
tlist.Add(_TextHelpBarParty);
tlist.Add(_TextOptionsTitle);
+ tlist.Add(_TextShortInfoTop);
- _ThemeStatics = new string[] {_StaticSearchBar, _StaticOptionsBG};
+ _ThemeStatics = new string[] {_StaticSearchBar, _StaticOptionsBG, _StaticShortInfoTop};
_ThemeTexts = tlist.ToArray();
_ThemeButtons = blist.ToArray();
_ThemeSelectSlides = new string[] {_SelectSlideOptionsMode, _SelectSlideOptionsPlaylistAdd, _SelectSlideOptionsPlaylistOpen, _SelectSlideOptionsNumMedleySongs};
@@ -153,6 +173,10 @@ namespace Vocaluxe.Screens
_ThemePlaylists = new string[] {_PlaylistName};
_DragAndDropCover = GetNewStatic();
+
+ _TimerShortInfoText = new System.Timers.Timer(5000);
+ _TimerShortInfoText.AutoReset = false;
+ _TimerShortInfoText.Elapsed += OnTimedEventShortInfoText;
}
protected override void _OnSongMenuChanged()
@@ -303,13 +327,56 @@ namespace Vocaluxe.Screens
if (keyEvent.Mod == EModifier.Ctrl && CSongs.NumSongsVisible > 0 && !_Sso.Selection.PartyMode)
_StartMedleySong(_SongMenu.GetPreviewSongNr());
break;
+
+ case Keys.T:
+ if (keyEvent.Mod == EModifier.Ctrl && !_Sso.Selection.PartyMode)
+ {
+ _ToggleTabs();
+ }
+ break;
+
+ case Keys.D0:
+ case Keys.D1:
+ case Keys.D2:
+ case Keys.D3:
+ case Keys.D4:
+ case Keys.D5:
+ case Keys.D6:
+ case Keys.D7:
+ case Keys.D8:
+ case Keys.D9:
+ if (keyEvent.Mod == EModifier.Ctrl && !_Sso.Selection.PartyMode)
+ {
+ int tempSortNr = -1;
+ int.TryParse(keyEvent.Key.ToString().Substring(1), out tempSortNr);
+
+ if (tempSortNr == 0)
+ tempSortNr = 10;
+
+ _ToggleSort(tempSortNr);
+ }
+ break;
+
+ case Keys.H:
+ if (keyEvent.Mod == EModifier.Ctrl && CSongs.NumSongsVisible > 0 && !_Sso.Selection.PartyMode)
+ {
+ _ShowHighscore();
+ }
+ break;
+
+ case Keys.L:
+ if (keyEvent.Mod == EModifier.Ctrl)
+ {
+ _TogglePlaylistFilter();
+ }
+ break;
}
if (!_SearchActive)
{
switch (keyEvent.Key)
{
case Keys.Space:
- if (!_Sso.Selection.PartyMode)
+ if (!_Sso.Selection.PartyMode && !_Playlist.isPlaylistNameEditMode())
_ToggleSongOptions(ESongOptionsView.General);
break;
@@ -400,6 +467,10 @@ namespace Vocaluxe.Screens
_ToggleSongOptions(ESongOptionsView.None);
_StartRandomMedley(_SelectSlides[_SelectSlideOptionsNumMedleySongs].Selection + 1, !CSongs.IsInCategory);
}
+ else if (_Buttons[_ButtonOptionsHighscore].Selected)
+ {
+ _ShowHighscore();
+ }
break;
case Keys.Escape:
@@ -575,6 +646,10 @@ namespace Vocaluxe.Screens
_StartRandomMedley(_SelectSlides[_SelectSlideOptionsNumMedleySongs].Selection + 1, !CSongs.IsInCategory);
return true;
}
+ else if (_Buttons[_ButtonOptionsHighscore].Selected)
+ {
+ _ShowHighscore();
+ }
else if (_Sso.Selection.RandomOnly && _Sso.Selection.NumJokers != null)
{
if (_Buttons[_ButtonStart].Selected)
@@ -689,6 +764,9 @@ namespace Vocaluxe.Screens
_DragAndDropCover.Visible = false;
_Playlist.DragAndDropSongID = -1;
+ _Statics[_StaticShortInfoTop].Visible = false;
+ _Texts[_TextShortInfoTop].Visible = false;
+
UpdateGame();
}
@@ -798,9 +876,6 @@ namespace Vocaluxe.Screens
CParty.OnSongChange(_SelectedSongID, ref _Sso);
}
- _Sso = CParty.GetSongSelectionOptions();
-
-
if (_Sso.Selection.PartyMode)
{
CSongs.Sort(_Sso.Sorting.SongSorting, _Sso.Sorting.Tabs, _Sso.Sorting.IgnoreArticles, _Sso.Sorting.SearchString, _Sso.Sorting.DuetOptions, _Sso.Sorting.FilterPlaylistID);
@@ -864,6 +939,55 @@ namespace Vocaluxe.Screens
}
}
+ private void _ToggleSort(int sortNr)
+ {
+ if (CBase.Songs.IsInCategory() && _Sso.Selection.CategoryChangeAllowed)
+ {
+ CBase.Songs.SetCategory(-1);
+ }
+
+ CSongs.Sorter.SongSorting = (ESongSorting)sortNr;
+ CConfig.Config.Game.SongSorting = CSongs.Sorter.SongSorting;
+ _Sso.Sorting.SongSorting = CSongs.Sorter.SongSorting;
+
+ _SongMenu.Update(_Sso);
+ _SongMenu.OnShow();
+
+ _Texts[_TextShortInfoTop].Text = CBase.Language.Translate("TR_SCREENSONG_SORTING").Replace("%s", CBase.Language.Translate(_Sso.Sorting.SongSorting.ToString()));
+ _Statics[_StaticShortInfoTop].Visible = true;
+ _Texts[_TextShortInfoTop].Visible = true;
+ _TimerShortInfoText.Stop();
+ _TimerShortInfoText.Enabled = true;
+ }
+
+ private void OnTimedEventShortInfoText(Object source, ElapsedEventArgs e)
+ {
+ _Statics[_StaticShortInfoTop].Visible = false;
+ _Texts[_TextShortInfoTop].Visible = false;
+ }
+
+ private void _ToggleTabs()
+ {
+ EOffOn tmpStatus = CSongs.Categorizer.Tabs;
+
+ if (tmpStatus == EOffOn.TR_CONFIG_ON)
+ CSongs.Categorizer.Tabs = EOffOn.TR_CONFIG_OFF;
+ else
+ CSongs.Categorizer.Tabs = EOffOn.TR_CONFIG_ON;
+
+ CConfig.Config.Game.Tabs = CSongs.Categorizer.Tabs;
+ _Sso.Sorting.Tabs = CSongs.Categorizer.Tabs;
+ _SongMenu.Update(_Sso);
+ _SongMenu.OnShow();
+ }
+
+ private void _ShowHighscore()
+ {
+ CGame.ClearSongs();
+ CScreenSong.setStaticSelectedSongID(CSongs.VisibleSongs[_SongMenu.GetPreviewSongNr()].ID);
+ CBase.Graphics.FadeTo(EScreen.Highscore);
+ }
+
private void _StartSong(int songNr)
{
if (CSongs.IsInCategory && (songNr >= 0))
@@ -1082,7 +1206,7 @@ namespace Vocaluxe.Screens
{
case ESongSorting.TR_CONFIG_ARTIST:
case ESongSorting.TR_CONFIG_ARTIST_LETTER:
- visibleID = _FindIndex(songs, start, element => element.Artist.StartsWith(searchString, StringComparison.OrdinalIgnoreCase));
+ visibleID = _FindIndex(songs, start, element => (_Sso.Sorting.IgnoreArticles == EOffOn.TR_CONFIG_ON ? element.ArtistSorting.StartsWith(searchString, StringComparison.OrdinalIgnoreCase) : element.Artist.StartsWith(searchString, StringComparison.OrdinalIgnoreCase)));
break;
case ESongSorting.TR_CONFIG_YEAR:
@@ -1091,7 +1215,7 @@ namespace Vocaluxe.Screens
break;
case ESongSorting.TR_CONFIG_TITLE_LETTER:
- visibleID = _FindIndex(songs, start, element => element.Title.StartsWith(searchString, StringComparison.OrdinalIgnoreCase));
+ visibleID = _FindIndex(songs, start, element => (_Sso.Sorting.IgnoreArticles == EOffOn.TR_CONFIG_ON ? element.TitleSorting.StartsWith(searchString, StringComparison.OrdinalIgnoreCase) : element.Title.StartsWith(searchString, StringComparison.OrdinalIgnoreCase)));
break;
case ESongSorting.TR_CONFIG_FOLDER:
@@ -1109,12 +1233,12 @@ namespace Vocaluxe.Screens
{
case ESongSorting.TR_CONFIG_FOLDER:
case ESongSorting.TR_CONFIG_TITLE_LETTER:
- visibleID = _FindIndex(songs, start, element => element.Artist.StartsWith(searchString, StringComparison.OrdinalIgnoreCase));
+ visibleID = _FindIndex(songs, start, element => (_Sso.Sorting.IgnoreArticles == EOffOn.TR_CONFIG_ON ? element.ArtistSorting.StartsWith(searchString, StringComparison.OrdinalIgnoreCase) : element.Artist.StartsWith(searchString, StringComparison.OrdinalIgnoreCase)));
break;
case ESongSorting.TR_CONFIG_ARTIST:
case ESongSorting.TR_CONFIG_ARTIST_LETTER:
- visibleID = _FindIndex(songs, start, element => element.Title.StartsWith(searchString, StringComparison.OrdinalIgnoreCase));
+ visibleID = _FindIndex(songs, start, element => (_Sso.Sorting.IgnoreArticles == EOffOn.TR_CONFIG_ON ? element.TitleSorting.StartsWith(searchString, StringComparison.OrdinalIgnoreCase) : element.Title.StartsWith(searchString, StringComparison.OrdinalIgnoreCase)));
break;
}
if (visibleID > -1)
@@ -1133,6 +1257,22 @@ namespace Vocaluxe.Screens
_JumpTo_lastSearchString = searchString;
}
+ public void _TogglePlaylistFilter()
+ {
+ if (_Sso.Sorting.FilterPlaylistID == _Playlist.ActivePlaylistID)
+ {
+ if (_Playlist.ActivePlaylistID == -1)
+ return;
+
+ _Sso.Sorting.FilterPlaylistID = -1;
+ }
+ else
+ _Sso.Sorting.FilterPlaylistID = _Playlist.ActivePlaylistID;
+
+ CSongs.Sort(_Sso.Sorting.SongSorting, _Sso.Sorting.Tabs, _Sso.Sorting.IgnoreArticles, _Sso.Sorting.SearchString, _Sso.Sorting.DuetOptions, _Sso.Sorting.FilterPlaylistID);
+ _SongMenu.OnShow();
+ }
+
private void _ApplyNewSearchFilter(string newFilterString)
{
CParty.SetSearchString(newFilterString, _SearchActive);
@@ -1185,6 +1325,7 @@ namespace Vocaluxe.Screens
_Buttons[_ButtonOptionsOpenSelectedItem].Visible = false;
_Buttons[_ButtonOptionsRandomMedley].Visible = false;
_Buttons[_ButtonOptionsStartMedley].Visible = false;
+ _Buttons[_ButtonOptionsHighscore].Visible = false;
_Texts[_TextOptionsTitle].Visible = false;
_Statics[_StaticOptionsBG].Visible = false;
_Buttons[_ButtonOpenOptions].Visible = true;
@@ -1241,6 +1382,7 @@ namespace Vocaluxe.Screens
_SelectSlides[_SelectSlideOptionsPlaylistAdd].Visible = true;
_Buttons[_ButtonOptionsSing].Visible = true;
_Buttons[_ButtonOptionsPlaylist].Visible = true;
+ _Buttons[_ButtonOptionsHighscore].Visible = true;
_SelectElement(_Buttons[_ButtonOptionsSing]);
_SetSelectSlidePlaylistToCurrentPlaylist();
}
diff --git a/VocaluxeLib/Menu/CPlaylist.cs b/VocaluxeLib/Menu/CPlaylist.cs
index 0a523d21..45517bf2 100644
--- a/VocaluxeLib/Menu/CPlaylist.cs
+++ b/VocaluxeLib/Menu/CPlaylist.cs
@@ -972,6 +972,11 @@ namespace VocaluxeLib.Menu
return false;
}
+ public bool isPlaylistNameEditMode()
+ {
+ return _EditMode == EEditMode.PlaylistName;
+ }
+
private void _PrepareList()
{
_PlaylistElements.Clear();
@@ -1197,4 +1202,4 @@ namespace VocaluxeLib.Menu
}
#endregion ThemeEdit
}
-}
\ No newline at end of file
+}
diff --git a/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs b/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs
index 1a173393..e644159c 100644
--- a/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs
+++ b/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs
@@ -63,6 +63,7 @@ namespace VocaluxeLib.Menu.SongMenu
public SThemeText TextArtist;
public SThemeText TextTitle;
public SThemeText TextSongLength;
+ public SThemeText TextSongYear;
public SThemeStatic StaticCoverBig;
public SThemeStatic StaticTextBG;
@@ -111,6 +112,7 @@ namespace VocaluxeLib.Menu.SongMenu
public SThemeText TextArtist;
public SThemeText TextTitle;
public SThemeText TextSongLength;
+ public SThemeText TextSongYear;
public SThemeStatic StaticCoverBig;
public SThemeStatic StaticTextBG;
@@ -220,7 +222,7 @@ namespace VocaluxeLib.Menu.SongMenu
EScreen check = CBase.Graphics.GetNextScreenType();
if (CBase.Graphics.GetNextScreenType() == EScreen.Sing)
_ResetPreview(false);
- else if (CBase.Graphics.GetNextScreenType() != EScreen.Names || CBase.Config.GetBackgroundMusicStatus() == EBackgroundMusicOffOn.TR_CONFIG_OFF)
+ else if ((CBase.Graphics.GetNextScreenType() != EScreen.Names && CBase.Graphics.GetNextScreenType() != EScreen.Highscore) || CBase.Config.GetBackgroundMusicStatus() == EBackgroundMusicOffOn.TR_CONFIG_OFF)
_ResetPreview();
}
diff --git a/VocaluxeLib/Menu/SongMenu/CSongMenuList.cs b/VocaluxeLib/Menu/SongMenu/CSongMenuList.cs
index 0221206d..8f023cf4 100644
--- a/VocaluxeLib/Menu/SongMenu/CSongMenuList.cs
+++ b/VocaluxeLib/Menu/SongMenu/CSongMenuList.cs
@@ -43,6 +43,7 @@ namespace VocaluxeLib.Menu.SongMenu
private readonly CText _Artist;
private readonly CText _Title;
private readonly CText _SongLength;
+ private readonly CText _SongYear;
private float _SpaceW;
private float _SpaceH;
@@ -118,19 +119,21 @@ namespace VocaluxeLib.Menu.SongMenu
_Artist = new CText(_Theme.SongMenuList.TextArtist, _PartyModeID);
_Title = new CText(_Theme.SongMenuList.TextTitle, _PartyModeID);
_SongLength = new CText(_Theme.SongMenuList.TextSongLength, _PartyModeID);
+ _SongYear = new CText(_Theme.SongMenuList.TextSongYear, _PartyModeID);
_CoverBig = new CStatic(_Theme.SongMenuList.StaticCoverBig, _PartyModeID);
_TextBG = new CStatic(_Theme.SongMenuList.StaticTextBG, _PartyModeID);
_DuetIcon = new CStatic(_Theme.SongMenuList.StaticDuetIcon, _PartyModeID);
_VideoIcon = new CStatic(_Theme.SongMenuList.StaticVideoIcon, _PartyModeID);
_MedleyCalcIcon = new CStatic(_Theme.SongMenuList.StaticMedleyCalcIcon, _PartyModeID);
_MedleyTagIcon = new CStatic(_Theme.SongMenuList.StaticMedleyTagIcon, _PartyModeID);
- _SubElements.AddRange(new IMenuElement[] {_Artist, _Title, _SongLength, _DuetIcon, _VideoIcon, _MedleyCalcIcon, _MedleyTagIcon});
+ _SubElements.AddRange(new IMenuElement[] {_Artist, _Title, _SongLength, _SongYear, _DuetIcon, _VideoIcon, _MedleyCalcIcon, _MedleyTagIcon});
}
private void _ReadSubTheme()
{
_Theme.SongMenuList.TextArtist = (SThemeText)_Artist.GetTheme();
_Theme.SongMenuList.TextSongLength = (SThemeText)_SongLength.GetTheme();
+ _Theme.SongMenuList.TextSongYear = (SThemeText)_SongYear.GetTheme();
_Theme.SongMenuList.TextTitle = (SThemeText)_Title.GetTheme();
_Theme.SongMenuList.StaticCoverBig = (SThemeStatic)_CoverBig.GetTheme();
_Theme.SongMenuList.StaticDuetIcon = (SThemeStatic)_DuetIcon.GetTheme();
@@ -217,6 +220,7 @@ namespace VocaluxeLib.Menu.SongMenu
_Artist.Text = String.Empty;
_Title.Text = String.Empty;
_SongLength.Text = String.Empty;
+ _SongYear.Text = String.Empty;
_DuetIcon.Visible = false;
_VideoIcon.Visible = false;
_MedleyCalcIcon.Visible = false;
@@ -245,6 +249,7 @@ namespace VocaluxeLib.Menu.SongMenu
_CoverBig.Texture = song.CoverTextureBig;
_Artist.Text = song.Artist;
_Title.Text = song.Title;
+ _SongYear.Text = song.Year;
_DuetIcon.Visible = song.IsDuet;
_VideoIcon.Visible = song.VideoFileName != "";
_MedleyCalcIcon.Visible = song.Medley.Source == EDataSource.Calculated;
@@ -344,19 +349,53 @@ namespace VocaluxeLib.Menu.SongMenu
break;
case Keys.PageUp:
- if (catChangePossible)
+ if (catChangePossible && CBase.Songs.IsInCategory() && (keyEvent.Mod == EModifier.Ctrl || keyEvent.Mod == EModifier.Alt))
{
_PrevCategory();
keyEvent.Handled = true;
}
+ else if (moveAllowed)
+ {
+ if ((_SelectionNr - _ListLength) <= 0)
+ _SelectionNr = 0;
+ else
+ _SelectionNr = _SelectionNr - _ListLength;
+ keyEvent.Handled = true;
+ }
break;
case Keys.PageDown:
- if (catChangePossible)
+ if (catChangePossible && CBase.Songs.IsInCategory() && (keyEvent.Mod == EModifier.Ctrl || keyEvent.Mod == EModifier.Alt))
{
_NextCategory();
keyEvent.Handled = true;
}
+ else if (moveAllowed)
+ {
+ int maxCount_PageDown = (CBase.Songs.GetTabs() == EOffOn.TR_CONFIG_ON && !CBase.Songs.IsInCategory() ? CBase.Songs.GetNumCategories() : CBase.Songs.GetNumSongsVisible());
+ if ((_SelectionNr + _ListLength) >= maxCount_PageDown)
+ _SelectionNr = maxCount_PageDown - 1;
+ else
+ _SelectionNr = _SelectionNr + _ListLength;
+ keyEvent.Handled = true;
+ }
+ break;
+
+ case Keys.Home:
+ if (moveAllowed)
+ {
+ _SelectionNr = 0;
+ keyEvent.Handled = true;
+ }
+ break;
+
+ case Keys.End:
+ int maxCount_End = (CBase.Songs.GetTabs() == EOffOn.TR_CONFIG_ON && !CBase.Songs.IsInCategory() ? CBase.Songs.GetNumCategories() : CBase.Songs.GetNumSongsVisible());
+ if (moveAllowed)
+ {
+ _SelectionNr = maxCount_End - 1;
+ keyEvent.Handled = true;
+ }
break;
case Keys.Left:
diff --git a/VocaluxeLib/Menu/SongMenu/CSongMenuTileBoard.cs b/VocaluxeLib/Menu/SongMenu/CSongMenuTileBoard.cs
index 478c918b..a5000bdf 100644
--- a/VocaluxeLib/Menu/SongMenu/CSongMenuTileBoard.cs
+++ b/VocaluxeLib/Menu/SongMenu/CSongMenuTileBoard.cs
@@ -42,6 +42,7 @@ namespace VocaluxeLib.Menu.SongMenu
private CText _Artist;
private CText _Title;
private CText _SongLength;
+ private CText _SongYear;
private int _NumW;
private int _NumH;
@@ -113,13 +114,14 @@ namespace VocaluxeLib.Menu.SongMenu
_Artist = new CText(_Theme.SongMenuTileBoard.TextArtist, _PartyModeID);
_Title = new CText(_Theme.SongMenuTileBoard.TextTitle, _PartyModeID);
_SongLength = new CText(_Theme.SongMenuTileBoard.TextSongLength, _PartyModeID);
+ _SongYear = new CText(_Theme.SongMenuTileBoard.TextSongYear, _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});
+ _SubElements.AddRange(new IMenuElement[] {_Artist, _Title, _SongLength, _SongYear, _DuetIcon, _VideoIcon, _MedleyCalcIcon, _MedleyTagIcon});
}
private void _UpdateTileSelection()
@@ -135,6 +137,7 @@ namespace VocaluxeLib.Menu.SongMenu
{
_Theme.SongMenuTileBoard.TextArtist = (SThemeText)_Artist.GetTheme();
_Theme.SongMenuTileBoard.TextSongLength = (SThemeText)_SongLength.GetTheme();
+ _Theme.SongMenuTileBoard.TextSongYear = (SThemeText)_SongYear.GetTheme();
_Theme.SongMenuTileBoard.TextTitle = (SThemeText)_Title.GetTheme();
_Theme.SongMenuTileBoard.StaticCoverBig = (SThemeStatic)_CoverBig.GetTheme();
_Theme.SongMenuTileBoard.StaticDuetIcon = (SThemeStatic)_DuetIcon.GetTheme();
@@ -208,6 +211,7 @@ namespace VocaluxeLib.Menu.SongMenu
_Artist.Text = String.Empty;
_Title.Text = String.Empty;
_SongLength.Text = String.Empty;
+ _SongYear.Text = String.Empty;
_DuetIcon.Visible = false;
_VideoIcon.Visible = false;
_MedleyCalcIcon.Visible = false;
@@ -236,6 +240,7 @@ namespace VocaluxeLib.Menu.SongMenu
_CoverBig.Texture = song.CoverTextureBig;
_Artist.Text = song.Artist;
_Title.Text = song.Title;
+ _SongYear.Text = song.Year;
_DuetIcon.Visible = song.IsDuet;
_VideoIcon.Visible = song.VideoFileName != "";
_MedleyCalcIcon.Visible = song.Medley.Source == EDataSource.Calculated;
@@ -335,19 +340,55 @@ namespace VocaluxeLib.Menu.SongMenu
break;
case Keys.PageUp:
- if (catChangePossible)
+ if (catChangePossible && CBase.Songs.IsInCategory() && (keyEvent.Mod == EModifier.Ctrl || keyEvent.Mod == EModifier.Alt))
{
_PrevCategory();
keyEvent.Handled = true;
}
+ else if (moveAllowed)
+ {
+ int numSongsPerPage = _NumH * _NumW;
+ if ((_SelectionNr - numSongsPerPage) <= 0)
+ _SelectionNr = 0;
+ else
+ _SelectionNr = _SelectionNr - numSongsPerPage;
+ keyEvent.Handled = true;
+ }
break;
case Keys.PageDown:
- if (catChangePossible)
+ if (catChangePossible && CBase.Songs.IsInCategory() && (keyEvent.Mod == EModifier.Ctrl || keyEvent.Mod == EModifier.Alt))
{
_NextCategory();
keyEvent.Handled = true;
}
+ else if (moveAllowed)
+ {
+ int numSongsPerPage = _NumH * _NumW;
+ int maxCount_PageDown = (CBase.Songs.GetTabs() == EOffOn.TR_CONFIG_ON && !CBase.Songs.IsInCategory() ? CBase.Songs.GetNumCategories() : CBase.Songs.GetNumSongsVisible());
+ if ((_SelectionNr + numSongsPerPage) >= maxCount_PageDown)
+ _SelectionNr = maxCount_PageDown - 1;
+ else
+ _SelectionNr = _SelectionNr + numSongsPerPage;
+ keyEvent.Handled = true;
+ }
+ break;
+
+ case Keys.Home:
+ if (moveAllowed)
+ {
+ _SelectionNr = 0;
+ keyEvent.Handled = true;
+ }
+ break;
+
+ case Keys.End:
+ int maxCount_End = (CBase.Songs.GetTabs() == EOffOn.TR_CONFIG_ON && !CBase.Songs.IsInCategory() ? CBase.Songs.GetNumCategories() : CBase.Songs.GetNumSongsVisible());
+ if (moveAllowed)
+ {
+ _SelectionNr = maxCount_End - 1;
+ keyEvent.Handled = true;
+ }
break;
case Keys.Left:
diff --git a/VocaluxeLib/Songs/CSong.cs b/VocaluxeLib/Songs/CSong.cs
index 063eb3a0..bc101698 100644
--- a/VocaluxeLib/Songs/CSong.cs
+++ b/VocaluxeLib/Songs/CSong.cs
@@ -288,6 +288,17 @@ namespace VocaluxeLib.Songs
return loader.ReadNotes();
}
+ public bool ReloadSong(bool reloadNotes)
+ {
+ var loader = new CSongLoader(this);
+ bool retValue = loader.ReadHeader();
+ if (!retValue)
+ return false;
+
+ retValue = loader.ReadNotes(reloadNotes);
+ return retValue;
+ }
+
public bool Save()
{
return Save(Path.Combine(Folder, FileName));
diff --git a/VocaluxeLib/Songs/CSongLoader.cs b/VocaluxeLib/Songs/CSongLoader.cs
index 99702bc8..ca642b4c 100644
--- a/VocaluxeLib/Songs/CSongLoader.cs
+++ b/VocaluxeLib/Songs/CSongLoader.cs
@@ -82,12 +82,16 @@ namespace VocaluxeLib.Songs
_Song.Languages.Clear();
_Song.Genres.Clear();
_Song.UnknownTags.Clear();
+ _Song.BackgroundFileNames.Clear();
_Song._Comment = "";
_Song.ManualEncoding = false;
_Song.Medley.Source = EDataSource.None;
_Song._CalculateMedley = true;
_Song.Preview.Source = EDataSource.None;
_Song.ShortEnd.Source = EDataSource.None;
+ _Song.Start = 0;
+ _Song.VideoGap = 0;
+ _Song.Preview.StartTime = 0;
var headerFlags = new EHeaderFlags();
StreamReader sr = null;
@@ -761,4 +765,4 @@ namespace VocaluxeLib.Songs
}
}
}
-}
\ No newline at end of file
+}