JSplitter v4.2.0 / 3.9.0 [16.09.2026]

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

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

  • 12

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

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

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

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

1.PNG


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

ПРИМЕЧАНИЕ О ВЕРСИЯХ
Ввиду того, что последней ESR (Extended Support Release) версией движка JavaScript SpiderMonkey, поддерживающей Windows 7, является 102.15.1esr, решено сделать форк основной версии JSplitter и сделать из него ветку 3.x. Все изменения, вносимые в последнюю версию JSplitter (кроме движка), будут добавляться и туда. Единственная разница между веткой 4.x и 3.x в движке JavaScript: В 3.x будет всегда один и тот же движок 102.15.1esr, а в 4.x - самый свежий ESR.

СКАЧАТЬ
АНГЛИЙСКАЯ ВЕРСИЯ
РУССКАЯ ВЕРСИЯ
ЗЕРКАЛО
АНГЛИЙСКАЯ ВЕРСИЯ
РУССКАЯ ВЕРСИЯ
GITHUB
АНГЛИЙСКАЯ ВЕРСИЯ

Версия 3.9.0 (для пользователей Windows 7)
АНГЛИЙСКАЯ ВЕРСИЯ
РУССКАЯ ВЕРСИЯ
ЗЕРКАЛО
АНГЛИЙСКАЯ ВЕРСИЯ
РУССКАЯ ВЕРСИЯ
GITHUB
АНГЛИЙСКАЯ ВЕРСИЯ

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

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

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


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

4.PNG


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

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


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

Снимок.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; - включает отслеживание входа/выхода курсора мыши из области панелей. По умолчанию false. Для обработки событий используются следующие функции:
on_panel_mouse_enter(name) - событие входа курсора в область панели, name - имя панели
on_panel_mouse_leave(name) - событие выхода курсора из области панели, name - имя панели
window.TrackMouseMoveOnPanels = true; - включает отслеживание позиции курсора мыши в пределах области панели. По умолчанию false. Для обработки события используется следующая функция:
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;
(read, write) 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;
}


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


ДОКУМЕНТАЦИЯ
https://dima-lur.github.io/jsplitter/

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

Пример от zeremy

