JSplitter v2.1.4.1 / v1.5.10.1 [24.05.2018]

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

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

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

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

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

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

1.PNG


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

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

Дисклеймер: Функциональность сплиттера работает ТОЛЬКО в COLUMNS UI. В DUI данный плагин превращается в обычный JScript Panel / WSH Panel Mod.

СКАЧАТЬ JSplitter v2.1.4.1 (Версия, основанная на JScript Panel v2.1.4)
АНГЛИЙСКАЯ ВЕРСИЯ
РУССКАЯ ВЕРСИЯ
ЗЕРКАЛО
АНГЛИЙСКАЯ ВЕРСИЯ
РУССКАЯ ВЕРСИЯ

СКАЧАТЬ JSplitter v1.5.10.1 (Версия, основанная на WSH Panel Mod v1.5.10)
АНГЛИЙСКАЯ ВЕРСИЯ
РУССКАЯ ВЕРСИЯ
ЗЕРКАЛО
АНГЛИЙСКАЯ ВЕРСИЯ
РУССКАЯ ВЕРСИЯ

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

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

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


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

4.PNG


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

3.PNG


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 - выравнивать панели по краям друг друга при перетаскивании окошек. Полезно при построении интерфейса сборки, где панели должны быть расположены плотно друг к другу.
Autosize panels when snapped to each other - автоматически менять размер всех панелей, который "прилепились" друг к другу и к краям окна плагина в процессе размещения их пользователем. Не рекомендуется смешивать данную опцию с управлением позицией и размером панелей из скрипта.
Show scrollbars for out-of-view panels - экспериментальная функция показа полос прокрутки, если панели выходят из зоны видимости. Прокручиваются только панели, содержимое отрисованного окна не меняется и не скроллится.
Hide panels on close - скрывать окна вместо их закрытия. Полезно для временного скрытия панели с помощью кнопки закрытия окна. Вернуть обратно окна можно в размещателе Columns UI сняв галочку Hidden с панели:

6.PNG



Программный интерфейс
Так как API WSH Panel Mod 1.5.10 не менялся, то он доступен как обычно. Документация к плагину прилагается. Плюс к этому доступны следующие дополнения для объекта 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 - переключает курсор мыши для всех кнопок либо на руку, либо на стрелку. Данное свойство также действует на все создаваемые впоследствии кнопки. У каждой кнопки можно это свойство менять индивидуально (см. ниже).

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

