28.06.2016, 17:24 | #1961 | |
Гуру
Регистрация: 01.06.2013
Регион: 78, 98
Машина: SUBARU Impreza WRX
Сообщений: 1,766
|
Цитата:
Сделай проще вынеси настройки зон и "точки" в Properties, будет проще настраивать. например: (переменные можешь обозвать как тебе нужно, ниже просто пример) var click_expand_zone = window.GetProperties("Зона кнопки Развернуть", 30); var btn_expand_size = window.GetProperties("Кнопка Развернуть размер ", 30); и прописываешь эти переменные click_expand_zone, btn_expand_size в то место где ты цифры меняешь... бонус в том чтоб в редактор не лазить без конца при подгоне Забыл сказать, у тебя прокрутка страницы целиком включена, т.е. постраничная прокрутка. Ее можно отключить в настройках. -------------------------------- обманул тебя))) шрифт не Segoe UI Symbol а Wingdings для этих папочек...открытой и закрытой папки.
__________________
Готовые сборки foobar2000 для КарПС //--- FLAT ---\\ Сборки PotPlayer Полезные утилиты |
|
28.06.2016, 17:39 | #1962 | |||
Бывалый писикарщик
Регистрация: 14.06.2013
Регион: Украина
Машина: Nissan Qashqai+2
Сообщений: 3,424
|
Цитата:
Все не так просто - там по линиям ещё несколько параметров, отдельно настраивается "+" и отдельно "-" и тд.. Выйдет около 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 // %<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(/%<album artist>%/i, "$if3(%<album artist>%,%<artist>%,%<composer>%,%<performer>%)").replace(/%<album>%/i, "$if2(%<album>%,%<venue>%)").replace(/%<artist>%/i, "$if3(%<artist>%,%<album artist>%,%<composer>%,%<performer>%)"); 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, "#!#$meta_sep(").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"); }; }; Последний раз редактировалось seriousstas; 28.06.2016 в 18:54. |
|||
29.06.2016, 06:53 | #1963 | |
Бывалый писикарщик
Регистрация: 14.06.2013
Регион: Украина
Машина: Nissan Qashqai+2
Сообщений: 3,424
|
duzzy
проверь такой вариант по : Цитата:
в режиме View by Folder Structure папок не будет - только треки вперемешку . |
|
29.06.2016, 15:42 | #1964 | |||
Гуру
Регистрация: 01.06.2013
Регион: 78, 98
Машина: SUBARU Impreza WRX
Сообщений: 1,766
|
seriousstas
Цитата:
Цитата:
Я просто не большой фанат UI элементов, с ними бывают проблемы в скриптах... в скрипты можно подтягивать виндовые кнопки, скролбары, прогрессбары и т.д. Цитата:
Может я что не так добавляю ? Я давно с ним езжу пока проблем не было
__________________
Готовые сборки foobar2000 для КарПС //--- FLAT ---\\ Сборки PotPlayer Полезные утилиты |
|||
29.06.2016, 15:46 | #1965 | ||
Бывалый писикарщик
Регистрация: 14.06.2013
Регион: Украина
Машина: Nissan Qashqai+2
Сообщений: 3,424
|
Цитата:
https://hydrogenaud.io/index.php/top...html#msg924563 Пробовал и сборку для crc - она чистая почти со скриптом дефолным. + ошибка эта вылазит если попытаться развернуть этот одиночный трек,что на втором скрине (Library Tree 0.9) Цитата:
|
||
29.06.2016, 16:27 | #1966 |
Гуру
Регистрация: 01.06.2013
Регион: 78, 98
Машина: SUBARU Impreza WRX
Сообщений: 1,766
|
seriousstas
Мои папки в экплорере и в скрипте ------------------------------- Я понял про что ты говоришь, до меня только что дошло... просто какой смысл отдельные папки добавлять... логично что покажет треки внутри папки отдельно... точно так же работает и Album List вот смотри скрины...
__________________
Готовые сборки foobar2000 для КарПС //--- FLAT ---\\ Сборки PotPlayer Полезные утилиты |
29.06.2016, 16:43 | #1967 |
Бывалый писикарщик
Регистрация: 14.06.2013
Регион: Украина
Машина: Nissan Qashqai+2
Сообщений: 3,424
|
посмотри скрины добавь просто 2 3 папки с треками
|
29.06.2016, 16:45 | #1968 |
Гуру
Регистрация: 01.06.2013
Регион: 78, 98
Машина: SUBARU Impreza WRX
Сообщений: 1,766
|
Я понял про что ты говоришь, до меня только что дошло...
просто какой смысл отдельные папки добавлять... логично что покажет треки внутри папки отдельно... точно так же работает и Album List вот смотри скрины... -------------------------- Смысл в том что используешь одну папку как Медиатеку --- допустим Music и поехали дальше... Например: Music | |--------- CD | |---------- FLAC | |---------- MP3 ... Либо использовать как общее хранилище для всех форматов и качества... Music |--------- AC/DC |--------- Korn |--------- ZZ Top ----------------------------------------------------------------------- По вопросу вылетающей ошибки, можно просто попробовать поставить обход ошибки в этом случае при развороте трека в треке, таким вот образом... try{......тут ловишь ошибку, прописываешь ту строку что выбивает..............}catch(error){.......тут на что то меняешь или оставляешь просто пустоту........}; в 0.9 версии строка 472 (0.9 не развернута после сжатия, поэтому ошибку будет проблематично искать) в 0.8 версии строка 1469 После применения процедуры обхода получится вот такой вариант при развороте трека в треке... можно еще так сделать и получим пустоту вместо undefined.... Код:
try{ nU = n.toUpperCase(); }catch(e){n = "";};
__________________
Готовые сборки foobar2000 для КарПС //--- FLAT ---\\ Сборки PotPlayer Полезные утилиты Последний раз редактировалось duzzy; 29.06.2016 в 17:17. |
29.06.2016, 17:40 | #1969 |
Бывалый писикарщик
Регистрация: 14.06.2013
Регион: Украина
Машина: Nissan Qashqai+2
Сообщений: 3,424
|
Ну это типа - мелочь , но неприятно
|
29.06.2016, 17:52 | #1970 |
Гуру
Регистрация: 03.05.2011
Возраст: 73
Город: Верещагино
Регион: 59
Машина: Toyota-Echo
Сообщений: 2,045
|
[QUOTE=duzzy;363698
Смысл в том что используешь одну папку как Медиатеку --- допустим Music [/QUOTE] Пишешь одно , а на скрине в путях три папки, у меня всегда только две прописаны... Music на харде внутреннем и Music на любой флешке присоединённой в машине. Дома всегда (как ты и пишешь) только один путь Music.
__________________
DN2800MT, DDR3-4Gb, SSD -30 Gb, Lilliput FA1000 - по HDMI, Win-8 . |
Здесь присутствуют: 12 (пользователей: 0 , гостей: 12) | |
|
|