Инструменты пользователя

Инструменты сайта


foobar2000:tagz:tutorial:script_bars

Создание скриптов для заголовка окна, строки состояния и всплывающей подсказки в системном трэе

Три пункта в теме этой главы, и все три касаются отображения информации о текущей проигрываемой композиции. В первую очередь мы создадим скрипт для заголовка окна Foobar2000, затем поместим в нашу строку состояния техническую информацию и еще один индикатор проигрывания, ну и, наконец, мы настроем отображение всплывающей подсказки для иконки Foobar2000 в системном трэе.

Скрипт для заголовка окна

При остановленном воспроизведении заголовок окна содержит имя Foobar2000 и номер версии, такое поведение определено заранее и не может быть изменено. Но как только воспроизведение начинается, мы можем использовать Tagz для изменения внешнего вида заголовка, хотя мы и ограничены всего одной строкой, и не можем использовать цвета. В зависимости от стиля оформления Вашей Windows конечный результат будет выглядеть примерно так:

На скриншоте показан максимальный объем отображаемой информации: имя исполнителя, заголовок композиции и название альбома. Для того чтобы ввести этот скрипт перейдите на страницу Display / Title formatting в настройках и активируйте вкладку Main window title.

[%artist%' - ']%title%[' ['%album%']']

Не думаю, что этот скрипт требует каких-либо дополнительных разъяснений. :-)

Скрипт для строки состояния

Глядя на скриншот, мы можем определенно сказать, что код для строки состояния более интерестен:

Перейдите на страницу Display / Columns UI, выберите вкладку Status bar/Systray tab и измените шрифт строки состояния (Status Bar Font) на Franklin Gothic Medium, 9pt (ну или на любой другой, который Вы выбрали до этого для плэйлистов). Затем вернитесь к Display / Title formatting, выберите Status bar и удалите тот скрипт который там есть. Наш скрипт будет отображать информацию в пяти секциях: кодек, информация о потоке, время воспроизведения, индикатор прогресса, индикатор паузы. Расмотрим каждую из них подробней.

  $if($strcmp(%codec%,'ATSC A/52'),'Dolby Digital AC3',
  $if($info(lame_version),'Lame MP3',
  $if($strcmp(%codec%,'FLAC'),'FLAC lossless',
  $if($strcmp(%codec%,'PCM'),'PCM uncompressed',
  %codec%
  ))))

Это часть для отображения кодека. Вспомните, что мы делали при создании информации о кодеке в столбце Artist/Album и этот скрипт станет Вам понятен. Первые две строки, про AC3 и Lame MP3, полностью идентичны, отсальные строки работают по тому же принципу: «отлавливают» указанный кодек и меняют для него отображаемое имя. Вы можете расширить эту секцию как Вам угодно, добавив обработку нужных Вам кодеков.

  [%bitrate%' kbit/s'][' '%samplerate%' Hz']
  $ifgreater(%channels%,2,
  ' '%channels%' channels',
  [' '%channels%])

Наша вторая секция содержит технические подробности об аудио потоке. Первая строчка отображает битрэйт и частоту дискретизации (samplerate) композиции, при условии, что они присутсвуют. $Ifgreater() в первую очередь обрабатывает файлы с числом каналов больше чем 2. К примеру, композиция со звуком в формате 5.1 будет отображена как 6 channels. Для всех остальных, имеющих число каналов меньше 3, мы будем использовать сразу же поле %channels% которое, благодаря подстановке полей, выдает mono для одного канала, и stereo для двух канального звука. В этом случае необходима дополнительная проверка if (квадратные скобки), т.к. выше мы проверяли наличе количества каналов больше 2, но не само наличие информации о каналах. К примеру для MIDI файлов и других трэкерных форматов, обычная концепция каналов не подходит, и, соотвественно поле %channels% для них не существует.

%_time_elapsed%[' of '%_time_total%]

В третьей секции мы отображаем прошедшее время воспроизведения и, если это возможно, оставшееся время. Опять же используем квадратные скобки, для того чтобы корректно обработать файлы, для которых нельзя определить длину.

Поле %_time_total% существует только для текущего проигрываемого файла и обычно по значению равно полю %_length%. Различие состоит лишь в том что %_time_total% получает значение непосредственно из процедур воспроизведения Foobar2000, а %_length% - из media library или плэйлиста. Случается что иногда значения этих двух полей отличаются друг от друга, но не стоит об этом сильно беспокоиться.

Переходим к четвертой секции, оторая содержит индикатор прогресса (progress bar). Чтобы было понятней, для начала изучим общий синтаксис:

<pre class="code"> $progress2(<i>position</i>,<i>range</i>,<i>length</i>,<i>char1</i>,<i>char2</i>) </pre>

Range задает 100% значение прогресса, а position определяет текущую позицию, до которой дошел прогресс. Другим словом, это определение до какого процента должен быть заполнен индикатор прогресса. Length задает длину индикатора в символах, char1 и char2 - символы, служащие для отображения пустого и заполненного места соответственно. В результате получим:

  $progress2(%_time_elapsed_seconds%,%_time_total_seconds%,
  10,
  $get(pbarColour1)$char(9679),$get(pbarColour2)$char(9679)
  )