ПАНЕЛИ (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;
Методы:
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

История версий
Версия 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
Автор темы, Модератор
Аватара
Возраст: 35
Откуда: Минск
Репутация: 210
С нами: 5 лет 7 месяцев


Сообщение #41 mgz » 23.03.2018, 02:10

LUR, тут, сударь, Вам нужно будет подумать. Я этими панелями не обмазываюсь, просто из работы совет дал.

Да хоть самый медленный способ - через файл.
RME HDSP 9632 > DynAudio BM5A II / Audio-Technica ATH-AD900
Nexus 5 > Avantree Clipper > Sennheiser IE 4
mgz M
Гуру
Аватара
Возраст: 38
Откуда: Украина, Киев
Репутация: 72
С нами: 12 лет 2 месяца

Сообщение #42 LUR » 23.03.2018, 02:14

mgz писал(а):просто из работы совет дал.
Вы, сударь, дали совет, не вникая в то, о чем здесь вообще речь велась. Речь шла о том, чтобы заставить общаться панели разных плагинов (WSH Panel Mod, JScript Panel, JSplitter) через механизм NotifyOthers->on_notify_data. Все остальное - на откуп писателям скриптов под эти панели, если кому надо, пусть реализует и кэш и все что хочешь.
LUR M
Автор темы, Модератор
Аватара
Возраст: 35
Откуда: Минск
Репутация: 210
С нами: 5 лет 7 месяцев

Сообщение #43 mgz » 23.03.2018, 02:16

LUR писал(а):не вникая в то, о чем здесь вообще речь велась
Естественно, я даже пометочку об этом сделал...

Добавлено спустя 23 минуты 44 секунды:
JScript Panel v2
Save settings on a per panel basis. You can also save/load settings from .ini files or write your own functions to read and write plain text/json files/etc.
Ну вот. Умеет.
RME HDSP 9632 > DynAudio BM5A II / Audio-Technica ATH-AD900
Nexus 5 > Avantree Clipper > Sennheiser IE 4
mgz M
Гуру
Аватара
Возраст: 38
Откуда: Украина, Киев
Репутация: 72
С нами: 12 лет 2 месяца

Сообщение #44 LUR » 23.03.2018, 02:44

mgz писал(а):Ну вот. Умеет.
И что? Каким это боком решает проблему общения панелей через NotifyOthers->on_notify_data ?
LUR M
Автор темы, Модератор
Аватара
Возраст: 35
Откуда: Минск
Репутация: 210
С нами: 5 лет 7 месяцев

Сообщение #45 LUR » 25.03.2018, 05:24

Сделал достаточно простой пример конфигурации на основе урезанной версии своей сборки.

СКАЧАТЬ / ЗЕРКАЛО

Распаковать в папку с чистым портативным фубаром.
LUR M
Автор темы, Модератор
Аватара
Возраст: 35
Откуда: Минск
Репутация: 210
С нами: 5 лет 7 месяцев

Сообщение #46 kgena_ua » 28.03.2018, 13:30

LUR, приветствую.
Может я что-то не учел, но по-моему не работает ReadINI();
Еще не могу вставить изображение: DrawImage();
I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Гуру
Аватара
Возраст: 54
Откуда: Украина, Днепр
Репутация: 400
С нами: 5 лет 3 месяца

Сообщение #47 LUR » 28.03.2018, 16:06

kgena_ua, да работает и то и другое, не знаю.

Вот создал инишник, прописал в нем путь к картинке, все отобразилось.

Код: Выделить всё
var g_backcolor = 0xFFAAAAAA;

var path = utils.ReadINI("c:\\Users\\LUR\\Downloads\\1.ini", "Test", "ImagePath");
var img = gdi.Image(path);

function on_paint(gr) {
    gr.FillSolidRect(0, 0, ww, wh, g_backcolor);
    gr.DrawImage(img, 0, 0, img.Width, img.Height, 0, 0, img.Width, img.Height);
}

Добавлено спустя 1 минуту 47 секунд:
Я же говорю, в самом WSH Panel Mod ничего не менял, должны работать все функции.
LUR M
Автор темы, Модератор
Аватара
Возраст: 35
Откуда: Минск
Репутация: 210
С нами: 5 лет 7 месяцев

Сообщение #48 kgena_ua » 28.03.2018, 17:07

LUR,
у меня, получается, не понимает fb.ProfilePath (и fb.FoobarPath). Если полностью указать путь "e:\\Foobar\\file.ini", тогда все нормально.
I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Гуру
Аватара
Возраст: 54
Откуда: Украина, Днепр
Репутация: 400
С нами: 5 лет 3 месяца

Сообщение #49 LUR » 28.03.2018, 17:16

kgena_ua, проверил работает.

Код: Выделить всё
var g_backcolor = 0xFFAAAAAA;

var path = utils.ReadINI(fb.ProfilePath + "1.ini", "Test", "ImagePath");
var img = gdi.Image(path);

function on_paint(gr) {
    gr.FillSolidRect(0, 0, ww, wh, g_backcolor);
    gr.DrawImage(img, 0, 0, img.Width, img.Height, 0, 0, img.Width, img.Height);
}
LUR M
Автор темы, Модератор
Аватара
Возраст: 35
Откуда: Минск
Репутация: 210
С нами: 5 лет 7 месяцев

Сообщение #50 kgena_ua » 28.03.2018, 17:23

LUR, может меня просто "переклинило".

всегда писал:
var set_path = fb.FoobarPath + "\\maybe\\settings\\"; - не работает.

А если написать
var set_path = fb.FoobarPath + "maybe\\settings\\";
или
var set_path = fb.FoobarPath + ".\\maybe\\settings\\"; - то работает.
I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Гуру
Аватара
Возраст: 54
Откуда: Украина, Днепр
Репутация: 400
С нами: 5 лет 3 месяца

Сообщение #51 LUR » 28.03.2018, 17:26

kgena_ua писал(а):всегда писал:
var set_path = fb.FoobarPath + "\\maybe\\settings\\"; - не работает.
Ну не знаю у меня, к примеру такое работает тоже:
Код: Выделить всё
fb.ProfilePath + "\\1.ini"

Добавлено спустя 4 минуты 39 секунд:
Проверил на всякий случай в чистом WSH Panel Mod 1.5.6, работает такое:
Код: Выделить всё
fb.FoobarPath + "\\1.ini"
LUR M
Автор темы, Модератор
Аватара
Возраст: 35
Откуда: Минск
Репутация: 210
С нами: 5 лет 7 месяцев

Сообщение #52 kgena_ua » 28.03.2018, 17:34

Так я не за WSH, я о jsplitter
Безымянный.png
I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Гуру
Аватара
Возраст: 54
Откуда: Украина, Днепр
Репутация: 400
С нами: 5 лет 3 месяца

Сообщение #53 LUR » 28.03.2018, 17:35

kgena_ua писал(а):Так я не за WSH, я о jsplitter
я имел в виду, что и там и там работает

Добавлено спустя 35 секунд:
Дайте полный код скрипта, щас найдем в чем дело
LUR M
Автор темы, Модератор
Аватара
Возраст: 35
Откуда: Минск
Репутация: 210
С нами: 5 лет 7 месяцев

Сообщение #54 kgena_ua » 28.03.2018, 17:42

Я просто начал разбираться....
Код простой...
Код: Выделить всё
function RGB(r, g, b) {   
   return (0xff000000 | (r << 16) | (g << 8) | (b));
}   

var font = gdi.Font("Areal",11,1);   
var ww, wh;   

DT_LEFT = 0x00000000;   

//var set_path = fb.ProfilePath + "\\maybe\\settings\\";
var set_path = fb.FoobarPath + "maybe\\settings\\";

var panel = utils.ReadINI( set_path + "settings.ini", "panel", "panel");
if (!panel) panel = 0;


function on_paint(gr) {      
   gr.FillSolidRect(0, 0, ww, wh, RGB(20,31,40));   
   gr.GdiDrawText( set_path, font, RGB(250,250,250), 0, 10, ww, 40, DT_LEFT );   
   gr.GdiDrawText( panel, font, RGB(250,250,250), 0, 30, ww, 40, DT_LEFT );   
}      

function on_size() {   
    ww = window.Width;      
    wh = window.Height;   
}   
Может это из-за того, что я под XP.
I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Гуру
Аватара
Возраст: 54
Откуда: Украина, Днепр
Репутация: 400
С нами: 5 лет 3 месяца

Сообщение #55 LUR » 28.03.2018, 18:00

kgena_ua писал(а):Может это из-за того, что я под XP.
Все, теперь вижу. Потверждаю, имеет значение. Проверил тока что на виртуалке, действительно под XP не работают свойства fb.FoobarPath и fb.ProfilePath. Черт бы побрал этого Марка и там успел наследить. Как думаете, откатиться на 1.5.6 ?)
LUR M
Автор темы, Модератор
Аватара
Возраст: 35
Откуда: Минск
Репутация: 210
С нами: 5 лет 7 месяцев

