Скрипты для foo_uie_wsh_panel_mod

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

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

Сообщение #1881 pois22ple » 09.06.2017, 22:46

kgena_ua,
Использую Ваш скрипт:
// @name "Get Covers (Artwork) && radio logos"
// @author "kgena_ua"
// @version "08022017"

Есть некоторые замечания - при переходе к новой песне в плейлисте не происходит автоматическое обновление встроенной картинки в песню - остается картинка от предыдущего трека, приходится выбирать правой кнопкой пункт меню "Reload".
Такое поведение наблюдается независимо выбора режима - 1 или 2, выбора приоритета - внедренный или внешний, взведенных галках на внешних или внутренних картинках.
Плейлист - "Rolling Stone Magazine's 500 Greatest Songs Of All Time", теги - "Album Artis" is Various, "Artist Name" для каждой песни свой, картинка встроенная - "Front cover". также есть внешняя картинка Front.jpg - лежит в паке с песнями.
pois22ple
Репутация: 10
С нами: 17 лет 7 месяцев

Сообщение #1882 seriousstas » 10.06.2017, 00:42

@name "Get Covers (Artwork) && radio logos"
У меня так-же "зависает" плеер (даже скрипты не прокрутить ) , если слушаю SACD и меняются в цикле большие картинки ..
seriousstas
Откуда: Украина , Ивано-Франковск
Репутация: 110
С нами: 9 лет 1 месяц

Сообщение #1883 AHAPXICT » 10.06.2017, 02:48

pois22ple, сколько пользуюсь скриптом и вот только сам заметил :smile: Получается, что для сборников, а как я понимаю, и в альбомах для следующего трека скрипт не обрабатывает встроенные картинки (embedded covers). Сам давно в скриптах не лазил, но это не ошибка насколько я понял ,а сделано специально для того чтобы не дёргало постоянно одну и ту же картинку. Вот и получается что если директория и альбом имеют одинаковые названия картинка не обновляется. У меня в плеере стоит два скрипта, этим пользуюсь и настроен он под все нестандартные картинки, а отображение встроенных отключено, если бы не прочитал и не проверил сам бы не знал. Буду следить за темой, что скажет kgena_ua?
seriousstas, у меня плеер чуть подлагивает во время сканирования wave seekbar(думаю ты в курсе), после вроде бы без проблем. Вы же когда-то обсуждали эту тему картинок с большим размером? Сейчас проверил DOORS (стерео) картинки 5740х2810 7.08мб крутит без вопросов. Мне как-то попались сканы по 100мб, так на моём железе и плеер включать не надо было, и так всё зависало :biggrin: (ушло в топку)
AHAPXICT M
Аватара
Откуда: Киев
Репутация: 252
С нами: 10 лет 4 месяца

Сообщение #1884 seriousstas » 10.06.2017, 03:10

AHAPXICT: Вы же когда-то обсуждали эту тему картинок с большим размером? Сейчас проверил DOORS (стерео) картинки 5740х2810 7.08мб крутит без вопросов. Мне как-то попались сканы по 100мб, так на моём железе и плеер включать не надо было, и так всё зависало :biggrin: (ушло в топку)
Обсуждали ,сейчас снова нагрузил много канала на SACD и картинки подвешивают плеер..
seriousstas
Откуда: Украина , Ивано-Франковск
Репутация: 110
С нами: 9 лет 1 месяц

Сообщение #1885 AHAPXICT » 10.06.2017, 03:27

Я понял. Чего про тему и вспомнил и указал что сам слушал на стерео, много канал требует жертв...
AHAPXICT M
Аватара
Откуда: Киев
Репутация: 252
С нами: 10 лет 4 месяца

Сообщение #1886 AHAPXICT » 07.07.2017, 01:07

Приветствую всех :beer: Кто то делал кустномное меню поиска (типа фильтр как я понял) для Youtube Source? Может есть уже готовое на WSH?
AHAPXICT M
Аватара
Откуда: Киев
Репутация: 252
С нами: 10 лет 4 месяца

Сообщение #1887 kgena_ua » 08.07.2017, 10:59

Всем привет.
Для начала обновлю скрипт биографии.

Biography Text & Album Info & Picture. www.last.fm
version "07072017


Основные изменения связаны с поддержкой языков. Теперь используемые языки не вшиты в скрипт, а прописываются в меню "свойства". Для этого необходимо указать через запятую требуемые языки, используя коды:
English - en
Italian - it
Chinese - zh
German - de
Polish - pl
Portuguese - pt
Russian - ru
Turkish - tr
French - fr
Swedish - sv
Japanese - ja.
Переключение не изменилось: через меню или двойной клик левой клавишей на тексте.

code.png
code.png (2.6 КБ) Просмотров: 3258





По
Не удалось получить свойство "search" ссылки, значение которой не определено или является NULL
File: <main>
Line: 271, Col: 5
Да, seriousstas , есть такое дело.
И по совместимость Properties с wsh и jscript сделаю.
По tooltip_activate, две функции почти с одинаковым названием:
function _tooltip_activate(x, y) для wsh
и
function tooltip_activate(x, y) для jscript
В любом случае будут изменения по скрипту
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 10 лет 11 месяцев

Сообщение #1888 sudden » 08.07.2017, 15:54

kgena_ua, в шапку бы добавить все ваши скрипты, чтобы не искать по всей теме
sudden M
Репутация: 22
С нами: 17 лет 1 месяц

Сообщение #1889 Aliado_71 » 08.07.2017, 21:27

sudden:kgena_ua, в шапку бы добавить все ваши скрипты, чтобы не искать по всей теме
Мое мнение создать тему "Полезные скрипты автора kgena_ua" где бы в шапке были собраны все скрипты оригинального автора. В таком варианте отпала бы необходимость лапатить десятки страниц в поисках нужного скрипта в теме foo_uie_wsh_panel_mod, и появилась бы возможность следить за обновлениями.
Aliado_71
Аватара
Откуда: Украина
Репутация: 200
С нами: 9 лет

