Всплывающее Popup-окно на основе WSH и Dockable Panels

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

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

Сообщение #1 Zin-Uru » 29.04.2010, 02:02

После того, как я познакомился с возможностями компонента Dockable Panels, мне пришла в голову мысль: а можно ли сделать всплывающее окошко с помощью этого плагина? Оказалось, можно, и на мой взгляд, весьма неплохое. Выкладываю результат тяжелых трудов на всеобщее пользование.

Настойчивое тестирование и всякие предложения, как обычно, приветствуются! ;)

ИзображениеИзображениеИзображение

Сразу плюсы и минусы такого варианта относительно известных компонентов foo_prettypopup и foo_popupplus:
 + мой способ не крашит Foobar2000, отлично сочетается с другими компонентами, т.к. основан на весьма стабильных WSH Panel Mod и Dockable Panels;
 + симпатичный и очень подробно настраиваемый внешний вид;
 + довольно простая система настройки;
 + в отличие от foo_prettypopup (насчет foo_popupplus не знаю) дает возможность использовать любые доступные шрифты, а не только самые стандартные Windows;
 + доступность для модификаций всем желающим;
 + обложка загружается из встроенного Art Reader'а Foobar2000 (задается там же), возможна загрузка вшитой обложки;
 + есть защита от несанкционированного появления Popup при использовании приема Pause_or_Play-Pause_or_Play/Play-Stop (служит во многих сборках для перерисовки интерфейса);
 - настройки внешнего вида дают хоть и больше возможностей, чем в foo_prettypopup, но меньше, чем в foo_popupplus;
 - нет возможности автоматического изменения размера в зависимости от длины текста (хоть и мелочь);
В итоге, мой Popup со своими собственными плюсами и минусами, в целом может заменить любой из упомянутых выше компонентов. B)

Код панели WSH Popup:
Код: Выделить всё
//WSH Popup Panel by Zin-Uru for foo_dockable_panels
//2010, version 1.0.5

//RGBA color function
function RGBA(r, g, b, a) {
return ((a << 24) | (r << 16) | (g << 8) | (b));
}

//Getting properties
var panel_name = window.GetProperty("Full Panel Name","1 - WSH Popup");
var delay = window.GetProperty("Delay, in ms","3000");
var show_on_new = window.GetProperty("Display on new track",true);
var show_on_unpause = window.GetProperty("Display on unpause",true);
var stick_on_mouse = window.GetProperty("Stick on mouse move",true);
var hide_on_dbl = window.GetProperty("Hide Popup on double click",true);
var hide_on_middle = window.GetProperty("Hide Popup on middle click",false);
var show_pin = window.GetProperty("Display pin dot",true);
var pin_color = window.GetProperty("Non-graphical pin dot color (r-g-b)","0-150-0");
var popup_dir = fb.FoobarPath+"\\"+window.GetProperty("WSH Popup folder","")+"WSH_Popup\\";
var dot_type = window.GetProperty("Graphical pin dot",true);
var dot_A = window.GetProperty("Pin dot alpha (30-180)","140");
var draw_bg = window.GetProperty("Draw background",true);
var bg_color = window.GetProperty("Background color (r-g-b-a)","0-0-0-255");
var draw_border = window.GetProperty("Draw border",false);
var border_color = window.GetProperty("Border color (r-g-b-a)","245-245-245-255");
var show_cover = window.GetProperty("Show album cover",true);
var cover_pos = window.GetProperty("Album cover position (1-3)","2");
var cover_size = window.GetProperty("Album cover size (1-3): small, normal, large","2");
var cover_disp = window.GetProperty("Keep album cover aspect ratio",false);
var cover_glass = window.GetProperty("Glass album cover effect",true);
var draw_cover_border = window.GetProperty("Draw cover border",false);
var cover_border_color = window.GetProperty("Cover border color (r-g-b-a)","245-245-245-255");
var round_cover_border = window.GetProperty("Round cover border style",true);
var bg_effects = window.GetProperty("Draw additional background effects",false);
var bg_effects_type = window.GetProperty("Current background effect (1-3): craft, gradlines, dots","1");
var bg_effect_intensivity = window.GetProperty("Additional background effects intensivity (0-255)","255");
var lines_count = window.GetProperty("Lines to display (1-5)","4");
var line1_font = window.GetProperty("Line 1 font (Name, Size, Style)","Microsoft Sans Serif, 12, 1");
var line2_font = window.GetProperty("Line 2 font (Name, Size, Style)","Microsoft Sans Serif, 12, 1");
var line3_font = window.GetProperty("Line 3 font (Name, Size, Style)","Microsoft Sans Serif, 12, 2");
var line4_font = window.GetProperty("Line 4 font (Name, Size, Style)","Microsoft Sans Serif, 11, 0");
var line5_font = window.GetProperty("Line 5 font (Name, Size, Style)","Microsoft Sans Serif, 11, 0");
var line1_color = window.GetProperty("Line 1 color (r-g-b)","180-0-0");
var line2_color = window.GetProperty("Line 2 color (r-g-b)","245-245-245");
var line3_color = window.GetProperty("Line 3 color (r-g-b)","245-245-245");
var line4_color = window.GetProperty("Line 4 color (r-g-b)","245-245-245");
var line5_color = window.GetProperty("Line 5 color (r-g-b)","245-245-245");
var line1_titleformat = window.GetProperty("Line 1 title format","%artist%");
var line2_titleformat = window.GetProperty("Line 2 title format","%title%");
var line3_titleformat = window.GetProperty("Line 3 title format","%album%");
var line4_titleformat = window.GetProperty("Line 4 title format","%codec% %bitrate%kbps %samplerate%Hz %channels%");
var line5_titleformat = window.GetProperty("Line 5 title format","");
var ex_panels = window.GetProperty('Exclude control panels ("|" is separator)',"");
var foo_on_top = window.GetProperty("Send Foobar2000 on top",false);
var on_top = window.GetProperty("Appear on top",true);

