Код:
function RGB(r,g,b) { return (0xff000000|(r<<16)|(g<<8)|(b)); }
function RGBA(r, g, b, a) { return ((a << 24) | (r << 16) | (g << 8) | (b)); }
var font = gdi.Font("arial",12,1);
var font2 = gdi.Font("arial",10,0);
var ww = window.Width;
var wh = window.Height;
DT_CENTER = 0x00000001;
DT_RIGHT = 0x00000002;
DT_SINGLELINE = 0x00000020;
DT_VCENTER = 0x00000004;
var t_color = RGB(180,180,180);
var m_color = RGB(120,120,120);
var sel_color = RGB(250,250,250);
var sel_bg_color = RGB(100,100,100);
var t_row = 1, t_row1, t_row2, t_row3, t_height;
var string = "", search_query;
var tag_search = window.GetProperty("tag_search", 1);
var previous_pll = plman.ActivePlaylist;
var sort = "%album artist%|%date%|%album%|%discnumber%|%tracknumber%|%title%";
var on_mouse = false;
var ab, ab1, ab2;
var ab_I, ab_C, ab_F, ab_M;
var it, it1, it2, itM;
var line1 = false, line2 = false, line3 = false;
var lang = 1;
function on_paint(gr) {
gr.FillSolidRect (0, 0, ww, wh, RGB(30,30,30));
t_height = gr.CalcTextheight("abc", font) + 3;
t_row1 = t_row + t_height + 0;
t_row2 = t_row1 + t_height + 0;
t_row3 = t_row2 + t_height + 0;
ab_I = Array("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","<","...")
ab_F = Array("1","2","3","4","5","6","7","8","9","0","/","'","#",",","-",":"," ","<","...")
ab_C = Array("А","Б","В","Г","Д","Е","Ё","Ж","З","И","Й","К","Л","М","Н","О","П","Р","С","Т","У","Ф","Х","Ц","Ч","Ш","Щ","Ъ","Ы","Ь","Э","Ю","Я"," ","<","...")
ab_M = Array("all","artist","album","title","genre","date","rating");
if (lang == 1) ab_M = ab_M.concat("ая","09");
if (lang == 2) ab_M = ab_M.concat("az","09");
if (lang == 3) ab_M = ab_M.concat("az","ая");
itM = ab_M.length;
if (lang == 1) ab = ab_I;
if (lang == 2) ab = ab_C;
if (lang == 3) ab = ab_F;
it = ab.length;
it1 = Math.round(it/2);
it2 = it - it1;
ab1 = ab.splice(0,it1);
ab2 = ab.splice(0,it2);
if(on_mouse && line1) gr.FillSolidRect (x_col1, t_row1, ww / it1, t_height, sel_bg_color);
if(on_mouse && line2) gr.FillSolidRect (x_col2, t_row2, ww / it2, t_height, sel_bg_color);
if(on_mouse && line3) gr.FillSolidRect (x_col3, t_row3, ww / itM, t_height, sel_bg_color);
gr.GdiDrawText(string, font, search ? sel_color : t_color, 10, t_row, ww , t_height, DT_SINGLELINE | DT_VCENTER);
for (var i = 0; i < it1; i = i + 1) {
color = x_color > ww / it1 * i && x_color < ww / it1 * (i + 1) && on_mouse && line1 ? sel_color : t_color;
gr.GdiDrawText(ab1[i] == " " ? "_" : ab1[i], font, color, ww / it1 * i, t_row1, ww / it1 , t_height, DT_CENTER |DT_SINGLELINE | DT_VCENTER);
}
for (var i = 0; i < it2; i = i + 1) {
color = x_color > ww / it2 * i && x_color < ww / it2 * (i + 1) && on_mouse && line2 ? sel_color : t_color;
gr.GdiDrawText(ab2[i] == " " ? "_" : ab2[i], font, color, ww / it2 * i, t_row2, ww / it2 , t_height, DT_CENTER |DT_SINGLELINE | DT_VCENTER);
}
for (var i = 0; i < itM; i = i + 1) {
color = (x_color > ww / itM * i && x_color < ww / itM * (i + 1) && on_mouse && line3) || tag_search == i + 1 ? sel_color : m_color;
gr.GdiDrawText(ab_M[i], font2, color, ww / itM * i, t_row3, ww / itM , t_height, DT_CENTER |DT_SINGLELINE | DT_VCENTER);
}
// gr.GdiDrawText(line1 + " " + line2 + " " + line3, font2, RGB(200,200,200), 0, 5, ww - 10 , wh, DT_RIGHT);
}
var ch;
var x_col1, x_col2, x_col3;
var x_color;
function on_mouse_lbtn_up (x, y){
line1 = y >= t_row1 && y <= t_row1 + t_height ? true : false;
line2 = y >= t_row2 && y <= t_row2 + t_height ? true : false;
line3 = y >= t_row3 && y <= t_row3 + t_height ? true : false;
if (!line1 && !line2 && !line3) return; // ???
if (!search) previous_pll = plman.ActivePlaylist;
library_view_idx();
for (var i = 0; i < it1; i = i + 1) {
if (x > ww / it1 * i && x < ww / it1 * (i + 1) && line1) {ch = ab1[i]}
}
for (var i = 0; i < it2; i = i + 1) {
if (x > ww / it2 * i && x < ww / it2 * (i + 1) && line2) {ch = ab2[i]}
}
for (var i = 0; i < itM; i = i + 1) {
if (x > ww / itM * i && x < ww / itM * (i + 1) && line3) {
if (i < itM - 2) {
tag_search = i + 1; tag_search_change();return;
} else {
ch = ab_M[i] }
}
}
if (ch == "az") {ch = ""; lang = 1; return};
if (ch == "ая") {ch = ""; lang = 2; return};
if (ch == "09") {ch = ""; lang = 3; return};
if (ch == "<") {ch = ""; string = string.substring(0,string.length - 1)};
if (ch == "..."){ch = ""; string = ""};
string = string + ch;
string = string.charAt(0) == " " ? "" : string;
string = string.replace(" "," ");
if (string.length > 0 || search) pll_search();
}
var search = false;
var count;
function pll_search() {
remove_pll("search");
switch(tag_search) {
case 1:
search_query = "%artist% HAS " + string + " OR " + "%album% HAS " + string + " OR " + "%title% HAS " + string + " OR " + "%genre% HAS " + string + " OR " + "%date% HAS " + string;
break;
case 2:
search_query = "%artist% HAS " + string;
break;
case 3:
search_query = "%album% HAS " + string;
break;
case 4:
search_query = "%title% HAS " + string;
break;
case 5:
search_query = "%genre% HAS " + string;
break;
case 6:
search_query = "%date% HAS " + string;
break;
case 7:
search_query = "rating HAS " + string.charAt(0) + " OR " + "%rating% HAS " + string.charAt(0)
+ " OR " + "rating HAS " + string.charAt(1) + " OR " + "%rating% HAS " + string.charAt(1)
+ " OR " + "rating HAS " + string.charAt(2) + " OR " + "%rating% HAS " + string.charAt(2)
+ " OR " + "rating HAS " + string.charAt(3) + " OR " + "%rating% HAS " + string.charAt(3)
+ " OR " + "rating HAS " + string.charAt(4) + " OR " + "%rating% HAS " + string.charAt(4)
;
break;
}
idx = plman.PlaylistCount;
fb.CreateAutoPlaylist(idx, "search", search_query, sort, 0);
count = fb.PlaylistItemCount(idx)
if (count > 0) {
fb.ActivePlaylist = idx; search = true
} else {
// fb.ActivePlaylist = previous_pll; // ???
// fb.ActivePlaylist = 0; // ???
fb.ActivePlaylist = lib_v_idx; // ???
remove_pll("search");
search = false;
}
}
function remove_pll(pll_name){
search = false;
remove_idx = fb.PlaylistCount;
for (var i = 0; i < remove_idx; i++) {
if (fb.GetPlaylistName(i) == pll_name) {fb.RemovePlaylist(i)}
}
}
var lib_v_idx;
function library_view_idx(){
idx = fb.PlaylistCount;
for (var i = 0; i < idx; i++) {
if (fb.GetPlaylistName(i) == "Library view") {lib_v_idx = i}
}
}
function on_playback_starting(cmd, is_paused) {
string = "";
search = false;
if (fb.GetPlaylistName(fb.ActivePlaylist) != "search") {remove_pll("search");}
}
function on_mouse_move(x,y) {
window.SetCursor(32649);
on_mouse = true;
line1 = y >= t_row1 && y <= t_row1 + t_height ? true : false;
line2 = y >= t_row2 && y <= t_row2 + t_height ? true : false;
line3 = y >= t_row3 && y <= t_row3 + t_height ? true : false;
x_color = x;
for (var i = 0; i < it1; i = i + 1) {
if (x > ww / it1 * i) {x_col1 = ww / it1 * i}
}
for (var i = 0; i < it2; i = i + 1) {
if (x > ww / it2 * i) {x_col2 = ww / it2 * i}
}
for (var i = 0; i < itM; i = i + 1) {
if (x > ww / itM * i) {x_col3 = ww / itM * i}
}
window.Repaint();
}
function on_size(){
ww = window.Width;
wh = window.Height;
}
function on_mouse_leave() {
window.SetCursor(32512);
on_mouse = false;
window.Repaint();
}
function on_mouse_rbtn_up (x, y){
var _menu = window.CreatePopupMenu();
var i = 1;
_menu.AppendMenuItem(0x00000000, i++, "all");
_menu.AppendMenuItem(0x00000000, i++, "artist");
_menu.AppendMenuItem(0x00000000, i++, "album");
_menu.AppendMenuItem(0x00000000, i++, "title");
_menu.AppendMenuItem(0x00000000, i++, "genre");
_menu.AppendMenuItem(0x00000000, i++, "date");
_menu.AppendMenuItem(0x00000000, i++, "rating");
_menu.CheckMenuRadioItem(1, i, tag_search);
_menu.EnableMenuItem(tag_search, 1);
_menu.AppendMenuItem(0x00000800, 0, 0);
_menu.AppendMenuItem(0x00000000, 10, "Configure ...");
ret = _menu.TrackPopupMenu(x, y);
if (ret == 0) return;
switch (ret) {
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
tag_search = 7;
tag_search_change();
break;
case 10:
window.ShowConfigure();
break;
}
_menu.Dispose();
return true;
}
function tag_search_change(){
window.SetProperty("tag_search", tag_search);
if (string.length > 0) pll_search();
}
Есть что-то подобное для WSH Panel Mod (1.5.6) с поиском по тегам по текущему плейлисту?