{* UltraStar Deluxe - Karaoke Game
*
* UltraStar Deluxe is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
* $URL$
* $Id$
*}
unit UScreenSongMenu;
interface
{$IFDEF FPC}
{$MODE Delphi}
{$ENDIF}
{$I switches.inc}
uses
UMenu,
SDL,
UDisplay,
UMusic,
UFiles,
SysUtils,
UThemes;
type
TScreenSongMenu = class(TMenu)
private
CurMenu: byte; // num of the cur. shown menu
public
Visible: boolean; // whether the menu should be drawn
constructor Create; override;
function ParseInput(PressedKey: cardinal; CharCode: UCS4Char; PressedDown: boolean): boolean; override;
procedure OnShow; override;
function Draw: boolean; override;
procedure MenuShow(sMenu: byte);
procedure HandleReturn;
end;
const
SM_Main = 1;
SM_PlayList = 64 or 1;
SM_Playlist_Add = 64 or 2;
SM_Playlist_New = 64 or 3;
SM_Playlist_DelItem = 64 or 5;
SM_Playlist_Load = 64 or 8 or 1;
SM_Playlist_Del = 64 or 8 or 5;
SM_Party_Main = 128 or 1;
SM_Party_Joker = 128 or 2;
var
ISelections: array of UTF8String;
SelectValue: integer;
implementation
uses
UGraphic,
UMain,
UIni,
UTexture,
ULanguage,
UParty,
UPlaylist,
USongs,
UUnicodeUtils;
function TScreenSongMenu.ParseInput(PressedKey: cardinal; CharCode: UCS4Char; PressedDown: boolean): boolean;
begin
Result := true;
if (PressedDown) then
begin // key down
if (CurMenu = SM_Playlist_New) and (Interaction=0) then
begin
// check normal keys
if IsAlphaNumericChar(CharCode) or
(CharCode in [Ord(' '), Ord('-'), Ord('_'), Ord('!'),
Ord(','), Ord('<'), Ord('/'), Ord('*'),
Ord('?'), Ord(''''), Ord('"')]) then
begin
Button[Interaction].Text[0].Text := Button[Interaction].Text[0].Text +
UCS4ToUTF8String(CharCode);
exit;
end;
// check special keys
case PressedKey of
SDLK_BACKSPACE:
begin
Button[Interaction].Text[0].DeleteLastLetter;
exit;
end;
end;
end;
// check normal keys
case UCS4UpperCase(CharCode) of
Ord('Q'):
begin
Result := false;
Exit;
end;
end;
// check special keys
case PressedKey of
SDLK_ESCAPE,
SDLK_BACKSPACE:
begin
AudioPlayback.PlaySound(SoundLib.Back);
Visible := false;
end;
SDLK_RETURN:
begin
HandleReturn;
end;
SDLK_DOWN: InteractNext;
SDLK_UP: InteractPrev;
SDLK_RIGHT:
begin
if (Interaction=3) then
InteractInc;
end;
SDLK_LEFT:
begin
if (Interaction=3) then
InteractDec;
end;
SDLK_1:
begin // jocker
// use joker
case CurMenu of
SM_Party_Main:
begin
ScreenSong.DoJoker(0)
end;
end;
end;
SDLK_2:
begin // jocker
// use joker
case CurMenu of
SM_Party_Main:
begin
ScreenSong.DoJoker(1)
end;
end;
end;
SDLK_3:
begin // jocker
// use joker
case CurMenu of
SM_Party_Main:
begin
ScreenSong.DoJoker(2)
end;
end;
end;
end; // case
end; // if
end;
constructor TScreenSongMenu.Create;
begin
inherited Create;
// create dummy selectslide entrys
SetLength(ISelections, 1);
ISelections[0] := 'Dummy';
AddText(Theme.SongMenu.TextMenu);
LoadFromTheme(Theme.SongMenu);
AddButton(Theme.SongMenu.Button1);
if (Length(Button[0].Text) = 0) then
AddButtonText(14, 20, 'Button 1');
AddButton(Theme.SongMenu.Button2);
if (Length(Button[1].Text) = 0) then
AddButtonText(14, 20, 'Button 2');
AddButton(Theme.SongMenu.Button3);
if (Length(Button[2].Text) = 0) then
AddButtonText(14, 20, 'Button 3');
AddSelectSlide(Theme.SongMenu.SelectSlide3, SelectValue, ISelections);
AddButton(Theme.SongMenu.Button4);
if (Length(Button[3].Text) = 0) then
AddButtonText(14, 20, 'Button 4');
Interaction := 0;
end;
function TScreenSongMenu.Draw: boolean;
begin
Result := inherited Draw;
end;
procedure TScreenSongMenu.OnShow;
begin
inherited;
end;
procedure TScreenSongMenu.MenuShow(sMenu: byte);
begin
Interaction := 0; // reset interaction
Visible := true; // set visible
case sMenu of
SM_Main:
begin
CurMenu := sMenu;
Text[0].Text := Language.Translate('SONG_MENU_NAME_MAIN');
Button[0].Visible := true;
Button[1].Visible := true;
Button[2].Visible := true;
Button[3].Visible := true;
SelectsS[0].Visible := false;
Button[0].Text[0].Text := Language.Translate('SONG_MENU_PLAY');
Button[1].Text[0].Text := Language.Translate('SONG_MENU_CHANGEPLAYERS');
Button[2].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_ADD');
Button[3].Text[0].Text := Language.Translate('SONG_MENU_EDIT');
end;
SM_PlayList:
begin
CurMenu := sMenu;
Text[0].Text := Language.Translate('SONG_MENU_NAME_PLAYLIST');
Button[0].Visible := true;
Button[1].Visible := true;
Button[2].Visible := true;
Button[3].Visible := true;
SelectsS[0].Visible := false;
Button[0].Text[0].Text := Language.Translate('SONG_MENU_PLAY');
Button[1].Text[0].Text := Language.Translate('SONG_MENU_CHANGEPLAYERS');
Button[2].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_DEL');
Button[3].Text[0].Text := Language.Translate('SONG_MENU_EDIT');
end;
SM_Playlist_Add:
begin
CurMenu := sMenu;
Text[0].Text := Language.Translate('SONG_MENU_NAME_PLAYLIST_ADD');
Button[0].Visible := true;
Button[1].Visible := false;
Button[2].Visible := false;
Button[3].Visible := true;
SelectsS[0].Visible := true;
Button[0].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_ADD_NEW');
Button[3].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_ADD_EXISTING');
SetLength(ISelections, Length(PlaylistMan.Playlists));
PlaylistMan.GetNames(ISelections);
if (Length(ISelections)>=1) then
begin
UpdateSelectSlideOptions(Theme.SongMenu.SelectSlide3, 0, ISelections, SelectValue);
end
else
begin
Button[3].Visible := false;
SelectsS[0].Visible := false;
Button[2].Visible := true;
Button[2].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_NOEXISTING');
end;
end;
SM_Playlist_New:
begin
CurMenu := sMenu;
Text[0].Text := Language.Translate('SONG_MENU_NAME_PLAYLIST_NEW');
Button[0].Visible := true;
Button[1].Visible := false;
Button[2].Visible := true;
Button[3].Visible := true;
SelectsS[0].Visible := false;
Button[0].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_NEW_UNNAMED');
Button[2].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_NEW_CREATE');
Button[3].Text[0].Text := Language.Translate('SONG_MENU_CANCEL');
end;
SM_Playlist_DelItem:
begin
CurMenu := sMenu;
Text[0].Text := Language.Translate('SONG_MENU_NAME_PLAYLIST_DELITEM');
Button[0].Visible := true;
Button[1].Visible := false;
Button[2].Visible := false;
Button[3].Visible := true;
SelectsS[0].Visible := false;
Button[0].Text[0].Text := Language.Translate('SONG_MENU_YES');
Button[3].Text[0].Text := Language.Translate('SONG_MENU_CANCEL');
end;
SM_Playlist_Load:
begin
CurMenu := sMenu;
Text[0].Text := Language.Translate('SONG_MENU_NAME_PLAYLIST_LOAD');
// show delete curent playlist button when playlist is opened
Button[0].Visible := (CatSongs.CatNumShow = -3);
Button[1].Visible := false;
Button[2].Visible := false;
Button[3].Visible := true;
SelectsS[0].Visible := true;
Button[0].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_DELCURRENT');
Button[3].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_LOAD');
SetLength(ISelections, Length(PlaylistMan.Playlists));
PlaylistMan.GetNames(ISelections);
if (Length(ISelections)>=1) then
begin
UpdateSelectSlideOptions(Theme.SongMenu.SelectSlide3, 0, ISelections, SelectValue);
Interaction := 3;
end
else
begin
Button[3].Visible := false;
SelectsS[0].Visible := false;
Button[2].Visible := true;
Button[2].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_NOEXISTING');
Interaction := 2;
end;
end;
SM_Playlist_Del:
begin
CurMenu := sMenu;
Text[0].Text := Language.Translate('SONG_MENU_NAME_PLAYLIST_DEL');
Button[0].Visible := true;
Button[1].Visible := false;
Button[2].Visible := false;
Button[3].Visible := true;
SelectsS[0].Visible := false;
Button[0].Text[0].Text := Language.Translate('SONG_MENU_YES');
Button[3].Text[0].Text := Language.Translate('SONG_MENU_CANCEL');
end;
SM_Party_Main:
begin
CurMenu := sMenu;
Text[0].Text := Language.Translate('SONG_MENU_NAME_PARTY_MAIN');
Button[0].Visible := true;
Button[1].Visible := false;
Button[2].Visible := false;
Button[3].Visible := true;
SelectsS[0].Visible := false;
Button[0].Text[0].Text := Language.Translate('SONG_MENU_PLAY');
//Button[1].Text[0].Text := Language.Translate('SONG_MENU_JOKER');
//Button[2].Text[0].Text := Language.Translate('SONG_MENU_PLAYMODI');
Button[3].Text[0].Text := Language.Translate('SONG_MENU_JOKER');
end;
SM_Party_Joker:
begin
CurMenu := sMenu;
Text[0].Text := Language.Translate('SONG_MENU_NAME_PARTY_JOKER');
// to-do : Party
Button[0].Visible := (Length(Party.Teams) >= 1) AND (Party.Teams[0].JokersLeft > 0);
Button[1].Visible := (Length(Party.Teams) >= 2) AND (Party.Teams[1].JokersLeft > 0);
Button[2].Visible := (Length(Party.Teams) >= 3) AND (Party.Teams[2].JokersLeft > 0);
Button[3].Visible := True;
SelectsS[0].Visible := False;
if (Button[0].Visible) then
Button[0].Text[0].Text := UTF8String(Party.Teams[0].Name);
if (Button[1].Visible) then
Button[1].Text[0].Text := UTF8String(Party.Teams[1].Name);
if (Button[2].Visible) then
Button[2].Text[0].Text := UTF8String(Party.Teams[2].Name);
Button[3].Text[0].Text := Language.Translate('SONG_MENU_CANCEL');
// set right interaction
if (not Button[0].Visible) then
begin
if (not Button[1].Visible) then
begin
if (not Button[2].Visible) then
Interaction := 4
else
Interaction := 2;
end
else
Interaction := 1;
end;
end;
end;
end;
procedure TScreenSongMenu.HandleReturn;
begin
case CurMenu of
SM_Main:
begin
case Interaction of
0: // button 1
begin
ScreenSong.StartSong;
Visible := false;
end;
1: // button 2
begin
// select new players then sing:
ScreenSong.SelectPlayers;
Visible := false;
end;
2: // button 3
begin
// show add to playlist menu
MenuShow(SM_Playlist_Add);
end;
3: // selectslide 3
begin
//Dummy
end;
4: // button 4
begin
ScreenSong.OpenEditor;
Visible := false;
end;
end;
end;
SM_PlayList:
begin
Visible := false;
case Interaction of
0: // button 1
begin
ScreenSong.StartSong;
Visible := false;
end;
1: // button 2
begin
// select new players then sing:
ScreenSong.SelectPlayers;
Visible := false;
end;
2: // button 3
begin
// show add to playlist menu
MenuShow(SM_Playlist_DelItem);
end;
3: // selectslide 3
begin
// dummy
end;
4: // button 4
begin
ScreenSong.OpenEditor;
Visible := false;
end;
end;
end;
SM_Playlist_Add:
begin
case Interaction of
0: // button 1
begin
MenuShow(SM_Playlist_New);
end;
3: // selectslide 3
begin
// dummy
end;
4: // button 4
begin
PlaylistMan.AddItem(ScreenSong.Interaction, SelectValue);
Visible := false;
end;
end;
end;
SM_Playlist_New:
begin
case Interaction of
0: // button 1
begin
// nothing, button for entering name
end;
2: // button 3
begin
// create playlist and add song
PlaylistMan.AddItem(
ScreenSong.Interaction,
PlaylistMan.AddPlaylist(Button[0].Text[0].Text));
Visible := false;
end;
3: // selectslide 3
begin
// cancel -> go back to add screen
MenuShow(SM_Playlist_Add);
end;
4: // button 4
begin
Visible := false;
end;
end;
end;
SM_Playlist_DelItem:
begin
Visible := false;
case Interaction of
0: // button 1
begin
// delete
PlayListMan.DelItem(PlayListMan.GetIndexbySongID(ScreenSong.Interaction));
Visible := false;
end;
4: // button 4
begin
MenuShow(SM_Playlist);
end;
end;
end;
SM_Playlist_Load:
begin
case Interaction of
0: // button 1 (Delete playlist)
begin
MenuShow(SM_Playlist_Del);
end;
4: // button 4
begin
// load playlist
PlaylistMan.SetPlayList(SelectValue);
Visible := false;
end;
end;
end;
SM_Playlist_Del:
begin
Visible := false;
case Interaction of
0: // button 1
begin
// delete
PlayListMan.DelPlaylist(PlaylistMan.CurPlayList);
Visible := false;
end;
4: // button 4
begin
MenuShow(SM_Playlist_Load);
end;
end;
end;
SM_Party_Main:
begin
case Interaction of
0: // button 1
begin
// start singing
Party.CallAfterSongSelect;
Visible := false;
end;
4: // button 4
begin
// joker
MenuShow(SM_Party_Joker);
end;
end;
end;
SM_Party_Joker:
begin
Visible := false;
case Interaction of
0: // button 1
begin
// joker team 1
ScreenSong.DoJoker(0);
end;
1: // button 2
begin
// joker team 2
ScreenSong.DoJoker(1);
end;
2: // button 3
begin
// joker team 3
ScreenSong.DoJoker(2);
end;
4: // button 4
begin
// cancel... (go back to old menu)
MenuShow(SM_Party_Main);
end;
end;
end;
end;
end;
end.