Скрипты для foo_uie_wsh_panel_mod

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

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

fooClock 1.0

Сообщение #161 vizgoon » 01.10.2014, 21:22

kgena_ua, Простите, если не затруднит, не подскажете как изменить интервал между строк с днем недели и датой?
(kgena_ua » 27.09.2014, 10:06)
vizgoon
Гость

Сообщение #162 kgena_ua » 01.10.2014, 21:34

vizgoon:как изменить интервал между строк с днем недели и датой?
vizgoon, изменяя значения выделенные красным.

    // ************* Date, Digital Clock
    if(window.GetProperty("DC",true)) {
        gr.DrawString(days[d.getDay()], datefont, color, 0, y + radius_h - 7, ww, 40, 0x11005000);
        gr.DrawString(d.getDate() + " " + months[d.getMonth()] + ", " + d.getYear(), datefont, color, 0, y + radius_h + 6, ww, 40, 0x11005000);           

хотя это бред какой-то. Лучше их заменить на:

gr.GdiDrawText(days[d.getDay()], datefont, color, 0, y + radius_h + 5, ww, wh, 0x00000001);
gr.GdiDrawText(d.getDate() + " " + months[d.getMonth()] + ", " + d.getYear(), datefont, color, 0, y + radius_h + 20, ww, wh, 0x00000001);

Так более правильно: y ( координата центра часов по вертикали) + radius_h ( радиус меток часов) + значение , где будет текст.
Последний раз редактировалось kgena_ua 01.10.2014, 22:28, всего редактировалось 1 раз.
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 10 лет 11 месяцев

fooClock 1.0

Сообщение #163 vizgoon » 01.10.2014, 22:27

kgena_ua, Спасибо огромадное!
vizgoon
Гость

Сообщение #164 kgena_ua » 12.10.2014, 13:46

Есть функция, которая возвращает цвет:
return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
Результат, к примеру, 20,10,15.
Никак не могу прикрутить эти данные к RGB(....). Помогите тупому.
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 10 лет 11 месяцев

Сообщение #165 kgena_ua » 13.10.2014, 21:34

Скрипт для изменения яркости цвета. Можно применить для изменения фона или шрифтов.
Сначала преобразуем цвет RGB в HSV, затем изменяя переменную V (колесом мыши), преобразуем опять в RGB и можно передать цвет в PSS.
Код: Выделить всё
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 getRed(color) {return ((color >> 16) & 0xff);};
function getGreen(color) {return ((color >> 8) & 0xff);};
function getBlue(color) {return (color & 0xff);};

var font = gdi.Font("arial",12,0);
var ww,wh;
var on_mouse = false;

var bg_color = {   
   1:RGB(0,20,30),
   2:RGB(20,27,31),
   3:RGB(50,50,50),
   4:RGB(0,0,0),
}

var ShiftDown = false;
var Y = 0, R, G, B, h,s,v;

function on_paint(gr) {   
    gr.FillSolidRect(0, 0, ww, wh, RGB(255,255,255));   
    var i = 1;
    R = getRed(bg_color[i]);
    G = getGreen(bg_color[i]);
    B = getBlue(bg_color[i]);

    RGBtoHSV(R, G, B);
    var bg_colorY = HSVtoRGB(h, s, v + Y);
    gr.FillSolidRect(0, 0, ww, wh, bg_colorY);   
}

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

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_mouse_wheel(delta) {
//    ShiftDown = utils.IsKeyPressed(0x10) ? true : false;
//    if (!ShiftDown) return;
    if (delta > 0) {
        Y = Y >= 100 ? 100 : Y + 1;
    } else {
        Y = Y <= 0 ? 0 : Y - 1;
    }
    window.Repaint();
}    

function RGBtoHSV(r, g, b) {
    var min = Math.min(r, g, b),
        max = Math.max(r, g, b),
        delta = max - min;
//        v = max;
    v = Math.floor(max / 255 * 100);

    if (delta == 0) {
        h = 0;
        s = 0;
    } else {
        s = Math.floor(delta / max * 100);
        if( r == max )
            h = ( g - b ) / delta;         
        else if( g == max )
            h = 2 + ( b - r ) / delta;     
        else
            h = 4 + ( r - g ) / delta;     
        h = Math.floor(h * 60);           
        if( h < 0 ) h += 360;
    }
}

function HSVtoRGB(h, s, v) {
   var r, g, b;
   var i;
   var f, p, q, t;

   h = Math.max(0, Math.min(360, h));
   s = Math.max(0, Math.min(100, s));
   v = Math.max(0, Math.min(100, v));

   s /= 100;
   v /= 100;

   if(s == 0) {r = g = b = v;   }
   
   h /= 60;
   i = Math.floor(h);
   f = h - i;
   p = v * (1 - s);
   q = v * (1 - s * f);
   t = v * (1 - s * (1 - f));

   switch(i) {
      case 0:
         r = v;
         g = t;
         b = p;
         break;
      case 1:
         r = q;
         g = v;
         b = p;
         break;
      case 2:
         r = p;
         g = v;
         b = t;
         break;
      case 3:
         r = p;
         g = q;
         b = v;
         break;
      case 4:
         r = t;
         g = p;
         b = v;
         break;
      default:
         r = v;
         g = p;
         b = q;
   }
   return RGB(Math.round(r * 255), Math.round(g * 255), Math.round(b * 255));
}
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 10 лет 11 месяцев

Сообщение #166 kgena_ua » 23.10.2014, 13:15

Визуализация для play count.
Скрипт вычисляет максимальное значение %play_count% в активном плейлисте (создается папка settings а в ней файл max_pcount_... с числовым значением). Это значение можно передать, к примеру, в ELPlayList, где его можно взять за 100% и отобразить %play_count% для каждого трека относительно этой величины в процентном отношении.
Код: Выделить всё
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,0);
var ww,wh;

