JSplitter v2.8.8 / v3.6.1.3 [27.02.2024]

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

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

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

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

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

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

1.PNG


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

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

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

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

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

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

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

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


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

4.PNG


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

Снимок.PNG


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

3.PNG


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

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

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

7.PNG


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

8.png


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

6.PNG



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

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

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

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

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

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

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

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

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

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


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


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

Пример от zeremy

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


Сообщение #341 Majestyk » 15.10.2023, 01:02

LUR:Majestyk, не знаю, не факт. я под 32 бита работаю в фубаре. для меня нет смысла переходить щас на 64-битный фубар

SMP 64-Bit все еще месяцы удалены от выпуска. Надеюсь, к тому времени вы это учтете. Спасибо.
Majestyk
Репутация: 0
С нами: 8 месяцев 4 дня

Сообщение #342 dreamawake » 29.11.2023, 16:13

Hi, LUR, seems a serious bug was found that when the parent panel (used to show/hide child panels) is on focus state, if tab key is pressed, will cause foobar2000 no response. Please look at it. Thanks.
dreamawake
Репутация: 3
С нами: 1 год

Сообщение #343 Majestyk » 04.12.2023, 14:59

dreamawake:Hi, LUR, seems a serious bug was found that when the parent panel (used to show/hide child panels) is on focus state, if tab key is pressed, will cause foobar2000 no response. Please look at it. Thanks.

This is not a JSplitter bug. It's a foobar2000 bug. It's been around for along time and I don't think it's ever been reported. I have various Darkone mod themes dating back to 2015, using Panel Stack Splitter, that have this bug. I was surprised to read this, I thought only I knew about it. :smile:

Google перевод:

Это не ошибка JSplitter. Это ошибка foobar2000. Это было уже давно, и я не думаю, что об этом когда-либо сообщалось. У меня есть различные темы модов Darkone, выпущенные в 2015 году с использованием Panel Stack Splitter, в которых есть эта ошибка.
Majestyk
Репутация: 0
С нами: 8 месяцев 4 дня

Сообщение #344 Aum » 19.02.2024, 23:33

LUR, добрый день. Могу ли я ограничить размеры главного окна средствами сплиттера:
Код: Выделить всё
function on_size() {
    if (window.Width<=800) {window.FoobarWindowWidth=800; ww = window.Width};
    if (window.Height <=600) {window.FoobarWindowHeigh=600; wh = window.Height};
}
Aum M
Аватара
Репутация: 20
С нами: 14 лет 1 месяц

Сообщение #345 yeyo » 27.02.2024, 11:40

Hello, LUR, after updating to JSplitter 3.6.1.2, Cannot drag and drop files or folders directly from Windows Explorer to the playlist interface created by foo_uie_jsplitter\samples\jsplaylist-mod\jsplaylist main script.js or the playlist management interface created by foo_uie_jsplitter\samples\js-smooth\JS Smooth Playlist Manager.js, after returning to JSplitter 3.6.1, drag-and-drop operations are normal.
Вложения
screenshots.gif
yeyo
Репутация: 0
С нами: 1 год 7 месяцев

Сообщение #346 LUR » 27.02.2024, 16:21

yeyo:after returning to JSplitter 3.6.1, drag-and-drop operations are normal.
checked it out, confirmed, I'll see what I can do

Добавлено спустя 2 часа 36 минут:
Версия 3.6.1.3 [27.02.2024]
● Исправлено игнорирование свойства features в window.DefinePanel и window.DefineScript
LUR M
Автор темы, Модератор
Аватара
Откуда: Минск
Репутация: 373
С нами: 11 лет 5 месяцев

Сообщение #347 yeyo » 28.02.2024, 05:53

Версия 3.6.1.3 [27.02.2024]
● Исправлено игнорирование свойства features в window.DefinePanel и window.DefineScript
Thanks to LUR, it now works fine in 3.6.1.3
yeyo
Репутация: 0
С нами: 1 год 7 месяцев

