WSH -> PSS, простой способ управления

Список разделов Аудиоплеер foobar2000 Секреты foobar2000

Описание: Кнопочки, конфиги, секреты, советы.

Сообщение #1 onv » 08.09.2012, 20:43

macarych

Раз надо популярно, на пальцах :) , значит, как я понимаю, подробно по шагам. Могу расписать на примере реализации последней хотелки vladj, это попроще, или на примере своего переключателя день/ночь, там посложнее и подольше объяснять. Хотя я тебе в общих чертах в ЛС уже описывал. На чем остановимся ?
onv M
Автор темы, Мастер
Возраст: 58
Откуда: Харьков
Репутация: 48
С нами: 5 лет 4 месяца

Сообщение #2 macarych » 08.09.2012, 20:52

Давай и то и другое, чего уж там... :biggrin:
macarych M
Гуру
Аватара
Репутация: 237
С нами: 8 лет 8 месяцев

Сообщение #3 onv » 08.09.2012, 21:45

Ладно, сначала vladj, а там, глядишь, второе и не понадобится :)
Из WSH, как ты знаешь, напрямую легко щелкать только layout-ами, накидал по нужным условиям fb.RunMainMenuCommand("View/Layout/нужная панель") и порядок. Я в своих сборках уже давно придерживаюсь строго этого правила - каждую панель - в свой лэйаут, потом не будет проблем с достукиванием извне, хоть из всш, хоть с кнопочного пульта дистанционного. А вот если валить кучу панелей в стек под один псс, то из всш с обращением к ним халява заканчивается. И тогда только через ран-сервис, с написанием своего скрипта с фокусировкой на конкретное окно и изготовлением из него экзешника, либо через FSO, созданием в всш флага состояния и подсовыванием этого флага в псс. С первым вариантом мы уже достаточно натрахались в 7-инч, теперь второй вариант :)
Что такое флаг-файл ? Это просто файл нулевой длины, в имени которого содержится нужная для псс-ного переключателя информация. Например, файл с именем switch_*. Который будет принимать 2 возможных состояния (2 варианта имени) - switch_0 или switch_1. А псс будет анализировать один последний символ в имени, и на основе этого делать соответствующие выводы.
Для этого в псс нужно добавить строчку
$set_ps_global(switch,$right($findfile(%ps_user_profile_path%/switch_*),1))
Ну, само собой, ps_user_profile_path или луюбой другой, какой тебе нужен, к этому моменту уже должен быть объявлен.

Дальше, пока псс анализировать нечего, такого файла по этому пути никто еще не создал. Это задача для всш.
Первое, не забываем главное на старте:
var fso = new ActiveXObject("Scripting.FileSystemObject");

Дальше, например,
var path = fb.ProfilePath;

А теперь, собственно, проверка на наличие такого флаг-файла, и создание его при отсутствии такового.
if(!fso.FileExists(path + "switch_0") && !fso.FileExists(path + "switch_1")) fso.CreateTextFile(path + "switch_0", true);
т.е. если ни того, ни другого варианта не лежит - создать че-нибудь :)

Дальше, смотрим, что за материал подручный перед нами лежит в данном случае и что требуется сделать. А лежит твой нейтрон, подмодифицированный vladj, и известна хотелка - при однократном нажатии ЛКМ на кавере требуется триггерно перещелкивать панели - или library tree, или playlist.
Что от нас это требует ? Естественно, каких-то действий в скрипте вывода кавера под функцией on_mouse_lbtn_down(x, y)
В данном случае в этом скрипте ее вообще нет, значит, надо создать, пишем
function on_mouse_lbtn_down(x, y) {
Теперь. Допустим, это не последняя хотелка упомятутого товарища, значит, кнопок над кавером, скорее всего, понадобится не одна... :)
Поэтому нарежем зону поменьше, на всякий пожарный
if(x < ww/3 && y < wh/4) {
Т.е. только при нажатии в этот левый верхний угол будет проистекать :)
Дальше. Поскольку мы делаем триггерную кнопку, то при каждом новом нажатии должен происходить переброс в другое состояние, для этого анализируем, а что там за файл валялся, с каким именем, и меняем его на противоположный
if(fso.FileExists(path + "switch_1")) {fso.MoveFile( path+"switch_1", path+"switch_0" );}
else if(fso.FileExists(path + "switch_0")) {fso.MoveFile( path+"switch_0", path+"switch_1" );}