//Some parameters check
if(delay<20) delay = 20;
if(dot_A*1>180) dot_A = "180";
if(dot_A*1<30) dot_A = "30";
if(lines_count*1<1) lines_count = "1";
if(lines_count*1>5) lines_count = "5";

//Variables
var timer;
var counter = 0;
var on_mouse = false;
var pinned = false;
var pin_A = dot_A;
var bg_clr = RGBA(bg_color.substring(0,get_symbol_pos(bg_color,"-",1)),bg_color.substring(get_symbol_pos(bg_color,"-",1)+1,get_symbol_pos(bg_color,"-",2)),bg_color.substring(get_symbol_pos(bg_color,"-",2)+1,get_symbol_pos(bg_color,"-",3)),bg_color.substring(get_symbol_pos(bg_color,"-",3)+1,bg_color.length));
var border_clr = RGBA(border_color.substring(0,get_symbol_pos(border_color,"-",1)),border_color.substring(get_symbol_pos(border_color,"-",1)+1,get_symbol_pos(border_color,"-",2)),border_color.substring(get_symbol_pos(border_color,"-",2)+1,get_symbol_pos(border_color,"-",3)),border_color.substring(get_symbol_pos(border_color,"-",3)+1,border_color.length));
var c_border_clr = RGBA(cover_border_color.substring(0,get_symbol_pos(cover_border_color,"-",1)),cover_border_color.substring(get_symbol_pos(cover_border_color,"-",1)+1,get_symbol_pos(cover_border_color,"-",2)),cover_border_color.substring(get_symbol_pos(cover_border_color,"-",2)+1,get_symbol_pos(cover_border_color,"-",3)),cover_border_color.substring(get_symbol_pos(cover_border_color,"-",3)+1,cover_border_color.length));
var cover_x,cover_y,cover_w,cover_h;
var cover_b_x,cover_b_y,cover_b_wh;
var image_width,image_height,image_type;
var stop_pressed = false;
var repaint = false;
var on_dot = false;
var pause = false;
var show = false;
var line1_fnt = gdi.Font(line1_font.substring(0,get_symbol_pos(line1_font,",",1)),line1_font.substring(get_symbol_pos(line1_font,",",1)+2,get_symbol_pos(line1_font,",",2)),line1_font.substring(get_symbol_pos(line1_font,",",2)+2,line1_font.length));
var line2_fnt = gdi.Font(line2_font.substring(0,get_symbol_pos(line2_font,",",1)),line2_font.substring(get_symbol_pos(line2_font,",",1)+2,get_symbol_pos(line2_font,",",2)),line2_font.substring(get_symbol_pos(line2_font,",",2)+2,line2_font.length));
var line3_fnt = gdi.Font(line3_font.substring(0,get_symbol_pos(line3_font,",",1)),line3_font.substring(get_symbol_pos(line3_font,",",1)+2,get_symbol_pos(line3_font,",",2)),line3_font.substring(get_symbol_pos(line3_font,",",2)+2,line3_font.length));
var line4_fnt = gdi.Font(line4_font.substring(0,get_symbol_pos(line4_font,",",1)),line4_font.substring(get_symbol_pos(line4_font,",",1)+2,get_symbol_pos(line4_font,",",2)),line4_font.substring(get_symbol_pos(line4_font,",",2)+2,line4_font.length));
var line5_fnt = gdi.Font(line5_font.substring(0,get_symbol_pos(line5_font,",",1)),line5_font.substring(get_symbol_pos(line5_font,",",1)+2,get_symbol_pos(line5_font,",",2)),line5_font.substring(get_symbol_pos(line5_font,",",2)+2,line5_font.length));
var line1_clr = RGBA(line1_color.substring(0,get_symbol_pos(line1_color,"-",1)),line1_color.substring(get_symbol_pos(line1_color,"-",1)+1,get_symbol_pos(line1_color,"-",2)),line1_color.substring(get_symbol_pos(line1_color,"-",2)+1,line1_color.length),255);
var line2_clr = RGBA(line2_color.substring(0,get_symbol_pos(line2_color,"-",1)),line2_color.substring(get_symbol_pos(line2_color,"-",1)+1,get_symbol_pos(line2_color,"-",2)),line2_color.substring(get_symbol_pos(line2_color,"-",2)+1,line2_color.length),255);
var line3_clr = RGBA(line3_color.substring(0,get_symbol_pos(line3_color,"-",1)),line3_color.substring(get_symbol_pos(line3_color,"-",1)+1,get_symbol_pos(line3_color,"-",2)),line3_color.substring(get_symbol_pos(line3_color,"-",2)+1,line2_color.length),255);
var line4_clr = RGBA(line4_color.substring(0,get_symbol_pos(line4_color,"-",1)),line4_color.substring(get_symbol_pos(line4_color,"-",1)+1,get_symbol_pos(line4_color,"-",2)),line4_color.substring(get_symbol_pos(line4_color,"-",2)+1,line4_color.length),255);
var line5_clr = RGBA(line5_color.substring(0,get_symbol_pos(line5_color,"-",1)),line5_color.substring(get_symbol_pos(line5_color,"-",1)+1,get_symbol_pos(line5_color,"-",2)),line5_color.substring(get_symbol_pos(line5_color,"-",2)+1,line5_color.length),255);
var line1_tf = fb.TitleFormat(line1_titleformat).Eval();
var line2_tf = fb.TitleFormat(line2_titleformat).Eval();
var line3_tf = fb.TitleFormat(line3_titleformat).Eval();
var line4_tf = fb.TitleFormat(line4_titleformat).Eval();
var line5_tf = fb.TitleFormat(line5_titleformat).Eval();
var line1_size = line1_font.substring(get_symbol_pos(line1_font,",",1)+2,get_symbol_pos(line1_font,",",2))*1;
var line2_size = line2_font.substring(get_symbol_pos(line2_font,",",1)+2,get_symbol_pos(line2_font,",",2))*1;
var line3_size = line3_font.substring(get_symbol_pos(line3_font,",",1)+2,get_symbol_pos(line3_font,",",2))*1;
var line4_size = line4_font.substring(get_symbol_pos(line4_font,",",1)+2,get_symbol_pos(line4_font,",",2))*1;
var line5_size = line5_font.substring(get_symbol_pos(line5_font,",",1)+2,get_symbol_pos(line5_font,",",2))*1;
var WshShell = new ActiveXObject("WScript.Shell");
var top_status_done = false;
var paint = true;