Сообщение #348 Majestyk » 06.03.2024, 11:39

Thanks for the update Spider Monkey mod. Just so you know, version 3.6.1.3 has an intermittent bug. If an error occurs, instead of 'File: Main.js', or some other file, it will be written 'File: D'.

Translation:

Спасибо за обновление Spider Monkey mod. Просто чтобы вы знали, в версии 3.6.1.3 есть периодический баг. Если происходит ошибка, то вместо 'Файл: Main.js', или какой-либо другой файл, будет написано 'File: D'.
Majestyk
Репутация: 0
С нами: 8 месяцев 4 дня

Сообщение #349 LUR » 06.03.2024, 19:07

Majestyk:If an error occurs, instead of 'File: Main.js', or some other file, it will be written 'File: D'.
I don't see this behavior, look:

Снимок экрана 2024-03-06 180527.png
Снимок экрана 2024-03-06 180527.png (7.78 КБ) Просмотров: 608
LUR M
Автор темы, Модератор
Аватара
Откуда: Минск
Репутация: 373
С нами: 11 лет 5 месяцев

Сообщение #350 Majestyk » 07.03.2024, 14:20

It does it 50% of the time for me. I assume "D" means D drive, which is where my files are. It's possible it only happens when fb2k is portable. The Spider Monkey mod (non-jsplitter) does not do this and the previous version of JSplitter does not do this.

Chat GPT translation:

Как правило, он делает это в 50% случаев. Я предполагаю, что "D" означает диск D, где находятся мои файлы. Возможно, это происходит только при портативном использовании fb2k. Модуль Spider Monkey (не jsplitter) этого не делает, также как и предыдущая версия JSplitter.

Изображение
Majestyk
Репутация: 0
С нами: 8 месяцев 4 дня

Сообщение #351 SergPuh.68 » 28.03.2024, 16:44

Возможно ли избавиться от таких артефактов?
phpBB [media]

Это когда одна панель проходит над двумя другими (та панель что в топе всё нормально а вот нижняя ловит артефакты)
SergPuh.68 M
Аватара
Откуда: Украина
Репутация: 143
С нами: 5 лет 3 месяца

Сообщение #352 LUR » 30.03.2024, 01:17

SergPuh.68, Дайте исходники, посмотрю, а так я ж не знаю, что у вас там за панели.

Добавлено спустя 3 минуты 13 секунд:
Majestyk:previous version of JSplitter does not do this
Previous version of JSplitter was based on another version of Mozilla SpiderMonkey, this is its bug, now it seems to be fixed, I haven't caught it once. Look in the next version of JSplitter.
LUR M
Автор темы, Модератор
Аватара
Откуда: Минск
Репутация: 373
С нами: 11 лет 5 месяцев

Сообщение #353 SergPuh.68 » 30.03.2024, 11:25

Это проблема наверное не в коде а в API,когда панели JSplitter в макете расположены как бы пирогом одна над другими при быстром движении не успевает перерисовываться фон что ли... копируется на нижестоящюю панель... как то так...
SergPuh.68 M
Аватара
Откуда: Украина
Репутация: 143
С нами: 5 лет 3 месяца

Сообщение #354 LUR » 31.03.2024, 06:05

SergPuh.68:Это проблема наверное не в коде а в API
В API все нормально. Просто по умолчанию для увеличения производительности не перерисовывается родительское окно.

void Move(x, y, width, height, repaintParent = false);
LUR M
Автор темы, Модератор
Аватара
Откуда: Минск
Репутация: 373
С нами: 11 лет 5 месяцев

Сообщение #355 SergPuh.68 » 31.03.2024, 09:11

