Сделал тестовый проект, у которого есть два дополнительных окна: эквалайзер (правое окно) и некое левое окно (сделал так по большей части для наглядности, практическое применение может быть в случае открытия двух окон с одной стороны, чтобы не накладывались текстуры/тени).
Каждое окно вызывается кнопкой-переключателем на главном окне, у каждого окна есть своя кнопка закрытия.
(https://www.aimp.ru/forum/index.php?action=dlattach;topic=40086.0;attach=36874)
Чтобы реализовать возможность автоматического закрытия одного окна при открытии второго, нужно их связать через общий промежуточный провайдер-счетчик, в зависимости от состояния которого оба окна будут либо закрыты, либо будет открыто первое или второе окно.
В нашем счетчике будет хранится значение от 0 до 2:
0 - оба окна закрыты;
1 - открыт эквалайзер;
2 - открыто левое окно.
Наша задача - настроить связи всех кнопок открытия/закрытия окон, а также связи самих окон через пользовательский провайдер.
1) Создаем пользовательский провайдер-счетчик (Пользовательские провайдеры - Создать - LogicalOperatorCounter), я его назвал WindowsController.
2) В параметрах нашего провайдера указываем значение модуля (количество значений) = 3 (3 варианта отображения окон, как было указано выше).
3) Добавляем в скин дополнительное окно, прикрепляем его куда нужно (в моем примере - слева от главного окна, чтобы наглядней было).
4) Добавляем кнопки-переключатели для открытия наших окон.
5) Настраиваем связи (для каждого элемента нужно добавить наш провайдер WindowsController):
- Окно EqualizerFrame: Visibility <--> Position
Параметры связи: Value=1 (когда в счетчику будет значение "1" - только тогда откроется эквалайзер) - Окно LeftWindow: Visibility <--> Position
Параметры связи: Value=2 - Первая кнопка-чекбокс, которая будет открывать левое окно: Action <--> Position
Параметры связи: if(value=2,0,2) (то есть, проверяем, если это окно уже открыто, то чтобы при повторном нажатии окно закрылось. Если просто выставить value=2, то это окно мы сможем закрыть только через отдельную кнопку закрытия) - Вторая кнопка-чекбокс, которая будет открывать эквалайзер: Action <--> Position
Параметры связи: if(value=1,0,1)
Чтобы галочки в наших чекбоксах отображались при открытых соответствующих окнах, нужно также назначить им связь State <-- Visible окон-провайдеров.
Для обычных кнопок это необязательно. - Для всех кнопок закрытия нужно также добавить связь Action <--> Position, но в параметрах связи нужно указать Value=0 (что в любых случаях приведет к закрытию любого открытого окна)
Как видите, все действия происходят через промежуточный провайдер, что позволяет гибко управлять окнами в нашем скине. По этой аналогии можно управлять больше, чем двумя окнами, но каждую группу окон нужно связывать через отдельный счетчик.
Замечание: для наших окошек параметр InitialVisible желательно должен быть false (иначе могут быть косяки при первом применении скина)!
Актуально для AIMP / AIMPSE v3.50 RC1+