А дальше нужно объяснить ничего не подозревающему псс, что в всш вдруг нечаянно что-то случилось, и уважаемый псс должен поднять свой зад и пойти перечитать имя файл-флага. Для этого придется вызвать функцию
RefreshPSS();
которая передернет псс и заставит его пройтись сначала по своему скрипту.
Для этого ее нужно отдельно создать

function RefreshPSS() {
if (fb.IsPlaying || fb.IsPaused) {
fb.RunMainMenuCommand("Playback/Play or Pause");
fb.RunMainMenuCommand("Playback/Play or Pause");
}
else {
fb.RunMainMenuCommand("Playback/Play");
fb.RunMainMenuCommand("Playback/Stop");
}
}

Благодаря этому псс гарантированно вздрогнет. И перечитает состояние флага.
И что нужно, в зависимости от этого, сделает. Т.е. :
$ifequal(%switch%,1,$showpanel_c(PL,0),$showpanel_c(ET,0))
В данном случае, нам надо тасовать на передний план то библиотеку, то плейлист. Ну вот.
В этом конкретном случае особой нужды передергивать панели для рефреша нет, поэтому использовать $movepanel_c особой нужды нет.

На сегодня все, хватит, а то на одного сгорбленного над компом дятла тут уже кое-кто косится давно :)
onv M
Автор темы, Мастер
Возраст: 58
Откуда: Харьков
Репутация: 48
С нами: 5 лет 4 месяца

Сообщение #4 macarych » 08.09.2012, 22:44

Вон оно че Михалыч :biggrin:
Теперь понятно. Примерно. Попробую. Про второе можно не писать.
macarych M
Гуру
Аватара
Репутация: 237
С нами: 8 лет 8 месяцев

Сообщение #5 vladj » 09.09.2012, 00:19

macarych, в скрипт твоей сборки ( не переделанной onv-ом) сверху добавил 2 строчки
$set_ps_global(swl,$right($findfile(%ps_user_profile_path%/swl_*),1))
$puts(foo_path,%ps_foobar2000_path%)
Там третья строка была насчёт профиля, но у меня портабельная, потому убрал её
$puts(user_path,%ps_user_profile_path%)
И в самый низ скрипта
$ifequal(%swl%,1,$showpanel_c(PL,0),$showpanel_c(ET,0))
Далее пошел в скрипт картинок (у меня от Максима) и там добавил из переделанной сборки,
(блин, ну гольный плагиат, а что делать, если умом не вышел)
Код: Выделить всё
var fso = new ActiveXObject("Scripting.FileSystemObject");
var path = fb.ProfilePath;
if(!fso.FileExists(path + "swl_0") && !fso.FileExists(path + "swl_1")) fso.CreateTextFile(path + "swl_0", true);

function RefreshPSS() {
    if (fb.IsPlaying || fb.IsPaused) {   
    fb.RunMainMenuCommand("Playback/Play or Pause");
   fb.RunMainMenuCommand("Playback/Play or Pause");
    }
    else {
    fb.RunMainMenuCommand("Playback/Play");
   fb.RunMainMenuCommand("Playback/Stop");
   }
    }

function on_mouse_lbtn_down(x, y) {
if(fso.FileExists(path + "swl_1")) {fso.MoveFile( path+"swl_1", path+"swl_0" );}
else if(fso.FileExists(path + "swl_0")) {fso.MoveFile( path+"swl_0", path+"swl_1" );}
        RefreshPSS();
window.Repaint(); 
  }
