All pastes #251165 Raw Edit

Miles

public text v1 · immutable
#251165 ·published 2006-11-17 20:48 UTC
rendered paste body
alias binary { return $shortfn($+(", $scriptdir, Binary\, $1-, ")) }

alias whilefix { 
  dll $binary(WhileFix.dll) WhileFix
  if ($isid) { return 1 }
}

alias fmod {
  var %dll = $binary(fmod_mIRC.dll) 
  if ($isid) { return $dll(%dll, $1, $2-) } 
  else { dll %dll $1 $2- } 
}

alias vis { fmod Plugin_Send $1- }

alias mwheel { dll $binary(mousewheel.dll) Mw $window($1).hwnd }

alias open.player {
  if (!$hget(player)) { 
    var %f = $+(", $scriptdir, Hash\player.hash")
    if ($isfile(%f)) { hmake player | hload player %f }
  }
  if (!$hget(player, col.bg)) { default.cols }
  set.rend
  window -ak0hdBpfo +d @MircAmp $iif($hget(player, coords), $ifmatch, -1 -1) 250 95 $binary(mircamp.ico)
  fmod.open | draw.player | player.text Initializing..
  %f = $+(", $scriptdir, Hash\playlist.hash")
  if ($isfile(%f)) { hmake playlist | hload playlist %f }
  if ($hget(player, playlist)) { open.playlist }
  player.display $replace(MircAmp 2 by sh[a]dow., $chr(32), $chr(160)) $+ $chr(160)
}

alias close.player {
  fmod.close 
  hadd player coords $window(@MircAmp).x $window(@MircAmp).y
  close -@ @MircAmp
  if ($window(@PlayList)) { hadd player playlist 1 | close.playlist }
  else { hdel player playlist }
  if ($hget(player)) { hsave player $+(", $scriptdir, Hash\player.hash") | hfree player }
  if ($hget(playlist)) { hsave playlist $+(", $scriptdir, Hash\playlist.hash") | hfree playlist  }
  dll -u $binary(WhileFix.dll) | dll -u $binary(mousewheel.dll)
}

menu channel,status,query {
  -
  $iif($window(@MircAmp), $style(2)) $+ MircAmp2:/open.player
  -
}

menu @PlayList {
  dclick: {
    if ($inrect($mouse.x, $mouse.y, 10, 10, $calc($window($active).w - 20), $calc($window($active).h - 20))) {
      play.track
    }
  }
  Add Folder:/add.dir
  Save Playlist:/save.playlist
  -
  Clear Playlist { clear.list | listbox @PlayList }
}

menu @MircAmp {
  sclick: {
    if ($inrect($mouse.x, $mouse.y, 10, 70, 100, 15)) {
      var %i = $int($calc((($mouse.x - 10) / 100) * 5))
      while ($mouse.key & 1) && ($whilefix) {
        if ($inrect($mouse.x, $mouse.y, $calc((%i * 20) + 10), 70, 20, 15)) { draw.button %i 1 }
        else { draw.button %i 0 }
      }
      if ($inrect($mouse.x, $mouse.y, $calc((%i * 20) + 10), 70, 20, 15)) { player.cmd %i }
      draw.button %i 0
    }
    elseif ($inrect($mouse.x, $mouse.y, 210, 70, 30, 15)) { draw.open 1 | open.menu }
    elseif ($inrect($mouse.x, $mouse.y, 121, 71, 79, 14)) && ($fmod(SOUND_IsPlaying)) {
      var %x = $fmod(SOUND_Stream_GetLength,1), %y, %z
      while ($mouse.key & 1) && ($whilefix) {
        %y = $int($calc((($mouse.x - 121) / 80) * %x))
        if (%y isnum 0- $+ %x) {
          if (%y != %z) {
            fmod SOUND_Stream_SetPosition 1 %y
            player.time
            %z = %y
          }
        }
      }
    } 
    elseif ($inrect($mouse.x, $mouse.y, 170, 35, 70, 5)) {
      var %x, %y
      while ($mouse.key & 1) && ($whilefix) {
        var %x = $int($calc((($mouse.x - 170) / 70) * 255))
        if (%x isnum 0-255) {
          fmod SOUND_SetVolume 0 %x
          draw.volume
          %y = %x
        }
      }
      hadd -m player volume %y
    } 
    elseif ($inrect($mouse.x, $mouse.y, 11, 35, 99, 25)) { vis.change }
    elseif ($inrect($mouse.x, $mouse.y, 170, 45, 70, 15)) {
      var %i = $iif($mouse.x > 205, 1, 0)
      while ($mouse.key & 1) && ($whilefix) {
        if ($inrect($mouse.x, $mouse.y, $calc(170 + (35 * %i)), 45, 35, 15)) { draw.button.b %i 1 }
        else { draw.button.b %i 0 }
      }
      if ($inrect($mouse.x, $mouse.y, $calc(170 + (35 * %i)), 45, 35, 15)) { player.cmd.b %i }
      draw.button.b %i 0
    }
    else { draw.move }
  }
  $iif($window(@ColSel), $style(2)) $+ Choose Colors:/open.colsel
  $iif($hget(player, snap), $style(1)) $+ Snap Playlist { 
    hadd player snap $iif($hget(player, snap), 0, 1)
    if ($window(@PlayList)) { do.snap }
  }
  -
  Exit:/close.player
}

