// ==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(); }