Щелчком по панели картинок запускается библиотека и неожиданный трабл для меня, после выбора альбома в библиотеке,
я в ней и остаюсь. До этого я в плейлист возвращался автоматом, а сейчас нужен лишний щелчок снова по картинке.
onv, это не трудно сделать ? По сути переключение плейлиста и библиотеки не нужно, щелчком по картинке, только вызов
библиотеки, а оттуда в плейлист автоматом после выбора нужного альбома. Спасибо огромное тебе за помощь.
PS. Это не срочно естественно, поэтому не в ущерб семейным делам.Это я (пенсионер) могу горбатится хоть до посинения над сборками. :smile:
HTPC Termaltake, Onkyo 525E, цап SMSL, фронт Yamaha 8900.
vladj M
Гуру
Аватара
Откуда: Пермский край
Репутация: 296
С нами: 7 лет 7 месяцев

Сообщение #6 onv » 09.09.2012, 11:57

vladj писал(а):onv, это не трудно сделать ?
Не знаю, еще не смотрел. Чисто умозрительно автовозврату из библиотеки в плейлист может мешать принудительный рефреш псс через двойную плей-паузу. А без рефреша в такой ситуации никак, работать не будет. Чтобы напрямую обратиться к библиотеке без извратов, ее нужно пересадить из стека, где она сейчас в общей куче, в свой отдельный лэйаут и тогда просто вызывать по fb.RunMainMenuCommand("View/Layout/Library Tree"). Я тебе уже писал об этом в ЛС.
А ты не горячись, попробуй поюзать так :) Смотри, представь себе, сидишь в машине. Когда ты в библиотеке на что-то нажал, то появился соответствующий кавер и заиграло выбранное. Независимо от того, вернулся ты в плейлист, или нет. А представь, нажал ты на кочке не на ту строчку в библиотеке, ну, рука дрогнула. Или выбрал какого-то исполнителя, пошли первые аккорды, и тебе тут же расхотелось это слушать, а захотелось что-то другое. Пока ты в библиотеке - не вопрос, даванул на другую строчку, и все. А если после каждой такой ошибки ты вылетаешь в плейлист, а оттуда каждый раз возвращаться в библиотеку... А так цена такому доп. удобству - всего одно лишнее нажатие для перехода в плейлист, если все устраивает. И то, не факт, что обязательно в плейлист нужно, может, часы вызвать на экран, или твою Валентино-панель.
onv M
Автор темы, Мастер
Возраст: 58
Откуда: Харьков
Репутация: 48
С нами: 5 лет 4 месяца

Сообщение #7 macarych » 25.08.2013, 21:39

onv, тогда я так и не попробовал. А сегодня решил задействовать эту фичу, полдня с перерывами возился, панель только выключалась, не было переключения. Заработало только когда строчки в PSS привел к такому виду:
Код: Выделить всё

$ifequal(%switch%,1,
    $showpanel_c(VU,1)
    $showpanel_c(PS,0),
    $showpanel_c(VU,0)
    $showpanel_c(PS,1)
)


phpBB [media]


Спасибо, все четко переключается.
macarych M
Гуру
Аватара
Репутация: 237
С нами: 8 лет 8 месяцев

Сообщение #8 Cerber » 25.07.2014, 22:27

Подскажите, пожалуйста.
Делаю кнопку на основе WSH для переключения панелей. Нужно сделать так, чтобы, когда панель активна (switch_1), изображение кнопки было другим, нежели при switch_0. Чтобы изображение сменялось при наведении мышки, я понял как сделать, а вот чтобы кнопка была активной, сделать не хватает познаний.
Вот скрипт:
Код: Выделить всё
var g_hover = 0;
var g_btn_img = gdi.Image(fb.ProfilePath + "images\\btn1.png");
var g_btn_img1 = gdi.Image(fb.ProfilePath + "images\\btn1_h.png");
var g_btn_img2 = gdi.Image(fb.ProfilePath + "images\\btn2.png");
var g_btn_img3 = gdi.Image(fb.ProfilePath + "images\\btn2_h.png");
   