menu @OpenMenu {
  mouse: {
    var %i = $int($calc(($mouse.y / $window($active).h) * 3)), %x = 0
    while (%x <= 2) && ($whilefix) {
      draw.open.button %x $iif(%i == %x, 1, 0)
      inc %x
    }
  }
  leave: { close -@ @OpenMenu | draw.open 0 }
  sclick: {
    var %i = $int($calc(($mouse.y / $window($active).h) * 3))
    close -@ @OpenMenu 
    draw.open 0
    open.menu.cmd %i
  }
}

alias open.playlist {
  tokenize 32 $hget(playlist, coords)
  if (!$window(@PlayList)) { window -ahk0dBpfo +dL @PlayList $iif($1-, $ifmatch, -1 -1 250 105) }
  $listbox(@PlayList, 10 10 $calc($3 - 20) $calc($4 - 20)).coords
  $listbox(@PlayList, Playlist.).header
  $listbox(@PlayList, 49 49).columns
  $listbox(@PlayList, tahoma/9).font
  $listbox(@PlayList, playlist).hash
  drawrect -rfn @PlayList $hget(player, col.bg) 1 0 0 $window(@PlayList).w $window(@PlayList).h
  drawrect -rn @PlayList $rgb(180,180,180) 1 0 0 $window(@PlayList).w $window(@PlayList).h
  drawline -rn @PlayList $hget(player, col.hl) 1 1 $calc($window(@PlayList).h -2) 1 1 $calc($window(@PlayList).w - 2) 1
  drawline -rn @PlayList $hget(player, col.sh) 1 1 $calc($window(@PlayList).h - 2) $calc($window(@PlayList).w - 2) $calc($window(@PlayList).h - 2) $calc($window(@PlayList).w - 2) 1
  listbox @PlayList
  do.snap | mwheel @PlayList
}

alias close.playlist {
  hadd -m playlist coords $window(@PlayList).x $window(@PlayList).y $window(@PlayList).w $window(@PlayList).h
  close -@ @PlayList
}

alias playlist.selected { return $hget(playlist, ITEM $+ $hget(playlist, select.buffer)) }

#group.rend on

alias draw.text {
  if ($1 != -c) {
    drawtext -rn $1 $hget(player, col.hl) $2-
    drawtext -rn $1 $hget(player, col.fg) $2-3 $calc($4 - 1) $calc($5 - 1) $6-
  }
  else {
    drawtext -rnc $2 $hget(player, col.hl) $3-
    drawtext -rnc $2 $hget(player, col.fg) $3-4 $calc($5 - 1) $calc($6 - 1) $calc($7 + 1) $calc($8 + 1) $9-
  }
}

#group.rend end

#group.norm off

alias draw.text {
  if ($1 != -c) { drawtext -rn $1 $hget(player, col.fg) $2-3 $calc($4 + 1) $calc($5 + 1) $6- }
  else { drawtext -rnc $2 $hget(player, col.fg) $3-4 $calc($5 + 1) $calc($6 + 1) $calc($7 - 1) $calc($8 - 1) $9- }
}

#group.norm end

alias set.rend {
  if ($1 isnum) { hadd -m player rend.3d $1 }
  if ($hget(player, rend.3d)) {
    .enable #group.rend
    .disable #group.norm
  }
  else {
    .enable #group.norm
    .disable #group.rend
  }
}

alias draw.player {
  drawrect -rf @MircAmp $hget(player, col.bg) 1 0 0 $window(@MircAmp).w $window(@MircAmp).h
  drawrect -rn @MircAmp $rgb(180,180,180) 1 0 0 $window(@MircAmp).w $window(@MircAmp).h
  drawline -rn @MircAmp $hget(player, col.hl) 1 1 $calc($window(@MircAmp).h -2) 1 1 $calc($window(@MircAmp).w - 2) 1
  drawline -rn @MircAmp $hget(player, col.sh) 1 1 $calc($window(@MircAmp).h - 2) $calc($window(@MircAmp).w - 2) $calc($window(@MircAmp).h - 2) $calc($window(@MircAmp).w - 2) 1
  draw.detail @MircAmp 0 10 10 100 50
  draw.detail @MircAmp 0 120 10 120 15
  draw.detail @MircAmp 0 120 35 40 25
  draw.detail @MircAmp 0 120 70 80 15
  draw.detail @MircAmp 0 170 35 70 5
  var %i = 0
  while (%i <= 4) { draw.button %i 0 | inc %i }
  draw.button.b 0 0
  draw.button.b 1 0
  draw.shuffle
  draw.open 0
  draw.volume
}

