unit Umainform;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, UDataBase, ShellAPI, ShlObj, USongs;

type
  Tmainform = class(TForm)
    Label1: TLabel;
    lFolder: TLabel;
    bFLoad: TButton;
    Label2: TLabel;
    lDatabase: TLabel;
    bDLoad: TButton;
    lDatabase2: TLabel;
    lFolder2: TLabel;
    bToDB: TButton;
    bFromDB: TButton;
    pProgress: TProgressBar;
    oDatabase: TOpenDialog;
    lStatus: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure bDLoadClick(Sender: TObject);
    function BrowseDialog (const Title: string; const Flag: integer): string;
    procedure bFLoadClick(Sender: TObject);
    procedure UpdateLoadedSongs(Path: String; Count: integer);
    procedure bToDBClick(Sender: TObject);
    procedure bFromDBClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  mainform: Tmainform;
  DBLoaded: Boolean;
  SFLoaded: Boolean;


implementation

uses UScores;

{$R *.dfm}

function Tmainform.BrowseDialog
 (const Title: string; const Flag: integer): string;
var
  lpItemID : PItemIDList;
  BrowseInfo : TBrowseInfo;
  DisplayName : array[0..MAX_PATH] of char;
  TempPath : array[0..MAX_PATH] of char;
begin
  Result:='';
  FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
  with BrowseInfo do begin
    hwndOwner := Application.Handle;
    pszDisplayName := @DisplayName;
    lpszTitle := PChar(Title);
    ulFlags := Flag;
  end;
  lpItemID := SHBrowseForFolder(BrowseInfo);
  if lpItemId <> nil then begin
    SHGetPathFromIDList(lpItemID, TempPath);
    Result := TempPath;
    GlobalFreePtr(lpItemID);
  end;
end;

procedure Tmainform.FormCreate(Sender: TObject);
begin
  Database := TDataBaseSystem.Create;
  Songs := TSongs.Create;
  lStatus.Caption := 'Welcome to USD Score Converter';
  lFolder2.Caption := 'No Songs loaded';
  lFolder.Caption := '';
  lDataBase2.Caption := 'No Database loaded';
  lDataBase.Caption := '';
end;

procedure Tmainform.bDLoadClick(Sender: TObject);
begin
  if oDatabase.Execute then
  begin
    try
      Database.Init(oDataBase.FileName);
      lDataBase2.Caption := 'Database loaded';
      lDataBase.Caption := oDataBase.FileName;
      DBLoaded := True;
    except
      lDataBase2.Caption := 'No Database loaded';
      lDataBase.Caption := '';
      DBLoaded := False;
    end;
  end;
  bToDB.Enabled := DBLoaded and SFLoaded;
  bFromDB.Enabled := bToDB.Enabled;
end;

procedure Tmainform.bFLoadClick(Sender: TObject);
var
  Path: String;
begin
  Path := BrowseDialog('Select UltraStar SongFolder', BIF_RETURNONLYFSDIRS);

  if Path <> '' then
  begin
    SetLength(Songs.Song, 0);
    try
      Songs.BrowseDir(Path + '\');
      lFolder2.Caption := Inttostr(Length(Songs.Song)) + ' Songs loaded';
      lFolder.Caption := Path;
      SFLoaded := True;
    except
      lFolder2.Caption := 'No Songs loaded';
      lFolder.Caption := '';
      SFLoaded := False;
    end;
  end;

  bToDB.Enabled := DBLoaded and SFLoaded;
  bFromDB.Enabled := bToDB.Enabled;
end;

procedure Tmainform.UpdateLoadedSongs(Path: String; Count: integer);
begin
  lFolder2.Caption := Inttostr(Count) + ' Songs loaded';
  lFolder.Caption := Path;
  Application.ProcessMessages;
end;

procedure Tmainform.bToDBClick(Sender: TObject);
var
  I, J, K: Integer;
  LastI: integer;
begin
  pProgress.Max := high(Songs.Song);
  pProgress.Position := 0;
  // Go through all Songs
  For I := 0 to high(Songs.Song) do
  begin
    try
      //Read Scores from .SCO File
      ReadScore (Songs.Song[I]);

      //Go from Easy to Difficult
      For J := 0 to 2 do
      begin
        //Go through all Score Entrys with Difficulty J
        For K := 0 to high(Songs.Song[I].Score[J]) do
        begin
          //Add to DataBase
          DataBase.AddScore(Songs.Song[I], J, Songs.Song[I].Score[J][K].Name, Songs.Song[I].Score[J][K].Score);
        end;
      end;

    except
      showmessage ('Error Converting Score From Song: ' + Songs.Song[I].Path  + Songs.Song[I].FileName);
    end;

    //Update ProgressBar
    if (LastI <> I div 30) then
    begin
      LastI := I div 30;
      pProgress.Position := I;
      lStatus.Caption := 'Adding Songscore: ' + Songs.Song[I].Artist + ' - ' + Songs.Song[I].Title;
      Application.ProcessMessages;
    end;
  end;

  pProgress.Position := pProgress.Max;
  lStatus.Caption := 'Finished';
end;

procedure Tmainform.bFromDBClick(Sender: TObject);
var
  I, J, K: Integer;
  LastI: integer;
  anyScoreinthere: boolean;
begin
  pProgress.Max := high(Songs.Song);
  pProgress.Position := 0;
  // Go through all Songs
  For I := 0 to high(Songs.Song) do
  begin
    try
      //Not Write ScoreFile when there are no Scores for this File
      anyScoreinthere := false;
      //Read Scores from DB File
      Database.ReadScore (Songs.Song[I]);

      //Go from Easy to Difficult
      For J := 0 to 2 do
      begin
        //Go through all Score Entrys with Difficulty J
        For K := 0 to high(Songs.Song[I].Score[J]) do
        begin
          //Add to ScoreFile
          AddScore(Songs.Song[I], J, Songs.Song[I].Score[J][K].Name, Songs.Song[I].Score[J][K].Score);
          anyScoreinthere := True;
        end;
      end;

      if AnyScoreinThere then
        WriteScore(Songs.Song[I]);

    except
      showmessage ('Error Converting Score From Song: ' + Songs.Song[I].Path  + Songs.Song[I].FileName);
    end;

    //Update ProgressBar
    if (LastI <> I div 30) then
    begin
      LastI := I div 30;
      pProgress.Position := I;
      lStatus.Caption := 'Writing ScoreFile: ' + Songs.Song[I].Artist + ' - ' + Songs.Song[I].Title;
      Application.ProcessMessages;
    end;
  end;

  pProgress.Position := pProgress.Max;
  lStatus.Caption := 'Finished';
end;

end.