//Calculate album cover display parameters
function calc_cover_properties() {
    var metadb = fb.IsPlaying ? fb.GetNowPlaying() : fb.GetFocusItem();

if(!metadb) return;
if(utils.GetAlbumArtV2(metadb,0) || utils.GetAlbumArtEmbedded(metadb.RawPath,0)) {
    if(utils.GetAlbumArtV2(metadb,0)) {
        image_width = utils.GetAlbumArtV2(metadb,0).Width;
        image_height = utils.GetAlbumArtV2(metadb,0).Height;
        image_type = 1;
    } else {
        image_width = utils.GetAlbumArtEmbedded(metadb.RawPath,0).Width;
        image_height = utils.GetAlbumArtEmbedded(metadb.RawPath,0).Height;
        image_type = 2;
    }
} else {   
    image_width = gdi.Image(popup_dir+"no_cover.jpg").Width;
    image_height = gdi.Image(popup_dir+"no_cover.jpg").Height;
    image_type = 3;
}
if(cover_disp && image_width!=image_height) {
    if(image_width>image_height) {
        switch (cover_size) {
            default:
                cover_w = 75;
                break;
            case "1":
                cover_w = 50;
                break;
            case "2":
                cover_w = 75;
                break;
            case "3":
                cover_w = 100;
                break;
        }
        cover_h = Math.round(cover_w*image_height/image_width);
        switch (cover_pos) {
            default:
                cover_x = 6;
                cover_y = 6 + Math.round((cover_w-cover_h)/2);
                break;
            case "1":
                cover_x = 6;
                cover_y = 6 + Math.round((cover_w-cover_h)/2);
                break;
            case "2":
                cover_x = window.Width-cover_w-6;
                cover_y = 6 + Math.round((cover_w-cover_h)/2);
                break;
            case "3":
                cover_x = 6;
                cover_y = window.Height-cover_h-Math.round((cover_w-cover_h)/2)-6;
            break;
        }       
    } else {
        switch (cover_size) {
            default:
                cover_h = 75;
                break;
            case "1":
                cover_h = 50;
                break;
            case "2":
                cover_h = 75;
                break;
            case "3":
                cover_h = 100;
                break;
        }
        cover_w = Math.round(cover_h*image_width/image_height);
        switch (cover_pos) {
            default:
                cover_x = 6 + Math.round((cover_h-cover_w)/2);
                cover_y = 6;
                break;
            case "1":
                cover_x = 6 + Math.round((cover_h-cover_w)/2);
                cover_y = 6;
                break;
            case "2":
                cover_x = window.Width-cover_w-Math.round((cover_h-cover_w)/2)-6;
                cover_y = 6;
                break;
            case "3":
                cover_x = 6 + Math.round((cover_h-cover_w)/2);
                cover_y = window.Height-cover_h-6;
            break;
        }
    }
} else {
    switch (cover_size) {
        default:
            cover_w = 75;
            break;
        case "1":
            cover_w = 50;
            break;
        case "2":
            cover_w = 75;
            break;
        case "3":
            cover_w = 100;
            break;
    }
    cover_h = cover_w;
    switch (cover_pos) {
        default:
            cover_x = 6;
            cover_y = 6;
            break;
        case "1":
            cover_x = 6;
            cover_y = 6;
            break;
        case "2":
            cover_x = window.Width-cover_w-6;
            cover_y = 6;
            break;
        case "3":
            cover_x = 6;
            cover_y = window.Height-cover_h-6;
        break;
    }
}
switch (cover_size) {
    default:
        cover_b_wh = 77;
        break;
    case "1":
        cover_b_wh = 52;
        break;
    case "2":
        cover_b_wh = 77;
        break;
    case "3":
        cover_b_wh = 102;
        break;
}
switch (cover_pos) {
    default:
        cover_b_x = 5;
        cover_b_y = 5;
        break;
    case "1":
        cover_b_x = 5;
        cover_b_y = 5;
        break;
    case "2":
        cover_b_x = window.Width-cover_b_wh-5;
        cover_b_y = 5;
        break;
    case "3":
        cover_b_x = 5;
        cover_b_y = window.Height-cover_b_wh-5;
    break;
}
return metadb;
}