var fso = new ActiveXObject("Scripting.FileSystemObject");
//var set_path = fb.ProfilePath + "\\maybe\\settings\\";
var set_path = fb.ProfilePath + "\\settings\\";

var max_pcount_start = parseInt( utils.ReadINI( set_path + 'settings.ini', 'max_pcount', 'max_pcount'));      
if (!max_pcount_start){
    fso.CreateFolder (fb.ProfilePath + "\\settings");
    utils.WriteINI (set_path + 'settings.ini', 'max_pcount', 'max_pcount', 1);   
    fso.CreateTextFile (set_path + "max_pcount_" + 0);   
}

// ************* Get active playlist max play count

var plist_idx, plist_itemcount, max_pcount;
max_play_count();

function on_playlist_switch() {
    max_play_count();
    window.Repaint()
    fso.deleteFile( set_path + "max_pcount_" + "*" );
    fso.CreateTextFile( set_path + "max_pcount_" + max_pcount);
    fb.RunMainMenuCommand("View/ELPlaylist/Refresh");
}

function on_playlist_items_added(playlist) {
    max_play_count();
    window.Repaint()
    fso.deleteFile( set_path + "max_pcount_" + "*" );
    fso.CreateTextFile( set_path + "max_pcount_" + max_pcount);
    fb.RunMainMenuCommand("View/ELPlaylist/Refresh");
}

function on_paint(gr) {   
    gr.FillSolidRect(0, 0, ww, wh, RGB(200,200,200));   
    gr.GdiDrawText("plist_itemcount: " + plist_itemcount, font, RGB(0,0,0), 10, 0, ww, wh);
    gr.GdiDrawText("max_play_count: " + max_pcount, font, RGB(0,0,0), 10, 15, ww, wh);   
}

function max_play_count(){
    max_pcount = 0;
    plist_idx = plman.ActivePlaylist;
    plist_itemcount = plman.PlaylistItemCount(plist_idx);
 
    for (var i = 0; i < plist_itemcount; i++) {
        plman.SetPlaylistFocusItem(plist_idx, i);
        g_metadb = plman.GetPlaylistFocusItemHandle(true);
   
        if(g_metadb){   
            count = parseInt(fb.TitleFormat("%play_count%").EvalWithMetadb(g_metadb));           
            if(count > max_pcount){max_pcount = count};
        }
    }
    plman.SetPlaylistFocusItem(plist_idx, 0);
}

function on_size(){
    ww = window.Width;
    wh = window.Height;
}
(скрипт демонстрационный, лишнее можно удалить)

Имеет-ли место быть такая фишка, не знаю :wink: .
Безымянный.jpg
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 10 лет 11 месяцев

Сообщение #167 kgena_ua » 01.11.2014, 10:11

Создаю плейлист с рейтингом, например, 5 (из "автоматического плейлиста"):

