aboutsummaryrefslogblamecommitdiffstats
path: root/src/classes0/USkins.pas
blob: 88549c9ff42fe54e4c5b821c325d6c5a5a360850 (plain) (tree)
1
2
3
4
5
6
7
8
9
10

            

         



                

                 

































                                                             





              


                         
            







                         
     
                                                             

                                                    
                                                  







                                      


                                                           
 

                                                    
        












                                             
  
                                                                             
                                                


                                                                










                                       
                                  

                           
                                                              




                                      


                                             





















                                                                                 


                               

                                                                          
      
































                                                                              
unit USkins;

interface

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

{$I switches.inc}

type
  TSkinTexture = record
    Name:       string;
    FileName:   string;
  end;

  TSkinEntry = record
    Theme:      string;
    Name:       string;
    Path:       string;
    FileName:   string;
    Creator:    string; // not used yet
  end;

  TSkin = class
    Skin:         array of TSkinEntry;
    SkinTexture:  array of TSkinTexture;
    SkinPath:     string;
    Color:        integer;
    constructor Create;
    procedure LoadList;
    procedure ParseDir(Dir: string);
    procedure LoadHeader(FileName: string);
    procedure LoadSkin(Name: string);
    function GetTextureFileName(TextureName: string): string;
    function GetSkinNumber(Name: string): integer;
    procedure onThemeChange;
  end;

var
  Skin:   TSkin;

implementation

uses IniFiles,
     Classes,
     SysUtils,
     UMain,
     ULog,
     UIni;

constructor TSkin.Create;
begin
  inherited;
  LoadList;
//  LoadSkin('Lisek');
//  SkinColor := Color;
end;

procedure TSkin.LoadList;
var
  SR:     TSearchRec;
begin
  if FindFirst(SkinsPath+'*', faDirectory, SR) = 0 then begin
    repeat
      if (SR.Name <> '.') and (SR.Name <> '..') then
        ParseDir(SkinsPath + SR.Name + PathDelim);
    until FindNext(SR) <> 0;
  end; // if
  FindClose(SR);
end;

procedure TSkin.ParseDir(Dir: string);
var
  SR:     TSearchRec;
begin
  if FindFirst(Dir + '*.ini', faAnyFile, SR) = 0 then begin
    repeat

      if (SR.Name <> '.') and (SR.Name <> '..') then
        LoadHeader(Dir + SR.Name);
        
    until FindNext(SR) <> 0;
  end;
end;

procedure TSkin.LoadHeader(FileName: string);
var
  SkinIni:    TMemIniFile;
  S:          integer;
begin
  SkinIni := TMemIniFile.Create(FileName);

  S := Length(Skin);
  SetLength(Skin, S+1);
  
  Skin[S].Path     := IncludeTrailingPathDelimiter(ExtractFileDir(FileName));
  Skin[S].FileName := ExtractFileName(FileName);
  Skin[S].Theme    := SkinIni.ReadString('Skin', 'Theme', '');
  Skin[S].Name     := SkinIni.ReadString('Skin', 'Name', '');
  Skin[S].Creator  := SkinIni.ReadString('Skin', 'Creator', '');

  SkinIni.Free;
end;

procedure TSkin.LoadSkin(Name: string);
var
  SkinIni:    TMemIniFile;
  SL:         TStringList;
  T:          integer;
  S:          integer;
begin
  S        := GetSkinNumber(Name);
  SkinPath := Skin[S].Path;

  SkinIni  := TMemIniFile.Create(SkinPath + Skin[S].FileName);

  SL := TStringList.Create;
  SkinIni.ReadSection('Textures', SL);

  SetLength(SkinTexture, SL.Count);
  for T := 0 to SL.Count-1 do
  begin
    SkinTexture[T].Name     := SL.Strings[T];
    SkinTexture[T].FileName := SkinIni.ReadString('Textures', SL.Strings[T], '');
  end;

  SL.Free;
  SkinIni.Free;
end;

function TSkin.GetTextureFileName(TextureName: string): string;
var
  T:    integer;
begin
  Result := '';
  
  for T := 0 to High(SkinTexture) do
  begin
    if ( SkinTexture[T].Name     = TextureName ) AND
       ( SkinTexture[T].FileName <> ''         ) then
    begin
      Result := SkinPath + SkinTexture[T].FileName;
    end;
  end;

  if ( TextureName <> '' ) AND
     ( Result      <> '' ) THEN
  begin
    //Log.LogError('', '-----------------------------------------');
    //Log.LogError(TextureName+' - '+ Result, 'TSkin.GetTextureFileName');
  end;

{  Result := SkinPath + 'Bar.jpg';
  if TextureName = 'Ball' then Result := SkinPath + 'Ball.bmp';
  if Copy(TextureName, 1, 4) = 'Gray' then Result := SkinPath + 'Ball.bmp';
  if Copy(TextureName, 1, 6) = 'NoteBG' then Result := SkinPath + 'Ball.bmp';}
end;

function TSkin.GetSkinNumber(Name: string): integer;
var
  S:    integer;
begin
  Result := 0; // set default to the first available skin
  for S := 0 to High(Skin) do
    if Skin[S].Name = Name then Result := S;
end;

procedure TSkin.onThemeChange;
var
  S:    integer;
  Name: String;
begin
  Ini.SkinNo:=0;
  SetLength(ISkin, 0);
  Name := Uppercase(ITheme[Ini.Theme]);
  for S := 0 to High(Skin) do
    if Name = Uppercase(Skin[S].Theme) then begin
      SetLength(ISkin, Length(ISkin)+1);
      ISkin[High(ISkin)] := Skin[S].Name;
    end;

end;

end.