Скрипты для foo_uie_wsh_panel_mod

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

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

Сообщение #2161 vladj » 12.02.2018, 22:35

Название в скрипте в строке 246...
["$info(mp3_stereo_mode)", "Режим стерео MP3"],
то, что в скобках выводится при показе на англ яз, то что в кавычках при показе на русском. Подкорректируй например (mp3 mode), "Режим MP3".
Некоторые не нужные можно закомментировать двойным слэшем что-бы не показывались. После каждого изменения применяем (кнопка Apply) внизу.
Желательно перед играми со скриптом забэкапить его, т.е. внизу Экспорт и сохраняешь в удобном месте. Напортачишь, восстановишся сделав Ипорт.
У меня вообще ужато до нужного мне минимума все и полная панель инфы...
ScreenShot04.jpg
ScreenShot04.jpg (120.85 КБ) Просмотров: 1071
HTPC Termaltake, eGlobal i5-7200, Asrock Beebox J3160, Onkyo 525E, цап SMSL, фронт Yamaha 8900.
vladj M
Гуру
Аватара
Откуда: Пермский край
Репутация: 334
С нами: 8 лет 2 месяца

Сообщение #2162 stalk:er » 13.02.2018, 10:09

vladj, нет так нельзя корректировать - строка сразу пропадает. Это правится где-то в другом месте...
"СПАСИБЫ" принимаются плюсами в репутацию ;)
stalk:er M
Бывалый
Аватара
Возраст: 40
Откуда: Санкт-Петербург
Репутация: 5
С нами: 11 лет 1 месяц

Сообщение #2163 vladj » 13.02.2018, 13:27

Так уж принципиально иметь названия на английском ? Вот заделал на русском...
ScreenShot10.jpg
ScreenShot10.jpg (53.22 КБ) Просмотров: 1029
HTPC Termaltake, eGlobal i5-7200, Asrock Beebox J3160, Onkyo 525E, цап SMSL, фронт Yamaha 8900.
vladj M
Гуру
Аватара
Откуда: Пермский край
Репутация: 334
С нами: 8 лет 2 месяца

Сообщение #2164 stalk:er » 13.02.2018, 16:44

vladj, аха ))
"СПАСИБЫ" принимаются плюсами в репутацию ;)
stalk:er M
Бывалый
Аватара
Возраст: 40
Откуда: Санкт-Петербург
Репутация: 5
С нами: 11 лет 1 месяц

Сообщение #2165 kgena_ua » 13.02.2018, 17:28

stalk:er писал(а):mp3 mode подвинуть текст влево
Для чего.
stalk:er писал(а):подскажите как реализовать с помощью скипта
т.е. так
Безымянный.png
Безымянный.png (3.13 КБ) Просмотров: 996
I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Гуру
Аватара
Возраст: 54
Откуда: Украина, Днепр
Репутация: 390
С нами: 5 лет

Сообщение #2166 vladj » 13.02.2018, 19:10

А где выставляется расстояние между item name и item value и как убрать этот "автозазор" между ними ?
При любом изменении какого-то значения и применения они приближаются почти так, как нужно, но потом value "отскакивает" правей.
HTPC Termaltake, eGlobal i5-7200, Asrock Beebox J3160, Onkyo 525E, цап SMSL, фронт Yamaha 8900.
vladj M
Гуру
Аватара
Откуда: Пермский край
Репутация: 334
С нами: 8 лет 2 месяца

Сообщение #2167 kgena_ua » 13.02.2018, 19:16

["$info(mp3_stereo_mode)", "Режим стерео MP3"],

"$info(mp3_stereo_mode)" - изменять нельзя, 'этот (эти) элементы массива необходимы значений.

для примера:

field = "$info(mp3_stereo_mode)";
fb.TitleFormat("[" + field + "]").EvalWithMetadb(metadb);

А на экране отображается этот-же элемент, только "очищенный от ненужных символов."
Т.е. было так $info(mp3_stereo_mode) - столо так mp3 stereo mode
I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Гуру
Аватара
Возраст: 54
Откуда: Украина, Днепр
Репутация: 390
С нами: 5 лет

Сообщение #2168 vladj » 13.02.2018, 19:46