function on_paint(gr){
   var ww = window.Width;
   var wh = window.Height;
   if (g_hover == 1) {
        gr.DrawImage(g_btn_img1,0,0,ww, wh,0,0,152,19);
    }
    else { 
        gr.DrawImage(g_btn_img,0,0,ww, wh,0,0,152,19);
    }
}

function on_mouse_move() {
    g_hover = 1;
    window.Repaint();
}

function on_mouse_leave() {
    g_hover = 0;
    window.Repaint();
}

var fso = new ActiveXObject("Scripting.FileSystemObject");
var path = fb.ProfilePath;

if(!fso.FileExists(path + "switch_0") && !fso.FileExists(path + "switch_1")) fso.CreateTextFile(path + "switch_0", true);

function on_mouse_lbtn_down(x, y) {
    if(fso.FileExists(path + "switch_1")) {fso.MoveFile( path+"switch_1", path+"switch_0" );}
    else if(fso.FileExists(path + "switch_0")) {fso.MoveFile( path+"switch_0", path+"switch_1" );}
    RefreshPSS();
    }
   
function RefreshPSS() {
    if (fb.IsPlaying || fb.IsPaused) {
        fb.RunMainMenuCommand("Playback/Play or Pause");
        fb.RunMainMenuCommand("Playback/Play or Pause");
    }
    else {
        fb.RunMainMenuCommand("Playback/Play");
        fb.RunMainMenuCommand("Playback/Stop");
    }
}
Сборка fooBardo by Cerber: http://foobar2000.ru/forum/viewtopic.php?t=5437
Cerber M
Новичок
Аватара
Возраст: 29
Репутация: 1
С нами: 3 года 2 месяца

Сообщение #9 macarych » 25.07.2014, 23:00

Cerber, извините, но по моему, это "черезжопный" вариант, этот способ onv показал для того что бы переключать не используя никаких кнопок. С кнопками все легко и просто средствами PSS сделать, с одной оговоркой - будет смена 2-х изображений кнопки, без 3-его изображения наведения курсора.
Показать простейший код или сами знаете?
macarych M
Гуру
Аватара
Репутация: 237
С нами: 8 лет 8 месяцев

Сообщение #10 Cerber » 25.07.2014, 23:30

macarych, средствами PSS знаю как сделать, но, почему-то, когда панель не одна, а несколько, периодически происходит ерунда: при скрытии одной панели скрывается и другая, хоть названия панелей в скриптах прописаны разные и соответствующие действительности. Думал, такая кнопка спасёт положение.
Сборка fooBardo by Cerber: http://foobar2000.ru/forum/viewtopic.php?t=5437
Cerber M
Новичок
Аватара
Возраст: 29
Репутация: 1
С нами: 3 года 2 месяца

Сообщение #11 macarych » 25.07.2014, 23:42

Вот в этом скрипте?
Код: Выделить всё
// VARIABLES

$set_ps_global(skin_path,%ps_foobar2000_path%\skins\fooBardo)

$drawimage(0,0,720,1050,$get_ps_global(skin_path)\img\fon2A.jpg,,,200)
$drawimage($sub(%ps_width%,720),0,720,1050,$get_ps_global(skin_path)\img\fon2A.jpg,,,200)
$drawimage(1,1,719,450,$get_ps_global(skin_path)\img\fon.jpg,,,255)
$drawimage($sub(%ps_width%,721),1,719,450,$get_ps_global(skin_path)\img\fon.jpg,,,255)
$drawimage(1,$sub(%ps_height%,451),719,450,$get_ps_global(skin_path)\img\fon.jpg,,,255)
$drawimage($sub(%ps_width%,721),$sub(%ps_height%,451),719,450,$get_ps_global(skin_path)\img\fon.jpg,,,255)