Код: Выделить всё
    if (splitterLeft.isDragging) {
        splitterLeft.x = Math.max(299, Math.min(splitterRight.x - 301, x));
        savedSplitterLeftPercentage = splitterLeft.x / ww;
       
        SplitterLeft.Move(Math.ceil(splitterLeft.x + splitterLeft.w) - 3, Math.ceil(splitterTop.y) + 2, 3, Math.ceil(splitterBottom.y - splitterTop.y) - 1, true);
    }
    if (splitterRight.isDragging) {
        splitterRight.x = Math.max(splitterLeft.x + 301, Math.min(ww - splitterRight.w - 299, x));
        savedSplitterRightPercentage = splitterRight.x / ww;

        SplitterRight.Move(Math.ceil(splitterRight.x + splitterRight.w) - 3, Math.ceil(splitterTop.y) + 2, 3, Math.ceil(splitterBottom.y - splitterTop.y) - 1, true);       
    }
LUR, спасибо,вроде помогло,перерисовывается
SergPuh.68 M
Аватара
Откуда: Украина
Репутация: 143
С нами: 5 лет 3 месяца

Сообщение #356 Aum » 02.04.2024, 09:28

LUR, давно уже заметил такую особенность: если 3 панели в ряд расположить в одном сплиттере, привязать их и сделать с изменением размера, как-то странно происходит обновление той панели у которой меняется (высчитывается) размер (набросал пример - 3я панель): т.е. увеличиваем размер 3 панели (тянем линию ресайза влево), отпускаем, панель дергается влево и затем растягивается-получаем такое мерцание некрасивое. И этот момент видно сильнее, чем слабее ПК и более насыщенная панель информацией, т.е. отрисовывается каждая операция получается, верно понял? Можно ли избежать такого поведения?
Вот код и ниже накидал тестовый пример:
Код: Выделить всё
var IDC_ARROW = 32512;
var IDC_SIZEWE = 32644;

var g_textcolor = 0, g_textcolor_hl = 0;
var g_backcolor = 0;
var g_color_selected_bg = 0;
// Used in window.GetFontCUI()

var ColourTypeDUI = {
   text: 0,
   background: 1,
   highlight: 2,
   selection: 3
};

function get_colors() {
   
        g_textcolor = window.GetColourDUI(0);
        g_backcolor = window.GetColourDUI(1);
       g_textcolor_hl = window.GetColourDUI(2);
       g_color_selected_bg = window.GetColourDUI(3);
}

get_colors();

var folder = window.GetPanel("folder");
var artist = window.GetPanel("artist");
var album = window.GetPanel("album");
var _dragFbar = false;
var _dragAbar = false;
var ww = 0, wh = 0;
var a_w_ViewWidth = 0;
var a2_w_ViewWidth = 0;
var f_width = window.GetProperty("Folder width", 220);
var a_width = window.GetProperty("Artist width", 320);

function on_size() {

    ww = window.Width;
    wh = window.Height;
     do_layout();
        window.Repaint();
 }
 var _dragLbar = false;
 var _dragAbar = false;
 
function set_f_width(width) {
   window.SetProperty("Folder width", width);
   f_width = width;   
    a_w_ViewWidth = ww - f_width - 8;
}
function set_a_width(width) {
   window.SetProperty("Artist width", width);
   a_width = width;   
    a2_w_ViewWidth = ww-f_width - a_width-8;
}
 function do_layout() {
f_width = window.GetProperty("Folder width");
a_w_ViewWidth = ww - f_width - 8;
folder.Move(0, 0, f_width, wh);
folder.Show();
a_width = window.GetProperty("Artist width");     
artist.Move(f_width+5, 0, a_width, wh);
artist.Show();
a2_w_ViewWidth = ww-f_width - a_width-8;   
album.Move(f_width+5+a_width+5, 0, a2_w_ViewWidth, wh);
album.Show();

}
do_layout();
function on_paint(gr) {
    gr.FillSolidRect(0, 0, ww, wh, g_backcolor);//
    ////1st line
 if(_dragFbar) gr.FillSolidRect(_newf_width+2, 0, 2, wh, 0xFFE81123);  //red resize line
 gr.DrawLine(f_width+2, 0, f_width+2, wh, 1, g_textcolor);//1st ine panel
    ////2nd line
 if(_dragAbar) gr.FillSolidRect(f_width+_newa_width+7, 0, 2, wh, 0xFFE81123);  //red resize line
 gr.DrawLine(f_width+a_width+7, 0, f_width+a_width+7, wh, 1, g_textcolor);//2nd line panel
 }

 
