unit thememanagerform;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls,ColorPicker,global,resourceskins;

type TResourceDescriptor =record
group : integer;
index : integer;
resname : string;
friendlyname : string;
jpeg : boolean;
defaultcolor : tcolor;
end;


const ELEMENTCOUNT = 18;
const GROUPSCOUNT = 7;

Type TResourceStyle = array [0..GROUPSCOUNT] of Tskin;


const STYLES_BACKGROUND = 0;
const STYLES_BUT = 1;
const STYLES_KEYPAD = 2;
const STYLES_LCORNER = 3;
const STYLES_BLCORNER = 4;
const STYLES_RCORNER = 5;
const STYLES_BRCORNER = 6;
const STYLES_ALPHABUTTONS = 7;


const Resources : array[0..ElementCount] of TResourceDescriptor  =
(
(Group : STYLES_BACKGROUND; Index : 0;resname : 'BACKGROUND';  friendlyname : 'Jukebox Background';
                                          jpeg : true; defaultcolor : clNone;),
(Group : STYLES_BUT;  Index : 0;resname : 'LBUTUP';  friendlyname : 'Left Navigation Buttons';
                                          jpeg : false; defaultcolor : clNone;),
(Group : STYLES_BUT;  Index : 1;resname : 'LBUTDOWN';  friendlyname : '';
                                          jpeg : false; defaultcolor : clNone;),
(Group : STYLES_BUT;  Index : 2;resname : 'RBUTUP';  friendlyname : 'Right Navigation Buttons';
                                          jpeg : false; defaultcolor : clNone;),
(Group : STYLES_BUT;  Index : 3;resname : 'RBUTDOWN';  friendlyname : '';
                                          jpeg : false; defaultcolor : clNone;),
(Group : STYLES_KEYPAD;  Index : 0;resname : 'KEYPADUP';  friendlyname : 'Keypad keys';
                                          jpeg : false; defaultcolor : clNone;),
(Group : STYLES_KEYPAD;  Index : 1;resname : 'KEYPADDOWN';  friendlyname : '';
                                          jpeg : false; defaultcolor : clNone;),
(Group : STYLES_KEYPAD;  Index : 2;resname : 'WIDEBUTUP';  friendlyname : '';
                                          jpeg : false; defaultcolor : clNone;),
(Group : STYLES_KEYPAD;  Index : 3;resname : 'WIDEBUTDOWN';  friendlyname : '';
                                          jpeg : false; defaultcolor : clNone;),
(Group : STYLES_LCORNER;  Index : 0;resname : 'LCORNERUP';  friendlyname : 'Visulisation corner popup button (Top Left)';
                                          jpeg : false; defaultcolor : clNone;),
(Group : STYLES_LCORNER;  Index : 1;resname : 'LCORNERDOWN';  friendlyname : '';
                                          jpeg : false; defaultcolor : clNone;),
(Group : STYLES_BLCORNER;  Index : 0;resname : 'BLCORNERUP';  friendlyname : 'Search panel corner button (Bottom Left)';
                                          jpeg : false; defaultcolor : clNone;),
(Group : STYLES_BLCORNER;  Index : 1;resname : 'BLCORNERDOWN';  friendlyname : '';
                                          jpeg : false; defaultcolor : clNone;),
(Group : STYLES_RCORNER;  Index : 0;resname : 'RCORNERUP';  friendlyname : 'Volume and Reject panel popup corner button (Top Right)';
                                          jpeg : false; defaultcolor : clNone;),
(Group : STYLES_RCORNER;  Index : 1;resname : 'RCORNERDOWN';  friendlyname : '';
                                          jpeg : false; defaultcolor : clNone;),
(Group : STYLES_BRCORNER;  Index : 0;resname : 'BRCORNERUP';  friendlyname : 'Advanced Options panel popup corner button (Bottom Right)';
                                          jpeg : false; defaultcolor : clNone;),
(Group : STYLES_BRCORNER;  Index : 1;resname : 'BRCORNERDOWN';  friendlyname : '';
                                          jpeg : false; defaultcolor : clNone;),
(Group : STYLES_ALPHABUTTONS;  Index : 0;resname : 'ALPHABUTTONUP';  friendlyname : 'Alphabetical Album Jump button';
                                          jpeg : false; defaultcolor : clNone;),
(Group : STYLES_ALPHABUTTONS;  Index : 1;resname : 'ALPHABUTTONDOWN';  friendlyname : '';
                                          jpeg : false; defaultcolor : clNone;));