//Find symbol position
function get_symbol_pos(c_string, symbol, pos_number) {
    var n = 0;
   
for(var i = 0; i < c_string.length; i++) {
    if(c_string.charAt(i+1)==symbol) {
        n = n+1;
        if(n==pos_number) {
            return i+1;
        }
    }
}
if(n==0) return 0;
}

//Show excluded panels again
function show_excluded() {
    var panels = ex_panels;
   
    while(get_symbol_pos(panels,"|",1)!=0) {
        fb.RunMainMenuCommand("View/Dockable Panels/Activate/"+panels.substring(0,get_symbol_pos(panels,"|",1)));
        panels = panels.substring(get_symbol_pos(panels,"|",1)+1,panels.length);
    }
    if(panels!="") fb.RunMainMenuCommand("View/Dockable Panels/Activate/"+panels);
}

//Body
function on_playback_time(time) {
    if(!top_status_done) {
        if(on_top) {
            WshShell.run(popup_dir+'cmdow.exe "'+panel_name.substring(get_symbol_pos(panel_name,"-",1)+2,panel_name.length)+'" /TOP',0);
        } else {
            WshShell.run(popup_dir+'cmdow.exe "'+panel_name.substring(get_symbol_pos(panel_name,"-",1)+2,panel_name.length)+'" /NOT',0);
        }
        top_status_done = true;
    }
    if(paint) {
        paint = false;
        window.Repaint();
    }
}

function on_playback_new_track(info) {
    if(show_on_new) {
        if(foo_on_top) fb.RunMainMenuCommand("View/Activate");
        paint = false;
        fb.RunMainMenuCommand("View/Dockable Panels/Activate/"+panel_name);
        timer && window.KillTimer(timer);
        timer=null;
       CollectGarbage();
        if (!timer && !pinned) timer = window.CreateTimerInterval(20);
        counter = 0;
    }
    line1_tf = fb.TitleFormat(line1_titleformat).Eval();
    line2_tf = fb.TitleFormat(line2_titleformat).Eval();
    line3_tf = fb.TitleFormat(line3_titleformat).Eval();
    line4_tf = fb.TitleFormat(line4_titleformat).Eval();
    line5_tf = fb.TitleFormat(line5_titleformat).Eval();
    window.Repaint();
}

function on_playback_pause(state) {
    if(show_on_unpause) {   
        timer && window.KillTimer(timer);
        timer=null;
        CollectGarbage();
        if (!timer && !pinned) timer = window.CreateTimerInterval(20);
        if(counter<201) counter = 0;
        pause = !pause;
        if(!state && show && !fb.IsPaused) {
            if(foo_on_top) fb.RunMainMenuCommand("View/Activate");
            paint = false;
            fb.RunMainMenuCommand("View/Dockable Panels/Activate/"+panel_name);
            show = false;
            counter = 0;
            window.Repaint();
        }
    }
}

function on_playback_stop(reason) {
    stop_pressed = true;
    line1_tf = "";
    line2_tf = "";
    line3_tf = "";
    line4_tf = "";
    line5_tf = "";
    window.Repaint();
}

on_timer = function(id){
    if (!timer || timer.ID != id || (on_mouse && stick_on_mouse) || pinned) return;
    counter = counter+20;
    if (counter>delay-20) {
        fb.RunMainMenuCommand("View/Dockable Panels/Hide Panels");
        paint = true;
        show_excluded();
        timer && window.KillTimer(timer);
        timer=null;
        counter = 0;
       CollectGarbage();
    } else {
        if(counter>200 && pause && show_on_unpause) {
            show = true;
            on_playback_pause(false);
        }
    }
}

function on_mouse_lbtn_down(x, y, mask) {
    if(window.Width-16<x && x<window.Width-6 && window.Height-16<y && y<window.Height-6 && show_pin) {
        pinned = !pinned;
        if(pinned) {
            timer && window.KillTimer(timer);
            timer=null;
            counter = 0;
            CollectGarbage();           
        } else {
            if (!timer) timer = window.CreateTimerInterval(20);
        }
        window.Repaint();
    }
}