$drawimage($muldiv(%ps_width%,303,1000),$sub($sub(%ps_height%,$muldiv(%ps_height%,667,1000)),22),235,22,$get_ps_global(skin_path)\img\panel.png,,n,255)
$drawimage($muldiv(%ps_width%,541,1000),$sub($sub(%ps_height%,$muldiv(%ps_height%,667,1000)),22),235,22,$get_ps_global(skin_path)\img\panel.png,,n,255)
$drawrect($add($muldiv(%ps_width%,221,1000),$muldiv(%ps_width%,560,1000),2),$sub(%ps_height%,32),$sub($muldiv(%ps_width%,216,1000),38),28,64-0-0-255,64-0-0-255,RESERVED)
$drawimage(4,100,34,280,$get_ps_global(skin_path)\img\cd.png,,n,255)
$drawimage(4,4,34,280,$get_ps_global(skin_path)\img\cd.png,,n,255)
$drawrect(4,$muldiv(%ps_height%,3350,10000),34,$muldiv(%ps_height%,66135,100000),64-0-0-255,64-0-0-255,RESERVED)
$drawrect($add($add($add($sub($muldiv(%ps_width%,221,1000),38),$sub($muldiv(%ps_width%,221,1000),38)),$muldiv(%ps_width%,559,1000)),38),4,34,$sub(%ps_height%,8),64-0-0-255,64-0-0-255,RESERVED)
$drawimage(4,$muldiv(%ps_height%,3338,10000),34,2,$get_ps_global(skin_path)\img\sep1.png,,n,255)
$drawimage($add($add($add($sub($muldiv(%ps_width%,221,1000),38),$sub($muldiv(%ps_width%,221,1000),38)),$muldiv(%ps_width%,559,1000)),38),$muldiv(%ps_height%,1667,10000),34,2,$get_ps_global(skin_path)\img\sep1.png,,n,255)

# VIEWS

$ifequal($get_ps_global(view),1,$showpanel_c(Playlists,1),$showpanel_c(Playlists,0))
$ifequal($get_ps_global(view),2,$showpanel_c(Artist/Album,1),$showpanel_c(Artist/Album,0))
$ifequal($get_ps_global(view),3,$showpanel_c(Tracklist,1),$showpanel_c(Tracklist,0))

$imagebutton($muldiv(%ps_width%,221,1000),$sub($sub(%ps_height%,$muldiv(%ps_height%,667,1000)),22),118,22,$ifequal($get_ps_global(view),1,$get_ps_global(skin_path)\img\playl_a.png,$get_ps_global(skin_path)\img\playl.png),$ifequal($get_ps_global(view),1,$get_ps_global(skin_path)\img\playl_a.png,$get_ps_global(skin_path)\img\playl_h.png),SETGLOBAL:view:1;REFRESH,,)
$imagebutton($sub($div(%ps_width%,2),59),$sub($sub(%ps_height%,$muldiv(%ps_height%,667,1000)),22),118,22,$ifequal($get_ps_global(view),2,$get_ps_global(skin_path)\img\artalb_a.png,$get_ps_global(skin_path)\img\artalb.png),$ifequal($get_ps_global(view),2,$get_ps_global(skin_path)\img\artalb_a.png,$get_ps_global(skin_path)\img\artalb_h.png),SETGLOBAL:view:2;REFRESH,,)
$imagebutton($sub($add($muldiv(%ps_width%,221,1000),$muldiv(%ps_width%,559,1000)),118),$sub($sub(%ps_height%,$muldiv(%ps_height%,667,1000)),22),118,22,$ifequal($get_ps_global(view),3,$get_ps_global(skin_path)\img\trackl_a.png,$get_ps_global(skin_path)\img\trackl.png),$ifequal($get_ps_global(view),3,$get_ps_global(skin_path)\img\trackl_a.png,$get_ps_global(skin_path)\img\trackl_h.png),SETGLOBAL:view:3;REFRESH,,)


# VOLUME