Да он с этим разобрался перейдя на русский, а там в item name можно хоть что написать. Наверное вставляет скрипт в узкую панель и длина (количество букв) в item name для него критично.
HTPC Termaltake, eGlobal i5-7200, Asrock Beebox J3160, Onkyo 525E, цап SMSL, фронт Yamaha 8900.
vladj M
Гуру
Аватара
Откуда: Пермский край
Репутация: 334
С нами: 8 лет 2 месяца

Сообщение #2169 kgena_ua » 13.02.2018, 19:52

vladj писал(а):А где выставляется расстояние между item name и item value и как убрать этот "автозазор" между ними ?
vladj, привет.
Расстояние между item name и item value вычисляется автоматически.
Код: Выделить всё
        if (value && value != 0 && !group){
            tmp = lang == 0 ? clear_item_name(tfname[j][0]) : tfname[j][1];
            tmp_t_x2 = calc_text_data("w", tmp, font_item_name);
            t_x2 = tmp_t_x2 > t_x2 ? tmp_t_x2 : t_x2;
        }


Т.е. координата t_x2 для item value равна максимальному значению ширины item name + 10.

vladj писал(а):При любом изменении какого-то значения и применения они приближаются почти так, как нужно, но потом value "отскакивает" правей.

Если появляется item value, у которого ширина текста item name больше чем была до этого, происходит сдвиг вправо. Чаще это наблюдается, когда подтягиваются данные с LastFM (немного с запозданием), там длинные строки для item name.

В любом случае можно отключить автоматический расчет координаты для item valu.
Наведя курсор мыши на item value при нажатой клавише Shift, можно, нажав лев.кл.мыши, сдвинуть весь текст (колонку) влево или вправо.

Для включения "авторасчета" - поставить галочку в меню.

Безымянный.png
Безымянный.png (1.66 КБ) Просмотров: 961
I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Гуру
Аватара
Возраст: 54
Откуда: Украина, Днепр
Репутация: 390
С нами: 5 лет

Сообщение #2170 stalk:er » 13.02.2018, 20:58

kgena_ua писал(а):т.е. так
kgena_ua, вечер добрый!
Да!

Добавлено спустя 1 минуту 56 секунд:
vladj писал(а):Да он с этим разобрался перейдя на русский, а там в item name можно хоть что написать. Наверное вставляет скрипт в узкую панель и длина (количество букв) в item name для него критично.
На русский не переходил ))

Добавлено спустя 4 минуты 37 секунд:
kgena_ua писал(а):Если появляется item value, у которого ширина текста item name больше чем была до этого, происходит сдвиг вправо. Чаще это наблюдается, когда подтягиваются данные с LastFM (немного с запозданием), там длинные строки для item name.

В любом случае можно отключить автоматический расчет координаты для item valu.
Наведя курсор мыши на item value при нажатой клавише Shift, можно, нажав лев.кл.мыши, сдвинуть весь текст (колонку) влево или вправо.

Для включения "авторасчета" - поставить галочку в меню.

Спасибо за подсказку ))

Добавлено спустя 11 минут 27 секунд:
А можно уменьшить расстояние между текстом, например: 320 kbps

По мне так нужно уменьшить расстояние между "320" и "kbps" на один пробел... Это моно сделать, а то не нашёл где.

Добавлено спустя 12 минут 53 секунды:
kgena_ua, а как сделать строку: Качество - MP3 : 320 kbps?
"СПАСИБЫ" принимаются плюсами в репутацию ;)
stalk:er M
Бывалый
Аватара
Возраст: 40
Откуда: Санкт-Петербург
Репутация: 5
С нами: 11 лет 1 месяц

Сообщение #2171 kgena_ua » 14.02.2018, 11:06

stalk:er писал(а):По мне так нужно уменьшить расстояние между "320" и "kbps" на один пробел...
стр.523(может у меня уже другая, можно по поиску найти):
Код: Выделить всё
            value = value + (m_text ? "  " + m_text : "");
стояло два пробела
value = value + (m_text ? " изменять тут " + m_text : "");
stalk:er писал(а):а как сделать строку: Качество - MP3 : 320 kbps?
stalk:er, где ? :smile:
I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Гуру
Аватара
Возраст: 54
Откуда: Украина, Днепр
Репутация: 390
С нами: 5 лет

Сообщение #2172 stalk:er » 14.02.2018, 12:06

kgena_ua писал(а):stalk:er, где ?
в WSH Panel Mod, просто у Вас каждый параметр отдельно, хотел объеденить в одну строку.
"СПАСИБЫ" принимаются плюсами в репутацию ;)
stalk:er M
Бывалый
Аватара
Возраст: 40
Откуда: Санкт-Петербург
Репутация: 5
С нами: 11 лет 1 месяц

Сообщение #2173 kgena_ua » 14.02.2018, 18:39

stalk:er писал(а):в WSH Panel Mod
Я так понимаю в Properties & properties file (ml) - нет.

Вот заказанный Вами скриптик.
Безымянный.png
Безымянный.png (3.07 КБ) Просмотров: 843

Код: Выделить всё
// ==PREPROCESSOR==
// @feature "v1.4"
// @feature "watch-metadb"
// ==/PREPROCESSOR==

function RGB(r,g,b) { return (0xff000000|(r<<16)|(g<<8)|(b)); }
var font = gdi.Font("arial", 12, 0);
var ww = 0, wh = 0;

DT_CENTER = 0x00000001;

ColorTypeCUI = {
    text: 0,
    selection_text: 1,
    inactive_selection_text: 2,
    background: 3,
    selection_background: 4,
    inactive_selection_background: 5,
    active_item_frame: 6
};

ColorTypeDUI = {
   text: 0,
   background: 1,
   highlight: 2,
   selection: 3
};

var bgcolor, color1, colo2;

function get_color(){   
    if (window.InstanceType == 0){
        bgcolor = window.GetColorCUI(ColorTypeCUI.background);
        color1 = window.GetColorCUI(ColorTypeCUI.text);
        color2 = window.GetColorCUI(ColorTypeCUI.inactive_selection_text);
    } else if (window.InstanceType == 1) {
        bgcolor = window.GetColorDUI(ColorTypeDUI.background);
        color1 = window.GetColorDUI(ColorTypeDUI.text);
        color2 = window.GetColorDUI(ColorTypeDUI.highlight);
    }
    window.Repaint();
}

get_color();

function on_colors_changed(){
    get_color();
}

var pbt_remaining, length, bitrate, samplerate, codec, codec_profile;

var metadb;
on_item_focus_change();

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

    h_text = gr.CalcTextHeight("Text", font) * 3;
    y_text = wh / 2 - h_text / 2;

    text1 = pbt_remaining + (pbt_remaining ? " / " : "") + length;
    text2 = bitrate + " kbps : " + samplerate / 1000 + " Hz";
    text3 = codec + (codec_profile ? " (" + codec_profile + ")" : "");

    gr.GdiDrawText( text1, font, color1, 0, y_text, ww, wh, DT_CENTER );
    gr.GdiDrawText( "\n" + text2, font, color2, 0, y_text, ww, wh, DT_CENTER );
    gr.GdiDrawText( "\n\n" + text3, font, color1, 0, y_text, ww, wh, DT_CENTER );
}

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

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_selection_changed(metadb) {
   on_item_focus_change();
}

function on_playback_time(time) {
    on_item_focus_change();
}

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

function on_metadb_changed() {
    bitrate = Eval("$info(bitrate)");
    codec_profile = Eval("$info(codec_profile)");
    codec = Eval("%codec%");
    samplerate = Eval("$info(samplerate)");
    pbt_remaining = fb.TitleFormat("[%playback_time_remaining%]").Eval();
    length = Eval("%length%");
    window.Repaint();
}

function Eval(field) {
    return fb.TitleFormat("[" + field + "]").EvalWithMetadb(metadb);
}

I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Гуру
Аватара
Возраст: 54
Откуда: Украина, Днепр
Репутация: 390
С нами: 5 лет

Сообщение #2174 stalk:er » 14.02.2018, 19:23

kgena_ua писал(а):Я так понимаю в Properties & properties file (ml) - нет.
Именно так, чтобы инфа была такого вида - MP3 (VBR) : 320 kbps, Joint Stereo
А так же частоту привести к виду - 44.1 kHz

P.S.: За скрипт отдельное спасибо
"СПАСИБЫ" принимаются плюсами в репутацию ;)
stalk:er M
Бывалый
Аватара
Возраст: 40
Откуда: Санкт-Петербург
Репутация: 5
С нами: 11 лет 1 месяц

Сообщение #2175 stalk:er » 15.02.2018, 21:25

Как сделать разный текст, как в Вашей сборке?
Безымянный.png
Безымянный.png (1.37 КБ) Просмотров: 767
"СПАСИБЫ" принимаются плюсами в репутацию ;)
stalk:er M
Бывалый
Аватара
Возраст: 40
Откуда: Санкт-Петербург
Репутация: 5
С нами: 11 лет 1 месяц

