JSplitter v2.8.8 / v3.6.1.10 [05.10.2024]

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

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

Сообщение #1 LUR » 21.03.2018, 06:06

Плагин представляет собой панель, совмещающую функциональность сплиттера (контейнера для панелей других плагинов) и хоста скриптов JavaScript.

Особенности функционала:

1. Панели добавляются в сплиттер в произвольном порядке, где с ними можно работать как с обычными окнами Windows, а именно: перемещать, изменять их размер, сворачивать, разворачивать, закрывать. Т.е. при работе с плагином foobar2000 превращается в приложение с MDI интерфейсом (Multi Document Interface). Для точного позиционирования панелей предусмотрено отображение координат и их редактирование "на лету" в заголовке окна панели (полезно при дизайне интерфейса сборки). Также имеется возможность настраивать цвета и шрифт заголовка окон панелей.
Функциональность сплиттера работает как в DUI, так и в CUI.

1.PNG


2. Поддерживается управление размещением панелей в сплиттере через стандартный "размещатель" Columns UI. Также поддерживается в DUI то, что похоже на его стандартные сплиттеры, что поддерживается теперь самим автором.
3. В основе хоста скриптов лежит JScript Panel / Spider Monkey Panel, соответственно имеет все возможности данных панелей + дополнительные расширения API, касающиеся сплиттера.
4. Поддерживается управление панелями в сплиттере из скриптов. Возможно программно перемещать, скрывать, изменять размер панелей.
5. Имеется специальное API для быстрого создания кнопок в корне панели и обработки их нажатия.

Итог: по своей задумке функционала повторяет Mega Panel Splitter, но с приятными дополнениями в виде ручного управления перемещением панелей и простого API для создания кнопок. Ну а еще может кому-то просто понравится использовать foobar2000 в виде MDI приложения, кто знает.

Дисклеймер:
Практически каждая новая версия JSplitter основывается на очередной версии JScript Panel / Spider Monkey Panel, поэтому несет все изменения, задуманные автором. Если вы заметили какие-либо изменения в работе своих скриптов, то обратитесь к странице релиза JScript Panel / Spider Monkey Panel, где автор всегда указывает изменения, способные повлиять на существующий код.

СКАЧАТЬ v2.8.8 ====================> на основе JScriprt Panel v2.8.8
АНГЛИЙСКАЯ ВЕРСИЯ
РУССКАЯ ВЕРСИЯ
ЗЕРКАЛО
АНГЛИЙСКАЯ ВЕРСИЯ
РУССКАЯ ВЕРСИЯ

СКАЧАТЬ v3.6.1.10 ====================> на основе Spider Monkey Panel v1.6.2-dev
АНГЛИЙСКАЯ ВЕРСИЯ
РУССКАЯ ВЕРСИЯ
ЗЕРКАЛО
АНГЛИЙСКАЯ ВЕРСИЯ
РУССКАЯ ВЕРСИЯ

Краткое руководство
Для добавления панелей в сплиттер можно воспользоваться следующими способами:

1. С помощью контекстного меню панели плагина:

2.PNG
2.PNG (7.04 КБ) Просмотров: 120513


2. С помощью стандартного размещателя Columns UI:

4.PNG


3. С помощью списка панелей, вызываемого из контекстного меню плагина:

10.png
10.png (8 КБ) Просмотров: 15099


либо окна редактирования скрипта (см. скриншот). Список панелей можно также использовать для добавления, удаления, переупорядочивания панелей, а также изменения их положения и размеров вручную (двойной щелчок по соответствующему полю):

Снимок.PNG


4. В стандартном режиме редактирования разметки (Default UI / Columns UI)

9.png


Все добавляемые панели можно вручную перемещать, изменять их размер, сворачивать, разворачивать, закрывать. У каждого окна в заголовке имеется меню для настройки некоторых опций:

3.PNG


ВНИМАНИЕ! Порядок размещения панелей в сплиттере зависит от глубины их визуального расположения. Самое верхнее окно будет последним в списке. Если вы активируете мышкой какую-либо панель, она переместится в конец списка. Учитывайте это при использовании функции GetPanelByIndex (см. ниже). Чтобы случайных перемещений по списку не происходило, вы можете заблокировать панель (см. ниже)

Show caption - включает/отключает отображение рамки (бордюра) окна панели
Locked - заблокировать панель. С установленной галочкой окно не реагирует на попытки переместить/изменить/закрыть окно.
Show coords - отобразить координаты. В заголовке окна будут отображены координаты окна, которые будут обновляться по мере перемещения/изменения размера окна.
Support pseudo transparency - некоторым окнам необходима поддержка "прозрачности". С включенной опцией плагин будет заменять фон окна панели на содержимое корневого окна плагина. Т.е. например все, что нарисовано в скрипте с помощью on_paint(gr) будет скопировано в окно.

