====== Создание скриптов для заголовка окна, строки состояния и всплывающей подсказки в системном трэе ====== Три пункта в теме этой главы, и все три касаются отображения информации о текущей проигрываемой композиции. В первую очередь мы создадим скрипт для заголовка окна Foobar2000, затем поместим в нашу строку состояния техническую информацию и еще один индикатор проигрывания, ну и, наконец, мы настроем отображение всплывающей подсказки для иконки Foobar2000 в системном трэе. ===== Скрипт для заголовка окна ===== При остановленном воспроизведении заголовок окна содержит имя Foobar2000 и номер версии, такое поведение определено заранее и не может быть изменено. Но как только воспроизведение начинается, мы можем использовать Tagz для изменения внешнего вида заголовка, хотя мы и ограничены всего одной строкой, и не можем использовать цвета. В зависимости от стиля оформления Вашей Windows конечный результат будет выглядеть примерно так: {{dark_connections_titlebar.png}} На скриншоте показан максимальный объем отображаемой информации: имя исполнителя, заголовок композиции и название альбома. Для того чтобы ввести этот скрипт перейдите на страницу **Display / Title formatting** в настройках и активируйте вкладку **Main window title**. {{titlebar_tab.png}} [%artist%' - ']%title%[' ['%album%']'] Не думаю, что этот скрипт требует каких-либо дополнительных разъяснений. :-) ===== Скрипт для строки состояния ===== Глядя на скриншот, мы можем определенно сказать, что код для строки состояния более интерестен: {{dark_connections_statusbar.png}} Перейдите на страницу **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% )))) Это часть для отображения кодека. Вспомните, что мы делали при создании информации о кодеке в [[foobar2000:tagz:tutorial:create_columns#stolbec_artist_album|столбце 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//). Чтобы было понятней, для начала изучим общий синтаксис:
$progress2(position,range,length,char1,char2)
//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()'', использующая такие же аргументы, но отображающая индикатор немного иначе.
$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%)
' %'
)
Это готовый скрипт для индикатора прогресса. В ''$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 вещи. Во-первых, вставить несколько разделителей между секциями, для этого нам прекрасно подойдут пробелы. И, во-вторых, определить переменную для красного цвета во второй секции (часть технической информации), для того чтобы еще более разделить секции. Ниже приведен законченный скрипт.
$puts(AltColour,$rgb(126,16,16))
$puts(pbarColour1,$rgb(126,16,16))
$puts(pbarColour2,$rgb(170,170,170))

$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%
))))

$get(AltColour)'   '

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

$rgb()'   '

%_time_elapsed%[' of '%_time_total%]

'   '

// progress bar
$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%)
' %'
)

// paused status
$if(%_ispaused%,$char(9)'pause {on} ')
Вы спросите для чего использовать ''$puts()'' в начале скрипта? Определяя все переменные для цветов в начале скрипта, мы облегчаем дальнейшее редактирование этих цветов, мы же не хотим рыскать по всему скрипту в поисках функций ''$rgb()''. Наиболее логичным и грамотным решением было бы определить все переменные вместе в одном месте, на вкладке **Globals** в настройка Columns UI, но, к сожалению, настройки **Display / Title formatting** не являются частью настроек Columns UI, это часть ядра Foobar2000. Поэтому получит отсюда доступ к переменным Columns UI просто невозможно. ===== Скрипт для всплывающей подсказки в системном трэе ===== Наш последний скрипт касается всплывающей подсказки, появляющейся при наведении курсора мыши на значок Foobar2000 в системном трэе. {{dark_connections_tooltip.png}} Он задается на вкладке **Notification area icon tooltip**. [%artist%' - ']%title% [$crlf()%album%][' #'%tracknumber%] Это уже готовый скрипт, отображающий исполнителя и заголовок песни на одной строке, и соответствующую информацию об альбоме и номере трэка на другой. Функция ''$crlf()'' вставляет перенос строки. Я решил не использовать здесь шестнадцатеричные номера трэков, они хорошо смотрятся в контексте плэйлиста, но здесь они выглядят немного нелепо. Я остановил свой выбор на использовании знака # за которым следует номер трэка. ===== Результат ===== Ну, в общем-то, внешний вид не сильно изменился, по сравнению с предыдущей главой. Тем не менее, вот скриншот: {{stage_4.png?250x183|Щелкните для увеличения}} Для первого раза мы уже имеет готовый дизайн, и если Вы никогда не имеете дел с неполными альбомами, то можете смело пропустить следующую главу. ~~DISCUSSION~~