fb.CreateAutoPlaylist(idx, "rating", "(%rating% EQUAL 5 OR rating EQUAL 5)" ........

все вроде нормально, только создается плейлист с выборкой из всей библиотеки.
Если в автоплейлисте загружены альбомы одного исполнителя, то запрос

.... "(%rating% EQUAL 5 OR rating EQUAL 5) AND %artist% IS " + artist .....,
где artist = fb.TitleFormat("%artist%").

создает новый плейлист только с этим исполнителем, все нормально.
Как быть в случае, если в выбранных альбомах разные исполнители (тег "%artist%). Что-то типа:

"(%rating% EQUAL 5 OR rating EQUAL 5) AND активный плейлист или там, текущщий плейлист.....",
чтобы выбирал не из всей библиотеки.
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 10 лет 11 месяцев

Сообщение #168 Aum » 13.12.2014, 13:15

Запутался, может кто распутает? :smile:
Объявлен массив:
Код: Выделить всё
var MyButtons=[buttons.dir4, buttons.dir3, buttons.dir2, buttons.dir1];
далее хочу по условию работать с массивом, например укорачивать его:
Код: Выделить всё
if (fb.TitleFormat("%path%").EvalWithMetadb(g_focus_metadb).indexOf("://")==-1) {
MyButtons.length=3;
} else {
MyButtons.length=1;
}
И еще хочу, чтобы это все происходило по событию: например on_item_focus_change()
Код: Выделить всё
function deletemassive() {
    MyButtons.length = null;
        window.Repaint();
}
function on_item_focus_change() {
      g_focus_metadb = fb.GetFocusItem();
      deletemassive();
    window.Repaint();
}
Потом вывожу в on_paint строки массива - работает, но никак не получается заставить его обновлять длину по событию. Где туплю?
Aum M
Аватара
Репутация: 20
С нами: 14 лет

Сообщение #169 LUR » 13.12.2014, 14:26

Aum, по какому событию и где хотите обновлять длину? И длину чего? Массива?
LUR M
Модератор
Аватара
Откуда: Минск
Репутация: 367
С нами: 11 лет 4 месяца

Сообщение #170 Aum » 13.12.2014, 16:19

Да, длину масива (пробовал и другие методы работы с массивом - splice например-нужно будет удалить некоторые элементы массива при определенном условии, но не хватает функции обновления). Событие - on_item_focus_change():
Для полноты картины - скриптик "кнопки пути к файлу":
Спойлер
MF_STRING = 0x00000000;
MF_SEPARATOR = 0x00000800;
MF_POPUP = 0x00000010;

var WshShell = new ActiveXObject("WScript.Shell");
var g_move = null;
var Active_array = [];
var g_button_down = null;
var btn_dim_ready;
var btn;
var hover_button = null;
//var tooltip = window.CreateTooltip();
//tooltip.SetMaxWidth( 200 );



//window.GetProperty("mode",1);

var g_focus_metadb = fb.GetFocusItem();
var t_dir1 = fb.TitleFormat("%directory%");
var t_dir1_1 = fb.TitleFormat("%url%");
var t_dir2 = fb.TitleFormat("$directory(%path%,2)");
var t_dir3 = fb.TitleFormat("$directory(%path%,3)");
var t_dir4 = fb.TitleFormat("$directory(%path%,4)");
var t_dir5 = fb.TitleFormat("");



if ( utils.CheckFont( "Segoe UI" ) ) {
var font = gdi.Font("Segoe UI", 12);
} else {
var font = gdi.Font("Tahoma", 11);
}

buttons = {
dir4: new Button(0, 0, 13, 19, t_dir4, function() { WshShell.run("http://vk.com/") }),
dir3: new Button(0, 0, 13, 19, t_dir3, function() { fb.RunContextCommandWithMetadb ("Run service/Explore Directory Path 2 Up", fb.GetFocusItem()) }),
dir2: new Button(0, 0, 13, 19, t_dir2, function() { fb.RunContextCommandWithMetadb ("Run service/Explore Directory Path 1 Up", fb.GetFocusItem()) }),
dir1: new Button(0, 0, 13, 19, t_dir1, function() { fb.RunContextCommandWithMetadb ("Run service/Explore Directory", fb.GetFocusItem()) })
}



// var MyButtons;
// var MyButtons1;
// var MyButtons2;
// var MyButtons=[buttons.dir4, buttons.dir3, buttons.dir2, buttons.dir1];
// MyButtons1 = [buttons.dir4, buttons.dir3, buttons.dir2, buttons.dir1];
// MyButtons2 = [buttons.dir1];
// var MyButtons1 = [ [buttons.dir4, buttons.dir3, buttons.dir2, buttons.dir1], [buttons.dir1]];

var MyButtons=[buttons.dir4, buttons.dir3, buttons.dir2, buttons.dir1];
//var buttons_num = MyButtons.length;


if (fb.TitleFormat("%path%").EvalWithMetadb(g_focus_metadb).indexOf("://")==-1) {
MyButtons.length=4;
} else {
MyButtons.length=2;
}



function deleteArray() {
// MyButtons=null;
MyButtons.length = null;

window.Repaint();

}



function Button(x, y, w, h, name, func) {
this.name = name;
this.func = func;

this.traceMouse = function (x, y) {
var b = (this.left <= x) && (x <= this.right) && (this.top <= y) && (y <= this.bottom);
return b;
}

this.onClick = function ( x, y, name ) {
this.func && this.func( x, y, this.name );
}
}





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))
};

for (var i in MyButtons ) {
Active_array.push(MyButtons[i]);
}