В режиме отображения координат можно вводить необходимые координаты вручную кликнув по нужной координате или изменить название панели:

7.PNG


Настройки внешнего вида окон панелей расположены здесь:

8.png


Show tools menu for panels' caption - включает/отключает меню для заголовка окон панелей.
Move panels with middle button - позволяет перемещать панели при помощи средней кнопки мыши. Полезно когда бордюр окна скрыт (меню Show caption).
Align panels to edges of each other when dragging - выравнивать панели по краям друг друга при перетаскивании окошек. Полезно при построении интерфейса сборки, где панели должны быть расположены плотно друг к другу.
Show scrollbars for out-of-view panels - экспериментальная функция показа полос прокрутки, если панели выходят из зоны видимости. Прокручиваются только панели, содержимое отрисованного окна не меняется и не скроллится.
Hide panels on close - скрывать окна вместо их закрытия. Полезно для временного скрытия панели с помощью кнопки закрытия окна. Вернуть обратно окна можно в размещателе Columns UI сняв галочку Hidden с панели (или из "списка панелей" см. выше):

6.PNG



Программный интерфейс
Базовое API всегда зависит от плагина, на котором основана текущая версия JSplitter. Документация к плагину прилагается. Плюс к этому доступны следующие дополнения для объекта window:

window.GetPanel(caption) - получить объект для доступа к панели по тексту заголовка. Будет возвращена первая панель, совпавшая по тексту с аргументом. Текст панели указывается в заголовке. По умолчанию он имеет значение имени плагина панели, но его можно изменить как напрямую в заголовке окна (Show coords -> Click in caption text), так и в размещателе Columns UI (Use custom title)
window.GetPanelByIndex(index) - получить объект для доступа к панели по индексу. Вообще порядок изначально тот, в котором добавляются панели, но так же порядок можно увидеть в размещателе Columns UI, там же его и изменить.
window.CreateButton(x, y, images, hover_images) - создать кнопку в сплиттере. Кнопка будет создана в корне окна и будет размещена по координатам (x, y). Также функции передаются изображения для задания внешнего вида кнопки. Собственно от количества изображений images, переданных функции, будет зависеть количество состояний, которые может принимать кнопка. hover_images - изображения кнопки, отображающиеся при наведении курсора мыши. Функция достаточно гибкая для создания различного вида кнопок, например:
var path = fb.FoobarPath + "themes\\lur\\black\\bio.png";
var hpath = fb.FoobarPath + "themes\\lur\\black\\bio_on.png";
var a = window.CreateButton(0, 0, path, hpath); - создает обычную кнопку с картинкой bio.png, которая меняется на bio_on.png при наведении курсора мыши
var b = window.CreateButton(0, 0, [path, hpath], null); - создает чекбокс-кнопку. Обычное состояние - bio.png, нажатое (галочка установлена) - bio_on.png. Обратите внимание, что изображения для наведения курсора отсутствуют. Обычно чекбоксам они и не нужны, но можно их установить при желании.
var c = window.CreateButton(0, 0, [path1, path2, path3], [path1_on, path2_on, path3_on]); - можно создать кнопку с тремя (и более) состояниями. Они будут циклически переключаться при нажатии. Текущее состояние кнопки можно будет получить с помощью свойства кнопки State (см. ниже).
Также можно создать группу радио-кнопок (взаимоисключающих) с помощью следующей функции:
window.RadioButtons(buttons) - создает группу радио-кнопок. Принимает в качестве аргумента массив кнопок. Каждая кнопка должна иметь не менее двух состояний, иначе функция свалится. Пример:
var a = window.CreateButton(0, 0, [path, hpath], null);
var b = window.CreateButton(30, 0, [path, hpath], null);
window.RadioButtons([a, b]);
Теперь при нажатии на одну кнопку (состояние 1), другая будет "отключаться" (переходить в состояние 0) и наоборот.
window.GetButton(id) - получить кнопку по значению ее идентификатора (Button.ID)
window.RemoveButton(button) - удаляет кнопку
window.HandOnButtons - переключает курсор мыши для всех кнопок либо на руку, либо на стрелку. Данное свойство также действует на все создаваемые впоследствии кнопки. У каждой кнопки это свойство можно менять индивидуально (см. ниже).

