Merge branch 'develop' into patch-5

This commit is contained in:
Stefan authored and GitHub committed 2020-01-12 15:08:27 +01:00
commit cfec2d940b
12 files changed
+273 -41

No files matched your search

+3
View File
@@ -152,6 +152,9 @@
<string name="TR_SCREENSONG_NUMSONGS">(%v songs)</string>
<string name="TR_SCREENSONG_NUMSONG">(%v song)</string>
<string name="TR_SCREENSONG_ARTIST_TITLE">%a - %t</string>
<string name="TR_SCREENSONG_HELPMESSAGE">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</string>
<string name="TR_SCREENSONG_HELPMESSAGESEARCH">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</string>
<string name="TR_SCREENSONG_HELPMESSAGEPARTY">1-6 = Press your team number to use a random song joker</string>
<string name="TR_SCREENSING_PAUSE">Pause</string>
<string name="TR_SCREENSING_BUTTON_CANCEL">Stop singing</string>
<string name="TR_SCREENSING_BUTTON_CONTINUE">Continue</string>
+3
View File
@@ -147,6 +147,9 @@
<string name="TR_SCREENSONG_NUMSONGS">(%v Lieder)</string>
<string name="TR_SCREENSONG_NUMSONG">(%v Lied)</string>
<string name="TR_SCREENSONG_ARTIST_TITLE">%a -%t</string>
<string name="TR_SCREENSONG_HELPMESSAGE">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ü</string>
<string name="TR_SCREENSONG_HELPMESSAGESEARCH">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</string>
<string name="TR_SCREENSONG_HELPMESSAGEPARTY">1-6 = Drücke die Teamnummer um einen Zufallssong Joker zu verwenden</string>
<string name="TR_SCREENSING_PAUSE">Pause</string>
<string name="TR_SCREENSING_BUTTON_CANCEL">Lied beenden</string>
<string name="TR_SCREENSING_BUTTON_CONTINUE">Fortfahren</string>
@@ -1,5 +1,14 @@
ScreenSong
++++++++++
Version 7:
Add:
<TextHelpBar>
<TextHelpBarSearch>
<TextHelpBarParty>
Shows key shortcut and search usage as small text line at the bottom of the screen.
++++++++++
Version 6:
@@ -43,4 +52,4 @@ to SongMenu
Add:
<StaticMedleyCalcIcon> and <StaticMedleyTagIcon>
to SongMenu.SongMenuTileBoard
++++++++++
++++++++++
+43 -1
View File
@@ -2,7 +2,7 @@
<Screen xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Informations>
<ScreenName>ScreenSong</ScreenName>
<ScreenVersion>6</ScreenVersion>
<ScreenVersion>7</ScreenVersion>
</Informations>
<Backgrounds>
<Background Name="Background1">
@@ -238,6 +238,48 @@
<Font>Outline</Font>
<Text>TR_SCREENSONG_SONGOPTIONS</Text>
</Text>
<Text Name="TextHelpBar">
<X>40</X>
<Y>700</Y>
<Z>0</Z>
<H>16</H>
<MaxW>1200</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Bottom</ResizeAlign>
<Style>Normal</Style>
<Font>Outline</Font>
<Text>TR_SCREENSONG_HELPMESSAGE</Text>
</Text>
<Text Name="TextHelpBarSearch">
<X>40</X>
<Y>700</Y>
<Z>0</Z>
<H>16</H>
<MaxW>1200</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Bottom</ResizeAlign>
<Style>Normal</Style>
<Font>Outline</Font>
<Text>TR_SCREENSONG_HELPMESSAGESEARCH</Text>
</Text>
<Text Name="TextHelpBarParty">
<X>40</X>
<Y>700</Y>
<Z>0</Z>
<H>16</H>
<MaxW>1200</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Bottom</ResizeAlign>
<Style>Normal</Style>
<Font>Outline</Font>
<Text>TR_SCREENSONG_HELPMESSAGEPARTY</Text>
</Text>
</Texts>
<Buttons>
<Button Name="ButtonJoker1">
@@ -427,6 +427,7 @@ namespace VocaluxeLib.PartyModes.Challenge
_ScreenSongOptions.Sorting.Tabs = CBase.Config.GetTabs();
_ScreenSongOptions.Sorting.FilterPlaylistID = -1;
_ScreenSongOptions.Selection.SongIndex = -1;
_ScreenSongOptions.Selection.CategoryIndex = -1;
_ScreenSongOptions.Selection.CategoryChangeAllowed = true;
break;
@@ -718,4 +719,4 @@ namespace VocaluxeLib.PartyModes.Challenge
return result;
}
}
}
}
+10 -10
View File
@@ -76,7 +76,7 @@ namespace Tests.VocaluxeLib.Log
StringAssert.Contains("Version = " + versionTag, log, "Main log version tag entry wrong");
StringAssert.Contains("[Verbose] " + _TestMessageWithResolvedData, log, "Main log entry wrong");
StringAssert.Contains(_TestMessageWithData, error, "Error message wrong");
StringAssert.Contains(_TestMessageWithResolvedData, error, "Error message wrong");
},
ELogLevel.Verbose);
@@ -129,7 +129,7 @@ namespace Tests.VocaluxeLib.Log
StringAssert.Contains("Version = " + versionTag, log, "Main log version tag entry wrong");
StringAssert.Contains("[Verbose] " + _TestMessageWithResolvedData, log, "Main log entry wrong");
StringAssert.Contains(_TestMessageWithData, error, "Error message wrong");
StringAssert.Contains(_TestMessageWithResolvedData, error, "Error message wrong");
},
ELogLevel.Verbose);
@@ -287,7 +287,7 @@ namespace Tests.VocaluxeLib.Log
StringAssert.Contains("Version = " + versionTag, log, "Main log version tag entry wrong");
StringAssert.Contains("[Debug] " + _TestMessageWithResolvedData, log, "Main log entry wrong");
StringAssert.Contains(_TestMessageWithData, error, "Error message wrong");
StringAssert.Contains(_TestMessageWithResolvedData, error, "Error message wrong");
},
ELogLevel.Verbose);
@@ -340,7 +340,7 @@ namespace Tests.VocaluxeLib.Log
StringAssert.Contains("Version = " + versionTag, log, "Main log version tag entry wrong");
StringAssert.Contains("[Debug] " + _TestMessageWithResolvedData, log, "Main log entry wrong");
StringAssert.Contains(_TestMessageWithData, error, "Error message wrong");
StringAssert.Contains(_TestMessageWithResolvedData, error, "Error message wrong");
},
ELogLevel.Verbose);
@@ -498,7 +498,7 @@ namespace Tests.VocaluxeLib.Log
StringAssert.Contains("Version = " + versionTag, log, "Main log version tag entry wrong");
StringAssert.Contains("[Information] " + _TestMessageWithResolvedData, log, "Main log entry wrong");
StringAssert.Contains(_TestMessageWithData, error, "Error message wrong");
StringAssert.Contains(_TestMessageWithResolvedData, error, "Error message wrong");
},
ELogLevel.Verbose);
@@ -551,7 +551,7 @@ namespace Tests.VocaluxeLib.Log
StringAssert.Contains("Version = " + versionTag, log, "Main log version tag entry wrong");
StringAssert.Contains("[Information] " + _TestMessageWithResolvedData, log, "Main log entry wrong");
StringAssert.Contains(_TestMessageWithData, error, "Error message wrong");
StringAssert.Contains(_TestMessageWithResolvedData, error, "Error message wrong");
},
ELogLevel.Verbose);
@@ -709,7 +709,7 @@ namespace Tests.VocaluxeLib.Log
StringAssert.Contains("Version = " + versionTag, log, "Main log version tag entry wrong");
StringAssert.Contains("[Warning] " + _TestMessageWithResolvedData, log, "Main log entry wrong");
StringAssert.Contains(_TestMessageWithData, error, "Error message wrong");
StringAssert.Contains(_TestMessageWithResolvedData, error, "Error message wrong");
},
ELogLevel.Verbose);
@@ -762,7 +762,7 @@ namespace Tests.VocaluxeLib.Log
StringAssert.Contains("Version = " + versionTag, log, "Main log version tag entry wrong");
StringAssert.Contains("[Warning] " + _TestMessageWithResolvedData, log, "Main log entry wrong");
StringAssert.Contains(_TestMessageWithData, error, "Error message wrong");
StringAssert.Contains(_TestMessageWithResolvedData, error, "Error message wrong");
},
ELogLevel.Verbose);
@@ -920,7 +920,7 @@ namespace Tests.VocaluxeLib.Log
StringAssert.Contains("Version = " + versionTag, log, "Main log version tag entry wrong");
StringAssert.Contains("[Error] " + _TestMessageWithResolvedData, log, "Main log entry wrong");
StringAssert.Contains(_TestMessageWithData, error, "Error message wrong");
StringAssert.Contains(_TestMessageWithResolvedData, error, "Error message wrong");
},
ELogLevel.Verbose);
@@ -973,7 +973,7 @@ namespace Tests.VocaluxeLib.Log
StringAssert.Contains("Version = " + versionTag, log, "Main log version tag entry wrong");
StringAssert.Contains("[Error] " + _TestMessageWithResolvedData, log, "Main log entry wrong");
StringAssert.Contains(_TestMessageWithData, error, "Error message wrong");
StringAssert.Contains(_TestMessageWithResolvedData, error, "Error message wrong");
},
ELogLevel.Verbose);
+1 -1
View File
@@ -101,7 +101,7 @@ namespace Tests.VocaluxeLib.Log
StringAssert.Contains("Version = " + versionTag, log, "Main log version tag entry wrong");
StringAssert.Contains("[<#= LogLevel #>] " + <#= WithData?"_TestMessageWithResolvedData":"_TestMessage" #>, log, "Main log entry wrong");
StringAssert.Contains(<#= WithData?"_TestMessageWithData":"_TestMessage" #>, error, "Error message wrong");
StringAssert.Contains(<#= WithData?"_TestMessageWithResolvedData":"_TestMessage" #>, error, "Error message wrong");
},
ELogLevel.Verbose);
+162 -3
View File
@@ -1,4 +1,4 @@
#region license
#region license
// This file is part of Vocaluxe.
//
// Vocaluxe is free software: you can redistribute it and/or modify
@@ -93,6 +93,89 @@ namespace Vocaluxe.Base
if (_SearchString != "")
searchStrings = _SearchString.ToUpper().Split(new char[] {' '});
String searchForArtist = null; // a:
String searchForTitle = null; // t:
String searchForGenre = null; // g:
String searchForYear = null; // y:
String searchForLanguage = null; // l:
String searchForCreator = null; // c:
String searchForEdition = null; // e:
String searchForAlbum = null; // al:
String searchForFileName = null; // fi:
String searchForFolderName = null; // fo:
bool expertSearch = false;
if (searchStrings != null)
{
foreach (String searchToken in searchStrings)
{
if (searchToken.Length < 3)
continue;
String temp = searchToken.Substring(0, 2);
bool foundIt = true;
switch (temp)
{
case "A:":
searchForArtist = searchToken.Substring(2);
break;
case "T:":
searchForTitle = searchToken.Substring(2);
break;
case "G:":
searchForGenre = searchToken.Substring(2);
break;
case "Y:":
searchForYear = searchToken.Substring(2);
break;
case "L:":
searchForLanguage = searchToken.Substring(2);
break;
case "C:":
searchForCreator = searchToken.Substring(2);
break;
case "E:":
searchForEdition = searchToken.Substring(2);
break;
default:
foundIt = false;
break;
}
if (foundIt)
{
if (!expertSearch) expertSearch = true;
continue;
}
if (searchToken.Length < 4)
continue;
foundIt = true;
temp = searchToken.Substring(0, 3);
switch (temp)
{
case "AL:":
searchForAlbum = searchToken.Substring(3);
break;
case "FI:":
searchForFileName = searchToken.Substring(3);
break;
case "FO:":
searchForFolderName = searchToken.Substring(3);
break;
default:
foundIt = false;
break;
}
if (foundIt && !expertSearch)
expertSearch = true;
}
}
foreach (CSong song in CSongs.Songs)
{
if (_PlaylistID != -1 && !CBase.Playlist.ContainsSong(_PlaylistID, song.ID))
@@ -102,9 +185,85 @@ namespace Vocaluxe.Base
{
if (searchStrings == null)
_FilteredSongs.Add(song);
else if (expertSearch)
{
// Stefan1200: Stop at a maximum of 500 search result to prevent performance issues
if (_FilteredSongs.Count >= 500)
break;
if (searchForAlbum != null && song.Album.ToUpper().Contains(searchForAlbum))
_FilteredSongs.Add(song);
if (searchForArtist != null && song.Artist.ToUpper().Contains(searchForArtist))
_FilteredSongs.Add(song);
if (searchForTitle != null && song.Title.ToUpper().Contains(searchForTitle))
_FilteredSongs.Add(song);
if (searchForCreator != null && song.Creator.ToUpper().Contains(searchForCreator))
_FilteredSongs.Add(song);
if (searchForFileName != null && song.FileName.ToUpper().Contains(searchForFileName))
_FilteredSongs.Add(song);
if (searchForFolderName != null && song.FolderName.ToUpper().Contains(searchForFolderName))
_FilteredSongs.Add(song);
if (searchForGenre != null)
{
foreach (String genre in song.Genres)
{
if (genre.ToUpper().Contains(searchForGenre))
_FilteredSongs.Add(song);
}
}
if (searchForLanguage != null)
{
foreach (String language in song.Languages)
{
if (language.ToUpper().Contains(searchForLanguage))
_FilteredSongs.Add(song);
}
}
if (searchForEdition != null)
{
foreach (String edition in song.Editions)
{
if (edition.ToUpper().Contains(searchForEdition))
_FilteredSongs.Add(song);
}
}
if (searchForYear != null)
{
int pos = searchForYear.IndexOf("-");
if (pos == -1)
{
if (song.Year.Contains(searchForYear))
_FilteredSongs.Add(song);
}
else if (searchForYear.Length == 9)
{
int yearStart = -1;
int yearEnd = -1;
if (!Int32.TryParse(searchForYear.Substring(0, pos), out yearStart))
continue;
if (!Int32.TryParse(searchForYear.Substring(pos + 1), out yearEnd))
continue;
// Stefan1200: Prevent searches like 0000-9999, limit for a max distance of 100 years
if (yearEnd - yearStart > 100)
continue;
int yearSearch = -1;
if (!Int32.TryParse(song.Year, out yearSearch))
continue;
if (yearSearch >= yearStart && yearSearch <= yearEnd)
_FilteredSongs.Add(song);
}
}
}
else
{
string search = song.Title.ToUpper() + " " + song.Artist.ToUpper() + " " + song.FolderName.ToUpper() + " " + song.FileName.ToUpper();
string search = song.Title.ToUpper() + " " + song.Artist.ToUpper();
if (searchStrings.All(search.Contains))
_FilteredSongs.Add(song);
@@ -114,4 +273,4 @@ namespace Vocaluxe.Base
_Changed = false;
}
}
}
}
+29 -16
View File
@@ -42,13 +42,16 @@ 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 6; }
get { return 7; }
}
private const string _TextCategory = "TextCategory";
private const string _TextSelection = "TextSelection";
private const string _TextSearchBarTitle = "TextSearchBarTitle";
private const string _TextSearchBar = "TextSearchBar";
private const string _TextHelpBar = "TextHelpBar";
private const string _TextHelpBarSearch = "TextHelpBarSearch";
private const string _TextHelpBarParty = "TextHelpBarParty";
private const string _TextOptionsTitle = "TextOptionsTitle";
private const string _ButtonOpenOptions = "ButtonOpenOptions";
@@ -137,6 +140,9 @@ namespace Vocaluxe.Screens
tlist.Add(_TextSelection);
tlist.Add(_TextSearchBarTitle);
tlist.Add(_TextSearchBar);
tlist.Add(_TextHelpBar);
tlist.Add(_TextHelpBarSearch);
tlist.Add(_TextHelpBarParty);
tlist.Add(_TextOptionsTitle);
_ThemeStatics = new string[] {_StaticSearchBar, _StaticOptionsBG};
@@ -282,6 +288,21 @@ namespace Vocaluxe.Screens
else if (!_Sso.Selection.PartyMode)
_SearchActive = true;
break;
case Keys.V:
if (keyEvent.Mod == EModifier.Ctrl && !_Sso.Selection.PartyMode)
_StartRandomVisibleSongs();
break;
case Keys.R:
if (keyEvent.Mod == EModifier.Ctrl && !_Sso.Selection.RandomOnly)
_SelectNextRandom(-1);
break;
case Keys.S:
if (keyEvent.Mod == EModifier.Ctrl && CSongs.NumSongsVisible > 0 && !_Sso.Selection.PartyMode)
_StartMedleySong(_SongMenu.GetPreviewSongNr());
break;
}
if (!_SearchActive)
{
@@ -296,23 +317,9 @@ namespace Vocaluxe.Screens
if (keyEvent.Mod == EModifier.Ctrl && !_Sso.Selection.PartyMode)
_StartRandomAllSongs();
break;
case Keys.V:
if (keyEvent.Mod == EModifier.Ctrl && !_Sso.Selection.PartyMode)
_StartRandomVisibleSongs();
break;
case Keys.R:
if (keyEvent.Mod == EModifier.Ctrl && !_Sso.Selection.RandomOnly)
_SelectNextRandom(-1);
break;
case Keys.S:
if (keyEvent.Mod == EModifier.Ctrl && CSongs.NumSongsVisible > 0 && !_Sso.Selection.PartyMode)
_StartMedleySong(_SongMenu.GetPreviewSongNr());
break;
case Keys.F:
if (keyEvent.Mod == EModifier.Ctrl)
if (keyEvent.Mod == EModifier.Ctrl && !_Sso.Selection.PartyMode)
_SearchActive = true;
break;
@@ -730,12 +737,18 @@ namespace Vocaluxe.Screens
_Texts[_TextSearchBar].Visible = true;
_Texts[_TextSearchBarTitle].Visible = true;
_Texts[_TextHelpBar].Visible = false;
_Texts[_TextHelpBarSearch].Visible = true;
_Texts[_TextHelpBarParty].Visible = false;
_Statics[_StaticSearchBar].Visible = true;
}
else
{
_Texts[_TextSearchBar].Visible = false;
_Texts[_TextSearchBarTitle].Visible = false;
_Texts[_TextHelpBar].Visible = !_Sso.Selection.PartyMode;
_Texts[_TextHelpBarSearch].Visible = false;
_Texts[_TextHelpBarParty].Visible = _Sso.Selection.PartyMode;
_Statics[_StaticSearchBar].Visible = false;
}
+1 -1
View File
@@ -198,7 +198,7 @@ namespace VocaluxeLib.Log
{
if (i >= propertyValues.Length)
return match.Value;
return propertyValues[i++].ToString();
return "\"" + propertyValues[i++] + "\"";
});
}
@@ -288,7 +288,9 @@ namespace VocaluxeLib.Menu.SongMenu
public void LeaveSelectedCategory()
{
_LeaveCategory();
// Stefan1200: This was implemented with the pull request #359 and is the reason for the bug described in issue #390.
// Currently disabled until we know if this is still needed or we find a better solution!
// _LeaveCategory();
}
public virtual void UnloadSkin() {}
@@ -425,4 +427,4 @@ namespace VocaluxeLib.Menu.SongMenu
}
#endregion ThemeEdit
}
}
}
+5 -5
View File
@@ -9,7 +9,7 @@ platform:
clone_depth: 15
environment:
GitHubKey:
secure: JSlN/em0JdspVn8jwaQ4IjugY6OQi0au4Qq0rhctJmcfGMaEGnUAOmDFULI48REW
secure: sGetWh2XUYs95VBT+QYNPtDW9Rh2/JBuxNNYXytpn7mMudUMcjSKDGErkCTum+ZE
init:
- git config --global core.autocrlf true
install:
@@ -63,7 +63,7 @@ before_build:
choco install "msbuild-sonarqube-runner" -y
SonarScanner.MSBuild.exe begin `
/k:"Vocaluxe" `
/d:sonar.organization="vocaluxe" `
/o:"vocaluxe" `
/d:sonar.host.url="https://sonarcloud.io" `
/d:sonar.login="$Env:SonarQubeToken" `
/d:"sonar.pullrequest.key=$env:APPVEYOR_PULL_REQUEST_NUMBER" `
@@ -74,7 +74,7 @@ before_build:
choco install "msbuild-sonarqube-runner" -y
SonarScanner.MSBuild.exe begin `
/k:"Vocaluxe" `
/d:sonar.organization="vocaluxe" `
/o:"vocaluxe" `
/d:sonar.host.url="https://sonarcloud.io" `
/v:"$Env:GIT_VERSION_TAG" `
/d:sonar.login="$Env:SonarQubeToken" `
@@ -135,7 +135,7 @@ deploy:
release: $(APPVEYOR_REPO_TAG_NAME)
description: $(APPVEYOR_REPO_COMMIT)
auth_token:
secure: JSlN/em0JdspVn8jwaQ4IjugY6OQi0au4Qq0rhctJmcfGMaEGnUAOmDFULI48REW
secure: sGetWh2XUYs95VBT+QYNPtDW9Rh2/JBuxNNYXytpn7mMudUMcjSKDGErkCTum+ZE
artifact: ReleaseZip
prerelease: $(IS_BETA_RELEASE)
on:
@@ -147,7 +147,7 @@ deploy:
release: Latest Nightly build
description: $(APPVEYOR_REPO_COMMIT)
auth_token:
secure: JSlN/em0JdspVn8jwaQ4IjugY6OQi0au4Qq0rhctJmcfGMaEGnUAOmDFULI48REW
secure: sGetWh2XUYs95VBT+QYNPtDW9Rh2/JBuxNNYXytpn7mMudUMcjSKDGErkCTum+ZE
artifact: ReleaseZip
prerelease: true
on: