JSplitter v2.1.4.1 / v1.0.4 [17.05.2018]

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

Описание: Все о плагинах, компонентах, расширениях

Сообщение #81 seriousstas » 05.04.2018, 16:28

почему бы просто не заменить все wsh панели на jsplitter панели?
LUR
Так сделано давно , НО! , как только-что спрятанная панель будет знать, что в ней нужно остановить таймер , когда открыта поверх другая ,
при условии, что элементы управления (кнопки) в главном сплиттере . Верно - никак (разве-что изменять размер..)
Отправлять команды по notify нужно как-раз из Вашего сплиттера, где и планируется разместить кнопки .
А городить отдельные панели с кнопками ..
seriousstas
Мастер
Откуда: Украина , Ивано-Франковск
Репутация: 88
С нами: 3 года 3 месяца

Сообщение #82 LUR » 05.04.2018, 16:29

seriousstas писал(а):А городить отдельные панели с кнопками
Никто и не заставляет. Все зависит от конкретной ситуации)
LUR M
Автор темы, Модератор
Аватара
Возраст: 35
Откуда: Минск
Репутация: 208
С нами: 5 лет 5 месяцев

Сообщение #83 seriousstas » 05.04.2018, 16:39

Пока остается только :
проверяющий состояние переменых в файле *.ini
Далее создавать доп. таймеры + лишнее обращение к HDD(SSD) :insane:
seriousstas
Мастер
Откуда: Украина , Ивано-Франковск
Репутация: 88
С нами: 3 года 3 месяца

Сообщение #84 LUR » 05.04.2018, 17:03

seriousstas писал(а):как только-что спрятанная панель будет знать, что в ней нужно остановить таймер , когда открыта поверх другая ,
при условии, что элементы управления (кнопки) в главном сплиттере
Может я что-то не понял, но чем плохо отправлять команды дочерним панелям из главного сплиттера? И не нужен никакой ini
LUR M
Автор темы, Модератор
Аватара
Возраст: 35
Откуда: Минск
Репутация: 208
С нами: 5 лет 5 месяцев

Сообщение #85 seriousstas » 07.04.2018, 14:27

LUR писал(а):Может я что-то не понял, но чем плохо отправлять команды дочерним панелям из главного сплиттера? И не нужен никакой ini
Так-ж выяcнили уже , что
Not possible.
а только
MPS window.NotifyOthers >> MPS on_notify_data(name, data)
WSH window.NotifyOthers >> WSH on_notify_data(name, data)
JPanel window.NotifyOthers >> JPanel on_notify_data(name, data)
Когда реализуете :
Как бы я не собираюсь прямо вот оставаться на 1.5.10. Панель выбрана просто как устоявшийся стандарт, никто не мешает впоследствии перенести проект на JPanel.
- создам все панели из множества JSplitter и будем экспериментировать )

Есть-ли у Вас примеры анимации (движения влево-вправо) панелей ?
seriousstas
Мастер
Откуда: Украина , Ивано-Франковск
Репутация: 88
С нами: 3 года 3 месяца

Сообщение #86 LUR » 07.04.2018, 14:44

seriousstas, какие ещё примеры)) создали таймер в обработчике передвинули панель, не вижу чего-то особенного и требующего больших умственных усилий.
LUR M
Автор темы, Модератор
Аватара
Возраст: 35
Откуда: Минск
Репутация: 208
С нами: 5 лет 5 месяцев

Сообщение #87 seriousstas » 07.04.2018, 19:37

LUR
не вижу чего-то особенного и требующего больших умственных усилий
это на первый взгляд . Чуть тяжелее двигаемая панель или фоновая картинка - и движение превращается в слайдшоу , если не покрутить настройки
- шаг время делитель и тд..

Вот скажем пример Геннадия для МПС :
http://pccar.ru/showpost.php?p=336322&postcount=1941
И чем больше их будет , тем проще "чайнику" вроде меня что-то реализовать )
seriousstas
Мастер
Откуда: Украина , Ивано-Франковск
Репутация: 88
С нами: 3 года 3 месяца

Сообщение #88 duzzy » 16.05.2018, 04:23

LUR, хотел спросить нет ли в планах обновить проект до свежей JScript Panel 2.1.4 ?
Почему спрашиваю, в верисии 2.1.2 марк вернул совместимость с фубаром 1.3 и Win XP.
И плюсов достаточно много:
- новый движок chakra(работает намного шустрее чем JScript 9, даже на довольно слабых компах)
- новые методы и колбеки(fb.GetDSPPresets, fb.SetDSPPreset, fb.GetOutputDevices, fb.SetOutputDevice, drag/drop, on_replaygain_mode_changed, fb.CopyHandleListToClipboard, fb.CheckClipboardContents, fb.GetClipboardContents, работа со статистикой, хоткеи для js панелей, on_library_items_added, on_library_items_changed, on_library_items_removed... и т.д.)
- полезные фиксы(например поправлены таймеры, ранее они были ограничены до 16, window.RepaintRect - поправлен и т.д.)
проверить можно так...
прописать в панель такой скрипт
Код: Выделить всё
for (var i = 0; i <60; i++) {
    var id = window.SetTimeout(function() {
    }, 1000);
    fb.trace(i, id > 0 ? 'Success' : 'Fail');\\for wsh panel
    //console.log(i, id > 0 ? 'Success' : 'Fail');\\for js panel
}

