// ==PREPROCESSOR==
// @import "%fb2k_path%scripts\getColoursFonts.js"
// ==/PREPROCESSOR==
// args: h_align, v_align, trimming, flags
function StringFormat()
{
var h_align = 0, v_align = 0, trimming = 0, flags = 0;
switch (arguments.length)
{
// fall-thru
case 4:
flags = arguments[3];
case 3:
trimming = arguments[2];
case 2:
v_align = arguments[1];
case 1:
h_align = arguments[0];
break;
default:
return 0;
}
return ((h_align << 28) | (v_align << 24) | (trimming << 20) | flags);
}
// h_align/v_align:
StringAlignment = {
Near: 0,
Center: 1,
Far: 2
};
//Colour funcs
function RGB(r, g, b)
{ return (0xff000000 | (r << 16) | (g << 8) | (b)); }
var fontname = "Segoe UI";
text = {
metadata: fb.TitleFormat("$if2(%STREAM_NAME%,[%artist%][ $char(8226) %conductor%][ $char(8226) %performer%]$crlf()[$num(%tracknumber%,0). ][%title%])$crlf()$if(%STREAM_NAME%,[%artist% - ][%title%],[%album%[ $char(8226) %set subtitle%]])"),
font: gdi.Font(fontname, 18, 1)
};
lyrics = {
metadata: fb.TitleFormat("[$if2(%unsynched lyrics%,%lyrics%)]"),
font: gdi.Font(fontname, 13, 0)
};
indfnt = gdi.Font(fontname, 9, 1);
indfmt = StringFormat(1, 0);
lyr_stringformat = StringFormat(StringAlignment.Center);
var ww, wh;
//Stuff for text
var textsize;
var lyricsize = 0;
var txtx=2;
var lyry=0;
var scroll=0;
var txty;
var txtwid;
var img_x,img_y,img_w,img_h;
var imgr_x,imgr_y;
var fcstrk = false;
var showlyrics = false;
var padh = 2;
var padt = 2;
var textrender = gdi.CreateStyleTextRender();
var txtev = evaldata(text.metadata);
var lyrev = evaldata(lyrics.metadata);
//Art
var arttype = 0;
var g_img = (fb.IsPlaying||fb.GetFocusItem())?utils.GetAlbumArtV2((fb.IsPlaying&&!fcstrk)?fb.GetNowPlaying():fb.GetFocusItem(), arttype):gdi.CreateImage(1000,1);
AlbumArtName = new Array("Front","Back","Disc","Icon","Artist");
function on_paint(gr)
{
gr.FillSolidRect(0,0,ww,wh,bg);
gr.SetInterpolationMode(3);
textsize = gr.MeasureString(txtev, text.font, 0, 0, ww, wh).Height;
//Draw front cover
if(g_img && !(showlyrics && lyrev))
{
//Normal
gr.DrawImage(g_img, img_x, img_y, img_w, img_h, 0, 0, g_img.Width, g_img.Height);
//Rotated
gr.DrawImage(g_img, imgr_x, imgr_y, -img_w, img_h/2, 0, g_img.Height/2, g_img.Width, g_img.Height/2,180,220);
//Mirror mask
gr.FillGradRect(img_x-1, imgr_y-1, img_w+2, img_h/2+2,91,bg-0x80000000,bg);
}
//Draw lyrics
if(showlyrics && lyrev)
{
lyricsize = gr.MeasureString(lyrev, lyrics.font, 0, 0, txtwid, 9999999999).Height;
gr.SetTextRenderingHint(5);
gr.DrawString(lyrev, lyrics.font, txtcol, txtx, 12+textsize+lyry+scroll, txtwid, lyricsize, lyr_stringformat);
gr.FillSolidRect(0,0,ww,textsize+8,bg);
gr.FillSolidRect(0,wh-18,ww,18,bg);
}
//Draw track info
gr.SetSmoothingMode(4);
gr.SetTextRenderingHint(5);
textrender.OutlineText(txtcol, bg, 3);
textrender.RenderStringRect(gr, txtev, text.font, 0, (showlyrics && lyrev)?0:Math.min(wh-16-textsize,img_y+img_h), ww, Math.max(textsize,wh-img_y-img_h), (showlyrics && lyrev)?0x10000000:0x11000000);
//draw state indicator
gr.DrawString((fcstrk?"Prefer Focused Track":"Prefer Now Playing")+" | "+(showlyrics?"Prefer Lyrics":"Prefer Art")+" | Art Type: "+AlbumArtName[arttype], indfnt, RGB(0,200,0),0,wh-12,ww,12,indfmt);
}
function on_size()
{
ww = window.Width;
wh = window.Height;
txtwid = ww-2*txtx;
if(g_img && !(showlyrics && lyrev))
{
img_w = Math.min(ww-2*padh,(4/5)*(wh*g_img.Width/g_img.Height));
img_h = Math.min((ww-2*padh)*g_img.Height/g_img.Width,(4/5)*(wh-2*padh));
img_x = (img_w==ww-2*padh)?padh:(ww-(4/5)*(wh*g_img.Width/g_img.Height))/2;
img_y = padt;
imgr_x = img_x+img_w;
imgr_y = img_y+img_h-1;
}
}
function evaldata(txt)
{
return (fb.IsPlaying&&!fcstrk)?txt.Eval():fb.GetFocusItem()?txt.EvalWithMetadb(fb.GetFocusItem()):"No Selection";
}
/////Update display
function on_playback_new_track(metadb)
{
if(!fcstrk)
{
lyry = 0;
scroll=0;
g_img = utils.GetAlbumArtV2(metadb, arttype);
txtev = evaldata(text.metadata);
lyrev = evaldata(lyrics.metadata);
on_size();
window.Repaint();
}
}
function on_item_focus_change()
{
if(!fb.IsPlaying||fcstrk&&fb.GetFocusItem())
{
lyry = 0;
scroll=0;
g_img = fb.GetFocusItem()?utils.GetAlbumArtV2(fb.GetFocusItem(), arttype):null;
txtev = evaldata(text.metadata);
lyrev = evaldata(lyrics.metadata);
on_size();
window.Repaint();
}
}
function on_playlist_switch()
{
if(fb.GetFocusItem()) on_item_focus_change();
}
function on_playback_dynamic_info_track()
{
txtev = evaldata(text.metadata);
window.Repaint();
}
function on_playback_stop()
{
window.Repaint();
}
function on_playback_time(time)
{
if(showlyrics && lyrev && !fcstrk)
{
lyry = (wh-textsize-32)>lyricsize?0:(wh-textsize-32-lyricsize)*fb.PlaybackTime/fb.PlaybackLength;
window.Repaint();
}
}
////////Interaction
function on_mouse_lbtn_dblclk(x, y)
{
fcstrk = !fcstrk;
if(fcstrk){on_item_focus_change()}
else if(fb.IsPlaying){on_playback_new_track(fb.GetNowPlaying());}
window.Repaint();
}
function on_mouse_mbtn_up(x, y)
{
lyrev = evaldata(lyrics.metadata);
showlyrics = !showlyrics;
if(fcstrk||!fb.IsPlaying){on_item_focus_change()}
else if(fb.IsPlaying){on_playback_new_track(fb.GetNowPlaying());}
window.repaint();
}
function on_mouse_wheel(step)
{
if(showlyrics && lyrev)
{
if(step>0)
{
if(lyry+scroll < 0)
{
scroll = scroll+60;
}
}
else
{
if( wh-(42+textsize+lyry+scroll) < lyricsize)
{
scroll = scroll-60;
}
}
}
else
{
arttype=((arttype+step)%5+5)%5;
if(fcstrk||!fb.IsPlaying){on_item_focus_change()}
else if(fb.IsPlaying){on_playback_new_track(fb.GetNowPlaying());}
}
window.Repaint();
}