История версий
Версия 4.2.0 [16.09.2026]
  • [НОВОЕ] Добавлен API Worker для выполнения JavaScript в фоновых потоках. Worker'ы поддерживают обмен сообщениями, существующие API JSplitter там, где это применимо, внеэкранный рендеринг GDI/Direct2D, structured clone и передачу владения объектами, загрузку внешних файлов скриптов и include. Чтобы эффективно использовать новый API, настоятельно рекомендуется внимательно ознакомиться с документацией.
  • [ОБНОВЛЕНИЕ] НЕСОВМЕСТИМОЕ ИЗМЕНЕНИЕ! Полностью переработан window.JsMemoryStats: введена новая модель статистики памяти, переименованы поля и добавлена информация об использовании памяти Worker'ами текущей панели.
  • [ОБНОВЛЕНИЕ] Переработаны настройки сборки мусора в разделе Advanced > Performance > GC. Автоматическая настройка в зависимости от доступной системной памяти удалена; теперь лимиты heap и параметры GC задаются явно и имеют фиксированные значения по умолчанию: Main thread maximum heap size1024 MB, Worker maximum heap size256 MB на каждый Worker, Heap growth before GC64 MB, External memory growth before GC256 MB. Благодаря этому ограничения памяти и поведение GC становятся предсказуемыми, а при необходимости каждый параметр можно настраивать независимо. Параметры роста heap и external memory применяются как к главному потоку, так и отдельно к каждому Worker.
  • [НОВОЕ] Добавлена опция Use high-resolution timers в разделе Advanced > Performance, по умолчанию отключённая. При её включении короткие задержки setTimeout и setInterval могут планироваться значительно ближе к запрошенным значениям вместо ограничения стандартной гранулярностью таймеров Windows. Это может улучшить плавность анимаций на мониторах с высокой частотой обновления и работу другого кода, чувствительного к точности таймингов. При этом существующие скрипты, неявно рассчитывающие на более грубую гранулярность таймеров, могут вести себя иначе после включения этой опции, поскольку callback-и способны выполняться заметно чаще, чем раньше. Например, анимация или другое состояние, изменяемое на каждом callback-е, а не на основе реально прошедшего времени, может начать развиваться быстрее, а нагрузка на CPU — увеличиться. Поэтому при высокой нагрузке поток рендеринга (main thread) может испытывать заметные задержки, и существующему коду может потребоваться адаптация под этот backend таймеров. Поддерживается только начиная с Windows 10 версии 1803.
  • [НОВОЕ] Добавлено read-only свойство utils.HighResolutionTimersEnabled, доступное как в panel, так и в Worker realm. Оно позволяет скриптам определить, действительно ли активен backend высокоточных таймеров, и при необходимости адаптировать стратегию планирования и yield. Значение основано на настройке Advanced Preferences > Performance > Use high-resolution timers, но отражает фактическое состояние во время выполнения, а не только состояние флажка: свойство возвращает true только если опция включена и текущая версия Windows поддерживает high-resolution waitable timers; во всех остальных случаях возвращается false.
  • [НОВОЕ] on_paint расширен фактическим прямоугольником обновления: on_paint(gr, x, y, width, height). Существующие обработчики on_paint(gr) остаются полностью совместимыми. Это особенно полезно для панелей с единым host'ом, содержащих несколько неперекрывающихся областей интерфейса: скрипт может не отрисовывать части панели, которые не пересекаются с текущим прямоугольником обновления.
  • [НОВОЕ] В главное меню добавлен скрытый раздел JSplitter, доступный через Shift+Click по меню File. Раздел содержит почти все команды из контекстного меню JSplitter и действует на панель JSplitter, которая в данный момент имеет клавиатурный фокус. Поскольку это обычные команды главного меню, им также можно назначать произвольные горячие клавиши в настройках foobar2000.
  • [НОВОЕ] Добавлен window.ShowPanelList для открытия списка дочерних панелей текущей панели.
  • [НОВОЕ] Добавлен window.IsFocused, позволяющий определить, имеет ли текущая панель JSplitter клавиатурный фокус.
  • [НОВОЕ] Добавлено свойство utils.Is64Bit для определения архитектуры текущего процесса — x86 или x64.
  • [ИСПРАВЛЕНИЕ] Исправлено отсутствие визуального бейджа на JSplitter при импорте темы в DUI.
  • [ИСПРАВЛЕНИЕ] Регрессия из v4.1.15: скрытые панели DUI не получали уведомление о необходимости обновить своё содержимое.
  • [ИСПРАВЛЕНИЕ] Из документации удалено описание API плагина UIHacks (foo_ui_hacks), поскольку этот API не является частью API JSplitter.
  • [ОБНОВЛЕНИЕ] Удалено сообщение D2D initialization SUCCESS из консоли.
  • [ОБНОВЛЕНИЕ] Улучшен пример complete/musicbrainz: добавлено ручное обновление, более надёжное кэширование MusicBrainz и обработка асинхронных запросов, ограничение частоты запросов, а также более устойчивый разбор релизов и ссылок.
  • [НОВОЕ] Добавлена поддержка переиспользуемых стилей линий Direct2D с настройкой концов линий, соединений сегментов, типа штриха, miter limit, смещения штриха и пользовательских штриховых шаблонов. Все существующие методы рисования Direct2D, ранее принимавшие стиль линии, теперь могут использовать общий объект D2DStrokeStyle. Документация обновлена и добавлен новый наглядный пример.
  • [ОБНОВЛЕНИЕ] JavaScript-движок обновлён до SpiderMonkey 140.16.0esr.

