AIMP4: Skin Engine

Этой заметкой я начинаю публикацию цикла о разработке и изменениях в грядущей мажорной версии нашего продукта – AIMP4.

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

В сегодняшней заметке я хочу рассказать об изменениях, сделанных в “фоновых элементах” и “окнах”.

Фоновые элементы

SplitView

SplitView представляет из себя контейнер, размеры дочерних элементов фона которого могут быть изменены пользователем в процессе работы со скином путем перемещения мышкой специального элемента – разделителя (Splitter).

Я уверен, что многие из вас пользовались подобным функционалом во второстепенных окнах плеера или в других программах.

SplitView

Ограничения

На текущий момент SplitView может работать только с двумя дочерними элементами, причем оба контейнера должны быть видимы и один из контейнеров должен иметь выравнивание Client. Если одно из условий не выполняется – например, число элементов отлично от двух, или один из элементов невидим – SplitView ведет себя как обычный контейнер.

Режимы работы

Новый элемент предлагает два режима работы, я назвал их условно: фиксированный и плавающий.

Фиксированный режим предполагает, что пользователь изменяет непосредственно размер дочернего контейнера. Таким образом, при изменении размера окна, размер дочернего контейнера остается таким, каким выставил его пользователь:

Fixed Mode

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

Float mode

Режим и направление определяются автоматически на основе выравнивания дочерних контейнеров и положения самого SplitView. Если оба дочерних контейнеров имеют выравнивание Client – используется плавающий режим, в противном случае – фиксированный.

Окна

Дружественное имя

Новое свойство DisplayName позволяет задать окну адекватное название, которое отображается в подсказках и других текстовых элементах. Новое свойство позволит избежать вот таких смешных ситуаций:

Ugly hint

Точка доступа “Active”

Вы наверняка замечали, что в Windows неактивные окна имеют другой оттенок и менее насыщенную тень? Наконец-то, движок AIMP-а позволит реализовать подобное поведение.

Точка доступа “MasterPort”

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

24 thoughts on “AIMP4: Skin Engine

  1. Zhenya

    Ого, не ожидал так быстро новой статьи в блоге =)

    По теме – вкусно, очень вкусно =)
    А ширину и текстуру самого Splitter’а можно будет поменять?

  2. ScrollUnLock

    Оо, новая версия обрастает подробностями) А вот по поводу состояния «Active», я как понимаю необходимо будет указывать текстуру для активного и не активного состояния?

      1. ScrollUnLock

        А это будет касаться только текстур контейнеров или вовсе всех элементов?

        1. Artem Post author

          А это уже как будете использовать. Active – это точка доступа у окна. На что ее значение будет влиять в вашем скине – решаете именно вы.

  3. McClaud

    Я так понимаю, что “дружественное имя”, т.е. DisplayName будет задаваться независимо от Name, для которого есть существенные ограничения. Будут ли какие-либо ограничения для DN? Отображение DN в качестве хинта будет осуществляться автоматически, по его наличию, либо включаться опционально?

    1. Artem Post author

      Для DN никаких ограничений, в хинте приоритет отдается DN, если оно не задано – работает по-старинке

  4. Black_AVP

    А сплитер в SplitView тоже будет элементом скина, т.е. иметь свою текстуру, или это жёстко повязано в скин-движке?

    1. Artem Post author

      Технически, SplitView – особый контейнер, который создает разделитель между двумя дочерними элементами. Текстура для разделителя, естественно, настраивается.

  5. Ya-Grisha

    Ого! это круто!!

    Про Точка доступа «MasterPort» – т.е. можно будет сделать чтобы плейлист (или др. фрейм) прикреплялся к плееру с любой стороны?

    1. Artem Post author

      Нет, MasterPort показывает, с какой именно стороны сейчас прикреплено окно (если ты помнишь – окно может прыгать с одной стороны на другую при достижения края экрана).

  6. Zhenya

    Интересно, можно ли будет “обойти” ограничение на два дочерних контейнера в SplitView следующим образом: взять SplitView и вместо одного из дочернего контейнера поставить ещё один SplitView (или не вместо, а положить его внутрь дочернего контейнера). Получится два сплиттера и два изменяемых в ширину контейнера за счёт третьего.

    Пример – плейлист и два контейнера по бокам, один с вертикальным списком вкладок, другой с информацией о проигрываемом треке (обложка и т. д.).

    Получится ли такое? Или всё равно сработает ограничение?

  7. Zhenya

    Ещё вопрос: можно ли будет скрывать разделитель (Splitter) в SplitView?
    То есть вручную включать “режим настройки” ширины контейнеров (показать разделитель), настроить ширину как нужно, а потом выключить “режим настройки” (скрыть разделитель).

    Аналогия – чекбокс “Закрепить панель задач” в свойствах панели задач в Windows XP, 7 (в 8-ке тоже есть, но у меня от этого чекбокса ничего не меняется).

    1. Artem Post author

      Прямой опции нет, но можно попробовать косвенно – скрывать / показывать третий контейнер, появление третьего контейнера будет автоматически отключать SplitView.

      1. Zhenya

        появление третьего контейнера будет автоматически отключать SplitView

        То есть, если SplitView перешёл в режим обычного контейнера, то Splitter исчезает?

        Было бы, конечно, неплохо управлять видимостью сплиттера напрямую (через счётчик), а не косвенно, через третий контейнер.

        И ещё вопрос: можно ли будет в AIMP v4 сделать так, чтобы контейнер с обложкой альбома, при растягивании его в ширину, увеличивался не только в ширину, но и в высоту (пропорционально)?Изобразил это схематично:
        http://i.imgur.com/Cm5uecv.png

        1. Artem Post author

          То есть, если SplitView перешёл в режим обычного контейнера, то Splitter исчезает?
          Было бы, конечно, неплохо управлять видимостью сплиттера напрямую (через счётчик), а не косвенно, через третий контейнер.

          Сделать это можно, но вопрос в том, на сколько часто такое поведение будет нужно? Зачем скрывать от пользователя какие-то возможности?

          И ещё вопрос: можно ли будет в AIMP v4 сделать так, чтобы контейнер с обложкой альбома, при растягивании его в ширину, увеличивался не только в ширину, но и в высоту (пропорционально)?Изобразил это схематично:

          К сожалению, при текущей концепции это сделать затруднительно

          1. Zhenya

            > Зачем скрывать от пользователя какие-то возможности?
            Чтобы сплиттер не мозолил постоянно глаза.
            Надо пользователю изменить ширину – включил “режим настройки”, отрегулировал как надо, и выключил “режим настройки”. Или оставил в сплиттер на виду, тут уже на усмотрение самого юзера.

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

            Но, если можно будет обходным путём скрыть сплиттер через третий контейнер нулевой ширины, то в принципе и так пойдёт %). Главное, чтобы это поведение не поломалось.

          2. Artem Post author

            На этот счет я сделал по другому – сплиттер может быть шириной и 1 пиксель, но зона хит-теста будет всегда не меньше 6 пкс (рекомендация МС)

Leave a Reply