Я сам прекрасно понимаю что марк еще тот фрукт, но как не крути панель все же стала лучше, и скрипты работают шустро особенно ресурсоемкие.
К чему я это все пишу, к тому что хотелось бы конечно избавится от некоторых костылей в виде PSS, MegaPanelSplitter и использовать для постройки интерфейса только один плагин, т.е. перегнать все скрипты с JScript Panel на JSplitter и полноценно пользоваться всеми возможностями как сплиттера так и JS панели.
Уже приличное время ковыряюсь с этими JS панелями конечно как любитель и за это время я для себя осознал что для меня самый удобный и приятный глазу скриптовый интерфейс потому как его легко настраивать, менять на ходу, что то переделывать под себя.
Вот к примеру что мы делаем на pccar.ru для авто-компов, домашняя сборка тоже вся на js :wink:
(глюки при записи видео это бандикам, да и комп уже старичек)
...
duzzy
Бывалый
Репутация: 15
С нами: 2 года 10 месяцев

Сообщение #89 LUR » 16.05.2018, 17:24

duzzy писал(а):нет ли в планах обновить проект до свежей JScript Panel 2.1.4 ?
Сделаю версию с JScript Panel, ок.
LUR M
Автор темы, Модератор
Аватара
Возраст: 35
Откуда: Минск
Репутация: 208
С нами: 5 лет 5 месяцев

Сообщение #90 duzzy » 16.05.2018, 21:40

LUR писал(а):Сделаю версию с JScript Panel, ок.
Спасибо Огромное :beer:
Функционал у JSplitter супер !!!
Начал переводить свою сборку на JSplitter.
_____________________________________________________
Читал тему и помню был разговор по громадным диалогам jscript panel последних верисий, эта проблема очень легко решается resource hacker-ом.
У себя привел диалоги к такому виду...
Изображение Изображение

Это скрипты диалогов Properties и Редактора скриптов для resource hacker-а, возможно будут полезны.
Спойлер
Код: Выделить всё
//===================== Script Editor Dialog Sizes
102 DIALOGEX 0, 0, 420, 132
STYLE WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION "JScript Panel Configuration"
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
FONT 8, "Tahoma", FW_NORMAL, FALSE, 0
{
   CONTROL "", 1000, EDIT, ES_CENTER | ES_READONLY | WS_CHILD | WS_VISIBLE | WS_BORDER, 7, 5, 404, 14
   CONTROL "", 1001, "JScriptScintilla", 0x52000000, 7, 23, 404, 79
   CONTROL "&Tools", 1002, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 7, 110, 50, 14
   CONTROL "Script Engine:", 1003, STATIC, SS_RIGHT | WS_CHILD | WS_VISIBLE | WS_GROUP, 63, 102, 50, 8
   CONTROL "", 1004, COMBOBOX, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 63, 112, 55, 21
   CONTROL "Edge Style:", 1005, STATIC, SS_RIGHT | WS_CHILD | WS_VISIBLE | WS_GROUP, 123, 102, 45, 8
   CONTROL "", 1006, COMBOBOX, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 123, 112, 55, 21
   CONTROL "Transp", 1007, BUTTON, BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 187, 105, 35, 10
   CONTROL "&Grab Focus", 1008, BUTTON, BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 187, 120, 52, 10
   CONTROL "&OK", 1, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 250, 110, 50, 14
   CONTROL "&Apply", 110, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 306, 110, 50, 14
   CONTROL "&Cancel", 2, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 362, 110, 50, 14
}

//================================================

//===================== Properties Dialog Sizes
109 DIALOGEX 0, 0, 350, 215
STYLE WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION "JS Properties"
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
FONT 9, "Tahoma", FW_NORMAL, FALSE, 1
{
   CONTROL "", 1014, LISTBOX, LBS_NOTIFY | LBS_OWNERDRAWVARIABLE | LBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL, 7, 3, 335, 190
   CONTROL "De&lete", 1010, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 7, 198, 40, 14
   CONTROL "C&lear", 1011, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 50, 198, 40, 14
   CONTROL "I&mport", 1012, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 93, 198, 40, 14
   CONTROL "E&xport", 1013, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 136, 198, 40, 14
   CONTROL "&OK", 1, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 190, 198, 45, 14
   CONTROL "&Apply", 110, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 244, 198, 45, 14
   CONTROL "&Cancel", 2, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 298, 198, 45, 14
}

//=============================================
Последний раз редактировалось duzzy 16.05.2018, 21:55, всего редактировалось 1 раз.
duzzy
Бывалый
Репутация: 15
С нами: 2 года 10 месяцев

Сообщение #91 megane68 » 16.05.2018, 21:43

LUR, клёвая задумка, спасибо!
У меня правда крешится скрипт от DarkOne 3.1, панели громкости. Вероятно из-за более новой версии WHS Panel Mod.
Можно как-то его подправить?
Код: Выделить всё
// ==PREPROCESSOR==
// @name "DarkOne Volume Panel"
// @version "3.0"
// @author "Br3tt and T.P Wang, modified by tedGo"
// @import "%fb2k_path%themes\DarkOne\Others\WSH Scripts\DO Global Script.js"
// @import "%fb2k_path%themes\DarkOne\Others\WSH Scripts\DO Global Button Script.js"
// ==/PREPROCESSOR==

window.MinWidth = window.MaxWidth = 90;
window.MinHeight = window.MaxHeight = 95;

var v_change = false;
var g_angle = 270;
var g_R = 20;

// ----- CREATE THETA ----------------------------------------------
function calc_theta(x, y){
   x -= 29;
   y -= 51;
   theta = Math.atan2(y, x) / Math.PI * 180;
   if (theta <= 90 && theta > 45) return g_angle;
   if (theta > 90 && theta < 135) return 0;
   return theta >= 0 ? theta > 90 ? theta - 135 : theta + 225 : theta + 225
}

// ----- DRAW ------------------------------------------------------
var imgPath = configPath + "Images\\";
var a_img = gdi.Image(imgPath + "Vol-wheel.png");
var b_img = gdi.Image(imgPath + "Indicator.png");
var c_img = gdi.Image(imgPath + "IndicatorMH.png");
var d_img = gdi.Image(imgPath + "Mute.png");
var g_img;

function on_paint(gr) {
   if (!window.IsTransparent) {
      gr.FillSolidRect(0, 0, window.Width, window.Height, ui_backcol);
      gr.FillGradRect(0, 0, window.Width, 90, 90, RGBA(151, 180, 202, 128), 0);
   }

   gr.GdiDrawText("VOLUME", btn_font, ui_btntxtcol, 10, 10, 58, 16, 33);
   a_img && gr.DrawImage(a_img, 10, 22, 58, 58, 0, 0, a_img.Width, a_img.Height);

   theta = (Math.pow(10, fb.Volume / 50) - 0.001) / 0.999 * g_angle;
   posA = (theta - 45) * Math.PI / 180;
   cosinusA = Math.cos(posA);
   sinusA = Math.sin(posA);
   posX = 37 - cosinusA * g_R;
   posY = 48 - sinusA * g_R;

   g_img = fb.Volume == -100 ? d_img : v_change ? c_img : b_img;
   g_img && gr.DrawImage(g_img, posX, posY, 5, 5, 0, 0, g_img.Width, g_img.Height);
}

// ----- MOUSE ACTIONS ---------------------------------------------
var g_drag = false;

function on_mouse_move(x, y){
   if (g_drag){
      d = calc_theta(x, y) / g_angle;
      v = 50 * Math.log(0.99 * d + 0.01) / Math.LN10;
      if (fb.Volume != v) fb.Volume = v;
   }
}

function on_mouse_lbtn_down(x, y){
   g_drag = true;
}

function on_mouse_lbtn_up(x, y){
   on_mouse_move(x,y);
   g_drag = false;
}

function on_mouse_wheel(delta){
   delta > 0 ? fb.VolumeUp() : fb.VolumeDown();
}

function on_mouse_rbtn_up(x, y) {
   var a = window.CreatePopupMenu();
   var idx;

   a.AppendMenuItem(fb.Volume == -100 ? 8 : 0, 1, "Volume Mute");
   a.AppendMenuItem(2048, 0, 0);
   a.AppendMenuItem(0, 2, "Properties");
   a.AppendMenuItem(0, 3, "Configure");
   idx = a.TrackPopupMenu(x, y);

   if (idx == 1) fb.VolumeMute();
   else if (idx == 2) window.ShowProperties();
   else idx == 3 && window.ShowConfigure();

   a.Dispose();
   return true;
}

// ----- EVENTS ----------------------------------------------------
var v_timer = null;

function on_timer(id) {
   if (v_timer) {
      window.Repaint();
      v_timer.Dispose();
      v_timer = null;
      v_change = false;
   }
}

function on_volume_change(val) {
   if (v_timer) {
      v_timer.Dispose();
      v_timer = null;
   }

   v_timer = window.CreateTimerTimeout(3000);
   v_change = true;
   window.Repaint();
}
megane68 M
Мастер
Репутация: -29
С нами: 9 лет 3 месяца

Сообщение #92 LUR » 16.05.2018, 22:42