function on_mouse_lbtn_down(x, y, mask) {
   if(x >= f_width - 5 && x < f_width+5)
   {
      _dragFbar = true;
        window.SetCursor(IDC_SIZEWE);
        //Fbar_old=f_width;
        _newf_width = f_width;
        _newa_w_ViewWidth = a_w_ViewWidth;
            window.Repaint();
          } else {
        if(x >= f_width+5+a_width - 5 && x < f_width+5+a_width+5)
   {
      _dragAbar = true;
        window.SetCursor(IDC_SIZEWE);
        Abar_old=a_width;
        _newa_width = a_width;
        _newa2_w_ViewWidth = a2_w_ViewWidth;
            window.Repaint();
          }
    }}
   
function on_mouse_move(x, y, mask) {
    //ограничение размера 1ой панели
       if(_dragFbar)
   {
        window.SetCursor(IDC_SIZEWE);
           _newf_width = x;
       
         
          if(_newf_width < 100) {
                _newf_width = 180;
       _newf_w_ViewWidth = ww-180-8;  } else {
            _newf_width = x;
           _newf_w_ViewWidth = ww  - x-8; }
                window.Repaint();
   }
    //ограничение размера 2ой панели
       if(_dragAbar)
   {
        window.SetCursor(IDC_SIZEWE);
           _newa_width = x-f_width-8;
       
         
          if(_newa_width < 100) {
                _newa_width = 180;
       _newa2_w_ViewWidth = ww-f_width-180-12;  } else {
            _newa_width = x-f_width-8;
           _newa2_w_ViewWidth = ww  - x-6-f_width-6; }
                window.Repaint();
   }   
   
if(x > f_width-5 && x < f_width+5) window.SetCursor(IDC_SIZEWE);
if(x > f_width+5+a_width - 5 && x < f_width+5+a_width+5) window.SetCursor(IDC_SIZEWE);
}


function on_mouse_lbtn_up(x, y) {
    if(_dragFbar) {
      _dragFbar = false;
      window.SetCursor(IDC_ARROW);
      f_width = _newf_width;
      f_w_ViewWidth = _newa_w_ViewWidth;   
      set_f_width(f_width); // сохранение размера
      do_layout();
 //window.Repaint();
    }
    if(_dragAbar) {
      _dragAbar = false;
      window.SetCursor(IDC_ARROW);
      a_width = _newa_width;
      a2_w_ViewWidth = _newa2_w_ViewWidth;   
      set_a_width(a_width); // сохранение размера
      do_layout();
// window.Repaint();
    }
}
foobar2000_test
Придумал подгрузить скрипт дополнительной командой перемещения изменяемой панели в function on_mouse_lbtn_up после вычисления новых размеров панели, но до команды "отстройки интерфейса" do_layout();. Т.е. добавляя например промежуточную команду с произвольными размерами самой панели album.Move(f_width+5+a_width+5, 0, 300, 300);, получаю плавное отображение панели без мерцания.
Хотя даже если в on_mouse_lbtn_up сделаю команду с задержкой window.SetTimeout(do_layout,300);, все равно мерцает, а через промежуточное движение-нет.
Прошу подсказать, правильно понял, что нужна некоторая задержка перед отрисовкой отображением команд? Если да, может есть способ лучше?

Спасибо!
Aum M
Аватара
Репутация: 20
С нами: 14 лет 1 месяц

Сообщение #357 LUR » 03.04.2024, 02:22