Сообщение #2176 Marakobes » 15.02.2018, 21:29

kgena_ua, приветствую, а есть возможность реализовать HTML Viewer, т.е. просмотр подобных файлов в отдельной панели? Я часто сохраняю описание альбома в папке с аудиофайлами в формате .mht, было бы шикарно просматривать их прямо в F2K
Marakobes
Новичок
Репутация: 0
С нами: 5 лет 8 месяцев

Сообщение #2177 Aliado_71 » 16.02.2018, 18:13

kgena_ua, Приветствую :hi: , стоит ли ожидать обновления ваших замечательных скриптов под новую js_panel 2.X.X
PS Кнопочки работают :smile: рейтинг - нет :cry:
Aliado_71 M
Бывалый
Аватара
Возраст: 47
Откуда: Украина, Донецк
Репутация: 58
С нами: 3 года 1 месяц

Сообщение #2178 stalk:er » 16.02.2018, 21:53

Aliado_71 писал(а):kgena_ua, Приветствую , стоит ли ожидать обновления ваших замечательных скриптов под новую js_panel 2.X.X
PS Кнопочки работают рейтинг - нет

А что есть портированные скрипты? ))
"СПАСИБЫ" принимаются плюсами в репутацию ;)
stalk:er M
Бывалый
Аватара
Возраст: 40
Откуда: Санкт-Петербург
Репутация: 5
С нами: 11 лет 1 месяц

Сообщение #2179 AHAPXICT » 16.02.2018, 23:19

Aliado_71, там по мелочи нужно заменить, вчера занимался своим скриптом, переделывал под новую JS по примерам Марка ну и для примера брал скрипт kgena_ua для версии js 2.0.3.
Код: Выделить всё
// ==PREPROCESSOR==
// @name "Rating & File attributes (JScript Panel)"
// @author "kgena_ua"
// @version "12112017"
// @feature "v1.4"
// @feature "watch-metadb"
// ==/PREPROCESSOR==

// foo_playcount.dll required

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

function RGBA_color(c) {
    return RGBA(getRed(c), getGreen(c), getBlue(c), b_hover_alpha);
}

var font_name = window.GetProperty(" text: font name", "Arial");
var font_size = window.GetProperty(" text: font size", 10);
var font_style = window.GetProperty(" text: font style", 0);

var font;
get_font();

function get_font(){
    font = gdi.Font(font_name, font_size, font_style);
}

var ww, wh;

var fso = new ActiveXObject("Scripting.FileSystemObject");

DT_LEFT = 0x00000000;
DT_CENTER = 0x00000001;
DT_VCENTER = 0x00000004;
DT_SINGLELINE = 0x00000020;
DT_WORD_ELLIPSIS = 0x00040000;

MF_ENABLED = 0x00000000;   
MF_GRAYED = 0x00000001;
MF_SEPARATOR = 0x00000800;

IDC_HAND = 32649;
IDC_ARROW = 32512;

ColorTypeCUI = {
    text: 0,
    selection_text: 1,
    inactive_selection_text: 2,
    background: 3,
    selection_background: 4,
    inactive_selection_background: 5,
    active_item_frame: 6
}

ColorTypeDUI = {
   text: 0,
   background: 1,
   highlight: 2,
   selection: 3
}

function get_color(){   
    if (window.InstanceType == 0){
        bgcolor = window.GetColourCUI(ColorTypeCUI.background);
        color1 = window.GetColourCUI(ColorTypeCUI.text);
        color2 = window.GetColourCUI(ColorTypeCUI.selection_text);
        color_error = RGB(255,100,0);
    } else if (window.InstanceType == 1) {
        bgcolor = window.GetColourDUI(ColorTypeDUI.background);
        color1 = window.GetColourDUI(ColorTypeDUI.text);
        color2 = window.GetColourDUI(ColorTypeDUI.highlight);
        color_error = RGB(255,100,0);
    }
    window.Repaint();
}

get_color();

function on_colors_changed(){
    get_color();
}

String.prototype.repeat = function(n) {
    return new Array(n + 1).join(this);
}

window.SetProperty(" - user", "");
if (window.GetProperty(" - user") != "" ) window.SetProperty(" - user", "");
window.SetProperty("-".repeat(50), "");
if (window.GetProperty("-".repeat(50)) != "" ) window.SetProperty("-".repeat(50), "");

