Скрипты для foo_uie_wsh_panel_mod

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

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

Сообщение #561 kgena_ua » 12.12.2015, 12:08

Aum:условие: если по русски 0, то показать по англицки
Aum, думаю можно, только позже. Хочется с картинкой разобраться.
Вот новый скрипт (сырой). Пробую после выполнения запроса ждать ответа, по такому принципу и работает внешний скрипт download.vbs, который используют marc2000 и др. Только у меня иногда наблюдается некоторое подвисание. Гляньте,
Код: Выделить всё
// ==PREPROCESSOR==
// @name "Picrure. www.last.fm"
// @feature "v1.4"
// @feature "watch-metadb"
// ==/PREPROCESSOR==

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 a_font = gdi.Font("Arial",12,1);
var b_font = gdi.Font("Arial",12,0);
var ww,wh;

DT_LEFT = 0x00000000;
DT_RIGHT = 0x00000002;
DT_CENTER = 0x00000001;
DT_VCENTER = 0x00000004;
DT_SINGLELINE = 0x00000020;
DT_WORD_ELLIPSIS = 0x00040000;
DT_WORDBREAK = 0x00000010;
DT_CALCRECT = 0x00000400;
DT_NOPREFIX = 0x00000800;

var bgcolor = RGB(30,30,30);
var a_color = RGB(255,255,230);
var b_color = RGB(255,255,230);

var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
var doc = new ActiveXObject("htmlfile");
var fso = new ActiveXObject("Scripting.FileSystemObject");
var Stream = new ActiveXObject("ADODB.Stream");

var tmp_b_path = fb.ProfilePath + "\\tmp_Biography\\";   
if(!fso.FolderExists(tmp_b_path)) {fso.CreateFolder(tmp_b_path)};   

var artist, old_artis;   
var files = [], selected = 0;   

var col = 20;   
var row = 30;   

var limit = window.GetProperty("limit",5);   

var metadb;   
on_item_focus_change();   
var urls = [];
function on_paint(gr){   
   !window.IsTransparent && gr.FillSolidRect(0, 0, ww, wh, bgcolor);

    if(fso.FileExists(tmp_b_path + files[selected]) ) {
        g_img = gdi.Image(tmp_b_path + files[selected]); 

        var scale_w = (ww-20) / g_img.Width;
        var scale_h = (wh-60) / g_img.Height;
        var scale = Math.min(scale_w, scale_h);
        var pos_x = 0;
        var pos_y = 0;

        if (scale_w < scale_h) pos_y = (wh - g_img.Height * scale) / 2;
        else if (scale_w > scale_h) pos_x = (ww - g_img.Width * scale) / 2;
   
        g_img = g_img.CreateRawBitmap();
        //gr.GdiDrawBitmap(g_img, pos_x, pos_y, g_img.Width * scale, g_img.Height * scale, 0, 0, g_img.Width, g_img.Height);
        gr.GdiDrawBitmap(g_img, 10, 30, g_img.Width * scale, g_img.Height * scale, 0, 0, g_img.Width, g_img.Height);
       
        gr.FillSolidRect(0, 0, ww, 50, RGBA(10,10,10,100));
   
    }

    gr.GdiDrawText(artist, a_font, bgcolor, col + 1, 10 + 2, ww - col + 1, wh + 2, DT_LEFT | DT_WORD_ELLIPSIS );
    gr.GdiDrawText(artist, a_font, a_color, col, 10, ww - col, wh, DT_LEFT | DT_WORD_ELLIPSIS );

    gr.GdiDrawText(selected + 1 + " (" + files.length + ")", a_font, bgcolor, col + 1, 30 + 2, ww - col + 1, wh + 2, DT_LEFT | DT_WORD_ELLIPSIS );
    gr.GdiDrawText(selected + 1 + " (" + files.length + ")", a_font, a_color, col, 30, ww - col, wh, DT_LEFT | DT_WORD_ELLIPSIS );
}

function on_mouse_wheel(delta) {
    if (delta < 0) {selected = selected <= 0 ? files.length - 1 : selected -= 1}
    if (delta > 0) {selected = selected >= files.length - 1 ? 0 : selected += 1}
    window.Repaint();
    return;
}

function on_mouse_move(x, y) {
    on_mouse = true;
    window.SetCursor(32649);
    window.Repaint();
}

function on_mouse_leave() {
    on_mouse = false;
    window.SetCursor(32512);
    window.Repaint();
}

function on_size(){
    ww = window.Width;   
    wh = window.Height;   
}   

function on_item_focus_change() {   
   metadb = fb.IsPlaying ? fb.GetNowPlaying() : fb.GetFocusItem();
    if (metadb) on_metadb_changed();   
}   

function on_playlist_switch() {   
    on_item_focus_change();   
}   

function on_playback_new_track() {   
    on_item_focus_change();   
}   

function on_playback_dynamic_info_track() {
    on_item_focus_change();
}

function on_playback_stop() {
    on_item_focus_change();
}

function on_selection_changed(metadb) {
   on_item_focus_change(); 
}

function Eval(field) {
    if (metadb) {
        path = fb.Titleformat("%path%").EvalWithMetadb(metadb);
        return path.indexOf('://') > 0 ? fb.TitleFormat("[" + field + "]").Eval(true) : fb.TitleFormat("[" + field + "]").EvalWithMetadb(metadb);
    }
}

function on_metadb_changed() {
    artist = Eval("%artist%");
    if (artist != old_artis){
        try {
            fso.deleteFile(tmp_b_path + "*.jpg" );
        } catch(e) {};
        get();
        selected = 0;
        old_artis = artist;
    }
   
    window.Repaint();
}

function get(){      
    if (artist == "" || artist == 0) {return};      
          
    var url = ("http://www.last.fm/music/" + encodeURIComponent(artist) + "/+images");       
    xmlhttp.open("GET", url, true);      
    xmlhttp.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");      
    xmlhttp.send();      
    xmlhttp.onreadystatechange = function () {      
        if (xmlhttp.readyState == 4) {      
            if (xmlhttp.status == 200) {      
                doc.open();      
              var div = doc.createElement("div");
              div.innerHTML = xmlhttp.responsetext;
              var data = div.getElementsByTagName("img");
              var urls = [];
                for (i = 0; i < data.length; i++) {      
                 if (data[i].src.indexOf("http://img2-ak.lst.fm/i/u/60x60/") == 0) urls.push(data[i].src.replace("60x60", "ar0"));
                }   
             
              for (i = 0; i < Math.min(urls.length, limit); i++) {   
                   get_p(urls[i],i);         
                }         
              doc.close();   
               get_files_from_dir();         

            } else {         
                artist = ""         
            }         
          //  window.Repaint();         
        }         
    }         
}         