function on_mouse_lbtn_dblclk(x, y, mask) {
    if(hide_on_dbl) {
        timer && window.KillTimer(timer);
        timer=null;
        counter = 0;
        CollectGarbage();
        fb.RunMainMenuCommand("View/Dockable Panels/Hide Panels");
        paint = true;
        show_excluded();
    }
}

function on_mouse_mbtn_down(x, y, mask) {
    if(hide_on_middle) {
        timer && window.KillTimer(timer);
        timer=null;
        counter = 0;
        CollectGarbage();
        fb.RunMainMenuCommand("View/Dockable Panels/Hide Panels");
        paint = true;
        show_excluded();
    }       
}

function on_mouse_move(x, y) {
    if(stick_on_mouse && counter!=0) {
        on_mouse = true;
        timer && window.KillTimer(timer);
        timer=null;
        counter = 0;
        CollectGarbage();
        if (!timer && !pinned) timer = window.CreateTimerInterval(20);
    }
    if(window.Width-16<x && x<window.Width-6 && window.Height-16<y && y<window.Height-6 && show_pin) {
        pin_A = "255";
        on_dot = true;
    } else {
        pin_A = dot_A;
        on_dot = false;
    }
    if(on_dot!=repaint) {
        repaint = on_dot;
        window.Repaint();
    }
}

function on_mouse_leave() {
    if(stick_on_mouse) on_mouse = false;
}

function on_item_focus_change() {
    if(!fb.IsPlaying) window.Repaint();
}

function on_paint(gr) {
    var metadb = calc_cover_properties();
    var line_x,line_y,line_w,line_h;
    var line,font,color;
    var dots = false;
    var pad = false;
   
    if(draw_bg) {
        gr.FillSolidRect(0, 0, window.Width, window.Height, bg_clr);
        if(bg_effects) {
            switch (bg_effects_type) {
                default:
                    gr.DrawImage(gdi.Image(popup_dir+"craft.jpg"),0,0,window.Width,window.Height,0,0,gdi.Image(popup_dir+"craft.jpg").Width,gdi.Image(popup_dir+"craft.jpg").Height,0,bg_effect_intensivity);
                    break;               
                case "1":
                    gr.DrawImage(gdi.Image(popup_dir+"craft.jpg"),0,0,window.Width,window.Height,0,0,gdi.Image(popup_dir+"craft.jpg").Width,gdi.Image(popup_dir+"craft.jpg").Height,0,bg_effect_intensivity);
                    break;
                case "2":
                    gr.DrawImage(gdi.Image(popup_dir+"gradlines.png"),0,0,window.Width,window.Height,0,0,gdi.Image(popup_dir+"gradlines.png").Width,gdi.Image(popup_dir+"gradlines.png").Height,0,bg_effect_intensivity);
                    break;
                case "3":
                    gr.DrawImage(gdi.Image(popup_dir+"dots.png"),0,0,window.Width,window.Height,0,0,gdi.Image(popup_dir+"dots.png").Width,gdi.Image(popup_dir+"dots.png").Height,0,bg_effect_intensivity);
                    break;              
            }
        }
    }
    if(draw_border) {
        gr.DrawRect(0, 0, window.Width-1, window.Height-1, 1, border_clr);
    }
    if(show_cover && metadb) {
        calc_cover_properties();
        switch (image_type) {
            case 1:
                gr.DrawImage(utils.GetAlbumArtV2(metadb,0),cover_x,cover_y,cover_w,cover_h,0,0,image_width,image_height,0,255);
                break;
            case 2:
                gr.DrawImage(utils.GetAlbumArtEmbedded(metadb.RawPath,0),cover_x,cover_y,cover_w,cover_h,0,0,image_width,image_height,0,255);
                break;
            case 3:
                gr.DrawImage(gdi.Image(popup_dir+"no_cover.jpg"),cover_x,cover_y,cover_w,cover_h,0,0,image_width,image_height,0,255);
                break;
        }
        if(cover_glass) {
            gr.DrawImage(gdi.Image(popup_dir+"glass.png"),cover_b_x,cover_b_y,cover_b_wh,cover_b_wh,0,0,54,54,0,255);   
        }
        if(draw_cover_border) {
            if(round_cover_border) {
                gr.DrawRoundRect(cover_b_x, cover_b_y, cover_b_wh-1, cover_b_wh-1, 2, 2, 1, c_border_clr);
            } else {
                gr.DrawRect(cover_b_x, cover_b_y, cover_b_wh-1, cover_b_wh-1, 1, c_border_clr);
            }
        }
    }
    if(show_pin) {
        if(pinned) {
            if(dot_type) {
                gr.DrawImage(gdi.Image(popup_dir+"pin_1.png"), window.Width-15, window.Height-15, 9, 9, 0, 0, 9, 9, 0, pin_A);
            } else {
                gr.FillEllipse(window.Width-16, window.Height-16, 10, 10, RGBA(pin_color.substring(0,get_symbol_pos(pin_color,"-",1)),pin_color.substring(get_symbol_pos(pin_color,"-",1)+1,get_symbol_pos(pin_color,"-",2)),pin_color.substring(get_symbol_pos(pin_color,"-",2)+1,pin_color.length),pin_A));
            }
        } else {
            if(dot_type) {
                gr.DrawImage(gdi.Image(popup_dir+"pin_0.png"), window.Width-15, window.Height-15, 9, 9, 0, 0, 9, 9, 0, pin_A);
            } else {
                gr.DrawEllipse(window.Width-15, window.Height-15, 8, 8, 1, RGBA(pin_color.substring(0,get_symbol_pos(pin_color,"-",1)),pin_color.substring(get_symbol_pos(pin_color,"-",1)+1,get_symbol_pos(pin_color,"-",2)),pin_color.substring(get_symbol_pos(pin_color,"-",2)+1,pin_color.length),pin_A));
            }
        }
    }
    if(8+(lines_count-1)*(Math.max(line1_size,line2_size,line3_size,line4_size,line5_size)+10)+Math.max(line1_size,line2_size,line3_size,line4_size,line5_size)>window.Height-cover_b_wh-10) pad = true;
    for(var i = 0; i < lines_count; i++) {
        switch (i) {
            case 0:
                line = line1_tf;
                font = line1_fnt;
                color = line1_clr;
                break;
            case 1:
                line = line2_tf;
                font = line2_fnt;
                color = line2_clr;
                break;
            case 2:
                line = line3_tf;
                font = line3_fnt;
                color = line3_clr;
                break;
            case 3:
                line = line4_tf;
                font = line4_fnt;
                color = line4_clr;
                break;
            case 4:
                line = line5_tf;
                font = line5_fnt;
                color = line5_clr;
                break;
        }
        line_x = 6;
        line_y = 6+i*(Math.max(line1_size,line2_size,line3_size,line4_size,line5_size)+7);
        line_w = window.Width-12;
        line_h = Math.max(line1_size,line2_size,line3_size,line4_size,line5_size)+3;
        if(show_cover) {
            switch (cover_pos) {
                default:
                    if(line_y<cover_b_wh+10) {
                        line_x = cover_b_wh+10;
                        line_w = window.Width-cover_b_wh-16;
                    }
                    break;
                case "1":
                    if(line_y<cover_b_wh+10) {
                        line_x = cover_b_wh+10;
                        line_w = window.Width-cover_b_wh-16;
                    }
                    break;
                case "2":
                    if(line_y<cover_b_wh+10) {
                        line_w = window.Width-cover_b_wh-16;
                    }
                    break;
                case "3":
                    if(pad) {
                        line_x = cover_b_wh+10;
                        line_w = window.Width-cover_b_wh-16;
                    }
                    break;                    
            }
        }
        if(show_pin && line_y+line_h>window.Height-22) line_w = line_w-16;
        if(gr.CalcTextWidth(line, font)>line_w) {dots = true;} else {dots = false;}
        while(gr.CalcTextWidth(line, font)>line_w) {
            line = line.substring(0,line.length-1);
            if(line.length<4) break;
        }
        if(dots) line = line.substring(0,line.length-3)+"...";
        gr.GdiDrawText(line, font, color, line_x, line_y, line_w, line_h, format = 0);     
    }
//  gr.GdiDrawText(line1_tf, line1_fnt, line1_clr, 120, 5, 100, 20, format = 0);  - For some tests
    if (!timer && !pinned) timer = window.CreateTimerInterval(20);
    if(!fb.IsPlaying && !pinned && !stop_pressed) {
        fb.RunMainMenuCommand("View/Dockable Panels/Hide Panels");
        paint = true;
        show_excluded();
        timer && window.KillTimer(timer);
        timer=null;
        counter = 0;
       CollectGarbage();
    }
}