Сообщение #1890 MC Web » 08.07.2017, 23:37

Aliado_71:Мое мнение создать тему "Полезные скрипты автора kgena_ua" где бы в шапке были собраны все скрипты оригинального автора.
Давно предлагал подобное сделать.
Можно по аналогии с:
Пользовательские индикаторы к foo_vis_vumeter - сами скрипты и обновления
и
Обсуждение пользовательских индикаторов для foo_vis_vumeter
или в этом же разделе Скрипты для foo_uie_wsh_panel_mod
MC Web
Репутация: 248
С нами: 10 лет 7 месяцев

Сообщение #1891 Aliado_71 » 09.07.2017, 01:09

MC Web, Я думаю что тема "скрипты автора kgena_ua" должна оформляться подобно как сборки, но решать конечно автору и модераторам.
Aliado_71
Аватара
Откуда: Украина
Репутация: 200
С нами: 9 лет

Сообщение #1892 AHAPXICT » 09.07.2017, 01:49

Это хорошо что к этой теме вернулись, а то тогда так и затихло. MC Web вот и я про это. Только такую тему нужно модерировать как это делаешь ты у себя на форуме. Не поленился и нашёл своё старое сообщение тоже.
Вот оно в цитате.
AHAPXICT:kgena_ua, приветствую! У меня мысль есть, хочу с вами посоветоваться. Может сделать отдельную тему для "Biography Text && Picture. www.last.fm"? То есть, как это реализовано на pccar.ru или у MC Web(заглянул, а там уже всё есть). Для чего это всё? В последнее время ко мне часто обращаются люди с просьбой помочь, в том числе и по БИО. Я вот сам делаю закладки в браузере на нужные сообщения в теме, а то потом сложно найти, даже поиск не помогает. Мы своими сообщениями постоянно нужные релизы запихиваем в глубь темы, но это не страшно, она то и создана для того что бы вопросы решать по WSH и обсуждать тестовые версии скриптов. Представляю как новому пользователю в этом всём разобраться, когда не понятно где сам скрипт, а где к нему исправления. Вот сам сейчас не могу понять о каких "массивах" вы говорите с seriousstas(будет возможность напиши в ЛС), для какой версии БИО, нужно ли это для предыдущей и т.д. На всякий случай буду подготавливать материал по этой теме. У меня на данный момент есть ваша предпоследняя версия от "14112016" которую адаптировал под всё Plug & Play. Делал не для этого, это понятно, но пришлось некоторые моменты оптимизировать DUI & CUI и т.д. Пока не придумал как было бы лучше, сам не очень то подхожу для этих целей, администраторы не будут заниматься у вас наверно нет на это времени, в каком разделе разместить или создать новый раздел(под раздел)и т.д. и т.п. Но думаю это сделать стоит.
AHAPXICT M
Аватара
Откуда: Киев
Репутация: 252
С нами: 10 лет 4 месяца

Сообщение #1893 kgena_ua » 09.07.2017, 15:00

Properties & properties file (ml)
version "09072017"


Исправлены ошибки.
Для совместимости с jscript необходимо изменить строки 160, 163, 164
Код: Выделить всё
/////  WSH panel
//var tooltip = window.CreateTooltip();

/////  jscript panel
var tooltip = window.CreateTooltip(font_name_item_value, font_size_tooltip, font_style_item_value);
tooltip.SetMaxWidth(tooltip_max_w);
и строки 302 и 303
Код: Выделить всё
        //if (Tooltip) tooltip_activate_wsh(x, y);
        if (Tooltip) tooltip_activate_jscript(x, y)

Код: Выделить всё
// ==PREPROCESSOR==
// @name "Properties & properties file (ml)"
// @author "kgena_ua"
// @version "09072017"
// @feature "v1.4"
// @feature "watch-metadb"
// @tooltip "custom-paint"
// ==/PREPROCESSOR==

function RGB(r,g,b) { return (0xff000000|(r<<16)|(g<<8)|(b)); }
function RGBA(r, g, b, a) { return ((a << 24) | (r << 16) | (g << 8) | (b)); }

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

var ww, wh, wh_old;

IDC_HAND = 32649;
IDC_ARROW = 32512;
IDC_SIZEWE = 32644;

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

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 font_name_item_name = window.GetProperty(" font name: item name", "Arial");
var font_name_item_value = window.GetProperty(" font name: item value", "Arial");
var font_name_group = window.GetProperty(" font name: group", "Arial");

var font_size_item_name = window.GetProperty(" font size: item name", 11);
var font_size_item_value = window.GetProperty(" font size: item value", 12);
var font_size_group = window.GetProperty(" font size: group", 11);

var font_style_item_name = window.GetProperty(" font style: item name", 0);
var font_style_item_value = window.GetProperty(" font style: item value", 0);
var font_style_group = window.GetProperty(" font style: group", 0);

var font_size_tooltip = window.GetProperty(" font size: tooltip", 12);

var font_item, font_group, font_tooltip;
get_font();

function get_font(){
    font_item_name = gdi.Font(font_name_item_name, font_size_item_name, font_style_item_name);
    font_item_value = gdi.Font(font_name_item_value, font_size_item_value, font_style_item_value);
    font_group = gdi.Font(font_name_group, font_size_group, font_style_group);
    font_tooltip = gdi.Font(font_name_item_value, font_size_tooltip, font_style_item_value);
}

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.GetColorCUI(ColorTypeCUI.background);
        color_item_name = window.GetColorCUI(ColorTypeCUI.text);
        color_item_value = window.GetColorCUI(ColorTypeCUI.inactive_selection_text);
        color_group_text = window.GetColorCUI(ColorTypeCUI.inactive_selection_background);
    } else if (window.InstanceType == 1) {
        bgcolor = window.GetColorDUI(ColorTypeDUI.background);
        color_item_name = window.GetColorDUI(ColorTypeDUI.text);
        color_item_value = window.GetColorDUI(ColorTypeDUI.highlight);
        color_group_text = window.GetColorDUI(ColorTypeDUI.selection);
    }
    window.Repaint();
}