type tthemeset = record
  friendlyname : string;
  themes : Tthemesubset;
  skinname : String;
end;

type tthemesindex = record
  skin : integer;
  theme : integer;
end;


type
  Tthememanager = class(TForm)
    OK: TButton;
    Cancel: TButton;
    GoPreview: TButton;
    labtheme: TLabel;
    lbthemes: TComboBox;
    Bevel1: TBevel;
    labelement: TLabel;
    Label1: TLabel;
    lbStyles: TComboBox;
    preview: TImage;
    Label2: TLabel;
    colorpreview: TPanel;
    nocolor: TCheckBox;
    lbelement: TComboBox;
    Bevel2: TBevel;
    Label3: TLabel;
    lbAlphaOrientation: TComboBox;
    ColorPicker: TColorPicker;
    procedure updatecolor(Sender : TObject);
    procedure FormCreate(Sender: TObject);
    procedure GoPreviewClick(Sender: TObject);
    procedure lbelementChange(Sender: TObject);
    procedure nocolorClick(Sender: TObject);
    procedure lbthemesChange(Sender: TObject);
    procedure lbStylesChange(Sender: TObject);
    procedure OKClick(Sender: TObject);
    procedure CancelClick(Sender: TObject);
  private
     themes : array of tthemeset;
     themesindex : array of tthemesindex;
     pvbmp : Tbitmap;
     ResourceStyle : TResourceStyle;
     ResourceStyleAtLoad : TResourceStyle;
     AlphaOrientationatload : integer;
     function GetElementItem(Group : integer; Index : Integer;var res : TResourceDescriptor) : boolean;
     procedure dothumb;
     procedure setchanges;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  ThemeManager: TthemeManager;

procedure gothemes;

implementation
uses jukeboxform;

{$R *.dfm}

procedure gothemes;
begin
application.createform(tThemeManager,ThemeManager);
try
ThemeManager.ShowModal;
finally
ThemeManager.free;
end;
end;

procedure Tthememanager.FormCreate(Sender: TObject);
var
n,s,x : integer;
sr : TSearchRec;
res : integer;
begin
pvbmp:=Tbitmap.create;
pvbmp.Width:=preview.Width;
pvbmp.Height:=preview.Height;
ColorPicker.OnColorChange:=updatecolor;
s:=0;
for n:=0 to GROUPSCOUNT do begin
 while resources[s].group<>n do inc(s);
  lbelement.Items.add(resources[s].friendlyname);
end;
preview.Transparent:=true;
ResourceStyleAtLoad[STYLES_BACKGROUND]:=config.theme.sbackground;
ResourceStyleAtLoad[STYLES_BUT]:=config.theme.sbut;
ResourceStyleAtLoad[STYLES_KEYPAD]:=config.theme.skeypad;
ResourceStyleAtLoad[STYLES_LCORNER]:=config.theme.slcorner;
ResourceStyleAtLoad[STYLES_BLCORNER]:=config.theme.sblcorner;
ResourceStyleAtLoad[STYLES_RCORNER]:=config.theme.srcorner;
ResourceStyleAtLoad[STYLES_BRCORNER]:=config.theme.sbrcorner;
ResourceStyleAtLoad[STYLES_ALPHABUTTONS]:=config.theme.salphabuttons;
AlphaOrientationatload:=config.theme.alphaorientation;

ResourceStyle:=ResourceStyleAtLoad;