var rating = 0, TAGrating, DBrating, nrating = 0;
var rating_mode = window.GetProperty("rating_mode", 0);
var set_rating_5 = window.GetProperty("set rating 5", false);

var x_text = window.GetProperty(" text: x", 0);
var y_text = window.GetProperty(" text: y", 0);
var text = window.GetProperty(" text", true);

var x_star = window.GetProperty(" star: x (0 - HCENTER)", 0);
var y_star = window.GetProperty(" star: y (0 - VCENTER)", 0);
var x_s, y_s;
var star_size = window.GetProperty(" star: size", 20);
var offset = window.GetProperty(" star: offset (percent of star size)", 20) / 100 * star_size;
var shadow = window.GetProperty(" shadow", true);
var fade_effect = window.GetProperty("fade effect", true);
var no_rating_transparent  = window.GetProperty(" no rating img transparent (0-255)", 120);

var file, file_attr, readwrite;

var lbtn_down = false;
var on_mouse = false;

var tooltip = window.GetProperty(" tooltip", true);
var tooltip_on = false;
var tooltip_text;
var tooltip_timer;

var selection_mode = window.GetProperty("selection mode", 0);
var t_type;
var metadb;
var count;
on_item_focus_change();

function on_paint(gr){
   !window.IsTransparent && gr.FillSolidRect(0, 0, ww, wh, bgcolor);
   
    x_s = x_star > 0 ? x_star + star_size / 2: (ww - (star_size + offset) * 4) / 2;
    y_s = y_star > 0 ? y_star + star_size / 2 : wh / 2;

    if (!lbtn_down) r_color = fb.IsPlaying ? color2 : color1;
    if (lbtn_down) r_color = readwrite ? fb.IsPlaying ? color2 : color1 : color_error;

    for (var i = 0; i < 5; i++) {   
        x_d = x_s + (i * (star_size + offset));
        !tooltip_on && star(gr, x_d, y_s, star_size, true, 0, color1, false, bgcolor, no_rating_transparent);
        !tooltip_on && star(gr, x_d, y_s, star_size, true, 0, r_color, shadow, bgcolor, star_alpha[i]);
    }

    h_t = gr.CalcTextHeight("000", font);
    w_t = gr.CalcTextWidth("000", font);
   
    y_t = y_text > 0 ? y_text : y_s - h_t * 0.5;
    x_t = x_text > 0 ? x_text : x_s - star_size / 2 - w_t;

    text && gr.DrawString( rating_mode == 0 ? "db" : "tag" , font, RGBA_color(color1), x_t, y_t, ww, wh);

    tooltip_on && draw_tooltip(gr);   

    gr.GdiDrawText( "", font, RGB(255,255,200), 20, 10, ww, wh );
}

function getNRating(posx) {
    nrating = Math.ceil(( posx + star_size / 2 - x_s ) / (star_size + offset ));
    if (nrating > 5) nrating = 5;
    if (nrating < 0) nrating = 0;
    if (nrating != 0) nrating = set_rating_5 ? 5 : nrating;
}

function getRating(){
  if ( count > 1 ) {
        TAGrating = 0;
        DBrating = 0;
        for (var i = 0; i < count; i++) {
            item = plman.GetPlaylistSelectedItems(plman.ActivePlaylist).Item(i);
            DBrating += parseInt(fb.TitleFormat("$if2(%rating%, 0)").EvalWithMetadb(item));
            TAGrating += parseInt(fb.TitleFormat("$if2($meta(rating), 0)").EvalWithMetadb(item));
        }
        rating = rating_mode == 0 ? DBrating : TAGrating;
        rating = Math.round(rating / count);
    } else {
        DBrating = fb.TitleFormat("$if2(%rating%,0)").EvalWithMetadb(metadb);
        TAGrating = fb.TitleFormat("$if2($meta(rating),0)").EvalWithMetadb(metadb);
        rating =  rating_mode == 0 ? DBrating : TAGrating;
    }
}