get_color();

function on_colors_changed(){
    get_color();
}

var custom_colors = window.GetProperty(" colors: custom", false);

var c_bgcolor = customColor(window.GetProperty(" color: background", "0-0-0"));
var c_color_item_name = customColor(window.GetProperty(" color: item name", "180-180-180")); 
var c_color_item_value = customColor(window.GetProperty(" color: item value", "255-255-220"));
var c_color_group_text = customColor(window.GetProperty(" color: group text", "100-100-100"));

bgcolor = custom_colors ? c_bgcolor : bgcolor;
color_item_name = custom_colors ? c_color_item_name : color_item_name;
color_item_value = custom_colors ? c_color_item_value : color_item_value;
color_group_text = custom_colors ? c_color_group_text : color_group_text;

function customColor(colour){
   tempc = colour.split("-");
   return (0xff000000 | (tempc[0]<<16) | (tempc[1]<<8) | (tempc[2]));
}

var selection_mode = window.GetProperty("selection_mode", 0);

var idx;
var item_name_array = [];
var item_name_array_2 = [];
var item_value_array = [];
var tmp_item_name_array = [];
var tmp_item_name_array_2 = [];
var tmp_item_value_array = [];
var name, value;
var similar_artist_text = "";
var similar_artist = [];

var auto_sizing = window.GetProperty("auto sizing", true);
var group_text = window.GetProperty("group text", true);
var vertical_item_padding = window.GetProperty(" vertical item padding", 1);

var t_h;
var t_x1 = window.GetProperty(" text: margin", 10);
var t_x2;
window.GetProperty("text: x2 custom", 0);

var lbtn_down = false;
var shift_down = false;
var pos_x;
var drag_x = 0, drag_y = 0;
var move_x = false,  move_y = false;
var s = 0;
var old_x, old_y;

var Tooltip = window.GetProperty("tooltip", false);
var tooltip_time = fb.CreateProfiler("Time tooltip");
var tooltip_state = false;
var tooltip_text;
var tooltip_t = [];
var tooltip_max_w = window.GetProperty(" tooltip text max width", 250);
var tooltip_delay_time = window.GetProperty(" tooltip delay time", 300);

/////  WSH panel
var tooltip = window.CreateTooltip();

/////  jscript panel
//var tooltip = window.CreateTooltip(font_name_item_value, font_size_tooltip, font_style_item_value);
//tooltip.SetMaxWidth(tooltip_max_w);

var lang_text = ["en", "ru"];
var lang = window.GetProperty("lang", 0);

htmlfile = new ActiveXObject('htmlfile');
var clipboardData = "";

function on_paint(gr) {
   !window.IsTransparent && gr.FillSolidRect(0, 0, ww, wh, bgcolor);
   
    draw_array(gr);
   
    gr.GdiDrawText( "", font_item_value, color_item_value, 0, 60, ww, wh, DT_RIGHT | DT_WORD_ELLIPSIS);
    gr.GdiDrawText( "", font_item_value, color_item_value, 0, 80, ww, wh, DT_RIGHT | DT_WORD_ELLIPSIS);
    gr.GdiDrawText( "", font_item_value, color_item_value, 0, 100, ww, wh, DT_RIGHT | DT_WORD_ELLIPSIS);
}

var groups = ["metadata", "general", "replaygain", "location", "playback statistics", "last.FM statistics", "last.FM"];

window.GetProperty( groups[0], true),
window.GetProperty( groups[1], true),
window.GetProperty( groups[2], true),
window.GetProperty( groups[3], true),
window.GetProperty( groups[4], true),
window.GetProperty( groups[5], true);
window.GetProperty( groups[6], true);

var tfname = [
["$meta(artist)", "Исполнитель"],
["%title%", "Название"],
["%album%", "Альбом"],
["%date%", "Год"],
["%genre%", "Жанр"],
["%composer%", "Композитор"],
["%performer%", "Первый исполнительь"],   
["$meta(album artist)", "Исполнитель альбома"],
["%track number%", "Номер трека"],
["%totaltracks%", "Всего треков"],
["%discnumber%", "Номер диска"],
["%totaldiscs%", "Всего дисков"],
["%rating%", "Рейтинг"],
["$meta(rating)", "Рейтинг"],
["%comment%", "Комментарий"],
["%publisher%", "Издатель"],
["%catalog%", "Каталог"],
["%discid%", "ID диска"],
["%label%", "Лейбл"],           
["%releaser%", "Продавец"],     
["%subtitle%", "Субтитры"],

["group_" + groups[1], "общие"],           
["$info(samplerate)", "Частота дискретизации"],
["$info(channels)", "Каналов"],
["$info(bitspersample)", "Бит на семпл"],
["$info(bitrate)", "Битрейт"],
["%codec%", "Кодек"],
["$info(codec_profile)", "Профиль кодека"],
["$info(mp3_stereo_mode)", "Режим стерео MP3"],
["$info(encoding)", "Кодирование"],
["%length%", "Длина"],
["$info(tool)", "Кодировщик"],
["$info(cue_embedded)", "Встроенный CUE"],
["$info(tagtype)", "Тип тега"],

["group_" + groups[2], "Усиление громкости"], 
["%replaygain_album_gain%", "Усиление громкости альбома"],
["%replaygain_album_peak%", "Пиковый уровень альбома"],
["%replaygain_track_gain%", "усиление громкости трека"],
["%replaygain_track_peak%", "Пиковый уровень трека"],

["group_" + groups[3], "расположение"],   
["%filename_ext%", "Имя файла"],
["$directory_path(%path%)", "Путь к файлу"],
["%url%", "Ссылка"],
["%subsong%", "Позиция трека"],       
["%filesize_natural%", "Размер файла"],
["%last_modified%", "Изменен"],
["%folder_name%", "Имя папки"],

["group_" + groups[4], "Cтатистика воспроизведения"],
["%play_count%", "Количество воспроизведений"],
["%first_played%", "Первое воспроизведение"],
["%last_played%", "Последнее воспроизведение"],
["%added%", "Добавлен"],

["group_" + groups[5], "сайт Last.FM"],
["%lastfm_bio%", "Биография"],
["%lastfm_artist_playcount%", "Прослушиваний исполнителя"],
["%lastfm_artist_listeners%", "Слушателей исполнителя"],
["%lastfm_album_playcount%", "Прослушиваний альбома"],
["%lastfm_album_listeners%", "Слушателей альбома"],
["%lastfm_album_content%", "Содержимое альбома"],

["group_" + groups[6], "сайт Last.FM"],
["%lastfm_similar_artist%", "Похожие исполнители"]
];

