Help - Search - Members - Calendar
Full Version: foo_looks + LUA 'designers discussion'
Hydrogenaudio Forums > Hosted Forums > foobar2000 > 3rd Party Plugins - (fb2k)
Pages: 1, 2, 3
tk32
foo_looks + LUA 'designers discussion'


i thought i would take the opportunity to seperate the designer queries from the other thread about foo_looks
(you know... the one that reached 48 pages!!!)

so in this topic we can work on collaborated projects and discuss how to implement the LUA extension with danZ

i am currently reading about LUA, and thinking about how i can start involving these great new features in my fooAMP skin immediately

so this is a call to all skin designers out there, let's work together on supporting danZ and developing an even better skin plugin for Foobar


tk32
Overdo
What I'd like to see implemented (not in any order):
- Variable sized hotspots (As mentioned by tk32)
- Ability to change the size of the look, ie to toggle visualisations/albumart (as mentioned by danZ)
- .ski for configuration and LUA for scripting (danZ)

Just checked out the latest beta and i really like the foo_look_cover biggrin.gif

EDIT: a basic scripting guide would be very nice!
danZ
QUOTE(Overdo @ Dec 8 2003, 03:29 AM)
What I'd like to see implemented (not in any order):
- Variable sized hotspots (As mentioned by tk32)
- Ability to change the size of the look, ie to toggle visualisations/albumart (as mentioned by danZ)
- .ski for configuration and LUA for scripting (danZ)

Just checked out the latest beta and i really like the foo_look_cover  biggrin.gif