Два аргумента, %_time_elapsed_seconds% и %_time_total_seconds%, определяют какая часть песни уже проиграна, и насколько индикатор должен быть заполнен. Наш индикатор будет длиной в 10 символов. Символы заданы в 3-й строке, и они у нас идентичны: $char(9679, это большой кружок. В дополнение мы задали различные цвета для символов, заполненная часть будет красной, незаполненная серой. Мы определим переменные для цветов немного ниже. И вот уже снабженная все этой информацией, функция $progress2() рисует индикатор прогресса. Также существует другая версия этой функции: $progress(), использующая такие же аргументы, но отображающая индикатор немного иначе.

<pre class="code"> $if(%_time_total_seconds% , <font color="#808080">$progress2(%_time_elapsed_seconds%,%_time_total_seconds%, 10, $get(pbarColour1)$char(9679),$get(pbarColour2)$char(9679) )</font>   $rgb()' ' $muldiv(%_time_elapsed_seconds%,100,%_time_total_seconds%) ' %' ) </pre>

Это готовый скрипт для индикатора прогресса. В $if(%_time_total_seconds%,,) нет ничего особенного, очередная защита от ошибок в случае файлов для которых невозможно определить длину. Часть скрипта после конструкции $progress2() отображает после индикатора прогресса прошедшее время воспроизведения, в процентах. В первую очередь мы переключаем цвет текста на значение по умолчанию, используя $rgb(), иначе бы были использованы серый или красный цвет индикатора. Затем мы вычисляем число процентов используя $muldiv(x,y,z), которая умножает первый аргумент x на второй аргумент y, и результат умножения делит на третий аргумент z. По сути, эта функция есть сокращенный вариант вложенного вызова $div($mul(x,y),z. Ну и последним шагом мы отображаем знак процента. И переходим к последней, пятой секции.

$if(%_ispaused%,$char(9)'pause {on} ')

Поле %_ispaused% работает точно также как и %isplaying%, но только указывает на композицию в паузе. Если воспроизведение запаузено, то мы отобразим pause {on}. C помощью $char(9) мы вставляем знак табуляции, выравнивая тем самым строку по правому краю строки состояния.

Теперь настала пора собрать все кусочки в одно целое, и еще сделать 2 вещи. Во-первых, вставить несколько разделителей между секциями, для этого нам прекрасно подойдут пробелы. И, во-вторых, определить переменную для красного цвета во второй секции (часть технической информации), для того чтобы еще более разделить секции. Ниже приведен законченный скрипт.

<pre class="code"> $puts(AltColour,$rgb(126,16,16)) $puts(pbarColour1,$rgb(126,16,16)) $puts(pbarColour2,$rgb(170,170,170))   <font color="#808080">$if($strcmp(%codec%,'ATSC A/52'),'Dolby Digital AC3', $if($info(lame_version),'Lame MP3', $if($strcmp(%codec%,'FLAC'),'FLAC lossless', $if($strcmp(%codec%,'PCM'),'PCM uncompressed', %codec% ))))</font>   $get(AltColour)' '   <font color="#808080">[%bitrate%' kbit/s'][' '%samplerate%' Hz'] $ifgreater(%channels%,2, ' '%channels%' channels', [' '%channels%])</font>   $rgb()' '   <font color="#808080">%_time_elapsed%[' of '%_time_total%]</font>   ' '   // progress bar <font color="#808080">$if(%_time_total_seconds% , $progress2(%_time_elapsed_seconds%,%_time_total_seconds%, 10, $get(pbarColour1)$char(9679),$get(pbarColour2)$char(9679) )   $rgb()' ' $muldiv(%_time_elapsed_seconds%,100,%_time_total_seconds%) ' %' )</font>   // paused status <font color="#808080">$if(%_ispaused%,$char(9)'pause {on} ')</font> </pre>

Вы спросите для чего использовать $puts() в начале скрипта? Определяя все переменные для цветов в начале скрипта, мы облегчаем дальнейшее редактирование этих цветов, мы же не хотим рыскать по всему скрипту в поисках функций $rgb(). Наиболее логичным и грамотным решением было бы определить все переменные вместе в одном месте, на вкладке Globals в настройка Columns UI, но, к сожалению, настройки Display / Title formatting не являются частью настроек Columns UI, это часть ядра Foobar2000. Поэтому получит отсюда доступ к переменным Columns UI просто невозможно.

Скрипт для всплывающей подсказки в системном трэе

Наш последний скрипт касается всплывающей подсказки, появляющейся при наведении курсора мыши на значок Foobar2000 в системном трэе.

Он задается на вкладке Notification area icon tooltip.

  [%artist%' - ']%title%
  [$crlf()%album%][' #'%tracknumber%]

Это уже готовый скрипт, отображающий исполнителя и заголовок песни на одной строке, и соответствующую информацию об альбоме и номере трэка на другой. Функция $crlf() вставляет перенос строки. Я решил не использовать здесь шестнадцатеричные номера трэков, они хорошо смотрятся в контексте плэйлиста, но здесь они выглядят немного нелепо. Я остановил свой выбор на использовании знака # за которым следует номер трэка.

Результат

Ну, в общем-то, внешний вид не сильно изменился, по сравнению с предыдущей главой. Тем не менее, вот скриншот:

Щелкните для увеличения

Для первого раза мы уже имеет готовый дизайн, и если Вы никогда не имеете дел с неполными альбомами, то можете смело пропустить следующую главу.

~~DISCUSSION~~

foobar2000/tagz/tutorial/script_bars.txt · Последние изменения: 2007/02/08 14:02 — Mishail