gremlinable (gremlinable) wrote,
gremlinable
gremlinable

Categories:

Краткий обзор новшеств wxWidgets 3.

Недавно был анонсирован первый релиз development ветки wxWidgets 2.9.0. Об этом я уже писал у себя в журнале, сейчас же хочу поподробнее рассмотреть попавшиеся мне на глаза изменения, касающиеся грядущего 3.0.0.

Ну первое и самое главное - основная причина смены мажор-версии - полный переход на юникод во внутренностях библиотеки. ANSI сборки больше не будет. Все строки теперь будут в UTF-16 под виндой и в UTF-8 во всех остальных системах. Почему разные кодировки? Первое правило wxWidgets - максимальная нативность, а именно такие кодировки выбраны в качестве стандарта на этих платформах (да, да опять разделение на Windows и все остальные, правда здесь, надо отметить, причины исторического характера - когда MS вводила поддержку юникода в винды, UTF-8 ещё небыло). В связи с этим основательно переработан класс wxString. Среди самых заметных изменений - функция c_str() теперь возвращает не указатель на C-строку, как это было раньше, а некий "специальный прокси-объект" wxCStrData, который может быть сконвертирован в const char* и в const wchar_t*. Соответственно, в качестве параметра для стандартных C функций (например, printf), результат этого метода теперь не может быть передан. Кроме того, макросы wxT и _T больше не нужны, их теперь смело можно удалять отовсюду (больше не будет вечной путаницы между _T() и _()). Правда стоит заметить, что строки с юникодными символами должны объявляться с модификатором L: L"Salut \u00E0 toi!". Строки, содержащие только символы текущей локали (если оная, конечно, не является юникодом) можно объявлять как обычно, но так делать не рекомендуется. Подробнее см. http://docs.wxwidgets.org/trunk/overview_unicode.html.
Раз уж зашла речь о том, чего не будет - не будет больше OBDC. Разработчики wxWidgets выкинули его по причине того, что им некому заниматься, а кроссплатформенных библиотек для работы с БД, которые лучше работают и активнее развиваются, и так пруд пруди. Что ж, мир его праху. Удалены несколько классов из wxDataView. Функциональность wxDebugStreamBuf переложена на плечи wxLog. Удалены депрекейтед классы wxDllLoader, wxNotebookSizer. wxTextAttrEx объединён с wxTextAttr, а для обратной совместимости введён дефайн одного в другое. wxArray, wxScopedArray и wxNode теперь сделаны шаблонами. wxXmlProperty переименован в wxXmlAttribute, а вместо wxLogPassThrough появился wxLogInterposer. Кроме того, в документации из trunk почему-то не упоминаются классы wxFindDialogEvent, wxIndividualLayoutConstraint, wxLayoutConstraints, wxNotebookEvent, wxRichTextAttr, wxScrolledWindow и wxTreebookEvent, хотя в исходниках они есть - сам проверил =).
Из контриба удалены неподдерживаемые библиотеки "applet", "deprecated", "fl", "mmedia" и "plot", а "gizmos", "ogl", "net" и "foldbar" перенесены в wxCode. А вот "stc" и "svg" включены в состав wxWidgets в качестве библиотеки wxSTC.
Что ещё есть в исходниках, чего нет в документации сказать сложно - не так просто всё перекопать =). Вот, например, mzet82 подсказывает, что у класса wxTaskBarIcon есть недокументированный MSW-specific метод wxTaskBarIcon::ShowBalloon(). Что же касается того, что есть в документации на новый wxWidgets, чего нет доках 2.8, то diff показал свыше сотни новых классов, некоторые из которых я опишу чуть ниже.
А сейчас ещё пара слов о грустном: wxWidgets становится чуть менее кросс-платформенным. Официально урезана поддержка GTK+ и MacOS: вместо GTK+ 1.2, GTK+ 2.0 теперь заявлена только GTK+ 2.4 (работа с GTK+ 1.2.10 пока присутствует, но не поддерживается), а МакОСь поддерживается только начиная с версии OS X 10.4, вместо 8.6/9.x, как ранее. Отсутствие ANSI сборки автоматически требует наличия Microsoft Layer for Unicode для запуска wx`овых программ на Windows 95/98/ME. Кроме того, возможно wx`ы теперь не соберутся на некоторых устаревших компиляторах, которые плохо поддерживают работу с шаблонами. Ну и, плюс к этому, стоит отметить увеличение размера скомпилированных бинарников, что, впрочем, к финальному релизу 3.0.0 ещё может измениться.
Теперь о том, что же интересного добавлено в новой ветке wxWidgets. Новшеств очень много, поэтому здесь перечислю только те, которые показались интересными мне. Если Вам интересно что-то не попавшее в этот список - пишите, с удовольствием дополню перечень.

  • Как было сказано выше, добавлено много шаблонных классов: wxArray< T >, wxCharTypeBuffer< T >, wxList< T >, wxMessageQueue< T >, wxNode< T >, wxObjectDataPtr< T >, wxPersistentWindow< T >, wxPixelData< Image, PixelFormat >, wxScopedArray< T >, wxScopedCharTypeBuffer< T >, wxScopedPtr< T >, wxScrolled< T >, wxSharedPtr< T >, wxVector< T >, wxWeakRef< T >, wxWeakRefDynamic< T >.

  • Переработана подсистема 2D графики, добавлен новый API для рисования на базе wxGraphicsContext, поддерживающий свободную трансформацию, антиалиасинг и композитные режимы.

  • Переписано много кода, относящегося к event-loop`ам, таймерам и сокетам. Теперь они могут использоваться в консольных приложениях (используя только библиотеку wxBase).

  • Добавлен механизм безопасного размножения указателей. Данный механиз охватывает всё, что наследуется от wxEvtHandler (а точнее, от wxTrackable). Суть этого заключается в том, что если на один объект есть несколько указателей (специальных), то при удалении этого объекта они все станут NULL.

  • Реализован механизм автоматического сохранения/восстановления объектов - так называемые постоянные объекты. Суть в следующем: объект регистрируется в менеджере постоянных объектов, который при удалении этого объекта сохраняет его состояние, а при создании заново - восстанавливает, причём вне зависимости от того, завершалась ли программа между этими событиями, или нет. Постоянными могут быть некоторые окна (пока не очень много, но обещают, что их число будет постепенно расти) и пользовательские объекты.

  • Переработана система выделения идентификаторов. Теперь вместо функции, тупо уменьшающей значение ID, в которой даже не было контроля за переполнением ( static int NewControlId() { return --ms_lastControlId; }), за выделение новых идентификаторов отвечает специальный класс - wxIdManager. Я считаю это очень важным нововведением и, как-нибудь на досуге, постараюсь рассмотреть как всё это работает теперь.

  • Добавлен небольшой класс для определения текущего состояния модификаторных кнопок клавиатуры(Ctrl, Alt, Shift и тд.) - wxKeyboardState.

  • Обновлена подсистема логгирования. В частности, добавлен класс wxLogRecordInfo, позволяющий получить информацию о том, когда, в какой функции, в каком файле и на какой строке было сгенерировано сообщение. Кроме того, добавлено семейство классов wxMessageOutput для легковесного вывода строк. А в сетевой подсистеме появился специальный класс wxProtocolLog

  • Для простого обмена сообщениями между потоками добавлены очереди сообщений - wxMessageQueue.

  • Под виндами появилась возможность управлять дискми - wxFSVolume . Под *NIX этот класс не доступен и, видимо, пока не планируется... А жаль.

  • Новый класс для отображения уведомлений - wxNotificationMessage. Нативная реализация пока только для Maemo (кто не в курсе - мобильный Linux от Nokia), для всех остальных платформ пока немодальный диалог, но обещают потихонечку и для других нативность сделать.

  • wxDataViewCtrl, wxDataViewTreeCtrl и wxDataViewListCtrl - симпатичные контролы для отображения табличной информации.

  • Как уже упоминалось, в основную ветку был добавлен wxStyledTextCtrl - обёртка для Scintilla, которая представляет собой TextCtrl с подсветкой синтаксиса.

  • Ещё один новый тип табличек - wxPropertyGrid. Представляет собой таблицу пар "ключ-значение", такие таблицы широко используются для описания свойств каких-либо объектов в различных IDE, CAD и подобных программах. Кстати, под это дело даже отдельную библиотеку сделали.

  • Реализованы нативный wxBitmapComboBox и wxBitmapToggleButton. Что такое wxBitmapToggleButton понятно из названия, а wxBitmapComboBox - это ComboBox с иконками радом с текстом.

  • Добавлен новый сайзер wxWrapSizer, который может при необходимости переносить расположенные внутри него элементы на другие строки.

  • Нативная реализация wxCollapsiblePane в GTK+ и MacOS X (интересно, а виндовая реализация там нативная или нет? Cмотрится жутковато, в отличие от ГТК и МакОсь).

  • Нативная реализация wxCalendarCtrl в GTK+ и MSW.


Да, кстати, немаловажным нововведением является перевод документации на систему Doxygen. Доки стали явно более качественными и удобными.

GSoC2009
Всем, кто следит за развитием библиотеки, известно, что в рамках проекта Google Summer of Code в этом году развиваются сразу три темы: новый элемент управления по типу Риббонов, wxFileSystemWatcher - класс, отслеживающий изменения файловой системы, и проект по улучшению wxAUI. Наработки по первым двум, вероятно, будут внесены в третью версию wxWidgets. С wxAUI дела обстоят похуже - что-то там всё заглохло, но можно надеяться, что кто-нибудь допилит, потому что часть работы всё-таки там проделана.

Источники:
http://www.wxwidgets.org/
http://docs.wxwidgets.org/trunk/
{src_tree}/docs/changes.txt
http://www.opennet.ru/opennews/art.shtml?num=23377
http://begemotov.net/wxwidgets/
http://www.wxdesigner-software.de/WoWoW30.html
http://wx.ibaku.net/changelog/

UPD (16.09.09): Забыл про один очень важный момент - изменения в механизме динамического связывания. Вместо методов Connect/Disconnect появились новые Bind/Unbind, которые позволяют в качестве обработчика события назначать произвольную функцию. Старые методы пока не объявлены депрекейтед, но это только из-за их повсеместной распространённости и их использование в новом коде не рекомендуется.
UPD (16.09.09): А ещё сегодня добавили новый класс - wxAny, который является альтернативой старому wxVariant, реализованной через шаблоны.
UPD (09.10.09): На этой неделе добавили ещё один новый класс - wxInfoBar. Этот контрол представляет собой небольшую панельку, появляющуюся внутри родительского окна для уведомления пользователя о чём-то не особо важном. По умолчанию закрывается крестиком, но может содержать и обычные кнопки типа Да/Нет/Не знаю. Подобные панельки можно видеть, например, в Acrobat Reader, и в Foxit Reader при открытии pdf-файла с формой (там предлагают раскрасить поля формы).

Кросс-пост в wxwidgets.
Tags: wxwidgets, программерское
Subscribe

  • Компьютерная графика по-советски

    Этот мультфильм был нарисован в 1968 году при помощи компьютера - машины БСЭМ-4. В качестве рисующего устройства использовалась широкая печать —…

  • Закотячивание

    Дети, как известно, цветы жизни. А у нас их теперь в общей сложности аж 6 штук, непрерывно бегающих по всему дому в 2 ноги и 10 лапок. Причём…

  • (no subject)

    - А у нас сегодня кошка Родила вчера котят. Котята выросли немножко, А есть из блюдца не хотят.(с) Вот и у нас всё прямо как у дедушки…

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 4 comments