alias draw.button {
  var %x = $calc(10 + ($1 * 20)), %c0 = $hget(player, col.sh), %c1 = $hget(player, col.hl)
  drawrect -nrf @MircAmp $hget(player, col.bg) 1 %x 70 20 15
  drawline -rn @MircAmp %c [ $+ [ $iif($2, 0, 1) ] ] 1 %x 85 %x 70 $calc(%x + 20) 70
  drawline -rn @MircAmp %c [ $+ [ $iif($2, 1, 0) ] ] 1 %x 85 $calc(%x + 19) 85 $calc(%x + 19) 70
  draw.text @MircAmp "WebDings" -9 $calc(%x + $iif($2, 4, 3)) 68 $button.text($1)
  drawdot @MircAmp
}

alias draw.button.b {
  var %x = $calc(170 + ($1 * 35)), %c0 = $hget(player, col.sh), %c1 = $hget(player, col.hl)
  drawrect -nrf @MircAmp $hget(player, col.bg) 1 %x 45 35 15
  drawline -rn @MircAmp %c [ $+ [ $iif($2, 0, 1) ] ] 1 %x 60 %x 45 $calc(%x + 34) 45
  drawline -rn @MircAmp %c [ $+ [ $iif($2, 1, 0) ] ] 1 %x 60 $calc(%x + 34) 60 $calc(%x + 34) 45
  draw.text @MircAmp "verdana" -7 $calc(%x + $iif($2, 6, 5)) 46 $button.text($calc($1 + 5))
  drawdot @MircAmp
}

alias button.text {
  if ($1 == 0) { return 9 }
  elseif ($1 == 1) { return 4 }
  elseif ($1 == 2) { return ; }
  elseif ($1 == 3) { return < }
  elseif ($1 == 4) { return : }
  elseif ($1 == 5) { return $chr(160) $+ List }
  else { return Rand }
}

alias draw.open {
  draw.detail @MircAmp $iif($1, 0, 1) 210 70 30 15 $iif($1, 0, 1)
  draw.text @MircAmp "verdana" -7 $iif($1, 212, 211) $iif($1, 71, 70) Open
  drawdot @MircAmp
}

alias player.text {
  drawrect -rnf @MircAmp $hget(player, col.mg) 1 121 11 118 14
  draw.text -c @MircAmp "verdana" -8 122 11 116 17 $1-
  drawdot @MircAmp
}

alias player.time {
  drawrect -rnf @MircAmp $hget(player, col.mg) 1 121 36 39 24
  drawrect -rnf @MircAmp $hget(player, col.mg) 1 11 11 98 25
  draw.text -c @MircAmp "verdana" -6 124 36 38 12 $player.bitrate $+ kbps 
  if ($fmod(SOUND_GetPaused, 1)) {
    set %flash $iif(%flash, 0, 1)
    if (%flash) { goto done }
  }
  var %t = $fmod(SOUND_Stream_GetTime, 1 1)
  if (: isin %t) {
    if ($len($gettok(%t, 1, 58)) = 1) { %t = 0 $+ %t }
  }
  else { %t = 00:00 }
  draw.text @MircAmp "webdings" -17 11 10 $player.state
  draw.text -c @MircAmp "verdana" -15 41 9 65 23 %t
  draw.shuffle
  :done
  player.progress
  drawdot @MircAmp
}

alias draw.shuffle {
  if ($hget(player, shuffle)) { draw.text @MircAmp "webdings" -7 147 44 s }
}


alias player.display {
  if ($window(@MircAmp)) {
    player.text $1- | player.time 
    .timerplayer.display 1 1 player.display $right($1-, -1) $+ $left($1-, 1)
  }
}

alias player.bitrate {
  var %x = $fmod(SOUND_Stream_GetPosition,1), %y = $calc(%x - $iif($hget(player, position), $ifmatch, 0))
  hadd -m player position %x | return $int($calc(%y / 124))
}

alias player.state {
  if ($fmod(SOUND_IsPlaying)) {
    if ($fmod(SOUND_GetPaused, 1)) { return ; }
    else { return 4 }
  }
  else { return < }
}

alias draw.volume {
  var %x = $calc($int($calc(($fmod(SOUND_GetVolume) / 255) * 62)) + 171), %y = $calc(%x - 171)
  if (%x isnum) {
    drawrect -nrf @MircAmp $hget(player, col.mg) 1 171 36 68 4
    drawrect -nrf @MircAmp $hget(player, col.fg) 1 171 36 $calc(%x - 171) 4
    drawrect -nrf @MircAmp $hget(player, col.bg) 1 %x 36 5 4
    drawline -nr @MircAmp $hget(player, col.hl) 1 %x 40 %x 36 $calc(%x + 5) 36
    drawline -nr @MircAmp $hget(player, col.sh) 1 %x 39 $calc(%x + 5) 39 $calc(%x + 5) 36
    drawdot @MircAmp
  }
}