function get_p(url, i){    
    xmlhttp.open("GET", url, false);   
    xmlhttp.send();   
    // xmlhttp.onreadystatechange = function () {   
    if (xmlhttp.readyState == 4) {   
        if (xmlhttp.status == 200) {   
            //var Stream = new ActiveXObject("ADODB.Stream");
            Stream.Open;
            Stream.Type = 1;
            Stream.Write(xmlhttp.ResponseBody);
            Stream.Position = 0;
            try {   
                if (artist) Stream.SaveToFile(tmp_b_path + artist + "_" + i + ".jpg");
            } catch(e) {};   
            Stream.Close;
        }   
          //  }   
    }   
}   

function get_files_from_dir() {   
    files = [];   
    var e = new Enumerator( fso.GetFolder(tmp_b_path).Files );   
    while ( !e.atEnd() ) {   
        var name = e.item().Name;   
        name = name.toLowerCase(name);   
        files.push(name);   
        e.moveNext();
 window.Repaint();                
    }   
}

function on_mouse_rbtn_up (x, y){     
    var _menu = window.CreatePopupMenu();
    var i = 1;

    MF_ENABLED = 0x00000000;
    MF_GRAYED = 0x00000001;
   
    _menu.AppendMenuItem(MF_ENABLED, i++, "...");
    _menu.AppendMenuItem(MF_ENABLED, i++, "...");
   
    ShiftDown = utils.IsKeyPressed(0x10) ? true : false;
   
//    if (ShiftDown) {
        _menu.AppendMenuItem(0x00000800, 0, 0);
        _menu.AppendMenuItem(0x00000000, 10, "Reload");
        _menu.AppendMenuItem(0x00000800, 0, 0);
        _menu.AppendMenuItem(0x00000000, 20, "Properties");
        _menu.AppendMenuItem(0x00000000, 30, "Configure ...");
//    }

    ret = _menu.TrackPopupMenu(x,y);

    switch (ret) {
    case 1:
        break;
    case 2:
        break;
    case 10:
        window.Reload();
        break;
    case 20:   
        window.ShowProperties();   
        break;       
    case 30:   
        window.ShowConfigure();   
        break;   
   }
    _menu.Dispose();   
    return true;   
}   
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет

Сообщение #562 MC Web » 12.12.2015, 13:26

kgena_ua, у меня с Reload та же картина (ошибка) - но это не так важно, по сравнению с первым вариантом скрипта картинки грузятся.
Предложение, можно добавить загрузку No Cover, выбранного в настройках foobar2000, при отсутствии обложек?
Не всегда есть обложки, особенно при прослушивании WEB радиостанции и остается пустое поле. Это и в скрипте от marc2003 мне не нравится, в отличии от foo_uie_biography.
Может данный вариант и с этим поможет
kgena_ua:Пробую после выполнения запроса ждать ответа
MC Web
Репутация: 248
С нами: 10 лет 8 месяцев

Сообщение #563 kgena_ua » 12.12.2015, 14:17

MC Web, спасибо за тестирование.
По Reload.
Объект не поддерживает это свойство или метод
может это связано с версией панели WSH, т к. поддержка window.Reload() появилась с v1.5.7.1.
По No Cover, обязательно нужно будет сделать.
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет

Сообщение #564 MC Web » 12.12.2015, 14:58

kgena_ua:может это связано с версией панели WSH, т к. поддержка window.Reload() появилась с v1.5.7.1.
возможно, но я поставил жирный крест на всех версиях после 1.5.6.

Помимо добавления новых функций, там удалялись и старые, что ОТРИЦАТЕЛЬНО сказалось на совместимости со старыми версиями скриптов.

marc2003 это тоже понял, поэтому и создал JScript Panel, и все скрипты с новыми функциями пишет для неё, а старые работают с WSH Panel Mod.

Может то же так поступить. Я, например, обновлять WSH Panel Mod v.1.5.6 на более новые "самопальные" точно не буду...

P.S. Сейчас проверил скрипт на JScript Panel v.1.0.1 - без ошибок.
MC Web
Репутация: 248
С нами: 10 лет 8 месяцев

Сообщение #565 kgena_ua » 12.12.2015, 15:11

MC Web:сказалось на совместимости со старыми версиями скриптов
Со "старыми" скриптами где есть таймеры, начиная с v1.5.7.
Сам сижу на v1.5.10, т.к. в более новых версиях WSH и JScript Panel убрана поддержка XP.
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет

Сообщение #566 MC Web » 12.12.2015, 15:33

У меня на v.1.5.8 и выше в скриптах DarkOne появляются ошибки.
Версии 1.5.7 нет, да уже и проверять на ней не хочется.
Останусь на 1.5.6...
MC Web
Репутация: 248
С нами: 10 лет 8 месяцев

Сообщение #567 AHAPXICT » 12.12.2015, 16:15

Здарова всем :beer: Чего нового на форуме? MC Web, у меня тоже v1.5.10, для DarkOne v 3.1 нужно только пару строк заменить и всё будет нормально.
AHAPXICT M
Аватара
Откуда: Киев
Репутация: 252
С нами: 10 лет 5 месяцев

Сообщение #568 kgena_ua » 12.12.2015, 16:21

AHAPXICT, Нууууу....... с возвращением :beer:
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет

Сообщение #569 AHAPXICT » 12.12.2015, 16:32

Я за последние месяцы понял что такое библиотека :smile: Перечитал тонну книг и вспомнил что такое CD. Книги и "компакты" по всей комнате, передавил кучу коробок или побил. Теперь всё, диски в ящик - книги на полку))))
AHAPXICT M
Аватара
Откуда: Киев
Репутация: 252
С нами: 10 лет 5 месяцев

Сообщение #570 MC Web » 14.12.2015, 16:10

kgena_ua, заметил "глюк" в скрипте Biography Text last.fm у себя в панели DarkOne:

- при наличии текста биографии и разворачивания/сворачивания из оконного режима в полно-экранный или наоборот, происходит зависание проигрывателя, в остальном работает нормально
- удаляю этот скрипт (пустая панель WSH) разворачивание/сворачивание происходит нормально
- проверял в DUI, там вроде не глючит

В чем причина, не пойму...
MC Web
Репутация: 248
С нами: 10 лет 8 месяцев

Сообщение #571 kgena_ua » 14.12.2015, 17:33