1. You can do this with current beta but hotspots are still rectangles only. tk32 is requesting irregular shaped hotspots which would be another change entirely (and something I've already considered).

Here is a sample of how you might change a hotspot's size

CODE
section play
int x 0
int y 0
int width 25
int height 25
string onmouseenter "
    look_setWidth(this,50)
    look_setHeight(this,50)
"
string onmouseleave "
    look_setWidth(this,25)
    look_setHeight(this,25)
"


in this example the rollover size would be 50,50 while the normal size is 25,25

2. You can't change the window size yet but you can control visibility. Consider this example which would turn the spectrum on/off.

CODE
section user0
// size and other stuff left out for brevity
string onleftbuttonup
"
    LOG('Toggling spectrum')
    look_setVisible(spectrum, not look_getVisible(spectrum))
"


On caveat to using LUA to control visibility. You should set the int show property of the item you plan to control from LUA to either show.Always or show.Never depending on your default start state.

3. Do you mean separate files? Currently everything is done in a single .ski file with scripts being wrapped inside a string " " to keep the parser happy. I think it is OK this way.
danZ
Here's how you can achieve an animation effect if you correctly "tile" some animations frames in your source image somewhere. That is, if you put some frames that are the same size and tiled out either horiz. or verticallly.

CODE

section title20
// size stuff omitted
bool nolayers true
int srcx 300
int srcy 20
string script " y = 0 x = 0"
string onupdate "
-- onupdate called at 15 FPS - use x to skip every other update for slower framerate
-- y is current frame
x = x + 1
if (x == 2) then
x = 0
y = y + 1
if (y > 3 ) then
 y = 0
end
-- next frame is y of 20 + size of frame (10) * curr frame - frames are laid out vertically
look_setSrcY(this, 20 + (10 * y))
end
"
danZ
Here's a script that makes the hotspot fly in and out in response to mouse input.

CODE
section title10 // Main title display when mouse not in window
int show show.Always
string script "
rect = look_getRect(title10)
"
string onupdate "
if (look_inHotspot(background,look_mouseX,look_mouseY)) then
 local r = look_getRect(this)
 if (r.y < rect.y + rect.height + 10) then
  look_setY(this,r.y + 2)
 end
else
 local r = look_getRect(this)
 if (r.y > rect.y) then
  look_setY(this,r.y - 2)
 end
end
"


Hopefully, the previous examples will help you start to think about what is possible and generate more discussion.
Overdo
danZ: i meant irregular shaped hotspots, early mornings don't make my thoughts very clear sad.gif

Thx for that visibility trick, works great! As for the animation , i can't yet think of a use why i should implement it, any suggestions?
tk32
some uses for animation

- animate the playback indicator
- flash the pause indicator when the track is paused
- animate from a small skin to a larger one (should work ok)
- have parts of the skin that change when clicked (ie a volume control thats pops out of the side of the skin)
- etc....


btw.. fooAMP Ultra updated to v2.2
danZ
QUOTE(Overdo @ Dec 8 2003, 08:05 AM)
danZ: i meant irregular shaped hotspots, early mornings don't make my thoughts very clear  sad.gif

Thx for that visibility trick, works great! As for the animation , i can't yet  think of a use why i should implement it, any suggestions?

maybe some kind of indicator when foobar is playing that animates something? I'm just putting in the hooks I'm not very good at the actual eye candy smile.gif
danZ
Check out Beta 5

Edit: If this is your first time trying the betas, don't forget to put the Lua dlls in the foobar2000 folder (not in components).

for a demonstration of the previously posted scripting examples and others.

New in Beta 5

Functions

look_getRect(hotspot)
look_setRect(hotspot,rect)

Note: rect is implemented as a LUA table of the format

rect = { x=0, y=0, width=0, height=0 }

look_setSrcX(hotspot,x)
look_setSrcY(hotpot,y)

Handlers

onactivate -- window gets focus
onplaybackstart
onplaybackstop
onplaybackpause
onplaybacknewtrack

Bugs

Fixed memory leak in LUA function call - thanks gord for the report.
tk32
nice one danZ

thanks for adding more example scripts in the default skin

it gives the rest of us some ideas to start from



tonight i will start work on a completely new skin design

i'll post here after some progress
Overdo
ok i've updated my Albumart skin to v0.2, it should be on foobarlooks.tk in a while. The animation works nicely, as do the other LUA features so many thx danZ biggrin.gif now if only ppl would submit some graphics.....
tk32
i feel the same

i've got some knowledge as a skin coder, but my graphics ability is stretched


we need help from those foobar users with visions of cool skins

submit sketches, or photoshop artwork, or anything else


absolutely anything... just help the community


tkelly32@btinternet.com
AngelGR
QUOTE
we need help from those foobar users with visions of cool skins

Indeed, but the problem is:
We (the first Look designers, and the average foobar users) don't have advanced graphical knowledges, and...
...the people that have them probably prefer Winamp3 yet. wink.gif
Maybe we could ask for help in the HA main forum, there're a few very good designers there.
danZ
1.11 RC1 Available

Bug reports only please.
tk32
Script Test 1:

Moveable playback controls


i'm doing some fun little script tests

this one allows you to move the play button around the skin

user posted image

script_test1.ski
script_test1.png


use the two grey buttons

button1:
left mouse button : Move Left
right mouse button : Move Right

button2:
left mouse button : Move Down
right mouse button : Move Up


tkelly32@btinternet.com
danZ
QUOTE(tk32 @ Dec 10 2003, 06:55 AM)
Script Test 1:

Moveable playback controls

Here's a script that make the play button free moving

CODE

section play
int x 40
int y 20
int srcx 221
int srcy 21
int height 25
int width 25
string script "
moving = false
clickOffset = { x=0, y=0 }
"
string onrightbuttondown "
moving = true
local rect = look_getRect(this)
clickOffset.x = look_mouseX - rect.x
clickOffset.y = look_mouseY - rect.y
"
string onrightbuttonup " moving = false "
string onupdate "
if (moving == true) then
 local rect = look_getRect(this)
 rect.x = look_mouseX - clickOffset.x
 rect.y = look_mouseY - clickOffset.y
 look_setRect(this, rect)
end
"


Of course the positioning won't be persistent and will revert if you close foobar and restart. I'll have to give that some thought as I could potentially make a look editor using the current component + Lua if I added stuff to generate the .ski files...hum
tk32
typical for you to go and out-do me

tongue.gif

thanks

i'll get better at this eventually
danZ
QUOTE(tk32 @ Dec 10 2003, 08:32 AM)
typical for you to go and out-do me

that wasn't possible with the list of functions and handlers i had available

tongue.gif

thanks

I wrote that for testing the Lua handlers and to make sure my clipping and rendering algorithm worked properly when items were moving around.

Anyway, we should start keeping a list of useful scripts, maybe on the foobarlooks website that could accessed so that scripts could be reused. Along that lines, I'm thinking of ways I could make scripts more reuseable and maybe even some way to "chain" them

ie.

section myscripts
string startDrag " drag = true "

section play
list onleftbuttondown {
"
LOG('doing some lua stuff')
"
,
"
LOG('doing some other lua stuff')
"
,
myscripts.startDrag
}

in this example all three scripts would be called in the order specified. We could then build up a library of reusable scripts that could be chained on.

Anway, I have some design limitations to overcome before that would be possible but it is lingering around in the back of my mind.
tk32
nice

might be cool to drag & resize albumart
foosion
Why don't you keep library functions in their own Lua files and use dofile to load them? (note to Lua newbies: that's the Lua equivalent of #include/import)
danZ
QUOTE(foosion @ Dec 10 2003, 10:26 AM)
Why don't you keep library functions in their own Lua files and use dofile to load them? (note  to Lua newbies: that's the Lua equivalent of #include/import)

that would work for global type functions

section play
string onmouseenter "
LOG('onmouseenter')
someGlobalFunction(this)
"

in this cas someGlobalFunction() could be in an import library

When I talk about chaining I mean chaining entire behaviours which would be an application thing not a lua thing

so

section mouseInLOG
string onmouseenter " LOG('mouseIn') "
string onmouseleave " LOG('mouseOut') "

section mouseMoveLOG
string onmousemove " LOG('mousemove') "

section play
list scripts string { mouseInLog, " LOG('section play)' ", mouseMoveLog }

in this case section play picks up all 3 "behaviors" to rob a phrase from Shockwave.

In this case we'd want a way to package and reuse these

like in the ski file

include "mouseInLOG.ski"
danZ
QUOTE(danZ @ Dec 10 2003, 10:52 AM)
QUOTE(foosion @ Dec 10 2003, 10:26 AM)
Why don't you keep library functions in their own Lua files and use dofile to load them? (note  to Lua newbies: that's the Lua equivalent of #include/import)

that would work for global type functions

section play
string onmouseenter "
LOG('onmouseenter')
someGlobalFunction(this)
"

in this cas someGlobalFunction() could be in an import library

When I talk about chaining I mean chaining entire behaviours which would be an application thing not a lua thing

so

section mouseInLOG
string onmouseenter " LOG('mouseIn') "
string onmouseleave " LOG('mouseOut') "

section mouseMoveLOG
string onmousemove " LOG('mousemove') "

section play
list scripts string { mouseInLog, " LOG('section play)' ", mouseMoveLog }

in this case section play picks up all 3 "behaviors" to rob a phrase from Shockwave.

In this case we'd want a way to package and reuse these

like in the ski file

include "mouseInLOG.ski"

So to continue

instead of a section having handlers like now

ie.

section play
string onmouseenter ""
string onmouseleave ""

it would just have

section play
list scripts { }

then I could change the parser to have special script block for defining a "behavior" and you could also include them from other files

script mouseInLOG

someglobal = 0

function onmouseenter(hotspot)
LOG('mouseenter')
end

function onmouseleave(hotspot)
LOG('mouseleave')
end

endScript

each behavior would keep its own global space, etc. and could be applied to multiple sections.

I think this would be more flexible then what I implemented in 1.11.

Comments pls.
tk32
i added the draggable script to my fooAMP skin

you can drag the albumart with the right-mouse button

see here:

http://www.hydrogenaudio.org/forums/index....ndpost&p=162213
danZ
Developers:

I'm implementing the "script chaining" I detailed above and will be pulling back RC1 and releasing another beta. The scripts you are doing now will be valid but the .ski setup will be changing so keep that in mind before you make a look with tons of scripts. You'll have to change your files when I release the next beta as they won't work any longer.

Sorry for the hassle but this design is going to be much more flexible and facilitate code sharing, more sophisticated scripting, etc.
AngelGR
It's not really a bug, but the latest beta "moves" the volumegrip graphic to the left, I mean, the adjustment is done centering the graphic, instead of adjust it to the x volumelevel pixel, like the progress grip.
Regards. smile.gif
tk32
yes, the handle always jumps to the center of the grip

this is an old request

ideally, the handle of the grip should be the point in which it is first clicked

same for progress grip
AngelGR
OK, I'll change my .ski for the new volumegrip behaviour.
And I was wrong about the progressgrip, the change was already done, sorry. rolleyes.gif
tk32
wait Angel

when i said this was an old request, i didn't mean it had been fixed yet

danZ was just busy doing other things

the handles still jump to the center

--

hmm

i get the impression we are talking about different things....

ahh, now i understand

i just tweak the ski so that the grips line up

but yes, if you have a large grip, it can be a pain in the a$$ sometimes
danZ
OK, pulled back the release candidate and I'm offering another beta.

1.11 Beta 6 @ foo_looks dev.

I changed how scripts are created and attached to sections. You can defined reusable behaviors using lua scripting and chain those as needed. This is far superior to the old way I was doing it. You'll see why once you get the hang of it.

Next I'll look at a way to import these behaviors so they can be reused across looks.

THe scripts you have written will basically work after you reorder them in the new layout. On gotcha is that the globals, look_mouseX and look_mouseY, for the sake of efficiency have been replaced by function calls of the same name.

look_mouseX()
look_mouseY()

all handlers, functions, are the same as before.

See the default look and a modified version of tk32's sript_test1.ski in the beta zip file for scripting examples.

Post questions and I'll help with the transition.
danZ
I didn't upgrade the foo_looks_cover look for the new scripting in the current beta. This turns out to be a good thing. I went ahead and did it and here are the differences which will show you what you need to do to upgrade your looks.

Old scripting

CODE

section background
string filename "foo_looks_cover.bmp"
int width 100
int height 100
int layer0 0
int layer1 0
int layer2 0
int layer3 0
int layer4 0
int layer5 0
int layer6 0
int layer7 0
int layer8 0
string script "
alpha = 100
group = { user10, volumelevel, progress }
"
string onmouseenter "
setVisible(group,true)
"
string onupdate "
if (look_inHotspot(this,look_mouseX,look_mouseY)) then

 if (alpha < 50) then
  alpha = alpha + 10
  setAlpha(group,alpha)
 end
else
 if (alpha > 0) then
  alpha = alpha - 10
  if (alpha == 0) then
   setVisible(group,false)
  else
   setAlpha(group,alpha)
  end
 end
end
"


Exact same behavior in new scripting environment

CODE

lua fadeInOutGroup

alpha = 100
group = { }

function onmouseenter(this)
setVisible(group,true)
end

function onupdate(this)
if (look_inHotspot(this,look_mouseX(),look_mouseY())) then
 if (alpha < 50) then
  alpha = alpha + 10
  setAlpha(group,alpha)
 end
else
 if (alpha > 0) then
  alpha = alpha - 10
  if (alpha == 0) then
   setVisible(group,false)
  else
   setAlpha(group,alpha)
  end
 end
end
end
endlua

section background
string filename "foo_looks_cover.bmp"
int width 100
int height 100
int layer0 0
int layer1 0
int layer2 0
int layer3 0
int layer4 0
int layer5 0
int layer6 0
int layer7 0
int layer8 0
list scripts string { "fadeInOutGroup[group = { user10, volumelevel, progress }]" }



Your conversions will be similiar.
Overdo
playing with the new beta now, grrr i have soo much recoding to do:(

EDIT: saw danZ's post above and now i'm a bit happier dry.gif

EDIT: just off 2 bed but i noticed that "%tracknumber%" give 01/12 now, deliberate change on your part danZ?
tk32
Kudos to danZ

these improvements are awesome

it's a bit of work to fix my scripts - but i'm enjoying every minute of it

danZ:

can we get a list of all your current functions & handlers??
tk32
fixed my current skin to work with the new script format


also added albumart toggle (4th green square button), and added a preset for showing albumart

fooAMP_ultra_expand.ski


5 functions so far:
  • toggleSpectrum
  • toggleAlbumArt
  • resetArt
  • freeMove (credit goes to danZ)
  • positionArt


will be adding further scripts in the next few days

then once i am comfortable, i will start a completely new project
Overdo
fixed albumdisplay v0.2, to be posted once 1.11 is released.
Overdo
command.playlist_addplaylist doesn't appear to work in Beta6. Also, while playing the last track of a playlist, the playlist name disappears.
tk32
quite a few of the playlist commands aren't working

it was from when the foobar sdk changed and foo_looks reached v1.0 - it broke some of the features - most notably the playlist add, etc..
Overdo
ahhh oki, i hadn't noticed it before. on a side note, can anybody spot what i've done wrong with the conversion to Beta6 in the following script?
QUOTE
string script "
rect = look_getRect(next)
alpha = 70
group = { user20}

function inGroup(grp,x,y)
  for i = 0, getn(grp) do
   if (look_inHotspot(grp[i],x,y)) then
    return true
   end
  end

  return false
end
"
string onupdate "
if (inGroup(group,look_mouseX,look_mouseY)) then
  local r = look_getRect(this)
  if (r.y < rect.y + rect.height + 10) then
   look_setY(this,r.y + 3)
  end
  if (alpha > 40) then
   alpha = alpha
   updateFontBeta(this,alpha)
  end
else
  local r = look_getRect(this)
  if (r.y > rect.y) then
   look_setY(this,r.y - 3)
  end
  if (alpha < 250) then
   alpha = alpha + 10
   updateFontBeta(this,alpha)
  end
end
"

QUOTE
lua DropDown
alpha = 70
group = { }

function onmouseenter(this)
rect = look_getRect(next)

function inGroup(grp,x,y)
  for i = 0, getn(grp) do
   if (look_inHotspot(grp[i],x,y)) then
    return true
   end
  end

  return false
end

string onupdate(this)
if (inGroup(group,look_mouseX(),look_mouseY())) then
  local r = look_getRect(this)
  if (r.y < rect.y + rect.height + 10) then
   look_setY(this,r.y + 3)
end
else
  local r = look_getRect(this)
  if (r.y > rect.y) then
   look_setY(this,r.y - 3)
end
end
endlua
.....
list scripts  string { "DropDown[group = { user0, user1, user2, user3} ]" }


Any help would be great!
danZ
QUOTE(Overdo @ Dec 12 2003, 01:27 PM)
ahhh oki, i hadn't noticed it before. on a side note, can anybody spot what i've done wrong with the conversion to Beta6 in the following script?
QUOTE
string script "
rect = look_getRect(next)
alpha = 70
group = { user20}

function inGroup(grp,x,y)
  for i = 0, getn(grp) do
   if (look_inHotspot(grp[i],x,y)) then
    return true
   end
  end

  return false
end
"
string onupdate "
if (inGroup(group,look_mouseX,look_mouseY)) then
  local r = look_getRect(this)
  if (r.y < rect.y + rect.height + 10) then
   look_setY(this,r.y + 3)
  end
  if (alpha > 40) then
   alpha = alpha
   updateFontBeta(this,alpha)
  end
else
  local r = look_getRect(this)
  if (r.y > rect.y) then
   look_setY(this,r.y - 3)
  end
  if (alpha < 250) then
   alpha = alpha + 10
   updateFontBeta(this,alpha)
  end
end
"

QUOTE
lua DropDown
alpha = 70
group = { }

function onmouseenter(this)
rect = look_getRect(next)

function inGroup(grp,x,y)
  for i = 0, getn(grp) do
   if (look_inHotspot(grp[i],x,y)) then
    return true
   end
  end

  return false
end

string onupdate(this)
if (inGroup(group,look_mouseX(),look_mouseY())) then
  local r = look_getRect(this)
  if (r.y < rect.y + rect.height + 10) then
   look_setY(this,r.y + 3)
end
else
  local r = look_getRect(this)
  if (r.y > rect.y) then
   look_setY(this,r.y - 3)
end
end
endlua
.....
list scripts  string { "DropDown[group = { user0, user1, user2, user3} ]" }


Any help would be great!

here's at least 3 things I see.

you are missing an "end" statement on your first function and using next instead of this (unless next is a global I don't know about in your globals)


function onmouseenter(this)
rect = look_getRect(this)
end


and you still have "script" instead of function on the last function.

function onupdate(this)
if (inGroup(group,look_mouseX(),look_mouseY())) then
local r = look_getRect(this)
if (r.y < rect.y + rect.height + 10) then
look_setY(this,r.y + 3)
end
else
local r = look_getRect(this)
if (r.y > rect.y) then
look_setY(this,r.y - 3)
end
end
danZ
QUOTE(tk32 @ Dec 12 2003, 11:55 AM)
quite a few of the playlist commands aren't working

it was from when the foobar sdk changed and foo_looks reached v1.0 - it broke some of the features - most notably the playlist add, etc..

This is a design issue.

Currently I have it coded that if the object has any attached scripts it runs the scripts and skips any commands. I did this because I was assuming the script would override the default behavior. That is, if the object contains a script that has an onleftbuttonup() function then any command that normally fires on buttonup won't fire.

I plan to add lua bindings such as fb2k_playStart(mode) which would allow you to start the playback from any script.

Eventually I plan to remove the int command and command. stuff since that will become unnecessary and not useful with the addition of scripting.
Overdo
@danZ - there were no Lua commands bound to the button.

@tk32, thx for spotting those things. the missing "end" command was due to the quote formatting it badly
QUOTE
function onmouseenter
rect = look_getRect(title10)
  function inGroup(grp,x,y)
  for i = 0, getn(grp) do
   if (look_inHotspot(grp[i],x,y)) then
    return true
   end
  end

  return false
end
end

that is what it should have looked like. and no it still doesn't work mad.gif
danZ
QUOTE(Overdo @ Dec 12 2003, 02:55 PM)
QUOTE

function onmouseenter
rect = look_getRect(title10)
end
  function inGroup(grp,x,y)
  for i = 0, getn(grp) do
   if (look_inHotspot(grp[i],x,y)) then
    return true
   end
  end

  return false
end
end

that is what it should have looked like. and no it still doesn't work mad.gif

Still an end missing or in the wrong place. Are you getting syntax errors in the console window?
Overdo
sorry about that, the quote again mucked up the spacing. This is what i now have:
QUOTE
lua DownDrop
alpha = 50
group = { }

function onmouseenter(this)
rect = look_getRect(this)
end
function inGroup(grp,x,y)
  for i = 0, getn(grp) do
   if (look_inHotspot(grp[i],x,y)) then
    return true
  end
end
  return false
end
end

function onupdate(this)
if (inGroup(group,look_mouseX(),look_mouseY())) then
  local r = look_getRect(this)
   if (r.y < rect.y + rect.height + 10) then
   look_setY(this,r.y + 3)
   end
  end
else
  local r = look_getRect(this)
   if (r.y > rect.y) then
   look_setY(this,r.y - 3)
   end
  end
end
end
endlua


Error from console is 2 lots of: <eof> expected; last token read: `end' at line 16 in string "..."
tk32
ok, i started the first step in a foo_looks designers guide


for now, i've just collated a list of all possible handlers & functions for the LUA scripts

but i will be adding much more soon..

http://www.btinternet.com/~sean.m.kelly/foo_looks/


i'll let you know as i gradually update
Overdo
very nice site tk32! gd idea to start with the lua scripting especially if danZ is going to remove the int commands.
tk32
keep refreshing the page

i'll be adding as much as i can in the next 2/3 hours

any contributions are appreciated smile.gif




http://www.btinternet.com/~sean.m.kelly/foo_looks/





tkelly32@btinternet.com
Overdo
i'm interested to see the script examples, maybe u could put the drop script in wink.gif
tk32
what is the 'drop script' ??


btw: i am online on ICQ (486325)

you can speak to me there also
tk32
btw

if anyone here is using UltraEdit to edit their ski's, you can use the C/C++ syntax highlighting to make your job a little more colourful

e.g..

user posted image


just open the following file:

C:\Program Files\UltraEdit\WORDFILE.TXT

and add SKI to the end of the very first line (type SKI somewhere after 'File Extensions =')

after doing this, you can change the highlighting colours in the preferences
Overdo
Some requests:
- rotational controls (ie volume etc) - would allow for much more freedom during skin design
- ability to set equaliser levels
- ability to view more than just +/-1 on the playlist

Dunno how easy they would be to implement, just thought i'd give danZ some more ideas.
danZ
QUOTE(Overdo @ Dec 14 2003, 02:45 AM)
Some requests:
- rotational controls (ie volume etc) - would allow for much more freedom during skin design


I think you could do this now with some clever scripting that translate the moues coordinates in onmousemove and uses look_setSrcY() to change the item,s graphic. That is, have the 8-10 frames for the rotating control and then cycle them in response to mouse movement. You'll still need some command bindings like fb2k_setVolume, etc. to make it complete and I'll be adding those.

QUOTE
- ability to set equaliser levels


I'll have to see if the API supports this - never looked before. If so, I can add scripting bindings for it.

QUOTE
- ability to view more than just +/-1 on the playlist


I have already added fb2k_formatTitle(pos, spec, extra) lua binding so with a few more bindings (playlist size, playlist name, and look_setText(this) you'd be able to build a complete playlist display if you wanted.

QUOTE
Dunno how easy they would be to implement, just thought i'd give danZ some more ideas.


The bindings are easy - its up to you guys now to create some cool scripts.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Invision Power Board © 2001-2008 Invision Power Services, Inc.