Enjoy my glowing bluishness:
I don't remember if I have already post this or not, but here it is the seek bar I use, which is one of the best I've seen. I didn't make it though, I found it somewhere in the 'interwebs':
// =========================
// Info Bar 0.1.2
// Copyright ©2010 Lediur
// --------------
// Completely rewritten from the stock WSH Panel progress bar script.
// Licensed under BSD License
// =========================
// =========================
// License bits
// ------------
// This script is considered an addon for WSH Panel Mod.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS
// AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
// OF SUCH DAMAGE.
// =========================
// =========================
// Basic functions
// =========================
// =========================
// Evaluates color input
// INPUT: 3 values, RED GREEN BLUE;
// 4 values, RED GREEN BLUE ALPHA;
//
// RETURNS: Byte value representing the selected color
// =========================
function RGB(r,g,b){ return (0xff000000|(r<<16)|(g<<8)|(b)); }
function RGBA(r,g,b,a){ return ((a<<24)|(r<<16)|(g<<8)|(b)); }
// =========================
// Evaluates time from seconds
// INPUT: 1 value, SECONDS
//
// RETURNS: A formatted string representing the desired time.
// =========================
function TimeFmt(t){
var zpad = function(n){
var str = n.toString();
return (str.length<2) ? "0"+str : str;
}
var h = Math.floor(t/3600); t-=h*3600;
var m = Math.floor(t/60); t-=m*60;
var s = Math.floor(t);
if(h>0) return h.toString()+":"+zpad(m)+":"+zpad(s);
return m.toString()+":"+zpad(s);
}
//----------------------------------------------------------------------------
// =========================
// String variables
// =========================
//var title;
//var artist;
//var status;
//var time;
//var s_playbackOrder = "<NOT ACCESSIBLE>";
var title = "foobar 2000 ";
var artist = "v1.3.8";
//var artist = "%_foobar2000_version%";
var status;
var time;
var s_playbackOrder = "";
// =========================
// Animation information
// =========================
var playback_alpha = 128;
var playback_XPos = 0;
var playback_animating = false;
var animation_timer = false;
// =========================
// Fonts
// =========================
var title_fontsize = 36;
var artist_fontsize = 20;
var g_titlefont = gdi.Font("Arial", title_fontsize, 1);
var g_artistfont = gdi.Font("Arial", artist_fontsize, 1);
var g_statusfont = gdi.Font("Arial", 24, 1);
var g_timefont = gdi.Font("Segoe UI", 28, 2);
//var g_trackfont = gdi.Font("Arial", 18, 1);
var title_sizelimit = 36;
var artist_sizelimit = 20;
var title_width = 0;
var artist_width = 0;
// =========================
// Dimension information
// =========================
var info_width;
var margin = 20;
// =========================
// Title Formats
// =========================
var g_title = fb.TitleFormat("%title%");
var g_artist = fb.TitleFormat("[%artist%] / [%album%]");
var g_time = fb.TitleFormat("%playback_time%/%length%");
var g_status = fb.TitleFormat("♥%rating% ♪%play_count% %codec% %samplerate%Hz $caps(%channels%) %bitrate%kbps ");
//var g_track = fb.TitleFormat("%track%");
// =========================
// Boolean variables for seek-checking
// =========================
var g_drag = 0;
var g_drag_seek = 0;
// =========================
// Gradient settings
// =========================
var c_progtop = RGB(0,150,255);
var c_progbot = RGB(0,50,200);
var c_proglead = RGBA(0,30,255,255);
// =========================
// Timer for updating progress bar and other items
// =========================
var f_timer;
var timer_interval = 50;
var timer_interval_animation = 5;
function on_paint(gr){
var ww = window.Width;
var wh = window.Height;
var pos = 0;
var length = fb.PlaybackLength;
gr.SetTextRenderingHint(4);
gr.SetSmoothingMode(2);
// =========================
// Evaluation of information
// =========================
if(length > 0){
if(g_drag){
pos = window.Width * g_drag_seek;
title = "Seeking: ";
time = TimeFmt(g_drag_seek * length) + " / " + TimeFmt(length);
}
else{
pos = window.Width * (fb.PlaybackTime / length);
title = g_title.Eval();
// track = g_track.Eval();
artist = g_artist.Eval();
time = g_time.Eval();
status = g_status.Eval();
}
}
// =========================
// Title Size Update
// =========================
title_width = Math.round((gr.MeasureString(title,g_titlefont,0,0,ww,wh,0x00000400)).Width);
if(title_fontsize > title_sizelimit)
title_fontsize = title_sizelimit;
if(title_width > Math.round(ww - info_width - wh/2 - margin) || title_fontsize > title_sizelimit)
{
title_fontsize -= ( title_width-Math.round(ww - info_width - wh/2 - margin) )/100;
}
else if (title_width < Math.round(ww - info_width - wh/2 - margin) && title_fontsize < title_sizelimit)
{
title_fontsize += ( Math.round(ww - info_width - wh/2 - margin) - title_width)/100;
}
g_titlefont = gdi.Font("Arial", title_fontsize, 1);
// =========================
// Artist Size Update
// =========================
artist_width = Math.round((gr.MeasureString(artist,g_artistfont,0,0,ww,wh,0x00000400)).Width);
if(artist_fontsize > artist_sizelimit)
artist_fontsize = artist_sizelimit;
if(artist_width > Math.round(ww - info_width - wh/2 - margin) || artist_fontsize > artist_sizelimit)
{
artist_fontsize -= ( artist_width - Math.round(ww - info_width - wh/2 - margin) )/100;
}
else if (artist_width < Math.round(ww - info_width - wh/2 - margin) && artist_fontsize < artist_sizelimit)
{
artist_fontsize += ( Math.round(ww - info_width - wh/2 - margin) - artist_width)/100;
}
g_artistfont = gdi.Font("Arial", artist_fontsize, 2);
// =========================
// FillGradRect ( Starting X, Starting Y, Width, Height, Gradient Rotation, Starting Color, Ending Color )
// =========================
// Background Bar
gr.FillGradRect(pos, 0, ww-pos, wh, 90, RGB(0,0,0), RGB(11,22,32));
// Progress Bar
gr.FillGradRect( 0, 0, pos, wh, 90, c_progtop, c_progbot);
// Progress Bar Leader
gr.FillGradRect(pos-3, 0, 50, wh, 180, RGBA(0,0,0,0), c_proglead);
// Right Gradient
gr.FillGradRect(ww-100, 0, 250, wh, 0, RGBA(0,0,0,0), RGBA(17,66,170,255));
// =========================
// DrawString ( Output String, Output Font, Color, Starting X, Starting Y, Width, Height, Hex Values )
// =========================
// =========================
// /!\ NOTICE
// =========================
// These values were determined through trial and error.
// They work fine on my computer and resolution, but
// you might want to tweak them to fit your taste.
// -------------------------
// Unfortunately, I don't have documentation for the hex values.
// Here's what I figured out so far, though.
//
// 1: Alignment (0: left, 1: center, 2: right)
// =========================
// gr.DrawString(g_track.Eval(), gdi.Font("Arial", 18, 1), RGB(190,200,250), wh/14, -wh/10, ww-250, wh, 0x01000000);
// gr.DrawString(title, g_titlefont, RGB(255,255,255), wh/2.5, -wh/5.7, ww-250, wh, 0x01000000);
gr.DrawString(title, g_titlefont, RGB(255,255,255), wh/4, -wh/4, ww-250, wh, 0x01000000);
gr.DrawString(artist, g_artistfont, RGB(255,255,255), wh/2.5, wh/4.5, ww-250, wh, 0x01000000);
gr.DrawString(time, g_timefont, RGB(255,255,255), 0-wh/6, -wh/6.5, ww, wh, 0x21000000);
gr.DrawString(status, g_statusfont, RGB(254,168,0), 0-wh/6, wh/4.5, ww, wh, 0x21000000);
// Background Title
info_width = (gr.MeasureString(status,g_statusfont,0,0,ww,wh,0x00000400)).Width;
AnimateBackgroundTitle();
gr.DrawString(s_playbackOrder, g_statusfont, RGBA(255,255,255,playback_alpha), ww-wh/6-info_width+playback_XPos, 0-wh/6.5, ww, wh, 0x01000000);
}
function AnimateBackgroundTitle(){
if(playback_animating)
{
if(!animation_timer){
//fb.trace("-- Animation timer on - setting timer interval to " + timer_interval_animation);
//fb.trace("-- Animation starting: >");
f_timer = window.CreateTimerInterval(timer_interval_animation);
animation_timer = true;
}
if(playback_XPos <= 0)
playback_XPos = 0;
if(playback_alpha > 128)
playback_alpha = 128;
playback_XPos -= 1;
playback_alpha += 1;
}
if(playback_animating && (playback_XPos <= -1 || playback_alpha >= 129))
{
playback_animating = false;
//fb.trace("-- Animation finished.");
playback_XPos = 0;
playback_alpha = 128;
}
if(!playback_animating && animation_timer){
//fb.trace("-- Animation timer off - setting timer interval to " + timer_interval);
f_timer = window.CreateTimerInterval(timer_interval);
animation_timer = false;
}
}
// =========================
// Resizes the text in the info panel
// INPUT: WSH Panel HEIGHT, WSH Panel WIDTH,
//
// RETURNS: Byte value representing the selected color
// =========================
// =========================
// /!\ NOTICE
// =========================
// These values were determined through trial and error.
// They work fine on my computer and resolution, but
// you might want to tweak them to fit your taste.
// =========================
function updateSize(){
var font_size = title_sizelimit;
// ====== TITLE SIZE COMPENSATION ======
/*
font_size = (window.Width - 50) / 25 + (window.Height-200)/10;
factor = (window.Width - 400) / 100;
// Upper-bound font size limiter
if(font_size > 36)
font_size = 36;
// If we don't check for this we get the JavaScript
// equivalent of a NullPointerException.
if (title != null){
font_size -= title.length / 100;
// Upper-bound width limiter
if(window.Width > 800) {
factor = 0;
font_size -= title.length / 100;
}
// Lower-bound width limiter
if(window.Width < 300)
font_size += window.Width / 70;
// Try to check for excessively long titles
if(title.length > 50)
font_size -= title.length / 7;
if(title.length > 70)
font_size -= title.length / 50;
}*/
// Upper-bound font size limiter
// ====== ARTIST SIZE COMPENSATION ======
/*
font_size = (window.Width - 50) / 40 + (window.Height-200)/20;
// Upper-bound font size limiter
if(font_size > 24)
font_size = 24;
// If we don't check for this we get the JavaScript
// equivalent of a NullPointerException.
if (artist != null){
// Upper-bound width limiter
if(window.Width > 800)
font_size -= artist.length / 120;
// Lower-bound width limiter
if(window.Width < 300)
font_size += window.Width / 90;
// Try to check for excessively long titles
if(artist.length > 80)
font_size -= artist.length / 22;
if(artist.length > 120)
font_size -= 6;
}
g_artistfont = gdi.Font("Arial", font_size, 2);
*/
// ====== TIME SIZE COMPENSATION ======
font_size = (window.Height - 5) / 2;
g_timefont = gdi.Font("Arial", font_size, 2);
// ====== STATUS SIZE COMPENSATION ======
font_size = (window.Height - 5) / 4;
g_statusfont = gdi.Font("Arial", font_size, 1);
}
// =========================
// Some of this stuff may be redundant,
// but it works fine on everything I've listened
// to so far.
// =========================
function on_size(){
updateSize();
}
function on_focus(focused){
//fb.trace("focus " + focused);
}
function on_key_down(key){
//fb.trace("key " + key);
}
function on_mouse_lbtn_down(x,y){
g_drag = 1;
g_drag_seek = x / window.Width;
window.Repaint();
}
function on_mouse_lbtn_up(x,y){
if(g_drag){
g_drag = 0;
g_drag_seek = x / window.Width;
g_drag_seek = (g_drag_seek<0) ? 0 : (g_drag_seek<1) ? g_drag_seek : 1;
fb.PlaybackTime = fb.PlaybackLength * g_drag_seek;
}
}
// =========================
// Allow for seeking
// =========================
function on_mouse_move(x,y){
if(g_drag){
g_drag_seek = x / window.Width;
g_drag_seek = (g_drag_seek<0) ? 0 : (g_drag_seek<1) ? g_drag_seek : 1;
window.Repaint();
}
}
function on_mouse_wheel(delta){
fb.PlaybackOrder += delta * 2;
if(fb.PlaybackOrder > 4)
fb.PlaybackOrder = 0;
if(fb.PlaybackOrder == 4)
{
//fb.trace("Playback Order: Shuffle");
s_playbackOrder = "Shuffle";
}
else if (fb.PlaybackOrder == 2)
{
//fb.trace("Playback Order: Repeat");
s_playbackOrder = "Repeat";
}
else
{
//fb.trace("Playback Order: Sequential");
s_playbackOrder = "Sequential";
}
playback_XPos = 128;
playback_alpha = 0;
playback_animating = true;
}
// =========================
// Create a timer for updating the bar.
// =========================
function on_playback_starting(cmd, paused){
f_timer = window.CreateTimerInterval(timer_interval);
}
// =========================
// Update information, repaint on new track.
// =========================
function on_playback_new_track(info){
c_progtop = RGB(0,150,255);
c_progbot = RGB(0,50,200);
c_proglead = RGBA(0,30,255,255);
if(fb.PlaybackOrder == 4)
s_playbackOrder = "Repeat";
else if (fb.PlaybackOrder == 2)
s_playbackOrder = "Shuffle";
else
s_playbackOrder = "Sequential";
title_fontsize = 36;
artist_fontsize = 20;
title = g_title.Eval();
artist = g_artist.Eval();
time = g_time.Eval();
status = g_status.Eval();
updateSize();
window.Repaint();
}
// =========================
// Playback Stop
// =========================
function on_playback_stop(){
// CPU usage saver
if(f_timer){window.KillTimer(f_timer);}
updateSize();
window.Repaint();
}
// =========================
// Repaint every time we seek
// =========================
function on_playback_seek(time){
window.Repaint();
}
// =========================
// Changes the color of the bar based on the pause state.
// =========================
function on_playback_pause(state){
if(state){
if(f_timer){window.KillTimer(f_timer);}
} else {
f_timer = window.CreateTimerInterval(timer_interval);
}
//c_progtop = state ? RGB(100,100,140) : RGB(0,150,255);
//c_progbot = state ? RGB(50,50,100) : RGB(0,50,200);
c_progtop = state ? RGB(0,0,30) : RGB(0,150,255);
c_progbot = state ? RGB(0,0,0) : RGB(0,50,200);
// c_proglead = state ? RGB(5,29,84) : RGBA(20,30,255,255);
c_proglead = state ? RGB(10,58,168) : RGBA(20,30,255,255);
window.Repaint();
}
// =========================
// Repaint every tick
// =========================
function on_timer(){
window.Repaint();
}
//EOF