alias player.progress {
  drawrect -nrf @MircAmp $hget(player, col.mg) 1 121 71 79 14
  if ($fmod(SOUND_IsPlaying)) {
    var %a = $fmod(SOUND_Stream_GetPosition,1), %b = $fmod(SOUND_Stream_GetLength,1), %x = $int($calc(((%a / %b) * 63) + 121))
    draw.detail @MircAmp 1 %x 72 15 12 1
  }
  draw.text -c @MircAmp "verdana" -6 124 48 38 12 $int($calc((%a / %b) * 100)) $+ %
  drawdot @MircAmp
}

alias player.cmd {
  if ($1 == 0) { move.buffer 0 }
  elseif ($1 == 1) { play.track }
  elseif ($1 == 2) {
    if ($fmod(SOUND_GetPaused)) { fmod SOUND_SetPaused -3 0 }
    else { fmod SOUND_SetPaused -3 1 }
  }
  elseif ($1 == 3) { fmod SOUND_Stream_Stop 1 }
  elseif ($1 == 4) { move.buffer 1 }
}

alias player.cmd.b {
  if ($1 == 0) {
    if ($window(@PlayList)) { close.playlist }
    else { open.playlist }
  }
  else {
    if ($hget(player, shuffle)) { hdel player shuffle }
    else { hadd player shuffle 1 }
    draw.shuffle
  }
}

alias open.menu {
  window -ak0hdBCpfo +dL @OpenMenu -2 -2 1 1
  window @OpenMenu $calc($window(@MircAmp).x + 210) $calc($window(@MircAmp).y + 85) 30 45
  var %i = 0
  while (%i <= 2) { draw.open.button %i 0 | inc %i }
}

alias draw.open.button {
  if ($window(@OpenMenu)) {
    var %y = $int($calc($1 * 15)), %c0 = $hget(player, col.sh), %c1 = $hget(player, col.hl)
    drawrect -nrf @OpenMenu $iif($2, $rgb(223, 220, 214), $hget(player, col.mg)) 1 0 %y 30 15
    drawline -rn @OpenMenu %c [ $+ [ $iif($2, 0, 1) ] ] 1 0 $calc(%y + 15) 0 %y 30 %y
    drawline -rn @OpenMenu %c [ $+ [ $iif($2, 1, 0) ] ] 1 0 $calc(%y + 15) 30 $calc(%y + 15) 30 %y
    draw.text @OpenMenu "verdana" -7 1 %y $open.menu.text($1)
    drawdot @OpenMenu
  }
}

alias open.menu.text {
  if ($1 == 0) { return File }
  elseif ($1 == 1) { return Dir }
  else { return List }
}

alias pause.display {
  var %s = $hget(player, in.display)
  if (!%s) {
    hadd player in.display $timer(player.display).com
    .timerplayer.display off
  }
  else { %s | hdel player in.display }
}

alias open.menu.cmd {
  if ($1 == 0) {
    if ($$sfile($iif($hget(player, playlist.dir), $ifmatch, $mircdir))) {
      var %f = $ifmatch
      hadd -m player playlist.dir $nofile(%f)
      play.track %f
    }
  }
  elseif ($1 == 1) { clear.list | add.dir }
  elseif ($1 == 2) {
    if ($$sfile($+(", $scriptdir, Hash\*.ma"))) {
      clear.list
      hload playlist $+(", $ifmatch, ")
    }
  }
  if ($window(@PlayList)) { listbox @PlayList }
}

alias clear.list {
  if (!$hget(playlist)) {
    hmake playlist
  }
  else { hdel -w playlist ITEM* }
}

alias add.dir {
  if ($+(", $$sdir($iif($hget(player, playlist.dir), $ifmatch, $mircdir)), ")) {
    var %d = $ifmatch, %f = *.mp3;*.ogg;*.wma
    hadd -m player playlist.dir %d
    pause.display 
    player.text Calculating..
    var %x = $iif($hget(playlist, ITEM0), $calc($ifmatch + 1), 1), %y = $findfile(%d, %f, 0, whilefix)
    if (%y) {
      inc %y %x
      hadd playlist ITEM0 %x %y
      .echo -q $findfile(%d, %f, 0, add.track $+(", $1-, "))
      dec %y
      hadd -m playlist ITEM0 %y
      if ($window(@PlayList)) { listbox @PlayList }
    }
    pause.display 
  }
}

alias add.track {
  whilefix
  tokenize 32 $hget(playlist, ITEM0) $1-
  player.text $+($1, /, $2 $chr(40), $int($calc(($1 / $2) * 100)), $chr(37), $chr(41))  
  hadd -m playlist ITEM $+ $1 $get.track.info($3-)
  hadd -m playlist ITEM0 $calc($1 + 1) $2
}

alias get.track.info {
  return $+($1-, $chr(1), $iif($sound($1-).title, $ifmatch, $nopath($1-)), $chr(1), $iif($sound($1-).artist, $ifmatch), $chr(1), $iif($sound($1-).album, $ifmatch))
}