function set_cursor() {
    if (move_y || lbtn_down) window.SetCursor(IDC_HAND);
    if (move_x) window.SetCursor(IDC_SIZEWE);
}

function on_mouse_lbtn_down(x, y) {
    lbtn_down = true;
    if (move_y) drag_y = y - s;
    if (move_x) drag_x = x - t_x2;
}

function on_mouse_lbtn_up(x, y) {
    lbtn_down = false;
    if (move_x) {
        window.SetProperty("text: x2 custom",  t_x2);
    }
}

function on_mouse_lbtn_dblclk(x, y){
    group = item_name_array[idx] && item_name_array[idx].search('group') >= 0 ? true : false;
       
    if (group){
        group_name = item_name_array[idx].replace("group_", "");
        group_collapsed = window.GetProperty(group_name);
        window.SetProperty(group_name, !group_collapsed);
        create_array();
        window.Repaint();
    }
}

function on_mouse_move(x, y) {
    if (shift_down && !move_x) drag_x = x - t_x2;
    if (shift_down) drag_y = (y - s);
   
    idx = Math.floor((y + Math.abs(s)) / t_h);

    pos_x = x;
    mouse_on_pos();
   
    if (old_y != y || old_x != x){
        if (Tooltip) tooltip_activate_wsh(x, y);
        //if (Tooltip) tooltip_activate_jscript(x, y)
        old_y = y;
        old_x = x;
    }
   
    if (lbtn_down && move_y) {
        if (s <= 0 && (item_name_array.length * t_h) >= wh) {s = y - drag_y};
        applyDelta();
    }

    if (lbtn_down && move_x) {
        auto_sizing = false;
        window.SetProperty("auto sizing", auto_sizing);
        tmp_t_x2 = x - drag_x;
        t_x2 = tmp_t_x2 <= t_x1 ? t_x1 : tmp_t_x2 >= ww - t_x1 - 50 ? ww - t_x1 - 50 : tmp_t_x2;
    }
   
    window.Repaint();
}

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

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

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

function mouse_on_pos(){
    if (shift_down && pos_x >= t_x2) {
        move_x = true;
        move_y = false;
    } else {
        move_y = true;
        move_x = false;
    }
    set_cursor();
}

function on_key_down(vkey) {
    if (vkey == 0x10 ){ //    VK_SHIFT
        shift_down = true;
        if (lbtn_down) drag_x = pos_x - t_x2;
    }
    mouse_on_pos();
}

function on_key_up(vkey) {
    if (vkey == 0x10 ){ //    VK_SHIFT
        shift_down = false;
    }
    mouse_on_pos();
}

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