$imagebutton($add($muldiv(%ps_width%,221,1000),$muldiv(%ps_width%,559,1000),2),$add($muldiv(%ps_height%,335,1000),$sub($muldiv(%ps_height%,666,1000),32)),28,28,$get_ps_global(skin_path)\img\mute.png,$get_ps_global(skin_path)\img\mute_h.png,COMMAND:Playback/Volume/Mute,,)
$imagebutton($add($muldiv(%ps_width%,221,1000),$muldiv(%ps_width%,559,1000),30),$add($muldiv(%ps_height%,335,1000),$sub($muldiv(%ps_height%,666,1000),32)),28,28,$get_ps_global(skin_path)\img\fulvol.png,$get_ps_global(skin_path)\img\fulvol_h.png,COMMAND:Playback/Volume/Set to -0 dB,,)
$imagebutton($add($add($muldiv(%ps_width%,221,1000),$muldiv(%ps_width%,559,1000),58),$muldiv(%ps_width%,7,1000)),$add($muldiv(%ps_height%,335,1000),$sub($muldiv(%ps_height%,666,1000),32)),28,28,$get_ps_global(skin_path)\img\voldown.png,$get_ps_global(skin_path)\img\voldown_h.png,COMMAND:Playback/Volume/Down,,)
$imagebutton($sub(%ps_width%,69),$add($muldiv(%ps_height%,335,1000),$sub($muldiv(%ps_height%,666,1000),32)),28,28,$get_ps_global(skin_path)\img\volup.png,$get_ps_global(skin_path)\img\volup_h.png,COMMAND:Playback/Volume/Up,,)

$imagebutton($add($add($add($add($sub($muldiv(%ps_width%,221,1000),38),$sub($muldiv(%ps_width%,221,1000),38)),$muldiv(%ps_width%,559,1000)),38),4),$muldiv(%ps_height%,8,1000),28,28,$get_ps_global(skin_path)\img\exit.png,$get_ps_global(skin_path)\img\exit_h.png,COMMAND:File/Exit,,)
$imagebutton($add($add($add($add($sub($muldiv(%ps_width%,221,1000),38),$sub($muldiv(%ps_width%,221,1000),38)),$muldiv(%ps_width%,559,1000)),38),4),34,28,28,$get_ps_global(skin_path)\img\restart.png,$get_ps_global(skin_path)\img\restart_h.png,COMMAND:File/Restart,,)
$imagebutton($add($add($add($add($sub($muldiv(%ps_width%,221,1000),38),$sub($muldiv(%ps_width%,221,1000),38)),$muldiv(%ps_width%,559,1000)),38),4),$sub(%ps_height%,34),28,28,$get_ps_global(skin_path)\img\pref.png,$get_ps_global(skin_path)\img\pref_h.png,COMMAND:File/Preferences,,)


$ifequal($get_ps_global(view),4,$showpanel_c(Lyrics,1),$showpanel_c(Lyrics,0))
$imagebutton($add($add($add($add($sub($muldiv(%ps_width%,221,1000),38),$sub($muldiv(%ps_width%,221,1000),38)),$muldiv(%ps_width%,559,1000)),38),4),$sub($sub(%ps_height%,34),28),28,28,$ifequal($get_ps_global(view),4,$get_ps_global(skin_path)\img\lyr_a.png,$get_ps_global(skin_path)\img\lyr.png),$ifequal($get_ps_global(view),4,$get_ps_global(skin_path)\img\lyr_a.png,$get_ps_global(skin_path)\img\lyr_h.png),SETGLOBAL:view:4;REFRESH,,)



$showpanel_c(Stack1,%show_top%)
$imagebutton(8,$sub(%ps_height%,34),28,28,$ifequal(%show_top%,1,$get_ps_global(skin_path)\img\tbcl.png,$get_ps_global(skin_path)\img\tbop.png),$ifequal(%show_top%,1,$get_ps_global(skin_path)\img\tbcl_h.png,$get_ps_global(skin_path)\img\tbop_h.png),SETGLOBAL:show_top:$ifequal(%show_top%,1,0,1);COMMAND:'View/Show status pane';COMMAND:'View/Show status pane'; REFRESH,,)
$showpanel_c(Stack2,%show_top%)
$imagebutton(8,$sub(%ps_height%,34),28,28,$ifequal(%show_top%,1,$get_ps_global(skin_path)\img\tbcl.png,$get_ps_global(skin_path)\img\tbop.png),$ifequal(%show_top%,1,$get_ps_global(skin_path)\img\tbcl_h.png,$get_ps_global(skin_path)\img\tbop_h.png),SETGLOBAL:show_top:$ifequal(%show_top%,1,0,1);COMMAND:'View/Show status pane';COMMAND:'View/Show status pane'; REFRESH,,)