Aum, честно говоря не понял вас. Вы хотите, чтобы ресайз происходил сразу при перетягивании? Ну так у вас будет И положение И ширина панели быстро и постоянно меняться, если речь идет о самой правой панели, и конечно она будет дергаться. Чем не устраивает установка размера при отпускании мыши как в тестовом примере? Если вам нужно отображение самой полоски ресайзера, то возьмите пример с SergPuh.68, он полоску сделал отдельной тонкой панелькой, которая появляется только при нажатии на границу между панелями, и она отображается поверх всех панелей при движении мышкой, а при отпускании исчезает. Надо себе такое в сборку завести, сразу не догадался так сделать.
LUR M
Автор темы, Модератор
Аватара
Откуда: Минск
Репутация: 373
С нами: 11 лет 5 месяцев

Сообщение #358 Aum » 03.04.2024, 16:25

LUR, видимо коряво объяснил))
Срабатывание по отпусканию кнопки-устраивает, так и нужно, полоска по сути не важна, так индикатор стрелки есть, но возьму на вооружение идею SergPuh.68. Но страдает перерисовка.
Прошу глянуть видео: первая половина видео-стандартный код, смотрите как дергается правая панель плейлиста при ресайзе/перерисовке и отпускании кнопки мышки. Такое чувство, что отрисовка происходит поэтапно: движение по Х, затем растягивание.
А потом добавляю в код те самые "левые доп. команды передергивания панели" для некоторой задержки и перерисовка становится плавной, без дерганья плейлиста влево или вправо и растягивания, а сразу - чик встала на место нужного размера (все это с маленькой, но не критичной задержкой).
Видео перерисовки на примере тестовой сборки выше
Думаю теперь понятно, и как тут лучше быть, в чем причина и решаемо ли более правильным способом или мой костыль подходит? :smile:
Aum M
Аватара
Репутация: 20
С нами: 14 лет 1 месяц

Сообщение #359 SergPuh.68 » 03.04.2024, 17:50

Я думаю причиной такого рывка и не плавности перерисовки является что сначала устанавливается координата x а потом панель растягивается по ширине :nervious:
SergPuh.68 M
Аватара
Откуда: Украина
Репутация: 143
С нами: 5 лет 3 месяца

Сообщение #360 LUR » 04.04.2024, 01:27

SergPuh.68:сначала устанавливается координата x а потом панель растягивается по ширине
Я тоже сразу так подумал, но по коду все сугубо: вызов Move происходит только один раз при отпускании мыши, а на нижнем уровне в плагине она реализована как Windows функция SetWindowPos, которая принимает тоже сразу x, y, w, h, так что тут я ни при чем уже)

Добавлено спустя 1 минуту 7 секунд:
Aum:или мой костыль подходит
Видимо подходит. Просто таким образом речь идет о плавности в плане добавлении кадров для человеческого зрения) Тут все зависит от самой панели. Используемый вами скрипт плейлиста довольно тяжеленький таки. Вы само окошко панели руками потягайте за левый край, увидите, как правая граница со скроллом играет в догонялки с размером окна. Что уж говорить, даже нативный плагин плейлиста фубара так же себя ведет при тягании за левый край, хотя и не так явно. Короче это беда всех окон Windows, когда изменяется и положение и размер сразу, дальше уже зависит насколько быстрая реализация самой перерисовки.

Добавлено спустя 3 минуты 58 секунд:
Кстати, Aum, я бы посоветовал лишний раз не вызывать функции window.Repaint() там, где это не требуется
Еще я заметил, что вы после вызова panel.Move() всегда вызываете panel.Show() - это делать не нужно, только, если до этого панель была скрыта.

P.S. Ахах, сам себя навел на мысль. Попробуйте перед Move спрятать окно, а потом его показать, работает замечательно! :biggrin:

Код: Выделить всё
album.Show(false);
album.Move(f_width+5+a_width+5, 0, a2_w_ViewWidth, wh);
album.Show();

Добавлено спустя 42 минуты 38 секунд:
LUR:Вы хотите, чтобы ресайз происходил сразу при перетягивании?
Я с этим фокусом даже это попробовал. Еще даже и ничего так, хотя и немного тормознуто.
LUR M
Автор темы, Модератор
Аватара
Откуда: Минск
Репутация: 373
С нами: 11 лет 5 месяцев

Пред.След.

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