unit thememanagerform; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls,global,resourceskins,colorpicker; 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; 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; ColorPicker : TColorPicker; 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:=TColorPicker.create(self); 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.