function on_mouse_lbtn_down(x, y, mask) {
g_move = null;
g_button_down = 1;
window.Repaint();
}

function on_mouse_lbtn_up(x,y){

g_button_down = null;
if (hover_button) {
hover_button.onClick(x, y);
}
window.Repaint();

}

function trackbuttons(x,y){

for ( i in Active_array ) {
if ( Active_array[i].traceMouse(x, y) && btn != Active_array[i] ) {
btn = Active_array[i];
//fb.trace('repaint');
window.Repaint();
break;
}
}

return btn;
}


function on_item_focus_change() {
g_focus_metadb = fb.GetFocusItem();
deleteArray();
//MyButtons=null;


window.Repaint();

}

var hover_button = null;

function on_mouse_move(x, y) {
if ( !g_move ) {
window.SetCursor(32649);
g_move = 1;
}
hover_button = trackbuttons(x, y);
}

function on_mouse_leave() {
g_move = null;
hover_button = null;
g_button_down = null;
btn = null;
window.SetCursor( 32512 );
window.Repaint();
}

function on_paint(gr){


var ww = window.Width;
var wh = window.Height;
gr.FillSolidRect(0,0,ww,wh,RGB(227,237,248))
gr.SetTextRenderingHint(5);
gr.SetSmoothingMode(1);

var text_offset = 0, text_w = 0;

if ( !btn_dim_ready ) {
for ( var n=0; n<Active_array.length; n++ ) {
var text_ww;
text_offset += Math.min( n, 1) * text_w;
if (fb.GetFocusItem()) text_w = gr.CalcTextWidth(Active_array[n].name.EvalWithMetadb(g_focus_metadb), font) + 25;

if (text_ww>150) {text_w=150} else {text_ww=text_w}


Active_array[n].x = text_offset+10;
Active_array[n].y = 0;
Active_array[n].w = text_ww;
Active_array[n].h = wh;

Active_array[n].left = text_offset;
Active_array[n].top = Active_array[n].y;
Active_array[n].right = text_offset + text_ww;
Active_array[n].bottom = Active_array[n].y + Active_array[n].h;
}
// btn_dim_ready = 1;
}
if ( g_move != undefined && hover_button ) {
gr.FillGradRect(hover_button.x, hover_button.y+1, hover_button.w - 17, hover_button.h-3, 90, RGBA(246,249,252,250), RGBA(169,225,249,250), 1.0);
gr.DrawRect(hover_button.x, hover_button.y+1, hover_button.w - 17, hover_button.h-3, 1, RGBA(101,147,183,250));

}


if ( g_button_down != undefined && hover_button ) {
gr.FillGradRect(hover_button.x, hover_button.y+1, hover_button.w - 17, hover_button.h-3, 90, RGBA(246,249,252,200), RGBA(169,225,249,200), 1.0);
gr.DrawRect(hover_button.x, hover_button.y+1, hover_button.w - 17, hover_button.h-3, 1, RGBA(101,147,183,250));

}



for ( var n=0; n<Active_array.length; n++ ) {
if ( g_move != undefined && hover_button ) {
//var image = gdi.Image( fb.FoobarPath + "\\themes\\7\\" + "arrow_hover.png" );

} else {
// var image = gdi.Image( fb.FoobarPath + "\\themes\\7\\" + "arrow.png" );
}
var image = gdi.Image( fb.FoobarPath + "\\themes\\7\\" + "arrow.png" );
if ( image && fb.GetFocusItem()) gr.DrawImage( image, Active_array[n].x-15, Active_array[n].y, image.Width, image.Height, 0, 0, image.Width, image.Height, 0, 255);
var button_w;
//button_w=text_w;
if (Active_array[n].w>150) {button_w=150} else {button_w=Active_array[n].w}
if (fb.GetFocusItem()) gr.GdiDrawText(Active_array[n].name.EvalWithMetadb(g_focus_metadb), font, RGB(41,71,109),Active_array[n].x+5, Active_array[n].y, button_w, Active_array[n].h, 0x00000000 | 0x00000004 | 0x00000020 | 0x00000400);

}

}

//Preferences
function on_mouse_rbtn_down(x, y) {
var basemenu = window.CreatePopupMenu();
var ret;


// basemenu.AppendMenuItem(MF_STRING, 0, "Focus settings");
// basemenu.AppendMenuItem(MF_SEPARATOR, 0, 0);
//basemenu.AppendMenuItem(MF_STRING, 2, "Now playing");
//basemenu.AppendMenuItem(MF_STRING, 1, "Follow cursor");
// basemenu.CheckMenuRadioItem(1, 2, window.GetProperty("mode"));


var ret = basemenu.TrackPopupMenu(x, y);
if (ret == 0) return;
switch (ret) {
case 1:
//g_focus_metadb= fb.GetFocusItem();
break;
case 2:
//g_focus_metadb= fb.GetFocusItem();
break;

basemenu.Dispose();
}
}
При выборе нового трека в плейлисте нужно обновить длину масива с учетом условия
Aum M
Аватара
Репутация: 20
С нами: 14 лет

