There is an angle argument in the draw image function, if you want to change it with time you just need to repaint the window every so often. Try this:
var angle=0;
var g_img = gdi.Image("path\\to\\image.jpg");
function on_paint(gr)
{
gr.DrawImage(g_img, img_x, img_y, img_w, img_h, 0, 0, g_img.Width, g_img.Height,angle);
}
function on_playback_time(time)
{
angle = 360 * fb.PlaybackTime / fb.PlaybackLength;
window.Repaint();
}
I'm not sure how to rotate around a particular axis though.
T.P Wang: The problem was a missing } after one of my functions. Here's the bad code, the problem function is the playbackorder one, I was going to turn it into a playback order drop down menu, I hadn't seen the sample code for that at that point! I ended up downgrading and re-upgrading, and re-importing my scripts from backups (and fixing this code obviously!)
var dir = fb.FoobarPath+"\\images\\FOOTOR\\";
var bg = gdi.Image(dir+"btn_m.png");
var bgL = gdi.Image(dir+"btnbg_l.png");
var bgR = gdi.Image(dir+"btnbg_r.png");
var button_bg_hov = gdi.Image(dir+"btn_bg.png");
var button_bg_down = gdi.Image(dir+"btn_bg_d.png");
var cur_btn = null;
var act_btn = null;
var tooltip = window.CreateTooltip();
var menutoggle = false;
ButtonStates = {
normal: 0,
hover: 1,
down: 2
}
ShowButton = {
hide: 0,
show: 1
}
var ww = window.Width;
var wh = window.Height;
// Flags, used by Menu
var MF_SEPARATOR = 0x00000800;
var MF_ENABLED = 0x00000000;
var MF_GRAYED = 0x00000001;
var MF_DISABLED = 0x00000002;
var MF_UNCHECKED = 0x00000000;
var MF_CHECKED = 0x00000008;
var MF_STRING = 0x00000000;
var MF_POPUP = 0x00000010;
var MF_RIGHTJUSTIFY = 0x00004000;
//button function
function button(icon,func_onClick,x,tooltiptxt,state,show)
{
this.icon=gdi.Image(dir+icon+".png");
this.state=state ? state : ButtonStates.normal;
this.show=show ? show : ShowButton.show;
this.x=x;
this.func_onClick = func_onClick;
this.tooltiptxt=tooltiptxt;
this.containXY = function (x, y)
{
return (this.x <= x) && (x <= this.x + 23) && (0 <= y) && (y <= 20);
}
this.draw = function (gr)
{
if (this.show == ShowButton.hide){return;}
else
{
if(this.state == ButtonStates.normal)
{
gr.DrawImage(this.icon, this.x+3, 2, 16, 16, 0, 0, 16, 16);
}
else if(this.state == ButtonStates.hover)
{
gr.DrawImage(button_bg_hov, this.x, 0, 23, 20, 0, 0, 23, 20);
gr.DrawImage(this.icon, this.x+3, 2, 16, 16, 0, 0, 16, 16);
tooltip.Text=this.tooltiptxt;
tooltip.Activate();
}
else if(this.state == ButtonStates.down)
{
gr.DrawImage(button_bg_down, this.x, 0, 23, 20, 0, 0, 23, 20);
gr.DrawImage(this.icon, this.x+3, 2, 16, 16, 0, 0, 16, 16);
}
}
}
this.onClick = function ()
{
this.func_onClick && this.func_onClick();
}
}
function showhidebuttons()
{
if(fb.CursorFollowPlayback)
{
$buttons.cfp.show = ShowButton.hide;
$buttons.cfp_on.show = ShowButton.show;
}
else
{
$buttons.cfp_on.show = ShowButton.hide;
$buttons.cfp.show = ShowButton.show;
}
if(fb.PlaybackFollowCursor)
{
$buttons.pfc.show = ShowButton.hide;
$buttons.pfc_on.show = ShowButton.show;
}
else
{
$buttons.pfc_on.show = ShowButton.hide;
$buttons.pfc.show = ShowButton.show;
}
if(fb.PlaybackOrder==0)
{
$buttons.shuf_on.show = ShowButton.hide;
$buttons.rtrk_on.show = ShowButton.hide;
$buttons.rall_on.show = ShowButton.hide;
$buttons.rtrk.show = ShowButton.show;
}
else if(fb.PlaybackOrder==1)
{
$buttons.shuf_on.show = ShowButton.hide;
$buttons.rtrk_on.show = ShowButton.hide;
$buttons.rall_on.show = ShowButton.show;
$buttons.rtrk.show = ShowButton.hide;
}
else if(fb.PlaybackOrder==2)
{
$buttons.shuf_on.show = ShowButton.hide;
$buttons.rtrk_on.show = ShowButton.show;
$buttons.rall_on.show = ShowButton.hide;
$buttons.rtrk.show = ShowButton.hide;
}
else if(fb.PlaybackOrder==4)
{
$buttons.shuf_on.show = ShowButton.show;
$buttons.rtrk_on.show = ShowButton.hide;
$buttons.rall_on.show = ShowButton.hide;
$buttons.rtrk.show = ShowButton.hide;
}
}
function drawAllButtons(gr)
{
showhidebuttons();
for (var i in $buttons)
{
$buttons[i].draw(gr);
}
}
function chooseButton(x, y)
{
for (var i in $buttons)
{
if ($buttons[i].containXY(x, y) && $buttons[i].show != ShowButton.hide)
return $buttons[i];
}
return null;
}
function menu()
{
menutoggle = !menutoggle;
if(menutoggle)
{
var _basemenu = window.CreatePopupMenu();
var _stuff = window.CreatePopupMenu();
var _vis = window.CreatePopupMenu();
var ret;
_basemenu.AppendMenuItem(MF_STRING, 1, "KFJC");
_basemenu.AppendMenuItem(MF_STRING, 2, "Radio 4");
_basemenu.AppendMenuSeparator();
_basemenu.AppendMenuItem(MF_STRING, 3, "Last.fm");
_basemenu.AppendMenuItem(MF_STRING, 4, "Rate Your Music");
_basemenu.AppendMenuSeparator();
_basemenu.AppendMenuItem(MF_STRING | MF_POPUP, _stuff.ID, "Stuff");
_stuff.AppendMenuItem(MF_STRING, 5, "Open CD");
_stuff.AppendMenuItem(MF_STRING, 6, "MP3Tag");
_stuff.AppendMenuItem(MF_STRING, 7, "Album Art Downloader");
_basemenu.AppendMenuItem(MF_STRING | MF_POPUP, _vis.ID, "Visualisations");
_vis.AppendMenuItem(MF_STRING, 8, "Spectrogram");
_vis.AppendMenuItem(MF_STRING, 9, "Oscilloscope");
_vis.AppendMenuItem(MF_STRING, 10, "Spectrum");
_vis.AppendMenuItem(MF_STRING, 11, "Peak Meter");
_vis.AppendMenuItem(MF_STRING, 12, "VU Meter");
ret = _basemenu.TrackPopupMenu(-11, 19);
if (ret == 0)
return;
switch (ret)
{
case 1:
fb.RunContextCommandWithMetadb('Run service/KFJC',fb.IsPlaying?fb.GetNowPlaying():fb.GetFocusItem());
break;
case 2:
fb.RunContextCommandWithMetadb('Run service/Radio4',fb.IsPlaying?fb.GetNowPlaying():fb.GetFocusItem());
break;
case 3:
fb.RunContextCommandWithMetadb('Run service/Last.fm',fb.IsPlaying?fb.GetNowPlaying():fb.GetFocusItem());
break;
case 4:
fb.RunContextCommandWithMetadb('Run service/RateYourMusic',fb.IsPlaying?fb.GetNowPlaying():fb.GetFocusItem());
break;
case 5:
fb.RunMainMenuCommand('Open Audio CD...');
break;
case 6:
fb.RunContextCommandWithMetadb('Run service/MP3Tag',fb.IsPlaying?fb.GetNowPlaying():fb.GetFocusItem());
break;
case 7:
fb.RunContextCommandWithMetadb('Run service/AlbumArtDL',fb.IsPlaying?fb.GetNowPlaying():fb.GetFocusItem());
break;
case 8:
fb.RunMainMenuCommand('Spectrogram');
break;
case 9:
fb.RunMainMenuCommand('Oscilloscope');
break;
case 10:
fb.RunMainMenuCommand('Spectrum');
break;
case 11:
fb.RunMainMenuCommand('Peak Meter');
break;
case 12:
fb.RunMainMenuCommand('VU Meter');
break;
default:
fb.trace("No Command");
break;
}
}
else
return;
}
function playbackorder()
{
var _basemenu = window.CreatePopupMenu();
var ret;
_basemenu.AppendMenuItem(MF_STRING, 1, "KFJC");
_basemenu.AppendMenuItem(MF_STRING, 2, "Radio 4");
_basemenu.AppendMenuItem(MF_STRING, 3, "Last.fm");
_basemenu.AppendMenuItem(MF_STRING, 4, "Rate Your Music");
ret = _basemenu.TrackPopupMenu(-11, 19);
if (ret == 0)
return;
switch (ret)
{
case 1:
fb.RunContextCommandWithMetadb('Run service/KFJC',fb.IsPlaying?fb.GetNowPlaying():fb.GetFocusItem());
break;
case 2:
fb.RunContextCommandWithMetadb('Run service/Radio4',fb.IsPlaying?fb.GetNowPlaying():fb.GetFocusItem());
break;
case 3:
fb.RunContextCommandWithMetadb('Run service/Last.fm',fb.IsPlaying?fb.GetNowPlaying():fb.GetFocusItem());
break;
case 4:
fb.RunContextCommandWithMetadb('Run service/RateYourMusic',fb.IsPlaying?fb.GetNowPlaying():fb.GetFocusItem());
break;
case 5:
fb.RunMainMenuCommand('Open Audio CD...');
break;
case 6:
fb.RunContextCommandWithMetadb('Run service/MP3Tag',fb.IsPlaying?fb.GetNowPlaying():fb.GetFocusItem());
break;
case 7:
fb.RunContextCommandWithMetadb('Run service/AlbumArtDL',fb.IsPlaying?fb.GetNowPlaying():fb.GetFocusItem());
break;
default:
fb.trace("No Command");
break;
}
$buttons = {
cfp: new button('cfp' ,function() {fb.CursorFollowPlayback=true;},0,"Cursor Follows Playback (off)"),
cfp_on: new button('cfp_on' ,function() {fb.CursorFollowPlayback=false;},0,"Cursor Follows Playback (on)"),
pfc: new button('pfc' ,function() {fb.PlaybackFollowCursor=true;},23,"Playback Follows Cursor (off)"),
pfc_on: new button('pfc_on' ,function() {fb.PlaybackFollowCursor=false;},23,"Playback Follows Cursor (on)"),
rtrk: new button('default_on',function() {fb.PlaybackOrder=2;},46,"Default"),
rtrk_on:new button('rep_trk_on',function() {fb.PlaybackOrder=1;},46,"Repeat Track"),
rall_on:new button('rep_all_on',function() {fb.PlaybackOrder=4;},46,"Repeat All"),
shuf_on:new button('shuff_on' ,function() {fb.PlaybackOrder=0;},46,"Shuffle Tracks"),
menu: new button('menu2' ,function() {menu()},69,"Menu")
}
function on_paint(gr)
{
gr.DrawImage( bg, 0, 0, window.Width, bg.Height, 0, 0, bg.Width, bg.Height);
drawAllButtons(gr);
}
function on_size()
{
ww = window.Width;
wh = window.Height;
}
function on_mouse_lbtn_down(x,y)
{
cur_btn = chooseButton(x, y);
if(cur_btn)
{
cur_btn.state=ButtonStates.down;
}
act_btn = cur_btn;
window.Repaint();
}
function on_mouse_move(x, y)
{
cur_btn = chooseButton(x, y);
if(cur_btn)
{
if(cur_btn.state!=ButtonStates.down&&!act_btn)
{
cur_btn.state=ButtonStates.hover;
}
for(var i in $buttons)
{
if($buttons[i] != cur_btn)
{
$buttons[i].state=ButtonStates.normal;
}
}
if(cur_btn==act_btn)
{
cur_btn.state=ButtonStates.down;
}
}
else
{
for(var i in $buttons)
{
$buttons[i].state=ButtonStates.normal;
}
}
window.Repaint();
}
function on_mouse_lbtn_up(x, y)
{
if (cur_btn&&act_btn==cur_btn)
{
cur_btn.onClick();
cur_btn = chooseButton(x, y);
showhidebuttons();
cur_btn.state=ButtonStates.hover;
}
act_btn = null;
window.Repaint();
}
function on_mouse_leave()
{
for (var i in $buttons)
{
$buttons[i].state=ButtonStates.normal;
}
window.Repaint();
tooltip.Deactivate();
menutoggle = false;
}
function on_cursor_follow_playback_changed(state)
{
window.Repaint();
}
function on_playback_follow_cursor_changed(state)
{
window.Repaint();
}
function on_playback_order_changed(new_order_index)
{
window.Repaint();
}