megane68 писал(а):Можно как-то его подправить?
Как-то так:
Код: Выделить всё
// ==PREPROCESSOR==
// @name "DarkOne Volume Panel"
// @version "3.0"
// @author "Br3tt and T.P Wang, modified by tedGo"
// @import "%fb2k_path%themes\DarkOne\Others\WSH Scripts\DO Global Script.js"
// @import "%fb2k_path%themes\DarkOne\Others\WSH Scripts\DO Global Button Script.js"
// ==/PREPROCESSOR==

window.MinWidth = window.MaxWidth = 90;
window.MinHeight = window.MaxHeight = 95;

var v_change = false;
var g_angle = 270;
var g_R = 20;

// ----- CREATE THETA ----------------------------------------------
function calc_theta(x, y){
   x -= 29;
   y -= 51;
   theta = Math.atan2(y, x) / Math.PI * 180;
   if (theta <= 90 && theta > 45) return g_angle;
   if (theta > 90 && theta < 135) return 0;
   return theta >= 0 ? theta > 90 ? theta - 135 : theta + 225 : theta + 225
}

// ----- DRAW ------------------------------------------------------
var imgPath = configPath + "Images\\";
var a_img = gdi.Image(imgPath + "Vol-wheel.png");
var b_img = gdi.Image(imgPath + "Indicator.png");
var c_img = gdi.Image(imgPath + "IndicatorMH.png");
var d_img = gdi.Image(imgPath + "Mute.png");
var g_img;

function on_paint(gr) {
   if (!window.IsTransparent) {
      gr.FillSolidRect(0, 0, window.Width, window.Height, ui_backcol);
      gr.FillGradRect(0, 0, window.Width, 90, 90, RGBA(151, 180, 202, 128), 0);
   }

   gr.GdiDrawText("VOLUME", btn_font, ui_btntxtcol, 10, 10, 58, 16, 33);
   a_img && gr.DrawImage(a_img, 10, 22, 58, 58, 0, 0, a_img.Width, a_img.Height);

   theta = (Math.pow(10, fb.Volume / 50) - 0.001) / 0.999 * g_angle;
   posA = (theta - 45) * Math.PI / 180;
   cosinusA = Math.cos(posA);
   sinusA = Math.sin(posA);
   posX = 37 - cosinusA * g_R;
   posY = 48 - sinusA * g_R;

   g_img = fb.Volume == -100 ? d_img : v_change ? c_img : b_img;
   g_img && gr.DrawImage(g_img, posX, posY, 5, 5, 0, 0, g_img.Width, g_img.Height);
}

// ----- MOUSE ACTIONS ---------------------------------------------
var g_drag = false;

function on_mouse_move(x, y){
   if (g_drag){
      d = calc_theta(x, y) / g_angle;
      v = 50 * Math.log(0.99 * d + 0.01) / Math.LN10;
      if (fb.Volume != v) fb.Volume = v;
   }
}

function on_mouse_lbtn_down(x, y){
   g_drag = true;
}

function on_mouse_lbtn_up(x, y){
   on_mouse_move(x,y);
   g_drag = false;
}

function on_mouse_wheel(delta){
   delta > 0 ? fb.VolumeUp() : fb.VolumeDown();
}

function on_mouse_rbtn_up(x, y) {
   var a = window.CreatePopupMenu();
   var idx;

   a.AppendMenuItem(fb.Volume == -100 ? 8 : 0, 1, "Volume Mute");
   a.AppendMenuItem(2048, 0, 0);
   a.AppendMenuItem(0, 2, "Properties");
   a.AppendMenuItem(0, 3, "Configure");
   idx = a.TrackPopupMenu(x, y);

   if (idx == 1) fb.VolumeMute();
   else if (idx == 2) window.ShowProperties();
   else idx == 3 && window.ShowConfigure();

   a.Dispose();
   return true;
}

// ----- EVENTS ----------------------------------------------------
function on_volume_change(val) {
   window.SetTimeout(function() {
      window.Repaint();
      v_change = false;       
   }, 3000);
   v_change = true;
   window.Repaint();
}
LUR M
Автор темы, Модератор
Аватара
Возраст: 35
Откуда: Минск
Репутация: 208
С нами: 5 лет 5 месяцев

Сообщение #93 megane68 » 17.05.2018, 00:33

LUR, спасибо!
А в чём там причина?
У меня ещё пара скриптов глючат так же.
megane68 M
Мастер
Репутация: -29
С нами: 9 лет 3 месяца

Сообщение #94 LUR » 17.05.2018, 00:35

megane68 писал(а):А в чём там причина?
Начиная с версии 1.5.7 в WSH Panel Mod отсутствует функция window.CreateTimerTimeout(ms)
Вместо нее используется window.SetTimeout(func, ms)
LUR M
Автор темы, Модератор
Аватара
Возраст: 35
Откуда: Минск
Репутация: 208
С нами: 5 лет 5 месяцев

Сообщение #95 megane68 » 17.05.2018, 14:02

