Этой заметкой я начинаю публикацию цикла о разработке и изменениях в грядущей мажорной версии нашего продукта – AIMP4.
В заметке о планах на год я обозначил основным направлением интеграцию плеера и фонотеки, но внедрение фонотеки немыслимо без расширения возможностей скин-движка, поэтому разработку новой версии я начал именно с него.
В сегодняшней заметке я хочу рассказать об изменениях, сделанных в “фоновых элементах” и “окнах”.
Фоновые элементы
SplitView
SplitView представляет из себя контейнер, размеры дочерних элементов фона которого могут быть изменены пользователем в процессе работы со скином путем перемещения мышкой специального элемента – разделителя (Splitter).
Я уверен, что многие из вас пользовались подобным функционалом во второстепенных окнах плеера или в других программах.
Ограничения
На текущий момент SplitView может работать только с двумя дочерними элементами, причем оба контейнера должны быть видимы и один из контейнеров должен иметь выравнивание Client. Если одно из условий не выполняется – например, число элементов отлично от двух, или один из элементов невидим – SplitView ведет себя как обычный контейнер.
Режимы работы
Новый элемент предлагает два режима работы, я назвал их условно: фиксированный и плавающий.
Фиксированный режим предполагает, что пользователь изменяет непосредственно размер дочернего контейнера. Таким образом, при изменении размера окна, размер дочернего контейнера остается таким, каким выставил его пользователь:
Плавающий режим, наоборот, предполагает, что пользователь задает процентное соотношение между двумя дочерними контейнерами. Соответственно, в этом режиме при изменении размеров окна, пропорция между контейнерами сохраняется:
Режим и направление определяются автоматически на основе выравнивания дочерних контейнеров и положения самого SplitView. Если оба дочерних контейнеров имеют выравнивание Client – используется плавающий режим, в противном случае – фиксированный.
Окна
Дружественное имя
Новое свойство DisplayName позволяет задать окну адекватное название, которое отображается в подсказках и других текстовых элементах. Новое свойство позволит избежать вот таких смешных ситуаций:
Точка доступа “Active”
Вы наверняка замечали, что в Windows неактивные окна имеют другой оттенок и менее насыщенную тень? Наконец-то, движок AIMP-а позволит реализовать подобное поведение.
Точка доступа “MasterPort”
MasterPort показывает текущее положение пристыковки дочернего окна к мастеру, т.е. показывает с какой стороны сейчас отображается дочернее окно относительно мастера. Может быть полезным для более красивой реализации стыковки окон.
Ого, не ожидал так быстро новой статьи в блоге =)
По теме – вкусно, очень вкусно =)
А ширину и текстуру самого Splitter’а можно будет поменять?
Естественно
Оо, новая версия обрастает подробностями) А вот по поводу состояния «Active», я как понимаю необходимо будет указывать текстуру для активного и не активного состояния?
Да, естественно, но это все опционально
А это будет касаться только текстур контейнеров или вовсе всех элементов?
А это уже как будете использовать. Active – это точка доступа у окна. На что ее значение будет влиять в вашем скине – решаете именно вы.
Эта фича применима только к текстурам? Цвет текста нельзя менять, например?
Можно, через скрипты
Я так понимаю, что “дружественное имя”, т.е. DisplayName будет задаваться независимо от Name, для которого есть существенные ограничения. Будут ли какие-либо ограничения для DN? Отображение DN в качестве хинта будет осуществляться автоматически, по его наличию, либо включаться опционально?
Для DN никаких ограничений, в хинте приоритет отдается DN, если оно не задано – работает по-старинке
А сплитер в SplitView тоже будет элементом скина, т.е. иметь свою текстуру, или это жёстко повязано в скин-движке?
Технически, SplitView – особый контейнер, который создает разделитель между двумя дочерними элементами. Текстура для разделителя, естественно, настраивается.
Ну что сказать, ждем!
Ого! это круто!!
Про Точка доступа «MasterPort» – т.е. можно будет сделать чтобы плейлист (или др. фрейм) прикреплялся к плееру с любой стороны?
Нет, MasterPort показывает, с какой именно стороны сейчас прикреплено окно (если ты помнишь – окно может прыгать с одной стороны на другую при достижения края экрана).
Спасибо, понял в чём фишка
Интересно, можно ли будет “обойти” ограничение на два дочерних контейнера в SplitView следующим образом: взять SplitView и вместо одного из дочернего контейнера поставить ещё один SplitView (или не вместо, а положить его внутрь дочернего контейнера). Получится два сплиттера и два изменяемых в ширину контейнера за счёт третьего.
Пример – плейлист и два контейнера по бокам, один с вертикальным списком вкладок, другой с информацией о проигрываемом треке (обложка и т. д.).
Получится ли такое? Или всё равно сработает ограничение?
Конечно получится.
Ещё вопрос: можно ли будет скрывать разделитель (Splitter) в SplitView?
То есть вручную включать “режим настройки” ширины контейнеров (показать разделитель), настроить ширину как нужно, а потом выключить “режим настройки” (скрыть разделитель).
Аналогия – чекбокс “Закрепить панель задач” в свойствах панели задач в Windows XP, 7 (в 8-ке тоже есть, но у меня от этого чекбокса ничего не меняется).
Прямой опции нет, но можно попробовать косвенно – скрывать / показывать третий контейнер, появление третьего контейнера будет автоматически отключать SplitView.
То есть, если SplitView перешёл в режим обычного контейнера, то Splitter исчезает?
Было бы, конечно, неплохо управлять видимостью сплиттера напрямую (через счётчик), а не косвенно, через третий контейнер.
И ещё вопрос: можно ли будет в AIMP v4 сделать так, чтобы контейнер с обложкой альбома, при растягивании его в ширину, увеличивался не только в ширину, но и в высоту (пропорционально)?Изобразил это схематично:
http://i.imgur.com/Cm5uecv.png
Сделать это можно, но вопрос в том, на сколько часто такое поведение будет нужно? Зачем скрывать от пользователя какие-то возможности?
К сожалению, при текущей концепции это сделать затруднительно
> Зачем скрывать от пользователя какие-то возможности?
Чтобы сплиттер не мозолил постоянно глаза.
Надо пользователю изменить ширину – включил “режим настройки”, отрегулировал как надо, и выключил “режим настройки”. Или оставил в сплиттер на виду, тут уже на усмотрение самого юзера.
Удобнее, когда сплиттер вменяемой ширины, а не шириной в 1 пиксель. Но тогда относительно широкий сплиттер будет постоянно на виду, что не есть хорошо, на мой взгляд.
В любом случае, с возможностью скрыть сплиттер будет гибче, а пользователь решит как ему удобнее – скрывать сплиттер каждый раз после изменения размеров или оставить его.
Но, если можно будет обходным путём скрыть сплиттер через третий контейнер нулевой ширины, то в принципе и так пойдёт %). Главное, чтобы это поведение не поломалось.
На этот счет я сделал по другому – сплиттер может быть шириной и 1 пиксель, но зона хит-теста будет всегда не меньше 6 пкс (рекомендация МС)