Опять же, не традиционный способ, показ или не показ панелей определяют условия которые задаются кнопками. Не проще ли сразу повесить на кнопки команды "PANELSHOW", вместо "SETGLOBAL"?
macarych M
Гуру
Аватара
Репутация: 237
С нами: 8 лет 8 месяцев

Сообщение #12 Cerber » 26.07.2014, 00:47

macarych, нет, в этом всё нормально. Было в другом, но я уже разобрался. Оказывается, я использовал одну переменную %show_top% для показа разных панелей.

Добавлено спустя 49 минут 45 секунд:
macarych, наверное, не по теме будет назревший вопрос, но всё же.
Я прописал в скрипте команду, чтобы обложка и инфо-панель отображались только во время воспроизведения. Я разместил их на одной панели, которую назвал Playing и прописал в скрипте:
Код: Выделить всё
$ifequal(%isplaying%,1,$showpanel(Playing,1),$showpanel(Playing,0))
Всё работает как надо.
Потом решил изменить эту команду, чтобы вместе с этой панелью появлялась и исчезала ещё одна, на которой размещён прогресс бар. Добавил к той строчке команду
Код: Выделить всё
$ifequal(%isplaying%,1,$showpanel(Seekbar,1),$showpanel(Seekbar,0))
но ничего не изменилось. Первая панель ведёт себя как надо, а вторая остаётся видимой независимо от того, включено воспроизведение или нет.
Я пробовал объединить эти две команды в одну
Код: Выделить всё
$ifequal(%isplaying%,1,$and($showpanel(Playing,1)$showpanel(Seekbar,1)),$and($showpanel(Playing,0)$showpanel(Seekbar,0)))
— результат остался прежним.
Возможно ли отображать при воспроизведении и скрывать при остановке сразу две панели?
Сборка fooBardo by Cerber: http://foobar2000.ru/forum/viewtopic.php?t=5437
Cerber M
Новичок
Аватара
Возраст: 29
Репутация: 1
С нами: 3 года 2 месяца

Сообщение #13 macarych » 26.07.2014, 03:10

Cerber писал(а):Возможно ли отображать при воспроизведении и скрывать при остановке сразу две панели?

Можно и не только две.

Код: Выделить всё
$if(%isplaying%
    ,
    $showpanel_c(Playing,1)
    $showpanel_c(Seekbar,1)
    ,
    $showpanel_c(Playing,0)
    $showpanel_c(Seekbar,0)
)

а так будут скрываться и при паузе

Код: Выделить всё
$if(%isplaying%
    ,
    $if(%ispaused%
    ,
    $showpanel_c(Playing,0)
    $showpanel_c(Seekbar,0)
    ,
    $showpanel_c(Playing,1)
    $showpanel_c(Seekbar,1)
    )
    ,
    $showpanel_c(Playing,0)
    $showpanel_c(Seekbar,0)
)

macarych M
Гуру
Аватара
Репутация: 237
С нами: 8 лет 8 месяцев

Сообщение #14 Cerber » 26.07.2014, 07:53

Вот оно в чём дело... Всего-то-навсего в знаках препинания. Спасибо, macarych
Сборка fooBardo by Cerber: http://foobar2000.ru/forum/viewtopic.php?t=5437
Cerber M
Новичок
Аватара
Возраст: 29
Репутация: 1
С нами: 3 года 2 месяца

Сообщение #15 kgena_ua » 26.07.2014, 11:33