LUR, спасибо, попробую.
Такой вопрос. Как вернуть рамку к панели? Если она пустая, то пкм спасает, а если не ней висит скрипт, то блин не могу догадаться.

Добавлено спустя 8 минут 12 секунд:
LUR писал(а):Начиная с версии 1.5.7 в WSH Panel Mod отсутствует функция window.CreateTimerTimeout(ms)
исправил, но теперь при воспроизведении выдаёт ошибку в 135 строке.
JSplitter (DarkOne Display Panel v3.0 by super-gau and tedGo, includes partial codes by fbuser and T.P Wang): Ошибка выполнения Microsoft JScript:
Объект не поддерживает это свойство или метод
File: <main>
Line: 135, Col: 4
<source text only available at compile time>
Код: Выделить всё
// ==PREPROCESSOR==
// @name "DarkOne Display Panel"
// @version "3.0"
// @author "super-gau and tedGo, includes partial codes by fbuser and T.P Wang"
// @import "%fb2k_path%themes\DarkOne\Others\WSH Scripts\DO Global Script.js"
// ==/PREPROCESSOR==

window.MinWidth = 280;

var g_down = false, v_change = false;
var g_timer = null, v_timer = null;
var g_interval, fileinfo;

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

function pad(x, y, z) {
   z || (z = ' ');
   return x.length < y ? x + z.repeat(y - x.length) : x;
}

function pad_right(x, y, z) {
   z || (z = ' ');
   return x.length < y ? z.repeat(y - x.length) + x : x
}

function TimeFmt(t) {
   var zpad = function(n) {
      var str = n.toString();
      return str.length < 2 ? "0" + str : str;
   }

   var h = Math.floor(t / 3600);
   t -= h * 3600;
   var m = Math.floor(t / 60);
   t -= m * 60;
   var s = Math.floor(t);

   if (h > 0) return h.toString() + "h" + zpad(m) + "m";

   return m.toString() + ":" + zpad(s);
}

// ----- CREATE SEEKBAR --------------------------------------------
var g_img1 = gdi.Image(configPath + "Images\\SliderPlay.png");
var g_img2 = gdi.Image(configPath + "Images\\Slider.png");

function Seekbar(x, y, w, h) {
   this.left = x;
   this.top = y;
   this.w = w;
   this.h = h;
   this.right = x + w;
   this.bottom = y + h;
   this.g_drag_seek = 0;
   this.margin = 30;
   this.area = this.w - (this.margin * 2);

   this.traceMouse = function(x, y, onlyWidth) {
      if (onlyWidth == null) onlyWidth = true;
      return this.left < x && x < this.right && (onlyWidth || this.top < y && y < this.bottom);
   }

   this.draw = function(gr) {
      var c, f;

      if (this.active) {
         f = g_down ? this.g_drag_seek : fb.PlaybackTime / fb.PlaybackLength;
         c = g_img1;
         f = this.margin + this.area * f;
         f = f > 0 ? f : this.margin;
      } else {
         c = g_img2;
         f = this.margin;
      }

      gr.DrawRoundRect(this.left + 2, this.top + 1, this.w - 3, this.h - 1, 2, 2, 1, RGBA(255, 255, 255, 32));
      gr.DrawRoundRect(this.left, this.top, this.w - 2, this.h - 1, 2, 2, 1, RGBA(0, 0, 0, 255));
      gr.DrawRect(this.left + 1, this.top + 1, this.w - 4, this.h - 3, 1, RGBA(0, 0, 0, 255));
      gr.DrawRect(this.left + 2, this.top + 2, this.w - 4, this.h - 3, 1, RGBA(25, 40, 51, 255));
      if (!window.IsTransparent) gr.FillSolidRect(this.left + 2, this.top + 2, this.w - 4, this.h - 3, ui_backcol);
      c && gr.DrawImage(c, f - 28, this.top + 2, 56, this.h - 2, 0, 0, c.Width, c.Height);
   }

   this.Repaint = function() {
      window.RepaintRect(this.left, this.top, this.w, this.h);
   }

   this.calcDragSeek = function(x, y) {
      this.g_drag_seek = (x - this.margin) / this.area;
      this.g_drag_seek = this.g_drag_seek < 0 ? 0 : this.g_drag_seek < 1 ? this.g_drag_seek : 1;
   }

   this.on_mouse_lbtn_down = function(x, y) {
      if (this.traceMouse(x, y, false) && this.active) {
         g_down = true;
         this.calcDragSeek(x, y);
         this.Repaint();
      }
   }

   this.on_mouse_lbtn_up = function(x, y) {
      if (g_down && this.active) {
         this.calcDragSeek(x, y);
         fb.PlaybackTime = fb.PlaybackLength * this.g_drag_seek;
      }
   }

   this.on_mouse_move = function(x, y) {
      if (g_down && this.traceMouse(x, y) && this.active) {
         this.calcDragSeek(x, y);
         window.Repaint();
      }

      this.mouseX = x;
      this.mouseY = y;
   }

   this.on_mouse_wheel = function(delta) {
      if (this.traceMouse(this.mouseX, this.mouseY, false) && this.active) fb.PlaybackTime += delta
   }

   this.on_playback_new_track = function(metadb) {
      if (metadb) this.active = fb.PlaybackLength <= 0 || metadb.RawPath.indexOf("FOO_LASTFM") == 0 ? false : true;

      if (g_timer) {
         g_timer.Dispose();
         g_timer = null;
      }

      if (this.active) {
         g_interval = Math.max(Math.round(fb.PlaybackLength / (this.area / 100)), 40);
         g_timer = window.CreateTimerInterval(g_interval);
      }
   }

   this.getElapseTime = function() {
      return TimeFmt(this.g_drag_seek * fb.PlaybackLength);
   }

   this.getRemainTime = function() {
      return TimeFmt(fb.PlaybackLength - (this.g_drag_seek * fb.PlaybackLength));
   }

   this.init = function() {
      this.on_playback_new_track(fb.GetNowPlaying());
   }
}