setlength(themes,1);
themes[0].friendlyname:='Current Settings';
themes[0].skinname:='Current Settings';
setlength(themes[0].themes,1);
themes[0].themes[0].name:='Current Setting';
themes[0].themes[0].sbut:=resourcestyleatload[STYLES_BUT];
themes[0].themes[0].skeypad:=resourcestyleatload[STYLES_KEYPAD];
themes[0].themes[0].slcorner:=resourcestyleatload[STYLES_LCORNER];
themes[0].themes[0].sblcorner:=resourcestyleatload[STYLES_BLCORNER];
themes[0].themes[0].srcorner:=resourcestyleatload[STYLES_RCORNER];
themes[0].themes[0].sbrcorner:=resourcestyleatload[STYLES_BRCORNER];
themes[0].themes[0].salphabuttons:=resourcestyleatload[STYLES_ALPHABUTTONS];
themes[0].themes[0].sbackground:=resourcestyleatload[STYLES_BACKGROUND];
themes[0].themes[0].alphaorientation:=config.theme.alphaorientation;

//Enumerate themes and styles
res:=findfirst('*.skn',faAnyFile,sr);
while res=0 do begin
  n:=length(themes);
  setlength(themes,n+1);
  loadtheme(sr.Name,themes[n].themes,themes[n].friendlyname);
  themes[n].skinname:=copy(sr.name,1,length(sr.name)-4);
  res:=findnext(sr);
end;
findclose(sr);


for n:=0 to length(themes)-1 do begin
  lbstyles.Items.add(themes[n].friendlyname);
  for x := 0 to length(themes[n].themes)-1 do begin
   lbthemes.Items.Add(themes[n].friendlyname+' - '+themes[n].themes[x].name);
   setlength(themesindex,lbthemes.Items.Count);
   themesindex[lbthemes.items.Count-1].skin:=n;
   themesindex[lbthemes.items.Count-1].theme:=x;
  end;

end;

lbstyles.ItemIndex:=0;
lbelement.ItemIndex:=0;
lbthemes.ItemIndex:=0;
lbelementchange(nil);

lbAlphaOrientation.Items.Add('Left');
lbAlphaOrientation.Items.Add('Top');
lbAlphaOrientation.Items.Add('Bottom');
lbAlphaOrientation.Items.Add('Invisible');
lbAlphaOrientation.ItemIndex:=themes[0].themes[0].alphaorientation;

end;


procedure TThememanager.setchanges;
var
x : integer;
y : integer;
begin
for x := 0 to ELEMENTCOUNT do begin
  for y:=0 to GROUPSCOUNT do begin
    if resources[x].group=y then ReplaceSkinResource(Resources[x].resname,ResourceStyle[y].Skin,ResourceStyle[y].Color,Resources[y].jpeg);
  end;
end;
config.theme.alphaorientation:=lbAlphaOrientation.ItemIndex;
jukebox.setscreen;
end;

procedure Tthememanager.GoPreviewClick(Sender: TObject);
begin
setchanges;
end;



procedure Tthememanager.CancelClick(Sender: TObject);
begin
ResourceStyle:=ResourceStyleAtLoad;
config.theme.alphaorientation:=alphaorientationatload;
setchanges;
end;

procedure TThemeManager.dothumb;
var
bmp : TBitmap;
begin;
bmp:=Tbitmap.create;
bmp.assign(pvbmp);
if colorpreview.Color<>0 then addcolortobitmap(bmp,colorpreview.Color,0.6);
preview.Canvas.Draw(0,0,bmp);
bmp.free;
ResourceStyle[lbelement.ItemIndex].Color:=colorpreview.Color;
end;

procedure Tthememanager.lbelementChange(Sender: TObject);
var
bmp : Tbitmap;
res : TResourceDescriptor;
tr : Trect;
begin
if GetElementItem(lbelement.ItemIndex,0,res)=false then exit;
bmp:=Tbitmap.Create;
tr.Top:=0;
tr.Left:=0;
tr.Right:=preview.width;
tr.Bottom:=preview.Height;
if lbstyles.ItemIndex<>0 then  LoadSkinResourceNoCache(res.resname,themes[lbstyles.itemindex].skinname,resourcestyle[lbelement.ItemIndex].color,resources[lbelement.ItemIndex].jpeg,bmp)
        else begin
          LoadSkinResourceNoCache(res.resname,resourcestyleatload[lbelement.itemindex].Skin,resourcestyleatload[lbelement.ItemIndex].color,resources[lbelement.ItemIndex].jpeg,bmp);
          resourcestyle[lbelement.ItemIndex].Color:=resourcestyleatload[lbelement.itemindex].color;
          themes[lbstyles.itemindex].skinname:=resourcestyleatload[lbelement.itemindex].Skin;
        end;