function clear_item_name(n) {
    return n.replace(/.*\(|lastfm_|replaygain_|[^a-z0-9\s\_]/g,"").replace(/_/g," ");
    //return n.replace(/.*\((?!\))|lastfm_|replaygain_|[^a-z0-9\s\_]/g,"").replace(/_/g," "); 
}

function clear_group_text(n) {
    return n.replace(/group_/g,"").replace(/(?=.)/g," ").replace(/^\s/g,"")
}

function data_format(n) {
    if (!n) return;
    d = n.substr(8, 2);
    m = parseInt(n.substr(5, 2), 10);
    y = n.substr(0, 4);
    t = n.substr(11, 8);
    m_text = lang == 0 ? months_en[m - 1] : months_ru[m - 1];
    return d + " " + m_text + " " + y + ", " + t;
}

var measure_arr = [
["$info(bitrate)", "kbps", "кбит/с"],
["$info(samplerate)", "Hz", "Гц"],
["$info(bitspersample)", "bps", ""],
["$info(channels)", "ch", ""],
["%play_count%", "times", ""]
]

function get_measure(n) {
    tmp = "";
    var j = 0;
    do {
        if (measure_arr[j][0] == n) {
            tmp = lang == 0 ? measure_arr[j][1] : measure_arr[j][2];
        }     
        j++;
    } while (j < measure_arr.length);
    return tmp;
}

var months_en = ["Jan.", "Feb.", "Mar.", "Apr.", "May", "Jun.", "Jul.", "Aug.", "Sept.", "Oct.", "Nov.", "Dec."];
var months_ru = ["Янв.", "Фев.", "Мрт", "Апр.", "Май", "Июн.", "Июл.", "Авг.", "Сен.", "Окт.", "Нбр", "Дек."];

function create_array() {
    tmp_item_name_array = [];
    tmp_item_name_array_2 = [];
    tmp_item_value_array = [];
   
    t_x2 = 0;
    similar_artist_text = "";
    similar_artist = [];
   
    for (j = 0; j < tfname.length; j++) {
        group = tfname[j][0].search('group') >= 0 ? true : false;
       
        var value = "";
       
        if (!group) {
            if (tfname[j][0].search(/last_modified|first_played|last_played|added/g) > 0){   
                value = data_format(Eval(tfname[j][0]));
            } else {
                value = Eval(tfname[j][0]);
            }
        }
       
        if (value && value != 0 || group) {
            m_text = get_measure(tfname[j][0]);
            value = value + (m_text ? "  " + m_text : "");
       
            tmp_item_name_array.push(tfname[j][0]);
            tmp_item_name_array_2.push(tfname[j][1]);
           
           
            if (tfname[j][0] != "%lastfm_similar_artist%"){
                tmp_item_value_array.push(value);
            }
           
            if (tfname[j][0] == "%lastfm_similar_artist%") {
                similar_artist_text = value.replace(/(&apos;)/g, "'");
            }
        }
       
        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 = auto_sizing ? t_x2 + t_x1 + 10 : window.GetProperty("text: x2 custom");

    if (similar_artist_text){
        similar_artist = similar_artist_text.split(';');
       
        for (var i = 0; i < similar_artist.length; i++) {
            if (i >= 1) {
                tmp_item_name_array.push("");
                tmp_item_name_array_2.push("");
            }
            value = similar_artist[i].replace(/^\s+|\s+$/g, "") + ";";
            tmp_item_value_array.push(value);
        }
    }
   
    clear_collapse_expand_groups();
}

function clear_collapse_expand_groups() {
    item_name_array = [];
    item_name_array_2 = [];
    item_value_array = [];
   
    group_name = groups[0];
   
    for (j = 0; j < tmp_item_name_array.length; j++) {
        group = tmp_item_name_array[j].search('group') >= 0 ? true : false;
       
        if (group){
            group_name = tmp_item_name_array[j].replace("group_", "");
        }

        selected_items = window.GetProperty(group_name);

        item_nane = tmp_item_name_array[j];
        item_nane_2 = tmp_item_name_array_2[j];
        item_value = tmp_item_value_array[j];
       
        if (!group){
            if (selected_items){
                item_name_array.push(item_nane);
                item_name_array_2.push(item_nane_2);
                item_value_array.push(item_value); 
            }           
        }
       
        if (group){
            if (tmp_item_value_array[j + 1]){
                item_name_array.push(item_nane);
                item_name_array_2.push(item_nane_2);
                item_value_array.push(item_value); 
            }
        }
    }
    if (item_name_array.length * t_h < wh && s < 0) s = 0;
}

function draw_array(gr) {
    f_h_name = gr.CalcTextHeight("Text", font_item_name);
    f_h_value = gr.CalcTextHeight("Text", font_item_value);
   
    f_h = Math.max(f_h_name, f_h_value);
   
    t_h = f_h + window.GetProperty(" vertical item padding");
   
    star_size = f_h_value - 3;
    star_offset = star_size + 2;
   
    for (var i = 0; i < item_name_array.length; i++) {
        group = item_name_array[i].search('group') >= 0 ? true : false;
       
        t_y =  i * t_h + s;
        l_y = t_y + t_h / 2;
       
        if (!group){
            name = clear_item_name(item_name_array[i]);
            rating_text = item_name_array[i] == "$meta(rating)" ? lang == 0 ? "  (tag)" : "  (тег)" : "";
            t_w = Math.min(ww - (ww - t_x2)- t_x1, ww - t_x1 * 2) - 10;
           
            name = lang == 0 ? name : item_name_array_2[i];
            gr.GdiDrawText(name + rating_text, font_item_name, color_item_name, t_x1, t_y, t_w, t_h, DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_WORD_ELLIPSIS | DT_NOPREFIX);         
        }
       
        if (group){
            name = lang == 0 ? item_name_array[i] : item_name_array_2[i];
            name = group_text ? clear_group_text(name) : "";
            t_w = ww - t_x1 * 2;
           
            group_name = item_name_array[i].replace("group_", "");
            group_collapsed = window.GetProperty(group_name);
            color = color_group_text;
           
            gr.GdiDrawText(name, font_group, color, t_x1, t_y, t_w, t_h, DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_WORD_ELLIPSIS | DT_NOPREFIX);         

            l_x = group_text && name ? Math.min(gr.CalcTextWidth(name, font_group) + 5, ww - t_x1 * 2) : 0;
            gr.DrawLine(t_x1 + l_x, l_y, ww - t_x1, l_y, 1, color_group_text);
        }
       
        if (item_name_array[i].search(/rating/g) > 0){     
            for (var r = 0; r < Math.min(item_value_array[i] * star_offset, ww - t_x2 - t_x1); r = r + star_offset) {
                draw_star(gr, t_x2 + star_size / 3 + r, t_y + t_h / 2, star_size, true, 0, color_item_value, false, bgcolor, 255);
            }
        } else {
            value = item_value_array[i];
            t_w2 = ww - t_x2 - t_x1;
            gr.GdiDrawText( value, font_item_value, color_item_value, t_x2, t_y, t_w2, t_h, DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_WORD_ELLIPSIS | DT_NOPREFIX);       
        }
    }
}
       
var metadb;
on_item_focus_change();

function on_playlist_switch() {
    on_item_focus_change();
}

function on_playback_new_track() {
    on_item_focus_change();
}

function on_playback_dynamic_info_track() {
    on_item_focus_change();
}

function on_playback_stop() {
    on_item_focus_change();
}

function on_selection_changed(metadb) {
   on_item_focus_change();
}

function 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() {
    create_array();
    window.Repaint();
}

function Eval(field) {
    if (metadb) {
        type = metadb.RawPath;

        if (type.indexOf("file") >= 0){
            return fb.TitleFormat("[" + field + "]").EvalWithMetadb(metadb);
        } else{
            if (selection_mode == 0){
                if (field == "$meta(artist)" || field == "%title%"){
                    return fb.TitleFormat("[" + field + "]").Eval(true);
                }
                if (field == "%genre%"){
                    return fb.TitleFormat("[" + field + "]").EvalWithMetadb(metadb);
                }
            }
            return fb.TitleFormat("[" + field + "]").EvalWithMetadb(metadb);
        }
    }
}

function on_mouse_rbtn_up (x, y){   
    tooltip_state && tooltip.Deactivate();

    var _menu = window.CreatePopupMenu();
   
    _menu.AppendMenuItem(MF_ENABLED, 1, "Prefer now playing");
    _menu.AppendMenuItem(MF_ENABLED, 2, "Follow selected track");
    _menu.CheckMenuRadioItem(1, 2, selection_mode + 1);     
   _menu.EnableMenuItem(selection_mode + 1, 1);   

    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 3, "Group text");
    _menu.CheckMenuItem(3, group_text);
    _menu.AppendMenuItem(MF_ENABLED, 4, "Tooltip");
    _menu.CheckMenuItem(4, Tooltip);
   
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 6, "Create txt/xls file");
   
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    MF_STRING =  auto_sizing ? MF_GRAYED : MF_ENABLED;
    _menu.AppendMenuItem(MF_STRING, 7, "Auto-sizing columns");
    _menu.CheckMenuItem(7, auto_sizing);
   
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 10, "Item text: " + lang_text[0]);   
    _menu.AppendMenuItem(MF_ENABLED, 11, "Item text: " + lang_text[1]);   
    _menu.CheckMenuRadioItem(10, 11, lang + 10);         
    _menu.EnableMenuItem(lang + 10, 1);   

    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    MF_STRING = item_value_array[idx] ? MF_ENABLED : MF_GRAYED;
    _menu.AppendMenuItem(MF_STRING, 12, "Copy to clipboard");   
   
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 100, "Reload");
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 200, "Properties");
    _menu.AppendMenuItem(MF_ENABLED, 300, "Configure ...");

    ret = _menu.TrackPopupMenu(x,y);

    switch (ret) {
    case 1:   
        selection_mode = 0;
        window.SetProperty("selection_mode", selection_mode);
        on_item_focus_change();
        break;
    case 2:   
        selection_mode = 1;
        window.SetProperty("selection_mode", selection_mode);
        on_item_focus_change();
        break;
    case 3:
        window.SetProperty("group text", !group_text);
        group_text = window.GetProperty("group text");
        break;
    case 4: 
        window.SetProperty("tooltip", !Tooltip);
        Tooltip = window.GetProperty("tooltip");
        deactive_tooltip();   
        break;
    case 6:
        menu_create_file(x,y);
        break;
    case 7:
        if (!auto_sizing){
            auto_sizing = true;
            window.SetProperty("auto sizing", auto_sizing);
            create_array();
        }
        break;
    case 10:
    case 11:
        lang = ret - 10;
        window.SetProperty("lang", lang);
        create_array();
        break;
    case 12:
        copy_to_clipboard();
        break;
    case 100:
        try {
            window.Reload();   
        } catch(e) {};
        break;
    case 200:
        window.ShowProperties();
        break;   
    case 300:
        window.ShowConfigure();     
        break;
   }
    _menu.Dispose();
    return true;
}

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