alias fmod.open { 
  if ($fmod(FMOD_Connect, $binary(fmod.dll))) {
    if ($fmod(SOUND_Init,44100 64 0)) { 
      vis.open
    }
    else { echo -s Fmod: error }
  }
}

alias fmod.close {
  fmod SOUND_Close
  fmod Plugin_UnLoad 0
  fmod Plugin_UnLoad 1 
  dll -u $binary(fmod_mIRC.dll)
}

alias vis.open {
  fmod Plugin_Load 0 $+(", $binary(plugins\fmm_vis_spectrum.dll), ")
  fmod Plugin_Load 1 $+(", $binary(plugins\fmm_vis_oscilloscope.dll), ")
  vis.start
}


alias vis.start {
  var %a = $replace($rgb($hget(player, col.mg)), $chr(44), $chr(47)), %b = $replace($rgb($hget(player, col.fg)), $chr(44), $chr(47))

  vis 0 Set_Dim 11 32 99 28 
  vis 0 Set_Bgcolor %a
  vis 0 Set_Barwidth 1 
  vis 0 Set_NumColors 1
  vis 0 Set_Color 0 %b
  vis 0 Set_Barspace 0 
  vis 0 Set_BounceRate 2.5
  vis 0 Set_Avg 15 

  vis 1 Set_Dim 11 32 99 28 
  vis 1 Set_Bgcolor %a
  vis 1 Set_NumColors 1
  vis 1 Set_Color 0 %b 
  vis 1 Set_BounceRate 2.5
  vis 1 Set_Avg 15 

  if ($hget(player, plugin)) {
    vis 1 Oscilloscope 1 1 @MircAmp 25
  }
  else {
    vis 0 Spectrum 1 1 @MircAmp 25
  }
}

alias vis.stop {  
  if ($hget(player, plugin)) {
    vis 1 Oscilloscope 0
  }
  else {
    vis 0 Spectrum 0
  }
}

alias vis.change {
  vis.stop
  if ($hget(player, plugin)) { hadd player plugin 0 }
  else { hadd player plugin 1 }
  vis.open
}

alias play.track {
  var %f = $iif($1-, $ifmatch, $hget(playlist, ITEM $+ $iif($hget(listbox.@playlist, selected), $ifmatch, 1)))
  %f = $gettok(%f, 1, 1)
  if ($isfile(%f)) { 
    fmod SOUND_Stream_Close 1
    fmod SOUND_Stream_Open 1 %f 
    fmod SOUND_Stream_Play 1 
    fmod SOUND_SetVolume 0 $iif($hget(player, volume) isnum, $ifmatch, 255)
    fmod SOUND_Stream_SetEndCallback 1 next.track
    hdel -m player position
    tokenize 32 $+($iif($sound(%f).artist, $+($ifmatch, $chr(32), -, $chr(32))), $iif($sound(%f).album, $+($ifmatch, $chr(32), -, $chr(32))), $+($iif($sound(%f).title, $ifmatch, $nopath(%f)), $chr(32), -, $chr(32)))
    player.display $replace($1-, $chr(32), $chr(160)) $+ $chr(160)
  }
  else { player.text File error. }
}

alias next.track {
  var %x = $hget(playlist, ITEM0), %y = $hget(listbox. $+ @PlayList, selected)
  if ($hget(player, random)) {
    hadd listbox. $+ @PlayList selected $rand(1, %x)
  }
  else {
    if (%y < %x) {
      hinc listbox. $+ @PlayList selected
    }
    else {
      hadd listbox. $+ @PlayList selected 1
    }
  }
  echo -s %y %x
  if ($window(@playlist)) {
    draw.select @PlayList
    drawdot @PlayList
  }
  play.track
}

alias open.colsel {
  window -ak0hdBpfo +d @ColSel -1 -1 100 200
  draw.colsel
}

alias default.cols {
  hadd -m player col.bg $rgb(223,220,214) 
  hadd -m player col.mg $rgb(233,230,224) 
  hadd -m player col.fg $rgb(160,160,160)
  hadd -m player col.hl $rgb(255,255,255)
  hadd -m player col.sh $rgb(144,144,144)
  hadd -m player rend.3d 1
  if ($1) { draw.all }
}

alias draw.colsel {
  drawrect -rf @ColSel $hget(player, col.bg) 1 0 0 $window(@ColSel).w $window(@ColSel).h
  drawrect -rn @ColSel $rgb(180,180,180) 1 0 0 $window(@ColSel).w $window(@ColSel).h
  drawline -rn @ColSel $hget(player, col.hl) 1 1 $calc($window(@ColSel).h -2) 1 1 $calc($window(@ColSel).w - 2) 1
  drawline -rn @ColSel $hget(player, col.sh) 1 1 $calc($window(@ColSel).h - 2) $calc($window(@ColSel).w - 2) $calc($window(@ColSel).h - 2) $calc($window(@ColSel).w - 2) 1
  var %i = 0
  while (%i <= 2) {
    var %x = $calc((%i * 30) + 10), %h = $calc($window(@ColSel).h - 20)
    draw.detail @ColSel 0 %x 10 20 %h
    inc %i
  }
  if (!$hget(player, col.sel)) { set.col bg }
  draw.value
  drawdot @ColSel
}