resourcestyle[lbelement.ItemIndex].skin:=themes[lbstyles.itemindex].skinname;
colorpicker.Col:=resourcestyle[lbelement.ItemIndex].color;
pvbmp.Canvas.StretchDraw(tr,bmp);
bmp.free;
dothumb;
end;

procedure Tthememanager.lbStylesChange(Sender: TObject);
begin
lbElementChange(sender);
end;

procedure Tthememanager.lbthemesChange(Sender: TObject);
var
x,y : integer;
begin
x:=themesindex[lbthemes.itemindex].skin;
y:=themesindex[lbthemes.itemindex].theme;
resourcestyle[STYLES_BACKGROUND]:=themes[x].themes[y].sbackground;
resourcestyle[STYLES_BUT]:=themes[x].themes[y].sbut;
resourcestyle[STYLES_KEYPAD]:=themes[x].themes[y].skeypad;
resourcestyle[STYLES_LCORNER]:=themes[x].themes[y].slcorner;
resourcestyle[STYLES_RCORNER]:=themes[x].themes[y].srcorner;
resourcestyle[STYLES_BLCORNER]:=themes[x].themes[y].sblcorner;
resourcestyle[STYLES_BRCORNER]:=themes[x].themes[y].sbrcorner;
resourcestyle[STYLES_ALPHABUTTONS]:=themes[x].themes[y].salphabuttons;
resourcestyle[STYLES_ALPHABUTTONS]:=themes[x].themes[y].swidebut;
lbAlphaOrientation.ItemIndex:=themes[x].themes[y].alphaorientation;
//for x := 0 to lbstyles.Items.Count do begin
if pos(lbstyles.items[x],lbthemes.items[lbthemes.itemindex])>0 then lbstyles.itemindex:=x;
lbelementChange(sender);
end;

procedure Tthememanager.nocolorClick(Sender: TObject);
begin
updatecolor(sender);
dothumb;
end;

procedure Tthememanager.OKClick(Sender: TObject);
begin
config.theme.sbut:=resourcestyle[STYLES_BUT];
config.theme.skeypad:=resourcestyle[STYLES_KEYPAD];
config.theme.slcorner:=resourcestyle[STYLES_LCORNER];
config.theme.srcorner:=resourcestyle[STYLES_RCORNER];
config.theme.sblcorner:=resourcestyle[STYLES_BLCORNER];
config.theme.sbrcorner:=resourcestyle[STYLES_BRCORNER];
config.theme.salphabuttons:=resourcestyle[STYLES_ALPHABUTTONS];
config.theme.swidebut:=resourcestyle[STYLES_ALPHABUTTONS];
config.theme.sbackground:=resourcestyle[STYLES_BACKGROUND];
config.theme.alphaorientation:=lbAlphaOrientation.ItemIndex;
setchanges;
end;

procedure TThemeManager.updatecolor(Sender: TObject);
begin
if nocolor.checked then begin
  colorpreview.Color:=ClNone;
end else begin
colorpreview.Color:=ColorPicker.Col;
colorpreview.Caption:='R:'+inttostr(getrvalue(ColorPicker.Col))+' G:'+inttostr(getgvalue(ColorPicker.Col))+' G:'+inttostr(getbvalue(ColorPicker.Col));
end;
dothumb;
end;


function TThemeManager.GetElementItem(Group : Integer; Index : Integer;var res : TResourceDescriptor) : boolean;
var
n : integer;
begin
result:=false;
for n:=0 to ElementCount do begin
  if (Resources[n].group=Group) and (Resources[n].Index=Index) then begin
    result:=true;
    res:=Resources[n];
  end;

end;

end;

end.