function setRating(){
   if ((nrating != rating) && metadb) {   
        if (rating_mode == 0) {
            if (count > 1) {
                for (var i = 0; i < count; i++) {
                    item = plman.GetPlaylistSelectedItems(plman.ActivePlaylist).Item(i);
                    fb.RunContextCommandWithMetadb("Playback Statistics/Rating/" + (nrating == 0 ? "<not set>" : nrating), item);
                }
            } else{
                fb.RunContextCommandWithMetadb("Playback Statistics/Rating/" + (nrating == 0 ? "<not set>" : nrating), metadb);
            }
            rating = nrating;
        }
       
        if (rating_mode == 1) {
            if (count > 1) {
                for (var i = 0; i < count; i++) {
                    item = plman.GetPlaylistSelectedItems(plman.ActivePlaylist).Item(i);
                    item_path = fb.Titleformat("%path%").EvalWithMetadb(item);//

                    try {     
                        file = fso.GetFile(item_path);   
                        var file_attr = parseInt(file.Attributes);     
                    } catch(e) {};   

                    var item_rw = file_attr == 32 ? true : false;

                    if (item_rw) {
                        var handle = item;
                        var handles = fb.CreateHandleList();
                        handles.Add(handle);
                        handles.UpdateFileInfoFromJSON(JSON.stringify({ "Rating" : nrating == 0 ? "" : nrating }));
                        handles.Dispose();
                        rating = nrating
                    }
                }
             } else {
                if (readwrite){
                    var handle = metadb;
                    var handles = fb.CreateHandleList();
                    handles.Add(handle);
                    handles.UpdateFileInfoFromJSON(JSON.stringify({ "Rating" : nrating == 0 ? "" : nrating }));
                    handles.Dispose();
                    rating = nrating                   
                }               
            }
        }
    }
    if (!readwrite && rating_mode == 1) {
        tooltip && info_tooltip();
    }
}

function on_mouse_lbtn_up(x,y){
    lbtn_down = false;
    setRating();
    check_star_state();
}

function on_mouse_lbtn_down(x,y) {
    lbtn_down = true;
    tooltip && clear_tooltip_timer();
    getNRating(x);
    check_star_state();
    window.Repaint();
}

function on_mouse_mbtn_up(){
    nrating = 0;
    setRating();
}

function on_mouse_move(x, y) {
    on_mouse = true;
    window.SetCursor(IDC_HAND);   
   
    if (lbtn_down){
        getNRating(x);
    }

    button_change_state();         
    check_star_state();         
    window.Repaint();
}   

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

function on_mouse_wheel(delta) {
    tooltip && clear_tooltip_timer();
    if (delta > 0) {rating_mode = 0};
    if (delta < 0) {rating_mode = 1};
    window.SetProperty("rating_mode", rating_mode);
    on_item_focus_change();
    window.Repaint();
}

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_selection_changed(metadb) {
    on_item_focus_change();
}

function on_item_focus_change() {
    switch (selection_mode) {
    case 0:
        metadb = fb.IsPlaying ? fb.GetNowPlaying() : fb.GetFocusItem();   
        break;   
    case 1:   
        metadb = fb.GetFocusItem();
        break;   
    }   
    if (metadb) on_metadb_changed();   
}


function on_metadb_changed() {
    count = plman.GetPlaylistSelectedItems(plman.ActivePlaylist).Count;
    if (metadb) {
        rating_mode = window.GetProperty("rating_mode") == 0 ? 0 : 1;
        getRating();
        check_star_state();
        get_file_attr();
    }
    window.Repaint();
}

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

function on_mouse_rbtn_up (x, y){   
    var _menu = window.CreatePopupMenu();
   
    _menu.AppendMenuItem(MF_ENABLED, 10, "Prefer now playing");   
    _menu.AppendMenuItem(MF_ENABLED, 11, "Follow selected track");   
    _menu.CheckMenuRadioItem(10, 11 , selection_mode + 10);   
    _menu.CheckMenuItem(selection_mode + 10, 1);
   
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 20, "Store Ratings in the database");
    _menu.AppendMenuItem(MF_ENABLED, 21, "Store Ratings in the file tags");
    _menu.CheckMenuRadioItem(20, 21, rating_mode + 20);     
   _menu.CheckMenuItem(rating_mode + 20, 1);   
   
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 30, "Set Rating 5");
    _menu.CheckMenuItem(30, set_rating_5);   

    switch (file_attr) {
    case 32:   
        txt = "to read - only";
        break;     
    case 33:   
        txt = "to read - write";
        break;
    default:
        txt = "";
    }

    MF_STRING = txt ? MF_ENABLED : MF_GRAYED;
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);   
    _menu.AppendMenuItem(MF_STRING, 40, "Change file attributes " + txt);
   
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 50, "Fade effect");
    _menu.CheckMenuItem(50, fade_effect);

    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 100, "Properties");
    _menu.AppendMenuItem(MF_ENABLED, 200, "Configure...");

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

    switch (ret) {
    case 10:
    case 11:
        selection_mode = ret - 10;
        window.SetProperty("selection mode", selection_mode);
        on_item_focus_change();
        break;
    case 20:
    case 21:
        rating_mode = ret - 20;
        window.SetProperty("rating_mode", rating_mode);
        on_item_focus_change();
        break;
    case 30:
        window.SetProperty("set rating 5", !set_rating_5);
        set_rating_5 = window.GetProperty("set rating 5");
        break;
    case 40:
        switch (file_attr) {
        case 32:   
            if (metadb) change_file_attr(33); //read only
            on_item_focus_change();
            break;
        case 33:
            if (metadb) change_file_attr(32); //read write
            on_item_focus_change();
            break;
        }   
        break;
    case 50:
        window.SetProperty("fade effect", !fade_effect);
        fade_effect = window.GetProperty("fade effect");
        break;
    case 100:
        window.ShowProperties();
        break;   
    case 200:
        window.ShowConfigure();     
        break;
    }
    _menu.Dispose();
    return true;
}