var fso = new ActiveXObject("Scripting.FileSystemObject");
var output_path = fb.ProfilePath + "\\tmp_Properties\\";

function check_folder(n) {
    if (!n) return;
    try {
        if(!fso.FolderExists(n)) {fso.CreateFolder(n)};
    } catch(e) {}
}

window.GetProperty("ext",1);
var separator = Array(" ; ","\t"); 
var tmp_output_item_name_array = [];
var output_array = [];
var pllist_name;
var selected;
var shift = 0;;

create_tmp_output_item_name_array();

function  create_tmp_output_item_name_array() {
    tmp_output_item_name_array = [];
    for (var j = 0; j < tfname.length; j++) {   
        if (tfname[j][0].search(/group|lastfm/g) < 0){
        //if (tfname[j].indexOf('group') < 0 || tfname[j].indexOf('%lastfm') < 0){
            tmp_output_item_name_array.push(tfname[j][0]);
        }
    }
}

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

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

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

    if (window.GetProperty("ext") == 0) {
        output_file = output_path + "plist " + pllist_name + ".txt";
    } else {
        output_file = output_path + "plist " + pllist_name + ".xls"; 
    }
   
    try { file = fso.CreateTextFile( output_file )
    } catch(e) { return };
   
    var text_item_name = [];
    var string_item_name = "";
   
    for (var j = 0; j < output_array.length; j++) {
        text_item_name.push(output_array[j]);       
    }
   
    string_item_name = text_item_name.join(separator[window.GetProperty("ext")]);
    file.WriteLine(string_item_name);
    file.WriteLine("");

    for (var i = 0; i < count; i++) {
        item = plman.GetPlaylistSelectedItems(plman.ActivePlaylist).Item(i);
       
        var text_item_value = [];
        var string_item_value = "";
       
        for (var j = 0; j < output_array.length; j++) {   
            value = fb.TitleFormat("[" + output_array[j] + "]").EvalWithMetadb(item);
               
            text = get_measure(output_array[j]);
            text = value && text ?  "  " + text : "";
           
            text_item_value.push(value + text);
           
            string_item_value = text_item_value.join(separator[window.GetProperty("ext")]);
        }
       
        try { file.WriteLine(string_item_value);
        } catch(e) {}; 
    }
    file.Close();
}