// ----- CREATE INFO OPTIONS ---------------------------------------
var i_active = window.GetProperty("Indicator Colour: Active", "128-192-255-255");
var g_acol = CustomColour(i_active);

var i_inactive = window.GetProperty("Indicator Colour: Inactive", "31-50-63-255");
var g_bcol = CustomColour(i_inactive);

Info.prototype.setColours = function() {
   var metadb = fb.GetNowPlaying();

   if (metadb) {
      fileinfo = metadb.GetFileInfo();
      this.Colours[0] = fileinfo.InfoValue(fileinfo.InfoFind("encoding")) == "lossless" ? g_acol : g_bcol;
      this.Colours[1] = fileinfo.InfoValue(fileinfo.InfoFind("encoding")) == "lossless" ? g_bcol : g_acol;
      this.Colours[2] = fileinfo.InfoValue(fileinfo.InfoFind("md5")) ? g_acol : g_bcol;
      this.Colours[3] = fb.TitleFormat("[%replaygain_track_gain%]").Eval() ? g_acol : g_bcol;
      this.Colours[4] = fileinfo.MetaValue(fileinfo.MetaFind("tracknumber"), 0) ? ui_btntxtcol : g_bcol;
      this.Colours[5] = fileinfo.MetaValue(fileinfo.MetaFind("totaltracks"), 0) ? ui_btntxtcol : g_bcol;
      this.Colours[6] = fb.PlaybackLength <= 0 ? g_bcol : ui_btntxtcol;
      this.Colours[7] = ui_btntxtcol;
   } else for (var i = 0; i < this.Colours.length; i++) this.Colours[i] = g_bcol;
}

Info.prototype.setTrackNo = function() {
   var metadb = fb.GetNowPlaying();
   var a;

   if (metadb) {
      fileinfo = metadb.GetFileInfo();
      var b = fileinfo.MetaValue(fileinfo.MetaFind("tracknumber"), 0);
      var c = fileinfo.MetaValue(fileinfo.MetaFind("totaltracks"), 0);
      var d = b ? pad_right(b, 2, "0") : "";
      var e = c ? pad_right(c, 2, "0") : "";
      if (b) a = pad(d, 4) + e;
      else if (fb.PlaybackLength <= 0) a = "Stream";
      else if (metadb.RawPath.indexOf("FOO_LASTFM") == 0) a = "last.fm";
      else if (fileinfo.InfoValue(fileinfo.InfoFind("codec")) == "PCM") a = "PCM-Wave";
      this.TrackNo = a;
   } else this.TrackNo = "";
}

Info.prototype.setPBTime = function() {
   this.Elapse = TimeFmt(fb.PlaybackTime);
   this.Remain = fb.PlaybackLength > 0 ? TimeFmt(fb.PlaybackLength - fb.PlaybackTime) : "";
}

Info.prototype.setBitrate = function() {
   this.Bitrate = fb.TitleFormat("%bitrate%").Eval();
}

Info.prototype.setInfo = function() {
   this.setColours();
   this.setTrackNo();
   this.setPBTime();
   this.setBitrate();
}

function Info() {
   this.Colours = new Array(8);
   this.setInfo();
}

info = new Info();