Введены вспомогательные методы для управления главным окном плеера.
window.FoobarWindowX - возвращает и устанавливает положение главного окна foobar2000 по оси X.
window.FoobarWindowY - возвращает и устанавливает положение главного окна foobar2000 по оси Y.
window.FoobarWindowWidth - возвращает и устанавливает ширину главного окна foobar2000.
window.FoobarWindowHeight - возвращает и устанавливает высоту главного окна foobar2000.

Так как JSplitter не получает никакой информации о передвижении мыши над панелями самих плагинов, но иногда это требуется, то введено API для получения данных событий. Перед использованием данного API его необходимо явно разрешить в настройках JSplitter (опция "Track mouse over panels (for on_panel_mouse_*)"/"Отслеживать мышь над панелями (для on_panel_mouse_*)").
window.TrackMouseEnterLeaveOnPanels = true; - включает отслеживание входа/выхода курсора мыши из области панелей. По умолчанию отключено. Для обработки событий используются следующие функции:
on_panel_mouse_enter(name) - событие входа курсора в область панели, name - имя панели
on_panel_mouse_leave(name) - событие выхода курсора из области панели, name - имя панели
window.TrackMouseMoveOnPanels = true; - включает отслеживание позиции курсора мыши в пределах области панели. По умолчанию отключено. Для обработки события используется следующая функция:
on_panel_mouse_move(name, x, y, mask) - событие перемещения курсора в пределах области панели, name - имя панели, x,y - координаты точки на панели

Объекты, получаемые при помощи функций, указанных выше, имеют следующие свойства и методы:

ПАНЕЛИ (GetPanel, GetPanelByIndex)
Свойства:
(readonly) String Name;
(read, write) String Text;
(read, write) boolean Hidden;
(read, write) boolean Locked;
(read, write) boolean ShowCaption;
(read, write) boolean SupportPseudoTransparency;
(read, write) int X;
(read, write) int Y;
(read, write) int Width;
(read, write) int Height;
(read, write) boolean TopMost;
(read, write) boolean EraseBackground;
Методы:
void Show(show = true);
void Move(x, y, width, height, repaintParent = false);

КНОПКИ (CreateButton, GetButton)
Свойства:
(readonly) ushort ID;
(read, write) int X;
(read, write) int Y;
(read, write) int Width;
(read, write) int Height;
(read, write) boolean Hidden;
(read, write) boolean HandOnHover;
(writeonly) Function Click;
(read, write) uint State;
Методы:
void Show(show = true);
void Move(x, y);
void Resize(width, height);

Назначение свойств и методов объектов довольно прозрачно. При назначении ширины или высоты кнопки в ноль, ширина и высота автоматически высчитываются (как и просто при создании кнопки) из максимальной ширины и высоты изображений. Отдельного упоминания заслуживает обработка нажатий кнопок. Она осуществляется 2-мя
путями:

1. При помощи задания свойства Click объекта кнопки:
var a = window.CreateButton(0, 0, [path, hpath], null);
a.Click = function() { do_something(); }

2. При помощи специального callback'a, который вызывается при нажатии ВСЕХ кнопок, созданных с помощью window.CreateButton:
function on_button_click(id) - принимает идентификатор кнопки, который можно получить через свойство кнопки ID.
switch(id) {
case a.ID:
do_something();
break;
}


ПРИМЕЧАНИЕ: В отличие от панелей, существующих вне зависимости от скрипта, кнопки создаются только программно с помощью скрипта и всегда уничтожаются при выгрузке скрипта.


Пример конфигурации
Распаковать в папку с чистым портативным фубаром.
СКАЧАТЬ / ЗЕРКАЛО

Пример от zeremy

История версий
Версия 3.6.1.10 [05.10.2024]
● При переключении тем DUI, включающих в состав себя панель JSplitter, не выполнялось обновление корневого окна.

Версия 3.6.1.9 [04.10.2024]
● При импорте темы DUI, включающей в состав себя панель JSplitter, дополнительно выполнялся скрипт из текущей темы, что приводило к сообщениям об ошике при обращении скрипта к несуществующим более панелям
● Обновлен движок редактора кода до Scintilla 5.5.2

Версия 3.6.1.8 [25.07.2024]
● Возвращены следующие функции:
Код: Выделить всё
plman.GetGUID(playlistIndex)
plman.FindByGUID(guid)
● Обновлен движок редактора кода до Scintilla 5.5.1

Версия 3.6.1.7 [11.05.2024]
● Исправлен баг с неверным изменением порядка панелей при перетягивании мышкой в Panel list (Список панелей)
● Обновлен движок редактора кода до Scintilla 5.5.0

Версия 3.6.1.6 [10.05.2024]
● Откат движка JS до SpiderMonkey ESR102 (102.15.1esr) ввиду наличия многочисленных рандомных ошибок при инициализации скриптов (касается больше версии x64)

