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 особой нужды нет.
На сегодня все, хватит, а то на одного сгорбленного над компом дятла тут уже кое-кто косится давно :)