Сообщение #171 LUR » 13.12.2014, 17:42

Aum, у меня ваш скрипт не компилится, он полный? И вобще, что хотите сделать то я не понял?
LUR M
Модератор
Аватара
Откуда: Минск
Репутация: 367
С нами: 11 лет 4 месяца

Сообщение #172 Aum » 13.12.2014, 21:11

Проверил скрипт на другом фубаре-все гуд. еще раз приложил. Что хочу: скрипт отображает путь к выбраному в плейлисте файлу в виде кнопок. Хочу чтоб при выборе в плейлисте радио (в скрипт ввел соответствующее условие), отображался вместо стандартного массива из 4 директорий, массив из 1 тега-ссылки %url% (это на данный момент, потом усложню условия:). В чем загвоздка: при выборе нового трека в плейлисте, а именно после простого файла на ХДД выбераем радио поток, скрипт не срабатывает и не рисует по условию(условие: если выбранный трек содержит "http", то выводим один массив (или одну его длину), если нет, то другой), но по факту нужно только нажать настройки и применить, тогда срабатывает обновление. Как-то так :smile:
Вложения
путь_ф.txt
(6.78 КБ) Скачиваний: 756
Aum M
Аватара
Репутация: 20
С нами: 14 лет

Сообщение #173 kgena_ua » 25.12.2014, 22:50

"Бегущая" строка. Пока только для %title%

Код: Выделить всё
function RGB(r,g,b) { return (0xff000000|(r<<16)|(g<<8)|(b)); }

var font = gdi.Font("arial",12,0);
var ww,wh;

var txt_row = 1;
var step = 0;
var text2, text2_width, dir;

function on_paint(gr) {   
    gr.FillSolidRect (0, 0, ww, wh, RGB(30,30,30));
   
    text2 = fb.TitleFormat("%title%").Eval();
    text2_width = gr.CalcTextWidth(text2, font);
    if (step + text2_width >= ww) {dir = "left"};
    if (step <= 0) {dir = "right"};

    gr.GdiDrawText( text2, font, RGB(200,200,200), step, txt_row, ww , wh, 0x00008000);
}

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