Версия 3.6.1.5 [05.05.2024]
● Добавлена поддержка архитектуры x64
● Обновлен движок JS до SpiderMonkey ESR115 (115.9.1esr)
● Расширены настройки цветовой схемы редактора (см. Options->Configure..., а также примеры в Options->Presets)
● Добавлено мультиредактирование (Ctrl+клик мыши для установки следующего курсора) и мультивыделение (Ctrl+новое выделение) (добавлена настройка редактора selection.multiple = 1)
● Добавлено подсвечивание аналогичного текста при выделении (добавлена настройка редактора selection.match = 1)
● Добавлено сворачивание/разворачивание блоков кода (добавлена настройка редактора fold.show = 1), добавлены горячие клавиши для сворачивания/разворачивания всех блоков: Ctrl+Alt+PgUp/Ctrl+Alt+PgDn

Версия 3.6.1.3 [27.02.2024]
● Исправлено игнорирование свойства features в window.DefinePanel и window.DefineScript

Версия 3.6.1.2 [15.02.2024]
● Mozilla SpiderMonkey ESR91 (91.13.0esr)
● plman.GetGUID(playlistIndex)
● plman.FindByGUID(guid)

Версия 2.8.8 [06.08.2022]
● JScript Panel 2.8.8

Версия 2.8.7 [03.08.2022]
● JScript Panel 2.8.7
● Обработчики событий кнопок мыши игнорировали результат возврата

Версия 2.8.6.2 [06.05.2022]
● JScript Panel 2.8.6.2

Версия 2.8.0 [17.01.2022]
● JScript Panel 2.8.0

Версия 3.6.1 [17.01.2022]
● Spider Monkey Panel 1.6.1

Версия 3.5.2-p5 [29.11.2021]
● Добавлена опция в настройках для разрешения использования API отслеживания мыши над панелями (опция "Track mouse over panels (for on_panel_mouse_*)"/"Отслеживать мышь над панелями (для on_panel_mouse_*)")

Версия 2.7.2.1 [29.11.2021]
● JScript Panel 2.7.2.1
● Добавлена опция в настройках для разрешения использования API отслеживания мыши над панелями (опция "Track mouse over panels (for on_panel_mouse_*)"/"Отслеживать мышь над панелями (для on_panel_mouse_*)")

Версия 3.5.2-p4 [24.10.2021]
● Исправлена ошибка появления окна с информацией об отсутствии shared.dll в операционных системах ниже Windows 10

Версия 2.7.2-p2 [24.10.2021]
● Исправлена ошибка появления окна с информацией об отсутствии shared.dll в операционных системах ниже Windows 10

Версия 2.7.2-p1 [14.10.2021]
● Исправлено зависание плеера при установке псевдопрозрачности для дочерней панели JSplitter

Версия 3.5.2-p3 [25.09.2021]
● Исправления API для отслеживания курсора мыши над панелями плагинов

Версия 2.7.2 [25.09.2021]
● JScript Panel 2.7.2
● Исправления API для отслеживания курсора мыши над панелями плагинов

Версия 2.7.0.1-p2 [21.09.2021]
● Добавлено исправление в работе API для отслеживания курсора мыши над панелями многопоточных плагинов

Версия 3.5.2-p2 [20.09.2021]
● Добавлено API для отслеживания курсора мыши над панелями плагинов

Версия 2.7.0.1-p1 [20.09.2021]
● Добавлено API для отслеживания курсора мыши над панелями плагинов

Версия 2.7.0.1 [18.09.2021]
● JScript Panel 2.7.0.1
● Мелкие фиксы

Версия 3.5.2 [14.09.2021]
● Spider Monkey Panel 1.5.2
Реализована поддержка DUI (Default User Interface)
● Расширено окно управления панелями (добавлены столбцы для скрытия/отображения панели и ее рамки)
● Изменен механизм сворачивания панелей (оконный менеджер плагина)

Версия 2.7.0 [14.09.2021]
● JScript Panel 2.7.0
● Изменен механизм сворачивания панелей (оконный менеджер плагина)

Версия 2.6.2.3 [03.09.2021]
● JScript Panel 2.6.2.3
Реализована поддержка DUI (Default User Interface)
● Расширено окно управления панелями (добавлены столбцы для скрытия/отображения панели и ее рамки)

Версия 3.3.1 [23.07.2020]
● Spider Monkey Panel 1.3.1

Версия 3.3.0 [17.07.2020]
● Spider Monkey Panel 1.3.0

Версия 3.2.4b [07.07.2020]
● Spider Monkey Panel 1.2.4b