function get_file_attr() {   
    t_type = track_type(metadb.RawPath);
    file_attr = 0;   
   
    if (t_type == "file") {   
        for (var i = 0; i < count; i++) {           
            item = plman.GetPlaylistSelectedItems(plman.ActivePlaylist).Item(i);
            item_path = fb.Titleformat("%path%").EvalWithMetadb(item);         
            try {           
                file = fso.GetFile(item_path);           
                file_attr += parseInt(file.Attributes);           
            } catch(e) {};             
        }             
        file_attr = Math.round(file_attr / count);   
    }
   
    var file_read_only = file_attr == 32 ? false : true;
    var file_cue = t_type == "cue" ? true : false;
    var stream = t_type == "stream"  ? true : false;

    tooltip_text = file_cue ? " cue file " : file_read_only && t_type == "file" ? " file" + (count > 1 ? "s are " : " is ") + "read only " : stream ? " stream " : "";

    if ((file_cue || file_read_only || stream) && rating_mode == 1 ) {   
        readwrite = false;                 
    } else {           
        readwrite = true;                     
    }                 
}   

function change_file_attr(k) {
    t_type = track_type(metadb.RawPath);
   
    if (t_type == "file") {
        for (var i = 0; i < count; i++) {
            item = plman.GetPlaylistSelectedItems(plman.ActivePlaylist).Item(i);   
            item_path = fb.Titleformat("%path%").EvalWithMetadb(item);
            try {
                file = fso.GetFile(item_path);
                file.Attributes = k;
            } catch(e) {};
        }
    }   
}

function star(gr, x, y, img_size, fill, line_thickness, color, sh, sh_color, alpha){
    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 = [], sh_points = [];
    var 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((radius - delta) * Math.cos(Math.PI * i / 10 * 2 - Math.PI / 2));
            y_points_1.push((radius - delta) * Math.sin(Math.PI * i / 10 * 2 - Math.PI / 2));
        } else {
            x_points_2.push((radius - delta) / 2.61803 * Math.cos(Math.PI * i / 10 * 2 - Math.PI / 2));
            y_points_2.push((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] + radius, y_points_1[i] + radius, x_points_2[i] + radius, y_points_2[i] + radius);
        sh_points.push(x_points_1[i] + radius + 1, y_points_1[i] + radius + 1, x_points_2[i] + radius + 1, y_points_2[i] + radius + 1);
    }

    var img = gdi.CreateImage(img_size, img_size);
    var temp_gr = img.GetGraphics();
    temp_gr.SetSmoothingMode(2);
   
    if (line_thickness > 0) {
        sh && temp_gr.DrawPolygon(sh_color, line_thickness, sh_points);
        temp_gr.DrawPolygon(color, line_thickness, points);
    }

    if (fill && line_thickness == 0) {
        sh && temp_gr.FillPolygon(sh_color, 1, sh_points);
        temp_gr.FillPolygon(color, 1, points)
    }

    gr.DrawImage(img, x - radius, y - radius, img_size, img_size, 0, 0, img_size, img_size, 0, alpha);
   
    img.ReleaseGraphics(temp_gr);
    img.Dispose();
    temp_gr = null;
    img = null;
}

