{* 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 UMenuSelectSlide; interface {$IFDEF FPC} {$MODE Delphi} {$ENDIF} {$I switches.inc} uses TextGL, UTexture, gl, UMenuText; type PSelectSlide = ^TSelectSlide; TSelectSlide = class private SelectBool: boolean; public // objects Text: TText; // Main text describing option TextOpt: array of TText; // 3 texts in the position of possible options TextOptT: array of string; // array of names for possible options Texture: TTexture; // Select Texture TextureSBG: TTexture; // Background Selections Texture // TextureS: array of TTexture; // Selections Texture (not used) // TextureArrowL: TTexture; // Texture for left arrow (not used yet) // TextureArrowR: TTexture; // Texture for right arrow (not used yet) SelectOptInt: integer; PData: ^integer; //For automatically Setting LineCount Lines: Byte; //Visibility Visible: Boolean; // for selection and deselection // main static ColR: real; ColG: real; ColB: real; Int: real; DColR: real; DColG: real; DColB: real; DInt: real; // main text TColR: real; TColG: real; TColB: real; TInt: real; TDColR: real; TDColG: real; TDColB: real; TDInt: real; // selection background static SBGColR: real; SBGColG: real; SBGColB: real; SBGInt: real; SBGDColR: real; SBGDColG: real; SBGDColB: real; SBGDInt: real; // selection text STColR: real; STColG: real; STColB: real; STInt: real; STDColR: real; STDColG: real; STDColB: real; STDInt: real; // position and size property X: real read Texture.x write Texture.x; property Y: real read Texture.y write Texture.y; property W: real read Texture.w write Texture.w; property H: real read Texture.h write Texture.h; // property X2: real read Texture2.x write Texture2.x; // property Y2: real read Texture2.y write Texture2.y; // property W2: real read Texture2.w write Texture2.w; // property H2: real read Texture2.h write Texture2.h; property SBGW: real read TextureSBG.w write TextureSBG.w; // procedures procedure SetSelect(Value: boolean); property Selected: Boolean read SelectBool write SetSelect; procedure SetSelectOpt(Value: integer); property SelectedOption: integer read SelectOptInt write SetSelectOpt; procedure Draw; constructor Create; //Automatically Generate Lines (Texts) procedure genLines; end; implementation uses UDrawTexture, math, ULog, SysUtils; // ------------ Select constructor TSelectSlide.Create; begin inherited Create; Text := TText.Create; SetLength(TextOpt, 1); TextOpt[0] := TText.Create; //Set Standard Width for Selections Background SBGW := 450; Visible := True; {SetLength(TextOpt, 3); TextOpt[0] := TText.Create; TextOpt[1] := TText.Create; TextOpt[2] := TText.Create;} end; procedure TSelectSlide.SetSelect(Value: boolean); {var SO: integer; I: integer;} begin SelectBool := Value; if Value then begin Texture.ColR := ColR; Texture.ColG := ColG; Texture.ColB := ColB; Texture.Int := Int; Text.ColR := TColR; Text.ColG := TColG; Text.ColB := TColB; Text.Int := TInt; TextureSBG.ColR := SBGColR; TextureSBG.ColG := SBGColG; TextureSBG.ColB := SBGColB; TextureSBG.Int := SBGInt; { for I := 0 to High(TextOpt) do begin TextOpt[I].ColR := STColR; TextOpt[I].ColG := STColG; TextOpt[I].ColB := STColB; TextOpt[I].Int := STInt; end;} end else begin Texture.ColR := DColR; Texture.ColG := DColG; Texture.ColB := DColB; Texture.Int := DInt; Text.ColR := TDColR; Text.ColG := TDColG; Text.ColB := TDColB; Text.Int := TDInt; TextureSBG.ColR := SBGDColR; TextureSBG.ColG := SBGDColG; TextureSBG.ColB := SBGDColB; TextureSBG.Int := SBGDInt; { for I := 0 to High(TextOpt) do begin TextOpt[I].ColR := STDColR; TextOpt[I].ColG := STDColG; TextOpt[I].ColB := STDColB; TextOpt[I].Int := STDInt; end;} end; end; procedure TSelectSlide.SetSelectOpt(Value: integer); var SO: integer; HalfL: integer; HalfR: integer; procedure DoSelection(Sel: Cardinal); var I: Integer; begin for I := low(TextOpt) to high(TextOpt) do begin TextOpt[I].ColR := STDColR; TextOpt[I].ColG := STDColG; TextOpt[I].ColB := STDColB; TextOpt[I].Int := STDInt; end; if (integer(Sel) <= high(TextOpt)) then begin TextOpt[Sel].ColR := STColR; TextOpt[Sel].ColG := STColG; TextOpt[Sel].ColB := STColB; TextOpt[Sel].Int := STInt; end; end; begin SelectOptInt := Value; PData^ := Value; // SetSelect(true); // reset all colors if (Length(TextOpt)>0) AND (Length(TextOptT)>0) then begin if (Value <= 0) then begin //First Option Selected Value := 0; for SO := low (TextOpt) to high(TextOpt) do begin TextOpt[SO].Text := TextOptT[SO]; end; DoSelection(0); end else if (Value >= high(TextOptT)) then begin //Last Option Selected Value := high(TextOptT); for SO := high(TextOpt) downto low (TextOpt) do begin TextOpt[SO].Text := TextOptT[high(TextOptT)-(Lines-SO-1)]; end; DoSelection(Lines-1); end else begin HalfL := Ceil((Lines-1)/2); HalfR := Lines-1-HalfL; if (Value <= HalfL) then begin //Selected Option is near to the left side {HalfL := Value; HalfR := Lines-1-HalfL;} //Change Texts for SO := low (TextOpt) to high(TextOpt) do begin TextOpt[SO].Text := TextOptT[SO]; end; DoSelection(Value); end else if (Value > High(TextOptT)-HalfR) then begin //Selected is too near to the right border HalfR := high(TextOptT) - Value; HalfL := Lines-1-HalfR; //Change Texts for SO := high(TextOpt) downto low (TextOpt) do begin TextOpt[SO].Text := TextOptT[high(TextOptT)-(Lines-SO-1)]; end; DoSelection (HalfL); end else begin //Change Texts for SO := low (TextOpt) to high(TextOpt) do begin TextOpt[SO].Text := TextOptT[Value - HalfL + SO]; end; DoSelection(HalfL); end; end; end; end; procedure TSelectSlide.Draw; var SO: integer; begin if Visible then begin DrawTexture(Texture); DrawTexture(TextureSBG); Text.Draw; for SO := low(TextOpt) to high(TextOpt) do TextOpt[SO].Draw; end; end; procedure TSelectSlide.GenLines; var maxlength: Real; I: Integer; begin SetFontStyle(0{Text.Style}); SetFontSize(Text.Size); maxlength := 0; for I := low(TextOptT) to high (TextOptT) do begin if (glTextWidth(TextOptT[I]) > maxlength) then maxlength := glTextWidth(TextOptT[I]); end; Lines := floor((TextureSBG.W-40) / (maxlength+7)); if (Lines > Length(TextOptT)) then Lines := Length(TextOptT); if (Lines <= 0) then Lines := 1; //Free old Space used by Texts For I := low(TextOpt) to high(TextOpt) do TextOpt[I].Free; setLength (TextOpt, Lines); for I := low(TextOpt) to high(TextOpt) do begin TextOpt[I] := TText.Create; TextOpt[I].Size := Text.Size; //TextOpt[I].Align := 1; TextOpt[I].Align := 0; TextOpt[I].Visible := True; TextOpt[I].ColR := STDColR; TextOpt[I].ColG := STDColG; TextOpt[I].ColB := STDColB; TextOpt[I].Int := STDInt; //Generate Positions //TextOpt[I].X := TextureSBG.X + 20 + (TextureSBG.W / Lines) * (I + 0.5); if (I <> High(TextOpt)) OR (High(TextOpt) = 0) OR (Length(TextOptT) = Lines) then TextOpt[I].X := TextureSBG.X + 20 + (TextureSBG.W / Lines) * I else TextOpt[I].X := TextureSBG.X + TextureSBG.W - maxlength; TextOpt[I].Y := TextureSBG.Y + (TextureSBG.H - Text.Size) / 2; //Better Look with 2 Options if (Lines=2) AND (Length(TextOptT)= 2) then TextOpt[I].X := TextureSBG.X + 20 + (TextureSBG.W -40 - glTextWidth(TextOptT[1])) * I; end; end; end.