Сообщение #56 kgena_ua » 28.03.2018, 18:12

LUR писал(а):Как думаете, откатиться на 1.5.6
Да черт его знает. Было-бы удобно, например, перевести скрипты на версию jscript_panel 2.0. и общаться через notify. Но не хочется переходить на jscript_panel 2.0. и выше. Тогда есть смысл jsplitter на 1.5.6.
Пусть все высказываются.

Еще вопрос.
Ругается
window.GetPanel("Album list");
I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Гуру
Аватара
Возраст: 54
Откуда: Украина, Днепр
Репутация: 400
С нами: 5 лет 3 месяца

Сообщение #57 LUR » 28.03.2018, 18:14

kgena_ua писал(а):Ругается
window.GetPanel("Album list");
Правильно ругается. Нужно число, а не имя. Имя в другой функции задается: window.GetPanelByText
Внимательнее читайте документацию.
LUR M
Автор темы, Модератор
Аватара
Возраст: 35
Откуда: Минск
Репутация: 210
С нами: 5 лет 7 месяцев

Сообщение #58 MC Web » 28.03.2018, 18:15

LUR писал(а):Черт бы побрал этого Марка и там успел наследить. Как думаете, откатиться на 1.5.6 ?)
И не сумлевайся... Лучший вариант. :smile:
Для особо озабоченных можно потом отдельную ветку на экспериментальном компоненте.

kgena_ua писал(а):всегда писал:
var set_path = fb.FoobarPath + "\\maybe\\settings\\"; - не работает.
Поправочка, т.к. приходится часто править, в скрипте прописано например:
Код: Выделить всё
var default_img_path_bio = window.GetProperty(" default img path bio", ".\\maybe\\textures\\nocover\\nocover.png");
Последний раз редактировалось MC Web 28.03.2018, 18:18, всего редактировалось 1 раз.
MC Web
Мастер
Аватара
Репутация: 126
С нами: 4 года 10 месяцев

Сообщение #59 LUR » 28.03.2018, 18:15

Хотя можно было бы сделать GetPanel с текстом и GetPanelByIndex с числом)
LUR M
Автор темы, Модератор
Аватара
Возраст: 35
Откуда: Минск
Репутация: 210
С нами: 5 лет 7 месяцев

Сообщение #60 kgena_ua » 28.03.2018, 18:23

LUR писал(а):Имя в другой функции задается
не досмотрел.
LUR писал(а):Хотя можно было бы сделать GetPanel с текстом и GetPanelByIndex с числом)
я думаю было-бы удобно - наглядно.
I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Гуру
Аватара
Возраст: 54
Откуда: Украина, Днепр
Репутация: 400
С нами: 5 лет 3 месяца

Пред.След.

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