function track_type(p) {
    var type;
    if (p.indexOf("file") >= 0 && p.indexOf("cue") >= 0){
        type = "cue";
    } else if (p.indexOf("file") >= 0){
        type = "file";
    } else if (p.indexOf("cdda") >= 0){
        type = "cdda";
    } else if (p.indexOf('://') >= 0 || p.indexOf('www') >= 0 || p.indexOf("youtube") >= 0 || p.indexOf("video") >= 0 || p.indexOf("vimeo") >= 0){
        type = "stream";
    } else {
        type = "";
    }
    return type;
}

var b_hover_state, b_hover_alpha = 0;
var star_state = [];
var star_alpha = [];
check_star_state();
var b_timer_started = false;

function check_star_state() {
    star_state = [];
   
    for (var i = 0; i < 5; i++) {
        r = lbtn_down ? nrating : rating;
        if (i < r) {star_state[i] = 1} else (star_state[i] = 0);
    }
   
    if (!b_timer_started) button_alpha_timer();
}

function button_change_state() {
    if (!b_timer_started) button_alpha_timer();
    b_hover_state = 1;
}

function button_leave_change_state() {   
    if (b_hover_state != 0) {
        b_hover_state = 0;
    }
}

function button_alpha_timer() {
    b_timer_started = true;
   
    var on_step = 51;
    var off_step = 20;
   
    b_timer = window.SetInterval(function() {
        switch (b_hover_state) {
        case 0:
            b_hover_alpha = fade_effect ? Math.max(0, b_hover_alpha -= off_step) : 0;
            break;
        case 1:
            b_hover_alpha = fade_effect ? Math.min(255, b_hover_alpha += on_step) : 255;
            break;
        }
       
        for (var i = 0; i < 5; i++) {
            if (!star_alpha[i]) star_alpha[i] = 0;
           
            switch (star_state[i]) {
            case 0:
                star_alpha[i] = fade_effect ? Math.max(0, star_alpha[i] -= off_step) : 0;
                break;
            case 1:
                star_alpha[i] = fade_effect ? Math.min(255, star_alpha[i] += on_step) : 255;
                break;
            }
        }
       
        window.Repaint();

        if (!on_mouse){
            var tmp_off = [];
            var tmp_on = [];
            for(var i = 0; i < star_alpha.length; i++) {
                if (star_state[i] != 1) tmp_off.push(star_alpha[i]);
                if (star_state[i] == 1) tmp_on.push(star_alpha[i]);
            }
       
            if (b_hover_alpha <= 0 && Math.max.apply(null, tmp_off) <= 0 && Math.min.apply(null, tmp_on) >= 255){
                window.ClearInterval(b_timer);
                b_timer_started = false;
            }
        }
    }, 30);
}

function info_tooltip() {
    tooltip_on = true;
    window.Repaint();
    tooltip_timer &&  window.ClearTimeout(tooltip_timer);
    tooltip_timer = window.SetTimeout(function() {
        tooltip_on = false;
        window.Repaint();
        tooltip_timer && window.ClearTimeout(tooltip_timer);
    }, 1000);
}

function clear_tooltip_timer(){
    if (tooltip_timer){
        tooltip_on = false;
        window.ClearInterval(tooltip_timer);
    }
}

function draw_tooltip(gr){
    w_tt = 4 * (star_size + offset) + star_size;
    x_tt = x_s - star_size / 2;
    h_tt = gr.CalcTextHeight("0", font) + 2;
    y_tt = y_s - h_tt * 0.5;

    gr.GdiDrawText( tooltip_text, font, color1, x_tt, y_tt, w_tt, h_tt, DT_SINGLELINE | DT_CENTER | DT_VCENTER | DT_WORD_ELLIPSIS);
}

function print(msg) {
    fb.trace(msg);
}
Media Library it's bad - explorer it's good!
AHAPXICT M
Мастер
Аватара
Возраст: 47
Откуда: Киев
Репутация: 143
С нами: 4 года 5 месяцев

Сообщение #2180 Aliado_71 » 17.02.2018, 02:03

AHAPXICT, Что тебе сказать, кроме уважения, ты меня уже не первый раз выручаешь, рейтинг просто идеально лег на мою новую примитивную сборку :smile:

Изображение
Aliado_71 M
Бывалый
Аватара
Возраст: 47
Откуда: Украина, Донецк
Репутация: 58
С нами: 3 года 1 месяц

Пред.След.

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