alias draw.value {
  var %h = $calc($window(@ColSel).h - 22), %d, %i = 1
  tokenize 44 $rgb($hget(player, col. $+ $hget(player, col.sel)))
  while (%i <= 3) {
    %d = $int($calc(%h - (($ [ $+ [ %i ] ] / 255) * 179)))
    drawrect -nrf @ColSel $hget(player, col.mg) 1 $calc(((%i - 1) * 30) + 11) 11 18 $calc($window(@ColSel).h - 22)
    drawrect -nfr @ColSel $iif(%i == 1, $rgb($ [ $+ [ %i ] ], 0, 0), $iif(%i == 2, $rgb(0, $ [ $+ [ %i ] ], 0), $rgb(0, 0, $ [ $+ [ %i ] ]))) 1 $calc(((%i - 1) * 30) + 11) $calc(%d + 12) 18 $calc(%h - %d)
    inc %i
  }
}

menu @ColSel {
  sclick: { 
    if ($inrect($mouse.x, $mouse.y, 10, 10, 80, 180)) {
      var %x = $int($calc((($mouse.x - 10) / 80) * 3)), %y, %i
      if ($inrect($mouse.x, $mouse.y, $calc(10 + (%x * 20) + (%x * 10)), 10, 20, 180)) {
        %i = col. $+ $hget(player, col.sel)
        while ($mouse.key & 1) && ($whilefix) {
          %y = $int($calc(255 - (($mouse.y - 10) / 180) * 255))
          if (%y isnum 0-255) {
            tokenize 44 $puttok($rgb($hget(player, %i)), %y, $calc(%x + 1), 44)
            hadd player %i $rgb($1, $2, $3)
            draw.value
            drawdot @ColSel
          }
        }
        draw.all
        return
      }
      goto move
    }
    else { goto move }
    return
    :move
    draw.move
  }
  $iif($hget(player, col.sel) == bg, $style(1)) $+ Background:/set.col bg
  $iif($hget(player, col.sel) == mg, $style(1)) $+ Midground:/set.col mg
  $iif($hget(player, col.sel) == fg, $style(1)) $+ Foreground:/set.col fg
  $iif($hget(player, col.sel) == hl, $style(1)) $+ HighLight:/set.col hl
  $iif($hget(player, col.sel) == sh, $style(1)) $+ Shadow:/set.col sh
  -
  $iif($hget(player, rend.3d), $style(1)) $+ 3D Text Effect { 
    set.rend $iif($hget(player, rend.3d), 0, 1) 
    draw.all
  }
  Default Colors:/default.cols 1
  -
  Close:/close -@ @ColSel
}

alias set.col {
  hadd -m player col.sel $1
  draw.value
  drawdot @ColSel
}

alias draw.all {
  draw.colsel
  draw.value
  drawdot @ColSel
  draw.player
  if ($window(@PlayList)) { listbox $ifmatch }
  vis.start
}

on *:signal:mousewheel:{
  move.buffer @PlayList $2
  draw.buffer @PlayList
  drawdot @PlayList
}

alias draw.move {
  var %a, %b, %c = $calc($window(-1).w - $window($active).w), %d = $calc($window(-1).h - ($window($active).h + $iif($window(@PlayList) && $hget(player, snap), $window(@playlist).h, 0))), %x = $mouse.x, %y = $mouse.y
  while ($mouse.key & 1) && ($whilefix) { 
    %a = $calc($mouse.dx - %x) 
    %b = $calc($mouse.dy - %y)
    window $active $iif(%a < %c, $iif(%a > 0, %a, 0), %c) $iif(%b < %d, $iif(%b > 0, %b, 0), %d)
    if ($active == @MircAmp) { do.snap }
  } 
}

alias do.snap {
  if ($hget(player, snap)) && ($window(@PlayList)) {
    window @PlayList $window(@MircAmp).x $calc($window(@MircAmp).y + $window(@MircAmp).h)
  }
}

;-=[ListBox Code]=-

alias listbox {
  var %t = listbox. $+ $1
  if ($isid) {
    hadd -m %t $prop $2-
  }
  else {
    var %win = $1
    tokenize 32 $hget(listbox. $+ %win, coords)
    drawrect -rfn %win $rgb(223,220,214) 1 $1-
    draw.detail %win $false $1-
    draw.header %win $calc($1 + 3) $calc($2 + 3) $calc($3 - 6)
    draw.scroll.buttons %win
    draw.buffer %win
    drawdot %win
  }
}