function menu_create_file(x, y){
    var _menu = window.CreatePopupMenu();
    var i = 1;
 
    count = plman.GetPlaylistSelectedItems(plman.ActivePlaylist).Count;
    MF_STRING = count == 0 ? MF_GRAYED : MF_ENABLED;
   
    pllist_name = plman.GetPlaylistName(plman.ActivePlaylist);
    pllist_name = count == 0 ? "*" : pllist_name.replace(/[\/\:\*\?\"\<\>\|]/g,'');
   
    _menu.AppendMenuItem(MF_STRING, i++, "Create  " + pllist_name + (window.GetProperty("ext") == 0 ? ".txt" : ".xls"));
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
   
    var lines = 20;   
    bl = tmp_output_item_name_array.length > lines ? lines + shift : tmp_output_item_name_array.length;

    for (var j = shift; j < bl; j++) {
        menuItem = clear_item_name(tmp_output_item_name_array[j]);
        _menu.AppendMenuItem(MF_ENABLED, i++, menuItem);   
        _menu.CheckMenuItem(i - 1, window.GetProperty(i - 2 + shift));
    }
   
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 100, "txt");
    _menu.AppendMenuItem(MF_ENABLED, 101, "xls");
    _menu.CheckMenuRadioItem(100, 101, 100 + window.GetProperty("ext"));     
    _menu.EnableMenuItem(100 + window.GetProperty("ext"), 1);
   
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 110, "Select all");
    _menu.AppendMenuItem(MF_ENABLED, 120, "Clear all");

    if (tmp_output_item_name_array.length > lines) {
        _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
        _menu.AppendMenuItem(shift == 0 ? MF_GRAYED : MF_ENABLED, 130, "Up");
        _menu.AppendMenuItem(shift + lines >= tmp_output_item_name_array.length ? MF_GRAYED : MF_ENABLED, 140, "Down");
    }

    ret = _menu.TrackPopupMenu(x, y - 250);

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

/////////////////////////////  Copy to clipboard

function copy_to_clipboard(){
    var clipboard_text = "";

    for (var i = 0; i < item_name_array.length; i++) {
        group = item_name_array[i].search('group') >= 0 ? true : false;
       
        if (!group){
            name = clear_item_name(item_name_array[i]);
            rating_text = item_name_array[i] == "$meta(rating)" ? lang == 0 ? "  (tag)" : "  (тег)" : "";
           
            name = lang == 0 ? name : item_name_array_2[i];
            value = item_value_array[i];

            clipboard_text = clipboard_text + name + "\t" + value + (i < item_name_array.length - 1 ? "\n" : "");
        }
    }
    htmlfile.parentWindow.clipboardData.setData("text", clipboard_text);
}

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

function draw_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;
}

/////////////////////////////  wsh tooltip (custom paint)

function active_tooltip(){      
    if (!tooltip_state){      
        tooltip_state = true;   
        tooltip.Activate();      
        tooltip.TrackActivate = true;   
    }      
}      
      
function deactive_tooltip(){      
    if (tooltip_state){   
        tooltip.Deactivate();
        tooltip.TrackActivate = false;   
        tooltip_state = false;   
    }      
}      

function on_tooltip_custom_paint(gr){
    for (var i = 0; i < tooltip_t.length; i += 1) {
        gr.GdiDrawText( tooltip_t[i], font_tooltip, RGB(0,0,0), 5, tooltip_t_h * i + 1, tooltip.Width, tooltip.Height, DT_LEFT | DT_WORDBREAK | DT_NOPREFIX );   
    }
}   

function tooltip_activate_wsh(x, y) {
    tooltip_x = t_x2 - 5;
    tooltip_y = idx * t_h - Math.abs(s);

    var value_width = calc_text_data( "w", item_value_array[idx], font_item_value );
   
    if (value_width > ww - t_x2 - t_x1 && x > t_x2 && x < ww - t_x1 && y > tooltip_y + 1 && y < tooltip_y + t_h - 1){
        if (tooltip_time.Time > tooltip_delay_time && !tooltip_state) {
            tooltip_text = item_value_array[idx];
            calc_tooltip_dim();
            tooltip.TrackPosition( tooltip_x, tooltip_y + window.GetProperty(" vertical item padding") / 2);
            active_tooltip();
            tooltip.Text = " ";   
        }       
    } else {   
        tooltip_time.Reset();
        deactive_tooltip();   
    }
}

function calc_tooltip_dim(){
    tooltip_t_w = calc_text_data( "w", tooltip_text, font_tooltip );   
    tooltip_t_h = calc_text_data( "h", tooltip_text, font_tooltip );
    tooltip_t_tmp = calc_text_data( "a", tooltip_text, font_tooltip, tooltip_max_w );
   
    tooltip_t = [];
    tooltip_l = [];

    for (var i = 0; i < tooltip_t_tmp.length; i += 1) {
        if (i % 2 == 0) {
            tooltip_t.push(tooltip_t_tmp[i].replace(/^\s+|\s+$/g, ""));
        } else {
            tooltip_l.push(tooltip_t_tmp[i]);
        }
    }
   
    if (tooltip_t_w <= tooltip_max_w){
        tooltip.Width = tooltip_t_w + 5;
        tooltip.Height = tooltip_t_h;
    } else {
        tooltip.Width = Math.max.apply(null, tooltip_l) + 5;
        tooltip.Height = tooltip_t_h * tooltip_t.length;
    }
}   

function calc_text_data(d, text, font, max_w) {
    var temp_bmp = gdi.CreateImage(1, 1);
    var temp_gr = temp_bmp.GetGraphics();
    var tmp;
   
    switch (d) {
    case "w":
        tmp = temp_gr.CalcTextWidth(text, font);
        break;
    case "h":
        tmp = temp_gr.CalcTextHeight(text, font);
        break;
    case "a":
        tmp = temp_gr.EstimateLineWrap(text, font, max_w).toArray();
        break;
    }
   
    temp_bmp.ReleaseGraphics(temp_gr);
    temp_bmp.Dispose();
    temp_gr = null;
    temp_bmp = null;
    return tmp;
}

/////////////////////////////  jscript tooltip

function tooltip_activate_jscript(x, y) { 
    tooltip_x = t_x2 - 5;
    tooltip_y = idx * t_h - Math.abs(s);

    var value_width = calc_text_data("w",  item_value_array[idx], font_item_value)
   
    if (value_width > ww - t_x2 - t_x1 && x > t_x2 && x < ww - t_x1 && y > tooltip_y + 1 && y < tooltip_y + t_h - 1){
        if (tooltip_time.Time > tooltip_delay_time) {
            tooltip.Text = item_value_array[idx];
            tooltip.TrackPosition( tooltip_x, tooltip_y + window.GetProperty(" vertical item padding") / 2);
            tooltip.TrackActivate = true;
            tooltip.Activate();
            tooltip_state = true;   
        }
    } else {
        tooltip.Deactivate();
        tooltip.TrackActivate = false;
        tooltip_time.Reset();
        tooltip_state = false;   
    }
}