var seek_timer;
function on_playback_new_track(info) {
    seek_timer && window.ClearInterval(seek_timer);
    seek_timer = window.SetInterval(function() {
    if (text2_width < ww) {
        if (dir == "right") {step = step + 1};
        if (dir == "left") {step = step - 1};
    } else {
        step = 0;
    }
    window.Repaint();

    },30 );


function on_playback_stop(reason) {
    if(reason == 0) {
        window.ClearInterval(seek_timer);
        window.Repaint();
    }
}
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 10 лет 11 месяцев

Сообщение #174 Xant1k » 26.12.2014, 18:34

А есть скриптик ползунка Volume наподобие Изображение чтоб картинку просто подставил и он работал?
Xant1k M
Репутация: 5
С нами: 14 лет

Сообщение #175 kgena_ua » 26.12.2014, 20:09

Опять "бегущая" строка. :smile:
Добавлено:
- при длине строки больше чем окно (ww), движение вправо до начала строки и влево до окончания строки;
- выбор отображаемых значений через меню;
Безымянный.png
Безымянный.png (3.59 КБ) Просмотров: 12246

Движение плавное.
Код: Выделить всё
function RGB(r,g,b) { return (0xff000000|(r<<16)|(g<<8)|(b)); }

var font = gdi.Font("arial",11,1);
var ww,wh;

var txt_row = 1;
var s = 10, step = s;
var t, t_width, dir, mode;
var t1 = "", t1_width = 0;
var t2 = "", t2_width = 0;
var t3 = "", t3_width = 0;
var show1, show2, show3;

function on_paint(gr) {   
    gr.FillSolidRect (0, 0, ww, wh, RGB(30,30,30));
   
    show1 = window.GetProperty("show1",1);
    show2 = window.GetProperty("show2",1);
    show3 = window.GetProperty("show3",1);
   
    if(show1 == 1) {
        t1 = fb.TitleFormat("[%title%]").Eval();
        t1_width = gr.CalcTextWidth(t1, font);
    } else {
        t1 = ""; t1_width = 0;
    }

    if(show2 == 1) {
        t2 = fb.TitleFormat("$upper([  ▪  %artist%])").Eval();
        t2_width = gr.CalcTextWidth(t2, font);
    } else {
        t2 = ""; t2_width = 0;
    }

    if(show3 == 1) {
        t3 = fb.TitleFormat("$upper([  ▪  %album%])[.%date%]").Eval();
        t3_width = gr.CalcTextWidth(t3, font);
    } else {
        t3 = ""; t3_width = 0;
    }
   
    t = t1 + t2 + t3;
    t_width = gr.CalcTextWidth(t, font);
   
    if (t_width <= ww) {
        if (step + t_width >= ww - s) {dir = "left"};
        if (step <= 0 + s) {dir = "right"};
    } else {
        if (step + t_width <= ww - s) {dir = "right"};
        if (step >= 0 + s) {dir = "left"};
    }

    gr.GdiDrawText( t1, font, RGB(255,255,255), step, txt_row, t_width , wh);
    gr.GdiDrawText( t2, font, RGB(150,150,150), step + t1_width, txt_row, t_width , wh);
    gr.GdiDrawText( t3, font, RGB(220,220,220), step + t1_width + t2_width, txt_row, t_width , wh);
}

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

var seek_timer;
function on_playback_new_track(info) {
    seek_timer && window.ClearInterval(seek_timer);
    seek_timer = window.SetInterval(function() {
        if (dir == "right") {step = step + 1};
        if (dir == "left") {step = step - 1};
    window.Repaint();

    }, 50 );


function on_playback_stop(reason) {
    if(reason == 0) {
        window.ClearInterval(seek_timer);
        step = s;
        window.Repaint();
    }
}

function on_playback_time(){
    if(!seek_timer) on_playback_new_track();
    window.Repaint();
}

function on_mouse_lbtn_up (x, y){      
    var _menu = window.CreatePopupMenu();
    var i = 1;
   
    _menu.AppendMenuItem(0x00000000, i++, "title");
    _menu.CheckMenuItem(i-1, show1);   
    _menu.AppendMenuItem(0x00000000, i++, "artist");
    _menu.CheckMenuItem(i-1, show2);   
    _menu.AppendMenuItem(0x00000000, i++, "album");
    _menu.CheckMenuItem(i-1, show3);

    ret = _menu.TrackPopupMenu(x, y);
    if (ret == 0) return;

    switch (ret) {
    case 1:
        window.SetProperty("show1", show1 == 0 ? 1 : 0);
        break;
    case 2:
        window.SetProperty("show2", show2 == 0 ? 1 : 0);
        break;
    case 3:
        window.SetProperty("show3", show3 == 0 ? 1 : 0);
        break;
    }
    _menu.Dispose();
    return true;
}
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 10 лет 11 месяцев

Сообщение #176 kgena_ua » 31.12.2014, 12:27

Опять "бегущая" строка. :smile: Не пинайте.
Небольшие исправления.
Добавлено:
кроме "колебательного" движения влево - вправо, поступательное движение справа налево. Переключение через меню.
Работает для ИРадио.
Код: Выделить всё
function RGB(r,g,b) { return (0xff000000|(r<<16)|(g<<8)|(b)); }

var font = gdi.Font("arial",11,1);
var ww,wh;

var txt_row = 3;
var s = 10, step = window.Width, step2 = window.Width;
var t, t_width, dir, mode, sw = 1;
var t1 = "", t2 = "", t3 = "";
var show1, show2, show3;

function on_paint(gr) { 
   
    gr.FillSolidRect (0, 0, ww, wh, RGB(30,30,30));
   
    show1 = window.GetProperty("show1",1);
    show2 = window.GetProperty("show2",1);
    show3 = window.GetProperty("show3",1);
    mode = window.GetProperty("mode",1);
   
    if (show1 == 1) {t1 = fb.TitleFormat("$upper([%title%])").Eval();
    } else {t1 = "";}

    if (show2 == 1) {t2 = fb.TitleFormat("$upper([%artist%])").Eval();
    } else {t2 = "";}

    if (show3 == 1) {t3 = fb.TitleFormat("$upper([%album%])[ ▪ %date%]").Eval();
    } else {t3 = "";}
   
    t = t1 + (show1 > 0 && t2 != "" ? "  ▪  " : "") + t2 + ((show1 > 0 || show2 > 0) && t3 != "" ? "  ▪  " : "") + t3;
    t_width = gr.CalcTextWidth(t, font);
   
    if (mode == 1) {
        if (t_width < ww - s * 2) {
            if (step >= ww) {dir = "left"; step = ww };
            if (step + t_width >= ww - s) {dir = "left"};
            if (step <= 0 + s) {dir = "right"};
        } else {
            if (step + t_width <= ww - s) {dir = "right"};
            if (step >= 0 + s) {dir = "left"};
        }
    }
    if (mode == 0) { dir = "left";
        if (sw == 1) {
            if (step + t_width > ww/2) {step2 = ww};
            if (step + t_width <= 0) {step = ww; sw = 2};

        } else {
            if (step2 + t_width > ww/2) {step = ww};
            if (step2 + t_width <= 0) {step2 = ww; sw = 1};
        }
    }

    gr.GdiDrawText( t, font, RGB(200,200,200), step, txt_row, t_width, wh);
   
    if (mode == 0) {
        gr.GdiDrawText( t, font, RGB(200,200,200), step2, txt_row, t_width, wh);
    }
//    gr.GdiDrawText(step + "   " + dir + "   " + sw + "   " + step2 + "  " + mode, font, RGB(255,255,200), 100, txt_row, ww , wh, 0);   
}

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

var seek_timer;
function on_playback_new_track(info) {
    seek_timer && window.ClearInterval(seek_timer);
    seek_timer = window.SetInterval(function() {
        if (dir == "right") {step = step + 1};
        if (dir == "left") {step = step - 1};
        if (dir == "left") {step2 = step2 - 1};
    window.Repaint();
    }, 50 );
}

function on_playback_stop() {
    window.ClearInterval(seek_timer);
    window.Repaint();
}

function on_playback_time(){
    if(!seek_timer) on_playback_new_track();
}

function on_mouse_lbtn_up (x, y){     
    var _menu = window.CreatePopupMenu();
    var i = 1;
   
    _menu.AppendMenuItem(0x00000000, i++, "title");
    _menu.CheckMenuItem(i-1, show1);   
    _menu.AppendMenuItem(0x00000000, i++, "artist");
    _menu.CheckMenuItem(i-1, show2);   
    _menu.AppendMenuItem(0x00000000, i++, "album");
    _menu.CheckMenuItem(i-1, show3);
    _menu.AppendMenuItem(0x00000000, i++, "mode: " + (mode == 0 ? "L-R" : "L"));

    ret = _menu.TrackPopupMenu(x, y);
    if (ret == 0) return;

    switch (ret) {
    case 1:
        window.SetProperty("show1", show1 == 0 ? 1 : 0);
        break;
    case 2:
        window.SetProperty("show2", show2 == 0 ? 1 : 0);
        break;
    case 3:
        window.SetProperty("show3", show3 == 0 ? 1 : 0);
        break;
    case 4:
        window.SetProperty("mode", mode == 0 ? 1 : 0);
        break;
    }
    _menu.Dispose();
    return true;
}
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 10 лет 11 месяцев

Сообщение #177 AHAPXICT » 31.12.2014, 14:08

kgena_ua, спасибо. Не заметил раньше, нужный скрипт. Уже поставил вместо wsh пикметра, всё равно им не пользуюсь)))
С Наступающим! :beer:
Вложения
бегущая.png
бегущая.png (6.67 КБ) Просмотров: 12164
AHAPXICT M
Аватара
Откуда: Киев
Репутация: 252
С нами: 10 лет 4 месяца