Начальная настройка панели (установка):
Код: Выделить всё
Инструкция по установке панели WSH Popup 1.0.5

1. Скопируйте компонент foo_dockable_panels.dll в папку Foobar2000\components (если его еще нет) и перезапустите плеер.
2. Скопируйте папку WSH_Popup в папку Foobar2000 (или в другую нужную вам - в этом случае при установке вы сначала получите Script Error, после чего вам надо будет указать путь к папке WSH_Popup, - см. 11, 13).
3. Убедитесь, что у вас последняя версия компонента WSH Panel Mod и версия Foobar2000 1.0 или выше.
4. Убедитесь, что в меню File -> Preferences -> Tools -> WSH Panel Mod отключена галочка "Safe mode".
5. Выберите пункт меню View -> Dockable Panels -> New... У вас появится новая панель.
6. Выберите пункт меню View -> Dockable Panels -> Active Panel -> Hide Close Box - для того чтобы случайно не удалить панель.
7. Выберите пункт меню View -> Dockable Panels -> Active Panel -> Custom Title... и введите имя WSH Popup или другое нужное вам.
8. Щелкните правой кнопкой мыши (ПКМ) по панели, выберите WSH Panel Mod. На Default UI здесь появится предупреждение - проигнорируйте его.
9. Щелкните ПКМ по панели, выберите Configure... -> Import... и укажите на файл WSH_Popup.txt.
10. Поставьте, если нужно, галочку Pseudo Transparent и нажмите OK.
11. Если вы использовали папку по умолчанию, то вы увидите готовую панель WSH Popup. В случае Script Error (см. также 2) вам необходимо будет задать путь к папке WSH_Popup (см. 13).
11-доп. Если панелька успела сама закрыться, ее можно вызвать опять с помощью меню View -> Dockable Panels -> Activate -> Имя панели, или запустив проигрывание музыкального файла. Зафиксировать панель можно с помощью кнопки-точки справа внизу.
12. Щелкните ПКМ по панели, выберите Properties, задайте Full Panel Name. Имя должно быть задано в полном виде (как написано в меню View -> Dockable Panels -> Activate).
13. Там же задайте в случае необходимости (см. 2, 11) WSH Popup folder - путь к папке с необходимыми файлами WSH Popup. Путь задается относительно папки Foobar2000, в конце должен стоять символ "\" (без кавычек). Внутри заданной здесь папки и должна находиться папка WSH_Popup.
14. Если у вас есть другие Dockable-панели, задайте Exclude control panels - названия этих панелей - для того чтобы они не скрывались вместе с WSH Popup. Названия должны быть полными (как написаны в меню View -> Dockable Panels -> Activate), разделены символом "|" (без кавычек и доп. пробелов).
15. Нажмите OK, растяните панель до нужных размеров - WSH Popup готова к использованию!

