aboutsummaryrefslogblamecommitdiffstats
path: root/us_maker_edition/src/base/UEditorLyrics.pas
blob: 5030eff5187152853fe58567654e3e06180a0c86 (plain) (tree)




































































































































































































                                                                        
                        





























































                                                                                
{* 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 UEditorLyrics;

interface

{$IFDEF FPC}
  {$MODE Delphi}
{$ENDIF}

{$I switches.inc}

uses
  SysUtils,
  gl,
  UMusic,
  UTexture;

type
  TAlignmentType = (atLeft, atCenter, atRight);

  TWord = record
    X:         real;
    Y:         real;
    Size:      real;
    Width:     real;
    Text:      string;
    ColR:      real;
    ColG:      real;
    ColB:      real;
    FontStyle: integer;
    Italic:    boolean;
    Selected:  boolean;
  end;

  TEditorLyrics = class
    private
      AlignI:     TAlignmentType;
      XR:         real;
      YR:         real;
      SizeR:      real;
      SelectedI:  integer;
      FontStyleI: integer;          // font number
      Word:       array of TWord;

      procedure SetX(Value: real);
      procedure SetY(Value: real);
      function GetClientX: real;
      procedure SetAlign(Value: TAlignmentType);
      function GetSize: real;
      procedure SetSize(Value: real);
      procedure SetSelected(Value: integer);
      procedure SetFontStyle(Value: integer);
      procedure AddWord(Text: UTF8String);
      procedure Refresh;
    public
      ColR:   real;
      ColG:   real;
      ColB:   real;
      ColSR:  real;
      ColSG:  real;
      ColSB:  real;
      Italic: boolean;

      constructor Create;
      destructor Destroy; override;

      procedure AddLine(NrLine: integer);

      procedure Clear;
      procedure Draw;
    published
      property X: real write SetX;
      property Y: real write SetY;
      property ClientX: real read GetClientX;
      property Align: TAlignmentType write SetAlign;
      property Size: real read GetSize write SetSize;
      property Selected: integer read SelectedI write SetSelected;
      property FontStyle: integer write SetFontStyle;
  end;

implementation

uses
  TextGL,
  UGraphic,
  UDrawTexture,
  Math,
  USkins;

constructor TEditorLyrics.Create;
begin
  inherited;
end;

destructor TEditorLyrics.Destroy;
begin
  SetLength(Word, 0);
  inherited;
end;

procedure TEditorLyrics.SetX(Value: real);
begin
  XR := Value;
end;

procedure TEditorLyrics.SetY(Value: real);
begin
  YR := Value;
end;

function TEditorLyrics.GetClientX: real;
begin
  Result := Word[0].X;
end;

procedure TEditorLyrics.SetAlign(Value: TAlignmentType);
begin
  AlignI := Value;
end;

function TEditorLyrics.GetSize: real;
begin
  Result := SizeR;
end;

procedure TEditorLyrics.SetSize(Value: real);
begin
  SizeR := Value;
end;

procedure TEditorLyrics.SetSelected(Value: integer);
begin
  if (-1 < SelectedI) and (SelectedI <= High(Word)) then
  begin
    Word[SelectedI].Selected := false;
    Word[SelectedI].ColR := ColR;
    Word[SelectedI].ColG := ColG;
    Word[SelectedI].ColB := ColB;
  end;

  SelectedI := Value;
  if (-1 < Value) and (Value <= High(Word)) then
  begin
    Word[Value].Selected := true;
    Word[Value].ColR := ColSR;
    Word[Value].ColG := ColSG;
    Word[Value].ColB := ColSB;
  end;

  Refresh;
end;

procedure TEditorLyrics.SetFontStyle(Value: integer);
begin
  FontStyleI := Value;
end;

procedure TEditorLyrics.AddWord(Text: UTF8String);
var
  WordNum: integer;
begin
  WordNum := Length(Word);
  SetLength(Word, WordNum + 1);
  if WordNum = 0 then
    Word[WordNum].X := XR
  else
    Word[WordNum].X := Word[WordNum - 1].X + Word[WordNum - 1].Width;

  Word[WordNum].Y := YR;
  Word[WordNum].Size := SizeR;
  Word[WordNum].FontStyle := FontStyleI;
  SetFontStyle(FontStyleI);
  SetFontSize(SizeR);
  SetFontItalic(Italic);
  Word[WordNum].Width := glTextWidth(Text);
  Word[WordNum].Text := Text;
  Word[WordNum].ColR := ColR;
  Word[WordNum].ColG := ColG;
  Word[WordNum].ColB := ColB;
  Word[WordNum].Italic := Italic;

  Refresh;
end;

procedure TEditorLyrics.AddLine(NrLine: integer);
var
  NoteIndex: integer;
begin
  Clear;
  for NoteIndex := 0 to Lines[0].Line[NrLine].HighNote do
  begin
    Italic := Lines[0].Line[NrLine].Note[NoteIndex].NoteType = ntFreestyle;
    AddWord(Lines[0].Line[NrLine].Note[NoteIndex].Text);
  end;
  Selected := -1;
end;

procedure TEditorLyrics.Clear;
begin
  SetLength(Word, 0);
  SelectedI := -1;
end;

procedure TEditorLyrics.Refresh;
var
  WordIndex:  integer;
  TotalWidth: real;
begin
  if AlignI = atCenter then
  begin
    TotalWidth := 0;
    for WordIndex := 0 to High(Word) do
      TotalWidth := TotalWidth + Word[WordIndex].Width;

    Word[0].X := XR - TotalWidth / 2;
    for WordIndex := 1 to High(Word) do
      Word[WordIndex].X := Word[WordIndex - 1].X + Word[WordIndex - 1].Width;
  end;
end;

procedure TEditorLyrics.Draw;
var
  WordIndex: integer;
begin
  for WordIndex := 0 to High(Word) do
  begin
    SetFontStyle(Word[WordIndex].FontStyle);
    SetFontPos(Word[WordIndex].X + 10*ScreenX, Word[WordIndex].Y);
    SetFontSize(Word[WordIndex].Size);
    SetFontItalic(Word[WordIndex].Italic);
    glColor3f(Word[WordIndex].ColR, Word[WordIndex].ColG, Word[WordIndex].ColB);
    glPrint(Word[WordIndex].Text);
  end;
end;

end.