unit UScreenSongJumpto; interface uses UMenu, SDL, UDisplay, UMusic, UFiles, SysUtils, UThemes, UVideo; type TScreenSongJumpto = class(TMenu) private //For ChangeMusic LastPlayed: Integer; VisibleBool: Boolean; isDuet: Boolean; public VisSongs: Integer; constructor Create; override; //Visible //Whether the Menu should be Drawn //Whether the Menu should be Drawn procedure SetVisible(Value: Boolean); property Visible: Boolean read VisibleBool write SetVisible; function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override; procedure onShow; override; function Draw: boolean; override; procedure SetTextFound(const Count: Cardinal); procedure ToggleDuetFilter(); procedure SetDuetFilter(); procedure ResetDuetFilter(); procedure RefreshDuetFilter(); end; var IType: Array [0..2] of String; SelectType: Integer; const ID='ID_031'; //for help system implementation uses UGraphic, UHelp, UMain, UIni, UTexture, ULanguage, UParty, USongs, UScreenSong, ULog; function TScreenSongJumpto.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; begin Result := true; If (PressedDown) Then begin // Key Down case PressedKey of SDLK_0..SDLK_9, SDLK_A..SDLK_Z, SDLK_SPACE, SDLK_MINUS, SDLK_EXCLAIM, SDLK_COMMA, SDLK_SLASH, SDLK_ASTERISK, SDLK_QUESTION, SDLK_QUOTE, SDLK_QUOTEDBL, SDLK_LEFTBRACKET, SDLK_SEMICOLON, SDLK_PERIOD: begin if not isDuet then begin if Interaction = 0 then begin Button[0].Text[0].Text := Button[0].Text[0].Text + chr(ScanCode); SetTextFound(CatSongs.SetFilter(Button[0].Text[0].Text, SelectType)); end; end; end; //MP3-Volume Up SDLK_PAGEUP: begin if (ScreenSong.MP3Volume<100) then begin ScreenSong.MP3Volume := ScreenSong.MP3Volume+5; Music.SetMusicVolume(ScreenSong.MP3Volume); end; ScreenSong.MP3VolumeHandler.changed := true; ScreenSong.MP3VolumeHandler.change_time := 0; end; //MP3-Volume Down SDLK_PAGEDOWN: begin if (ScreenSong.MP3Volume>0) then begin ScreenSong.MP3Volume := ScreenSong.MP3Volume-5; Music.SetMusicVolume(ScreenSong.MP3Volume); end; ScreenSong.MP3VolumeHandler.changed := true; ScreenSong.MP3VolumeHandler.change_time := 0; end; SDLK_TAB: begin ScreenPopupHelp.ShowPopup(); end; SDLK_BACKSPACE: begin if (Interaction = 0) AND (Length(Button[0].Text[0].Text) > 0) and not isDuet then begin Button[0].Text[0].DeleteLastL; SetTextFound(CatSongs.SetFilter(Button[0].Text[0].Text, SelectType)); end else if (Interaction = 0) and isDuet then begin Button[0].Text[0].Text := ''; SetTextFound(CatSongs.SetFilter(Button[0].Text[0].Text, SelectType)); isDuet := false; end; end; SDLK_F1: begin ToggleDuetFilter; end; SDLK_RETURN, SDLK_ESCAPE: begin Visible := False; Music.PlayBack; if (VisSongs = 0) AND (Length(Button[0].Text[0].Text) > 0) then begin ScreenSong.UnLoadDetailedCover; Button[0].Text[0].Text := ''; CatSongs.SetFilter('', 0); SetTextFound(0); end; if(ScreenSong.Mode = smNormal) and not ScreenSong.MakeMedley then begin ScreenSong.WaitHandler.changed := true; ScreenSong.WaitHandler.change_time := 0; end; end; // Up and Down could be done at the same time, // but I don't want to declare variables inside // functions like this one, called so many times SDLK_DOWN: begin {SelectNext; Button[0].Text[0].Selected := (Interaction = 0);} end; SDLK_UP: begin {SelectPrev; Button[0].Text[0].Selected := (Interaction = 0); } end; SDLK_RIGHT: begin Interaction := 1; InteractInc; if (Length(Button[0].Text[0].Text) > 0) then SetTextFound(CatSongs.SetFilter(Button[0].Text[0].Text, SelectType)); Interaction := 0; end; SDLK_LEFT: begin Interaction := 1; InteractDec; if (Length(Button[0].Text[0].Text) > 0) then SetTextFound(CatSongs.SetFilter(Button[0].Text[0].Text, SelectType)); Interaction := 0; end; end; end; end; constructor TScreenSongJumpto.Create; {var I: integer;} begin inherited Create; AddText(Theme.SongJumpto.TextFound); LoadFromTheme(Theme.SongJumpto); AddButton(Theme.SongJumpto.ButtonSearchText); if (Length(Button[0].Text) = 0) then AddButtonText(14, 20, ''); SelectType := 0; AddSelectSlide(Theme.SongJumpto.SelectSlideType, SelectType, Theme.SongJumpto.IType); Interaction := 0; LastPlayed := 0; isDuet := false; end; procedure TScreenSongJumpto.SetVisible(Value: Boolean); begin //If change from unvisible to Visible then OnShow if (VisibleBool = False) AND (Value = True) then OnShow; VisibleBool := Value; end; procedure TScreenSongJumpto.onShow; begin //Reset Screen if no Old Search is Displayed if (CatSongs.CatNumShow <> -2) then begin SelectsS[0].SetSelectOpt(0); Button[0].Text[0].Text := ''; Text[0].Text := Theme.SongJumpto.NoSongsFound; isDuet := false; end; //Select Input Interaction := 0; Button[0].Text[0].Selected := True; LastPlayed := ScreenSong.Interaction; if not Help.SetHelpID(ID) then Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenSongJumpTo)'); end; function TScreenSongJumpto.Draw: boolean; begin Result := inherited Draw; end; procedure TScreenSongJumpto.SetTextFound(const Count: Cardinal); begin if (Count = 0) then begin Text[0].Text := Theme.SongJumpto.NoSongsFound; if (Length(Button[0].Text[0].Text) = 0) then ScreenSong.HideCatTL else ScreenSong.ShowCatTLCustom(Format(Theme.SongJumpto.CatText, [Button[0].Text[0].Text])); end else begin Text[0].Text := Format(Theme.SongJumpto.SongsFound, [Count]); //Set CatTopLeftText ScreenSong.ShowCatTLCustom(Format(Theme.SongJumpto.CatText, [Button[0].Text[0].Text])); end; //Set visSongs VisSongs := Count; //Fix SongSelection ScreenSong.Interaction := high(CatSongs.Song); ScreenSong.SelectNext; ScreenSong.FixSelected; //Play Correct Music if (ScreenSong.Interaction <> LastPlayed) then begin LastPlayed := ScreenSong.Interaction; ScreenSong.ChangeMusic; end; end; procedure TScreenSongJumpto.ToggleDuetFilter; begin if not isDuet then SetDuetFilter else ResetDuetFilter; end; procedure TScreenSongJumpto.SetDuetFilter; begin isDuet := true; Button[0].Text[0].Text := 'Duet Songs'; SetTextFound(CatSongs.SetFilter('', 3)); end; procedure TScreenSongJumpto.ResetDuetFilter; begin isDuet := false; Button[0].Text[0].Text := ''; SetTextFound(CatSongs.SetFilter(Button[0].Text[0].Text, SelectType)); end; procedure TScreenSongJumpto.RefreshDuetFilter; begin if isDuet then SetDuetFilter else ResetDuetFilter; end; end.