seriousstas |
28.06.2016 17:39 |
Вложений: 1
Думал, но ..
Все не так просто - там по линиям ещё несколько параметров,
отдельно настраивается "+" и отдельно "-" и тд..
Выйдет около 10-ка настроек - проще сноски сделать и быстро подогнать в скрипте ..
Цитата:
Забыл сказать, у тебя прокрутка страницы целиком включена
|
Я думал прокрутка взбесилась :)
Цитата:
не выбивается из общей массы))), при взгляде на панель не сосредотачиваешь внимание на них
|
Ну хорошо , а как Тебе такой вариант с полупрозрачними "точками" )
:
Код:
// ==PREPROCESSOR==
// @name "Library Tree"
// @author "Wilb"
// @version "0.8"
// ==/PREPROCESSOR==
//if (!("GetQueryItems" in fb))
//fb.ShowPopupMessage("Library Tree requires:\n\nJScript Panel 1.1.0+\n\n(https://github.com/19379/foo-jscript-panel/releases)");
String.prototype.trim = function () {
return this.replace(/^\s+|[\n\s]+$/g, "");
}
//============================
var g_color_normal_bg = 0;
ppt = {
showwallpaper : window.GetProperty("_DISPLAY: Show Wallpaper", true),
wallpaperblurred : window.GetProperty("_DISPLAY: Wallpaper Blurred", true),
wallpaperblurvalue : window.GetProperty("_DISPLAY: Wallpaper Blur value", 2.00) / 1.6,
wallpapermode : window.GetProperty("_DISPLAY: Wallpaper Mode", false),
wallpaperpath : window.GetProperty("_DISPLAY: Default Wallpaper Path", ".\\wsh_br3tt\\jsplaylist\\images\\default.jpg"),
wallpaperalfa : window.GetProperty("_DISPLAY: Wallpaper Alfa", 150),
wallpaperoverlayalfa : window.GetProperty("_DISPLAY: Wallpaper Overlay Alfa", 50),
};
var brw = null;
var wpp_img_info = {
orient : 0,
cut : 0,
cut_offset : 0,
ratio : 0,
x : 0,
y : 0,
w : 0,
h : 0
};
var g_wallpaperImg = null;
//===================================
function userinterface() {
var blend = "",
custom_col = window.GetProperty("_CUSTOM COLOURS: USE", false),
linecol = window.GetProperty(" Node: Lines: Hide-0 Grey-1 Blend-2 Text-3", 3),
mix = 0,
orig_font_sz = 16,
s_col = window.GetProperty(" Search Style: Fade-0 Blend-1 Norm-2 Highlight-3", 1),
s_linecol = window.GetProperty(" Search: Line Colour: Grey-0 Blend-1 Text-2", 2),
sp = 6,
sp1 = 6,
sp2 = 6,
sum = 0,
sy = window.GetProperty(" Node: Custom Symbols: Collapse|Expand", "[-]|[+]").split("|"),
zoom_font_sz = 16,
zoom = 100;
this.b1 = 0x04ffffff;
this.b2 = 0x04000000;
this.backcol = "";
this.backcol_h = "";
this.backcolsel = "";
this.backcoltrans = "";
this.bg = false;
this.collapse = sy[0].trim();
this.dui = window.InstanceType;
this.expand = sy[1].trim();
this.fill = 0;
this.font;
this.framecol = "";
this.h = 0;
this.j_font;
this.linecol = "";
this.pen = 1;
this.pen_c = 0x55888888;
this.row_h = 20;
this.s_font;
this.s_linecol = "";
this.searchcol = "";
this.sel = 3;
this.symbol_w = 17;
this.textcol = "";
this.textcol_h = "";
this.textselcol = "";
this.textsymbcol = "";
this.txt_box = "";
this.w = 0;
this.alternate = window.GetProperty(" Row Stripes", false);
this.local = typeof conf === 'undefined' ? false : true;
this.margin = window.GetProperty(" Margin", 8);
this.node_style = !window.GetProperty(" Node: Custom Symbols (No Lines)", false);
this.pad = window.GetProperty(" Tree Indent", 19);
this.scrollbar_show = window.GetProperty(" Scrollbar Show", true);
this.scr_w = this.scrollbar_show ? window.GetProperty(" Scrollbar Width", 12) : 0;
window.SetProperty("_CUSTOM COLOURS: EMPTY = DEFAULT", "R-G-B (any) or R-G-B-A (not Text...), e.g. 255-0-0");
var R = function (c) {
return c >> 16 & 0xff;
};
var G = function (c) {
return c >> 8 & 0xff;
};
var B = function (c) {
return c & 0xff;
}
var get_blend = function (c1, c2, f) {
var nf = 1 - f,
r = (R(c1) * f + R(c2) * nf),
g = (G(c1) * f + G(c2) * nf),
b = (B(c1) * f + B(c2) * nf);
return RGB(r, g, b);
}
var set_custom_col = function (c, t) {
if (!custom_col)
return "";
try {
var cc = "",
col = [];
col = c.split("-");
if (col.length != 3 && col.length != 4)
return "";
switch (t) {
case 0:
cc = RGB(col[0], col[1], col[2]);
break;
case 1:
switch (col.length) {
case 3:
cc = RGB(col[0], col[1], col[2]);
break;
case 4:
cc = RGBA(col[0], col[1], col[2], col[3]);
break;
}
break;
}
return cc;
} catch (e) {
return ""
};
}
this.get_textselcol = function (c) {
var cc = [R(c), G(c), B(c)];
var ccc = [];
for (var i = 0; i < cc.length; i++) {
ccc[i] = cc[i] / 255;
ccc[i] = ccc[i] <= 0.03928 ? ccc[i] / 12.92 : Math.pow(((ccc[i] + 0.055) / 1.055), 2.4);
}
var L = 0.2126 * ccc[0] + 0.7152 * ccc[1] + 0.0722 * ccc[2];
if (L > 0.31)
return RGB(0, 0, 0);
else
return RGB(255, 255, 255);
}
this.outline = function (c, but) {
if (but) {
if (window.IsTransparent || R(c) + G(c) + B(c) > 30)
return RGBA(0, 0, 0, 36);
else
return RGBA(255, 255, 255, 36);
} else if (R(c) + G(c) + B(c) > 255 * 1.5)
return RGB(30, 30, 10);
else
return RGB(225, 225, 245);
}
this.reset_colors = function () {
this.backcol = "";
this.backcol_h = "";
this.backcolsel = "";
this.backcoltrans = "";
this.framecol = "";
this.linecol = "";
this.s_linecol = "";
this.searchcol = "";
this.textcol = "";
this.textcol_h = "";
this.textselcol = "";
this.textsymbcol = "";
this.txt_box = "";
}
this.get_colors = function () {
this.backcol = set_custom_col(window.GetProperty("_Custom.Colour Background", ""), 1);
this.backcol_h = set_custom_col(window.GetProperty("_Custom.Colour Background Highlight", ""), 1);
this.backcolsel = set_custom_col(window.GetProperty("_Custom.Colour Background Selected", ""), 1);
this.linecol = set_custom_col(window.GetProperty("_Custom.Colour Node Lines", ""), 1);
this.txt_box = set_custom_col(window.GetProperty("_Custom.Colour Search Name", ""), 0);
this.s_linecol = set_custom_col(window.GetProperty("_Custom.Colour Search Line", ""), 1);
this.searchcol = set_custom_col(window.GetProperty("_Custom.Colour Search Text", ""), 0);
this.framecol = set_custom_col(window.GetProperty("_Custom.Colour Frame Highlight", ""), 1);
this.textcol = set_custom_col(window.GetProperty("_Custom.Colour Text", ""), 0);
this.textcol_h = set_custom_col(window.GetProperty("_Custom.Colour Text Highlight", ""), 0);
this.textselcol = set_custom_col(window.GetProperty("_Custom.Colour Text Selected", ""), 0);
this.textsymbcol = set_custom_col(window.GetProperty("_Custom.Colour Node Symbol", ""), 0);
this.backcoltrans = set_custom_col(window.GetProperty("_Custom.Colour Transparent Fill", ""), 1);
if (this.dui) { // custom colour mapping: DUI colours can be remapped by changing the numbers (0-3)
if (this.textcol === "")
this.textcol = window.GetColorDUI(0);
if (this.backcol === "")
this.backcol = window.GetColorDUI(1);
if (this.textcol_h === "")
this.textcol_h = window.GetColorDUI(2);
if (this.backcolsel === "")
this.backcolsel = window.GetColorDUI(3);
} else { // custom colour mapping: CUI colours can be remapped by changing the numbers (0-6)
if (this.textcol === "")
this.textcol = window.GetColorCUI(0);
if (this.backcol === "")
this.backcol = window.GetColorCUI(3);
if (this.textcol_h === "")
this.textcol_h = window.GetColorCUI(2);
if (this.backcolsel === "")
this.backcolsel = window.GetColorCUI(4);
if (this.textselcol === "")
this.textselcol = window.GetColorCUI(1);
}
if (this.backcol_h === "")
this.backcol_h = 0x1E30AFED;
if (s_linecol == 1 && window.IsTransparent && !this.dui)
s_linecol = 0;
if (this.framecol === "")
this.framecol = 0xA330AFED;
var blend = get_blend(this.backcol == 0 ? 0xff000000 : this.backcol, this.textcol, 0.75);
var ln_col = [0, RGBA(136, 136, 136, 85), blend, this.textcol];
if (this.linecol === "")
this.linecol = ln_col[linecol];
if (this.searchcol === "")
this.searchcol = s_col < 3 ? this.textcol : this.textcol_h;
if (this.textselcol === "")
this.textselcol = this.get_textselcol(this.backcolsel);
blend = get_blend(this.backcol == 0 ? 0xff000000 : this.backcol, !s_col || s_col == 2 ? this.textcol : this.textcol_h, 0.75);
if (this.txt_box === "")
this.txt_box = s_col < 2 ? get_blend(!s_col ? this.textcol : this.textcol_h, this.backcol == 0 ? 0xff000000 : this.backcol, !s_col ? 0.65 : 0.7) : s_col == 2 ? this.textcol : this.textcol_h;
if (!this.node_style && this.textsymbcol === "")
this.textsymbcol = this.textcol;
if (this.s_linecol === "")
this.s_linecol = s_linecol == 0 ? RGBA(136, 136, 136, 85) : s_linecol == 1 ? blend : this.txt_box;
if (window.IsTransparent && this.backcoltrans) {
this.bg = true;
this.backcol = this.backcoltrans
}
if (!window.IsTransparent || this.dui) {
this.bg = true;
if ((R(this.backcol) + G(this.backcol) + B(this.backcol)) > 759)
this.b2 = 0x06000000;
}
if (this.local) {
this.textcol = c_textcol;
this.textcol_h = c_textcol_h;
this.textselcol = c_textselcol;
this.backcolsel = c_backcolsel;
this.alternate = c_alternate;
this.fill = c_fill;
this.pen = c_pen;
this.pen_c = c_pen_c;
this.searchcol = this.txt_box = c_txt_box;
this.b1 = c_b1;
this.b2 = c_b2;
}
this.ibeamcol1 = window.IsTransparent ? 0xffe1e1f5 : this.outline(this.backcol);
this.ibeamcol2 = window.IsTransparent || !this.backcolsel ? 0xff0099ff : this.backcolsel != this.searchcol ? this.backcolsel : 0xff0099ff;
}
this.get_colors();
this.get_font = function () {
if (this.dui)
this.font = window.GetFontDUI(2);
else
this.font = window.GetFontCUI(0);
try {
this.font.Name;
this.font.Size;
this.font.Style;
} catch (e) {
this.font = gdi.Font("Segoe UI", 16, 0);
p.trace("JScript Panel is unable to use your default font. Using Segoe UI at default size & style instead");
}
orig_font_sz = window.GetProperty("SYSTEM.Font Size", 18);
if (this.font.Size != orig_font_sz)
window.SetProperty(" Zoom Font Size (%)", 225);
orig_font_sz = this.font.Size;
window.SetProperty("SYSTEM.Font Size", this.font.Size)
zoom = window.GetProperty(" Zoom Font Size (%)", 100);
zoom_font_sz = Math.max(Math.round(orig_font_sz * zoom / 100), 1);
this.font = gdi.Font(this.font.Name, zoom_font_sz, this.font.Style);
window.SetProperty(" Zoom Font Size (%)", Math.round(zoom_font_sz / orig_font_sz * 100));
this.s_font = gdi.Font(this.font.Name, this.font.Size, 2);
this.j_font = gdi.Font(this.font.Name, this.font.Size * 1.5, 1);
if (this.local) {
this.font = c_font;
this.s_font = c_s_font;
this.j_font = gdi.Font(this.font.Name, this.font.Size * 1.5, 1);
this.margin = c_margin;
this.pad = c_pad;
this.row_h = c_row_h;
this.scr_w = c_scr_w;
}
this.calc_text();
}
this.calc_text = function () {
var i = gdi.CreateImage(1, 1),
g = i.GetGraphics();
this.row_h = Math.round(g.CalcTextHeight("String", this.font)) + window.GetProperty(" Row Vertical Item Padding", 3);
sp = Math.round(g.CalcTextWidth(" ", this.font));
sp1 = Math.max(Math.round(sp * 1.5), 6);
sp2 = Math.round(g.CalcTextWidth(this.expand, this.font));
this.symbol_w = this.node_style ? 22 + sp1 : sp + sp2;
this.sel = (this.node_style ? sp1 : sp) / 2;
this.tt = this.node_style ? -Math.ceil(sp1 / 2 - 3) + sp1 : sp;
i.ReleaseGraphics(g);
i.Dispose();
}
this.wheel = function (step) {
if (p.m_y > p.s_h) {
zoom_font_sz += step;
zoom_font_sz = Math.max(zoom_font_sz, 1);
this.font = gdi.Font(this.font.Name, zoom_font_sz, this.font.Style);
this.s_font = gdi.Font(this.font.Name, this.font.Size, 2);
this.j_font = gdi.Font(this.font.Name, this.font.Size * 1.5, 1);
this.calc_text();
p.on_size();
jS.on_size();
pop.create_tooltip();
if (p.s_show || this.scrollbar_show)
but.refresh(true);
sbar.reset();
window.Repaint();
window.SetProperty(" Zoom Font Size (%)", Math.round(zoom_font_sz / orig_font_sz * 100));
} else {
if (p.scale < 0.7)
return;
p.scale += step * 0.1;
p.scale = Math.max(p.scale, 0.7);
p.f_font = gdi.Font("segoe ui", p.scale > 1.05 ? Math.floor(11 * p.scale) : 11 * p.scale, 1);
p.f_but_ft = gdi.Font("segoe ui", p.scale > 1.05 ? Math.floor(9 * p.scale) : 9 * p.scale, 1);
p.calc_text();
but.refresh(true);
window.SetProperty(" Zoom Filter Size (%)", Math.round(p.scale * 100));
p.search_paint();
}
}
}
var ui = new userinterface();
function on_colors_changed() {
ui.reset_colors();
ui.get_colors();
if (p.s_show) {
but.create_images();
but.refresh();
}
window.Repaint();
}
function on_font_changed() {
ui.get_font();
sbar.reset();
p.on_size();
pop.create_tooltip();
if (p.s_show || ui.scrollbar_show)
but.refresh(true);
window.Repaint();
}
function scrollbar() {
var smoothness = 0.3439;
this.count = -1;
this.draw_timer = false;
this.hover = false;
this.s1 = 0;
this.s2 = 0;
this.scroll_step = window.GetProperty(" Scroll - Mouse Wheel: Page Scroll", false);
this.scroll_step_mouse = window.GetProperty(" Scroll - Mouse Wheel: Step", 1);
this.smooth = window.GetProperty(" Scroll: Smooth Scroll", true);
this.smooth_scroll_interval = window.GetProperty(" Scroll: Smooth Scroll Interval", 30);
this.timer_but = false;
this.x;
this.y;
this.w;
this.h;
this.bar_ht = 0;
this.but_h;
this.bar_y = 0;
this.row_count = 0;
this.scroll = 0;
this.delta = 0;
this.ratio = 1;
this.rows_drawn = 0;
this.row_h;
this.scrollbar_height = 0;
this.scrollable_lines = 0;
this.scrollbar_travel = 0;
this.b_is_dragging = false;
this.drag_distance_per_row;
this.initial_drag_y = 0; // dragging
this.draw = function (gr) {
if (this.scrollable_lines > 0) {
try {
gr.FillSolidRect(this.x, this.y + this.bar_y, this.w, this.bar_ht, RGBA(200, 200, 200, !this.hover && !this.b_is_dragging ? 75 : 192));
} catch (e) {}
}
}
this.leave = function () {
if (this.b_is_dragging)
return;
this.hover = false;
this.hover_o = false;
window.RepaintRect(this.x, this.y, this.w, this.h);
}
this.nearest = function (y) {
y = (y - this.but_h) / this.scrollbar_height * this.scrollable_lines * this.row_h;
y = y / this.row_h;
y = Math.round(y) * this.row_h;
return y;
}
this.reset = function () {
this.delta = this.scroll = this.s1 = this.s2 = 0;
this.metrics(this.x, this.y, this.w, this.h, this.rows_drawn, this.row_h);
}
this.scroll_timer = function () {
var that = this;
this.draw_timer = window.SetInterval(function () {
if (p.w < 1 || !window.IsVisible)
return;
that.smooth_scroll();
}, this.smooth_scroll_interval);//smooth_scroll_interval def 16
}
this.set_rows = function (row_count) {
this.row_count = row_count;
this.metrics(this.x, this.y, this.w, this.h, this.rows_drawn, this.row_h);
}
this.wheel = function (step) {
this.check_scroll(this.scroll + step * - (this.scroll_step ? this.rows_drawn : this.scroll_step_mouse) * this.row_h);
}
this.metrics = function (x, y, w, h, rows_drawn, row_h) {
this.x = x;
this.y = Math.round(y);
this.w = w;
this.h = h;
this.rows_drawn = rows_drawn;
if (!p.autofit)
this.rows_drawn = Math.floor(this.rows_drawn);
this.row_h = row_h;
this.but_h = ui.scr_w;
// draw info
this.scrollbar_height = this.h - this.but_h * 2;
this.bar_ht = Math.max(Math.round(this.scrollbar_height * this.rows_drawn / this.row_count), 12);
this.scrollbar_travel = this.scrollbar_height - this.bar_ht;
// scrolling info
this.scrollable_lines = this.row_count - this.rows_drawn;
this.ratio = this.row_count / this.scrollable_lines;
this.bar_y = this.but_h + this.scrollbar_travel * (this.delta * this.ratio) / (this.row_count * this.row_h);
this.drag_distance_per_row = this.scrollbar_travel / this.scrollable_lines;
}
this.lbtn_up = function (p_x, p_y) {
var x = p_x - this.x;
var y = p_y - this.y;
if (this.b_is_dragging)
this.b_is_dragging = false;
this.initial_drag_y = 0;
if (this.timer_but) {
window.ClearInterval(this.timer_but);
this.timer_but = false;
};
this.count = -1;
}
this.lbtn_dn = function (p_x, p_y) {
var x = p_x - this.x;
var y = p_y - this.y;
if (x < 0 || x > this.w || y < 0 || y > this.h || this.row_count <= this.rows_drawn)
return;
if (y < this.but_h || y > this.h - this.but_h)
return;
if (y < this.bar_y)
var dir = 1; // above bar
else if (y > this.bar_y + this.bar_ht)
var dir = -1; // below bar
if (y < this.bar_y || y > this.bar_y + this.bar_ht)
this.check_scroll(this.nearest(y));
else { // on bar
this.b_is_dragging = true;
this.initial_drag_y = y - this.bar_y;
}
}
this.move = function (p_x, p_y) {
var x = p_x - this.x;
var y = p_y - this.y;
if (x < 0 || x > this.w || y > this.bar_y + this.bar_ht || y < this.bar_y)
this.hover = false;
else
this.hover = true;
if (this.hover != this.hover_o)
window.RepaintRect(this.x, this.y, this.w, this.h);
this.hover_o = this.hover;
if (!this.b_is_dragging || this.row_count <= this.rows_drawn)
return;
this.check_scroll(Math.round((y - this.initial_drag_y - this.but_h) / this.drag_distance_per_row) * this.row_h);
}
this.check_scroll = function (new_scroll) {
var s = Math.max(0, Math.min(new_scroll, this.scrollable_lines * this.row_h));
if (s == this.scroll)
return;
this.scroll = s;
if (this.smooth) {
if (!this.draw_timer)
this.scroll_timer();
} else {
this.delta = this.scroll;
this.bar_y = this.but_h + this.scrollbar_travel * (this.delta * this.ratio) / (this.row_count * this.row_h);
p.tree_paint();
}
}
this.smooth_scroll = function () {
if (Math.abs(this.scroll - this.delta) > 0.5) {
this.s1 += (this.scroll - this.s1) * smoothness;
this.s2 += (this.s1 - this.s2) * smoothness;
this.delta += (this.s2 - this.delta) * smoothness;
this.bar_y = this.but_h + this.scrollbar_travel * (this.delta * this.ratio) / (this.row_count * this.row_h);
p.tree_paint();
} else if (this.draw_timer) {
window.ClearTimeout(this.draw_timer);
this.draw_timer = false;
}
}
this.but = function (dir) {
this.check_scroll(this.scroll + (dir * -this.row_h));
if (!this.timer_but) {
var that = this;
this.timer_but = window.SetInterval(function () {
if (that.count > 6) {
that.check_scroll(that.scroll + (dir * -that.row_h));
} else
that.count++;
}, 40);
}
}
}
var sbar = new scrollbar();
function panel_operations() {
var def_ppt = window.GetProperty(" View by Folder Structure: Name // Pattern", "View by Folder Structure // Pattern Not Configurable");
var DT_LEFT = 0x00000000,
DT_CENTER = 0x00000001,
DT_RIGHT = 0x00000002,
DT_VCENTER = 0x00000004,
DT_SINGLELINE = 0x00000020,
DT_CALCRECT = 0x00000400,
DT_NOPREFIX = 0x00000800,
DT_END_ELLIPSIS = 0x00008000,
grps = [],
i = 0,
sort = "";
var view_ppt = [
window.GetProperty(" View 01: Name // Pattern", "View by Artist // %artist%|%album%|[[%discnumber%.]%tracknumber%. ][%track artist% - ]%title%"),
window.GetProperty(" View 02: Name // Pattern", "View by Album Artist // %album artist%|%album%|[[%discnumber%.]%tracknumber%. ][%track artist% - ]%title%"),
window.GetProperty(" View 03: Name // Pattern", "View by Album Artist - Album // [%album artist% - ]['['%date%']' ]%album%|[[%discnumber%.]%tracknumber%. ][%track artist% - ]%title%"),
window.GetProperty(" View 04: Name // Pattern", "View by Album // %album%[ '['%album artist%']']|[[%discnumber%.]%tracknumber%. ][%track artist% - ]%title%"),
window.GetProperty(" View 05: Name // Pattern", "View by Genre // %%|[%album artist% - ]%album%|[[%discnumber%.]%tracknumber%. ][%track artist% - ]%title%"),
window.GetProperty(" View 06: Name // Pattern", "View by Year // %date%|[%album artist% - ]%album%|[[%discnumber%.]%tracknumber%. ][%track artist% - ]%title%")
];
var nm = "",
ppt_l = view_ppt.length + 1;
for (i = ppt_l; i < ppt_l + 93; i++) {
nm = window.GetProperty(" View " + (i < 10 ? "0" + i : i) + ": Name // Pattern");
if (nm && nm != " // ")
view_ppt.push(window.GetProperty(" View " + (i < 10 ? "0" + i : i) + ": Name // Pattern"));
}
var filter_ppt = [
window.GetProperty(" View Filter 01: Name // Query", "Filter // Query Not Configurable"),
window.GetProperty(" View Filter 02: Name // Query", "Lossless // \"$info(encoding)\" IS lossless"),
window.GetProperty(" View Filter 03: Name // Query", "Lossy // \"$info(encoding)\" IS lossy"),
window.GetProperty(" View Filter 04: Name // Query", "Missing Replaygain // %replaygain_track_gain% MISSING"),
window.GetProperty(" View Filter 05: Name // Query", "Never Played // %play_count% MISSING"),
window.GetProperty(" View Filter 06: Name // Query", "Played Often // %play_count% GREATER 9"),
window.GetProperty(" View Filter 07: Name // Query", "Recently Added // %added% DURING LAST 2 WEEKS"),
window.GetProperty(" View Filter 08: Name // Query", "Recently Played // %last_played% DURING LAST 2 WEEKS"),
window.GetProperty(" View Filter 09: Name // Query", "Top Rated // rating IS 5")
];
var filt_l = filter_ppt.length + 1;
for (i = filt_l; i < filt_l + 90; i++) {
nm = window.GetProperty(" View Filter " + (i < 10 ? "0" + i : i) + ": Name // Query");
if (nm && nm != " // ")
filter_ppt.push(window.GetProperty(" View Filter " + (i < 10 ? "0" + i : i) + ": Name // Query"));
}
this.cc = DT_CENTER | DT_VCENTER | DT_CALCRECT | DT_NOPREFIX;
this.l = DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_CALCRECT | DT_NOPREFIX;
this.lc = DT_VCENTER | DT_CALCRECT | DT_NOPREFIX | DT_END_ELLIPSIS;
this.rc = DT_RIGHT | DT_VCENTER | DT_CALCRECT | DT_NOPREFIX;
this.f_w = [];
this.f_h = 0;
this.f_x1 = 0;
this.filt = [];
this.folder_view = 10;
this.grp = [];
this.grp_sort = "";
this.grp_split = [];
this.grp_split_clone = [];
this.grp_split_orig = [];
this.f_menu = [];
this.menu = [];
this.multi_value = [];
this.m_x = 0;
this.m_y = 0;
this.pos = -1;
this.s_cursor = false;
this.s_search = false;
this.s_txt = "";
this.s_x = 0;
this.s_h = 0;
this.s_w1 = 0;
this.s_w2 = 0;
this.single_br = false;
this.statistics = false;
this.tf = "";
this.view = "";
this.autofit = window.GetProperty(" Auto Fit", true);
this.syncType = window.GetProperty(" Library Sync: Auto-0, Initialisation Only-1", 0);
this.base = window.GetProperty(" Node: Show All Music", true);
this.s_show = window.GetProperty(" Search: Hide-0, SearchOnly-1, Search+Filter-2", 0);
if (!this.s_show)
this.autofit = true;
this.scale = Math.max(window.GetProperty(" Zoom Filter Size (%)", 100) / 100, 0.7);
window.SetProperty(" Zoom Filter Size (%)", this.scale * 100);
this.f_font = gdi.Font("segoe ui", this.scale > 1.05 ? Math.floor(11 * this.scale) : 11 * this.scale, 1);
this.f_but_ft = gdi.Font("segoe ui", this.scale > 1.05 ? Math.floor(9 * this.scale) : 9 * this.scale, 1);
this.filter_by = window.GetProperty("SYSTEM.Filter By", 0);
this.items = function () {
return plman.GetPlaylistItems(-1);
};
this.list = this.items();
this.reset = window.GetProperty("SYSTEM.Reset Tree", false);
this.search_paint = function () {
window.RepaintRect(ui.margin, 0, ui.w - ui.margin, this.s_h);
}
this.set_statistics_mode = function () {
this.statistics = false;
var chk = this.grp[this.view_by].name + this.grp[this.view_by].type + this.filt[this.filter_by].name + this.filt[this.filter_by].type;
chk = chk.toUpperCase();
if (chk.indexOf("ADD") != -1 || chk.indexOf("PLAY") != -1 || chk.indexOf("RATING") != -1)
this.statistics = true;
}
this.show_tracks = window.GetProperty(" Node: Show Tracks", true);
this.sort = function (li) {
switch (this.view_by) {
case this.folder_view:
li.OrderByPath();
lib.it = li.Clone();
li.OrderByRelativePath();
break;
default:
var tfs = fb.TitleFormat(this.grp_sort);
li.OrderByFormat(fb.TitleFormat(this.grp_sort), 1);
break;
}
}
this.tooltip = window.GetProperty(" Tooltips", false);
this.trace = function (message) {
var trace = true;
if (trace)
fb.trace("Library Tree: " + message);
} // true enables fb.trace
this.tree_paint = function () {
window.RepaintRect(0, Math.floor(this.s_h), ui.w, Math.round(ui.h - this.s_h) + 1);
}
this.view_by = window.GetProperty("SYSTEM.View By", 6);
this.calc_text = function () {
this.f_w = [];
var im = gdi.CreateImage(1, 1),
g = im.GetGraphics();
for (i = 0; i < this.filt.length; i++) {
this.f_w[i] = g.CalcTextWidth(this.filt[i].name, this.f_font);
if (!i)
this.f_h = g.CalcTextHeight("String", this.f_font);
}
this.f_sw = g.CalcTextWidth(" Ў", this.f_but_ft);
this.f_x1 = ui.w - ui.margin - this.f_w[this.filter_by] - this.f_sw;
this.s_w2 = this.s_show > 1 ? this.f_x1 - this.s_x - 11 : this.s_w1 - Math.round(ui.row_h * 0.75) - this.s_x + 1;
im.ReleaseGraphics(g);
im.Dispose();
}
this.fields = function (view, filter) {
this.filt = [];
this.folder_view = 10;
this.grp = [];
this.grp_sort = "";
this.multi_process = false;
this.filter_by = filter;
this.view_by = view;
for (i = 0; i < view_ppt.length; i++) {
if (view_ppt[i].indexOf("//") != -1) {
grps = view_ppt[i].split("//");
this.grp[i] = {
name : grps[0].trim(),
type : grps[1].replace(/\|\]/g, " - ]").replace(/\[\|/g, "[ - ").trim()
}
}
}
grps = [];
for (i = 0; i < filter_ppt.length; i++) {
if (filter_ppt[i].indexOf("//") != -1) {
grps = filter_ppt[i].split("//");
this.filt[i] = {
name : grps[0].trim(),
type : grps[1].trim()
}
}
}
i = this.grp.length;
while (i--)
if (!this.grp[i] || this.grp[i].name == "" || this.grp[i].type == "")
this.grp.splice(i, 1);
i = this.filt.length;
while (i--)
if (!this.filt[i] || this.filt[i].name == "" || this.filt[i].type == "")
this.filt.splice(i, 1);
this.grp[this.grp.length] = {
name : def_ppt.split("//")[0].trim(),
type : ""
}
this.folder_view = this.grp.length - 1;
this.filter_by = Math.min(this.filter_by, this.filt.length - 1);
this.view_by = Math.min(this.view_by, this.grp.length - 1);
if (this.view_by != this.folder_view) {
this.grp_split = this.grp[this.view_by].type.split("|");
this.single_br = !this.base && (this.grp_split.length == 1 || this.grp_split.length == 2 && !this.show_tracks);
this.tf = this.grp_split.length > 1 ? this.grp_split.pop() : this.grp_split[0];
for (i = 0; i < this.grp_split.length; i++) {
this.grp_split[i] = this.grp_split[i].trim();
this.multi_value[i] = this.grp_split[i].indexOf("%<") != -1 ? true : false;
if (this.grp_split[i].indexOf("%<") != -1)
this.multi_process = true;
if (this.multi_value[i]) {
this.grp_split_orig[i] = this.grp_split[i].slice();
this.grp_split[i] = this.grp_split[i].replace(/%%/i, "$if3(%%,%%,%%,%%)").replace(/%%/i, "$if2(%%,%%)").replace(/%%/i, "$if3(%%,%%,%%,%%)");
this.grp_split_clone[i] = this.grp_split[i].slice();
this.grp_split[i] = this.grp_split_orig[i].replace(/[<>]/g, "");
}
this.grp_sort += (this.grp_split[i] + "|");
if (this.multi_value[i])
this.grp_split[i] = this.grp_split_clone[i].replace(/%%/g, "," + "|)#!#");
}
this.grp_sort = this.grp_sort + this.tf;
this.view = this.grp_split[0];
}
this.set_statistics_mode();
window.SetProperty("SYSTEM.Filter By", filter);
window.SetProperty("SYSTEM.View By", view);
this.f_menu = [];
this.menu = [];
for (i = 0; i < this.grp.length; i++)
this.menu.push(this.grp[i].name);
for (i = 0; i < this.filt.length; i++) {
this.f_menu.push(this.filt[i].name);
}
this.menu.splice(this.menu.length, 0, "Panel Properties");
if (this.syncType)
this.menu.splice(this.menu.length, 0, "Refresh");
this.menu.splice(this.menu.length, 0, "Configure...");
this.calc_text();
}
this.fields(this.view_by, this.filter_by);
var k = 1;
for (i = 0; i < 100; i++) {
nm = window.GetProperty(" View " + (i < 10 ? "0" + i : i) + ": Name // Pattern");
if (nm && nm != " // ") {
window.SetProperty(" View " + (k < 10 ? "0" + k : k) + ": Name // Pattern", nm);
k += 1
} else
window.SetProperty(" View " + (i < 10 ? "0" + i : i) + ": Name // Pattern", null);
}
for (i = k; i < k + 5; i++)
window.SetProperty(" View " + (i < 10 ? "0" + i : i) + ": Name // Pattern", " // ");
k = 1;
for (i = 0; i < 100; i++) {
nm = window.GetProperty(" View Filter " + (i < 10 ? "0" + i : i) + ": Name // Query");
if (nm && nm != " // ") {
window.SetProperty(" View Filter " + (k < 10 ? "0" + k : k) + ": Name // Query", nm);
k += 1
} else
window.SetProperty(" View Filter " + (i < 10 ? "0" + i : i) + ": Name // Query", null);
}
for (i = k; i < k + 5; i++)
window.SetProperty(" View Filter " + (i < 10 ? "0" + i : i) + ": Name // Query", " // ");
this.on_size = function () {
this.f_x1 = ui.w - ui.margin - this.f_w[this.filter_by] - this.f_sw;
this.s_x = Math.round(ui.margin + ui.row_h);
this.s_w1 = ui.w - ui.margin;
this.s_w2 = this.s_show > 1 ? this.f_x1 - this.s_x - 11 : this.s_w1 - Math.round(ui.row_h * 0.75) - this.s_x + 1;
this.ln_sp = this.s_show && !ui.local ? ui.row_h * 0.1 : 0;
this.s_h = this.s_show ? ui.row_h + (!ui.local ? this.ln_sp * 2 : 0) : ui.margin;
this.s_sp = this.s_h - this.ln_sp;
this.sp = ui.h - this.s_h - (this.s_show ? 0 : ui.margin);
this.rows = this.sp / ui.row_h;
if (this.autofit) {
this.rows = Math.floor(this.rows);
this.sp = ui.row_h * this.rows;
}
this.node_y = Math.round((ui.row_h - 11) / 2);
var scr_w = ui.scr_w;
if (this.scrollbar_show)
scr_w += 5;
this.r_mg = Math.max(ui.margin, scr_w);
sbar.metrics(ui.w - ui.scr_w, this.s_h, Math.max(ui.scr_w - 1, 0), this.sp - (this.autofit ? 0 : 4), this.rows, ui.row_h);
}
}
var p = new panel_operations();
window.DlgCode = 0x004;
function v_keys() {
this.selAll = 1;
this.copy = 3;
this.back = 8;
this.enter = 13;
this.shift = 16;
this.paste = 22;
this.cut = 24;
this.redo = 25;
this.undo = 26;
this.pgUp = 33;
this.pgDn = 34;
this.end = 35;
this.home = 36;
this.left = 37;
this.up = 38;
this.right = 39;
this.dn = 40;
this.del = 46;
this.k = function (n) {
switch (n) {
case 0:
return utils.IsKeyPressed(0x10);
break;
case 1:
return utils.IsKeyPressed(0x11);
break;
}
}
}
var v = new v_keys();
function library_manager() {
var exp = [],
expanded_items = [],
lib_paths = [],
lib_update = false,
name_idx = [],
name_ix = [],
node = [],
node_s = [],
process = false,
scr = [],
sel = [];
this.allmusic = [];
this.get_paths = true;
this.it = p.items();
this.list;
this.none = "";
this.pth_sort = "";
this.node = [];
this.root = [];
this.time = fb.CreateProfiler();
this.upd = false,
this.upd_search = false;
var tr_sort = function (data) {
data.sort(function (a, b) {
return parseFloat(a.tr) - parseFloat(b.tr)
});
return data;
}
this.update = function () {
if (ui.w < 1 || !window.IsVisible)
this.upd = true;
else {
this.refresh();
this.upd = false;
}
}
this.refresh = function (b) {
if (this.upd) {
p.search_paint();
p.tree_paint();
}
var ix = -1,
tr = 0;
process = false;
if (pop.tree.length && (!b || b && !p.reset)) {
tr = 0;
expanded_items = [];
process = true;
scr = [];
sel = [];
for (var i = 0; i < pop.tree.length; i++) {
tr = !p.base ? pop.tree[i].tr : pop.tree[i].tr - 1;
if (pop.tree[i].child.length)
expanded_items.push({
tr : tr,
a : tr < 1 ? pop.tree[i].name : pop.tree[pop.tree[i].par].name,
b : tr < 1 ? "" : pop.tree[i].name
});
tr = pop.tree[i].tr;
if (pop.tree[i].sel == true)
sel.push({
tr : tr,
a : pop.tree[i].name,
b : tr != 0 ? pop.tree[pop.tree[i].par].name : "",
c : tr > 1 ? pop.tree[pop.tree[pop.tree[i].par].par].name : ""
});
}
var l = Math.min(Math.floor(p.rows), pop.tree.length);
ix = pop.get_ix(0, p.s_h + ui.row_h / 2, true, false);
tr = 0;
for (var i = ix; i < ix + l; i++) {
tr = pop.tree[i].tr;
scr.push({
tr : tr,
a : pop.tree[i].name,
b : tr != 0 ? pop.tree[pop.tree[i].par].name : "",
c : tr > 1 ? pop.tree[pop.tree[pop.tree[i].par].par].name : ""
})
}
exp = JSON.parse(JSON.stringify(tr_sort(expanded_items)));
}
lib_update = true;
this.get_library();
this.rootNodes();
}
this.get_library = function () {
if (this.list)
this.list.Dispose();
if (p.list)
p.list.Dispose();
this.time.Reset();
this.none = "";
this.list = fb.GetLibraryItems();
if (!this.list.Count) {
pop.tree = [];
pop.line_l = 0;
sbar.set_rows(0);
this.none = "Nothing to show\n\nConfigure Media Library first\n\nFile>Preferences>Media library";
p.tree_paint();
return;
}
if (p.filter_by > 0 && p.s_show > 1)
try {
this.list = fb.GetQueryItems(this.list, p.filt[p.filter_by].type)
} catch (e) {};
if (!this.list.Count) {
pop.tree = [];
pop.line_l = 0;
sbar.set_rows(0);
this.none = "Nothing found";
p.tree_paint();
return;
}
this.rootNames("", 0);
}
this.rootNames = function (li, search) {
var i = 0,
name = "",
search_name = "",
tf = fb.TitleFormat(p.view),
total;
switch (search) {
case 0:
p.sort(this.list);
li = p.list = this.list;
name_idx = [];
break;
case 1:
name_ix = [];
break;
}
total = li.Count;
var tree_type = !search ? p.view_by != p.folder_view ? !p.base ? 0 : 1 : !p.base ? 2 : 3 : p.view_by != p.folder_view ? !p.base ? 4 : 7 : !p.base ? 5 : 6;
switch (tree_type) {
case 0:
for (i = 0; i < total; i++) {
name = tf.EvalWithMetadb(li.Item(i));
name_idx[i] = !name.length || name == "#!##!#" ? "?" : name;
};
break;
case 1:
for (i = 0; i < total; i++) {
this.allmusic[i] = tf.EvalWithMetadb(li.Item(i));
};
break;
case 2:
for (i = 0; i < total; i++) {
node[i] = fb.GetLibraryRelativePath(li.Item(i)).split("\\");
name_idx[i] = node[i][0];
};
break;
case 3:
for (i = 0; i < total; i++) {
node[i] = fb.GetLibraryRelativePath(li.Item(i)).split("\\");
};
break;
case 4:
for (i = 0; i < total; i++) {
name = tf.EvalWithMetadb(li.Item(i));
name_ix[i] = !name.length || name == "#!##!#" ? "?" : name;
};
break
case 5:
for (i = 0; i < total; i++) {
node_s[i] = fb.GetLibraryRelativePath(li.Item(i)).split("\\");
name_ix[i] = node_s[i][0];
};
break;
case 6:
for (i = 0; i < total; i++) {
node_s[i] = fb.GetLibraryRelativePath(li.Item(i)).split("\\");
};
break;
}
}
this.rootNodes = function () {
this.root = [];
var i = 0,
j = 1,
h = 0,
l = 0,
n = "";
if (p.s_txt && (this.upd_search || lib_update)) {
if (!this.list.Count)
return;
this.none = "";
try {
p.list = fb.GetQueryItems(this.list, p.s_txt)
} catch (e) {};
if (!p.list.Count) {
pop.tree = [];
pop.line_l = 0;
sbar.set_rows(0);
this.none = "Nothing found";
p.tree_paint();
return;
}
this.rootNames(p.list, 1);
this.node = node_s.slice();
this.upd_search = false;
} else if (!p.s_txt) {
p.list = this.list;
this.node = node.slice()
};
var arr = !p.s_txt ? name_idx : name_ix,
n_o = "#get_node#",
nU = "",
total = p.list.Count;
if (!p.base)
for (l = 0; l < total; l++) {
n = arr[l];
nU = n.toUpperCase();
if (nU != n_o) {
n_o = nU;
this.root[i] = {
name : n,
sel : false,
child : [],
item : []
};
this.root[i].item.push(l);
i++;
} else
this.root[i - 1].item.push(l);
}
else {
this.root[0] = {
name : "All Music",
sel : false,
child : [],
item : []
};
for (l = 0; l < total; l++)
this.root[0].item.push(l);
}
if (!lib_update)
sbar.reset();
/* Draw tree -> */
if (!p.base || p.s_txt)
pop.buildTree(this.root, 0);
if (p.base)
pop.branch(this.root[0], true);
p.trace("populated in: " + this.time.Time / 1000 + " seconds");
var gp = p.grp_split.length,
tot = this.list.Count;
if (gp > 1 && !p.s_txt && p.view_by != p.folder_view) {
this.node = [];
for (h = 0; h < gp; h++)
this.node[h] = [];
var tf_gr = [];
for (j = 1; j < gp; j++)
tf_gr[j] = fb.TitleFormat(p.grp_split[j])
for (i = 0; i < tot; i++)
for (j = 1; j < gp; j++)
this.node[j][i] = tf_gr[j].EvalWithMetadb(this.list.Item(i));
}
if (lib_update && process) {
try {
var exp_l = exp.length,
scr_l = scr.length,
sel_l = sel.length,
tree_l = pop.tree.length;
for (h = 0; h < exp_l; h++) {
if (exp[h].tr == 0) {
for (j = 0; j < tree_l; j++)
if (pop.tree[j].name.toUpperCase() == exp[h].a.toUpperCase()) {
pop.branch(pop.tree[j]);
break;
}
} else if (exp[h].tr > 0) {
for (j = 0; j < tree_l; j++)
if (pop.tree[j].name.toUpperCase() == exp[h].b.toUpperCase() && pop.tree[pop.tree[j].par].name.toUpperCase() == exp[h].a.toUpperCase()) {
pop.branch(pop.tree[j]);
break;
}
}
}
for (h = 0; h < sel_l; h++) {
if (sel[h].tr == 0) {
for (j = 0; j < tree_l; j++)
if (pop.tree[j].name.toUpperCase() == sel[h].a.toUpperCase()) {
pop.tree[j].sel = true;
break;
}
} else if (sel[h].tr == 1) {
for (j = 0; j < tree_l; j++)
if (pop.tree[j].name.toUpperCase() == sel[h].a.toUpperCase() && pop.tree[pop.tree[j].par].name.toUpperCase() == sel[h].b.toUpperCase()) {
pop.tree[j].sel = true;
break;
}
} else if (sel[h].tr > 1) {
for (j = 0; j < tree_l; j++)
if (pop.tree[j].name.toUpperCase() == sel[h].a.toUpperCase() && pop.tree[pop.tree[j].par].name.toUpperCase() == sel[h].b.toUpperCase() && pop.tree[pop.tree[pop.tree[j].par].par].name.toUpperCase() == sel[h].c.toUpperCase()) {
pop.tree[j].sel = true;
break;
}
}
}
var scr_pos = false;
h = 0;
while (h < scr_l && !scr_pos) {
if (scr[h].tr == 0) {
for (j = 0; j < tree_l; j++)
if (pop.tree[j].name.toUpperCase() == scr[h].a.toUpperCase()) {
sbar.check_scroll(!h ? j * ui.row_h : (j - 3) * ui.row_h);
scr_pos = true;
break;
}
} else if (scr[h].tr == 1 && !scr_pos) {
for (j = 0; j < tree_l; j++)
if (pop.tree[j].name.toUpperCase() == scr[h].a.toUpperCase() && pop.tree[pop.tree[j].par].name.toUpperCase() == scr[h].b.toUpperCase()) {
sbar.check_scroll(!h ? j * ui.row_h : (j - 3) * ui.row_h);
scr_pos = true;
break;
}
} else if (scr[h].tr > 1 && !scr_pos) {
for (j = 0; j < tree_l; j++)
if (pop.tree[j].name.toUpperCase() == scr[h].a.toUpperCase() && pop.tree[pop.tree[j].par].name.toUpperCase() == scr[h].b.toUpperCase() && pop.tree[pop.tree[pop.tree[j].par].par].name.toUpperCase() == scr[h].c.toUpperCase()) {
sbar.check_scroll(!h ? j * ui.row_h : (j - 3) * ui.row_h);
scr_pos = true;
break;
}
}
h++;
}
if (!scr_pos) {
sbar.reset();
p.tree_paint();
}
} catch (e) {};
}
if (lib_update && !process) {
sbar.reset();
p.tree_paint();
}
if (p.view_by == p.folder_view && (this.get_paths || lib_update)) {
var f = "",
f_o = "",
it_l = this.it.Count;
this.pth_sort = "";
for (var b = 0; b < it_l; b++) {
f = this.it.Item(b).Path.replace(fb.GetLibraryRelativePath(this.it.Item(b)), "");
if (f != f_o) {
f_o = f;
lib_paths.push(f_o);
}
}
var pth_l = lib_paths.length;
for (b = 0; b < pth_l; b++) {
if (!b)
this.pth_sort = lib_paths[0] + ",";
else
this.pth_sort += ("," + lib_paths[b] + ",");
}
this.pth_sort = "$replace(%path%," + this.pth_sort + ")";
}
this.get_paths = false;
lib_update = false;
}
}
var lib = new library_manager();
function populate() {
var get_pos = -1,
ix_o = 0,
last_sel = -1,
m_i = -1,
tt = "",
tooltip = false,
tt_c = 0,
tt_h = 20,
tt_id = -1;
var dbl_action = window.GetProperty(" Double-Click Action: ExplorerStyle-0 Play-1", 1);
var auto = window.GetProperty(" Node: Auto Collapse", false);
var autoplay = window.GetProperty(" Playlist: Autoplay On Send", false);
var lib_playlist = window.GetProperty(" Playlist", "Library view");
var show_counts = window.GetProperty(" Node: Show Item Counts", true);
var symb = window.CreateThemeManager("TREEVIEW");
var im = gdi.CreateImage(11, 11),
g = im.GetGraphics(),
symb_style = 0;
if (ui.node_style)
try {
symb.SetPartAndStateId(2, 1);
symb.SetPartAndStateId(2, 2);
symb.DrawThemeBackground(g, 0, 0, 11, 11);
} catch (e) {
symb_style = 1;
}
im.ReleaseGraphics(g);
im.Dispose();
var sy_font = gdi.Font("Segoe UI", 24, 1),// font symb
symb_style = 0;
this.line_l = 0;
this.sel_items = [];
this.tree = [];
if (!window.GetProperty("SYSTEM.Playlist Checked", false))
fb.ShowPopupMessage("Library Tree uses the following playlist by default:\n\nLibrary view\n\nIf you wish to use a different playlist, change the one used by Library Tree in properties.", "Library Tree");
window.SetProperty("SYSTEM.Playlist Checked", true);
var arr_contains = function (arr, item) {
var n = false;
for (var i = 0; i < arr.length; i++)
if (arr[i] == item) {
n = true;
break;
}
return n;
}
var arr_index = function (arr, item) {
var n = -1;
for (var i = 0; i < arr.length; i++)
if (arr[i] == item) {
n = i;
break;
}
return n;
}
var check_node = function (gr) {
if (sbar.draw_timer || !ui.node_style)
return;
symb_style = 0;
try {
symb.SetPartAndStateId(2, 1);
symb.SetPartAndStateId(2, 2);
symb.DrawThemeBackground(gr, -11, -11, 11, 11);
} catch (e) {
symb_style = 1;
}
}
var draw_node = function (gr, parent, x, y) {
switch (symb_style) {
case 1:
symb.SetPartAndStateId(2, parent ? 1 : 2);
symb.DrawThemeBackground(gr, x, y, 11, 11);
break;
case 0:
gr.FillSolidRect(x+0.5, y-2, 17, 17, RGBA(226, 226, 226 ,100));
gr.DrawRect(x+0.5, y-2, 16, 17, 2, RGB(163, 163, 163));
if (parent) {
gr.GdiDrawText("+" , sy_font, RGB(0, 0, 0), x, y-12 , 26, 26)
}
else
gr.GdiDrawText("-" , sy_font, RGB(0, 0, 0), x+4, y-12 , 26, 26)
break;
}
}
var num_sort = function (a, b) {
return a - b;
}
var plID = function (Playlist_Name) {
for (var i = 0; i < plman.PlaylistCount; i++)
if (plman.GetPlaylistName(i) == Playlist_Name)
return i;
plman.CreatePlaylist(plman.PlaylistCount, Playlist_Name);
return i;
}
var searchBranches = function (item, tr) {
var nn = "",
tf_l = fb.TitleFormat("[" + p.grp_split[tr] + "]");
if (tr < p.grp_split.length) {
nn = tf_l.EvalWithMetadb(p.list.Item(item));
if (!nn || nn == "#!##!#")
nn = "?";
return nn;
} else
return "#get_track#";
}
var sort = function (c, d) {
a = c.name.toUpperCase().replace(/^\?/, "");
b = d.name.toUpperCase().replace(/^\?/, "");
if (a < b)
return -1;
if (a > b)
return 1;
return 0;
}
var uniq = function (a) {
var j = 0,
len = a.length,
out = [],
seen = {};
for (var i = 0; i < len; i++) {
var item = a[i];
if (seen[item] !== 1) {
seen[item] = 1;
out[j++] = item;
}
}
return out.sort(num_sort);
}
this.branch_chg = function (br) {
var new_br = 0;
if (br.tr == 0) {
for (var i = 0; i < lib.root.length; i++) {
new_br += lib.root[i].child.length;
lib.root[i].child = [];
}
} else {
var par = this.tree[br.par];
for (var i = 0; i < par.child.length; i++) {
new_br += par.child[i].child.length;
par.child[i].child = [];
}
}
return new_br;
}
this.clear = function () {
for (var i = 0; i < this.tree.length; i++)
this.tree[i].sel = false;
}
this.clear_child = function (br) {
br.child = [];
this.buildTree(lib.root, 0, true, true);
}
this.deactivate_tooltip = function () {
tt_c = 0;
tt.Text = "";
tt.TrackActivate = false;
tt.Deactivate();
}
this.mbtn_dn = function (x, y) {
if (y < p.s_h)
return;
var ix = this.get_ix(x, y, true, false);
p.pos = ix;
if (ix < this.tree.length && ix >= 0)
if (this.check_ix(this.tree[ix], x, y, true)) {
this.load(this.tree[ix].item, true, true, false, false);
this.tree[ix].sel = true;
}
}
this.create_tooltip = function () {
if (!p.tooltip)
return;
if (tt)
tt.Dispose();
tt = window.CreateTooltip(ui.font.Name, ui.font.Size, ui.font.Style);
tt_h = ui.row_h - window.GetProperty(" Row Vertical Item Padding", 3);
tt.SetDelayTime(0, 500);
tt.Text = "";
}
this.activate_tooltip = function (ix, row) {
if (tt_c == 2) {
tt_id = ix;
return;
}
tt_c += 1;
tt.Activate();
tt.TrackActivate = true;
tt.Text = this.tree[ix].name + ((this.tree[ix].track && p.show_tracks) ? ("") : (" (" + this.tree[ix].item.length + ")"));
tt.TrackPosition(Math.round(ui.pad * this.tree[ix].tr + ui.margin) + (!ui.node_style && this.tree[ix].track ? 0 : ui.symbol_w) - ui.tt, row * ui.row_h + p.s_h - Math.floor((ui.row_h - tt_h) / 2));
timer.tooltip();
}
this.branch = function (br, base, node) {
if (!br)
return;
var br_l = br.item.length,
branch = false,
folderView = p.view_by == p.folder_view ? true : false,
i = 0,
k = 0,
isTrack = false,
l = base ? 0 : p.base ? br.tr : br.tr + 1,
n = "",
n_o = "#get_branch#",
nU = "",
tf = fb.TitleFormat(p.tf),
treatAsTrack = !folderView && l < p.grp_split.length - 1 ? true : false;
if (folderView)
base = false;
if (base)
node = false;
if (!folderView && l < p.grp_split.length)
branch = true;
if (!folderView && !branch && !p.show_tracks)
return;
for (k = 0; k < br_l; k++) {
var get_track = true,
pos = br.item[k];
if (folderView && l == lib.node[pos].length - 1 && !p.show_tracks)
get_track = false;
if (get_track) {
if (base) {
n = lib.allmusic[pos];
if (!n || n == "#!##!#")
n = "?";
}
if (!p.s_txt && !base) {
if (branch || folderView && l < lib.node[pos].length - 1) {
n = (!folderView ? lib.node[l][pos] : lib.node[pos][l]);
if (!n || n == "#!##!#")
n = "?";
} else
n = "#get_track#";
} else if (p.s_txt) {
if (folderView && l < lib.node[pos].length - 1) {
n = lib.node[pos][l];
if (!n || n == "#!##!#")
n = "?";
} else
n = searchBranches(pos, l);
}
if (br.track)
continue;
isTrack = p.show_tracks ? false : treatAsTrack || folderView && l < lib.node[pos].length - 2 ? false : true;
if (n == "#get_track#") {
n = !folderView ? tf.EvalWithMetadb(p.list.Item(pos)) : lib.node[pos][l];
isTrack = true;
}
nU = n.toUpperCase();
if (n_o != nU) {
n_o = nU;
br.child[i] = {
name : n,
sel : false,
child : [],
track : isTrack,
item : []
};
br.child[i].item.push(pos);
i++;
} else
br.child[i - 1].item.push(pos);
}
}
this.buildTree(lib.root, 0, node, true);
}
var getAllCombinations = function (n) {
var combinations = [],
divisors = [],
nn = [],
arraysToCombine = [];
nn = n.split("#!#");
for (var i = 0; i < nn.length; i++) {
nn[i] = nn[i].split("|");
if (nn[i] != "")
arraysToCombine.push(nn[i]);
}
for (var i = arraysToCombine.length - 1; i >= 0; i--)
divisors[i] = divisors[i + 1] ? divisors[i + 1] * arraysToCombine[i + 1].length : 1;
function getPermutation(n, arraysToCombine) {
var result = [],
curArray;
for (var i = 0; i < arraysToCombine.length; i++) {
curArray = arraysToCombine[i];
result.push(curArray[Math.floor(n / divisors[i]) % curArray.length]);
}
return result;
}
var numPerms = arraysToCombine[0].length;
for (var i = 1; i < arraysToCombine.length; i++)
numPerms *= arraysToCombine[i].length;
for (var i = 0; i < numPerms; i++)
combinations.push(getPermutation(i, arraysToCombine));
return combinations;
}
this.buildTree = function (br, tr, node, full) {
var br_l = br.length,
i = 0,
j = 0,
l = !p.base ? tr : tr - 1;
if (p.multi_process) {
var simple = l == p.grp_split.length ? true : false;
var h = -1,
multi = [],
multi_cond = [],
multi_obj = [],
multi_rem = [],
n = "",
n_o = "#condense#",
nm_arr = [],
nU = "";
if (!simple) {
for (i = 0; i < br_l; i++) {
if (br[i].name.indexOf("|") != -1) {
multi = getAllCombinations(br[i].name);
multi_rem.push(i);
for (var m = 0; m < multi.length; m++)
multi_obj.push({
name : multi[m].join(""),
item : br[i].item.slice()
});
}
}
i = multi_rem.length;
while (i--)
br.splice(multi_rem[i], 1);
br_l = br.length;
multi_obj.sort(sort);
i = 0;
while (i < multi_obj.length) {
n = multi_obj[i].name;
nU = n.toUpperCase();
if (n_o != nU) {
n_o = nU;
multi_cond[j] = {
name : n,
item : multi_obj[i].item.slice()
};
j++
} else
multi_cond[j - 1].item.push.apply(multi_cond[j - 1].item, multi_obj[i].item.slice());
i++
}
for (i = 0; i < br_l; i++) {
br[i].name = br[i].name.replace(/#!#/g, "");
nm_arr.push(br[i].name);
}
for (i = 0; i < multi_cond.length; i++) {
h = arr_index(nm_arr, multi_cond[i].name);
if (h != -1) {
br[h].item.push.apply(br[h].item, multi_cond[i].item.slice());
multi_cond.splice(i, 1);
}
}
for (i = 0; i < multi_cond.length; i++)
br.splice(i + 1, 0, {
name : multi_cond[i].name,
sel : false,
track : false,
child : [],
item : multi_cond[i].item.slice()
});
}
if (!node || node && !full)
br.sort(sort);
i = br.length;
while (i--) {
if (i != 0 && br[i].name.toUpperCase() == br[i - 1].name.toUpperCase()) {
br[i - 1].item.push.apply(br[i - 1].item, br[i].item.slice());
br.splice(i, 1);
}
}
}
var par = this.tree.length - 1;
if (tr == 0)
this.tree = [];
br_l = br.length;
for (i = 0; i < br_l; i++) {
j = this.tree.length;
this.tree[j] = br[i];
this.tree[j].top = !i ? true : false;
this.tree[j].bot = i == br_l - 1 ? true : false;
if (tr == (p.base ? 1 : 0) && i == br_l - 1)
this.line_l = j;
this.tree[j].tr = tr;
this.tree[j].par = par;
this.tree[j].ix = j;
if (p.single_br)
this.tree[j].track = true;
if (!p.base && p.view_by == p.folder_view && !p.show_tracks) {
var n_id = this.tree[j].item[0];
if (lib.node[n_id].length == 1 || lib.node[n_id].length == 2 && !p.show_tracks)
this.tree[j].track = true;
}
if (br[i].child.length > 0)
this.buildTree(br[i].child, tr + 1, node, p.base && tr == 0 ? true : false);
}
if (p.base && this.tree.length == 1)
this.line_l = 0;
sbar.set_rows(this.tree.length);
p.tree_paint();
}
this.load = function (list, type, add, send, sort) {
var i = 0,
np_item = -1,
pid = -1,
pln = plID(lib_playlist);
plman.ActivePlaylist = pln;
if (type) {
var items = p.items();
for (var i = 0; i < list.length; i++)
items.Add(p.list.Item(list[i]));
} else
var items = list.Clone();
if (fb.IsPlaying && !add && fb.GetNowPlaying()) {
for (i = 0; i < items.Count; i++)
if (fb.GetNowPlaying().Compare(items.Item(i))) {
np_item = i;
break;
}
if (np_item != -1) {
var np = plman.GetPlayingItemLocation();
if (np.IsValid && np.PlaylistIndex == pln)
pid = np.PlaylistItemIndex;
}
if (np_item != -1 && pid == -1 && items.Count < 5000) {
if (ui.dui)
plman.SetActivePlaylistContext();
for (i = 0; i < 20; i++) {
fb.RunMainMenuCommand("Edit/Undo");
var np = plman.GetPlayingItemLocation();
if (np.IsValid && lib_playlist == plman.GetPlaylistName(np.PlaylistIndex)) {
pid = np.PlaylistItemIndex;
if (pid != -1)
break;
}
}
}
if (np_item != -1 && pid != -1) {
plman.SetPlaylistSelectionSingle(pln, pid, true);
plman.RemovePlaylistSelection(pln, true);
var it = items.Clone();
items.RemoveRange(np_item, items.Count);
it.RemoveRange(0, np_item + 1);
plman.UndoBackup(pln);
plman.InsertPlaylistItems(pln, 0, items);
plman.InsertPlaylistItems(pln, plman.PlaylistItemCount(pln), it);
} else {
plman.UndoBackup(pln);
plman.ClearPlaylist(pln);
plman.InsertPlaylistItems(pln, 0, items);
}
} else if (!add) {
plman.UndoBackup(pln);
plman.ClearPlaylist(pln);
plman.InsertPlaylistItems(pln, 0, items);
} else {
if (items.Count < 5000 && plman.PlaylistItemCount(pln) < 5000 && sort) {
plman.UndoBackup(pln);
plman.InsertPlaylistItems(pln, plman.PlaylistItemCount(pln), items);
if (ui.dui)
plman.SetActivePlaylistContext();
fb.RunMainMenuCommand("Edit/Remove Duplicates");
plman.SortByFormat(pln, p.view_by != p.folder_view ? p.grp_sort : lib.pth_sort);
} else {
plman.UndoBackup(pln);
plman.InsertPlaylistItems(pln, plman.PlaylistItemCount(pln), items);
}
}
if (autoplay && send) {
var c = (plman.PlaybackOrder == 3 || plman.PlaybackOrder == 4) ? Math.ceil(plman.PlaylistItemCount(pln) * Math.random() - 1) : 0;
plman.ExecutePlaylistDefaultAction(pln, c);
}
}
this.draw = function (gr) {
if (!pop.tree.length)
return gr.GdiDrawText(lib.none, ui.font, ui.textcol, ui.margin, p.s_h, ui.w - p.r_mg, ui.row_h * (lib.none.length > 14 ? 5 : 1), 0x00000004 | 0x00000400);
var item_x = 0,
item_y = 0,
item_w = 0,
ln_x = ui.margin + 5 + (p.base ? ui.pad : 0),
nm = "",
s = Math.round(sbar.delta / ui.row_h + 0.4),
e = s + p.rows;
e = this.tree.length < e ? this.tree.length : e,
sel_x = 0,
sel_w = 0,
y1 = p.s_h - sbar.delta + p.node_y;
check_node(gr);
for (var i = s; i < e; i++) {
item_y = ui.row_h * i + p.s_h - sbar.delta;
if (ui.alternate) {
if (i % 2 == 0)
gr.FillSolidRect(0, item_y + 1, ui.w, ui.row_h - 2, ui.b1);
else
gr.FillSolidRect(0, item_y, ui.w, ui.row_h, ui.b2);
}
if (ui.node_style && ui.linecol) {
var end_br = [],
j = this.tree[i].tr,
l_x = 0,
l_y = item_y + ui.row_h / 2;
if (p.base)
j -= 1;
var h1 = this.tree[i].top ? ui.row_h / 4 : ui.row_h;
if (this.tree[i].tr != 0) {
var par = this.tree[i].par,
pr_pr = [];
for (var m = 1; m < j + 1; m++) {
if (m == 1)
pr_pr[m] = par;
else
pr_pr[m] = this.tree[pr_pr[m - 1]].par
if (this.tree[pr_pr[m]].bot)
end_br[m] = true;
else
end_br[m] = false;
}
}
for (var k = 0; k < j + 1; k++) {
if (this.tree[i].top && !k && !this.tree[i].track)
h1 = ui.row_h / 2;
else
h1 = ui.row_h;
if (!k && !j && this.tree[i].top && !this.tree[i].track)
h1 = -ui.row_h / 4;
if (this.tree[i].track && !k && this.tree[i].top)
h1 = ui.row_h / 2
if (!end_br[k] && k == 1)
h1 = ui.row_h;
if (end_br[k])
h1 = 0;
var h3 = l_y - h1;
if (h3 < p.s_h)
h1 = p.s_h - h3;
l_x = (Math.round(ui.pad * this.tree[i].tr + ui.margin) + 5) - ui.pad * k;
var h2 = ((!this.tree[i].bot && !k && this.tree[i].track && i == Math.ceil(e - 1)) ||
(!this.tree[i].bot && !end_br[k] && !this.tree[i].track && i == Math.ceil(e - 1)) ||
(k && !end_br[k] && i == e - 1)) ? ui.row_h / 2 : 0;
if (k != j)
gr.FillSolidRect(l_x+2.5, l_y+3 - h1, 1, h1 + h2, ui.linecol);// ___Y_LINE___
}
}
}
if (ui.node_style && ui.linecol) {
var top = p.base ? p.s_h + ui.row_h * 3 / 4 : p.s_h;
var ln_y = sbar.scroll == 0 ? top + p.node_y : p.s_h;
var ln_h = Math.min(this.line_l * ui.row_h - sbar.delta + (sbar.scroll == 0 ? (p.base ? -ui.row_h * 3 / 4 : 0) : p.node_y), ui.row_h * Math.ceil(p.rows) - (sbar.scroll == 0 ? (p.node_y + (p.base ? ui.row_h * 3 / 4 : 0)) : 0));
if (e == this.tree.length)
ln_h += ui.row_h / 4;
if (this.line_l)
{}
gr.FillSolidRect(ln_x+3, ln_y, 1, ln_h, ui.linecol);// ___X_LINE___
}
for (i = s; i < e; i++) {
if (this.tree[i].sel && ui.backcolsel != 0) {
item_y = ui.row_h * i + p.s_h - sbar.delta;
nm = this.tree[i].name + (show_counts && (!this.tree[i].track || !p.show_tracks) ? " (" + this.tree[i].item.length + ")" : "");
item_w = gr.CalcTextWidth(nm, ui.font) + ui.row_h * 0.2;
item_x = Math.round(ui.pad * this.tree[i].tr + ui.margin);
if (ui.node_style || !this.tree[i].track)
item_x = item_x + ui.symbol_w;
sel_x = item_x - ui.sel;
sel_w = Math.min(item_w, ui.w - sel_x - 1 - p.r_mg)
{}
gr.FillSolidRect(sel_x, item_y, sel_w, ui.row_h, ui.backcolsel);
}
}
for (i = s; i < e; i++) {
item_y = ui.row_h * i + p.s_h - sbar.delta;
nm = this.tree[i].name + (show_counts && (!this.tree[i].track || !p.show_tracks) ? " (" + this.tree[i].item.length + ")" : "");
item_w = gr.CalcTextWidth(nm, ui.font) + ui.row_h * 0.2;
this.tree[i].w = item_w;
item_x = Math.round(ui.pad * this.tree[i].tr + ui.margin);
if (ui.node_style) {
var y2 = ui.row_h * i + y1 + 5;
if (!this.tree[i].track) {
if (ui.linecol)
gr.FillSolidRect(item_x + 25, y2+1, 4, 1, ui.linecol); // X_LINE
draw_node(gr, this.tree[i].child.length < 1, item_x, item_y + p.node_y);
} else if (ui.linecol)
gr.FillSolidRect(item_x + 9, y2, 7, 1, ui.linecol);// X_LINE
} else if (!this.tree[i].track)
gr.GdiDrawText(this.tree[i].child.length < 1 ? ui.expand : ui.collapse, ui.font, ui.textsymbcol, item_x, item_y, ui.w - item_x - p.r_mg, ui.row_h, p.lc);
if (ui.node_style || !this.tree[i].track)
item_x = item_x + ui.symbol_w;
if (m_i == i) {
sel_x = item_x - ui.sel;
sel_w = Math.min(item_w, ui.w - sel_x - 1 - p.r_mg);
gr.FillSolidRect(sel_x, item_y, sel_w, ui.row_h, ui.backcol_h);
gr.DrawRect(sel_x, item_y, sel_w, ui.row_h, 1, ui.framecol);
}
var txt_c = this.tree[i].sel ? ui.textselcol : m_i == i ? ui.textcol_h : ui.textcol;
gr.GdiDrawText(nm, ui.font, txt_c, item_x, item_y, ui.w - item_x - p.r_mg, ui.row_h, p.lc);
}
}
this.lbtn_dn = function (x, y) {
if (y < p.s_h)
return;
var ix = this.get_ix(x, y, true, false);
p.pos = ix;
if (ix < this.tree.length && ix >= 0) {
var item = this.tree[ix],
mode = x > Math.round(ui.pad * item.tr + ui.margin) && x < Math.round(ui.pad * item.tr) + ui.symbol_w + ui.margin ? 0 : this.check_ix(item, x, y, false) ? 1 : 2,
xp = item.child.length > 0 ? 0 : 1;
switch (mode) {
case 0:
switch (xp) {
case 0:
this.clear_child(item);
break;
case 1:
if (auto)
this.branch_chg(item, false, true);
var row = Math.round((y - p.s_h - ui.row_h * 0.5) / ui.row_h);
this.branch(item, !p.base || ix ? false : true, true);
if (auto)
ix = item.ix
if (row + 1 + item.child.length > sbar.rows_drawn) {
if (item.child.length > (sbar.rows_drawn - 2))
sbar.check_scroll(ix * ui.row_h);
else
sbar.check_scroll(Math.min(ix * ui.row_h, (ix + 1 - sbar.rows_drawn + item.child.length) * ui.row_h));
}
break;
}
if (sbar.scroll > ix * ui.row_h)
sbar.check_scroll(ix * ui.row_h);
break;
case 1:
if (!v.k(1))
this.clear();
if (!item.sel)
this.get_selection(ix, item.sel);
else if (v.k(1))
this.get_selection(ix, item.sel);
p.tree_paint();
break;
}
if (this.check_ix(item, x, y, false)) { // on mouse lbn down sel
/*if (v.k(1))
this.load(item.item, true, true, false, true);
else if (v.k(0))
this.load(this.sel_items, true, false, false, true);
else
this.load(item.item, true, false, false, true);*/ // send to pl on left mouse btn
}
} else
this.get_selection(-1);
}
this.lbtn_dblclk = function (x, y) {
if (y < p.s_h)
return;
var ix = this.get_ix(x, y, true, false);
if (ix >= this.tree.length || ix < 0)
return;
var item = this.tree[ix];
if (!this.check_ix(item, x, y, false))
return;
var mp = 1;
if (!dbl_action) {
if (item.child.length)
mp = 0;
switch (mp) {
case 0:
this.clear_child(item);
break;
case 1:
if (auto)
this.branch_chg(item, false, true);
var row = Math.round((y - p.s_h - ui.row_h * 0.5) / ui.row_h);
this.branch(item, !p.base || ix ? false : true, true);
if (auto)
ix = item.ix
if (row + 1 + item.child.length > sbar.rows_drawn) {
if (item.child.length > (sbar.rows_drawn - 2))
sbar.check_scroll(ix * ui.row_h);
else
sbar.check_scroll(Math.min(ix * ui.row_h, (ix + 1 - sbar.rows_drawn + item.child.length) * ui.row_h));
}
break;
}
if (sbar.scroll > ix * ui.row_h)
sbar.check_scroll(ix * ui.row_h);
}
if (dbl_action || !dbl_action && mp == 1 && !item.child.length) {
this.load(item.item, true, false, false, true);/// add??? //send to pl on mouse double clk
var pln = plID(lib_playlist);
plman.ActivePlaylist = pln;
var c = (plman.PlaybackOrder == 3 || plman.PlaybackOrder == 4) ? Math.ceil(plman.PlaylistItemCount(pln) * Math.random() - 1) : 0;
plman.ExecutePlaylistDefaultAction(pln, c);
}
}
this.get_selection = function (idx, state, add, bypass) {
var sel_type = idx == -1 && !add ? 0 : v.k(0) && last_sel > -1 && !bypass ? 1 : v.k(1) && !bypass ? 2 : !state ? 3 : 0;
switch (sel_type) {
case 0:
this.clear();
this.sel_items = [];
break;
case 1:
this.sel_items = [];
var direction = (idx > last_sel) ? 1 : -1;
if (!v.k(1))
this.clear();
for (var i = last_sel; ; i += direction) {
this.tree[i].sel = true;
this.sel_items.push.apply(this.sel_items, this.tree[i].item);
if (i == idx)
break;
}
this.sel_items = uniq(this.sel_items);
p.tree_paint();
break;
case 2:
this.tree[idx].sel = !this.tree[idx].sel;
this.tree[idx].sel && this.sel_items.push.apply(this.sel_items, this.tree[idx].item);
this.sel_items = uniq(this.sel_items);
last_sel = idx;
break;
case 3:
this.sel_items = [];
if (!add)
this.clear();
if (!add)
this.tree[idx].sel = true;
this.sel_items.push.apply(this.sel_items, this.tree[idx].item);
this.sel_items = uniq(this.sel_items);
last_sel = idx;
break;
}
}
this.move = function (x, y) {
var ix = -1;
m_i = -1;
get_pos = -1;
ix = this.get_ix(x, y, false, false);
if (ix != -1) {
m_i = ix;
get_pos = ix;
if (p.tooltip && tt_id != ix && Math.round(ui.pad * this.tree[ix].tr + ui.margin) + (!ui.node_style && this.tree[ix].track ? 0 : ui.symbol_w) + this.tree[ix].w - ui.row_h * 0.2 > ui.w - p.r_mg) {
var row = Math.round((y - p.s_h - ui.row_h * 0.5) / ui.row_h);
this.activate_tooltip(ix, row);
}
} else
get_pos = this.get_ix(x, y, true, false);
if (ix == ix_o)
return;
tt_id = -1;
if (p.tooltip && tt.Text)
this.deactivate_tooltip();
if (!sbar.draw_timer)
p.tree_paint();
ix_o = ix;
}
this.get_ix = function (x, y, simple, type) {
var ix;
if (y > p.s_h)
ix = Math.round((y + (simple ? sbar.scroll : sbar.delta) - p.s_h - ui.row_h * 0.5) / ui.row_h);
else
ix = -1;
if (simple)
return ix;
if (this.tree.length > ix && ix >= 0 && x < ui.w - 10 && y > p.s_h && this.check_ix(this.tree[ix], x, y, type))
return ix;
else
return -1;
}
this.check_ix = function (br, x, y, type) {
if (!br)
return false;
return type ? (x > Math.round(ui.pad * br.tr + ui.margin) && x < Math.round(ui.pad * br.tr + ui.margin) + br.w + ui.symbol_w)
: (x > Math.round(ui.pad * br.tr + ui.margin) + (!ui.node_style && br.track ? 0 : ui.symbol_w)) && x < Math.min(Math.round(ui.pad * br.tr + ui.margin) + (!ui.node_style && br.track ? 0 : ui.symbol_w) + br.w, ui.w - Math.max(ui.scr_w, ui.margin));
}
this.on_key_down = function (vkey) {
if (p.s_search)
return;
switch (vkey) {
case v.left:
if (!(p.pos >= 0) && get_pos != -1)
p.pos = get_pos
else
p.pos = p.pos + this.tree.length % this.tree.length;
p.pos = Math.max(Math.min(p.pos, this.tree.length - 1), 0);
get_pos = -1;
m_i = -1;
if (this.tree[p.pos].child.length > 0) {
var item = this.tree[p.pos];
this.clear_child(item);
this.get_selection(item.ix);
m_i = p.pos = item.ix;
} else {
try {
var item = this.tree[this.tree[p.pos].par];
this.clear_child(item);
this.get_selection(item.ix);
m_i = p.pos = item.ix;
} catch (e) {
return;
};
}
p.tree_paint();
this.load(this.sel_items, true, false, false, true);
sbar.set_rows(this.tree.length);
if (sbar.scroll > p.pos * ui.row_h)
sbar.check_scroll(p.pos * ui.row_h);
break;
case v.right:
if (!(p.pos >= 0) && get_pos != -1)
p.pos = get_pos
else
p.pos = p.pos + this.tree.length % this.tree.length;
p.pos = Math.max(Math.min(p.pos, this.tree.length - 1), 0);
get_pos = -1;
m_i = -1;
var item = this.tree[p.pos];
if (auto)
this.branch_chg(item, false, true);
this.branch(item, p.base && p.pos == 0 ? true : false, true);
this.get_selection(item.ix);
p.tree_paint();
m_i = p.pos = item.ix;
this.load(this.sel_items, true, false, false, true);
sbar.set_rows(this.tree.length);
var row = (p.pos * ui.row_h - sbar.scroll) / ui.row_h;
if (row + item.child.length > sbar.rows_drawn) {
if (item.child.length > (sbar.rows_drawn - 2))
sbar.check_scroll(p.pos * ui.row_h);
else
sbar.check_scroll(Math.min(p.pos * ui.row_h, (p.pos + 1 - sbar.rows_drawn + item.child.length) * ui.row_h));
}
break;
case v.pgUp:
if (this.tree.length == 0)
break;
p.pos = Math.round(sbar.scroll / ui.row_h + 0.4) - Math.floor(p.rows);
p.pos = Math.max(!p.base ? 0 : 1, p.pos);
sbar.wheel(1);
this.get_selection(this.tree[p.pos].ix);
p.tree_paint();
this.load(this.sel_items, true, false, false, true);
break;
case v.pgDn:
if (this.tree.length == 0)
break;
p.pos = Math.round(sbar.scroll / ui.row_h + 0.4);
p.pos = p.pos + Math.floor(p.rows) * 2 - 1;
p.pos = this.tree.length < p.pos ? this.tree.length - 1 : p.pos;
sbar.wheel(-1);
this.get_selection(this.tree[p.pos].ix);
p.tree_paint();
this.load(this.sel_items, true, false, false, true);
break;
case v.home:
if (this.tree.length == 0)
break;
p.pos = !p.base ? 0 : 1;
sbar.check_scroll(0);
this.get_selection(this.tree[p.pos].ix);
p.tree_paint();
this.load(this.sel_items, true, false, false, true);
break;
case v.end:
if (this.tree.length == 0)
break;
p.pos = this.tree.length - 1;
sbar.check_scroll((this.tree.length) * ui.row_h);
this.get_selection(this.tree[p.pos].ix);
p.tree_paint();
this.load(this.sel_items, true, false, false, true);
break;
case v.enter:
if (!this.sel_items.length)
return;
//this.load = function (list, type, add, send, sort)
/*this.load(this.sel_items, true, false, false, true); /// --->send to pl on enter down
var pln = plID(lib_playlist);
plman.ActivePlaylist = pln;
var c = (plman.PlaybackOrder == 3 || plman.PlaybackOrder == 4) ? Math.ceil(plman.PlaylistItemCount(pln) * Math.random() - 1) : 0;
plman.ExecutePlaylistDefaultAction(pln, c);*/
//list, type, add, send, sort
this.load(this.sel_items, true, true, false, false); /// --->add to pl on enter down
var pln = plID(lib_playlist);
plman.ActivePlaylist = pln;
//var c = (plman.PlaybackOrder == 3 || plman.PlaybackOrder == 4) ? Math.ceil(plman.PlaylistItemCount(pln) * Math.random() - 1) : 0;
//plman.ExecutePlaylistDefaultAction(pln, c);
//p.update;
fb.RunMainMenuCommand("Edit/Remove Duplicates");
break;
case v.dn:
case v.up:
if (this.tree.length == 0)
break;
if ((p.pos == 0 && get_pos == -1 && vkey == v.up) || (p.pos == this.tree.length - 1 && vkey == v.dn)) {
this.get_selection(-1);
break;
}
if (get_pos != -1)
p.pos = get_pos;
else
p.pos = p.pos + this.tree.length % this.tree.length;
get_pos = -1;
m_i = -1;
if (vkey == v.dn)
p.pos++;
if (vkey == v.up)
p.pos--;
p.pos = Math.max(Math.min(p.pos, this.tree.length - 1), 0);
var row = (p.pos * ui.row_h - sbar.scroll) / ui.row_h;
if (sbar.rows_drawn - row < 3)
sbar.check_scroll((p.pos + 3) * ui.row_h - sbar.rows_drawn * ui.row_h);
else if (row < 2 && vkey == v.up)
sbar.check_scroll((p.pos - 1) * ui.row_h);
m_i = p.pos;
this.get_selection(p.pos);
p.tree_paint();
this.load(this.sel_items, true, false, false, true);
break;
}
}
}
var pop = new populate();
function on_size() {
ui.w = window.Width;
ui.h = window.Height;
ww = window.Width;
wh = window.Height;
if (!ui.w || !ui.h)
return;
// set wallpaper
if (fb.IsPlaying) {
g_wallpaperImg = setWallpaperImg(ppt.wallpaperpath, fb.GetNowPlaying());
};
else {
//g_wallpaperImg = null;
g_wallpaperImg = setWallpaperImg(ppt.wallpaperpath, fb.GetNowPlaying());
};
ui.get_font();
p.on_size();
pop.create_tooltip();
if (p.s_show || ui.scrollbar_show)
but.refresh(true);
jS.on_size();
}
function searchLibrary() {
var cx = 0,
doc = new ActiveXObject('htmlfile'),
e = 0,
i = 0,
lbtn_dn = false,
lg = [],
log = [],
offset = 0,
s = 0,
shift = false,
shift_x = 0,
txt_w = 0;
var calc_text = function () {
var im = gdi.CreateImage(1, 1),
g = im.GetGraphics();
txt_w = g.CalcTextWidth(p.s_txt.substr(offset), ui.font);
im.ReleaseGraphics(g);
im.Dispose();
}
var drawcursor = function (gr) {
if (p.s_search && p.s_cursor && s == e && cx >= offset) {
var x1 = p.s_x + get_cursor_x(cx),
x2 = x1;
gr.DrawLine(x1, p.s_sp * 0.1, x2, p.s_sp * 0.85, 1, ui.textcol);
}
}
var drawsel = function (gr) {
if (s == e)
return;
var clamp = p.s_x + p.s_w2;
gr.DrawLine(Math.min(p.s_x + get_cursor_x(s), clamp), p.s_sp / 2, Math.min(p.s_x + get_cursor_x(e), clamp), p.s_sp / 2, ui.row_h - 3, ui.ibeamcol2);
}
var get_cursor_pos = function (x) {
var im = gdi.CreateImage(1, 1),
g = im.GetGraphics(),
nx = x - p.s_x,
pos = 0;
for (i = offset; i < p.s_txt.length; i++) {
pos += g.CalcTextWidth(p.s_txt.substr(i, 1), ui.font);
if (pos >= nx + 3)
break;
}
im.ReleaseGraphics(g);
im.Dispose();
return i;
}
var get_cursor_x = function (pos) {
var im = gdi.CreateImage(1, 1),
g = im.GetGraphics(),
x = 0;
if (pos >= offset)
x = g.CalcTextWidth(p.s_txt.substr(offset, pos - offset), ui.font);
im.ReleaseGraphics(g);
im.Dispose();
return x;
}
var get_offset = function (gr) {
var t = gr.CalcTextWidth(p.s_txt.substr(offset, cx - offset), ui.font);
while (t >= p.s_w2) {
offset++;
t = gr.CalcTextWidth(p.s_txt.substr(offset, cx - offset), ui.font);
}
}
var record = function () {
lg.push(p.s_txt);
log = [];
if (lg.length > 30)
lg.shift();
}
this.clear = function () {
lib.time.Reset();
offset = s = e = cx = 0;
p.s_cursor = false;
p.s_search = false;
p.s_txt = "";
p.search_paint();
timer.reset(timer.search_cursor, 4);
lib.rootNodes();
}
this.on_key_up = function (vkey) {
if (!p.s_search)
return;
if (vkey == v.shift) {
shift = false;
shift_x = cx;
}
}
this.lbtn_up = function (x, y) {
if (s != e)
timer.reset(timer.search_cursor, 4);
lbtn_dn = false;
}
this.move = function (x, y) {
if (y > p.s_h || !lbtn_dn)
return;
var t = get_cursor_pos(x),
t_x = get_cursor_x(t);
calc_text();
if (t < s) {
if (t < e) {
if (t_x < p.s_x)
if (offset > 0)
offset--;
} else if (t > e) {
if (t_x + p.s_x > p.s_x + p.s_w2) {
var l = (txt_w > p.s_w2) ? txt_w - p.s_w2 : 0;
if (l > 0)
offset++;
}
}
e = t;
} else if (t > s) {
if (t_x + p.s_x > p.s_x + p.s_w2) {
var l = (txt_w > p.s_w2) ? txt_w - p.s_w2 : 0;
if (l > 0)
offset++;
}
e = t;
}
cx = t;
p.search_paint();
}
this.rbtn_up = function (x, y) {
men.search_menu(x, y, s, e, doc.parentWindow.clipboardData.getData('text') ? true : false)
}
this.lbtn_dn = function (x, y) {
p.search_paint();
lbtn_dn = p.s_search = (y < p.s_h && x > ui.margin + ui.row_h * 0.6 && x < p.s_x + p.s_w2);
if (!lbtn_dn) {
offset = s = e = cx = 0;
timer.reset(timer.search_cursor, 4);
return;
} else {
if (shift) {
s = cx;
e = cx = get_cursor_pos(x);
} else {
cx = get_cursor_pos(x);
s = e = cx;
}
timer.reset(timer.search_cursor, 4);
p.s_cursor = true;
timer.search_cursor = window.SetInterval(function () {
p.s_cursor = !p.s_cursor;
p.search_paint();
}, 530);
}
p.search_paint();
}
this.on_char = function (code, force) {
var text = String.fromCharCode(code);
if (force)
p.s_search = true;
if (!p.s_search)
return;
p.s_cursor = false;
p.pos = -1;
switch (code) {
case v.enter:
if (p.s_txt.length < 3)
break;
var items = fb.GetQueryItems(lib.list, p.s_txt);
pop.load(items, false, false, false, true);
items.Dispose();
break;
case v.redo:
lg.push(p.s_txt);
if (lg.length > 30)
lg.shift();
if (log.length > 0) {
p.s_txt = log.pop() + "";
cx++
}
break;
case v.undo:
log.push(p.s_txt);
if (log.length > 30)
lg.shift();
if (lg.length > 0)
p.s_txt = lg.pop() + "";
break;
case v.selAll:
s = 0;
e = p.s_txt.length;
break;
case v.copy:
if (s != e)
doc.parentWindow.clipboardData.setData('text', p.s_txt.substring(s, e));
break;
case v.cut:
if (s != e)
doc.parentWindow.clipboardData.setData('text', p.s_txt.substring(s, e));
case v.back:
record();
if (s == e) {
if (cx > 0) {
p.s_txt = p.s_txt.substr(0, cx - 1) + p.s_txt.substr(cx, p.s_txt.length - cx);
if (offset > 0)
offset--;
cx--;
}
} else {
if (e - s == p.s_txt.length) {
p.s_txt = "";
cx = 0;
} else {
if (s > 0) {
var st = s,
en = e;
s = Math.min(st, en);
e = Math.max(st, en);
p.s_txt = p.s_txt.substring(0, s) + p.s_txt.substring(e, p.s_txt.length);
cx = s;
} else {
p.s_txt = p.s_txt.substring(e, p.s_txt.length);
cx = s;
}
}
}
calc_text();
offset = offset >= e - s ? offset - e + s : 0;
s = cx;
e = s;
break;
case v.del:
record();
if (s == e) {
if (cx < p.s_txt.length) {
p.s_txt = p.s_txt.substr(0, cx) + p.s_txt.substr(cx + 1, p.s_txt.length - cx - 1);
}
} else {
if (e - s == p.s_txt.length) {
p.s_txt = "";
cx = 0;
} else {
if (s > 0) {
var st = s,
en = e;
s = Math.min(st, en);
e = Math.max(st, en);
p.s_txt = p.s_txt.substring(0, s) + p.s_txt.substring(e, p.s_txt.length);
cx = s;
} else {
p.s_txt = p.s_txt.substring(e, p.s_txt.length);
cx = s;
}
}
}
calc_text();
offset = offset >= e - s ? offset - e + s : 0;
s = cx;
e = s;
break;
case v.paste:
text = doc.parentWindow.clipboardData.getData('text');
default:
record();
if (s == e) {
p.s_txt = p.s_txt.substring(0, cx) + text + p.s_txt.substring(cx);
cx += text.length;
e = s = cx;
} else {
p.s_txt = p.s_txt.substring(0, s) + text + p.s_txt.substring(e);
cx = s + text.length;
e = s;
}
break;
}
if (!timer.search_cursor)
timer.search_cursor = window.SetInterval(function () {
p.s_cursor = !p.s_cursor;
p.search_paint();
}, 530);
p.search_paint();
lib.upd_search = true;
timer.reset(timer.search, 3);
timer.search = window.SetTimeout(function () {
lib.time.Reset();
lib.rootNodes();
timer.reset(timer.search, 3);
}, 160);
}
this.on_key_down = function (vkey) {
if (!p.s_search)
return;
switch (vkey) {
case v.left:
case v.right:
if (vkey == v.left) {
if (offset > 0) {
if (cx <= offset) {
offset--;
cx--;
} else
cx--;
} else if (cx > 0)
cx--;
s = e = cx
}
if (vkey == v.right && cx < p.s_txt.length)
cx++;
s = e = cx;
if (shift) {
s = Math.min(cx, shift_x);
e = Math.max(cx, shift_x);
}
p.s_cursor = true;
timer.reset(timer.search_cursor, 4);
timer.search_cursor = window.SetInterval(function () {
p.s_cursor = !p.s_cursor;
p.search_paint();
}, 530);
break;
case v.home:
case v.end:
if (vkey == v.home)
offset = s = e = cx = 0;
else
s = e = cx = p.s_txt.length;
p.s_cursor = true;
timer.reset(timer.search_cursor, 4);
timer.search_cursor = window.SetInterval(function () {
p.s_cursor = !p.s_cursor;
p.search_paint();
}, 530);
break;
case v.shift:
shift = true;
shift_x = cx;
break;
case v.del:
this.on_char(v.del);
break;
}
p.search_paint();
}
this.draw = function (gr) {
s = Math.min(Math.max(s, 0), p.s_txt.length);
e = Math.min(Math.max(e, 0), p.s_txt.length);
cx = Math.min(Math.max(cx, 0), p.s_txt.length);
if (ui.fill)
gr.FillSolidRect(0, 1, ui.w, ui.row_h - 4, 0x60000000);
if (ui.pen == 1)
gr.DrawLine(ui.margin, p.s_sp, p.s_w1, p.s_sp, 1, ui.s_linecol);
if (ui.pen == 2)
gr.DrawRoundRect(0, 2, ui.w - 1, ui.row_h - 4, 4, 4, 1, ui.pen_c);
if (p.s_txt) {
e = (e < p.s_txt.length) ? e : p.s_txt.length;
drawsel(gr);
get_offset(gr);
gr.GdiDrawText(p.s_txt.substr(offset), ui.font, ui.searchcol, p.s_x, 0, p.s_w2, p.s_sp, p.l);
} else
gr.GdiDrawText("Search", ui.s_font, ui.txt_box, p.s_x, 0, p.s_w2, p.s_sp, p.l);
drawcursor(gr);
if (p.s_show > 1) {
var l_x = p.f_x1 - 9,
l_h = Math.round(p.s_sp / 2);
gr.gdiDrawText(p.filt[p.filter_by].name, p.f_font, ui.txt_box, p.f_x1, 0, p.f_w[p.filter_by], p.s_sp, p.cc);
gr.FillGradRect(l_x, 0, 1, l_h, 90, RGBA(0, 0, 0, 0), ui.s_linecol);
gr.FillGradRect(l_x, l_h, 1, l_h, 90, ui.s_linecol, RGBA(0, 0, 0, 0));
}
}
}
if (p.s_show)
var sL = new searchLibrary();
var j_Search = function () {
var j_x = 5,
j_h = 30,
j_y = 5,
jSearch = "",
jump_search = true,
rs1 = 5,
rs2 = 4;
this.on_size = function () {
j_x = Math.round(ui.w / 2),
j_h = Math.round(ui.row_h * 1.5),
j_y = Math.round((ui.h - j_h) / 2);
rs1 = Math.min(5, j_h / 2);
rs2 = Math.min(4, (j_h - 2) / 2);
}
this.on_char = function (code) {
var text = String.fromCharCode(code);
if (!p.s_search) {
var found = false,
i = 0,
pos = -1;
switch (code) {
case v.back:
jSearch = jSearch.substr(0, jSearch.length - 1);
break;
case v.enter:
jSearch = "";
return;
default:
jSearch += text;
break;
}
var l = pop.tree.length;
for (i = 0; i < l; i++)
pop.tree[i].sel = false;
if (!jSearch)
return;
pop.sel_items = [];
jump_search = true;
window.RepaintRect(0, j_y, ui.w, j_h + 1);
timer.reset(timer.jsearch, 2);
timer.jsearch = window.SetTimeout(function () {
for (i = 0; i < l; i++) {
if (pop.tree[i].name.substring(0, jSearch.length).toLowerCase() == jSearch.toLowerCase()) {
found = true;
pos = i;
pop.tree[i].sel = true;
pop.sel_items.push.apply(pop.sel_items, pop.tree[i].item);
break;
}
}
if (!found)
jump_search = false;
p.tree_paint();
sbar.check_scroll((pos - 5) * ui.row_h);
timer.reset(timer.jsearch, 2);
}, 500);
timer.reset(timer.clear_jsearch, 0);
timer.clear_jsearch = window.SetTimeout(function () {
if (found)
pop.load(pop.sel_items, true, false, false, true);
jSearch = "";
window.RepaintRect(0, j_y, ui.w, j_h + 1);
timer.reset(timer.clear_jsearch, 0);
}, 5000);//1200 jump search timer
}
}
this.draw = function (gr) {
if (jSearch) {
gr.SetSmoothingMode(4);
var j_w = gr.CalcTextWidth(jSearch, ui.j_font) + 25;
gr.FillRoundRect(j_x - j_w / 2, j_y, j_w, j_h, rs1, rs1, 0x96000000);
gr.DrawRoundRect(j_x - j_w / 2, j_y, j_w, j_h, rs1, rs1, 1, 0x64000000);
gr.DrawRoundRect(j_x - j_w / 2 + 1, j_y + 1, j_w - 2, j_h - 2, rs2, rs2, 1, 0x28ffffff);
gr.GdiDrawText(jSearch, ui.j_font, RGB(0, 0, 0), j_x - j_w / 2 + 1, j_y + 1, j_w, j_h, p.cc);
gr.GdiDrawText(jSearch, ui.j_font, jump_search ? 0xfffafafa : 0xffff4646, j_x - j_w / 2, j_y, j_w, j_h, p.cc);
}
}
}
var jS = new j_Search();
function on_paint(gr) {
if (ui.bg)
gr.FillSolidRect(0, 0, ui.w, ui.h, ui.backcol);
if (fb.IsPlaying && g_wallpaperImg && ppt.showwallpaper) {
gr.GdiDrawBitmap(g_wallpaperImg, 0, 0, ww, wh, 0, 0, g_wallpaperImg.Width, g_wallpaperImg.Height);
gr.FillSolidRect(0, 0, ww, wh, g_color_normal_bg & RGBA(255, 255, 255, ppt.wallpaperalpha));
};
else {
gr.FillSolidRect(0, 0, ww, wh, g_color_normal_bg);
if (g_wallpaperImg && ppt.showwallpaper) {
gr.GdiDrawBitmap(g_wallpaperImg, 0, 0, ww, wh, 0, 0, g_wallpaperImg.Width, g_wallpaperImg.Height);
gr.FillSolidRect(0, 0, ww, wh, g_color_normal_bg & RGBA(255, 255, 255, ppt.wallpaperalpha));
};
else {
gr.FillSolidRect(0, 0, ww, wh, g_color_normal_bg);
};
};
if (lib.upd) {
lib.refresh();
lib.upd = false;
return;
}
if (p.s_show)
sL.draw(gr);
pop.draw(gr);
if (p.s_show || ui.scrollbar_show)
but.draw(gr);
if (ui.scrollbar_show)
sbar.draw(gr);
jS.draw(gr);
}
function button_manager() {
var b_x,
b_h,
but_tt = window.CreateTooltip("Segoe UI", 15, 0),
bx,
by,
bh,
byDn,
byUp,
fw,
i,
qx,
qy,
qh,
s_img = [],
scr = [];
this.btns = [];
this.b = null;
var browser = function (c) {
if (!run(c))
fb.ShowPopupMessage("Unable to launch your default browser.", "Library Tree");
}
var run = function (c) {
try {
var WshShell = new ActiveXObject("WScript.Shell");
WshShell.Run(c);
return true;
} catch (e) {
return false;
}
}
var tooltip = function (n) {
if (but_tt.text == n)
return;
but_tt.text = n;
but_tt.activate();
}
this.lbtn_dn = function (x, y) {
if (!this.b)
return false;
this.btns[this.b].lbtn_dn(x, y);
return true;
}
this.lbtn_up = function (x, y) {
if (!this.b)
return false;
this.btns[this.b].lbtn_up(x, y);
return true;
}
this.leave = function () {
if (this.b)
this.btns[this.b].changestate("normal");
this.b = null;
tooltip("");
}
this.create_images = function () {
var c,
g;
for (var j = 0; j < 2; j++) {
c = j ? 0xe4ffffff : 0x99ffffff;
s_img[j] = gdi.CreateImage(100, 100);
g = s_img[j].GetGraphics();
g.SetSmoothingMode(2);
if (!ui.local) {
g.DrawLine(69, 71, 88, 90, 12, ui.txt_box & c);
g.DrawEllipse(8, 11, 67, 67, 10, ui.txt_box & c);
} else {
g.DrawLine(69, 71, 88, 90, 12, ui.txt_box);
g.DrawEllipse(8, 11, 67, 67, 10, ui.txt_box);
}
g.FillEllipse(15, 17, 55, 55, 0x0AFAFAFA);
g.SetSmoothingMode(0);
s_img[j].ReleaseGraphics(g);
}
for (var j = 0; j < 2; j++) {
scr[j] = gdi.CreateImage(100, 100);
g = scr[j].GetGraphics();
g.SetSmoothingMode(2);
g.FillPolygon(RGBA(200, 200, 200, j ? 192 : 75), 1, [50, 0, 93, 76, 6, 76]);
g.SetSmoothingMode(0);
scr[j].ReleaseGraphics(g);
}
};
this.create_images();
this.draw = function (gr) {
for (i in this.btns) {
if ((p.s_show == 1 || p.s_show > 1 && !p.s_txt) && i == "s_img")
this.btns[i].draw(gr);
if (p.s_show == 1 && i == "cross1")
this.btns[i].draw(gr);
if (p.s_show > 1 && p.s_txt && i == "cross2")
this.btns[i].draw(gr);
if (p.s_show > 1 && i == "filter")
this.btns[i].draw(gr);
if (i == "scrollUp" || i == "scrollDn")
this.btns[i].draw(gr);
}
}
this.move = function (x, y) {
var b = null,
hand = false;
for (i in this.btns) {
if ((p.s_show == 1 || p.s_show > 1 && !p.s_txt) && i == "s_img" && this.btns[i].trace(x, y)) {
b = i;
hand = true;
}
if (p.s_show == 1 && i == "cross1" && this.btns[i].trace(x, y)) {
b = i;
hand = true;
}
if (p.s_show > 1 && p.s_txt && i == "cross2" && this.btns[i].trace(x, y)) {
b = i;
hand = true;
}
if (p.s_show > 1 && i == "filter" && this.btns[i].trace(x, y)) {
b = i;
hand = true;
}
if ((i == "scrollUp" || i == "scrollDn") && this.btns[i].trace(x, y))
b = i;
}
window.SetCursor(hand ? 32649 : y < p.s_h && p.s_show && x > qx + qh ? 32513 : 32512);
if (this.b == b)
return this.b;
if (b)
this.btns[b].changestate("hover");
if (this.b)
this.btns[this.b].changestate("normal");
this.b = b;
if (!this.b)
tooltip("");
return this.b;
}
var btn = function (x, y, w, h, type, ft, txt, stat, img_src, l_dn, l_up, tooltext) {
this.draw = function (gr) {
switch (type) {
case 3:
gr.SetInterpolationMode(2);
if (this.img)
gr.DrawImage(this.img, this.x, this.y, this.w, this.h, 0, 0, this.img.Width, this.img.Height);
gr.SetInterpolationMode(0);
break;
case 4:
gr.DrawLine(Math.round(this.x + bh * 0.67), Math.round(this.y + bh * 0.67), Math.round(this.x + bh * 0.27), Math.round(this.y + bh * 0.27), Math.round(bh / 10), RGBA(136, 136, 136, this.img));
gr.DrawLine(Math.round(this.x + bh * 0.67), Math.round(this.y + bh * 0.27), Math.round(this.x + bh * 0.27), Math.round(this.y + bh * 0.67), Math.round(bh / 10), RGBA(136, 136, 136, this.img));
break;
case 5:
gr.SetTextRenderingHint(3);
gr.DrawString(txt, ft, this.img, this.x, this.y - 1, this.w, this.h, StringFormat(2, 1));
break;
default:
if (this.img && sbar.scrollable_lines > 0)
gr.DrawImage(this.img, this.x, this.y, this.w, this.h, 0, 0, this.img.Width, this.img.Height, type == 1 ? 0 : 180);
break;
}
}
this.trace = function (x, y) {
return x > this.x && x < this.x + this.w && y > this.y && y < this.y + this.h;
}
this.lbtn_dn = function () {
this.l_dn && this.l_dn(x, y);
}
this.lbtn_up = function () {
this.l_up && this.l_up(x, y);
}
this.changestate = function (state) {
if (state == "hover") {
this.img = this.img_hover;
tooltip(this.tooltext);
} else {
this.img = this.img_normal;
}
try{
window.RepaintRect(this.x, this.y, this.w, this.h);
}catch(e){}
}
this.x = x;
this.y = y;
this.w = w;
this.h = h;
this.l_dn = l_dn;
this.l_up = l_up;
this.tooltext = tooltext;
this.img_normal = img_src.normal;
this.img_hover = img_src.hover || this.img_normal;
this.img = this.img_normal;
}
this.refresh = function (upd) {
if (upd) {
bx = p.s_w1 - Math.round(ui.row_h * 0.75);
bh = ui.row_h;
by = Math.round((p.s_sp - bh * 0.4) / 2 - bh * 0.27);
b_x = ui.w - ui.scr_w - 1;
byUp = p.s_h;
byDn = sbar.y + sbar.h - ui.scr_w;
fw = p.f_w[p.filter_by] + p.f_sw + 12;
qx = ui.margin;
qy = (p.s_sp - ui.row_h * 0.6) / 2;
qh = ui.row_h * 0.6;
}
if (ui.scrollbar_show) {
this.btns.scrollUp = new btn(b_x, byUp, ui.scr_w, ui.scr_w, 1, "", "", "", {
normal : scr[0],
hover : scr[1]
}, function () {
sbar.but(1);
}, "", "");
this.btns.scrollDn = new btn(b_x, byDn, ui.scr_w, ui.scr_w, 2, "", "", "", {
normal : scr[0],
hover : scr[1]
}, function () {
sbar.but(-1);
}, "", "");
}
if (p.s_show) {
this.btns.s_img = new btn(qx, qy, qh, qh, 3, "", "", "", {
normal : s_img[0],
hover : s_img[1]
}, function () {
browser("\"" + fb.FoobarPath + "Query Syntax Help.html");
}, "", "Open Query Syntax Help");
this.btns.cross1 = new btn(bx, by, bh, bh, 4, "", "", "", {
normal : "85",
hover : "192"
}, "", function () {
sL.clear();
}, "Clear Search Text");
this.btns.cross2 = new btn(qx - bh * 0.2, by, bh, bh, 4, "", "", "", {
normal : "85",
hover : "192"
}, "", function () {
sL.clear();
}, "Clear Search Text");
this.btns.filter = new btn(p.f_x1 - 12, 0, fw, p.s_sp, 5, p.f_but_ft, "Ў", "", {
normal : !ui.local ? ui.txt_box & 0x99ffffff : ui.txt_box,
hover : ui.txt_box & 0xe4ffffff
}, "", function () {
men.button(p.f_x1, p.s_h);
but.refresh(true)
}, "Filter");
}
}
}
var but = new button_manager();
function menu_object() {
var i = 0,
MenuMap = [],
MF_GRAYED = 0x00000001,
MF_POPUP = 0x00000010,
MF_SEPARATOR = 0x00000800,
MF_STRING = 0x00000000;
this.NewMenuItem = function (index, type, value) {
MenuMap[index] = [{
type : ""
}, {
value : 0
}
];
MenuMap[index].type = type;
MenuMap[index].value = value;
}
this.PlaylistTypeMenu = function (Menu, StartIndex) {
var Index = StartIndex,
n = ["Send to Current Playlist", "Add to Current Playlist"];
for (i = 0; i < 2; i++) {
this.NewMenuItem(Index, "Playlist", i + 1);
Menu.AppendMenuItem(MF_STRING, Index, n[i]);
Index++;
}
return Index;
}
this.OptionsTypeMenu = function (Menu, StartIndex) {
var Index = StartIndex,
mt = p.syncType ? 1 : 0;
for (i = 0; i < p.menu.length; i++) {
this.NewMenuItem(Index, "Options", i + 1);
if (i < p.menu.length - 1 || i == p.menu.length - 1 && v.k(0))
Menu.AppendMenuItem(MF_STRING, Index, p.menu[i]);
if (i < p.menu.length - 2 - mt)
Menu.CheckMenuItem(Index++, p.view_by == i);
else
Index++;
if (i == p.menu.length - 3 - mt || i == p.menu.length - 4 - mt)
Menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
}
return Index;
}
this.FilterMenu = function (Menu, StartIndex) {
var Index = StartIndex;
for (i = 0; i < p.f_menu.length + 1; i++) {
this.NewMenuItem(Index, "Filter", i + 1);
Menu.AppendMenuItem(MF_STRING, Index, i != p.f_menu.length ? (!i ? "No " : "") + p.f_menu[i] : "Always Reset Scroll");
Menu.CheckMenuItem(Index++, i < p.f_menu.length ? i == p.filter_by : p.reset);
if (i == p.f_menu.length - 1)
Menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
}
return Index;
}
this.button = function (x, y) {
var menu = window.CreatePopupMenu(),
idx,
Index = 1;
Index = this.FilterMenu(menu, Index);
idx = menu.TrackPopupMenu(x, y);
if (idx >= 1 && idx <= Index) {
i = MenuMap[idx].value;
switch (i) {
case p.f_menu.length + 1:
p.reset = !p.reset;
if (p.reset) {
p.search_paint();
lib.refresh(true);
}
window.SetProperty("SYSTEM.Reset Tree", p.bypass);
break;
default:
p.filter_by = i - 1;
p.set_statistics_mode();
p.calc_text();
p.search_paint();
lib.refresh(true);
window.SetProperty("SYSTEM.Filter By", p.filter_by);
break;
}
}
menu.Dispose();
}
this.search = function (Menu, StartIndex, s, e, paste) {
var Index = StartIndex,
n = ["Copy", "Cut", "Paste"];
for (i = 0; i < 3; i++) {
this.NewMenuItem(Index, "Search", i + 1);
Menu.AppendMenuItem(s == e && i < 2 || i == 2 && !paste ? MF_GRAYED : MF_STRING, Index, n[i]);
Index++;
if (i == 1)
Menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
}
return Index;
}
this.search_menu = function (x, y, s, e, paste) {
var menu = window.CreatePopupMenu(),
idx,
Index = 1;
Index = this.search(menu, Index, s, e, paste);
idx = menu.TrackPopupMenu(x, y);
if (idx >= 1 && idx <= Index) {
i = MenuMap[idx].value;
switch (i) {
case 1:
sL.on_char(v.copy);
break;
case 2:
sL.on_char(v.cut);
break;
case 3:
sL.on_char(v.paste, true);
break;
}
}
menu.Dispose();
}
this.rbtn_up = function (x, y) {
var Context = fb.CreateContextMenuManager(),
FilterMenu = window.CreatePopupMenu(),
idx,
Index = 1,
menu = window.CreatePopupMenu(),
new_sel = false,
OptionsMenu = window.CreatePopupMenu(),
PlaylistMenu = window.CreatePopupMenu(),
show_context = false;
var ix = Math.round((y + sbar.delta - p.s_h - ui.row_h * 0.5) / ui.row_h);
if (y > p.s_h && pop.tree.length > ix && ix >= 0 && x < p.s_w1 && pop.check_ix(pop.tree[ix], x, y, true)) {
if (!pop.tree[ix].sel) {
new_sel = true;
pop.get_selection(ix, "", true, true);
}
Index = this.PlaylistTypeMenu(menu, Index);
menu.AppendMenuSeparator();
show_context = true;
}
if (show_context) {
Index = this.OptionsTypeMenu(OptionsMenu, Index);
OptionsMenu.AppendTo(menu, MF_STRING | MF_POPUP, "Options");
menu.AppendMenuSeparator();
var items = p.items();
for (var l in pop.sel_items)
items.Add(p.list.Item(pop.sel_items[l]));
Context.InitContext(items);
Context.BuildMenu(menu, 5000, -1);
} else
Index = this.OptionsTypeMenu(menu, Index);
idx = menu.TrackPopupMenu(x, y);
if (idx >= 1 && idx <= Index) {
i = MenuMap[idx].value;
switch (MenuMap[idx].type) {
case "Playlist":
switch (i) {
case 1:
if (new_sel)
for (var k = 0; k < pop.tree.length; k++)
pop.tree[k].sel = false;
pop.tree[ix].sel = true;
pop.load(pop.sel_items, true, false, true, true);
p.tree_paint();
break;
case 2:
pop.tree[ix].sel = true;
pop.load(pop.sel_items, true, true, false, true);
break;
}
break;
case "Options":
var mtt = i == p.menu.length - 2 && p.syncType ? 1 : i == p.menu.length - 1 ? 2 : i == p.menu.length ? 3 : 4;
switch (mtt) {
case 1:
window.ShowProperties();
break;
case 2:
p.syncType ? lib.update() : window.ShowProperties();
break;
case 3:
window.ShowConfigure();
break;
case 4:
lib.time.Reset();
if (p.s_txt)
lib.upd_search = true;
p.fields(i < p.grp.length + 1 ? i - 1 : p.view_by, i - 1 < p.grp.length ? p.filter_by : i - 1 - p.grp.length);
if (i == p.folder_view + 1)
lib.get_paths = true;
lib.get_library();
lib.rootNodes();
break;
}
break;
}
}
if (idx >= 5000 && idx <= 5800) {
show_context && Context.ExecuteByID(idx - 5000);
}
Context.Dispose();
FilterMenu.Dispose();
menu.Dispose();
OptionsMenu.Dispose();
PlaylistMenu.Dispose();
}
}
var men = new menu_object();
function timers() {
var timer_arr = ["clear_jsearch", "init", "jsearch", "search", "search_cursor", "tt", "update"];
for (var i = 0; i < timer_arr.length; i++)
this[timer_arr[i]] = false;
this.reset = function (timer, n) {
if (timer)
window.ClearTimeout(timer);
this[timer_arr[n]] = false;
}
this.lib = function () {
this.init = window.SetTimeout(function () {
lib.get_library();
lib.rootNodes();
timer.reset(timer.init, 1);
}, 5);
}
this.tooltip = function () {
this.reset(this.tt, 6);
this.tt = window.SetTimeout(function () {
pop.deactivate_tooltip();
timer.reset(timer.tt, 5);
}, 5000);
}
this.lib_update = function () {
this.reset(this.update, 6);
this.update = window.SetTimeout(function () {
lib.update();
timer.reset(timer.update, 6);
}, 500);
}
}
var timer = new timers();
timer.lib();
this.touch_sens = window.GetProperty(" Scroll - Touch Mouse Sensitive: Step", 24);
var lbtn_touch_dn = 0;
var y_start = 0;
var y_end = 0;
var y_delta = 0;
function on_char(code) {
if (!p.s_show)
return;
sL.on_char(code);
jS.on_char(code)
}
function on_key_down(vkey) {
pop.on_key_down(vkey);
if (!p.s_show)
return;
sL.on_key_down(vkey);
}
function on_key_up(vkey) {
if (!p.s_show)
return;
sL.on_key_up(vkey)
}
function on_library_items_added() {
if (p.syncType)
return;
timer.lib_update();
}
function on_library_items_removed() {
if (p.syncType)
return;
timer.lib_update();
}
function on_library_items_changed() {
if (p.syncType || !p.statistics && fb.PlaybackTime > 59 && fb.PlaybackTime < 65)
return;
timer.lib_update();
}
function on_mouse_lbtn_dblclk(x, y) {
but.lbtn_dn(x, y);
pop.lbtn_dblclk(x, y);
}
function on_mouse_lbtn_down(x, y) {
lbtn_touch_dn = 1;
y_start = y;
if (p.s_show || ui.scrollbar_show)
but.lbtn_dn(x, y);
if (p.s_show)
sL.lbtn_dn(x, y);
pop.lbtn_dn(x, y);
sbar.lbtn_dn(x, y);
}
function on_mouse_lbtn_up(x, y) {
lbtn_touch_dn = 0;
y_start = y;
if (p.s_show) {
sL.lbtn_up();
but.lbtn_up(x, y);
}
sbar.lbtn_up(x, y);
}
function on_mouse_leave() {
if (p.s_show || ui.scrollbar_show)
but.leave();
sbar.leave();
}
function on_mouse_mbtn_down(x, y) {
pop.mbtn_dn(x, y);
}
function on_mouse_move(x, y) {
if (p.m_x == x && p.m_y == y)
return;
if (p.s_show || ui.scrollbar_show)
but.move(x, y);
if (p.s_show)
sL.move(x, y);
pop.move(x, y);
sbar.move(x, y);
p.m_x = x;
p.m_y = y;
if (lbtn_touch_dn) {
//mouse_drag = false;
y_end = y;
y_delta = (y_end - y_start);
if (x < ww) {
if (y_delta > ui.h / this.touch_sens) {
on_mouse_wheel(1);
y_start = y_end;
};
if (y_delta < -ui.h / this.touch_sens) {
on_mouse_wheel(-1);
y_start = y_end;
};
};
};
}
function on_mouse_rbtn_up(x, y) {
if (y < p.s_h && x > p.s_x && x < p.s_x + p.s_w2) {
sL.rbtn_up(x, y);
return true;
} else {
men.rbtn_up(x, y);
return true;
}
}
function on_mouse_wheel(step) {
if (!v.k(1))
sbar.wheel(step);
else
ui.wheel(step);
}
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 StringFormat() {
var a = arguments,
h_align = 0,
v_align = 0,
trimming = 0,
flags = 0;
switch (a.length) {
case 3:
trimming = a[2];
case 2:
v_align = a[1];
case 1:
h_align = a[0];
break;
default:
return 0;
}
return (h_align << 28 | v_align << 24 | trimming << 20 | flags);
}
window.SetProperty("_Custom.Colour Filter Line", null);
window.SetProperty("_Custom.Colour Filter Name", null);
window.SetProperty("_Custom.Colour Filter Search Text", null);
window.SetProperty(" DblClick Action: Expand/Collapse-0 Send&Play-1", null);
window.SetProperty(" DblClick: Expand-0 Play-1 Expand&Play-2", null);
window.SetProperty(" Filter Show", null);
window.SetProperty(" Filter Style: Fade-0 Blend-1 Normal-2 Highlight-3", null);
window.SetProperty(" Filter: Line Colour: Grey-0 Blend-1 Text-2", null);
function setWallpaperImg(path, metadb) {
var fmt_path = fb.TitleFormat(path).Eval(true);
var fmt_path_arr = utils.Glob(fmt_path).toArray();
if (fmt_path_arr.length > 0) {
var final_path = fmt_path_arr[0];
};
else {
var final_path = null;
};
if (metadb && ppt.wallpapermode == 0) {
var tmp_img = utils.GetAlbumArtV2(metadb, ppt.wallpapermode);
};
else {
if (final_path) {
tmp_img = gdi.Image(final_path);
};
else {
tmp_img = null;
};
};
if (!tmp_img) {
if (final_path) {
tmp_img = gdi.Image(final_path);
};
else {
tmp_img = null;
};
};
g_wallpaperImg = null;
var img = FormatWallpaper(tmp_img, ww, wh, 2, 0, 0, "", true);
return img;
};
function draw_blurred_image(image, ix, iy, iw, ih, bx, by, bw, bh, blur_value, overlay_color) {
var blurValue = blur_value;
var imgA = image.Resize(iw * blurValue / 100, ih * blurValue / 100, 2);
var imgB = imgA.resize(iw, ih, 2);
var overlay_color = RGBA(0, 0, 0, ppt.wallpaperoverlayalfa); //50);
var bbox = gdi.CreateImage(bw, bh);
// Get graphics interface like "gr" in on_paint
var gb = bbox.GetGraphics();
var offset = 90 - blurValue;
gb.DrawImage(imgB, 0 - offset, 0 - (ih - bh) - offset, iw + offset * 2, ih + offset * 2, 0, 0, imgB.Width, imgB.Height, 0, 255);
bbox.ReleaseGraphics(gb);
var newImg = gdi.CreateImage(iw, ih);
var gb = newImg.GetGraphics();
if (ix != bx || iy != by || iw != bw || ih != bh) {
gb.DrawImage(image, ix, iy, iw, ih, 0, 0, image.Width, image.Height, 0, 255);
gb.FillSolidRect(bx, by, bw, bh, 0xffffffff);
};
gb.DrawImage(bbox, bx, by, bw, bh, 0, 0, bbox.Width, bbox.Height, 0, 255);
// overlay
if (overlay_color != null) {
gb.FillSolidRect(bx, by, bw, bh, overlay_color);
};
// top border of blur area
if (ix != bx || iy != by || iw != bw || ih != bh) {
gb.FillSolidRect(bx, by, bw, 1, 0x22ffffff);
gb.FillSolidRect(bx, by - 1, bw, 1, 0x22000000);
};
newImg.ReleaseGraphics(gb);
return newImg;
};
function FormatWallpaper(image, iw, ih, interpolation_mode, display_mode, angle, txt, rawBitmap) {
if (!image || !iw || !ih)
return image;
var i,
j;
var panel_ratio = iw / ih;
wpp_img_info.ratio = image.Width / image.Height;
wpp_img_info.orient = 0;
if (wpp_img_info.ratio > panel_ratio) {
wpp_img_info.orient = 1;
// 1/3 : default image is in landscape mode
switch (display_mode) {
case 0: // Filling
//wpp_img_info.w = iw * wpp_img_info.ratio / panel_ratio;
wpp_img_info.w = ih * wpp_img_info.ratio;
wpp_img_info.h = ih;
wpp_img_info.cut = wpp_img_info.w - iw;
wpp_img_info.x = 0 - (wpp_img_info.cut / 2);
wpp_img_info.y = 0;
break;
case 1: // Adjust
wpp_img_info.w = iw;
wpp_img_info.h = ih / wpp_img_info.ratio * panel_ratio;
wpp_img_info.cut = ih - wpp_img_info.h;
wpp_img_info.x = 0;
wpp_img_info.y = wpp_img_info.cut / 2;
break;
case 2: // Stretch
wpp_img_info.w = iw;
wpp_img_info.h = ih;
wpp_img_info.cut = 0;
wpp_img_info.x = 0;
wpp_img_info.y = 0;
break;
};
};
else if (wpp_img_info.ratio < panel_ratio) {
wpp_img_info.orient = 2;
// 2/3 : default image is in portrait mode
switch (display_mode) {
case 0: // Filling
wpp_img_info.w = iw;
//wpp_img_info.h = ih / wpp_img_info.ratio * panel_ratio;
wpp_img_info.h = iw / wpp_img_info.ratio;
wpp_img_info.cut = wpp_img_info.h - ih;
wpp_img_info.x = 0;
wpp_img_info.y = 0 - (wpp_img_info.cut / 4);
break;
case 1: // Adjust
wpp_img_info.h = ih;
wpp_img_info.w = iw * wpp_img_info.ratio / panel_ratio;
wpp_img_info.cut = iw - wpp_img_info.w;
wpp_img_info.y = 0;
wpp_img_info.x = wpp_img_info.cut / 2;
break;
case 2: // Stretch
wpp_img_info.w = iw;
wpp_img_info.h = ih;
wpp_img_info.cut = 0;
wpp_img_info.x = 0;
wpp_img_info.y = 0;
break;
};
};
else {
// 3/3 : default image is a square picture, ratio = 1
wpp_img_info.w = iw;
wpp_img_info.h = ih;
wpp_img_info.cut = 0;
wpp_img_info.x = 0;
wpp_img_info.y = 0;
};
var tmp_img = gdi.CreateImage(iw, ih);
var gp = tmp_img.GetGraphics();
gp.SetInterpolationMode(interpolation_mode);
gp.DrawImage(image, wpp_img_info.x, wpp_img_info.y, wpp_img_info.w, wpp_img_info.h, 0, 0, image.Width, image.Height, angle, ppt.wallpaperalfa); //255);
tmp_img.ReleaseGraphics(gp);
// blur it!
if (ppt.wallpaperblurred) {
var blur_factor = ppt.wallpaperblurvalue; // [1-90]
tmp_img = draw_blurred_image(tmp_img, 0, 0, tmp_img.Width, tmp_img.Height, 0, 0, tmp_img.Width, tmp_img.Height, blur_factor, 0x00ffffff);
};
CollectGarbage();
if (rawBitmap) {
return tmp_img.CreateRawBitmap();
};
else {
return tmp_img;
};
};
function on_playback_new_track(metadb) {
g_metadb = metadb;
if (ppt.showwallpaper) {
g_wallpaperImg = setWallpaperImg(ppt.wallpaperpath, metadb);
};
on_size();
window.Repaint();
};
function on_notify_data(name, info) {
if (name == "library" && info == "send_to_pl") {
on_key_down(v.enter);
//window.Repaint();
window.NotifyOthers("lib_btns", "send_to_pl_ok");
};
};
?
|