alias draw.detail {
  var %a, %b
  if ($2) {
    %a = $rgb(255,255,255) | %b = $rgb(144,144,144)
  }
  else {
    %b = $rgb(255,255,255) | %a = $rgb(144,144,144)
  }
  drawdot -rn $1 %a 2 $calc($3 + 2) $calc($4 + 2)
  drawline -rn $1 %a 2 $3 $calc($4 + $6) $3 $4 $calc($3 + $5) $4
  drawline -rn $1 %b 2 $3 $calc($4 + $6) $calc($3 + $5) $calc($4 + $6) $calc($3 + $5) $4
}

alias draw.header {
  var %win = $1, %font = $hget(listbox. $+ %win, font), %text = $hget(listbox. $+ %win, header), %h = $calc($font.height(%font) + 1)
  draw.detail %win $true $2- %h
  set.list.dims %win $2- %h
  tokenize 32 $calc($2 + 3) $3 $calc($4 - 6) %h
  %font = $replace(%font, /, $chr(32))
  drawtext -rnc %win $rgb(255,255,255) %font $1 $2 $calc($3 - 1) $calc($4 - 1) %text
  drawtext -rnc %win $rgb(160,160,160) %font $calc($1 - 1) $calc($2 - 1) $3 $4 %text
}

alias draw.scroll.buttons {
  draw.scroll.button $1 0 $true
  draw.scroll.button $1 1 $true
}

alias draw.scroll.button {
  var %win = $1, %button = $2, %pressed = $3
  tokenize 32 $hget(listbox. $+ %win, scrollbar) 
  var %h = $iif(%button == 0, $2, $calc(($2 + $4) - 10))
  draw.detail %win %pressed $calc($1 + 1) %h $calc($3 - 3) 10
  drawtext -rn %win $rgb(255,255,255) WebDings 12 $calc($1 + 3) $calc(%h - 3) $iif(%button == 0, 5, 6)
  drawtext -rn %win $rgb(160,160,160) WebDings 12 $calc($1 + 2) $calc(%h - 4) $iif(%button == 0, 5, 6)
}

alias set.list.dims {
  var %win = $1
  tokenize 32 $2 $calc($3 + $5) $calc($4 - 15) $calc(($gettok($hget(listbox. $+ $1, coords), 4, 32) - $5) - 3)
  $listbox(%win, $calc($1 + 2) $calc($2 + 1) $calc($3 - 2) $calc($4 - 2)).listdims
  $listbox(%win, $calc($1 + $3) $calc($2 + 2) 16 $calc($4 - 4)).scrollbar
  $listbox(%win, $calc($1 + $3) $calc($2 + 13) 16 $calc($4 - 26)).scrolldims
}

alias draw.buffer {
  if ($2) {
    $listbox($1, $iif($3, $int($calc(($2 / 100) * $list.lines($1))), $2)).position
  }
  var %win = $1, %p = $iif($hget(listbox. $+ %win, position), $ifmatch, 1), %step = $font.height($hget(listbox. $+ %win, font)), %hash = $hget(listbox. $+ %win, hash), %i = 0, %z = 1
  tokenize 32 $hget(listbox. $+ %win, listdims)
  %font = $replace(%font, /, $chr(32))
  drawrect -rfn %win $rgb(223,220,214) 1 $1-
  while (%i < $calc($4 - %step)) {
    draw.row %win $1 $calc($2 + %i + 2) $3 $4 ITEM $+ $calc(%p + %z)
    inc %i %step
    inc %z
    else {
      break
    }
  }
  $listbox(%win, $calc(%z - 1)).listlines
  draw.lines %win
  draw.scroll %win $int($calc((%p / $list.lines(%win)) * 100)) 
  draw.select %win
}

alias draw.lines {
  var %win = $1, %a = 1, %b, %c
  tokenize 32 $hget(listbox. $+ $1, listdims)
  %b = $1
  while ($gettok($hget(listbox. $+ %win, columns), %a, 32)) {
    %c = $ifmatch
    draw.line %win $calc(%b + %c) $2 $calc(%b + %c) $calc($2 + $4)
    inc %b %c
    inc %a
  }
}

alias draw.row {
  var %win = $1, %font = $sep.font(%win), %columns = $hget(listbox. $+ %win, columns), %i = 1, %x, %z, %t 
  tokenize 32 $2-5 $chr(1) $+ $gettok($hget($hget(listbox. $+ %win, hash), $6), 2-, 1)
  %x = $1
  while (%i <= $calc($numtok(%columns, 32) + 1)) {
    if ($gettok(%columns, %i, 32)) {
      %z = $ifmatch
      inc %x 3
      if ($gettok($3-, $calc(%i + 1), 1)) {
        drawtext -rnc %win $rgb(255,255,255) %font %x $2 $calc(%z - 8) $4 $ifmatch
        drawtext -rnc %win $rgb(160,160,160) %font $calc(%x - 1) $calc($2 - 1) $calc(%z - 7) $calc($4 + 1) $ifmatch
      }
    }
    inc %x %z
    inc %i
  }
}

alias draw.line {
  var %win = $1
  tokenize 32 $2-
  drawline -rn %win $rgb(255,255,255) 1 $1-
  drawline -rn %win $rgb(144,144,144) 1 $calc($1 + 1) $2 $calc($3 + 1) $4
}