Версия 2.3.3.1 [01.12.2019]
● JScript Panel 2.3.3.1
● Немного улучшено окно управления панелями

Версия 2.2.1 [15.03.2019]
● JScript Panel 2.2.1

Версия 2.2.0 [25.01.2019]
● JScript Panel 2.2.0

Версия 2.1.8 [03.01.2019]
● JScript Panel 2.1.8

Версия 2.1.7.1 [26.09.2018]
● JScript Panel 2.1.7.1
● Введены вспомогательные методы для управления главным окном плеера.
window.FoobarWindowX - возвращает и устанавливает положение главного окна foobar2000 по оси X.
window.FoobarWindowY - возвращает и устанавливает положение главного окна foobar2000 по оси Y.
window.FoobarWindowWidth - возвращает и устанавливает ширину главного окна foobar2000.
window.FoobarWindowHeight - возвращает и устанавливает высоту главного окна foobar2000.

Версия 2.1.6.3 / 1.5.10.2 [25.08.2018]
● Улучшена производительность прорисовки панелей: устранено мерцание за счет отключения прорисовки фона панели операционной системой.
● API: добавлено свойство EraseBackground для панелей, указывающее позволять ли операционной системе отрисовывать фон панели. Предназначено для панелей, которые не могут отобразить свой фон самостоятельно. По умолчанию свойство равно false для всех панелей кроме следующих панелей Columns UI: Buttons, Filter Search, Menu, Seekbar, Volume.

Версия 2.1.6.2 [10.08.2018]
● Исправлена работоспособность конфигурации JSplitter в Columns UI Layout (кнопка Configure)
● Мелкие улучшения Panel list
● Убран раздел статистики JScript Panel из свойств трека

Версия 2.1.6.1 [03.08.2018]
● Порядок размещения панелей в сплиттере теперь привязан к глубине их расположения. Самое верхнее окно - последнее в списке.
● Добавлено свойство TopMost для объекта панели. Установка в true переносит панель на самый верх.
● Теперь изображения на кнопках масштабируются при изменении размера кнопок.
● Исправлено падение обработчика Click для кнопок
● Создано окно управления списком панелей для просмотра их размеров и редактирования всех данных на месте. Доступ: правая кнопка мыши на сплиттере -> Изменить скрипт... -> Панели.

Версия 2.1.6.0 [30.07.2018]
● Версия, основанная на JScrpt Panel 2.1.6

Версия 1.5.10.1 [24.05.2018]
● Слегка уменьшено мерцание при перерисовке панелей

Версия 2.1.4.1 [18.05.2018]
● Исправлена ошибка "Load Scintilla failed."

Версия 2.1.4 [17.05.2018]
● Версия, основанная на JScrpt Panel 2.1.4

Версия 1.0.4 [28.03.2018]
● Исправлено: в Windows XP свойства fb.FoobarPath, fb.ProfilePath возвращали пустую строку.
● Изменение API: теперь window.GetPanel принимает в качестве аргумента текст заголовка панели, window.GetPanelByIndex - индекс панели

Версия 1.0.3 [22.03.2018]
● Исправление ошибок функционала выравнивания панелей

Версия 1.0.2 [22.03.2018]
● Исправление ошибок функционала выравнивания панелей

Версия 1.0.1 [21.03.2018]
● Добавлено выравнивание/прилипание панелей по краям друг друга, а также к границам окна самого плагина при перетаскивании (есть опция в настройках)

Версия 1.0 [20.03.2018]
LUR M
Автор темы, Модератор
Аватара
Откуда: Минск
Репутация: 391
С нами: 12 лет


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

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

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

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

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

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

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

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

Сообщение #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
Откуда: Украина , Ивано-Франковск
Репутация: 110
С нами: 9 лет 10 месяцев

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

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

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

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

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

Сообщение #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
Репутация: 25
С нами: 9 лет 4 месяца

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

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

Сообщение #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
Репутация: 25
С нами: 9 лет 4 месяца

Сообщение #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
Репутация: -18
С нами: 15 лет 9 месяцев

Сообщение #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
Автор темы, Модератор
Аватара
Откуда: Минск
Репутация: 391
С нами: 12 лет

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

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

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

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

Сообщение #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
Репутация: -18
С нами: 15 лет 9 месяцев

Сообщение #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
Автор темы, Модератор
Аватара
Откуда: Минск
Репутация: 391
С нами: 12 лет

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

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

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

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

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

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

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

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

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

Сообщение #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
Откуда: Украина , Ивано-Франковск
Репутация: 110
С нами: 9 лет 10 месяцев

Пред.След.

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



cron