Библиотека сайта rus-linux.net
Audacity
Глава 2 из книги "Архитектура приложений с открытым исходным кодом", том 1.
Оригинал: Audacity,
глава из книги "The Architecture of Open Source Applications" том 1.
Автор: James Crook
Перевод: Н.Ромоданов
2.4. Панель TrackPanel
Основной панелью в Audacity, на которой отображаются аудиодорожки, является панель TrackPanel. Это специальный управляющий компонент, который рисуется с помощью Audacity. Панель состоит из таких компонентов, как панели меньшего размера с информацией о дорожке, линейка для изменения развертки, линеек для изменения амплитуды, а также дорожек, на которых могут отображаться сигналы, спектры или текстовые метки. С помощью операции перетаскивания, выполняемой мышью, можно изменить размер и местоположение дорожки. Дорожки, у которых есть текстовые метки, пользуются нашей собственной реализацией редактируемого текстового поля, а не той, что есть в системе. Вы можете решить, эти дорожки и линейки, располагаемые панели, должны быть компонентами wxWidgets, но это неверно.
Рис.2.3: Интерфейс Audacity с элементами панели, текстовыми метками и аудиодорожками
На скриншоте, показанном на рис.2.3, приведен пользовательский интерфейс Audacity. Все компоненты, которые помечены, являются специальными компонентами Audacity. Что касается подключен wxWidgets, то в TrackPanel имеется один компонент wxWidget.Все позиционирование и перерисовку обеспечивает код Audacity, а не wxWidgets.
Способ, с помощью которого все эти компоненты собраны друг с другом для создания TrackPanel, действительно ужасен. Ужасен именно код; конечный результат, который пользователь видит, выглядит просто отлично. Код графического пользовательского интерфейса и код, относящийся конкретно к приложению, смешаны вместе, а не отделены друг от друга. В хорошем проекте только в коде приложения должно быть известно о левом и правом каналах, децибелах, отключение звука и режиме соло. Элементы графического интерфейса должны быть независимы от элементов приложения и должна быть возможность их повторного использования в приложении, не относящегося к аудиозаписям. Даже чисто графические части панели TrackPanel являются смешением специальных случаев кода, в котором указаны абсолютные позиции и размеры, и недостаточно абстракций. Было бы гораздо лучше, понятней и более естественный, если бы эти специальные компоненты были самодостаточными элементами графического пользовательского интерфейса и если они использовали значения размера точно также, как это делается в wxWidgets.
Чтобы получить такую панель TrackPanel, нам в wxWidgets нужен другой механизм использования значений размеров, который позволял перемещать и изменять размеры дорожек или, впрочем, любого другого виджета. В wxWidgets это делается недостаточно гибко. Мы бы могли использовать этот механизм в других местах, что дало бы нам дополнительные преимущества. Мы могли бы пользоваться им в панелях инструментов, где находятся кнопки, что позволило бы более просто выбирать положения кнопок, перетаскивая их с мета на месте с помощью мыши.
Для этого была проделана определенная исследовательская работа, но в недостаточном объеме. Некоторые эксперименты с созданием графических компонентов полноценных элементов wxWidgets выявили следующую проблему: подобный механизм уменьшает возможность управлять перерисовкой виджетов, в результате возникает мерцание в тех случаях, когда изменяются размеры или происходит перемещение компонентов. Нам потребуется существенно изменить wxWidgets, чтобы избавиться от мерцания при перерисовке и еще лучше отделить операции, выполняемые при изменении размеров, от операций, необходимых при перерисовке.
Для этого была проделана определенная исследовательская работа, но в недостаточном объеме. Некоторые эксперименты с созданием графических компонентов полноценных элементов wxWidgets выявили следующую проблему: подобный механизм уменьшает возможность управлять перерисовкой виджетов, в результате возникает мерцание в тех случаях, когда изменяются размеры или происходит перемещение компонентов. Нам потребуется существенно изменить wxWidgets, чтобы избавиться от мерцания при перерисовке и еще лучше отделить операции, выполняемые при изменении размеров, от операций, необходимых при перерисовке.
Лучшим решением является использование простого шаблона, по которому мы самостоятельно нарисуем легковесные виджеты, что позволит не иметь соответствующих объектов, потребляющих ресурсы оконной системы, и не нужно будет ими управлять. Нам бы хотелось использовать структуру, подобную механизму выбора размеров, имеющуюся в wxWidgets, и виджеты компонентов, и использовать похожий интерфейс API, компоненты которого не являются производными от классов wxWidgets. Мы должны переделать наш существующий код TrackPanel так, чтобы его структура стала более ясной. Если бы это было простое решение, то это было бы уже сделано, но то, что мы пришли к единому мнению, что, в конечном итоге, мы хотим именно получить, позволило нам продвинуться дальше от предыдущих попыток. Если обобщить наш нынешний подход, то требуется выполнить большой объем работы по проектированию и кодированию. Есть большой соблазн отказаться от сложного кода, который уже и так работает достаточно хорошо.
Продолжение статьи: Библиотека PortAudio: запись и воспроизведение.