From 5b261086c70aa5154f06874ddbb82493c31c67fb Mon Sep 17 00:00:00 2001 From: tobigun Date: Mon, 12 Jan 2009 16:37:16 +0000 Subject: UTF8 support for song filter in song-select screen git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/branches/experimental@1562 b956fd51-792f-4845-bead-9b4dfca2ff2c --- unicode/src/base/USongs.pas | 98 +++++++++++++++++++++----------------- unicode/src/base/UTextEncoding.pas | 2 +- 2 files changed, 54 insertions(+), 46 deletions(-) (limited to 'unicode/src/base') diff --git a/unicode/src/base/USongs.pas b/unicode/src/base/USongs.pas index be880433..ac67eed0 100644 --- a/unicode/src/base/USongs.pas +++ b/unicode/src/base/USongs.pas @@ -66,6 +66,11 @@ uses UCatCovers; type + TSongFilter = ( + fltAll, + fltTitle, + fltArtist + ); TBPM = record BPM: real; @@ -128,7 +133,7 @@ type function VisibleSongs: integer; // returns number of visible songs (for tabs) function VisibleIndex(Index: integer): integer; // returns visible song index (skips invisible) - function SetFilter(FilterStr: string; const fType: Byte): Cardinal; + function SetFilter(FilterStr: UTF8String; Filter: TSongFilter): Cardinal; end; var @@ -151,13 +156,14 @@ const implementation -uses StrUtils, - UGraphic, - UCovers, - UFiles, - UMain, - UIni, - UUnicodeUtils; +uses + StrUtils, + UGraphic, + UCovers, + UFiles, + UMain, + UIni, + UUnicodeUtils; constructor TSongs.Create(); begin @@ -322,11 +328,11 @@ begin lSong := TSong.create( Dir + Files[i].Name ); if lSong.AnalyseXML then - SongList.add( lSong ) + SongList.add( lSong ) else begin - Log.LogError('AnalyseFile failed for "' + Files[i].Name + '".'); - freeandnil( lSong ); + Log.LogError('AnalyseFile failed for "' + Files[i].Name + '".'); + freeandnil( lSong ); end; end; @@ -600,8 +606,8 @@ begin begin LetterTmp := UTF8ToUCS4String(CurSong.Title)[0]; // pack all numbers into a category named '#' - if (LetterTmp in [UCS4Char('0') .. UCS4Char('9')]) then - LetterTmp := UCS4Char('#') + if (LetterTmp in [Ord('0') .. Ord('9')]) then + LetterTmp := Ord('#') else LetterTmp := UCS4UpperCase(LetterTmp); @@ -619,8 +625,8 @@ begin begin LetterTmp := UTF8ToUCS4String(CurSong.Artist)[0]; // pack all numbers into a category named '#' - if (LetterTmp in [UCS4Char('0') .. UCS4Char('9')]) then - LetterTmp := UCS4Char('#') + if (LetterTmp in [Ord('0') .. Ord('9')]) then + LetterTmp := Ord('#') else LetterTmp := UCS4UpperCase(LetterTmp); @@ -782,64 +788,66 @@ begin end; end; -function TCatSongs.SetFilter(FilterStr: string; const fType: Byte): Cardinal; +function TCatSongs.SetFilter(FilterStr: UTF8String; Filter: TSongFilter): Cardinal; var I, J: integer; - cString: string; - SearchStr: array of string; + TmpString: UTF8String; + WordArray: array of UTF8String; begin - {fType: 0: All - 1: Title - 2: Artist} FilterStr := Trim(FilterStr); - if FilterStr<>'' then + if (FilterStr <> '') then begin Result := 0; - //Create Search Array - SetLength(SearchStr, 1); - I := Pos (' ', FilterStr); + + // initialize word array + SetLength(WordArray, 1); + + // Copy words to SearchStr + I := Pos(' ', FilterStr); while (I <> 0) do begin - SetLength (SearchStr, Length(SearchStr) + 1); - cString := Copy(FilterStr, 1, I-1); - if (cString <> ' ') and (cString <> '') then - SearchStr[High(SearchStr)-1] := cString; - Delete (FilterStr, 1, I); + WordArray[High(WordArray)] := Copy(FilterStr, 1, I-1); + SetLength(WordArray, Length(WordArray) + 1); - I := Pos (' ', FilterStr); + FilterStr := TrimLeft(Copy(FilterStr, I+1, Length(FilterStr)-I)); + I := Pos(' ', FilterStr); end; - //Copy last Word - if (FilterStr <> ' ') and (FilterStr <> '') then - SearchStr[High(SearchStr)] := FilterStr; - for I:=0 to High(Song) do + // Copy last word + WordArray[High(WordArray)] := FilterStr; + + for I := 0 to High(Song) do begin if not Song[i].Main then begin - case fType of - 0: cString := Song[I].Artist + ' ' + Song[i].Title + ' ' + Song[i].Folder; - 1: cString := Song[I].Title; - 2: cString := Song[I].Artist; + case Filter of + fltAll: + TmpString := Song[I].Artist + ' ' + Song[i].Title + ' ' + UTF8Encode(Song[i].Folder); + fltTitle: + TmpString := Song[I].Title; + fltArtist: + TmpString := Song[I].Artist; end; Song[i].Visible:=True; - //Look for every Searched Word - for J := 0 to High(SearchStr) do + // Look for every Searched Word + for J := 0 to High(WordArray) do begin - Song[i].Visible := Song[i].Visible and AnsiContainsText(cString, SearchStr[J]) + Song[i].Visible := Song[i].Visible and + UTF8ContainsText(TmpString, WordArray[J]) end; if Song[i].Visible then Inc(Result); end else - Song[i].Visible:=False; + Song[i].Visible := False; end; CatNumShow := -2; end else begin - for i:=0 to High(Song) do + for i := 0 to High(Song) do begin - Song[i].Visible := (Ini.Tabs=1) = Song[i].Main; + Song[i].Visible := (Ini.Tabs = 1) = Song[i].Main; CatNumShow := -1; end; Result := 0; diff --git a/unicode/src/base/UTextEncoding.pas b/unicode/src/base/UTextEncoding.pas index 5adc02f8..61cd0098 100644 --- a/unicode/src/base/UTextEncoding.pas +++ b/unicode/src/base/UTextEncoding.pas @@ -54,7 +54,7 @@ const ); const - UTF8_BOM: AnsiString = #$EF#$BB#$BF; + UTF8_BOM: UTF8String = #$EF#$BB#$BF; {** * Changes encoding of string Src with encoding SrcEncoding to UTF-16 -- cgit v1.2.3