function print(msg) {   
   fb.trace(msg);
}   
 
   

kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 10 лет 11 месяцев

Сообщение #1894 seriousstas » 09.07.2017, 21:17

kgena_ua проверил по Properties - все отлично! :hi:
По tooltip_activate, две функции почти с одинаковым названием
Это почерк Марка ..)
seriousstas
Откуда: Украина , Ивано-Франковск
Репутация: 110
С нами: 9 лет 1 месяц

Сообщение #1895 LUR » 10.07.2017, 16:22

kgena_ua:Всем привет.
Для начала обновлю скрипт биографии.

Biography Text & Album Info & Picture. www.last.fm
version "07072017


Нет функции
get_lastFM_similar_artists(artist_folder_path(artist));
LUR M
Модератор
Аватара
Откуда: Минск
Репутация: 367
С нами: 11 лет 4 месяца

Сообщение #1896 kgena_ua » 12.07.2017, 09:35

LUR, это опять моя не внимательность. Эта функция пока в работе - забыл заремить.
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 10 лет 11 месяцев

Сообщение #1897 LUR » 12.07.2017, 11:58

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

Сообщение #1898 kgena_ua » 12.07.2017, 12:23

LUR:а то я хотел выпускать обновление сборки
LUR, изменения в новой версии биографии значительные по части языков, ранее это было сделано не совсем правильно.
В любом случай выложу изменения для version "07072017".
Хотя изменения в одной строчке, выложу все функцию для удобства.
Код: Выделить всё
function on_mouse_move(x, y) {
    window.SetCursor(IDC_HAND);
   
    pos_x = x;
    pos_y = y;

    on_header = x >= txt_x && x < ww && y >= txt_y && y < t_y ? true : false;
    on_text = x >= txt_x && x < sb_x && y >= t_y && y <= wh ? true : false;
    on_sb =  x >= sb_x && x < ww && y >= t_y && y <= wh ? true : false;
    on_pic = !on_text && !on_header && !on_sb ? true : false;

    if (on_text_down){
        txt_x = x - delta_x;
        txt_y = y - delta_y;

        txt_x = Math.max(0, Math.min(txt_x, ww - t_margin * 2 - h1_char_width - (scrollbar ? scrollbar_w + 10 : 0)));
        txt_y = Math.max(0, Math.min(txt_y, wh - (h1_text_row_height + t_margin * 2)));

        get_text_array();
    }

    if (on_sb_down && scrollbar && text_rows > text_visable_rows){
        sb_posy = y + delta_y;
        s_text = y + delta_y >= 0 ? y + delta_y <= (text_rows - text_visable_rows) * scrollbar_k ? Math.round(sb_posy / scrollbar_k) : text_rows - text_visable_rows : 0;
        window.RepaintRect(txt_x, txt_y, ww - txt_x, wh - txt_y);
    }
   
    if (on_header && on_text_down) {
        text_hiden = false;
        window.SetProperty("txt hiden", text_hiden);
    }

    window.RepaintRect(sb_x, txt_y, ww, wh);
    if (on_text_dblclk) window.Repaint();
}
Код: Выделить всё
function hide_text(x,y){ 
    window.SetProperty("tmp_txt_x", txt_x);
    window.SetProperty("tmp_txt_y", txt_y);

    txt_x = ww - t_margin * 2 - h1_char_width - (scrollbar ? scrollbar_w + 5 : 0);
    txt_y = wh - (h1_text_row_height + t_margin * 2);
    get_text_array();
}
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 10 лет 11 месяцев

Сообщение #1899 LUR » 12.07.2017, 12:28

kgena_ua, погодь еще одну ошибку нашел

Добавлено спустя 7 минут 58 секунд:
В скрипт не вникал, но есть одно странное поведение, при произвольном клике мышкой на пустой панели. Отметил примерную область нажатия. С первого клика воспроизвести не получается, надо несколько раз потыркать в разные места.
Снимок.PNG
LUR M
Модератор
Аватара
Откуда: Минск
Репутация: 367
С нами: 11 лет 4 месяца

Сообщение #1900 LUR » 15.07.2017, 15:51

Появилось свободное время взглянуть на скрипт. Обнаружил источник ошибки по ходу, хотя досконально его природу и не изучил, там происходит переполнение в функции EstimateLineWrap, возможно размер массива слишком велик или еще чего. Глюк происходит при перетаскивании текста на панели, когда на ней пусто. Источник бед в функции on_mouse_move:
Код: Выделить всё
txt_x = Math.max(0, Math.min(txt_x, ww - t_margin * 2 - h1_char_width - (scrollbar ? scrollbar_w + 10 : 0)));
В старой версии скрипта такое:
Код: Выделить всё
txt_x = txt_x <= 0 ? 0 : txt_x >= ww - t_margin * 2 - h1_char_width ? ww - t_margin * 2 - h1_char_width : txt_x;
и работает без ошибок.
Опять же повторюсь, не вникал сильно, но с ходу не ясна логика, по которой второе превратилось в первое, даже с учетом поправки на скроллбар.

Добавлено спустя 26 минут 57 секунд:
Короче вот так нормально работает:
Код: Выделить всё
var max_txt_x = ww - t_margin * 2 - h1_char_width - (scrollbar ? scrollbar_w + 10 : 0);
var max_txt_y = wh - (h1_text_row_height + t_margin * 2);
txt_x = txt_x <= 0 ? 0 : txt_x >= max_txt_x ? max_txt_x : txt_x;
txt_y = txt_y <= 0 ? 0 : txt_y >= max_txt_y ? max_txt_y : txt_y;
LUR M
Модератор
Аватара
Откуда: Минск
Репутация: 367
С нами: 11 лет 4 месяца

Пред.След.

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