Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Audacity

Глава 2 из книги "Архитектура приложений с открытым исходным кодом", том 1.

Оригинал: Audacity, глава из книги "The Architecture of Open Source Applications" том 1.
Автор: James Crook
Перевод: Н.Ромоданов

2.2. Библиотека графического интерфейса wxWidgets

Наиболее важной отдельно библиотекой, которую программисты Audacity используют для создания графического пользовательского интерфейса, является библиотека wxWidgets, в которой предлагаются такие вещи, как кнопки, движки, флаги, обычные и диалоговые окна. В ней реализована большая часть кросс-платформенных функций визуализации. В библиотеке wxWidgets есть свой собственный класс строк wxString, в ней есть кросс-платформенные абстракции потоков, файловых систем и шрифтов, а также механизм для локализации для других языков, которыми мы пользуемся. Мы советуем тем, кто только что присоединился к разработке Audacity, загрузить wxWidgets, скомпилировать некоторые из примеров,которые поставляются с этой библиотекой, и поэкспериментировать с ними. Библиотека wxWidgets является сравнительно тонким слоем, построенным над базовыми объектами графического пользовательского интерфейса, предоставляемыми операционной системой.

Для создания сложных диалогов в wxWidgets предлагаются не только отдельные элементы, но также специальные механизмы управления размерами элементов и их положением (sizers). Они позволяют получить более красивый внешний вид, чем при использовании только абсолютно фиксированных позиций графических элементов. Если размер виджета изменен либо непосредственно пользователем, либо, скажем, из-за изменения размера шрифта, на другой, изменение расположения элементов в диалоговом окне произойдет очень естественно. Такие механизмы очень важны для кросс-платформенных приложений. Без них нам, возможно, приходилось бы пользоваться для каждой платформы специальными вариантами диалоговых окон.

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

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

После нескольких лет такой разработки мы обнаружили, что значительная часть исходного кода Audacity, прежде всего диалоговые окна для задания пользовательских настроек, состоит из запутанного и повторяющегося кода. Этот код, хотя он был прост с точки зрения того, что делал, следовать ему было удивительно трудно. Часть проблемы состояла в том, что порядок, в котором были построены диалоговые окна, был абсолютно произвольным: мелкие элементы объединялись в более крупные и, в конечном итоге, в полные диалоговые окна, но порядок, в котором элементы создавались в коде, не соответствовал (что и не требовалось) тому порядку, в котором элементы располагались на экране. Код был излишне большого размера и было много повторений. Был код, являющийся частью графического пользовательского интерфейса, который передавал данные из пользовательских настроек, запомненных на диске, в промежуточные переменные, код, который передавал значения промежуточных переменных в изображаемый графический пользовательский интерфейс, код, который передавал данные из изображаемого графического пользовательского интерфейса в промежуточные переменные, и код, который передавал промежуточные переменные в пользовательские настройки, запоминаемыми на диске. В коде был вставлен комментарий //this is a mess (// здесь беспорядок), но прошло достаточно много времени до того момента, когда с этим было что-то сделано.


Продолжение статьи: Слой ShuttleGui .