Cerber писал(а):когда панель активна (switch_1), изображение кнопки было другим, нежели при switch_0.
Самое простое. Добавить переменную:
var g_btn_img_a = gdi.Image(fb.ProfilePath + "images\\btn1_a.png");
с изображением активной кнопки.
А function on_paint(gr){} прописать так:
Код: Выделить всё
function on_paint(gr) {
    if (g_hover == 1) {
        if(fso.FileExists(path + "switch_1")) {
            gr.DrawImage(g_btn_img_a,0,0,ww, wh,0,0,152,19);
        }else{
            gr.DrawImage(g_btn_img1,0,0,ww, wh,0,0,152,19);
        }
    }
    else { 
        if(fso.FileExists(path + "switch_1")) {
            gr.DrawImage(g_btn_img_a,0,0,ww, wh,0,0,152,19);
        }else{
            gr.DrawImage(g_btn_img,0,0,ww, wh,0,0,152,19);
        }
    }
}
Можно еще добавить изображение кнопки : активная-нажатая.
I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Гуру
Аватара
Возраст: 53
Откуда: Украина, Днепр
Репутация: 331
С нами: 4 года 5 месяцев

Сообщение #16 Cerber » 27.07.2014, 01:06

kgena_ua, спасибо.
kgena_ua писал(а):Самое простое
Для меня пока не самое :smile:
Сборка fooBardo by Cerber: http://foobar2000.ru/forum/viewtopic.php?t=5437
Cerber M
Новичок
Аватара
Возраст: 29
Репутация: 1
С нами: 3 года 2 месяца

Сообщение #17 Cerber » 30.07.2014, 20:05

Такой вопрос. Подскажите, а то замучился. Можно ли средствами PSS или WSH сделать кнопку, при нажатии на которую всплывало бы меню с доступными плейлистами? И переключало на выбранный, собственно.
Сборка fooBardo by Cerber: http://foobar2000.ru/forum/viewtopic.php?t=5437
Cerber M
Новичок
Аватара
Возраст: 29
Репутация: 1
С нами: 3 года 2 месяца

Сообщение #18 macarych » 30.07.2014, 21:12

Cerber, на WSH - плевое дело, но тут я пас. kgena_ua в этом преуспел, думаю, он поможет.
macarych M
Гуру
Аватара
Репутация: 237
С нами: 8 лет 8 месяцев

Сообщение #19 kgena_ua » 31.07.2014, 09:21

Cerber писал(а):сделать кнопку, при нажатии на которую всплывало бы меню с доступными плейлистами
Маленький скрипт для всплывающего меню. Работать - вроде работает. Необходимость - под вопросом.
Высота меню зависит от кол-ва плейлистов. Это недостаток т.к. неизвестно как в меню организовать скроллинг в случае большого количества плейлистов.
Код: Выделить всё
function on_mouse_lbtn_up(x, y){
    var _menu = window.CreatePopupMenu();
    var ret;
   
    for(var i=0; i < plman.PlaylistCount; i++) {
        _menu.AppendMenuItem(0x00000000, i + 1, plman.GetPlaylistName(i));
    }

    ret = _menu.TrackPopupMenu(x, y);

    switch (true) {
        case(ret >= 1 && ret <plman.PlaylistCount):
            fb.PlayingPlaylist = ret - 1;
            fb.Play();
    }
    _menu.Dispose();
}
macarych, Вам спасибо, но есть форумчане, которые владеют WHS в совершенстве. Это Максим, alex_realist, LUR.
Сам пишу в основном методом тыка :smile: .
I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Гуру
Аватара
Возраст: 53
Откуда: Украина, Днепр
Репутация: 331
С нами: 4 года 5 месяцев

Сообщение #20 Cerber » 31.07.2014, 18:28

kgena_ua, спасибо, что откликнулись, но данный скрипт только проигрывает выбранные плейлисты, не переключая их. Как я понимаю, следует прописать функцию ShowNowPlaying(). Хотя в идеале лучше, чтобы работало только переключения, без автовоспроизведения.
Сборка fooBardo by Cerber: http://foobar2000.ru/forum/viewtopic.php?t=5437
Cerber M
Новичок
Аватара
Возраст: 29
Репутация: 1
С нами: 3 года 2 месяца

След.

Вернуться в Секреты foobar2000

Кто сейчас на форуме (по активности за 10 минут)

Сейчас этот раздел просматривают: 1 гость