Сообщение #178 kgena_ua » 31.12.2014, 14:35

AHAPXICT, И вас с Наступающим. Если будет желание, попробуйте такой срипт (изменения) для function on_paint(gr) - плавный переход при изменении режима:
Код: Выделить всё
function RGB(r,g,b) { return (0xff000000|(r<<16)|(g<<8)|(b)); }

var font = gdi.Font("arial",11,1);
var ww,wh;

var txt_row = 3;
var s = 10, step = window.Width, step2 = window.Width;
var t, t_width, dir, mode, sw = 1;
var t1 = "", t2 = "", t3 = "";
var show1, show2, show3;

function on_paint(gr) { 
   
    gr.FillSolidRect (0, 0, ww, wh, RGB(30,30,30));
   
    show1 = window.GetProperty("show1",1);
    show2 = window.GetProperty("show2",1);
    show3 = window.GetProperty("show3",1);
    mode = window.GetProperty("mode",1);
   
    if (show1 == 1) {t1 = fb.TitleFormat("$upper([%title%])").Eval();
    } else {t1 = "";}

    if (show2 == 1) {t2 = fb.TitleFormat("$upper([%artist%])").Eval();
    } else {t2 = "";}

    if (show3 == 1) {t3 = fb.TitleFormat("$upper([%album%])[ ▪ %date%]").Eval();
    } else {t3 = "";}
   
    t = t1 + (show1 > 0 && t2 != "" ? "  ▪  " : "") + t2 + ((show1 > 0 || show2 > 0) && t3 != "" ? "  ▪  " : "") + t3;
    t_width = gr.CalcTextWidth(t, font);
   
    if (mode == 1) {
        stp = sw == 1 ? step : step2;
        if (sw == 1) {step2 = ww};
        if (sw == 2) {step = ww};
        if (t_width < ww - s * 2) {
            if (stp >= ww) {dir = "left"; stp = ww };
            if (stp + t_width >= ww - s) {dir = "left"};
            if (stp <= 0 + s) {dir = "right"};
        } else {
            if (stp + t_width <= ww - s) {dir = "right"};
            if (stp >= 0 + s) {dir = "left"};
        }
    }
    if (mode == 0) { dir = "left";
        if (sw == 1) {
            if (step + t_width > ww/2) {step2 = ww};
            if (step + t_width <= 0) {step = ww; sw = 2};

        } else {
            if (step2 + t_width > ww/2) {step = ww};
            if (step2 + t_width <= 0) {step2 = ww; sw = 1};
        }
    }

    gr.GdiDrawText( t, font, RGB(200,200,200), step, txt_row, t_width, wh);
    gr.GdiDrawText( t, font, RGB(200,200,200), step2, txt_row, t_width, wh);
//    gr.GdiDrawText(step + "   " + dir + "   " + sw + "   " + step2 + "  " + mode, font, RGB(255,255,200), 100, txt_row + 4, ww , wh, 0);   
}

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