MC Web, было зависание, когда хаотически изменял размеры (уменьшал ширину) панели с биографией, если значение ww панели было меньше величины col.
Необходимо в
function get_b_text_array() {
заменить строку

strings_array = temp_gr.EstimateLineWrap(text, b_font, ..........

на строки

string_width = ww - col - r_margin < 0 ? 0 : ww - col - r_margin;
strings_array = temp_gr.EstimateLineWrap(text, b_font, string_width).toArray();
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет

Сообщение #572 MC Web » 14.12.2015, 19:25

kgena_ua, СПАСИБО, сейчас тестирую, пока нормально.

Еще вопрос: перед этими двумя строками стоит добавлять if(text)?

Проверил и с ней и без нее вроде работает.
MC Web
Репутация: 248
С нами: 10 лет 8 месяцев

Сообщение #573 Aum » 14.12.2015, 22:04

У меня тоже старый скрипт био периодически виснет при режиме "следовать за курсором". В новом тоже, при остановленном воспроизведении - после выбора 10 го трека - ругается:
Код: Выделить всё
Error: JScript Panel (Biography Text. www.last.fm): Ошибка выполнения Microsoft JScript:
Недопустимый вызов или аргумент процедуры
File: <main>
Line: 184, Col: 5
<source text only available at compile time>
Может конечно компонент JScript Panel виноват. Нет. Проверил в обоих компонентах. В wsh тоже появляется эта ошибка после 10 трека (хоть при стопе, хоть при воспроизведении).
Aum M
Аватара
Репутация: 21
С нами: 14 лет 1 месяц

Сообщение #574 kgena_ua » 15.12.2015, 13:54

MC Web:Проверил и с ней и без нее вроде работает
Да, MC Web, еще надо чистить от всяких лишних проверок.
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет

Сообщение #575 Aum » 24.12.2015, 10:21

Помогите разобраться!!
Есть функции для цвета:
Код: Выделить всё
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));
}
function toRGB(d){ // convert back to RGB values
   var d = d - 0xff000000;
   var r = d >> 16;
   var g = d >> 8 & 0xFF;
   var b = d & 0xFF;
   return [r,g,b];
};

function blendColors(c1, c2, factor) {
   // When factor is 0, result is 100% color1, when factor is 1, result is 100% color2.
   var c1 = toRGB(c1);
   var c2 = toRGB(c2);
   var r = Math.round(c1[0] + factor * (c2[0] - c1[0]));
   var g = Math.round(c1[1] + factor * (c2[1] - c1[1]));
   var b = Math.round(c1[2] + factor * (c2[2] - c1[2]));
   return (0xff000000 | (r << 16) | (g << 8) | (b));
};

Хотелось бы выяснить результат смешения двух цветов - вывожу в консоль: fb.trace ("Color" + blendColors(RGB(100,100,100), RGB(0,0,0),0.2));
получаю ответ Color-11513776. Дак вот, что это за цифры, не могу разобраться где здесь значения rgb!!??

Или вот как расшифровать текущий цвет из CUI:
взять код стандартного наполнения новой wsh панели
Код: Выделить всё
function get_colors() {
    if (g_is_default_ui) { // DUI
        g_textcolor = window.GetColorDUI(ColorTypeDUI.text);
        g_textcolor_hl = window.GetColorDUI(ColorTypeDUI.highlight);
        g_backcolor = window.GetColorDUI(ColorTypeDUI.background);
    } else { // CUI
        g_textcolor = window.GetColorCUI(ColorTypeCUI.text);
        g_textcolor_hl = window.GetColorCUI(ColorTypeCUI.text);
        g_backcolor = window.GetColorCUI(ColorTypeCUI.background);
    }
}
и вывести в консоль цвет, допустим
Код: Выделить всё
fb.trace ("g_backcolor" + g_backcolor);
результата снова мне не понятен: g_backcolor-13949668, где здесь RGB значения?
Aum M
Аватара
Репутация: 21
С нами: 14 лет 1 месяц

Сообщение #576 kgena_ua » 24.12.2015, 15:45

Aum, для получения отдельно R, G и B нужно:
Код: Выделить всё
function getRed(color) { return ((color >> 16) & 0xff);}
function getGreen(color) { return ((color >> 8) & 0xff);}
function getBlue(color) { return (color & 0xff);}
и для первого примера, для
var color = blendColors(RGB(250,250,250), RGB(0,0,0),0.2);
R, G и B будут:
Код: Выделить всё
fb.trace ("R " + getRed(color));
fb.trace ("G " + getGreen(color));
fb.trace ("B " + getBlue(color));
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет

Сообщение #577 Aum » 28.12.2015, 17:05

kgena_ua, большое спасибо, с цветами разобрался, ответ был рядом))

Еще вопрос по вашему скрипту Track info, кстати спасибо - скрипт отличный и должен быть легкий, но есть непонятки:
1. При наведении и движении мышки - грузит сильно проц, почему (даже при отключенных всплывающих подсказках) - вычисление размера так влияет, не могу дотумкать?
2. При включении всплывающих подсказок, они сильно часто мерцают, есть ли такой эффект у вас? (как то было похожее когда скрипт громкости ваял - у себя решил мерцание удалением лишних w.repaint). Тут не могу понять в чем причина. Кто его часто мигать заставляет?

Код: Выделить всё
// ==PREPROCESSOR==
// @name "properties & create file"
// @author "kgena_ua"
// @feature "v1.4"
// @feature "watch-metadb"
// ==/PREPROCESSOR==

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("Areal",12,0);
var group_font = gdi.Font("Tahoma",9,0);
var g_fontR = gdi.Font("Areal",10,0);

DT_LEFT = 0x00000000;
DT_CENTER = 0x00000001;
DT_VCENTER = 0x00000004;
DT_RIGHT = 0x00000002;
DT_WORD_ELLIPSIS = 0x00040000;
DT_SINGLELINE = 0x00000020;
var ww, wh;

var bgcolor = RGB(20,20,20);
var color1 = RGB(180,180,180);
var color2 = RGB(255,255,200);
var color3 = RGB(100,100,100);

var Tooltip = window.CreateTooltip();
Tooltip.SetMaxWidth(300);
var tstring = 0;
window.GetProperty("Tooltip", 0);

var name, value, measure, t_height;
var path = "";
var g_drag = false;
var g_drag_y = 0;
var s = 0;
var col1 = 10;
var col2 = 110;
var col3;
var pos_y;
var pos_x;
var wh_old = wh

function on_paint(gr) {
   !window.IsTransparent && gr.FillSolidRect(0, 0, ww, wh, bgcolor);

    show_array2(gr);
}

function on_mouse_lbtn_down(x, y) {
    g_drag = true;
    g_drag_y = (y - s);
}

function on_mouse_lbtn_up(x, y) {
    g_drag = false;
}

function on_mouse_move(x, y) {
    window.SetCursor(32649);
    pos_y = y;
    pos_x = x;
   
    tstring = Math.floor((y + Math.abs(s)) / t_height);

    if (value_width[tstring * 2] > ww - col2 - col1 && pos_x > col2 && window.GetProperty("Tooltip") == 1){
        Tooltip.Text = value_width[tstring * 2 + 1];
        delay();
        delay_flag && Tooltip.Activate();
    } else {
        delay_flag = false;
        Tooltip.Deactivate();
    }
   
    if (g_drag) {
        if (s <= 0 && (name_array.length * t_height) >= wh) {s = y - g_drag_y};
        applyDelta();
    }
   
    if (s == 0 || s == wh - name_array.length * t_height) g_drag_y = (y - s);
    window.Repaint();
}