// ----- DRAW ------------------------------------------------------
function on_paint(gr) {
   var t_elp = g_down && seekbar.active ? seekbar.getElapseTime() : info.Elapse;
   var t_rem = g_down && seekbar.active ? seekbar.getRemainTime() : info.Remain;
   var p_icon;

   if (!window.IsTransparent) gr.FillSolidRect(0, 0, ww, wh, ui_backcol);
   seekbar.draw(gr);

   if (fb.IsPlaying) p_icon = fb.IsPaused ? "\u258c" : "\u25ba";

   gr.DrawRect(1, 18, ww * 17 / 70, 10, 1, info.Colours[0]);
   gr.DrawRect(ww * 71 / 280, 18, ww * 17 / 70, 10, 1, info.Colours[1]);
   gr.DrawRect(ww * 141 / 280, 18, ww * 17 / 70, 10, 1, info.Colours[2]);
   gr.DrawRect(ww * 211 / 280, 18, ww * 17 / 70, 10, 1, info.Colours[3]);

   gr.GdiDrawText("LOSSLESS", btn_font, info.Colours[0], 2, 18, ww * 17 / 70, 10, 37);
   gr.GdiDrawText("LOSSY", btn_font, info.Colours[1], ww * 9 / 35, 18, ww * 17 / 70, 10, 37);
   gr.GdiDrawText("AUDIO MD5", btn_font, info.Colours[2], ww * 71 / 140, 18, ww * 17 / 70, 10, 37);
   gr.GdiDrawText("REPLAYGAIN", btn_font, info.Colours[3], ww * 53 / 70, 18, ww * 17 / 70, 10, 37);

   gr.GdiDrawText("TRACK", btn_font, info.Colours[4], 1, 30, 27, 10, 37);
   gr.GdiDrawText("TOTAL", btn_font, info.Colours[5], 41, 30, 27, 10, 37);
   gr.GdiDrawText("ELAPSED", btn_font, v_change ? g_bcol : info.Colours[7], ww - 155, 30, 35, 10, 38);
   gr.GdiDrawText("REMAIN", btn_font, v_change ? g_bcol : info.Colours[6], ww - 90, 30, 30, 10, 38);
   gr.GdiDrawText("dB", btn_font, v_change ? ui_btntxtcol : g_bcol, ww - 45, 30, 10, 10, 37);
   gr.GdiDrawText("KBPS", btn_font, v_change ? g_bcol : info.Colours[7], ww - 20, 30, 20, 10, 37);
   
   gr.GdiDrawText("\u2588".repeat(Math.ceil(ww / 10)), dsp_font, g_bcol, 0, 38, ww, 19, 37);
   gr.GdiDrawText(info.TrackNo, dsp_font, g_acol, 0, 38, 90, 19, 36);
   gr.GdiDrawText(p_icon, dsp_font, g_acol, (ww / 2) - 50, 38, 10, 19, 37);
   if (v_change) gr.GdiDrawText("Volume " + fb.Volume.toFixed(2), dsp_font, g_acol, ww - 180, 38, 180, 19, 38);
   else {
      fb.IsPlaying && gr.GdiDrawText(t_elp, dsp_font, g_acol, ww - 180, 38, 60, 19, 38);
      gr.GdiDrawText(t_rem, dsp_font, g_acol, ww - 120, 38, 60, 19, 38);
      gr.GdiDrawText(info.Bitrate, dsp_font, g_acol, ww - 60, 38, 60, 19, 38);
   }
}

// ----- MOUSE ACTIONS ---------------------------------------------
function on_mouse_move(x, y) {
   seekbar.on_mouse_move(x, y);
}

function on_mouse_lbtn_down(x, y) {
   seekbar.on_mouse_lbtn_down(x, y);
   window.RepaintRect(ww - 180, 38, 120, 19);
}

function on_mouse_lbtn_up(x, y) {
   seekbar.on_mouse_lbtn_up(x, y);
   g_down = false;
}

function on_mouse_wheel(delta) {
   seekbar.on_mouse_wheel(delta);

   if (seekbar.traceMouse(seekbar.mouseX, seekbar.mouseY, false)) {
      info.setPBTime();
      window.RepaintRect(ww - 180, 38, 120, 19);
   }
}

// ----- EVENTS ----------------------------------------------------
function on_size() {
   ww = window.Width;
   wh = window.Height;
   seekbar = new Seekbar(0, 0, ww, 8);
   seekbar.init();
}

function on_timer(id) {
   if (v_timer && id == v_timer.ID) {
      window.RepaintRect(ww - 180, 30, 180, 27);
      v_timer.Dispose();
      v_timer = null;
      v_change = false;
   } else g_timer && id == g_timer.ID && seekbar.Repaint();
}

function on_volume_change(val) {
   if (v_timer) {
      v_timer.Dispose();
      v_timer = null;
   }

   v_timer = window.SetTimeout(func,3000);
   v_change = true;
   window.RepaintRect(ww - 180, 30, 180, 27);
}

function on_playback_seek(time) {
   seekbar.Repaint();
}

function on_playback_time(time) {
   info.setPBTime();
   window.RepaintRect(ww - 180, 38, 120, 19);
}

function on_playback_dynamic_info() {
   info.setBitrate()
   window.RepaintRect(ww - 60, 38, 60, 19);
}

function on_playback_edited() {
   info.setInfo();
   window.Repaint();
}

function on_playback_new_track(metadb) {
   seekbar.on_playback_new_track(metadb);
   info.setInfo();
   window.Repaint();
}