alias draw.scroll {
  var %win = $1, %p = $2
  tokenize 32 $hget(listbox. $+ %win, scrolldims) $list.lines(%win) $iif($hget(listbox. $+ %win, listlines), $ifmatch, 0)
  var %s = $iif($5 <= $6, 1, $iif($calc($6 / $5) < 0.07, 0.07, $v1))), %x = $1, %y = $int($calc(((%p / 100 * $4) * (1 - %s)) + $2)), %w = $calc($3 - 1), %h = $ceil($calc($4 * %s - 2))
  drawrect -rnf %win $calc($rgb(223,220,214) - $rgb(20,20,20)) 1 $1 $2 $calc($3 - 1) $calc($4 + 1)
  drawrect -nfr %win $rgb(223,220,214) 1 %x %y %w %h
  draw.detail %win $true $calc(%x + 1) $calc(%y + 1) $calc(%w - 2) %h
}

alias list.lines {
  return $iif($iif($hget($hget(listbox. $+ $1, hash), ITEM0), $calc($ifmatch - $list.rows($1)), 0) > 0, $v1, 0)
}

alias list.rows {
  return $hget(listbox. $+ $1, listlines)
}

alias sep.font {
  return $replace($hget(listbox. $+ $1, font), /, $chr(32))
}

alias draw.select {
  var %w = $1, %h = $font.height($hget(listbox. $+ $1, font)), %a = $hget(listbox. $+ $1, position), %b = $list.rows($1), %c = $hget(listbox. $+ $1, selected)
  tokenize 32 $hget(listbox. $+ %w, listdims)
  drawreplace -nr %w $rgb(200,206,213) $rgb(223,220,214) $1-
  if (%c isnum $+(%a, -, $calc(%a + %b))) {
    drawreplace -nr %w $rgb(223,220,214) $rgb(200,206,213) $1 $int($calc($2 + ((%c - %a - 1) * %h))) $3 %h
  }
}

alias set.select {
  $listbox($1, $2).selected
}


alias font.height {
  tokenize 47 $1-
  return $calc($height(T, $1, $2) + 1)
}

alias set.scroll {
  draw.buffer $1 $2 $true
}

alias move.buffer {
  var %i = $hget(listbox. $+ $1, position)
  if ($2 == up) {
    if (%i > 0) { 
      hdec listbox. $+ $1 position 
    }
  }
  else {
    if (%i < $list.lines($1)) { 
      hinc listbox. $+ $1 position 
    }
  }
}

alias get.column {
  var %c = $hget(listbox. $+ $1, columns)
  return $iif($2 == 0, $numtok(%c, 32), $iif($gettok(%c, $2, 32), $ifmatch, $false))
}

menu @Playlist {
  sclick: {
    var %a = $active, %i
    if ($hget(listbox. $+ %a)) {
      var %t = $ifmatch
      tokenize 32 $hget(%t, listdims) 
      if ($inrect($mouse.x, $mouse.y, $1, $2, $3, $4)) {
        var %x = 1, %y = $1, %z, %columns = $hget(listbox. $+ %a, columns), %j, %k
        while ($get.column(%a, %x)) {
          %z = $ifmatch
          inc %y %z
          if ($mouse.x isnum $+($calc(%y - 2), -, $calc(%y + 2))) {
            while ($mouse.key & 1) && ($active == %a) && ($whilefix) {
              %k = $calc($gettok(%columns, %x, 32) + ($mouse.x - %y))
              %j = $puttok(%columns, %k, %x, 32)
              if ($calc($replace(%j, $chr(32), +)) <= $calc($3 - 2)) && (%k >= 1) {
                $listbox(%a, %j).columns
                draw.buffer %a
                drawdot %a
              }
            }
            return
          }
          inc %x
        }
        set.select %a $calc($int($calc((($mouse.y - $2) / $4) * $list.rows(%a))) + ($hget(listbox. $+ %a, position) + 1))
        draw.select %a 
        drawdot %a
        return
      }
      tokenize 32 $hget(%t, scrollbar) 
      if ($inrect($mouse.x, $mouse.y, $1, $2, $3, $4)) {
        tokenize 32 $hget(%t, scrolldims) 
        if ($inrect($mouse.x, $mouse.y, $1, $2, $3, $4)) {
          while ($mouse.key & 1) && ($active == %a) && ($whilefix) {
            %i = $int($calc((($mouse.y - $2) / $4) * 100))
            if (%i isnum 0-100) {
              set.scroll %a %i
            }
            drawdot %a
          }
        }
        else {
          %i = $int($calc(($mouse.y - $2) / $4))
          while ($mouse.key & 1) && ($active == %a) && ($whilefix) {
            draw.scroll.button %a %i $false
            move.buffer %a $iif(%i == 0, up, down)
            draw.buffer %a
            drawdot %a
          }
          draw.scroll.button %a %i $true
          drawdot %a
        }
      }
    }
  }
}