Версия 4.1.17 [03.09.2026]
  • [ОШИБКА] Исправлена работа вложенных gdi.PushClip/PopClip и d2d.PushClip/PopClip. Состояния clipping теперь хранятся в стеке и корректно восстанавливаются при вложении нескольких областей отсечения.
  • [[url=http://]ФУНКЦИЯ[/url]] Добавлены GdiBitmap.GetThemeColourSchemeJSON и D2DBitmap.GetThemeColourSchemeJSON. Метод анализирует цвета bitmap с помощью взвешенного K-means++ в OKLab и возвращает согласованную цветовую схему интерфейса из пяти ролей: фон, текст, фон/акцент воспроизводимого трека, рамка фокуса и фон выделения. Размер палитры может быть задан вызывающей стороной.
  • [[url=http://]ОБНОВЛЕНИЕ[/url]] Переработан API performance для более точного соответствия поведению Web Performance / User Timing / Performance Timeline. Добавлены стандартные формы и опции mark и measure, поддержка повторяющихся mark/measure entries, упорядоченные запросы к timeline, улучшено поведение PerformanceObserver и добавлено статическое свойство PerformanceObserver.supportedEntryTypes, при этом существующие расширения JSplitter сохранены для совместимости. Добавлен пример использования Performance API.
  • [ФУНКЦИЯ] Добавлены нативные функции для работы с файловой системой (с примером):
  • [ФУНКЦИЯ] Добавлен fb.GetLibraryRoots, возвращающий уникальные корневые пути Media Library, определённые по текущему содержимому библиотеки, без необходимости реконструировать их в JavaScript.
  • [ОБНОВЛЕНИЕ] Расширен пример utils.ShowHtmlDialog: теперь он демонстрирует передачу данных и callback-функций между JavaScript панели и HTML-диалогом, включая использование window.external.dialogWindow для корректного назначения владельца нативным диалогам, открываемым из HTML.
  • [ОБНОВЛЕНИЕ] Улучшена генерируемая документация API: добавлено постоянное сворачиваемое дерево навигации по членам API и глобальный поиск по API.
  • [ОБНОВЛЕНИЕ] JS-движок обновлён до SpiderMonkey 140.15.0esr

Версия 4.1.16 [30.08.2026]
  • [ОШИБКА] Исправлено падение при вычислении статистических полей JSplitter (например, %jsplitter_rating%) в параллельном title formatting. Причиной была гонка при ленивой инициализации внутреннего объекта title format.
  • [ФУНКЦИЯ] Добавлен необязательный параметр window_id для указания нативного окна-владельца (HWND) в:
    • plman.ShowPlaylistLockUI(playlistIndex[, window_id])
    • utils.FilePicker(title, default_path, filter, mode[, window_id])
    • utils.FolderPicker(title, default_path[, window_id])
    • utils.MessageBox(msg, title, buttons, icon, default_button, help_text[, window_id])
  • [ФУНКЦИЯ] Добавлены FbMetadbHandleList.Reverse и FbMetadbHandleList.Shuffle для разворота и случайного перемешивания списка дескрипторов на месте.

Версия 4.1.15 [27.08.2026]
  • [ОШИБКА] ВАЖНОЕ ИЗМЕНЕНИЕ!!! plman.MovePlaylistSelection и plman.MovePlaylistSelectionV2 больше не создают резервную копию для отмены действия. Скрипты, требующие поддержки отмены, должны явно вызывать plman.UndoBackup перед перемещением элементов плейлиста, что соответствует другим действиям изменения содержимого плейлиста.
  • [ФУНКЦИЯ] Добавлен plman.ReorderPlaylistItems (см. документацию)
  • [ФУНКЦИЯ] Добавлены gdi.PushClip/PopClip и d2d.PushClip/PopClip (см. документацию)
  • [ФУНКЦИЯ] Диалог utils.ColourPicker расширен дополнительными элементами управления:
    • HEX: значение цвета RRGGBB
    • Alpha: альфа-компонент
    • Copy ARGB: кнопка для копирования текущего значения цвета в формате 0xAARRGGBB
  • [ФУНКЦИЯ] Добавлен window.external.dialogWindow для HTML-диалогов, созданных с помощью utils.ShowHtmlDialog (см. документацию), что позволяет использовать собственный хэндл окна диалога с вложенными модальными диалогами.
  • [ФУНКЦИЯ] Обновлена ​​обработка владения модальными диалогами для utils.ColourPicker, utils.FontPicker, utils.InputBox и utils.ShowHtmlDialog. Параметр window_id теперь используется в качестве собственного хэндла окна-владельца (HWND) вместо игнорирования, что позволяет диалоговым окнам, открытым из utils.ShowHtmlDialog, корректно принадлежать HTML-диалогу через window.external.dialogWindow.
  • [ФУНКЦИЯ] Добавлен utils.RecyclePath для перемещения файлов и каталогов в корзину (см. документацию)
  • [ФУНКЦИЯ] Переход на новый генератор документации и публикация API онлайн .

Версия 4.1.14 [21.08.2026]
  • [ОШИБКА] СЕРЬЕЗНЫЕ ИЗМЕНЕНИЯ!!! Переименованы переменные %smp_*% в %jspliter_*% (как в самом компоненте, так и в примерах), чтобы избежать конфликта со Spider Monkey Panel, а именно:
    smp_playcountjsplitter_playcount
    smp_lovedjsplitter_loved
    smp_first_playedjsplitter_first_played
    smp_last_playedjsplitter_last_played
    smp_ratingjsplitter_rating
  • [ОШИБКА] Документация: исправлена ​​функция vol2pos в Helpers.js
  • [ОШИБКА] Документация: уточнено поведение активного устройства fb.GetOutputDevices
  • [ОБНОВЛЕНИЕ] Обновлен движок JS до SpiderMonkey 140.14.0esr
  • [ОБНОВЛЕНИЕ] Обновлен редактор исходного кода до Scintilla 5.6.6

Версия 4.1.13 [07.08.2026]
  • [ФУНКЦИЯ] utils.Glob: теперь подстановочные знаки в шаблоне пути применяются не только к имени файла, но и к промежуточным каталогам. Например, utils.Glob(fb.ProfilePath + 'image*\\album?\\*.jpg')
  • [ОБНОВЛЕНИЕ] Обновлен движок JS до SpiderMonkey 140.13.0esr
  • [ОБНОВЛЕНИЕ] Обновлен редактор исходного кода до Scintilla 5.6.5

Версия 4.1.12 [13.07.2026]
  • [ОШИБКА] Функции on_colours_changed и on_font_changed не срабатывали в CUI при установке отдельных цветов и шрифтов для плагина JSplitter (не общих)
  • [ОБНОВЛЕНИЕ] Обновлен движок редактора исходного кода до Scintilla 5.6.4

Версия 4.1.11 [27.06.2026]
  • [BUG] Исправлена ​​ошибка, из-за которой текст не отображался шрифтом с цветными глифами в режиме Direct2D

Версия 4.1.10 [26.06.2026]
  • [ОШИБКА] Исправлено отсутствие имен исходных файлов в стеке вызовов при сбое скрипта
  • [ФУНКЦИЯ] Добавлен ​​utils.GetCountryFlag (см. документацию)
  • [ОБНОВЛЕНИЕ] Обновлен набор инструментов Visual C++ до версии 145 (14.51.36231)

Версия 4.1.9 [17.06.2026]
  • [ОШИБКА] utils.RunCmdAsync
    • Больше не блокирует общую асинхронную очередь при ожидании внешних процессов
    • Исправлена ​​обработка параллельных команд, так что несвязанные команды могут завершиться, пока другая команда все еще ожидает или истекает время ожидания
    • Исправлены унаследованные дескрипторы каналов, которые могли задерживать завершение stdout/stderr
    • Сбои запуска и пустые пути к приложениям теперь сообщаются через рапортуются в коллбэке
  • [ОШИБКА] utils.RunCmdAsync: исправлена ​​документация и добавлен samples\basic\RunCmdAsync.js
  • [ОШИБКА] utils.Run: исправлена ​​документация и добавлен samples\basic\Run.js
  • [ОШИБКА] Несколько исправлений в документации (index.html)
  • [ОБНОВЛЕНИЕ] Обновлен движок JS до SpiderMonkey 140.12.0esr

Версия 4.1.8 [09.06.2026]
  • [ОШИБКА] Исправлен utils.MovePlaylistSelectionV2: теперь весь пакет треков вставляется точно в указанную позицию (если это возможно)
  • [ФУНКЦИЯ] utils.Run: теперь метод принимает параметр args не только в виде массива, но также и в виде необработанной строки (см. документацию)
  • [ФУНКЦИЯ] Добавлен utils.RunCmdAsync (см. документацию)
  • [ОБНОВЛЕНИЕ] Обновлен движок редактора исходного кода до Scintilla 5.6.3

Версия 4.1.7 [04.06.2026]
  • [ОШИБКА] Исправлена ​​ошибка window.GetProperties: метод возвращал внутреннюю коллекцию свойств, а не коллекцию, содержащуюся в сохраненной конфигурации
  • [ФУНКЦИЯ] ЛОМАЮЩЕЕ ИЗМЕНЕНИЕ! window.ImportProperties: теперь метод имеет необязательный параметр reloadPanel, значение которого по умолчанию равно false
  • [ФУНКЦИЯ] Добавлен window.SetProperties (см. документацию)
  • [ФУНКЦИЯ] Добавлен utils.Run (см. документацию)
  • [ФУНКЦИЯ] Добавлен utils.ParseHtml (см. документацию и пример)
  • [ФУНКЦИЯ] Добавлены следующие методы в пространство имен plman (см. документацию):
    • GetPlaylistSelectedIndexes
    • InvertSelection
    • MovePlaylistSelectionV2 (пока экспериментально)
    • ReplacePlaylistItem
    • SelectQueryItems
    • ShowPlaylistLockUI

Версия 4.1.6 [31.05.2026]
  • [ФУНКЦИЯ] Добавлен window.ClearProperties (см. документацию)
  • [ФУНКЦИЯ] Добавлен fb.GetActiveDSPs (см. документацию)
  • [ФУНКЦИЯ] Добавлен метод fb.EnableAdvancedLogging (сейчас это просто "пустышка" для будущего использования и совместимости со скриптами JSP3)
  • [ФУНКЦИЯ] Добавлен fb.EnumerateMainMenuCommands (см. документацию)
  • [ФУНКЦИЯ] Добавлен fb.IsLibraryInitialised (см. документацию)
  • [ФУНКЦИЯ] Добавлен gdi.LoadSVG и d2d.LoadSVG (см. документацию)
  • [ФУНКЦИЯ] Теперь FbMetadbHandleList.AttachImage возвращает логическое значение (см. документацию)
  • [ФУНКЦИЯ] Добавлен FbMetadbHandleList.AttachImage2 для встраивания существующих GdiBitmap или D2DBitmap. Поддерживаются кодеки JPEG, WEBP и PNG (см. документацию)
  • [ФУНКЦИЯ] Добавлен FbMetadbHandleList.GetOtherInfo (см. документацию)

Версия 4.1.5 [28.05.2026]
  • [ФУНКЦИЯ] Добавлен fb.ShowPlaylistSearchUI
  • [ФУНКЦИЯ] Добавлены window.ExportProperties и window.ImportProperties (см. документацию)
  • [ФУНКЦИЯ] Добавлен window.GetProperties (см. документацию)
  • [ФУНКЦИЯ] Добавлен необязательный параметр clearProperties в window.Reload (см. документацию)

Версия 4.1.4 [25.05.2026]
  • [ОШИБКА] Плеер иногда падает при закрытии: событие из очереди может быть получено во время закрытия панели, даже если оно уже удалено из списка контроллера задач.
  • [ОШИБКА] Исправлены файлы сэмплов by regor

Версия 4.1.3 [22.05.2026]
  • [ОШИБКА] Исправлена ​​тёмная тема для описания пакетов SMP, а также для меню и полос прокрутки в редакторе кода
  • [ОШИБКА] fb.DoDragDrop: теперь свойство custom_image параметра options используется в качестве запасного варианта, если обложка трека не найдена или параметр use_album_art имеет значение false.
  • [ОШИБКА] fb.DoDragDrop: плеер аварийно завершал работу, когда свойство custom_image параметра options равно null, несмотря на то, что в документации указано, что это аргумент допускает значение null.
  • [ФУНКЦИЯ] Добавлен utils.MessageBox для отображения диалогового окна системных сообщений с поддержкой темной темы (см. документацию и базовый пример "MessageBox.js")
  • [ФУНКЦИЯ] Добавлен необязательный параметр help_text в utils.TextBox для отображения кнопки справки в диалоговом окне (см. документацию)
  • [ФУНКЦИЯ] Добавлены функции обратного вызова on_console_refresh и console.GetLines. Также добавлена ​​опция console.ClearBacklog с небольшим ограничением для foobar2000 < 2.0 (см. документацию)
  • [ФУНКЦИЯ] Добавлен необязательный параметр show в fb.ShowConsole для закрытия консоли, если установлено значение false
  • [ФУНКЦИЯ] Добавлен необязательный четвертый параметр к gdi.Brush и d2d.Brush для WrapMode (как для битмапных кистей). Ранее для созданных кистей (не битмапного типа) после их создания это устанавливалось только через свойство WrapMode (см. документацию).
  • [ОБНОВЛЕНИЕ] Обновлен движок JavaScript до SpiderMonkey 140.11.0esr

Версия 4.1.2 [06.05.2026]
  • [ФУНКЦИЯ] Добавлены gdi.Brush и d2d.Brush для создания объектов GdiBrush и D2DBrush соответственно (см. документацию и пример "Brushes.js")
  • [ФУНКЦИЯ] Все методы Draw*/Fill* теперь поддерживают не только цвет, но и пользовательскую кисть
  • [ФУНКЦИЯ] В GdiGraphics добавлены реализации матричных преобразований из D2DGraphics (Translate, Rotate, Scale, и т. д.)

Версия 4.1.1 [01.05.2026]
  • [ФУНКЦИЯ] Добавлены utils.FolderPicker и utils.FilePicker (см. документацию)

Версия 4.1.0 beta 15 [30.04.2026]
  • [ФУНКЦИЯ] Добавлен метод window.SetShortcutFilter для условного подавления сочетаний клавиш панели (см. документацию)
  • [ОШИБКА] Исправлена ​​ошибка: системное сочетание клавиш Alt+F4 никогда не работало для панели JSplitter, находящейся в фокусе
  • [ФУНКЦИЯ] Добавлены utils.MD5, utils.CRC32 и utils.SHA1 для вычисления хешей строк
  • [ФУНКЦИЯ] Добавлено utils.MD5FromFile, utils.CRC32FromFile и utils.SHA1FromFile для вычисления хешей файлов
  • [ЭКСПЕРИМЕНТАЛЬНО] Добавлено свойство Handles для параметра action колбэка on_drag_drop: если перетаскиваемые данные могут быть интерпретированы как FbMetadbHandleList, оно содержит его, в противном случае значение равно null. Если данные поступили извне проигрывателя, то Handles всегда будет равен null.

Версия 4.1.0 beta 14 [29.04.2026]
  • [БАГ] Исправлено свойство D2DFont.Style: ранее оно возвращало только стиль D2D (обычный и курсивный), теперь оно также возвращает жирность, подчеркивание и зачеркивание, как в GdiFont
  • [БАГ] Исправлены utils.FontPicker и gdi.Font: Теперь, если стиль установлен на «обычный», толщина шрифта корректируется в соответствии с существующей толщиной шрифта, а не просто задает 400. Если толщина не соответствует существующей толщине шрифта в пикере, шрифт по умолчанию отображаться не будет. К сожалению, если толщина шрифта искусственно увеличивается (например, gdi.Font("Segoe UI Light", 96, 1)), такой шрифт также не будет отображаться в списке выбора.
  • [БАГ] Исправлен utils.FontPicker: удалены вертикальные и растровые шрифты (GDI+ и D2D работают только со шрифтами TTF/OTF) из списка; ввод шрифта, которого нет в списке, запрещен.
  • [БАГ] Исправлены все асинхронные методы загрузки изображений, которые могли получить доступ к больше не существующему устройству D2D
  • [БАГ] Исправлена ​​ошибка fb.DoDragDrop: свойство custom_image не работало в режиме D2D
  • [ФУНКЦИЯ] Улучшен поиск шрифтов для D2D
  • [ОБНОВЛЕНИЕ] Обновлен файл list.js в примерах (включает похожих исполнителей и лучшие треки) от Gabriel Schwartz
  • [ОБНОВЛЕНИЕ] Обновлен движок JavaScript до SpiderMonkey 140.10.1esr
  • [ОБНОВЛЕНИЕ] Обновлен движок редактора исходного кода до Scintilla 5.6.2

Версия 4.1.0 beta 13 [25.04.2026]
  • [БАГ] Исправлена ​​ошибка utils.FontPicker в режиме D2D: переданный (и действительный для D2D) default_font не всегда находился в диалоговом окне
  • [БАГ] Исправлена ​​ошибка в utils.FontPicker: диалоговое окно возвращало не указанный в пикселях размер, а размер, рассчитанный на основе размера в пунктах, что иногда приводило к расхождениям из-за округления. Теперь возвращается именно тот, который был указан в поле "px".
  • [БАГ] Исправлена ​​ошибка в utils.FontPicker: бесполезный выбор цвета удален из диалогового окна.
  • [БАГ] Во внутренней реализации window.Repaint добавлен флаг для перерисовки всех дочерних элементов JSplitter в случае, если необязательный параметр force установлен в значение true.

Версия 4.1.0 beta 12 [23.04.2026]
  • [БАГ] Исправлен первый вызов d2d.CreateImage
  • [БАГ] Исправлена ​​ошибка в D2DGraphics.DrawImage, теперь он проверяет значения параметров src* на конечное значение.
  • [БАГ] Исправлены случайные падения плеера при переключении режимов рисования

Версия 4.1.0 beta 11 [22.04.2026]
  • [БАГ] Исправлены D2DBitmap.GetColourSchemeJSON и D2DBitmap.GetColourSchemeJSONV2 для учета значения альфа-канала
  • [ОШИБКА] Исправлена ​​ошибка в D2DGraphics.DrawText, теперь учитывается флаг DT_SINGLELINE при вертикальном выравнивании
  • [ОБНОВЛЕНИЕ] Обновлен движок JavaScript до SpiderMonkey 140.10.0esr

Версия 4.1.0 beta 10 [19.04.2026]
  • [БАГ] Исправлена ​​ошибка в D2DGraphics.CalcTextHeight, чтобы воспроизвести поведение в GDI в отношении переносов строк.
  • [БАГ] Для режима рисования D2D добавлены проверки результата ID2D1RenderTarget::EndDraw в D2DBitmap.ReleaseGraphics и on_paint (теперь они приводят к сбою скрипта, если EndDraw вернул ошибку).
  • [БАГ] Исправления в примерах regor
  • [БАГ] FbPlaylistManager.GetGUID больше не приводит к сбою скрипта, если индекс плейлиста выходит за пределы диапазона, и в этом случае просто возвращает пустую строку.
  • [БАГ] Сообщение об отрисовке иногда зависает в очереди сообщений
  • [БАГ] Добавлена ​​зависимость от DT_CALCRECT к DT_BOTTOM и DT_VCENTER в D2DGraphics.DrawText для соответствия скриптам, написанным для GDI
  • [ФУНКЦИЯ] Добавлен utils.FontPicker (см. документацию)
  • [ФУНКЦИЯ] Теперь диалоговое окно, отображаемое utils.ColourPicker, центрируется относительно своего непосредственного родительского элемента
  • [ОБНОВЛЕНИЕ] Обновлен движок JavaScript до SpiderMonkey 140.9.1esr
  • [ОБНОВЛЕНИЕ] Обновлен движок редактора исходного кода до Scintilla 5.6.1

Версия 4.1.0 beta 8 [16.03.2026]
  • D2DGraphics.FillGradRect и D2DGraphics.FillGradRectV2: рендеринг градиентов, содержащих полупрозрачные цвета, был скорректирован в соответствии с рендерингом в режиме GDI.
  • [BUG] D2DGraphics.MeasureString был скорректирован для измерения строк без пробелов в конце, как в режиме GDI
  • D2DGraphics.DrawImage: обработка входных параметров была скорректирована таким образом, чтобы работать как в режиме GDI, а именно:
    • При указании отрицательных значений dstW и dstH изображение зеркально отображается
    • При указании srcW и srcH больше исходных размеров изображения изображение масштабируется в противоположном направлении
    • Отображение повернутого изображения с обрезкой по прямоугольнику src, большему, чем исходное, было скорректировано в соответствии с режимом GDI
  • [BUG] Исправлена ​​ошибка в D2DGraphics.FillSolidRect
  • Список эффектов значительно расширен (см. документацию модуля Effects). Добавлено несколько примеров.

Версия 4.1.0 beta 7 [07.03.2026]
  • [BUG] В D2DBitmap.RotateFlip буфер отрисовки не очищался
  • [BUG] Функции отрисовки примитивов Direct2D (линии, прямоугольники и т. д.) были скорректированы в точном соответствии с поведением рендеринга в GDI+
  • [BUG] Шрифты, которые не распознаются в Direct2D по своему "имени GDI", теперь успешно создаются с правильным именем и толщиной.
  • [BUG] Исправлена ​​ошибка D2DGraphics.FillGradRect
  • [FEATURE] Добавлен метод D2DGraphics.FillGradRectV2, который создает градиент с любым количеством цветов (см. документацию)
  • [FEATURE] Добавлен второй необязательный параметр minChroma к GetColourSchemeJSONV2 в GdiBitmap и D2DBitmap для фильтрации начального выбора кластеров по значению хроматичности. Теперь для начальных центров алгоритм выбирает только цвета со значением насыщенности >= minChroma (по умолчанию: 0, безопасное значение, отфильтровывающее множество очень темных цветов: 0.02). Если запрошенных кластеров (параметр count) больше, чем кандидатов, он выбирает оставшиеся центры из всех оставшихся пикселей (кроме уже выбранных).

Версия 4.1.0 beta 6 [03.03.2026]
● [BUG] Эффекты переставали работать после использования D2DBitmap.RotateFlip
● [BUG] Исправлена установка параметров статистики для FbMetadbHandle (например, SetLoved, SetPlaycount...)
● [BUG] Примеры скриптов, показанные в окне конфигурации, не отражали фактическое дерево папок

Версия 4.1.0 beta 5 [01.03.2026]
● [BUG] Исправление D2DBitmap.RotateFlip
● [FEATURE] Добавлены utils.ReadBinaryFile и utils.WriteBinaryFile для чтения/записи бинарных файлов. Методы работают с объектами Uint8Array в качестве входных/выходных буферов.
● [FEATURE] Добавлен метод GetPixelData в GdiBtmap и D2DBitmap для получения буфера (Uint8Array) содержащего пиксельные данные в указанном формате (см. документация)
● [FEATURE] Добавлен метод CreateImageFromPixelData в GdiBtmap и D2DBitmap, предназначенный для создания битмапа из указанного буфера пиксельных данных (Uint8Array) в указанном формате (см. документация).
● [FEATURE] Добавлен метод GetColourSchemeJSONV2 в GdiBtmap и D2DBitmap для получения изображения цветной схемы с помощью нового алгоритма (K-means++ с Oklab).
● Обновлен редактор исходного кода до Scintilla 5.6.0

Версия 4.1.0 beta 4 [25.02.2026]
● [BUG] Исправлена ​​утечка объектов GDI.
● [BUG] Исправлена ​​ошибка измерения текстовых строк с пробелами в конце в режиме Direct2D.
● Обновлен движок JS до SpiderMonkey 140.8.0esr
● Обновлен редактор исходного кода до Scintilla 5.5.9

Версия 4.1.0 beta 3 [23.02.2026]
● [БАГ] Исправлена ​​ошибка перерисовки панели в режиме Direct2D (в некоторых случаях панель становилась пустой).
● Окно свойств скрипта было переписано
● [FEATURE] FbTitleFormat.EvalWithMetadb и FbMetadbHandle.GetFileInfo теперь принимают необязательный аргумент want_full_info. Это позволяет полностью получить доступ к тегам, которые были заблокированы с помощью LargeFieldsConfig-v2 в последних предварительных версиях foobar2000 2.26.
● Предотвращает создание ресурсов Direct2D по умолчанию. Инициализирует все компоненты D2D только при первом переключении window.DrawMode на значение 1.

Версия 3.7.8 [23.02.2026]
● Изменения см. в JSplitter v4.1.0 beta 2 и beta 3

Версия 4.1.0 beta 1 [19.02.2026]
● В качестве альтернативы стандартному режиму рисования GDI+ добавлен бэкенд Direct2D. Чтобы использовать его, добавьте следующий код в качестве самой первой строки вашего основного скрипта:
window.DrawMode = 1; // 0 - режим GDI+ по умолчанию.
Все доступные методы для рисования в режиме GDI+ реализованы, поэтому существующие скрипты совместимы с созданием объектов и вызовами методов. Например, вызов gdi.Font создаст объект D2DFont вместо GdiFont, если window.DrawMode равен 1 на момент вызова, а также объект D2DGraphics будет передан в функцию обратного вызова on_paint вместо GdiGraphics. Несмотря на это, "правильное" пространство имен все же было добавлено. Если вы хотите напрямую вызывать версии методов Direct2D, следует использовать d2d.* вместо gdi.*, особенно с учетом того, что в пространство имен d2d были добавлены новые методы, а также в список автодополнения редактора для параметра gr функции обратного вызова on_paint(gr) в виде dgr. Добавлена ​​документация по новому API: она довольно похожа на API GDI+ с некоторыми расширениями. См. пространство имен d2d, объекты: D2DGraphics, D2DBitmap, D2DFont, D2DEffect и модуль Effects (определения эффектов будут будут дополнены в будущем).
● Добавлено свойство window.EraseOnRepaint, определяющее, следует ли очищать панель JSplitter цветом фона перед вызовом коллбэка on_paint (по умолчанию true).
● Добавлен новый API для бенчмаркинга в стиле WebAPI. См. документацию по пространству имен performance и классуPerformanceObserver.
● Добавлены некоторые улучшения в редактор кода:
  • Переключение комментариев для блоков кода с помощью горячей клавиши Ctrl+/. Если выделение отсутствует, переключается вся строка, где находится курсор. Поддерживаются как одиночные, так и множественные (Ctrl+MLB) выделения.
  • Боксы рядом со свернутыми блоками кода [...] теперь кликабельны.
● Обновлен движок JavaScript до SpiderMonkey 140.7.1esr
● Теперь все диалоговые окна JSplitter поддерживают темную тему плеера.
● [БАГ] GdiGraphics.EstimateLineWrap зависал при передаче отрицательного значения max_width.
● [ОБНОВЛЕНО] Обновлены примеры JSplaylist от Brett, чтобы прекратить использование тега %MOOD%.
● Добавлены новые методы в пространство имен utils:
  • ConvertToAscii — Преобразует строку из UTF-8 в ASCII
  • CopyFile — Копирует файл
  • CopyFolder — Копирует папку
  • CreateFolder — Создает папку
  • GetLastModified — Получает атрибут «последнее изменение» для файла (в секундах по UNIX-времени)
  • ListFonts — Получает массив системной коллекции шрифтов, заполненный именами семейств шрифтов. Поддерживает семейства шрифтов GDI+ и DirectWrite
  • ReadUTF8 — Читает файл UTF8 с меткой BOM или без нее
  • RemovePath — Удаляет файл или папку
  • RenamePath — Переименовывает файл или папку
  • ReplaceIllegalChars — Заменяет «недопустимые» символы в строке. Использует те же современные замены символов Unicode, что и конвертер/операции с файлами foobar2000

Версия 4.0.0 [18.05.2025]
● Обновлен движок JS до SpiderMonkey 128.9.0esr
● Обновлен движок редактора кода до Scintilla 5.5.6
● Исправлены настройки работы с памятью движка JS, вследствие чего ликвидированы ошибки при запуске и работе скриптов
● Скорректирована загрузка скриптов и исправлен вывод трассировки стека
● Для режима редактирования разметки в DUI добавлено стандартное контекстное меню JSplitter (в CUI добавление своего меню в режиме редактирования разметки не поддерживается).
● В окно "Список панелей" добавлен столбец "Псевдопрозрачность" для быстрого доступа к опции "Поддерживать псевдопрозрачность", доступная ранее только в контекстном меню рамки панели.

... УДАЛЕНО ИЗ-ЗА ОГРАНИЧЕНИЯ НА РАЗМЕР ПОСТА

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


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

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

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

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

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

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

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

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

Сообщение #85 seriousstas » 07.04.2018, 13: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
С нами: 11 лет 7 месяцев

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

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

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

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

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

Сообщение #88 duzzy » 16.05.2018, 03: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
С нами: 11 лет 2 месяца

  • 2

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

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

Сообщение #90 duzzy » 16.05.2018, 20: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, 20:55, всего редактировалось 1 раз.
duzzy
Репутация: 25
С нами: 11 лет 2 месяца

Сообщение #91 megane68 » 16.05.2018, 20: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
С нами: 17 лет 7 месяцев

Сообщение #92 LUR » 16.05.2018, 21: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
Автор темы, Модератор
Аватар
Откуда: Минск
Репутация: 435
С нами: 13 лет 9 месяцев

Сообщение #93 megane68 » 16.05.2018, 23:33

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

Сообщение #94 LUR » 16.05.2018, 23:35

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

Сообщение #95 megane68 » 17.05.2018, 13: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
С нами: 17 лет 7 месяцев

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

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

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

  • 1

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

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

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

  • 1

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

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

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

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

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

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