function on_playback_pause(state) {
   window.RepaintRect((ww / 2) - 50, 38, 10, 19);
}

function on_playback_stop(reason) {
   if (fileinfo) fileinfo.Dispose();

   if (g_timer) {
      g_timer.Dispose();
      g_timer = null;
   }

   if (reason != 2) {
      seekbar.active = false;
      info.setInfo();
   }

   window.Repaint();
}
megane68 M
Мастер
Репутация: -29
С нами: 9 лет 3 месяца

Сообщение #96 LUR » 17.05.2018, 14:12

megane68 писал(а):Если она пустая, то пкм спасает, а если не ней висит скрипт, то блин не могу догадаться.
Не понял насчет "если висит скрипт". Если это панель типа WSH, JS или моя, то возможно там отключено контекстное меню, тогда оно вызывается через Shift+Win+ПКМ. Но там не будет пункта меню для возврата рамки. Для других плагинов рамку к панели вернуть к сожалению не всегда возможно. Некоторые плагины не дают показать мое собственное меню, поэтому в таких случаях только через настройки:
Снимок.PNG


Добавлено спустя 2 минуты 3 секунды:
megane68 писал(а):исправил, но теперь при воспроизведении выдаёт ошибку в 135 строке.
Потому что функции window.CreateTimerInterval тоже уже нет. Вместо нее есть window.SetInterval

Добавлено спустя 6 минут 50 секунд:
И что вы хотели сказать этой строчкой:
Код: Выделить всё
v_timer = window.SetTimeout(func,3000);
Где функция func ? Вам надо скрипт переделывать со знанием дела.
LUR M
Автор темы, Модератор
Аватара
Возраст: 35
Откуда: Минск
Репутация: 208
С нами: 5 лет 5 месяцев

Сообщение #97 megane68 » 17.05.2018, 14:40

LUR писал(а):Некоторые плагины не дают показать мое собственное меню, поэтому в таких случаях только через настройки:
Ага, вот именно это было нужно.
LUR писал(а):Где функция func ? Вам надо скрипт переделывать со знанием дела.
К сожалению не силен в whs скриптах.
Даже не в курсе, что за параметр эта функция задаёт.
megane68 M
Мастер
Репутация: -29
С нами: 9 лет 3 месяца

Сообщение #98 duzzy » 17.05.2018, 15:43

LUR, Привет !
Начал переделывать сборку и столкнулся с одной загвоздкой)))
Добавленные панели в сплиттер располагаются вне порядка, т.е. активна та на которой был клик.
Если тебе не трудно ты бы мог добавить как опцию жесткий порядок панелей в сплиттере,
т.е. та панель которая первая в сплиттере находится поверх всех...
-JSplitter
---панель 1 (topmost(поверх всех))
---панель 2 (ниже 1 панели)
---панель 3 (ниже 2 панели)
---панель 4 (ниже 3 панели)
---панель 5 (ниже 4 панели)
и т.д.

Это нужно для использования наложения панелей одной поверх другой, т.е. самую верхнюю панель можно вызвать и наложить поверх нижних панелей в сплиттере. Такой порядок панелей сильно экономит пространство на экране так как можно вызывать панели поверх других панелей.
В МПС сплиттере использую для наложения поверх панели громкости, панели плейлст-менеджера, наложенных поверх кнопок для вызова других панелей.
Снял небольшое видео сравнение тестовой сборки на JSplitter и сборки на МПС.
duzzy
Бывалый
Репутация: 15
С нами: 2 года 10 месяцев

Сообщение #99 LUR » 17.05.2018, 15:55

duzzy писал(а):Если тебе не трудно
Трудно, если честно. Изначально сделано было для того, чтобы логика скрипта, использующего GetPanelByIndex, не рушилась от взаимодействия с пользователем. Как опцию может и можно было бы сделать, но в лом.

Добавлено спустя 5 часов 7 минут:
Версия 2.1.4 [17.05.2018]
● Версия, основанная на JScrpt Panel 2.1.4

Сделал по-быстрому, задача переноса кода нетривиальная, всегда есть место для ошибки, так что тестируйте и сообщайте об ошибках.
LUR M
Автор темы, Модератор
Аватара
Возраст: 35
Откуда: Минск
Репутация: 208
С нами: 5 лет 5 месяцев

Сообщение #100 seriousstas » 18.05.2018, 02:02

Версия 2.1.4 [17.05.2018]
● Версия, основанная на JScrpt Panel 2.1.4
Круть!
Как опцию может и можно было бы сделать, но в лом.
Без этого - "приплыли")
панели скажем сикбара ,громкости и кнопок должны иметь приоритеры (и быть всегда поверх)
Последний раз редактировалось seriousstas 18.05.2018, 02:06, всего редактировалось 2 раз(а).
seriousstas
Мастер
Откуда: Украина , Ивано-Франковск
Репутация: 88
С нами: 3 года 3 месяца

Пред.След.

Вернуться в Плагины

cron