function on_mouse_wheel(step) {
    if (s <= 0 && name_array.length * t_height >= wh) {s = s + step * t_height};
    applyDelta();
}

function applyDelta() {
    s = s > 0 ? 0 : s;
    s = s < (wh - name_array.length * t_height) && s < 0 ? (wh - name_array.length * t_height) : s;
    window.Repaint();
}

function on_mouse_leave() {   
    window.SetCursor(32512);
    window.Repaint();
}

function on_size() {
    ww = window.Width;
    wh = window.Height;
    if (wh != wh_old  && s < 0) {
        s = wh >= wh_old ? s + 1 : s;
        wh_old = wh;
    }
}

var tfname = new Array(
"$meta(artist)",
"%title%",
"%album%",
"%date%",
"%genre%",
"%composer%",
"%performer%",
"%publisher%",
"$meta(album artist%)",
"%track number%",
"%totaltracks%",
"%discnumber%",
"%totaldiscs%",
"%comment%",
"%rating%",
"$meta(rating)",
"line",
"group G E N E R A L",
"$info(samplerate)",
"$info(channels)",
"$info(bitspersample)",
"$info(bitrate)",
"%codec%",
"$info(codec_profile)",
"$info(encoding)",
"%length%",
"$info(tool)",
"$info(cue_embedded)",
"line",
"group L O C A T I O N",
"%filename_ext%",
"$directory_path(%path%)",
"%subsong%",
"%filesize_natural%",
"%last_modified%",
"%folder name%",
"line",
"group P L A Y B A C K   S T A T I S T I C S",
"%play_count%",
"%first_played%",
"%last_played%",
"%added%",
"line",
"group L A S T F M",
"%lastfm_bio%",
"%lastfm_similar_artist%",
"%lastfm_artist_playcount%",
"%lastfm_artist_listeners%",
"%lastfm_album_playcount%",
"%lastfm_album_listeners%",
"%lastfm_album_content%"
);

var tfname_length = tfname.length;

var delay_flag = false;
var timer;
function delay() {
    timer = window.SetTimeout(function() {
        delay_flag = true;
        window.ClearTimeout(timer);
    }, 1000);
}

var name_array = [];
var value_array = [];
var value_width = [];
var max_width;

function create_array() {
    var temp_bmp = gdi.CreateImage(1, 1);
    var temp_gr = temp_bmp.GetGraphics();
    name_array = [];
    value_array = [];
    value_width = [];
    for (j = 0; j < tfname_length; j++) {
        group = false;
        LM = false;

        if (tfname[j].search('group') >= 0 || tfname[j] == "line" ) group = true;

        value = Eval(tfname[j]);

        if (value != 0 || group) {
            name_array.push(tfname[j]);
            value_array.push(value);
            value_width.push(temp_gr.CalcTextWidth(value, font),value);
        }
    }

    temp_bmp.ReleaseGraphics(temp_gr);
    temp_bmp.Dispose();
    temp_gr = null;
    temp_bmp = null;
}

function show_array2(gr) {
    t_height = gr.CalcTextHeight("text", font) + 2;
    for (var i = 0; i < name_array.length; i++) {
        line = false;
        group = false;
       
        if (name_array[i].search('line') >= 0) line = true;
        if (name_array[i].search('group') >= 0) group = true;
       
        row =  i * t_height + s;
       
        line_row = row + t_height / 2;
        line && gr.DrawLine(col1, line_row, ww - col1, line_row, 1, color3);
       
        name = name_array[i].replace(/[%\$\(\)]|info|meta|group |line|lastfm/g,'').replace(/_/g,' ').replace('directory pathpath','directory path');
       
        var rating_name = name_array[i] == "$meta(rating)" ? "  (tag)" : "";
        gr.GdiDrawText(name + rating_name, group ? group_font : font, group ? color3 : color1, col1, row, ww - col1 * 2, t_height, DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_WORD_ELLIPSIS);       
   
        if (name_array[i] == "%rating%" || name_array[i] == "$meta(rating)") {
            for (var r = 0; r < value_array[i]; r++){
                 Draw_star(gr, col2 + star_r + star_r * 2.5 * r, row + star_r * 2, color2)
             }
        } else {
            gr.GdiDrawText(value_array[i], font, color2, col2, row, ww - col2 - col1, t_height, DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_WORD_ELLIPSIS);       
        }
    }
}

var metadb;
on_item_focus_change();

function on_item_focus_change() {
   metadb = fb.IsPlaying ? fb.GetNowPlaying() : fb.GetFocusItem();
    if (metadb) on_metadb_changed();
}

function on_playlist_switch() {
    on_item_focus_change();
}

function on_playback_new_track() {
    on_item_focus_change();
}

function on_playback_stop() {
    on_item_focus_change();
}

function on_metadb_changed() {
    create_array();
    window.Repaint();
}

function Eval(field) {
    if (metadb) {
        path = fb.Titleformat("%path%").EvalWithMetadb(metadb);
        return path.indexOf('://') > 0 ? fb.TitleFormat("[" + field + "]").Eval(true) : fb.TitleFormat("[" + field + "]").EvalWithMetadb(metadb);
    }
}

function on_mouse_rbtn_up (x, y){     
    var _menu = window.CreatePopupMenu();
    var i = 1;

    MF_ENABLED = 0x00000000;
    MF_GRAYED = 0x00000001;
   
    _menu.AppendMenuItem(MF_ENABLED, i++, "Tooltip");
    _menu.CheckMenuItem(1, window.GetProperty("Tooltip"));

    _menu.AppendMenuItem(MF_ENABLED, i++, "Create txt/xls file");
   
    ShiftDown = utils.IsKeyPressed(0x10) ? true : false;
   
//    if (ShiftDown) {
        _menu.AppendMenuItem(0x00000800, 0, 0);
        _menu.AppendMenuItem(0x00000000, 10, "Reload");
        _menu.AppendMenuItem(0x00000800, 0, 0);
        _menu.AppendMenuItem(0x00000000, 20, "Properties");
        _menu.AppendMenuItem(0x00000000, 30, "Configure ...");
//    }

    ret = _menu.TrackPopupMenu(x,y);

    switch (ret) {
    case 1:   
        window.GetProperty("Tooltip") == 0 ? window.SetProperty("Tooltip",1) : window.SetProperty("Tooltip",0);
        break;
    case 2:
        menu_create_file(x,y);
        break;
    case 10:
        window.Reload();
        break;
    case 20:
        window.ShowProperties();
        break;   
    case 30:
        window.ShowConfigure();     
        break;
   }
    _menu.Dispose();
    return true;
}


/////////////////////////////  Create txt/xls file