Дополнительные пункты (необязательно):
16. Сделайте нужные вам настройки в меню View -> Dockable Panels -> Active Panel. Не рекомендуется ставить Hide When Collapsed и убирать Hide Close Box.
17. Прозрачность можно настроить, поставив галочку "Use Transparency" в меню File -> Preferences -> Dockable Panels и введя нужные значения.

Подробное описание остальных возможностей настройки:
Изображение

Код: Выделить всё
Описание настроек WSH Popup 1.0.5 (см. также скриншот выше)

Внимание! Если в процессе настройки вы получили Script Error, то скорее всего вы что-то сделали неправильно, и нужно внимательно прочитать инструкцию еще раз.
1. Интенсивность дополнительнвх эффектов фона панели (см. также 7, 12). Чем ниже число, тем менее они заметны.
2. Позиция обложки на панели (см. также 3, 18, 22, 43):
   1 - слева вверху;
   2 - справа вверху;
   3 - слева внизу.
3. Размер показываемой обложки (см. также 2, 18, 22, 43):
   1 - маленький (примерно 50х50 пикселей);
   2 - нормальный (примерно 75х75);
   3 - большой (примерно 100х100).
4. Цвет фона в стандартном формате (см. также 13).
5. Цвет рамки (если выбрано ее показывать - см. 14).
6. Цвет рамки вокруг обложки (если выбрано их показывать - см. 15, 41).
7. Тип дополнительного эффекта фона (см. также 1, 12):
   1 - смятая бумага;
   2 - градиентные полосы;
   3 - точки.
8. Задержка - сколько панель будет висеть на виду по умолчанию. Значение в миллисекундах.
9. Показывать ли панельку в начале проигрывания нового трека.
10. Показывать ли панельку после снятия паузы.
11. Показывать ли кнопку-точку для закрепления панели (см. также 19, 39, 40).
12. Рисовать ли дополнительные эффекты фона (см. также 1, 7).
13. Закрашивать ли фон (см. также 4). Если нет, то цвет фона будет белым (если не включена прозрачность) или цветом родительского окна (если прозрачность включена).
14. Рисовать ли рамку (см. также 5).
15. Рисовать ли рамку вокруг обложки (см. также 6, 41).
16. Названия других Dockable-панелей, если они есть, - для того чтобы они не скрывались вместе с WSH Popup. Названия должны быть полными (как написаны в меню View -> Dockable Panels -> Activate), разделены символом "|" (без кавычек и доп. пробелов).
17. Название панели WSH Popup, задающееся в меню View -> Dockable Panels -> Active Panel -> Custom Title... В этом поле (17) оно должно быть задано в полном виде (как написано в меню View -> Dockable Panels -> Activate).
18. Рисовать ли эффект бликов на обложке (см. также 2, 3, 22, 43).
19. Тип кнопки-точки (см. также 11, 39, 40): графический или отрисованный.
20. Скрывать ли принудительно панель при двойном по ней клике.
21. Скрывать ли принудительно панель при клике по ней колесиком.
22. Сохранять ли пропорции отображаемой обложки (см. также 2, 3, 18).
23. Цвет текста первой строки с информацией о треке (см. также 38), в стандартном формате.
24. Шрифт текста первой строки (см. также 38). Шрифт должен задаваться в формате: Название, Размер, Стиль. Наличие пробелов важно!
25. Формат отображаемой в первой строке информации (см. также 38) на стандартном скриптовом языке Foobar2000.
26-28, 29-31, 32-34 и 35-37 - аналогично (как в 23-25) для других строк.
38. Количество строк с информацией о треке, выводимых на панель (см. также 23-37).
39. Цвет для отрисованной кнопки-точки (см. также 11, 19, 40), в стандартном формате.
40. Прозрачность кнопки-точки в неактивном состоянии (см. также 11, 19, 39).
41. Рисовать ли рамку с закругленными углами вокруг обложки (см. также 6, 15).
42. Выводить ли окно плеера на передний план при срабатывании WSH Popup.
43. Показывать ли обложку (см. также 2, 3, 18, 22).
44. Задерживать ли WSH Popup на виду при наведении курсора мыши.
45. Папка с необходимыми файлами WSH Popup. Путь задается относительно папки Foobar2000, в конце должен стоять символ "\" (без кавычек). Внутри заданной здесь папки и должна находиться папка WSH_Popup.