var seek_timer;
function on_playback_new_track(info) {
    seek_timer && window.ClearInterval(seek_timer);
    seek_timer = window.SetInterval(function() {
        if (dir == "right") {step = step + 1};
        if (dir == "right") {step2 = step2 + 1};
        if (dir == "left") {step = step - 1};
        if (dir == "left") {step2 = step2 - 1};
    window.Repaint();

    }, 50 );
}

function on_playback_stop() {
    window.ClearInterval(seek_timer);
    window.Repaint();
}

function on_playback_time(){
    if(!seek_timer) on_playback_new_track();
}

function on_mouse_lbtn_up (x, y){     
    var _menu = window.CreatePopupMenu();
    var i = 1;
   
    _menu.AppendMenuItem(0x00000000, i++, "title");
    _menu.CheckMenuItem(i-1, show1);   
    _menu.AppendMenuItem(0x00000000, i++, "artist");
    _menu.CheckMenuItem(i-1, show2);   
    _menu.AppendMenuItem(0x00000000, i++, "album");
    _menu.CheckMenuItem(i-1, show3);
    _menu.AppendMenuItem(0x00000000, i++, "mode: " + (mode == 0 ? "L-R" : "L"));

    ret = _menu.TrackPopupMenu(x, y);
    if (ret == 0) return;

    switch (ret) {
    case 1:
        window.SetProperty("show1", show1 == 0 ? 1 : 0);
        break;
    case 2:
        window.SetProperty("show2", show2 == 0 ? 1 : 0);
        break;
    case 3:
        window.SetProperty("show3", show3 == 0 ? 1 : 0);
        break;
    case 4:
        window.SetProperty("mode", mode == 0 ? 1 : 0);
        break;
    }
    _menu.Dispose();
    return true;
}
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 10 лет 11 месяцев

Сообщение #179 zamar81 » 04.01.2015, 19:57

macarych:нарыл несколько букварей по WSH, но ни один до конца так и не дочитал. Казалось, это долго - планомерное изучение, быстрее - потыкл туда, сюда, что-нибудь получится... Так и остался недоучкой.https://www.dropbox.com/s/a5m2xrnflj99yit/WSH.zip?dl=0Возможно пригодится тому у кого больше терпения и желания.
Ссылка умерла, перезалейте плс.

macarych:Для скачивания обложек надо добавить WSH-панель с кодом который приведен ниже, при этом в папке плеера должна быть папка "marc2003", ее можно взять в сборке "neutron".

А для темы DarkOne и её мода от Анархiст подойдёт этот скрипт, или его надо как-то править? И папка marc2003 тоже нужна? Как сделать, чтобы найденные в инете обложки низкого разрешения сохранялись в папку диска или альбома, проигрываемого в данный момент? Вообще, для добавки этой фичи надо создать новый скин на основе одного из включенных? Но в нынешних скинах обложки чередуются - как сохранить этот подход в новом скине с обложками, скачанными из инета?

Также хотелось бы, чтобы в дополнение к Cover Panel для текущей песни, одновременно искались, сохранялись и авто подставлялись в панель текущего списка-плейлиста скачанные из инета обложки или фотки исполнителей (взятые из био) всех его песен, если их нет в папке диска или дисков, из которых скомпонован плейлист.

Порекомендуйте ссылку на сборку, желательно на основе DarkOne или любую если нет такой, где уже реализована подобная докачка обложек дисков из инета?
zamar81
Репутация: 0
С нами: 9 лет 2 месяца

Сообщение #180 kgena_ua » 05.01.2015, 14:22

AHAPXICT, а есть-ли смысл добавить в "бегущую строку" вывод info : encoding, codec, codec_profile и т.д.
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 10 лет 11 месяцев

Пред.След.

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