var fso = new ActiveXObject("Scripting.FileSystemObject");
if(!fso.FolderExists( fb.ProfilePath + "output")) {fso.CreateFolder( fb.ProfilePath + "output" )};
var output_path = fb.ProfilePath + "\\output\\";

var tag = [];
create_tag_array();

function  create_tag_array() {
    for (var j = 0; j < tfname.length; j++) {   
        if (tfname[j].indexOf('line') < 0  && tfname[j].indexOf('group') < 0){
        tag.push(tfname[j])};
    }
}

var outtag = [];
var separator = Array(" ; ","\t"); 

for (var j = 0; j < tag.length; j++) {   
    window.GetProperty(j + 1,0);
}

window.GetProperty("ext",0);
window.GetProperty("skip",0);
var selected;
var shift = 0;;

function  create_output_array() {
    outtag = [];
    for (var j = 0; j < tag.length; j++) {   
        selected = window.GetProperty(j + 1);
        if ( selected == 1 ) {outtag.push(tag[j])};
    }
    createTextFile();
}

function createTextFile(){
    if (fb.GetSelections().Count == 0 || outtag.length ==0) return;

    plist_name = plman.GetPlaylistName(plman.ActivePlaylist);
    plist_name = plist_name.replace(/[\/\:\*\?\"\<\>\|]/g,'')

    if (window.GetProperty("ext") == 0) {
        output_file = output_path + "plist " + plist_name + ".txt";
    } else {
        output_file = output_path + "plist " + plist_name + ".xls"; 
    }
   
    try { file = fso.CreateTextFile( output_file )
    } catch(e) {
        if (e.number == -2146828218) return; // permission denied
    }
   
    if ( window.GetProperty("skip") == 0) {
        text = [];
        string = "";
        for (var j = 0; j < outtag.length; j++) {
            text.push(outtag[j]);       
        }
        string = text.join(separator[window.GetProperty("ext")]);
        file.WriteLine(string);
        file.WriteLine("");
    }

    for (var i = 0; i < fb.GetSelections().Count; i++) {
        item = fb.GetSelections().Item(i);
        text = [];
        string = "";
        for (var j = 0; j < outtag.length; j++) {   
            select = fb.TitleFormat("[" + outtag[j] + "]").EvalWithMetadb(item);
            var measure = "";
            if (select != "" ) {
                if (outtag[j] == "$info(bitrate)") measure = " kbps";
                if (outtag[j] == "$info(samplerate)") measure = " Hz";
                if (outtag[j] == "$info(bitspersample)") measure = " bps";
                if (outtag[j] == "$info(channels)") measure = " ch";
            }
            if (select != "" || window.GetProperty("skip") == 0) {
                text.push(select + measure);
            }
            string = text.join(separator[window.GetProperty("ext")]);
        }
        try { file.WriteLine(string)
        } catch(e) { 
            if (e.number == -2146828283) file.WriteLine(":ERROR");
        }
    }
    file.Close();
}

function menu_create_file(x,y){     
    var _menu = window.CreatePopupMenu();
    var i = 1;

    MF_ENABLED = 0x00000000;
    MF_GRAYED = 0x00000001;
   
    MF = fb.GetSelections().Count == 0 ? MF_GRAYED : MF_ENABLED;
  //  t = window.GetProperty("ext") == 0 ? "*.txt" : "*.xls";
   
    _menu.AppendMenuItem(MF, i++, "create  " + (window.GetProperty("ext") == 0 ? "*.txt" : "*.xls") + " file");
    _menu.AppendMenuItem(0x00000800, 0, 0);
   
    var lines = 20;   
    tl = 0 + shift;
    bl = tag.length > lines ? lines + shift : tag.length;

    for (var j = tl; j < bl; j++) {
        menuItem = tag[j].replace(/[%\$\(\)]|info|meta/g,'').replace(/_/g,' ');
        _menu.AppendMenuItem(MF_ENABLED, i++, menuItem);   
        _menu.CheckMenuItem(i-1, window.GetProperty(i - 2 + shift));
    }
   
    _menu.AppendMenuItem(0x00000800, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 100, "txt");
    _menu.AppendMenuItem(MF_ENABLED, 101, "xls");
    _menu.CheckMenuRadioItem(100, 101, 100 + window.GetProperty("ext"));     
   _menu.EnableMenuItem(100 + window.GetProperty("ext"), 1);
   
    _menu.AppendMenuItem(0x00000800, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 110, "skip if empty");
    _menu.CheckMenuItem(110, window.GetProperty("skip"));
   
    _menu.AppendMenuItem(0x00000800, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 120, "clear all");

    if (tag.length > lines) {
        _menu.AppendMenuItem(0x00000800, 0, 0);
        _menu.AppendMenuItem(shift == 0 ? MF_GRAYED : MF_ENABLED, 130, "up");
        _menu.AppendMenuItem(shift + lines >= tag.length ? MF_GRAYED : MF_ENABLED, 140, "down");
    }

    ret = _menu.TrackPopupMenu(x,y);

    switch (true) {
    case (ret == 1):
        create_output_array();
        break;
    case (ret >= 2 && ret <= tag.length + 1):
        selected = window.GetProperty(ret - 1 + shift);
        window.SetProperty(ret - 1 + shift, selected == 0 ? 1 : 0);
        menu_create_file(x,y);
        break;
    case (ret == 100):
        window.SetProperty("ext", 0);
        menu_create_file(x,y);
        break;
    case (ret == 101):
        window.SetProperty("ext", 1);
        menu_create_file(x,y);
        break;
    case (ret == 110):
        window.SetProperty("skip", window.GetProperty("skip") == 0 ? 1 : 0);
        menu_create_file(x,y);
        break;
    case (ret == 120):
        for (var j = 1; j < tag.length + 1; j++) {   
            window.SetProperty(j, 0);
        }
        menu_create_file(x,y);
        break;
    case (ret == 130):
        shift = shift - 1;
        menu_create_file(x,y);
        break;
    case (ret == 140):
        shift = shift + 1;
        menu_create_file(x,y);
        break;
   }
   _menu.Dispose();
}

var star_r = 5;

function Draw_star(gr,x,y,color){
    var x_points_1 = [], y_points_1 = [];
    var x_points_2 = [], y_points_2 = [];
   
    gr.SetSmoothingMode(4);

    for (var j = star_r; j > 0; j--) { 
        for (var i = 0; i < 5; i++) {
            x_points_1.push(x + (j * Math.cos(Math.PI * i / 5 * 2 - Math.PI / 2)));
            y_points_1.push(y + (j * Math.sin(Math.PI * i / 5 * 2 - Math.PI / 2)));
        }
   
        for (var i = 1; i < 10; i = i + 2) {
            x_points_2.push(x + (j / 2.61803 * Math.cos(Math.PI * i / 10 * 2 - Math.PI / 2)));
            y_points_2.push(y + (j / 2.61803 * Math.sin(Math.PI * i / 10 * 2 - Math.PI / 2)));
        }
    }

    for (var j = 0; j < star_r * 5 - 5; j = j + 5) { 
        gr.DrawLine(x_points_1[0+j], y_points_1[0+j], x_points_2[0+j], y_points_2[0+j], 1, color);
        gr.DrawLine(x_points_1[0+j], y_points_1[0+j], x_points_2[4+j], y_points_2[4+j], 1, color);
        gr.DrawLine(x_points_1[1+j], y_points_1[1+j], x_points_2[0+j], y_points_2[0+j], 1, color);
        gr.DrawLine(x_points_1[1+j], y_points_1[1+j], x_points_2[1+j], y_points_2[1+j], 1, color);
        gr.DrawLine(x_points_1[2+j], y_points_1[2+j], x_points_2[1+j], y_points_2[1+j], 1, color);
        gr.DrawLine(x_points_1[2+j], y_points_1[2+j], x_points_2[2+j], y_points_2[2+j], 1, color);
        gr.DrawLine(x_points_1[3+j], y_points_1[3+j], x_points_2[2+j], y_points_2[2+j], 1, color);
        gr.DrawLine(x_points_1[3+j], y_points_1[3+j], x_points_2[3+j], y_points_2[3+j], 1, color);
        gr.DrawLine(x_points_1[4+j], y_points_1[4+j], x_points_2[3+j], y_points_2[3+j], 1, color);
        gr.DrawLine(x_points_1[4+j], y_points_1[4+j], x_points_2[4+j], y_points_2[4+j], 1, color);
    }
}

И хотел поинтересоваться для чего таймер, включать по таймеру тултип?
Aum M
Аватара
Репутация: 21
С нами: 14 лет 1 месяц

Сообщение #578 kgena_ua » 29.12.2015, 17:40

Aum, по мерцанию была такая проблема на 7-е, на XP - все нормально. Я где-то вычитал, что на 7 могут быть подобные глюки. Я эту проблему вроде решил, во всяком случае такое больше не наблюдается. Посмотрите. Выложу скрипт завтра, т.к. дома не работает интернет.
А таймер - это задержка включения подсказки. Т.е. чтоб подсказка не включалась, когда просто проводишь мышкой по строкам вверх и вниз, а включалась только тогда, когда "задерживаешся" на строке какое-то время.
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет

Сообщение #579 kgena_ua » 31.12.2015, 12:26

Aum, последний скрипт properties & create file.
Небольшие изменения.
Проверьте на предмет "мерцания".
Код: Выделить всё
// ==PREPROCESSOR==
// @name "properties & create file"
// @author "kgena_ua"
// @feature "v1.4"
// @feature "watch-metadb"
// ==/PREPROCESSOR==

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("Areal",12,0);
var group_font = gdi.Font("Tahoma",9,0);

DT_LEFT = 0x00000000;
DT_CENTER = 0x00000001;
DT_VCENTER = 0x00000004;
DT_RIGHT = 0x00000002;
DT_WORD_ELLIPSIS = 0x00040000;
DT_SINGLELINE = 0x00000020;
var ww, wh;

var bgcolor = RGB(20,20,20);
var color1 = RGB(180,180,180);
var color2 = RGB(255,255,200);
var color3 = RGB(100,100,100);

var tooltip = window.CreateTooltip();
tooltip.SetMaxWidth(300);
var tstring = 0;
var delay_flag = false;
var timer;
window.GetProperty("Tooltip", 0);
//tooltip.SetDelayTime(3, 0);   

       
var name, value, measure, t_height;
var path = "";
var g_drag = false;
var g_drag_y = 0;
var s = 0;
var col1 = 10;
var col2 = 110;
var col3;
var pos_y, pos_x;
var old_x, old_y;
var wh_old;
var star_size = 12, offset = star_size + 2;

var tfname = new Array(
"$meta(artist)",
"%title%",
"%album%",
"%date%",
"%genre%",
"%composer%",
"%performer%",
"%publisher%",
"$meta(album artist%)",
"%track number%",
"%totaltracks%",
"%discnumber%",
"%totaldiscs%",
"%comment%",
"%rating%",
"$meta(rating)",
"line",
"group G E N E R A L",
"$info(samplerate)",
"$info(channels)",
"$info(bitspersample)",
"$info(bitrate)",
"%codec%",
"$info(codec_profile)",
"$info(encoding)",
"%length%",
"$info(tool)",
"$info(cue_embedded)",
"line",
"group L O C A T I O N",
"%filename_ext%",
"$directory_path(%path%)",
"%subsong%",
"%filesize_natural%",
"%last_modified%",
"%folder name%",
"line",
"group P L A Y B A C K   S T A T I S T I C S",
"%play_count%",
"%first_played%",
"%last_played%",
"%added%",
"line",
"group L A S T F M",
"%lastfm_bio%",
"%lastfm_similar_artist%",
"%lastfm_artist_playcount%",
"%lastfm_artist_listeners%",
"%lastfm_album_playcount%",
"%lastfm_album_listeners%",
"%lastfm_album_content%"
);

var tfname_length = tfname.length;

function on_paint(gr) {
   !window.IsTransparent && gr.FillSolidRect(0, 0, ww, wh, bgcolor);
    show_array(gr);

    gr.GdiDrawText("", font, color2, 0, 120, ww, wh, DT_RIGHT | DT_WORD_ELLIPSIS);
}

function on_mouse_lbtn_down(x, y) {
    g_drag = true;
    g_drag_y = (y - s);
}

function on_mouse_lbtn_up(x, y) {
    g_drag = false;
}

function TooltipActivate() { 
    tstring = Math.floor((pos_y + Math.abs(s)) / t_height);
    if (value_width[tstring * 2] > ww - col2 - col1 && pos_x > col2 && window.GetProperty("Tooltip") == 1){
        tooltip.Text = value_width[tstring * 2 + 1];
        delay();
        delay_flag && tooltip.Activate();
    } else {
        delay_flag = false;
        tooltip.Deactivate();
    }
}

function delay() {
    delay_flag && window.ClearTimeout(timer);
    timer = window.SetTimeout(function() {
        delay_flag = true;
        window.ClearTimeout(timer);
    }, 1000);
}


function on_mouse_move(x, y) {
    window.SetCursor(32649);
    pos_y = y;
    pos_x = x;

    if (old_y != y || old_x != x){
        TooltipActivate();
        old_y = y;
        old_x = x;
    }
   
    if (g_drag) {
        if (s <= 0 && (name_array.length * t_height) >= wh) {s = y - g_drag_y};
        applyDelta();
    }
   
    if (s == 0 || s == wh - name_array.length * t_height) g_drag_y = (y - s);
    window.Repaint();
}

function on_mouse_wheel(step) {
    if (s <= 0 && name_array.length * t_height >= wh) {s = s + step * t_height};
    applyDelta();
}

function applyDelta() {
    s = s > 0 ? 0 : s;
    s = s < (wh - name_array.length * t_height) && s < 0 ? (wh - name_array.length * t_height) : s;
    window.Repaint();
}

function on_mouse_leave() {   
    window.SetCursor(32512);
    window.Repaint();
}

function on_size() {
    ww = window.Width;
    wh = window.Height;
    if (wh != wh_old  && s < 0) {
        s = wh >= wh_old ? 0 : s;
        wh_old = wh;
    }
}

var name_array = [];
var value_array = [];
var value_width = [];
var max_width;

function create_array() {
    var temp_bmp = gdi.CreateImage(1, 1);
    var temp_gr = temp_bmp.GetGraphics();
    name_array = [];
    value_array = [];
    value_width = [];
    for (j = 0; j < tfname_length; j++) {
        group = false;
        LM = false;

        if (tfname[j].search('group') >= 0 || tfname[j] == "line" ) group = true;

        value = Eval(tfname[j]);

        if (value != 0 || group) {
            name_array.push(tfname[j]);
            value_array.push(value);
            value_width.push(temp_gr.CalcTextWidth(value, font),value);
        }
    }

    temp_bmp.ReleaseGraphics(temp_gr);
    temp_bmp.Dispose();
    temp_gr = null;
    temp_bmp = null;
}

function show_array(gr) {
    t_height = gr.CalcTextHeight("text", font) + 2;
    for (var i = 0; i < name_array.length; i++) {
        line = false;
        group = false;
        measure = "";
       
        if (name_array[i].search('line') >= 0) line = true;
        if (name_array[i].search('group') >= 0) group = true;
       
        row =  i * t_height + s;
       
        line_row = row + t_height / 2;
        line && gr.DrawLine(col1, line_row, ww - col1, line_row, 1, color3);
       
        name = name_array[i].replace(/[%\$\(\)]|info|meta|group |line|lastfm/g,'').replace(/_/g,' ').replace('directory pathpath','directory path');
        var rating_name = name_array[i] == "$meta(rating)" ? "  (tag)" : "";
        gr.GdiDrawText(name + rating_name, group ? group_font : font, group ? color3 : color1, col1, row, ww - col1 * 2, t_height, DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_WORD_ELLIPSIS);       
   
        if (name_array[i] == "%rating%" || name_array[i] == "$meta(rating)") {
            for (var r = 0; r < value_array[i] * offset; r = r + offset) {
                draw_star(gr, col2 + star_size / 2 + r, row + t_height / 2, star_size, 1, 0, color2)           
            }
        } else {
            value = value_array[i];
            gr.GdiDrawText(value, font, color2, col2, row, ww - col2 - col1, t_height, DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_WORD_ELLIPSIS);       

            if (name_array[i] == "$info(bitrate)") measure = "  kbps";
            if (name_array[i] == "$info(samplerate)") measure = "  Hz";
            if (name_array[i] == "$info(bitspersample)") measure = "  bps";
            if (name_array[i] == "$info(channels)") measure = "  ch";

            col3 = col2 + gr.CalcTextWidth(value, font);
            gr.GdiDrawText(measure, font, color1, col3, row, ww - col3 - col1, t_height, DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_WORD_ELLIPSIS);
        }
    }
}
       
var metadb;
on_item_focus_change();

function on_item_focus_change() {
   metadb = fb.IsPlaying ? fb.GetNowPlaying() : fb.GetFocusItem();
    if (metadb) on_metadb_changed();
}

function on_playlist_switch() {
    on_item_focus_change();
}

function on_playback_new_track() {
    on_item_focus_change();
}

function on_playback_stop() {
    on_item_focus_change();
}

function on_metadb_changed() {
    create_array();
    window.Repaint();
}

function Eval(field) {
    if (metadb) {
        path = fb.Titleformat("%path%").EvalWithMetadb(metadb);
        return path.indexOf('://') > 0 ? fb.TitleFormat("[" + field + "]").Eval(true) : fb.TitleFormat("[" + field + "]").EvalWithMetadb(metadb);
    }
}

function on_mouse_rbtn_up (x, y){     
    var _menu = window.CreatePopupMenu();
    var i = 1;

    MF_ENABLED = 0x00000000;
    MF_GRAYED = 0x00000001;
   
    _menu.AppendMenuItem(MF_ENABLED, i++, "Tooltip");
    _menu.CheckMenuItem(1, window.GetProperty("Tooltip"));

    _menu.AppendMenuItem(MF_ENABLED, i++, "Create txt/xls file");
   
    ShiftDown = utils.IsKeyPressed(0x10) ? true : false;
   
//    if (ShiftDown) {
        _menu.AppendMenuItem(0x00000800, 0, 0);
        _menu.AppendMenuItem(0x00000000, 10, "Reload");
        _menu.AppendMenuItem(0x00000800, 0, 0);
        _menu.AppendMenuItem(0x00000000, 20, "Properties");
        _menu.AppendMenuItem(0x00000000, 30, "Configure ...");
//    }

    ret = _menu.TrackPopupMenu(x,y);

    switch (ret) {
    case 1:   
        window.GetProperty("Tooltip") == 0 ? window.SetProperty("Tooltip",1) : window.SetProperty("Tooltip",0);
        break;
    case 2:
        menu_create_file(x,y);
        break;
    case 10:
        window.Reload();
        break;
    case 20:
        window.ShowProperties();
        break;   
    case 30:
        window.ShowConfigure();      
        break;
   }
    _menu.Dispose();
    return true;
}


/////////////////////////////  Create file

var fso = new ActiveXObject("Scripting.FileSystemObject");
if(!fso.FolderExists( fb.ProfilePath + "output")) {fso.CreateFolder( fb.ProfilePath + "output" )};
var output_path = fb.ProfilePath + "\\output\\";

var fields = [];
create_fields_array();

function  create_fields_array() {
    for (var j = 0; j < tfname.length; j++) {   
        if (tfname[j].indexOf('line') < 0  && tfname[j].indexOf('group') < 0){
        fields.push(tfname[j])};
    }
}

var output_fields = [];
var separator = Array(" ; ","\t"); 

for (var j = 0; j < fields.length; j++) {   
    window.GetProperty(j + 1,0);
}

window.GetProperty("ext",0);
window.GetProperty("skip",0);
var selected;
var shift = 0;;

function  create_output_array() {
    output_fields = [];
    for (var j = 0; j < fields.length; j++) {   
        selected = window.GetProperty(j + 1);
        if ( selected == 1 ) {output_fields.push(fields[j])};
    }
    createTextFile();
}

function createTextFile(){
    count = plman.GetPlaylistSelectedItems(plman.ActivePlaylist).Count;
    if (count == 0 || output_fields.length ==0) return;

    plist_name = plman.GetPlaylistName(plman.ActivePlaylist);
    plist_name = plist_name.replace(/[\/\:\*\?\"\<\>\|]/g,'')

    if (window.GetProperty("ext") == 0) {
        output_file = output_path + "plist " + plist_name + ".txt";
    } else {
        output_file = output_path + "plist " + plist_name + ".xls"; 
    }
   
    try { file = fso.CreateTextFile( output_file )
    } catch(e) {
        if (e.number == -2146828218) return; // permission denied
    }
   
    if ( window.GetProperty("skip") == 0) {
        text = [];
        string = "";
        for (var j = 0; j < output_fields.length; j++) {
            text.push(output_fields[j]);       
        }
        string = text.join(separator[window.GetProperty("ext")]);
        file.WriteLine(string);
        file.WriteLine("");
    }

    for (var i = 0; i < count; i++) {
        item = plman.GetPlaylistSelectedItems(plman.ActivePlaylist).Item(i);
        text = [];
        string = "";
        for (var j = 0; j < output_fields.length; j++) {   
            value = fb.TitleFormat("[" + output_fields[j] + "]").EvalWithMetadb(item);
            var measure = "";
            if (value != "" ) {
                if (output_fields[j] == "$info(bitrate)") measure = " kbps";
                if (output_fields[j] == "$info(samplerate)") measure = " Hz";
                if (output_fields[j] == "$info(bitspersample)") measure = " bps";
                if (output_fields[j] == "$info(channels)") measure = " ch";
            }
            if (value != "" || window.GetProperty("skip") == 0) {
                text.push(value + measure);
            }
            string = text.join(separator[window.GetProperty("ext")]);
        }
        try { file.WriteLine(string)
        } catch(e) { 
            if (e.number == -2146828283) file.WriteLine(":ERROR");
        }
    }
    file.Close();
}

function menu_create_file(x,y){     
    var _menu = window.CreatePopupMenu();
    var i = 1;

    MF_ENABLED = 0x00000000;
    MF_GRAYED = 0x00000001;
   
    count = plman.GetPlaylistSelectedItems(plman.ActivePlaylist).Count;
    MF = count == 0 ? MF_GRAYED : MF_ENABLED;
   
    _menu.AppendMenuItem(MF, i++, "create  " + (window.GetProperty("ext") == 0 ? "*.txt" : "*.xls") + " file");
    _menu.AppendMenuItem(0x00000800, 0, 0);
   
    var lines = 20;   
    tl = 0 + shift;
    bl = fields.length > lines ? lines + shift : fields.length;

    for (var j = tl; j < bl; j++) {
        menuItem = fields[j].replace(/[%\$\(\)]|info|meta/g,'').replace(/_/g,' ');
        _menu.AppendMenuItem(MF_ENABLED, i++, menuItem);   
        _menu.CheckMenuItem(i-1, window.GetProperty(i - 2 + shift));
    }
   
    _menu.AppendMenuItem(0x00000800, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 100, "txt");
    _menu.AppendMenuItem(MF_ENABLED, 101, "xls");
    _menu.CheckMenuRadioItem(100, 101, 100 + window.GetProperty("ext"));      
   _menu.EnableMenuItem(100 + window.GetProperty("ext"), 1);
   
    _menu.AppendMenuItem(0x00000800, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 110, "skip if empty");
    _menu.CheckMenuItem(110, window.GetProperty("skip"));
   
    _menu.AppendMenuItem(0x00000800, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 120, "clear all");

    if (fields.length > lines) {
        _menu.AppendMenuItem(0x00000800, 0, 0);
        _menu.AppendMenuItem(shift == 0 ? MF_GRAYED : MF_ENABLED, 130, "up");
        _menu.AppendMenuItem(shift + lines >= fields.length ? MF_GRAYED : MF_ENABLED, 140, "down");
    }

    ret = _menu.TrackPopupMenu(x,y);

    switch (true) {
    case (ret == 1):
        create_output_array();
        break;
    case (ret >= 2 && ret <= fields.length + 1):
        selected = window.GetProperty(ret - 1 + shift);
        window.SetProperty(ret - 1 + shift, selected == 0 ? 1 : 0);
        menu_create_file(x,y);
        break;
    case (ret == 100):
        window.SetProperty("ext", 0);
        menu_create_file(x,y);
        break;
    case (ret == 101):
        window.SetProperty("ext", 1);
        menu_create_file(x,y);
        break;
    case (ret == 110):
        window.SetProperty("skip", window.GetProperty("skip") == 0 ? 1 : 0);
        menu_create_file(x,y);
        break;
    case (ret == 120):
        for (var j = 1; j < fields.length + 1; j++) {   
            window.SetProperty(j, 0);
        }
        menu_create_file(x,y);
        break;
    case (ret == 130):
        shift = shift - 1;
        menu_create_file(x,y);
        break;
    case (ret == 140):
        shift = shift + 1;
        menu_create_file(x,y);
        break;
   }
   _menu.Dispose();
}


/////////////////////////////  Draw star

function draw_star(gr, x, y, img_size, fill, line_thickness, color){
    var radius = img_size / 2;
    var radius_2 = radius / 2.61803;
    line_thickness = line_thickness >= radius_2 ? radius_2 : line_thickness;
    var delta = line_thickness / 2 * Math.tan(72 / 180 * Math.PI);
   
    var points = [],
        x_points_1 = [], y_points_1 = [];
        x_points_2 = [], y_points_2 = [];

    for (var i = 0; i < 10; i++) {
        if (i % 2 == 0) {
            x_points_1.push(x + ((radius - delta) * Math.cos(Math.PI * i / 10 * 2 - Math.PI / 2)));
            y_points_1.push(y + ((radius - delta) * Math.sin(Math.PI * i / 10 * 2 - Math.PI / 2)));
        } else {
            x_points_2.push(x + ((radius - delta) / 2.61803 * Math.cos(Math.PI * i / 10 * 2 - Math.PI / 2)));
            y_points_2.push(y + ((radius - delta) / 2.61803 * Math.sin(Math.PI * i / 10 * 2 - Math.PI / 2)));
        }
    }

    for (var i = 0; i < 5; i++) {
        points.push(x_points_1[i], y_points_1[i], x_points_2[i], y_points_2[i]);
    }
     
    gr.SetSmoothingMode(2);
    if(fill > 0) {
        gr.FillPolygon(color, 1, points)
    }
    if(line_thickness > 0) {
        gr.DrawPolygon(color, line_thickness, points);
    }
}
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет

Сообщение #580 Aum » 31.12.2015, 21:12

kgena_ua:последний скрипт properties & create file.
Вот теперь другой разговор, все работает без мерцания и уменьшилась загрузка проца! Спсб. Можно, также, в релизную версию для народа добавить в менюшку выбор режима: now playing/selected/automatic.
Aum M
Аватара
Репутация: 21
С нами: 14 лет 1 месяц

Пред.След.

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