ПРИЛОЖЕНИЕ
В версии 1.04 добавилась опция "Appear on top", которая контролирует, будет появляться панелька поверх всех окон или нет.

Changelog:
Код: Выделить всё
04.05.2010 - Версия 1.0.5:
- Устранена проблема с прорисовкой окна после его вызова горячими клавишами при свернутом плеере.

01.05.2010 - Версия 1.0.4:
- Реализовано появление WSH Popup поверх всех окон (на переднем плане).

30.04.2010 - Версия 1.0.3:
- Добавлена защита от несанкционированного появления Popup при использовании приема Pause_or_Play-Pause_or_Play/Play-Stop (служит во многих сборках для перерисовки интерфейса).

29.04.2010 - Версия 1.0.2:
- Немного подправлено поведение панельки.

29.04.2010 - Версия 1.0.1:
- Релиз.

Скачать архив со всеми составляющими (кроме WSH Panel Mod):
Вложения
WSH_Popup_1.05.zip
(416.92 КБ) Скачиваний: 795
Последний раз редактировалось Zin-Uru 04.05.2010, 20:00, всего редактировалось 1 раз.
Zin-Uru M
Автор темы
Репутация: 45
С нами: 14 лет 6 месяцев

Сообщение #2 Aum » 29.04.2010, 11:27

Труд проделан титанический!!!
*пыво*
Но вот это, как мне кажеться, основной смысл всплывающего окошка!!!:
Zin-Uru:- нет возможности вывести поверх всех окон всплывающее окошко отдельно от всего плеера.
А учитывая кривизну Dockable - это не поправить... *sorry*
Aum M
Аватара
Репутация: 20
С нами: 14 лет

Сообщение #3 Zin-Uru » 29.04.2010, 11:34

Aum:- нет возможности вывести поверх всех окон всплывающее окошко отдельно от всего плеера.
Ну в общем-то это на любителя. Мне никогда особо не была нужная такая функция. Главное, чтоб не перекрывалось другими развернутыми на весь экран окнами - для свернутого состояния плеера работает отлично.
Изображение

А так, конечно, жаль что нельзя сделать вывод поверх всех окон.
Последний раз редактировалось Zin-Uru 29.04.2010, 12:56, всего редактировалось 1 раз.
Zin-Uru M
Автор темы
Репутация: 45
С нами: 14 лет 6 месяцев

Сообщение #4 Zin-Uru » 01.05.2010, 01:39

Добавил защиту от несанкционированного появления Popup при использовании приема Pause_or_Play-Pause_or_Play/Play-Stop (служит во многих сборках для перерисовки интерфейса). Такого кстати нет ни на foo_prettypopup, ни на foo_popupplus. :)
Для обновления достаточно заново проделать пункт 9 инструкции. Все настройки, опять же, сохранятся.

UPDATE:
- нет возможности вывести поверх всех окон всплывающее окошко отдельно от всего плеера.
Возможность нашлась, недостаток устранен. :) Для обновления нужно заново скопировать папку WSH_Popup в место назначения и заново импортировать скрипт.
Zin-Uru M
Автор темы
Репутация: 45
С нами: 14 лет 6 месяцев

Сообщение #5 Aum » 04.05.2010, 00:46

тестирование в разгаре...)) смотрю на эти киллометры кодов... и  :o = *пыво*
возможно ли добавить плавное появление, затухание окошка?
и почему-то не получается вызывать по гарячей кнопке (вернее когда фубар свернут - окошко появляется, но в нем пусто)?
Aum M
Аватара
Репутация: 20
С нами: 14 лет

Сообщение #6 Zin-Uru » 04.05.2010, 16:40

Aum:возможно ли добавить плавное появление, затухание окошка?
Вряд ли. Возможности Dockable Panels и WSH Panel Mod таких эффектов не позволяют. Разве что какую-то имитацию придумать (есть одна идея, но не факт что получится). Подумаю над этим.

Aum:и почему-то не получается вызывать по гарячей кнопке (вернее когда фубар свернут - окошко появляется, но в нем пусто)?
Потому что при свернутом Фубаре WSH в окошке не получает автоматической команды на прорисовку. При автояпоявлении я даю такую команду в коде, а вот на горячей кнопке сделать это так просто нельзя. Но по этому поводу тоже есть идейка.

Спасибо за тест - как раз нарисовались новые пути для улучшения.
Zin-Uru M
Автор темы
Репутация: 45
С нами: 14 лет 6 месяцев

Сообщение #7 Zin-Uru » 04.05.2010, 20:01

Обновил панельку.

Aum:и почему-то не получается вызывать по гарячей кнопке (вернее когда фубар свернут - окошко появляется, но в нем пусто)?
Исправлено!
Для обновления достаточно импортировать измененный скрипт.
Zin-Uru M
Автор темы
Репутация: 45
С нами: 14 лет 6 месяцев


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